From 994321d049ef71c39ec48dd1580c914c8d063e2c Mon Sep 17 00:00:00 2001 From: ZhangAo Date: Tue, 11 Nov 2025 16:35:32 +0800 Subject: [PATCH] u --- code/base-project/base-app/iconfont.json | 2 +- .../app/(tabs)/money/components/AddDrawer.tsx | 93 ++++++ .../money/components/MoneyCategoryIcon.tsx | 40 +++ .../app/(tabs)/money/components/MoneyIcon.tsx | 20 -- .../money/components/TransactionsList.tsx | 19 +- .../base-app/src/app/(tabs)/money/index.tsx | 110 ++++--- .../base-app/src/app/(tabs)/money/index2.tsx | 32 -- .../components/common/ao/SegmentedTabs.tsx | 8 +- .../src/components/iconfont/IconIcon.tsx | 64 ++++ .../src/components/iconfont/IconYule1.tsx | 32 ++ .../src/components/iconfont/index.tsx | 32 +- .../base-app/src/components/ui/fab/index.tsx | 224 ++++++++++++++ .../base-app/src/request/api/money.ts | 13 + .../base-app/src/types/global.d.ts | 2 +- code/base-project/base-app/src/types/money.ts | 9 + code/base-project/base-app/test2.html | 277 ++++++++++-------- code/base-project/base-go-v2/cmd/app/main.go | 5 + code/base-project/base-go-v2/go.mod | 5 +- code/base-project/base-go-v2/go.sum | 10 + .../base-go-v2/internal/api/auth/index.go | 16 +- .../internal/api/middleware/auth.go | 2 +- .../internal/api/middleware/logger.go | 4 +- .../base-go-v2/internal/api/money/index.go | 79 +++++ .../base-go-v2/internal/api/router.go | 3 + .../base-go-v2/internal/db/insert.go | 12 +- .../base-go-v2/internal/logx/log.go | 4 +- .../base-go-v2/internal/router/context.go | 26 ++ .../utils/idgen/DefaultIdGenerator.go | 83 ++++++ .../internal/utils/idgen/IIdGenerator.go | 5 + .../internal/utils/idgen/ISnowWorker.go | 5 + .../utils/idgen/IdGeneratorException.go | 12 + .../utils/idgen/IdGeneratorOptions.go | 25 ++ .../internal/utils/idgen/OverCostActionArg.go | 19 ++ .../internal/utils/idgen/SnowWorkerM1.go | 243 +++++++++++++++ .../internal/utils/idgen/SnowWorkerM2.go | 37 +++ .../internal/utils/idgen/YitIdHelper.go | 29 ++ .../base-go-v2/internal/utils/jwtx/jwt.go | 8 +- .../base-go-v2/internal/utils/mapx/index.go | 61 +++- .../internal/utils/uid/snowflake.go | 90 ------ ...类记账APP分享_1_星河_来自小红书网页版.jpg | Bin 294377 -> 0 bytes 40 files changed, 1401 insertions(+), 359 deletions(-) create mode 100644 code/base-project/base-app/src/app/(tabs)/money/components/AddDrawer.tsx create mode 100644 code/base-project/base-app/src/app/(tabs)/money/components/MoneyCategoryIcon.tsx delete mode 100644 code/base-project/base-app/src/app/(tabs)/money/components/MoneyIcon.tsx create mode 100644 code/base-project/base-app/src/components/iconfont/IconIcon.tsx create mode 100644 code/base-project/base-app/src/components/iconfont/IconYule1.tsx create mode 100644 code/base-project/base-app/src/components/ui/fab/index.tsx create mode 100644 code/base-project/base-app/src/request/api/money.ts create mode 100644 code/base-project/base-app/src/types/money.ts create mode 100644 code/base-project/base-go-v2/internal/api/money/index.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/DefaultIdGenerator.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/IIdGenerator.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/ISnowWorker.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorException.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorOptions.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/OverCostActionArg.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/SnowWorkerM1.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/SnowWorkerM2.go create mode 100644 code/base-project/base-go-v2/internal/utils/idgen/YitIdHelper.go delete mode 100644 code/base-project/base-go-v2/internal/utils/uid/snowflake.go delete mode 100644 原创UI—工具类记账APP分享_1_星河_来自小红书网页版.jpg diff --git a/code/base-project/base-app/iconfont.json b/code/base-project/base-app/iconfont.json index 261e2320..555face9 100644 --- a/code/base-project/base-app/iconfont.json +++ b/code/base-project/base-app/iconfont.json @@ -1,5 +1,5 @@ { - "symbol_url": "//at.alicdn.com/t/c/font_5056764_07da4x030572.js", + "symbol_url": "//at.alicdn.com/t/c/font_5056764_xsiwaq3nrni.js", "use_typescript": true, "save_dir": "./src/components/iconfont", "trim_icon_prefix": "icon", diff --git a/code/base-project/base-app/src/app/(tabs)/money/components/AddDrawer.tsx b/code/base-project/base-app/src/app/(tabs)/money/components/AddDrawer.tsx new file mode 100644 index 00000000..fb188aa8 --- /dev/null +++ b/code/base-project/base-app/src/app/(tabs)/money/components/AddDrawer.tsx @@ -0,0 +1,93 @@ +import type { MoneyCategory } from '@/types/money' +import { useState } from 'react' +import { Pressable, Text, View } from 'react-native' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import SegmentedTabs from '@/components/common/ao/SegmentedTabs' +import { + Drawer, + DrawerBackdrop, + DrawerBody, + DrawerContent, + DrawerHeader, +} from '@/components/ui/drawer' +import { Grid, GridItem } from '@/components/ui/grid' +import MoneyCategoryIcon from './MoneyCategoryIcon' + +interface AddMoneyDrawerProps { + isOpen: boolean + onClose: () => void +} + +export default function AddMoneyDrawer({ + isOpen, + onClose, +}: AddMoneyDrawerProps) { + const insets = useSafeAreaInsets() + const [seletedIndex, setSelectedIndex] = useState(0) + const categories: MoneyCategory[] = [] + + return ( + + + + + + + { + setSelectedIndex(index) + }} + style={{ width: 180 }} + className="mx-auto" + /> + + + 取消 + + + + + + {categories.map((item, index) => ( + + + + + + {item.label} + + + ))} + + + + + ) +} diff --git a/code/base-project/base-app/src/app/(tabs)/money/components/MoneyCategoryIcon.tsx b/code/base-project/base-app/src/app/(tabs)/money/components/MoneyCategoryIcon.tsx new file mode 100644 index 00000000..eaeb9f12 --- /dev/null +++ b/code/base-project/base-app/src/app/(tabs)/money/components/MoneyCategoryIcon.tsx @@ -0,0 +1,40 @@ +import React from 'react' +import { + IconJiaotong, + IconLingshi, + IconRiyongpin, + IconShouru, + IconShucai, + IconYule, + IconZhichu, +} from '@/components/iconfont' + +const iconMap: Record = { + jiaotong: IconJiaotong, + lingshi: IconLingshi, + riyongpin: IconRiyongpin, + shouru: IconShouru, + shucai: IconShucai, + yule: IconYule, + zhichu: IconZhichu, +} + +const DefaultIcon = IconLingshi + +interface CategoryIconProps { + name?: string + size?: number + color?: string +} + +/** + * 分类图标组件 + */ +export default function MoneyCategoryIcon({ + name, + size = 24, + color, +}: CategoryIconProps) { + const IconComponent = iconMap[name ?? ''] || DefaultIcon + return +} diff --git a/code/base-project/base-app/src/app/(tabs)/money/components/MoneyIcon.tsx b/code/base-project/base-app/src/app/(tabs)/money/components/MoneyIcon.tsx deleted file mode 100644 index 7e920257..00000000 --- a/code/base-project/base-app/src/app/(tabs)/money/components/MoneyIcon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react' -import { IconJiaotong, IconLingshi, IconRiyongpin, IconShouru, IconShucai, IconYule, IconZhichu } from '@/components/iconfont' - -// 图标映射表 -const iconMap: Record = { - jiaotong: IconJiaotong, - lingshi: IconLingshi, - riyongpin: IconRiyongpin, - shucai: IconShucai, - yule: IconYule, -} - -// 默认图标 -const DefaultIcon = IconLingshi - -// 根据类别 name 返回图标组件 -export function getCategoryIcon(name: string, size = 24, color?: string) { - const IconComponent = iconMap[name] || DefaultIcon - return -} diff --git a/code/base-project/base-app/src/app/(tabs)/money/components/TransactionsList.tsx b/code/base-project/base-app/src/app/(tabs)/money/components/TransactionsList.tsx index 7f89d975..00eb1e67 100644 --- a/code/base-project/base-app/src/app/(tabs)/money/components/TransactionsList.tsx +++ b/code/base-project/base-app/src/app/(tabs)/money/components/TransactionsList.tsx @@ -1,6 +1,5 @@ import React from 'react' import { Text, View } from 'react-native' -import { LucideIcon } from '@/components/common/ao' import IconFont from '@/components/iconfont' interface Transaction { @@ -35,16 +34,16 @@ const sections: DaySection[] = [ totalIncome: 1200, totalExpense: 560, data: [ - { id: '4', title: '早餐', description: '面包牛奶', amount: 15, type: 'expense' }, + { id: '4', title: '早餐', description: '面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶面包牛奶', amount: 15, type: 'expense' }, { id: '5', title: '电影票', description: '周末电影', amount: 45, type: 'expense' }, { id: '6', title: '兼职收入', description: '家教', amount: 1200, type: 'income' }, ], - } + }, ] export default function StaticTransactions() { return ( - + {sections.map(section => ( @@ -70,25 +69,19 @@ export default function StaticTransactions() { {section.data.map(item => ( - {/* 图标 */} - - {/* */} + - {/* 标题 + 描述 */} {item.title} {item.description} - {/* 金额 */} {item.type === 'income' ? '+' : '-'} ¥ diff --git a/code/base-project/base-app/src/app/(tabs)/money/index.tsx b/code/base-project/base-app/src/app/(tabs)/money/index.tsx index 4264c4fd..65e23ec3 100644 --- a/code/base-project/base-app/src/app/(tabs)/money/index.tsx +++ b/code/base-project/base-app/src/app/(tabs)/money/index.tsx @@ -1,22 +1,33 @@ import type { LayoutChangeEvent } from 'react-native' import { LinearGradient } from 'expo-linear-gradient' import React, { useRef, useState } from 'react' -import { Text, View } from 'react-native' +import { ScrollView, Text, View } from 'react-native' import { useSafeAreaInsets } from 'react-native-safe-area-context' import { LucideIcon } from '@/components/common/ao' import { IconJiaotong } from '@/components/iconfont' +import { Fab, FabIcon } from '@/components/ui/fab' import { Grid, GridItem } from '@/components/ui/grid' +import { AddIcon } from '@/components/ui/icon' import { Progress, ProgressFilledTrack } from '@/components/ui/progress' +import AddMoneyDrawer from './components/AddDrawer' +import TransactionsList from './components/TransactionsList' export default function Money() { + const [showDrawer, setShowDrawer] = useState(false) + const insets = useSafeAreaInsets() - const [gradientHeight, setGradientHeight] = useState(200) // 默认渐变高度 - const gridLayout = useRef({ y: 0, height: 0 }) + const [gradientHeight, setGradientHeight] = useState(200) + const gridLayout = useRef<{ y: number, height: number } | null>(null) + const onGridLayout = (e: LayoutChangeEvent) => { - const { y, height } = e.nativeEvent.layout - gridLayout.current = { y, height } - setGradientHeight(y + height / 2 + 16 + insets.top) + // 仅首次布局计算高度 + if (!gridLayout.current) { + const { y, height } = e.nativeEvent.layout + gridLayout.current = { y, height } + setGradientHeight(y + height / 2 + 16 + insets.top) + } } + return ( - {/* 页面内容 */} - + 2025/11/10 @@ -52,51 +61,52 @@ export default function Money() { - - - - 余额 - ↑20% - - - 22313.00 + + {/* 余额区域 */} + + + 余额 + ↓20% + 22,313.00 - - - - 收入 + {/* 收入/支出/结余 */} + + + + 收入 ↑20% - 11.0 + 11.0 - - - 支出 + + + + 支出 ↑20% - 11.0 + 11.0 - - - 结余 + + + + 结余 ↑20% - 11.0 + 11.0 - - 预算 - + {/* 预算进度 */} + + 预算 - + - - 点击设置 + 点击设置 @@ -121,6 +131,30 @@ export default function Money() { + + + + + + + + { + setShowDrawer(true) + }} + > + + + + { + setShowDrawer(false) + }} + /> + ) } diff --git a/code/base-project/base-app/src/app/(tabs)/money/index2.tsx b/code/base-project/base-app/src/app/(tabs)/money/index2.tsx index 6a6e3712..436f945d 100644 --- a/code/base-project/base-app/src/app/(tabs)/money/index2.tsx +++ b/code/base-project/base-app/src/app/(tabs)/money/index2.tsx @@ -1,35 +1,3 @@ -// import { LinearGradient } from 'expo-linear-gradient' -// import React from 'react' -// import { Dimensions, View } from 'react-native' -// import { useSafeAreaInsets } from 'react-native-safe-area-context' - -// export default function Money() { -// const insets = useSafeAreaInsets() -// const { height } = Dimensions.get('window') -// const gradientHeight = height / 3 // 渐变高度 1/3 - -// return ( -// -// {/* 渐变层 */} -// -// {/* 可以在这里放置顶部卡片或统计信息 */} -// -// -// ) -// } import { LinearGradient } from 'expo-linear-gradient' import React, { useState } from 'react' import { ScrollView, Text, View } from 'react-native' diff --git a/code/base-project/base-app/src/components/common/ao/SegmentedTabs.tsx b/code/base-project/base-app/src/components/common/ao/SegmentedTabs.tsx index 459dc887..4681e868 100644 --- a/code/base-project/base-app/src/components/common/ao/SegmentedTabs.tsx +++ b/code/base-project/base-app/src/components/common/ao/SegmentedTabs.tsx @@ -58,6 +58,7 @@ export default function SegmentedTabs({ }: SegmentedTabsProps) { const [selectedIndex, setSelectedIndex] = useState(value ?? defaultIndex) const [headerMeasuredWidth, setHeaderMeasuredWidth] = useState(0) + const [headerMeasuredHeight, setHeaderMeasuredHeight] = useState(tabHeight) const [ready, setReady] = useState(false) const sliderX = useSharedValue(0) @@ -65,8 +66,10 @@ export default function SegmentedTabs({ const actualHeaderWidth = width ?? headerMeasuredWidth const tabWidth = actualHeaderWidth ? actualHeaderWidth / tabs.length : 0 + + // 🔹 新逻辑:根据外层实际高度动态决定 slider 高度 + const sliderHeight = Math.max(headerMeasuredHeight - spacing * 2, 0) const sliderWidth = tabWidth - spacing * 2 - const sliderHeight = tabHeight - spacing * 2 useEffect(() => { if (value !== undefined) @@ -98,8 +101,9 @@ export default function SegmentedTabs({ } const handleHeaderLayout = (event: any) => { - const { width } = event.nativeEvent.layout + const { width, height } = event.nativeEvent.layout setHeaderMeasuredWidth(width) + setHeaderMeasuredHeight(height || tabHeight) if (width > 0 && !ready) setReady(true) } diff --git a/code/base-project/base-app/src/components/iconfont/IconIcon.tsx b/code/base-project/base-app/src/components/iconfont/IconIcon.tsx new file mode 100644 index 00000000..02b28301 --- /dev/null +++ b/code/base-project/base-app/src/components/iconfont/IconIcon.tsx @@ -0,0 +1,64 @@ +/* eslint-disable */ +/* tslint:disable */ + +import React from 'react'; +import type { FunctionComponent } from 'react'; +import type { ViewProps } from 'react-native'; +import { Svg, GProps, Path } from 'react-native-svg'; +import { getIconColor } from './helper'; + +interface Props extends Omit, ViewProps { + size?: number; + color?: string | string[]; +} + +const IconIcon: FunctionComponent = ({ + size = 18, + color, + ...rest +}) => { + return ( + + + + + + + + + + + + + + ); +}; + +export default React.memo(IconIcon); \ No newline at end of file diff --git a/code/base-project/base-app/src/components/iconfont/IconYule1.tsx b/code/base-project/base-app/src/components/iconfont/IconYule1.tsx new file mode 100644 index 00000000..7b9ad0b3 --- /dev/null +++ b/code/base-project/base-app/src/components/iconfont/IconYule1.tsx @@ -0,0 +1,32 @@ +/* eslint-disable */ +/* tslint:disable */ + +import React from 'react'; +import type { FunctionComponent } from 'react'; +import type { ViewProps } from 'react-native'; +import { Svg, GProps, Path } from 'react-native-svg'; +import { getIconColor } from './helper'; + +interface Props extends Omit, ViewProps { + size?: number; + color?: string | string[]; +} + +const IconYule1: FunctionComponent = ({ + size = 18, + color, + ...rest +}) => { + return ( + + + + + + ); +}; + +export default React.memo(IconYule1); \ No newline at end of file diff --git a/code/base-project/base-app/src/components/iconfont/index.tsx b/code/base-project/base-app/src/components/iconfont/index.tsx index bcf54d82..d2810d83 100644 --- a/code/base-project/base-app/src/components/iconfont/index.tsx +++ b/code/base-project/base-app/src/components/iconfont/index.tsx @@ -4,6 +4,8 @@ import React, { FunctionComponent } from 'react'; import { ViewProps } from 'react-native'; import { GProps } from 'react-native-svg'; +import IconIcon from './IconIcon'; +import IconYule1 from './IconYule1'; import IconZhichu from './IconZhichu'; import IconShouru from './IconShouru'; import IconJiaotong from './IconJiaotong'; @@ -15,6 +17,8 @@ import IconQuxian1 from './IconQuxian1'; import IconWeixin from './IconWeixin'; import IconZhiwen from './IconZhiwen'; import IconQq from './IconQq'; +export { default as IconIcon } from './IconIcon'; +export { default as IconYule1 } from './IconYule1'; export { default as IconZhichu } from './IconZhichu'; export { default as IconShouru } from './IconShouru'; export { default as IconJiaotong } from './IconJiaotong'; @@ -27,7 +31,7 @@ export { default as IconWeixin } from './IconWeixin'; export { default as IconZhiwen } from './IconZhiwen'; export { default as IconQq } from './IconQq'; -export type IconNames = 'zhichu' | 'shouru' | 'jiaotong' | 'shucai' | 'riyongpin' | 'yule' | 'lingshi' | 'quxian1' | 'weixin' | 'zhiwen' | 'QQ'; +export type IconNames = 'icon' | 'yule1' | 'zhichu' | 'shouru' | 'jiaotong' | 'shucai' | 'riyongpin' | 'yule' | 'lingshi' | 'quxian1' | 'weixin' | 'zhiwen' | 'QQ'; interface Props extends GProps, ViewProps { name: IconNames; @@ -37,28 +41,32 @@ interface Props extends GProps, ViewProps { let IconFont: FunctionComponent = ({ name, ...rest }) => { switch (name) { + case 'icon': + return ; + case 'yule1': + return ; case 'zhichu': - return ; + return ; case 'shouru': - return ; + return ; case 'jiaotong': - return ; + return ; case 'shucai': - return ; + return ; case 'riyongpin': - return ; + return ; case 'yule': - return ; + return ; case 'lingshi': - return ; + return ; case 'quxian1': - return ; + return ; case 'weixin': - return ; + return ; case 'zhiwen': - return ; + return ; case 'QQ': - return ; + return ; } return null; diff --git a/code/base-project/base-app/src/components/ui/fab/index.tsx b/code/base-project/base-app/src/components/ui/fab/index.tsx new file mode 100644 index 00000000..2778a05b --- /dev/null +++ b/code/base-project/base-app/src/components/ui/fab/index.tsx @@ -0,0 +1,224 @@ +'use client'; +import React from 'react'; +import { createFab } from '@gluestack-ui/core/fab/creator'; +import { Pressable, Text } from 'react-native'; +import { tva } from '@gluestack-ui/utils/nativewind-utils'; +import { + withStyleContext, + useStyleContext, +} from '@gluestack-ui/utils/nativewind-utils'; +import { cssInterop } from 'nativewind'; +import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; +import { PrimitiveIcon, UIIcon } from '@gluestack-ui/core/icon/creator'; + +const SCOPE = 'FAB'; +const Root = withStyleContext(Pressable, SCOPE); +const UIFab = createFab({ + Root: Root, + Label: Text, + Icon: UIIcon, +}); + +cssInterop(PrimitiveIcon, { + className: { + target: 'style', + nativeStyleToProp: { + height: true, + width: true, + fill: true, + color: 'classNameColor', + stroke: true, + }, + }, +}); + +const fabStyle = tva({ + base: 'group/fab bg-primary-500 rounded-full z-20 p-4 flex-row items-center justify-center absolute hover:bg-primary-600 active:bg-primary-700 disabled:opacity-40 disabled:pointer-events-all disabled:cursor-not-allowed data-[focus=true]:web:outline-none data-[focus-visible=true]:web:ring-2 data-[focus-visible=true]:web:ring-indicator-info shadow-hard-2', + variants: { + size: { + sm: 'px-2.5 py-2.5', + md: 'px-3 py-3', + lg: 'px-4 py-4', + }, + placement: { + 'top right': 'top-4 right-4', + 'top left': 'top-4 left-4', + 'bottom right': 'bottom-4 right-4', + 'bottom left': 'bottom-4 left-4', + 'top center': 'top-4 self-center', + 'bottom center': 'bottom-4 self-center', + }, + }, +}); + +const fabLabelStyle = tva({ + base: 'text-typography-50 font-normal font-body tracking-md text-left mx-2', + variants: { + isTruncated: { + true: '', + }, + bold: { + true: 'font-bold', + }, + underline: { + true: 'underline', + }, + strikeThrough: { + true: 'line-through', + }, + size: { + '2xs': 'text-2xs', + 'xs': 'text-xs', + 'sm': 'text-sm', + 'md': 'text-base', + 'lg': 'text-lg', + 'xl': 'text-xl', + '2xl': 'text-2xl', + '3xl': 'text-3xl', + '4xl': 'text-4xl', + '5xl': 'text-5xl', + '6xl': 'text-6xl', + }, + sub: { + true: 'text-xs', + }, + italic: { + true: 'italic', + }, + highlight: { + true: 'bg-yellow-500', + }, + }, + parentVariants: { + size: { + sm: 'text-sm', + md: 'text-base', + lg: 'text-lg', + }, + }, +}); + +const fabIconStyle = tva({ + base: 'text-typography-50 fill-none', + variants: { + size: { + '2xs': 'h-3 w-3', + 'xs': 'h-3.5 w-3.5', + 'sm': 'h-4 w-4', + 'md': 'w-[18px] h-[18px]', + 'lg': 'h-5 w-5', + 'xl': 'h-6 w-6', + }, + }, +}); + +type IFabProps = Omit, 'context'> & + VariantProps; + +const Fab = React.forwardRef, IFabProps>( + function Fab( + { size = 'md', placement = 'bottom right', className, ...props }, + ref + ) { + return ( + + ); + } +); + +type IFabLabelProps = React.ComponentPropsWithoutRef & + VariantProps; + +const FabLabel = React.forwardRef< + React.ComponentRef, + IFabLabelProps +>(function FabLabel( + { + size, + isTruncated = false, + bold = false, + underline = false, + strikeThrough = false, + className, + ...props + }, + ref +) { + const { size: parentSize } = useStyleContext(SCOPE); + return ( + + ); +}); + +type IFabIconProps = React.ComponentPropsWithoutRef & + VariantProps & { + height?: number; + width?: number; + }; + +const FabIcon = React.forwardRef< + React.ComponentRef, + IFabIconProps +>(function FabIcon({ size, className, ...props }, ref) { + const { size: parentSize } = useStyleContext(SCOPE); + + if (typeof size === 'number') { + return ( + + ); + } else if ( + (props.height !== undefined || props.width !== undefined) && + size === undefined + ) { + return ( + + ); + } + return ( + + ); +}); + +Fab.displayName = 'Fab'; +FabLabel.displayName = 'FabLabel'; +FabIcon.displayName = 'FabIcon'; + +export { Fab, FabLabel, FabIcon }; diff --git a/code/base-project/base-app/src/request/api/money.ts b/code/base-project/base-app/src/request/api/money.ts new file mode 100644 index 00000000..35303f70 --- /dev/null +++ b/code/base-project/base-app/src/request/api/money.ts @@ -0,0 +1,13 @@ +import type { MoneyCategory } from '@/types/money' +import alovaInstance from '../index' + +const API_PREFIX = '/money' + +export interface MoneyCategoryResult { + income: MoneyCategory[] + expense: MoneyCategory[] +} + +export function getMoneyCategoryApi() { + return alovaInstance.Get>(`${API_PREFIX}/category`) +} diff --git a/code/base-project/base-app/src/types/global.d.ts b/code/base-project/base-app/src/types/global.d.ts index f6f3db87..875bf9ef 100644 --- a/code/base-project/base-app/src/types/global.d.ts +++ b/code/base-project/base-app/src/types/global.d.ts @@ -11,7 +11,7 @@ declare global { interface UserInfo { account: string - id: string + id: number seqNo: number username: string gender: number diff --git a/code/base-project/base-app/src/types/money.ts b/code/base-project/base-app/src/types/money.ts new file mode 100644 index 00000000..9fa42945 --- /dev/null +++ b/code/base-project/base-app/src/types/money.ts @@ -0,0 +1,9 @@ +export interface MoneyCategory { + id: string + user_id: number + name: string + label: string + icon: string + sort_number: number + type: number +} diff --git a/code/base-project/base-app/test2.html b/code/base-project/base-app/test2.html index 15185663..6c81644a 100644 --- a/code/base-project/base-app/test2.html +++ b/code/base-project/base-app/test2.html @@ -1,142 +1,179 @@ - + -分类共享交互演示 + +记账弹出示例 -

记账分类共享交互演示

+
+ +
+
收入
+
支出
+
-
-
-

用户 A 视图

-
    + +
    +
    餐饮
    +
    交通
    +
    购物
    +
    娱乐
    +
    工资
    +
    兼职
    -
    -

    用户 B 视图

    -
      + + +
      + +
      + + +
      + + +
      + + +
      -

      操作区(模拟修改)

      -

      选择用户修改系统分类或隐藏/重命名:

      - - - - - - - - +89 \ No newline at end of file diff --git a/code/base-project/base-go-v2/cmd/app/main.go b/code/base-project/base-go-v2/cmd/app/main.go index e151acb7..09211829 100644 --- a/code/base-project/base-go-v2/cmd/app/main.go +++ b/code/base-project/base-go-v2/cmd/app/main.go @@ -5,6 +5,7 @@ import ( "base-go-v2/internal/config" "base-go-v2/internal/db" "base-go-v2/internal/logx" + "base-go-v2/internal/utils/idgen" "fmt" "github.com/valyala/fasthttp" "log" @@ -30,6 +31,10 @@ func main() { log.Printf("✅ 服务器启动成功,端口%s", addr) + // 配置id + options := idgen.NewIdGeneratorOptions(1) + idgen.SetIdGenerator(options) + // 启动服务器(简洁写法) if err := fasthttp.ListenAndServe(addr, r.Handler); err != nil { log.Fatalf("❌ 服务器启动失败: %v", err) diff --git a/code/base-project/base-go-v2/go.mod b/code/base-project/base-go-v2/go.mod index b5f458ce..dcbbb701 100644 --- a/code/base-project/base-go-v2/go.mod +++ b/code/base-project/base-go-v2/go.mod @@ -13,7 +13,10 @@ require ( require ( github.com/andybalholm/brotli v1.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/klauspost/compress v1.18.1 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect @@ -26,6 +29,6 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.37.0 // indirect + golang.org/x/sys v0.38.0 // indirect golang.org/x/text v0.30.0 // indirect ) diff --git a/code/base-project/base-go-v2/go.sum b/code/base-project/base-go-v2/go.sum index 54a58b43..1577e5fb 100644 --- a/code/base-project/base-go-v2/go.sum +++ b/code/base-project/base-go-v2/go.sum @@ -1,8 +1,14 @@ filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= @@ -37,6 +43,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.68.0 h1:v12Nx16iepr8r9ySOwqI+5RBJ/DqTxhOy1HrHoDFnok= github.com/valyala/fasthttp v1.68.0/go.mod h1:5EXiRfYQAoiO/khu4oU9VISC/eVY6JqmSpPJoHCKsz4= +github.com/yitter/idgenerator-go v1.3.3 h1:i6rzmpbCL0vlmr/tuW5+lSQzNuDG9vYBjIYRvnRcHE8= +github.com/yitter/idgenerator-go v1.3.3/go.mod h1:VVjbqFjGUsIkaXVkXEdmx1LiXUL3K1NvyxWPJBPbBpE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= @@ -45,6 +53,8 @@ go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/code/base-project/base-go-v2/internal/api/auth/index.go b/code/base-project/base-go-v2/internal/api/auth/index.go index 5cc7188b..f3625ab9 100644 --- a/code/base-project/base-go-v2/internal/api/auth/index.go +++ b/code/base-project/base-go-v2/internal/api/auth/index.go @@ -1,14 +1,15 @@ package auth import ( + "base-go-v2/internal/api/money" "base-go-v2/internal/db" response "base-go-v2/internal/reponse" "base-go-v2/internal/router" "base-go-v2/internal/routinex" + "base-go-v2/internal/utils/idgen" "base-go-v2/internal/utils/jwtx" "base-go-v2/internal/utils/mapx" "base-go-v2/internal/utils/timex" - "base-go-v2/internal/utils/uid" ) func InitAuthRouter(r *router.Router) { @@ -85,7 +86,7 @@ func loginDefault(c *router.Context) error { Send() } - userId := user.GetInt("id") + userId := user.GetInt64("id") // 创建 Access Token 和 Refresh Token accessToken, err := jwtx.CreateAccessToken(userId) @@ -99,8 +100,8 @@ func loginDefault(c *router.Context) error { // 返回数据 respData := mapx.New(). - SetIntToString("userId", userId). SetKV( + "userId", userId, "username", user.GetString("username"), "seqNo", user.GetInt("seq_no"), "gender", user.GetInt("gender"), @@ -140,9 +141,10 @@ func registerDefault(c *router.Context) error { return response.Fail(c).Message("该账号已被注册").Send() } + userId := idgen.NextId() // 构造新用户数据 newUserData := mapx.New().SetKV( - "id", uid.NextID(), + "id", userId, "account", account, "password", password, ) @@ -150,10 +152,16 @@ func registerDefault(c *router.Context) error { // 插入新用户 insertedRows, err := db.InsertOne("user_info", newUserData) if err != nil { + return response.Fail(c).Message("注册失败").Send() } + if insertedRows != 1 { return response.Fail(c).Message("注册失败").Send() } + err = money.InitDefaultCategories(userId) + if err != nil { + return c.AddError(err) + } return response.Success(c).Message("注册成功").Send() } diff --git a/code/base-project/base-go-v2/internal/api/middleware/auth.go b/code/base-project/base-go-v2/internal/api/middleware/auth.go index faddcfb9..9fc39f41 100644 --- a/code/base-project/base-go-v2/internal/api/middleware/auth.go +++ b/code/base-project/base-go-v2/internal/api/middleware/auth.go @@ -21,7 +21,7 @@ func AuthMiddleware() router.HandlerFunc { // Access Token 有效 if tokenVerify.IsValid { - c.Set("user_id", tokenVerify.Claims.UserID) + c.SetUserID(tokenVerify.Claims.UserID) return nil } diff --git a/code/base-project/base-go-v2/internal/api/middleware/logger.go b/code/base-project/base-go-v2/internal/api/middleware/logger.go index 91013ad3..05e70c71 100644 --- a/code/base-project/base-go-v2/internal/api/middleware/logger.go +++ b/code/base-project/base-go-v2/internal/api/middleware/logger.go @@ -4,7 +4,7 @@ import ( "base-go-v2/internal/logx" "base-go-v2/internal/router" "base-go-v2/internal/routinex" - "base-go-v2/internal/utils/uid" + "base-go-v2/internal/utils/idgen" "time" ) @@ -20,7 +20,7 @@ func LoggerMiddleware() router.HandlerFunc { start := time.Now() // 记录开始时间 // 生成 trackID 并存入 routinex - trackID := uid.NextID() + trackID := idgen.NextId() routinex.Set(logx.TrackID, trackID) // 执行业务逻辑,并捕获错误 diff --git a/code/base-project/base-go-v2/internal/api/money/index.go b/code/base-project/base-go-v2/internal/api/money/index.go new file mode 100644 index 00000000..723d6a81 --- /dev/null +++ b/code/base-project/base-go-v2/internal/api/money/index.go @@ -0,0 +1,79 @@ +package money + +import ( + "base-go-v2/internal/db" + response "base-go-v2/internal/reponse" + "base-go-v2/internal/router" + "base-go-v2/internal/utils/idgen" + "base-go-v2/internal/utils/mapx" + "fmt" +) + +func InitMoneyRouter(r *router.Router) { + group := r.Group("money") + group.GET("/category", getUserCategory) + //group := r.Group("auth") +} + +// InitDefaultCategories 初始化系统默认分类到用户分类表 +func InitDefaultCategories(userID int64) error { + fmt.Println("进入 InitDefaultCategories ===") + + // 1. 查询系统分类表 + sysCategories, err := db.FindAll("money_sys_category", "sort_number") + if err != nil { + return err + } + + fmt.Printf("系统分类数量: %d\n", len(sysCategories)) + + // 2. 构建批量插入数据 + userCategories := make([]mapx.M, 0, len(sysCategories)) + for i, row := range sysCategories { + m := mapx.New().SetKV( + "id", idgen.NextId(), + "user_id", userID, + "name", row.GetString("name"), + "icon", row.GetString("icon"), + "type", row.GetInt("type"), + "sort_number", row.GetInt("sort_number"), + ) + fmt.Printf("用户分类 %d: %+v\n", i+1, m) + userCategories = append(userCategories, m) + } + + // 3. 批量插入到用户分类表 + if _, err := db.InsertBatch("money_user_category", userCategories); err != nil { + return err + } + + fmt.Println("初始化用户分类成功!") + return nil +} + +func getUserCategory(c *router.Context) error { + userId := c.GetUserID() + + // 查询当前用户的分类 + userCategories, err := db.Find("money_user_category", mapx.New().Set("user_id", userId), "sort_number ASC") + if err != nil { + return c.AddError(err) + } + + // 按 type 分组 + result := map[string][]mapx.M{ + "income": {}, + "expense": {}, + } + + for _, cat := range userCategories { + switch cat.GetInt("type") { + case 0: + result["income"] = append(result["income"], cat) + case 1: + result["expense"] = append(result["expense"], cat) + } + } + + return response.Success(c).Data(result).Send() +} diff --git a/code/base-project/base-go-v2/internal/api/router.go b/code/base-project/base-go-v2/internal/api/router.go index dccc8c0c..a03dd281 100644 --- a/code/base-project/base-go-v2/internal/api/router.go +++ b/code/base-project/base-go-v2/internal/api/router.go @@ -3,6 +3,7 @@ package api import ( "base-go-v2/internal/api/auth" "base-go-v2/internal/api/middleware" + "base-go-v2/internal/api/money" "base-go-v2/internal/config" "base-go-v2/internal/router" ) @@ -17,5 +18,7 @@ func InitAppRouter() *router.Router { r.Use(middleware.AuthMiddleware()).ExcludePaths("/auth/**") auth.InitAuthRouter(r) + money.InitMoneyRouter(r) + return r } diff --git a/code/base-project/base-go-v2/internal/db/insert.go b/code/base-project/base-go-v2/internal/db/insert.go index c1409f01..f833a030 100644 --- a/code/base-project/base-go-v2/internal/db/insert.go +++ b/code/base-project/base-go-v2/internal/db/insert.go @@ -3,12 +3,14 @@ package db import ( "fmt" "strings" + + "base-go-v2/internal/utils/mapx" ) // ---------------- 内部辅助函数 ---------------- // buildInsertSQL 构建插入 SQL 和参数 -func buildInsertSQL(table string, data map[string]interface{}, returning string) (string, []interface{}) { +func buildInsertSQL(table string, data mapx.M, returning string) (string, []interface{}) { columns := make([]string, 0, len(data)) placeholders := make([]string, 0, len(data)) values := make([]interface{}, 0, len(data)) @@ -34,7 +36,7 @@ func buildInsertSQL(table string, data map[string]interface{}, returning string) // ---------------- 公共方法 ---------------- // InsertOne 插入单条记录,返回受影响行数 -func InsertOne(table string, data map[string]interface{}) (int64, error) { +func InsertOne(table string, data mapx.M) (int64, error) { tx, err := DB.Beginx() if err != nil { return 0, err @@ -55,7 +57,7 @@ func InsertOne(table string, data map[string]interface{}) (int64, error) { } // InsertBatch 批量插入,返回总受影响行数 -func InsertBatch(table string, dataList []map[string]interface{}) (int64, error) { +func InsertBatch(table string, dataList []mapx.M) (int64, error) { if len(dataList) == 0 { return 0, nil } @@ -90,7 +92,7 @@ func InsertBatch(table string, dataList []map[string]interface{}) (int64, error) } // InsertOneReturnPK 插入单条记录,返回主键值 -func InsertOneReturnPK(table string, pkColumn string, data map[string]interface{}) (int64, error) { +func InsertOneReturnPK(table string, pkColumn string, data mapx.M) (int64, error) { tx, err := DB.Beginx() if err != nil { return 0, err @@ -113,7 +115,7 @@ func InsertOneReturnPK(table string, pkColumn string, data map[string]interface{ } // InsertBatchReturnPK 批量插入多条记录,返回主键数组 -func InsertBatchReturnPK(table string, pkColumn string, dataList []map[string]interface{}) ([]int64, error) { +func InsertBatchReturnPK(table string, pkColumn string, dataList []mapx.M) ([]int64, error) { if len(dataList) == 0 { return nil, nil } diff --git a/code/base-project/base-go-v2/internal/logx/log.go b/code/base-project/base-go-v2/internal/logx/log.go index 4fba5172..8448e579 100644 --- a/code/base-project/base-go-v2/internal/logx/log.go +++ b/code/base-project/base-go-v2/internal/logx/log.go @@ -3,8 +3,8 @@ package logx import ( "base-go-v2/internal/config" "base-go-v2/internal/routinex" + "base-go-v2/internal/utils/idgen" "base-go-v2/internal/utils/strutil" - "base-go-v2/internal/utils/uid" "fmt" "os" "path/filepath" @@ -63,7 +63,7 @@ func (c *trackCore) Check(entry zapcore.Entry, ce *zapcore.CheckedEntry) *zapcor func (c *trackCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { val := routinex.Get(TrackID) if val == nil { - val = uid.NextID() + val = idgen.NextId() routinex.Set(TrackID, val) // 保证同一请求复用同一 trackID } diff --git a/code/base-project/base-go-v2/internal/router/context.go b/code/base-project/base-go-v2/internal/router/context.go index 2148a21a..8c6690f4 100644 --- a/code/base-project/base-go-v2/internal/router/context.go +++ b/code/base-project/base-go-v2/internal/router/context.go @@ -126,6 +126,32 @@ func (c *Context) Get(key string) (interface{}, bool) { return val, ok } +// SetUserID 存储 userId +func (c *Context) SetUserID(userID int64) { + c.Set("user_id", userID) +} + +// GetUserID 获取 userId +func (c *Context) GetUserID() int64 { + val, ok := c.Get("user_id") + if !ok || val == nil { + return 0 + } + + switch v := val.(type) { + case int64: + return v + case int: + return int64(v) + case uint64: + return int64(v) + case uint: + return int64(v) + default: + return 0 + } +} + // JSON 返回 JSON 响应,支持返回 error func (c *Context) JSON(statusCode int, data interface{}) error { c.RequestCtx.SetStatusCode(statusCode) diff --git a/code/base-project/base-go-v2/internal/utils/idgen/DefaultIdGenerator.go b/code/base-project/base-go-v2/internal/utils/idgen/DefaultIdGenerator.go new file mode 100644 index 00000000..826ac0bd --- /dev/null +++ b/code/base-project/base-go-v2/internal/utils/idgen/DefaultIdGenerator.go @@ -0,0 +1,83 @@ +package idgen + +import ( + "strconv" + "time" +) + +type DefaultIdGenerator struct { + Options *IdGeneratorOptions + SnowWorker ISnowWorker + IdGeneratorException IdGeneratorException +} + +func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator { + if options == nil { + panic("dig.Options error.") + } + + // 1.BaseTime + minTime := int64(631123200000) // time.Now().AddDate(-30, 0, 0).UnixNano() / 1e6 + if options.BaseTime < minTime || options.BaseTime > time.Now().UnixNano()/1e6 { + panic("BaseTime error.") + } + + // 2.WorkerIdBitLength + if options.WorkerIdBitLength <= 0 { + panic("WorkerIdBitLength error.(range:[1, 21])") + } + if options.WorkerIdBitLength+options.SeqBitLength > 22 { + panic("error:WorkerIdBitLength + SeqBitLength <= 22") + } + + // 3.WorkerId + maxWorkerIdNumber := uint16(1< maxWorkerIdNumber { + panic("WorkerId error. (range:[0, " + strconv.FormatUint(uint64(maxWorkerIdNumber), 10) + "]") + } + + // 4.SeqBitLength + if options.SeqBitLength < 2 || options.SeqBitLength > 21 { + panic("SeqBitLength error. (range:[2, 21])") + } + + // 5.MaxSeqNumber + maxSeqNumber := uint32(1< maxSeqNumber { + panic("MaxSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]") + } + + // 6.MinSeqNumber + if options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber { + panic("MinSeqNumber error. (range:[5, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]") + } + + var snowWorker ISnowWorker + switch options.Method { + case 1: + snowWorker = NewSnowWorkerM1(options) + case 2: + snowWorker = NewSnowWorkerM2(options) + default: + snowWorker = NewSnowWorkerM1(options) + } + + if options.Method == 1 { + time.Sleep(time.Duration(500) * time.Microsecond) + } + + return &DefaultIdGenerator{ + Options: options, + SnowWorker: snowWorker, + } +} + +func (dig DefaultIdGenerator) NewLong() int64 { + return dig.SnowWorker.NextId() +} diff --git a/code/base-project/base-go-v2/internal/utils/idgen/IIdGenerator.go b/code/base-project/base-go-v2/internal/utils/idgen/IIdGenerator.go new file mode 100644 index 00000000..884e145a --- /dev/null +++ b/code/base-project/base-go-v2/internal/utils/idgen/IIdGenerator.go @@ -0,0 +1,5 @@ +package idgen + +type IIdGenerator interface { + NewLong() uint64 +} diff --git a/code/base-project/base-go-v2/internal/utils/idgen/ISnowWorker.go b/code/base-project/base-go-v2/internal/utils/idgen/ISnowWorker.go new file mode 100644 index 00000000..b4198231 --- /dev/null +++ b/code/base-project/base-go-v2/internal/utils/idgen/ISnowWorker.go @@ -0,0 +1,5 @@ +package idgen + +type ISnowWorker interface { + NextId() int64 +} diff --git a/code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorException.go b/code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorException.go new file mode 100644 index 00000000..58dc11a4 --- /dev/null +++ b/code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorException.go @@ -0,0 +1,12 @@ +package idgen + +import "fmt" + +type IdGeneratorException struct { + message string + error error +} + +func (e IdGeneratorException) IdGeneratorException(message ...interface{}) { + fmt.Println(message) +} diff --git a/code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorOptions.go b/code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorOptions.go new file mode 100644 index 00000000..b728a51a --- /dev/null +++ b/code/base-project/base-go-v2/internal/utils/idgen/IdGeneratorOptions.go @@ -0,0 +1,25 @@ +package idgen + +type IdGeneratorOptions struct { + Method uint16 // 雪花计算方法,(1-漂移算法|2-传统算法),默认1 + BaseTime int64 // 基础时间(ms单位),不能超过当前系统时间 + WorkerId uint16 // 机器码,必须由外部设定,最大值 2^WorkerIdBitLength-1 + WorkerIdBitLength byte // 机器码位长,默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) + SeqBitLength byte // 序列数位长,默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) + MaxSeqNumber uint32 // 最大序列数(含),设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) + MinSeqNumber uint32 // 最小序列数(含),默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 + TopOverCostCount uint32 // 最大漂移次数(含),默认2000,推荐范围500-10000(与计算能力有关) +} + +func NewIdGeneratorOptions(workerId uint16) *IdGeneratorOptions { + return &IdGeneratorOptions{ + Method: 1, + WorkerId: workerId, + BaseTime: 1582136402000, + WorkerIdBitLength: 6, + SeqBitLength: 6, + MaxSeqNumber: 0, + MinSeqNumber: 5, + TopOverCostCount: 2000, + } +} diff --git a/code/base-project/base-go-v2/internal/utils/idgen/OverCostActionArg.go b/code/base-project/base-go-v2/internal/utils/idgen/OverCostActionArg.go new file mode 100644 index 00000000..252b8628 --- /dev/null +++ b/code/base-project/base-go-v2/internal/utils/idgen/OverCostActionArg.go @@ -0,0 +1,19 @@ +package idgen + +type OverCostActionArg struct { + ActionType int32 + TimeTick int64 + WorkerId uint16 + OverCostCountInOneTerm int32 + GenCountInOneTerm int32 + TermIndex int32 +} + +func (ocaa OverCostActionArg) OverCostActionArg(workerId uint16, timeTick int64, actionType int32, overCostCountInOneTerm int32, genCountWhenOverCost int32, index int32) { + ocaa.ActionType = actionType + ocaa.TimeTick = timeTick + ocaa.WorkerId = workerId + ocaa.OverCostCountInOneTerm = overCostCountInOneTerm + ocaa.GenCountInOneTerm = genCountWhenOverCost + ocaa.TermIndex = index +} diff --git a/code/base-project/base-go-v2/internal/utils/idgen/SnowWorkerM1.go b/code/base-project/base-go-v2/internal/utils/idgen/SnowWorkerM1.go new file mode 100644 index 00000000..481da2d8 --- /dev/null +++ b/code/base-project/base-go-v2/internal/utils/idgen/SnowWorkerM1.go @@ -0,0 +1,243 @@ +package idgen + +import ( + "sync" + "time" +) + +// SnowWorkerM1 . +type SnowWorkerM1 struct { + BaseTime int64 //基础时间 + WorkerId uint16 //机器码 + WorkerIdBitLength byte //机器码位长 + SeqBitLength byte //自增序列数位长 + MaxSeqNumber uint32 //最大序列数(含) + MinSeqNumber uint32 //最小序列数(含) + TopOverCostCount uint32 //最大漂移次数 + _TimestampShift byte + _CurrentSeqNumber uint32 + + _LastTimeTick int64 + _TurnBackTimeTick int64 + _TurnBackIndex byte + _IsOverCost bool + _OverCostCountInOneTerm uint32 + _GenCountInOneTerm uint32 + _TermIndex uint32 + + sync.Mutex +} + +// NewSnowWorkerM1 . +func NewSnowWorkerM1(options *IdGeneratorOptions) ISnowWorker { + var workerIdBitLength byte + var seqBitLength byte + var maxSeqNumber uint32 + + // 1.BaseTime + var baseTime int64 + if options.BaseTime != 0 { + baseTime = options.BaseTime + } else { + baseTime = 1582136402000 + } + + // 2.WorkerIdBitLength + if options.WorkerIdBitLength == 0 { + workerIdBitLength = 6 + } else { + workerIdBitLength = options.WorkerIdBitLength + } + + // 3.WorkerId + var workerId = options.WorkerId + + // 4.SeqBitLength + if options.SeqBitLength == 0 { + seqBitLength = 6 + } else { + seqBitLength = options.SeqBitLength + } + + // 5.MaxSeqNumber + if options.MaxSeqNumber <= 0 { + maxSeqNumber = (1 << seqBitLength) - 1 + } else { + maxSeqNumber = options.MaxSeqNumber + } + + // 6.MinSeqNumber + var minSeqNumber = options.MinSeqNumber + + // 7.Others + var topOverCostCount = options.TopOverCostCount + if topOverCostCount == 0 { + topOverCostCount = 2000 + } + + timestampShift := (byte)(workerIdBitLength + seqBitLength) + currentSeqNumber := minSeqNumber + + return &SnowWorkerM1{ + BaseTime: baseTime, + WorkerIdBitLength: workerIdBitLength, + WorkerId: workerId, + SeqBitLength: seqBitLength, + MaxSeqNumber: maxSeqNumber, + MinSeqNumber: minSeqNumber, + TopOverCostCount: topOverCostCount, + _TimestampShift: timestampShift, + _CurrentSeqNumber: currentSeqNumber, + + _LastTimeTick: 0, + _TurnBackTimeTick: 0, + _TurnBackIndex: 0, + _IsOverCost: false, + _OverCostCountInOneTerm: 0, + _GenCountInOneTerm: 0, + _TermIndex: 0, + } +} + +// DoGenIDAction . +func (m1 *SnowWorkerM1) DoGenIdAction(arg *OverCostActionArg) { + +} + +func (m1 *SnowWorkerM1) BeginOverCostAction(useTimeTick int64) { + +} + +func (m1 *SnowWorkerM1) EndOverCostAction(useTimeTick int64) { + if m1._TermIndex > 10000 { + m1._TermIndex = 0 + } +} + +func (m1 *SnowWorkerM1) BeginTurnBackAction(useTimeTick int64) { + +} + +func (m1 *SnowWorkerM1) EndTurnBackAction(useTimeTick int64) { + +} + +func (m1 *SnowWorkerM1) NextOverCostId() int64 { + currentTimeTick := m1.GetCurrentTimeTick() + if currentTimeTick > m1._LastTimeTick { + m1.EndOverCostAction(currentTimeTick) + m1._LastTimeTick = currentTimeTick + m1._CurrentSeqNumber = m1.MinSeqNumber + m1._IsOverCost = false + m1._OverCostCountInOneTerm = 0 + m1._GenCountInOneTerm = 0 + return m1.CalcId(m1._LastTimeTick) + } + if m1._OverCostCountInOneTerm >= m1.TopOverCostCount { + m1.EndOverCostAction(currentTimeTick) + m1._LastTimeTick = m1.GetNextTimeTick() + m1._CurrentSeqNumber = m1.MinSeqNumber + m1._IsOverCost = false + m1._OverCostCountInOneTerm = 0 + m1._GenCountInOneTerm = 0 + return m1.CalcId(m1._LastTimeTick) + } + if m1._CurrentSeqNumber > m1.MaxSeqNumber { + m1._LastTimeTick++ + m1._CurrentSeqNumber = m1.MinSeqNumber + m1._IsOverCost = true + m1._OverCostCountInOneTerm++ + m1._GenCountInOneTerm++ + + return m1.CalcId(m1._LastTimeTick) + } + + m1._GenCountInOneTerm++ + return m1.CalcId(m1._LastTimeTick) +} + +// NextNormalID . +func (m1 *SnowWorkerM1) NextNormalId() int64 { + currentTimeTick := m1.GetCurrentTimeTick() + if currentTimeTick < m1._LastTimeTick { + if m1._TurnBackTimeTick < 1 { + m1._TurnBackTimeTick = m1._LastTimeTick - 1 + m1._TurnBackIndex++ + // 每毫秒序列数的前5位是预留位,0用于手工新值,1-4是时间回拨次序 + // 最多4次回拨(防止回拨重叠) + if m1._TurnBackIndex > 4 { + m1._TurnBackIndex = 1 + } + m1.BeginTurnBackAction(m1._TurnBackTimeTick) + } + + // time.Sleep(time.Duration(1) * time.Millisecond) + return m1.CalcTurnBackId(m1._TurnBackTimeTick) + } + + // 时间追平时,_TurnBackTimeTick清零 + if m1._TurnBackTimeTick > 0 { + m1.EndTurnBackAction(m1._TurnBackTimeTick) + m1._TurnBackTimeTick = 0 + } + + if currentTimeTick > m1._LastTimeTick { + m1._LastTimeTick = currentTimeTick + m1._CurrentSeqNumber = m1.MinSeqNumber + return m1.CalcId(m1._LastTimeTick) + } + + if m1._CurrentSeqNumber > m1.MaxSeqNumber { + m1.BeginOverCostAction(currentTimeTick) + m1._TermIndex++ + m1._LastTimeTick++ + m1._CurrentSeqNumber = m1.MinSeqNumber + m1._IsOverCost = true + m1._OverCostCountInOneTerm = 1 + m1._GenCountInOneTerm = 1 + + return m1.CalcId(m1._LastTimeTick) + } + + return m1.CalcId(m1._LastTimeTick) +} + +// CalcID . +func (m1 *SnowWorkerM1) CalcId(useTimeTick int64) int64 { + result := int64(useTimeTick< m2.MaxSeqNumber { + m2._CurrentSeqNumber = m2.MinSeqNumber + currentTimeTick = m2.GetNextTimeTick() + } + } else { + m2._CurrentSeqNumber = m2.MinSeqNumber + } + if currentTimeTick < m2._LastTimeTick { + fmt.Println("Time error for {0} milliseconds", strconv.FormatInt(m2._LastTimeTick-currentTimeTick, 10)) + } + m2._LastTimeTick = currentTimeTick + result := int64(currentTimeTick<L-*?aA^*N(N;XYGB??}^{@pnJ;lO7b8S6c7jn_yhf3M43>M zkulYPsLLxomHSiB1p+Q~E)dAk>4h6aL7Gm=lXdDoh1W1!u|4FkT)6f2-MUiQ*7cMUV8VzLHO&cNu zq%DCoi}gR!&;F6NaB)M@M*%dVjt(BkwvZQ6VmvD+9WCHL7Vx74xq~1e1&}nd|G+bF zIp=~vLMI>)THL?$o_zp;YQsRF2UGvfW6TDD2ws6eH3R?7`}df*n7f(ZvO@>%sL!8+ zK!*h&&|L!%i1-HxgkyMH2HgIOY_vcTB_NkG@MjHj09k=(K}sMekOhbnNb!KUK-?gK z-_sx&5E?4-Lf+AU3;hl{^1`}v2jdPl77h+J7B)5x9swQ>EIJ&U{r z@<(!(R-Ug?5N#v-%<>BQFT)lOSf1y9ZC_Rl|7f!Wv`d8oLPbMCUjLE{*)RrDE}&SE z5QK^Xh=q=UiGAk|KnQdLcp@aC!{C;>L#*jaLT?@t4~UiXsdW&OjDeR=T5DndKBJ8G zvs@;Ax6p(G*~+$|N57{)cxXUNglL2y3D6OC`RD4Z5Ir4uz)JZH&S$)_5e$~xNYMYc zU-2C^7S!2hgyTs8$hsrC8DVzkD!^uXOHJT%uy!m8l;yRh;I*afc#`J~2QklH4$fW< zr6CC;F`uV#;s_2x6)#xI3YzFokmKli0g^$PucXA{2UZi>kNMw zV7G(pb@qQRFi>w69w}kz5gEQiymwNh`$L*IwK-j~w(;aTDL%6I3m8PB?Ea^D9(2Ey zAHp^6>$VteK4?OHDm%#W(%p~?xdVmz=8pFiwQ!)R*3P1`_ zL^{ob?HHu_vG>)b1Sl&vd!rjPcPrlsAL1IZv;i=ZD!~7DM+JUhG$On7rIOR;{PeZpHW9&FR4LJNH9n4-#Mv?Y(%zTgF3}}O~K_~h}y$?O~d-H1Pkzd z3C_nz(m6J}fc&q*e^LD_0iMT}7eAicWj%D2q4BXlBlUp~0-P_wAy%XTBq;x{Zy-%M z65ywiP62|GXug!Z&(Kz0LO7O81&EaPcPW*eUJjx5A?FlGA^S#jJ4wjwj5#=n?p8ON zTaOBNZ){NRBI#gPU!YIEKtVFdp4$fQjYVhGWTW5C%{zeTzthF+jRoJkUCXA8CwYx0 z|5*uD+}CZ$=huUez#`Z6b(#8;wCDTfPBEi!+ms`+_2SndRJT&x&cyo)hFbw^ZuR*A z;VpN=+bN-rzx#SkM>@dvwpup2=j9KrEtOj(L+wD976TUJpC`~6kz(6x35s_h#|MXn zBL(l*mb9?sA;RZ6BPl4QShq^?_|}GuF8+7%|8r~{YBc8ChOjQdOf6Oxpl4Zt$?*!T zzE5%yLe}Vt#!*PDSjNyr4lXL&8v{lq7f?A=LyZd=Qq|^ap_+T2s+BM|^Yu`w@z58G zlOJ865Z`w4rq{iQTnTe1LEAcx2Vy5ev5IAXTkuH=6CIekypZ{S3{*B3V-jjMc7bj1 zPy#mO;&RBbV2*NA4srD|!%z);bSL}^S=G__>EMCAgjkTHST5Y85KHwb^| zz<}wrx=mhVY%pFkhxJxBKnv6jO z55i^p19wwl9j|Xu{wp_#Ex@$JY%+$M-se9`R`}NEzoIq8@?sI~@!Qmko?;|F9r0pd zbaCWxZs%(-z5+EtVrk zqCwdcgUFGbOn;Go6#1eXM{*!G3_U!lk~p=#YsnMha+h`50_{ix)tk?3XqtFMe&j*} zBZrE|4n}?e1AGqg!-j^Vda_+}ea8 z6bkTP17HKYH5tK#xha1fsyvb!Fy8+n!6nMH*eH@M0J-mzv`|}Ykg|vnP9+Z0iAoa88FnqZk=-DLSQg5VRFO&%&z*f}U9Qj&I+cx2e)2u7*9;U5F5UWay`7WXU~>MmkH0~#dO!Z? z!#d_CWSjd)mkA;EX3s6pO_f33Q$UrG&5;ktH1!6hTS#sh!bvJ00ZTZKMb)ghP!&5z zyXuD=YY((EhYN=#H&gSm4dDK)2>rrHG@rf)lGqh6L%q+03raejVp1I}`sl9#M1n@5 zpzr!AGcO+Ic{x(U7?(kE3k`=R9LWHWSb>}XGYxJg1~FT{L(Mzs^N`2Pm>%S^2Hr{x ze2ynMu;@nDR7l*9Or)j(i(=xL9}?v#YfAo|5jkwo|CFJK-TEz7L_!z#ts7#o$;tko zxiF89I=<-^{SCs>lFkgUlMebhe3he$)!lE;p`MOvc+2#5j^(le2MtW0-tE%0LBCzo z$+ubDasMc?1*P1|1oROJdv6Q$v9<&W5q&Lz^Njer`$3Ux94A7QSLq2&x0@({mR({(&4t(0WC6}#-VNff?X?0aSG^<>jU6OA>jadi3=)|Xv2^>EX+!KukobBGqIP%3_TPn*jZq;WQ=#; z1C&270su1~`vYuR{`&a}A0Sp3ZozUq`FME$9CX9CvvNl(AuvR9Ihl>QBSDslokYxL zlSNDwl4d~ny^J84np7FgGLKrapq-m$fLbT6?XAO-pBD_Q!1ov=nvxiLZAEf-Epc7^ z3rh-td;mEj>1L21v3QeJM6!?^M#P(1sL1b4UJz>4h@p`;mUKItX8(*^RBodfAfU;O zLZSGhDVrV5093>Je<_x;mjz5K zV67<9Q2$pY+ht6`RgvlJWVeGN+N*-xh7ry=XhP`eu>-u2RVFix2NUy!-bd23>#xRq+6J>o%gI*|Bn{_t$=m6l-<4?|;OWCmrvAN&Dajk~&~T z+|CdOl1H`8AJw>hK!9Ry)o>a)rHTNi20He~n|lA%r(1gz_kXC8q#=q8aiV!~SO5V0 z(L68%UlwgE{(M`sp&F%{Ue{=2fW0_ozGPHnwdi3Mt82yerkrhC+w15D#QKk&R|xX8 z%Z+ei9L4w77Fo5K$Kat|Zv}ictA_q4O9dCR_LOMR?bv2>G0Xi4>F=Pg1Na0GF}Nk} zK{0zUk3SL%bQrb=1xTHWdg;0yts00BTF@{2Q^ zgaF;p6o>#(%X9whn?O|Pk*4E48Q^*)kvA2Pp`5V}Wj~95a70qpT9|wO>E&>Qs*oup zA^oM2m%9JgQyu&#AV@ ztFMPoHD~LO2qxtp0781%Bb#V6{Vri8mu&^`o6bUt;RML0HN*~}i12jghXj*)cPKBy zQ{uXkO@>mY+7euqnUb#o>1W$IxF&Pt-s)nmr=kWd=<>1@{Ra8v78N=Upr_W~t;233 zm5J5Rvh2Q;<4W3k;}Uh4?U^~Q190-jJrkDNe%DuKE z0fz!i@8b&p&5r{NseheSz{@qws;(b^E%@vDc>ve1>>Ico6BPEe$LFMURBMEP{!fHk zq2_OwBZU4uH&?LYkN5os*b4wVhl~Dk?(BqF6hKR=vVTJH6qe3tz>TtVwfqAIsGx-W zu}Go3OFFwZcFMGWME)c%YL^yZYaWgs+}dy3iGT|o6a(?9YF15=0$W_zAe}^*GSk@T zps6F@gt!N=MoV=lRv$%xq}J^agSZf%)ug8|;$*x<*iX(}O2BIEoRmCFc-bwTOdwDu z!_UNc@n@%Is17ry`0%*M>aP{a_a0^WA5>Jw_ZOEWLqUL{gf0gBL{#HnNBKbB(b7}O zlgQi6HX|Af&$_=ER1H=3e&7~sM!fA?sr)o5x-lp(a#*4r-3>k>Ng#B1;RM#$80Tk+ zPkO2OgM0Q>W|0s-E8#1=(UGxbm0NT02aneMQG|DsTNf-qul}*s0hs!~c*iksEl}B+ z>9{f~6Jhq$nN?Z?hsZ5gyeC%2s5-f{@O+e2&Y`kQ6|exb#jGWAqL#R<%cC~1D5OvR zmJT3KNed*B1;RD}!iJ>ikSc4+^PuWz4<$i5ZUL>CfxMiNuVzSy(q|9@oE7UEeHO)M z50bmw%EfXTFJKTc@ksJ#fa)AWT6&St93)eX#LF(Mo7Lq_g20BVMm*s53-dsbNGM!~ zuYx^dP;XGFGztLA`7d_D*NQzbs-7CW-z&TC6V>u&%(ZDv_ui|uudEuB8z}cf5?sfk z2v|2JzhK^Xcwq1wv|cm`3ex&+6?8QkJ>!RWil}iBvx6A@|)hH z)JVJt;3;Iq@SXIj)DF1)EhUv|Zk>Wp{p2pk>u3E6o+(E1ie0Q4D_!T_y6rXo6jbG9 zenFQa&mQe&=0UJR`EcT})-*^{^D&5p_+b$RsmbFG#Bg8E{TCHKjnfn3m@vtd zM@R=;n6a7B;z9DISJmk#-$ilH8HGNTP1v1$yHV_T6^w9}ee{877k5B1e;3QfHv#7D zxR$!2Hb{vwW}NQ*&Sjy$+@{Vz>=?Vt0rp`q;t7?McmUSEXvsRlSC8*>f4d0{k%eW6 z`$B%WmQZ9s=3BX*Lp!~T-OU@SX=Sq0~0K*&k$yH8xG6|zMgf#)$Bu?O)k`V zxmKP3D|L^xRrm9fKwcNYLyz%R=FY1}C9xJiyzF%gYlI02zIge6oEd&h%0lJ|{s#BP z#&o&(nrzizIB&Zc)iJbMvH0r)0&M9QXD%iz>ATB;cY{7&I_-``H--&`;qj|Ru^~=E zZ)BYYaZlrTa1iBn>M7`-V?Wl{BJQ_#c4neZG1=wU66o1Z*m5dn+0HgUu_&IklJS+K z?0y)0RPNgHje&=a*y0Jk7K_j8A5f3#D42~#TL?96RHSP|rq>LYe^+Cui}2_KwN9g- z#eU>{3_n@B9b&ski)rG=(;PeJkDh$}EJ-ctMC*$J)%e)J{Z-k7$x2@Muz-64$60t; zPEgefilzhQdtO$xiCdFgyQ$(22D|B$`Di@X3S`k#>bmraTB427o|2Kx!mGRct&Dp% zt!jTsdZwI{!yLyaXyE~7K+Gs{CeV;|K1RO27b89^;+AQKMcS94 z1YveCeoaf?h;#xvdCa)tY$r**3?K$J&aYw$qa8Ong`SI3@9=(=b0w1?`!L+f`}5_t zT_w2!$E%F#t7DJZVdrt9x3yzUzUM4d(v1S@w#<9b1gO%{RU-5GW@_JXxJFuQ5ykmK zV`$*c6qrRX;YGa0RX~Mq`i}8_U_lkZ-8}o{0|RJUbDbcHrfQT7_D>S8Ft1%|Ltl%n za!a=8W>Nu2^Y=axc@^JKYJ#D6Y#gj7OnhndnQO66}`zF5z&O0&4g&* zpJ4nTB*KCEdGyQgLybrFAmd+YqJQM;|0C`Fk2H5M(G<&Hd2-l;0X#p`l+-93#J5KhWEeD>@M8Sv?QlTF z^i9>CnP1bK_ngtmEcB%_+>@XcTFp>x#P@QytXGuq7l@yHI}NjI&ZYT|s>sBhAnIKL zw)Uz5jj_NOgD$#%M4c6BN&4;Lh23q>kGiTSS<(4s$z#Wf zeX6}=N@FFEfst=2uyT*G;XB3~$5@_)3sY$+ap@}R(b-7;SgSfuT*TFpZ{(zxb3?oU zpAO%QZLrnTs~#rF7+cNhbZY6Qn(Aqeu{WxQjxG#e-%>rHunPZbBds7wB#hHuH{NE< z+wqIyXPt9#9?aG0(@1z`=NAe|a@%DZ3?_Z?JlexYRleHkl^28~{>P5}lEBteX{V0M z;#u}NoGnbGDOskjwc*j!Wz8C$3N}827(@z(`dQOG`+48NnX6v{v*Sme22eHeaaDVd z4Okn}o`Ww`U1TREgdqj)aDN%4=X~lm?{1vwZT&Euo8Mta3Wua% zF7mn~VQNw)p9O)cbS8aP=zh&>DB&!T`$=t8&7@@Ft#uzq&!qUUYqCRwoRNXcPb04h z7js9UFh>Z9C>CvOahgTfcrB&kIscW&fyx`N7{*QJ>Zg8TrwY}|(Wrjx9eX&En#z6& zId!3Vd+w}{a#PRQ{Fu3G1^U!h=dyhDBnq%;60-a&_!-j9rS^3;`Z-)ol@8DkOm?0% zZsNKzH}|G=z&dTp-(xEp+AWK$$mgCsZrS@c z&{mb#W-!%h8pcl8OSbh?cTwJk|L|@JG8lO#@7#Jb`Dn#At*}g#F_v@5HK3cvByfd0 zV5y9y$d0x##xk)7G4ANpd6QY^H|cJ;Ig8eIrIUMQ_l#lidDZ8JsP9&6t1xPKk;PU? zp6NpZ&E+gaRw~PB;*lKv9hQ=-ZVSek>`&KJv!x!SHB?iRU)Sv-#9k>{ef#;07F-?O zEyUKfET>wvZ+=?sF1DIf$s3#H7vp|PY*OdqcW=ik!96or@z?977OjlLMR8jtQfSzr% zcrc@mBckzCWig2fFT~8_H|RiFCF?4QEwv$`tHS^4N*zW$tjYqv%?HgRV?>Y)%KJ#=k^tlTKnVpaow#Z`oS^2Ki?2PFPp+KJ+{d9KxACnh&$y7=YFe zwfkRVTb}E#Zoh4PVrsK1G?_OBSZ#D%PDRmk41zj$BJIPM0iKuM+#6o|( zS1tV|ARWSR22VWE&Un7DDe1(P)zbZSEl$&BDKIyBWk;aK6m3&^&}ePyXns3lQa#Kf zV%IhAMD`u$Q^N8>r+0Y_6t>)~VNiRb(~EF1c@_s$KzHnUGXsBmSLpQ@&6 z;0xh+KmK6D2O&z79~N9@Fa^WAOdWWb`f2r)G5$#BAd)xZ^-kUr*>!XPPSwPhNYb?nrAD>CXnz9=bDgWS??R zRDtm&5P?>0U!W{3J^jS}VDb%@HbQEmBpWHS*P6+ID|_epdY$k7MOYLWTm7yl5}$p2EII z0ZQMCFRiT(=L0nYp$75`*pqH=4%@A@vW|-z-i`)J`hC+D-Y*_BdS)H|8-#p5WJRN_f`+mIw2FOQy~w@HHv1d&%J+WF zsnodmu3xym-&r}s@%SrDhPK+tat&4LRDayl@2ZQA^ZD*ha}Sv}TxA2HC-*4F(y|A6E>BzG zP~%Y1>}F=XNWH|~fxi$4>`7NkN#1eUxZt4uHECf(lhPaz%DtpF#gRsDZ1}KhoWg?u zBvfs__&hV9#c_z}!(eES77s-ieq}kA*02~BW?OY1Cd?^Gdn^TW=rnQU)Y0)H+_zR; znTVtIO|)v{`nAA}+VTx1=KCTC-*Fs&;u%|KoqhbZ?7eaMVP@&4yF&%DXb#LFhIWjH zATTEZr%vj@)dKtWRcqx**3((ya(-L`>DI`$kq%)kZe(d1H>{-wtOVPmJ zFl$*YS^%$^h$5&1%b*txCl|(#zo!y*gOlLfm!L19!@k4wrX@lLRIlYG1xESua6ZpI z>c{MR5{fyxOR?1=YH#5A{0F{ERj>$wRF_#5>$qhMQ;j4Bk#6R}^5LPY9gU8|BCkIpB_`$&Og=6D=DbkxqryG-tOtwu!Zt54E4ozdNb(C6FWtzwFI{cbYi+n8Vqo{*+4IEAM$O;6(IlTAzSd{<8A>&QOSGcI+%t3O0hro$0eMn5jMEm^gD z(%<1hP_YEP|p8BOn3?=+Ht!e56 zp|2=2T4SRplu1|24&JQi6eMPoyh=(cM8#@F_aI#;XnWWqP7J` z)K@C5_6Vz0{^^K!V=MG1rk`ZYUm@Bxs`k)P1~Ts`F=rRpE9YB%;CRhEZ~vm#18t5` zJ4z3C9sQ&bQq3OSDOA9{EHa3J)A_zEyer9$$1*>rdh2zo0D`)IJf-z4ZInp*^{-gU z*e?4nbmh3kP)SVwt+iIZjHaw=%*Vf~C4Pe{J4$Q)AeL#}(>k4VIL~kzIfNuHL_$%n zV{o=nzUwhwvw(57s~QjWRMmLwMbF|H!*5R|)KH~JrDLJ0xPOmxfm72@ zLh+NoL6JtRRTC$irNd6S-wGFaMP^^bzI)d2?jFfKUCg@q0X{a&c1vwTMJ{{e=4#bu zM7_G&3zEYvh@v;JudWRozwQi(9%mQ4gK{BX)sHJvzEsLZB|E4^BfNX=olB*d)k0d{Z_^IjWCdF}a9 z{3_3#+4v2bE#Po@7pWflQOLPyEPj#W@ox})VuIw#OZ@3A!GPy{Or@vlh-%IYKaO~Kvr==}gb!d;Q5z!dti5EXg1H4vP>;!T3_9*^R=sVf` z^F|&9)2#+ph(znxY0_)w1rdXRrN=J90kIS_Fp~O|NA3d1vz>9>&U2n8Mxq)0Hob<- zt7S(t67ll+AI{kubsAjiD9p=sW;+jP2Y)KG`zX-f9zu9p&|uKmF>4dm1F-$PY89zQ|5szcUCRi?=)A7<#=Rf zFZ`@P*k^EvxpJl$sP;xJ;)^ZEd1mp&$0@vdl+)(EBtLg|WUBwGX7};qmP`%F6oPmBeBh$4E?nfDT#^H2U}8iJzwJFFjg1?YnS(ZgR+d8gEBf!M zU_kV(Df}OaWlVi=8Jf*SjF4h`PN%a4X5VFAQP3*F>k=>0y{DcKzij^{Z@Kb^1ULV3 zmhIlFDxCve$|mBrD^_->iTuO3DGyJRhx?28 z*~!>R?eCl|=%?#X=Z~9g7uG&@e3L1+Q9vCzBlNVZ=OGxUCk_S*SXk2B4JgzX)86{= zL*7@9!Jk^xeo2CgFT7-w(y(5TMYfKYXl}M0j}d>5t%b@b-qwrW!@I&RxV?dx6gI}L#{%f5oIv9AbCq&5Qwo5~%W z%kWDVWADLvB(RBK5~Q}jLFmD9=C#dFT)${dTN*yTHXCzacB5joRlFW-kCD|4rbOzp>SrKg*!=YsEJhRkn#@yPA%p&ahXGzRO*vYU7Y}9!bs_vQ8$~0Qc6NeNRshF@ujGfAp~KX43xngY!4Q_ zi1-Sy`S_RK_)e|PJQPb24mcyp#))xBVx%sCL_*?65#>DfY`mmHZXP z1&js0pTO&i>s4f^E)!5RBsI?}NYa-+DrA@?JbCV^|2E-_3Xy^t$&B$ERD9R_^;8f- zw`_<18}{W9M0`sljWyP$)|si0+dT=!kPT^u#6~uUM9akJ!(D11hHo{G3D|0bEcJc% z>UIj$M9!>M04^^z69NhGI|eIBJ8_|1`%aYAL0855Y|d~?BZ;bwSp|5h=Us!syOF~# z=_9u9BnSMqqrv)|NtTv)p#i*Vx(BfW6tT|B*Gw5P7Ug!{MRUHjjtL4Ya@-1S9+Ltp zz0nRMXT5I=rBgKVdyXQf?kKg8cd(HzD70!#zEu{a*eNn0eKio&C8-gmwePO#_fqq2FpcdQi<=L`?EJC z(&v+{Y}R&f%uZeez&zk}ll!n!xA7U~u~eLa=c7(NBLdi`UA>+-8m}6TaHUDggR&tZ zLWgA<=kixz`~gvIibQ28D4!Y}x+2-8)&+5Y_bhRqM>#&LRcH+{P8Sk6s2268n%1rL z&k6W6a(5Mqcmw!{msug@2YHB$_(_f4F;)8fIVU@aTa-ZH^5ltDn(KNp4bIscd`XK3 zWmxB8)#a8ZcU%I+qGLpDs!BXi2L;ZLyBCSZ)-fB+>E+uX6OiDRO&ATu&Xzc0@G>l( zS$#82t}k!UWsUDpeJq*K=(4ZJD1!0nV4VHHK-fFPTMFja8bWLz9~<{)kHpjp%rkt3 zEPG?=$}eUmHkny`XB;VSC2zm_STV19rE2OF+v}xjl0@OA1#`NS>G0TT#l1ziQ-UHq ze5ugdYlMHvVB@Z6HGd($PUZvx1bbw;`hk}ERTzr}-=b4a#WeKsOt}WVKvq)0a!!SK zf~pVNenZE?&A?lzg2{S@`m=_v&r>EZU&z(CL&&B->Bj6hZEJ#OUWdy2o+(h>y%$~^ zEcmYN>o+yxtw8iC_EeP!isu(z5ryRbUu$Od6E-zx;jBy?r8^fU{7udH;uud_@%w7r zy+XFfcc5~oi^O`Mc&0R^E&eYnb@wCrRnK#n$ zWJzJ%Efv5C<^6srj7H7BlNrC0F)5=@S9AOu1ndpDfgFnx6H)Z{QHTU+N=O3~8(cLE z;{+WUtrYOjm{z~O-WQCXvywEbdz;JQ`)r}qax+b{%8TC!dKug)iKk({&kr@>cEPgI!C@%xK!((>FQIO7CE6x2u6gN?dh-b zLg(Hzee$DtI$Z0>Tr6~yZ`s-?as$XLNWDh9ZaLKwfp+MNuBwiJ<+M@Dy8N14Y`Bu`4TxtCJOzB{NP zzi=R>C+9x>bv(Yyx*O6v)^*Sn8$BjYegfR`~*wIK-2IHIz~bM{<6 zb^AuvgUrQovAMh%wDYY5A3ZC7;^>_IvG|^FzosXy`j>&L5;4W4H}V~Ry7D%9bg6I# zaKMb0(M2KiHt9FR1aUX-H8C$WUi%MQCM#lv%#=3-EJ37Z8Eo{6B3J!%n_htdt9H%f zw+~}0cTdt zOtov~L5F7J0|_ott?(Lku0Tt5qvkv3vvU|HN$|S86I6*oGn`}mI>GtC7{mEHxj{}( zc4XHiLjjTd>B^mhe|CmH)4&gGb{?ptzre_m>e`D&`R7AFz&nYP?LkXSHfz@q7y z=DBl=)Fs}>Z{F6mW7U(7<|k4G!ryM!Ptm+ddH?Q)ymeO7v$|iwhr;h3nMFf-d{UjH z5;}6GEt(L~gE0wXx)Xx}x?k0l| zz2baI4^JRkhVE~h;B|8O=l6?*N?_GHk*D-hP>!AU^f35^6KaYfHuZi_*Zwk!IBD0e z-J?X=0ct--d)<>gJ2g5}hNhpLPMdX4ANSRO93?i#Vhiq*S2}4e&wTt`VA<>A{CTkf zZm$W6xK!f%*~lI9K40=gaNaV5(w376I#Q~1-iEg9lh^2Cy~Dq8uN=1#^)$EI(`Iq0 zvf9h%GG*jbJ8m946edq+;J6=u7%cjRa$ilv?8-L3dMtK)EXBEj7cyPWMI-4-@HOro zL~0|Q^5wd#QDdRXXSY^HH6SEu^Iq^#%bee>ZsIVMHN+czx$KvWa-sS>PnBW$+}(SApEwaiCw4nr`w~W)56q^(Xzs49QRb1gBt_v zR)jfLp)s|_t|@|Eii}Bl%*<$Cnc)G1(@#YAd4>_wbt*7@mW{WD3P<@POGcavCD;?4 z1bjW1u#ZAOI9D9N|3YTSe-54Gu=P$TcDcQu$tnJVIvIj=T*D>+>@?gkG)dm=l0QA6 zf|ZnC!1OLIzFJC32$Nh%v?2AtxT{<~pzDxGV@U-#fc`v|?O^3CoctW4YPaV51 zBPeQQnwj7PZ(=WplW$94P51S^oVaYsRf3Sx(EHE(e|X_x8Ig^tTdx|-NnBO$oLMsK zFjTJLr0Xj(C>d&Si4wI*UWeA~&Ov+Gy5$gYBkHK7H?fV{J+5>ysGIww=g!lV4g_#B zy&@V+Oq{x~HZ>gMZAzt~%F_E_Xvk!AM_hg~Su)kDFu(l6nJ|LlhUOyevHE124Vw?p zLF1}A?h>J+R&sxdL6ffsB~^<(&ePN!{M9&5DzlT_TL+YXB6PiL@1&x2zcEDz-lp}c zc)odq_E1bRi^GoQ*LTd7(r}vAhwYu*JJ$xoPuI%b@16yTPn}RiHqDM&bT7@>0B~q` zZ*n?p&-GCd@w1;p?KSkp4+UV{XWtxWf8N*WqL~_J+&L+?Y9@NqJUl6*!RF-m;dG5) zaEAr+km8`Gfvn0S=Yu=@Yxs9{N8oEPWi}~c&OG6ws|2+moYbVFEt8&8+67EpkH^oW z>3m0w#4C&nnunXVBe)(KzWrK^#u(#Y;ulyUO86U;8qM*`!TwlJ03N_=Q*J_#1?(O; zo|I?LjbVnG9%;e8^hF0oO6XH#2lc6?{00f|U$RmsZc`NcUjS78=Q6P4Q^Yn9?ENgR zl5K#l*}l1}7y+(Wa$>Gi(D0Y%A<*!NOuaGlX8H}{7csn^7+)_P!+YS_8e$z8$7)?)ojkRtkw5>J!0V-ip6L6N`GT zX5$3cMAU26vrp4sj1ftk3MJ3z^p_k>K0S?hnqw8X7*+a4F0Nyum^5XV?ehcQ4q=H3 zd=T{K)6!x!*0d%T(DarL8VOn|9Ap@EJ|6uAhn=U>E@DWs&2loEZ3~O`m))uQNBgcX zVQyF!2#y*P3CoEG!belp1?RKsY4hZrGPuwe#YF{&kEzJ zGtS>7`$@IYk&*m7{3-_5UQQXBs>IC1xW+h^n*5}4je|L?!DOxYSU0bFb5It1Jkm6JeBS_bH&(@^u;8?aib(7ZMgUfc z?D~*EiPGeoLoSM6s`mZhQ_Xq7`=xu(YIXb_4iSXoa|f*TXr?f4FqM;LFiv zl1V?XiMG1j7f&BkJ7Qwsm@Yg2`cX!1hVHcKbFSz)Mv;-VAmG?GVB{LxHb7me;Rhz% zr);22Y^v!usOi-5P0+Qe%MJe|Rm%Bv(fQU_FAv?Sg=;vC_iGnVw0#qm5KeR$u1eo) zqGa^AraIx(F!#b9d^UD{UVN7Q#MjprLx+gid&e_|2yE3Nv?j?taz+b3mCZ2x>{z<7 z&kvRqaLPnU7E|&TJo-))-CDVy^3z6n9gOZ(t_>MNl&CT3o5NB1yzBShA;KG>rg5*( z_i7AhbTM^ESgf}dOLl4#WpnC#tSCRF0$-)xe$i!bZX55?`C4z6b!+QB0pAd6+5Jg) zyQ8e70O?`6#-Xwl^Llweoyu1#!Pb7NiE~$&1ydoJexZe@*jjprk%x&Lv@-8_JedZg zCN;umhbyfVu`6K6SHyuTj8S5Ta#>4pN<&`i^?0mR`{y~UuikqJJdUlmyiOtta)u7$ z80#;o^e~O1dPZg<7Odzv!J1fx4IS#e zTs6;lT=dh_vp=<=E^q#g6Y&Lxl_xdIL9I4BgStzio;sxA4hI3-dC7V||HsL@a<1?} z3e5w@r2Jn}>UY$kKXy%JABYkS2Vn*|sHzb?+c#OjX5B1_s@p$}<)LzAKGdBZGDYjO znXZ?a%F|shK~uRXN39Zh=QUGN8&y;{E!_vp;S1*XLCsb0f8U6oHY z7QAjxWhje+16M;6suK}z{k|5-4n4pz-`MlRLtc&3qItP;ggS=vjL`e(XYMu_-Na>8|C2d~cO3kFSq0AAdK3!|3CqGyg}7=m9Oc-QsL}7q1qgZYFDbNr zY0>o#=;#nCF@HG=J(;%JFvmXAba5~rb=&ytXj)uLLosg8E=F&&5Xrj9=1R=5V2XF5 zci-b%qx5>mGcnKfFLi>CEHvXvJ|C+6KJQmTPR z1!URZRV5cAVbh)SuwB{DKmFA|XK8j>m%*ait#eXUJ`GrBaA2Gd?4MHSB!Xj~$4h9C z8o?UoBomgt$(p^Gj`G%{^n{-aRXasg{`6S0bky>%k)ea^`bu+rTfN$k|K0(Xc%ec5 z)n2$mT1iOhIJ`3eVW;v`WhZih+N0SI98dPt3w7F~8V@EJi>BVy_bh6K+%o=%)ThoA z_T8godtI7&EQbPFOJw(IMpy03Kak7f1c<838E!s9dA{gxXItS zc{(?~Su#C3fxcJ*9G-cH^td$Rm35z<$FxPj_8coOaj2x7-H6_yY?7chEv(xpv_?#v z&=QOtYPO(VK04bdE6q)*2Wq{Z@7VVD-9Oa3=$;!^<&?nqVsWu=96lCNFRS%3@w+h< zuGA6b7QC>a%!Jn4cKU6F>Q?3VHACdUE52(O<@is+Q zg=UMgtf3ei7(A2lig_m|vp*9R9_LTg`Au&k_KX?~Z z9EB)1M;SHq6D|A+SXpnfYI0K&swl1ZI06^TnAc0luZB(QVBDITv?MwxoeT=}c0w~~ zqMP+3W;&Q!kRg;z4=5LF=AA@+5SnP8r!{bN#8930Bu3D-F;ZbTr6d}KbUX+nDd%Bz z6O3``3qsv`M_K*Xj`Y&WQv#=r&j18a2X+wjR$(D6`LNJsy)-KAso*QNSDEYaM+WW8 zP?0mun@O5M+dzrq-a_hwFP-$62Xrvrb}>kAL|bZ;nsjsA<&pj>X0m6V=(juAF(>7n z3_E#E_6J>8c9dp1K^Gg45f0|E-yk&BxMm7hbeO@nlVG2q#l;(pI+vwG}*>}UH@EE{!;l*YsStVKThu^sS_P=W>SR|F;2)>x^_jMCr^mXmb{E@> z&UC0=tv%70)E$XRaKUiwZ`X3_-f?X!pi>HJGJ!?C*7;e&YHNUxHt?RMUm;o(63)vW zbxByL>Ku~i+U9x!;w(dOLb~*YCAZI)-NG9J=wH=lQ?S=d<^|uJh%bz1F(#-;L`o4i`jw-bHW_r;3o7J|r>W3>fjquz(JWgO98qAnqq*pxjiJXJrXu zsuEBB^sy|y3I_M!t4|^6ZCS$mzE5!{=n8Gp85`4G031RF-$-wyFr!$lNfOjo<8&v? zL(xdy*x6BIxsqpCB}}W3ly6rNS8W~f^VyxO?|DUCeY(k>aaCMrkDYGE3DLX@r8|A0 zf{}t`_S+8Un{eysqWX}W$$eY!W!}zPVjW2wj;4aB#}9goKI3UU5rb4R)u~cPsy(U^ zu=|#|ZC&4gXd9sIlfVr5q;7(Dwkz+X8~9xU)J9ciH^kPZY3PaSN}kJ`Gn%@VKE0ux z5acPa&1B9$tjt(zrrA?gA1~x!JkxYlow3ami?z_!*N^t2y-~l{T)wF;JQB$|w`f{8 zp7VSw?p23e#$a%z&n1jkX@GckHaTHt)Nz-}GZ{X zUi$P$-dn@Hz2>)F7@69e|_i zmGbAamtP(fOR`!${-Mp>ah@!M>KU%@FEXAde`)&r^%$RZ2BIJx^NO_T0!fPK@7Yl! zGj%(5zpU7iI32S~=N_MJ^)dbHWJsDL---ezAo~AfK@~;ILP0VcTz&J|3CCYL(ib+s~UQo39lSjab&yNhj|`U_R-xAO#egMLFxFC%=VDPCaG;C24a9f}%t~$oi?-)XXO%K=(fR>AQ6czr zw7j!wk4D?7H}MdWlot7Bu_Q_CA`tqWe{;^pelt6n@q-o z_(o5Rl&v;-_SrhC3M?pK8_B&NzgPV>=TGK8ZnwO&n~9c@?b#O0ZE(*NHAnL8vMeYb zq1&R7IP%ei$3wXj_r%tkL?=_c=c=8mL3!X#EBbA0FjpPoR=hvPk&b72=d=YBD{!0U zOezc$fw1(Hkp)&{+^G2KwAU9o+lcF+&P>Fwee2&Ym%R@Ikz53p*6<;&;xDNp8Bvw(}V%hNM@He)Rp$VD2g&-V65kEl}uKWlAf{V@dNJ&=~OYcj^R(0L{M%M z=W@fnmY9sa^OSDEv&>O7EyB$bS&#N3U1nt<;;Ds21MchtrUy$&*E`4To4jnK@;cR^ zAUSBYFTxeA$f~z?%O7Kj{AvrR2iRiG)W}oUmzS!KwRJv}_3;xDyBF0q@w&|V#2|d* zdcc#k=?v;Z5X;P5B__nX96BXP`>?e3CI(9$Zam=cO)kZDO3(GbNTFWBW5Xk_nukF7)s9dy>3vb{@5e8-x^+qN5IK~d z=9!MJS4hXQX{A9-0avu=`$;*)E0*+5@bcH+%B%J(vnig`=&|s^H(?11LxMNlH$5oqx{=~$& zhG;&OlmRu|ylYrDT|g=P+1>gJjIx7?xazN%Of35hZS9RwVlL^fE_JCW%6(>{xwjoQ z{B3V5t^BE~pZ1lXD0E7ubZHUdDzn)y8}TZSnpOhWzvi|{WXCm6QicrO^D%|BEJsw3DDO+m+j-^=b=)&4v%H1hg3e3e-RZG_#+OqlN&AS5!c4=2x(uMeANw6 zxCc7zN-$j&jf;pI;f28Sjpn~;6;yr6gB!XhktaifS%iW@(HL;9rK>YCEYoIyx>2%g z;U_4?uFhUG>l@V>%7_K)n2Pniv&EReDC-qN^j>iNpH=Ktx>inS^&g(9qz)UVRYzq< zHAd++Uvc%W%oV%i^y2HD|E%)f$MCLnpP+V`ftGFgOtq|B+`&2?erav8l=v?w@`ssR zT=v6+53E-B!n7GHa(5>UwH@l9X$3$G!1(muLPb#lfx+8`HCKM=XT@LWe(>cBAWeoL z*y#L~Qz=qZb00m3k2v~h7;R_ZT+(k%lQ+lx`I1y@pN+f1Fbt`0T}e~=Za93+|Dr#g zA0Aqt&V^{lj+p)OqajWK)DQ$~moF6vGS~PubW}&|nM7=>?Q0~4(SGu9*hqOTK^Se0 z^#fdXjLf$gmBL?4%G1_TDS$6ab%$(TNDrag>{eKmmU0R`aKrsqrqk8Y>UgRW&{$X0qF2SLgi@HCj|;|Q>#6{SSLhw;2oUcvnYv!*56rALYY{r#`hdfU0i zYwd^j&%Ix~ANFt`;K8}%TMSJ*spGQXusOOKd9D{XOwroTiX8lym+Ps`&igq!!mEwH z-=mWrof{EK*G+t`q_LE-M!t5mB&@Y(W(;`{Nsc*|3z`}$9`a})y`7RT(7IzW5EJoS zr#bp{b+q&qBIq|_$%NSL5i3nc;eF)4Sy#8l2)ZG*<)gCyF8kWMuhF4%#gpTnb{&y& zq(~`E9z}4!Ai9q+SM?S~CVKEq(PW+^$1pf`<5jzb6oQ?pgLI0C9DhNQf*6#T4vmQO z;uO1-Lcf>W&J=1Qo{!=0AssyqHs(lga;`DGdi-P`Oz7J=C!Cx^784dLpEpt(#i1GD z3cgZU!sSjNgaNu|KEwS5w~u3)#Q)O01qIpiD6w6aml znG|frJ#E->NPM+ZyiBPT5Yu5b4BESuf7@YwS=mkowl3jdRa^bs@;3@APG(r)Va7gv z#1?(&XJH=rLW{3Xy(3~*>Wkqkl%8R>T-FTZbW(K89q=Z~t)yR#JS`zI7Gh^hRwTBl zqXo9xEcaBZ#AWKm1=|#|l)eJJWBNblP1)>!nK!1oq!|ALBBE)cW)|p~Zn0g<-Z$Cx zVv=aH~*JVn?f5W?eEzMHIzaCOA3 z_M2o^f2*rG3@J~y9axrO?Bc@-2>D4$a)+>fxXHGh#*sAu+0$#LvTD-ONiY-$v(q9EmkeYO!D0WLb_>1McW& zeC2_1aFrToQH+`6BQ_=8lBWtcQ;$m8%O5d z@)^^=3FxRp`2j~z#_}1Y(qvP;E}fpDgD(InF{b1zY?g|?BA4eYxiMinZ%vT1HkZ}; zg8jjXQ43|7OTXQ^s7o|mJW_`8_uizqx(it+GO~VN+c6KCm;zRh)qDdA`K;t$;Hah{ zC)>MkKEmofWM_Bvz`cD=784hg$Rj5Gg2PK#0lfKMt}x*+R%F*P@c2#kB6-L+qRd7L z!XNw7@=LIpMt+zOt?tw+=3oEo27;*gMv1|hzQfx9VX=&VXoaRgctldYVn=v%?J~dW zhX=+>J&r!sb!xtum|QDnGT}|SM;fH{PqFeioPo6I5;gY7{%L^3LZtcyt&4*}kNida z1T}2~Q>Y7uz=3P>?~pIOmMt4YLc3z(AWLUht>i0FF`3DMu$3X&tZX~f}Kd$o} zwbpl>XDma){43hbr+TM7O~;EgH3sha6$}H0alykuQ%%EZOt12=xV-2jJ^bMVo9zeJKNw6=pRD;k36C%e<%`x??tO^n5_s1hk6Ph`F-xD5a)pAz z1S5qS+PPg2-7l-C!s!{=uwJlaxSnkx%%bi!C4+B4AFeD=BVbXUUC2D&pR19IHnx?xQ%0Gh z?_LPDW{+uMMSCS?Bq;8KCXl#^&3OmviJOWz&kl5j&-n^9V!pPc8=!yoaBX}5!LdS; zCwWpuI>skMcnAM}qbsL?=FvIGYqaTqr-@?Df&&v(7pk-EX{oR-W!NdQuGSu>PU-uyuq1)MPZw%?Mj2XKwNR zPCz&~iKU!aC! zlLOX!TL6bg875SxgHJM|&24J^ophrR#O2MXFBa0CmHS={`03WO+43ZkYTw+wgK;bo);_k)5Lhzpub+-DLKbn^eES^W=USWVym z!t{-tyoh3>r_0++vg@BBQ#=A3ilxj6JoW_7M)l%OND|P>Bj?eRT~&LPr0aCUU4LyU z#egx`iPf3wuI9*87O=w!L}NSdCKpv3cnT{r(6CbXRDZgf-p^yzq*n}v5173*zG}!Q zSC{gp9_}nlPJH@)r=Dcd(OKBD+fr|yQWv#dT2Wi#OYZbm63t6#8VIp(Nz@=Q;UXY9 z!T5BovNMDONEy?DMZ00AVXf=X)uVa8)Oc6b;jJChlHlr?8V=)PTF+3IohdSkU7!7q z$hLb#|6?y(TtQjd?4s*q6cya3wk2&z?O7(T`!Xvq>lr=umxipgSpk~QU!zOh>Nohu z7CD~vTgn?~>0raA!Gt0Wo-=!s(YAmhlWeJm+f?N$UWOD#C23l#X|h>(zgAtAEE8=` z#Cc}}R~L+O|En{w_Na}Y<=B6{D4l_$bwi(OJF8>v;-zJ=^)S?-e71XTiap+jP2jp|~NwmX`;b6tX#Iv|OT z8G^=YE`>;(B&zEsc8ySlJnSq1~POXo;BM`du{GDwDu09;?m8G>?p1&hPfA;Q!D-w;*MY()GsIO^rEuwkst2{dGqR zsY7wiY9@4HB;$%0qVq~gFmdjP(`l~?kd6lAcbiIevKhe-ow|JLQ(c|@h8-9G+K6*i znvhnrmfxxEIr)s&lo6Zjbf7QU{PTc1NZgC#NdiRQTfb|pEsat4Ok;!dW^+u{y{*KF zq-DlpDs%Zo{k#o$0?A|->5lv(OhP~`{)na^dwJ{OD);KTezrZ!3*@l|dzovad|axR zmrf>gBJ6}xzI(=yqIs6e$1#Ze0hvcH+p)JZtpIC@ZMvDGvR4 zz9nW?51;MSM*Vml1E(}Q{MIf{ai<$QVK(DyEYsf>VCx0B0UOBiblc?B6=V^WP0hE~ zgnh90qpTIe`nd$QIMfcwk~<7taN%6p`DtXF@^jshZtt}*06s4Ha4EwvMOl7P*~U!%zmIJQ_;*kq%E$8Yv0|QuDz62cOB+=mtB@ zCbP#b=Zl@IV|2AAa?;9vFQ5J9^IzG6u@eT_T|mCtK2<9^579+l0Ijd7WKlaGXFXC~ z5q23j6FAGrPrt=hNd*^d@O*jCy~I9S>224k67TzY2SMfbb?Jk$ostfTUftT3Oc4l# zqeMMrR2wax-XuG)cU7M9nw@YdtCsJ8TR_QJQOSfAIH+y{i8z~W`;y|*dbQ-Urew%x zk{yirF}kx*CsE-#!eS+SPX=|2>b8L@g($glYkPTk?O z&l~3uV%$@9S(T<(i2=Uap~y~V7xM00O0lQGM*U5JBw@@;`?xMfQ8LrxA=*|Gjk|*q za3L(yq!gK>v}6wli`KB2}QGL!zwkRyk>)*e?o|rUU-6sE#ni_ ze!Zc$<{L`Tgy_8YnTm^bb1jMj9+yf$9$dvrIK!3|^OAH)`GO`w{y&`UuKNGrY%@5P zVFJ=$6*Qn%@#jfjUJ~d+`l_PkBdY$FMYIV~sKg>qj=3ofG?F8b!&X zjsVBrGSk^;O5s8j zM&__3-Z_D5{ouD3BjL2cvG>6C_Qt1#wv`)J&fun&v$@VKPR5%H1{wZc5z8FEDqZ9g z+?h}Y!Efsg4$E`tjh0=EuQ$18KiGa%IV{^IBH3l6>J@tm$`)zwI5H_vIo#@fv%6hr zNXNMMhJPa%jDBYCO0`0#xg(Ua6y9z4#?NSH>>+7}4ikdG4^Nw80MR+u!OXbljz3G@ z&-|U4&c-}lgd6dkP7aBpWY=?LM|dchu}`=|-q7e>#pU5J*1*}6a)B{;e~xF=?K4+T zRyShM=E4|+!A58B?w9YUGk)`L@|FIMCf0!~h(wS!Ht)~+!u#9#z&DtOwkopuN$ zg^8W+`Noi*aF$^e>y1%P>sxa|2OOdK@QLBmY2v`_A+sO8M(Q6x!Tuyya8D&0TRZwD zz@XF)%+|&daR@bBpyk%PkDk}2*6GC5^@d7aM{>Fud;1M9vJ;?EOye4$KjOq zov;V8(m#^!(OIhp#Y#J~&fghFa3l7_KkQ0V#;+d#;4rV(q_D|;QO?-o?mg3e3==a& zyr|>OyKoz@C^g`<1T;s*@2mjh?=V$8JFQm(7p0I-AHnKHo|;8doL zx_LOAy;MB|J`-O^0-X3gq&V(5B$g_ZrRd6%2$QszI>>bB51u5q|ID`N z+|+0rRf@@ksa!)lu$IeM`p^UDPP%G%a?Xb@N(O5c_UGdii_d*Wh`EXx9`W|KTMRrg z4$h=SpJVdbPaMtGsLgX&Z>}MLVi7Tzs&)%{`Z{nX0cp)fG<$&1Db)D>g9p!gC>3SA zccUyw)vhvvV`-h9xiM*t_M30{<9K(w^Kct-V-<^k?nNQnP$h?KoZ_qPI!}2BmR9iX z#h_Rp_@tJmXr0z(Db|4s95MBW7xI6y@H^-AhU-0kukRTp_?9M^9h@_CKsTVa;ssCKlJ?#>^TEGH zuL>tQ1>#8H))jP*`0Eeu2jmTO4CX`+1*_#|%xY-?O&zmet1e(KAlEeUm?~c(xXV^H z>XO9RPa?J`HiJ!WjCP&)P#9FFa-xIZc}XVz^pR7cpU7m z4pMUg4I{JW=hoTmLU_4oe<6X)h}w~PLVZV3)CPXn~zc;?&6_#CA2{==FxIA z0@ZxHvFRH?Dj?Il=GRAe*E9XLrH|FMm2R}T6DLe$Cjvw7!!$QZ5LT@E(+d3SN^otE zu>-&^F7IdJ^eZQ+Ght|%zq;4oras)^x_UL9k?VhGdns~8A%A(7pVBT@*S6y1tyzX) zZLM|P`B}xRbbV$D_O$N%J6$XP&^#AfR*d5Yh58K2qpw7=foj@zs(d=k8~u+cAH~W?!IHC{RfK=z*N8Pj72i4l6!QOV{*R10 zFbo=2v?$_Qilca+x`R+f0j1ru0))K(FFD2ezr}qG1=W9P$3p*|${W56L!oPnR*nAe zA>jL9$i#Ukvq19TV!OD!k=I#kU6MQBsFGGV)7crS&VHRdPX*bbzSI4`bc7_&}RP*QO!8+4-0St=Q5t+M?F$TK&(Fw4pBV8aIYh+swv^ z4}HH7>{gRbv-%ToO>G9Q`H5ZA9dU$O@7Xn_R8EQ;Qt0T+8veNYaHub+GaA}E#$ilO z+doFvXq2Tk2LK}V*2Jmk1d$yv9Z~Y`C5M8fA#sZ;1q==2?;%WXXkI$>kf85D0uW~U zXFs;|adP}|puwjxb0*Gqk4N&s6K)D!dbJrfL+iXfDT^9+t;Plyoas$=?aJKT_Or7( z_hZ!7Hc0f|tnXS%P4D3(h;nRcDJ_T^8hR;IS%9cRn)n5rukV> z#OHQqpL_8P_BX)~^mdKQmc#pxF`UVei4z=uEtPHSZfHO4PaJSff=5y4iy)lveK)3_xX@LA`q)L5RoqbQo=TBIv=74-?9|7Rc zlgzqdN*#+o5tOJ&a6r|wi^C*Sy$}$$$Iz@v!!(dQ5D8MxP6&PPqhCQyib(#2@K12m zwjJ;g8CTX`XL+1tyb+de7q+A$GABL?z-T_axW9AMCA+=xr5G!zqp}B@e zqsgrRHp52*maQ;qKC9Bd82ocTQapGAM5-4$K4ZUl5)m(lozKPB9?^hsC!lf$Hl^yN z>k{QtvBo4YU}o3npZ0ge<_k#X5V|MNP34} zOH*8bMAOk?&kD_?Bec6B@Aqb6kp0{sogV}gS0oiKK1@8B3nK%%K69z!F^(G65~;Mq zp@YlhEk;JLV(u<+=Zqp2Vqal)=mlpaqLh8bbDS1RnfT#T+8q+szgz z;IU@za-|5R$m-(jwfw7zqww3A{<}mekDG>4(3F^G^$L}wuXN>vMa3h7$|rD9{aF$+ zUP>l^e~8>eXDjD>NHB z4g*)Nn6|Q-{3e)38#S%_R+!miBsj8DGyf3M;1|x>Sl4;Zyz~#Pl=j!X&F#QZ8AX;d z;{jBVY7(`W;}1aaNRv)dVn6xxiY;4yZO5@ShUA*4>U7fQWO{h;?q{h4ku;seQ^Iw^ zvBgFFZgG8VKV3sx_)*cFr3Z9o*xNT!T7+m%vcmwcNZN3pL$)pK>VdYO`x~=@{ zakuE&JaEcr-w?W7A3(m|D&9@j>_4^{N`T3uH0(O=H3zEAkO_7Irs_d`DXc6kAA>gX zu`=Z;NFH@jE}^?ydymml&IV=$!g~9(i;s$nza?JPWUdPfjqyfhwS%mjcx$Ulj-L1J z87XTTRSwsPjA*@FIZt(Bk8UM)y{^qb^gu(WtD1r>lbgnwux-@^67RODlK`n*;c;G9FJ6s#t* zTA-A%`>5J-oS32q_BI)VCzo~3Y|uzY)_K$Yb30=F?&<+~oGVqLy!>0@zl9|MbBHsY zsQ`@nEtA!a=@+OrRwIXbrgYZ84ZD{5`6@+1{694LuYmIw;B$m{WZ|&leSyvn#&qPm zd^g9yqj#SwR{^K0?cnS|-)NYNHsv$i zxxT&EPfTe`U9Sv#K5qnOkb3qO@AY})WC(vxyqXI;(x+Y5E!XzrsAP4lHNGEIQqC1B zWlRS3r>EGjOog?nN5RNAZDe?;rM2Rs&`3TY&qxpE8c>qyLO;qSG?RfHN$@O8n4wQ7 z$ASC%i;OsKYL`*-1&yNRxoFVanY;Gj)-ydQJC@#}3j#r)1(+%d{vUZE2d+4eQdbu;7a9lSp zbqoaSJ{DX#KPWoCpLeT>#o8#;tL)K@%aRQ?Uu+I z9=b>y;3ch5@OWuAFf0y?*6O1E4P18eXO)jJ?7v#(r?95jsqJD>))G%Ud|69X(-G}B z+Dt&0tIj?r6)yAlu^vVfRZUnc7vdZ?i#(wc^z8hb@%SKP@>2{m(VB9e#Mc9e9 z0b$qoQ|m~PB=cL609@c+Lt_Ano0Q~thSI86e}!rTO8r+Vw%#_!HgJ8zmsv<&FI=Cm z3&I9u?e==Gcl&wBRj%uvQK5ze^)mz5MElChW+ zUkKD;E#qQrdS{pP?1_Bfh@&cB>q?~bQhDT*O>2NRl=jBJ>sP^g4C!7nEUlme`d8L| zY?!9yCLWF#u_L|e=8@T8oM`WFw;Dpr8BAZmWCdb;Q9j%#<}jL>Y4NGH3rtTUi48Xb z9KEfv=jh3z-u1T2&cBdN7-g_eh8(`(sHsVC{aFwdzh@S6UElV+5=R=o&~N{3aqDPX z*=YCM$6*87YjdTo?4T@P?88wG;_&08wm)yq8I&|0a`feV9Xaa<&2jOkS`Sa`BS`Oo zIv>BqO3^BH{4D_IHPigsP(ws&6lDw3YmanwEyt5>W=&@Zc*Xi6ZuW)FUd%O{%|g50 zKnd^3i~%P1s=G26!J>yLL>$YVKc{T9Ao+V{lfHKT&iA0HC(WBEduXYY_{HO)J9FXs z>#X^mF(|sIbVuXOZLfR$l~3RIEch9ev7MR|`*los=G2m;+;&fk-8d#WevVJ~z|sG` zP4Q2IuAl$wB2nH?1vHU@b>idxlYR9G)k$LiPq4rzlua|2p4ymG`>;`{FED8XL1+^00C-ROM9Qr7A^ldOlgZQBcSP!x?3)6C)Z)$$hEQrj=NY zkGFmb37B;IUUmUQJ29crY*w?yS$<2ZTe!lJMRC$tSE8FWouAA+)tebHib~P7r_oTMWYyPqN#w3T}(tjy#*-u)S5|xkCk4HqQ-nb}~2C zG2f9DwVhsN_%vKQ`4{cvuU|f!;`5c-mG#~Nu1mC)LU+tay9oj&#|-J>`G4%61c71% zx0Cy`1FfcZ^<`_iynDeI)@YBqX(^inVY6Nk9sT+z45wT$AX?};E6$lJ;*Kup&V5-O z%2i$Ydm?V$=xP7117x#b@3tvo4M;OOeIz1>z&l^yfko|}$?phc_0fkTfGc(1M2**)+w#bX`N4(q8H>tXOxCAraREW3 zdxCY@BoU`rKmDv`+VE#Vvm!ztb>=>c;wUC87~zs>sng4g<>(;;)`^es89fI04!lpv zHWcpl%~_AEKOLNQ0D!~zUld)znnNwcu578rgBOyq`HNn_%DfEl74xVAmSBthdO7d~&#q3($a#%{A%=+=| zs#ve`*0FFXjEy3->e;sAj~6-i35NhPtU@35My(_hI+O{9XIru&ob7Kd&+3FKjZ?4P zYF2+Qb&NYtHpkX^+P8D`Jl{?n$K=1(C4SWz;AUVauC=asoh)G^*8Edy%cOpQc9B|o zqZMz;M@nrEB$i-o%+AGQE-y{C+l7Y6*&3^xX?RZ0zg)?n_PW`QmT7KWRPvTH7pFW1 z&~hgkyXKP)6uD%qY907}5%|5mnh*MVKJv@Vk>IE4@@F)YNe?H?*2NzA6Y?o7-aAF0 zT$IBFJ{QHQY=yUw@klyJ{o*Lob3C?x(&S_O+oLZ)Wt+716Q+;qA6&ef;b$q78Cq$AuL?%;5{XFf}1kZm)SrUq`Q2Fd6^O}9W$~eOEM0AvV z{L{#2a8#(!D2=;GtZ<+AFzXB(N%DUBdqvj1yq{5v-Bko%xaG3#Ur%!2Dyy4ir2U$c zQ9`(!?Exd2Wgv%GG#sSQhMXT4lqV}t*Z$CBlZH$GRKtbwrhNdUFh=BO3=IVP2Wn1{ zzMi(mL>|hzeOZRPDzpkOy^}7KmlA(IgKFJpYyY^2H*4_BA4u}j|JthldwG48!^I?) z2Yol5W_Bi+p_he~4eReKd{4)h9Yn3JvqkjIjB+D_m>R^JBQE1wyXaeFGf~8@gVe6j zo8-2flGlG(mrm$!)*?=40}_D;;hbk8w=oVut!5Mht)?WFD8dSv^vwJYOKnJY+B7p#EO!N{GZ-HtFEkTJiw_12pLYT z+tEu=lG1As{#FWY(!OWcQw{9vfdWdSvh&ogyA>PklRB?{3{J0LMSs#4%05e)<2nnq zJZaJ@NCsP7@e)$B>Uj+3pNhzLK9=5tWUnSY1D-kLV_oSuULLqO-hmW61~tWSTLRqW zP9NL-%4?T1k_Z6O`6dO~vrb+C6eq_F>V5fRvH;I$V^lu)d>`qZIODG2{}LJF$TXGy z%S(LrqoT_G(QO_Ox1(+az`r~#TFKH)2Jtebg#G_$N3F>>(!T!zjG@wf;=2F;0c9eZ zQJ6$DK+$g35sCtjyQxw-FkN$j39_`XTBSJ*71Ja2T5Jva<`VGYGF=3!{LB%X z0h+cuI)~N}B9YgT_Zi7;QglLI!0t9dkS~QJ9NQCVP>~E9nExx-aLLv+oH8a4rJV+| z3LZPJ*KDT7HuP{Xs0kq=aFmGS6BNb1qm&G-rcP!8KO?J5ro%KLKZ!t6xalk31qF<0 z-YZbWygpbr0r&e)!&jq%4=k3?^6FL|}(j+*+oT|m>EU_+xbj}FIqP7&Ly zOD!2d7Bkb)zDid2uMFMq+NPF(3SVtX48t03@*t#Y97QLMbMTqs>Cb@ zRiy%hj{RQ$Fmj^O1=&(_Ld*TxFQ@m)oO?e)=8=5qm81lpp`GhV3Ug0h-4q%tipy%cgXFHFDi8XUcnoY)fwIao;%V!iBo{EUx^MVagr?W&4Z%@f~INVsW_(V~i(F4vqcUayOSCp4KXDE<{ri&v2a)U(AUo7v(EPN}L z8N3~7(=2T+2yM>| zLYwxwIjQ>;Z@F7iowO{kPw4tL?~d6{4NY*U^#O2y3XCx5_Vs;GE3BmaZB#Da z%lO;OyCE{%9%!UhOrBZt0^!`RhJk`{EWo5~{i%>?BgGdP^NrZYb?1?O8n{UoO;Sh-ue#n`KP383RP@b3>;e@lDq z8vnhFEhV3IG?&nB_vH*kQf8F4(pQm|#8*qcCI5sjLF~X3iHL$zMfh0SMRR!Aeyhuz zM6~=4&5aXZ+Yi8^_3NU+ccQbQoe)VhboRYe&EtR3>PAKO1)d#tYOe;6xDTZcGeio% zu;4#4qnT%0lCCIKo*9VPcRoCJ;4BmIOWR4DroTOVsJF`!ei3p04=q#@o1n6`rmr(B z4IDY8y8g~m`b`{Ihp5bDrJ#uf^>Cqm9ySF-Fg8lnok0&>67}2 zy>Jh(&q2B!G=jQRoGq>PZDtv((rowv32L1MKkPFxj1V-`m}qq-9yVfTpo}PUlf~LD z5uNQL_U6)E4>Kd+lydS=n!h{6Ouh9wB za*j!99bo*v`C3@5nG0whVv?MOxQ)ceY)i;;%h-Gq1QjOu9U9OBC`Mjb4)iZ-wh1YRgxQh;r7MG zS_?&H5xC5++lC>bdnJtb0geCAtjW%6{-L>hI{s}Cg&jRFrtLPDL|P#&XGYJr)XdR~ z9&>IrkFW+G>qppbqh~G*gLliNRe#Jo zbPV~89-k05H0noeXZdjQEt9B|ZvL(hnG=UCsW6TSxLm*izU;`2(v4B~bTXe=t}l)F zc4GFho%2KHDftr~yY>dxHN`^5WbU*k>VzuVcx0xH8<(X&g;@qn^*l{3V1l2Hab2qR z=WD89-m6%QrMLhd48z9^XS#JT=#)9;Eh^jjQBEJ3D(&L=(ygswqFM8V?Zf5DocaZD z>=jAyH|Kh0nUc3H`gQ8|=5vUTaufM7k@C(?4gqy+`o0N491NmPA}3>DV0xCf7BweV zDYVW*G+1wK>777QGNt2zI7V{Q_$au*muA6AVqjtCLv^j~O@c@gtT$?Q@+yDJXym(% z2`8RSQ^cF&iir@(KcrdY*w9dCwXxy)OS^E_!~jDC$hnfAsdjoDWv0CxJ-v{2p4pS! zFRGXPG{$1XNpgz&=radT=FehE*RV=z3odUn_aZ=(R@^hzUl-8Zu2biXQIgy(YLe*a zTsX#3JE`SfuTR%Zutj8#4ed3#2dLIZJ*b-&cq|@H(0TqtQ;g3X*jOJ#{dLMqnoZm9 z`DKOlYT|a12RXCHFudR2A*DYI$4aT1Q+X1S>I3gt)~a_{JAEGTX~SBEvZ|Yr!5)rE z4SBa7o-<@y0Te|%5=1dD_Dz9Gx&2VphKaz-6DWH=e>J+KDwlrGnf{-h4Fpffs+r!Jp>1%{fuJL(oKN=Ud!gAgCcG(9iBP6a=5z!HqKzYXPdt+Z!7w&hKOmD?dyVt>Pyy` zSt*$AzO>OzUw`(WZuH&I(n^oICH^D+!MTs?ADT}){!tb3}&t`6+66T=GNK z(x#IqXL1cB57QY;#`VOGmzBXxz6lbeXuEye)XMDiQRbp-2oA+3aoKDqG9$1e;~wU= zgBe@7KOkg&XbVnbS`BB)D~5`*-p2j^Qy+g?t%ua7BUbFe!-_FT{;&Ks{-Z0ck8#A= zgHiHU!tgV$Vb$goR5BEAE|$Wa&^(!@Y>x}bnUBQg&tx&opF}HooJo1y9iik)UQ7369hs*CW*g*3mCQ5t&%y#_p=#ZXt$UE;>JJD$DRymfszZAD!-u&B?YU zaWP)~BQjaa&an<0i2TaUIH>NPjq;bZFk;8V?GwZWI8pDk?*Q}Q~v}lI^9a7!FfYsDT~BOu0eo-AuL=;p`!K1)$8 zsjD@k4WaZLCm)&J@{g(kn9E9{hrbrCOf?;jVQ5Sfri?!?EZ~1fjgz0J^S;B~=9EKk zDJ$~LTt<$!F;dk#AB)XF{Z#jCy(Bi7=F9NeiRF zQQA!+u_C8o3O5pvrE~%k2gayOtO{u<+XoVIF#~2FKw9rH=qlq$0>fmcs_oCt;GrbH zeZvQ(tT1Fhw(QrEehTOJ&M)Tw1#Yo4Kk)rE#RjHluI0BMDE8%Nsn?3l|6R@J+Nb*T z|CP_;|JP(Kb@vbWKS-C8@WXn^Tm|I6{%B1Q7tv+_2Eh)1zV-^upwT+57TpK&0Z#jI z712(KPj)x|CvnIu0u*@TPrMAvmU_FO^ki>;V7&J`5+r0GT}dl^sn zFJ=gtNVW+iQeUK-xnGPUSH9ohOo#$Ylh2$I%Y_SyOK<7^{Ai5g@7Ck5E@9^1d?wh!g*YYILj-1=tG={RdxsMmdE>!pg z2jKm++WL@ZFdFtH*6+CTa1GAYfpU2@CUHae}TKm{F(mTMVi)?+tTb#?;9vYb^6mbydX{BR9aHWPrGOO!lSzWTx<;(-KTdRzm#m6p- zGungpmJ(`>^ol+}-ZEUHyWdPhEIt?}{)1=VnPHEauZ^s*rb4Oo zucHuz!R(Iu%c;#w7HV=(@tZnZ_8O*j)j*7rGXmlr2J3nkExo6mnf4n&C-wKDoTw14YrJm zGuUWsw_-nNmy{oc=P54j8>>A{0rGeL_n|Q-0e>{gI5tl8sTa;ikm$H+>1?89q!rEE zi4f#xGV;-2dH%?U15@bGmJ!fT0N*H#lCcFDK6F`~K|j!P%*tyA&Henx*J`)Wi?v4seE2`R-e4i zK~eA3mjVRr%w+|YcEnhMF*LlDX1aiI(~e(nb$O#EXkLo1n=HH4FEfpn;_oEW%VS;;t+=Ayk zN@B@UZ=gGtN}vK=62tEJ9>xYNdC<} zPw}lLUoW$kszae~bS|z?GSU)saQfG2pb_~GKu!Q>zV$^kRiyl`%uc)MMM?CT|0~<3 zMBzO*)?b2jpC-6`Z5%NqKKtKWFhr_Cbl-Rh8JCANpP$!@!v=0jqWvq{ybYjQU#)*ptUAtA_1@TM`yBQNt2JBW~}t|74VVlPoDq9H*`vk*qpn_aa|vDJT#L!cbm%~ zrK{}hDyL*QL)HmQR6lnW;b0U4aMGONJjtHzn28Q(jn0nJ&6xGwd7&E{0*nG<_0)>2 zXddF$9~esOxad<&D`;!|-rRtt`Cyd!q-4RP%Qf4E%;g)?%HaGo=7Sl!TplMwc>=BG zG(RZm9--{M*o`3F+K+JH8-tJf6Qp81@djq^L)UxCusT2XeRJb~`H`i*aA}=md?%n< zwQP3Ff%7-2VF8xPpjz`n)t#%A<|nM{(3FrdDu^P|h&0xShu;9(XJd#S{CaAoD2xAp0Lp^o_cUeng zt*v#imm$^sD;6UL$dDlh$PWr4{(lL$X2t&+mTs%VmLd(O95Ewa52swUINe^)LxplG z5+>kFsz|(9xkSw~tr|=9y8<$F-mJBO+4&W@9w~QXag()(Q;u6RR^jYFIPY6tw_4;O z%Zk)vM;Kh6NFPZ@6ylEa;h*j4yj==*S~8!mSEuD+7Ajplxq1ZWO(IDS{hZqpFeAZ} zxnpJ>Iu%gxDIg(1y7VwnC;P~-##2=%vD&sxxBe9qs@>SeIY9B8$mp8fE3D5i-{E{MMBNpsxz%(HhN+d=kb4q;Y^w@?` zrVy);zf`rk@Gd+ZyMV|E6iULO`l<`t)_UdY1wAFX26Z);?_GE(tq$ zR-{&sVTz2WxvZh*_9XWdvJszZ>wtQx=$RQ2X(5{h*{w>Ma6Z4lc)7b5i##K8n;+3! zP*TOS)UiwMc2DtjuN@9Ism?z}iqF2IzS|lYCUOzWbjjCt5lL5AIl#90zb-y%#gEUP z@E7lEmp8^rmTRbz2m$?q&>!>nWZ|_R-h91e^Pe+WEbi~C740XK7$iI7ZS6z9c9L&q z?-vqC9jn-Sox4`bYLE@VHizgZk;S^X3F|Q-EZldd#(ve7&ImwxGM|rgmyvYO4Q#;; z(^@2;CeKsKhK@L7?-=2enPE!co}%m(^Yg^J`tZBn-M)$ErZsnNleWS7**5*-3f!Is zLyG%#Tx#}j2q>QLLV7yt)oUCrAdpm@ql+3rpT6KA{42nDx5GCdPmdZ_l6}P|r>_5m zrK^Rz-md?P=~-y5ja8f0juxyf1LopfJCb|r9+uiYxv15GZhbHrMC&oJX^e%rLcUv=|Z6?KZfyUKf=qX#?Pxh zmUOn?8-AKWn%u;ekFxNeL`~_9nr%MP0BdAcIUA!~nT_la_aoeAZ`yFqBvrcn!9|=t z&r2}?Y>giKFb$8SyB>o9pT;^#am&Yv)a67^F>@koJ&3VLa!s}J$&3X|_o9;}vJn77 z^x5y66h?^s{KLh2hSxXuc|W%Fb@l}<@;YT10$MD5kOnhRVjKnh002B%eFV&S!;?6sWn{(N z!j;54y)c+x><03EDLCs;6*eXP+jpCauAPcac99CfCxV z6BaPp{Q9>}dqCpJXK2_73E7A_*fKd~JGpt?8lNAHPtJczCqbs{?q#^lnpDMbWEgL-NcjWs~qq&)I;M1v}BZwJm`G7qdu`Caiyq}>!dm|nT-f?NorF?n&Zss z%}2l3w6iKxtaRqgV!HKsBu{R3WBRj4B8MUm&!(935(hlVEQYJHs`Y#hU$OZvmlbtz#)k-LDSXFlHE(UZ z@yl=LdMeDAvu`eX>#@sVIP_uNQc!GY51o6#6fK_}>2z^8?PDL`B_chgPLw``GsAy`kVwO3rPAW46Ozfb3As?Q2fo4_F1UNPbgIB^&y=AMBDnl-Ed{dT}kX zzs5D$U7<>Bmk+*X)R;ZgzaW?{|DD;Mu5R zUlCo*mBluv@sq-AfFE$Tqx$jokvseKOiDcEkpYw^Zce}4f0!4j)s7GRP-xdK-)=c0 zdbP{;7d^L53$p<21sn~o$V%76ZAo6%PK?wrCUo%0tE?NNrr#ECG_J{(Jqoz4V4NbH zF8z2p=a%ndX*t@bxT^8v+u}3mEoR%wY0sIqW%%uUj>Qd!8;y=`QcUXEvgVzRX^u$P z6{7xEEzF>OSo5L3r9M6aNtC!lYfI1eMAZvH9LJ8%V^elg0H&G8xfa4)n0!aM=o!^Gi&$`4d}=l{ zT=hZJ;XL-^knA=)vC6x=f`Rp3)#gvELQ%cAwo~q(U8ir)+PmdM9R&ud(On6$14UU5 zGp>VI-8$@9B=(Q-;Nav&+3J&mn};_1Mrj>Z>J;W7!ZEL_HiCCF85`h zS?~Lb!RbI%XPxR6ZW*MRtKyIXv84H&Na^Ge`i#+h9?iiy=Uj4Vr|_%$NAuP_=LC<`)w$S!YggABR3@Zoe3 zFp0V4_`?dZJc8fMUA_^}xl#!hOMZG)fl+!*f4{GT+ig4bRAbhXab*(Y#R_+SknzH=%Tun2zWUdyf!NM_fyfXY=myifdWu?= zG~V*st8uxL6Izrt@0l}*-S3_V@S^~W|$ z*0oB`H|vbpkhm>UBIUEBE1`P6PmyXL-Cfz(qm%%gYe$?EGWTi16{x<;NvHNlfw>JfKXsjX{ikn6F;qwQUPmi` z&o=`Z=8M8lHcTC(N>(1UA(_Y7k*^NAYMq0vepzhOD^K#W|B*r;x561%rsN8^^DW0y zgrC)lmU^%BneGL?PebEp`I+hTJ64=&fkT&raX1TzZYm3$heaCplc8`Ogg0sfM;k_7dv21-;Z3s)^<@S_bzD2^ z1rj-cBQJINoKu5k1p_T6zv{Gufa-Zm`;fbEC1)}Lmlmr_+9;hK$t`|M@;~^s7v=Q& z8Y6hC&pEv&`3u&3k+xQvD(u3WWFiqUYxc37Phd59`to6Y94t>wH6Ki%%-Y zppLuJgov(~X9S$?2Iq_9iioP|T+s)SU`#f4wnRt^Y?*%pN=%Gzer()y!6R86b}EqF zC3;HEiSf$f?9eEGMcbYVfxFnFZi4G18&}j*ru{%)JQ7c5sKl0uSO9Fc7w1*h-jCa6 z()-{T2H>G<7-t|~h^0|;{x$x=b?8ng+;|!LucO1p2h|k5%#_B@lK;6QN8&M?Y}u@$ zroPHAGp&)>jH%6duhYtq*^UXFD&c}P0Z0a*n}arOnX6+LHcV|8kI>>gTZT=ZR7(m= z1{?213K8>XrN0VzX=Q`na^VsjC6vNToo;OwP!Cz17NH-V&40(y9CDQ#;>7wsJ8`(JrOf zi8BGJAAK+J?y{p|TES`LUcYdi^e{AV zIIoGciv6Hl2HjLLif@W41(WOjsEN$zL%Y+s8Vu74=MS(NQAJpRJ03<|f5VgUzT%pF zAQhbJVN%N)NPrTwE+6ady_-APkphce`y@TKkUz&364t(Lj$Lb^jPG_r?9M^bkM~11 zjm|m#ddZT8G6eis*imy*(1L?(SO=T=5B&^S8}vWFHnqIelO7 zL9Ld{n(%uaX$CtPaDl)v3L)9QEcG!N!E#>(xXKQ_d{(r+$AxESU!ken4Q7rS5k#9L zVVW$sEa-{ge;bp%?JLO7h-%n(X9Y;5pu+-l%aw!76}{~ft>Lt*Xr=8cuPUGZK}dhA zdY6XknUMCUnlaX33*!4F=T{L=0i2h38A_rQu>4U+ef#ef7hffobe4_+nhcbt(=+!% zf)_ys9PEn1GKDDx?2}n1^pg8d19>vnGk;gk*MR;Od1QxVC)W*2Rmp*I(Uix0P@dw9 z$6}4JiyEG@dBF9@V0i(Lt3FH%W`ER#r1?+SVM(;_fXgQ~oD5Dbwytf$7=xWXGAJ*3 zT1CPz{q0CU?B-EM32@tauA1kS*W#-~&7x8KF4MeiCL2L-nqzlCJcC1_tJ}1sis@qW zJ6?*iPO5yfY%oR!qBWt!bT>CN7l%DUu1gjC2q^n`Sr4*w0Qk0|Feq|GEJE=&Sog3~ z7m||Xzah!`RYwlb>huF}H!d9HE7%!Ea}T9oUBrbc-93$GRdMn|yVFHKld1Fxp%G^CxSc^Z>ypAFXos3pBd-Xn#{h2we6SR9DPU=g7 zq8AIL*Yh3$m47%49;4p3qW&(h6wn!q_v!3GjK1%cDJZYl)RkP?GUNQSGi)kAingsV zgsT05zGhi339~-`qotgwR#@jhIF~jM_iyaE=N}GEzyIaxi)zcOIyf*pL@>LSaf}7p zwE`!oRA1XY3@K!GV!sJ4hFn*cw>r+GYt2KCgO3EC?*-4^uJhsNl7BFAUtRd4pA#_q z(%*(tmDFTFq-{_YfIO9cdrgq0)&F>iGOY_+j1#j)sN6W@~STXeV(~< zi0%@UZ8;G(9_1I#$Vij4pB+W`UAyrz<%Q!BqCA(g#2vn@PGtXSO^2<@H=-%`bUXt^ z-MzSs@0x5-sX_T3EfzcJbjB;77oX+diXT%kwk*E;A`9AaVn|%fHBU+gDs#@dn>&D^ z@NpH)UBH$@@}3+}KJLY;4f+eaNnDSEDh`!1 zqrWO$=P`9p*RI`dv8WfysaRez?=%sTisWjga$MTw#9!g&BC_1R@*9BSw6>{-iRoE1 z2AaW#_*E+dX+%6)t@vK^8%u`l@n@Z-WtWwa(>zeC&Bf~9OMArLVU z89zYWErk%h|2UT`gndTw!a|r~Ny}33$1$JznlR)o^PNGfFLiFbyB-&ghjQ7SUUc@g z)yqE#&x-3?x3QIc!NyC@)2eE!e5AZu#GH7cLDg@3V>d8~63pVz#DmMFi~crs(77c^ zh+!IvYbPx}VzU%S49*D-&a#I+I{be4s_(COmD|)CD>t1^p-+wJGl7sWbOq;z9CiFH zu6f$lr6R3BPQ?H%*tPaFGB;S6C&Eop!J{?Sn1%eLK7zp{Isk#q39j{X?k!xhh6_yu zzee(DY4r|RZo)$~__s*A%P!yKUsnBfOLNb89?{JJ;fKz};H+!v<9o9Geb>?o)fKTp zw?4mA>z%LIDgGG~#c9ldTyv2aA}c*4#7WLA06XKY`-XPIoNX2_Bvb6gj*cT_?xu~? z^#N^rUA@|WcK00;8o8qVB1KwLB=%Cz7a01jS8u^0 zDREgXWUHojnQYB+VXAp94@Q?MWKjTdZkt$X7{usn_yce8c2h=a0ZSBC%NIv^(<|B3 zq6^UJ6w@5P+=EE@&8&TwE&PgH6yxmvm;;JG$odK$K&c;V1@L_L%>d7fYZ%alhuthO(7^TAkqCi?R5TPAw3wg%**9 z5%0!V9KBhKlEg0MaFm;#hkGP=9y;COXGia*+^4sKlD^)__fb6iXuXyUf8xM&Y6Y5L z=Qp8jZZWTt%vh(z{`tkJHA*O9<@(Hmc0{e}+BNl&iw{zP1q5`Rn>{y7!%@DFSZSHt zn;z8!FPn$yBjeLp+2r?~VSS%O{oB6_)OEj`ej_O=__B{HFk?k*ngN(z6F9<7|4LV0 zz}wex%EhBe>DRsPULNP>_2I!i3o@#0YtkuuTgiumnR?#i_oIf12J6%Ez8YJY^{di! zszmtk#Zc!tvOZhYboV`02XhBLc1#epnV8g#*dX%vN2ZlJRO}jn>6olFB7J7BO`MO| zeP3aPW)eIdgjEA#@mFLHhl?}l_R^6ZOMGlp$&0y6?PP;_o{x0ZMR$!oLf9dnRLX-8 zNUm~+v|)vUF9at6jht0**F+`*^F*97r|KnP&cN8Ob?-pa(kWDjy}b)g5X&ZhGj z9<&oLbt8VvcU+>sO?P7-Ww=G3S!Lo*%rYgXCgrSWBi7u?<}Cqh4o~kjtS^NYZmF{v z9CXWG&oh&Q;I>`KRA`#Kj{w4}xO&m=GP6!drvNci_s+PWEuNOu?|1j~hN}yb8PG&F z(eHJlt4GG`aXJm(pe>vZ#0gA(P#pgtL`akQsvIc{>e_-qv&3i)m(`7?34> zjgrPpT|XDlde?o+sP@@;8YpzivOi!3ro)Pea{aVwEAQmG6d`p*CX-KvuMd%I*HNF$ z?GNbk{=D&mB9|T9l8}|xw4pPaD(TpUo7Y^Np|ZK;W|a%DETfiM@FDNDJ6U;JqfYbR zETYW6VS`>>T23pDEu(otTR2OiS&(WoMO?mZy;(Cl^!h;8`pgfG{aPNchIWPG3&V*w z%~nb>oDM@992G;8<_q#FSg!dfhN%5MYg#owEv3d`PttQnO`Q?AMu+kK&GMs9LqLz0 zYNCgP1Nf&3;{xSxEZyt5w%8>&)U_ z+K+enLuW1Z>y0F}Ywc_Vn_c#jyms0^uy|hreV-zmIaA|8Vf4-dRz9L=K5&o(*=ms2 zN8mKDCOcC%d+yZaKaCF3qvn&y3s3vhy_L_!<2CfiVN@6V9+BWnCE?sbfpLK zHqK4mgW=N;K36t>DzTEi5+HVW8K!B@4;{#!+q{!bqv`JY+h>t|)f7T^6^JdMcTaf( zwGxqh%2}&vw5shuO^{c~FSkO>$IA2koXsCo{yveqBt8g~L#T5cQ_4OZvgFbzfz3%^SXmb0a&mb?%LVY_bYSz^ zGWFkKY%8qRUq99LUfbfn752Aw(E$|$ydco~L?lL3)Uxk);{+C!Fg8s zws+;AC=05`x)-d-xjM>?Y(HuJ6yRsZ5p~_oCz+tzIHFdIE23z)r;?mkoAy?XlZhp$ z-_Fu%jqqt3Q-7Z2>vt>UR=a4~F>Wr@&JqxYSkq(2JPA_|f}7}`6bt=6MI%>ACGubF z4W?B|CiI&=XgfP)?yKGwX>7_j`@Q`jN`g1h-q~FK%z4e!6b_Acpo80q~_gLrURQPvl_Tib=)4f*Mz)ZwbXe2!m&N}>MY!to|e(PH1U ztf()h@ruel14xt%f70m4hKX}YEas`RGcFIle8~&q9MLwljO63U0IH{%e;}QxDI;h$ zP{VmCnsZjNkaJs{#z70L*E08~y7K+!ShBGA-*0FPir9vtn_AD+SSEgr)1YXXiNv@L z4ugIG`&$4~AdmF{i{lR8mKi9&`D8L)E$z?0p>4d?wMRD3j!%^%o&Nct2}<8C5FRIb zov6Sac6k3R_N=bVXNO6j>@(!5W2G+cE>C3Ee=AO4vx3uFu(~v9rC}5ml5Z1#{$aQj zPh3f9`!K-G+PSzP{&p6h_C+8O@$2w&Yo*Pid$%uo!1MZ;F7A1Gu5SL(nuEmeocY^I zj9EeOqF{>XdfArkUR2Mqw==ejWG7O7bS^1Y@_vig6bPB_fUMom#qTD{#W9s%iC4NN zeN)jJ7AZwxsP`lIIIfMx^-3#e4d*`2rb-C6H8>M-64p{@BXi@!(MoG~#!j@%{0)dx zQIGuswT{RS#s9&%3bfBPB7427qvJeh?zU9rG7-(byip9|0mvDOhwlNBs&ZG3(*yC< zEJa#PTYgvISMG{%H9rZc_-H*XrYoC-9(cg(Xdigm^a}KDR5UBp$I$&=D&4&fPB;EB zHt2n3pr~wm?>sTyR{y%w(6@74p)Xqc9}AQ;wtk+m%Zs`zenC+D_>oE1nasBVc{Mn8 zZPywSbM4kr1lRePwd#u2<{jGT{Kxim{GMvH z%SF>a7#b2~w^aLs&L_)j-~P?;<^=uSv#x9J2mLtocY3Kmbc_-2WP!3GV~_vQdvsHS zg~T(LdWA>0sjSrB3=_;{?<8dE4fOTk)ML-fHOd6Ig#qk@2IvM5l) z*JN7$UE^@)!iG3>)N|QCvn_NSYWRGG_AkC+Dj;Z1g1zvwAJHa#K!GiGn zB;o&Iw+gIlG86#58MfVOhR`W%3o3dOLm?h~2><#kllMWF1N!M%UJtWTU@l`jHa}3# z;e@Z*z2~pt1)nk(&Y6M}tPhu(9>tQ0Vs1*78<;jMC{DBI6VUw^G57w{lLykiCo$ji z=Mzp&#Ob{4o-dX9-qluiN=U zUxWG{_g8a&&2@$lbI8rNE1Z!y06s5;NU($aE$2MXa_w$wEit+KvUsj7ZPUHNY0vrB zL-S3Hg;~dfh)^K&>f-6Oo#-yc&h8TbsYk#Z78CSj?H6?^hoMKfiTQdAXNSwP^6w5D zJ6S*`laA8xp+}zb<8V?Q;mK8#a@eyKqx6b#!O~xnf}X#;SHBlAZ87bX2)@-g4?HEUyvO3u&ued>+ z^voCz_oUx3V`aRFcAoW<3rYKNC{)XX;^6+}OuAX#aP~|89Nd1pQ7;Bfuf|$d*A`r| zqg=IjyTu~io^lA*4)fohS;?=M{8SJi;AP>iXl<_c@~9V{llb%V#-aM^Z)E1EcJ}&q zc53xye;jB)3w-4FnB(bVk2FC7-Xu0LJ(O$y++r`yA)G_a)VLt-ko2*#-o>!oBafiz z2pr^J?$6fbr%WChCL*SiwoY3@Z6X?W%AZJ1IEcN=OoBwyWYK;r;jlFw&VRx4ADKzLrcG4|2B}MVMR=!Xi@B$(VY3VL{Gkas0&Fa0mRqlJ%Fyl|B2UNdp-RP@nIG zQZud(H(BB*S3Cq*KGLObTcztM!5M`c5(XZp8q z;7NTPX1EixPK6sor@^w1(861Aok*2x=5JyJ!ou1wgLO2fhgXhF=Ii~vumAG+t{S5FJ!;h;GZNJw+DL~W9-0X0+HRSM-uO9X z`7)#MjbpXzgJOQbv)mE~PAmt08d&_&Ft40mhVbhgy4$*LF?RDW_EL1%i&MZWvA%LE z^d$fX2M2cuN5F)l#D{S|_L}CDUZVJXg3q-z-$u+p58|@=7vcT4c!tmvW&;_1`DUTE z`qNl4F2qf?AgGk3YAN)ApjEN1Tc}=-mAsGl)3lG{4s8Z-uMqJf8zPWuE&(6gU!QZS zD(E=x7tmyRMbJ&qmNMfM8U8hSo%|CxHH%0Pt2&R!G0FL1~o5QY!91`@BedxcSii@3^%R$S{*iOFb zDB7daC!BWH-J@`T9DQH_uA`x`ckr(fNIS)y)I_RWyfF^gDQ&S#xMzoRo>isKS+A(n$;Y>)dv8I@c(n9-*)>p8OVfl+ z9>7_iyleIWPo|$b{F&U!dVo&cW;Lqa_)2xs&k@S6FEGiG>>&p5-ZyP&o0snPlgyG< zW{@{6(u{n>$e#Iwkuxx%(3APGo)~Ow?#}y|XMo4p`&37b^ZYn4NFG3y?-TgM#J%?6 z;#2ceCRse97QB8w@9ezy-cmY+JsL7g&aSLwf>DxeaqqZ}_@mJgQYAT%hw)wdlh?EA zf_P4eYQrH|mPMHJpW?kh6Yc9VDjo|P#cubejcd-r!4~%N^8RpYkl>v@hv9^FBujV16S@f%`I7Wh{DejJKPY^^MQ{k6{cvU`Or;&Kg`FmH9NCPXkqumKek8jEEF=`V}#|Qp&AB>CNnSw~4!fUDx>+Lfikr@qf3BF*HX6 z=Ra#h(OeHQo=7Ky5n`hI1zi0?E47DcS#Olgd$9kgn^r(a&iURQ^-PQg(e&Lb&83pB ze=YaxPHW{ykm>I@4+Hj22I$>~Uje@5l_U>Wqzn7~6NQ-zwOD^|mvynQdmdl%r2kC~ zmrxO46M6f$$H%v7_PW-=TUu^(=$eWli5dC$XZ+OfC7nb~&5M1^=6Pk$==p(h;*?Zp zdTBOBQ&16IxnqPTw(;EV)r;`JOu#Oe7<5kzJrO|i1&waHdEGu$m|0&%uIz6L&{}R`&P+@r^W>wGbfj~h;BDq(jzPT+mt3> z(&(*|m{|P>NBo%C#aM^E&zdiRfKZQpfX&n$W}F!dP6y_T;ewH9pOL0SD|!DQy*NyF zQqgP)?~MB#!aO~{+I1!Cxi4t8c zct51O^;A9zPI8eh-7*jDo!u54{MY>*hSbyuX8#d__@nwgd3A8d^S5(gIq2B{H?w8o0oXKxkel2t52_ zr`<5HvbR2N%FB^5A5H99A3>J<2WN;?sg97W$ouF>z)}_HP6=P>7izir0w?1E`${yK zUi745MHtaR#p87|u2yB@4}u`Kx4JHq>%5PrUik)GRQog6vCek%SzX0q8o>QuqFXpl z4ectfVaw*mpK3VzR)EHJW;^q>P708LOcPxaXb%~*T08UU;aP@f=P(R9cIzOsDSpJm zL$3f|Gdw1``PjSk0oSMXiDdWOE;K8+y*D?yP?Z9}p8grcZV?97B4N4KS(W_Sx$bAA z@ZzY(x(X2wwm|Fgy^0;ZPT(-Gaz9#i^E{d-L>^Su3tguNR5}5;8~+hFZo)X?7A-XW ztoFr)$*MFJNQvZ@33q{-cl*{rQMqev;q$g*8gufeD13*NVH~@S%6=E!$)I=P-^gD` z*KtGp0?7J8#GX_5sqve#+{h@J?oMT2E~}X&QB>;A0kY!^EIV8Xx;(nA+iLrnKh)QH zSf{##dw2zI9J>sFKBmJjhH>S)_0pUVS>L5pq3v^Y)qnk3;c1}kF3&e!(-X1w0o3`& z2pCJB8Wm3x>g--E3yV62(v%_U^RaWl6`R9!UC|-jks|N+Wo?eZ7LIdtr4p6K&{|!4 z;U_4NtFo$M7Ohoxx0C#<4ufe7jCS*L;~!7cc4q0t`NUT5bqkeJ@OMi|~@norS~8z|7^t}A)s zQ(CBgvMO%&IX2eCzK>onNl$S0yZ+Ta(H02NUtuEv(B>6#^(Cb@`rhDps7Gap8TCS% z$~7&{Y|LOgxd4l51;Y}oj#nE6MP42W%o{1u&x1q*eBf4!Q<}Spy#enQ|Fz7@D`A>w zAC00U4$AGuv;cM;VR=IwC%r1CleN%?-d8)*>pAL6freCaxhgW1s5E=Z7lp3S(wo2v zVitOUqNK>X4NSM_*PI=K8aj2`AxtYf|Ax0P^O1(8`kac!Awt({X1C@MKK;B|yoGB@ zZmKY_&!zF_NP4jc4olF!4Mk%%_8Aj!%T^{n;I6v98}ZGCDrmnXkVhhcz5FI^P1KZW-lYb`#q$-#$M)~QMEnIPr)#j*hk}+>gD8;GQJC>y!GC^+2{Z4Fkmiaw zd=kEuy0S6ZVWihAcDxH|NRn*?{hRITK_&Uih>_*3PJ>Ck}uCr4N zD-3(Tocim9_%}Y>;E|6&3?jGmp~n+$d=<8e-5%CQN7ak~%m%Bn-4E!tD>% zHFy2h?$dJujCFdw=ZKN3O@6uUBsE=OIC*ztQ)&Xlj&_GkC@AvrRPbBwS127^r2udA=7) zbharvG)Gw@8QEtxBCHurzCuh2E?HWWUQxH@Ohp3#^0yTTy_gy)CgHOTno78_06C@B zPWoYUM&IER#$Syb2F+19*m8OnO)+m&r0AQFIqkYrc3X_!1C4@cE_r(KgFcMVpm^5R z?h7{%a}h%-qe`|TEQ{^r1LYr4P+Bjmi!(izud+v$Ya@zq=^cQphS)B3o zGtp!Zob{=Em7L+}yTwlNJH4nywLHFenc(+WVCiH*65(bwe)%vlv0kR6tnobZCZS(* zX0&3XED&m-D762(6iy%xpH_+MWbXa21}Wwm&D{1$z;{F zG4}O5^GH>7a*iyvl?|4bOHEm2cZU7pmD2m9t4kO~0J{#lN5smFJ%VNbc4NQFoVvS` zj5Bo7r7aHWXi|EQlg16ZL1TYjTYJi?ZzaPI1c(&@^t1(Wrp6r|t+|!g$#JR9ZvMUQ za<*Bt6jls5u{tp28)J)BY9FCq?BSkRxk{YayJep;;>BpX1x^lMVwN`!Bj_&@n+!ve z##I=GflD6!J-M7FhcV+FD=*eJc*%H$IB#%pYJ#yOp9Q`+t4$Rbai(5*N^^zH3P`4% zRI5&4^(eis!dokK+Jo}P)MOtAmSKvz{ZD(P1@>xyEv&dVm8@ZZ44PmJYVlU7P8PA0 zpp^ydZA^URo3(^hBhram3nSls@#&N9wx5u#hSs)Yei7Q6A8_q<{)Us8Xg;0D)+y;I zjsZrwC@^eQac>$NaTm#=lszVAJd)c(f8r1p;51TkG#n}tw#2wfB=RWpFkh7)NHS~^ zV;S}It`O1Hv#R9zU$NHtUVHEJ`SuH5)uSC#9-$z)_V`Sir8}vt!3PRs z8azs^7*-O$Rg)oCu;}^XIB(q7v-g7E_EQni0{;Gntj_Rcu$q)H^ybPK^QwStGDsC%Eq{WLZdCvdQz_`EV$&$-{2=z$FnSo$Tw)>;}VbaB&A%tZ)|T=7ZW z*jil5eV%*&(%Pme9G507rf`Q5M=JaDh!VWLdG456`m0((+u5p zLdf>LBdy0K`z_&#F5dmge{8?XOjO@?G7$KNL+6?cf0tKMdXd5#TciRnBc%?;L+HT@ zd#RxV+}KwF583$E*Oqu=vsI_z0N}mWDe%(9FFpI2HAQQ48p#*pvFDCxMhb+(I*jP& z1$`xJwAbkq7G>*it||3SOp%qQi;Pp*ucC4H<1F6XZ)`9q>hWvi>^)SJ#NWyjl6Fhu zn5|<5*YhFWwH5oLexWl_HzL(lfT$fa)wF5&^xDswef~vZi{J~loGzgk3!(v>h9%7l-=m2+ zACbv*r9w`ftgRyiKO|ST$nXVa{u+KreH7eYB>mw&^Ul!>26xH-OsPK3K=At^D+(2G1D)@4ygkpr;1EyYw z#D6A3I#(L@>%z0fT<<77pjfF56@HN_NkeMVZx+76KdOgPJNdk9GUIP0X`3-Vm29sm zjfk6jaT#IVGWskD!A+Bq)@GxQdfMU>Nw&W_mJ?^TL0V`}_5;&9zJxZsGeh2UHO?QcIpDM-Lh3wk>I39b4 zak~b=4g?R;txF|75$rTkVGNII_Whsc2R@t_k%&(=mvxHcsv|kAdd9~K8vGU&OGG!Cx$n--FrqT5QQY zossH`6RG`}K4qNHxUE108w4b_IhHv45>0_}zH86{Uj@XW*Z%krD~0G@5GK(N+#R<0 z(kxYKI$)_y)2;fig5-TXh#VXP3)+Kpe%0vYs>>BNXN$Wcc`H#rTey7e9VL~@dbS7K zUsIJwjVd3EvLP-p8Q?+4&o2Lr5G_NBdz}p3d*3|bisk6c{vn* zvCm%quor9k72PMsRjkQ(u@t`&ig}nVa>@IM`1oo~GX^77xm%pFweUAHG>>bz=W=s@ z(#CYViP+P~O2bB#ROFnPSt)dfI%UMD(Fk;Uq|0q~OiA8j94C0aqSv8p2ZE&PDB!S) zZT^G9g&g8nGZe|3I_Ge7ZK*!WB8>X{zT&QGJtv=No;zY19|`-*U?@< zbEp5{tYwN&!;2;#-2zxcaP@Kr=F>EneyJf_Ui?`6)jI_tQ<{O61mzpjRsaPhoqd@f z&3tQ%L6AWDRnx8LWvcw4@!8noNfw!5$6yBh_$P97z=bxkEH0 zJJ_8MZSRKlO=iS;4kEtKgL?yBEpQI#G`Xj5Wk`DA=l`aPIlk(Gghar(xp8nRSbw(p zQq-lVCNEb1bh!r0h58z8i7f*pHRRs5<|u`}I-vw! zh&t_vsb$%!{%L=uvEF6^&(P|+xH0}+w7Egij$@Krcfj44S&EGFwN2XP1-k4N>j^6_ z$7#dbsgg=S9`&WtwH1GZ>8CrO*XtgB|L&h37B=v4^XASnS@%Jv)7Aj>`I8XaJ({L2 zH#NDe1@KTLPbBkgPMO7nZnR~w==6n&=!280e{gVxik>^oOM^R?Q)vAM2=_dEcFSKF zT(R1GF|Er*xhpCTS!rn#w}!xi+Y6hA*|c=wY;sTlY%;4a8S2YMhW^WFVajTMaQ`59 zG8t++Bc72z`Z&xl z{BZr}yOj3*!TOgqYs-Ujo6#i=uia)M&?fx}2$zgWT5B<$ZP87B=IMbje#q*Zn$g~! zH$19!C2MTN9e$ZTZ--cv-)X8ZgBFVpbvD2!`jLMM^nwl+hw!2Zw|ToNohKe~m7JC! zk~0NTz{ktl-7_;xM<}F0%I*-H-dDhiP_$N$^6q}irC)?BO_qT@{n7D$Vd{11b*chF z6|?<-dM)DSc24Wvv__+gkw+bTjmm^M=h=Iwn%gl*90Dhi=%T1)u#nn@C&h%mSMa?| z6c#2r*VAGTZFwL!FsH$z@`j9gM)sR_pSRSHWFnl@BUaB}5vaxsVU-A)2$b=t(HrTH zL2IrLY|2g0KUdr1M?KXsX<#M`~^kIW&_vG=VHHnAw2xno-SNy zp)WCZXrU5>R>_kfXr}!zWP(S8lP^r;@!7*KW`e+Iey7xuk`Rwri0;6$Ym~TBV*6?R zBQCpTez~axaPW_eGYs)!m`o|T!qvw_WvdlQA{MQ8hN9w@1w_{MdILy$1klekeahI6 zmgse+JgA8H7cyu7pT4M>^>unaif53CR_0;AzqLK>5zpKpzANk7zu@#l#x>&SB+|!J zyXvknFdW-ZXa_Q=D{$|aN=Jj_tFsGQuzoQeQNjbz805YogDtiiH8vF0-B*Uw`aEB$ zbsFASl7X91=h}_Om=fA;&&#V?Ed%{~oi^06n;gVG9#y+MY5g5@`-n)Fy=;P<=#HPe z)z#%h{8nl=U|vd121J<~G#qv!(3pXj3WDfH(v;-d(pSp%IOrLrZn~e*qcxX=Ono;` zRE0DR@1L~Pj7*lIVe{eFg|9Iy&SW|^{E|;v7qkuXaDvt%%j{T|sP*$? z7?*{`a^u#uDmITTd^||vay>! zZa(yl(@t;DY5f#kJQVsI7geh<4{PoMmdWYP-^up8HSSQYDCJOZ-k0#UjP(rGmF|JvXte z0q%yuV*Zl&AF!B@u@=Y#QTSi~uM6X7we%|s+HZ7>yNBWb;5f?=Yw8Z`NiHwVeRDVt zno1Pkb(1BufTCGHadaS;l(LC#RY-H8^%YNg&1`^gO$Ct^f5Q(;h^T(LlmAlFO~1yW zs%DP5xGYXeuM4uWkQj~&LBzW38+x!>iKSWyjy#;^cwYcka?PfQ^tT!-+*o?GRp~MK z9v?v1mm3)_TGamN`1bgx*lO9Ey%$DbPHN*X5nR5++Uj}`@bo$5nllE`>+~byve#5} zFi49N@=-UZK#m=vtC{#qY{ZfI_mJUpJRPY@SPMAWKNR-DXcC%6^d?Lv$CzBl!WdBl?B(Ou6^y7+HP-f@-P+nIM}#P8+sKme#&x7< z0^~4n6J_={xu*ugQn1@`E)n%_NIkJEVhwBOSU$tapC_naWAU5fsoxywl4mnB9b8O@ zKpd%!Q%j`Gz8sq1ghDMx!A#v~L)Jm3C=*$7hoINz!>D zHcsxReN4{ssd*xxaw211_Suk~YSYtQ?Q$3XVS|mTTyf2c)n{egi5t?rn6QdB=P2B; z#C(4PHT%mp>>dD<{i)_j-(@Y*>$SBQqgH+mTq125Rqk}^q9m}5AkHI{#1^`o_L=vT zL2!)A>9zkxwp7I@W>oB_DUpcmsXiiA5>ro~7(IGP_zrpM@!>1O-!X0~{5V;94GlJ= ztl<59sIB`f%eiiQVzNf@QUj$HUtI{;L!-oh#)fkNw-k<7kR9X&25`u!lqvI#M_N#f zc)&TO+ghnc^iyLu>N-&63EA{fNucMhZtGc|lr+rT@r9ZF#t$r&w`S2!DouXDUEy4%PZA!2y1tXFM_uR30GxVAszo{{p3GX-&WAgiwFq{5~cA{H`?d`|)&>a^^*G zb!P_OfCn%0fkLjqMw?TzM!m8%AK%TKX15mMv*_mY=_1a7R|exgw;SNUD&FKTrS@f? zr#@f}hEi{dY&Xgg3Y)&HUBEP>?ce$6nmW^!^<@YDunXR}v5aiS@U}WNR(kPhMRL2a zdz8z->W+?hr2@|q1dj52M8-1NZw`CxS{3K;#6lBnrqUm_^H+6&u3=F>*lUE(=M-TH z`boKI^|odVn{;nl$}(n&URKbXZ#Lj*B7s*vW=fhWmw@m4-} z$!352H)(~kqb;coGT}~YKwdfP&|3%mXc^0CH&3Qzy0!ZnYm#T24o_EHsG_chTaGsE zUGbEd2)IA?`5|~^nr=1A9O$0c7rd$2AJsHc$&kHk5dZwLFA zc4(AQdS}lU3wFAP?)gzb$On(r?6a!Q6$$VFJv3ODP$CyE+*@1nZADC7eNCZ%EHp+! zOs$WmWvF885h;!4bI{?o)>&2?t_iMe5b%2n3xNmog$Ygba9smX$?pv{awx6J{yd`C zyi?{5QF}Z3YRD^HKdlU@5|6PgrWhJba8M)XMD(~bH54g<<#KHiCd5#nK;P3vLpmdhdGJ@q@0mp@ z(297EDtWdghFAPtp9WuY|ARwMJ-XV}RxnY=A?3bWRTNviHU3OLWeT}Bn{ixok}MJS z4-WC`ho%d^F{_xhv$vi8W}lBU9}``PRSNa#MBA$)k9D327!@*0ZsbO9U?SU;3r|Rf zZIqA8%U1j%1LrAbdC&bQ`NyH&6i1I1X}?9G9Tt;azkXH8Q^cm2(PHIdK4kB^_7Tsf zjyyJ>IizqO=>nZ9RA%Z7b@FlYoxR4N);=dw-pZ4ATV82zoWhb@xK3+& zrESLk;LqcPkCIQ{5G3SQv`1f7;MRA3^~xG;USZK0NUU0NMxvg=#nP*0uuy3|%~}77 zt)>RaA>yFzC;0ISIFj7Bp`kKVs%m*2!o5*g^6Z#X__@b8EO6 ziF}`uIr3O0txitedywd^$?*I7_+$E*VWS*X7GQEdb<_~+p;fo*nOL2v4GCO4f(M|3 z?F4_|4;Ec_sq1CSN4Z%rEqvi;rBW4R$<8y{o!O3NwAEEo_Y;{0)ZNgCI?~TDN^2gx zqhY+a{LGzO#@8M4_pqd5oKGi4@vfBdu&{3SlE6&R8DM)lC0=&Ke9+GadaL<%c5x{H zQTTTS{4DP^DmxDTE3Qb@bl#zwXG_HtF;l;B?ZjI`SixT<+H$NloxV?+*DT3Gtal+n z6Di-3Bfj}HvvJHuI;`G>xPS45sl{NC%TUaSBeYmCei4rx{fVAU3u=gFd~V{a&Rdu5 z7zv(>V=^qDx6K`VhMP!VSd6e+(WGEnt&?vUW#?zJEcwJ_3g&Yo27l63dsK>=N1D9L zPC1uJdpsOaIWwv`xK$G)Lc&1f1{YSKFN`r!@e(q@`X6Vqm+~VFODa3&Aq?51eV{6;eh3@4t?%)Bd^~2*Gh@-&oS{7KXpT{=iz*Y|`mz z{q^Z_t-p2dPb9|*g`*Crt0sm%OGr=;z&0h!g0ve8YnyOl`B~Mza$IkgTstfVs^`es zTmnF@*;yC%Y&`S1)`2TbfUBTlpu%erT}N8KPh8E#<{6B&Pab|V(xw_s`W_kY#d=q9Utb%L^dJw!Z@b_Kbd0?0I7Lx+_7&GqV4xLuy1%Q$C_}ua>ek?e!xFBKTCrrN+d@<8d7BbuZijLSCRlhz&0h?@o;P z-OP(H2O{){+ls`Yz_W$4lU+b(pDf@$s_iGDi3C8b*e}nR-dSXSUOcC)l)xeQFOm~c z|8E~&B;{Lata@M1GNM0&4=meJP&el6OVW7%fKjWN{HrN3!9QT) zcN2wAPyaitt5!$jveqFU%sl^sRgcA;nyLSSL#OrV{~w&FQdAEXCz@bMlEy~tPIai| zV)65X%nXc+7h&BGZ#MTVlljD<5pg&5nb7afVG+c@G(2cSjg_a^c_>^SF!|Zi1ic<^ zSxTr#S9rg2H(BL3jkE+=*2x?KNt#6>t&*EIlK41NU2h*^Jx?*Zz@v7IyQ+-sTiu1^ z>SSd*i9d|y3bW<7D@7S=F|X~;OS8ng6VpVzrQ&*#kZk1Jzl#w-?_Vk4Px%_W@Y$ZpTWL#hDD!$tHN$@b#c6mj^`Qq$j z56kN5pqO)h9m-L^gPJN8*WANq=IimX+V(D9Nb1?TnF~ijMs;1*Q94aZkSo1ru}E0XUSGVMfF0IhG#0P zS}IDlkY-MtQ#NkoMz`@$Tf8v$=CZ6Fq5NeOTEJk@^LAaT!Un{q^|T(krlzVP6(4v9 zA!hRTC`PGJ9taz#-p9;GZvcB5o)O2_^}7Ktv|q}CTIgQ(BJA~J0G2NFac0=!)K4{-uDngU~#|c?s5>z6!?HKn$fjW^O zDMsrJ!5;I$9U(B0uBv9LD`emdrDl-v5aK`M@(`yVY{B%Et|}KQq2n&1rZ%MRE)ob7 z2xEbfix_D1YNSP|6Z4+h*HOdU(PR<vg zfkt`!0AUq31mq&p7!*tN9W)5R_B=iSP$w!<$IKDx6jxdX7)U}Bzefx{$n|_VYQO>F zrIEFnK3Y-KQr1=I0TC1O4%L(fuAI|)uT$Ymi=)7AF9poyS@omQdbb(Pi5q` zPwd|HwSAqv_zRpeD$Da*`OVX=yl$aNf-?D&wy}BaGsWy9FKF}He$=h8c7dzIdlA$u zeDOQxeAj&X^!>i!_nL#Fx0|+sD1oI#y;J2k<)OdQV(;-9P0abHsYhMSu-xJ86fM*u6ituKaR(@$7S&#cyl%`uWrnWqE?5@*NaG71Z*lUFIFprijNJ|7TPB*% zszyuggtsknf&2tGueobK4oVQa5phRYhh}ei_4*C>TZlPo%e&ET_h>o0nV#EJTHCFw zH-Dn1s{WX)(;S*I;Kf~X!9Dj4?d^8_u2elsaJ{z73MRHchq3w|K`_qbulaZL?mi(I}X?v5xs1hH#33)^b$exCKZ*{ zOTF!rr1XE&ht#(Q|G?)9H;pdp3yZYY2k!Emd@qBUEOjPVdG#v|s@sXXs$hclcn{h> zjtRHC1Kl0!oc*qQZ5vF`hxHa$yC!-`sB1V|BW=0w^2C}YdM7b(?1APLVlz-~+>ByI z2JH99+gfd!b$O`ilTEX?XtIo&wobm-8YyNjD;PdkfGy!qy7eB5l8v){M4 zUBs0vlIpeO4<2rt(}HN$xpZ1sX5_kKocm^IBe~ZQ$^|q>MvugtMm@S#0A)f^} zCg^0z=#*57cm-Fs9il<5v#=NlT)VLqnWHE3(Vs_7;R%jRq{sV1LD|Kfai+y~0I`8A zt@M!D{pUpylLQ`ZnW-*Z9z}u+F~cUST;On^r`*|gTu4bChoT-Ntzj!XB=9gXKXAR9 zFHv)7q3)6e!29(I9w9-go{yLHi7xR4)LYMSi+`1d2$Jp|Q>Q7ZLNg`dd>&B;!8xNZ z!Msc$#mEX@^PKxBs!I?K=$9<&HtL!$<4rdLWFN3BXTJR`{M)M!TB>BNYC;f97K)BW zTs}4uI%-$}6KfkL`v=j4uR4hcYE!xwM{l)ayB+w|MYHvXKZ)!OgW7pCTm)A z*21s*SP!^yCf}X9j76TlFqdlff)KAAK_VrV zs5pbMZh!IFzFv!?dKj+)pT^q0nx&6hoVXdU!t-ZwYzF%F(NDS8>0#m9+W&3c_*aNc zFjBWsTN_jI9gd-5eY0TL&j@RWLkE3Z`(3?*pngT0f;1ctePZns#=7U<4NoH?{Wjom z!)r!md%O6=>PSc@!OiS(Br;3OA|j{A3lJwjghi4uH&0{pmRMz)6nFKnHqFN7(%z#P zaNGY=gZ~W`vA_HeROa?yiqrbx?;v~luYYi)bG>*Q<}#P{qIRF=34`7}6@e4izDEoB zXEnS>(~GSAho!eS|9A2t+)%9i-4O{FibN3^vxQZBL^aHX2t$)ZmKIa^!AhoX6Jbjc zf?WBMVxQ9cg}k`Ge*FiBwqmgmOx<=nuB_K9(>!ayzLpitC9rU)Hj@3WV#%l`p&8E~ zdeg~=9<L@3A2R7g=G-Q(U>uQjw0didsT9* z28$wnV$IC>@l#Pj{kq%i3HL5nQa{?-muN?eggQJnCY#DeQ1yb{<<3Ip60qYM$(EMK z=t#+F*`v?zT5=@5Y3?=fA$kPpGL(8(#Z*Uk zRFlSXHsUEqV7R2Ip@eUT3t$ex%lC4Qq?2~|Vb3=Ht+m6xdtTt5`1Kt%dh-Tr#_ergG@o1Vi7d%uL3~Wzud{*?IwB1&Iabf3 z7E5sARv2V~L1Nng3>IKc-VuiR@XL9rO=bV?M`*T)FE5!7Q{eWm^Jj{YuU*Gf$Ie*s z@-}uJpQMjhq?DDQFrkqKl#&U=2pT?g#}~~pscz@o!c@&ZsiZm&!lxCnRIDO~kjF91 zHBt}<9!J7{u_6Lj3Fn5VZA~U)?jV!_HxCB@Ys*+p9YKQ&x!ThnPmCHt@~99`YB?-Z z4tHE=F9tR11RuChn+IvxY?tFuX5&s}cQuINiExRBh{sYA>Kg$HhS4y`NCD2Ld#i#q zO&`E=Vj;#0q{GH?I9UsH)*qUtK42I-JZoN#2Bf=^DE`?p;t73xd}YE1>UdgBCD6Y&Q2dDKQ9PdAD;p=yEVSc$UXJy;o&7xQs}j| zE~;^Isw8goDuq%Rau!?=^LL;#is_YgmjGwXho+{Bkl99G#&N-ybS#!-o@#@B!6(m% zXH~7I-`5TTejc`(5j@mC4o@rb!mH&wGl?2@`=S75($FT16RlaCbckz6&UHP8{qego z2w^~jpO*B*C!LsYKC!ja`;+#rNd6f6jYnipy^ZC!G>=y9)R!vVEpA0kQodM~d2y+$ zS^OY|u!efG$g9)>L?%G?fC6hcdlZGSDhfO_kcb$?EegvZ%jP23UJXr7zeyUen*#>M?-+!7;2uW1;g-4rBa8StVFV(Z?8l`v4~K zj0=75u#{;&hZ{*A4e;y-5}}wGG7&{^$T_$y?t!MgmY)BlfBcV9&p)+{ z>rO!;^sc^qte-|G1`@c8OtmIUisQ^gE>C}#7@4K~7)BlO&>(#uFB+-16%KWOps#hF zi4#u}U*J%D{9~iOcFyfwEhR?Z3H)Zk%@{>@B)`yRT^?>hV$*3ygFNC!{?XepC?R)E%cfOeJr};Q zifP!(c|qeMFV?~0$&R8}9B(}s4}(bFVS84*mgLCVCtiqoqGdfA7LU?z%D7invX{!G zR{a2V^#(N>yLF-QpJ-Nc@>-d!oFCwU7y&W!%%_n0l{Uj)2298D}oMW(_e5HVAE0NW-8HQli7`| z+C7Op7hL!|dIfq8S&ybN=<{~dQOU2m(}nK0X|RE4Hq(!T`1f8U_#0_leO{|CUXO0+ z`^C7^?~U6h*ku-=1UnxF6M>Gm`(Z5sf9G}@qg=o@@@HJRxFb8L{3vF`4L20 z-p4@bH0rxBpwGJC0Xg{ z3qs^h20ok0f`N(I>S3IHK@xqenpUlB?JH)L3ry7lqYR#(dRCvQ+L;?KUe=GfezP&s z-7IBph*#mZC9D*VIWpVK@sDS4l%nv+v-mV8&C%)TdIR2Q?#^29>aXkY(qXxgFY+n; z-Sb%g{mb+3maF$OdE~mQ24qwGN{6ef_1;sBGNRL!L%!#)mO{RV1WtY5QJ+$u)RnEf z!GB-dC1W@_LD>!T~qGro;;jUY6H?sqx zmY`|%)InvX7b2rpXpBYujLU(np0B%SKaTdU6bE}Y54$_okod2ZbtFcZR5XGH?CR{q zBO5rrQ?k40mh-h4z#eYM^TyY9s_D;l;5ftT7(BaFrd~rNgWhZ4ApYaByt^T_yG~*$ z{b9WRDmUDZLMJoly=u9{8hDF6Y~ZjeVWVWh9X|594&*BcJ|#qe=(wx6H@jQqPJoJm zH$wSs$WnY-D2;75LiV$_U(~T0A2GNO zS3X?%J9l;Cg~8}Mwcl3u17o1ea+^b*p%*18Uw)I<9X~$p&(VCzK&9;TtQG8$T*sX( z^XVCEXj6Qc9Ln*C=_OvSy2MU!I27c-p5B_Z;rZ+>U=dPRZVQlUj~Nm)lgbgY ztu5Ym@5H(yw*=Wc{d=sINclhFZUU8BBE|pxNx3kLV3Gwm z`A;@v?qWy&cj#Q_yyG_sCkO=O3`)j3Xu9aYY&~@@zP)A)jQDFGn|g7m_5;?6%)@3) zXRKpY|LYC-pD!2@yTE^wfBQG1YX|be8~s-Vm;I-&Bbh^@)dC&v8+Ws?O?gW}_WO)H zN6VXdf%`i@V9rkJ7gflwezszo@w-ZFVzgN4On+b}B>p1V&p@o}X9mlwcQd-#>nibH zeBFBH{$~X&uY&Kp_!)>@`Touo<+TEo9RYyL;u;e$Exrp+XMB<9_qKSoia61D(VIwc zc0H{@#)?t4af`PRSd;b!i0zSkigX9M-Noq z_|34qFniBroGf-#U0=8o6!hfWegq)@`o*n>Zlp}DiAx=S-lyrf(ZE8fL^tDH>T+r% z!eBitb5oK=+4hYq1QHF<4g`4ngbyR*cwcTk@tc7S8dx1Z0o2Wshu|LS0LuT`eeX^ zS-kyAx;3)x0tfat#2WD2;^8*%E$irqJt9mzM~2dRo{O=US(Wp!oF~(&Z6wWd&B4pv3ROQJjqwN#NstunY`#Ef9S#N2nuganKrLP4&6F3}Q+Lx?Fwz)wwOep3_? z!>Vu|Y*Fg%&@w$J2=rk0p}YEXeiKCwL{*jiBg2ERNf$2D1Tk*LX;QVXb^_a}-#^@n zevM1o)baL*e%3N}no?THlBWZ894yd;?mtYZmrq)Av^JZdda$N0^mFbpB9Th?*j!PJ z`JG0g8#`vxP$-2y@oI z_F{&f;rTh#ddk+4R98=B3ks^alhKW=UiG4g7}*-B*KSqT5-%EW$iN+qJ}i`6tq9Wi zSbukPHN^uy^&@@Ly-K5}L&8g(GmyrPQmUAVBzQFu$nab;G$y`v)G5 z7Quxo;wp=QOAfU}@%xH3K5npm;+Zp7B-V@*K!CV0P6`=Z$Y-M3lpT|e zn_vE5Da!wm*!m$7rn3SdV5}o|2kt?$&4tnQG6O}^+n`13<1Sk=Xsy}+)O*agbTdLerClK%7=VJB*r3aOvMk9Cqct*($(DybO zLYkd)*o!PViqvPmfEI=j^NmvD=&4dyMNC;5h`|b*^%=2@`@HDVU(ScxI`0DmBIv%r zJYu&A*)nLhVoN>}G^|Ts4;%w9LF`F?pg$js{!*SJoBRBZeC_wFUn%tZQ%gfvW_?=^{;-$PvdzMPi$Ed5tWX9}o?Lr$#@`#i*#15(jYb$x`A0fwTKlVPj)HD4H&!@`D~wPwZ3BAgXAJu}`I`lY+tB9HXChnr zk3S-tK01lUBx2r(zvLfkcGUU9dS8N}!c&}hO?$i-J+)-LIiFb`_Odf)F*4(euZa@} z$PEYymUy3!Ej6wzSuxJ{tVj(xKH4^gF8tPSzrgi9NOS*#N$<-5S`5}VmVoF6Z1j5;Aci-88xR{y%aoikFM zDhHDjN7+qBU!t43ho7;|IQUCE-+X7~=lOiIwJzoQZTDESlx^q9qSk=jlkZL?LFItf zmBpQc^{klJoui8}D}h>b{Wetv4G`(8xRw0Wl1sdd;-w(5Gr`zYn^J+ z3A8ua(GwG=HoMwS#A>HPT5F8D*oFu^`BPQ+KR7po&9dT4`<2lMgYW|njA1j|ZA6RW z2a_ZD-KPhGERg{!;zQ}ZA15xt3+2SHQ0-CHug<^bdssAtkg}8!`HdS>5y;b2S0K;5 z%AjvweV@By_t^(_HmEQ09>r63pwToQIDkBIJV>ON#I6-_(0XWfLQ25S58jmPQRqOprVk$1%3nnn3B=gB`^<^}TQ z^$8bWJ@2KkR~mKM-LvZ+doxQ+D#<*r@(<4Q3_G1e!J%iRAHFyX!J{~z$*teXTg8EsE&C!u)*i`IV;hyShpKN08ugHwL> zZ^$c`E%%rIg|URyD1Mg}(SI$4CO*sssNaq@%m3fmBmMq;EdJ{o9u=!W_BoUCWA~1T zZ~u4vtM*TZMTRTym+$JR?k`+E1vveK6BMWlOvGBA>p_A`u{Gs=qjs|6DZwJ29@;c3 z?1LFBr!(?4+C2Vj@9y$Pthuo}$RZ}>PJV*>FE~}m&cIjyH5F@L(SQ2M{ZNEUrkJ~? zI9stRu}UfQ@?kl5OdEHn3)g=tuW?W!e@k~xjpKisPs{KVGtS3<)0R^`7rlf91?9Mc zj*3^F7s&fnLMcZ(hByd*8kFadY5&j6O9AnsQJj?hR|pgK0RmJj-!D#t#;7h*PSmA| zGL=Itx;*hUxp;)L^X!Mnv4Z!s*Mi;OyvpI(cx1rQAzaB~qcV3P!)pe>P|6AKKB}|s zd?c+LHN+6p8QQ=Fq^JHV-_TWP!XreXLmZ7hTe04}miV5iNNQy_3N&?nl6s#;pOLLT zs7IqZ{6!7FN0*VPfJP%G+R>1*Hblnb6*Iq^U!UL2l$KUtzW7E=D@vtV=Y{4I2Z8Wb zb+^7;{C>`AU(^mfCHBdj7XX=i3t%$3b$pyPwW;m(4aeUP3Z*D69MYl&;iSa8f0h-} zE0mUxW!Er*HX_SbBzp~$zzcEW(|`^-93pnyO^6r^M=xMB;#>z@iWH!=ln90ViXCC8;8YK26J^Jx5Ym-M5&@S?MKZ^! z75M6I>pad`ACuvGR3jlbaD7Qv|CX&_1a7=K-s=S zfep%6*O1eTla(B@)JgdBADllMrKWuST>72qLyC(4-sDNO)t?^7B7&%a^Pn%N5s!Z0 zo8K{s2iYb&4mM5=aR~Mp&4mS7a-fukwN^oT(q0l+uMRhKU12v5Y>a1_tjB2(o{h z2Ww~%b0LYNXi%XdT7L5TW7U!-KxOADp}mUc)=|2Vo&MRyA1Y&Wg#5Uxp+9YEUe#nQ z!-13K-S?zG<9-!xLoP1agR-YHDFlZj8Hz)Yw&**;XB*`X+S0wmohJT$k}|_w?vi;h zn&UD%8i(fDibkTY;KhPt-WmZYkr=EbKYaOnD_?9=RBA*Skv#~~=1063Cr+M-B>+9H zJf2=)0V|a`6iA?d$=SDmJQIYxi1#hv>l|~q&bE&@@iJ9aFvAcT?wu)WoW0JQgh9Sf z<$qr?ws>L~*)Da8h%JxL_cJ6<3Wv}^(f!wgs_G-t9CL*u7(<@0&#cGx)eOAUM?c!w z3crSU$NCvC4ibExl8K~Ve2huVd}*@MX?Ed#fvkujC1UK?p^( zn8yeO6M^(ji%BJrG)-znydeT7=6@X87p3PvFjm&13kwp3PR#zi{fj*zPyY>jA~w{= z|6~(-H48cX7H70%2-R0Je#|pZ8gy|r2kMTKIL6F3e*m2rE}?s)#t1Hthx$%_c^G&3 zGcK8@+4Mv%5~|9-eD8CX3?X9ZiZLMEF0(t)vrX5c^_(@0QoVFMl64LxmaTu{7^pV2 zL;=$jERdy4jm42GwLmNMc^Da0YCa}hPVVZ!DyBYaJwvp;Gmj$-k{X+=jl;@4A!M2~ z&!TLLF*};Gzkayz)khx{F_rN0v;A^w5I&nTh{t4m+rq}JHsSp8nmKo7@!j45hy5V# zXZ{jHoa5Q#z5A)Adjh}tfK$^L!(aisFFrT!FsdbI!R5D+Hcm29TV9L);aiS^OeN5- zpF+FVTfO7%do^uFW!p-|_e$}z&<@g_ioJvg$6#@{VU1HAZJ~YtAWET1?&1d+OxWRJ zKd1UyzB`YKfsNRMOzQbYq_fs+>1onuZ_LIo7sk^*Xw46RJnI2BkXbyr96-Wn*{_pG zB=gNl9mVR>r>#iDASWi)6a3U680e5GRcQb|vHliOkG1+8w%RJd?;so273O}J&0$V6 z)aX@qJ-w84PAcE~gR;?!LCEzBO*# zxv!?^S{L^(p${Sl(s+96h6Uj$7eRF*u)+a|-KZ)kTAFRKkr0tN$JqQ>L~Ld8`PHY? z*smTy?1DGGR>md}Z@uL?=KjM%X)G7n5||{O8V6daT$^f8N+2`53UzbeKKE*qXV^&3 z8eeNa(B5|MgCxuNWgW}P7ke6E#nXal@5lMK4OQ7@*tFnBL3Ew7o{uj?}t8< z-*1zGjb%d5FU!4bT*@0aV_*qTzOAeacW5Qgs$n`^D4*W+$PmlSsj1;iJ;r|{NveWZ z;CXYuyNs$ad~F9_zF+9iX}t;Ukw5qO#$(`6vijuNQMvV#CvRrIBlhZ|2Kh2MX5BuJ zf2$8IeVZGL9ea;gqQLS%%u&7jkl$CtvXqPLRtmeEs~;4;Tvs=~J7noNFHBG^TE9#j zRs-E3qUW2T`j_DT2%Eom)qlu<&vn4yshB<0(ZUax8snED*uO#<(~|zddHVXKjIDI- z)*uJLMppjGckpDEOMYhf{_^!5-1aW#gI)Ot%d+|za|9cn?A9O9kAFuG?@x>Vodp{} zAn>t6;6uLed90rPf^0Y^Pn%P|m8yM1&0odH8^rqd8!ZAK+vSTd{9&~C3_4djvE9)A zi=zLFG`{OKy3}OrOv@`bpm44#6rL(usZUL_k|>(Af83TS;l+f{Hg@pajxh8OAncv|nz2n6%IPOiMy6~0NE!NCblrIaB|Gjj1KWY)jvIqAY^f~NS}fOC$-6*UY(zt{wvZj-rW}^ONTJm2XL!C zREQsRN#0p)9A^KpCntjPlj068J<2>cjlpUQNflpMjOUP9X=>%gTgvmleK$w{R;HC7 zgqa4}5wVKakHf@04s`@FD=;J_rpKQlRG5agUkSK+m$?qZMwq35U%dRbU*yt45%lyG zkr#F4Cnr-8DSl9Ysl3rMm-!qc^h#b zF-zqq*8I9~&XPosU_G$cyv~+0QO>i56hae^fvE|-fm?f(WDu^TL29UVhf-6!Zh7vSI_rGx|;88!<&+}nZHDwXT zn!0(^PL;Ehk@Gz~x1g@<(leT}TiM5EG4b5}r#0eT`O>_$)&83E5p8D`NIry%bdSs` z1py=0p}OCQ!=Ca*VBP8MxbZ0pfluWzbbG1sZ4=b zzUjc|hN|Ql>e?8DE_1R2Msr7@rbLRdg~slzq~gu1`kc8DE16F_=!~vg++pCR%b@-1 zcOU-DmZLjel-zi8SJQG`(NjIx4`<6~Z|?K{`cHyf911RKoOE-89FC%~0&r&5l}s7N zI5?rn9W--oxX(YXHdy}f#Rk8wd0)^x;g)=1O`D~leSJFlC#p7MZZhJqG|LRv>YjI$ zIEgYuotP%FI#ffyd;#8l(7^B6EfNmhJx^VQ(E3NAPuvPD0QGNRR|~mk#4?(!zT`+aZS_3pRc{iAzzt*+{-uIZ^hea_zd1tlLY(wqg>8n`BG2x7&}CnbUjmW_MD0 zM8pYkxpv=!se`YSvjd!Yib2>KFcPQv@0U*Civzn!LdGgVlb}qJ3MMYK?yags%sJdN zXu7#d$&1q>lg!#v9gQLMU&(Q=`E#B6H4vtSr|QMnwUAY2vJ%!$TH(|UUCd-V#kTbJ z1P!mDz69#EjG@+P*4^S1+!N@7@$q+qj)!;P8ZVuD!7hQK(^yaHpiPO*Pu{!!f`J<$ zub7gQG>k!?0_ti6I``%O)L3svcC;8JgHAgYBTFR1`w0zq{WPml;aZDx_a#TEo3dzs z?6jydSG2tAZ!}@)3&nH3n~c=7&qNus6hAn7NYdgD7I7aU3^QB0CPCA8rHC8sfmo+Z zb}TGPh=%9uNirc_pscVA6%gns%L!sq%-+c3!(^6A7YSdPCOF76{>{5+V($7i77kG{ z&hZnD|Ijcgnr(a?h;3PqWOAc=Ojk6~m+5uvMzFfmq$Ke!)W;9Qal5n)DCylO6I(mv z-LF>c^X=ep1547Uk|Iy`04qYFWwW*3BJ>W*poz0$1xrX z%0_mwXZo&;EEcw-M7*Vk`tm7ah?x}WCBbu0&I@Gbi{IF>sFAjoj9wkR*?~M)w)tza z7Q0aeGp$Fm@vUZ)2iqH4B|hfCYp*S#_RqBE_hmj3%pIHdQf=S~gm8SPNQ3$JJ^_Lm zKJ^G$tX#x62@quTc2QLX{f3XNT;C0fsa5i|8CKqg?lN5YHHnG(G`@`MM{-El;v#rP zTiX@Bx{fjS2`MYJB)1m~`7GDXaN704tKnpC^uGqRnNGF|v===AijJ@>RO#f+4dxS< zBMF54vg^xI2EB9F(0uk1mb`?%{knN$Fy{=RFQpVK)^jZ?)9|o5PgQW=TCE=>1y6yZ z>a(pj{<{B892-xjJ9+}h9hQ1NG+v{kz9>3#k6-hL^4KB66vzaB_x0P!WiBqWORotJPd2#oI>iibA<=*8vL#SA ziT~;zxF4>>Q#5zHd(43j?lYJOP0n;Knyj;)X`d-O2}-4}5$@5fCu0{;)pK*TAS;ni zCO2s$A=ONpyq(~sYgwm8>HAfY2^#-^s}8*UPFtqsnbmb{a!lCn0^4*7Q}4D{u2W#* zv3;omYz+*RJoYnHkt+*J_Hrq)w~n0&9jtB?D7j&%=QH&q?^`Xl$Rf4>WIS13_`=Zq zbgP&y_SkYqLj1Ozw@Kk6g8)@h2pO(~p+&u_a*J~+(?M*TK*YtKizZntlky7>L`rRp z<=Z)r^4<(|eE97J_Pn;3TkC$a`^&8QnbPZsR_9DtSxxPldTZ>wdh#-s(T5f1ibl8? z#f5p4tn@fm%RC$n)-2Jq2>oQgvJfmC^18~D$Pvn{|F?uYAk&;$Nw^<2WVgbIRWbKx z#NT%O@S}%8m^svUKcuKo=xRE{Dl6Q{=QNkg*>f_}58rV&<^zlh#`x^c#9E4cGW2fk z^(n+a9(bCIsnBO#9Q@9~CIj@~vf;tgjoRC$sA*nBR;4jFcxr}Vs{ z_?pJpZe_xZ3D}0YS>3YYJA`_XzlKk>w~LWC-HM#c*EW2s|FEE>XvNHba)c;6JKIhl z{G-T8O-Jf$4cD6YwU#kyL{!f2YyPsnw@C6}waq0e4;ay6zJR`tz8)XYSWvZuGLe$I zKk7A6X|3{~6mBrSd4E)1he$^HntrMy#8q1_3M_1g#C8{v?|9F>d z-cdh~qZIsyZ&S}9scY5ZzL$q!uWWM@Y>V=ED(q^`pi4xOQeCluR%40@y}q(;x?JSu zrnh74k0!hgJ!%`4HAtYIY#5S%&%ZW`2lt(|-F}@IzaEY(yMQQe93^Zh` z^hpF`-f4BVXof@;-Xb5u-phZBxj0;EqrNz4natemN(1rtm}<`yl0HF+7RjsRy@MCZ zO`J9Pn@_$ulmGeAe?8G{|Iu27LI>vF z{JNrwcSxn*X}taj{E}`}9LHKX#49`Hw;uKjI$Bak^bni2Xh zo`^(fJOF?vs{-ge&sXrm1ZxrhSo{444EL%%9WL%$d7ejz_#hsr!lwJ0otA z_?_~Lu207)Ro|Rh-v*spfgcHNj-08GvLJI`>l2r<&127_?P4ZEIUppGfEAu<8&=Rw zma=gRAzEaIdSZxO#`$)3y|CxF(wyjg61|u_2{Pa8vG(E6>|~_k@YJtMFDB+OOfcKx z$@1k=I!O%^tUS0K944Gf7L=Tk^?E)5j^lP@4~6BbZN8T%s+X+r|GXwQiY|=lxy}34 zcg@gnT(;QzGympeGg$jaVWHClp_j(Wzo@y*ILR@i4C~_UZ}m75yw^uVqmp4z727_x zN%|5~Rm1$^K`%{)>XCEGG7a?6GW;#;qrZsqy346o?@|sgav7J%c0VKOL7eN7`k^lg z#>v6TZ04*)JQWVFqgjK7je|q7eiU>!=>->yFepU|B7W7X zvUKbfC$a;HJeirPameW9ijD5To`_Uq0#q355*MeQW|ABaFa_h!@I{^!Kx3OdQ7>|# zJ8MMXcN}g}20O}VwhZ0+aQgWBz`H+@&85@|l-cP{G((4KBF)%@?C`@YITb%q2x6L9 zjj@i7>_s{HPQ}vN?=1WHlxnHylDG=fGKliIk+;Op&g~891xHO;!N~T>;=jhO&@WH~ zz3_N5K}jGpNl8~fn0cgxiI#4{qkWv9agkW@wbOaFWJ=RBNV)|wp;N9I*1qm`Yv(DC z%QC&8&+d!5rc;8|u4t`cMwf4NTI^puXpJ0N4d*_c7k?ZzQYV->FWabLdnJFSbIwCo zxbaLq_~AG5l~bHsjAve|D5stzD_jP5-PW+7aX`h=8uIAnAd_W0x-dhkEe1m3F^D!b zc?hc$>5O70gXv^3RM2om;UoQjxg85B3xVW&lAF|sL(}zNX9d7dHw@pe^dQ9+T4;FG1!m9H6~eceVRF5e_zmx;s`6C zR4~Y@musG*{1n`8c@$j{SeP?+2Gc4|4$G1om2o&CRlI}=kuHt7gW^iaK2ec?nk~-tWUD#7D81>j!o8PZ8|Xp zwBvRVs2Db({+E^_x3nxH9eT|Y8H|@mAkIRxn+;ibMTW17sA$v8P;01r%_1?ESS|3% z|E3Hx<5kp1Z&QQSzT;i#i`-4=>|%1%&%}lGqOzV)^l!f8_HnM+G#%{fQ;kf_Vr)0+ z`eri6u{?Q`1{}^Pq{etaW2g2)Cd*!7(9U*UH z&3Zf|&48oQIwp*dTcjn&_GcR80F+7+Lnm#M0OlghzXGsLRna)Qdjp-d=* zwvA+MoLgLRkDgXDv*<(uFK?r8o{i( z5~-kEEI?2#7YpXH)_D!bj0(7RLtz$%2=`ii$cYh&-@_0!8?5$nd#-=Hurzoq4D_PV z5?&#KoF?(C;i0|t(hBECgL!^lFLTWPGNrMurQ~G%nH^@el%UO>w}ic(Oc$0pTPMOS zoo7(D4pgF}uSt@W!fALev8k{C3ND}h6M|I7huZc#rF35g;=Xqc-Uv}~3_gEexDGKb zAe#~mJw#j{keKq62Jq^y&NJ`R zRdb^0B}C-b$MGUyzQ6``COQh&ToqyKlDcYIB$5Hwnx4T79h# zERe@8?DP9to#lIve-TM3sNYDK?f)W5t8c~;jARk&iU*W}F+tnv6*^L0ADI6`cqnBc z!s|TE{T2&BI-2r`i1WB=ge}Ttajd$EE1t-YWFq7l9HlzEJp^lSCFa4CpbHeYwU0Z{#bXT9sL5X{UyK6iz`0B}J58C=d=U zWAe1)I1VW;TyFMXjdzMFI12?of+jwT*ocjdtoJ{f87v;hovu9QJOM^!J1%tzNgd{m z-JA4#8Mi!#{$tuAN633ST`l;}ul7&U=AW01ilgzaHsQ`Ja=;xSKqxlGp7}^<&MYgZ z7yPGXaqGYQabNx5U;XMq#JQ>tFfC@Nq~}F>po*$sdiYYezIB;AP*IZ$qnAZvC@q%} zQ6aC2AiDod(ECXSPB146P#ckxuTSYWR}M2PG26K77eyE45otsuy5`k1+bD{k@o>)? zJFu1C>V~P`jwgaIdg_ro}l_20SnK{ zY38{Q#l$^bZxhMpqs_9uqzDCVCQIv`4Iwpxk|jR@$!6A#3+VtZDpVcyV5YsK^hRP? zL1)Jen?of+rz+=kqcJ*4PW235Yj3^ha#?|i zkVH*|vqB^O=XJ^s2^eqE)k7cFas}zqYmna?l91Rim>fW+e{>UnGTk;Wj>PNMxo+%N zdMW>=?jBq1PRuR4n6d&+&`!xpP7BH&i?l100M#l#GL?Z^{!ZvO8L`5qrdoG6l0D&r zRMAUb9nH=PWt0JyixX_GDsi&!><@272 zxoS@e@2y}>D)2C}1yIvvrmMl^JJDg905nvF)q&^n?@fmT))H}7SqVA(z)TGdkYZAK z!gtTwPxa()rua(G?6xn<$~pHo78NlkoH^fz5&Ej(smPZnjEH+8T;9I4g1+UgvUBY- z&HnXubW$*3zJ1e~y@h6UNBU+Y`n^<^cc=pTQlCa39>$p3D{HM7qWv5y8#L6}^}1;S z{=X$Lb>h3JMcjjlX&RY#nL4vKM-<}Mhx>+^#||rttCw-1VND7CsU@2Ze_zQ*a^_QA z7tB)OfryxInc+$cA+;0gnmgHP6Ea*P>4}| zGxXbz1eKkSdubz-wKLyR9h=;`)cr*{5B%BUA4+14-x2%va&lGF+!|H-fuXi)ax_te zcZMD12_WNe4pegL!vU=dloe;0I%hUQGFaT`mJZsH0Bn(gLm^9@Q%&BuZ30GxopYZo z0SlCIQmN}w78arFC=KtZN9cLnr3iTY2@u(M%lxqb4!mhDvMqm@WQaS_f~cLgR6E;> zse9qy;UV?n;_L3y|5L#KuL2V^^fvte=X7z{8Y)iI?bMbK+*I8|Y8~G#b31W?|7*nWyzv(C%q$^Gu}`vN zCt5ob=~_SRbYSwL;K=2jLZ%VY>(GY29DE(82b@M^4tBYn{Ip1B^U8wBKWAVW0_}zk zX(S9z`OEW2rlMyu1e&rbl95cg<{Fcr&xDwqdZ=Q7tZ&2zJ1;6)xc)5WVS*epLGv7$ zgGI+&O_GX03NZh6P-KiYTVzhWMobwoQOUa>*W#OzS;Lx!YAaVv!Gs=bnGFHSUoyur z9O;13&4CKU6#_iH2Lhf_7BW06=p|6i_McFide>f^MryvqM=7XKeL-6ayiQ|-s@^}@!=Uf_>f8CG zk#k{8AM}%+cYDZtj(sAqH>qXer7s+sL$ zT(u$V(LImgtak;gX>X$SyG&;MX4yc+IhFQG-d9-+WWHhLNqgTW9aj}RBWoQ%W+pL9AJ;FnVG+IO-0t!e=Kjl5GIYrz$Eg;@SDr?n!;nl|RT z9AXiX+WJ|yUa65CQmL679t*SfJus1S#t#TUk5y&))~38xl(~kM2412YY1#MQDp}-E z(w|JVtA_7-N?1DyJ##PvP@E{DsyGwx>Ze?Fvl7ng5q%W>B708Wg}+M0(avFKV)uf- zKCxh++a)t;nkUpMd-UA{dRe7j_Q)^&y_loFC-qZ}u#>mVX*%jAssw+r4@sX(TxpEw zC0NVWt7Os3C_ML$~nt<$p3PgKpCww?88ZB40qH` z#hi)1KvC|qCp?_5a8ESlmX{7w0Dhy(DQbA-ha=wP#H#6pqSIAp7&FQ(4@#kvR4NVs zsi00R(doOkHi>lUbe8kucO$tAI9lcJNfKau6riG(qLuIIz9IE^f_Q_Z0Mr0y_l?s% zYpxX9Ks;~bRybPm4;}8_{H~&{O4Og)hD0^_&H$G1`3Su%C#usWQps+ATN#%qqv4`W zXd1Y2Kn41FMpvm*G)plm)+sT!@(JL$(cXDDpEQx|7KTKUFXNr()z&-l&O-#)4eVUH zzY^8Xg0?2*A{92|!WrOU`DfMUw|NWq)tuls;E@6*)D1b`9B+`F7Jw&H6obJOqB) zx!JBPxOCvWK&Y=!E$qYkYLyQs>8CPH6#lf7YxAeXi_v{YAn%<)-&AwobAMDMTIHIa znSwC=pmXdKLO{4NXk0CLRfVN^w0kVgeSxCgiuocJM>qGJ5N`oZ#2RTI2RM%a*1J<) z^90N=&9Lk-y)lu~NU!5A5hx=#-3NYpVTBYQ{w*sE-U!HkR%WaLlMy^LjQ|+;xDMx8}F^#FvHt=C|wvq zp|WCi?JBbb;Ms3C!UT7pu(BqN-jR2Oc9#!M4sh$Jn2Xj#j>e{>g0?CPFFm|q?z@mi zH8@#0<^ln1Rs^r*_)g7m+3WLm;JreGphP|KCr&f?kX>W$eP4833%%kffzJookGgRf z9=>IUYoWd=-Wgmf*;5De#HeDOTd{u>*~@5%U5y#N`;vLjY}?fR`rhN0 zRQO9bW_osj;#8m`K=_{3@c1sABv6&mZqCGO8MH*DQa_Ti&$r0*klRoc<^9syGi7kB zt>Rmz^C+vs35Rq+xR}s96_x6AR6{32_+1mNI!~#k6B54R zlteMjHP@Lk&+;nm8C6SGscIW9jvUqWyy>`p_GkWI{1y?7PG6%`yT&Kp>y_&;znd3o zELG{8_`L`&N*p(!hYg`xk%rT)6P;9+jk_edPQ1;?_=?U*^M&YdkrFHvajgLsS&J8- z%iKnR+PrNQDnds#otH#OzpEARW)O*y~!DEelIYz@anLpl)T~kgx0d9UxKaS8K z?Tb5+jy$99(*pOj0ok~_NCe=z%@e>PK}+qSC9NZjO~cPJ%lqF)koEzO+APmOwd>74 zio65NP)!c`jWl8PETMj~svn{Gdm%XI11pgvjvNQcz?zGRn0VQiZR7DtCcnEU{FRcP0kPx;1O?O;#~8a!Gg>eY#|;XNb1Mf zjrAIG0aP|ZI!z5OI@x$>95lhs=E%r)NC`Zx9(Qa}%*)xYUa&{b!qq2;1Oj4lUud zcdu87)WsL~tWocw$*(=v>g<$EINDNY-I!(&@@o4!pXvktp!da>G4#j*l^ht81r)8j zh4(^hQ5>T^rnJYA5fe=y*cfA$J)X~N0vPudrqHjt&~iPY{G(n*EA;c52)Q=q9b)-g zmfreA41&!D1^Fv~cBb6dTPzzfv**N6EKX3)*WwrfIRN9(uN1J=OU%!-``QF6DBF^; z0KW!PK`z4TblW?T!G@~{q&%pJ0?UjFOKfHpSib*+f`^SkG~YwS8ghdwgxT;m_o^j1 zSQrcK`{{7>s2uc@HA=(tum~Q^XT7zn`u?oB&?7E7A}B|qg20HXXc6|LMS((*6y0`r zK*gJF?OMK)S6XBWs!&S@G&_+`e*-gF+fOR8veNG8eB`1L@(k@~ zt6{j@edtZTmaC7D&~U^M_m}E%ybqwtawkJ;U?fE0gs0R01trG(Yqzf?_BEvXvHXjX zlWR$TsThwEHJ?!km{Y~2*BC|{WD+0AeT+P71FcS#F1}YfWXTx)3C4Rz?a7ETSV2o@ zZe%bS*&Z4_{kar2$Dy%@fxW}pKBlrWpiaH#eaA&C<-To%NkyMbak3KJ6qui#(QJuU z_aOI+9JL6J3@mH<_+zd8%9>k1n8+(tLN5y6t{|GUDt6(m%%AbtYR#vW!wzMlW zRw?#X?}64DMa{}nCJ}0XNS^>%8F#_ShcBq@?U)v`zhI5<7y;hjKIEaTmeTB6rT9vY zER7!JM2Cp5zv{zounda_u9tx1JE?3X#@d-R626{Daf9(Qz=W0sbO3Nvc4g)G8lAV`lZ!jYn#Sgv;gG>8OcA1z7$MU0(E(;;snCP-a%t%*J;vtO|HmZVwAH}(H+!9 z6$WldFJ>Q{>))S4tbw2!=mra`n=0f^i9$VOmL)|Y;w9+~ZFSZ8>95k&>3}l&vDPDf z2NgQ(KuUUpSY@^HuOWOdsZ6t^A%kz@_i%*wc3emohC=e9gc&joLUW{GA%(>yW9pY% zd7JZ-1DBz{whXp#Q=wl{W`0+`PV6T>8A}%QTEv9D_;HEQm*XzEfDLA=XAR+X1zlMm zZ)<6O4R`@>^CkR9C*v%BX;Hm&WKbs25GbLyB(d3#6$MSy9SDQf3J|P}t9*dN$!K9; zRQX=a=hzv0tNOjP6eYXSAa=qs!S1=$QptX+@OnVSS|Waaaf_nP*NK0ZZ;@S5Sk?~1QK@v^&TG1V?3lh^O03UAhCxtKGVBfHf@Uw|4 zKHuLzLRikA^pbwdAG*C0$hyub(DEN_7;Lentn5bXOztAj^n`IYp}*5Nd~p`U@=nFz zRc9pKHhfL~QXBqYqpb=`5!T+Bwj!A!R9UNS@m-1C&onqX9OX%%DGe==aDjKlzp7N@ z%ki~~@~_@DPPU^6Kob)-75LVbigGVsK~%-cQj~Slfq4u{X}(4vtqXl)qkS2)QuQsG zTc)z2?|>0dh!(z@gOj&nkX9KM?D;=YQ)oO}XPNUcp)V*pA*nM$6{@fJ>iYMOWV-%s z;U1>4?0UrnU32}3UzO$H;=pD$NIANg;ExKjc58W9AN>yzE47mX3Lfiw7N1Dyn~`G3 z)>wWAXQlhKjJQj%pfBZPP5l#~w!bnIj$EI9R}I_9T^`o=wm5e8^fXS6zwrlm7e*)D zA6@rtmhCFA&hXm7OGyaKnNL5R`6@>i^&o!66~XHiuD&PU-1JK2OhvZNp3h^=^u{v< zMZAiLhdYz?i^!_~FRJOu?J}(O&O%wqA%>3qHHYcWmO<(s%#`p<9C?QhHInXMN zB(ns9f7$0x5x80*Ld?I5gfrOvEqR_YaLY;^gMI!X>i{O)R?5qxdHHdnw)^7*#;z*K zRO4jewZ4s_*O45H#$REam{-!Da%1I^NqxcRyA*S4^l#&5-QesJC@E|4s+&b+q*k%} zF4~+T|B<4R$h{~hkZ%wEk60q4EVf?wCCz`FlS*3H5*5+CJg9Be*N^~Sen+Pj8**QM zL!W)KPmvJ`lif8*zi&u7>AB$i4F*ISmV{-vtmwR_u@Tl%bW^*8;5}wgXXi!f*-TG1 z2DVCVhIbiRM7NE>5Vel@_BVZ8&B6??n@2*MVwG*eA*i~#v4aVPVX}3g52v>Cc{v^z zMp^jY3u+ZsQ#2KI-+P?;77e@x=MLwu*hY~4>$coWmgum z(ilR+hUPamwC4ljYCf zhLjC$;d|+7Tj@wq?GWB(T$Ibr+;VCiF=YYpWu)fT!CKy)B8mQ`Tk?aJh*xNQb9~UM zWR?S9tH2=sD?vd#1$Ua$sNVxgXLby8^&W7x>jGMpNG!#kTb_Os8P(91i$xe${42gq zuy_$e{R;SjMa8c)&#RiiTHlV1jpK#KT1oXcw4lYjp}rZkm=n~Y z%u{qnXXQBlp*#uKASGX*R8y%2`A z^S}AT!U*z?sygGara!IEj9vcJMUA~)F#+|d9IilXeXw1bv>#>(>QfUH@$H~Cl5J{E zyV9D;%u4qJr@ai_jJ0wev+|={8i=gWAXI%hn#`P{`u6bnN~)`G)m)&qDF>Bc`lgkQ zZ^;@dKX%!eUfI2v{5&!x#O`^#sj1l=#lQtf3Sbe}FY@N7zcO+;D@qvGrZ2Qiggm>m z`LejiJ5_26M{@)ao$`=yLna(@iC)U8zj1~#*KeCKD@xEC zx}m>K;PrjI&|xh9INmXA^YW}>eEk78;Q{LZ9YKWWWAjs2m_c3CB5!^9ty?3Gy&y$b zF84^;*;j=2S9aT?O?LG;D`@`KT4A6+`d~f!8OX`+3Gh;;2R_fOlHIyT3fr3%(bj!0 zfEgn0$VlC(aat?Kxv3%2sBU_F7SvH@XTqpBk5l45XMeJd5fz?euKj~tjA}c@SJ}lP zp{78iZ`A@aF$Y@gNv650u%y98=qY`qWsn5;_Q_KrbNsEzxS5eF(dF06e5~YW?o+n& zpS+ix$OL8;F2v=n$)=abgeY-NPQ)-zC2AI&0=h0L?8oMQ>d23`NHpnLPkcqp&23a} z4VE%6R(JWn7kSl|Pr%0vLD^5}2eqw&;)5uj0CVq@tYdMbGLQiaNlX}u-RkR z>UXg?M&A{bCHJ3Ia7bIV8(GBtd`aFax8&hpTBSENAC#)!P3mhhCGA69*rzwtKCc`Q zU@)JFXlqZv35@3)J(rK?=lU~h_J6H{XyNj1+H^tHB$`x&ZMf&+t^!c-S&lA6a+b zQgt<9tC{6o}z11bXxVRsdSSHD(tm4-grGOacu~$Mztmcn5Y7 zf&KA?B;t{*+Z5Uo)V~VMdhP(U?!sd9Y!^j!`GoNTm}X=>xw28hw&o90^K&f-@C_1A zD~?K_C72GtCMrmUf}*3oYq7wApGfe3amq50-ToP`kp5Duhl5P040O$>(*;dU+3A3E z6>_kE75$~JnJ3T7Rh+cwaEdDWQP3(3`W1=D=KL-B&MAj&lrLv(+E?3?DR1mLRw!Tt z;D_wx>6;j9`&ssobugKGF-3CK^>KH_+qFmwudUBk%3-93E3|} zDg*?g@ixX$Hj%c1oI1TX7)q;{Dj56c(?!L=k6x--`h#_u8V0|vq9TvpPEjjEQChoD zdTtP{dIBrgBqJ%=C&}<+Mtb3IYQz=1iUbowb{<#?JY{p)!E15QV{|@+Qfk6iE`;nh z)V6|i0p0O(f)V>l@cITkHK#;CuaUa2@i{!3IPrxEc41CpaPa}5O~meKl^azR)#(ls zMZKn3iYv`&a3trt=Dd=xt6TYWS@?z=xWI(FWPh}L0?I7>+|=7?U6XlCcpPq#D7_Z! zw6C*NSPy&e?IJ%Ye|56Dud51^v?k7LdK?T&{Lyx+x!X{v<-YqX$>qaOf>Id;TJW|~ z4Y4#qF{)g5s-mMnWIGBujxZ}wSNNp=VkFYh8mUQFS}rF=dt@i+WA9D2^pVjNJXWj{db-z+GQe+x>5>%C#`lVnI$11qriw_p*sNvNoxZJn{MuLg4;xVOBF60M3IV43x(rdt+ zZA&o*YgsPhP)LuuWIt#HDY`r9s7y;5&)e_B|7#*rC38U>e;H*v-CjUTHI4dQ)eR6d z8sCK565=@?FQMNhs%7^_$cR!#`M%o$5i09iPAgnW{yIyzEofJJe#QL z;IZ9&IPq7uq3B&`WjgK>)pO_Df~D6A^`4zn(Q8~Jo>?fc4TM-P@tibglQ7Ie;m|a% z45K|Q=JK~WCd16b&YEFUV=b}Kn@XZO#60lwG#+T;_UuITRpsw7eY!nm%5su8eBgkR z@54_O-sP6C^n2P@6!z4#%mYT8=|LWE#zCp?t?Pek?Q%{y>SJia`_wf|77IKiga=(R zExWTdl)mg}d;8eb*J?PM41;m|e4+MIu#)G=bk~6x0>!SK|C0^Es^Y`}UrJextw@Hx zZ?V4MQPYW{(JW~na~-E+f|8}cOFiZk=5SE$1y^IIE{UC+HqMQ#1G=k@sTlBbzR!bM zz}#MvT1){AZBhQl-&4=2ZBX0=9w0nF%I>&F0iq!AaaHvBLoY(W}`Qd*DflG?1nZ|U} zJnnAF^Pil`r0}m}92UJg4A+%_c23Ffzl5K?tul8qTecO9*%#kTOn#QB=?_+J8Ta`t z0pn*ZV{dSXg;m=Qe=MH30vTja!`n_1Whq^GU(d@iVm-9$FHB4odI)(dIB|q|UCgps z`F<_FK#3numY1nrn@sEnxhDrR9ipQX?+5A9gGER1>rvj$>Zz(7kMElDZjoxf>}fTn zA%(CHDJgi;rqfX|VoBCzh6IIx4l2$Rxw>hPni}G`={OI|S#o}VM+7O)CgsO`lFULL#3Iit{E;ns{;yEFEO1sf$jm!~_4Vj}ueIarwiZOQwzC6ypuXIC zHliy-Y|OFTye;Rqoy8c*DZ9dqEQrT%d5wD%5ZI%1-evfGW-xSNTq?Xd%%h9*AbTU_ z!62UpeB+>?OZz_4>y$t)FT%_|2>!86sjN$E>5SGB z^3_Id{@ViZjQN>3nXl`}mFBQpa!an)v-BR=S9H76pDGOrrWG2OjMi>hd8)SsmINg|*R!nZJ&XDkR*ai=zCM$R7a$m2 zw=o%R&h$7h$bHM}EcPc2@lOD&!jU1dv3Q-c)7J*``I-jhpKI4HMJ|2ijIy`*LC(my;!b3Z~Cx zZ^&Y1W?>Re?mrhU#|!FYm5B;}XGlAnbxAy78`y`%&7g0dVdklqvW}tX4z&RWMo^up z!t8p;T+8>r6fU?H2c@yNxHu#3TWF=Mjz%Wfu=kl8{iv-;VfzM13fGmTkrY?D6!Tob zc)C2Mkf$Yauk@n#yW`813=Jpp$=CGrj78p843&Rbe0oDCgF^;%SylM5!F|cDo(k&a zsP{_U=+pQz{iib?qL(@L7(b@ z6Rl4A_IUA{T8Y(sUT2kwTb@(mNJ)MoQP&FFGTpuCvO)0aIO7GxX-GbUOzXd5oIy^26Y1>P!EaOrAs9IHjJmx2NUQzEi0sCc}eq2 zp?U_G@|(^5p#qh@@Q&-ljQU`pr}F?H)2)|fD*gA*!vTvaY@EiCmr9se3Zhi&G+D+s zS~H?rWGP=di1I7CPLWawG}gKtG?ghX~6YOVe4&8GV0C z={^XLQ%=Qoj%sL^MT5{XAPIA_pIz%&5F2GA#gY> zd_enn(E<~{bMd(+yos^OUa}-(ui3tRTz(vWkWCypc*7wV()&))C#~PsCQVuH2=cnh z0L16i+RnVT2a#2#DUz2xr&`}B(}&@6eAK`qQp`3QP=uiQ&0Sb0v#6?v&IiovE9vQy z45aT(1o*W?Ix;J==+Y%kB9uMH`R>@hy|qO}f15QhC;5$1zQWfmM>HS)2g1Ux<|zcp zEv=yAo6jN9{g(O~eU#AKR`{;pBy_Uztt1c0Q_@Ez1xpZK(R7F;`+lD$e zz}Sm%TXLSSbwJ}Jki_ewBV-0rEs#|-ghF@hHG5s9Lq2^A>8YXG#ymS=$%AAAYEE4k zsY48O#z3^0n&pN;{*$9$BbLqYLnL2_5|@gGA*)9JFow>!w4qb)L9?>(f&1c6-^yJ7 zHMDszm`po6m9$*sa5v@l)AER1PRDRW-+_Ny%BcToq3R{vpNoUCqdK%>6uFAbP5Y6X z+pC_3jZKOvtL^JMJ^_-%E^#N+Z#2R?7L3rZi<({-Pwhm#@U4i^O|N_#2P-XPNrf z7u>|RBJnB4BSxYod&x_)Uw$47J47d_cml{8=L}zXf!q!Y{RilM zBObLV%kNY#=&EWc2aB2-@r+ihg6=*Y!wqwES)TX9v2NEgm`&+w|!PkaM_v zxYz4L)?TeZw5lPtz5n&j>yl}o)%Y=i@v8KJ$IC4S{sfRux|@7V7X__}Ng$`4eBxNx zMGT$NmL@Ogd}!1x6i*MB4e?+N2aPnCIn!erJPD`Ji!y~c}y?f`!#zV zLD{alTejKrck_|t+MmmsD~`?s(Gld*!1;?`ZThiV-~T$YrYgvxfeHO9mLB@ghvkMR zzzN|&-`?Onva#_4w_gQpIXvOtBj_Xf@VJJ&$P`Od-rCO`v^d*M{`_qGy6M!1aA7&e9f9>XV-%fov(HHcGXysgS-GTi_NX2e@k*YRptaDF*sjSx9 z6uFt43Aw%T_8C{zt4RzluYfi6iXnZQ3;jEA7h2VWy}yrtT8} zL2CH~cq7$;R&0v^8VJ)_6}rv)HzZwR5+14}K8Tfmd5C!6QJsR|?txMERCi0g+^&8b z;ck&wv{1aSi0BEyKDaQ9&db?JzWWsAdd)gnp?@g=ddr-rKgFqR#=qXgiu0lRA z(bHQB+~4_nahu56mlF%kL26l@_-fmOo|clZ$rdmZt&5gAapE_3{e3@e!VSwi!+6 zjn(*z4rX#b0Y+w)(;G}5uRDs`LW~eYBi}bp7(gNPFD296F!gOnHIo4n6tp?BGK9|v z?J&S__&8qZ@8@d4(J$ht&=o-yl?cqelv!Xfc+W@9VVBJEm%OPi%S#Yc zip{HF_ma*5{SrUKLe%WwU;$LTnY)QD}VBv-<MetC<#zVm*hv1_6J5X6{3$8 z?-L?Z6x?JYo&dKU91mHP722d7TQ2%ffW7;UOSkhlWaiJ)%DBOaxT8b|^pTGLq52cx zf2$8cvc5hDmlzoOOY>0j{kz)#cG}gi#=zkTkT!zcm7gM??dfq*RJF)=Z_^)s51iTE z_BwSuTJm%}Rt+KZJhr9O_vAy{Lc z0A~WQC%}cD(VgI}>>Lvn4&)J(`UjmYhfnPPIuIrl5taiiBUaU&D8`ZH{dfQGthE2v zto-+Vod27aFt{aD`+3gb#4UBw*58Y${~C$m|1=V*xsT(~F1vF7Dwo`}t3Gd9ZWXK8 zLgE{zZu}2+rH?scdV(M8(ic$vd(!>k>fbgM|IJ}a!FHm<^QIr+4VV6UpG}<+&TPPD zbLo}4ENcdBl%`<{W;slrvXeFL|NK}cV}oS^7lceF5xr)L$i9Xj%$la203UCcp8(p> zCqP|s4Zlq9wco|hkn~?dMk4zJg>=5=L{<3)ug-JxSoY%m60|ke>#5FiJw=`B*%VS5 zH5@X?cm7g&AGXX&Ci;Ynu)K(#{^M7-YJ}Ysh3dZOmS_8QW=KMI;J5x)E81fPVugzr zZw&1E`~wR@=Zb`;RWKLH$5USsGR)K4_`QtW571PcKRHp`UeyOX4f5pdzRjtYOGy_I za$s-q2at?u#@BC;!ls1D*C=1`Kt`y0V)!2_SAGx4NVxz>2Y$w|IqRu@-(4RKf7}nq z4s9n-0v3O7E0WZQ7?LukhVYoTA6*q1duUdK&Uy+tW0tm}hO!PB|G2XP_u2vb=>R^W zbBL513@ME+_MgghX?29&keMSLAvKJ>A00{8`_}DbqJy(oKt4v&q)81WJoXy9!|n!x zl-Vn-peaKJ=yR9Rva;s7MwLwP_{@bL80l;&#Jxp*G}D2ayP)4?(cUR`a8`hRIM^Pi zbvA7Q>n++3iSytF(7D;a_7n5``s(sCK^q`X-?XC7Mf_15(z{j&8|h>o!Anrq0KbN9 zA@+tRej9FO(@ax+B1kbpfG$zt)@D~E`5;-8Rl(3uOhbr%n%pOPP(V<3X=a38&LYHc z8RhV1?3PFRvS04;5e_lzkYHi%dtS7+6Z=o-_ zWLd9Po&Xaa_vu?+O!vbp9o@(~xtD5{Q;waD`4%_H@&p({o)pXAK|YWrQBQ#PPk>XK zG$!axYL|b=HivqqIUyNn+?3M!*ybz^St2k zK-%FZ%K!d4=Tgh)t~#M(i|6mzod2vg+Hptl)e*~3lXT5c1m)UR{Mk^vRy0#Q0P{ss z0??~9V6IhGukveDTNA~I&G+xI1TZ7FL4DBW0D#SRO8DCt?S@Sb@GKPAbgrwweC;rq zlW!rIDCGZmK<981<9&aL?9cyUMjrW_kX+pyiXD^(y!l!B|4{bUQE@!mzbFKE*PsCc z3>Mry*x-YEu)shDcZc9X2TO2wcPGImxNC3??wU9Go^$TI=dJr&>%KpFt?8<+-Br~+ z)wTEj?9V<0cJ)WNHI3N)u;MSWkaKSb&w2N!b<01ojpu*ZBIQj0`;F_DX@PagD~ZW(Tpi^(p!E0P?4Zt|J!Z- z?!y-KOAlU-)XTYz7n)DWA8KBLh5!9z_EGRJ^ldKUczbDO z0}^YdS#Gk-h>(3_b>ywz^)YW>XP39&(T>p_^H_TLBI`M0LvvYFr+(zO_3bPn*$=i6 z=+rCR0~#0fU4Xr^F+_HcGHtb`nz(*b8nBQb=V>*T9lk5`Httn-d$hOBj5&y%>TQuS z^M}l#Jclz!RN)M7omQfk${sd8%g( z7f917ER#Mo?fN!Q{YsLGH#DO|j0EWFT!Y4dY;QNX`gH?rjd%C0if!X)ralZ(W1{k& zFZNw6&Q(uV4qXwq5v}h`#qx08ds_Q^@0D5tMH}IwzIQ=n5*QAIdDKBDNgslf@C)#P zF$$u}o=XlXc*Q3y7yIF|LYZ4(g5oTWk^a)~I12Q?!p(Ys3s#O)K zm1E6K-{uDScfyOE-tTS8vsKXGI3^a*FtOMoyB!Nm#D0p+2G}4Q>ai|uP#F)`PV7MqaTv( zH)4BGM(_JPURV|6$d-4cEhd$vA0}mk1AYupMHnuVA^IrM3?FChV%e>#p^IF%m4$t! z+`nkiY?9aI()q@;Q6{GHa)}~pD&4iVJ}8k1F)L9{Xkvxx*tev4dO#HKW8*S;16Wx# z@2v@C&;vqjt|AD-96QRpSyjo8WKy%W2GlR#^5Mu5esK03OZ=mZqiub1^8A(xcxSLy z-@-kzo=z29@XLcZ# zcmIAn)x7NWGDCr9VdFfRfTZKPKXC&;=E;ZhC5BDmeDkiTYT}Ws4O#_p6#80STdD#^URfq{r4i!jA6|N3{*yE-`z zD$EzAQ!F#dV2ibm*^9XWufLDUw6R#-Gi&=|q~e_AtQuNrL1mtk>pCXx_q`T#Nn5>Z^LLhF}KM#Eb=)+p)kj zo%opc;ndMNqFp$;NP`&pvlHAG0U^zn(V>`>pu`~LZhj|Io|}ikqFCr`%C7 zH0=7Im-hXMuU=fyl)$`#HCXMLe`)AjEg{aBT|G>riV9mC}&D-xE%TGFS z1-dPZqAtz!a}R+p=yDTg@U94s6VWE^ID?C03+9FsgFwz93^D*}c{Q4c$Z4Yr0W6GI z3Z~{I^M0#q8C$T^@2YZV9C+xYIPV9D*!#~LMwJ-7JLY;)_A@EsR`r6JLdy$|_tC+8 z1^E=k^j1j_B*p2oW0}fhR2?^M__Nta{fE>AO3tYFZRdWAU!+j`d*!|v3VxdU;aGZR8M%v(g|s#YHw!P_5$w$g zrwl(YsFE-b*9SsY7!n2UjZe-f0z}#m@>m?&GfGxO0vqPtrZc#miA!EalxTaIdijWltfnT;&TWI4>Gym+ zkR%FocUHTdz@G_Ox=a+336KykqegB{tF<*#JK{7+Q>;8kH6S7CZ3GG>l3Gq*5qV9* zFBVm{7OP}x8ZMW!GF1*O$$EYv$q2r&>pr8EerjeAQ9#_*hwRUvrxNE3Uq=@~VvXn& znk$<3J(-aO9aV}sP|1L9!2v{2`2qHp!mP^Ch6*{GPKFYv=-Rn$eo&*H#h`wK0Idi# zDjtgL=|WaS^1`KGb;J1k@Uy2*1J4D;&-fbpGH(kw!3}AYoBSx}@)F0dGer!^txqPg zb%@aS$yw{XjlRhY{jLW$Yi`0$^n6pe1YuJ_{VV0Tk~$snbNYUT4D@I0FXQvG-jO0F0YETV?>nd7Z~*Wk^-`qG5flc8kitPgbIV*68$0)WjtY| zn+wua${)?a367fcd9qB3k^r#vJy3gxh*=`8(nJ-=KqZW-IpQ`j%3%f^Zt0i(gA_iynVvjE76tbgAT6 z*xfIx-wtJuQA$AU=Ng{AMIuN_+=fzj7*-94eoma5L_n9;2SC6(}!Ay+wzTl4sTh3Cv){>T{kXdH+;@Z^jTZ|-$ zo_9|=Z$!2|QJEYI2-)bJ(NPdV-g1FNGwpio1mvUFzpm=ads>++cQb_bn+Bx9K{e0V|HUx52%B`V`o2vFw)Eqc*I(rezIxacZ!vbpMb$x^oFX1nQV;&vl}2| zFxs$qntn|SEnp5Unt5rGVSErcxt24uP-RgpWe__|q;ix*5!-~Pw?N;cKg){n z`2*udJ$j)v$t`)9KIeEuYyATkuCrebLlQHN?Z!H*YuYkjoaq_~u|;^fQ8`7oRPvsp zC-qvB&zaE}r^Qkv_Sg1e=8z!I*QkoF<&&goBNPwrwSoIlnQuZjO)#(PtZ+GeQNb3Oo$@vv2C+R)m#bR*rKPD=AANiwL1f z71F8diR)RIL7wO*1|Jh^9CE#VWac|^lAI>Uwb*}7^WECPWt`Bbi|ng&!5F-!RJ^X< zws$^*?^3pM?TY@ueP_AS+6rD#)@92eb6XH%Y}VPY5?rz$g4l`sRhctS&m?}VXDng8 zu-|Rxt8FDV_*MFD;`VGsF*3DMtYuRyZ|>bzsfc&q(0w#dPEc@#MS!p4=j%Bx`2oQ2 zA2`@JV@!(wHBc#gtn257gg1V%t@RU6bd)fz++XS&yuXWO6PZVpK!#cL7Or`Mg06fd z<~k|V4JgTgIDU=e9Z&#Jotr*?~pL$%P>4J6!liicsu{1((*)e z659H+R-~co{uzM^{b{!F(e`nLyTRX2{Rv^V`Pif`?E&T#1$Qo;(2DTYGg!T@Vurni zc^!JJ{*Xc=Q#PW6O93(qJ9?Kgpj$BxXR21OsfE{U1%HbqrR~~>4pCPw{`iZ|(kqji zk1UHUswF_39PT?acruh2CSIxO%pvcyQ`ToXN9UIz2ckm$1ymiLrngJ)y%V>TRSQr4x z{UqYkwZ^B-B5bKo8V>o9bsMs$z&iH=RYZdyey2e018uvjJof@c)YlxaK<~E+WeEz| zO1f7C1o8-}>SDZx$qKX%rnB=u@ z>n>&O3cI_&@@~?rtKFI9#};RmS<1Zb{AR~RtKb#Z8GUa}uz(Kn9ypCodhmc#h2gAA*3n;Xcw*^h!D{I(b3^l#AzQ|v8c1GkS1@w$ zIJue6*2h-4QNWCzFRq6zNL~s*4qq&rdDy1Drc+YxZQ-2nR}aprs+dDjom@x?^C>3t z0Vlbmx04D#AuPwsH6x{vCbv5tJaj7a-F-9R6B!}5tL1TD_WIQlA&Sg(MLT<5My_h%05GfyyluKN`Z1krBYG>` zoj0d2xv!C<&_^N{?}n+`Q)*&21AoH`c5%4^?lKcGgK65@SPuzmcwVS5tKX>;<@TS@OMBiW8c7M(!butF7l!FHLJe2HeidPwPO-Dboy~i-XSBded8Q zUUZLpwtYN>rdv@w%pK(h@S+fU^MflHY|7r2+MQg7>?g#(xmh8NiuaF7jC(T#no^LH z9658x!Id2eD`MjtLFbvx#lU6zDR=XcG-g4HOoH@p)?*@O88}D2+B>F4@uO%B=h@qD zBslhMLxv@y%i|0TeH2g>?~(n2JKr-s2a?c-?!}6$%gesusRK8m4Bu-805kI#Mzctw zW2WAjC`)~DHu706Ct4ttumS`w2{(SQ7^>-4tMG8(RY3^9qY8OueE8*7w`p$ zIn@Nhmh}ScOVB`!T$f}*#2EaZ_VIPe7r(^W6y5L)+i4O7$Ca@G-N=UQ^{sdWl&|@f zjjxZRu}aUa(oj0+>6S<}ylduP2aM}S*%goZu2|GNdPj=Ya2kvBZAFwfXkFER5bj73TfQTKc4Obg^R7 z_wk#90Sz-aYB-%4MPLkmK>9{QfmI=d){&v#F>FcL5Zs$sfqp@ANn}v6xJd6%8O2)6y?g%^(wVF~#C*!E|x^GUXsJkna&qixzO5 zy1ViXhbtWgZ{h@@gzU)pYfk?v&=72D4U!59lfv?>OFgy2Hl#PaGb(xuG~UB}x2S$7 zg(fjR6K}%&lX5eZ?k@C(^})m?oI>{Kma(_eQ*Nnmvz=gAtR-V>cO=t=wk$=k;|dp~j#R?P3&P zPGVqlvp$H6Dy*s4@NJLiz=scelM+odj(*eDvw_IMIPh z0Bjazm)wi4@Tt$xsyLVU8^rl+HfDm;qz>?*zrM9N%(wmeg6zM%w7%KcP- zmrv?*T0gohr@>L6{?uuefQjYIQqU(f9cDB~t`yX~HVohlXE3uQqqPF_ii4_trDi&@ z9=mLJK?z)YW_^+8HXu2C?@d|<)9QhC2*Si<{GR%E5*WEL%oEVTw0xxa6Hgzo#Ps8% zL*ze{1+YR`Hh@jgkQ%29A&4G^xJFXm21t!RxbstJ@n$uTz|@)g7ecz zlOfI%i~S36dzg^%ak+`v56h^c{6Po!z#+Py4?0y{s54*!VXl?jK2w$Uowb!jT2TcK z|7Amto>9~cG6<@gbjo7*%H`)gnoBe)iC2IV^ag{5V_^#REPt74pETw?9?GJyx%c2B z=2J_dI4dO`E$VKvGpeK{LSCDo-yu#wa!~B7j&e{q-{!h-B5@EbmexvCS<>;9&C2wY zxtz1D-3Gh@8H@Tot$1?VL{R}%D6aMym@QW3k+U^|GRuWNbexg(n8_D~H?8dS%Y!Z2 z?;&`%webgRf|BmV+UgJ-_0-X%+rDSsb#`r*@zG55&TGrvAq=@++M)m>UM$U5vHfsInPJ5ewNSq1A|q*2TXsT{SGZ_o%!mPk+RvqhMZZP| z6cG&c1zb78=C#fD2fJmnTBLDL;xl|0c2^;_1Z)5uh7uoWwIfujy$}5Mk=GV~G^YVv z&(^=QG!?jU|MaW)!mlho!kBxz`3O!Ek`9`J?h`B>|0u&z!KsX zhW=gvYaqh>UC(bhhu|tLYcpNLQG=1E8S-G~u0xESf z(f_8cU8o(0#*SNA-;HBcVPK)CZZ62Bfphpa%L8C0&-Qk`=jiKRC-M$$!by(cO5R9@ z%MM}Nq7{v__0juB_L|}n<0^_(Omb}QJ!KuRtrs{?@ee7!#;v2JvTjql7GBB?1 zKEp3QyS<_FG`u|PwSu)=*^;z+a26Nkl_N_%N;WDKwv>(*O`VSq_MKiLyfO*YOQbAJ zQMFsgje#A~0C+iTk#o?ARq**w5B@cqhJMBkgjRl}<}Vw*)h0`>({E7@Gx-KcKTtjQ zXVB203ribcd`WBh*r>H!e^c=}&&98*{>=AFEwAq=UubG{sX5_5T&=W%Mj#@-Ta~+V z2tAc6zdcA~!ZZUVUaJz&>O&j5bUKeAoGPb`fUMbkXsZ9^em|KJHH32B^>&uphf!pT zJN1}vwgXM)D{_vIQ_*E$VM_|kGol;xUsKIOG21%4T0mlNXEQ-0IGazO zTtkEHse6W8q>_H5Acese7;iz9q(84+$?>C^c8>tQ2+nko?JfPTiJlZLQAh#cR#kmG z*>O*4&#_j7^qkr#Ct2sMpnqF}gC)Ai_t$PE(kNet26$2znk}c3LnxmnqVr@J$Yusj zn0pt z`JlN)V?G^}_v8J_%q~)SRh!Hee}jH`q^=UVE%Ec+QYxr!x6-)biXE=T6vuyQ_)tUH zhBF_DO80Ggp-`$WNUj~wAGjJI0^U{3qoM4naMNEHYsoxTc#b+fA-XRkQI*_hVM=-= z8$Y&z?I9g6WJSt$>Wz0p8wD8~sUIKe{=j*KosDUS5Oubh`gfIy-xm90?pW(T<1KRB zvr#kN)E3nVxqohL3Qw2pS|B3O(!Y96?#+L1l*t;iKLTMMf)DcBm){xBAuANZ(Ks+r zCAiCQ_1f)^@iWxpTnB*ontSq#i9S(W5WWhh7_&hiFBTRdyHR%7(#a5YuDj(Bw+$V1 z{f5(6u{_m)FTprYghvp*A~L&lq-AvXrO?QZI8ViFI5tGwo|cwbjSMawPF_rmXlJj7 z(sM;XEgjsPKNYDgs^_z;aX$74nMu~*!hQqJfE2SnIKi+^ghb`_9aD!Z+H2hjzb~-m z+C!XC>`ti~YOdE3NxaimC?^e7KAXMQeN8(3`}>;8$>zt1 z=?CKRo)>aq$IPEBx$GB=W7d2HtwC=2m{+@gKlG#x_19Zq5XvgL{f;7a)bD9Pas^Y6 za7WtX&#S#G1Wm2_P0?Aw{-_DY&}h?i1X|65LF*240U6~}oP)|%x z&nXI)twc&jI_1R%fL8NX${RVlm@N5nyV^>|!?usr^ZZ8ARzb}*46TI0tfoL3IPIL> za*Jo)FP~Fy3)~QU5L|)?rHT zx;Ab2#;*E>#>E7?p?%cohcTUjQQcC-IqS{WgP0Z49~FJ3-wRl;L9uR`uF-DpGsKjF zmUBUS<$2(?;N~c9Y=ahn= z3RbLICvdtt-e-iL9s2knSr|&pt)R`TSKQ>=WGI7cm%b@F9M`brwLqjx$F!1|?o)TQ z8j=jWG;Iw!mah}}qX=s|bbl9dP_R1tA=bqwwvEn*Wu#rzKU0ey87?2M?u;f;T4Fcj z5(S@7++0v}0K^***oIocSW26qw`=u}97-S%ipQqH>oE~|k(WSuaEE;l4C{=&xRKfM z%{7pG($TQYvYUmrk1a1f2RzQY?fg_f5<&h4?)~{|9ZBhNL$*}AAzR`*M4l8X{RuQ+ zV*0wB`j0~g7T4$seF|A#OQ1r(mSI6`2AR)nW(VIvAb&;74E4O& znJeGOqB@>qgb*LA7FKK`K@raL24lLv46!H-eOIHpsMhoW`_lGRP<_E9GV5Wn{6hQy7oQ%b-peq+2&#*ODwmr>jhjLrf3FE$E)e7MQdQS~udzw1 zNSznuHj_%+!W>kU!%f1)dG6%J(nId*l9+iIJ1vGdBw(|3gR(3GIBOVxdR;#pQCB%z zt$FeC>j+iXWqS7C-^Ly4$q;G>Fu@{`5Yo>QRQ#P;?qqaOOWWE4V7Vg{V3~nhlAhj_ z?R6!ZEHL}e-*P!Drjh>#Q5JU$Ls}vy+n;XvKMMEU9l0-e!D7={F3G1T8$&&8tq>mW zex2dy41S`r2d7LgJ4dWpz~big=qiNj=-R*L`olL+4=K-~?s}!BPM+gFUJ$R}qajdv zR%H)C5~{kVOI!&fh`i?-vgpaLVkQ2-{iw`%xp@BqPqg>`ZqRI*mWiSf$};H-gS{fR zx<3vP+#${<9g_h3tTgI>31zj<4{Q5~>;umFG@CL*OIAx8a}OoRXzHHP@l|wiJHjKLUFi*J)e8yZYJfAwP*+16`Jlb_ z``A9iYFeiaG5||>!cqFnWf}nxGLS+zTEm}$0uAL+UWc*HjZ++6J@cYoJ)Ipiv_*K;THzHKaf|;Gv8S+A@!{MIz7UFrO$D4m|8ZI5>IUQT)F6Yg7s5TK~gt^Fu&@| z?_kDj9(N#kM#8(j1i0H!yaN;yfkn2odTV_+gBr^{HFBHCU(MP`Um_G+19%vaw|L@j=f^p())8*z{O(+(Tg-RL@v><5 zl#wDi6Gvhi3B%VD5hlv7^{&q-JpdSQI=sd#%1;hupdF3WXH(hU8zo zsTtOb;NWr!N%zz?%X?FHNU|j;mSt&jo}Q&zo0pGfF*{UT6}9c9rQsZZ0GdK};~FB|8uUJEpj#+Yj6HFSvu1HHNxl zqQ@99OX*B(r_4wOs-Zp|%mREPt~Ka(tFJ^fSx-QEU?#--I3&X|Ga=b;dvje)j@%q&l+`Pp-5Ay}#mXO^r6)o=c}nqc>Z@*6^zFOKLM zR!oUKRvUh~sqTRELeMM(98a0%qscq{!BW_9lXEH=T(|(itX(ny*9YgIkpd<5;m(No z-EO+6@`j%!GQ>HeRC;1P>L_`|ME2&UTz>}lse7%{6B0e5F#+^`twhBxUsP#q41Ls; zwS1Rf(v+qc&Mb%oAVUNxG#H>Lx|sffTTggkUIHZsB<8~j!XasBS9u2VLt#i!&A)8l z|BIoC1!t4$Tbm6Z?Gs23Tbf-!cwi>5y~z4jO65exNPZyx>?a`jV?~a>_BD~bvjiAI z+ij$0)(S7QS@hxS>JW|yrIhc0EMe5;kcLmIli)sAa1727C$jLn{9c8q>4V!f5Mcq^ zO!2EktO5av!@P?aFXuHL9Th{T6AkBOVVAS56_Z4rDEPim3jB-GB&a_&_VS z`FLmh(?(VZDw~@zb?wsg9(7AV02<)d{9XsH8#j_dsq)f600?54qz?Am!=B2d7)hh{ z27B%DpA5LU4eU*4IKM zLbJGaQ)L?Sx7FD#2Q$V!urMV2O9z~dMhK40?bJ{>G5Q?;zf?Z-9cyWW(?*j2D1?>T z!RJ+zzOeYr1oaDlTke@9OVsm=0)trEUiS#oKKd7Yjd%kjevA*(RKq37ao%U5dCe%; z>sKl($NSt@SwKj^u5<+UB-uQ%iJSBnMQf=Tjb>+I?Kl*=8LFh|s{^JM0ntp zX*fJ~=nHGtc%OHIj~Pb<&hn-W^c)ZAkU_*5Z4>z?a8WVYSG?A*owql z8Ec;%nW;^wwE_J0++z*h`kP-xzrbGSdeeU|YyY5{;1U8AQJn@!qYkJ{Yr%N)Nf4&_ z(Aou{l4}!Q=$!TjNFJnf5_JdF$inB=W3RNbk7jwpTWdPPgn_rhtnJ{IB?7Vm{upqn ze2*~Fdqu4bS>@#;v{mlFQ3_v5_dJep0!n_@k5!^@qH#VSpGPxy4PmfEH?=EWKN@nS zx~IX6qWnQ0_wJpi^JTf?Cg^8}iplsHxskF5S3&4R2(#Ro#GahfW@3JDdVm5-@%N$8 zPntvEQ7zhmIMsTF9O%R;oF0+_sUEWcV~!|*>zs?HUd4~vsfZ%ftppVf6lA2bUAD$3 zfOvVxJy#X|JAZ0=l%pI%>JdSYnN0F|;A*^O-1}fk_hq4UfK3 zpN`hXYIzPnV|WSvqT4eI&|eksMzp4Z@U|pe>dZ;vlvv{>W~ni$C%t;!(4UK5+d25p1^|7(YAvpeP4 z-V}Fz1*gtNKf;OwhFac+)Q;Ma;wPpJCtOFeFga1?(3R_{Gt<9iZ?@)giHF>jf z^!OXY?5aH7VnsF|2^PIWi=@S!M<%*bV4fRxK4ZugjN(pVi9#fr7r>cM;i}ED?{r^& zO+n7{c<2<%AAddBbt@$KoKq!LkM7(95gz{o_X@TX<=wlUtU0%RIlZdeG7hxnxZ|Jh zT9fzx{uZ{-wP;+j9rGX2n1Zddev~Qdo;}syaiP2cTuk}dG3mV9{D6^}P9v)vF2uuM$9xs+vPPCx2xhpOtO#{NTh>2n4e1 zIOPwO5wEYIKWqAG`np(ADl5{vl3bM%>}aD`%`tySR`)fL#{+)Mofw&_0(Jnd@1Xa3>mn5}z53{({15Fl$3Mt*lzpndqSA`86 zd|11OpcWf}gy_f4?SJQm9I-(4lz zWhEN>Kdg>+uG6%fNUbQ3N@P#I(fD~eEkPafFOggNwX=ilK1rmx0r!AN*5CoI271gS z_?_6?CLElTmx+Pe&OdM-@*_SE=Eap(pN{Q4Oi(j+(v%0XQmS`eRK;2Ah4uQylv)~G zG?PCpkNM1zaPt8vc5b;<$Rz-%qCPfrJNy&WBRU~Frp8+LhfUTTCv>^4RAdim1C(gi zllrVd8cGb&ZPQU^`5%NkYId0m`a;48tB|m@4%%qFDk?z<*LuTcDQ~}_t`7he-MQqqTUtn3c8iW}3FsVn?pz1)yOcxCeya&?#t-Jf$3Br5yP2#2B(< zN#oMQe_v|)7lp6(L<7q!LdpAlVtYyc)#NYwWQ^V4M4ZoO?O?P0X`#R{wK2&u#aMf8 zGPNL)sH|k5Z^{p1a{eicR*{BJnOX7eGTl_-9Sm&<2015-pJHHLAXt zT;*-fKQj$tSr?fQcOA(6t&Jm}ROw{%pNjokOT(L+;iLZtu7Da=Eh}LwBlM3bF<5<6 zz+9y3Us3@O4I;IDAyyF(2DTKTx{gV828J~a~_}Os1BEMqTV!RbQBc7I)D)V=)P2ptsCG*G98BN#69u+ zrh0JR;&zDk`u@7)&Ye^TvmY}Dr&$t1RLHE2T|eP_lhwpZ*20+IhDmBo)ej;l%m%!7 z)8J>*KQN>^Yrrd5BuW#!z{pM6(~c7fw!@eCb^HW zXShCNQuACsqOn&S)*T?fZ_5_gZAZ6Cm#fJ}D+pmlVgSn9)7&HB`ZEYVTY3~chbcZk z`VUvOHzy?;r)Y~4${`c2v2FoGI;_{K(*2fTN`amj(;ql9{6BDhzb=ZOE$;H3!~bbh z{8VK6r2C|HX8L+gi0QfB-oYmcPp|8Uv5$6IZsf1jyz9ixERz|RPX8wRd(BSG8k5a| z&5%%2B%r85sl|Qjn7Ez_GgYgY$>}nTo})aA(7y)Fzsvq!i=mIz{|og~+}Tg6NZ3XH zLkIG96sfo5{=m_be#DWn`rq2aU?4u~FTD&e&s{s}7X`8Bd4J%bnA|A2b+L1*k>U%% zUB8;1O8;B#J!s%=@(tiP(}C$uKL~t zHhZwqr)wNN#H5Vh{L`Z(Rvp0KPQXUCegAiC%zbq8|9LuPx-Vm)&mi`@)9+1Z=!>neZ$^SUr?ExBD!oD0&K+{wC5(>mM`Pwy?R)BL)Jl}L zz;oEz+RXclocaa(6OF%~nLk|Q1!bWZSn@u@c%aFpbs(8JDZa2NXt$Am2GcP(f;xb!fLuyM+F z`_@!XTP~C(&s$UF8$uAt{07i7On9&u##k3ZSaOAg8T$$i<)D&jgEg$naFs{;%kYU( zkh`;>j)u0M>W*WtH@_>48dL3OGKJGcZtITk=d$oonalu_>rm*lEtUx{WhX(fmHBu9 zU?7t_-B&YB|BLDhn?k2l$9uOGC(#o2m{alAgKHhUoA}8(7kk1Jh{)EsOmn;t-56_? z6S0a$!lfpmSd>d~6GtWg4}s*5zd+pnuA|x4NQs*b%WmXJeMudw=qE-;MtllYVz%)p z>TkE!-4fZ~SQ}*Y5s$c)HOfN|8ylCM@HOkUkv&s=J!goGL|-qRy33#G?Grx+(qz%@ z+Qzo=?DyF~d}d$Fk<@;p-8A4k-`bfXOe0zymMcb*&+Sz<1RrH|o5%D^kJxb2KUVNy z!y)tt3{|N876r7cX!F?elgbG4H7Q>x9@CWWSY|+fk=>bHuJ(9Mt!O=0$BwaZM01Js z69DK#*DQauG`&^>X^Q-yC>wvaD%b!Q&&kNPd7IC_c48Qmgd--*bx4R+qVhTNbo&y;oyFF98&Fh-Pkn z%ZhZ*p+vjBr=~`H`Ehi0tKc=?7U_4vBlW5e8_u@&7}mf%)x-|Hs)0%;QPrF>`*g@L z-iIJNol#zFLd{~D)@`I?#4E(4`?-;{K1vym0J(5ALoF{ug^t^V*@HyNtUAny zM2CQqU0y@sICm+4`O*eisHws`c}3=m85B~K(ymq>;CqS#n9&BGKKf-w^%jA~56ysv z66)Qto=jH{oJwOAd@q>%c_cU;cVoL(arZj(?!LcTHDW2QM_pOYguNroYzH5E4I&wm|r09!-NK|AD%JEe&qGV ziT1t|WB0qAK~rpjes_0U8vOK!kIl}&bCsS#_Ok}K3H7~|9GQ>8b{+Hu%=*Z}6LC=f z_!yt_zq`mVuMn>kRlU;-QcU&@G7jeY^k9N@Y{B`!<2~%GSJkeNV$%Y~^zxz0eu72T zPed$0p6#vi*JQ8q+@-&bawkDE0-0=o$HA}7dM%tCXK@pWs3Iij ziI^_nbSUKJgi2?byS{jYI5im#cdZs?tI8bUGYYAWD1M6|V7Ub$L};T(n`C&n8Z#_0 z0A@=sJO)&Q4vu@o?E9FF9jz5KOPaz|ihB!`T&_CSh=>Dxoe;CoM0 zR(9+xe0o`ODzthbuD;D@{flMw+d1%DiC^d6;y<`c`cAyUh%slz>Zo&9Dv+Zqi|`1&oi(a&4?@pcP`xbZSIk`J zoJD26;LhrFB*A(+8V}b4_2WfSUwMOYL>f45)sA?1P;zgR{%TM*98EfW=7)Qo&7u5K zK@IU-NWbQXtg-$Vi#(EIB}1~NN6`C}G>u~GYbF&gzucUgnGt7l4~PS{pKBGQv0^E0 zOD7lli1$<0Xo#LWPX1xAyhW8ED`kGTY4P^y;Y#sg*ZBlOhxX|KV+>q4;1OcssV&Md zQLv3e?&^?fC@&?5L*;A3+;@LBzvfMC>S=3H;Bo7du$xl9r2~E_ZWa(JK1E5Q(NqR? zgeF>!Aw7;4=DQsJ=#)CTom5-y04OS#J+Fq0JUEnA(mgPXn-dlUjm;>mc7wr}-$