diff options
320 files changed, 25624 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..61a36eb2 --- /dev/null +++ b/Makefile @@ -0,0 +1,319 @@ + ############################################################################# + # Copyright (c) 2017 Cisco and/or its affiliates. + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at: + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + ############################################################################## + +DISTILLERY_VERSION=2.0 + +default.target: help + +all: init_depend install-all + +############################################################## +# Variables +# +# Set some variables +DISTILLERY_STAMP=.distillery.stamp +REBUILD_DEPENDS= + +############################################################## +# Load the configuration +# +# For more information please see config.default.mk +# +DISTILLERY_CONFIG_DIR ?= config + +##DISTILLERY_DEFAULT_CONFIG ?= ${DISTILLERY_CONFIG_DIR}/config.mk +##DISTILLERY_LOCAL_CONFIG ?= ${DISTILLERY_CONFIG_DIR}/local/config.mk +DISTILLERY_USER_CONFIG ?= ${DISTILLERY_CONFIG_DIR}/config.mk + +ifneq (,$(wildcard ${DISTILLERY_USER_CONFIG})) + include ${DISTILLERY_USER_CONFIG} + REBUILD_DEPENDS+=${DISTILLERY_USER_CONFIG} +else + DISTILLERY_USER_CONFIG+="[Not Found]" +endif + +ifneq (,$(wildcard ${DISTILLERY_LOCAL_CONFIG})) + include ${DISTILLERY_LOCAL_CONFIG} + REBUILD_DEPENDS+=${DISTILLERY_LOCAL_CONFIG} +endif + +include ${DISTILLERY_DEFAULT_CONFIG} + + +############################################################## +# Set the paths +# +# PATH: add our install dir, build dependencies and system dependencies +# LD_RUN_PATH: add our install dir + +export PATH := $(DISTILLERY_INSTALL_DIR)/bin:$(DISTILLERY_TOOLS_DIR)/bin:$(PATH) +#export LD_RUN_PATH := $(DISTILLERY_INSTALL_DIR)/lib +#export LD_LIBRARY_PATH := $(DISTILLERY_INSTALL_DIR)/lib +export CCNX_HOME +export FOUNDATION_HOME + + +############################################################## +# Modules +# +# Load the modules config. Please refer to that file for more information +DISTILLERY_MODULES_DIR=${DISTILLERY_CONFIG_DIR}/modules + +# The modules variable is a list of modules. It will be populated by the +# modules config files. +modules= +modules_dir= + include config/modules/000-distillery-update.mk + include config/modules/000-gitModule.mk + include config/modules/001-modules.mk + include config/modules/002-cmake-modules.mk + include config/modules/002-make-modules.mk + include config/modules/100-distillery.mk + include config/modules/110-longbow.mk + include config/modules/120-libparc.mk + include config/modules/210-libccnx-common.mk + include config/modules/220-libccnx-transport-rta.mk + include config/modules/230-libccnx-portal.mk + include config/modules/510-Metis.mk + include config/modules/610-libicnet.mk + include config/modules/610-libdash.mk + +# Load user defined modules +DISTILLERY_USER_MODULES_DIR=${DISTILLERY_USER_CONFIG_DIR}/modules +ifneq (,$(wildcard ${DISTILLERY_USER_MODULES_DIR})) + include ${DISTILLERY_USER_MODULES_DIR}/*.mk +else + DISTILLERY_USER_MODULES_DIR+="[Not Found]" +endif + +ifdef ${DISTILLERY_LOCAL_MODULES_DIR} + include ${DISTILLERY_LOCAL_MODULES_DIR}/*.mk +else + DISTILLERY_LOCAL_MODULES_DIR="[Undefined]" +endif + + +############################################################## +# Build variables and rules +# + +# We're going to create lists of targets as convenience +modules_clean=$(modules:=.clean) +modules_check=$(modules:=.check) +modules_step=$(modules:=.step) +modules_average-coverage=$(modules:=.average-coverage) + +# These are the basic build rules. They will call the module specific rules +install-all: install-directories pre-requisites ${modules} + +#distillery-sync: distillery-update ${DISTILLERY_ROOT_DIR}/tools/bin/syncOriginMasterWithCCNXUpstream +# @${DISTILLERY_ROOT_DIR}/tools/bin/syncOriginMasterWithCCNXUpstream + +init_depend: + ./scripts/init.sh ${ABI} ${DISTILLERY_INSTALL_DIR}; +android_metis: + ./scripts/compile_androidmetis.sh +android_metis_debug: + ./scripts/compile_androidmetis.sh DEBUG +android_iget: + ./scripts/compile_androidiget.sh +android_iget_debug: + ./scripts/compile_androidiget.sh DEBUG + +clobber: distclean + @rm -rf ${CONFIGURE_CACHE_FILE} + @rm -rf ${DISTILLERY_INSTALL_DIR}/bin + @rm -rf ${DISTILLERY_INSTALL_DIR}/lib + @rm -rf ${DISTILLERY_INSTALL_DIR}/include + @rm -rf ${DISTILLERY_INSTALL_DIR}/share + @rm -rf ${DISTILLERY_INSTALL_DIR}/etc + @rm -rf ${DISTILLERY_XCODE_DIR} + @rm -rf .*.stamp + +clean: ${modules_clean} + @rm -rf report.txt + +distclean: + @rm -rf ${DISTILLERY_BUILD_DIR} + @rm -rf report.txt + +#distillery-update: +# @echo "Fetching Distillery..." +# @git fetch --all +# @git pull + +distillery-upstream: + git remote add ${DISTILLERY_GITHUB_UPSTREAM_NAME} ${DISTILLERY_GITHUB_UPSTREAM_REPO} + +check: ${modules_check} + +step: ${modules_step} + +# From Distillery, 'make coverage' actually runs the summary version of coverage +# You can also run 'make <module>.coverage' to get the output showing each file and its coverage. +coverage: ${modules_average-coverage} + +dependencies: + @${MAKE} -C dependencies + +dependencies.clean: + @${MAKE} -C dependencies clean + +dependencies.clobber: + @${MAKE} -C dependencies clobber + +pre-requisites: + +help: + @echo "Simple instructions: run \"make update step\"" + @echo + @echo "---- Basic build targets ----" + @echo "make help - This help message" + @echo "make info - Show basic information" + @echo "make status - Show status of modules" + @echo "make update - git clone and pull the different modules to the head of master" + @echo "make sync - fetch all remotes, merge upstream master, push to origin master" + @echo "make step - Module by module: configure, compile and install all software" + @echo " in the install directory (see make info) and run tests" + @echo "make all - Configure, compile and install all software in DISTILLERY_INSTALL_DIR" + @echo "make check - Run all the tests" + @echo "make clobber - Clean the build, remove the install software" + @echo + @echo "make sanity - Run simple sanity checks to test that the build is functional" + @echo + @echo "make coverage - Show the average coverage of each module." + @echo "make <module>.coverage - Show the coverage of each file in the specified module." + @echo + @echo "---- Advanced targets ----" + @echo "make nuke-all-modules - DANGEROUS! Clean all the modules to git checkout (git clean -dfx)" + @echo " - You will lose all uncommitted changes" + @echo "make clean - Clean the build" + @echo "make distclean - Distclean the build" + @echo "make *-debug - make a target with DEBUG on (e.g. all-debug or check-debug)" + @echo "make *-release - make a target with RELEASE on (optimized)" + @echo "make *-nopants - make a target with NOPANTS on (no validation - use at your own risk)" + @echo + @echo "---- IDE support targets ----" + @echo "make xcode - Create xcode projects [only works on Mac]" + @echo "make MasterIDE.xcode - Makes an xcode uber-project (based on all-debug) that contains" + @echo " - the various sub-mdules" + @echo "make MasterIDE.xcodeopen - Makes MasterIDE.xcode and the starts xcode" + @echo "make MasterIDE.clionopen - Creates an uber CMakeLists.txt and starts CLion with the necessary" + @echo " - environment for development" + @echo + @echo "---- Basic module targets ----" + @echo "Module Directory = ${MODULES_DIRECTORY_DEFAULT}" + @echo "Modules Loaded = ${modules}" + @echo "GitModules Loaded = ${gitmodules}" + @echo "Per-module targets: \"Module\" \"Module.distclean\" \"Module.nuke\" \"Module-debug\"" + + +${DISTILLERY_STAMP}: ${REBUILD_DEPENDS} + touch $@ + +debug-%: export CMAKE_BUILD_TYPE_FLAG = -DCMAKE_BUILD_TYPE=DEBUG +debug-%: export DISTILLERY_BUILD_NAME = -debug +debug-%: + @${MAKE} $* + +%-debug: debug-% ; + +release-%: export CMAKE_BUILD_TYPE_FLAG = "-DCMAKE_BUILD_TYPE=RELEASE" +release-%: export DISTILLERY_BUILD_NAME = -release +release-%: + @${MAKE} $* + +%-release: release-% ; + +nopants-%: export CMAKE_BUILD_TYPE_FLAG = "-DCMAKE_BUILD_TYPE=NOPANTS" +nopants-%: export DISTILLERY_BUILD_NAME = -nopants +nopants-%: + @${MAKE} $* + +%-nopants: nopants-% ; + +releasedebug-%: export CMAKE_BUILD_TYPE_FLAG = "-DCMAKE_BUILD_TYPE=RELWITHDEBINFO" +releasedebug-%: export DISTILLERY_BUILD_NAME = -releasedebug +releasedebug-%: + @${MAKE} $* + +%-releasedebug: releasedebug-% ; + +install-directories: + @mkdir -p ${DISTILLERY_INSTALL_DIR}/include + @mkdir -p ${DISTILLERY_INSTALL_DIR}/lib + @mkdir -p ${DISTILLERY_INSTALL_DIR}/bin + +Distillery.report: + @echo '###################################' + @echo 'Distillery report' + @echo "#" `date "+%Y-%m-%d %H:%M:%S"` + @echo "#" `uname -sr` "-" `uname -pm` + @echo "#" `uname -n` + @echo "#" PATH=${PATH} + + @git status + @git log -1 + @git diff -U1 + +report.txt: + $(MAKE) report > report.txt + @cat report.txt + +distillery.checkout.error: + @echo + @echo =========================================================== + @echo + @echo DISTILLERY ERROR: You have not checked out a repository! + @echo Please make sure to run \"make update\" at least once + @echo + @echo Otherwise there is a misconfigured module, + @echo please check the module config files at .distillery/modules + @echo + @echo =========================================================== + @echo + + +info: + @echo "############ Distillery Info ##################" + @${MAKE} env + + +# env produces shell interpretable output. It is read by some scripts. +# DO NOT ALTER THE FORMAT +env: + @echo DISTILLERY_ROOT_DIR=${DISTILLERY_ROOT_DIR} + @echo DISTILLERY_SOURCE_DIR=${DISTILLERY_SOURCE_DIR} + @echo DISTILLERY_BUILD_DIR=${DISTILLERY_BUILD_DIR} + @echo DISTILLERY_DEFAULT_CONFIG=${DISTILLERY_DEFAULT_CONFIG} + @echo DISTILLERY_LOCAL_CONFIG=${DISTILLERY_LOCAL_CONFIG} + @echo DISTILLERY_USER_CONFIG=${DISTILLERY_USER_CONFIG} + @echo DISTILLERY_MODULES_DIR=${DISTILLERY_MODULES_DIR} + @echo DISTILLERY_LOCAL_MODULES_DIR=${DISTILLERY_LOCAL_MODULES_DIR} + @echo DISTILLERY_USER_MODULES_DIR=${DISTILLERY_USER_MODULES_DIR} + @echo DISTILLERY_INSTALL_DIR=${DISTILLERY_INSTALL_DIR} + @echo DISTILLERY_DEPENDENCIES_DIR=${DISTILLERY_DEPENDENCIES_DIR} + @echo DISTILLERY_EXTERN_DIR=${DISTILLERY_EXTERN_DIR} + @echo DISTILLERY_TOOLS_DIR=${DISTILLERY_TOOLS_DIR} + @echo DISTILLERY_GITHUB_URL=${DISTILLERY_GITHUB_URL} + @echo DISTILLERY_GITHUB_URL_USER=${DISTILLERY_GITHUB_URL_USER} + @echo DISTILLERY_GITHUB_UPSTREAM_URL=${DISTILLERY_GITHUB_UPSTREAM_URL} + @echo CCNX_DEPENDENCIES=${CCNX_DEPENDENCIES} + @echo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} + @echo LD_RUN_PATH=${LD_RUN_PATH} + @echo CCNX_HOME=${CCNX_HOME} + @echo PATH=${PATH} + +.PHONY: dependencies diff --git a/README.md b/README.md new file mode 100644 index 00000000..e0c87cf0 --- /dev/null +++ b/README.md @@ -0,0 +1,112 @@ +############################################################################# +# Copyright (c) 2017 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################## + +Android SDK + +This is the CCNx Distillery software distribution for Android. It is in charge of pulling +together all the necessary modules to build a full CCNx software suite for Android. + + +## Quick Start ## + + +Clone this distro + +``` +git clone -b androidsdk/master https://gerrit.fd.io/r/cicn androidSdk +cd androidSdk +``` + +Export Android Sdk path + +``` +export SDK_PATH=/Users/angelomantellini/Library/Android/sdk +``` + +Export Android Ndk path + +``` +export SDK_PATH=/Users/angelomantellini/Library/Android/sdk/ndk-bundle +``` + +Export Android Android CMAKE path + +``` +export SDK_PATH=/Users/angelomantellini/Library/Android/sdk/cmake/3.6.3155560/bin +``` + +If the previous variables are not set, Sdk, Ndk and CMake for android will be downloaded + +Compile everything (dependencies and CCNx modules) + +``` +make all +``` + +The CCNx software will be installed in androidSdk/usr + + +To compile Metis for android app (ccnxandroidmetis) + +``` +make android_metis +``` + +To install the application run + +``` +adb install -r ccnxandroidmetis/app/build/outputs/apk/app-armeabi-v7a-release.apk +``` + +To compile IGet for android app (ccnxandroidmetis) + +``` +make android_iget +``` + +To install the application run + +``` +adb install -r iget_android/app/build/outputs/apk/app-armeabi-v7a-release.apk +``` + + +## Platforms ## + +- Android + + + +## Getting Started ## + +To get simple help run `make`. This will give you a list of possible targets to +execute. You will basically want to download all the sources and compile. + +Here's a short summary: + +- `make init_depend` - Compile the CCNx dependencies each module in sequence +- `make all` - Compile all the software +- `make distclean` - Delete build directory (but not built executables) +- `make clobber` - Delete build directory and install directories. WARNING - If you configure this to install on a system directory this may delete system files! +- `make android_metis` - Compile the Metis for Android +- `make android_metis_debug` - Compile the Metis for Android in debug mode +- `make android_iget` - Compile the Metis for Android +- `make android_iget_debug` - Compile the Metis for Android in debug mode + + +## Configuration ## + +Distillery can be configured in multiple ways. Please check the config directory (specifically `config/config.mk`) for more information. + diff --git a/ccnxandroidmetis/.gitignore b/ccnxandroidmetis/.gitignore new file mode 100644 index 00000000..b1acfd93 --- /dev/null +++ b/ccnxandroidmetis/.gitignore @@ -0,0 +1 @@ +local.properties
\ No newline at end of file diff --git a/ccnxandroidmetis/MetisControl/build.gradle b/ccnxandroidmetis/MetisControl/build.gradle new file mode 100644 index 00000000..a1e8ed15 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/build.gradle @@ -0,0 +1,52 @@ + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion '25.0.0' + + defaultConfig { + applicationId "com.parc.ccnx.ccnxsdk" + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + dexOptions { + preDexLibraries true + javaMaxHeapSize "2g" // Use gig increments depending on needs + //incremental true + } + + signingConfigs { + release { + storeFile file("metis.keystore") + storePassword "icn_metis" + keyAlias "metis" + keyPassword "icn_metis" + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + } + } +} + + +dependencies { + compile project(':ccnxsupportlibrary') + compile fileTree(include: ['*.jar'], dir: 'libs') + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.android.support:design:23.4.0' + compile 'com.android.support:support-v4:23.4.0' +} diff --git a/ccnxandroidmetis/MetisControl/metis.keystore b/ccnxandroidmetis/MetisControl/metis.keystore Binary files differnew file mode 100644 index 00000000..3435fccd --- /dev/null +++ b/ccnxandroidmetis/MetisControl/metis.keystore diff --git a/ccnxandroidmetis/MetisControl/proguard-rules.pro b/ccnxandroidmetis/MetisControl/proguard-rules.pro new file mode 100644 index 00000000..c51dd9b5 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/walendo/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/ccnxandroidmetis/MetisControl/src/main/AndroidManifest.xml b/ccnxandroidmetis/MetisControl/src/main/AndroidManifest.xml new file mode 100644 index 00000000..272d9270 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/AndroidManifest.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.metis.ccnx.ccnxsdk.metiscontrol"> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + <activity + android:name=".ForwarderStatusActivity" + android:label="@string/app_name" + android:screenOrientation="portrait" + android:theme="@style/AppTheme.NoActionBar"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <service + android:name=".MetisService" + android:enabled="true" + android:exported="true"> + + </service> + + </application> + + + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission + android:name="android.permission.READ_EXTERNAL_STORAGE" + android:maxSdkVersion="21" /> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + + +</manifest> + + <!-- android:process=":metis_process" --> diff --git a/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/ForwarderStatusActivity.java b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/ForwarderStatusActivity.java new file mode 100644 index 00000000..7bc6bdb3 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/ForwarderStatusActivity.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.metis.ccnx.ccnxsdk.metiscontrol; + +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +public class ForwarderStatusActivity extends AppCompatActivity implements + MetisStatusFragment.OnFragmentVisibleListener { + + private static final String TAG = "CCNX FSA"; + + private SectionsPagerAdapter mSectionsPagerAdapter; + + private ViewPager mViewPager; + private Fragment mVisibleFragment; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_forwarder_status); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + mViewPager = (ViewPager) findViewById(R.id.container); + mViewPager.setAdapter(mSectionsPagerAdapter); + + + final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + + assert fab != null; + fab.setVisibility(View.GONE); + + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mVisibleFragment != null) { + if (mVisibleFragment instanceof IMetisAddNewItem) { + IMetisAddNewItem fragment = (IMetisAddNewItem) mVisibleFragment; + fragment.showAddNewItemDialog(); + } + } + } + }); + + } + + + @Override + + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_forwarder_status, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + int id = item.getItemId(); + + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + public static class PlaceholderFragment extends Fragment { + + private static final String ARG_SECTION_NUMBER = "section_number"; + + public PlaceholderFragment() { + } + + public static PlaceholderFragment newInstance(int sectionNumber) { + PlaceholderFragment fragment = new PlaceholderFragment(); + Bundle args = new Bundle(); + args.putInt(ARG_SECTION_NUMBER, sectionNumber); + fragment.setArguments(args); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_forwarder_status, container, false); + TextView textView = (TextView) rootView.findViewById(R.id.section_label); + textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); + return rootView; + } + } + + public class SectionsPagerAdapter extends FragmentPagerAdapter { + + public SectionsPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + return MetisStatusFragment.newInstance(position + 1); + } + + @Override + public int getCount() { + return 1; + } + + @Override + public CharSequence getPageTitle(int position) { + return "SECTION 1"; + } + + + } + + public void onFragmentVisible(Fragment fragment) { + Log.d(TAG, "***** PAGE: " + fragment + " is now showing."); + mVisibleFragment = fragment; + + final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + + if (fragment instanceof IMetisAddNewItem) { + fab.setVisibility(View.VISIBLE); + } else { + fab.setVisibility(View.INVISIBLE); + } + + String appName = getResources().getString(R.string.app_name); + + if (fragment instanceof IMetisNamedFragment) { + appName += " // " + ((IMetisNamedFragment) fragment).getFragmentName(); + } + + setTitle(appName); + + } + + + +} diff --git a/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/IMetisAddNewItem.java b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/IMetisAddNewItem.java new file mode 100644 index 00000000..549f4a68 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/IMetisAddNewItem.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.metis.ccnx.ccnxsdk.metiscontrol; + +public interface IMetisAddNewItem { + + void showAddNewItemDialog(); + +} diff --git a/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/IMetisNamedFragment.java b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/IMetisNamedFragment.java new file mode 100644 index 00000000..bc4cddca --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/IMetisNamedFragment.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.metis.ccnx.ccnxsdk.metiscontrol; + +public interface IMetisNamedFragment { + public String getFragmentName(); +} diff --git a/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisConstants.java b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisConstants.java new file mode 100644 index 00000000..7b9046ae --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisConstants.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.metis.ccnx.ccnxsdk.metiscontrol; + +public class MetisConstants { + + public static final int MetisDefaultListenerPort = 9695; + + public static final String MetisModule_Control = "Control"; + public static final String MetisModule_FIB = "FIB"; + public static final String MetisModule_PIT = "PIT"; + public static final String MetisModule_ContentStore = "ContentStore"; + public static final String MetisModule_TransportLinkAdapter = "TransportLinkAdapter"; + + public static final String CCNxNameMetis_Forwarder = "ccnx:/local/forwarder"; + public static final String CCNxNameMetis_Control = CCNxNameMetis_Forwarder + "/" + MetisModule_Control; + public static final String CCNxNameMetis_FIB = CCNxNameMetis_Forwarder + "/" + MetisModule_FIB; + public static final String CCNxNameMetis_PIT = CCNxNameMetis_Forwarder + "/" + MetisModule_PIT; + public static final String CCNxNameMetis_ContentStore = CCNxNameMetis_Forwarder + "/" + MetisModule_ContentStore; + ; + public static final String CCNxNameMetis_Link = CCNxNameMetis_Forwarder + "/" + MetisModule_TransportLinkAdapter; + + // General Commands + public static final int MetisCommandSegment = 3; + public static final String MetisCommand_Lookup = "lookup"; + public static final String MetisCommand_Add = "add"; + public static final String MetisCommand_List = "list"; + public static final String MetisCommand_Remove = "remove"; + public static final String MetisCommand_Resize = "resize"; + public static final String MetisCommand_Set = "set"; + public static final String MetisCommand_Quit = "quit"; + public static final String MetisCommand_Run = "spawn"; + public static final String MetisCommand_Stats = "stats"; + + public static final String MetisCommand_LogLevel = "level"; + public static final String MetisCommand_LogDebug = "debug"; + public static final String MetisCommand_LogInfo = "info"; + public static final String MetisCommand_LogError = "error"; + public static final String MetisCommand_LogAll = "all"; + public static final String MetisCommand_LogOff = "off"; + public static final String MetisCommand_LogNotice = "notice"; + ; + + // Module Specific Commands + public static final String CCNxNameMetisCommand_LinkConnect = CCNxNameMetis_Link + "/" + MetisCommand_Add; // create a connection to interface specified in payload, returns name + public static final String CCNxNameMetisCommand_LinkDisconnect = CCNxNameMetis_Link + "/" + MetisCommand_Remove; // remove a connection to interface specified in payload, by name + public static final String CCNxNameMetisCommand_LinkList = CCNxNameMetis_Link + "/" + MetisCommand_List; // list interfaces + + public static final String CCNxNameMetisCommand_FIBLookup = CCNxNameMetis_FIB + "/" + MetisCommand_Lookup; // return current FIB contents for name in payload + public static final String CCNxNameMetisCommand_FIBList = CCNxNameMetis_FIB + "/" + MetisCommand_List; // list current FIB contents + public static final String CCNxNameMetisCommand_FIBAddRoute = CCNxNameMetis_FIB + "/" + MetisCommand_Add; // add route for arguments in payload + public static final String CCNxNameMetisCommand_FIBRemoveRoute = CCNxNameMetis_FIB + "/" + MetisCommand_Remove; // remove route for arguments in payload + + public static final String CCNxNameMetisCommand_PITLookup = CCNxNameMetis_PIT + "/" + MetisCommand_Lookup; // return current PIT contents for name in payload + public static final String CCNxNameMetisCommand_PITList = CCNxNameMetis_PIT + "/" + MetisCommand_List; // list current PIT contents + + public static final String CCNxNameMetisCommand_ContentStoreResize = CCNxNameMetis_ContentStore + "/" + MetisCommand_Resize; // resize current content store to size in MB in payload + + public static final String CCNxNameMetisCommand_Quit = CCNxNameMetis_Control + "/" + MetisCommand_Quit; // ask the forwarder to exit + public static final String CCNxNameMetisCommand_Run = CCNxNameMetis_Control + "/" + MetisCommand_Run; // start a new forwarder instance + public static final String CCNxNameMetisCommand_Set = CCNxNameMetis_Control + "/" + MetisCommand_Set; // set a forwarder variable + public static final String CCNxNameMetisCommand_Stats = CCNxNameMetis_Control + "/" + MetisCommand_Stats; // get forwarder stats +}; diff --git a/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisService.java b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisService.java new file mode 100644 index 00000000..ee5ef5be --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisService.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.metis.ccnx.ccnxsdk.metiscontrol; + +import android.app.Notification; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; + +import com.metis.ccnx.ccnxsupportlibrary.Metis; +import android.widget.TextView; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.Socket; + +public class MetisService extends Service { + private final static String TAG = "CCNx.MetisService"; + + private static Thread sForwarderThread = null; + + public MetisService() { + } + + private String path; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + + Metis metis = Metis.getInstance(); + if (!metis.isRunning()) { + Log.d(TAG, "Starting Metis"); + String path = null; + if (intent != null && intent.getExtras() != null && intent.getExtras().get("path") != null) { + + path = intent.getExtras().get("path").toString(); + startForwarder(intent, path); + } else { + //TextView mPathTextView = (TextView) view.findViewById(R.id.pathText); + startForwarder(intent, "/storage/emulated/0/MetisConf/metis.cfg".toString()); + } + } else { + Log.d(TAG, "Metis already running."); + } + // Tell Android we want it restarted if it dies or is killed by the OS. + return Service.START_STICKY; + } + + + @Override + public void onDestroy() { + //get Metis instance + Metis metis = Metis.getInstance(); + Log.d(TAG, "Destroying"); + if (metis.isRunning()) { + Log.d(TAG, "Trying to stop Metis: " + metis.toString()); + metis.stop(); + stopForeground(true); + } + super.onDestroy(); + } + + protected Runnable mForwarderRunner = new Runnable() { + + //private String path; + @Override + public void run() { + Metis metis = Metis.getInstance(); + + metis.start(path); + } + + + }; + + + private void startForwarder(Intent intent, String path) { + + int NOTIFICATION_ID = 12345; + + Metis metis = Metis.getInstance(); + if (!metis.isRunning()) { + this.path = path; + sForwarderThread = new Thread(mForwarderRunner, "CCNx.MetisRunner"); + sForwarderThread.start(); + metis.isRunning(); + Intent resultIntent = new Intent(this, ForwarderStatusActivity.class); + + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0); + + Notification notification = new Notification.Builder(getApplicationContext()) + .setContentTitle(getString(R.string.app_name)) + .setContentText("Metis is running") + // .setSmallIcon(R.drawable.ic_notification) + .setSmallIcon(R.mipmap.ic_notification) + .setWhen(System.currentTimeMillis()) + .setContentIntent(pendingIntent) + .build(); + + notification.flags |= Notification.FLAG_NO_CLEAR; + + startForeground(NOTIFICATION_ID, notification); + } + } + + +} diff --git a/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisStatusFragment.java b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisStatusFragment.java new file mode 100644 index 00000000..370a53b4 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/java/com/metis/ccnx/ccnxsdk/metiscontrol/MetisStatusFragment.java @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.metis.ccnx.ccnxsdk.metiscontrol; + +import android.content.Context; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Handler; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.CompoundButton; +import android.widget.Spinner; +import android.widget.Switch; +import android.widget.TextView; + +import com.metis.ccnx.ccnxsupportlibrary.Metis; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.nio.charset.Charset; +import java.util.List; + + +public class MetisStatusFragment extends Fragment implements IMetisNamedFragment { + + private static final String ARG_PAGER_INDEX = "metisstatus_pager_number"; + private static final String TAG = "CCNXMetis SF"; + + // TODO: Rename and change types of parameters + private int mPagerIndex; + + private Switch mSwitchMetisOnOff = null; + private Spinner mSpinnerLogLevel = null; + private Switch mSwitchContentStoreOnOff = null; + private TextView mTVNumInterests = null; + private TextView mTVNumContentObjects = null; + private TextView mTVNumInterestReturns = null; + private TextView mTVNumControlMessages = null; + private TextView mTVNumPITEntries = null; + private TextView mPathTextView = null; + + // Stats counters, updated by background task. + private long mNumInterests = 0; + private long mNumCOs = 0; + private long mNumInterestReturns = 0; + private long mNumControl = 0; + private long mNumPITENtries = 0; + + private boolean mIsStatsQueryRunning = false; + + + //private PortalFactory mPortalFactory = null; + + private OnFragmentVisibleListener mListener; + + + /** + * Create a Handler and a Runnable to be called every few seconds to query + * Metis (when running) for stats. + */ + private Handler mStatusUpdaterHandler = new Handler(); + private Runnable mStatusUpdateRunnable = new Runnable() { + @Override + public void run() { + // This runs on the main thread, so start an AsyncTask + // Repeat this the same runnable code block again another few seconds + //new GetStatusTask(null).execute(mPortalFactory); + //if (mIsStatsQueryRunning) { + //mStatusUpdaterHandler.postDelayed(mStatusUpdateRunnable, 2 * 1000); + //} + } + }; + + + public MetisStatusFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @return A new instance of fragment MetisStatusFragment. + */ + // TODO: Rename and change types and number of parameters + public static MetisStatusFragment newInstance(int pagerIndex) { + MetisStatusFragment fragment = new MetisStatusFragment(); + Bundle args = new Bundle(); + args.putInt(ARG_PAGER_INDEX, pagerIndex); + + fragment.setArguments(args); + + return fragment; + } + + @Override + public void onStart() { + Metis metis = Metis.getInstance(); + mSwitchMetisOnOff.setChecked(metis.isRunning()); + super.onStart(); + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mPagerIndex = getArguments().getInt(ARG_PAGER_INDEX); + } + + + Log.d(TAG, "Creating new PortalFactory"); + //Identity identity = CCNxUtils.createCCNxIdentity(getContext(), + // "password", "ccnxsdkdemo", 1024, 30); + //mPortalFactory = new PortalFactory(identity); + } + + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_metis_status, container, false); + + mSwitchMetisOnOff = (Switch) view.findViewById(R.id.switchMetisOnOff); + mSwitchContentStoreOnOff = (Switch) view.findViewById(R.id.switchMetisContentStoreOnOff); + mSpinnerLogLevel = (Spinner) view.findViewById(R.id.spinnerMetisLoggingLevel); + mPathTextView = (TextView) view.findViewById(R.id.pathText) ; + + mSpinnerLogLevel.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { + String loggingLevel = mSpinnerLogLevel.getSelectedItem().toString(); + updateMetisLoggingLevel(loggingLevel); + } + + @Override + public void onNothingSelected(AdapterView<?> parent) { + + } + }); + + mSwitchMetisOnOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + startMetis(); + //mSpinnerLogLevel.setEnabled(true); + //Log.d(TAG, "################# Start periodic query for stats"); + //if (!mIsStatsQueryRunning) { + // mStatusUpdaterHandler.postDelayed(mStatusUpdateRunnable, 500); + // mIsStatsQueryRunning = true; + // String loggingLevel = mSpinnerLogLevel.getSelectedItem().toString(); + // if (!loggingLevel.equalsIgnoreCase("off")) { + // updateMetisLoggingLevel(loggingLevel); + // } + //} + } else { + Log.d(TAG, "################# Stop periodic query for stats"); + //mStatusUpdaterHandler.removeCallbacks(mStatusUpdateRunnable); + //mIsStatsQueryRunning = false; + stopMetis(); + //mSpinnerLogLevel.setEnabled(false); + //mSpinnerLogLevel.setSelection(0); + } + } + }); + + mTVNumInterests = (TextView) view.findViewById(R.id.tvStatsNumInterests); + mTVNumContentObjects = (TextView) view.findViewById(R.id.tvStatsNumContentObjects); + mTVNumInterestReturns = (TextView) view.findViewById(R.id.tvStatsNumInterestReturns); + mTVNumControlMessages = (TextView) view.findViewById(R.id.tvStatsNumControl); + mTVNumPITEntries = (TextView) view.findViewById(R.id.tvStatsPITSize); + + mTVNumInterests.setText(String.valueOf(mNumInterests)); + mTVNumContentObjects.setText(String.valueOf(mNumCOs)); + mTVNumControlMessages.setText(String.valueOf(mNumControl)); + mTVNumInterestReturns.setText(String.valueOf(mNumInterestReturns)); + mTVNumPITEntries.setText(""); + + return view; + } + + private void startMetis() { + mPathTextView.setEnabled(false); + Metis metis = Metis.getInstance(); + if (!metis.isRunning()) { + Intent intent = new Intent(getActivity(), MetisService.class); + intent.putExtra("path", mPathTextView.getText()); + getActivity().startService(intent); + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + createExternalListeners(); + } + }, 1000); + } + } + + private void stopMetis() { + mPathTextView.setEnabled(true); + Intent intent = new Intent(getActivity(), MetisService.class); + + getActivity().stopService(intent); + + } + + private void updateMetisLoggingLevel(String loggingLevel) { + /*Metis metis = Metis.getInstance(); + if (metis.isRunning()) { + // Send an Interest control message to Metis with the new logging level. + String commandURI = MetisConstants.CCNxNameMetisCommand_Set + "/" + MetisConstants.MetisCommand_LogLevel + "/" + loggingLevel; + Name name = new Name(commandURI); + SendInterestTask task = new SendInterestTask(name, null, new SendInterestTask.OnInterestSentListener() { + @Override + public void onInterestSent(Message message) { + if (message instanceof ContentObject) { + + String responseString = new String(((ContentObject) message).payload()); + Snackbar snackbar = Snackbar + .make(mSwitchMetisOnOff, responseString, Snackbar.LENGTH_SHORT); + + snackbar.show(); + } else { + Log.d(TAG, "Unexpected non-Content response from sent Interest"); + } + } + }); + + task.execute(mPortalFactory); + }*/ + } + + private void createExternalListeners() { + + /*Metis metis = Metis.getInstance(); + + if (metis.isRunning()) { + + List<InetAddress> ipAddresses = CCNxUtils.getLocalIpAddress(); + + for (InetAddress addr : ipAddresses) { + + // For the moment, just listen on the IPV4 addresses. The V6 addresses should work, + // but it's not yet tested. + + if (addr instanceof Inet4Address) { + + String ipAddress = addr.getHostAddress(); + + Log.d(TAG, "Adding external listener on: " + ipAddress); + + String linkURI = "tcp://" + ipAddress + ":" + MetisConstants.MetisDefaultListenerPort + "/listener"; + + Name name = new Name(MetisConstants.CCNxNameMetisCommand_LinkConnect); + + SendInterestTask task = new SendInterestTask(name, linkURI.getBytes(), new SendInterestTask.OnInterestSentListener() { + @Override + public void onInterestSent(Message message) { + if (message instanceof ContentObject) { + + String responseString = new String(((ContentObject) message).payload()); + Snackbar snackbar = Snackbar + .make(mSwitchMetisOnOff, responseString, Snackbar.LENGTH_SHORT); + + snackbar.show(); + } else { + Log.d(TAG, "Unexpected non-Content response from sent Interest"); + } + } + }); + + task.execute(mPortalFactory); + } + } + }*/ + } + + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnFragmentVisibleListener) { + mListener = (OnFragmentVisibleListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + Metis metis = Metis.getInstance(); + + if (isVisibleToUser) { + mListener.onFragmentVisible(this); + + if (metis.isRunning()) { + // Begin updating stats. + if (!mIsStatsQueryRunning) { + mStatusUpdaterHandler.postDelayed(mStatusUpdateRunnable, 100); + mIsStatsQueryRunning = true; + } + } + } else { + mStatusUpdaterHandler.removeCallbacks(mStatusUpdateRunnable); + mIsStatsQueryRunning = false; + } + } + + @Override + public void onDetach() { + mStatusUpdaterHandler.removeCallbacks(mStatusUpdateRunnable); + mIsStatsQueryRunning = false; + super.onDetach(); + mListener = null; + } + + @Override + public String getFragmentName() { + return "Status"; + } + + public interface OnFragmentVisibleListener { + // TODO: Update argument type and name + void onFragmentVisible(Fragment which); + } + + /*private class GetStatusTask extends AsyncTask<PortalFactory, String, Integer> { + + private boolean mSuccess = false; + private PortalFactory mPortalFactory = null; + + + public GetStatusTask(String unused) { + } + + @Override + protected Integer doInBackground(PortalFactory... args) { + Thread.currentThread().setName("GetStatusTask-Async"); + + mPortalFactory = args[0]; + try { + Name controlName = new Name(MetisConstants.CCNxNameMetisCommand_Stats); + + Interest interest = new Interest(controlName); + + try { + Portal portal = mPortalFactory.getPortal(); + + portal.send(interest, 0L); + + Message m = portal.receive(0L); + + if (m instanceof ContentObject) { + mSuccess = true; + ContentObject co = (ContentObject) m; + byte[] payload = co.payload(); + + if (payload != null) { + String jsonString = new String(payload, Charset.defaultCharset()); + //Log.d(TAG, "Received: XX " + jsonString + " XX"); + try { + JSONObject jo = new JSONObject(jsonString); + //Log.d(TAG, "JSON2: " + jo.toString(2)); + + mNumInterests = jo.getLong("numProcessedInterests"); + mNumCOs = jo.getLong("numProcessedContentObjects"); + mNumControl = jo.getLong("numProcessedControlMessages"); + mNumInterestReturns = jo.getLong("numProcessedInterestReturns"); + } catch (JSONException ex) { + Log.e(TAG, "Could not parse returned JSON: " + ex.getMessage()); + } + } + } + portal.close(); + } catch (Portal.CommunicationsError ex) { + Log.e(TAG, "Error sending AddLink command: " + ex.getMessage()); + } + } catch (Exception ex) { + Log.e(TAG, "Error adding link: " + ex.getMessage()); + } + + return 1; + } + + @Override + protected void onPostExecute(Integer ignored) { + + if (mSuccess) { + mTVNumInterests.setText(String.valueOf(mNumInterests)); + mTVNumContentObjects.setText(String.valueOf(mNumCOs)); + mTVNumControlMessages.setText(String.valueOf(mNumControl)); + mTVNumInterestReturns.setText(String.valueOf(mNumInterestReturns)); + mTVNumPITEntries.setText(""); + } + } + }*/ + +} diff --git a/ccnxandroidmetis/MetisControl/src/main/res/drawable/add_panel_border.xml b/ccnxandroidmetis/MetisControl/src/main/res/drawable/add_panel_border.xml new file mode 100644 index 00000000..abb8d9a8 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/drawable/add_panel_border.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <stroke + android:width="3dp" + android:color="@color/colorPrimaryDark" /> + + <corners android:radius="10dip" /> +</shape> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/drawable/ic_plus_48.png b/ccnxandroidmetis/MetisControl/src/main/res/drawable/ic_plus_48.png Binary files differnew file mode 100644 index 00000000..660a9e50 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/drawable/ic_plus_48.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/drawable/ic_plus_96.png b/ccnxandroidmetis/MetisControl/src/main/res/drawable/ic_plus_96.png Binary files differnew file mode 100644 index 00000000..f73a233c --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/drawable/ic_plus_96.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/activity_forwarder_status.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/activity_forwarder_status.xml new file mode 100644 index 00000000..5e627c02 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/activity_forwarder_status.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/main_content" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fitsSystemWindows="true" + tools:context=".ForwarderStatusActivity"> + + <android.support.design.widget.AppBarLayout + android:id="@+id/appbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="@dimen/appbar_padding_top" + android:theme="@style/AppTheme.AppBarOverlay"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:layout_scrollFlags="scroll|enterAlways" + app:popupTheme="@style/AppTheme.PopupOverlay"> + + </android.support.v7.widget.Toolbar> + + </android.support.design.widget.AppBarLayout> + + <android.support.v4.view.ViewPager + android:id="@+id/container" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> + + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_margin="@dimen/fab_margin" + android:src="@android:drawable/ic_input_add" /> + +</android.support.design.widget.CoordinatorLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_forwarder_status.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_forwarder_status.xml new file mode 100644 index 00000000..943d2ad2 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_forwarder_status.xml @@ -0,0 +1,16 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingBottom="@dimen/activity_vertical_margin" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + tools:context=".ForwarderStatusActivity$PlaceholderFragment"> + + <TextView + android:id="@+id/section_label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + +</RelativeLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_links.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_links.xml new file mode 100644 index 00000000..1041eeb4 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_links.xml @@ -0,0 +1,99 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:animateLayoutChanges="true" + + tools:context=".MetisLinksFragment"> + + <!-- TODO: Update blank fragment layout --> + + <RelativeLayout + android:id="@+id/rlLinkAddPanel" + android:visibility="visible" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:background="@drawable/add_panel_border" + android:gravity="top" + android:layout_marginBottom="10dp" + android:padding="10px" + + > + + <android.support.v7.widget.AppCompatSpinner + android:id="@+id/spinnerLinkTypeAdd" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_marginRight="8dp" + android:layout_centerVertical="true" + android:entries="@array/metis_link_type_array" /> + + + <Button + android:id="@+id/btnAddLink" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="Add Link" + android:layout_marginRight="10dp" + android:layout_alignParentEnd="true" /> + + <EditText + android:id="@+id/etLinkAddAddress" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:hint="192.168.0.100:9695" + android:textAppearance="?android:attr/textAppearanceMedium" + android:layout_toRightOf="@id/spinnerLinkTypeAdd" + android:layout_toLeftOf="@id/btnAddLink" /> + + <CheckBox + android:id="@+id/cbLinkListener" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="listener?" + android:layout_toRightOf="@id/spinnerLinkTypeAdd" + android:layout_below="@+id/etLinkAddAddress" /> + + + </RelativeLayout> + + <android.support.v7.widget.LinearLayoutCompat + android:id="@+id/llLinkButtons" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_marginBottom="20dp" + android:layout_marginTop="10dp" + android:layout_below="@id/rlLinkAddPanel" + android:orientation="horizontal"> + + <Button + android:id="@+id/btnRefresh" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/rlLinkAddPanel" + android:text="Refresh" /> + + </android.support.v7.widget.LinearLayoutCompat> + + <ListView + android:id="@+id/lvLinkList" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_below="@id/llLinkButtons" + android:layout_gravity="top|center_horizontal" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginBottom="80dp" + android:padding="10dp" + android:background="@drawable/add_panel_border" + android:divider="@android:color/transparent" + android:layout_alignParentBottom="true" + android:dividerHeight="10dp" /> + +</RelativeLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_routes.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_routes.xml new file mode 100644 index 00000000..bd0857b5 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_routes.xml @@ -0,0 +1,80 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:animateLayoutChanges="true" + + tools:context=".MetisRoutesFragment"> + + <!-- TODO: Update blank fragment layout --> + + <RelativeLayout + android:id="@+id/rlRouteAddPanel" + android:visibility="visible" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:background="@drawable/add_panel_border" + android:gravity="top" + android:layout_marginBottom="10dp" + android:padding="10px" + + > + + <Button + android:id="@+id/btnAddRoute" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="Add Route" + android:layout_marginRight="10dp" + android:layout_alignParentEnd="true" /> + + <EditText + android:id="@+id/etRouteAddAddress" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:hint="192.168.0.100:9695" + android:textAppearance="?android:attr/textAppearanceMedium" + android:layout_toLeftOf="@id/btnAddRoute" /> + + + </RelativeLayout> + + <android.support.v7.widget.LinearLayoutCompat + android:id="@+id/llRouteButtons" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_marginBottom="20dp" + android:layout_marginTop="10dp" + android:layout_below="@id/rlRouteAddPanel" + android:orientation="horizontal"> + + <Button + android:id="@+id/btnRefresh" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/rlRouteAddPanel" + android:text="Refresh" /> + + </android.support.v7.widget.LinearLayoutCompat> + + <ListView + android:id="@+id/lvRouteList" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_below="@id/llRouteButtons" + android:layout_gravity="top|center_horizontal" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginBottom="80dp" + android:background="@drawable/add_panel_border" + android:padding="10dp" + android:divider="@android:color/transparent" + android:layout_alignParentBottom="true" + android:dividerHeight="10dp" /> + +</RelativeLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_script.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_script.xml new file mode 100644 index 00000000..c248203c --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_script.xml @@ -0,0 +1,54 @@ + +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:animateLayoutChanges="true" + tools:context=".MetisStatusFragment"> + + <Button + android:id="@+id/btnRunScript" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal|top" + android:text="Run Script" + android:layout_alignParentTop="true" + android:layout_marginTop="20dp" + android:layout_centerHorizontal="true" /> + + <TextView + android:id="@+id/etScript" + style="@style/Base.TextAppearance.AppCompat.Small" + android:layout_below="@id/btnRunScript" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:enabled="true" + android:isScrollContainer="true" + android:maxLines="100" + android:minLines="6" + android:padding="24dp" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:layout_marginBottom="80dp" + android:focusable="true" + android:inputType="textMultiLine|textNoSuggestions" + android:textIsSelectable="true" + android:layout_centerVertical="true" + android:layout_alignParentStart="true" + android:background="@drawable/add_panel_border" + + /> + + <TextView + android:id="@+id/tvMetisScriptHelp" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/metis_script_help" + android:gravity="center_horizontal" + android:layout_centerInParent="true" + android:paddingBottom="60dp" + android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" + /> + +</RelativeLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_status.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_status.xml new file mode 100644 index 00000000..5678f0d4 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/fragment_metis_status.xml @@ -0,0 +1,208 @@ + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".MetisStatusFragment"> + + <!-- TODO: Update blank fragment layout --> + + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + + android:layout_gravity="top|center_horizontal" + android:layout_marginTop="80dp"> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:inputType="textPersonName" + android:text="/storage/emulated/0/MetisConf/metis.cfg" + android:layout_marginBottom="30dp" + android:layout_gravity="top" + android:ems="10" + android:id="@+id/pathText" + android:typeface="normal" /> + + <Switch + android:id="@+id/switchMetisOnOff" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_below="@id/pathText" + android:layout_marginBottom="30dp" + android:checked="false" + android:text="Metis Enabled " + + android:textAppearance="?android:attr/textAppearanceLarge" /> + + <Switch + android:id="@+id/switchMetisContentStoreOnOff" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/switchMetisOnOff" + android:layout_gravity="center" + android:text="Content Store (cache) " + android:enabled="false" + android:layout_marginBottom="20dp" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/tvLoggingLevelLabel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:enabled="false" + android:text = "Logging level:" + android:layout_below="@id/switchMetisContentStoreOnOff" + android:textAppearance="?android:attr/textAppearanceMedium" + + /> + + <android.support.v7.widget.AppCompatSpinner + android:id="@+id/spinnerMetisLoggingLevel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/switchMetisContentStoreOnOff" + android:layout_toRightOf="@id/tvLoggingLevelLabel" + android:enabled="true" + android:textAppearance="?android:attr/textAppearanceMedium" + android:entries="@array/metis_log_levels" /> + + + </RelativeLayout> + + <TableLayout + android:visibility="invisible" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|center_horizontal" + android:background="@drawable/add_panel_border" + android:padding="20dp" + android:layout_marginBottom="80dp" + android:orientation="vertical"> + + <TableRow + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="4dp" + + android:layout_gravity="center_horizontal" + android:orientation="horizontal"> + + <TextView + android:id="@+id/tvStatsNumInterestsLabel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="# Interests Processed: " + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/tvStatsNumInterests" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@+id/tvStatsNumInterestsLabel" + android:text="0" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + </TableRow> + + <TableRow + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="4dp" + + android:layout_gravity="center_horizontal" + android:orientation="horizontal"> + + <TextView + android:id="@+id/tvStatsNumContentObjectsLabel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="# ContentObjects Processed: " + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/tvStatsNumContentObjects" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@+id/tvStatsNumInterestsLabel" + android:text="0" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + </TableRow> + + <TableRow + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginBottom="4dp" + android:orientation="horizontal"> + + <TextView + android:id="@+id/tvStatsNumControlLabel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="# Control Messages Processed: " + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/tvStatsNumControl" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@+id/tvStatsNumInterestsLabel" + android:text="0" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + </TableRow> + + <TableRow + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginBottom="4dp" + android:orientation="horizontal"> + + <TextView + android:id="@+id/tvStatsNumInterestReturnsLabel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="# InterestReturns Processed: " + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/tvStatsNumInterestReturns" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@+id/tvStatsNumInterestsLabel" + android:text="0" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + </TableRow> + + <TableRow + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:orientation="horizontal"> + + <TextView + android:id="@+id/tvStatsPITSizeLabel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="# PIT entries: " + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/tvStatsPITSize" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@+id/tvStatsNumInterestsLabel" + android:text="0" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + </TableRow> + + </TableLayout> + +</FrameLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/listitem_metis_links.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/listitem_metis_links.xml new file mode 100644 index 00000000..19bc5548 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/listitem_metis_links.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingLeft="10dp" + android:paddingTop="3dp" + > + + <TextView + android:id="@+id/tvLinkName" + android:text="foo bar bar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.AppCompat.Medium" + android:textColor="@color/colorPrimaryDark" + /> + + + <TextView + android:id="@+id/tvLinkLocalOrRemote" + android:text="local" + android:layout_below="@id/tvLinkName" + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingRight="5dp" + /> + + <TextView + android:id="@+id/tvLinkListener" + android:text="listener" + android:layout_toRightOf="@id/tvLinkLocalOrRemote" + android:layout_below="@id/tvLinkName" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingRight="5dp" + /> + + <TextView + android:id="@+id/tvLinkIPAddress" + android:layout_below="@id/tvLinkName" + android:text="" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingRight="5dp" + android:layout_toRightOf="@id/tvLinkListener" + /> + +</RelativeLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/layout/listitem_metis_routes.xml b/ccnxandroidmetis/MetisControl/src/main/res/layout/listitem_metis_routes.xml new file mode 100644 index 00000000..2372b352 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/layout/listitem_metis_routes.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingLeft="5dp" + android:paddingTop="3dp" + android:background="@color/list_bg_1" + > + + <TextView + android:id="@+id/tvRouteName" + android:text="ccnx:/foo/bar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.AppCompat.Medium" + android:textColor="@color/colorPrimaryDark" + /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/tvRouteArrow" + android:text="==>" + android:layout_marginLeft="20dp" + android:layout_below="@id/tvRouteName" + android:textAppearance="@style/TextAppearance.AppCompat.Medium" + + /> + + <TextView + android:id="@+id/tvRouteLink" + android:text="dest" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/tvRouteName" + android:layout_marginLeft="15dp" + android:layout_toRightOf="@id/tvRouteArrow" + android:textAppearance="@style/TextAppearance.AppCompat.Medium" + + /> + +</RelativeLayout> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/menu/menu_forwarder_status.xml b/ccnxandroidmetis/MetisControl/src/main/res/menu/menu_forwarder_status.xml new file mode 100644 index 00000000..e94f118a --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/menu/menu_forwarder_status.xml @@ -0,0 +1,10 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context=".metiscontrol.ForwarderStatusActivity"> + <item + android:id="@+id/action_settings" + android:orderInCategory="100" + android:title="@string/action_settings" + app:showAsAction="never" /> +</menu> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/mipmap-hdpi/ic_launcher.png b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..96715136 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/mipmap-mdpi/ic_launcher.png b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..a74e9a0d --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/mipmap-mdpi/ic_notification.png b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-mdpi/ic_notification.png Binary files differnew file mode 100755 index 00000000..82552e85 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-mdpi/ic_notification.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xhdpi/ic_launcher.png b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..760fec0f --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xxhdpi/ic_launcher.png b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..d840ecb4 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xxxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..0844619e --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/ccnxandroidmetis/MetisControl/src/main/res/values-v21/styles.xml b/ccnxandroidmetis/MetisControl/src/main/res/values-v21/styles.xml new file mode 100644 index 00000000..de6d88e2 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/values-v21/styles.xml @@ -0,0 +1,10 @@ + +<resources> + + <style name="AppTheme.NoActionBar"> + <item name="windowActionBar">false</item> + <item name="windowNoTitle">true</item> + <item name="android:windowDrawsSystemBarBackgrounds">true</item> + <item name="android:statusBarColor">@android:color/transparent</item> + </style> +</resources> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/values-w820dp/dimens.xml b/ccnxandroidmetis/MetisControl/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 00000000..63fc8164 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ +<resources> + <!-- Example customization of dimensions originally defined in res/values/dimens.xml + (such as screen margins) for screens with more than 820dp of available width. This + would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> + <dimen name="activity_horizontal_margin">64dp</dimen> +</resources> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/values/colors.xml b/ccnxandroidmetis/MetisControl/src/main/res/values/colors.xml new file mode 100644 index 00000000..2c04684a --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#3F51B5</color> + <color name="colorPrimaryDark">#303F9F</color> + <color name="colorAccent">#FF4081</color> + + <color name="list_bg_1">#ffffff</color> + <color name="list_bg_2">#eafaea</color> + +</resources> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/values/dimens.xml b/ccnxandroidmetis/MetisControl/src/main/res/values/dimens.xml new file mode 100644 index 00000000..cef3abc4 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/values/dimens.xml @@ -0,0 +1,7 @@ +<resources> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> + <dimen name="fab_margin">16dp</dimen> + <dimen name="appbar_padding_top">8dp</dimen> +</resources> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/values/strings.xml b/ccnxandroidmetis/MetisControl/src/main/res/values/strings.xml new file mode 100644 index 00000000..e5a7f500 --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/values/strings.xml @@ -0,0 +1,37 @@ +<resources> + <string name="app_name">Metis Control</string> + <string name="action_settings">Settings</string> + <string name="section_format">Hello World from section: %1$d</string> + + <!-- TODO: Remove or change this placeholder text --> + <string name="asf_hello">Metis Status Fragment</string> + <string name="asf_big_text">METIS STATUS</string> + + <!-- TODO: Remove or change this placeholder text --> + <string name="hello_blank_fragment">Hello blank fragment</string> + + + <string-array name="metis_link_type_array"> + <item>TCP</item> + <item>UDP</item> + </string-array> + + <string-array name="metis_log_levels"> + <item>Off</item> + <item>Notice</item> + <item>Error</item> + <item>Info</item> + <item>Debug</item> + <item>All</item> + </string-array> + + <string name="cancel">Cancel</string> + <string name="add">Add</string> + + <string name="listener_remote">remote</string> + <string name="listener_local">local</string> + <string name="listener_listener">listener</string> + + <string name="metis_script_help">Place an Metis statefile in:\n /mnt/sdcard/ccnx/metis.statefile\nif you want to initialize Metis with\nmany commands.</string> + +</resources> diff --git a/ccnxandroidmetis/MetisControl/src/main/res/values/styles.xml b/ccnxandroidmetis/MetisControl/src/main/res/values/styles.xml new file mode 100644 index 00000000..545b9c6d --- /dev/null +++ b/ccnxandroidmetis/MetisControl/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <!-- Customize your theme here. --> + <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> + </style> + + <style name="AppTheme.NoActionBar"> + <item name="windowActionBar">false</item> + <item name="windowNoTitle">true</item> + </style> + + <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> + + <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> + +</resources> diff --git a/ccnxandroidmetis/build.gradle b/ccnxandroidmetis/build.gradle new file mode 100644 index 00000000..2b9e8c54 --- /dev/null +++ b/ccnxandroidmetis/build.gradle @@ -0,0 +1,26 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} + +task build(dependsOn: ':ccnxsupportlibrary:build') + diff --git a/ccnxandroidmetis/ccnxsupportlibrary/build.gradle b/ccnxandroidmetis/ccnxsupportlibrary/build.gradle new file mode 100644 index 00000000..3ec07d19 --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/build.gradle @@ -0,0 +1,66 @@ + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 23 + buildToolsVersion '25.0.0' + + defaultConfig { + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + sourceSets { + main { + jni.srcDirs = [] + java.srcDirs = ['src/main/java'] + resources.srcDirs = ['src/main/res'] + res.srcDirs = ['src/main/res'] + jniLibs.srcDirs = ['src/main/libs'] + assets.srcDirs = ['src/main/assets'] + } + } + + task buildNative(type: Exec, description: 'Compile JNI source via NDK') { + def ndkDir = android.ndkDirectory + commandLine "$ndkDir/ndk-build", + '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source + '-j', Runtime.runtime.availableProcessors(), + 'all', + 'NDK_DEBUG=1' + } + + task cleanNative(type: Exec, description: 'Clean JNI object files') { + def ndkDir = android.ndkDirectory + commandLine "$ndkDir/ndk-build", + '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source + 'clean' + } + + tasks.withType(JavaCompile) { + compileTask -> compileTask.dependsOn(buildNative) + } + + clean.dependsOn 'cleanNative' +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.4.0' +} + +configurations.maybeCreate("default") +artifacts.add("default", file('build/outputs/aar/ccnxsupportlibrary-release.aar')) diff --git a/ccnxandroidmetis/ccnxsupportlibrary/proguard-rules.pro b/ccnxandroidmetis/ccnxsupportlibrary/proguard-rules.pro new file mode 100644 index 00000000..c51dd9b5 --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/walendo/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/AndroidManifest.xml b/ccnxandroidmetis/ccnxsupportlibrary/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8ac2d0c6 --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ +<!-- + ~ Copyright (c) 2017 Cisco and/or its affiliates. + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at: + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.metis.ccnx.ccnxsupportlibrary"> + + <application + android:allowBackup="true" + android:label="@string/app_name" + android:supportsRtl="true"> + + </application> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission + android:name="android.permission.READ_EXTERNAL_STORAGE" + android:maxSdkVersion="21" /> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + +</manifest> diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/java/com/metis/ccnx/ccnxsupportlibrary/Metis.java b/ccnxandroidmetis/ccnxsupportlibrary/src/main/java/com/metis/ccnx/ccnxsupportlibrary/Metis.java new file mode 100644 index 00000000..5be6af9a --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/java/com/metis/ccnx/ccnxsupportlibrary/Metis.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.metis.ccnx.ccnxsupportlibrary; + +public class Metis { + + private static Metis sInstance = null; + + static { + System.loadLibrary("ccnxsupportlibrary"); + } + + public static Metis getInstance() { + if (sInstance == null) { + sInstance = new Metis(); + } + return sInstance; + } + + private Metis() { + + } + + public native boolean isRunning(); + public native void start(String path); + public native void stop(); +} diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/Android.mk b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/Android.mk new file mode 100644 index 00000000..6613742d --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/Android.mk @@ -0,0 +1,19 @@ +############################################################################## +# Copyright (c) 2017 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################## +LOCAL_PATH := $(call my-dir) + +subdirs := $(call all-subdir-makefiles) + +include $(subdirs) diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/Application.mk b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/Application.mk new file mode 100644 index 00000000..bd11e2d6 --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/Application.mk @@ -0,0 +1,20 @@ +############################################################################## +# Copyright (c) 2017 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################## + +APP_PLATFORM := android-23 + +APP_ABI := armeabi-v7a + +APP_MODULES += ccnxsupportlibrary diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Android.mk b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Android.mk new file mode 100644 index 00000000..2d2ab65c --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Android.mk @@ -0,0 +1,121 @@ +############################################################################## +# Copyright (c) 2017 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################## + +LOCAL_PATH := $(call my-dir) + +ARMDIST_ROOT := $(DISTILLERY_ROOT_DIR) + +ARMDIST := $(ARMDIST_ROOT)/usr +ARMDEPS := $(ARMDIST_ROOT)/usr +METIS_INC := $(ARMDIST_ROOT)/usr/include + +include $(CLEAR_VARS) +LOCAL_MODULE := liblongbow-ansiterm +LOCAL_SRC_FILES := $(ARMDIST)/lib/liblongbow-ansiterm.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := liblongbow-textplain +LOCAL_SRC_FILES := $(ARMDIST)/lib/liblongbow-textplain.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libparc +LOCAL_SRC_FILES := $(ARMDIST)/lib/libparc.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libmetis +LOCAL_SRC_FILES := $(ARMDIST)/lib/libmetis.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_api_control +LOCAL_SRC_FILES := $(ARMDIST)/lib/libccnx_api_control.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_api_notify +LOCAL_SRC_FILES := $(ARMDIST)/lib/libccnx_api_notify.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_api_portal +LOCAL_SRC_FILES := $(ARMDIST)/lib/libccnx_api_portal.a +include $(PREBUILT_STATIC_LIBRARY) +include $(CLEAR_VARS) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_transport_rta +LOCAL_SRC_FILES := $(ARMDIST)/lib/libccnx_transport_rta.a +include $(PREBUILT_STATIC_LIBRARY) +include $(CLEAR_VARS) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_common +LOCAL_SRC_FILES := $(ARMDIST)/lib/libccnx_common.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libevent +LOCAL_SRC_FILES := $(ARMDEPS)/lib/libevent.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libssl +LOCAL_SRC_FILES := $(ARMDEPS)/lib/libssl.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libcrypto +LOCAL_SRC_FILES := $(ARMDEPS)/lib/libcrypto.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := liblongbow +LOCAL_SRC_FILES := $(ARMDIST)/lib/liblongbow.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := ccnxsupportlibrary + + +LOCAL_SRC_FILES := \ + Metis_wrap.c + +LOCAL_CFLAGS := $(M_CFLAGS) $(OS_CFLAGS) -I$(ARMDIST)/include -I$(METIS_INC) + +LOCAL_CFLAGS += -I$(ARMDIST)/include -I$(METIS_INC) +LOCAL_CFLAGS += -std=c99 -g + + +LOCAL_LDLIBS := -ldl -llog $(OS_LDFLAGS) + +LOCAL_STATIC_LIBRARIES := \ + libmetis \ + libccnx_api_portal \ + libccnx_api_control \ + libccnx_api_notify \ + libccnx_transport_rta \ + libccnx_common \ + libparc \ + liblongbow \ + liblongbow-textplain \ + liblongbow-ansiterm \ + libssl \ + libevent \ + libcrypto + +include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Metis_wrap.c b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Metis_wrap.c new file mode 100644 index 00000000..2febb40f --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Metis_wrap.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <string.h> +#include <stdio.h> +#include <getopt.h> +#include <sys/param.h> +#include <sys/utsname.h> +#include <pthread.h> +#include <dirent.h> +#include <android/log.h> +#include "Metis_wrap.h" +#include <ccnx/forwarder/metis/core/metis_Forwarder.h> +#include <ccnx/forwarder/metis/core/metis_System.h> +#include <ccnx/forwarder/metis/content_store/metis_ContentStoreInterface.h> +#include <ccnx/api/control/cpi_Listener.h> +#include <ccnx/api/control/cpi_InterfaceSet.h> + + +static bool _isRunning = false; + + +static MetisForwarder *metis; + +static void +_setLogLevelToLevel(int logLevelArray[MetisLoggerFacility_END], MetisLoggerFacility facility, const char *levelString) +{ + PARCLogLevel level = parcLogLevel_FromString(levelString); + + if (level < PARCLogLevel_All) { + // we have a good facility and level + logLevelArray[facility] = level; + } else { + printf("Invalid log level string %s\n", levelString); + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap", "Invalid log level stringa %s", levelString); + } +} + + +static void +_setLogLevel(int logLevelArray[MetisLoggerFacility_END], const char *string) +{ + char *tofree = parcMemory_StringDuplicate(string, strlen(string)); + char *p = tofree; + + char *facilityString = strsep(&p, "="); + if (facilityString) { + char *levelString = p; + + if (strcasecmp(facilityString, "all") == 0) { + for (MetisLoggerFacility facility = 0; facility < MetisLoggerFacility_END; facility++) { + _setLogLevelToLevel(logLevelArray, facility, levelString); + } + } else { + MetisLoggerFacility facility; + for (facility = 0; facility < MetisLoggerFacility_END; facility++) { + if (strcasecmp(facilityString, metisLogger_FacilityString(facility)) == 0) { + break; + } + } + + if (facility < MetisLoggerFacility_END) { + _setLogLevelToLevel(logLevelArray, facility, levelString); + } else { + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap", "Invalid facility string %s", facilityString); + } + } + } + parcMemory_Deallocate((void **) &tofree); +} + + + +JNIEXPORT void JNICALL Java_com_metis_ccnx_ccnxsupportlibrary_Metis_start + (JNIEnv *env, jobject obj, jstring path) +{ + if (!_isRunning) { + metis = metisForwarder_Create(NULL); + MetisConfiguration *configuration = metisForwarder_GetConfiguration(metis); + metisConfiguration_SetObjectStoreSize(configuration, 0); + metisConfiguration_StartCLI(configuration, 2001); + if (path != NULL) { + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap","qui"); + const char *configFileName = (*env)->GetStringUTFChars(env, path, 0); + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap", "configuration file %s", configFileName); + metisForwarder_SetupFromConfigFile(metis, configFileName); + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap","config from file"); + } else { + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap","qua"); + metisForwarder_SetupAllListeners(metis, PORT_NUMBER, NULL); + } + MetisDispatcher *dispatcher = metisForwarder_GetDispatcher(metis); + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap","dispatcher"); + _isRunning = true; + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap","true"); + metisDispatcher_Run(dispatcher); + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap","run"); + } + + } + +JNIEXPORT void JNICALL Java_com_metis_ccnx_ccnxsupportlibrary_Metis_stop + (JNIEnv *env, jobject obj) +{ + if(_isRunning) { + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap", "%s", "stopping metis..."); + metisForwarder_Destroy(&metis); + _isRunning = false; + } +} + + +JNIEXPORT jboolean JNICALL Java_com_metis_ccnx_ccnxsupportlibrary_Metis_isRunning + (JNIEnv *env, jobject obj) { + __android_log_print(ANDROID_LOG_DEBUG, "Metis Wrap", "%s %d", " metis is running", _isRunning); + return _isRunning; +} + + diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Metis_wrap.h b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Metis_wrap.h new file mode 100644 index 00000000..ad4bceb2 --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/jni/ccnxsupportlibrary/Metis_wrap.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <jni.h> +#include <android/log.h> + +#define LOG_TAG "CCNxSDK" +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) + + diff --git a/ccnxandroidmetis/ccnxsupportlibrary/src/main/res/values/strings.xml b/ccnxandroidmetis/ccnxsupportlibrary/src/main/res/values/strings.xml new file mode 100644 index 00000000..843d2b5b --- /dev/null +++ b/ccnxandroidmetis/ccnxsupportlibrary/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">CCNxSupportLibrary</string> +</resources> diff --git a/ccnxandroidmetis/gradle.properties b/ccnxandroidmetis/gradle.properties new file mode 100644 index 00000000..a21cee45 --- /dev/null +++ b/ccnxandroidmetis/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +org.gradle.jvmargs=-Xmx3072M -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects + org.gradle.parallel=true diff --git a/ccnxandroidmetis/gradle/wrapper/gradle-wrapper.jar b/ccnxandroidmetis/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 00000000..13372aef --- /dev/null +++ b/ccnxandroidmetis/gradle/wrapper/gradle-wrapper.jar diff --git a/ccnxandroidmetis/gradle/wrapper/gradle-wrapper.properties b/ccnxandroidmetis/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..d72c5eb2 --- /dev/null +++ b/ccnxandroidmetis/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Mar 21 18:47:10 CET 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/ccnxandroidmetis/gradlew b/ccnxandroidmetis/gradlew new file mode 100755 index 00000000..9d82f789 --- /dev/null +++ b/ccnxandroidmetis/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/ccnxandroidmetis/gradlew.bat b/ccnxandroidmetis/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/ccnxandroidmetis/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/ccnxandroidmetis/settings.gradle b/ccnxandroidmetis/settings.gradle new file mode 100644 index 00000000..68484424 --- /dev/null +++ b/ccnxandroidmetis/settings.gradle @@ -0,0 +1,3 @@ +include ':MetisControl', ':ccnxsupportlibrary' +//project(':ccnxsupportlibrary').projectDir = new File(settingsDir, "ccnxsupportlibrary") + diff --git a/config/MasterIDE-CMakeLists.txt b/config/MasterIDE-CMakeLists.txt new file mode 100644 index 00000000..86df8a45 --- /dev/null +++ b/config/MasterIDE-CMakeLists.txt @@ -0,0 +1,29 @@ +# This is a master CMakeLists.txt file for IDEs. If you are viewing this as +# CMakeLists.txt in the source directory IT IS A COPY and SHOULD NOT BE EDITED - +# edit the MasterIDE-CMakeLists.txt in CCNx_Distillery/config instead. +# +cmake_minimum_required(VERSION 3.2) +project (master) + +message("--- Collecting all sub-projects ---") + +macro(Subdirs result parent) + file(GLOB children LIST_DIRECTORIES true RELATIVE ${parent} "[^.]*") + set(dirlist "") + foreach(child ${children}) + if(IS_DIRECTORY ${parent}/${child}) + if(EXISTS ${parent}/${child}/CMakeLists.txt) + list(APPEND dirlist ${child}) + endif() + endif() + endforeach() + set(${result} ${dirlist}) +endmacro() + +Subdirs(modules ${CMAKE_SOURCE_DIR}) + +foreach(module ${modules}) + message("module: ${module}") + set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/${module}/cmake/Modules") + add_subdirectory(${module}) +endforeach() diff --git a/config/README b/config/README new file mode 100644 index 00000000..11512f46 --- /dev/null +++ b/config/README @@ -0,0 +1,21 @@ +CCNx Distillery Config Directory + +This is the directory where CCNx Distillery stores it's configuration +information. Most configuration is parsed by makefile so the files are in +makefile format. + +Important files and directories + +# config.mk +This is the default configuration. DO NOT CHANGE THIS FILE. You can use this +file as a template to create your own configuration. + +# modules +This is the modules directory. It has the configuration file for each module +that is available through Distillery. + +# local +This directory (may or may not exist) is the place to put your local +configuration files. It gets ignored by git. Make will look for a +configuration file called config.mk in this directory to configure this +specific instance of Distillery. diff --git a/config/config.android b/config/config.android new file mode 100644 index 00000000..9383d049 --- /dev/null +++ b/config/config.android @@ -0,0 +1,34 @@ +# +# These are the CMAKE settings for an Android cross-compile. You need to +# update them with your toolchain paths and versions. +# +# To enable these settings being passed to the build, add the following line +# in your Distillery config file (e.g. ~/.ccnx/distillery/config.mk) +# CNX_COMPILE_ENVIRONMENT =-DCMAKE_TOOLCHAIN_FILE=~/Dev/CCNx_Distillery/config/config.android +# +# + +set(ANDROID_NDK_VERSION "android-ndk-r13b") +set(ANDROID_API_VERSION "android-23") +set(ANDROID_TOOLCHAIN "arm-linux-androideabi") +set(ANDROID_TOOLCHAIN_VERSION "${ANDROID_TOOLCHAIN}-4.9") +set(ANDROID_API "${ANDROID_API_VERSION}") +set(ANDROID_SDK "$ENV{SDK}") +set(ANDROID_NDK "$ENV{NDK}") +set(ANDROID_NDK_ROOT "${ANDROID_NDK}") + +set(TOOLCHAIN_VERSION_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_VERSION}") +set(TOOLCHAIN_BIN "${TOOLCHAIN_VERSION_ROOT}/prebuilt/$ENV{OS}-$ENV{ARCH}/bin") + +set(SYSROOT "${ANDROID_NDK}/platforms/${ANDROID_API_VERSION}/arch-arm/") + +set(CMAKE_SYSTEM_NAME Android) +set(CMAKE_SYSROOT "${ANDROID_NDK}/platforms/${ANDROID_API_VERSION}/arch-arm/") +set(CMAKE_C_COMPILER "${TOOLCHAIN_BIN}/${ANDROID_TOOLCHAIN}-gcc") +set(CMAKE_RANLIB "${TOOLCHAIN_BIN}/${ANDROID_TOOLCHAIN}-ranlib") + +set(ANDROID_C_FLAGS "--sysroot=${SYSROOT} -Wall -D_ANDROID_ -D_$ENV{ANDROID_API_VERSION}_") + +set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "--sysroot=${SYSROOT}") +set(CMAKE_MODULE_LINKER_FLAGS ${CMAKE_MODULE_LINKER_FLAGS} "--sysroot=${SYSROOT}") +set(CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} "--sysroot=${SYSROOT}") diff --git a/config/config.mk b/config/config.mk new file mode 100644 index 00000000..d06f58dd --- /dev/null +++ b/config/config.mk @@ -0,0 +1,105 @@ + ############################################################################# + # Copyright (c) 2017 Cisco and/or its affiliates. + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at: + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + ############################################################################## + + + + +#DISTILLERY_GITHUB_UPSTREAM_NAME?=ccnxs_upstream +# The name to give this upstream +DISTILLERY_GITHUB_UPSTREAM_NAME?=ccnx_upstream + +# DISTILLERY_GITHUB_UPSTREAM_REPO=${DISTILLERY_GITHUB_UPSTREAM_URL}/CCNx_Distillery +# The upstream that we expect on Distillery itself. +DISTILLERY_GITHUB_UPSTREAM_REPO?=${DISTILLERY_GITHUB_UPSTREAM_URL}/CCNx_Distillery + +# DISTILLERY_ROOT_DIR=/path/to/root/dir +# This is the root directory of the Distillery distribution. Many other paths depend +# on this. This file assumes that make is being run from the DISTILLERY +# directory. If this is not true, it's convenient to assign the variable at the +# shell. +DISTILLERY_ROOT_DIR?=$(shell pwd) +# This is a variable that can be used to multiplex the build. +# If you set this variable the default output directories will have this +# appended to them +DISTILLERY_BUILD_NAME?= + +# This is the directory where things are built. +# Note that if some modules don't support off-tree builds you may have problems +DISTILLERY_BUILD_DIR?=${DISTILLERY_ROOT_DIR}/build${DISTILLERY_BUILD_NAME} + +# This is the directory where the source is checked out. +DISTILLERY_SOURCE_DIR?=${DISTILLERY_ROOT_DIR}/src + +# MAKE_BUILD_FLAGS +# Flags to pass to make when building the projects. This is mostly used for +# parallel builds. Disable by setting it to empty +MAKE_BUILD_FLAGS?=-j8 + +# DISTILLERY_INSTALL_DIR=/path/to/install/dir +# This is the directory where all the ccn software will be installed. This +# directory will be DELETED if you do a make clobber. Do not treat this the +# same way you would treat a system install directory. +DISTILLERY_INSTALL_DIR?=${DISTILLERY_ROOT_DIR}/usr + +# DISTILLERY_DEPENDENCIES_DIR=/path/to/dependencies/dir +# This is the path to the dependencies directory. It is used as the base for +# the dependencies install directories. (tools and libraries) +# You should normally not edit this variable. +DISTILLERY_DEPENDENCIES_DIR?=${DISTILLERY_INSTALL_DIR} + +# DISTILLERY_EXTERN_DIR=/path/to/dependencies/external/install/dir +# This is the directory where the dependencies will be installed. This +# directory is deleted and created as needed by the dependencies system. +# It is used in gravy for includes and linking. This should be for the TARGET +# architecture. +DISTILLERY_EXTERN_DIR?=${DISTILLERY_DEPENDENCIES_DIR} +CCNX_DEPENDENCIES?=${DISTILLERY_EXTERN_DIR} +export CCNX_DEPENDENCIES + +# DISTILLERY_TOOLS_DIR=/path/to/dependency/tools/dir +# This directory holds some of the tools needed to build libccnx. It should be +# built for the HOST. The directory might be deleted and rebuilt by the +# dependency system. The directory will be included in the execution PATH as +# Distillery builds all the modules. +DISTILLERY_TOOLS_DIR?=${DISTILLERY_DEPENDENCIES_DIR}/build-tools + +# DISTILLERY_XCODE_DIR?=${DISTILLERY_ROOT_DIR}/xcode +# Directory where distillery will create the xcode project files. This is done +# via cmake's build system. Modules that don't use cmake won't have a way to +# create this unless the Makefile provides a way. +DISTILLERY_XCODE_DIR?=${DISTILLERY_ROOT_DIR}/xcode + +# CMAKE_MAKE_TEST_ARGS="ARGS=-j16" +# Tell CTest (via CMake) to run parallel tests (16) +# To run only 1 test at a time run with -j1 or set it empty +CMAKE_MAKE_TEST_ARGS?="ARGS=-j16" + + +# CCNX_HOME +# These variables are used by scripts to know where to find the installed +# CCNX software and libaries. They are also used by various packaging scripts. +CCNX_HOME=${DISTILLERY_INSTALL_DIR} +export DISTILLERY_ROOT_DIR +export SDK=$(shell if [ -z ${SDK_PATH} ]; then echo ${DISTILLERY_ROOT_DIR}/sdk/sdk; else echo ${SDK_PATH}; fi;) +export NDK=$(shell if [ -z ${NDK_PATH} ]; then echo ${DISTILLERY_ROOT_DIR}/sdk/ndk-bundle; else echo ${NDK_PATH}; fi;) +export CMAKE=$(shell if [ -z ${CMAKE_PATH} ]; then echo ${DISTILLERY_ROOT_DIR}/sdk/cmake/bin/; else echo ${CMAKE_PATH}; fi;) +export OS=$(shell uname | tr '[:upper:]' '[:lower:]') +export ARCH=$(shell uname -m) + +CCNX_COMPILE_ENVIRONMENT=-DCMAKE_TOOLCHAIN_FILE=${DISTILLERY_ROOT_DIR}/config/config.android +OPEN_SSL_DIR=-DOPENSSL_ROOT_DIR=${DISTILLERY_INSTALL_DIR} +LIBEVENT_ROOT=${DISTILLERY_INSTALL_DIR} +ABI=armeabi-v7a + diff --git a/config/modules/000-dependencies.mk b/config/modules/000-dependencies.mk new file mode 100644 index 00000000..30b5616b --- /dev/null +++ b/config/modules/000-dependencies.mk @@ -0,0 +1,6 @@ +define generate_file + ./init.sh ${ABI} ${NDK} + +endef +all: + $(call generate_file) diff --git a/config/modules/000-distillery-update.mk b/config/modules/000-distillery-update.mk new file mode 100644 index 00000000..efdab169 --- /dev/null +++ b/config/modules/000-distillery-update.mk @@ -0,0 +1,21 @@ +########################################## +# Tell people they need to use the "new" way. + +define errorMessage + $(warning * Attention, the configuration for GitHub has changed) + $(warning * DISTILLERY_GITHUB_USER is depricated. You shoud now) + $(warning * use DISTILLERY_GITHUB_URL_USER) + $(warning * DISTILLERY_GITHUB_SERVER is depricated. You shoud now) + $(warning * use DISTILLERY_GITHUB_URL) + $(warning * Set this in your config file .ccnx/distillery/config.mk) + $(warning * See config/config.mk for default values) + $(error ERROR: Make found depricated variable $1) +endef + +ifdef DISTILLERY_GITHUB_USER + $(call errorMessage,DISTILLERY_GITHUB_USER) +endif + +ifdef DISTILLERY_GITHUB_SERVER + $(call errorMessage,DISTILLERY_GITHUB_SERVER) +endif diff --git a/config/modules/000-gitModule.mk b/config/modules/000-gitModule.mk new file mode 100644 index 00000000..af500a19 --- /dev/null +++ b/config/modules/000-gitModule.mk @@ -0,0 +1,106 @@ +############################################################ +# Distillery Git Module +# +# This is a framework for Distillery Git Modules. +# +# Modules can add themselves do distillery by calling the addGitModule +# function. A module called Foo would do the following: +# +# $(eval $(call addGitModule,Foo)) +# +# Assumptions +# - The source for Foo is in git, located at: ${DISTILLERY_GITHUB_URL}/Foo +# You can change this via a variable, see bellow. +# +# Parameters: +# This function can be modified by setting some variables for the specified +# module. These variables must be set BEFORE you call the function. replace +# "Module" by the parameter passed on to the funcion. +# +# - Module_GIT_REPOSITORY +# URL to the Git repository of the source. +# Defaults to: ${DISTILLERY_GITHUB_URL}${DISTILLERY_GITHUB_URL_USER}/Foo +# You can modify this to point to a different repository. (git origin) +# - Module_GIT_UPSTREAM_REPOSITORY +# URL to the remote git repository to use as upstream. This defaults to +# ${DISTILLERY_GITHUB_UPSTREAM_URL}/Module. The remote will be added to git +# under the name ${DISTILLERY_GITHUB_UPSTREAM_NAME} +# - Module_SOURCE_DIR +# Location where the source will be downloaded. Don't change this unless you +# have a very good reason to. +# - Module_BUILD_DIR +# Location where the source will be built. Don't change this unless you have +# a very good reason to. + + +define addGitModule +$(eval $1_SOURCE_DIR?=${DISTILLERY_SOURCE_DIR}/$1) +$(eval $1_BUILD_DIR?=${DISTILLERY_BUILD_DIR}/$1) +$(eval $1_GIT_CONFIG?=${$1_SOURCE_DIR}/.git/config) +$(eval $1_GIT_REPOSITORY?=${DISTILLERY_GITHUB_URL}${DISTILLERY_GITHUB_URL_USER}/$1) +$(eval $1_GIT_UPSTREAM_REPOSITORY?=${DISTILLERY_GITHUB_UPSTREAM_URL}/$1) +$(eval gitmodules+=$1) + +status: $1.status + +$1.status: tools/bin/getStatus + @tools/bin/getStatus ${$1_SOURCE_DIR} + +fetch: $1.fetch + +$1.fetch: + @echo -------------------------------------------- + @echo $1 + @cd ${$1_SOURCE_DIR}; git fetch --all + +branch: $1.branch + +$1.branch: + @echo -------------------------------------------- + @echo $1 + @cd ${$1_SOURCE_DIR}; git branch -avv + @echo + +nuke-all-modules: $1.nuke + +$1.nuke: + @cd ${$1_SOURCE_DIR}; git clean -dfx && git reset --hard + +sync: $1.sync + +$1.sync: ${DISTILLERY_ROOT_DIR}/tools/bin/syncOriginMasterWithCCNXUpstream + @echo "-------------------------------------------------------------------" + @echo $1 + @cd ${$1_SOURCE_DIR}; ${DISTILLERY_ROOT_DIR}/tools/bin/syncOriginMasterWithCCNXUpstream + +update: $1.update + +$1.update: ${$1_GIT_CONFIG} + @echo "-------------------------------------------------------------------" + @echo "- Updating ${$1_SOURCE_DIR}" + @cd ${$1_SOURCE_DIR} && git fetch --all && git pull + @echo + +${$1_GIT_CONFIG}: tools/bin/gitCloneOneOf tools/bin/gitAddUpstream + @tools/bin/gitCloneOneOf $1 ${$1_SOURCE_DIR} ${$1_GIT_REPOSITORY} ${$1_GIT_UPSTREAM_REPOSITORY} + @tools/bin/gitAddUpstream $1 ${$1_SOURCE_DIR} ${DISTILLERY_GITHUB_UPSTREAM_NAME} ${$1_GIT_UPSTREAM_REPOSITORY} + +info: $1.info + +$1.info: + @echo "# $1 INFO " + @echo "$1_SOURCE_DIR = ${$1_SOURCE_DIR}" + @echo "$1_BUILD_DIR = ${$1_BUILD_DIR}" + @echo "$1_GIT_REPOSITORY = ${$1_GIT_REPOSITORY}" + @echo "$1_GIT_UPSTREAM_REPOSITORY = ${$1_GIT_UPSTREAM_REPOSITORY}" + +gitstatus: $1.gitstatus + +$1.gitstatus: tools/bin/gitStatus + @tools/bin/gitStatus $1 ${$1_SOURCE_DIR} ${$1_GIT_REPOSITORY} \ + ${DISTILLERY_GITHUB_UPSTREAM_NAME} ${$1_GIT_UPSTREAM_REPOSITORY} + +endef + +gitmodule.list: + @echo ${gitmodules} diff --git a/config/modules/001-modules.mk b/config/modules/001-modules.mk new file mode 100644 index 00000000..fbcf6536 --- /dev/null +++ b/config/modules/001-modules.mk @@ -0,0 +1,62 @@ +############################################################ +# Distillery Module +# +# This is a framework for Distillery Modules. +# +# Modules can add themselves do distillery by calling the addModule +# function. A module called Foo would do the following: +# +# $(eval $(call addModule,Foo)) +# +# Assumptions +# - The source for Foo is in git, located at: ${DISTILLERY_GITHUB_URL}/Foo +# You can change this via a variable, see bellow. +# - The source can do an off-tree build. +# +# Parameters: +# This function can be modified by setting some variables for the specified +# module. These variables must be set BEFORE you call the function. replace +# "Module" by the parameter passed on to the funcion. +# +# - Module_GIT_REPOSITORY +# URL to the Git repository of the source. +# Defaults to: ${DISTILLERY_GITHUB_URL}${DISTILLERY_GITHUB_URL_USER}/Foo +# You can modify this to point to a different repository. (git origin) +# - Module_GIT_UPSTREAM_REPOSITORY +# URL to the remote git repository to use as upstream. This defaults to +# ${DISTILLERY_GITHUB_UPSTREAM_URL}/Module. The remote will be added to git +# under the name ${DISTILLERY_GITHUB_UPSTREAM_NAME} +# - Module_SOURCE_DIR +# Location where the source will be downloaded. Don't change this unless you +# have a very good reason to. +# - Module_BUILD_DIR +# Location where the source will be built. Don't change this unless you have +# a very good reason to. +# - Module_XCODE_DIR +# Location where to put the xcode project Defaults to +# ${DISTILLERY_XCODE_DIR}/Module + + +define addModule +$(eval $(call addGitModule,$1)) +$(eval modules+=$1) + +$1: $1.build $1.install + +$1.step: $1.build $1.check $1.install + +$1.build: ${$1_BUILD_DIR}/Makefile + ${MAKE} ${MAKE_BUILD_FLAGS} -C ${$1_BUILD_DIR} + +$1.install: ${$1_BUILD_DIR}/Makefile + @${MAKE} ${MAKE_BUILD_FLAGS} -C ${$1_BUILD_DIR} install + +$1.clean: ${$1_BUILD_DIR}/Makefile + @${MAKE} ${MAKE_BUILD_FLAGS} -C ${$1_BUILD_DIR} clean + +$1.distclean: + rm -rf ${$1_BUILD_DIR} +endef + +module.list: + @echo ${modules} diff --git a/config/modules/002-cmake-modules.mk b/config/modules/002-cmake-modules.mk new file mode 100644 index 00000000..3378443c --- /dev/null +++ b/config/modules/002-cmake-modules.mk @@ -0,0 +1,91 @@ +############################################################ +# Distillery CMake Module +# +# This is a framework for Distillery Modules using cmake. +# +# Modules can add themselves do distillery by calling the addCMakeModule +# function. A module called Foo would do the following: +# +# $(eval $(call addCmakeModule,Foo)) +# +# Assumptions +# - The source for Foo is in git, located at: ${DISTILLERY_GITHUB_URL}/Foo +# You can change this via a variable, see bellow. +# - The source can do an off-tree build. +# - The source is compiled via CMake +# +# Parameters: +# This function can be modified by setting some variables for the specified +# module. These variables must be set BEFORE you call the function. replace +# "Module" by the parameter passed on to the funcion. +# +# - Module_GIT_REPOSITORY +# URL to the Git repository of the source. +# Defaults to: ${DISTILLERY_GITHUB_URL}${DISTILLERY_GITHUB_URL_USER}/Foo +# You can modify this to point to a different repository. (git origin) +# - Module_GIT_UPSTREAM_REPOSITORY +# URL to the remote git repository to use as upstream. This defaults to +# ${DISTILLERY_GITHUB_UPSTREAM_URL}/Module. The remote will be added to git +# under the name ${DISTILLERY_GITHUB_UPSTREAM_NAME} +# - Module_SOURCE_DIR +# Location where the source will be downloaded. Don't change this unless you +# have a very good reason to. +# - Module_BUILD_DIR +# Location where the source will be built. Don't change this unless you have +# a very good reason to. +# - Module_XCODE_DIR +# Location where to put the xcode project Defaults to +# ${DISTILLERY_XCODE_DIR}/Module + + + +define addCMakeModule +$(eval $(call addModule,$1)) +$(eval $1_XCODE_DIR?=${DISTILLERY_XCODE_DIR}/$1) +$(eval modules_xcode+=$1) + +${$1_BUILD_DIR}/Makefile: ${$1_SOURCE_DIR}/CMakeLists.txt ${DISTILLERY_STAMP} + mkdir -p ${$1_BUILD_DIR} + cd ${$1_BUILD_DIR}; \ + DEPENDENCY_HOME=${DISTILLERY_EXTERN_DIR} \ + ${CMAKE}/cmake ${$1_SOURCE_DIR} \ + -DOPENSSL_ROOT_DIR=OPEN_SSL_DIR \ + ${CMAKE_BUILD_TYPE_FLAG} \ + ${CCNX_COMPILE_ENVIRONMENT} \ + -DCMAKE_INSTALL_PREFIX=${DISTILLERY_INSTALL_DIR} + +${$1_SOURCE_DIR}/CMakeLists.txt: + @echo "**option **1" + @$(MAKE) distillery.checkout.error + +$1.check: ${$1_BUILD_DIR}/Makefile + @echo "**option **2" + @${MAKE} ${MAKE_BUILD_FLAGS} -C ${$1_BUILD_DIR} test ${CMAKE_MAKE_TEST_ARGS} + +$1.xcode: + @echo "**option **3" + @mkdir -p ${$1_XCODE_DIR} + @cd ${$1_XCODE_DIR} && {CMAKE}/cmake ${$1_SOURCE_DIR} + +$1.xcodeopen: $1.xcode + @echo "**option **4" + @open ${$1_XCODE_DIR}/$1.xcodeproj + +$1.coverage: + @echo "**option **5" + + @echo "### $1: " + @longbow-coverage-report ` find ${$1_BUILD_DIR} -type f -name 'test_*' -not -name '*\.*' ` + +$1.average-coverage: + @echo "**option **6" + @echo "### $1: " + @longbow-coverage-report -a ` find ${$1_BUILD_DIR} -type f -name 'test_*' -not -name '*\.*' ` + + +xcode: $1.xcode + +$1.documentation: + @${MAKE} ${MAKE_BUILD_FLAGS} -C ${$1_BUILD_DIR} documentation + +endef diff --git a/config/modules/002-make-modules.mk b/config/modules/002-make-modules.mk new file mode 100644 index 00000000..acb82a46 --- /dev/null +++ b/config/modules/002-make-modules.mk @@ -0,0 +1,50 @@ +############################################################ +# Distillery Make Module +# +# This is a framework for Distillery Modules using make. +# +# Modules can add themselves do distillery by calling the addMakeModule +# function. A module called Foo would do the following: +# +# $(eval $(call addMakeModule,Foo)) +# +# Assumptions +# - The source for Foo is in git, located at: ${DISTILLERY_GITHUB_URL}/Foo +# You can change this via a variable, see bellow. +# - The source can do an off-tree build. +# - The source is compiled via Make +# +# Parameters: +# This function can be modified by setting some variables for the specified +# module. These variables must be set BEFORE you call the function. replace +# "Module" by the parameter passed on to the funcion. +# +# - Module_GIT_REPOSITORY +# URL to the Git repository of the source. +# Defaults to: ${DISTILLERY_GITHUB_URL}${DISTILLERY_GITHUB_URL_USER}/Foo +# You can modify this to point to a different repository. (git origin) +# - Module_GIT_UPSTREAM_REPOSITORY +# URL to the remote git repository to use as upstream. This defaults to +# ${DISTILLERY_GITHUB_UPSTREAM_URL}/Module. The remote will be added to git +# under the name ${DISTILLERY_GITHUB_UPSTREAM_NAME} +# - Module_SOURCE_DIR +# Location where the source will be downloaded. Don't change this unless you +# have a very good reason to. +# - Module_BUILD_DIR +# Location where the source will be built. Don't change this unless you have +# a very good reason to. + + +define addMakeModule +$(eval $(call addModule,$1)) + +${$1_BUILD_DIR}/Makefile: ${$1_SOURCE_DIR}/Makefile + @cp -rf ${$1_SOURCE_DIR}/ ${$1_BUILD_DIR}/ + +${$1_SOURCE_DIR}/Makefile: + @$(MAKE) distillery.checkout.error + +$1.check: ${$1_BUILD_DIR}/Makefile + @${MAKE} ${MAKE_BUILD_FLAGS} -C ${$1_BUILD_DIR} check + +endef diff --git a/config/modules/100-distillery.mk b/config/modules/100-distillery.mk new file mode 100644 index 00000000..aebd7e70 --- /dev/null +++ b/config/modules/100-distillery.mk @@ -0,0 +1,2 @@ +CCNx_Distillery_SOURCE_DIR=${DISTILLERY_ROOT_DIR} +$(eval $(call addGitModule,CCNx_Distillery)) diff --git a/config/modules/110-longbow.mk b/config/modules/110-longbow.mk new file mode 100644 index 00000000..5ff627ea --- /dev/null +++ b/config/modules/110-longbow.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,cframework/longbow)) diff --git a/config/modules/120-libparc.mk b/config/modules/120-libparc.mk new file mode 100644 index 00000000..54aec63d --- /dev/null +++ b/config/modules/120-libparc.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,cframework/libparc)) diff --git a/config/modules/210-libccnx-common.mk b/config/modules/210-libccnx-common.mk new file mode 100644 index 00000000..c0e86394 --- /dev/null +++ b/config/modules/210-libccnx-common.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,ccnxlibs/libccnx-common)) diff --git a/config/modules/220-libccnx-transport-rta.mk b/config/modules/220-libccnx-transport-rta.mk new file mode 100644 index 00000000..4fb576d4 --- /dev/null +++ b/config/modules/220-libccnx-transport-rta.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,ccnxlibs/libccnx-transport-rta)) diff --git a/config/modules/230-libccnx-portal.mk b/config/modules/230-libccnx-portal.mk new file mode 100644 index 00000000..fee60acb --- /dev/null +++ b/config/modules/230-libccnx-portal.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,ccnxlibs/libccnx-portal)) diff --git a/config/modules/510-Metis.mk b/config/modules/510-Metis.mk new file mode 100644 index 00000000..ba11067e --- /dev/null +++ b/config/modules/510-Metis.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,sb-forwarder/metis)) diff --git a/config/modules/610-libdash.mk b/config/modules/610-libdash.mk new file mode 100644 index 00000000..9c697abb --- /dev/null +++ b/config/modules/610-libdash.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,libdash)) diff --git a/config/modules/610-libicnet.mk b/config/modules/610-libicnet.mk new file mode 100644 index 00000000..249f852c --- /dev/null +++ b/config/modules/610-libicnet.mk @@ -0,0 +1 @@ +$(eval $(call addCMakeModule,libicnet)) diff --git a/config/modules/README b/config/modules/README new file mode 100644 index 00000000..fca97fb8 --- /dev/null +++ b/config/modules/README @@ -0,0 +1,3 @@ +CCNx Distillery Modules + +These modules are loaded in order. diff --git a/external/libcurl_android/jni/Android.mk b/external/libcurl_android/jni/Android.mk new file mode 100644 index 00000000..5053e7d6 --- /dev/null +++ b/external/libcurl_android/jni/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/external/libcurl_android/jni/Application.mk b/external/libcurl_android/jni/Application.mk new file mode 100644 index 00000000..7bb1628b --- /dev/null +++ b/external/libcurl_android/jni/Application.mk @@ -0,0 +1,6 @@ +APP_ABI := armeabi-v7a + +APP_STL := gnustl_shared +APP_CPPFLAGS += -fexceptions -frtti -std=c++11 -Wno-deprecated-declarations +NDK_TOOLCHAIN_VERSION := 4.9 +APP_PLATFORM := android-21
\ No newline at end of file diff --git a/external/libcurl_android/jni/libcurl/Android.mk b/external/libcurl_android/jni/libcurl/Android.mk new file mode 100755 index 00000000..c8c57c48 --- /dev/null +++ b/external/libcurl_android/jni/libcurl/Android.mk @@ -0,0 +1,113 @@ +# Google Android makefile for curl and libcurl +# +# This file can be used when building curl using the full Android source +# release or the NDK. Most users do not want or need to do this; please +# instead read the Android section in docs/INSTALL for alternate +# methods. +# +# Place the curl source (including this makefile) into external/curl/ in the +# Android source tree. Then build them with 'make curl' or just 'make libcurl' +# from the Android root. Tested with Android versions 1.5, 2.1-2.3 +# +# Note: you must first create a curl_config.h file by running configure in the +# Android environment. The only way I've found to do this is tricky. Perform a +# normal Android build with libcurl in the source tree, providing the target +# "showcommands" to make. The build will eventually fail (because curl_config.h +# doesn't exist yet), but the compiler commands used to build curl will be +# shown. Now, from the external/curl/ directory, run curl's normal configure +# command with flags that match what Android itself uses. This will mean +# putting the compiler directory into the PATH, putting the -I, -isystem and +# -D options into CPPFLAGS, putting the -W, -m, -f, -O and -nostdlib options +# into CFLAGS, and putting the -Wl, -L and -l options into LIBS, along with the +# path to the files libgcc.a, crtbegin_dynamic.o, and ccrtend_android.o. +# Remember that the paths must be absolute since you will not be running +# configure from the same directory as the Android make. The normal +# cross-compiler options must also be set. Note that the -c, -o, -MD and +# similar flags must not be set. +# +# To see all the LIBS options, you'll need to do the "showcommands" trick on an +# executable that's already buildable and watch what flags Android uses to link +# it (dhcpcd is a good choice to watch). You'll also want to add -L options to +# LIBS that point to the out/.../obj/lib/ and out/.../obj/system/lib/ +# directories so that additional libraries can be found and used by curl. +# +# The end result will be a configure command that looks something like this +# (the environment variable A is set to the Android root path which makes the +# command shorter): +# +# A=`realpath ../..` && \ +# PATH="$A/prebuilt/linux-x86/toolchain/arm-eabi-X/bin:$PATH" \ +# ./configure --host=arm-linux CC=arm-eabi-gcc \ +# CPPFLAGS="-I $A/system/core/include ..." \ +# CFLAGS="-nostdlib -fno-exceptions -Wno-multichar ..." \ +# LIBS="$A/prebuilt/linux-x86/toolchain/arm-eabi-X/lib/gcc/arm-eabi/X\ +# /interwork/libgcc.a ..." +# +# Finally, copy the file COPYING to NOTICE so that the curl license gets put +# into the right place (but see the note about this below). +# +# Dan Fandrich +# November 2011 + +LOCAL_PATH:= $(call my-dir) + +common_CFLAGS := -Wpointer-arith -Wwrite-strings -Wunused -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal -Wno-multichar -Wsign-compare -Wno-format-nonliteral -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wno-system-headers -DHAVE_CONFIG_H + +######################### +# Build the libcurl library + +#include $(CLEAR_VARS) +#include $(LOCAL_PATH)/lib/Makefile.inc +#CURL_HEADERS := \ +# curlbuild.h \ +# curl.h \ +# curlrules.h \ +# curlver.h \ +# easy.h \ +# mprintf.h \ +# multi.h \ +# stdcheaders.h \ +# typecheck-gcc.h + +#LOCAL_SRC_FILES := $(addprefix lib/,$(CSOURCES)) +#LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/ $(LOCAL_PATH)/lib +#LOCAL_CFLAGS += $(common_CFLAGS) + +#LOCAL_COPY_HEADERS_TO := libcurl/curl +#LOCAL_COPY_HEADERS := $(addprefix include/curl/,$(CURL_HEADERS)) + +#LOCAL_MODULE:= curl-library +#LOCAL_MODULE_TAGS := optional + +# Copy the licence to a place where Android will find it. +# Actually, this doesn't quite work because the build system searches +# for NOTICE files before it gets to this point, so it will only be seen +# on subsequent builds. +#ALL_PREBUILT += $(LOCAL_PATH)/NOTICE +#$(LOCAL_PATH)/NOTICE: $(LOCAL_PATH)/COPYING | $(ACP) +# $(copy-file-to-target) + +#include $(BUILD_STATIC_LIBRARY) + + +######################### +# Build the curl binary + +include $(CLEAR_VARS) +include $(LOCAL_PATH)/src/Makefile.inc +LOCAL_SRC_FILES := $(addprefix src/,$(CURL_CFILES)) + +LOCAL_MODULE := curl +LOCAL_MODULE_TAGS := optional +LOCAL_STATIC_LIBRARIES := curl-library +LOCAL_SYSTEM_SHARED_LIBRARIES := libc + +LOCAL_C_INCLUDES += $(LOCAL_PATH)/include $(LOCAL_PATH)/lib + +# This may also need to include $(CURLX_CFILES) in order to correctly link +# if libcurl is changed to be built as a dynamic library +LOCAL_CFLAGS += $(common_CFLAGS) + +#include $(BUILD_EXECUTABLE) +include $(BUILD_STATIC_LIBRARY) + diff --git a/external/libevent_files/Android.mk b/external/libevent_files/Android.mk new file mode 100644 index 00000000..87b06f06 --- /dev/null +++ b/external/libevent_files/Android.mk @@ -0,0 +1,47 @@ +#################################### +# Build libevent as separate library + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE:= event +LOCAL_MODULE_TAGS:= optional + +LOCAL_SRC_FILES := \ + arc4random.c \ + buffer.c \ + bufferevent.c \ + bufferevent_filter.c \ + bufferevent_openssl.c \ + bufferevent_pair.c \ + bufferevent_ratelim.c \ + bufferevent_sock.c \ + epoll.c \ + epoll_sub.c \ + evdns.c \ + event.c \ + event_tagging.c \ + evmap.c \ + evrpc.c \ + evthread.c \ + evthread_pthread.c \ + evutil.c \ + evutil_rand.c \ + http.c \ + listener.c \ + log.c \ + poll.c \ + select.c \ + signal.c \ + strlcpy.c + +LOCAL_C_INCLUDES := \ + $(LOCAL_PATH) \ + $(LOCAL_PATH)/android \ + $(LOCAL_PATH)/include \ + $(DISTILLERY_ROOT_DIR)/usr/include + +LOCAL_CFLAGS := -DHAVE_CONFIG_H -DANDROID -fvisibility=hidden + +include $(BUILD_STATIC_LIBRARY) diff --git a/external/libevent_files/AndroidManifest.xml b/external/libevent_files/AndroidManifest.xml new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/external/libevent_files/AndroidManifest.xml diff --git a/external/libevent_files/Application.mk b/external/libevent_files/Application.mk new file mode 100644 index 00000000..866e083c --- /dev/null +++ b/external/libevent_files/Application.mk @@ -0,0 +1,5 @@ +APP_BUILD_SCRIPT := Android.mk +APP_ABI := armeabi-v7a +APP_PLATFORM := android-23 +APP_STL := gnustl_shared +APP_CPPFLAGS += -fexceptions -frtti -std=c++11 -Wno-deprecated-declarations diff --git a/external/libevent_files/android/event2/config.h b/external/libevent_files/android/event2/config.h new file mode 100644 index 00000000..e601874c --- /dev/null +++ b/external/libevent_files/android/event2/config.h @@ -0,0 +1,440 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if libevent should build without support for a debug mode */ +/* #undef DISABLE_DEBUG_MODE */ + +/* Define if libevent should not allow replacing the mm functions */ +/* #undef DISABLE_MM_REPLACEMENT */ + +/* Define if libevent should not be compiled with thread support */ +/* #undef DISABLE_THREAD_SUPPORT */ + +/* Define to 1 if you have the `arc4random' function. */ +#define HAVE_ARC4RANDOM 1 + +/* Define to 1 if you have the `arc4random_buf' function. */ +#define HAVE_ARC4RANDOM_BUF 1 + +/* Define to 1 if you have the <arpa/inet.h> header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the `clock_gettime' function. */ +#define HAVE_CLOCK_GETTIME 1 + +/* Define to 1 if you have the declaration of `CTL_KERN', and to 0 if you + don't. */ +/* #undef HAVE_DECL_CTL_KERN */ + +/* Define to 1 if you have the declaration of `KERN_ARND', and to 0 if you + don't. */ +/* #undef HAVE_DECL_KERN_ARND */ + +/* Define to 1 if you have the declaration of `KERN_RANDOM', and to 0 if you + don't. */ +/* #undef HAVE_DECL_KERN_RANDOM */ + +/* Define to 1 if you have the declaration of `RANDOM_UUID', and to 0 if you + don't. */ +/* #undef HAVE_DECL_RANDOM_UUID */ + +/* Define if /dev/poll is available */ +/* #undef HAVE_DEVPOLL */ + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if your system supports the epoll system calls */ +#define HAVE_EPOLL 1 + +/* Define to 1 if you have the `epoll_ctl' function. */ +#define HAVE_EPOLL_CTL 1 + +/* Define to 1 if you have the `eventfd' function. */ +#define HAVE_EVENTFD 1 + +/* Define if your system supports event ports */ +/* #undef HAVE_EVENT_PORTS */ + +/* Define to 1 if you have the `fcntl' function. */ +#define HAVE_FCNTL 1 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if the system has the type `fd_mask'. */ +/* #undef HAVE_FD_MASK */ + +/* Do we have getaddrinfo()? */ +#define HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getegid' function. */ +#define HAVE_GETEGID 1 + +/* Define to 1 if you have the `geteuid' function. */ +#define HAVE_GETEUID 1 + +/* Define this if you have any gethostbyname_r() */ +/* #undef HAVE_GETHOSTBYNAME_R */ + +/* Define this if gethostbyname_r takes 3 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_3_ARG */ + +/* Define this if gethostbyname_r takes 5 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_5_ARG */ + +/* Define this if gethostbyname_r takes 6 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_6_ARG */ + +/* Define to 1 if you have the `getnameinfo' function. */ +#define HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `getprotobynumber' function. */ +#define HAVE_GETPROTOBYNUMBER 1 + +/* Define to 1 if you have the `getservbyname' function. */ +/* #undef HAVE_GETSERVBYNAME */ + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `inet_aton' function. */ +#define HAVE_INET_ATON 1 + +/* Define to 1 if you have the `inet_ntop' function. */ +#define HAVE_INET_NTOP 1 + +/* Define to 1 if you have the `inet_pton' function. */ +#define HAVE_INET_PTON 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `issetugid' function. */ +#define HAVE_ISSETUGID 1 + +/* Define to 1 if you have the `kqueue' function. */ +/* #undef HAVE_KQUEUE */ + +/* Define if the system has zlib */ +/* #undef HAVE_LIBZ */ + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define to 1 if you have the <netdb.h> header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the <netinet/in6.h> header file. */ +#define HAVE_NETINET_IN6_H 1 + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define if the system has openssl */ +/* #undef HAVE_OPENSSL */ + +/* Define to 1 if you have the <openssl/bio.h> header file. */ +/* #undef HAVE_OPENSSL_BIO_H */ + +/* Define to 1 if you have the `pipe' function. */ +#define HAVE_PIPE 1 + +/* Define to 1 if you have the `poll' function. */ +#define HAVE_POLL 1 + +/* Define to 1 if you have the <poll.h> header file. */ +#define HAVE_POLL_H 1 + +/* Define to 1 if you have the `port_create' function. */ +/* #undef HAVE_PORT_CREATE */ + +/* Define to 1 if you have the <port.h> header file. */ +/* #undef HAVE_PORT_H */ + +/* Define if you have POSIX threads libraries and header files. */ +/* #undef HAVE_PTHREAD */ + +/* Define if we have pthreads on this system */ +#define HAVE_PTHREADS 1 + +/* Define to 1 if you have the `putenv' function. */ +#define HAVE_PUTENV 1 + +/* Define to 1 if the system has the type `sa_family_t'. */ +#define HAVE_SA_FAMILY_T 1 + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if you have the `sendfile' function. */ +#define HAVE_SENDFILE 1 + +/* Define to 1 if you have the `setenv' function. */ +#define HAVE_SETENV 1 + +/* Define if F_SETFD is defined in <fcntl.h> */ +#define HAVE_SETFD 1 + +/* Define to 1 if you have the `sigaction' function. */ +#define HAVE_SIGACTION 1 + +/* Define to 1 if you have the `signal' function. */ +/* #undef HAVE_SIGNAL */ + +/* Define to 1 if you have the `splice' function. */ +/* #undef HAVE_SPLICE */ + +/* Define to 1 if you have the <stdarg.h> header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the <stddef.h> header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcpy' function. */ +#define HAVE_STRLCPY 1 + +/* Define to 1 if you have the `strsep' function. */ +#define HAVE_STRSEP 1 + +/* Define to 1 if you have the `strtok_r' function. */ +#define HAVE_STRTOK_R 1 + +/* Define to 1 if you have the `strtoll' function. */ +#define HAVE_STRTOLL 1 + +/* Define to 1 if the system has the type `struct addrinfo'. */ +#define HAVE_STRUCT_ADDRINFO 1 + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR 1 + +/* Define to 1 if `s6_addr16' is a member of `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR_S6_ADDR16 1 + +/* Define to 1 if `s6_addr32' is a member of `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR_S6_ADDR32 1 + +/* Define to 1 if the system has the type `struct sockaddr_in6'. */ +#define HAVE_STRUCT_SOCKADDR_IN6 1 + +/* Define to 1 if `sin6_len' is a member of `struct sockaddr_in6'. */ +/* #undef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN */ + +/* Define to 1 if `sin_len' is a member of `struct sockaddr_in'. */ +/* #undef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ + +/* Define to 1 if the system has the type `struct sockaddr_storage'. */ +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 + +/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ +#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 + +/* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */ +/* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */ + +/* Define to 1 if you have the `sysctl' function. */ +/* #undef HAVE_SYSCTL */ + +/* Define to 1 if you have the <sys/devpoll.h> header file. */ +/* #undef HAVE_SYS_DEVPOLL_H */ + +/* Define to 1 if you have the <sys/epoll.h> header file. */ +#define HAVE_SYS_EPOLL_H 1 + +/* Define to 1 if you have the <sys/eventfd.h> header file. */ +#define HAVE_SYS_EVENTFD_H 1 + +/* Define to 1 if you have the <sys/event.h> header file. */ +/* #undef HAVE_SYS_EVENT_H */ + +/* Define to 1 if you have the <sys/ioctl.h> header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/param.h> header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the <sys/queue.h> header file. */ +#define HAVE_SYS_QUEUE_H 1 + +/* Define to 1 if you have the <sys/select.h> header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the <sys/sendfile.h> header file. */ +#define HAVE_SYS_SENDFILE_H 1 + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/sysctl.h> header file. */ +/* #undef HAVE_SYS_SYSCTL_H */ + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <sys/uio.h> header file. */ +#define HAVE_SYS_UIO_H 1 + +/* Define to 1 if you have the <sys/wait.h> header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */ +#define HAVE_TAILQFOREACH 1 + +/* Define if timeradd is defined in <sys/time.h> */ +#define HAVE_TIMERADD 1 + +/* Define if timerclear is defined in <sys/time.h> */ +#define HAVE_TIMERCLEAR 1 + +/* Define if timercmp is defined in <sys/time.h> */ +#define HAVE_TIMERCMP 1 + +/* Define if timerisset is defined in <sys/time.h> */ +#define HAVE_TIMERISSET 1 + +/* Define to 1 if the system has the type `uint16_t'. */ +#define HAVE_UINT16_T 1 + +/* Define to 1 if the system has the type `uint32_t'. */ +#define HAVE_UINT32_T 1 + +/* Define to 1 if the system has the type `uint64_t'. */ +#define HAVE_UINT64_T 1 + +/* Define to 1 if the system has the type `uint8_t'. */ +#define HAVE_UINT8_T 1 + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the `umask' function. */ +#define HAVE_UMASK 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `unsetenv' function. */ +#define HAVE_UNSETENV 1 + +/* Define to 1 if you have the `vasprintf' function. */ +#define HAVE_VASPRINTF 1 + +/* Define if kqueue works correctly with pipes */ +/* #undef HAVE_WORKING_KQUEUE */ + +/* Define to 1 if you have the <zlib.h> header file. */ +/* #undef HAVE_ZLIB_H */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Numeric representation of the version */ +#define NUMERIC_VERSION 0x02001400 + +/* Name of package */ +#define PACKAGE "libevent" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* The size of `pthread_t', as computed by sizeof. */ +#define SIZEOF_PTHREAD_T 4 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 4 + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 4 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#define TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#define VERSION "2.0.20-stable" + +/* Define to appropriate substitue if compiler doesnt have __func__ */ +/* #undef __func__ */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `int' if <sys/types.h> does not define. */ +/* #undef pid_t */ + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + +/* Define to unsigned int if you dont have it */ +/* #undef socklen_t */ + +/* Define to `int' if <sys/types.h> does not define. */ +/* #undef ssize_t */ diff --git a/external/libevent_files/android/event2/event-config.h b/external/libevent_files/android/event2/event-config.h new file mode 100644 index 00000000..14cd020e --- /dev/null +++ b/external/libevent_files/android/event2/event-config.h @@ -0,0 +1,464 @@ +/* event2/event-config.h + * + * This file was generated by autoconf when libevent was built, and post- + * processed by Libevent so that its macros would have a uniform prefix. + * + * DO NOT EDIT THIS FILE. + * + * Do not rely on macros in this file existing in later versions. + */ + +/* unfortunately, Android doesn't define a TAILQ_END, so add this here. + * hopefully bionic is fixed or someone reads this message before + * regenerating this file: + */ +#ifndef TAILQ_END +#define TAILQ_END(head) (NULL) +#endif +/* end android compat */ + +#ifndef _EVENT2_EVENT_CONFIG_H_ +#define _EVENT2_EVENT_CONFIG_H_ + +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if libevent should build without support for a debug mode */ +/* #undef _EVENT_DISABLE_DEBUG_MODE */ + +/* Define if libevent should not allow replacing the mm functions */ +/* #undef _EVENT_DISABLE_MM_REPLACEMENT */ + +/* Define if libevent should not be compiled with thread support */ +/* #undef _EVENT_DISABLE_THREAD_SUPPORT */ + +/* Define to 1 if you have the `arc4random' function. */ +#define _EVENT_HAVE_ARC4RANDOM 1 + +/* Define to 1 if you have the `arc4random_buf' function. */ +#define _EVENT_HAVE_ARC4RANDOM_BUF 1 + +/* Define to 1 if you have the <arpa/inet.h> header file. */ +#define _EVENT_HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the `clock_gettime' function. */ +#define _EVENT_HAVE_CLOCK_GETTIME 1 + +/* Define to 1 if you have the declaration of `CTL_KERN', and to 0 if you + don't. */ +/* #undef _EVENT_HAVE_DECL_CTL_KERN */ + +/* Define to 1 if you have the declaration of `KERN_ARND', and to 0 if you + don't. */ +/* #undef _EVENT_HAVE_DECL_KERN_ARND */ + +/* Define to 1 if you have the declaration of `KERN_RANDOM', and to 0 if you + don't. */ +/* #undef _EVENT_HAVE_DECL_KERN_RANDOM */ + +/* Define to 1 if you have the declaration of `RANDOM_UUID', and to 0 if you + don't. */ +/* #undef _EVENT_HAVE_DECL_RANDOM_UUID */ + +/* Define if /dev/poll is available */ +/* #undef _EVENT_HAVE_DEVPOLL */ + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define _EVENT_HAVE_DLFCN_H 1 + +/* Define if your system supports the epoll system calls */ +#define _EVENT_HAVE_EPOLL 1 + +/* Define to 1 if you have the `epoll_ctl' function. */ +#define _EVENT_HAVE_EPOLL_CTL 1 + +/* Define to 1 if you have the `eventfd' function. */ +#define _EVENT_HAVE_EVENTFD 1 + +/* Define if your system supports event ports */ +/* #undef _EVENT_HAVE_EVENT_PORTS */ + +/* Define to 1 if you have the `fcntl' function. */ +#define _EVENT_HAVE_FCNTL 1 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#define _EVENT_HAVE_FCNTL_H 1 + +/* Define to 1 if the system has the type `fd_mask'. */ +/* #undef _EVENT_HAVE_FD_MASK */ + +/* Do we have getaddrinfo()? */ +#define _EVENT_HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getegid' function. */ +#define _EVENT_HAVE_GETEGID 1 + +/* Define to 1 if you have the `geteuid' function. */ +#define _EVENT_HAVE_GETEUID 1 + +/* Define this if you have any gethostbyname_r() */ +/* #undef _EVENT_HAVE_GETHOSTBYNAME_R */ + +/* Define this if gethostbyname_r takes 3 arguments */ +/* #undef _EVENT_HAVE_GETHOSTBYNAME_R_3_ARG */ + +/* Define this if gethostbyname_r takes 5 arguments */ +/* #undef _EVENT_HAVE_GETHOSTBYNAME_R_5_ARG */ + +/* Define this if gethostbyname_r takes 6 arguments */ +/* #undef _EVENT_HAVE_GETHOSTBYNAME_R_6_ARG */ + +/* Define to 1 if you have the `getnameinfo' function. */ +#define _EVENT_HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `getprotobynumber' function. */ +#define _EVENT_HAVE_GETPROTOBYNUMBER 1 + +/* Define to 1 if you have the `getservbyname' function. */ +/* #undef _EVENT_HAVE_GETSERVBYNAME */ + +/* Define to 1 if you have the `gettimeofday' function. */ +#define _EVENT_HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `inet_aton' function. */ +#define _EVENT_HAVE_INET_ATON 1 + +/* Define to 1 if you have the `inet_ntop' function. */ +#define _EVENT_HAVE_INET_NTOP 1 + +/* Define to 1 if you have the `inet_pton' function. */ +#define _EVENT_HAVE_INET_PTON 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define _EVENT_HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `issetugid' function. */ +#define _EVENT_HAVE_ISSETUGID 1 + +/* Define to 1 if you have the `kqueue' function. */ +/* #undef _EVENT_HAVE_KQUEUE */ + +/* Define if the system has zlib */ +/* #undef _EVENT_HAVE_LIBZ */ + +/* Define to 1 if you have the <memory.h> header file. */ +#define _EVENT_HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +#define _EVENT_HAVE_MMAP 1 + +/* Define to 1 if you have the <netdb.h> header file. */ +#define _EVENT_HAVE_NETDB_H 1 + +/* Define to 1 if you have the <netinet/in6.h> header file. */ +#define _EVENT_HAVE_NETINET_IN6_H 1 + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#define _EVENT_HAVE_NETINET_IN_H 1 + +/* Define if the system has openssl */ +/* #undef _EVENT_HAVE_OPENSSL */ + +/* Define to 1 if you have the <openssl/bio.h> header file. */ +/* #undef _EVENT_HAVE_OPENSSL_BIO_H */ + +/* Define to 1 if you have the `pipe' function. */ +#define _EVENT_HAVE_PIPE 1 + +/* Define to 1 if you have the `poll' function. */ +#define _EVENT_HAVE_POLL 1 + +/* Define to 1 if you have the <poll.h> header file. */ +#define _EVENT_HAVE_POLL_H 1 + +/* Define to 1 if you have the `port_create' function. */ +/* #undef _EVENT_HAVE_PORT_CREATE */ + +/* Define to 1 if you have the <port.h> header file. */ +/* #undef _EVENT_HAVE_PORT_H */ + +/* Define if you have POSIX threads libraries and header files. */ +/* #undef _EVENT_HAVE_PTHREAD */ + +/* Define if we have pthreads on this system */ +#define _EVENT_HAVE_PTHREADS 1 + +/* Define to 1 if you have the `putenv' function. */ +#define _EVENT_HAVE_PUTENV 1 + +/* Define to 1 if the system has the type `sa_family_t'. */ +#define _EVENT_HAVE_SA_FAMILY_T 1 + +/* Define to 1 if you have the `select' function. */ +#define _EVENT_HAVE_SELECT 1 + +/* Define to 1 if you have the `sendfile' function. */ +#define _EVENT_HAVE_SENDFILE 1 + +/* Define to 1 if you have the `setenv' function. */ +#define _EVENT_HAVE_SETENV 1 + +/* Define if F_SETFD is defined in <fcntl.h> */ +#define _EVENT_HAVE_SETFD 1 + +/* Define to 1 if you have the `sigaction' function. */ +#define _EVENT_HAVE_SIGACTION 1 + +/* Define to 1 if you have the `signal' function. */ +/* #undef _EVENT_HAVE_SIGNAL */ + +/* Define to 1 if you have the `splice' function. */ +/* #undef _EVENT_HAVE_SPLICE */ + +/* Define to 1 if you have the <stdarg.h> header file. */ +#define _EVENT_HAVE_STDARG_H 1 + +/* Define to 1 if you have the <stddef.h> header file. */ +#define _EVENT_HAVE_STDDEF_H 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define _EVENT_HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define _EVENT_HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define _EVENT_HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define _EVENT_HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcpy' function. */ +#define _EVENT_HAVE_STRLCPY 1 + +/* Define to 1 if you have the `strsep' function. */ +#define _EVENT_HAVE_STRSEP 1 + +/* Define to 1 if you have the `strtok_r' function. */ +#define _EVENT_HAVE_STRTOK_R 1 + +/* Define to 1 if you have the `strtoll' function. */ +#define _EVENT_HAVE_STRTOLL 1 + +/* Define to 1 if the system has the type `struct addrinfo'. */ +#define _EVENT_HAVE_STRUCT_ADDRINFO 1 + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#define _EVENT_HAVE_STRUCT_IN6_ADDR 1 + +/* Define to 1 if `s6_addr16' is a member of `struct in6_addr'. */ +#define _EVENT_HAVE_STRUCT_IN6_ADDR_S6_ADDR16 1 + +/* Define to 1 if `s6_addr32' is a member of `struct in6_addr'. */ +#define _EVENT_HAVE_STRUCT_IN6_ADDR_S6_ADDR32 1 + +/* Define to 1 if the system has the type `struct sockaddr_in6'. */ +#define _EVENT_HAVE_STRUCT_SOCKADDR_IN6 1 + +/* Define to 1 if `sin6_len' is a member of `struct sockaddr_in6'. */ +/* #undef _EVENT_HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN */ + +/* Define to 1 if `sin_len' is a member of `struct sockaddr_in'. */ +/* #undef _EVENT_HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ + +/* Define to 1 if the system has the type `struct sockaddr_storage'. */ +#define _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE 1 + +/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ +#define _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 + +/* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */ +/* #undef _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */ + +/* Define to 1 if you have the `sysctl' function. */ +/* #undef _EVENT_HAVE_SYSCTL */ + +/* Define to 1 if you have the <sys/devpoll.h> header file. */ +/* #undef _EVENT_HAVE_SYS_DEVPOLL_H */ + +/* Define to 1 if you have the <sys/epoll.h> header file. */ +#define _EVENT_HAVE_SYS_EPOLL_H 1 + +/* Define to 1 if you have the <sys/eventfd.h> header file. */ +#define _EVENT_HAVE_SYS_EVENTFD_H 1 + +/* Define to 1 if you have the <sys/event.h> header file. */ +/* #undef _EVENT_HAVE_SYS_EVENT_H */ + +/* Define to 1 if you have the <sys/ioctl.h> header file. */ +#define _EVENT_HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define _EVENT_HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/param.h> header file. */ +#define _EVENT_HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the <sys/queue.h> header file. */ +#define _EVENT_HAVE_SYS_QUEUE_H 1 + +/* Define to 1 if you have the <sys/select.h> header file. */ +#define _EVENT_HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the <sys/sendfile.h> header file. */ +#define _EVENT_HAVE_SYS_SENDFILE_H 1 + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#define _EVENT_HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define _EVENT_HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/sysctl.h> header file. */ +/* #undef _EVENT_HAVE_SYS_SYSCTL_H */ + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define _EVENT_HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define _EVENT_HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <sys/uio.h> header file. */ +#define _EVENT_HAVE_SYS_UIO_H 1 + +/* Define to 1 if you have the <sys/wait.h> header file. */ +#define _EVENT_HAVE_SYS_WAIT_H 1 + +/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */ +/*#undef _EVENT_HAVE_TAILQFOREACH*/ + +/* Define if timeradd is defined in <sys/time.h> */ +#define _EVENT_HAVE_TIMERADD 1 + +/* Define if timerclear is defined in <sys/time.h> */ +#define _EVENT_HAVE_TIMERCLEAR 1 + +/* Define if timercmp is defined in <sys/time.h> */ +#define _EVENT_HAVE_TIMERCMP 1 + +/* Define if timerisset is defined in <sys/time.h> */ +#define _EVENT_HAVE_TIMERISSET 1 + +/* Define to 1 if the system has the type `uint16_t'. */ +#define _EVENT_HAVE_UINT16_T 1 + +/* Define to 1 if the system has the type `uint32_t'. */ +#define _EVENT_HAVE_UINT32_T 1 + +/* Define to 1 if the system has the type `uint64_t'. */ +#define _EVENT_HAVE_UINT64_T 1 + +/* Define to 1 if the system has the type `uint8_t'. */ +#define _EVENT_HAVE_UINT8_T 1 + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define _EVENT_HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the `umask' function. */ +#define _EVENT_HAVE_UMASK 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define _EVENT_HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `unsetenv' function. */ +#define _EVENT_HAVE_UNSETENV 1 + +/* Define to 1 if you have the `vasprintf' function. */ +#define _EVENT_HAVE_VASPRINTF 1 + +/* Define if kqueue works correctly with pipes */ +/* #undef _EVENT_HAVE_WORKING_KQUEUE */ + +/* Define to 1 if you have the <zlib.h> header file. */ +/* #undef _EVENT_HAVE_ZLIB_H */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define _EVENT_LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef _EVENT_NO_MINUS_C_MINUS_O */ + +/* Numeric representation of the version */ +#define _EVENT_NUMERIC_VERSION 0x02001400 + +/* Name of package */ +#define _EVENT_PACKAGE "libevent" + +/* Define to the address where bug reports for this package should be sent. */ +#define _EVENT_PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define _EVENT_PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define _EVENT_PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define _EVENT_PACKAGE_TARNAME "" + +/* Define to the home page for this package. */ +#define _EVENT_PACKAGE_URL "" + +/* Define to the version of this package. */ +#define _EVENT_PACKAGE_VERSION "" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef _EVENT_PTHREAD_CREATE_JOINABLE */ + +/* The size of `int', as computed by sizeof. */ +#define _EVENT_SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define _EVENT_SIZEOF_LONG 4 + +/* The size of `long long', as computed by sizeof. */ +#define _EVENT_SIZEOF_LONG_LONG 8 + +/* The size of `pthread_t', as computed by sizeof. */ +#define _EVENT_SIZEOF_PTHREAD_T 4 + +/* The size of `short', as computed by sizeof. */ +#define _EVENT_SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define _EVENT_SIZEOF_SIZE_T 4 + +/* The size of `void *', as computed by sizeof. */ +#define _EVENT_SIZEOF_VOID_P 4 + +/* Define to 1 if you have the ANSI C header files. */ +#define _EVENT_STDC_HEADERS 1 + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#define _EVENT_TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#define _EVENT_VERSION "2.0.20-stable" + +/* Define to appropriate substitue if compiler doesnt have __func__ */ +/* #undef _EVENT___func__ */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef _EVENT_const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef _EVENT___cplusplus +/* #undef _EVENT_inline */ +#endif + +/* Define to `int' if <sys/types.h> does not define. */ +/* #undef _EVENT_pid_t */ + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef _EVENT_size_t */ + +/* Define to unsigned int if you dont have it */ +/* #undef _EVENT_socklen_t */ + +/* Define to `int' if <sys/types.h> does not define. */ +/* #undef _EVENT_ssize_t */ + +#endif /* event2/event-config.h */ diff --git a/external/libevent_files/arc4random.c b/external/libevent_files/arc4random.c new file mode 100644 index 00000000..ee13a34f --- /dev/null +++ b/external/libevent_files/arc4random.c @@ -0,0 +1,555 @@ +/* Portable arc4random.c based on arc4random.c from OpenBSD. + * Portable version by Chris Davis, adapted for Libevent by Nick Mathewson + * Copyright (c) 2010 Chris Davis, Niels Provos, and Nick Mathewson + * Copyright (c) 2010-2012 Niels Provos and Nick Mathewson + * + * Note that in Libevent, this file isn't compiled directly. Instead, + * it's included from evutil_rand.c + */ + +/* + * Copyright (c) 1996, David Mazieres <dm@uun.org> + * Copyright (c) 2008, Damien Miller <djm@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Arc4 random number generator for OpenBSD. + * + * This code is derived from section 17.1 of Applied Cryptography, + * second edition, which describes a stream cipher allegedly + * compatible with RSA Labs "RC4" cipher (the actual description of + * which is a trade secret). The same algorithm is used as a stream + * cipher called "arcfour" in Tatu Ylonen's ssh package. + * + * Here the stream cipher has been modified always to include the time + * when initializing the state. That makes it impossible to + * regenerate the same random sequence twice, so this can't be used + * for encryption, but will generate good random numbers. + * + * RC4 is a registered trademark of RSA Laboratories. + */ + +#ifndef ARC4RANDOM_EXPORT +#define ARC4RANDOM_EXPORT +#endif + +#ifndef ARC4RANDOM_UINT32 +#define ARC4RANDOM_UINT32 uint32_t +#endif + +#ifndef ARC4RANDOM_NO_INCLUDES +#ifdef WIN32 +#include <wincrypt.h> +#include <process.h> +#else +#include <fcntl.h> +#include <unistd.h> +#include <sys/param.h> +#include <sys/time.h> +#ifdef _EVENT_HAVE_SYS_SYSCTL_H +#include <sys/sysctl.h> +#endif +#endif +#include <limits.h> +#include <stdlib.h> +#include <string.h> +#endif + +/* Add platform entropy 32 bytes (256 bits) at a time. */ +#define ADD_ENTROPY 32 + +/* Re-seed from the platform RNG after generating this many bytes. */ +#define BYTES_BEFORE_RESEED 1600000 + +struct arc4_stream { + unsigned char i; + unsigned char j; + unsigned char s[256]; +}; + +#ifdef WIN32 +#define getpid _getpid +#define pid_t int +#endif + +static int rs_initialized; +static struct arc4_stream rs; +static pid_t arc4_stir_pid; +static int arc4_count; +static int arc4_seeded_ok; + +static inline unsigned char arc4_getbyte(void); + +static inline void +arc4_init(void) +{ + int n; + + for (n = 0; n < 256; n++) + rs.s[n] = n; + rs.i = 0; + rs.j = 0; +} + +static inline void +arc4_addrandom(const unsigned char *dat, int datlen) +{ + int n; + unsigned char si; + + rs.i--; + for (n = 0; n < 256; n++) { + rs.i = (rs.i + 1); + si = rs.s[rs.i]; + rs.j = (rs.j + si + dat[n % datlen]); + rs.s[rs.i] = rs.s[rs.j]; + rs.s[rs.j] = si; + } + rs.j = rs.i; +} + +#ifndef WIN32 +static ssize_t +read_all(int fd, unsigned char *buf, size_t count) +{ + size_t numread = 0; + ssize_t result; + + while (numread < count) { + result = read(fd, buf+numread, count-numread); + if (result<0) + return -1; + else if (result == 0) + break; + numread += result; + } + + return (ssize_t)numread; +} +#endif + +#ifdef WIN32 +#define TRY_SEED_WIN32 +static int +arc4_seed_win32(void) +{ + /* This is adapted from Tor's crypto_seed_rng() */ + static int provider_set = 0; + static HCRYPTPROV provider; + unsigned char buf[ADD_ENTROPY]; + + if (!provider_set) { + if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) { + if (GetLastError() != (DWORD)NTE_BAD_KEYSET) + return -1; + } + provider_set = 1; + } + if (!CryptGenRandom(provider, sizeof(buf), buf)) + return -1; + arc4_addrandom(buf, sizeof(buf)); + evutil_memclear_(buf, sizeof(buf)); + arc4_seeded_ok = 1; + return 0; +} +#endif + +#if defined(_EVENT_HAVE_SYS_SYSCTL_H) && defined(_EVENT_HAVE_SYSCTL) +#if _EVENT_HAVE_DECL_CTL_KERN && _EVENT_HAVE_DECL_KERN_RANDOM && _EVENT_HAVE_DECL_RANDOM_UUID +#define TRY_SEED_SYSCTL_LINUX +static int +arc4_seed_sysctl_linux(void) +{ + /* Based on code by William Ahern, this function tries to use the + * RANDOM_UUID sysctl to get entropy from the kernel. This can work + * even if /dev/urandom is inaccessible for some reason (e.g., we're + * running in a chroot). */ + int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID }; + unsigned char buf[ADD_ENTROPY]; + size_t len, n; + unsigned i; + int any_set; + + memset(buf, 0, sizeof(buf)); + + for (len = 0; len < sizeof(buf); len += n) { + n = sizeof(buf) - len; + + if (0 != sysctl(mib, 3, &buf[len], &n, NULL, 0)) + return -1; + } + /* make sure that the buffer actually got set. */ + for (i=0,any_set=0; i<sizeof(buf); ++i) { + any_set |= buf[i]; + } + if (!any_set) + return -1; + + arc4_addrandom(buf, sizeof(buf)); + evutil_memclear_(buf, sizeof(buf)); + arc4_seeded_ok = 1; + return 0; +} +#endif + +#if _EVENT_HAVE_DECL_CTL_KERN && _EVENT_HAVE_DECL_KERN_ARND +#define TRY_SEED_SYSCTL_BSD +static int +arc4_seed_sysctl_bsd(void) +{ + /* Based on code from William Ahern and from OpenBSD, this function + * tries to use the KERN_ARND syscall to get entropy from the kernel. + * This can work even if /dev/urandom is inaccessible for some reason + * (e.g., we're running in a chroot). */ + int mib[] = { CTL_KERN, KERN_ARND }; + unsigned char buf[ADD_ENTROPY]; + size_t len, n; + int i, any_set; + + memset(buf, 0, sizeof(buf)); + + len = sizeof(buf); + if (sysctl(mib, 2, buf, &len, NULL, 0) == -1) { + for (len = 0; len < sizeof(buf); len += sizeof(unsigned)) { + n = sizeof(unsigned); + if (n + len > sizeof(buf)) + n = len - sizeof(buf); + if (sysctl(mib, 2, &buf[len], &n, NULL, 0) == -1) + return -1; + } + } + /* make sure that the buffer actually got set. */ + for (i=any_set=0; i<sizeof(buf); ++i) { + any_set |= buf[i]; + } + if (!any_set) + return -1; + + arc4_addrandom(buf, sizeof(buf)); + evutil_memclear_(buf, sizeof(buf)); + arc4_seeded_ok = 1; + return 0; +} +#endif +#endif /* defined(_EVENT_HAVE_SYS_SYSCTL_H) */ + +#ifdef __linux__ +#define TRY_SEED_PROC_SYS_KERNEL_RANDOM_UUID +static int +arc4_seed_proc_sys_kernel_random_uuid(void) +{ + /* Occasionally, somebody will make /proc/sys accessible in a chroot, + * but not /dev/urandom. Let's try /proc/sys/kernel/random/uuid. + * Its format is stupid, so we need to decode it from hex. + */ + int fd; + char buf[128]; + unsigned char entropy[64]; + int bytes, n, i, nybbles; + for (bytes = 0; bytes<ADD_ENTROPY; ) { + fd = evutil_open_closeonexec("/proc/sys/kernel/random/uuid", O_RDONLY, 0); + if (fd < 0) + return -1; + n = read(fd, buf, sizeof(buf)); + close(fd); + if (n<=0) + return -1; + memset(entropy, 0, sizeof(entropy)); + for (i=nybbles=0; i<n; ++i) { + if (EVUTIL_ISXDIGIT(buf[i])) { + int nyb = evutil_hex_char_to_int(buf[i]); + if (nybbles & 1) { + entropy[nybbles/2] |= nyb; + } else { + entropy[nybbles/2] |= nyb<<4; + } + ++nybbles; + } + } + if (nybbles < 2) + return -1; + arc4_addrandom(entropy, nybbles/2); + bytes += nybbles/2; + } + evutil_memclear_(entropy, sizeof(entropy)); + evutil_memclear_(buf, sizeof(buf)); + arc4_seeded_ok = 1; + return 0; +} +#endif + +#ifndef WIN32 +#define TRY_SEED_URANDOM +static char *arc4random_urandom_filename = NULL; + +static int arc4_seed_urandom_helper_(const char *fname) +{ + unsigned char buf[ADD_ENTROPY]; + int fd; + size_t n; + + fd = evutil_open_closeonexec(fname, O_RDONLY, 0); + if (fd<0) + return -1; + n = read_all(fd, buf, sizeof(buf)); + close(fd); + if (n != sizeof(buf)) + return -1; + arc4_addrandom(buf, sizeof(buf)); + evutil_memclear_(buf, sizeof(buf)); + arc4_seeded_ok = 1; + return 0; +} + +static int +arc4_seed_urandom(void) +{ + /* This is adapted from Tor's crypto_seed_rng() */ + static const char *filenames[] = { + "/dev/srandom", "/dev/urandom", "/dev/random", NULL + }; + int i; + if (arc4random_urandom_filename) + return arc4_seed_urandom_helper_(arc4random_urandom_filename); + + for (i = 0; filenames[i]; ++i) { + if (arc4_seed_urandom_helper_(filenames[i]) == 0) { + return 0; + } + } + + return -1; +} +#endif + +static int +arc4_seed(void) +{ + int ok = 0; + /* We try every method that might work, and don't give up even if one + * does seem to work. There's no real harm in over-seeding, and if + * one of these sources turns out to be broken, that would be bad. */ +#ifdef TRY_SEED_WIN32 + if (0 == arc4_seed_win32()) + ok = 1; +#endif +#ifdef TRY_SEED_URANDOM + if (0 == arc4_seed_urandom()) + ok = 1; +#endif +#ifdef TRY_SEED_PROC_SYS_KERNEL_RANDOM_UUID + if (arc4random_urandom_filename == NULL && + 0 == arc4_seed_proc_sys_kernel_random_uuid()) + ok = 1; +#endif +#ifdef TRY_SEED_SYSCTL_LINUX + /* Apparently Linux is deprecating sysctl, and spewing warning + * messages when you try to use it. */ + if (!ok && 0 == arc4_seed_sysctl_linux()) + ok = 1; +#endif +#ifdef TRY_SEED_SYSCTL_BSD + if (0 == arc4_seed_sysctl_bsd()) + ok = 1; +#endif + return ok ? 0 : -1; +} + +static int +arc4_stir(void) +{ + int i; + + if (!rs_initialized) { + arc4_init(); + rs_initialized = 1; + } + + arc4_seed(); + if (!arc4_seeded_ok) + return -1; + + /* + * Discard early keystream, as per recommendations in + * "Weaknesses in the Key Scheduling Algorithm of RC4" by + * Scott Fluhrer, Itsik Mantin, and Adi Shamir. + * http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps + * + * Ilya Mironov's "(Not So) Random Shuffles of RC4" suggests that + * we drop at least 2*256 bytes, with 12*256 as a conservative + * value. + * + * RFC4345 says to drop 6*256. + * + * At least some versions of this code drop 4*256, in a mistaken + * belief that "words" in the Fluhrer/Mantin/Shamir paper refers + * to processor words. + * + * We add another sect to the cargo cult, and choose 12*256. + */ + for (i = 0; i < 12*256; i++) + (void)arc4_getbyte(); + + arc4_count = BYTES_BEFORE_RESEED; + + return 0; +} + + +static void +arc4_stir_if_needed(void) +{ + pid_t pid = getpid(); + + if (arc4_count <= 0 || !rs_initialized || arc4_stir_pid != pid) + { + arc4_stir_pid = pid; + arc4_stir(); + } +} + +static inline unsigned char +arc4_getbyte(void) +{ + unsigned char si, sj; + + rs.i = (rs.i + 1); + si = rs.s[rs.i]; + rs.j = (rs.j + si); + sj = rs.s[rs.j]; + rs.s[rs.i] = sj; + rs.s[rs.j] = si; + return (rs.s[(si + sj) & 0xff]); +} + +static inline unsigned int +arc4_getword(void) +{ + unsigned int val; + + val = arc4_getbyte() << 24; + val |= arc4_getbyte() << 16; + val |= arc4_getbyte() << 8; + val |= arc4_getbyte(); + + return val; +} + +#ifndef ARC4RANDOM_NOSTIR +ARC4RANDOM_EXPORT int +arc4random_stir(void) +{ + int val; + //_ARC4_LOCK(); + val = arc4_stir(); + //_ARC4_UNLOCK(); + return val; +} +#endif + +#ifndef ARC4RANDOM_NOADDRANDOM +ARC4RANDOM_EXPORT void +arc4random_addrandom(const unsigned char *dat, int datlen) +{ + int j; + //_ARC4_LOCK(); + if (!rs_initialized) + arc4_stir(); + for (j = 0; j < datlen; j += 256) { + /* arc4_addrandom() ignores all but the first 256 bytes of + * its input. We want to make sure to look at ALL the + * data in 'dat', just in case the user is doing something + * crazy like passing us all the files in /var/log. */ + arc4_addrandom(dat + j, datlen - j); + } + //_ARC4_UNLOCK(); +} +#endif + +#ifndef ARC4RANDOM_NORANDOM +ARC4RANDOM_EXPORT ARC4RANDOM_UINT32 +arc4random(void) +{ + ARC4RANDOM_UINT32 val; + //_ARC4_LOCK(); + arc4_count -= 4; + arc4_stir_if_needed(); + val = arc4_getword(); + //_ARC4_UNLOCK(); + return val; +} +#endif + +ARC4RANDOM_EXPORT void +arc4random_buf(void *_buf, size_t n) +{ + unsigned char *buf = _buf; + //_ARC4_LOCK(); + arc4_stir_if_needed(); + while (n--) { + if (--arc4_count <= 0) + arc4_stir(); + buf[n] = arc4_getbyte(); + } + //_ARC4_UNLOCK(); +} + +#ifndef ARC4RANDOM_NOUNIFORM +/* + * Calculate a uniformly distributed random number less than upper_bound + * avoiding "modulo bias". + * + * Uniformity is achieved by generating new random numbers until the one + * returned is outside the range [0, 2**32 % upper_bound). This + * guarantees the selected random number will be inside + * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) + * after reduction modulo upper_bound. + */ +ARC4RANDOM_EXPORT unsigned int +arc4random_uniform(unsigned int upper_bound) +{ + ARC4RANDOM_UINT32 r, min; + + if (upper_bound < 2) + return 0; + +#if (UINT_MAX > 0xffffffffUL) + min = 0x100000000UL % upper_bound; +#else + /* Calculate (2**32 % upper_bound) avoiding 64-bit math */ + if (upper_bound > 0x80000000) + min = 1 + ~upper_bound; /* 2**32 - upper_bound */ + else { + /* (2**32 - (x * 2)) % x == 2**32 % x when x <= 2**31 */ + min = ((0xffffffff - (upper_bound * 2)) + 1) % upper_bound; + } +#endif + + /* + * This could theoretically loop forever but each retry has + * p > 0.5 (worst case, usually far better) of selecting a + * number inside the range we need, so it should rarely need + * to re-roll. + */ + for (;;) { + r = arc4random(); + if (r >= min) + break; + } + + return r % upper_bound; +} +#endif diff --git a/external/libevent_files/evutil.c b/external/libevent_files/evutil.c new file mode 100644 index 00000000..05e662aa --- /dev/null +++ b/external/libevent_files/evutil.c @@ -0,0 +1,2190 @@ +/* + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "event2/event-config.h" + +#define _GNU_SOURCE + +#ifdef WIN32 +#include <winsock2.h> +#include <ws2tcpip.h> +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#undef WIN32_LEAN_AND_MEAN +#include <io.h> +#include <tchar.h> +#endif + +#include <sys/types.h> +#ifdef _EVENT_HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef _EVENT_HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef _EVENT_HAVE_FCNTL_H +#include <fcntl.h> +#endif +#ifdef _EVENT_HAVE_STDLIB_H +#include <stdlib.h> +#endif +#include <errno.h> +#include <limits.h> +#include <stdio.h> +#include <string.h> +#ifdef _EVENT_HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#ifdef _EVENT_HAVE_NETINET_IN6_H +#include <netinet/in6.h> +#endif +#ifdef _EVENT_HAVE_ARPA_INET_H +#include <arpa/inet.h> +#endif + +#ifndef _EVENT_HAVE_GETTIMEOFDAY +#include <sys/timeb.h> +#include <time.h> +#endif +#include <sys/stat.h> + +#include "event2/util.h" +#include "util-internal.h" +#include "log-internal.h" +#include "mm-internal.h" + +#include "strlcpy-internal.h" +#include "ipv6-internal.h" + +#ifdef WIN32 +#define open _open +#define read _read +#define close _close +#define fstat _fstati64 +#define stat _stati64 +#define mode_t int +#endif + +int +evutil_open_closeonexec(const char *pathname, int flags, unsigned mode) +{ + int fd; + +#ifdef O_CLOEXEC + flags |= O_CLOEXEC; +#endif + + if (flags & O_CREAT) + fd = open(pathname, flags, (mode_t)mode); + else + fd = open(pathname, flags); + if (fd < 0) + return -1; + +#if !defined(O_CLOEXEC) && defined(FD_CLOEXEC) + if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) + return -1; +#endif + + return fd; +} + +/** + Read the contents of 'filename' into a newly allocated NUL-terminated + string. Set *content_out to hold this string, and *len_out to hold its + length (not including the appended NUL). If 'is_binary', open the file in + binary mode. + + Returns 0 on success, -1 if the open fails, and -2 for all other failures. + + Used internally only; may go away in a future version. + */ +int +evutil_read_file(const char *filename, char **content_out, size_t *len_out, + int is_binary) +{ + int fd, r; + struct stat st; + char *mem; + size_t read_so_far=0; + int mode = O_RDONLY; + + EVUTIL_ASSERT(content_out); + EVUTIL_ASSERT(len_out); + *content_out = NULL; + *len_out = 0; + +#ifdef O_BINARY + if (is_binary) + mode |= O_BINARY; +#endif + + fd = evutil_open_closeonexec(filename, mode, 0); + if (fd < 0) + return -1; + if (fstat(fd, &st) || st.st_size < 0 || + st.st_size > EV_SSIZE_MAX-1 ) { + close(fd); + return -2; + } + mem = mm_malloc((size_t)st.st_size + 1); + if (!mem) { + close(fd); + return -2; + } + read_so_far = 0; +#ifdef WIN32 +#define N_TO_READ(x) ((x) > INT_MAX) ? INT_MAX : ((int)(x)) +#else +#define N_TO_READ(x) (x) +#endif + while ((r = read(fd, mem+read_so_far, N_TO_READ(st.st_size - read_so_far))) > 0) { + read_so_far += r; + if (read_so_far >= (size_t)st.st_size) + break; + EVUTIL_ASSERT(read_so_far < (size_t)st.st_size); + } + close(fd); + if (r < 0) { + mm_free(mem); + return -2; + } + mem[read_so_far] = 0; + + *len_out = read_so_far; + *content_out = mem; + return 0; +} + +int +evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2]) +{ +#ifndef WIN32 + return socketpair(family, type, protocol, fd); +#else + return evutil_ersatz_socketpair(family, type, protocol, fd); +#endif +} + +int +evutil_ersatz_socketpair(int family, int type, int protocol, + evutil_socket_t fd[2]) +{ + /* This code is originally from Tor. Used with permission. */ + + /* This socketpair does not work when localhost is down. So + * it's really not the same thing at all. But it's close enough + * for now, and really, when localhost is down sometimes, we + * have other problems too. + */ +#ifdef WIN32 +#define ERR(e) WSA##e +#else +#define ERR(e) e +#endif + evutil_socket_t listener = -1; + evutil_socket_t connector = -1; + evutil_socket_t acceptor = -1; + struct sockaddr_in listen_addr; + struct sockaddr_in connect_addr; + ev_socklen_t size; + int saved_errno = -1; + + if (protocol + || (family != AF_INET +#ifdef AF_UNIX + && family != AF_UNIX +#endif + )) { + EVUTIL_SET_SOCKET_ERROR(ERR(EAFNOSUPPORT)); + return -1; + } + if (!fd) { + EVUTIL_SET_SOCKET_ERROR(ERR(EINVAL)); + return -1; + } + + listener = socket(AF_INET, type, 0); + if (listener < 0) + return -1; + memset(&listen_addr, 0, sizeof(listen_addr)); + listen_addr.sin_family = AF_INET; + listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + listen_addr.sin_port = 0; /* kernel chooses port. */ + if (bind(listener, (struct sockaddr *) &listen_addr, sizeof (listen_addr)) + == -1) + goto tidy_up_and_fail; + if (listen(listener, 1) == -1) + goto tidy_up_and_fail; + + connector = socket(AF_INET, type, 0); + if (connector < 0) + goto tidy_up_and_fail; + /* We want to find out the port number to connect to. */ + size = sizeof(connect_addr); + if (getsockname(listener, (struct sockaddr *) &connect_addr, &size) == -1) + goto tidy_up_and_fail; + if (size != sizeof (connect_addr)) + goto abort_tidy_up_and_fail; + if (connect(connector, (struct sockaddr *) &connect_addr, + sizeof(connect_addr)) == -1) + goto tidy_up_and_fail; + + size = sizeof(listen_addr); + acceptor = accept(listener, (struct sockaddr *) &listen_addr, &size); + if (acceptor < 0) + goto tidy_up_and_fail; + if (size != sizeof(listen_addr)) + goto abort_tidy_up_and_fail; + /* Now check we are talking to ourself by matching port and host on the + two sockets. */ + if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1) + goto tidy_up_and_fail; + if (size != sizeof (connect_addr) + || listen_addr.sin_family != connect_addr.sin_family + || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr + || listen_addr.sin_port != connect_addr.sin_port) + goto abort_tidy_up_and_fail; + evutil_closesocket(listener); + fd[0] = connector; + fd[1] = acceptor; + + return 0; + + abort_tidy_up_and_fail: + saved_errno = ERR(ECONNABORTED); + tidy_up_and_fail: + if (saved_errno < 0) + saved_errno = EVUTIL_SOCKET_ERROR(); + if (listener != -1) + evutil_closesocket(listener); + if (connector != -1) + evutil_closesocket(connector); + if (acceptor != -1) + evutil_closesocket(acceptor); + + EVUTIL_SET_SOCKET_ERROR(saved_errno); + return -1; +#undef ERR +} + +int +evutil_make_socket_nonblocking(evutil_socket_t fd) +{ +#ifdef WIN32 + { + u_long nonblocking = 1; + if (ioctlsocket(fd, FIONBIO, &nonblocking) == SOCKET_ERROR) { + event_sock_warn(fd, "fcntl(%d, F_GETFL)", (int)fd); + return -1; + } + } +#else + { + int flags; + if ((flags = fcntl(fd, F_GETFL, NULL)) < 0) { + event_warn("fcntl(%d, F_GETFL)", fd); + return -1; + } + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) { + event_warn("fcntl(%d, F_SETFL)", fd); + return -1; + } + } +#endif + return 0; +} + +int +evutil_make_listen_socket_reuseable(evutil_socket_t sock) +{ +#ifndef WIN32 + int one = 1; + /* REUSEADDR on Unix means, "don't hang on to this address after the + * listener is closed." On Windows, though, it means "don't keep other + * processes from binding to this address while we're using it. */ + return setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one, + (ev_socklen_t)sizeof(one)); +#else + return 0; +#endif +} + +int +evutil_make_socket_closeonexec(evutil_socket_t fd) +{ +#if !defined(WIN32) && defined(_EVENT_HAVE_SETFD) + int flags; + if ((flags = fcntl(fd, F_GETFD, NULL)) < 0) { + event_warn("fcntl(%d, F_GETFD)", fd); + return -1; + } + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { + event_warn("fcntl(%d, F_SETFD)", fd); + return -1; + } +#endif + return 0; +} + +int +evutil_closesocket(evutil_socket_t sock) +{ +#ifndef WIN32 + return close(sock); +#else + return closesocket(sock); +#endif +} + +ev_int64_t +evutil_strtoll(const char *s, char **endptr, int base) +{ +#ifdef _EVENT_HAVE_STRTOLL + return (ev_int64_t)strtoll(s, endptr, base); +#elif _EVENT_SIZEOF_LONG == 8 + return (ev_int64_t)strtol(s, endptr, base); +#elif defined(WIN32) && defined(_MSC_VER) && _MSC_VER < 1300 + /* XXXX on old versions of MS APIs, we only support base + * 10. */ + ev_int64_t r; + if (base != 10) + return 0; + r = (ev_int64_t) _atoi64(s); + while (isspace(*s)) + ++s; + if (*s == '-') + ++s; + while (isdigit(*s)) + ++s; + if (endptr) + *endptr = (char*) s; + return r; +#elif defined(WIN32) + return (ev_int64_t) _strtoi64(s, endptr, base); +#elif defined(_EVENT_SIZEOF_LONG_LONG) && _EVENT_SIZEOF_LONG_LONG == 8 + long long r; + int n; + if (base != 10 && base != 16) + return 0; + if (base == 10) { + n = sscanf(s, "%lld", &r); + } else { + unsigned long long ru=0; + n = sscanf(s, "%llx", &ru); + if (ru > EV_INT64_MAX) + return 0; + r = (long long) ru; + } + if (n != 1) + return 0; + while (EVUTIL_ISSPACE(*s)) + ++s; + if (*s == '-') + ++s; + if (base == 10) { + while (EVUTIL_ISDIGIT(*s)) + ++s; + } else { + while (EVUTIL_ISXDIGIT(*s)) + ++s; + } + if (endptr) + *endptr = (char*) s; + return r; +#else +#error "I don't know how to parse 64-bit integers." +#endif +} + +#ifndef _EVENT_HAVE_GETTIMEOFDAY +/* No gettimeofday; this muse be windows. */ +int +evutil_gettimeofday(struct timeval *tv, struct timezone *tz) +{ + struct _timeb tb; + + if (tv == NULL) + return -1; + + /* XXXX + * _ftime is not the greatest interface here; GetSystemTimeAsFileTime + * would give us better resolution, whereas something cobbled together + * with GetTickCount could maybe give us monotonic behavior. + * + * Either way, I think this value might be skewed to ignore the + * timezone, and just return local time. That's not so good. + */ + _ftime(&tb); + tv->tv_sec = (long) tb.time; + tv->tv_usec = ((int) tb.millitm) * 1000; + return 0; +} +#endif + +#ifdef WIN32 +int +evutil_socket_geterror(evutil_socket_t sock) +{ + int optval, optvallen=sizeof(optval); + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK && sock >= 0) { + if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&optval, + &optvallen)) + return err; + if (optval) + return optval; + } + return err; +} +#endif + +/* XXX we should use an enum here. */ +/* 2 for connection refused, 1 for connected, 0 for not yet, -1 for error. */ +int +evutil_socket_connect(evutil_socket_t *fd_ptr, struct sockaddr *sa, int socklen) +{ + int made_fd = 0; + + if (*fd_ptr < 0) { + if ((*fd_ptr = socket(sa->sa_family, SOCK_STREAM, 0)) < 0) + goto err; + made_fd = 1; + if (evutil_make_socket_nonblocking(*fd_ptr) < 0) { + goto err; + } + } + + if (connect(*fd_ptr, sa, socklen) < 0) { + int e = evutil_socket_geterror(*fd_ptr); + if (EVUTIL_ERR_CONNECT_RETRIABLE(e)) + return 0; + if (EVUTIL_ERR_CONNECT_REFUSED(e)) + return 2; + goto err; + } else { + return 1; + } + +err: + if (made_fd) { + evutil_closesocket(*fd_ptr); + *fd_ptr = -1; + } + return -1; +} + +/* Check whether a socket on which we called connect() is done + connecting. Return 1 for connected, 0 for not yet, -1 for error. In the + error case, set the current socket errno to the error that happened during + the connect operation. */ +int +evutil_socket_finished_connecting(evutil_socket_t fd) +{ + int e; + ev_socklen_t elen = sizeof(e); + + if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*)&e, &elen) < 0) + return -1; + + if (e) { + if (EVUTIL_ERR_CONNECT_RETRIABLE(e)) + return 0; + EVUTIL_SET_SOCKET_ERROR(e); + return -1; + } + + return 1; +} + +#if (EVUTIL_AI_PASSIVE|EVUTIL_AI_CANONNAME|EVUTIL_AI_NUMERICHOST| \ + EVUTIL_AI_NUMERICSERV|EVUTIL_AI_V4MAPPED|EVUTIL_AI_ALL| \ + EVUTIL_AI_ADDRCONFIG) != \ + (EVUTIL_AI_PASSIVE^EVUTIL_AI_CANONNAME^EVUTIL_AI_NUMERICHOST^ \ + EVUTIL_AI_NUMERICSERV^EVUTIL_AI_V4MAPPED^EVUTIL_AI_ALL^ \ + EVUTIL_AI_ADDRCONFIG) +#error "Some of our EVUTIL_AI_* flags seem to overlap with system AI_* flags" +#endif + +/* We sometimes need to know whether we have an ipv4 address and whether we + have an ipv6 address. If 'have_checked_interfaces', then we've already done + the test. If 'had_ipv4_address', then it turns out we had an ipv4 address. + If 'had_ipv6_address', then it turns out we had an ipv6 address. These are + set by evutil_check_interfaces. */ +static int have_checked_interfaces, had_ipv4_address, had_ipv6_address; + +/* Macro: True iff the IPv4 address 'addr', in host order, is in 127.0.0.0/8 + */ +#define EVUTIL_V4ADDR_IS_LOCALHOST(addr) (((addr)>>24) == 127) + +/* Macro: True iff the IPv4 address 'addr', in host order, is a class D + * (multiclass) address. + */ +#define EVUTIL_V4ADDR_IS_CLASSD(addr) ((((addr)>>24) & 0xf0) == 0xe0) + +/* Test whether we have an ipv4 interface and an ipv6 interface. Return 0 if + * the test seemed successful. */ +static int +evutil_check_interfaces(int force_recheck) +{ + const char ZEROES[] = "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00"; + evutil_socket_t fd = -1; + struct sockaddr_in sin, sin_out; + struct sockaddr_in6 sin6, sin6_out; + ev_socklen_t sin_out_len = sizeof(sin_out); + ev_socklen_t sin6_out_len = sizeof(sin6_out); + int r; + char buf[128]; + if (have_checked_interfaces && !force_recheck) + return 0; + + /* To check whether we have an interface open for a given protocol, we + * try to make a UDP 'connection' to a remote host on the internet. + * We don't actually use it, so the address doesn't matter, but we + * want to pick one that keep us from using a host- or link-local + * interface. */ + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_port = htons(53); + r = evutil_inet_pton(AF_INET, "18.244.0.188", &sin.sin_addr); + EVUTIL_ASSERT(r); + + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(53); + r = evutil_inet_pton(AF_INET6, "2001:4860:b002::68", &sin6.sin6_addr); + EVUTIL_ASSERT(r); + + memset(&sin_out, 0, sizeof(sin_out)); + memset(&sin6_out, 0, sizeof(sin6_out)); + + /* XXX some errnos mean 'no address'; some mean 'not enough sockets'. */ + if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) >= 0 && + connect(fd, (struct sockaddr*)&sin, sizeof(sin)) == 0 && + getsockname(fd, (struct sockaddr*)&sin_out, &sin_out_len) == 0) { + /* We might have an IPv4 interface. */ + ev_uint32_t addr = ntohl(sin_out.sin_addr.s_addr); + if (addr == 0 || + EVUTIL_V4ADDR_IS_LOCALHOST(addr) || + EVUTIL_V4ADDR_IS_CLASSD(addr)) { + evutil_inet_ntop(AF_INET, &sin_out.sin_addr, + buf, sizeof(buf)); + /* This is a reserved, ipv4compat, ipv4map, loopback, + * link-local or unspecified address. The host should + * never have given it to us; it could never connect + * to sin. */ + event_warnx("Got a strange local ipv4 address %s",buf); + } else { + event_debug(("Detected an IPv4 interface")); + had_ipv4_address = 1; + } + } + if (fd >= 0) + evutil_closesocket(fd); + + if ((fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) >= 0 && + connect(fd, (struct sockaddr*)&sin6, sizeof(sin6)) == 0 && + getsockname(fd, (struct sockaddr*)&sin6_out, &sin6_out_len) == 0) { + /* We might have an IPv6 interface. */ + const unsigned char *addr = + (unsigned char*)sin6_out.sin6_addr.s6_addr; + if (!memcmp(addr, ZEROES, 8) || + (addr[0] == 0xfe && (addr[1] & 0xc0) == 0x80)) { + /* This is a reserved, ipv4compat, ipv4map, loopback, + * link-local or unspecified address. The host should + * never have given it to us; it could never connect + * to sin6. */ + evutil_inet_ntop(AF_INET6, &sin6_out.sin6_addr, + buf, sizeof(buf)); + event_warnx("Got a strange local ipv6 address %s",buf); + } else { + event_debug(("Detected an IPv4 interface")); + had_ipv6_address = 1; + } + } + + if (fd >= 0) + evutil_closesocket(fd); + + return 0; +} + +/* Internal addrinfo flag. This one is set when we allocate the addrinfo from + * inside libevent. Otherwise, the built-in getaddrinfo() function allocated + * it, and we should trust what they said. + **/ +#define EVUTIL_AI_LIBEVENT_ALLOCATED 0x80000000 + +/* Helper: construct a new addrinfo containing the socket address in + * 'sa', which must be a sockaddr_in or a sockaddr_in6. Take the + * socktype and protocol info from hints. If they weren't set, then + * allocate both a TCP and a UDP addrinfo. + */ +struct evutil_addrinfo * +evutil_new_addrinfo(struct sockaddr *sa, ev_socklen_t socklen, + const struct evutil_addrinfo *hints) +{ + struct evutil_addrinfo *res; + EVUTIL_ASSERT(hints); + + if (hints->ai_socktype == 0 && hints->ai_protocol == 0) { + /* Indecisive user! Give them a UDP and a TCP. */ + struct evutil_addrinfo *r1, *r2; + struct evutil_addrinfo tmp; + memcpy(&tmp, hints, sizeof(tmp)); + tmp.ai_socktype = SOCK_STREAM; tmp.ai_protocol = IPPROTO_TCP; + r1 = evutil_new_addrinfo(sa, socklen, &tmp); + if (!r1) + return NULL; + tmp.ai_socktype = SOCK_DGRAM; tmp.ai_protocol = IPPROTO_UDP; + r2 = evutil_new_addrinfo(sa, socklen, &tmp); + if (!r2) { + evutil_freeaddrinfo(r1); + return NULL; + } + r1->ai_next = r2; + return r1; + } + + /* We're going to allocate extra space to hold the sockaddr. */ + res = mm_calloc(1,sizeof(struct evutil_addrinfo)+socklen); + if (!res) + return NULL; + res->ai_addr = (struct sockaddr*) + (((char*)res) + sizeof(struct evutil_addrinfo)); + memcpy(res->ai_addr, sa, socklen); + res->ai_addrlen = socklen; + res->ai_family = sa->sa_family; /* Same or not? XXX */ + res->ai_flags = EVUTIL_AI_LIBEVENT_ALLOCATED; + res->ai_socktype = hints->ai_socktype; + res->ai_protocol = hints->ai_protocol; + + return res; +} + +/* Append the addrinfo 'append' to the end of 'first', and return the start of + * the list. Either element can be NULL, in which case we return the element + * that is not NULL. */ +struct evutil_addrinfo * +evutil_addrinfo_append(struct evutil_addrinfo *first, + struct evutil_addrinfo *append) +{ + struct evutil_addrinfo *ai = first; + if (!ai) + return append; + while (ai->ai_next) + ai = ai->ai_next; + ai->ai_next = append; + + return first; +} + +static int +parse_numeric_servname(const char *servname) +{ + int n; + char *endptr=NULL; + n = (int) strtol(servname, &endptr, 10); + if (n>=0 && n <= 65535 && servname[0] && endptr && !endptr[0]) + return n; + else + return -1; +} + +/** Parse a service name in 'servname', which can be a decimal port. + * Return the port number, or -1 on error. + */ +static int +evutil_parse_servname(const char *servname, const char *protocol, + const struct evutil_addrinfo *hints) +{ + int n = parse_numeric_servname(servname); + if (n>=0) + return n; +#if defined(_EVENT_HAVE_GETSERVBYNAME) || defined(WIN32) + if (!(hints->ai_flags & EVUTIL_AI_NUMERICSERV)) { + struct servent *ent = getservbyname(servname, protocol); + if (ent) { + return ntohs(ent->s_port); + } + } +#endif + return -1; +} + +/* Return a string corresponding to a protocol number that we can pass to + * getservyname. */ +static const char * +evutil_unparse_protoname(int proto) +{ + switch (proto) { + case 0: + return NULL; + case IPPROTO_TCP: + return "tcp"; + case IPPROTO_UDP: + return "udp"; +#ifdef IPPROTO_SCTP + case IPPROTO_SCTP: + return "sctp"; +#endif + default: +#ifdef _EVENT_HAVE_GETPROTOBYNUMBER + { + struct protoent *ent = getprotobynumber(proto); + if (ent) + return ent->p_name; + } +#endif + return NULL; + } +} + +static void +evutil_getaddrinfo_infer_protocols(struct evutil_addrinfo *hints) +{ + /* If we can guess the protocol from the socktype, do so. */ + if (!hints->ai_protocol && hints->ai_socktype) { + if (hints->ai_socktype == SOCK_DGRAM) + hints->ai_protocol = IPPROTO_UDP; + else if (hints->ai_socktype == SOCK_STREAM) + hints->ai_protocol = IPPROTO_TCP; + } + + /* Set the socktype if it isn't set. */ + if (!hints->ai_socktype && hints->ai_protocol) { + if (hints->ai_protocol == IPPROTO_UDP) + hints->ai_socktype = SOCK_DGRAM; + else if (hints->ai_protocol == IPPROTO_TCP) + hints->ai_socktype = SOCK_STREAM; +#ifdef IPPROTO_SCTP + else if (hints->ai_protocol == IPPROTO_SCTP) + hints->ai_socktype = SOCK_STREAM; +#endif + } +} + +#if AF_UNSPEC != PF_UNSPEC +#error "I cannot build on a system where AF_UNSPEC != PF_UNSPEC" +#endif + +/** Implements the part of looking up hosts by name that's common to both + * the blocking and nonblocking resolver: + * - Adjust 'hints' to have a reasonable socktype and protocol. + * - Look up the port based on 'servname', and store it in *portnum, + * - Handle the nodename==NULL case + * - Handle some invalid arguments cases. + * - Handle the cases where nodename is an IPv4 or IPv6 address. + * + * If we need the resolver to look up the hostname, we return + * EVUTIL_EAI_NEED_RESOLVE. Otherwise, we can completely implement + * getaddrinfo: we return 0 or an appropriate EVUTIL_EAI_* error, and + * set *res as getaddrinfo would. + */ +int +evutil_getaddrinfo_common(const char *nodename, const char *servname, + struct evutil_addrinfo *hints, struct evutil_addrinfo **res, int *portnum) +{ + int port = 0; + const char *pname; + + if (nodename == NULL && servname == NULL) + return EVUTIL_EAI_NONAME; + + /* We only understand 3 families */ + if (hints->ai_family != PF_UNSPEC && hints->ai_family != PF_INET && + hints->ai_family != PF_INET6) + return EVUTIL_EAI_FAMILY; + + evutil_getaddrinfo_infer_protocols(hints); + + /* Look up the port number and protocol, if possible. */ + pname = evutil_unparse_protoname(hints->ai_protocol); + if (servname) { + /* XXXX We could look at the protocol we got back from + * getservbyname, but it doesn't seem too useful. */ + port = evutil_parse_servname(servname, pname, hints); + if (port < 0) { + return EVUTIL_EAI_NONAME; + } + } + + /* If we have no node name, then we're supposed to bind to 'any' and + * connect to localhost. */ + if (nodename == NULL) { + struct evutil_addrinfo *res4=NULL, *res6=NULL; + if (hints->ai_family != PF_INET) { /* INET6 or UNSPEC. */ + struct sockaddr_in6 sin6; + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(port); + if (hints->ai_flags & EVUTIL_AI_PASSIVE) { + /* Bind to :: */ + } else { + /* connect to ::1 */ + sin6.sin6_addr.s6_addr[15] = 1; + } + res6 = evutil_new_addrinfo((struct sockaddr*)&sin6, + sizeof(sin6), hints); + if (!res6) + return EVUTIL_EAI_MEMORY; + } + + if (hints->ai_family != PF_INET6) { /* INET or UNSPEC */ + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + if (hints->ai_flags & EVUTIL_AI_PASSIVE) { + /* Bind to 0.0.0.0 */ + } else { + /* connect to 127.0.0.1 */ + sin.sin_addr.s_addr = htonl(0x7f000001); + } + res4 = evutil_new_addrinfo((struct sockaddr*)&sin, + sizeof(sin), hints); + if (!res4) { + if (res6) + evutil_freeaddrinfo(res6); + return EVUTIL_EAI_MEMORY; + } + } + *res = evutil_addrinfo_append(res4, res6); + return 0; + } + + /* If we can, we should try to parse the hostname without resolving + * it. */ + /* Try ipv6. */ + if (hints->ai_family == PF_INET6 || hints->ai_family == PF_UNSPEC) { + struct sockaddr_in6 sin6; + memset(&sin6, 0, sizeof(sin6)); + if (1==evutil_inet_pton(AF_INET6, nodename, &sin6.sin6_addr)) { + /* Got an ipv6 address. */ + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(port); + *res = evutil_new_addrinfo((struct sockaddr*)&sin6, + sizeof(sin6), hints); + if (!*res) + return EVUTIL_EAI_MEMORY; + return 0; + } + } + + /* Try ipv4. */ + if (hints->ai_family == PF_INET || hints->ai_family == PF_UNSPEC) { + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + if (1==evutil_inet_pton(AF_INET, nodename, &sin.sin_addr)) { + /* Got an ipv6 address. */ + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + *res = evutil_new_addrinfo((struct sockaddr*)&sin, + sizeof(sin), hints); + if (!*res) + return EVUTIL_EAI_MEMORY; + return 0; + } + } + + + /* If we have reached this point, we definitely need to do a DNS + * lookup. */ + if ((hints->ai_flags & EVUTIL_AI_NUMERICHOST)) { + /* If we're not allowed to do one, then say so. */ + return EVUTIL_EAI_NONAME; + } + *portnum = port; + return EVUTIL_EAI_NEED_RESOLVE; +} + +#ifdef _EVENT_HAVE_GETADDRINFO +#define USE_NATIVE_GETADDRINFO +#endif + +#ifdef USE_NATIVE_GETADDRINFO +/* A mask of all the flags that we declare, so we can clear them before calling + * the native getaddrinfo */ +static const unsigned int ALL_NONNATIVE_AI_FLAGS = +#ifndef AI_PASSIVE + EVUTIL_AI_PASSIVE | +#endif +#ifndef AI_CANONNAME + EVUTIL_AI_CANONNAME | +#endif +#ifndef AI_NUMERICHOST + EVUTIL_AI_NUMERICHOST | +#endif +#ifndef AI_NUMERICSERV + EVUTIL_AI_NUMERICSERV | +#endif +#ifndef AI_ADDRCONFIG + EVUTIL_AI_ADDRCONFIG | +#endif +#ifndef AI_ALL + EVUTIL_AI_ALL | +#endif +#ifndef AI_V4MAPPED + EVUTIL_AI_V4MAPPED | +#endif + EVUTIL_AI_LIBEVENT_ALLOCATED; + +static const unsigned int ALL_NATIVE_AI_FLAGS = +#ifdef AI_PASSIVE + AI_PASSIVE | +#endif +#ifdef AI_CANONNAME + AI_CANONNAME | +#endif +#ifdef AI_NUMERICHOST + AI_NUMERICHOST | +#endif +#ifdef AI_NUMERICSERV + AI_NUMERICSERV | +#endif +#ifdef AI_ADDRCONFIG + AI_ADDRCONFIG | +#endif +#ifdef AI_ALL + AI_ALL | +#endif +#ifdef AI_V4MAPPED + AI_V4MAPPED | +#endif + 0; +#endif + +#ifndef USE_NATIVE_GETADDRINFO +/* Helper for systems with no getaddrinfo(): make one or more addrinfos out of + * a struct hostent. + */ +static struct evutil_addrinfo * +addrinfo_from_hostent(const struct hostent *ent, + int port, const struct evutil_addrinfo *hints) +{ + int i; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + struct sockaddr *sa; + int socklen; + struct evutil_addrinfo *res=NULL, *ai; + void *addrp; + + if (ent->h_addrtype == PF_INET) { + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sa = (struct sockaddr *)&sin; + socklen = sizeof(struct sockaddr_in); + addrp = &sin.sin_addr; + if (ent->h_length != sizeof(sin.sin_addr)) { + event_warnx("Weird h_length from gethostbyname"); + return NULL; + } + } else if (ent->h_addrtype == PF_INET6) { + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(port); + sa = (struct sockaddr *)&sin6; + socklen = sizeof(struct sockaddr_in); + addrp = &sin6.sin6_addr; + if (ent->h_length != sizeof(sin6.sin6_addr)) { + event_warnx("Weird h_length from gethostbyname"); + return NULL; + } + } else + return NULL; + + for (i = 0; ent->h_addr_list[i]; ++i) { + memcpy(addrp, ent->h_addr_list[i], ent->h_length); + ai = evutil_new_addrinfo(sa, socklen, hints); + if (!ai) { + evutil_freeaddrinfo(res); + return NULL; + } + res = evutil_addrinfo_append(res, ai); + } + + if (res && ((hints->ai_flags & EVUTIL_AI_CANONNAME) && ent->h_name)) { + res->ai_canonname = mm_strdup(ent->h_name); + if (res->ai_canonname == NULL) { + evutil_freeaddrinfo(res); + return NULL; + } + } + + return res; +} +#endif + +/* If the EVUTIL_AI_ADDRCONFIG flag is set on hints->ai_flags, and + * hints->ai_family is PF_UNSPEC, then revise the value of hints->ai_family so + * that we'll only get addresses we could maybe connect to. + */ +void +evutil_adjust_hints_for_addrconfig(struct evutil_addrinfo *hints) +{ + if (!(hints->ai_flags & EVUTIL_AI_ADDRCONFIG)) + return; + if (hints->ai_family != PF_UNSPEC) + return; + if (!have_checked_interfaces) + evutil_check_interfaces(0); + if (had_ipv4_address && !had_ipv6_address) { + hints->ai_family = PF_INET; + } else if (!had_ipv4_address && had_ipv6_address) { + hints->ai_family = PF_INET6; + } +} + +#ifdef USE_NATIVE_GETADDRINFO +static int need_numeric_port_hack_=0; +static int need_socktype_protocol_hack_=0; +static int tested_for_getaddrinfo_hacks=0; + +/* Some older BSDs (like OpenBSD up to 4.6) used to believe that + giving a numeric port without giving an ai_socktype was verboten. + We test for this so we can apply an appropriate workaround. If it + turns out that the bug is present, then: + + - If nodename==NULL and servname is numeric, we build an answer + ourselves using evutil_getaddrinfo_common(). + + - If nodename!=NULL and servname is numeric, then we set + servname=NULL when calling getaddrinfo, and post-process the + result to set the ports on it. + + We test for this bug at runtime, since otherwise we can't have the + same binary run on multiple BSD versions. + + - Some versions of Solaris believe that it's nice to leave to protocol + field set to 0. We test for this so we can apply an appropriate + workaround. +*/ +static void +test_for_getaddrinfo_hacks(void) +{ + int r, r2; + struct evutil_addrinfo *ai=NULL, *ai2=NULL; + struct evutil_addrinfo hints; + + memset(&hints,0,sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_flags = +#ifdef AI_NUMERICHOST + AI_NUMERICHOST | +#endif +#ifdef AI_NUMERICSERV + AI_NUMERICSERV | +#endif + 0; + r = getaddrinfo("1.2.3.4", "80", &hints, &ai); + hints.ai_socktype = SOCK_STREAM; + r2 = getaddrinfo("1.2.3.4", "80", &hints, &ai2); + if (r2 == 0 && r != 0) { + need_numeric_port_hack_=1; + } + if (ai2 && ai2->ai_protocol == 0) { + need_socktype_protocol_hack_=1; + } + + if (ai) + freeaddrinfo(ai); + if (ai2) + freeaddrinfo(ai2); + tested_for_getaddrinfo_hacks=1; +} + +static inline int +need_numeric_port_hack(void) +{ + if (!tested_for_getaddrinfo_hacks) + test_for_getaddrinfo_hacks(); + return need_numeric_port_hack_; +} + +static inline int +need_socktype_protocol_hack(void) +{ + if (!tested_for_getaddrinfo_hacks) + test_for_getaddrinfo_hacks(); + return need_socktype_protocol_hack_; +} + +static void +apply_numeric_port_hack(int port, struct evutil_addrinfo **ai) +{ + /* Now we run through the list and set the ports on all of the + * results where ports would make sense. */ + for ( ; *ai; ai = &(*ai)->ai_next) { + struct sockaddr *sa = (*ai)->ai_addr; + if (sa && sa->sa_family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in*)sa; + sin->sin_port = htons(port); + } else if (sa && sa->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa; + sin6->sin6_port = htons(port); + } else { + /* A numeric port makes no sense here; remove this one + * from the list. */ + struct evutil_addrinfo *victim = *ai; + *ai = victim->ai_next; + victim->ai_next = NULL; + freeaddrinfo(victim); + } + } +} + +static int +apply_socktype_protocol_hack(struct evutil_addrinfo *ai) +{ + struct evutil_addrinfo *ai_new; + for (; ai; ai = ai->ai_next) { + evutil_getaddrinfo_infer_protocols(ai); + if (ai->ai_socktype || ai->ai_protocol) + continue; + ai_new = mm_malloc(sizeof(*ai_new)); + if (!ai_new) + return -1; + memcpy(ai_new, ai, sizeof(*ai_new)); + ai->ai_socktype = SOCK_STREAM; + ai->ai_protocol = IPPROTO_TCP; + ai_new->ai_socktype = SOCK_DGRAM; + ai_new->ai_protocol = IPPROTO_UDP; + + ai_new->ai_next = ai->ai_next; + ai->ai_next = ai_new; + } + return 0; +} +#endif + +int +evutil_getaddrinfo(const char *nodename, const char *servname, + const struct evutil_addrinfo *hints_in, struct evutil_addrinfo **res) +{ +#ifdef USE_NATIVE_GETADDRINFO + struct evutil_addrinfo hints; + int portnum=-1, need_np_hack, err; + + if (hints_in) { + memcpy(&hints, hints_in, sizeof(hints)); + } else { + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + } + +#ifndef AI_ADDRCONFIG + /* Not every system has AI_ADDRCONFIG, so fake it. */ + if (hints.ai_family == PF_UNSPEC && + (hints.ai_flags & EVUTIL_AI_ADDRCONFIG)) { + evutil_adjust_hints_for_addrconfig(&hints); + } +#endif + +#ifndef AI_NUMERICSERV + /* Not every system has AI_NUMERICSERV, so fake it. */ + if (hints.ai_flags & EVUTIL_AI_NUMERICSERV) { + if (servname && parse_numeric_servname(servname)<0) + return EVUTIL_EAI_NONAME; + } +#endif + + /* Enough operating systems handle enough common non-resolve + * cases here weirdly enough that we are better off just + * overriding them. For example: + * + * - Windows doesn't like to infer the protocol from the + * socket type, or fill in socket or protocol types much at + * all. It also seems to do its own broken implicit + * always-on version of AI_ADDRCONFIG that keeps it from + * ever resolving even a literal IPv6 address when + * ai_addrtype is PF_UNSPEC. + */ +#ifdef WIN32 + { + int tmp_port; + err = evutil_getaddrinfo_common(nodename,servname,&hints, + res, &tmp_port); + if (err == 0 || + err == EVUTIL_EAI_MEMORY || + err == EVUTIL_EAI_NONAME) + return err; + /* If we make it here, the system getaddrinfo can + * have a crack at it. */ + } +#endif + + /* See documentation for need_numeric_port_hack above.*/ + need_np_hack = need_numeric_port_hack() && servname && !hints.ai_socktype + && ((portnum=parse_numeric_servname(servname)) >= 0); + if (need_np_hack) { + if (!nodename) + return evutil_getaddrinfo_common( + NULL,servname,&hints, res, &portnum); + servname = NULL; + } + + if (need_socktype_protocol_hack()) { + evutil_getaddrinfo_infer_protocols(&hints); + } + + /* Make sure that we didn't actually steal any AI_FLAGS values that + * the system is using. (This is a constant expression, and should ge + * optimized out.) + * + * XXXX Turn this into a compile-time failure rather than a run-time + * failure. + */ + EVUTIL_ASSERT((ALL_NONNATIVE_AI_FLAGS & ALL_NATIVE_AI_FLAGS) == 0); + + /* Clear any flags that only libevent understands. */ + hints.ai_flags &= ~ALL_NONNATIVE_AI_FLAGS; + + err = getaddrinfo(nodename, servname, &hints, res); + if (need_np_hack) + apply_numeric_port_hack(portnum, res); + + if (need_socktype_protocol_hack()) { + if (apply_socktype_protocol_hack(*res) < 0) { + evutil_freeaddrinfo(*res); + *res = NULL; + return EVUTIL_EAI_MEMORY; + } + } + return err; +#else + int port=0, err; + struct hostent *ent = NULL; + struct evutil_addrinfo hints; + + if (hints_in) { + memcpy(&hints, hints_in, sizeof(hints)); + } else { + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + } + + evutil_adjust_hints_for_addrconfig(&hints); + + err = evutil_getaddrinfo_common(nodename, servname, &hints, res, &port); + if (err != EVUTIL_EAI_NEED_RESOLVE) { + /* We either succeeded or failed. No need to continue */ + return err; + } + + err = 0; + /* Use any of the various gethostbyname_r variants as available. */ + { +#ifdef _EVENT_HAVE_GETHOSTBYNAME_R_6_ARG + /* This one is what glibc provides. */ + char buf[2048]; + struct hostent hostent; + int r; + r = gethostbyname_r(nodename, &hostent, buf, sizeof(buf), &ent, + &err); +#elif defined(_EVENT_HAVE_GETHOSTBYNAME_R_5_ARG) + char buf[2048]; + struct hostent hostent; + ent = gethostbyname_r(nodename, &hostent, buf, sizeof(buf), + &err); +#elif defined(_EVENT_HAVE_GETHOSTBYNAME_R_3_ARG) + struct hostent_data data; + struct hostent hostent; + memset(&data, 0, sizeof(data)); + err = gethostbyname_r(nodename, &hostent, &data); + ent = err ? NULL : &hostent; +#else + /* fall back to gethostbyname. */ + /* XXXX This needs a lock everywhere but Windows. */ + ent = gethostbyname(nodename); +#ifdef WIN32 + err = WSAGetLastError(); +#else + err = h_errno; +#endif +#endif + + /* Now we have either ent or err set. */ + if (!ent) { + /* XXX is this right for windows ? */ + switch (err) { + case TRY_AGAIN: + return EVUTIL_EAI_AGAIN; + case NO_RECOVERY: + default: + return EVUTIL_EAI_FAIL; + case HOST_NOT_FOUND: + return EVUTIL_EAI_NONAME; + case NO_ADDRESS: +#if NO_DATA != NO_ADDRESS + case NO_DATA: +#endif + return EVUTIL_EAI_NODATA; + } + } + + if (ent->h_addrtype != hints.ai_family && + hints.ai_family != PF_UNSPEC) { + /* This wasn't the type we were hoping for. Too bad + * we never had a chance to ask gethostbyname for what + * we wanted. */ + return EVUTIL_EAI_NONAME; + } + + /* Make sure we got _some_ answers. */ + if (ent->h_length == 0) + return EVUTIL_EAI_NODATA; + + /* If we got an address type we don't know how to make a + sockaddr for, give up. */ + if (ent->h_addrtype != PF_INET && ent->h_addrtype != PF_INET6) + return EVUTIL_EAI_FAMILY; + + *res = addrinfo_from_hostent(ent, port, &hints); + if (! *res) + return EVUTIL_EAI_MEMORY; + } + + return 0; +#endif +} + +void +evutil_freeaddrinfo(struct evutil_addrinfo *ai) +{ +#ifdef _EVENT_HAVE_GETADDRINFO + if (!(ai->ai_flags & EVUTIL_AI_LIBEVENT_ALLOCATED)) { + freeaddrinfo(ai); + return; + } +#endif + while (ai) { + struct evutil_addrinfo *next = ai->ai_next; + if (ai->ai_canonname) + mm_free(ai->ai_canonname); + mm_free(ai); + ai = next; + } +} + +static evdns_getaddrinfo_fn evdns_getaddrinfo_impl = NULL; + +void +evutil_set_evdns_getaddrinfo_fn(evdns_getaddrinfo_fn fn) +{ + if (!evdns_getaddrinfo_impl) + evdns_getaddrinfo_impl = fn; +} + +/* Internal helper function: act like evdns_getaddrinfo if dns_base is set; + * otherwise do a blocking resolve and pass the result to the callback in the + * way that evdns_getaddrinfo would. + */ +int +evutil_getaddrinfo_async(struct evdns_base *dns_base, + const char *nodename, const char *servname, + const struct evutil_addrinfo *hints_in, + void (*cb)(int, struct evutil_addrinfo *, void *), void *arg) +{ + if (dns_base && evdns_getaddrinfo_impl) { + evdns_getaddrinfo_impl( + dns_base, nodename, servname, hints_in, cb, arg); + } else { + struct evutil_addrinfo *ai=NULL; + int err; + err = evutil_getaddrinfo(nodename, servname, hints_in, &ai); + cb(err, ai, arg); + } + return 0; +} + +const char * +evutil_gai_strerror(int err) +{ + /* As a sneaky side-benefit, this case statement will get most + * compilers to tell us if any of the error codes we defined + * conflict with the platform's native error codes. */ + switch (err) { + case EVUTIL_EAI_CANCEL: + return "Request canceled"; + case 0: + return "No error"; + + case EVUTIL_EAI_ADDRFAMILY: + return "address family for nodename not supported"; + case EVUTIL_EAI_AGAIN: + return "temporary failure in name resolution"; + case EVUTIL_EAI_BADFLAGS: + return "invalid value for ai_flags"; + case EVUTIL_EAI_FAIL: + return "non-recoverable failure in name resolution"; + case EVUTIL_EAI_FAMILY: + return "ai_family not supported"; + case EVUTIL_EAI_MEMORY: + return "memory allocation failure"; + case EVUTIL_EAI_NODATA: + return "no address associated with nodename"; + case EVUTIL_EAI_NONAME: + return "nodename nor servname provided, or not known"; + case EVUTIL_EAI_SERVICE: + return "servname not supported for ai_socktype"; + case EVUTIL_EAI_SOCKTYPE: + return "ai_socktype not supported"; + case EVUTIL_EAI_SYSTEM: + return "system error"; + default: +#if defined(USE_NATIVE_GETADDRINFO) && defined(WIN32) + return gai_strerrorA(err); +#elif defined(USE_NATIVE_GETADDRINFO) + return gai_strerror(err); +#else + return "Unknown error code"; +#endif + } +} + +#ifdef WIN32 +#define E(code, s) { code, (s " [" #code " ]") } +static struct { int code; const char *msg; } windows_socket_errors[] = { + E(WSAEINTR, "Interrupted function call"), + E(WSAEACCES, "Permission denied"), + E(WSAEFAULT, "Bad address"), + E(WSAEINVAL, "Invalid argument"), + E(WSAEMFILE, "Too many open files"), + E(WSAEWOULDBLOCK, "Resource temporarily unavailable"), + E(WSAEINPROGRESS, "Operation now in progress"), + E(WSAEALREADY, "Operation already in progress"), + E(WSAENOTSOCK, "Socket operation on nonsocket"), + E(WSAEDESTADDRREQ, "Destination address required"), + E(WSAEMSGSIZE, "Message too long"), + E(WSAEPROTOTYPE, "Protocol wrong for socket"), + E(WSAENOPROTOOPT, "Bad protocol option"), + E(WSAEPROTONOSUPPORT, "Protocol not supported"), + E(WSAESOCKTNOSUPPORT, "Socket type not supported"), + /* What's the difference between NOTSUPP and NOSUPPORT? :) */ + E(WSAEOPNOTSUPP, "Operation not supported"), + E(WSAEPFNOSUPPORT, "Protocol family not supported"), + E(WSAEAFNOSUPPORT, "Address family not supported by protocol family"), + E(WSAEADDRINUSE, "Address already in use"), + E(WSAEADDRNOTAVAIL, "Cannot assign requested address"), + E(WSAENETDOWN, "Network is down"), + E(WSAENETUNREACH, "Network is unreachable"), + E(WSAENETRESET, "Network dropped connection on reset"), + E(WSAECONNABORTED, "Software caused connection abort"), + E(WSAECONNRESET, "Connection reset by peer"), + E(WSAENOBUFS, "No buffer space available"), + E(WSAEISCONN, "Socket is already connected"), + E(WSAENOTCONN, "Socket is not connected"), + E(WSAESHUTDOWN, "Cannot send after socket shutdown"), + E(WSAETIMEDOUT, "Connection timed out"), + E(WSAECONNREFUSED, "Connection refused"), + E(WSAEHOSTDOWN, "Host is down"), + E(WSAEHOSTUNREACH, "No route to host"), + E(WSAEPROCLIM, "Too many processes"), + + /* Yes, some of these start with WSA, not WSAE. No, I don't know why. */ + E(WSASYSNOTREADY, "Network subsystem is unavailable"), + E(WSAVERNOTSUPPORTED, "Winsock.dll out of range"), + E(WSANOTINITIALISED, "Successful WSAStartup not yet performed"), + E(WSAEDISCON, "Graceful shutdown now in progress"), +#ifdef WSATYPE_NOT_FOUND + E(WSATYPE_NOT_FOUND, "Class type not found"), +#endif + E(WSAHOST_NOT_FOUND, "Host not found"), + E(WSATRY_AGAIN, "Nonauthoritative host not found"), + E(WSANO_RECOVERY, "This is a nonrecoverable error"), + E(WSANO_DATA, "Valid name, no data record of requested type)"), + + /* There are some more error codes whose numeric values are marked + * <b>OS dependent</b>. They start with WSA_, apparently for the same + * reason that practitioners of some craft traditions deliberately + * introduce imperfections into their baskets and rugs "to allow the + * evil spirits to escape." If we catch them, then our binaries + * might not report consistent results across versions of Windows. + * Thus, I'm going to let them all fall through. + */ + { -1, NULL }, +}; +#undef E +/** Equivalent to strerror, but for windows socket errors. */ +const char * +evutil_socket_error_to_string(int errcode) +{ + /* XXXX Is there really no built-in function to do this? */ + int i; + for (i=0; windows_socket_errors[i].code >= 0; ++i) { + if (errcode == windows_socket_errors[i].code) + return windows_socket_errors[i].msg; + } + return strerror(errcode); +} +#endif + +int +evutil_snprintf(char *buf, size_t buflen, const char *format, ...) +{ + int r; + va_list ap; + va_start(ap, format); + r = evutil_vsnprintf(buf, buflen, format, ap); + va_end(ap); + return r; +} + +int +evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap) +{ + int r; + if (!buflen) + return 0; +#if defined(_MSC_VER) || defined(WIN32) + r = _vsnprintf(buf, buflen, format, ap); + if (r < 0) + r = _vscprintf(format, ap); +#elif defined(sgi) + /* Make sure we always use the correct vsnprintf on IRIX */ + extern int _xpg5_vsnprintf(char * __restrict, + __SGI_LIBC_NAMESPACE_QUALIFIER size_t, + const char * __restrict, /* va_list */ char *); + + r = _xpg5_vsnprintf(buf, buflen, format, ap); +#else + r = vsnprintf(buf, buflen, format, ap); +#endif + buf[buflen-1] = '\0'; + return r; +} + +#define USE_INTERNAL_NTOP +#define USE_INTERNAL_PTON + +const char * +evutil_inet_ntop(int af, const void *src, char *dst, size_t len) +{ +#if defined(_EVENT_HAVE_INET_NTOP) && !defined(USE_INTERNAL_NTOP) + return inet_ntop(af, src, dst, len); +#else + if (af == AF_INET) { + const struct in_addr *in = src; + const ev_uint32_t a = ntohl(in->s_addr); + int r; + r = evutil_snprintf(dst, len, "%d.%d.%d.%d", + (int)(ev_uint8_t)((a>>24)&0xff), + (int)(ev_uint8_t)((a>>16)&0xff), + (int)(ev_uint8_t)((a>>8 )&0xff), + (int)(ev_uint8_t)((a )&0xff)); + if (r<0||(size_t)r>=len) + return NULL; + else + return dst; +#ifdef AF_INET6 + } else if (af == AF_INET6) { + const struct in6_addr *addr = src; + char buf[64], *cp; + int longestGapLen = 0, longestGapPos = -1, i, + curGapPos = -1, curGapLen = 0; + ev_uint16_t words[8]; + for (i = 0; i < 8; ++i) { + words[i] = + (((ev_uint16_t)addr->s6_addr[2*i])<<8) + addr->s6_addr[2*i+1]; + } + if (words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && + words[4] == 0 && ((words[5] == 0 && words[6] && words[7]) || + (words[5] == 0xffff))) { + /* This is an IPv4 address. */ + if (words[5] == 0) { + evutil_snprintf(buf, sizeof(buf), "::%d.%d.%d.%d", + addr->s6_addr[12], addr->s6_addr[13], + addr->s6_addr[14], addr->s6_addr[15]); + } else { + evutil_snprintf(buf, sizeof(buf), "::%x:%d.%d.%d.%d", words[5], + addr->s6_addr[12], addr->s6_addr[13], + addr->s6_addr[14], addr->s6_addr[15]); + } + if (strlen(buf) > len) + return NULL; + strlcpy(dst, buf, len); + return dst; + } + i = 0; + while (i < 8) { + if (words[i] == 0) { + curGapPos = i++; + curGapLen = 1; + while (i<8 && words[i] == 0) { + ++i; ++curGapLen; + } + if (curGapLen > longestGapLen) { + longestGapPos = curGapPos; + longestGapLen = curGapLen; + } + } else { + ++i; + } + } + if (longestGapLen<=1) + longestGapPos = -1; + + cp = buf; + for (i = 0; i < 8; ++i) { + if (words[i] == 0 && longestGapPos == i) { + if (i == 0) + *cp++ = ':'; + *cp++ = ':'; + while (i < 8 && words[i] == 0) + ++i; + --i; /* to compensate for loop increment. */ + } else { + evutil_snprintf(cp, + sizeof(buf)-(cp-buf), "%x", (unsigned)words[i]); + cp += strlen(cp); + if (i != 7) + *cp++ = ':'; + } + } + *cp = '\0'; + if (strlen(buf) > len) + return NULL; + strlcpy(dst, buf, len); + return dst; +#endif + } else { + return NULL; + } +#endif +} + +int +evutil_inet_pton(int af, const char *src, void *dst) +{ +#if defined(_EVENT_HAVE_INET_PTON) && !defined(USE_INTERNAL_PTON) + return inet_pton(af, src, dst); +#else + if (af == AF_INET) { + int a,b,c,d; + char more; + struct in_addr *addr = dst; + if (sscanf(src, "%d.%d.%d.%d%c", &a,&b,&c,&d,&more) != 4) + return 0; + if (a < 0 || a > 255) return 0; + if (b < 0 || b > 255) return 0; + if (c < 0 || c > 255) return 0; + if (d < 0 || d > 255) return 0; + addr->s_addr = htonl((a<<24) | (b<<16) | (c<<8) | d); + return 1; +#ifdef AF_INET6 + } else if (af == AF_INET6) { + struct in6_addr *out = dst; + ev_uint16_t words[8]; + int gapPos = -1, i, setWords=0; + const char *dot = strchr(src, '.'); + const char *eow; /* end of words. */ + if (dot == src) + return 0; + else if (!dot) + eow = src+strlen(src); + else { + int byte1,byte2,byte3,byte4; + char more; + for (eow = dot-1; eow >= src && EVUTIL_ISDIGIT(*eow); --eow) + ; + ++eow; + + /* We use "scanf" because some platform inet_aton()s are too lax + * about IPv4 addresses of the form "1.2.3" */ + if (sscanf(eow, "%d.%d.%d.%d%c", + &byte1,&byte2,&byte3,&byte4,&more) != 4) + return 0; + + if (byte1 > 255 || byte1 < 0 || + byte2 > 255 || byte2 < 0 || + byte3 > 255 || byte3 < 0 || + byte4 > 255 || byte4 < 0) + return 0; + + words[6] = (byte1<<8) | byte2; + words[7] = (byte3<<8) | byte4; + setWords += 2; + } + + i = 0; + while (src < eow) { + if (i > 7) + return 0; + if (EVUTIL_ISXDIGIT(*src)) { + char *next; + long r = strtol(src, &next, 16); + if (next > 4+src) + return 0; + if (next == src) + return 0; + if (r<0 || r>65536) + return 0; + + words[i++] = (ev_uint16_t)r; + setWords++; + src = next; + if (*src != ':' && src != eow) + return 0; + ++src; + } else if (*src == ':' && i > 0 && gapPos==-1) { + gapPos = i; + ++src; + } else if (*src == ':' && i == 0 && src[1] == ':' && gapPos==-1) { + gapPos = i; + src += 2; + } else { + return 0; + } + } + + if (setWords > 8 || + (setWords == 8 && gapPos != -1) || + (setWords < 8 && gapPos == -1)) + return 0; + + if (gapPos >= 0) { + int nToMove = setWords - (dot ? 2 : 0) - gapPos; + int gapLen = 8 - setWords; + /* assert(nToMove >= 0); */ + if (nToMove < 0) + return -1; /* should be impossible */ + memmove(&words[gapPos+gapLen], &words[gapPos], + sizeof(ev_uint16_t)*nToMove); + memset(&words[gapPos], 0, sizeof(ev_uint16_t)*gapLen); + } + for (i = 0; i < 8; ++i) { + out->s6_addr[2*i ] = words[i] >> 8; + out->s6_addr[2*i+1] = words[i] & 0xff; + } + + return 1; +#endif + } else { + return -1; + } +#endif +} + +int +evutil_parse_sockaddr_port(const char *ip_as_string, struct sockaddr *out, int *outlen) +{ + int port; + char buf[128]; + const char *cp, *addr_part, *port_part; + int is_ipv6; + /* recognized formats are: + * [ipv6]:port + * ipv6 + * [ipv6] + * ipv4:port + * ipv4 + */ + + cp = strchr(ip_as_string, ':'); + if (*ip_as_string == '[') { + int len; + if (!(cp = strchr(ip_as_string, ']'))) { + return -1; + } + len = (int) ( cp-(ip_as_string + 1) ); + if (len > (int)sizeof(buf)-1) { + return -1; + } + memcpy(buf, ip_as_string+1, len); + buf[len] = '\0'; + addr_part = buf; + if (cp[1] == ':') + port_part = cp+2; + else + port_part = NULL; + is_ipv6 = 1; + } else if (cp && strchr(cp+1, ':')) { + is_ipv6 = 1; + addr_part = ip_as_string; + port_part = NULL; + } else if (cp) { + is_ipv6 = 0; + if (cp - ip_as_string > (int)sizeof(buf)-1) { + return -1; + } + memcpy(buf, ip_as_string, cp-ip_as_string); + buf[cp-ip_as_string] = '\0'; + addr_part = buf; + port_part = cp+1; + } else { + addr_part = ip_as_string; + port_part = NULL; + is_ipv6 = 0; + } + + if (port_part == NULL) { + port = 0; + } else { + port = atoi(port_part); + if (port <= 0 || port > 65535) { + return -1; + } + } + + if (!addr_part) + return -1; /* Should be impossible. */ +#ifdef AF_INET6 + if (is_ipv6) + { + struct sockaddr_in6 sin6; + memset(&sin6, 0, sizeof(sin6)); +#ifdef _EVENT_HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN + sin6.sin6_len = sizeof(sin6); +#endif + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(port); + if (1 != evutil_inet_pton(AF_INET6, addr_part, &sin6.sin6_addr)) + return -1; + if ((int)sizeof(sin6) > *outlen) + return -1; + memset(out, 0, *outlen); + memcpy(out, &sin6, sizeof(sin6)); + *outlen = sizeof(sin6); + return 0; + } + else +#endif + { + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); +#ifdef _EVENT_HAVE_STRUCT_SOCKADDR_IN_SIN_LEN + sin.sin_len = sizeof(sin); +#endif + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + if (1 != evutil_inet_pton(AF_INET, addr_part, &sin.sin_addr)) + return -1; + if ((int)sizeof(sin) > *outlen) + return -1; + memset(out, 0, *outlen); + memcpy(out, &sin, sizeof(sin)); + *outlen = sizeof(sin); + return 0; + } +} + +const char * +evutil_format_sockaddr_port(const struct sockaddr *sa, char *out, size_t outlen) +{ + char b[128]; + const char *res=NULL; + int port; + if (sa->sa_family == AF_INET) { + const struct sockaddr_in *sin = (const struct sockaddr_in*)sa; + res = evutil_inet_ntop(AF_INET, &sin->sin_addr,b,sizeof(b)); + port = ntohs(sin->sin_port); + if (res) { + evutil_snprintf(out, outlen, "%s:%d", b, port); + return out; + } + } else if (sa->sa_family == AF_INET6) { + const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6*)sa; + res = evutil_inet_ntop(AF_INET6, &sin6->sin6_addr,b,sizeof(b)); + port = ntohs(sin6->sin6_port); + if (res) { + evutil_snprintf(out, outlen, "[%s]:%d", b, port); + return out; + } + } + + evutil_snprintf(out, outlen, "<addr with socktype %d>", + (int)sa->sa_family); + return out; +} + +int +evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2, + int include_port) +{ + int r; + if (0 != (r = (sa1->sa_family - sa2->sa_family))) + return r; + + if (sa1->sa_family == AF_INET) { + const struct sockaddr_in *sin1, *sin2; + sin1 = (const struct sockaddr_in *)sa1; + sin2 = (const struct sockaddr_in *)sa2; + if (sin1->sin_addr.s_addr < sin2->sin_addr.s_addr) + return -1; + else if (sin1->sin_addr.s_addr > sin2->sin_addr.s_addr) + return 1; + else if (include_port && + (r = ((int)sin1->sin_port - (int)sin2->sin_port))) + return r; + else + return 0; + } +#ifdef AF_INET6 + else if (sa1->sa_family == AF_INET6) { + const struct sockaddr_in6 *sin1, *sin2; + sin1 = (const struct sockaddr_in6 *)sa1; + sin2 = (const struct sockaddr_in6 *)sa2; + if ((r = memcmp(sin1->sin6_addr.s6_addr, sin2->sin6_addr.s6_addr, 16))) + return r; + else if (include_port && + (r = ((int)sin1->sin6_port - (int)sin2->sin6_port))) + return r; + else + return 0; + } +#endif + return 1; +} + +/* Tables to implement ctypes-replacement EVUTIL_IS*() functions. Each table + * has 256 bits to look up whether a character is in some set or not. This + * fails on non-ASCII platforms, but so does every other place where we + * take a char and write it onto the network. + **/ +static const ev_uint32_t EVUTIL_ISALPHA_TABLE[8] = + { 0, 0, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISALNUM_TABLE[8] = + { 0, 0x3ff0000, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISSPACE_TABLE[8] = { 0x3e00, 0x1, 0, 0, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISXDIGIT_TABLE[8] = + { 0, 0x3ff0000, 0x7e, 0x7e, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISDIGIT_TABLE[8] = { 0, 0x3ff0000, 0, 0, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISPRINT_TABLE[8] = + { 0, 0xffffffff, 0xffffffff, 0x7fffffff, 0, 0, 0, 0x0 }; +static const ev_uint32_t EVUTIL_ISUPPER_TABLE[8] = { 0, 0, 0x7fffffe, 0, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 }; +/* Upper-casing and lowercasing tables to map characters to upper/lowercase + * equivalents. */ +static const unsigned char EVUTIL_TOUPPER_TABLE[256] = { + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, + 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, + 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, + 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, + 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, + 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, + 96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, + 80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; +static const unsigned char EVUTIL_TOLOWER_TABLE[256] = { + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, + 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, + 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, + 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, + 64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95, + 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; + +#define IMPL_CTYPE_FN(name) \ + int EVUTIL_##name(char c) { \ + ev_uint8_t u = c; \ + return !!(EVUTIL_##name##_TABLE[(u >> 5) & 7] & (1 << (u & 31))); \ + } +IMPL_CTYPE_FN(ISALPHA) +IMPL_CTYPE_FN(ISALNUM) +IMPL_CTYPE_FN(ISSPACE) +IMPL_CTYPE_FN(ISDIGIT) +IMPL_CTYPE_FN(ISXDIGIT) +IMPL_CTYPE_FN(ISPRINT) +IMPL_CTYPE_FN(ISLOWER) +IMPL_CTYPE_FN(ISUPPER) + +char EVUTIL_TOLOWER(char c) +{ + return ((char)EVUTIL_TOLOWER_TABLE[(ev_uint8_t)c]); +} +char EVUTIL_TOUPPER(char c) +{ + return ((char)EVUTIL_TOUPPER_TABLE[(ev_uint8_t)c]); +} +int +evutil_ascii_strcasecmp(const char *s1, const char *s2) +{ + char c1, c2; + while (1) { + c1 = EVUTIL_TOLOWER(*s1++); + c2 = EVUTIL_TOLOWER(*s2++); + if (c1 < c2) + return -1; + else if (c1 > c2) + return 1; + else if (c1 == 0) + return 0; + } +} +int evutil_ascii_strncasecmp(const char *s1, const char *s2, size_t n) +{ + char c1, c2; + while (n--) { + c1 = EVUTIL_TOLOWER(*s1++); + c2 = EVUTIL_TOLOWER(*s2++); + if (c1 < c2) + return -1; + else if (c1 > c2) + return 1; + else if (c1 == 0) + return 0; + } + return 0; +} + +static int +evutil_issetugid(void) +{ +//#ifdef _EVENT_HAVE_ISSETUGID +// return issetugid(); +//#else + +//#ifdef _EVENT_HAVE_GETEUID +// if (getuid() != geteuid()) +// return 1; +//#endif +//#ifdef _EVENT_HAVE_GETEGID +// if (getgid() != getegid()) +// return 1; +//#endif + return 0; +//#endif +} + +const char * +evutil_getenv(const char *varname) +{ + if (evutil_issetugid()) + return NULL; + + return getenv(varname); +} + +long +_evutil_weakrand(void) +{ +#ifdef WIN32 + return rand(); +#else + return random(); +#endif +} + +/** + * Volatile pointer to memset: we use this to keep the compiler from + * eliminating our call to memset. + */ +void * (*volatile evutil_memset_volatile_)(void *, int, size_t) = memset; + +void +evutil_memclear_(void *mem, size_t len) +{ + evutil_memset_volatile_(mem, 0, len); +} + +int +evutil_sockaddr_is_loopback(const struct sockaddr *addr) +{ + static const char LOOPBACK_S6[16] = + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"; + if (addr->sa_family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in *)addr; + return (ntohl(sin->sin_addr.s_addr) & 0xff000000) == 0x7f000000; + } else if (addr->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr; + return !memcmp(sin6->sin6_addr.s6_addr, LOOPBACK_S6, 16); + } + return 0; +} + +#define MAX_SECONDS_IN_MSEC_LONG \ + (((LONG_MAX) - 999) / 1000) + +long +evutil_tv_to_msec(const struct timeval *tv) +{ + if (tv->tv_usec > 1000000 || tv->tv_sec > MAX_SECONDS_IN_MSEC_LONG) + return -1; + + return (tv->tv_sec * 1000) + ((tv->tv_usec + 999) / 1000); +} + +int +evutil_hex_char_to_int(char c) +{ + switch(c) + { + case '0': return 0; + case '1': return 1; + case '2': return 2; + case '3': return 3; + case '4': return 4; + case '5': return 5; + case '6': return 6; + case '7': return 7; + case '8': return 8; + case '9': return 9; + case 'A': case 'a': return 10; + case 'B': case 'b': return 11; + case 'C': case 'c': return 12; + case 'D': case 'd': return 13; + case 'E': case 'e': return 14; + case 'F': case 'f': return 15; + } + return -1; +} + +#ifdef WIN32 +HANDLE +evutil_load_windows_system_library(const TCHAR *library_name) +{ + TCHAR path[MAX_PATH]; + unsigned n; + n = GetSystemDirectory(path, MAX_PATH); + if (n == 0 || n + _tcslen(library_name) + 2 >= MAX_PATH) + return 0; + _tcscat(path, TEXT("\\")); + _tcscat(path, library_name); + return LoadLibrary(path); +} +#endif + diff --git a/external/libevent_files/evutil_rand.c b/external/libevent_files/evutil_rand.c new file mode 100644 index 00000000..ed557d27 --- /dev/null +++ b/external/libevent_files/evutil_rand.c @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* This file has our secure PRNG code. On platforms that have arc4random(), + * we just use that. Otherwise, we include arc4random.c as a bunch of static + * functions, and wrap it lightly. We don't expose the arc4random*() APIs + * because A) they aren't in our namespace, and B) it's not nice to name your + * APIs after their implementations. We keep them in a separate file + * so that other people can rip it out and use it for whatever. + */ + +#include "event2/event-config.h" + +#include <limits.h> + +#include "util-internal.h" +#include "evthread-internal.h" + +#ifdef _EVENT_HAVE_ARC4RANDOM +#include <stdlib.h> +#include <string.h> +int +evutil_secure_rng_set_urandom_device_file(char *fname) +{ + (void) fname; + return -1; +} +int +evutil_secure_rng_init(void) +{ + /* call arc4random() now to force it to self-initialize */ + (void) arc4random(); + return 0; +} +int +evutil_secure_rng_global_setup_locks_(const int enable_locks) +{ + return 0; +} + +static void +ev_arc4random_buf(void *buf, size_t n) +{ +#if defined(_EVENT_HAVE_ARC4RANDOM_BUF) && !defined(__APPLE__) + return arc4random_buf(buf, n); +#else + unsigned char *b = buf; + +#if defined(_EVENT_HAVE_ARC4RANDOM_BUF) + /* OSX 10.7 introducd arc4random_buf, so if you build your program + * there, you'll get surprised when older versions of OSX fail to run. + * To solve this, we can check whether the function pointer is set, + * and fall back otherwise. (OSX does this using some linker + * trickery.) + */ + { + void (*tptr)(void *,size_t) = + (void (*)(void*,size_t))arc4random_buf; + if (tptr != NULL) { + return arc4random_buf(buf, n); + } + } +#endif + /* Make sure that we start out with b at a 4-byte alignment; plenty + * of CPUs care about this for 32-bit access. */ + if (n >= 4 && ((ev_uintptr_t)b) & 3) { + ev_uint32_t u = arc4random(); + int n_bytes = 4 - (((ev_uintptr_t)b) & 3); + memcpy(b, &u, n_bytes); + b += n_bytes; + n -= n_bytes; + } + while (n >= 4) { + *(ev_uint32_t*)b = arc4random(); + b += 4; + n -= 4; + } + if (n) { + ev_uint32_t u = arc4random(); + memcpy(b, &u, n); + } +#endif +} + +#else /* !_EVENT_HAVE_ARC4RANDOM { */ + +#ifdef _EVENT_ssize_t +#define ssize_t _EVENT_SSIZE_t +#endif +#define ARC4RANDOM_EXPORT static +#define _ARC4_LOCK() EVLOCK_LOCK(arc4rand_lock, 0) +#define _ARC4_UNLOCK() EVLOCK_UNLOCK(arc4rand_lock, 0) +#ifndef _EVENT_DISABLE_THREAD_SUPPORT +static void *arc4rand_lock; +#endif + +#define ARC4RANDOM_UINT32 ev_uint32_t +#define ARC4RANDOM_NOSTIR +#define ARC4RANDOM_NORANDOM +#define ARC4RANDOM_NOUNIFORM + +#include "./arc4random.c" + +#ifndef _EVENT_DISABLE_THREAD_SUPPORT +int +evutil_secure_rng_global_setup_locks_(const int enable_locks) +{ + EVTHREAD_SETUP_GLOBAL_LOCK(arc4rand_lock, 0); + return 0; +} +#endif + +int +evutil_secure_rng_set_urandom_device_file(char *fname) +{ +#ifdef TRY_SEED_URANDOM + //_ARC4_LOCK(); + arc4random_urandom_filename = fname; + //_ARC4_UNLOCK(); +#endif + return 0; +} + +int +evutil_secure_rng_init(void) +{ + int val; + + //_ARC4_LOCK(); + if (!arc4_seeded_ok) + arc4_stir(); + val = arc4_seeded_ok ? 0 : -1; + //_ARC4_UNLOCK(); + return val; +} + +static void +ev_arc4random_buf(void *buf, size_t n) +{ + arc4random_buf(buf, n); +} + +#endif /* } !_EVENT_HAVE_ARC4RANDOM */ + +void +evutil_secure_rng_get_bytes(void *buf, size_t n) +{ + ev_arc4random_buf(buf, n); +} + +void +evutil_secure_rng_add_bytes(const char *buf, size_t n) +{ +#if !defined(__BIONIC__) /* bionic and OpenBSD removed this; it's a no-op in their current implementation. */ + arc4random_addrandom((unsigned char*)buf, + n>(size_t)INT_MAX ? INT_MAX : (int)n); +#endif +} + diff --git a/external/libxml2_android/jni/Android.mk b/external/libxml2_android/jni/Android.mk new file mode 100644 index 00000000..5053e7d6 --- /dev/null +++ b/external/libxml2_android/jni/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/external/libxml2_android/jni/Application.mk b/external/libxml2_android/jni/Application.mk new file mode 100644 index 00000000..7bb1628b --- /dev/null +++ b/external/libxml2_android/jni/Application.mk @@ -0,0 +1,6 @@ +APP_ABI := armeabi-v7a + +APP_STL := gnustl_shared +APP_CPPFLAGS += -fexceptions -frtti -std=c++11 -Wno-deprecated-declarations +NDK_TOOLCHAIN_VERSION := 4.9 +APP_PLATFORM := android-21
\ No newline at end of file diff --git a/external/libxml2_android/jni/libxml2/Android.mk b/external/libxml2_android/jni/libxml2/Android.mk new file mode 100755 index 00000000..bb8846af --- /dev/null +++ b/external/libxml2_android/jni/libxml2/Android.mk @@ -0,0 +1,65 @@ +LOCAL_PATH := $(call my-dir) + +# common_SRC_FILES := $(notdir $(wildcard $(LOCAL_PATH)/*.c)) + +# Ignore test files +common_SRC_FILES := \ + buf.c \ + c14n.c \ + catalog.c \ + chvalid.c \ + debugXML.c \ + dict.c \ + DOCBparser.c \ + encoding.c \ + entities.c \ + error.c \ + globals.c \ + hash.c \ + HTMLparser.c \ + HTMLtree.c \ + legacy.c \ + list.c \ + nanoftp.c \ + nanohttp.c \ + parser.c \ + parserInternals.c \ + pattern.c \ + relaxng.c \ + SAX.c \ + SAX2.c \ + schematron.c \ + threads.c \ + tree.c \ + uri.c \ + valid.c \ + xinclude.c \ + xlink.c \ + xmlIO.c \ + xmlmemory.c \ + xmlmodule.c \ + xmlreader.c \ + xmlregexp.c \ + xmlsave.c \ + xmlschemas.c \ + xmlschemastypes.c \ + xmlstring.c \ + xmlunicode.c \ + xmlwriter.c \ + xpath.c \ + xpointer.c + + +common_C_INCLUDES += $(LOCAL_PATH)/include + + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(common_SRC_FILES) +LOCAL_C_INCLUDES += $(common_C_INCLUDES) +LOCAL_SHARED_LIBRARIES += $(common_SHARED_LIBRARIES) +LOCAL_CFLAGS += -fvisibility=hidden -I$(LOCAL_C_INCLUDES) + +LOCAL_MODULE:= xml2 + +include $(BUILD_STATIC_LIBRARY) diff --git a/external/libxml2_android/jni/libxml2/config.h b/external/libxml2_android/jni/libxml2/config.h new file mode 100644 index 00000000..bc910aee --- /dev/null +++ b/external/libxml2_android/jni/libxml2/config.h @@ -0,0 +1,333 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Type cast for the gethostbyname() argument */ +#define GETHOSTBYNAME_ARG_CAST /**/ + +/* Define to 1 if you have the <ansidecl.h> header file. */ +/* #undef HAVE_ANSIDECL_H */ + +/* Define to 1 if you have the <arpa/inet.h> header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the <arpa/nameser.h> header file. */ +#define HAVE_ARPA_NAMESER_H 1 + +/* Whether struct sockaddr::__ss_family exists */ +/* #undef HAVE_BROKEN_SS_FAMILY */ + +/* Define to 1 if you have the `class' function. */ +/* #undef HAVE_CLASS */ + +/* Define to 1 if you have the <ctype.h> header file. */ +#define HAVE_CTYPE_H 1 + +/* Define to 1 if you have the <dirent.h> header file. */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Have dlopen based dso */ +#define HAVE_DLOPEN /**/ + +/* Define to 1 if you have the <dl.h> header file. */ +/* #undef HAVE_DL_H */ + +/* Define to 1 if you have the <errno.h> header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `finite' function. */ +/* #undef HAVE_FINITE */ + +/* Define to 1 if you have the <float.h> header file. */ +#define HAVE_FLOAT_H 1 + +/* Define to 1 if you have the `fpclass' function. */ +/* #undef HAVE_FPCLASS */ + +/* Define to 1 if you have the `fprintf' function. */ +#define HAVE_FPRINTF 1 + +/* Define to 1 if you have the `fp_class' function. */ +/* #undef HAVE_FP_CLASS */ + +/* Define to 1 if you have the <fp_class.h> header file. */ +/* #undef HAVE_FP_CLASS_H */ + +/* Define to 1 if you have the `ftime' function. */ +/* #undef HAVE_FTIME */ + +/* Define if getaddrinfo is there */ +#define HAVE_GETADDRINFO /**/ + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the <ieeefp.h> header file. */ +/* #undef HAVE_IEEEFP_H */ + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `isascii' function. */ +#define HAVE_ISASCII 1 + +/* Define if isinf is there */ +#define HAVE_ISINF /**/ + +/* Define if isnan is there */ +#define HAVE_ISNAN /**/ + +/* Define to 1 if you have the `isnand' function. */ +/* #undef HAVE_ISNAND */ + +/* Define if history library is there (-lhistory) */ +/* #undef HAVE_LIBHISTORY */ + +/* Have compression library */ +/* #undef HAVE_LIBLZMA */ + +/* Define if pthread library is there (-lpthread) */ +/* #undef HAVE_LIBPTHREAD */ + +/* Define if readline library is there (-lreadline) */ +/* #undef HAVE_LIBREADLINE */ + +/* Have compression library */ +#define HAVE_LIBZ 1 + +/* Define to 1 if you have the <limits.h> header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the `localtime' function. */ +#define HAVE_LOCALTIME 1 + +/* Define to 1 if you have the <lzma.h> header file. */ +/* #undef HAVE_LZMA_H */ + +/* Define to 1 if you have the <malloc.h> header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the <math.h> header file. */ +#define HAVE_MATH_H 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define to 1 if you have the `munmap' function. */ +#define HAVE_MUNMAP 1 + +/* mmap() is no good without munmap() */ +#if defined(HAVE_MMAP) && !defined(HAVE_MUNMAP) +# undef /**/ HAVE_MMAP +#endif + +/* Define to 1 if you have the <nan.h> header file. */ +/* #undef HAVE_NAN_H */ + +/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the <netdb.h> header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the <poll.h> header file. */ +#define HAVE_POLL_H 1 + +/* Define to 1 if you have the `printf' function. */ +#define HAVE_PRINTF 1 + +/* Define if <pthread.h> is there */ +/* #undef HAVE_PTHREAD_H */ + +/* Define to 1 if you have the `putenv' function. */ +#define HAVE_PUTENV 1 + +/* Define to 1 if you have the `rand' function. */ +#define HAVE_RAND 1 + +/* Define to 1 if you have the `rand_r' function. */ +#define HAVE_RAND_R 1 + +/* Define to 1 if you have the <resolv.h> header file. */ +#define HAVE_RESOLV_H 1 + +/* Have shl_load based dso */ +/* #undef HAVE_SHLLOAD */ + +/* Define to 1 if you have the `signal' function. */ +#define HAVE_SIGNAL 1 + +/* Define to 1 if you have the <signal.h> header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `sprintf' function. */ +#define HAVE_SPRINTF 1 + +/* Define to 1 if you have the `srand' function. */ +#define HAVE_SRAND 1 + +/* Define to 1 if you have the `sscanf' function. */ +#define HAVE_SSCANF 1 + +/* Define to 1 if you have the `stat' function. */ +#define HAVE_STAT 1 + +/* Define to 1 if you have the <stdarg.h> header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the `strftime' function. */ +#define HAVE_STRFTIME 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strndup' function. */ +#define HAVE_STRNDUP 1 + +/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the <sys/select.h> header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/timeb.h> header file. */ +/* #undef HAVE_SYS_TIMEB_H */ + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the `time' function. */ +#define HAVE_TIME 1 + +/* Define to 1 if you have the <time.h> header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Whether va_copy() is available */ +#define HAVE_VA_COPY 1 + +/* Define to 1 if you have the `vfprintf' function. */ +#define HAVE_VFPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#define HAVE_VSNPRINTF 1 + +/* Define to 1 if you have the `vsprintf' function. */ +#define HAVE_VSPRINTF 1 + +/* Define to 1 if you have the <zlib.h> header file. */ +#define HAVE_ZLIB_H 1 + +/* Define to 1 if you have the `_stat' function. */ +/* #undef HAVE__STAT */ + +/* Whether __va_copy() is available */ +/* #undef HAVE___VA_COPY */ + +/* Define as const if the declaration of iconv() needs const. */ +/* #undef ICONV_CONST */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "libxml2" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* Type cast for the send() function 2nd arg */ +#define SEND_ARG2_CAST /**/ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Support for IPv6 */ +#define SUPPORT_IP6 /**/ + +/* Define if va_list is an array type */ +/* #undef VA_LIST_IS_ARRAY */ + +/* Version number of package */ +#define VERSION "2.9.4" + +/* Determine what socket length (socklen_t) data type is */ +#define XML_SOCKLEN_T socklen_t + +/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT32_T */ + +/* Using the Win32 Socket implementation */ +/* #undef _WINSOCKAPI_ */ + +/* ss_family is not defined here, use __ss_family instead */ +/* #undef ss_family */ + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint32_t */ diff --git a/external/libxml2_android/jni/libxml2/include/libxml/xmlversion.h b/external/libxml2_android/jni/libxml2/include/libxml/xmlversion.h new file mode 100644 index 00000000..abf8d708 --- /dev/null +++ b/external/libxml2_android/jni/libxml2/include/libxml/xmlversion.h @@ -0,0 +1,489 @@ +/* + * Summary: compile-time version informations + * Description: compile-time version informations for the XML library + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_VERSION_H__ +#define __XML_VERSION_H__ + +#include <libxml/xmlexports.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * use those to be sure nothing nasty will happen if + * your library and includes mismatch + */ +#ifndef LIBXML2_COMPILING_MSCCDEF +XMLPUBFUN void XMLCALL xmlCheckVersion(int version); +#endif /* LIBXML2_COMPILING_MSCCDEF */ + +/** + * LIBXML_DOTTED_VERSION: + * + * the version string like "1.2.3" + */ +#define LIBXML_DOTTED_VERSION "2.9.4" + +/** + * LIBXML_VERSION: + * + * the version number: 1.2.3 value is 10203 + */ +#define LIBXML_VERSION 20904 + +/** + * LIBXML_VERSION_STRING: + * + * the version number string, 1.2.3 value is "10203" + */ +#define LIBXML_VERSION_STRING "20904" + +/** + * LIBXML_VERSION_EXTRA: + * + * extra version information, used to show a CVS compilation + */ +#define LIBXML_VERSION_EXTRA "-GITv2.9.4-12-ge905f08" + +/** + * LIBXML_TEST_VERSION: + * + * Macro to check that the libxml version in use is compatible with + * the version the software has been compiled against + */ +#define LIBXML_TEST_VERSION xmlCheckVersion(20904); + +#ifndef VMS +#if 0 +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO +#else +/** + * WITHOUT_TRIO: + * + * defined if the trio support should not be configured in + */ +#define WITHOUT_TRIO +#endif +#else /* VMS */ +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO 1 +#endif /* VMS */ + +/** + * LIBXML_THREAD_ENABLED: + * + * Whether the thread support is configured in + */ +#if 0 +#if defined(_REENTRANT) || defined(__MT__) || \ + (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L)) +#define LIBXML_THREAD_ENABLED +#endif +#endif + +/** + * LIBXML_THREAD_ALLOC_ENABLED: + * + * Whether the allocation hooks are per-thread + */ +#if 0 +#define LIBXML_THREAD_ALLOC_ENABLED +#endif + +/** + * LIBXML_TREE_ENABLED: + * + * Whether the DOM like tree manipulation API support is configured in + */ +#if 1 +#define LIBXML_TREE_ENABLED +#endif + +/** + * LIBXML_OUTPUT_ENABLED: + * + * Whether the serialization/saving support is configured in + */ +#if 1 +#define LIBXML_OUTPUT_ENABLED +#endif + +/** + * LIBXML_PUSH_ENABLED: + * + * Whether the push parsing interfaces are configured in + */ +#if 1 +#define LIBXML_PUSH_ENABLED +#endif + +/** + * LIBXML_READER_ENABLED: + * + * Whether the xmlReader parsing interface is configured in + */ +#if 1 +#define LIBXML_READER_ENABLED +#endif + +/** + * LIBXML_PATTERN_ENABLED: + * + * Whether the xmlPattern node selection interface is configured in + */ +#if 1 +#define LIBXML_PATTERN_ENABLED +#endif + +/** + * LIBXML_WRITER_ENABLED: + * + * Whether the xmlWriter saving interface is configured in + */ +#if 1 +#define LIBXML_WRITER_ENABLED +#endif + +/** + * LIBXML_SAX1_ENABLED: + * + * Whether the older SAX1 interface is configured in + */ +#if 1 +#define LIBXML_SAX1_ENABLED +#endif + +/** + * LIBXML_FTP_ENABLED: + * + * Whether the FTP support is configured in + */ +#if 1 +#define LIBXML_FTP_ENABLED +#endif + +/** + * LIBXML_HTTP_ENABLED: + * + * Whether the HTTP support is configured in + */ +#if 1 +#define LIBXML_HTTP_ENABLED +#endif + +/** + * LIBXML_VALID_ENABLED: + * + * Whether the DTD validation support is configured in + */ +#if 1 +#define LIBXML_VALID_ENABLED +#endif + +/** + * LIBXML_HTML_ENABLED: + * + * Whether the HTML support is configured in + */ +#if 1 +#define LIBXML_HTML_ENABLED +#endif + +/** + * LIBXML_LEGACY_ENABLED: + * + * Whether the deprecated APIs are compiled in for compatibility + */ +#if 1 +#define LIBXML_LEGACY_ENABLED +#endif + +/** + * LIBXML_C14N_ENABLED: + * + * Whether the Canonicalization support is configured in + */ +#if 1 +#define LIBXML_C14N_ENABLED +#endif + +/** + * LIBXML_CATALOG_ENABLED: + * + * Whether the Catalog support is configured in + */ +#if 1 +#define LIBXML_CATALOG_ENABLED +#endif + +/** + * LIBXML_DOCB_ENABLED: + * + * Whether the SGML Docbook support is configured in + */ +#if 1 +#define LIBXML_DOCB_ENABLED +#endif + +/** + * LIBXML_XPATH_ENABLED: + * + * Whether XPath is configured in + */ +#if 1 +#define LIBXML_XPATH_ENABLED +#endif + +/** + * LIBXML_XPTR_ENABLED: + * + * Whether XPointer is configured in + */ +#if 1 +#define LIBXML_XPTR_ENABLED +#endif + +/** + * LIBXML_XINCLUDE_ENABLED: + * + * Whether XInclude is configured in + */ +#if 1 +#define LIBXML_XINCLUDE_ENABLED +#endif + +/** + * LIBXML_ICONV_ENABLED: + * + * Whether iconv support is available + */ +#if 0 +#define LIBXML_ICONV_ENABLED +#endif + +/** + * LIBXML_ICU_ENABLED: + * + * Whether icu support is available + */ +#if 0 +#define LIBXML_ICU_ENABLED +#endif + +/** + * LIBXML_ISO8859X_ENABLED: + * + * Whether ISO-8859-* support is made available in case iconv is not + */ +#if 1 +#define LIBXML_ISO8859X_ENABLED +#endif + +/** + * LIBXML_DEBUG_ENABLED: + * + * Whether Debugging module is configured in + */ +#if 1 +#define LIBXML_DEBUG_ENABLED +#endif + +/** + * DEBUG_MEMORY_LOCATION: + * + * Whether the memory debugging is configured in + */ +#if 0 +#define DEBUG_MEMORY_LOCATION +#endif + +/** + * LIBXML_DEBUG_RUNTIME: + * + * Whether the runtime debugging is configured in + */ +#if 0 +#define LIBXML_DEBUG_RUNTIME +#endif + +/** + * LIBXML_UNICODE_ENABLED: + * + * Whether the Unicode related interfaces are compiled in + */ +#if 1 +#define LIBXML_UNICODE_ENABLED +#endif + +/** + * LIBXML_REGEXP_ENABLED: + * + * Whether the regular expressions interfaces are compiled in + */ +#if 1 +#define LIBXML_REGEXP_ENABLED +#endif + +/** + * LIBXML_AUTOMATA_ENABLED: + * + * Whether the automata interfaces are compiled in + */ +#if 1 +#define LIBXML_AUTOMATA_ENABLED +#endif + +/** + * LIBXML_EXPR_ENABLED: + * + * Whether the formal expressions interfaces are compiled in + */ +#if 1 +#define LIBXML_EXPR_ENABLED +#endif + +/** + * LIBXML_SCHEMAS_ENABLED: + * + * Whether the Schemas validation interfaces are compiled in + */ +#if 1 +#define LIBXML_SCHEMAS_ENABLED +#endif + +/** + * LIBXML_SCHEMATRON_ENABLED: + * + * Whether the Schematron validation interfaces are compiled in + */ +#if 1 +#define LIBXML_SCHEMATRON_ENABLED +#endif + +/** + * LIBXML_MODULES_ENABLED: + * + * Whether the module interfaces are compiled in + */ +#if 1 +#define LIBXML_MODULES_ENABLED +/** + * LIBXML_MODULE_EXTENSION: + * + * the string suffix used by dynamic modules (usually shared libraries) + */ +#define LIBXML_MODULE_EXTENSION ".so" +#endif + +/** + * LIBXML_ZLIB_ENABLED: + * + * Whether the Zlib support is compiled in + */ +#if 1 +#define LIBXML_ZLIB_ENABLED +#endif + +/** + * LIBXML_LZMA_ENABLED: + * + * Whether the Lzma support is compiled in + */ +#if 0 +#define LIBXML_LZMA_ENABLED +#endif + +#ifdef __GNUC__ +#ifdef HAVE_ANSIDECL_H +#include <ansidecl.h> +#endif + +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ + +#ifndef ATTRIBUTE_UNUSED +# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) +# define ATTRIBUTE_UNUSED __attribute__((unused)) +# else +# define ATTRIBUTE_UNUSED +# endif +#endif + +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ + +#ifndef LIBXML_ATTR_ALLOC_SIZE +# if (!defined(__clang__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))) +# define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) +# else +# define LIBXML_ATTR_ALLOC_SIZE(x) +# endif +#else +# define LIBXML_ATTR_ALLOC_SIZE(x) +#endif + +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ + +#ifndef LIBXML_ATTR_FORMAT +# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) +# define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) +# else +# define LIBXML_ATTR_FORMAT(fmt,args) +# endif +#else +# define LIBXML_ATTR_FORMAT(fmt,args) +#endif + +#else /* ! __GNUC__ */ +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ +#define ATTRIBUTE_UNUSED +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ +#define LIBXML_ATTR_ALLOC_SIZE(x) +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ +#define LIBXML_ATTR_FORMAT(fmt,args) +#endif /* __GNUC__ */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif + + diff --git a/iget_android/.gitignore b/iget_android/.gitignore new file mode 100644 index 00000000..37dce116 --- /dev/null +++ b/iget_android/.gitignore @@ -0,0 +1,2 @@ +local.properties +app/src/main/libs
\ No newline at end of file diff --git a/iget_android/app/build.gradle b/iget_android/app/build.gradle new file mode 100644 index 00000000..43638e0a --- /dev/null +++ b/iget_android/app/build.gradle @@ -0,0 +1,185 @@ +import org.apache.tools.ant.taskdefs.condition.Os + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.2" + + defaultConfig { + applicationId "com.iget.ccnx" + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "0.0.1 ( 0.0.1)" + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + signingConfigs { + release { + storeFile file("iget.keystore") + storePassword "icn_iget" + keyAlias "iget" + keyPassword "icn_iget" + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release + } + debug { + debuggable true + jniDebuggable true + } + } + sourceSets { + main { + java.srcDirs "src/main/java" + res.srcDirs "src/main/res" + jniLibs.srcDir 'src/main/libs' + jni.srcDirs = [] //disable automatic ndk-build call + } + androidTest.setRoot('tests') + androidTest.java.srcDirs = ['tests/src'] + } + packagingOptions { + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/NOTICE.txt' + } + + splits { + abi { + enable true // enable ABI split feature to create one APK per ABI + universalApk false // don't generate an additional APK that targets all the ABIs + } + } + + // map for the version code + // versionCode digit for each supported ABI, with 64bit>32bit and x86>armeabi-* + project.ext.versionCodes = ['armeabi': 1, + 'armeabi-v7a': 2, + 'arm64-v8a': 3, + 'mips': 5, + 'mips64': 6, + 'x86': 8, + 'x86_64': 9] + + android.applicationVariants.all { variant -> + // assign different version code for each output + variant.outputs.each { output -> + output.versionCodeOverride = project.ext.versionCodes.get( + output.getFilter( + com.android.build.OutputFile.ABI), 0) * 1000000 + + defaultConfig.versionCode + } + } + + task copyNdnCxxHeaders(type: Copy) { + from('src/main/jni/ndn-cxx/src') { + include '**/*.hpp' + } + into 'build/generated/source/include/ndn-cxx' + } + + // call regular ndk-build(.cmd) script from app directory + task ndkBuild(type: Exec) { + dependsOn copyNdnCxxHeaders + def args = [getNdkBuildCmd(), '-C', file('src/main').absolutePath] + + if (System.env.NDK_BUILD_PARALLEL != null) { + args.add("-j" + System.env.NDK_BUILD_PARALLEL) + } + else { + args.add("-j" + Runtime.runtime.availableProcessors()) + } + + if (System.env.NDK_BUILD_ABI != null) { + args.add("APP_ABI=" + System.env.NDK_BUILD_ABI) + } + + if (System.env.NDK_DEBUG != null) { + args.add("NDK_DEBUG=1") + } + commandLine args + } + + tasks.withType(JavaCompile) { + compileTask -> compileTask.dependsOn ndkBuild + } + + task cleanNative(type: Exec) { + commandLine getNdkBuildCmd(), '-C', file('src/main').absolutePath, 'clean' + } + + clean.dependsOn cleanNative + //dexOptions { + // incremental true + //} + dexOptions { + incremental true + } +} + +def getNdkBuildCmd() { + def ndk_build = getNdkDir() + "/ndk-build" + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + ndk_build += ".cmd" + } + + return ndk_build +} + + +def getNdkDir() { + if (System.env.ANDROID_NDK_ROOT != null) + return System.env.ANDROID_NDK_ROOT + + Properties properties = new Properties() + properties.load(project.rootProject.file('local.properties').newDataInputStream()) + + def ndk_dir = properties.getProperty('ndk.dir', null) + if (ndk_dir == null) { + throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.") + } + return ndk_dir +} + +repositories { + mavenLocal() + mavenCentral() + maven { + url "https://oss.sonatype.org/content/repositories/snapshots/" + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + compile 'com.android.support:appcompat-v7:23.1.1' + compile 'com.android.support:support-v4:23.1.1' + compile('com.intel.jndn.management:jndn-management:1.1.2') { + exclude group: 'net.named-data', module: 'jndn' + } + compile('net.named-data:jndn-android:0.13') { + exclude group: 'org.xerial' + } + compile 'net.named-data.jndn-xx:jndn-xx-util:0.0.1' + compile 'joda-time:joda-time:2.7' +} + +Properties properties = new Properties() +properties.load(project.rootProject.file('local.properties').newDataInputStream()) + + +if (properties['google-play'] != null) { + apply plugin: 'net.named-data.playground.play' + + play { + track = 'alpha' + jsonFile = file(properties['google-play']) + } +} diff --git a/iget_android/app/iget.keystore b/iget_android/app/iget.keystore Binary files differnew file mode 100644 index 00000000..ecedc0ec --- /dev/null +++ b/iget_android/app/iget.keystore diff --git a/iget_android/app/src/main/AndroidManifest.xml b/iget_android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..47b6895e --- /dev/null +++ b/iget_android/app/src/main/AndroidManifest.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (c) 2017 Cisco and/or its affiliates. + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at: + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.iget.ccnx" > + + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-permission + android:name="android.permission.READ_EXTERNAL_STORAGE" + android:maxSdkVersion="21" /> + + <application + android:allowBackup="true" + android:icon="@drawable/iget_app" + android:label="@string/app_name" + android:theme="@style/AppTheme" > + + <activity + android:name=".MainActivity" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + </application> + +</manifest> diff --git a/iget_android/app/src/main/java/com/iget/ccnx/DrawerFragment.java b/iget_android/app/src/main/java/com/iget/ccnx/DrawerFragment.java new file mode 100644 index 00000000..72960fc5 --- /dev/null +++ b/iget_android/app/src/main/java/com/iget/ccnx/DrawerFragment.java @@ -0,0 +1,505 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.iget.ccnx; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.widget.DrawerLayout; +import android.support.v4.widget.ViewDragHelper; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; +import android.support.v7.app.ActionBarDrawerToggle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import java.util.ArrayList; + +/** + * DrawerFragment that provides navigation for MainActivity. + */ +public class DrawerFragment extends Fragment { + + public static DrawerFragment + newInstance(ArrayList<DrawerFragment.DrawerItem> items) { + Bundle drawerParams = new Bundle(); + drawerParams.putParcelableArrayList(DrawerFragment.BUNDLE_PARAMETERS, items); + + DrawerFragment fragment = new DrawerFragment(); + fragment.setArguments(drawerParams); + return fragment; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + // Register callback + m_callbacks = (DrawerCallbacks)activity; + } catch (ClassCastException e) { + throw new ClassCastException("Host activity must implement DrawerFragment.DrawerCallbacks."); + } + } + + @Override + public void onDetach() { + super.onDetach(); + m_callbacks = null; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Read in the flag indicating whether or not the user has demonstrated awareness of the + // drawer. See PREF_DRAWER_SHOWN_TO_USER_FOR_THE_FIRST_TIME for details. + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); + m_hasUserSeenDrawer = sp.getBoolean(PREF_DRAWER_SHOWN_TO_USER_FOR_THE_FIRST_TIME, false); + + if (savedInstanceState != null) { + m_drawerSelectedPosition = savedInstanceState.getInt(DRAWER_SELECTED_POSITION_BUNDLE_KEY); + m_restoredFromSavedInstanceState = true; + } + + m_drawerItems = getArguments().getParcelableArrayList(BUNDLE_PARAMETERS); + } + + @Override + public View onCreateView(LayoutInflater inflater, + ViewGroup container, + Bundle savedInstanceState) + { + m_drawerListView = (ListView)inflater.inflate( + R.layout.activity_main_drawer_listview, container, false); + + m_drawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + // Update UI + updateSelection(position); + } + }); + + m_drawerListView.setAdapter(new DrawerListAdapter(getActionBar().getThemedContext(), m_drawerItems)); + m_drawerListView.setItemChecked(m_drawerSelectedPosition, true); + + return m_drawerListView; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + // Fragment influences action bar + setHasOptionsMenu(true); + + // Initialize and set up the navigation drawer UI + initializeDrawerFragment(getActivity().findViewById(R.id.navigation_drawer), + (DrawerLayout)getActivity().findViewById(R.id.drawer_layout)); + + if (savedInstanceState == null) { + // when restoring (e.g., after rotation), rely on system to restore previous state of + // fragments + updateSelection(m_drawerSelectedPosition); + } + } + + /** + * Initialize drawer fragment after being attached to the host activity. + * + * @param drawerFragmentViewContainer View container that holds the navigation drawer + * @param drawerLayout DrawerLayout of the drawer in the host Activity + */ + private void initializeDrawerFragment(View drawerFragmentViewContainer, + DrawerLayout drawerLayout) + { + m_drawerFragmentViewContainer = drawerFragmentViewContainer; + m_drawerLayout = drawerLayout; + + // Setup drawer and action bar + ActionBar actionBar = getActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + + m_drawerToggle = new ActionBarDrawerToggle( + getActivity(), + m_drawerLayout, + R.string.accessibility_open_drawer, + R.string.accessibility_close_drawer) + { + @Override + public void onDrawerClosed(View drawerView) { + super.onDrawerClosed(drawerView); + + // Allow update calls to onCreateOptionsMenu() and + // onPrepareOptionsMenu() to update Menu UI. + m_shouldHideOptionsMenu = false; + getActivity().supportInvalidateOptionsMenu(); + } + + @Override + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + + // Flag that user has seen drawer for the first time + if (!m_hasUserSeenDrawer) { + m_hasUserSeenDrawer = true; + SharedPreferences sp = PreferenceManager + .getDefaultSharedPreferences(getActivity()); + + sp.edit() + .putBoolean(PREF_DRAWER_SHOWN_TO_USER_FOR_THE_FIRST_TIME, true) + .apply(); + } + + // Allow update calls to onCreateOptionsMenu() and + // onPrepareOptionsMenu() to update Menu UI + m_shouldHideOptionsMenu = true; + getActivity().supportInvalidateOptionsMenu(); + } + + @Override + public void onDrawerStateChanged(int newState) { + super.onDrawerStateChanged(newState); + if (newState != ViewDragHelper.STATE_IDLE) { + // opened/closed is handled by onDrawerOpened and onDrawerClosed callbacks + m_shouldHideOptionsMenu = true; + getActivity().supportInvalidateOptionsMenu(); + } else if (newState == ViewDragHelper.STATE_IDLE && !isDrawerOpen()) { + // This condition takes care of the case of displaying the option menu + // items when the drawer is retracted prematurely. + m_shouldHideOptionsMenu = false; + getActivity().supportInvalidateOptionsMenu(); + } + } + }; + + // Open drawer for the first time + if (!m_hasUserSeenDrawer && !m_restoredFromSavedInstanceState) { + m_shouldHideOptionsMenu = true; + m_drawerLayout.openDrawer(m_drawerFragmentViewContainer); + } + + // Post to drawer's handler to update UI State + m_drawerLayout.post(new Runnable() { + @Override + public void run() { + m_drawerToggle.syncState(); + } + }); + + m_drawerLayout.setDrawerListener(m_drawerToggle); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(DRAWER_SELECTED_POSITION_BUNDLE_KEY, m_drawerSelectedPosition); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Forward the new configuration the drawer toggle component. + m_drawerToggle.onConfigurationChanged(newConfig); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + // Update menu UI when the drawer is open. This gives the user a better + // contextual perception of the application. + if (isDrawerOpen()) { + // Inflate drawer specific menu here (if any) + showGlobalContextActionBar(); + } + + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + // Remove option menu items when drawer is sliding out + if (m_shouldHideOptionsMenu) { + for (int i = 0; i < menu.size(); i++) { + menu.getItem(i).setVisible(false); + } + } + + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle drawer selection events + if (m_drawerToggle.onOptionsItemSelected(item)) { + return true; + } + + // Handle other menu items + switch (item.getItemId()) { + // Handle activity menu item here (if any) + default: + return super.onOptionsItemSelected(item); + } + } + + public boolean + shouldHideOptionsMenu() { + return m_shouldHideOptionsMenu; + } + + /** + * Convenience method that updates the UI and callbacks the host activity. + * + * @param position Position of the selected item within the Drawer's ListView. + */ + private void updateSelection(int position) { + // Update Position + m_drawerSelectedPosition = position; + + // Update UI of selected position + if (m_drawerListView != null) { + m_drawerListView.setItemChecked(position, true); + } + + // Close drawer + if (m_drawerLayout != null) { + m_drawerLayout.closeDrawer(m_drawerFragmentViewContainer); + } + + // Invoke host activity callback + if (m_callbacks != null) { + DrawerItem item = m_drawerItems.get(position); + m_callbacks.onDrawerItemSelected(item.getItemCode(), item.getItemName()); + } + } + + /** + * Safe convenience method to determine if drawer is open. + * + * @return True if drawer is present and in an open state; false otherwise + */ + private boolean + isDrawerOpen() { + return m_drawerLayout != null && m_drawerLayout.isDrawerOpen(m_drawerFragmentViewContainer); + } + + /** + * Convenience method to update host activity action bar so that the user is informed of + * the app's "current context" of the fragment. + */ + private void showGlobalContextActionBar() { + ActionBar actionBar = getActionBar(); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setTitle(R.string.app_name); + } + + /** + * Convenience method to get host activity's ActionBar. This makes for easy updates + * in a single location when upgrading to use >= HONEYCOMB (API 11) ActionBar. + * + * @return Host activity's ActionBar. + */ + private ActionBar getActionBar() { + return ((ActionBarActivity)getActivity()).getSupportActionBar(); + } + + ////////////////////////////////////////////////////////////////////////////// + + /** + * DrawerItem represents a single selection option in the Drawer, complete + * with the ability to set a Drawable resource icon for display along + * with the drawer item name. + */ + public static class DrawerItem implements Parcelable { + @Override + public int describeContents() + { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) + { + parcel.writeInt(m_itemNameId); + parcel.writeInt(m_iconResId); + parcel.writeInt(m_itemCode); + } + + public static final Parcelable.Creator<DrawerItem> CREATOR = new Parcelable.Creator<DrawerItem>() { + public DrawerItem + createFromParcel(Parcel in) { + return new DrawerItem(in.readInt(), in.readInt(), in.readInt()); + } + + public DrawerItem[] newArray(int size) { + return new DrawerItem[size]; + } + }; + + public + DrawerItem(int itemNameId, int resIconId, int itemCode) { + m_itemNameId = itemNameId; + m_iconResId = resIconId; + m_itemCode = itemCode; + } + + public int + getItemName() { + return m_itemNameId; + } + + public int + getIconResId() { + return m_iconResId; + } + + public int + getItemCode() { + return m_itemCode; + } + + /////////////////////////////////////////////////////////////////////////// + + /** Drawer item name */ + private final int m_itemNameId; + + /** Resource ID of a drawable to be shown as the item's icon */ + private final int m_iconResId; + + /** Item code for feedback to the host activity's implemented callback. */ + private final int m_itemCode; + + } + + /** + * Customized DrawerListAdapter to furnishes the Drawer with DrawerItem + * information. + */ + private static class DrawerListAdapter extends ArrayAdapter<DrawerItem> { + + public DrawerListAdapter(Context context, ArrayList<DrawerItem> drawerItems) { + super(context, 0, drawerItems); + m_layoutInflater = + (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + m_resources = context.getResources(); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + DrawerItemHolder holder; + + if (convertView == null) { + holder = new DrawerItemHolder(); + + convertView = m_layoutInflater.inflate(R.layout.list_item_drawer_item, null); + convertView.setTag(holder); + + holder.m_icon = (ImageView) convertView.findViewById(R.id.drawer_item_icon); + holder.m_text = (TextView) convertView.findViewById(R.id.drawer_item_text); + } else { + holder = (DrawerItemHolder)convertView.getTag(); + } + + // Update items in holder + DrawerItem item = getItem(position); + if (item.getIconResId() != 0) { + holder.m_icon.setImageDrawable(m_resources.getDrawable(item.getIconResId())); + } + holder.m_text.setText(item.getItemName()); + + return convertView; + } + + private static class DrawerItemHolder { + private ImageView m_icon; + private TextView m_text; + } + + /** Layout inflater for use */ + private final LayoutInflater m_layoutInflater; + + /** Reference to get context's resources */ + private final Resources m_resources; + } + + ////////////////////////////////////////////////////////////////////////////// + + /** Callback that host activity must implement */ + public static interface DrawerCallbacks { + /** Callback to host activity when a drawer item is selected */ + void onDrawerItemSelected(int itemCode, int itemNameId); + } + + ////////////////////////////////////////////////////////////////////////////// + + /** SharedPreference: Display drawer when drawer loads for the very first time */ + private static final String PREF_DRAWER_SHOWN_TO_USER_FOR_THE_FIRST_TIME + = "DRAWER_PRESENTED_TO_USER_ON_FIRST_LOAD"; + + /** Bundle key used to (re)store position of selected drawer item */ + private static final String DRAWER_SELECTED_POSITION_BUNDLE_KEY + = "DRAWER_SELECTED_POSITION"; + + /** Bundle argument key for bundle parameters */ + private static final String BUNDLE_PARAMETERS = "net.named_data.nfd.drawer_fragment_parameters"; + + /** Callback to parent activity */ + private DrawerCallbacks m_callbacks; + + /** DrawerToggle for interacting with drawer and action bar app icon */ + private ActionBarDrawerToggle m_drawerToggle; + + /** Reference to DrawerLayout fragment in host activity */ + private DrawerLayout m_drawerLayout; + + /** Reference to drawer's ListView */ + private ListView m_drawerListView; + + /** Drawer's fragment container in the host activity */ + private View m_drawerFragmentViewContainer; + + /** Current position of the Drawer's selection */ + private int m_drawerSelectedPosition = 0; + + /** Flag that denotes if the fragment is restored from an instance state */ + private boolean m_restoredFromSavedInstanceState; + + /** Flag that denotes if the user has seen the Drawer when the app loads for the first time */ + private boolean m_hasUserSeenDrawer; + + /** ArrayList of DrawerItems to be displayed in the Drawer */ + private ArrayList<DrawerItem> m_drawerItems; + + /** Flag that marks if drawer is sliding outwards and being displayed */ + private boolean m_shouldHideOptionsMenu = false; +} diff --git a/iget_android/app/src/main/java/com/iget/ccnx/MainActivity.java b/iget_android/app/src/main/java/com/iget/ccnx/MainActivity.java new file mode 100644 index 00000000..b75785ab --- /dev/null +++ b/iget_android/app/src/main/java/com/iget/ccnx/MainActivity.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.iget.ccnx; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; +import android.view.Menu; +import android.view.MenuItem; + +import com.intel.jndn.management.types.FaceStatus; +import com.intel.jndn.management.types.RibEntry; + +import com.iget.ccnx.utils.G; + +import java.util.ArrayList; + +/** + * Main activity that is loaded for the NFD app. + */ +public class MainActivity extends ActionBarActivity +implements DrawerFragment.DrawerCallbacks +{ + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + FragmentManager fragmentManager = getSupportFragmentManager(); + + if (savedInstanceState != null) { + m_drawerFragment = (DrawerFragment)fragmentManager.findFragmentByTag(DrawerFragment.class.toString()); + } + + if (m_drawerFragment == null) { + ArrayList<DrawerFragment.DrawerItem> items = new ArrayList<DrawerFragment.DrawerItem>(); + + items.add(new DrawerFragment.DrawerItem(R.string.drawer_item_iget, 0, + DRAWER_ITEM_IGET)); + + m_drawerFragment = DrawerFragment.newInstance(items); + + fragmentManager + .beginTransaction() + .replace(R.id.navigation_drawer, m_drawerFragment, DrawerFragment.class.toString()) + .commit(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + G.Log("onCreateOptionsMenu" + String.valueOf(m_drawerFragment.shouldHideOptionsMenu())); + if (!m_drawerFragment.shouldHideOptionsMenu()) { + updateActionBar(); + return super.onCreateOptionsMenu(menu); + } + else + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return super.onOptionsItemSelected(item); + } + + ////////////////////////////////////////////////////////////////////////////// + + /** + * Convenience method that updates and display the current title in the Action Bar + */ + @SuppressWarnings("deprecation") + private void updateActionBar() { + ActionBar actionBar = getSupportActionBar(); + actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); + actionBar.setDisplayShowTitleEnabled(true); + if (m_actionBarTitleId != -1) { + actionBar.setTitle(m_actionBarTitleId); + } + } + + /** + * Convenience method that replaces the main fragment container with the + * new fragment and adding the current transaction to the backstack. + * + * @param fragment Fragment to be displayed in the main fragment container. + */ + private void replaceContentFragmentWithBackstack(Fragment fragment) { + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.beginTransaction() + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) + .replace(R.id.main_fragment_container, fragment) + .addToBackStack(null) + .commit(); + } + + ////////////////////////////////////////////////////////////////////////////// + + @Override + public void + onDrawerItemSelected(int itemCode, int itemNameId) { + + String fragmentTag = "net.named-data.nfd.content-" + String.valueOf(itemCode); + FragmentManager fragmentManager = getSupportFragmentManager(); + + // Create fragment according to user's selection + Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag); + if (fragment == null) { + switch (itemCode) { + case DRAWER_ITEM_IGET: + fragment = MainFragment.newInstance(); + break; + + default: + // Invalid; Nothing else needs to be done + return; + } + } + + // Update ActionBar title + m_actionBarTitleId = itemNameId; + + fragmentManager.beginTransaction() + .replace(R.id.main_fragment_container, fragment, fragmentTag) + .commit(); + } + + + + + + ////////////////////////////////////////////////////////////////////////////// + + /** Reference to drawer fragment */ + private DrawerFragment m_drawerFragment; + + /** Title that is to be displayed in the ActionBar */ + private int m_actionBarTitleId = -1; + + /** Item code for drawer items: For use in onDrawerItemSelected() callback */ + public static final int DRAWER_ITEM_IGET = 1; + public static final int DRAWER_ITEM_FACES = 2; + public static final int DRAWER_ITEM_ROUTES = 3; + public static final int DRAWER_ITEM_STRATEGIES = 4; + public static final int DRAWER_ITEM_LOGCAT = 5; +} diff --git a/iget_android/app/src/main/java/com/iget/ccnx/MainFragment.java b/iget_android/app/src/main/java/com/iget/ccnx/MainFragment.java new file mode 100644 index 00000000..7c2e243f --- /dev/null +++ b/iget_android/app/src/main/java/com/iget/ccnx/MainFragment.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.iget.ccnx; + +import android.annotation.SuppressLint; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import com.intel.jndn.management.types.ForwarderStatus; +import com.iget.ccnx.service.CCNxService; +import com.iget.ccnx.utils.G; + + +public class MainFragment extends Fragment { + + public static MainFragment newInstance() { + return new MainFragment(); + } + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) + { + @SuppressLint("InflateParams") + View v = inflater.inflate(R.layout.fragment_main, null); + m_downloadPathEditText = (EditText)v.findViewById(R.id.downloadPathEditText); + m_destinationPathEditText = (EditText)v.findViewById(R.id.destinationPathEditText); + m_startIGet = (Button)v.findViewById(R.id.start_iget); + m_startIGet.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View arg0) { + G.Log("start iget"); + m_downloadPathEditText.setEnabled(false); + m_destinationPathEditText.setEnabled(false); + String string = m_destinationPathEditText.getText().toString(); + G.Log("adsasd" + string); + CCNxService.startIGet(m_downloadPathEditText.getText().toString(), m_destinationPathEditText.getText().toString()); + m_downloadPathEditText.setEnabled(true); + m_destinationPathEditText.setEnabled(true); + + } + + }); + return v; + } + + private Button m_startIGet; + private EditText m_downloadPathEditText; + private EditText m_destinationPathEditText; + +} diff --git a/iget_android/app/src/main/java/com/iget/ccnx/service/CCNxService.java b/iget_android/app/src/main/java/com/iget/ccnx/service/CCNxService.java new file mode 100644 index 00000000..02c3990d --- /dev/null +++ b/iget_android/app/src/main/java/com/iget/ccnx/service/CCNxService.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.iget.ccnx.service; + +public class CCNxService { + /** + * Loading of IGet Native libraries. + */ + static { + + System.loadLibrary("crystax"); + System.loadLibrary("iget-wrapper"); + System.loadLibrary("consumer-producer"); + System.loadLibrary("gnustl_shared"); + System.loadLibrary("ccnx_api_portal"); + System.loadLibrary("ccnx_transport_rta"); + System.loadLibrary("ccnx_api_control"); + System.loadLibrary("ccnx_api_notify"); + System.loadLibrary("ccnx_common"); + System.loadLibrary("parc"); + System.loadLibrary("longbow"); + System.loadLibrary("longbow-textplain"); + System.loadLibrary("longbow-ansiterm"); + System.loadLibrary("ssl"); + System.loadLibrary("crypto"); + } + + + + public native static void + startIGet(String downloadPath, String destinationPath); + +} diff --git a/iget_android/app/src/main/java/com/iget/ccnx/utils/G.java b/iget_android/app/src/main/java/com/iget/ccnx/utils/G.java new file mode 100644 index 00000000..75d50c1a --- /dev/null +++ b/iget_android/app/src/main/java/com/iget/ccnx/utils/G.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.iget.ccnx.utils; + +import android.util.Log; + +/** + * Global convenience class used for NFD Service wide constants and logs. + * + * If log messages need to be written to persistent storage, this is the + * place to implement it. + * + */ +public class G { + + /** Flag that turns on/off debugging log output. */ + private static final boolean DEBUG = true; + + /** Tag used in log output to identify NFD Service. */ + private static final String TAG = "NFDService"; + + /** + * Designated log message method that provides flexibility in message logging. + * + * @param tag Tag to identify log message. + * @param format Format qualifiers as used in String.format() + * @param args Output log message. + */ + public static void Log(String tag, String format, Object ... args) { + if (DEBUG) { + Log.d(tag, String.format(format, args)); + } + } + + /** + * Convenience method to log a message with a specified tag. + * + * @param tag Tag to identify log message. + * @param message Output log message. + */ + public static void Log(String tag, String message) { + Log(tag, "%s", message); + } + + /** + * Convenience method to log messages with the default tag. + * + * @param message Output log message. + */ + public static void Log(String message) { + Log(TAG, message); + } + + /** + * Gets the tag in which logs are posted with. + * + * @return TAG that is used by this log class. + */ + public static String getLogTag() { + return TAG; + } +} diff --git a/iget_android/app/src/main/jni/Android.mk b/iget_android/app/src/main/jni/Android.mk new file mode 100644 index 00000000..9bf33d2c --- /dev/null +++ b/iget_android/app/src/main/jni/Android.mk @@ -0,0 +1,118 @@ +############################################################################## +# Copyright (c) 2017 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################## + +LOCAL_PATH := $(call my-dir) +LOCAL_PATH_SAVED := $(LOCAL_PATH) +ARMDIST_ROOT := $(DISTILLERY_ROOT_DIR)/usr + +include $(CLEAR_VARS) +LOCAL_MODULE := libboost_system +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libboost_system.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libevent +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libevent.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libcrypto +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libcrypto.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libssl +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libssl.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libcrystax +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libcrystax.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := liblongbow-ansiterm +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/liblongbow-ansiterm.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := liblongbow-textplain +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/liblongbow-textplain.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := liblongbow +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/liblongbow.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libparc +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libparc.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_common +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libccnx_common.so +include $(PREBUILT_SHARED_LIBRARY) + + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_api_notify +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libccnx_api_notify.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_api_control +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libccnx_api_control.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_transport_rta +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libccnx_transport_rta.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libccnx_api_portal +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libccnx_api_portal.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libicnet +LOCAL_SRC_FILES := $(ARMDIST_ROOT)/lib/libicnet.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := iget-wrapper +LOCAL_SRC_FILES := iget-wrapper.cpp +LOCAL_LDLIBS := -llog +LOCAL_CPPFLAGS := -I$(ARMDIST_ROOT)/include + +LOCAL_STATIC_LIBRARIES := \ + libicnet \ + libccnx_api_portal \ + libccnx_transport_rta \ + libccnx_api_control \ + libccnx_api_notify \ + libccnx_common \ + libparc \ + liblongbow \ + liblongbow-textplain \ + liblongbow-ansiterm \ + libevent \ + libboost_system \ + libcrystax \ + libcrypto \ + libssl +include $(BUILD_SHARED_LIBRARY) diff --git a/iget_android/app/src/main/jni/Application.mk b/iget_android/app/src/main/jni/Application.mk new file mode 100644 index 00000000..4e149e3e --- /dev/null +++ b/iget_android/app/src/main/jni/Application.mk @@ -0,0 +1,21 @@ +############################################################################## +# Copyright (c) 2017 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################## + +APP_ABI := armeabi-v7a + +APP_STL := gnustl_shared +APP_CPPFLAGS += -fexceptions -frtti -std=c++11 -Wno-deprecated-declarations +NDK_TOOLCHAIN_VERSION := 4.9 +APP_PLATFORM := android-21 diff --git a/iget_android/app/src/main/jni/iget-wrapper.cpp b/iget_android/app/src/main/jni/iget-wrapper.cpp new file mode 100644 index 00000000..57849378 --- /dev/null +++ b/iget_android/app/src/main/jni/iget-wrapper.cpp @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "iget-wrapper.hpp" + +#include <stdlib.h> +#include <boost/property_tree/info_parser.hpp> +#include <boost/thread.hpp> +#include <mutex> +#include <icnet/icnet_socket_consumer.h> +#include <boost/date_time/posix_time/posix_time.hpp> +#include <android/log.h> + +typedef boost::posix_time::ptime Time; +typedef boost::posix_time::time_duration TimeDuration; + +Time t1(boost::posix_time::microsec_clock::local_time()); + +class CallbackContainer +{ + public: + CallbackContainer(): + work(new boost::asio::io_service::work(m_ioService)), + m_handler(std::async(std::launch::async, [this]() { m_ioService.run(); })) + { + m_seenManifestSegments = 0; + m_seenDataSegments = 0; + m_byteCounter = 0; + } + + ~CallbackContainer() + { + work.reset(); + } + + void processPayload(icnet::ConsumerSocket &c, const uint8_t *buffer, size_t bufferSize) + { + icnet::Name m_name; + c.getSocketOption(icnet::GeneralTransportOptions::NAME_PREFIX, m_name); + std::string filename = destinationPathString + "/" + m_name.toString().substr(1 + m_name.toString().find_last_of("/")); + + m_ioService.dispatch([buffer, bufferSize, filename]() { + Time t3(boost::posix_time::microsec_clock::local_time()); + std::ofstream file(filename.c_str(), std::ofstream::binary); + file.write((char *) buffer, bufferSize); + file.close(); + Time t2(boost::posix_time::microsec_clock::local_time()); + TimeDuration dt = t2 - t1; + TimeDuration dt3 = t3 - t1; + long msec = dt.total_milliseconds(); + long msec3 = dt3.total_milliseconds(); + __android_log_print(ANDROID_LOG_INFO, "ProcessPayLoad", "Elapsed Time: %.2f seconds -- %.2f [Mbps] -- %.2f", msec/1000.0, bufferSize*8/msec/1000.0, bufferSize*8/msec3/1000.0); + }); + } + + bool verifyData(icnet::ConsumerSocket &c, const icnet::ContentObject &content_object) + { + if (content_object.getContentType() == icnet::PayloadType::DATA) { + __android_log_print(ANDROID_LOG_INFO, "VerifyData", "VERIFY CONTENT"); + } else if (content_object.getContentType() == icnet::PayloadType::MANIFEST) { + __android_log_print(ANDROID_LOG_INFO, "VerifyData", "VERIFY MANIFEST"); + } + return true; + } + + void processLeavingInterest(icnet::ConsumerSocket &c, const icnet::Interest &interest) + { + //std::cout << "LEAVES " << interest.getName().toUri() << std::endl; + } + + void setDestinationPathString(std::string destinationPathString) + { + + this->destinationPathString = destinationPathString; + __android_log_print(ANDROID_LOG_ERROR, "setDestinationPathString", "xxx destinationPathString %s", this->destinationPathString.c_str()); + } + + private: + std::string destinationPathString; + int m_seenManifestSegments; + int m_seenDataSegments; + int m_byteCounter; + boost::asio::io_service m_ioService; + std::shared_ptr<boost::asio::io_service::work> work; + std::future<void> m_handler; +}; + + +JNIEXPORT void JNICALL +Java_com_cisco_ccnx_service_CCNxService_startIGet(JNIEnv *env, jobject obj, jstring downloadPath, jstring destinationPath) +{ + jboolean isCopy; + const char *downloadPathChar = env->GetStringUTFChars(downloadPath, &isCopy); + jboolean isCopyDestinatioPathChar; + const char *destinationPathChar = env->GetStringUTFChars(destinationPath, &isCopyDestinatioPathChar); + std::string destinationPathString(destinationPathChar, strlen(destinationPathChar)); + std::string url(downloadPathChar, strlen(downloadPathChar)); + std::string locator = ""; + std::string path = ""; + std::string name = ""; + size_t found = 0; + size_t pathBegin = 0; + found = url.find("//"); + pathBegin = url.find('/', found+2); + locator = url.substr(found+2, pathBegin - (found+2)); + path = url.substr(pathBegin, std::string::npos); + name = "ccnx:/" + locator + "/get" + path; + icnet::ConsumerSocket c(icnet::Name(name.c_str()), icnet::TransportProtocolAlgorithms::RAAQM); + CallbackContainer stubs; + stubs.setDestinationPathString(destinationPathString); + c.setSocketOption(icnet::ConsumerCallbacksOptions::CONTENT_RETRIEVED, + (icnet::ConsumerContentCallback) std::bind(&CallbackContainer::processPayload, + &stubs, + std::placeholders::_1, + std::placeholders::_2, + std::placeholders::_3)); + c.setSocketOption(icnet::ConsumerCallbacksOptions::INTEREST_OUTPUT, + (icnet::ConsumerInterestCallback) std::bind(&CallbackContainer::processLeavingInterest, + &stubs, + std::placeholders::_1, + std::placeholders::_2)); + c.consume(icnet::Name()); + c.stop(); +} + diff --git a/iget_android/app/src/main/jni/iget-wrapper.hpp b/iget_android/app/src/main/jni/iget-wrapper.hpp new file mode 100644 index 00000000..2df25453 --- /dev/null +++ b/iget_android/app/src/main/jni/iget-wrapper.hpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <jni.h> + + +#ifndef _Included_com_cisco_ccnx_service_CCNxService +#define _Included_com_cisco_ccnx_service_CCNxService +#ifdef __cplusplus +extern "C" { +#endif + +JNIEXPORT void JNICALL +Java_com_cisco_ccnx_service_CCNxService_startNfd(JNIEnv*, jclass, jobject); + +JNIEXPORT void JNICALL +Java_com_cisco_ccnx_service_CCNxService_stopNfd(JNIEnv*, jclass); + +JNIEXPORT void JNICALL +Java_com_cisco_ccnx_service_CCNxService_startIGet(JNIEnv *env, jobject obj, jstring downloadPath, jstring destinationPath); + +JNIEXPORT jobject JNICALL +Java_com_cisco_ccnx_service_CCNxService_getNfdLogModules(JNIEnv*, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/iget_android/app/src/main/play/contactEmail b/iget_android/app/src/main/play/contactEmail new file mode 100644 index 00000000..e406e999 --- /dev/null +++ b/iget_android/app/src/main/play/contactEmail @@ -0,0 +1 @@ +info@named-data.net
\ No newline at end of file diff --git a/iget_android/app/src/main/play/contactPhone b/iget_android/app/src/main/play/contactPhone new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/iget_android/app/src/main/play/contactPhone diff --git a/iget_android/app/src/main/play/contactWebsite b/iget_android/app/src/main/play/contactWebsite new file mode 100644 index 00000000..b2845c59 --- /dev/null +++ b/iget_android/app/src/main/play/contactWebsite @@ -0,0 +1 @@ +http://named-data.net
\ No newline at end of file diff --git a/iget_android/app/src/main/play/defaultLanguage b/iget_android/app/src/main/play/defaultLanguage new file mode 100644 index 00000000..f2b0341f --- /dev/null +++ b/iget_android/app/src/main/play/defaultLanguage @@ -0,0 +1 @@ +en-US
\ No newline at end of file diff --git a/iget_android/app/src/main/play/en-US/listing/fulldescription b/iget_android/app/src/main/play/en-US/listing/fulldescription new file mode 100644 index 00000000..37cd1bf5 --- /dev/null +++ b/iget_android/app/src/main/play/en-US/listing/fulldescription @@ -0,0 +1,3 @@ +NFD is an open and free software package licensed under GPL 3.0 license and is the centerpiece of our commitment to making NDN's core technology open and free to all Internet users and developers. The main design goal of NFD is to support diverse experimentation of NDN technology. The design emphasizes modularity and extensibility to allow easy experiments with new protocol features, algorithms, new applications. We have not fully optimized the code for performance. The intention is that performance optimizations are one type of experiments that developers can conduct by trying out different data structures and different algorithms; over time, better implementations may emerge within the same design framework. + +NFD is developed by a community effort. Although the first release was mostly done by the members of NSF-sponsored NDN project team, it already contains significant contributions from people outside the project team. We strongly encourage participation from all interested parties, since broader community support is key for NDN to succeed as a new Internet architecture.
\ No newline at end of file diff --git a/iget_android/app/src/main/play/en-US/listing/shortdescription b/iget_android/app/src/main/play/en-US/listing/shortdescription new file mode 100644 index 00000000..85312434 --- /dev/null +++ b/iget_android/app/src/main/play/en-US/listing/shortdescription @@ -0,0 +1 @@ +Network forwarder for the Named Data Networking (NDN) protocol
\ No newline at end of file diff --git a/iget_android/app/src/main/play/en-US/listing/title b/iget_android/app/src/main/play/en-US/listing/title new file mode 100644 index 00000000..546e5219 --- /dev/null +++ b/iget_android/app/src/main/play/en-US/listing/title @@ -0,0 +1 @@ +NDN Forwarding Daemon (NFD)
\ No newline at end of file diff --git a/iget_android/app/src/main/play/en-US/listing/video b/iget_android/app/src/main/play/en-US/listing/video new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/iget_android/app/src/main/play/en-US/listing/video diff --git a/iget_android/app/src/main/res/drawable-hdpi/ic_action_discard.png b/iget_android/app/src/main/res/drawable-hdpi/ic_action_discard.png Binary files differnew file mode 100644 index 00000000..703b31f8 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-hdpi/ic_action_discard.png diff --git a/iget_android/app/src/main/res/drawable-hdpi/ic_action_edit.png b/iget_android/app/src/main/res/drawable-hdpi/ic_action_edit.png Binary files differnew file mode 100644 index 00000000..756db316 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-hdpi/ic_action_edit.png diff --git a/iget_android/app/src/main/res/drawable-hdpi/ic_action_new.png b/iget_android/app/src/main/res/drawable-hdpi/ic_action_new.png Binary files differnew file mode 100644 index 00000000..d866d616 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-hdpi/ic_action_new.png diff --git a/iget_android/app/src/main/res/drawable-hdpi/ic_action_refresh.png b/iget_android/app/src/main/res/drawable-hdpi/ic_action_refresh.png Binary files differnew file mode 100644 index 00000000..dae27903 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-hdpi/ic_action_refresh.png diff --git a/iget_android/app/src/main/res/drawable-hdpi/ic_action_settings.png b/iget_android/app/src/main/res/drawable-hdpi/ic_action_settings.png Binary files differnew file mode 100644 index 00000000..54eecded --- /dev/null +++ b/iget_android/app/src/main/res/drawable-hdpi/ic_action_settings.png diff --git a/iget_android/app/src/main/res/drawable-hdpi/ic_launcher.png b/iget_android/app/src/main/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..96a442e5 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/iget_android/app/src/main/res/drawable-hdpi/iget_app.png b/iget_android/app/src/main/res/drawable-hdpi/iget_app.png Binary files differnew file mode 100644 index 00000000..3c10dac2 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-hdpi/iget_app.png diff --git a/iget_android/app/src/main/res/drawable-mdpi/ic_action_discard.png b/iget_android/app/src/main/res/drawable-mdpi/ic_action_discard.png Binary files differnew file mode 100644 index 00000000..248fb09c --- /dev/null +++ b/iget_android/app/src/main/res/drawable-mdpi/ic_action_discard.png diff --git a/iget_android/app/src/main/res/drawable-mdpi/ic_action_edit.png b/iget_android/app/src/main/res/drawable-mdpi/ic_action_edit.png Binary files differnew file mode 100644 index 00000000..68a45320 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-mdpi/ic_action_edit.png diff --git a/iget_android/app/src/main/res/drawable-mdpi/ic_action_new.png b/iget_android/app/src/main/res/drawable-mdpi/ic_action_new.png Binary files differnew file mode 100644 index 00000000..f17e7980 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-mdpi/ic_action_new.png diff --git a/iget_android/app/src/main/res/drawable-mdpi/ic_action_refresh.png b/iget_android/app/src/main/res/drawable-mdpi/ic_action_refresh.png Binary files differnew file mode 100644 index 00000000..94ab6f4c --- /dev/null +++ b/iget_android/app/src/main/res/drawable-mdpi/ic_action_refresh.png diff --git a/iget_android/app/src/main/res/drawable-mdpi/ic_action_settings.png b/iget_android/app/src/main/res/drawable-mdpi/ic_action_settings.png Binary files differnew file mode 100644 index 00000000..25c36db4 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-mdpi/ic_action_settings.png diff --git a/iget_android/app/src/main/res/drawable-mdpi/ic_launcher.png b/iget_android/app/src/main/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..359047df --- /dev/null +++ b/iget_android/app/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/iget_android/app/src/main/res/drawable-mdpi/iget_app.png b/iget_android/app/src/main/res/drawable-mdpi/iget_app.png Binary files differnew file mode 100644 index 00000000..3c10dac2 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-mdpi/iget_app.png diff --git a/iget_android/app/src/main/res/drawable-xhdpi/ic_action_discard.png b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_discard.png Binary files differnew file mode 100644 index 00000000..9eeeed12 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_discard.png diff --git a/iget_android/app/src/main/res/drawable-xhdpi/ic_action_edit.png b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_edit.png Binary files differnew file mode 100644 index 00000000..67e056fe --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_edit.png diff --git a/iget_android/app/src/main/res/drawable-xhdpi/ic_action_new.png b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_new.png Binary files differnew file mode 100644 index 00000000..dde2141f --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_new.png diff --git a/iget_android/app/src/main/res/drawable-xhdpi/ic_action_refresh.png b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_refresh.png Binary files differnew file mode 100644 index 00000000..ab4ab9da --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_refresh.png diff --git a/iget_android/app/src/main/res/drawable-xhdpi/ic_action_settings.png b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_settings.png Binary files differnew file mode 100644 index 00000000..425a8bc8 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xhdpi/ic_action_settings.png diff --git a/iget_android/app/src/main/res/drawable-xhdpi/ic_launcher.png b/iget_android/app/src/main/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..71c6d760 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xhdpi/ic_launcher.png diff --git a/iget_android/app/src/main/res/drawable-xhdpi/iget_app.png b/iget_android/app/src/main/res/drawable-xhdpi/iget_app.png Binary files differnew file mode 100644 index 00000000..3c10dac2 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xhdpi/iget_app.png diff --git a/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_discard.png b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_discard.png Binary files differnew file mode 100644 index 00000000..cb1260a4 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_discard.png diff --git a/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_edit.png b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_edit.png Binary files differnew file mode 100644 index 00000000..3a241ea4 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_edit.png diff --git a/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_new.png b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_new.png Binary files differnew file mode 100644 index 00000000..c42c2bfb --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_new.png diff --git a/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png Binary files differnew file mode 100644 index 00000000..44ee117e --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png diff --git a/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_settings.png b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_settings.png Binary files differnew file mode 100644 index 00000000..fe5fec47 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxhdpi/ic_action_settings.png diff --git a/iget_android/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/iget_android/app/src/main/res/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..4df18946 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/iget_android/app/src/main/res/drawable-xxhdpi/iget_app.png b/iget_android/app/src/main/res/drawable-xxhdpi/iget_app.png Binary files differnew file mode 100644 index 00000000..3c10dac2 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxhdpi/iget_app.png diff --git a/iget_android/app/src/main/res/drawable-xxxhdpi/iget_app.png b/iget_android/app/src/main/res/drawable-xxxhdpi/iget_app.png Binary files differnew file mode 100644 index 00000000..3c10dac2 --- /dev/null +++ b/iget_android/app/src/main/res/drawable-xxxhdpi/iget_app.png diff --git a/iget_android/app/src/main/res/drawable/custom_white_button.xml b/iget_android/app/src/main/res/drawable/custom_white_button.xml new file mode 100644 index 00000000..8edfc549 --- /dev/null +++ b/iget_android/app/src/main/res/drawable/custom_white_button.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_pressed="true" + android:drawable="@android:color/darker_gray" + /> + <item + android:state_pressed="false" + android:drawable="@android:color/transparent" + /> +</selector>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/drawable/drawer_item_background_activated.xml b/iget_android/app/src/main/res/drawable/drawer_item_background_activated.xml new file mode 100644 index 00000000..1b497c09 --- /dev/null +++ b/iget_android/app/src/main/res/drawable/drawer_item_background_activated.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_activated="true" + android:drawable="@color/ndn_color_fire_bush" + /> +</selector>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/drawable/face_list_item_background_activated.xml b/iget_android/app/src/main/res/drawable/face_list_item_background_activated.xml new file mode 100644 index 00000000..f6a9b13b --- /dev/null +++ b/iget_android/app/src/main/res/drawable/face_list_item_background_activated.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_activated="true" + android:drawable="@android:color/darker_gray" + /> +</selector>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/drawable/list_item_background_activated.xml b/iget_android/app/src/main/res/drawable/list_item_background_activated.xml new file mode 100644 index 00000000..f6a9b13b --- /dev/null +++ b/iget_android/app/src/main/res/drawable/list_item_background_activated.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_activated="true" + android:drawable="@android:color/darker_gray" + /> +</selector>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/drawable/list_item_divider.xml b/iget_android/app/src/main/res/drawable/list_item_divider.xml new file mode 100644 index 00000000..f41aabe5 --- /dev/null +++ b/iget_android/app/src/main/res/drawable/list_item_divider.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:insetLeft="@dimen/default_padding_left" + android:insetRight="@dimen/default_padding_right" > + + <shape> + <solid android:color="@color/android_color_gray" /> + <size android:height="1dp" /> + </shape> + +</inset>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/activity_fragment.xml b/iget_android/app/src/main/res/layout/activity_fragment.xml new file mode 100644 index 00000000..98ee139c --- /dev/null +++ b/iget_android/app/src/main/res/layout/activity_fragment.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/fragment_container" + android:layout_height="match_parent" + android:layout_width="match_parent" + > + +</FrameLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/activity_main.xml b/iget_android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..6d8b08a0 --- /dev/null +++ b/iget_android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v4.widget.DrawerLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/drawer_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".MainActivity"> + + <!-- Main container for fragments to be presented in --> + <FrameLayout + android:id="@+id/main_fragment_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + /> + + <!-- DrawerFragment for user navigation --> + <FrameLayout + android:id="@+id/navigation_drawer" + android:layout_width="@dimen/drawer_width" + android:layout_height="match_parent" + android:layout_gravity="start" + tools:layout="@layout/activity_main_drawer_listview" + /> + +</android.support.v4.widget.DrawerLayout> diff --git a/iget_android/app/src/main/res/layout/activity_main_drawer_listview.xml b/iget_android/app/src/main/res/layout/activity_main_drawer_listview.xml new file mode 100644 index 00000000..7ca37002 --- /dev/null +++ b/iget_android/app/src/main/res/layout/activity_main_drawer_listview.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<ListView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:choiceMode="singleChoice" + android:divider="@android:color/transparent" + android:dividerHeight="0dp" + android:background="#cccc" + tools:context=".DrawerFragment" +/> diff --git a/iget_android/app/src/main/res/layout/dialog_create_face.xml b/iget_android/app/src/main/res/layout/dialog_create_face.xml new file mode 100644 index 00000000..02d40a62 --- /dev/null +++ b/iget_android/app/src/main/res/layout/dialog_create_face.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/default_dialog_margin" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="Enter FaceUri for the remote NDN daemon" + android:layout_gravity="center_horizontal"/> + + <EditText + android:id="@+id/faceUri" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_dialog_margin" + android:hint="Face URI" + android:inputType="text" + android:focusable="true" + android:focusableInTouchMode="true" + android:selectAllOnFocus="true"> + <requestFocus /> + </EditText> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/dialog_create_route.xml b/iget_android/app/src/main/res/layout/dialog_create_route.xml new file mode 100644 index 00000000..67c7677e --- /dev/null +++ b/iget_android/app/src/main/res/layout/dialog_create_route.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/default_dialog_margin" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="Enter prefix and FaceUri to register with NDN daemon" + android:layout_gravity="center_horizontal"/> + + <EditText + android:id="@+id/prefix" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_dialog_margin" + android:hint="Prefix" + android:inputType="text" + android:focusable="true" + android:focusableInTouchMode="true" + android:selectAllOnFocus="true"> + <requestFocus /> + </EditText> + + <EditText + android:id="@+id/faceUri" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_dialog_margin" + android:hint="Face URI" + android:inputType="text" + android:focusable="true" + android:focusableInTouchMode="true" + android:selectAllOnFocus="true"> + </EditText> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/fragment_face_detail_list_header.xml b/iget_android/app/src/main/res/layout/fragment_face_detail_list_header.xml new file mode 100644 index 00000000..227891f7 --- /dev/null +++ b/iget_android/app/src/main/res/layout/fragment_face_detail_list_header.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_linear_layout_padding" + > + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/fragment_face_details_title" + style="?android:listSeparatorTextViewStyle" + /> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/fragment_face_list_list_header.xml b/iget_android/app/src/main/res/layout/fragment_face_list_list_header.xml new file mode 100644 index 00000000..d44726c8 --- /dev/null +++ b/iget_android/app/src/main/res/layout/fragment_face_list_list_header.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_linear_layout_padding" + > + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/face_list_list_of_faces_title" + style="?android:listSeparatorTextViewStyle" + /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + > + + <ProgressBar + android:id="@+id/face_list_reloading_list_progress_bar" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:visibility="gone" + /> + + <LinearLayout + android:id="@+id/face_list_info_unavailable" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:visibility="gone" + > + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/oops" + /> + + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/error_cannot_communicate_with_nfd" + /> + + </LinearLayout> + + </FrameLayout> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/fragment_logcat_output.xml b/iget_android/app/src/main/res/layout/fragment_logcat_output.xml new file mode 100644 index 00000000..93f58f0e --- /dev/null +++ b/iget_android/app/src/main/res/layout/fragment_logcat_output.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ListView + android:id="@+id/log_output" + android:layout_weight="1" + android:layout_width="match_parent" + android:layout_height="0dp"> + </ListView> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/fragment_logcat_tags_list_header.xml b/iget_android/app/src/main/res/layout/fragment_logcat_tags_list_header.xml new file mode 100644 index 00000000..9e81844e --- /dev/null +++ b/iget_android/app/src/main/res/layout/fragment_logcat_tags_list_header.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_linear_layout_padding" + > + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/fragment_logcat_tags_n_log_levels" + style="?android:listSeparatorTextViewStyle" + /> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/fragment_main.xml b/iget_android/app/src/main/res/layout/fragment_main.xml new file mode 100644 index 00000000..76f3a6c8 --- /dev/null +++ b/iget_android/app/src/main/res/layout/fragment_main.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <LinearLayout + style="@style/default_linear_layout_padding" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + > + + <TextView + style="?android:listSeparatorTextViewStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/pref_category_title_general" + /> + + <TextView + android:text="Download Path" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/downloadPathTextView" /> + + <EditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="textPersonName" + android:text="http://webserver/sintel/mpd" + android:ems="10" + android:id="@+id/downloadPathEditText" /> + + <TextView + android:text="Destination Path" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/destinationPathTextView" /> + + <EditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="textPersonName" + android:text="/sdcard/IGet" + android:ems="10" + android:id="@+id/destinationPathEditText" /> + + + + <Button + android:id="@+id/start_iget" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Start IGet" /> + </LinearLayout> +</ScrollView> diff --git a/iget_android/app/src/main/res/layout/fragment_route_detail_list_header.xml b/iget_android/app/src/main/res/layout/fragment_route_detail_list_header.xml new file mode 100644 index 00000000..2244c1ab --- /dev/null +++ b/iget_android/app/src/main/res/layout/fragment_route_detail_list_header.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_linear_layout_padding" + > + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/fragment_route_route_name_title" + style="?android:listSeparatorTextViewStyle" + /> + + <TextView + android:id="@+id/route_detail_prefix" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="" + style="@style/default_custom_white_button" + /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/fragment_route_details_next_hops" + style="?android:listSeparatorTextViewStyle" + /> + + <ProgressBar + android:id="@+id/route_detail_list_reloading_list_progress_bar" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:visibility="gone" /> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/fragment_route_list_list_header.xml b/iget_android/app/src/main/res/layout/fragment_route_list_list_header.xml new file mode 100644 index 00000000..361cfa29 --- /dev/null +++ b/iget_android/app/src/main/res/layout/fragment_route_list_list_header.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_linear_layout_padding" + > + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/route_list_list_of_routes_title" + style="?android:listSeparatorTextViewStyle" + /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + > + + <ProgressBar + android:id="@+id/route_list_reloading_list_progress_bar" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:visibility="gone" + /> + + <LinearLayout + android:id="@+id/route_list_info_unavailable" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:visibility="gone" + > + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/oops" + /> + + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/error_cannot_communicate_with_nfd" + /> + + </LinearLayout> + + </FrameLayout> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/list_item_drawer_item.xml b/iget_android/app/src/main/res/layout/list_item_drawer_item.xml new file mode 100644 index 00000000..08a598b1 --- /dev/null +++ b/iget_android/app/src/main/res/layout/list_item_drawer_item.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/drawer_item_background_activated" + android:paddingLeft="@dimen/default_padding_left" + android:paddingRight="@dimen/default_padding_right" + > + + <ImageView + android:id="@+id/drawer_item_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + /> + + <TextView + android:id="@+id/drawer_item_text" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAppearance="?android:attr/textAppearanceListItemSmall" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:gravity="center_vertical" + /> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/list_item_face_generic_item.xml b/iget_android/app/src/main/res/layout/list_item_face_generic_item.xml new file mode 100644 index 00000000..c4d07374 --- /dev/null +++ b/iget_android/app/src/main/res/layout/list_item_face_generic_item.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/default_linear_layout_padding" + > + + <TextView + android:id="@+id/list_item_generic_title" + android:text="Title" + style="@style/two_column_item_title" + /> + + <TextView + android:id="@+id/list_item_generic_value" + android:text="Value" + style="@style/two_column_item_secondary" + /> + +</LinearLayout> diff --git a/iget_android/app/src/main/res/layout/list_item_face_status_item.xml b/iget_android/app/src/main/res/layout/list_item_face_status_item.xml new file mode 100644 index 00000000..f6c6440b --- /dev/null +++ b/iget_android/app/src/main/res/layout/list_item_face_status_item.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/list_item_background_activated" + style="@style/default_linear_layout_padding" + > + + <TextView + android:id="@+id/list_item_face_uri" + android:text="FaceUri" + style="@style/two_row_item_title" + /> + + <TextView + android:id="@+id/list_item_face_id" + android:text="FaceId" + style="@style/two_row_item_secondary" + /> + +</LinearLayout> diff --git a/iget_android/app/src/main/res/layout/list_item_log.xml b/iget_android/app/src/main/res/layout/list_item_log.xml new file mode 100644 index 00000000..6b0b6e17 --- /dev/null +++ b/iget_android/app/src/main/res/layout/list_item_log.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <TextView + android:id="@+id/log_line" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/list_item_route_info_item.xml b/iget_android/app/src/main/res/layout/list_item_route_info_item.xml new file mode 100644 index 00000000..80185a43 --- /dev/null +++ b/iget_android/app/src/main/res/layout/list_item_route_info_item.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/list_item_background_activated" + style="@style/default_linear_layout_padding" + > + + <TextView + android:id="@+id/list_item_route_info_title" + android:text="Title" + style="@style/two_row_item_title" + /> + + <TextView + android:id="@+id/list_item_route_info_value" + android:text="Value" + style="@style/two_row_item_secondary" + /> + +</LinearLayout> diff --git a/iget_android/app/src/main/res/layout/list_item_route_item.xml b/iget_android/app/src/main/res/layout/list_item_route_item.xml new file mode 100644 index 00000000..af14e248 --- /dev/null +++ b/iget_android/app/src/main/res/layout/list_item_route_item.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/list_item_background_activated" + style="@style/default_linear_layout_padding" + > + + <TextView + android:id="@+id/list_item_route_uri" + android:text="Route" + style="@style/two_row_item_title" + /> + + <TextView + android:id="@+id/list_item_face_list" + android:text="Faces" + style="@style/two_row_item_secondary" + /> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/layout/list_item_setting_item.xml b/iget_android/app/src/main/res/layout/list_item_setting_item.xml new file mode 100644 index 00000000..2945775d --- /dev/null +++ b/iget_android/app/src/main/res/layout/list_item_setting_item.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/list_item_background_activated" + style="@style/default_linear_layout_padding" + > + + <TextView + android:id="@+id/list_item_log_tag" + style="@style/two_row_item_title" + /> + + <TextView + android:id="@+id/list_item_setting_log_level" + style="@style/two_row_item_secondary" + /> + +</LinearLayout>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/menu/menu_face_list.xml b/iget_android/app/src/main/res/menu/menu_face_list.xml new file mode 100644 index 00000000..963dee05 --- /dev/null +++ b/iget_android/app/src/main/res/menu/menu_face_list.xml @@ -0,0 +1,20 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/face_list_refresh" + android:icon="@drawable/ic_action_refresh" + android:title="@string/face_list_refresh_face_list" + android:orderInCategory="100" + app:showAsAction="always" + /> + + <item + android:id="@+id/face_list_add" + android:icon="@drawable/ic_action_new" + android:title="@string/face_list_add_face" + android:orderInCategory="100" + app:showAsAction="always" + /> + +</menu> diff --git a/iget_android/app/src/main/res/menu/menu_face_list_multiple_modal_menu.xml b/iget_android/app/src/main/res/menu/menu_face_list_multiple_modal_menu.xml new file mode 100644 index 00000000..a6b91be1 --- /dev/null +++ b/iget_android/app/src/main/res/menu/menu_face_list_multiple_modal_menu.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/menu_item_delete_face_item" + android:icon="@drawable/ic_action_discard" + android:title="@string/menu_item_delete_face_item" + app:showAsAction="always" + /> + +</menu>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/menu/menu_log.xml b/iget_android/app/src/main/res/menu/menu_log.xml new file mode 100644 index 00000000..2f7c0a38 --- /dev/null +++ b/iget_android/app/src/main/res/menu/menu_log.xml @@ -0,0 +1,12 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/action_log_settings" + android:icon="@drawable/ic_action_settings" + android:title="@string/log_settings" + android:orderInCategory="100" + app:showAsAction="always" + /> + +</menu> diff --git a/iget_android/app/src/main/res/menu/menu_logcat_settings.xml b/iget_android/app/src/main/res/menu/menu_logcat_settings.xml new file mode 100644 index 00000000..86679ea2 --- /dev/null +++ b/iget_android/app/src/main/res/menu/menu_logcat_settings.xml @@ -0,0 +1,12 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/action_log_settings" + android:icon="@drawable/ic_action_edit" + android:title="@string/logcat_reset_log_level_defaults" + android:orderInCategory="100" + app:showAsAction="always" + /> + +</menu> diff --git a/iget_android/app/src/main/res/menu/menu_logcat_settings_multiple_modal_menu.xml b/iget_android/app/src/main/res/menu/menu_logcat_settings_multiple_modal_menu.xml new file mode 100644 index 00000000..11aa3d1c --- /dev/null +++ b/iget_android/app/src/main/res/menu/menu_logcat_settings_multiple_modal_menu.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/menu_item_delete_setting_item" + android:icon="@drawable/ic_action_discard" + android:title="@string/menu_item_delete_setting_item" + app:showAsAction="always" + /> + +</menu>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/menu/menu_route_list.xml b/iget_android/app/src/main/res/menu/menu_route_list.xml new file mode 100644 index 00000000..4ab170a0 --- /dev/null +++ b/iget_android/app/src/main/res/menu/menu_route_list.xml @@ -0,0 +1,20 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/route_list_refresh" + android:icon="@drawable/ic_action_refresh" + android:title="@string/route_list_refresh_route_list" + android:orderInCategory="100" + app:showAsAction="always" + /> + + <item + android:id="@+id/route_list_add" + android:icon="@drawable/ic_action_new" + android:title="@string/route_list_add_route" + android:orderInCategory="100" + app:showAsAction="always" + /> + +</menu> diff --git a/iget_android/app/src/main/res/ndn_app.ai b/iget_android/app/src/main/res/ndn_app.ai new file mode 100644 index 00000000..13b3f766 --- /dev/null +++ b/iget_android/app/src/main/res/ndn_app.ai @@ -0,0 +1,3388 @@ +%PDF-1.5
%âãÏÓ
+1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[6 0 R 34 0 R 61 0 R]/Order 62 0 R/RBGroups[]>>/OCGs[6 0 R 34 0 R 61 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 12543/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>application/pdf</dc:format> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">ndn-app</rdf:li> + </rdf:Alt> + </dc:title> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xmp:MetadataDate>2015-09-04T15:31:53-07:00</xmp:MetadataDate> + <xmp:ModifyDate>2015-09-04T15:31:53-07:00</xmp:ModifyDate> + <xmp:CreateDate>2015-09-04T15:25:58-07:00</xmp:CreateDate> + <xmp:CreatorTool>Adobe Illustrator CS5</xmp:CreatorTool> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:width>200</xmpGImg:width> + <xmpGImg:height>256</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADIAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXmP5tedtb0i/tdK0yY2vqQC4mnUDmeTsiqCa8acD0zU9o6m
cJCMTWzvuyNDjyRM5i96eef4/wDOf/V3uP8Agv7M1v5vL/OLuf5PwfzA7/H/AJz/AOrvcf8ABf2Y
/m8v84r/ACfg/mBcn5g+dEYMNXnqDUVII+kEEHEavL/OKns/B/MD3DyLr1zrvli01G6ULcvzSbiK
KWjYryA7VpXN/pMxyYxI83lNfpxiymI5J/mS4bsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVeT/AJp+V9V1vzJJNp6rJ+j9MilljJPNgZptowAan4SaZp9fglPJY6R/SXouytVDFiqX
8Uz9wYBYeVNTvU0p4WiC6xNJBbFmI4tEQGMlFNB8W1K5rYYJS4a/iNO4yauEeK79ABPxXXXlW4is
Lu9tr22v4rB1S9W3MweLkeIZlmjiqvLaq1wywEAkEGufP9ICIasGQiQY8XK63+RKIufIOvW2t2Oj
zCJZ9RUPbTcm9E1WpBbjWq9DtkpaWYmIn+JhHX45Y5TF1Hn3vXPykUr5JtVOxEs4I9xIc3PZ390P
eXnO1/78+4fczHM51jsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVea/mP5jTRtU
vxHM0Ooz2Fg1iVBNWhvZXapGw+Hx65qtbm4JHvMY1/pnedm6bxYRsXESlfxiEgl85+WJb7yxdxVt
BbXU91qkIRykMk3HlwoDVWYFgFrmMdRjJgRtRJLmDRZRHIDvcQI+dJN+kdG0zTNeEN/Hf3esUigi
gjmVY4/U9RnkaaOLemwC1yjijGMqNmXv/TTleHOc4XHhEO+u7yJZHafmHoLea5GvnaTRkMNzYXPB
ucFxHbrG4C05cHoVIp1398yo6uHib/TsR5GnCn2dk8H0/XuCO8Xf2Mv/ACnYP5Mt2HRppyPplbM3
s7+6+Jdb2sP359w+5mGZzrHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8X/PC0
uF8wWN2UP1eS0ESydi6SOzL9zjNF2pE8YPSnqOwpjw5R68X6A83zWO7dirsVfQf5V2lxbeSbFZ4z
G0hkkVWFDweQlTT3G4zo+z4kYhbxvasxLOa8mW5muudirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVdiqlc2lrdRGG6hjniJqY5VDrUezAjIyiJCiLZRmYmwaKD/wANeXf+rVZ/9I8X/NOQ
8DH/ADR8m38zl/nS+Zd/hry7/wBWqz/6R4v+acfAx/zR8l/M5f50vmW18ueXlYMul2gYGoIgiBBH
+xx8DH/NHyR+ZyfzpfMph02GWtLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//Z</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"> + <xmpMM:InstanceID>uuid:7dd58ab6-2f09-dc4f-a887-757849551d63</xmpMM:InstanceID> + <xmpMM:DocumentID>xmp.did:F97F1174072068118C14DCF4BE391C3C</xmpMM:DocumentID> + <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>uuid:d32e1af2-cca4-da4d-85ab-fa834745b3b5</stRef:instanceID> + <stRef:documentID>xmp.did:F87F1174072068118C14DCF4BE391C3C</stRef:documentID> + <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID> + <stRef:renditionClass>default</stRef:renditionClass> + </xmpMM:DerivedFrom> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:95ea3df4-69b0-4b2e-87be-d812d60eb1cb</stEvt:instanceID> + <stEvt:when>2015-09-01T23:22:41-07:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CC 2014 (Macintosh)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:F87F1174072068118C14DCF4BE391C3C</stEvt:instanceID> + <stEvt:when>2015-09-04T15:24:41-07:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:F97F1174072068118C14DCF4BE391C3C</stEvt:instanceID> + <stEvt:when>2015-09-04T15:25:51-07:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> + <illustrator:Type>Document</illustrator:Type> + <illustrator:StartupProfile>Print</illustrator:StartupProfile> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>96.140137</stDim:w> + <stDim:h>96.140137</stDim:h> + <stDim:unit>Points</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:Fonts> + <rdf:Bag> + <rdf:li rdf:parseType="Resource"> + <stFnt:fontName>ArialRoundedMTBold</stFnt:fontName> + <stFnt:fontFamily>Arial Rounded MT Bold</stFnt:fontFamily> + <stFnt:fontFace>Regular</stFnt:fontFace> + <stFnt:fontType>Open Type</stFnt:fontType> + <stFnt:versionString>Version 1.51x</stFnt:versionString> + <stFnt:composite>False</stFnt:composite> + <stFnt:fontFileName>Arial Rounded Bold.ttf</stFnt:fontFileName> + </rdf:li> + </rdf:Bag> + </xmpTPg:Fonts> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Cyan</rdf:li> + <rdf:li>Magenta</rdf:li> + <rdf:li>Yellow</rdf:li> + <rdf:li>Black</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> + <pdf:Producer>Adobe PDF library 9.90</pdf:Producer> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[8 0 R]/Type/Pages>>
endobj
8 0 obj
<</ArtBox[0.0 0.0 96.1401 96.1401]/BleedBox[0.0 0.0 96.1401 96.1401]/Contents 63 0 R/LastModified(D:20150904153153-07'00')/MediaBox[0.0 0.0 96.1401 96.1401]/Parent 3 0 R/PieceInfo<</Illustrator 64 0 R>>/Resources<</ColorSpace<</CS0 65 0 R>>/ExtGState<</GS0 66 0 R>>/Font<</TT0 60 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 61 0 R>>>>/Thumb 67 0 R/TrimBox[0.0 0.0 96.1401 96.1401]/Type/Page>>
endobj
63 0 obj
<</Filter/FlateDecode/Length 224>>stream
+H‰TPÁjÃ0½ë+tlu¤8VìkÒ²S[Êû +¡ |0Þr!:KÉ¿+Ó †âL+ï]i +Uõ¨n'xÍR)ý´ +'ø†\Ô†øÿÕÞöobÌËÇtlˆ”’5f´ê0>`sÚŸ¶ñGýû? +8;Wcs(BLBXiOLAre):#tgpu$f!(p#lZDL!&Yio=?%411hKLdm@+M[s^SR6p~>
endstream
endobj
68 0 obj
[/Indexed/DeviceRGB 255 69 0 R]
endobj
69 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
61 0 obj
<</Intent 70 0 R/Name(Layer 1)/Type/OCG/Usage 71 0 R>>
endobj
70 0 obj
[/View/Design]
endobj
71 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
60 0 obj
<</BaseFont/AHVZHV+ArialRoundedMTBold/Encoding/WinAnsiEncoding/FirstChar 68/FontDescriptor 72 0 R/LastChar 78/Subtype/TrueType/Type/Font/Widths[740 0 0 0 0 0 0 0 0 0 760]>>
endobj
72 0 obj
<</Ascent 946/CapHeight 728/Descent -211/Flags 32/FontBBox[-174 -211 1185 946]/FontFamily(Arial Rounded MT Bold)/FontFile2 73 0 R/FontName/AHVZHV+ArialRoundedMTBold/FontStretch/Normal/FontWeight 700/ItalicAngle 0/StemV 132/Type/FontDescriptor/XHeight 530>>
endobj
73 0 obj
<</Filter/FlateDecode/Length 2881/Length1 4834>>stream
+H‰„V TTW½ï/Ý4²5´ Ò‹¨Ø4«Š—€"h‹£ €E@Ð Æh«ÛˆÄ1 %D;†$Œã¨¸Ä¸Ç ‰k«'ã
'šƒôÔoabÆ8þÓ÷Ô{õªêÕúýÞàˆÅà‘46%(tVAYi®ŒÓò3{ŽX(ÀN›[¢Þøó¦D@È ÝÔœÂéù!ûÖRñÍ›¦Ïœ—3:áA Ÿ/çfgfµN~ØIñå’¹A¾P¸Ò¼wn~IéˆÞ‰Ci>ˆâŸšY0-3¾:þJˆ#ÿïó3KG– +
0pPøàˆW"‡ŠŽùClÜ°áñ#FŽýjB☱Iã’SÆO0NL”öÇô?Mž’‘‰©Ó²²s¦ç¾–7cfþ¬‚¢ÙÅ%sæ¾^:oþ‚7¾¹h±iÉÒeeo•/_±²bÕê·×¬]·~ß7Vnªzgó_¶¼[ý^ÍÖÚ÷ë¶mÿ`ÇÎú>ÚµÛüñžO?ýìó¦¿îýÛ¾¿ï?p°ùÐá#G¿8öåñ'O>sö«søºå|ë7ß^¸xéò•«–k×!p*b:’*G5Ç›øVÂRX&+eë¹cÜqî*PR{©{©µê>ê`õ+êVÓGËieZgRÛ]ë¥í¥ÕkGj3´Ù~'îsV«ÔYÔ ‰"%³[¤/(ÒŠä¦î¡î©VÛ"E<Éó¿‘²(³ZßI°n³N¶š¬qVʵÃh¿|ý½§-º^v½’ ¼–wmž¥ÒRk©°,·| +gèôðƉõâñaª&¤ +þ4_Åûr;¸TÎÈ%±[¬Ž ^˜ži˜7ódöôÿj§?¤ZµÑî7©^7hß‹6Ng‰ïIÚu?öQ^M”Ø©2Û©’ÕØBÕ]‡5TÅ +b]NU5£9Ä7ŸjKUÊB:’‹ ;Oy„L'‹Yb’˜ +Â9a…0Zú +Þ‚§`/pücþ¿ÍߢœòûøJžãZ¹&n;·…+â¦ré\gÏö03«f#Yqðg~Ì—ùØxx0WæBlì˜À8z‘:ˆÕc<"f?QOÛ¨²«ãÄ¥™˜tñh ®ï 6—*b³†:±Ð–¹ºFg'G‡nö +;¹¬Q:͘3Þ/V¯ÎÍÌ2ó~6™’ªÒ=ñÒÝäá1DmÆ„T3ßß[3ÉÌâ\~£0(]="¤54ÌÃçš™.Ê3;o†.–f±æQsÍœš¼â¢ÌÌåH<
tÃ(I3ËPKf)f¿l]éSÿ.¯.üõðÜa† +HêE5±I…R"QÃ&»´•Òm–¦7•¸xÑèÁƒ4Ô“ÿ‚ˆnMÄß[¼àcôâN¾í·³oÞÌÎ{»}_¼Mœˆ_7ˆµÅmpÃä&ÐþXÀÞwûHêûs—Ñ=ñ¼ež½˜1:/_3¾p¢-†Í<ÄâðpÿIt•½]Ý߃Ÿ51ê€Xu`ò¤-ºA”üùÂo?ø6À= Ÿ÷®¶Ñ¹jò…| þ‚ýÈ鵚5ëyu>¶Å²ŽÈ‚ïåTˆQý켯lÍ©?Úhïÿ·ÞôWü+nœjOòÙî¡6EÏÍPÑõP[u¾õ©C
g¸:à>ò.øÇÅ-jfÔ ÔÈ%*Ò—#!ŠDd.ä1úÝKø³wÁ?…<.>D¾Mz–_-Wµ«†³ÙŒTy¯î†«Š†WöíF¥¥j“žÈ•æs¥Ô„_µkÓ^³î¸N¾xÍ«9¿qC÷¨7ªèÛŽ»lûKÊ[üÕ¼ÊwËÕ•Àõ]GUë*¨¸jvFì +ñQ¦„
w»`XdiØ ÈcU–
dEÃ<Æø†U¸VH—€â=-&%1oÎ)®´w›»ÓŒhâÉÁ‡ƒ×"E¾G¿Ã_M¸õñÇÿ…Ð{ Ÿ]Û-›U/Ñçñq9î~)úôÓW{Ì73+®ëœlµ‡Y1ùÀh£sÆgž½¶ÍZ65Æ»ÅJè#Mâšc?êŽ8ÆoŽ—®XÙ±19:2"3CCòÒÅ´TçeRYÉDRžLXbäÝ+ëåι½cm?Þ’Ö7åÚºµ6÷P–æ,±);Fëtw]CbëcÌÙè?-î_è뽚 +Ÿ,Õ×ûC€ +H‰””uTÔKÇtKˆ”ˆKJI,‚t(Ý‹»4ìKÇÒÝ%Ò¹´H—4J#‚Ò’‚(H +w¹÷þqÏyïyßó~Ï3çùÌ™gÎ<3óÌ + + +SÊhª¦›«·HhÀ´†t^ôé
·'0±ß…€Â™kYæX¯ØY9îYq†q•p÷ólÝ'äãäW°Œ£…z„EÎÅèÄE$´%D>,–ê‘^|t*K)Ç%/§`¢è¦¯\¦Ò«úùñ‰•:¯†¼&D®¦“¥[«7¨¿dplDa5–|ªmbõÌÓ4Ê,óy•y‡Å{Ëe辶5•
«œ½Žƒ©£µ“3Üìã’âš…,t+w¯ñhòl÷êõðõóõA
ö½
î émk +¯‹xYU“›ï“€H„&%«¥È¤ +¥q¼ O'M¿zù3ãKæTÖ@v[NUnn^\¾o]¡a‘b±Tr£ä¢t»lºümE]e~Uü+¿jû×åZÑ:¶zª a·q®i ¹¡¥°5¡Íÿ};¤C¹S¤‹¥›¢û²ç[ï\_ÿÛ†w…ý‰þƒCa…¾Qº1¬±÷ŸÆ;>”L$Lz}4ÿ¤:%8M7ÌlÌŽÎÕΧ/ø}¶XT^â]¦X>\™Ym[Ëùâ³n¸!´ycsk«ûkƶóŽÊ·;ßöv{¿§ýpßÓßúIþsû ÷0ëÈõXõ„éäàôݯÔ3ós®ó‹’ß&—$—õWÆWW˜*ØÂ)ÁãÅ!è$Ü$Æ%¡!e$cºÁHNOAKIMEq“„—úâÖÍíÝýÃâíÆ•;KLów§@˜‡YúX;ØšÙë8^Ý+çDspçñäðfßÏàKåOˆÅTC˜P°p J%†’D=ðè+å+íûÈO%$*©«˜¤”®œ¡’©šý8÷I¡Z½\£Z³^«U»K§_wLï“þ´Á¬á¼Ñ"dÙxíé¦Éö³]Ó}³£ç§æ– +—üW´×÷‡3ƒgƒÿŽŸL¬C#u!ó¼áMîMáMéEåvAmsË”F‡V‘NŒž‹Aø¶£ÌGL’w…A¼Ì¬,ô¬äl¸l¿Ø¿s¬Ý›ááêænä©àͽŸÌÎï+€„‚!Bê²"¢¢<bÌâ4$’€äñƒÝ‡kRóÒ“†eúdÛåšäk*ÑJùÊY*/TS'<‰S‹V҈ԌЊЎԉÐЋÐ0ˆ4Œ2Š†ÄÇ?M4I~–fšŽù²Ís-ò,ó¡…°"+´u‰M©m™]¹}¹C…c…S¼Qæ\êRìZˆÌsËvé‘ê™èãîäëëçîGÙ˜i«„H‡Š„ñ„3GÐF’FaGDïƬÆÎÄÆ÷&´$V''g¥$¥F¦¼ðLG¼´Ë°Ì4Í‚dëçèäjåiækhêéCÐf%V¥NežåAq•YU¯ÚªG^/ÕÔՃĵ›šÃ[ŠZ{ÚVÚ±:˜;å»`Ýá=å½c}ûïnõK˜
¡‡‡FvÇ(ÞƒÇõ> 'R&k?¾ÿ´3?Ã4+:§6o¾€ü¾˜¾T²\·Ò±Ú¿6úåÃúÄÆøæÈVß×ÖíÊÌoá»ðïF?LöžîüT;:ä>¢::>ž:©;ýeqÆvx^saõ›òwÝ¥úåÊ•óŸï'_ +*‰êÕãƒ'[jêão5[´ª´óuR1uàïh`f¨m$1æxJgBdrölÇtÁläy»y¥E¦e$Ôfe¥g-g#`ËdGbwj¿î0áØáTOC9;¸¸Ê ¹Ü¨ÜÎÝ¿xŒz6zåx‡ù8ùøIû³£ÈP‡ó=A¥Á±!.¡†aÂAxÛ‘ +£\®€l‹GâN‚ÐØ»ËÚæÐN´ÄÈa5€tÁ…N€ºzlÕß´ÍS<º°H6Ѽ¥*ôŠîÝ<’a|˜Çkz|C±VŽ²|šÇ|ƒ—‹·|IkžŠ‚|±Ru‰ˆ}26Ž‰'~2‹ÖÞÛF‘-†ËÆB…„°*ƒ„o™²‹üƒ‚ƒŠ‚òjŒ‰‚ˆQ^ˆ£‚@5zˆI‚`Š˜ƒ†Ù³ +~æˆ2—êgK‡>•-N}†o’Ì2Ù†‘Á
N‡%ˆÿÕ§±°ÇÀ›‹â¬ +‡0§ež†6¢çM…_Ÿ¯1…?…—ˆ1Ó£ŒËÆǾ³‹ÀI©‰^º’ç‡ô´I|B†Ì¯dö…ܪwL‡…§e1$„¢¡:®…‡æÒàŒrÒW½ûŠ°Êñ¨]‰
Ãá’1‡£½S{†z·|di…‹²ÇL
„½®g0·„\ ðU„Ž‡©Ìû›ò{[¸“™G{!£ö–¸{ ŽÞ”`{&y’E{xbie{ùJrŽÚ|“/cŽ5}~ +~ÀË:šâ„ý·f˜#ƒç£•™‚üú“M‚Kx+‘CØa|ušI~÷.yWã ÏŽ›ƒÉәߎ¶—%ŒÂ¡å”˜ŠøŒá’[‰‰w!^ˆT`ƒŽž‡^H˜*† -§ŒŒ† 5G…èȨ˜ç˜Ž´ã–=•Î §“½“4‹»‘rív†Žÿ_ÒRG±Œf‹û,ދ̋ͯŒ…ßÇ|˜,¢†³Æ•„žúŸ{“›¬Š„Ò˜ªtìŽÙ•ô^1“ Fî‹Å‘Ä,;‹'‘¾<‹!…‘Æ_—›¬¥²²”õ¨Yžl’~¤J‰„J tŽS#]¸Œš'FA‹4—÷+®Š”—;ÛŠL…PÅf—&¶ì±É”€±Þ‰’ˆªÕ¨šs@å¤]Œ0¡E±Š´žÓ+:Š›ÈÖ‡SS 𧠨ŒêjVPp,<XQ)‚XVl€(Js•&ÂJ!ÒûK{é½@B€ÐEŠ.œe°íÙWqQ䆓³â½ý~3ßÌ7ßÌçF£HI^ý\¨¯§¬ÁïÓ¡ƒåœ+j&YÅöÉbƒdMLÅÑÅ{#©©úè÷)Fø£ÛAŠ;q²ïT0Œ±_à
^¿£9IݤšxÖº¶Æ¢YFh“9Õ…ÆhX;Jõ²Æl¬ äÀín+jÅÄ¡®(Ým,Ö¼Jƒî(Va÷V/ÀÈÄaØ‘”@ÈQ~.æ8_]±Èš7]ñÕÕÌÃãõÚgÕ|ÓFÕ)-—/ªºMH—|Š¼øP´œ8™%èoFxàCÿ<÷ªR×l®AÒ^«™ ÷QÊlÚÁzÙrJAUžUÿá™ÿd*ÿùüîNî$iÜÉ
#Ÿv
b7FÚ*4Þ‚÷ú¯ +
Ëû§pv€iâxÖ–¼÷ŒÁIªão¥‡ìžËÝJÛ±á#ç +í¾ËW—àh…Ô‰Šlý"ùkxwVjGá“Dzˆ–ç*¸ÇßœxŸWÁŠ:Æ©d¿ÙPÀîæ$¹üÎ jÀ4W·Mž¨[ÎÝ,]¢Ê«$ˆ–ÈWæî$I×&®åNˆ¬‘}ì7¨
sØþ»‹1@À9‡TÉŽ.íEÙÓzN¾Dfº*uwr þ„úØ ˆ*ª#Øùòë,¥hØ…Ãð"ä8=”³NÍ
¡%ƒ=(‰p¤â…QuÃ9søLÓ“(î&Ãâˆwì¥Ú¾õ?±‚ERAHi.RÚ~ Ô„Ë6õ ØÑâ¿:Ò*tД3*»–¿Û±ôx#ç‰m?r~3×û2ÿ+Êwù‰¾šp¸ÞÇ6‹yXaœTOÃ#Œã +U‹Â¼<·_)ÂIø(»Œ}¹ÓW2SÎX U€àwü õ¦
M¨–f›_T‰)•úà“Ÿ?k–YYF…ôK8ãÁu;J$óÀþ*1T… +µ´.—÷Jl6mçHj†uÁ,béU6£+s©ìýhܸdœ-Ê¥ª}…wi +{;SÂm¶`vâîØ¿`~È?g¥a.œ +3žÃŒì{§Çæ†L¨^–»¡¦ÔÅåW€ƒ¹¾ÍY¥eÆ4õ‚]¸Lû<pqÞ´…Ž—§´Îá‹÷åkêñÕ!ùÊGø”]µl +ì%€üÎÓ‚æB®sŠW’îÞÐÁÄ[ÇØ~á}F.+}W—ÅöötÕ=¥Ž +é‹õKÏe&ÓÑ,Û^çÜ-¹œv«a¡(0¾Þê…·t¯tzþSûœúwÂ0D¿6jäã¿tlÔÞ.\ÑlVÕ¤©í—äã)žÌ-gØ [Ñš'’Ïxí|Ú|DD”ßµ£ö÷øáv••wi¦Ù×8”Æ°=×Ý‹¿bY¨õ +¿¤ïTC7jŽKIžùšXš7 +æÿÏù_L‹ +u´®Râ_,^V¹àS&åaR´~PfÄÜLL_Dw¸ž*Ž‹`\Í-¦9]qîõ®¯¡¦Ý–Çô¹T¸Ií6)ÿ>u6 DÝ`eÍ¢/»–¢xq¶Y%¤9ÖÛÊœ¼;«Ã¥Oêd\˾ÊP…&eRËzïç;¡]¥¹‹é.íRµ<oªÊΡù]öP{?¯:¦r̨\˜µÝÊ»b õÒ¤â3|ª×íâm ¨s¢ØŸîÛÖW°9¢¨ñµæoZt]Rn“ÏÃ…\½c…Wö#+…n•I&õgϽØÝy¸œAjsÑN‹06”HiD±¸È'@ÿ¥ðõJ+¦ša5V~€cRˆIµõÌ«ïvwtUÓc[3+?F|l(ÑÑiÆÚU—žøô¥^+O—?Rí°Þs©šÿÿ— +ØÁ1¯B›¹vÑŸ¡®nÛ˜F/±ã
BsßG³åÄÄÃMœYø«ëç9>£Ü–3……È—qIôƒ
Ú£±¿5ƒµ¨ÕV‡Ü_À1È£¿Î²œåiÃñ¬JiXû0ÛWV–ÁîH[8g„« +n3¥`€ ¤Ðþ38A.|«f|ј0Iõ½6Öbå v«%Ó&ý ;Y®ýã¿œÕÒ„# +¨ýQ<ŸÁÑÇ +›˜;/¹¥Ô±ìJB"¬‘ü7þØtÍšù©,mºóXdÚ¾^ë;ì´žŽñ&sà`«YÑ"àë† ÑYŸüŠ™¯{>ÆŠÕ.õßÀz^48¯‰e!¹ôR‘6}ØõvcûöìÆMiŸozî²Úoñ0¢'“=˜~µ¯Âi,3Ã:?-‹©Ý?oS,Ùõô9áÎüwß¼„µ¹þ#îÎRçOaƒìÙü£˜˜—ô;Æ ?àþäïŒåpïÍBäÒÀ +±ÖžI̼üO´ÝŸ÷e#}Ô¯èN$í\êŠl?¼],÷ýÅ·y,ÜÑ>&Ð ôŠîä©øq]Âyhâ0AqñâK)ÄBÍF¶“ÒcH:ñì—-h-ñÇŸcȵêf)¯K9T£ã127]çÑä÷q·EjLˆâí•<>hÁ‹;ù|ãU +Ÿþ¼ø×à”dÜp‚G +Æ«½`¹&!…Ïä8aðÉlû³›`83>Ì.‘òq„ŸÉ‚ænç…ŽÚÀ¤Aß9 +;èœï ¡‹ê`¨¦H†ÚBÕyåg¼ ÞKBý ¯*kïã°—2fF„=#Ÿ OMã· éeT? +mòTmê_¡å“ãOBÛŠV +wnKÎÜ‘QVñBá"ÿÃõý×Ô½pü *Ö+ت€ED¯ È* ¡¶ˆ©(¨Ê²o B‚'{p’œì½wH؆ʴ*JѪmA-n¬¨WjGEíùÞ¯çy~ú~?rÙI^WOåÔ@÷«Ÿ´¼l)ÎÝƶ±WïògiX¾›¬"æC¯#ÌkýànA‰Šæ¸§Ë»¤rî¥ó)bÈ!¢UýÚ²I’ƒb=³>Ç0ãžß´©ãŽy}ĸB)Hä[èöžÝðFs´²òV¡+Ÿ±ò̯+Y(IŠ•™(º³‘Àx&Úá9JAIìÏã'tXmyœGÄ=œX[8éTK³)¦2œí©“<ÇTSRüv¥x£ã€lÈ“GO¤|Òg‚/÷{Ø>ãºÑ4Öù/’gËRçáŠF–ȶíà&æAÓ5”š2ÜuЯ*B<óiòë¾ +ar†Žæ>Ý>Ƶrn®[ÉäF +p†-œàú1ÏÝÛz(þ=Ôf) +‚vŠë¦Ä›9øØ¡Ö2ƒ w uûþç…¼çïתÑõ#è…Á{P6„+DÉËq3HIiŽû·Ù%„ûBóC‚’b¨!ÔÖÔkc5‡&U ):X®$ÜŽ–ºˆ[®Èb‰2¤*@ÀPkcÓ˜‚dÓoT©B_L1Uwi"É)ÉÌ=2#ù‹˜pI9, RêO>‡T@>è;¬bn¿Ðø¢€DÈþPuCý«ë›ŠfkÚéã^´^ü°\ÀŒG~•
»o—LÃRc¬HqÜ®=-8^5OÅ„µy*9‹û:-\òg8:T<á?*ÞýŽ´C;¢¶[‚µ·y¿XªÍïµ+±•ÙÊI©;÷lRLß“$Dõ‹vYþTQ6üDyƒ€VmÖÛfy%/sIsƒ†mXP1ªLռȒ¥«òvow)„QBµb™†ÐÀ_ +Ùÿ®ß[Ak]Ùíûí„åJÛó‚͆áVBÆMí"{íNrÜòãæùQÕ¿òih +ET9¢¤Ù²FÞW¬Àc»ƒã¹ám$úµ="G +}KÜe‹š6±~Ö”G_å³ÒìMËDÔ¿µs`± gî]£v¥p-9§\Nôžd{:´:Žgv¶HÖ_3fC;}ÐÆ“ +œ¯è‡-£"{â ‡TZG ôˆRØ,†ÍɇjࣶZw8j ICFöêÕ:½b[ Æ\+å?ˆ +èþ™oA
n'a + +ÚôO¦j0ÀÕä`ê%µ|¶^é/si×_¦XÇ£ýLqiÔw]–Iç©Î÷D"J¤î‘!y½!ñÔ¶®nˆ0²Rá zå WC¯³câcúh™üÈÅ«KÒ_R
[úÓ*)!
OSo‘©u©µ¶OÕ·ÓÜŒWÖãíze¯WÞCΓña½²¼ìÈÏ’Lê·Í÷/ÏQB´o³_“£kÇ/cg£ªÊ&MV?ÇÿÖ«5zõÝ !gÇôÌë"?wœ–PÍš—IÏQ"´Î§ÈPAdtE)q4þ±jŒðúGÁsƒÆÕnñ»{"”‘óí}e®ÔUMÑrkÊùzvi89C}´ø®XóLB1W¾".ê•^M”ÔûÄût?WK¢LÛwÕDP]t£U‘æŠ1r»J«ð·ÓÕ¸KÎÿV¹—ÈÿGM;phÌÕ·m æ‡v>èÀ-wgØõ©ë¡FNýŒÊcIÜPþ#q‡òW• ŽÐËI–˜;ÇNáÙ¶þÅAÐ)ŃÞH~¡7iÛ tòhlƒ~ýÁ~dz²YË
CûþåÎxŸ2>*c&Ÿm‰b›‰ä{9f¢1X*²L˜ ß#>àíú +
V@÷…¤gè’¼]7n249=MÅÌÞìK%
¬;™’,ÙÓéœøFÎ\j˜ð1ÅÑkl·Zå‚i¢×ÓØŠ’áíôœ²Î¡.|Q¼…9˜ŸÐ°¦$_.!“Ë;¤Ì¿¼l€ÎôEË,€ž²ûÉ¥Diùõ‡´¦êŽ}D‰É3^Êa`Y5Åg{J=mãìɳØéËyž3¸¢‰C¤M'¼jMê£-iŒÐ¦ÑmêÜ»n5? ÌSJÙE+U~ ô;·ˆí™Åq.t¶Xd÷¤Þ~œ˜Í~p*QÐeS¯¤%·.‘ŽÐ‹œ"Æ°ºöBs¡ª…ZÏ6-çîøÄ•6[\d;¤^z4’`;64è—¸ùú¤æͱw¶àô;ùŒÝ|ì+&®A©f¬LUàŽ3¬å¦åŸXòT»ßm°åô–¾)lãFí'l
óVæɺÃgcGÙObßbÉœ9ª;v\ºCƇL,Ž>B?ÝKGC¬·e"°z-@¼E´É£³Hûù»</äsˆ=/Ýá‘Y¡Œå{øûPü®w\Lí1A“|U{‘_® +ö\®€wçJ¹çàÊ»³ÜuY/|Ï•d<w›àΤc¤~ÏŽéÀ¢êñx¯Â¡ò#d£ g3 ‹ÅÓð~è÷ÂËgŽÂ‡ó‰ xT2íæȵɒ6s3Äi75À‡Æ»íZÐE\1Æ\éɺ¶W†A' ײ¿Š M }?;Ê‚È8|RÊ0SÁ#⣓ +£5„æùElœ["Þ,0Ê eØòµÙ[Ozò‰Ì0~lúUO¤›+ùÓÚë&x£ì®kPù²c|uÉÙ$kþ.™?Ý{Qp""kÉí÷óÃÊrš6ÿisVûa‹ÄÏ=~‚@Wí_® +.<Ë7ª +Å2Ë#h?c~¥m'r°ÕEÂ_ªxs…ë6‡ò¾øÍa»‰¥ÝÙü±¶Gµ+øš¶K1¢þ4Œªä‰L^kUpø^^ù•_–ñ +Kû*ÃË/@hUvŽ„«…‰¯$÷jœ!@áŒ
ÃvyבmŠû´,W²|-Í¢ –^¥
Õ~€Dô„²_Áô†’"Æüĉâºàø#cØ禘Ï*íX/‡¸Ïœ“e>Ü|õXHÍù;û:˜Å)Ý÷‹d9gÆ–â4àaBŒÈŸÿQ4 +Û¯B UÊ#à>ÉSV§$Lì-íÏ5gˆV ϯ*¢BüüÂ#‚ß}¶npþÒtd½¼ U˜$Dõb&$^¡\^Ò&Z"/˺+Ü-}¼Ò%è‚Z眅:}ðû9•‡ÆA‚ºYu§À æírTÜlP0Ô"šî·â~! ÎÍš*@5Kâ?óß«Zæ-â¿PÍó÷˜³µ=jô³>—܈¬[üO?)¼a5û +®™›÷ñ?é¯ÆWóÓÐUs»ù‘°yÌ5^(ge›${C‰âÏm>² "¤éÝG¸Õ£+Ú$Ø踿©—Ï«&¼æ
XwÎÝÍÓêÆãÊ8?´Ígž‚,'Å=Ò"‚·—–/xÕúÏÂNþƒ¦îM)üïê'Ôòöº–ÌåÍEFÆÔq§rfÔ
CįQ9ZY‘$r!ñ¤Òê6m<YZС.©<š©V^«z{UÑS=ìP +køX%3Öxúõfj¨îŠn%^‡ý¨·«ið´µ»Ÿ«´s—Íô±3ä0ý—àqŠhÆ$¬Ý`kܯÐD& +è2ø»Ì#œsL4õjñšÃ&ÞD•Ÿîi¾b&,ÜA‘ýMS’ÖÝUµD£à9åù yà +vÁþÀ98ÚßÜášÍj‹c7MI·~¬(‘sL#ù}Ò3†¬´(Mˆ^ +´ãÙO²ají×X†_84ÍV(N“à-{D)´éF¡0«$½!àoJþÃdv/_øõ(ÿÇ€ñÚUØH8ÞB +Šlz&,f^ª_! ì?ãlâÛóŸÛ2x2¦X’yÎèåÅ„Ü3Dó㌼)Ø\ +™á´øEˆV¿D<ŠO0ä‰Vbj&¦¾mLBÎ2Z܈öb9êðU¿È;nµ©â6L0 ƒ+–êoˇCrÑE.~µ>TüSØ“Ô7X¬³‰®?MMå!ö½†Ô¼u–Oèôt›ñ’÷PCbt;´·ðièñÈ•Þ°Ìãaøº@gWÙÛ#Û@ë¼ô4cœ9.Dõ¦æo‘z2>M÷5¶þi—~Òu0¬¶qºsæwî®´QÃ9çǸLt–ýì‚Ÿ‘Mz)>©ûßkÉ£ûËI÷;º”îioï"’²›U +ü\Y&kñâëVÉî»x—ë…£3ª¢9µô1ÙµqQ±=ébÃeMq\—Áª¨¯Žêî©`/nņ|ƒËþ2†ðÍŒJkz¦DºmÍ«ŒIR4ü\~5NlðÔÖ…›ôÇKÉZ]TÉC¯3ål•Ì…©…Dî3jSS©)’tÍêWw$IXß[›wºV Ÿ +WT™«úUòŠw^PÙeU±‹®ô‚hÝWEµ^Ø“~WÓcÊhŽÿ¾s±s£õI›g‘ù¨ƒ¶`Šÿw…¶gäs
(€5£ªè +xÆ}ÃЂM0Sõ,r„™ùV+ K¿×O&ÿƈ´`¨;E{irf0 +-°•cœ8òC¹êÌj¢L=L«Î1þTDJ—º»7ÅÆë>©Òê²Î)BHå*£cúHY}~ñxI,{é©Æ7‚W…îûjWÖÞ§…ʇçãh¿g»_óÀ·YovÜMKiÖN>ü”˜QÕÖRÒÒòǧ}È¥Aû–Qžj^¢©G¿s› yJG"ñ?txt,LýÕ>«Öp°±_‘˜>ÞPo$¦Õ^<…%}¨ÊØK¦D”ÔS4¥ +·*S’<Ü–Òyñd;’šÔéIJ»Ó~J®Mn>ÉÌȸcI6ðu¯¢†É–Ú˜€åä©Ši77Ê_’5WŽ2' 9øtÆ^}/ü˜8%wdáÉ +¤AhämŽ4™5 +à lÙƒÄ=ô3¹þ»_2~”–OgP³¥s +˜C¢‚þÕÔcº¾ÆdÚú²[ÚaÚÛ’{<Ð¥ùƒjÔA {! ß²Û“¬Èñ;O'Èá9+wEHŸEÞÀµž¡&†J¯ÒVé?fáiÓº j0¢5瀶bhW”ZxÝo=”¥Æº0–ˆÂz‰äöhK5å’m¢ä•oçÑv(Y€Ouô±óà¿t¹;‡ÁËe=¾ðRÉ*ÍïyMVõn²,¡$v:•ÄQçÚ³EãÔ.›yŒVlò;æsvn·Ö,ôõWi.[¡÷ÂÉ¢@•¦„¤34SüD_!“ÔMú›ßF‰>J柣ND ü»@$ÊYÀ~³-³’µïCÎMu(+lBpБÌÈ^úâ#$œ~÷2è
/@Ì£ë6 3nðhÛ +ž;÷ª¡û‘Ûª.âþ—«¬æÞæŠ3F¸¿q3ã™Ü\ÙŽvÞZnþZ"/ËvNF”ÜüÖNŽJ2V{œ#ΚV¹sØâÏÈe_ì‘®àTˆöa“8C¢°!ΗÌ÷>FîÎL¡ó\ÞþM{û—ü5®ìeH~7;FÎã Ù ²AäúÁ³»¤—B?³ÿÈV¬ùÂYš=Û©‹»Q i9ÌJ.sÓ¿c%–è•FVb‘dÕ¥iL–º`Ûa)kD麛=W®Á³Èœ¸œ‚ãÍ \nÀèçÃeÕ>ŠN¸X7Ƒ†2Iª¾Yf-Òto7±¶«/®~ÁòUýè„as[š†`W›®*v3_”`~©û‡æ:kêÌâ +*Š€‚ +è´¢e)DDIØÙss³Ü,÷f_n6Â"¸€Š:hm±h+Ô]Aqñ•ÑQq¡âSaž¤Àç9ï{~8ç|³~bÌh6âG«îíZÄ ×N\Èh´ü+„Ë(E3§0ï~Ýùô–ÞÀ†kô–T‘MGºÎ²¼èüÎ1ü:zk›a'LáøG‚±¨‘2‡>ˆºýÅ, +ýœ¸ˆ=@€ÆIhÆs¨ˆ²á)H…ÞU§OeX^mÈÁ7R7Ê~Ë,ñûê,éñ\jí´±»¿J„ÔŒfÌͬíÝð¥ð8!*¥]˜JR:æ‚öWâRÖ]ÓMˆÉš”‹PöœZ«ð;¨¸JÃNÞ.8ɦ®ÏÙÆÀ,Á[¶r*ýΑ¶]MˆòŒM"waX)Lbjd‘`ç>:ÿ?ü¾íù|:?uƒ>^ÒÏGÁ©û$˜ÖfaŸâ.Š +Ê¥_àƒS‹ø%²EDð–´8½¤J¶Æ=£Ä•K¢Àâ©{ƒ·À´Ü6rzþGÄãGêò«‰ ‰ÞóÆU‘ií<‘‚—ÄK’gçå"÷¦¶^ €qŒ +ü£ôùI6±°¬±vP¦¶‘éWÜy^,š†u¯c/ +ƒŒÂÌ÷pt¬+ü°;Br\Ü•ì'>¬Þ-övø÷C¹NeÊ”Ûô²ÈL-ÊŒ•qÔçK×H½”¯rÄ7ÉIÐ
d<òŽ¤ù¤BðgNelB^ÖƒRγF2èÒAÓqCR€&ätŠƒô³7ß„ü´{"D9š·Þÿu)—òCð’w²¡æ1úˆt³}?"þ¥¾'Ç[Ý7oÉÌ©«~ž1…{Ÿ>Rìu*ô‚íÊ–dÌCãôlÉÈÁuøtqf‹2[ÍlÒ~{S4Ã>±J$Œ«÷÷.nQ¸nlåPÝ#ü +ÔDæQ§žd¶¡‚‘V„Óídè24¥Œ±ÄKªGÌMËv«ü˜U35«˜KJ~Ù4 +§;•^§ jÆ㛑Qõ`ØexHý³;±JË\*Ë`lú¬Ë´KÄh¦×k +&”ƒ–ñtùˆéF|(²Ý8VÇ¡‹Ü·ÁR×€§:ϳû´oÛG*UjSKk¨ÌnR¥“ï±gl¸÷ÛÞ…-‘6¹ûÉ&¥±NÅ—´ÍÇÇÖÄ7Oâ4”ÑrGm´òO[du_T’×vYÖ{‚ÌIyØ\ëaR Ky¶¼&•Pï7ݪJ)éløƒ¼"—Wÿ5Å{K¤å åÓÚS_õ¥àå¦j +W>èÇ/wÕͺÍhú4EèõkÙ5Ë–’<1òU‘¼Î[¦táþÝD°Å>îQ!˜.kR¿Ï涧ä7˜uÆ +lûªˆ/ûüi^¸á3;i÷°š‚éÚÝ0ƒæsÜèÁôÄ€˜ZÛnÃSÆ +¥»ÀqW7ÏN³“p:ó([ˆ½Ý5Ì6‡8·½„Vùi•AFÞœì~h¹9£PÚldüjì2îdO +²+íÄñŸ¿6Âü1Ÿ--üß1Eú×üwvø¦ þ=JCH«šW¼3ž’4Ü&ŒxÝñ½8,¸Ëà&ºëãÐÔ#RcŠ3Dåvzý6‘…RS„¨yuè´_N/nm÷ÙƒØÐvTÖÃàòÖ¥Y˼?êåRF×°KzÁnª¡9ó¯ã•ÉþQ®æ4ùgœC×^Ù5l`ºP\ܲº€âýG£&ÿ¦¡Þ«`÷²
õ±9ÏP¨ÒñÔÒžÙ²XÜÊÎrÕ6Ô«Œ +V4,ùÖ{²a Ø„ÑÖý\tcY`]lÎÇ¿Ô¾¿a®§°r‡é´¯Ø=bèÖ!ÁÊ&ÖÉûYÃb
Ó^[\ºaYt$w +¥êø[ÝÄR¨)¡§§iÛìº[ô{$™ì7f"¥˜oŒÓò“¢X‡‚p +»Àz¶BzðÎÒŽ'hºO|ÅŒ4ǧ|-•já +:ž•É}Ì´a« +ªUé6§DUÎeõ"udPO:ª¶Ç]£x+¿ì ¶GºÿB½®˜]´€q:óÊ¥—'ý:¶-ML3\ÑF$ç7…Kà3ê +Ãœ3NÝÃ|›ó/Ð'ëèO¬-R_—1Vh&׺N’Pz8de™ºî
å‹ŠZTH;X‚†ÐåŠQÊ6Æ}™ñ˜+°¢ 'h´Ï_î +[•¤YmÎ
Ê~uå8Áíp`6*Iß•Î`S8‚Ì»8s™nŽû9O3nX¬OE/7f•^ê…lËbNÖ[®PBµF¦O¬‚.Ü9¬€ó·ïZç¾_.Í5¡>¥F ›õS¹µÌ‰µR×'}ΪѬ`_dÿXš|ê{´dâÐHXÔ¾3šQlZe7Pã©R¡ªq¸Ø´³O5¬ºOkZþÏrx5u`a +DPQÊ®²²°dß“——¼ìûJÈŠ ƒ£Rk=H+ +*#u)£èèh§Õ) …Á)B§6ü¿sï9ß¹çžøïHªZGòµzçG’†ÍTø"9ªÕ3hŠD×ͺ³Ïs¡îr|ÆÅbã4þÅy ¤$”õTK ºá•"ù$×IÚÖ~Î$v(ˆBìÖ#].²ïqiÁ?C°¹Nù–ú¯ñ~úÞ±Ë|ìíÜ·àLcOÀnÎö¯T~ø³ÜýäþvxjºÀ̦5<.ïÇf\K<ÏÞ2pô:CpËõá•Sây,66‘ê>|zŸC +Œ“¨ë +T +®†Šï!Œàzõœ@#(˜ãóT¿œ¿6ªŒ^ó¢ð!§R S”¼#Ð>E/áSÁq9¥z_ /G%Óˆ0Câ9Æ[Û¼‚@”(Ù©”ÝP•éÀ, }ð¾XŸT…Ok‘‡p¼µQÈ«U¥G6ª€
¯x2¿e,¸Ú> +ÖgS'µ"b'zL=Nª)c¨‘s×*æÈ÷“bä¿Rˆ¡ëä÷)W<ü#–S ²µç™›)Kê÷Ìý
£ª +&¡ô”âLã¾\¹Œ9WËtÌW!Y1󲫬å«ä7i*ø%”ÕþêúwJ_°½ä¦ÜîÌé–¥ñnÁWJñ„!pÉåþ³ä-0éT`¿:K6BÆ+»¥SõÅzÉl‰¯L,~“³J#ZL´HBEeÛ߈E÷q1 +Ú¸¬ÂTD}ébB;º*OÑTCÒnÕlŒ$OYŸ¸Qœ®0m·‰z7ÝoŠ„9NÅ» |hý–DV¤[V¢’eÆÖ©b7É£Y¯ÅZÖ¥H¦Çlþ¤Ûä~Iè)Ü»¬J•5§ø¤ÍòoO–ÕÝ‘ù´©%(ûŽ,¾hÞZ°GøÊÒ¼mR˜d´¹ë!¤ð/NEWutV57z;ÂjôÇÿj¬s·ý»^’^lDçǾ0-a®û_a®ÏLíØŠówÚûö44ç°b^³ppi‡úÌúô&nÓXì ã¾æûþuÆ»-«Ý‚
ž-cÎY4Œ½_Œ´¦¶³šg ?ÚjºGìIãfHõ±ú¤%ÿÃJÒ‚[ö%Ï©¨C6Oz +Óú°#ý‘Qî`”Kõá¶ò|ͨ%cï˜j¨Í/&\™Û:
[øFƒtû^Z +ªžw" ~><¡Ã
óŠ8Éièú½µ}×XåT8°Ç³QÙ†VY<…Ä<ÏJ=áÀEÀÛ7G8v6Á¼Z:¢%¿·¶hBòò94^™Ô¥m!1¼ˆOD>íp%¬HüÙÞGè‡ÙðÄ/Û`rqÑ;¨±N…mï~MýÓñs§\©‡/žˆ¢Zh:•(¶í¦¥…MXžÐ°^FÛ.꜋‹.–Y½¬þÏs}5™`a +õ“|ï°i-‚¿0ÐWs…÷ +Q_Gå½pRjŠyÓ0˜òÑ׿’t¶©¤øj²ÑTÌŽóԊD1·ëÚ…”Ú›NÊ:ka?¦øç7•eê“棆k–Ø_µ%]a;ëזו¯F«=Ë9™Ô-b=&¿óMm0-vDÅ'^Çj´Û+µ¡/5(erÀ^õ+E·çL
F1ä$¨1KŠæ•×WE|fÔ×O£õFMK¬º¡¦ömèí:ƒ:1`»Ú¥fÂóƒŠXýЩMÕ*i€9ÈÊ +l?+Lw?-NxÕÃ͈Ôwɳ\C0–óÙ瑃f ÎsÒŠë·M;iÄ‘`°Ê$èöµµO»“0zúÁ*RÙ¹œB9é@Â"´k¬5ÏÚíÛçvÀü~•.lð³B?îu +^DMk„œ,2ý.#£÷ɲÝ\õ³Ò!{®^âƒI4ßÔˆåµ.~°Ã§ælDc‹BU\bò«"c
äj¤Ûvý‚ÊÃöJGÉ|ÏH`_ÕÈ2ÜrÔÜÉ넧ëæH»³Ñ¥ä
¸§tøŽHH®†BaGŸ :‚ú‹ýBÖfšó°{–'ñª9 +[ˆj¥øaЧøñe +&hè´°z6FdÄy?¢>g¦Û‘x&él$¦ŠÙÜ^œåÎ:¬¶Áæ³^Šèøn¶‰úŽx-'-µ¸’û]èO 5×⽜äØÛÎ@Sä UÞÚy]°Tu à_,zŠáWPT„|BJ,É•}`8Çß´y?pŸ7gË¢uóŠÏ\JO(_ØâŽvOUue4•öÙ+Q±¸Œbi²?A.jÞÿ´Cxy“˜´R¸ÊÖJì駥þPÕÝt㸲rðƒTôúfd½d$ÖºâFR>Pâ¶aºL·ñ'î´ˆv÷¥¥äê2M—Òë*‰¨×µ¾TÕ]`WÖÝ*ßcDÜ*åûhøA¹e#ï"ûɆKO9öJ“ùíKL‹Ò2š¹JÍñçø(KgK3jÔ‰f¬Z¶÷nLåå5‹ýo•‡M(½_ø¸×>éFO‡‘—ÚÓ¹Gi}<´ÃÄ@w¶¬#NdºáÙhoo4öYÜ̾¨FÙ¸2¬…—ºÁYÔAƒšz$ÃW±„Öœ5ÃÃCoplâiÆÂ\³ˆÞ3Ä2‚l„;…òaá¶<;šSç? +Úoe¹*óë +°pù‡²}¸÷²äœ%„á +Kö"G²*æ
yE™%ø¸S\ê¡#§‹áVï9¿¬Û¦2¦4=µâ¬ÙZH…W}dÃñUU¢ù$¤UúÇ>*;ÿ$;Éd'=–NYÝÌ,|ܶ3Û4§¾”ù±q¦T˜=©ka%â´õ™h±s¤€ä¬ººÖU¯X7Fl«”[õåoµš1apuxf¼9µäQ¶Gk4³;e +˸€7è‡ß5ôîxB:¤y¿î¡¬Zd¥Í«,¼`2²—?_Ía[0Å~9iYFs®3öÿ˜g¹× ¸Ã‹9u¤¾ ò<,yxí87¼þ© ´1‡‘‹¯¨JaÆ¥¢,O€@/g½½ÐOÙã”›Ñ94 ð|.]»1÷6ýè'Å^Ô +.´¥2…}”´"!<ý4t¢H~(®-rñç2¢æ5DºH@ùÜlÚÀ"K”»““îæ¿£,“¼/S}ÊëÓÎÒÂÊ"+ ïÅ~w ¥™«£—F}V
dRz™,¸¨:Èw&?ÚC~Fq¨ôJ}JÝ¢ð‹˜¢ÊJý’i¤´ÕrjzEÒgUÿ#±Úp]ZFšÖã%‘Õ+Èþ [íPj +D¥¸àRNXAÐ\0JSŠ¤£H‡é30ý½7åÍ›7½3C•Wc+–ÅU#Ær#aQOL4E³Ñ™?às~¿{ïïÞs¿I§èªÖyô?›y>ßÒ’LŽÔÖ¸Kd-Þ£J1Êv +%sdŸRÛ”eï[þ$z,¨åZù2ÁH5ŸÿˆÊ[&Ht LÁÑ
‹UàOàì·¯Ë<Äu–ºÉŽrEðá¾€{i¼,8+ןwM2ßÀO–œ\ŸÏ7I8Ïùi’l»2Ýewkv"9kÔr6±ªŒU\¬RšÍ*¤q¹oäGCxxy¨‡„;€:j™œY°E)a»Ô²Î°!Xidÿj¸”
q(ú ¸8ÎSí“Ð=œ÷Úl(ŽPíø9Iueé&¾åk)«‰W1Éþ¬Ñ=k˜Z¦b;8˜zBÈCŽ³ùƒû4›«Ú•a¾vþÀ?àsuú¯UuPÝæŠ\Vf»>+›5Ð2ÁŽj&…PØ6»šuR»É®Ô! +aÑ+árù‘Òkô!¹o©4 í«É`¡ÌÜ—ëP)fíô%ù¬VñœôQñ‡T™èFÂ(ZÖ]sŠö‹,”ÔTR‡|O)O?‡¨hŸoÑ# ]¿6yÄл£)ôéOçU ,FœéÙ ¯´›ÑE})gŽsá©ÚÙ´GðyÖÒ˜p/kw~Ë–»¶I'Y¿Ù;TdÀÜg‚YÉUž•Ò'áñƒ‹I8ÿ@Fâ*ð‹ ”8$¸I¸à+A2((²+yª8O¬æÏ‹W‰»È—EÄ
{Õ¢ýbÚWÕ"@œ}@‰C׌Štâe®Y¢¢gv…Öˆœ•üHáÅùoÂfE`áea±<o§V¸ µFÍCÐÅk2…ÿ”ýèê* ]v%ë…¦LËy|è–KJ‚´ú3…®PºnWê(¤ý<Š +²°2«G®’2Ñ›Bjx$Z-äúµ¢aV#s¨/³h"õ¬ÂK6WZ,–ɳ–¢ñÈLü9ˆ0Ã~GÞ"~4äƒ5"[à»âKåè4Ôh¹öû’q§¹‘É•áÕÿŽ÷Fˆªãa¥Ò1U¸_´K¥Äªá)„âPåÁ
?Q΢9–Þ’"ÙîzÜ®i$×Æ5I¥Æ0ü]xÆðoܬ¿UJ&²]ñ:QS{%KÖßz³øÒ×<°–~m댋„/7®Æ£ðëi_‰ä˜y +I<G®dk~°÷xÕkÛÛ’øÝ1¥e'w¦7¼¯˜Û²ÄòàüÔU·y·Êª¯ý•¤\‰ŸöP”ÊxÛäV©©ªnL"ÐN6tÖĦ>±gbN›_¥ÁÇÌ4Ê!/¼e%¥³ÁÐO;m¯ÅÈht§ÄWv6¨º·ú›´[©ÛÌiô¹˜¦åÌÅÁyF˜yÃËÓ4Ê”aêtV„]ÑÍ
auãƒõ
¬#ùëÌÎìªQÏYm3rMè/q{Ž~äÁtjÈüD»¢
×7†Š•fàiÓƒ¾É·
‹Á„èºÀê ¶.=[ôn`4æŠêÈqSháæBéžrÐx_º5wÔÏ%ÇènÀQˆ…ó‚ðš~x“'G[ ×`+qb«]Q›2Ô¸²iÃ=UGnŽ~»òç¤Ú‹JÏ(¬†£à¬ýAݪÈôd«ÇȉE7ªÍKÊz
+MÿÊ]¡ã’ˆš!}ïæj–nh-CÕ¦_è麦Ùç䃊ûíŠò›a¦Ù¬DÙfrÎjï6–$-Ó4ôn®UõZ×F)¯Zpï•×ux'º@ü]U•ïÏ/ìÙ³¢Û¿Ø3íUg`iUì¡}…åÚ°ßÛUÖL¶»W©–Îuœ¯òù+ëÕSïØUå‰î[¸Ýû;u•¯ÓÌû¨„žXJP“v§åOâÅ€©–{$•KFÛ,qƒQÏÕÞr¨uÏHìÝ.ûúÈ}iÞmõ”×ÛfZšh~a¢æåtŸ€ÛM—訅BÇb0*€ÛiWÎÌC䶧µ‚¯jZ®×mÙÆn¬›[nKfic¬+.º&oV.£ô +Z§Ä>øÿó\ßoMŸkÀCZ8à)* µ€b +êðùå~®ë~ï7¹<Nözƒ©QöÒÉTî!wò¾ýðÅB,þùC)kªÝòE‡¼+ç½÷+ŸÌ#¾6å-÷œ)£çpê*ãªA õè…™¨Ao…˜cŠªc~\_xbï5Ó¼þ÷Àž²z¾gQªïuÒ}Þµ®zãGeª¾X~ >TÕSîs¦‚V6·÷¸ÉÏØØiŒ1=2J眆Jhê@ UÍ•æu¤;·¶7!³0 +ß½Ù\Ó醮õý¢ý¬—«±ƒ%-;Øþ=.ÒÜeÏ/©TÖ7DŒ$v°{·.Ê«“‚–µÂ|ÃZÑ®³mcDÖ²+-C¤Åu_Ïï{¯>ë1H±1]ÿ"—D^n×R¾
ÞÙº“:êëÖÜE3ƒ[²h9¶»¬ÏèÂʼnÙ7–TJOW+3v«ÂœLimc
@ï6'³é[Öcì`Ǧ8v§ª!“ó÷b‘RÝ{•Ð1Ï_Óµåòu‘¶Íoù³PµE°2Øð\@;4"›mOÕÙ§Óÿüm{·ÄߺE1Ñd‘ÄA‘¡’}C=W²¼®¾B¶}[3']\PJäG5ØV¯ò‡mnY¡GXyÊahdÃ'J„[U~ v¯óWæÛ…WoÌ]¼Wn÷G¥n½R°¶²9H7ÑѨԡAuÚ1¢v£ö‚ëÛZmˆ]lU§rñÏTØV¨A +sjÊ6lŠhm,M†Ôy•4Aˆ–À’*0¤æ¯ÂÛv”J–²RÈ?¨ï ˜Ä´>ëîÄ2C!*Ë#±q0êMJ!:ÅÖCö‰ÜÂÀRÇ|ÿdüF¿a?Àµ2ÎÝ‚ÅcÙh3¡«dBš‘z¨ŸSIÎt?¸%‚Lý›mïëF[ÁAÚãxÁY‘GâÒ0mê;GY1űh%[Ÿsጒ@×9é
q·_8ùG>r˜íWó¾nêå¦Ü)jod€E“…z¤Cö.qúJviN&¶IfÅÔð8b›øgŸ +Â
ñŸv|ïs÷‰d¡ò©%:uTÉÓÛfü‘û—è&òL®ˆ0Ñç~–pï¢èÝË.(R½ŸâU +;_)§w%$ò‹Õ/à÷Ýt#é« +~ö#œu`u[ëwø.–¥qÜsï“¿Æ‹ååYìü_•-þ‡Ç*'̳ɩåßk/§––)2*
iø9¤¼$é°7fU‘zÏfl¡“×cô9}£]´ +ú</ÇÓBིY%õV(ê¿q/ܦ,Ç— ‡9(B¿è0jtI4 ÓS:²q¡Ô™ì1×Köh^š”ChhCȽFÈõÇæ( ¬|¿|y0%o:TA—BîQ–ÉyPI\¹;hVÊ“×ã2J +Ä¥[‘Qºr…º_k`ÞÇ9h”ˆ "?7æ<18ϲŸ”ª~éþˆÐ©þ
t]Z*7Ö¡Ò^™¸%A™ÇŒ#òµ¨ðÒ7L{Lu‰7Â7]ÄŒY LêŸîL¹; +ô i›\WkIý±Sœ•¡©y!KC:›31hZÅPf:¶ß„ùŠ„0’ƒC>C¨{Þ¶$tR:(ÏuO¹ÖR4›ÞÜâ$=ðjl¥÷¡Äuq—1?פþç9î”ùSèi|cåõqÎF!¨_z^žSÂêK}¡Ÿ`d¢%DÎT íwVŸ>Å; +5€'”\ãGBŠ „ć…ÓÉÎdƒ^u•ò¿x +•¢ë[¨^Úá%e¸‰ ¨Öªúp»«xEÀò +À œ6…%!ItãÞ¨@ò•Ò¾ +nñÖ#ܼ°ë(a¡«ºFìqì&mqü3%—\g?ñ%ÙÓ†ñÙM5«Ÿ¸”ø¶X‹D3‘b$ÊW×ö Ÿ‹¡öÆ¿‹5&Í”D4Ó®Kƒ°ãc²Øኈ. +úë1Zëšo +^`ú~¿`Ç6z ëq¯©Â„ãaX‘Œø½Ç°ø)±ýӼ܄'À¹84n"Db.ƒâÊ +Ú¸»hè>¼¹ôwMv^cö¦8ÞIÆ»õ(~óÆj?¾’¥ +eðo²®y†¨l/—‚Dl5¯€úžãŻרãpùy1œùÎܣܵü‡«´Ü^004€{ñØÃïí.™·%CÔA2¼ù2ë¡dÿWuìõ’šœQö>‰oÂkL<ÒÍßòò‚Å5.Å¿È iñ”f¦¯fh³7Sñ-ßÉ|¥^–³Š…T¡jX[•wCòY©*¸sG^1VeÖ—ä+À˃€˜…åó·L³²·3“
—â/2y†èà{Œ†¹ì+ò½.Å;Cçt‚äJ ¢}¢þ
Ðáô-³¯>Ù«y6q<ƒÁ³Íý–<bØsä +—bk*ĉԪ_ÖVƒè¡âêˆúŽµ«TÿmŒ}£ÎÇD5ï1o¾øU³ +0Cî¤l…ËçÓ];¤S¥k)ÃÍ=RZ@Õ[É·ô5…ù‘¾JBe„Ç$ÆÿNi"ã0-úìR4HœÅ~€9.☫|DϸahÑ +QD~Ÿ0Täæ.¾Œ>"x*õO¼>é…§…ã.Ey+HVy55R”ƒ•Ws•éùÑÐEk*êPxEGBü¦ß;(J³Xâéµ(8h©iqãmh¹‘^™Í0`óö€}ú´”_APWµDèÒüLü£Z¬Â‹]Š<–·4âÁzGÖ¦`Œíoy©üZÃR|½u^ŠŸg™ôCð˜F#ÌnŸr)ÜÌVaåô5ëƪwˆ–Ššó9³nój®yIÃÁÅtó¶Æ +xI«®1bªIyâ>}•‚›-A–ðÚ¯ÑÁæõOShãšìKF¦xµŸá6xq†qQ +Ž3“°SóU„‘›\kaÆþ椚̩ÌDi©~·?{‘>¾J¯3mátßÈðZƒ„øtªÝÔ»]ªY §‘N¡ju]äÉ’ÍÚï©QYílZZÂsˆNÑ´Ñ·À“´Wé>Sã§Ý¥0ÕBÌÂj»æëËâõ+Ö7ëºÔqìÒ„fU7û»ð™ªmì ¸·ºœÝ:Õ8ŠÁé¿^Ó;õ#ðeÕ¿Õ+ ‚â*,Ä_ç©ì†ôñCÊY3ì®â´î¥œõMåÿßSšªU*™¶ªLùXÆ.jQ†È–g²_I¯ÅWËJ5a"9Rª†'ÈC¥\y׳qH)ÒåVÍUü¢-Z®Ö.Î\+ѤÆ/—aÕÃenš/|F¥[•¯?S âPk +^”YÊ×>”•˜ÝVŽH9&yaŠòùI‚ÖxýQÕ<èzU1\–µ¥ +Ù½þl§*7ù}ûô±hu;Twfa^Çåúcn²Îü†YS
q;)oZ¹uÞG!öuTÕU¬Orþ§›lk;ÛHF´-Àx/,uþ sÔm¸í>fdêä}é+] +U×.oÊ.ýÕˆù=·Ûq»-y¶]†[õÌv¿iáR»ßçîgëÄÿk*ï`/p©êþ¶LBuéû±+çºÍAº²ßÚ@‰Â[»)‡î·&P®¸ÇYQÃ?æù˜iåm/¤‹K,¶Y +Çàâ¦Åå&wó«òïa7W”ÆAÆ«X…æÏU÷î²Ûr8„Î+}E)ÆoV¦ÓƒIÃŒ}ÀqZlúÛhˆ<Ëgw® +àˆ¹Aæ°ø?ï=‹ê$ù6-ÁÞ¡|,)!<¥*‘ǘ*z!•³8í߀ϸu”ùPpÕ +E© ºÖ»qd{qÕ׉Ï;’ +²NÂæô‘–¥„ÇYH‹d×fttcâ–Çì»â#&®vŠPótQÖÚjd¡©‹ 1ùo˜
øùÂìR)ʽ@}”Áï<7õ ç³&—ßè8³w¯àyóyÒb¢ÌH¢¦04·èôÍ‚@>ð +¥EJ…7ˆTöÏæ¶Ù|4ëê'¥r41—œ“„ãæžâ¬ nÏsÆÌ#?ÊCÅ›hkòº6¤/Ï»¿¬——7›n
ŒáHIT¶ƒ¡‚c6èß±=ðzz!ñ?z·¸_)þºc¼)¯uÚe‰T»®}nSê3ÒØ&iq4r¾‘¬ŒE¥UÂYÑX\ùKÔ¼ì—88IXú`}7yIi¦× +¢ôSëÕiG›¼‹r3æ8EiÖ…ú$f
ú·ÚÌl+n º.¶’ð®*d}0QeÊó:FŽ¨œœSµ¯S”í†Éô°Ö¯äSȺ–8æÔ~‹%; +$ mþ:ð¤è@®•Ïöl¡ÆÚ(蕉9Ea,·_ÜŽiàÇ€/O IýÂ4ÂaÜßS8!ûÙ%UJ’õÍý«à8C¢(”&2¥J:ð;{»ÊMጫ~J¸ÂÃådméâ«rFW øjg°Yý?ªë;®©s8Ò€€Ò´Š€Z6\Fq€D,²ÃH Y'{“ÍÉ$a@QÜÞkÕ^½÷ºÐ¶ŠÕrõªh¥Ò"jÅ}+ˆmÁjÂôßóy¾ŸsÎû¾Ÿçù½Ó™Mµƒ°D]Å_CJQw’)Áê/ʹÀ5õ®¬×´2µsµ7§v†½¡}§Þå7Ä
TëVÊÓøS¯†€6~Gú„”oLF¢øYHÀ©²ŠKmÖkÂv»õ¿~öUÝô.+ýjpâo8Ɖ$Â5û)Ô\R‹‘¹²´¾(ùàgÝ–H¾m}ìw”5jœN) ++¶¢£‰›„ÛïüŒp·vO[n™ŽHj©ÍŒ%=hº•’Ï4‡^"‹ýl’q:iƒ“Òç%S,˜ŒPîÀûË=ªÆ‹äG°±›²Tü²åï” ‡B†ULR8LW÷˜äêÒÏ$GÅxLcLSƒÀ},ù?þEÑ;ð8Q¿±Eª$?\.”e£!&¹õ¬KKûç¥øJ¬øÛéG„‹È7°ˆ|_ÿÒžl8!>Ë8Žè“(Y«BæIúY·`[å}ì®.úB”ÁõbѼT–²ú$¿=U8OÉŧyˆPá¿-x¯ð$¶]ú¥0Æý_Âù¬ +ájûˆ(³“sO¼¤À‹ûH|/=wKRŸØÁ—ƒÁ•¼ç`ìp±túl>f*ºÓ¡œþuU‰þ<‰=¬T§s®(·&zpK”½A?sLÊo`N0M¥q+~*m¥î-¥‡~F7‚^ÈôÓ5惬H]ò${žö|›-Ò¶9Y&í=X'¸V£u+^°Ï–Eñ m®ÿ² +¤·Y/ç0ŽX® c˜ÍïøAæùdPcÜü_X˜ª
™VŸRx6²ŽÔb¯|Cã6‡å‘éÚÆî´^FeC]¼…¡oÀ-¾F?f7Á˜ Q3éVÌ>ÍyFsõ•£y]ŸÝ¯M©F®½¥íÁÍŠ¾£kã^NÕ¶¾¿I¥’¹öë#F›Z‡.À7¨¿Æ†–Qêfã®eÏ«CJ×n®;AjˆBJFÀ€æw +îýmÔ—îê6êÕt¢”Žã(úI5¥beE‘•¨l ²×X•ôè¨Q•…´¨ÍŒôõ™ûi,)…6QS ƒ1zJŠezVBfžì
Û¹ú¬œÊ¹•/¿Ëí HQ8¸9ê…SnE%Šoòþ‡-“4ðÇŠ±`¤`,£Ü)ü~u¸tŽÈyQŠ“Nˆº]çvØ + ‚Y¦ÞMÐä•N|ÙØÏÒ
_ÏTd'wa£}†Ó0Zð„÷“ãî¦ùü<ûÑä9|•Ý3Áµ¯†Ãé–—3~o=§ØY>Ûú¬l0Wb=P1‰ÜjmE ‚¬XòR[lÍo¾uv:.öC=æú;.Îa.©œBÅ™á˜S[þnºWƒJ3ÇŸNì1='\XrÉü–8á»Û²Ÿè:KìX÷»j¶6â‰e †g΀aép +áéSЧ|NüWP´ !€ì¢o-t_àšŠƒn…yúV|¾Ø¤ö“è³êe`HÊêE =>\½ +@Ô?¦ý^f›E¿ko¦oó\fyÉÜíJ×Óó«8Åz‘‰ÊΰÒXmiËö¿–-NwØ}‹…‹„OYÏpz&˜@>ÚÕg¼ÝªHcþ‡ .«Ã«×]7MŠü£¦z‘#Œf¢ŠàÃæe"“g¦æÎ\ÃÂaã°ì@Ö\ãqyºJc™\„¨3Ü”·‡ÁÍò½ðý†r«'W§QVüEá
Dè|¦ÉP½L½‡sõ\h_h—í…#ôÐ9ÏZ-ÍTúdóÊL´>˼!õ„îWS/bžniAè3ÖÑ.1Fx@Ç §3UNåN^nýPOZñ¦dÚ t<¦jGLyÁâs=‚Š³>»vW¾O&-8ךs§»hvöö‡eSȉ•`wPU_´cÛaÌéÅ™Ý=Õ·}öm`«<<ìƒ$•+»UV×6Ì6dòÖìÁ¤oº88{ÔÝηµçºzkG}Ú»®Š<<ê7Ó\õÒÓjvg!5M×Á!®wž&—GmpfS¬ÙÎg€·O3x?Ì÷Ø +wZs«LRûqê/ë~lŸK]QÓVÉع¿õ:ÓoÑïmùÌ<Që'ÌÃÆR]çAMXyÀu¢¨º^¨ƒÈ©¢€œáä$÷}ß!ä 9LHÈÁaH8«µh¥¥Ê¡rTtD-Å*ÐífY]]wu¤®Š¢²®u[bgÚÿßg޼ߛ÷û¾Ÿ"î÷ÕȹÚÔ I7ù•ŒØH”R·7ŒH§B—Hðu»£d¿të
÷*µá²²=e¢ JŽ¯tjŽ|먾 á¹#T¾•ÎIõ/¨¥W?þ{úÎ¥¯O»^ëŸÆ'º`ú·‘£õv½'$»^®óEÖ=7¨IÉÜßÖTF×2˵”õ7-¯â^Ô'Zú"[x;ìü“Åæ[U‹7ã–,©”þQyWrrÛ9†õE†—6cày'I ÀgIR“mŠ 2›¹¯ +ç{0K”,è^ÊH©/>€>G’@l`á—Tîë=FZ‹àÓðnZ¢H ¨Ñ³$mžÂ¯éµ©K¬AÝ3D;w³¨Å×7⾎ԫÅw·‘^J<á«È`i$ M_¤xÐò8w¿ˆU-,ì/h!Ó»pbPê÷ 1²ª|*¾k_U¾;ì +¸àØA™>Ê¡ <¿*Ùgü!½°r)JÌü‹¼;ȳ–&x§K0äNÁ\“úB¼&æ£Ô³¶‡ùï$¥bÔ7fùp¹è¤t(Å0ú±HÉ2Š€—ª3¤Ó²G1d?źµûè +ùbßVÖ†|°®ÿ\[æ†w+™tj§j?b7–¤öÏhÄ«§wJñCmÐmê#Íb.^V÷äBõ–ÂDR¹bÑ8¥¡E]4œJ…
7LGÏc.Xd£°à¼/ÅaÏ&ÚŽèù@›é¡¢«˜zQuÖˆ4TÒq¨i˽èèbË• 4ù3˽Ê~,ãyýmoθ³[ü 0þ ˜ +€l«} ûÞTóCÚuäLõBt2¿úZÐò¬ã°WÙ>¤´EhÃ@+[‚Řüê¦yŠµÈÝ0= +ósç¦U"r]á;îû]÷(üºÌ{…Ó‚®¬eù ÃE=œm˜òa^2þ'FKv¥~.ôОmŸµ0Oj(›eñs¶ßº´€
ÕPk*!“þ3ùIËBЦŠñs4å{^§|{6ÏÆk\*
à}XÌYž¥Ç å©ú‰DÆ=A%ŒÍ$’hǹW‹øŒÇ‚ORV°Ž‰ü·
²ÜâÖUB›øꯪ¢¦rÏç+C°a6¯‰ ¯ ‘ãK‡ÀÔ£eàä :ZÚ¿u6&»à?ÀWË&ïk‹).”Ù]%¯ä]Ü,l”b7MX]Þ[H"}ªìØWL)RI·rÉfõr?AâÆYÈ&íI¹~_ÂIBåë$Ø{XŒîlÿZ·°·—X¯E¾&|¯wø#ùºßþ؆û`ˆ¥_vºß¢fã–õØu¨·æ3ù—°füÞõømæ¨È8—9Ç?ÿ˜9ð£ +ÌŸ¯ë”NûÕŽ²º`çjz1*äÛêöüíè.Ç@’ë爎܋¹ì`øoåÙ’¼J_™·±™+- +‰‰ÿQ¥ÁAÕÉÜÓ%ǃÄ$Ìû[H~‡}{†1Øf½KÔÙ²Â:HmWS +µ¥Ã«d}Ð2w7ñÔõáj¾¾‡<ø ½O¯›ŒÆ7ÖiÂ2‰GêÖ;SW•Ý’Ê!Ø@YâsœZ~ß*âî¦ÞPÆ6îx¤QþÜ¡Ž§/9iø7cñGªöHV‹fÑ3ÌáR>K•ÌüŸí2jêZãxH"Z‚"²)ûvH€Dö}
‚@ز} YÈJ64ˆT(P_Ý(*¨C]žŽ¢miöéSžJq·OZÑgAåé(nœy8}wν3÷Îÿ7÷œï;ó?߇‹*x"Dü’Ö6²Hae¢Z +Ä5Kü e +tE=H÷º·—±ÿš\Æ’·W¢8
Žù7¹¡2ƒy÷èm¡ü]L´ËŠyô‹ÚÄ ªß1N<å8͸@û±û±“ù:ï>Å>›Ë6p·„ü›ãÈÓ¹à¹<ÞAÐœš*ìµ®‹5M +àåN5Ðøƒåg¨Á³Ü¿ÑÝ]7ïcðDþ!\Æ÷¢ÖO¢Û6Nê(©·•bž¯‡H´õ‰éÖ²r¯t1gž‚“u¡ÿNÝ'w„ߢËeÎGrºÍuŒbÞJ1îÖaÔ#øgøiõ|™ÑGcŸƒ"½ÐÀÐ
á'xù¾&ÚYH;£¡Ùª4›T1}‹Ï®;cÚV*¯‡™Ü²w¦f”™´Æ|œH2;ÛR±Æl›Õ{í‡ÝKÿ²*²óGÜùZPgìÖ׸z*Û¿ù©?Ê—ÖÁ +¦×“:ÌN£”Íæ9u¼ö”•¢L7Ûo©¹Û|jëBñjEV—QRªî!Ū¢Ú;~;ÔZüZûËÚÝxÙ²ž +ì(Åñ†œ¦qìƒê’ïªÁE蠟ëV¥‡Éñ7å:b¹Ÿg3ìh\yˆœ²¬gå.:OšîÇé«ðÜ0ˆ7ºÒ¢›¦bÞ4=¢Nø¶Hdto{¥<ƒî¾¬çWZgHåNR•üRZ\á¨às†W*Zxˆù Æ»QÍ®ñ™l<ÆI³‘Ts|—õâX)‚…c?®€p \BÁ —ÉK‰àuðç¢eüÁ|0|/aì½hBÈ|樕ª—ÐsEG±¶ÌMâÁüs¬Mâdû‚Ä?ê*G,õ°ïHÞÁæ…ýRÀg®[)|å3…¬CëQÌå{0b•‰Iט%9*–ùXÙáÝÌôR‚MñÇU)+ë^ܹP,¤põy*šŸ~uR½Hw,r„~L×îõ;í_º“°vN§øˆ"¹í¿—“‡Û¿Ê]¤ðÌ//S{Ì‘‘êͶË^¨Áæ0X
7Õ4¼’ªžÓ㊈Å#úÞ’{Y´<mg¨$…Œµ5`·ÊVs-*l¬Û»¬gÆùr¯’iŠË•[šÉÊöL¹–X#DEhgq!N-_׸Îêc YP‹a
ˆ!wÖú¯Ê|Emí±"¬ÒŸž¡PþDŽOUHSðr5¸a»+[ý–
m×þ• +äWh¥*Â¥{I/1YwûôJyõ׸jùkú@p[³†ñÈåzó3*RÝeñŸñµRXwq3¯0´©Œu%BÍAÅ’%\NÐC)šWí’'5ð꡵ +&ð™F+U,ŒŒd5ò…gR
"JãrØVDB‹SDO]V‰[EסdyVÓƒ•1,+åIevù"þŒì`Ê‚WrwÄKa¯œ¸Gø…|—óÞÆ`¹Ú%+TˆVR¥C¸Fœ÷œ{Ys*¥š÷Zó5â +ÅÉöjáQA¬4Ó‹<>ÇÆô$ù.7Ã$C$p¯ç¹ãçõ¼Aã)h©ì„îéJªè¹ewáTÑÂ*Fmž´èK™g-‹ØlïŠm„Ê*{íö{•¯–ºÑv\ܲžsØJa>3_*Ý‘¹ÙüÛ>ÑîVµ5ü|»¦æœWG_Ç>ÁâR÷óR_YL¢!ì´R…Fã›jz†§ Sû5fÚO›2Í’<ï¶Þ `¿¶}I\:ÁõXêi Zk³R–—H*‰Ñ4„‡Ùè[(ßxúÔX›á$u|I9̺TkV—ÿ…z––œ×l£_‰×¼g¢C½µ%¬*íw¬XR‘õnY) +¿SU÷.nkç.ü«°“„ƒÞômâc‡Å®)RxØbÛ +ΆÓBL¡ûÃ.„?Ž\ÃD˜‘C±ãq÷ãߢ7nŽO(Mä&™“¿JO½Ÿ¶á˜š•™ËiÊÝ–w0ÿ¿ +
üóæØÌÖÞááßÛÖ Ñ!Ë"Ä#¾$¸%³&®'ª(¦)¢* +ž,-š.•/‘01‰2†3ƒ45678€9‚:;~<|=|>|?}@A‚B…C‰DE’F˜GšH›IJŸK£L¦MªN¯O´PºQÀRÇSÎTÕU×VÙWÛXÞYàZã[ç\ê]í^ñ_õ`øaüc +“ú”é•Ù–É—º˜§™“š€›mœZHž6Ÿ% ¡¡õ¢æ£Ø¤Ê¥½¦±§¦¨›©‘ª‡«¬wo®g¯`°Z±T²O³L´IµF¶E·D¸E¹FºH»J¼N½R¾W¿]ÀcÁjÂrÃ{Ä„ÅŠÆÇ–ÈÉ¥Ê˶̿ÍÈÎÒÏÜÐæÑñÒûÔÕÖ×*Ø7ÙDÚQÛ^ÜkÝyކߔàœá¢â¨ãä²å¶æºç½èÀéÃêÔëåìõîïð ñ,ò8óCôNõYöc÷jønùoúlûdüVýDþ/ÿÿÿ +Rer
xzzzyuph^RE7)4=@?:4 ,!#"#$$ù%î&ã'Ø(Ì)Á*¶+«,Ÿ-“.‡/|0p1d2Y3M4A566+7!89: +¤Ÿ“
‚p_L7! ðÖ»Ÿƒ}tfUA, +bÊ€ä}àS™÷ÛWôö¼?»®ò™æ€üCN÷<üÞ-Yô4ˆÈû³£ ²ŒÊB€Ûé‘ÊYp«z–S–)j"¢Ø{%î>6ìÏ4àø;ç>ý¿FVWíñÑm¬Ž +Sý^ÖD±iéÀ*÷¬bPk‡ÙÙà†ÔÀpØ©È?³%"È1ˆ#!ϼK`ùµŽL±<ín-eª2*þÀÊ+Ý) X䥂C@µv2lQ?ñþ‹í(=ì0Éqåç½
Mzï«ÇƒIãz·¶¹¤7MEïY;ª¦äYµ¥@K (×-ì +ÉXÞùJ4†^¿Æ¬w¤ï¤/€ûI!5 +Šbnñ#ÙF§Œ‰Oìüý +)ýÝ¥q A߀«½O’°kðVÂô¬Ã^B™Ûï ™f8KĈza>p-Fð„þOÚJ*€ŠÆÉYr(º—¨".À°Ož˜'š±ýºqÚ䦨ÚéfÕårC¡üRJ'–dc~¤‹híÕ!€Î?‰`ƒÔÆ}WÑzBd;…hѲG¯„ϲåm½T•ÖSAi©j9š<î „ +ߨ×ø%É@`æÅ8xL¢®TqÄ—=¬,Mk
$hJÔü®ìöd˜ôÓþ€x_§r¢Ì°gʱÀhtG,ÒK±ÝytomVK0õ¥¢¼XÇ?R<¬J%žämq<UG]IÀX©½'tè9E¯Ç +$VtÙÖ +ÝíF§øgml0L×1¥,©œ—¯Ïy¤+•HuÑÌ2‘‹f;Ë[¸T½0BEÍÊ{Ž:‘¯Åqn¶ø´àõtoÑT†]o®´”•–úkI, +„îLgV_R:KÏ‹0¢dêP?= ËÆv¿ÀEÌ·Öƒ(M4èm”‹šÖ\—ùT·k׉o–ƒ´”‰,ôHœ§=³Ãù”‡¦Þïé¤Zµ»w/³®E½Iñ-LQ¦ÿµ¢[ú©ùǾ8¦F/˜gÖ–'$‚?‡[òçu~fÄgõÔîhÜXÒjšñÝš-³ VIñmíK˜ÂÕ€,%išbÁŒQŽþç*e9à7‡·ˆƒÀ—®ÏèWK«‹üÜM™YiHtÑXÆT÷¤ÅBUD”ÚúwÜ-Å4ïþ9#i¯Ô—/ñr]£hGÞˆÕ/¤ + +lD2h§Â‘Œ%TTòT*FÞÃédw">öâGüðY?é"ì°Ï[f
r5ˆÌÊŠ4€Û`ÝùTAoº‡4H5”rWôS¨8ÂÖXy˜ ;$YrŒÿÜ'‚q ævUPñåV&Š×çèÌ4mù/5LJ¸òEÊ:•ªSË7Æì’HvŸy..ø› ø +Ȩ,eª‘:EÁ$@B’KrÉå².!{A$AÂ,ÈCåY[EA;|ŠTJkU>°ý¸4í1aÕÆœdžcT.Ð×ÿéîUsRã&ùBc±h»R¢)¿‰’¥Ä +† Pd;‘ÆÝÊŸH«b¯‡ŸÄl?1;_Ñ:i»^«½mùMh9Óœ+,—xê+(‘‡j3ö=P6uü>§¯a}Ú&¨‰¿bß(ƒúÒ0ô€®=ªá.À<ø’2&îmÎ%ë…u9¶’_ª~z¼Œƒ•L½å!îS`(ð6ÍŸ>Õ©Váú”l¼ûW䨸¤m5y‡pgó!ì2¾·<îÉ PêR%wCý>èÅuþb€v…Õï«bšFñ.0¬¯ÃUKÒ$áK¾;¤Ø‚ÿPà,ž!ôrAÔ5Ñ%\×ÚvüÈò"Ú +[2Ég”wãõdx©ŽJú±æ“:”_Ú'ßEÚš_+^CÚ˜ÌÜ íŽÞÂI! vüÎ,¶V7—2UJ§¦÷Œ÷ìL‚N¨ITUÒK×ÉŽIy/R+“=+(Ö¨§°Œ²vÇð6™×â°Èø·!Mܨ²ñ ¼‹@P¶B‘%…R-›—-â3’ì|4Ý-ÊÆþ”ï˜)#ͯÍÒwòƒ¨á.ËܘŒ<Ç;”ü b»ä#‡’;*œ…>$eó†˜G£Èì +º>à3ÆêïÍñæ"íÙˆ~A•ÉZ¡±Ë$xOU¼¬x›ääf𜓜x;Ù¥QùÐhXÅ(îZ”¦·–ã²x=É`dšàÆ
8…b‘†i¿•dç, ÏÉÄ!îenZ +b°èî/šÞ²ÔÔІ‘þ ßÜ2ÁôPß0~‡“+µ›1ÙbâaŽŠkÜþtT +$Iâ·±d`UÄ+¸ƒíæßzÓ3„Ó8"}×åY\úE^û\Qñ¼íܵ‚³¦)<&uZ«!FM)V×…"çÚŸ}ÎÃçˆ&aÌ€/éíÎå
Ķ»‹¶5ÄÏÖÿ¬›O546ƒPWä눤0ðÒfŸGlEýbd¼c
´'œÆªžrûŠÓ¬[©ò{K(ÔÔ"M/y%•“Á0=²Ÿœâ»zFŽBx}霚{w6{Y5¹í0Ëóº%,ËÇ4ù0œR}Ô“´vTôp>¬K@¥fùR¡$Ê7HìU( ¸ÞÅàªÃ/1¹¯0’f<,È÷1äB§S>¨ý˜Ù¨RI3#&ì&ÿÿ´pßaÖ5j¬àé•Å1€Ð9#yTõ®õ±H†9cùIÀÏû[ßÎÕ§Œ©jÙ¨’UÌŸÃ~á¡?óýÄÊÖÀ+Ý7ÀÞNŒzMÕ`k†|-ækËqJÞ}(Ò˜2¨œçþÊSØÁaÓ¼Gài¿ æ;ຠíÊbË:`uǤayU“}T“€ 2÷ÉûòFtmâÌ”%OpuDìÁ‰›ãU0m~L-_°¨·±µ:ÛqÞÒW¥²gÜ0~æhuwÞ-]NVº‰rPå
=<×]x;Y×ýÎ1Ëiw@áí8,áÝÐnœù™«\(zºÆq²¸ö‹ø˜„b“!$zB³§&5d©øníÈ6ç1Q&ß &ô
«ÊC¯Àu÷ÐŽy#«À†c%$7ý]w'z\½‘×0Lük{8<Oz †ßð¤o%4üP¨Ë—õ +¨9hz»‚ÍŠ°ž$ßLØmxEFGOª¾$»…DcõóÛíðnò:0td#û*¼v–ÕTöâ2¼.q0û³6·Òævêg€ûÑï•AÔ¡n‘3埯ØlŠ'¸í¿±H:<@âIËžõ¨8!èmR¶SÖÆæ–sÂ^½°×U¦g„¼f +~”t-"XÏnÃv&Ãô°ç„?úøÍÀVAìG³˜+¿‚™¢Ï7¢WÑûÑh¤KüµDâYùèZÄ%4YF¶g£[öÐ äÄC_ÔMæ6Ð…LJ®¥!˜¨)¯9ÍÕ!6ÔÛ-²‡l?¯@œ±W…Ÿ³?‹t`k¦;Ýé½ýæpŸö}ý +P»ç†À>Šf†{Ë’i8DbÒÃ̯Mp/Ų›FñÊ_<`w½[ßUèq®°.ÊÏËY!é'i7ÓL'‰ ƒRüz$û‡§v]²cÁ-äÞ©%HYÙ~“Ù•ªçÏ鞀ws{)WðaÖñ˹ÐúÔ‘`è¬ÊùØ{¨[zÀÎö¥ä“Ï¡•ö½Á¢Z¨&èËz +-ù†ƒòU‰Ï@uÖBP.8›jz…Bä£{G tϤ1˜Þ•q#
Üßò¸^×oÍ2†ªN*`®D—èZçm錞cß@QYîÕ@ÕÌðÄOàÉÁùžy`þ†Å•^ £Í)ÓH¬?€?˜Ês %Àý¢ðÀJð@öf»à-ëÞHˆ%ª{#}Å™ìPK +¦Æàè‹ÏÉ'ðÏçŽÂ£· +¸ÅvO@¾Ù%ö7_ß*Z-r*Çé~z Õ‘ê 4ˆŽ!ñøwÄBp‰°ÂõG-q.Öa+Ãî¡cÃÃ"wmqk=½¨ÞWfB
+k^ƒ²«0‡ø¤>n‰puŸ5à +¹1ë°Í9ö~±(Vì¶ýZQjsf¶ü•b÷5~Nlï,$LAE ¾±Æ\ù–ÝûY†vÄø¡‡3kŽô"³*ÆÆIežö´¦.²gj4uœä¼D•’k"Õ*TÜ~~ˆ¬œgˆ^–ò›~½¼<|ƒ1âc©Px7 í‚kFÔ84‘K(/AIƒ\ +Ôè¸Z¯J¤äAÔFqµŒKšqÓ$5„GT´è#.öa<±ñC]”s¶zOŒ£9ÇÔÕÄ@yQÑ’í-–D¥RPÒÇÉßGªD{˜Ÿnš¦ªùoˆ«^Â7é°PµëvU±vºƒ²ôT_F"éT‹Øeâ
Šñˆ^‘9ùì¡^‹9®¯É(Zi•í*³¢”JŽ|1¿"Ë]º˜ýœ.˜g:±ÆE¼TIÄFzNõË÷%T„|ƒk&ñJ´lÅÇãIùõ3ÊŒª+År^¹qfŠ”SNM‰‹òX»™eÝÆ$’vî{ò…ꢫ?I¬Bð-”º-Oi×0iX’oª
Èè‘šT\£¬Å.%kR&-?(ümš¥=ó€Ôþ?~3ÂJncu¦/·mS<ìøÃ,»ÙLeØH:ëi¢_+MSVüaùkò@ +ô4€–9"(hÂd}+É—½7Œ°)T« Þ b¹ÇªÔªhmõê`YÕ»÷ÿís<ª†-´,@˜Í‹ÀŸ‘þ¸ÏSCg—ZwÓñN² CUëcªÜWš’š¤Ê-JGm\Q²ìA]Q†]Æh&D‹¶0±íÐZvnw %’õÎá0†°zºÊMT“XÈI¶ÂÉò:¤Ól¿ŒÅ<›7åaÍ` çù™5æP` ±Ý°Dh“k?Ø(ªbþø Ÿü?²`Fº‚gÝÏ—ñÖűàîy¬¸À=î‹4EJ‹íú0 GvQ³O4À©W²‘Šd SAšnMÿCäÄí€ +Ò±|`ïŠ7ø_·ÎvY—£¦Io©«ÙRÅyYqE¨,Dò;É&Q‰\éBÑxWì¡rÀ‡vtÑÛ[€¶Ë\"]£º©ËU¬ÐØË‹¥
ʤÅâwÒ髱<¶|Mc+…éÂåç
ÛZê¬9Ú(WZ¦Ê³Í°Âäf“ïø¨t‘Ž~X)†Uái—á?¤m±<P€¼Á– ¦;×ëG½ï-_k&ÚžI&”ÓMƒL¥<º:žŠ:͹‡7Š·éÓ°KÆ’ÀÍâKX² ¸ÙѪçöW[’5P7W’«ttbþE6Õ¼šzý»ýÁ¡‰~0¢iÑðWêűÛi4
[$¨k›üšûi´lç$öÙ×VRc4Ó«–ÆêGk~Ê¿¤YQ·:Ù®HbÔFßG™X~ÏNuã›.±kf÷™c`´m
³·f¥é4óê±³ºqVP~š:‚U›#/bûE7K*ØW0ûá]œqÇ=$Üù¼ñ‘ X×òÿQM52ymÇB´S<lÞU +÷ZÒ¸LÌeD׊=ÜB¸ç°kLBR³¿Y„^Ëä#z«A¡%¥Ú¥`r^Œ’'UIoîFgˆ>ð;1pš't.t-SSUn;Qñ›à¹Y(sÑžè§Ð*ÊMº8=÷œâ +BHZ#
ƒ–GcDáSŒ¬ä{d'Ù,UÚt†£‚lÓ=í´,}¼*–¯vËcrÓ+Ð]‰(_ý1rœÃ˜@?A[ã˜ã±K£Dl¡v'”oî>=¦ëÔ’‡ÕÔÓ•[‹µ¨?úQԤô +]è·7E9!À¡7ùëÂ;aˆ—¢ÕuŒ*Àñ8Y?ÃäÒ¢Úã#ö +Ç"ôŸàù8Ûº?pGªZ:ÜOÈ¿´ú7òÃä†ÂT•ÅÔIÐéÔ
¹¸J±A¼éºÈÜð‹xß¹rxýŸn?(ªŠØ +•«–æ>~÷oîß\Ƙa3Ƹ2Œ«è@e»ÔæU*Tl©çm«cÕÓ±½ý¾Ÿï +Fvz|"ïÆž¯¦Ò©n2=µ3[ï°"s¬¥ŸÙtÕ ù}Nâ8«”ûž`†ùñÒÌ1`X¼iý]àx¬£½(®U2\o[v1·d%JOO&rØ—´ß0ܵ9³YxÅݨ \–´€¼D‡m§¹ÖÄ]=Hßjíovfd—¥˜)Ì:ÓtíbèdH9\”ØÏ›®YÉ?«8°Þ
<%þ}ÈçdV‹Û•hšÁnuŒÓ»kV˜¶3+ª¥(+µ$ŠÞÁ-¼›¸Š‹ë¼#¯ð£Õ‹®‚QÒ°ÁØì·ÚåЖžÙãX@ßâh-NdðëÜ$Ìa«š>•M3¿¡q—œ"yÿÕè$À[YÚ@S¶õšgÏÓ=ÝŽÆÚP‡³±˜1·)L<Æd×"´döìrÕ•sÎÈÝñžW¬í ˆìDJÿ +tÃýbêƵcèj¥è*º!®Aq +hGÐ|î3j zŸO‰ôÀ¶ +»°*ªÏ€› òÂÓðÔ%2#ÐÇ“™H¼7!¹
;v¤¡‡ +ÿAr3vŸ*>¼õö§ð>É„½x\œ+¨0lk¤àïôçÍOðÔ¼`Å +û‘kH¦éÍ>*çÚ²éÈ1ùö£¥wÏp5õ´Èê…êQº¶àªÝŒß$Š;¬ÌÛòLvvJ1ƒóf¯›ÔÊ3nž*ÙäøTŠg@oO#9|}•¯ª˜?V0Mù5.‘Û€zÆ{"NÖK?C”_$
PÑ&B̆e>ˆ(q´ªIÁu›‹ò¨`«þ£|oùb|ã_²0l2©Wê‚ßsCü¦Ü´LT÷Iæa?µf(/+¬ŠP¹Iw‘¸BWÊhÿg°ÌšH +¢€®‹¢" À +"(®H2™Ì™™dfrß $ˆxàZEP>ŠÅ£ŠºµúéÖóC¬ÔÇÿáû~ì׋EÎF½:}<
ï\{ +š„‚ƒ¢%“àø±rHÐ6N$(ß«Ná·˜_%ó1š¢«ƒÑ]²2Î:$ŸÈÜØoƯ-†8È¥ I-qt;ù'kŠã¾TjJW^Â}ôkÀôŽfQUr\ùuî¦lôƒNkHná«‚æH¾‚÷õ*‰W¶ã¯ø¦˜Æd6™¸M2 *{¶®¼`ÌV%¥…VR£oJJ‰²À÷`+"èyO|s8ÙÎÃñ®6ÅVÌËy8‡µ:+¿‡˜;ÄÐ9Ýî´É¨Ò=Ú.q“qŸ‚›Ñ=¸ôàÉ¥ñ¨^Óöw÷ld¯‹ÞGÁå;<¡bShÚ ¨ˆ® +ë(¯ÿ$Ëp\)9D$ZYÙr|§¾öçç(¨4DÜOÊH¶»äʳ;Ü«òévÛ±j‡xÒLr_rû
µµ©;Wi·Ô
nV¨|ªRé›üu«Êdܦ +éÌM]4ãǽ•íAî…ß—n„×°Q‰ÔˆXÝtGdñƇšD¡\wQyR¤>Ál-ÌQôÈïnJ¦úȲ¸cä/øÓðËø14™µÑC:Ã'K£&‡ŒÛÌ•BOÝJ{ß´z‘fŒsWñƒÊ|F-§Ùq2˜ì?Š¯Á}Y[pXdY<\‰ävÃ+ÇM{Á¶i©rš¼8µÌ~í£LJÞ¯´ÇŨ
ávlL:ÀÚ ?@Ö¢ÌoÓ[gŒ`¶²}ý>?Ur‹Ç›I2¾ËL•k.Æ}GpI8‰QäRV%Ü‚L0/PU³ ûEÕñ
?´É¹TÙÂcÍÛ¼Ûf¢HÓësÖÄ^QMò½C!º¤)Ã$‚;Òej¸
íuIy õWïêîË6„ÏÏ#LÜÆMi9ºÄ¦Í±å«æšPœ*ŒøHˆÊ˜…¢FÉgˆ]Ÿm¯¾ßnÝ+|“·ÄX$Z6K'Ú»OñQÔJÊq Üþømì(B~—ljçÀSu‡ZáÅ¥–bhW®ÓP"¹žz@³U’»V±¼JÈ΂\ÿ,<\H»¿Ažö·5’çë¶ +ES!.?Ó”ø¡#ÔðCí:[˜6¨$ß´Rµ2G [ÍD§ÜU…ÈcbÆé™Dx(M<Åù¢}°‡|ÜyÚá%î¶Úµ³}¦Ñ’¿íº©œHm‹zyŠEy€)Œ9Didh(Cp½ÿKôoð¹ÊYÓ9_\n¯i¿QsÆš×úÓ®kÆX3¶í£6R7‘ÂU&ª"c´T4E„ʈ0éXÀ,t ’Ÿ:žTÙÉ/>UÝ®¸xà7€óÌõªF›õÜ>QöóL‹ª~:Ê¥ÿ#ï]ð[eTSì2»Œ%…Ác•
žüÔÆ~EWמgØ9ÌÌiíå÷%¾3W4ÞŠ: }Þ¼0Ä_ÁX|¡¢-ðƣ鵼‡„‚ÿV”u×8H{»àßYêF¸"qÄ”-´F95E!L¸èŽ/ŸÈÁ3z„—óLw@éå“"‰œÒF‚Ÿ²Rm¨O´·éQ&õ[Ð#¤ŠÎ¿ö–ZÅO¡î/©xðºË¤Öró~9žT0ä0b³³Ü¬ò4±ÁPß‹bÔ>_nMFY%÷ý<ñip +Ê;R¯xÑðá@ý¤|‹ëŠüqj#ßlºjù?Ape¢ +ÑsäHýt-bM—#¢²¥t8fÆÜß5ó}sßcÌÁ0†f0
CcB¤KèRê•mc³EÑíµÕÖk÷ýÿ×¥ÿJH×[ÅۢŚ<!)´Nñ‰oòOCÜç¼ùöI}5£ûôâ2—‚å
Áš”œÝæ0•9¥Ü¤tMب÷’Œ©ûÄ7B»ùÂ0¾Ø‹×ηç×ø0äÍzÃDþKƒÉYe²è¼RˆU§J›–«”‰Ñ:N::,#ùÛD~6·Å¾²žË4o1ÊlÙ`ÌÏq5¨X–’U5Gû"Á³ì«êZ4¯tXÞú»Ü ¶øßøàòáÄcV÷u–{«_<9·£Äà“¬©S¸Nó}hýµª%Ì{ÿnÔ¾‚"V}V”"Càw}ùt¡¼ë)ýbî3ÇzFj¦oKÓ¨ÑÄýj2€'¢þQ9 +]òÐ\BÈ«r1.8C|œÎ.x8÷~ûßpG¦§m<Ï°Œ"i¸©SÈ˨µ¬Ú u[æë)«E• k¯+WE8x–ÃéÊ5µ
qæg<k~€™ñ[ëÛ0n²&
ËŠÚ®·cÙAúÒaŒíJú€gçþ¿"Ä:©"].fïæfô5
Rñ¡uõüBÜTu6Ïu¸|ˆ;4Rú
÷'ßûÒhNpõ\@I!´£Bq"—Ö:*«ÈpX'%Oð¾µýâ$ÜK#(¼•}ìvW¥ñ&ýü$§¹§€Æn®ˆàï˜Öxä·®T•eØk”‘øUµ^²IÜûªkK”¦l·ˆYÒ+Hõ;"ÙÌË”Ý^†\‚¯#G_KmáèR2Úyêø•fbIîª-òب:Ý$;8³$N(ñÓ‰ÇxŸ¸Ëa + ž™1–æ"¶¿*.d8>éžãýMOÔa±î†N¥$Ê¡Ë–~&(Ÿ‹$~çÅ>ø°žü–tÕBM%^i¦Õï3®¢Ï§Ef8UB +†ˆÓ¯_–ùw•CÕ„YK/¼–Ô¨ 佨/²“êY0ƒ¼£ý–yŸÕ̸7Í.]Â*ѳ°þÚa Œ!ëd™[ëm ˜9„Â#{-ô;˜Wà[¡¸Ìï ·›UŽ$‡mb?ciŸ3¸Ø˜s’™Œqê6ÿÄ‚TÀ
tù +`,äg6ô$cNúŠæ!LÄp©<Šb<ïÀ™Nz;¶0y%€
)°è"Î
«DÜB@Ž;€.aÿÒ$G=ØW+²ØïØvÑFöv-‹ý…Ý|d%ºŠÝ¿ÇîgOŨÐÔ;$KF“»î²lbšu#«^$(ŸbÕ ¥‚,‡ ”jdMð[sÃÙkx÷vÿ͆¹ïc–³?sÝB–¡fl¶S ¥ÿkø€ ªMe͈Ly˜i’Ã3òTZuøgÖvñàî#¬áøV'{ÿFð,ºË8+„5Žå%\©ŸÑY`kY o¾ÙC¾ˆ,VQÕ"˜B½k”5WjØšÃê
aëx·ÐhÝkË"è© ÕA³Æ›Ü/ðŠŠd˜XöÃ!xJ±ë(}¶~ÏÚ&¹|–ÊÿËé íh‰®?í·¾Ò.„òê¸ñøÿÁXS +jkÅuÖjµ³ˆV´JE)ž£Çý¿swmºü^´«VQe¢’^*ð…¡7”cô¸·Su›5Ô.›:’Õ5!{3°A/—ýu@vÉ?êaD§åUNCþkùŒH2)ú1¡z%9ìUé±›ý»éÐÊçvò¹°—Ë!ÆkšÕ0>][#À?¬wÏsb‚÷Ä,4U²á¤_ fà)…ýEêÄÛ* uä6Go7°6ɵêèù¦{¹¿ Èæ'C¶É‚Ga‡â+Á¯ðRUõA=±@ù¾5_ªrgs1OU¸ŠGÿ£*ŠƒÊšëO¨&øÂQÍ¡Á4ÒÜ%¸¥©×€°nl¡c=ú%Z¨ ÷v¥Y
ÿZe‚ëà¨4í‹?eC‹ƒÁ—`…àØÞ_‚ªÙwvĦ10áKÌB/§ê*BrâvÎ4ÏŒwMèñ 0ù›à¸rë“ ó³–`ø¤ñ$½Ðï’÷C‘ÜŠGàa6;g-N_&É° .` ¸`ß0üØùM/s\¢Pœ’MƒfóªŠ`p‰¾3ÛìåÖÆå +TYRJ¦€3éÝøO )*+ +¾«8"ӽ΃ǫöLúÁ¥ì"êHï”Úü°k›è:^Ö–T¢Ïm©©éÈÆøÏ +›ÁKX_ÿt+ ¬€=‘çÐ#¬Ø«Líø³ +u¶uWçKìñ¢Ø̹–u)±F£@Œ†´ó»ïû…jÔRÎý_$ ЮÝYuBÅ›öGõbQl+$Ö»·,o8“qÜl¸Åègš!)÷ÛÁˆnî2QùãήÒßUÎ>YtÍwŽ(Ùþ¢^ëù'Y¦ÝòÑغŸ!…Ú %à—GËU¸û9¼·ù +qÑÔAN?!9NxlÅbÀO°¹Î{ìeÙi‡Y“Q½Ì¶>S¸Òô€ZŸîª‡ .&ŒsÃÞ¿búÑj?1_ñ¡Ç¡P´ÃékœåÙŸè¿°x²`дY»!í¸n”ù6f®VJ•?ffãoýš‰n”ð0¡‰°šÒ6l¿)ó±7ØB¹u‰yMAƒÑ¢˜&×mæ>>ÃNjÔÁ#4J%ûÄ&|žÇòE]ÛŠ:íÒiû2g¢0ÀÒio*ð6zXŠÓÂø†¬h+æÒ‚÷Ò3;üšñ1"Æã2ÒÔ+Oô?©ˆ¨Kܳja½÷´ðÿ +w%5»”,xë+zî!Ί}|%¿w¬pÈ©™xe¥Xx|Y üy$Mœ}yòA—Üzè5À“{ù+=Ž}5"6‰~‹{άq~„p^¨Q~Md¨¤~*XŸÄ~,L¹›U~S@é–Æ~“5½’
~å+f2T"ˆPÒ{p«U…Ip +‘®zÄ W‹W}
q(·¢vsf€²ÊvÉ[º°wLP̨OxE뢳y +;NœÞz11c–Ò{v(_•|è ׊b~mq¶C|ÏfL±o|¢[y¬[|™P£§|ÃEÒ¡t};O›²}›1…•¼~/(¦~ä!E‰§pÞµƒf&°B‚p[Q«/àPt¥ÛgEÁ S;Pš¦€è1£”Æ€Ã(ãŽÄ€·!£ˆÞ€ºp¸´,‰Rf¯Oˆ6[Bª5‡Pc¤á…õE°Ÿ`„ð;U™·„1¾“ëƒ*)Ž‚^!ðˆH§p—³y`f®‹È[>©fŒ P[¤ŠAE©ž—ˆŒ;Z˜ø†é1Ù“0…U)FjƒÒ"0‡Î‚op~²õ•7f
ð“![B¨¼ÀPY£_ŽEEŸé‹Ü;T˜\‰…1æ’ ‡C)kŒç…"d‡jƒpm²–šÙfr˜=[M¨,•1P\¢Ç‘üE£SŽÜ;`—ЋÔ1ð’'ˆå)}Œ„†"‡ƒ›Î¡mfú»ènìi=¨µpkq”êr^mœ€µtoÎlVuÚrX w¿tDyßw'0É|Yz>̾j´qźjlÁrä§`nt“¾p‹u0¤rnvgkbtgw³WIv~yCtxÏz›0b{x|bÊùh§|~¸´jÒ|¥èlä|’^næ|¶~ppò|ój\s}AVtu[}–B×wÚ}û0z¬~lÉ;fׇ
¶øi† +¤9kD…ëmh„5})oœƒviNqê‚¿U¥tX‚BEvÿ=/·y÷€VǧeP‘{µqg¦‹¢¶iåž|l‹»{õno‰èhLpãˆ(Tâsu†SAÁv@„Z/ryX‚Æ_d›Ö´2f}™¡}hÆ–ŽMk“/zámtLgdoþjT3r²ŠxAKuœ‡I/8xσ´Å[c&¦³5e¢[ }gÜžrQj.šxyýl¥–†f¥oD’ˆSŸrŽd@êu‰þ/x\…Ä™bp° ²vdÜ«Ÿ²g%¦”Œ€iw¡„y3køœyeøn¬—bSq‰’@—t Œo.àwý†UÄa÷¹ë±ôd`´RŸfŸ®W‹Øhè¨-x‘kk¢emn)›ÐR§q•\@?t@ŽŒ.Àw°‡ZÀ‚tÿf4¯uþh¦åvÿjõ‹xxm0xŠyosekz.qÐR|{itP?Ä|Öw-Ó~zK¿'rÈp{®sÿqÔœãu#sŠ„vFtgw£wtu½dx¾w*QÏz%x®?E{Äzb-Ž}¯|X½¯pÑzŸ¬êr'zò›ssj{@‰(t¯{™vxv|c£wy|Qy +}>ºzÓ}œ-R|ä~H¼(o„™«Yp‚ƒþ™éq݃^‡Ûs=‚ÁuPtº‚;b°vS¼PPx<>Ayû€¶-|0€º»mŸŽ{©øo˜p‹‹z†r +“o¤_ý%ÄÅ{"bHkí&9q\¥œW:Æêˆîr™ò‘&ÏGˆ%2.i6þD±1ô%~Fù‡¿+~ZýÉC„?‡¶8‚ŸV†Ø +ð2•#ƒâ®ª“ŠÓØui^#v +ðNLÁƒ¡ØàS¿ÛØEèñ„Z„Ln©Ã–`®áè=l‡vaò;(‹>̽…èpÂ Ê ÿ†¶£½~íè[ô‡Ë@›šQd€³F!•œ7•ŒHÙÙ$‰ÌùŒäÐÑ Žˆ…Ú#—Èd¿Ltæ!BOáKš*áŸÌG-i°ÙäC–ÃrƒBú.ÒUålmO¼>Æ
†,Bæ2Wü<+Õ3¡6¹7¡›µß›íÐ@µÑ´)¤Û &KO¶
0Þû +/—hw{ìûV³\lÞs—ýT¾jçgæ?Ò›¾ú¼â©ÛŸÔu «ê¹®¨D}û”.ƒ5ïʺÄ(wM’ °ýÒ±=ÉL·üÄÎjúe³o(u\ý›»yÚPµXû³üžæƒÆ¢8ùp2¥¶¤©23Î2"uhì0
+¿P7÷½DšgÛÄ3Iœ33D_Âè«ôºâ)ÔJœQNdOÌm2‘tØa':‰=ÂûÄJÜê.ÆÛ±¡ +sÞ`d³é+úuu—-Š ǵ‰i—ȵ\L +±kw„á/iƒð®&GÜ1|91É:Hÿ^ÙÈ£gWü¢ú@-µ +‡â}~s¬¥<xÑi'¡Ôy?^WžLy¹SVš¢zOH-–Ü{=:’þ{Ö2î|¼)pŠý}Á!g‡~Ós@£ö|hÀ —g]ðORí™r:GA=‘ï^2쎅)–Š$¾!µ†Uÿrá¢û†hnŸ ……]£œ„ÏR£˜y„G¯”ƒZ<øÿ‚¸2ì3‚ )´‰hŽ!÷…¼r’¢7Œh/žÛ‹u]j›RŠRh—ªˆ¦Gv“ú‡:<ÙA…Ù2ôŒv„ƒ)҈ƃ*"-…=árY¡™’Ågûž<‘"]2š¯$R1—ŒöGD“TŠÏ<©«ˆ¯2å‹ä†¡)ðˆ?„"Y„ׂ™r+¡0˜ÕgýÈ–½]/š&”R–`üG;’¦Ž<´‹42ö‹^ˆu*‡Ú…¹"|„…ƒ/j ²×cj_ü®èe©U᪹h
K°¦$j›A€¡+mX7‰›èpM.=–tsk%½ÙvÓ ‹\z`i˜±òj@_×ÒkËUÖ©im‰Kº¤±oxAœŸ®q›7¹štsó.…•vp&(y(6Š0{õi[°„pÂ_“¬`q»U¬§òrÛK™£5t7A’ž<uÁ7Ë™wz.¸“ÇyQ&‚Žc{V·‰+}di$®ùw_OªÛwƒU_¦vxKk¡ÈxßAvœáyÐ7Í—Òzã.Ý’Ÿ|&Ì\}[ 'ˆK~ªhê¢}9_©‹}AU-¥)}TK4 }wAd›¨}Ä7Ζ°~..ü‘—~§'Œv6 …‡Êh·¬™ƒc_ +v|@Uvõx±.Áz={9¿)bØv®"e†v·œ•hwlŠEj›x6wm0yd±oæyüRrÄz÷?Ìuç|.ye}S½i`°€Y¬jcƒ€šêf6̈Ýhã–vRk©yc®ngQNq¡Y?KtøS.Jx¥L»Ï^ÙŠŒªæaɉY™qd›ˆ%‡vgf†ôu/jO…Îb¼mf„»P›p¥ƒ>Ùt(‚o.wþº]^”«©©`c’—˜CcHl†Vf+Ž;t)i0Œaèld‰çOþȯµ>tsw…[-òwn‚¿¹w\-ž¦¨®_A›®—Mb0˜‰…ke#•SsShA’!a7k‘ŽçO|o‹’>#ráˆ-Ðvö„0¸±[D¨n§ð^a¤Œ–‹aS h„ªdLœ%r›g{—ç`˜jå“ŸOn‚-=ÜrfŠv-µv’…m¸3Z¤±ê§p]•û`®§Ü„c¤¢r
fØC` jR—ëNŸn’b=‘qþŒŽ-ŸvB†wµ~o®`^¥£q&cc•rfBƒÇtiqõu£kÚ_ôwInÅN1yqØ<¸{u8,-}py´mjy¤”nÎlp”ptnR‚Þrp/qsÏr_;u¨tMžw§v2<Tyéx‰,|~{6²™j¿tn¢ül¦uf’ntvT‰pEwFoür+xF^Jt8yZLâvkz;Ûxà{Å+à{¦}6±h¯~4¡lj¶~F‘(l¦~L€Fn™~Qnßp°~e]erê~†L:uM~;swô~ß+Àz毛fê‡á
i‡Òk†<~ÿm*…RmÞo_„n\qǃ˜K tU‚º;w&Ï+¥z@€É®oe~‘žêg²àŽ¼iÑŽ}økùŒ:lðnHŠ[[Õpʈ~Ks€†™:Ævw„+Žy²‚QdXšùžfš˜×h•Ç}jù’ðÕ‡_S + +§žˆx§ç+Úûþ‰O±¾pOé¢T±ò£Ý+ì˜æg‹ŸŸxjZà@›™Žc}9`k`cTnwó?í+ò^5ú¢²‚¯j³ä¤¢¹’“T&ïo +Öl±×øEùæx9ø{óXföPg@C_®[ÇG›=/¬5éÏgš4ÓêÊ¥^E×*ízªþ¡´ÂÏ ø³5È#´p½&ŸåX÷ÿs–Y>€ãû>ƒŸ@?ÈnÀíòC)…HKÑ#èEu·ä$þ%àíŽû¡`^>[» +ø(?`~¤^x +±ÒÓþ5ç£2[{Fõ;‹On·–çÛúݦÛÃ
*Cæª{2H<¡è¬N-ßS´º2ÍUråÓu÷UKm¹³5ųBuœ• +}£·ñÏÄ3À!ãJ÷H$‡œ#h^Qv¾0ªqÓUô·ºY:‘Ê«ªa¯Z=V.ˆ¿ }VÒZ¦Ÿfsôyîå½ÝÃÖ§¹MîßÑP¬8Û:Æx-kîÕ¶(+’rÞ©ãªGãSµIå²Ð€¥øºOø¹ùw÷ðiιþ9јy»¸—€³Ÿ’—&÷†z8,kÊ.$†äxì=rmRMêï¼ÎRŽ€Øíu×Mb;d—íw0yÁâ2Ö¤˜Tý{¢œ¾§—¨WÆŠñ6m|ˆ+±8êEC`ðòGd]íÄMm²µ"ˆæWürS禜D¿ò²~AêÿSƒ‹‚»° ¨Ä+ïG6W#èÿjnA>p€Õ + +èshø]T4ÚIÏ̃ÿDµG§Ã£TDÐ(2BNlz9“eB_ Ý«.ë#J³UÿÒbGŽ³ºÐôà¿É°€Œ¯¢ú¡ îPÌc36õ ûèß…!Ø3Š¬ü•?ào +¨0”\C"‚°ÉdhK>Ù…¶‹ÈŒ©Ù¸Æ:IF“qž\BVhFˆ'$—[Iœ&3’—äæ°B¢™tÙâK\ DåÄ'â`;™I[¿"–ð%„#þÖôNã‡÷š\÷¾ÀëI +|?·a×ü8+ñÅŸ3"-AûöשÕ_ZZ„K±O%u6`·îÄÎX{cçͯw1ØÞÙÿ$¾Ñè+ÊÁO±M{›'±øšEØ],¸j¹z6¶¸¼+§ý°~¢›Qœ½k a=â_ˆµò/E ¸—q¦ÀŒ¿bVškÐÞ&S ß7<R5 |m[NšSµ<ñT[Æ'ö¿öcžÖ"16`²ªñfˆi+mÈÔ‚Ò§ìEžýhîöÌë6©Ì=¶Ï2%w ýÉ\W´Íw3/VWxúG€kÌÜ (œ+îÌK6\°Gå³òk6ygf¨¥«p86×,W C ~¦Â×Ù8¸y†q'
Skî±õˆ3½ÑvIùýˆÕª*•/°ÄkffÔ›]´æ˜_MãÀÊÐ5ÆŸô·$Ϲv°Ñ3š‡ë\—2èe*Ëò^\?ÃüÐÀ|Í_Óÿcj†„1ñÆxÚ¶+œžœemÈ[Ï8¦›ëš@ßŃÈr³1¼×ä3¦4¼6=Ø‹ãvã׶Á¬+©fŠ‰5žRú‘æj¢WµÄïËuêÚM!\„ì7c +¨ —È}ÈýsüÜ‚â-j©³»Öü–5+Ú²kE™³Z5׺ֵÒÚÞ›c„Á¨–[GS±J–©oÓŤޗ¯ +»Ùñ9y<‹i;M½›¼ÏB¯] +—šüYÒ5SúA*bPW#ÊXš~$u2Ðξ/1×a£¾+ºßÀ` ³¾µ®cv&ÛL/Ù0¸Ì°›û;t)HÜ„|©E×òß9ï1îÑÝŽçÌjÂɆ'u/ŠðÖqvC¦Ï|ˆ›™\l´ðWÃÙúja©ËçCšm’^~nc÷=í¾=…7E˜m+àO^± |™Óvádò—†,ñ<8L«O…j³%=ŸÔY0o—}·Ä¶ÅvCBÀW[ÞK&šçI>füg\"Å&]ÐÇKOÑ:´%ije¿B>ä%¼à™j†:l=®ºT1e~ ª/ðߪg¸
‹”ƒI0^YÕV) <õ^ÅÏ‘ë% +·Õ¦ÕQS-WõÓGpaθDû8¥ß 9•DÖ‘ÕƒðXM'Ð +ÕóUÊÈJ•]Iå"—mtª¿euuE²)ÓÌ-3`ŒÒŒù SoOŠÓÕý +ßÔ¼‚Ñ{Ä!`åD}°üÂK_á4ˆ +‰!ƒ¶ªQ\üîHÒ½¼ÏzÈ”ôHçNÚ>«uA-^á²°²bg¦¹%+kÌ5‚ž°8ýWâ #ýwi+‹¯öqéÇ0ÞîŸk…hcûuTT™[ÀÖÁÎ`î5ØZ[›`ËJ¯ &º¶œ-áêvÍ**–öcs0”®Î +Rr_´ñT—Ó'›Uät£Kyγ•zØa“L™=z”s#k–)Æð|O¿ŠèÄ€ŠÜ‡ý:aúxÓim&ò™ã¼&^c½®†ÂŽoIÑ“` +‘¦îWÊñ8Ï2K/ÖױϬ˽ßòŸñ^º¯i©ÁùÊáp‘u£€óÔO£ßè:JD:WtG<Z2µë]uyy±+–ü–0¬¾H5W²?16× ~u´[4')BÝæ—rjâXâ‚GØÔê‚>±Š<Ü8YJ] +Õ„Ñy¬iZPí-|xm«4×Är¦Qe¼`þdZ´H;4°SÉìí¹X1Ìšå`¯±wªŠªŸp¼u>Ê7<dE,]Ìÿ5çJÝ!ù˜óT¼%"Œ•ø7%:ã -+Ç6\Àw‹Š÷•Oêç1=ä’zsùê[ITNXí‰)bOIUq~‚JYéþì÷À鮦Òt ͆/?¦•wãU[j«Ï+Ï–Qz•UÙRÆÅ'd(Û_ÑûƒX±qïÃBŸy ³g5m³¢ÊVÆeüq}£»J©ûsg[\[Ÿõš>¢ Hô²2 +à%ª;†8;2¶/+BöM˜ƒqÿvs$`Ù‰öY4/á\ssi iUcdæõ”U›øóˆa¬û§fhð6uaÉPëÚÇòõ&>ã%¡C‚d>«zES³?«É+éæ&ÓÎeð{™\ÄQ>‡Ý+)ú
”^T9ZîPàäåFê†ëü«‰ +r‡3„„“L2÷$“™$ €x ¸¨ë‚Õ*,^-àÚ·[]ëù<**è–R®ÚíßðýôIˆ<E‹|Nù +!fÓç¥üÜ#ƒ
ÞäA¶É§oÖ(u´ +gį›Vgæ”·ÔÏçE)Õ?nî/Ø bd£éSûu3ßQ·¼Q¸–ùI»B`×\áC!ž’ÄdÑ +ÙPÜ,ÎÀˆ2QC³—ë[PŸ¶å‘Ò»µnª`±žRŸ”ºƒ£šXYUé^í”Ò'ý,|Y5G 4-}Ä<¸Ÿí«kÀC÷ûÈfÞŽoÊÛ†3 +¬wo²¦ß¿“ÙD[D$ú”<ÏÞHÜ×½k”¨ÕUÞÒ*Iï#;He6Åi*µø80C¥¤ +î”P&ÒÍÇàÓh_2ˆnÁnm½‡MsC¯?’™¬…ºÿê¾wø +õ¿Â/8*ê;,Óï‰aøÍ8sÀk¨
ïÖ~!¯!Ö@)Å¢Ö§ï&Ñs<-ùsZ«Â•œ2ýEbÆõTçb~AãðA¤}Däʺ0ˆ¸S”‰{‘ñ{GðaòoqBÍ$ëF8¥ºûz±ÿ*ˆòd¼á¦¾ƒ¨™:ٟЕLza:JÏìeaûéæø¼æq—
³œTÝ*Ã1ÿ"}µ!‡@¸ýk˜ÇÚ˳á߬ÎB/älEyÚ~ôeKüìŸæ¥\Ÿ5¾ä$ÓçOè=háßZ¬îÔí©Í“Þ‚9œðíªæ´`ä_ö¦¸‡˜»ÕÉÝŽç[ê9±Ä¤‰ô¯×u2Bƒ\s¦ù
®u5=•–@¹ÎŒ‚õp@™z tˆ;Œ*+¿ã.ÆîZæ°‹ùƒÿa]²1ÀlùRÕSëó‚¢o¬á‚ÀÜÉ +‡ÐšrÕòHòYìK„¬gÓ<³`ÖÏ7/Õ|ë+4A÷àû*òKÖ¨8–‹Â1‘»%¤Ï-1w”‡¤”˜Ë?Æ–šª€éˆ)ÓrÍÒõ~ÆK0é;h¬Ã±+fé€g:"&›6)†rúÃÀpòcúyìB£›6 b”„Íë#˜&lõ:w¦†¸>fިÕyL/Ø\ZÌüŸáúðjò@ +Öÿ$f»‡~ ^¬Í„:¡)É]È•}‚pèæA(žŸ+…R ©´X¨ +*XcÝZ3}E®Ù“DÅsj…d9FªKŒä›‰JÈ š
¤I1{ŒV!xnK®-e>³ÆëÒ7n·×…¬§áô_Qg1ÃR2Ǽĸ:@“nè\ÖKžXù¦å°Ÿ)Â'€WIØC0hݤù!XL}†¾»É4œ‰l5É Vh2–°,ú–?ƒžbLb#(sÀyÌtk]:ibP _"ÏÈ2S&‚FþŒ ߆*:Ü/~‰·Ù5ülÒ6ÄÄþfÝ»¡ ²¯Ó óð¯©vÍ<NÎE¶¡×"A¢MûBÛáˆI܆=ôžäÓ°D!5¹ŽoÈG³]ëÒMl[UŠôZ~$g"þØHäUø(ú>ô(l1‘Êïu’™;8ãíŸqžµ·ŒóÒi¿7mœL[Ú@¨ÅWxlâ<R‰s\Î]1Ç^¢>äg™ÑñË íY<€#nMDý«yYùZOÃEÑXê;/C<_í•IfG‰ªuÛúR›äÄOè…M++cØ7šS«ò +4ÆŠaZ²÷éԃøÍÎuª¤í¶ Mߊ]–>]o°¶ÓÐ/ôm^&=ÂNhÌ•.®g*>d_ò$«¥ +]ókÜñßÙoj-¤½Ö]ºŽwðzýí`ùg`¹@ÝXRËê¯ïÖÐèžSZ^6Ãu¸VŸîø^×ïo«×ÿÔg±„~X—ñQðô Èæ¿®¡ïa%{s
Tú·Æp4{®³ÖHLydWû)YUÀ&R?î +âS0᪄ïg
:¤poÊ›)·-.XF:€eÙæ +t&8…3µ¯Bõã-ã(;û^S‚éeÚÙúdSyÂ7yG^íH@¶Es¹7<ëA–³Q|•áh“[ß\j‰²–eÿÚZŠÒŽy1|iÂ-—Þ<C^ow¡³Ñ5–Ãè¢pcŠÆP_¤ªâ<.&nýŽ;ËŒpa‚…[y«yŸ$Û«j„ãì!ÉÑ«Ü$E³42éËšvå‰?Ý´öé^ãwnYg?GÎç9c¹÷ËKŒ+%¢<qWÅ”˜Æz^}NV–ã”]QvS{Ôqš8â‡Ú·u)?WVÁí³Ì1lâü%õWy¿ÈÑjpÿÿ‹0#º©>M»']£ý‚š¦|§k!¾¨õ3h{ß&«Õm¹›5&[K¨iªƒK%Ú}UEüÞÚkÌ€ÊåuhTñô[Ÿ*îF‰÷´k +» +?µí;”A¯34VfO×–ý–ßæ 5âœÄ*DvƒÿUe_ÑRqr…_ê°ü¨«pMv–‡]€ö½{ûÒ›[;¶õfÕ4¯(Ìc5Ú‘Gìùõ÷d›xþµ±…»EÒjOª˜®ü-n +|âšë†g8žî
KƒöٶŲˆ]ï{r3ÚJ¨(°ù?Ò±’µq…lá÷u;S7¢êÇqWA}ÅÇ°³†ÃÎé=·Åo +¢nÉœxgº|ŒGCT˜pŽT§aHžìÓÍ—O¥0áU`llÚ¤»Cçltîî0Ájþhý~±¯pÚ±Yú_é,xü'ù,ÉIU·jnÁ\Í[Møæz©ÎóÆÈDBéb<Ô¾Ó]ò«ÜT7S0CùoÛ}ñ2õ%ýsÙF͘¸MQ«óÏÅ›¡!¤7füSÑ•&.!m›àôéFk´¼õ†(+OÐãºóâOÈ¢í@ê•Wª1ù¦fÙôGÛ0J¸èZ¬’âî-#¢=¾ÅýÄqËb>@@Ñg¤IxFzŸ|˜û½âÅÞ´\“E=ˆY®g6ÒatÀÒº*ÿ¡SYõŒÝçô5û—T9vh÷øŽ Æ%2{}n€ü´}Iò90Ýv zRf‹¢›Ð8kOËʼ™¨jV‘oõ:*¡xÚýH3Ê_ 6ˆWWxç4Ç\;“5juÙêèK:«ã:iì²7‹rʶ‡»YAd§«~XÃâõ×:J1<Œœ¥²;îäeªî +(ú;èMÙsºÅÈrlÚªÜU[y5ÿ»¶ýävw‹(k +-Í×Olí—ÖHº«¢WeGã£ü݆L9s›¸ªè‚ŠFp6§ i&xëÁÙИp0üC2}ÉTxmÌCûÀôH#îѽZy—Ú‡†m{ìç+ËEŠAaîö‘ìWÏÓd¼V¨Sy%ÛÛ®™8bôש"SLL„¶òé1å4Ø$B +Ð +]õ@‘äV9È9'ç¹Ò3Õ«Êè ¡Pç?#Ü0eDãaã¶ÃÕSœº†#Ö[%ëÀó™µLYŸø”‡Æ‰U‡U•_n¸¢¥ÊFÀ†Î·4FÙ/V[ØäŽ&+‡;Õk¨+å4e[D7\ì~YCm[†D¹¯úÄ·æÏÊó»ë4MÑn/ýé«9Ó0ÌÑéÆ:/[Òo¬¥`ŸK½Ó˜Ž(Öá +™ƒT™Þo…ÍrM8«ÍæFECw…LhT¯–l¿…ç¢ÂíÈ
¥;=í×ÑL×t¹Ì^r%´¢Ë|ÊTXN©£dñR3O>¢Ö«Ä^º°¹àž¡Gû)
y®·¯ýÛ‚„2ãbþ+žPgˆDWŒB¤Á;TäÑ+ô4Q”v—¡§€¡{ˆ§…À9è¼µ;Œ¯°!f»é6~/Ä—|@Ír~’½EÃMíŠ$,<ª²`ÿ2Á‹¦+ù´oMÒ¿$ȵk뤆éÄÆ)<$‚\nnu|”LX +$EVDĶ¡¥Ôto§Á\~6-s‡ð/€/²›‰EÊÔä2<뤪tñ‘Åù:¨ÝÚmb“Õp®´V÷±ÊçÈn(Q®7: ÏziZ¢“îàN½l*é3ÄÔmôiИ¥‹`® ß
sµ‘ÒnX +ýUœ‚\ПÈb¡i0™¤Ä^Kcà=Ÿ!!{pwp y€ÄK´™H´ö&ôȘ/ùU¯DµáÆgõ#M@’êÁ1“¦¢“¡&®ÓÁyf_s‘IrÈÚùÚÅ”\ýBcŸ×¨7¬H˜eßxÔXl¶Åtbuæ!†ÿhI +&)¥å Ö©êršbp›s³˜Ô;î²CuGFæqÝ~~c6RbOŒñ 'l—"<Í–¼‹üÃz
[ª”TÿÏ0}°5y +¨åÅAK]מñq\k‹PµžU´"ÎJÑ»÷?¼Wåù¶{¥¯j#¬'rG”^–‚ô$U¤Ù)~VÓHDäÎTup©áéæ7©ðe’ÖÊ⚊–˜R³"«I˜›^Çw0Ó^Ô+m¯âO©ïX¾‹ÖiM£Ái†-T‡ß5È°©'ˆ†œNÙ]¢~{e‘œ +ÂC²½ÙlÄ]œÂEškoÆ% ¾õݼ§è„¦™“‰õ +ü‚CÁ_"ý>“h0š[[¡ÑãˆtVÛƒw,ÑíÇU™£À^|}²X?†½Šõ4:a<X…
sšá%˜Ã×Ù‡U)¦Õ<‹@Z§Q›/ç[µ6ÓóÌÝ.ú ÿ0A=¹fˆ œxãIÒ—³’Q¾lä3\¨P©BoJ]Ô´ã\>[3Ô²õö‚Œ?,·ôÆЛMOyIÆOi>§
œ'»|“àÄ2ÓökŽ¤x¥Ío»ç6‡–<Jßc¹^|5±Ü²Zz;*Õ,”1¹—M;]¬åôU÷º «¸¦DQ$6*Ú“óÈXz#ÝËÔUáèfZ,kŒâÐuŠõÜ)jF¹ÀR6í:ƒò*‹hyYÍ”pÊI ~©êK³SpMnÂQjm-+òy²žÉ½MÊ4q,œÜt0L$t®h!f«³‡‰_åyb
qº¶Xð– •@ÂFb«ª/r„àhf¹ÄZ`;kð4<aÜ%â KùEìb}°ä9v_Õ“ý
ö³ÆU‹kñw±3À¢Hõÿ/us¿ÆþkÌ`Ç™;3—Ã÷ÊÿŠ¼æ$B4\+;ÝjèKDóŒñ Z
FFŠÐvˆÁE§áu¬{qcÊ°S¨«TK¸àkø +rS4‚,FæSˆúQ¼?’‰†D »Ñ"îuä%ºíŒZÑiæ^,[U6Pwª¡ãÔ°¨š§S7ž$¿Î!îE.…ÏÜãHþ˜ý7ä^üˆžÀ”u‚ö¿¬Çm[E^Ÿõï)@Yæ¡MSP‡)'b^E»qÂäc¶?¢'F™¿¡¹xûŽûmñä¶îÖuym.͇$|¯¦O‹Kbˆ´1ôcû¥ªwWlnŠÝ~Bª¢½XfO yDzæù2çMÓ…£B QWê´ù¨ci¹2æ’Ý [êb},ÿ1ðµEª¼éwÈô^»Òk˜¾bÈ)Ìk¬,]—ÃwH¥ß¦Ï4ÄU’›£mϪKc`«C!åÍZ¸ÊŽ 5¦IõC¿Wô ÷fQýÆ9ÉQû|U«¸Ëάþ2=Éæ-ŸIºd™¯‹ˆ 2_ªïåM˜º4Ü /Ú¨»åB†>oy +çaG»ð•˜-?”J1§ˆpŠmšÈÓòÄ"âõ2ºŸ§Vñzð|Raw‰~ÿlÌ8
áëÅÓÿ4‰ý„öÎüÜøó»™Ã‡‹ÎE°ZßKݸÅÍáUGÙ|‡B1ŸÙ&T6›è;wÆæW§ßÙ]8ÈÏÙXâ÷yÛWÒîðG-««ª¸%…r9›¶ŸPvø”X7iÞx*ÌLƒ(Þu¶¸==½ãϲüÍ“mqqZe¢ð¡&¹ƒ›ß°§nž=jc¨iŸoÌÓ@ŒçýÌx/{Y‡¨¢/írÛpÕ“Í-×k²b§›(n‡«™J;7ÃöN]Äž²Ó |ט9^Rê”,²¶qäýi-Çj5I›~WfÇ’Ž;*~x†ý˜FÊMµÚuûÙoÌ€~Æ7“ÎS.0.rm«ú¿4¯P¿MÚÙX¦Ä +dºðõ6±žÁ͵¤N|b*¥¾4uvõv#3‘Ö¬Þ¦q½V`i2d%‰Æ5±žö0ãµðÖð7ÓœõÄÐjxÀ÷9‡ôx磨!KÐhFÜ bLb4¬EzcláÈXØ>ò’eÒ¢ü€(j=äû™‰~ðn$¢±
Y9P²KàÚÐC‰/íq䢘֢&lÁŒâr³èSøÁ +-ÀbY@ªX?(Ûe±92í"Õ¯)fÃmˆ€6@>íÄ_æ|ÓXȼ
½ÿæLN§+VJ2¥v&¿Áœ’Ç‚•ÙgÕa:yÊ*=>ˆC¦,ê½……zq¨¡©øwΣa™çáVîbP$©àßÔ†3H¦ ‰ìµ* +|™tšc^Œ7½Cûv›ó¼fÝC¦›ïºUʆNì\ƒAœX)ŒM¢×ÈŠ¬ÅQËr’K{¥ãÄFÛeÍ"jùó%§§h·¥C¿ŠùÀªi¸24¿Ô.$ÛÒ²–ɹ™DÑüÓ®Â?2ª»ðÏ]HMtî—Ôa¡¥»PZé¸+CØÍ9èJ*™á_r%QNÊH®4Òrõ{W)þ |Õem}˜^…e«ÎÙ» +¶.év–¬ö_.e'TÞ)ñV4û¦(FéïoÉÿUgzfðÓ0Õ=ÛrûºÆ£Õ[(hÃØGjKÝÝÒ¢žÚy‚}¬÷¡%ë€]ÁÊŸ%ö€(yì¬À¿0Üóæ·àÒL1Á½™sÚR1w^N³JÛO÷7ö„ÌÙ†yÅoxõ™”OÅãÕ`òi0) ¿6Tù„@JŸŽJL#†Ù×´©²C +ê5\1(ù¢â¡<U~¼¨ +ÖBÚ2iªNÿø…í›ÄŸ¡'Øï¸:dÈa¥Ö9Ò<oé=’Âð:ÚO8Ç +ÑcÞEÃNéO‚ri@ñDüœ¡Ž“ï¤úu{Aî6.ѱ>1óáë_Ù:,¡ ƒûJf?È/•Lèí¢CòNÉNÙç*E]Ù!ç½×ø ämqú=pñ)²¹¿Ýî +œc«F±M¼Hõ´Œ?¨£b;t•%›
7órÁ~ãû´£ÎL&ž3>µÅï°žÁ~6slD'9ã?´ÿ6š‰TÂæÏ™‡¥^5÷;Õ +k[ }€Î»ágX0^h™q$WâKJm3ÖqV/fÔÌ”¿Æ&„í|ª}3ãø¶½1—ªèsÌO[9ï¨"6Á‘εñ6Ç9àK¦ÿæ+´|dÔøæjÒ8aÞ&Ák ËɈŒž=9wåUžÍ©ÏÔ?º¯ƒ®Û¿Ó|ÍáµÒÔ0,Œ’«¡lug™³z® +ÓC‚B¦´'ÌøL†HÉ?— 6¦û¶ÇZWzªÍjxAñ|õ+cs£hi„#aÝ43¾üËKÑZr?Ú'H:‚µmø2ÇèAŒÄ½ÙešÐd€cÐM^ðkÃ^þCÖj#,®¤ž@DòL2Ëâ +„"pÄpß„CH„æ I&Çd2÷LÂ)x‚ʪ°*j±XEtJ×J]«EZ_=@±XžºY¥¨íî÷#>§(§Uûª÷TªÊ#tgåÛE Àíª¬ÌU¦O4E±Á]cD®•ix`FfÁ¬åøw0b(½”ÑU +Õ•Yâ®ù]sAˆêvjßfh€w@A,búÆx#‚iù”ðu+•ÝE¹†Ì_÷X™¯x˼U-ÆEŸW'šÒ_ë½@ÿØ +¬`V´[@-k…¤b½’°nÎ_PëáÅéeÚ:øÿ60ŽŒ„š³Ðñ€èl–u-'\õåj|Dþme;±®tHÞGDæ˪&ˆø´‡Õ¡D!ߪ¿@Ðá—M…Ä?Bâ=ër›äéΕt<‘GHß8šJd öÿlûM¹×žiÜlv>Swžo2ŽYê©!Ö;DL…é¢Å¾]²¡ò®†’±ŸÖ˶íRÔÖþœ¬f;Ë·¾Ò-rü®0ÌÛ첸ÛR}Ö"‹¨?5#ðÍmk+3§(¸¸(.ÏõÇRÄÝÉxP{K$
‘™ê~?uXÅ m‹ÁµÒÂ(U$C[Kží·–Il9v˜®ŒLæ"çF¿À«]C2qƒ.ÍOI®6Ž1žQÐçªxã É1i™QÑZxlµe_³Ì)O&uZõê±èCÈj7$6ôøÕã} âA~««8zXþ°ÜÓÀ¯âm¿b|®nÍ^i>¢]œäfQêë¢ùÖBchÈJDj^ðûk‚æ½]èr¥ou‡ö#I¸î”îšh +8ЂTc£1)±Ã¼ßüWÞ+Ë-Ë*îkxƒuße´I÷~€ßÁPEŒ:À¼±LR]
&‹‚t-¬^à*$MŒ4-µb¼› îãÎBè¿Ÿc˜œéŽ³ñA9ZµuÿKíDÛ„§«§Ñù¬T}–•pËp;dz›…x0w +úÞï7
? r™©ØâŽlJÁ§ûÄÑU/è3B®¥K3hÿ f@ jçm1©¨Rî×–D*Øï¿pù–©ÁÖ“ƒ2ÃÿOö(VvÔÚ +n¨‹œd¦³úmMAOßëˆá¹;í1ÜS`§Mà÷Òú-a6 —)²ÂNßË›,ž£_ +ßl[có.HûÑ–%¶Å–Ø´+#]l‡åcÙ¶ŸÕã¾ö$ ÒsÔ~’&ªÂÞbâ~In^™Yö6-Šìª¸ÊŸ£–É/FŒRˆêa` ýŽçÛEi|à•o Îò$Ô³¬¥h:)=’kÇZvö¥6ãÁŠg|V'E´Úë;ÈRèûˆÊ¥^ýt\"ZWÉÊ +Y°»ânN'⢒¤ü†LiøKÑ[ºž!6bؘƒÿjnf¯$= +*™.Óƒ¹ÆöK›vIöchP÷*%Õz˜ÙÚ‰,1-ŠpGsÀ¨ÀDì8D±C7x†¡&µXš¸Ó8e¸!j5kLÌì4ð–Y›ü
Ä·&Xqˆ¾ + 7épÊL=º³#.´®[ÑÌCjϨŽ†^wÖUOl’Õè€Tv·CeúÚû¤½Êöè¶Íÿ]òŠj2Íã0–uuFfÆÕ±®ŒÊªè:„AƆ"E©*‚±S¤¤'_ + +•B©PëàT;üê}ú*~>22 +EOL¼€º_½~ýæÍ[¨ýý‡““Íý g,vó˜,òcy]âzFÞþlç(§‘}FVÏPÕq㫪¹ØÚJ6©AÅ$µ*ŠH¹·$ÒÏΡ™ŠÙÁì`v0;˜Ìf³Ã—9¸zL2¼‚ÆÙžQC|¼QàM5ð±›x§¤zA¨R+ŒÔ” k*x½ŠGj‘sH%Ť^VaÒݼ¼´û¦r~…LÈ¡Ø3hœã5$Ø‹»#òÈìú2›…'$
’ó +,ª¼F‘P].ÁÖˤV!‡ØÉfoÒèDc&2`* ÷_'ǹ{# Ý°w%{2º¥>ŒÙaQ“*Xª¯SV*â5r1V/‚¸\‚¡ˆôä2·Òèd£©L9¸x~dºŸœà»E‹]0ý +çôÕ^z[ÙAKm€°º<¬L!¯‰±
|±¥˜tä³®,&p#…Aºe* ×aʽ'pBàré±Ì }¯Ü1µ·zw¾AçÁÒj$ª²° +±,¾Ž9°KÍ…| -—‹7\cÝÉLâ
Syr฾íRꈼ_½blØžÝÒ°—U¡KTáU|YB[ŒÓ3„@S¾ +æÐz•Oh'óˆ¦ò7Ã@önOPàðJ¾-äyõæ¸áV;Lg·]f¹Î“'¨R±”‘j†^[(ÅëòÄ€ž +y¤C”BI@l3o?å ÜqìM™Ãù±zÛ¨{·6ÀõöT©Ö‡Ï*?]FW^VÓˆš|¾.Gè2 T¡!YHl" Iͦ +~œ]ž tË‘·Õ¶Á:6^ìüm5ºÂàÃÕúò+Ï)ó”ÑU¹ +¤&GŽ¯Í’êÒ¥ÝU ¡>ILÔŤSKì` `›;¨‚m\¬oÀêœöÞjœ¨c{.]wˆ{]}Až][žUŠ¬ÎTà5×ä„šT9±–"#Ö‘¥$-QJÖ™ +(²…R;×7µë¼îõ®òn^¢°§ìœ†£¬ÌÚaº:VžVT¥•áËST@e²’ &—«‰ +’PkL”l‚ëvw¬ØÙ6´Ô·ì¹U8{`>§Û5#½õ8-EʦhcÉ5Iƒ–jŒ¯ÆɱUxº(EU•¦Ê×ÃÆ–Ùu=X°U=±ôï¹uxî}{tjŸG +¹ó•Øš4Çaã™(=œ¨Gràõ(n‚Ë×âøqZ¼ÀTÞi–ííÿvUíè‚ÂɇF7†¤
:&|ðؾ“ôÐôĮȬ8CLNlG\nt{BÞåvx~T2?²]ÑŠ¡™Êíî¹?Öÿþí:éäB':¸ÚÿÚû³¤§n‘èA¿øýSè+ý€Ëw.‘"nG%…÷ÅPBûâRBz®^ìML½p‘zþ&*ÍT@æ–õ ÝmHÛïÿ®hÿÙæ؇¬ƒDcññì΢³¬&Z¤T_ + Ç ÇÒ»Eèâž/Åì`v0;˜Ìf‡ÿË¡pŸß;†Ï™Ö¾ØA΂‘}„ÚUÌl¦‡Kôô8¥¶SQC#kÔדtY”FUÚÕVErºAF̾!ÆÝâb7¿”ÏEŸ|üÞ{ŸeûÄòöw¸þYÝì“ŒæE‘¾8¦TË@VÔ4U4²®<7©I™Ii—¥¦öˆ“²û¸š‘A(êýRþí@÷öûƒý:
j:¿ã8þ¸öÑÎvÚî´®ug–±«Ö*t´âE@EQ‹€*—r 럄B’î;ä !„rI†C@V@Å]Ý_³¶µÓ‡äQøàýü5ßù<ùnˆÒ.>—¥UßWÃ/)³aÅYØ/-Ry%•F·¤Þ2"Æ
InK/iÜÈ"‡tôY£{¦p—8dþ|´Q\Äx +–ö`'ªyM>¤ a¬ATçm#GÑ’ZVZãÆ˪ݼÊETDèÿÃÖõ‰_l ®}²mð»Ï’do¿8Ëz¶»”¶–PÝÎÂcò)¨ÙÒVdøjGÍT
³*„ì¾:YϪ¢z*‚Mìò +yOC¼Å»Øæ”ÃRéeb
&Ùìl§[GhmÃÃÍÔí¶b9£ƒMð˜%ó”>]8îóˆ!pÒ€Ÿ~æ{áñ’g¢¬ëkâlÂ’ðBÇ4ï2?È©VŒ±õžn¢ÙÙI³Ž´Òí6 +Ãe%2G-8¶o +Ÿ²Nç–aìÈaâ½Zfk@ÞÎ é¼0›,œî"IBL’tr³AlÄøˆ N9õVžrñ…:õÚ#ÝQôª1ƒºhÌaÎx!c¹ÄoDªÜjÔ€E‚éã½òš_ÀdLqœi&]8ÓN“LµS¥“›íƒNI’äSÊä‹/µ)WÒï˜ÓÉK–lÆœ5==\[jTv]½Ù¨@(…WØKñsØm!fwO¸)œii“LÑÚ¤¡Íö?é‘“ª#¯tÉ•OLÔ=ë?Ù¯“¨¦ï€ã‡9Íë,oÚ9̳³´tž‡Ú2ÏâÀ¨UAÙÅPÙ×@C6²‡¬„-!d!ûž@ BB6²BØÄ‚QDÁŽˆk«§ãop¦Ï9ÿç4Ÿû÷úM§Üre²—½9ó¾*¡ßÓš›†ûŒ—RMð‹dÔ0WÜ:ËrçBÙ5*G1GëRÎBd;
âib"P'dþh8^øý`Bõ–5yÏ•J\ž¡¯L¶Î„*nWÎ2Ò bÞߦL¶)˜3tç*E&' ”sd¾r* ‹Þiˆ²„@sìì?ûâ/=:Vùh,~ß—‚½;{–´ôu15®àÛÆkµ}6¸EnA;øýxo‡bhéS$uÇ,N%œÃÉ•³8©jª·
òã'€îè™×q/¬qåO=Ç`›S)ˆÛËçгù,÷T™ÀìרísïÖÞ=@o5’-zê$^ËšFk¸3(l¥UAä?5(ã€!ö4°ÎÛv¹ò(_uw1fáf:Þw-»}hâŠXë©ÓKvz†q¶®A²›ÙOñQŒÔ NÏœ@ë:&‘zá$B/†Èÿ$Gc€*î8è?”ñÚz0û;ß——î]/ZZ‡…V’É#sY]°X&q×zlK×NC»™ìdP<dÕ‹ïcø1ƶ +[°†ÁÜÆâòoðy«DÈÂs?ÿ™íÎ{hÀowóÁÇ1,°÷8 Äf L?ßðCVAÕ÷yE%Ï +K.?)-¿ô¨²²àamUÞÃúš[5¹[ðÚœˆºœÈºìMtýùMì0¨€ðo» +ËÛy0Á£wõA6kÀÇloáŒzˆ=vVätbd.RãCô{,“Ç„4¹¡ +”)ÙÛšô+Ou§`÷õ™Ø;ú\ú
mqׂªZ4+‡+'Å8ƒ¿‡bqu2Ǭ¬NÏ ÇßG‘†t$턧â
ÞèƒôFïÂ7
ÉG€,)¨’³·µ©ÅO
'ë6ûÎbîögSoö¶/+øWu²°£÷ˆˆ–Q.ml°½Íc`rjš($oQM +ˆš0¨rIF?ÿiˆ¢¤#@ž˜ÔIç_éSŠžõ¥×>8Z7g‘W-[—ÌåÜ«½
J?&Á[Ìü–1Ck\ÕÖ°B†"ÌmÑ„;[ô¡Žƒ + þ©¡7q§áD +Ð$fýØtù;SjÍ–%qÏzŽ¸fÏg,ÛË;¦-°^¡Q`-}"Ò˜ŠG÷HºÚüvÞ—-
·35Slº.ÔJ7 øoÉÃ@‘þÅ5pŸNgÚmwº³ÓÙ±•Ù™mu»£ë±*ꊸ‚€Š¹/#7H äNH Ž@HB€„\ä$77!áP¡ˆŠx +Ź½Åm°Šôzw…,³»FžÑÅp h9àäûvoZþñíÂͯwÝx´ëpçËïüoÇð—=3éÎb¨³—‹ +ï$”çßʨÁŽåÔ!G‘lø0–›3DhÌvøYv² s°¤)ÝF¦ÚhÍ)Õ-® +Õ`®FmË5©{òÌÛökï
ÿ·
ôÿ5„ÿ·!>s™™Œ^ ÃÈsUXÚt™9UJ厓«šÞ7ŒàYΆ™-PØß7 $*gƒz0W«î‡›Ô]yÛ÷¡él`\:XA>€s9ø7<î5'&c™E=ffÎÑÓ•DædyiÃx M8ZHë¥<WaÇT6T‹Ú†”hò”º¸AgEt€º
LÈ1Àô
ÁAïCc×#ÓV¸ñˆEvrÁ}fNùt
–1I#7ܤ– G‹«Û† +˜r;£´aùšt«®)ëèChôH½^ê0¨ÑÛê
uΆº€c€pð.]ü˜
~xê^LÞ“(qžUv‰¬ª&roÒ(ÂJe›ƒÌPÙê<_ׇé{Q +c7Rg4 tFZg”a¶ïCC½³¡þâQÀ½xð! )(ú04eµ) +þTÿ 12ÃÎ¥ßfà8ãÕE‘òò6G ½ÝVÀÒôøú^ŒØ؃R™(E…Ö˜¥Y„Õ™¶°>6°.¼à"4F½m IzÙžó¬9ÿ°)©d¶1»úźŠF+)mjuû@a½¶7Ÿg°âDfFiUcÔR¬ÚÚŠÓX„xi»>6|XþGÏß/@@+$âßâ k¯ÄaÙÏÅÑØQbÑœ0ƒö/¯n‚MàÒ‹Åí]%µ:c!רËZTxY§§êjq4ÖF‚Ö¼]XÎöywÀ?çþÃ=5a' +oPùE¼i„·„ ×Ô‘9Ôq‹Í©¬[
üq)Q<\UØh.gêºY}‰°WS(35Qû•EJÖYj)zS
µÝh/PókƒÈë¨ó<”^~ É'üÚ?aS„|¢‹ ¬´AÉ:8}F/¿RŸ+¶ˆ¨Ý|š®Œcha +Œ
4±Y^¬´H‹´ÖjªÖZU 7 +Ûûìõ[Cç1 ?w¨<}A‹wØ{_ÜKýyÄ“ŽðŒû]Pâm¢p\‹+¿Ø-¶
Té…ÅºË äðŒRVYÄ[…tõ +šÝ½Ö#ø]‡wÌ‹ž€¤Usri07mN¥w¢ËŒ|®!W¥’Q´RQI§°Šcä fWlerUôòÖ:Gg¡³õ&{ýÖ q? +”n. ÅÍ´¹½éòŠ|fò0–rg$uÍšB¶ö 8†6œ¨¥9»A®$µVËŠ:¹bVoi
ÏLŠ,EUŠ‚Jí@!Og)ªÐ›íõ±áÌ@êv4œ>4§=A‡[À+£gøÚ $fy4"nv,9r1™ÔgJcë:±5J-AYÛLÔð +:J匞Y¹‰*©îÏ—Èy5¿Zg!WêÍöµ¿6ÈήÎ@çâºÎ@6,ÁGüÃîÎD†OMBÓ†F`ù+¢´Ù˜^-íÄ+*u¹j¶š¢/i¢u‘UcnC¥9K)ëÇ7hú³êÚúsÅz³½€ØÖ ²5È]ÍÎN ÝÙíÑÅûÙ°;äÁT +g 9yNºnZÏ®^sw¿sâ9µqq.Þ5ŸÛ4–̨½œ&¨ÂJé‚ŠlÊ×d‹Ú2zYéÝü.d—¸ÑÕØ“j0t£´=ö’#Û€Øå{ :y´?ö¶ï¸ÓÚˆ“óâ-w§©»ž~—îB =wBÐêÙ(¢ôz?ç1GÓE—²äÄAR#ÁR¤Æ™™Úô¾Š6TŸPŸf¬kG5ú”^C‡½€ÔÖ sÚš€Î#?9zïú ‡é%g×á· žû^‰ê»œt!„Ì›a2¦Rx…c˜šü‘,iöp¾?T¨ÂЛÐVNÒÂW#úEšÔ~¥Þßj7 sØêïZ‡½oûî_;°wfÑÁáÒê ÷žÇ.áêUÉ/¾™ÜÅ` +cÊ(¸¯ N`+³G³Dø+ùÌå‚:ô%Z}ÚE–2u¨¼>T©J”4&
*íêo‡w‚Î}»Ÿ
ïÙuóö?¿»¼zðXï‹cÞêçΑ’ggS¹+~™ô¥P2u.ž–÷3‚M˜ÆVà&³éãÄ*ä¥1Z,‚_eˆ“¯°%I#\iâˆP–pYRg/Pphý×ö×ýßm¿sãYÙý}ïÆ~'õkGˆä•s4÷ù¹Túj`ùÞ…¼ÜX~>3‹e¢n؈™¼2ø4¹"yª›¤ñ'™‚ø‰²Ê¸q~t¼Zh/ Úû5èÚùõƒkùòêƒoþfÜصOýa¿‹8ús߸FÓ_ø$“‡¦ç¬@3qË°<ôR ±€¡Âïd%Íç'ÎåÓnQéq·Š±³4fÌM+úçòÒ¨|¶½€îÛÏ׆·n›û|‹qý›íj°ëpå‚ChïÝ#È/ⳟ_€c×bQˆG0lÊ +û%=+á>>'n9;7ö^^^Ì=1ú.5?j©ˆ¹D'_X,¥D,–QíµnúòÓÑñ?ýÁtÿ‹/ÔàïßJÀžÃ\pø
œò&ï ìw!‘˜×‘±©±0Ø‹¤”øgˆTèStZô*j€Ž|œ“ñ˜ˆ D„=¢bCáBÒ3‚WYx{oùÄt}Ë5›[ÿ,ÛwòÀéÀñ$ ¸Í4LBÞA# oaQQÿ…Ç\x„†¿ÂÄ…½Êˆ}IHÙÌNÞÌKÚÈ‡ß ÀדÖK’íeºúÙ'sŸ}*_}Å;vÐÁ¾½$pâ¸;¡€ï™$pþ\,÷Ž1~ Á?$Äù € + +˜à +9¡~òÂ|?Â}ÞSíØ·‚R—€éwpƒÿøá^@òž—·YH{ÊÆVDòrqQÉ"…Åž'VpoåTUÞ$ÔVÏdÈD×±Jñtz“t +Ý*›Bµ×M"{ä“i–ú1äÅúËèa¹=~oø½áÿض†R[ßÖ ó•Q!ïñq/¹ð´§e˜ÌUV.y™VH[(`²çIåÜÙÜʪY¢š¼L<SJ§0Mu“èVùª£~Ù«˜@(® ‡Céö[ÇÖÀñ=ç€0Ä#‚?¡±/0ÄS.2s•C -3)´…bgŽÂáß$ò…395µÓ©t2C!ŸÀ6+ÆÓµÊkhCÃ5”Iuý?Fç;ªé; +DF$L„@ Ù;½Ç/‰d:!á¢Zu]õ{©øwþøüÿT•*Üï +hc“^ë3~1¦Ü3ÁJŒE¨i¢é¢¸†ÒÏÆr!:Aj$“Uê†^Nà›ÅMr› +Am-[[‹Óêþám@¼¨ChØ[kdì†+>é~rÚÂ`vöä¹Sˆ!ËœCƒìÐËkØÝB¬DÈÅ+Y]d=“a&Óø¶JD ˜„;Dlw؛ɛ7 + y툈zÜŸ°6š’tk46Ö—è³7Zåí*Š-–ÕKØ¢&%ת#qèfB׆cÊ¡¦Â2 GƒìMT‡ÍÂC?€žƒ».ÈX¿è
[Ž‹ZžH™¹œ‘5:˜Wît6è¥d™¾’ÅU¡EôîFIҬŋ(¦ËZÇ—ØkxZ¨šÙÑ,‡žé´z0=¦ç >ø=PØŒ~„?‹Y˜9=1žžy~4§ÔÚ«t–V$“a¨¶i°Ýx%Aé!jäLs¥LdEÈÔ¶r™ÃV!tZQ<§Å Ës`ú +gèSDFîd{Wöƒ5ÁãdŽË¸ã:nú8ä ð”¾ÿ +oÕ´äßĶå^Ƿî‘:²f©ÔŒ&í䟞6-ïLÖzH|ÿ›ÿúbð«?ÍÝùâÓ‘uŸ¯¡—[}U¯ö +^ÆÐ^…¦_Æåb6’‹QëYˆÒûù¨âU8úÔ2“¿Tݘ³ˆi‚-4á3ï4Òo“‰'çiÍ©·ºZRn +Z“oÊHÞ +‚bˆï#’1¯e¡ž§”nÀŠ”æ?‚#s"*a÷Q¨Ì{u5ék
µi«xtêJK}Ê +“¼LÿËjHºË÷ +0}ùÉì…Ïþ0:÷Çÿ³[gAM vÇít»v§3ítÛÑ™vZuÕ®]ïÕu‘Cî;r†CDD @ !`BBHHBî„r;€ \BñÀêZP´X‹ŠnÅ‹uåßÝ÷ø؇}ø¾f~/¿Ÿ÷¾ùô76Ø°QÛ÷ˆá@BbhŸ\ñ™Y²œu¬èun^þR!êølQöwLÖs6ó—±H-M{ÊÀ#ŸÖRŸpËRžÊ’KÊ“ÄéÖ7k׌MürMßô'¿°Áï?ÕÂg›Ä°kúS!"œ q8@&¡ ™ûþxæ±w¨¬¬ï‹³3–KsÒÞ–G¾!禼®:‘üš–—ôŠ‘Ÿø²® á%§àð’ +(Dh>¤FåÀ‘Ø,ÈA¤C~ÐI)€óžo|J"”§& +¯8ç-»ý‚QMxFeU>¦ðiHRæ|™Šý +‚„½ NÉÑŸH]iDç¼åâÑ/XÂ"IY¨æÑÿE–°æ‰Mœo®Ô(¸‡µ +g‹]âYt·d¦¨_6]8ìí‚|ªpR~
=)›ÀLÊ}¬UÃz¨ÚÂÃ{@†yf4HsRAŒ:öVPRô¢¾‚°X[CY qè«Du*ܹrà.Þ šÅY%3X—lsZ~= œ*UN^išÄ\U^,¾Út{ÅgPç5Ôy
ÜÈ- AìEr +ÉI§¼I0k&K;tWp}ØQýhéý þ‚¡§ì¼¡³ü¼ÁEôp¼Ž× ÛªèÐëˆ0Ð'#@Ÿ‘þ®%'÷¥U¼¨Ä‰ÉÔû<FÝt]ÿ]"½JQ«ÆI†æóeöV¡ÛèÆŸ5
ÆL§ËÇÚ:ˆcmvÒ˜ÉRá»U×o=HB?Mäh‰> +žR¤M¥L”pü'ʸ~ãµ<ÄxNPm¤¯¹µñ‹Žö
zÍc×\ýcÇæÊÓ]ªOfyŸìlÅŸ]]¹à‹H€àêG$ÿ;…þ‹zO'D¼Mˆ
{“BYL§½Ñ²èþóyÄ\Qœ¯FÅôÑ”Å{ÏV%è²Ü°I¯½e½ÞÝ'ëõê_eP†[OûsÁÊ,ŽrÁÝ1Fà +ú+&àwÊo™F|ÈÄø,ea½—rq^ï‹ðžïTwg‰ºtÜ\«w»Õ@¯~`Ý`óúSðÃ6ìß%‚#ÿ䀣ÜmIàëˆ`×(@z†Ê;¾@ñóF +;»œ("½Ëa¼¡)^STÉó±çSæ•
¾–7‹½’ö +Ó˜>ƒ¾ÉŸAµdL£¦búcè!Á3ì¨ ÷bUÿoø³¥m`kRŒ´S2i€ÈÂí@Šò +1¡+¹dÔ)“ôVÀaÎsÅìYV.o*¾X0N?'£TgÄÖå<'ÞTôZsŸ{óZI=yw)=ù?SŸ4О\¥¯¸ÚžÕÛ …ÎÆpÊã +Q#eÇMeX¿qåiÃÉJѳøRéSF…¼‹z9·ÜXÐFR¶’º”w©O”M´nåUzwÑOqÝÊKqOV<mCš¶!Ûv9î•Û~(õ>güþKx}E5åqcuÇî(ƒ:ãŠÊ¢2à‚ R¥‡^Œ´P)R @JHƒôC¨"BE0 A\а¸êèg–ñnÖ‡}ŒŸ÷ï9÷üï9?
÷^Çÿ!HŒyY“‘ô”ŽÉz@-ÄüF*#ÜÂ1KÇóøcH9}¡b_ÉR×h2/s/gÜàõfÝ䩼97y¹7¹
HóþßPå´ðÝö‰ça ÷±Š +ràì|ôh%‰x…\Né/bÒzð|VVÎièø-¨¡ +5(n@éÅ +Œ^$͉°¡k˜ +÷$»€ub»î +wk <sôS£ß‰÷MAn¯š#¼ž6ÇÝkH‰ž”fÃǸԃH¼TA¦t•VUµÕ°› b®²@)¬Å¶‰eØK ö†D˜¯“ðôb.n\ÄÁÍùÜPbj¨þßîu±µn@ãiÛÅf‡?Z_üõxÜçw»))J_›‘zUˆB]ªÁ;éÅ”ÖòŠªF2‹]Kð¤D…HHh‘ðð½R~DVMÐIÙD„IÔ‹™Äq‘9 ÈÔ@>¶ÔßdÎßz×ý ÉÝf¡ÍËîú¬ãóî0×û]1>“ç£F•é)Ò\d7KheR«¨UŠr:[Dáòx%2Q5I%euÊè¤aYI+£‘tÒJ’^ü%Ÿ(G- +q˜êôëJˆhMIîlÈÊm–£ðµ"YÄ+¦qªËÙ&‹WQ%‘+ë¤Å•mò¢ÊËòÂʲ¢ +”T®“Êõbs@±©¡ÂÖ¶‚º»@³ÓžEµËoûÜŸùº-Ð~b0üÌÕÞøð‹ê䤶挥2'‘ç—rÄ…•>•UÎepKªyÂB–B‚c^å3ûäX–VVÀÐIqUz1þ>7Ðþ±ˆí· +Ó?Õl·u©ëØö·ûíÏô?ovµÔßô9ªÑ†¸wŽD«†Î%HúS2ª{31ÈÂâö| +®µˆ†n)c!š˜5é*!/µQ)Hjì&ª†…I
AªÂ €Ë
|s +vŽ0™š†žÈÎÉ2`òRõüy=¹0^G/‰Öñɺz*T×N
Ók¨¡ã·©a#3åÐá™ +s +¨V¾»ºeùÌÝ
Ë´Ï÷¬œ?²¥sÎiŸê™Ç1ñß“¬ÇA¾Ô‡a„ñqèûÉI™w3ÓSY*v†œ5Ã(€Îð¡³õ„àY51讆toŠ4ý¨0xòQ‘9€ûírÐlµ|±ÓWÓ†uís‹¯^ïY§~m»³á•ãÑKwæ¿|NQ^ùáç#B‘óqÑés‰ç’æÒ“æi1s¸Ìˆ¹’ìÐ9ZnÐ0/GûÏ·`üæ{ò|ç®åùÎßÏó{úcn[:6-›º¶2vk-äò»oV´÷ZÔm-…FÇC£ûq²Ñ÷Þâƒ4F¥cÉÑqÆ´ø(cjÄ&†‹Rß•¥ž}ËLó{#Èð}£Èôù½9Ëû÷®,¯×W²Ï¼3¨, Sý«!×ÇVCúהּ}ؼªîþMüG¬è‹N‡K?z8à–üOæ.{—Âý`Ÿbc?ø[BD/b¢>býÿSç»P™àýoö9¯¿„°3)Î{þ©J<ý¾#Éã}Yw:W@F4« ÇWAZïY¦ +] +àÕzÜHûMQà´õxì¿Ýþ²ÇÂözAÔ¾“€ßïDkW p†¤ƒNÀ8t8‡@`s$¶Ç@fkèa;P±Ylµèöë€én "¿b
HäQƺˆê<v°R# 9÷ªžø;¹´’PNù@<G{w>ù¡…±Œoc.᮳cºÙ‹Ñ÷9Ñýܹè1î¯1“ܸ—ÜÑسþ?ö`
vë€5ˆ}w +È+¤³Ô÷ñ5ôwqŒåØ桽ˆ»ÁYˆéæ.Äôð棇x¯cÆy/q“¼1Â4o(v†7÷¿kHÆx®– õÞAûAn8ìx‘|Aœ +<A$°ÓñŸ“5ñ©y‰KiïªËÄFÖb\gÐÆ]ÀßàÍãn§¼yÀŸyÊŸÁMÆ Süḗü‡Äi9ÀÄXßÅd^Û
Ü™gìAãñ¾F/¸þS•°B3QßSJèËä*æbBgx‘7Û–ò–Ð)˜ÃßÎá +_áž‹&¢â”ðQüKQO”Ø`}¿˜vëAäl žÛ!˨OÛ*Ê2ã| v$ðS ŸØ™¤•d}Ò»¤"ÆRb%{TÏ›¿ÈŸ‹kÎÆÞÍâï‰ßà%S„1É(ñ…äqü¤¤7a2õù…Ô`c
,¬Aâø
(=¶æÔ =ºH'P¼AI#DB§”Ò–6i™^À\¤–sçÉuü¹„‹ÂYb»øMìÔׄ^éaTúŒ8.}œð"‡4Ü!OÈnQÆe]f|i`Yi'¾l÷m㻌Á¶`w=ÎÔ A ¤‡Dxø÷"„´ÈSÑÞ²L¬7ôRÞ+jp†Ü$y™ð“t2¾3m‚x#>‘õ“Æe=ä1ùíıô.êóŒŽ$ó€³{5p°¹Ã× qÝ +&+ȶü0È‹9 †ø€55l eãæÔ„ßÄJÚtJ{’UÈK®?Mj>¡´"ƒäkò>ÒíŒG¤>EOâsE7åÚ™ôý+í©ò2Ý<àb
)‡×ƒâØ×ãòä{ÅA¡øÌ1(Šrû˜ë·hH<=«fDÏ ÂøH:í™XÃNÉô±KS2jd¿Ðš2îSBïQº”w)½™ÝÔÑÌë´‘¬6úHV+c$«‰ið°í:ÈÄþÕFç-Pä½Ê¬¡,ÔþSY„Ër Þg¶€2m¤GŽkøq#(BíC²8Äzáý”Bé]NEz7³½•Ü’ÕI¿¦ºN¿£î ©/3†ÕÍÌau#kX]Ëy¢2x»VƒèÐ:ȶßyΛ¡Ôk”ŸÚ•Á‡?T†9¾ˆ>ùk1`¢0)쉑Kx¤’P{ +Î]D#ú›Ø„t +J2:xÕ™íœ&ÕV›¦•ù³ö"ó_ºóìëê8CÚj7¬1R°ÉÁuØÓ² +œ6ÁYÏPå»÷sM ÍÒ¹½>÷×Éj‚ïèYÊéÇù,BOŽz;[ÆéRd‰:½¬MR h–g7óë5¼V]=÷†¾–{__ÍЗósʃºbÁÖàc
ÒkA‡í½ENßBv?k¼÷|¬ó?0ßj7Óá8ÞH89PE +í-aàoç¦Poꤜ«Y¨ø²B#k–å¢
©¥ÙçÄ5Ú*a³¾\pÕP&¸k,ö +Eú|ñ€>O<¨3çKb½ôXC‰ãŸ¡Êm+Ôyî~Þoß›æ`›©–°££b<Ö&„ü£œŽ»UÈ¥\5Š9—´é¢¦¬lY€VÉ‹TgÓ*uÅ©ç
’6cž¤ÛdJí3¥ýFƒt@Ÿ“6˜cv®ùþµ`°Åö^GK¨qÝ;—š}¬^] +´žh;c;ØåÞÛHé®NÂ]/eS®äÙˆ¨V«”UfëÐRe¾ª ã¬Î$¯7èe—MZYW®Fþ0W-ï3ªåý•|@oΗ†lÇ1a
ØœªuÞü©ÉmÛü%¯]ÓíþVÏ;B=ºévïB\pW-%¦½‚™Ø\Ìg×åKE•R¢S£y*“ÊUªÓ(ϲѓíÌEÑ_0}&í7¢Š½9 ÄÐÖ@žÍŸ +›SõŽß®\tùn¶ÍcûÔu¿O:ƒ>hpý{+!èZ#9úRM2¹¡œÇª*KòåHž)ÍÑT*m‘N©®6¤«šM2ÕµÜ4Õý\DÕgB²û²¬½9_2÷®›?Bõñ
pÞÁòÝ%ÇM¿u¸mžøÙwËÀ€ÿ¼îÒuØÖLŠºÐ@#ÕÔp˜¥åBA^ ’–S¨Tü—Ï:§:ßã8þ³·iQªi£mŠŠlY"ŽÝYÇYœÅ9Ž}Ï^ãPd9(RÒ6¡Å ê–D©)L¥í†I3ƒ %Í8‡îÜ)Ûûž¿îüñüûóúãóø|¿'r2$E9)yçó¥Wâro•¶?(}S—Ó‘ŸÕ)
âÖ© CO§¶ÏÇ¥]‹ðãî%c7M–5Y,íi±Yñê!iËãF²yÃ-_RM-Ï»¢RÌ?{9,¤èRlŒô|RRF©$5õtÖÑäâYqE¥ÒèÂËù…7Â)¼É<Þ‘×)
â
Y4P¢¸SFš“5;Êî/x´W³û©åòg-ŽÍÍ^f7ï2œ®ÝâÒ.ÔŠ¸ÅU!AyW££2*R/}8éBfzì¹üc¥%9¡gÊ¥AgjóÄ¥:ó‚NwJC‹ºrgƒECîzuœÛ6W·ÏûzsëüáæmsûÚw©¿~a®ÝòäÀ¦†Ç¦5ÍôeJÉmNÁ qæõȈԪ¸¸Äk‡Rb®‘„WH•Ÿ:&*»”í_V“Ë/»ŸË+ÿwŽÿÅ_rDgßfÏIkU¯«†‹[4Pe 1vGO}°MOµ»Ó@íÙ›½K›_Øo¼ùÔmÏ•Úþ³Yž'î ˜Yw…’úðÐÄÅFÇÜHN«M?x=Gâ_sò·úb§º:“Uݔɬy•É®|—ɘ¯RA‘b/+ôÕ¦êtUÿ|¸J¥÷Í +¥W¿mR}Üm²øN§ÝúªW®ÆÛ)6'Ÿøºå´ð|Òð’„ŠcîÇ„…6%ňÓâw³“ýŠ3ï\HeÜ©’Ð%Þw_Jè·{Òµ¿§1®ÏGV(£d2*uTþnÐVîy¾€xÕ«E´ôé«5öš.¬ýÝvmy·³áéN²¥ô5ƒ”þÒ’Ü.bÆ<á‡>‰üœÊo“DrZ³c}[‹âè-¨U‰”ÖÆ$rÛËDòãþ$jÓû”Ù {™.¬TBí2¥·æ/^Ï#.SjПS3°giù{Ý’>'ÃüOó£¿Ñ’ßqÜbº…´Ð_B˜]Ñ\~g¢Ý‘&ftä{wœ£t\÷ꨎðèlŠtïzáÞ9éÑþ)z68±D W–oæÏZç?uÎ#ꇗ«T
,¸ôiÏÊÓCÖzÒNFé<,’iöQL— ¾—°?ЛÛéËìO`ÓûS¹Ôþ,W¡Ð}àœÈuàšØeð¶Øy°ULúÐ+véûSìÒ;3œÕ$~S'žÞÓ šŸj·ÞÍ#*eß©]”o^T,7Y+·ÑO“;'Ê=Ì#e4Û@Ó‘/ã¹rdbO†,œB“ô&ËùxÈúºÊóY¤Ñ¶ãh™ŸÃØu®ýX#wÿ—vžÝ— +C3ê¹¢L<»FÜ{¨FÜx©A\ÖT:÷Ï¢¯Û´²¿š®‘|³ÕO'íŒw7Sxã[Ö×>!r¢L„:{NF»ºN&º“&%ž¦²ÉöS…»é³T›éË´}P<4ÓMt«éç +/fô¢V™¸wW•¨kS%*º4ˆÒ©ÅÊÇ¡;÷µRa¾:6Ãp`«®F~ ›0àcFÇÒþÖn´uF¸#ÚÛ#ÅÁG÷!×É +E$Kœs¶@…‹9ª]ÍÐ0«û·”‰ÚÊDùâT‘eÊØ8çv,ŽÉÊ`X`¿¤ÍÞðØîÚN70Iàî> +¬WSà ã—
$xé9À[ßLkp·XB¸ÕAÛ̾ݱ†{´c7$;ŸC#äí@±±!ÎïšMùOŠù/ âX/A¤bÒAh)c¥Š +ãEî0Ó"ÁZÛ+làò<W™ƒºz/kLÀ^»üuÆé!Xw"u
·~R6lEÚÆÍ8¶Ñ +…¿'jïp1ÿƘ0oÐE¸×¨*ü«¨Fⲓ<‹è£Ì ~¥L!f(#Q¿Q‡P/iý1sôkè9ú•Ø9†= nÀmqœíŸ©ÿbø5Ð_4!Û€ú¼?PÄìÿ(Æ}ÏcžyËJMKB¾$¥¡gãsâf°ü³Ø2ÒdLeÕNµE÷ÒF£ïÓ£žÑc~cÜDϲº1³¬ìvKœ} +Q§˜o\J¸˜hæ”KóÙ²ÖU¹‘}_žÉ“¸6HϵIÓ¹ã{ +lLjüÉwxÇѬwÆížÀòÝ‚Å{ÿ«"ÐûYMв֞\;TêwÓ}°Ë„nʦDÖ¤³cËtB¢5YN7)S¸92½ Cš'NÃE¢EŠ¨C™,PªGI‰£ò¤Ä1YR¢
²PàÑJ [ïr¿¬»çÿYöý¹š}‹'}ùKý±5Uçvö” ´Y°§/ç‘Ηg1cé|‚I'¥SÔCRšà‚Â(N‘Yd*¨R!‡Z•2¨_Éž*!hTAc2™ÔÙ¨pƒx¹3H]çò}=@‘ŸçÛÊ]ó_ÔïY0Ö¸è^ÓÑÕ}µgwt•#cOU™ E¹ttAVÁ¨Óô©JŽN«¨S²ÄrµY&U•+UÍJ¡ê†Jô¾ŽÊEÊ1™Haƒì´UÎ@ú5¼÷ÂóiÞêþ¿Òí¯kwxN·ìö|Ò¹Çk°5ÈçzCÈö¶êóûëÊÐ'KñáÍÔ˜œ<^Ÿ-¢j3äì$½†/K5ˆu&ˆ¯-Qp5
J¶æš’Qr4£rnò˜,AmƒìŒ•Î@7dÀïìK[Ü>TluÙ°Õ}¢s‡ûëþoýtxÕ•–`ߦËû*«P'¬¥¸°¼B2Êp‘¯5 (ª\ˆÕ<afº(Á+eé‹ät}‚ªïVR´ôQ9#uLÆÔÙ { +§OU+æÚ¼Gû½†î®r꽳ݳÿÒšÇ7õüèŸÛy(½¬n‰€)(A=Ç®’¨52:¡ZÃÆVf$ +Ì‚èŠJ²¢]„¨¼#Š¬˜EO‰PÖ)¡=@ò…Ð/qÖ¯ßÕ/qxÜãépoÈÓ¡ÿÞrÇΟ}=ê¼KŽ®+èñ3ôF¦ô NȺãÎ :ÉVMiçãð Ó’LC5˜ˆævDS7¬©Ú< +È*›¬²dý’/ûFI¡ +¢ÖâÂŒbÖ#ngT-.uGÜ·ºÎ0µn€ +£BŠ€„ +eq¤åqýu1ÛSÀÛË +c‚rY3aÒaH@FVÒ–ECþm<$›’ ü1Ôn&xÙ k¹àž&Áiàƒ}ƒV3æëêš#¬~Á +ä›™üÄhÂÃÔ'ê¸à#¿NôwY<LÞ[ȧ’ò¤ì—¼¥Ì’vÁ ô±È"k[ä6ü™A>ŸŸ3ò‚Çaù¢)X‘<Åä,“úa©&Fc42‹Q–ò)mkD±’í¦,’B³øgñ€ð´¤_Ð íÜ’½£ZäÝT§ü OÖ.Pü&6+%ƒª_eÕ- Ÿã +‚Ô Ò›R éÉ—’ ÐIh’ +8ÙáïæLAöȲ5ƒ…Ç,á2§õ_*\7ÿ»Â{û|ùŽ³%a?<Ë=õˆ?ÿ
òJI
¾ÃäEޢĨȥ˜¢Û…oÄwà:ˆØäfì0E¦4à(²¤7”*ü²„°HÅÿw #•jcç\ —Ø[À•§¾Y’ºX-TylýÊ×fº"Øn¢(êäƒ<¬Û=Å·?|#åjd7+'æT”ÐJÀ5‘k‰Är¡‡ZC¸K«&<¦K‰:Z%IO‘¨¥ä7Ù8é+ê6¤9‘³(8°.?b¾\å°úì̺ù:·M/ê¼·ý,
°Õ”]r`\ûsH¾×3A]iœÈ¶+üØ&vAB£,IF¯"I©rj%¥‹^N€Ê(ãP)õ5TLÕÑ…4=M@[ ~̦#½™¾Ãî3…+™}‘·Xlp\óJá¼~ZîþÝ#™ÿÁ‘ʈ꒸sªB<º+‡Ôš™)¿šSËÉM¨J)ÆW²Å¤2f=µê€P£ +”0"Ĺ©1eY¼af>?½ŒœVMËä63®rz™\Î?YîBËàr´—££s9zš!p2;iÎk#¸|·ñrÝ“ß[þaò[×!Óg=Ç,Æ®¹l¹×‚Þw³1øXWÍeçf Æ«VDÓÃË)ÑÂütL^Nn?«„”ΓÒ8™rFJF7‹q—ÅÊxŠ˜g°3´PrºŽž|UO3& ³S¿5‚ó·¢`±Ñ—ƽÆúŽ}Æ/®0~¬²_5ªtÞ<Ðá³··9ðh[C䙆šxO©$É_TN
–²£r‹Ò0<AvRZ¾t%OLcå4@Pv'“–fQr³¨9Z-KÑù::Ä×ÓIÈ=¤mBÁ‚Í(¸j;j©y—ÑkåNÔômÔxßó¡ëg¾íSzíél8¢hŠ8]ÓëQ.Ãù «È¡¹bæåÌrN<·ŒK..$2ŠÊ©TATØÁÀö3“Z¡@‘òô4R®a09ƒ+\Œì!ÛŠzÛnzycøY½
õ ÿ™ºÏɪ÷ºÇîVåÅÃuíaŽâ–èóÅòÄyõÄàLɾ˖d$Ò+óñäŠ22^$£%ŠÚ LY/C¼¦'”êiØ"=+4†¬÷¸‹6‚?€^¹ürnj߳F
ݵ[Ù§>µ¡ó–»\åg'í9YÚåšßŽAóZð-œÕ˜M«¿O¬ÍÁád%LM59¦º…U}ƒv¹ú!â5Jº@©X Ä–¿1f¯GÁyëP°døв<S÷Vû#›ÁÀðAÓž!‡u̓nÛeý¾¶¢¾àãªKÎüž8/NWÒEÖ5JµIhãÆ$¶dcâš‹°QMR|¤¢‰¦P‘B›F/‰¡òEbD-BfÌY‹‚…kÁ'Ùj0uÍŒ÷™ƒÑa3pG³¨4ûLÚÿ¦~ÄźrÈg¿`0ðh–:‰{;ö<«ëC½IòÇ«! ×9‘1=üèKݸ°nIB°R‘¨ìÅtßGÌaý»ÞáÛÞâ‚Z
ƒ3× +úM@ϘhŸZ
Ùi$:d^üÔicÎ÷iý°&Cì)Q'q㘳ñ?Ü¢~‚¼"Æ® C4<¿ +ûËcKà_¾Ûüà >pÄ.O8öûó0vï9˜´ßf<
smOÁÙvÿc»ÎÃbÞ÷8€fZˆpµ(%-Ú$TÔ,ÍÚ,5ÓìK3Í4íëHDuQ¤P"KÙ—déZN<¸9–ÇÅå\—ãv²updi“ä}Ïý{žïóú>¿ç÷Ïçýûþþù¾Q㊆€œ– `´á>á7«ZN‘HM‰ùí$RåC©¸Ã†´ãGdaªî”øÙ+2Z‚ˆ±BÐ'pÁ™Ä‚p2ñS£ š¾úáHr]ŒŒ™¡°Ì +Áj· ¬›€yhðôCÓ_œšãƒK^Þh³êàybþ5bþ=©è‰´lО”†±#p¶QÁ•,Á[üí8XàG*èc–‚íÁ¸E_ +bƒí u€:Ò ZŽ34b(µ¥ø@¼, +À{*DÌ¿Dà[‘!Þ‡·-Ló쑾h²h‘Å›ôøÙHÖú 1%:Kè°º8|H±!rPº…6 ÙÉèïcöÆa‰=Íù,ºÀý(¼Îëþ“÷^ø‚×%ìæ½~åwÇBx/¢[bëëE†Ü‹=!ÕÏ9¡£a‰š +Ñ;óæÚ¢0xŠÃÇ¡„á<TãÚ[(ñìÎ×Ì{›“ò*#7ü”UÔßMk™OUÜGº:þÍnÑ=uSÜ]å É-ÅyéMÅ5Y»â¾ìšâüŠ¢GqI9¤8§R6k†”'4C +k %º•èœ„åD×+t@Ùâ1Ãë¨ûÖr¦w—ƺwVútƒÏË{”¹œz?µ„u7iC̯ÆÑ?õâë ñWµ‡åmšÓŠKšËªê[êVõ곚êfí æ˜nPs8aPݤ·râL®dä½³ÈSæo
¡Ž_+—ŽÿXÉœüçzkg™lΊôA +RÃîäåÑÚ³V±¯¥—ñÛR6Æ^JÚÿwcƒü\â~åýqusB«ödÂ
Ýñ„'º#ú÷ºCúݾÄÝ^ã€n·ñ«Ö¨fÙ ™è{¢ëÌ&c½¯íð¦‘=ÕáNïªé_læN{Z!ñ¼¿Fx«Èv½ ‹Öf)`_È)œË\×’¶Yz*e»ò¸y¯úˆé°î ±EÀxÅ°ÏxßÐhì2ì1õv&õéëÍý uÉÖA3Ó©Ól°œÈQêfƒJoÊ`MýÇÚEŽoê"Ç=ßÆšü°*ÖãözUÀµ5ÆÅ—‹Ò©+,ì–e«'sËÄG³*e3¶ªö§5hS$ìN>™Ø|Ѹ#ùŽi{òKcmJqkjobMZŸ¡:Oo
tÄ÷gw%Ñ;×yª¼È}µþ¶ïw,pèÜ>ú·zºóÝB÷›äþ¿”ë/M¡6å°\!8´¼D¼ß²^¾7§ZÕU¯«ÏüÙP›q̸%½5©:½=iszGRUÆgÓÆÌcefobEf¯Áâ +bƒ,g¬":ïz×ÄÕÃæË_Jמ Ûç¡#ì¢Nº¹ïv¥F:¯u£náérsÔ±ÒLvSQ¾ ±pµxWÁZy}þ&õ6K®&w¡*ç°©2û¬yCöõäòìgæu9ÝIër¿˜ÖæöËr{A"ñrˆ¾YLtÞŠ#¾os³éÞåeórŸùÉ`‡»{£&^ßÉ›u±6ÞïLµfáñJSdSy:«qM¿¡¤P\·ºT¶ee…ºª`KBE~Cbù²¦¤2Ëis©åjr‰åqòÿؤϷ&Ó, +ãö"g«f(š`¾’–*`ŠžTÝ=ª»ðœš.În×Áe‘ä4.ýÛ +†ðÇÍà‰ò„3ªö¨)fº”½hH1E3ªZQõÑN|:‰ë »¸6úоÃ@š&†ÓÔ1FB
“$T0®ŒùtE,£+`¤¶HÊc‡HèdHA'S*z|,hègKÇ +|5;ÀGk¤:{ðnq +Ÿ, +(wúĬÁMÒ›\?ÐÚñþ'÷¾ó?ëö–zÙí
uðš:Lów¥~v¡Î{SÀó‘?xýJ¯;ôoe;ºêºÔ5C¶B„ý"ˆÁ/ƒoSˆ¢¯ŸlþKlñYk3)N¶Ÿd;¾åáÆ9•®¯Øuøÿ´ºtž3{ÜŸ1þN|ʸIü/ã‰ÇïŒWŸ¼ÐçI÷èàs‹ >@þe@³Ð>ê™AængkJ—¥ ôX©ÛO]û%–³i2BúÓŸ¡‘Ö¯eìǤ鎣◧Â2üøÕ„!nñ §Ýó1»Ûë!«Ïûk€tõÀçkÌçkÒ÷:Kç7ÀJ?(}\ œ[ +h¯eó-/©ƒìú’#{(ܺɞq™äö
¥5ªŒ~4¢& A~”]ÞÉ ;˯ +»&¨hÃ'ø‡Ãçøeòy^©|ž[ñ-¬ÓƒHÔ7“PïÌ\¯§ÓlÒ›(Ý¢÷¢ÂJÿÊ]‹î•»w£ˆºár>×¢/Kj{FîÜ•·÷XR¢gk‚šÜ´?—ZWL¯‰©dUE7p´QÇøå‘=Â’È_DÅ‘E…Qo……Q3‚CÑ:~A´ŽW=ÿ
¢ü1¨ï%£Þ™³û«höF»IïiÍV½ÖØ
Vº™\-ó[¡ýSO¾xgWV¨S{zôÞæT¥gƒ*•|$1‹Z•pˆqXq˜U_Ë-ŠkhbO‰òc/‰scˆsâ^‹r⦅Ùñs‚ìx!„Þ!n꽫QßZƒM•}½üy6Tÿv¿n§áõjüŠþ +òºÞÒ€'…;ŽåË›³#ñõû=ªÓT>)éÔ2U>£(±”¥I¨ææ*›ÙŠ.Q†â¢$]qW¢V¾«•S¢4åœá§)u߀`”_vP¯Â@cŠMjM±çµ¦Øã¦õØ`£áÕ:×åç«IkOk[Ž— +lZ +÷í®Ï—ï©Î‰#j3I%éi”Ci¹ô¼ÔbVvr/]Õ$8˜Ô)NI</Q%JTIc•ê³H•4+T%Í þ× ½CÂJ2‘¢•ØD• 6Ò¸{в»Ñlep©·¬·Öëû®ŸiæmZžuC©Ô¡º(ÌU«‰!–ä%49©”ÜÌ,zfF!+M]ÁMNk$ì'¤ž“(Ro"£ÅÁ"ÅÁY¡2uN°£$~‡AŽ ö©t6td)ö¨yv·ÍhÛfp¾ÅyééFO³cµþ›Vs¬ŽTHvU”‡¸””D¹k +Þ9šd¿ôüZj®& )û07!«NŸÙ.ŠÍè•Dg\—DgŽ “¢èÌYaLúœ v¹ýGò–c£ZcìqÝì^ëìf‡)v©ÃB¿·ÝqɉâêÖ&Êuu¬m•5"ûÒ*N£pË.÷J/MòM)Vû'æ1šRNlÁ~T~›PžwF–7€#ïEáy³ByÎœ +®U†Q¬£P°È ( +n Å
PÄ
µî#¨ŽöŒÆZ§*‚K•MžyOçNzñ;ßåÿùÞåâÕºTÔÄxl¯6yo©š°q×Bi~ÅWŠ5å+Ôy;ÖÍÎ)-4,Ý^»h[E|fI)£øxÒœâöä9Å?“ï[bØ”Q4’˜±u,̱,°„§%4xPÉ„ÛµL¸RÏ„¶ã6pê„¥þ˜³æ{é„ÊzµSÙ{ëÁaamš_þ¾ÌàÕ{—Ês«–«²w¯ÕfUnˆ\ð¢èŒåÆôûãSÊ“Ë/˜’Êÿ•˜TÞ“˜ôݧ„”²Ñø”Ò±0Ïú6ÑáQ
þ¹‡AÞž8×H‡¦&+hhq¡h2ªNÛì8¡r(jŒr+lˆãåקŠV™¸üP–tÙÁÅâÚÕá™5söm‰LÞa0UWÇ&ìm0Æí=gÜ{Ÿè6÷ãv£1n×X¸† ϶ܫ ’{@ƒóõ4h:A†Vl›{Úx´ò³ã‹Ï(&njÑM]ßë±êd²ðëãs}—[$^ؘ-×°24ýh¾*¹~³6¡®Lg¬Ûsä¨ÞP×fÐ×uôGºQ‡Q‡Ð ?8ÖPÀ£m +T^e@é PtËRxˇ±î¦ÄzÅð‰Ù×õ΋¯%LŸÿC7ýj¦ ùÊRŸ„˹~ÆËë
훂#Û·KuíU2M{\ÝÞÞ~—x%W]ìW(/`˜ò<*¿ôï€ëU +8ÁÚ|Zîƒ Ö²ûa¶ïÏž”qÏè”Ú™2ÍÔ9בÅéXÎêøÆK×Q(Òvló
ïØí¯ì¨ëh
TtÞ
Pt¼ +½Û$¿3,»ƒcÜ® +aÈPÁ” ÆBŒzV +¨<Q=0€ÊƪÊi®¨¢¹`Í
4L OÂtº=.¦Ûa.ÃÿÊ°Á"¢œaÕDíìCE©ˆ†Š™4TùÓQÂDU8Ãc¬P™f‡Š¬É([åˆÒ
.RìŠÁn(®žŽA‡ØÔÀÆÀSîxÖÛÉX·9ðøxGr09£Äçÿã¢ç—þ˜AæCú„Ú—ŽZ1µJj
Ö¨I±Gբɖç„ò‚©8«hJ¿›Ž’*²µî\ïÁ'8(>M\ä¢øñ£'ŠŸo<GÅžÃâQî§`䊑Gðûÿ†BÒ't>tŒb`”‚…‘‘Ö8ÛdÚLTíŒÊõ®¨ø;YúR6Ê*ÝqÖ~œu˜ƒÒF.J›=QrŽ‡’ˆNÞ¨äþ°¤›?(éãõKGy½Rä” àƒ…ï$èõ%”zQQÅ£¢ŽGC½Ž1þŒ•±0VgÑñö•á€º¯œQ»f†Î@e‰;†íä b/CxbèQÞ¨ü$DÞ*ø,¿,’ßÈûä]Âß彂wòá9zõÈЧ[†¢—ò±0”OE-‡Šz
cÉ ¾L”Z`¢Æ +ãcì16Í£³\0j…ê +Ø#ÚœaM™çzo0|?@uDЧjö*[¼>*/x}PÞô~¯|èÝ£|éÝ¥úèõBùYôß0œù<}Ÿ…¡ßc%ú •\*ÎfS1–¼wM\¦’ýH¶Àt¥¦èíÐdrÏtŠÍqˆþƽ7j÷Cd ï½n§à]į7¼{´G}^kNútiÚD/5×D/4D¿j=Õ|ðýfØÿ‘~Rcà5ÝýÛuÕÔ™ÇqüIDÅQ‹¸âŠˆÈ¾CHrsH Ä’ + +#x Z¤Ê´êiëÒZëÔ±u´ÕZÛ>sûxñ9ç¾|Îïß|ƒ–ƒûñŠµnø.<ŒÙo +àilƒ8¬÷¸Ø;2- +^S3R2Y db`Ýû‡Ô<)2÷µkÀÝjcp³~#˜ªß‡©µ7¬òÚÐ]NÜÖ¢ Ù]_B?TUo«-à8”(x.…r‘‡"'×'GZ-ÑEY
ˆ@܉òÅC4žhš–.þó35]üš.†ž"KÁlƒð:×|£2å«Á\Ý0£7ãú=¸¡F;£¾:õmÕ‹Æ +Ú®ê²ÈƒZuì±û¤²(Í9O™é!Í—údå)2åeAüœ:rš¬åÊ.R“¥S4Žì>æ5YöM–AJŠ"KA¶ €Â5à©î©
Áí*#p£ÑL6¯#-»pͶ†z7Ó¦ú +n˜ +®\÷+‚k—{'à«B +× ‘Z×À‘V7á«n7áË÷ìÅïp;¾ƒ¬8¿á]~QB–‡™úiÈ8êŠc>H7Æ'´ã""zBJ*'T¤ü–"}k „CŠ]dRƒ!—EöBXd/€•4øÂß8p¡Ü‘Ž~pÖ‘
ÍŽ,xðžñÜx¡5—qþuœoC(ç'u"4cŒŠ´à‚¢Á)…d $L„‚„‚ÄË.9t¤?$’\0Qü ›Â‚ŠÌ·£C™|nç ›©ðÕPÝ «}Ïfü>Çù×Þågµ#”Ð…f + +WÞ(Ï +ÌWR`H€ýR~“ç«E$ÄbºP +èev0CK‘q'й@Ì7ˆþ«'¨þæ
Ê-ˆÜîŠr\Ã>&ȳ@~«aƒüÖÌ—ÛØ£òö+ù +<<©r€ûU˜Ûò`³E)Õz®ì¤ÃLiâîÅ,·a>Ûc €çÕË)õëÌ“´å*‚u9‚6»¨Éˆ¬Ïœ ×e^£*3W¨ŠÌuZMÖ?©ÕY¿Pª³2Š´r}ÿìm€ð¬àobøZfkÕVðPaå~ÌRM é|%Qz|Ǹ$~÷(ŵO˜íÞ%ànãûê +%ZnU°šSOP嵕¹½¤jö8¥’=G«`ß¡ËØ_Ò¥¹¯hÒÜŸ)Ò<„üÒfA®%¼˜Ãz¹)¬UšÃ#¥%Ü«³ƒe•f¡îˆÉeE䶉ª˜íò3»úÊ.â÷ÖÒ¼ÃMB¾¯Z Pñ+‚•¼Ú°ê¦9·›$åŽP%œ+´2Î-ºˆ³%âþ&âþDqŠ¨ +BV–˜®ì&¥*Æ)LÅU*CqÆP|CeÔü›Â¬AÈ¿!m†p +oá€s¹+» kå †µ„c®L“V¢-ãïÆáãî&Ûž¼Ë²?f`;Dx;£e»¨†jg²A»'Òз—h˜v 7|âfø½køg/] ·ÿëzÙ¿Õ¯{x¥`ÝÁ®) +Avd“¸à‚qÇÚ£cÕâR·¡BQ,r° î€V+Å]ZÆ¥Öâˆ+‚ È&•g.gúA8ýð;ç~ûß÷Þçýp+Y²'õ,YÇU–GGËãñ;–´}„-mÿhö©Cc3X
°ó$Àrþ+Ï“~éß +ÅÀlŠÂ¥àzb'±¨&jÆA©'…^R +½¥4TxÑP®¤£—†ŽžQôHÕGÉ</c¢hºm6F·Ý&èVjŠÂrâ +µlž&š‰âñœèe +‡Ù#nÈ#DÎÐÿ™ +e¤¯SèëNC¥áCCß@:*"è=S½æ ,ߥkŒPºÉ%;LQRÌB÷ýlt¯$jÌÐý„Šˆs_%nsFÅœ÷ÎûÙ€ÍÞ»£9ÁísG^Ÿx<”“¾RH¡?1YLÃ)Þ„šŽþÓõÐ/A}u¨øܽW™ ×W¦èµ…žElôÜk†²”UGÉ·Ô›ÊΘ”]2‘ÝàÉþkÞ/ë6ë9hÞã‰Ü72´è–!¿K†–¡ÏXß™B51UHC'áOÇÀªcõqJ:ý¡ß2ST®e¡o¡ÙGŸœ?}ŠÍ?(ös‡•Ü!E
oPq’7 hä½W4óú¼^Å#^·â5ï•Ï€ÅZ>W ÕSo<U u‡÷x¨ëO¢Pã@aY‡’¹%3¡ÆÀàH}Ô$31p®ñÈÔŬá€ÕfS6pÞOÞÆíó/â½õ/åõªX¼QUñ»UÇø]ªSüNÕ9þ+Uÿ…ê!¿Ã¿“ÿXÕoÕ¦Bë‡~hûÀíîwýÐþS8e¬oKúÖFu”ˆÂhrQÕÿ0=ž9 Í2~œÃê ZÎéÒ¬åvN+ä½Üañ|j1ÿÙÔ2Ëu¥Õõa«Çê:«võYA›úŠà¡ú¾õ]õ+ëßÔýv×Õ£8é× +ÈlÆûÑg齎bvE¦¿Ïf?›¾˜ó$t5¯=ä+~[ðVË?>Û-¸Tj}'¨Ü润Êö–æ¸Ý
M£ýuÍyûVÍM‡– g—ƒú/hF›5èÒDœÓ ëDdEa0–˜$ +æÊ©ßgêý[at5#‰}!UgÑ”¼Pp6i‰íé„Õ
ñëêã6»ÔÆ-‹)‰>$©‰®“VG7yTE_—UF?—UÄôËÊcPö=±LìxIÚ ¦€dsØ0<Ÿ¯Z@{Ž-ÜΑR¿.˜Â¸œjøóì8ö]ºECF¶ .-×îDÊ +Ç£É_:NÚ ¬NÜ&ú!¡È½2~Ÿ´"¾RVwÌsÜ^ûâZä¥qOä%ñïäÅñ(ß“€òoÐk"Œ!ídc@1ŒÌ3ÞE¦ð4—wóøкXD]Êõcœ[lظ †]—lq|ö,ëú…öÕ™ùŽ3 +\+ÒÖ¹•§º—¥ìîM.‘}7ó€×ž¤ÃÞEIÿRìNºì³+©ÍgÇÌ^Ÿí3?*¾IÆ1Þ„üS8ÄÌ!9&¼Î1€¶<&Ü_b7–ráÊ2Wªi©½1_ìÍdÍIäUÏÏTfgÛ˜“ëT6k¹ë^ÝQIæÉ·Û<þ™^äµ3Ì{{j•Ï¶Ô:ß-©ç•…©w•_§u+7¥ønJGŸé¨˜ãÈ=èCÿ<´çÒáÎR}¸¹ÂZVr y•œ^)§×.ŸjpdI«*/ŽWñyš`ÿÂÙv¥ósœŠç-q-š[ Ú5gdû¬BÙVÝ.¯ÍY¥ŠMY•¾2O(×g6©þ‘yKµ.«ÓomÖåZú>a"“Ü^.ø#ŸNúzðK\ü‚
g×8@ýž´£U+´¦Ëb¹eùÉV%y:»¢Eówåä¹n_°B´uþÿÈ.Ϩ¨Î<ÿîÌPDš ½H)#LQA£, " t¤ÃІFpFš ‚RDŠŠ *‚1XÝQp]÷¸fƒ%'nìf‹‰=Gß}ýæÃsîÇçþÛ=÷WâR™¤à*êxåñ-^òønAIÜ°8î¼·4î†wQüSQQü;aQPø_B6ª€Ä1xüCÂÂTßÉT0^ª…¯Ë,p¢Ì•Õ_âÚ-]©ÙQ¬×šnÜ”m^Ÿ`U“™fW™žë¤H+v)Oà–m«áÉRš½Š’»I¢¼¤³Þ’¤)ŸÜ¤ÇÞ¹ÉoE¹ÉD˜›BþLH$oA÷€æ26.Ê98»]æ¨pfõnªt–.ŸÛ*[;¯©h½Q]Á&³ê¼8+eî6»òœlDz¬BY¦œ[”QÅ+Hoò’¤u²SûE™©g|2R¯ù¤§>ôÉH{-ÊH#BŠàKÈ&àE20\—ß–±p¾‚QÅ)qXéÄt)ø*û+ü4öÈWëÖ•†VË"ÍÒ¶&Û–äg:Jóò$¥\IîN^vNƒWFv» -ëˆh[ÖiŸ”¬ Ÿä¬Q^‰R²ˆ"ø<LnÑÜyµø3ýí:£dp¢R
ýÕ讶gÚ«<9Í;—ΩW¬Ò©.1PÈ7šÊËb,e%‰6EÅéyR‰sN‘Ì-³PážVPï™’¿_”wH” ñŽ“\ö‰“üDùM/!BŠàKH,ðSC!pYœW#4{
ԲѻKu¶LË.wvC¯zMu€¶¢2X_®Ü`,Û±Ù¢°"ÞZ²=Õ>Kž³0½T꺤bQ’¬Ö#¾¸•¿UÚ+Œ‘‹¢¥ñÞ,½ï-})Š.ú$Œ)" +&¯€{ÙÀd1pqð5õ¯£¹k7ÐÙ¨‹Ö&+46rÙ5
ÞjŠúšò:±^qí:£üê(³œªX«Ì)¶©Ê,ÇdE¡Kü9wkE5/º¼ÙsÓönA¤ü„p£ü¢h£ü}þOQöQQFø_ò,…ÞÕ2ÚƒJàõ÷Óüw ™fÏm4¶š£¶Õ…¥lªÈ›ý5¤{Vëæ5…d7D˜¤ïÞb‘RŸd¸+Ã>¶6Ï)¦¦ÔuSu墈ª&Þ†Ê.Ïu•Cü°Êq~hå÷üÐÿá‡)÷ +S’ÏxÎägz“7è.^ú܃Zàõ÷ìZiÜÝ>5ÆPt:2e^iûRuIÛ*¬ýÒKÝn”Ôm¿7ÞrKsªÍæ=¹ö‘M2§
J—°ÆnHC§{pà OÜpÁCÜpËC¼ûßâúâ:ÂïšÍ=zW?÷ +¦þÃ-4ûµ
]@e*Ê{磤ϖ)ìsgçö.VÍèY97¥[¬“pp½þÖ®(£è±f‘)–áÙÖë:¤v!í;ƒÚê®ikwýªí¨ÛªýçÜÛnºî{áØúžØBþÀßé.^RÐÔÓ=¤õlöRMPz”æ¿A]H-‘uÌ•IrýÕbVÏ>ªu4BcÿÃuG’LBŽdš.X°æP¹õW‡vÙÚï°¢¯ßqyß7Nþ}7ý{Ÿ;úõ¼sòë&ýÎæíÁ9:ƒtþ½´þ}ºC@Å +dŸ.‘W€à)6nªcémm,¹m +ßï°øŸ<xÿ°¢é +¬¸ÅÀgZü‡Zð|hÞC+¸?r÷±'ÜûÂåÉJ8?3NO×3ŽO£ûgÉ,Ûg–Íór–ÕóFö‚Ýl‹§Øæ¿LP°Íž¿d›={?‹6ºÿu´ÿòÓ@îõGýS€ø&àÝ=`Áí¥\^êÃéWs8üj»ß\`óÊÖ¯¼±àµ?,^¯†Ù›P˜¼bŒÞ&2ïr™ùïËý÷MŒÞ‡Ö¼#,Ý߯PîSžÍb÷ PNë—Pí}$}í-Àoàÿ¸þ8¼ì>iÀšèb1„91‡ ±q‚áBŸð¡G|¡KV@›ˆ¡EÂ1—ÄaÉ‚:‘3j¤Q!9N¹À°ÉÄ,vP>õ'SÔߨŸÖ¾ŒÖîù +Š(‚
P눕¢Ï±´Úê+•ê‡§€â +8b¯µ3þ7*ðý5€®3â5Á.ClU4°-¥§B8Û°::pöaÍØQpÚ±³X'v“1Îée|â2F9ï#¶ôa[ †lA{ˆÌ·S +"_
†h€@ª |9
fæÑ€W¬¼2:p·b5àîa|áî'&¸Gˆqî bŒ{šø̽D|ä^'F¹‰aî +¸áoqŸ‰áy¸-¤‚žÇüpÍ1q¼Ö‡oÒéïçä3†go7j¿qÞÂ|í\Ã|åT¯ó©IgÐéˆÎ€Së¹Ó9Ö3§«¬~çVŸó3^ç¡iœÆõî;þ¯N0½Ç ~™âŸþ.ÆÜ,²À+çâ‹wÓ{>uÜË[cÔ}™æ[ŒÖk×ú—•ÄÀµö³ùk™ýó*tžÎ«f=ïbõ‰tÿÔýS|lÚù§ÙÌídߟ{‡Ý#î×»-š~C<fx]FÝb0þY&]SüÓßc:ÌßÁŒOù8›2¼x!õ•o€æ¼#´ú%0ú<Óµ{=òtº¯fÝ_¸aÚon›Ù=nÛõîºîÖ¿íÚ4ý–ëƒ.í×]:¯¹\7úٵרÓõµñ%×O¦®`vÞÌÏag§€…¼Ùôãz¹9±CCË…”Áày”§K}4z—Ó~÷aôø%3ïø*uoú¨Ø×½Kô»m4èòª4¼êµÃ¨Ó³Þø²ç“‹¦<N›÷øÉì¬Ç¯æ§<Ìðµló«ãØ1¬u +ð½ýX¸¿.‚P\G¢‘H41=w¢üêN½²„vcY$ÑϺºDÁ¾Ñ_mر¸Ôèœ_¹É¿¦§|kÍOú6X´û²lói·:îsÁºÕç–u‹O¿Í!ßN³/pöû‚m>§Ü;çÞP‘,ôIÂF/£
PŸÄÝ“Ð-‰µ;j13"”¸Ã:’¤wjY†ÁÉà<㶠U¦Ç—®3k]RaÑXmu8 Îú`À~ÎÿVÛýþgíý»íÙï xk¿;`bÆ®@°ÿjç°÷ƹ7‚ÞGhPªþ–²ÐýXCt3Ž‡ºbçR/IÑÎF?®ˆÒm‹Œ×o
—¶„)M…ªÌšCŠ-š–o°Ú·¬Òfopm}Pƒ]]Ðá;ƒNrkƒ~âíú·-è¯*xŒ·5x[—wË@à; ¡Mô4Vý;AÝ“è¶Lu%Ù¡IÎÔÓ2Z{| Ñ*
Ó=ó~st’QãŠt“†¨óúµU]x©Íΰïmw„UÛoÝÍ +iæm ião¹ä°)ä‡ïCÊC?ñË€¿1fNKhø(h?/½2*êI¡¡[©tÔÊF6è´\DiKuÕlIò#šeËYñý=±ñFuR¹imŒÒbGtUµd5gëŠ
v›£*gTDÖòÊ#ù"Ž ÖGœ'×FÜ"K#Ÿ“k"?J¢Àáÿø“A0M¬@èiB÷SpîUh îtº’®‹ÎdX¢¶L’Ò’>_³YáÍØ—ÄÚ©W›(5ÜždZ—nQ›cU!-ä”[j¿!¦‚».zûÌ5Ñ{Š%-d‘äŒp•ä_ŽjI¿£:ú½Päw1 À§Ãd_ŸØáh„áÌwWеL*º¢ÔDç•:臕fèèJ>¥Y)ÖhÈô¢×¥êÔ(ÂôªSc+“e&Iró2™Òj}‚ŠS_l_WÆ-ŠâÆÖTÒCÂ|é)Ç<i·(WúD”;â˜dn¦‚P„¤=Äwp3¡«+)¨#‡ŠNåèXž1:”Ç£4æÎÑØíNß¡ôgVe†°7¥¯0(WÄ™¬—§˜—¦fZ'çqŠ’ŠìՉ빉[øy²:AvB³P™pR”•Ð%ÊLx$Ê”
;fʾ3e@b‚É ¡gx¿ÉqÞR"tgÏ3ÔV@G‡U†¨é;{T¯r¦Öä»iUåú17eO+SFN_—%5.ÉH4+JO³T§åØ(Ôv¹òµÜìÔÍü¬”Z2#e¿cZr»HžÜ9Kžüç,yÊ[‘<eB(OR‘‚ɾD!ôD†ç€sgWÎ|*œ7ÔUk¢…úhï*[´s•ˆZv¡mRùho,Xª»6/\¿8'ƨ0;ÁL¥”[æe)m²3UvYk¸é|Ez 5Ñ19í„(Qqy–,íöF”˜6.LLaR“½Ã»ðW2žCBWòñàß®8{\MA
Ål´«Äm+R7ϧ•-"Ö²V«CõÕ*‰Q~A¼iN^Š…27Ó:#'ßV‘]ÌM]Y>3I¹] Ü'ŒË:&ŠÍº(’fÝÃ^ãzL›dÜ/ñ.<Às¸–ý?¶ë=Ê|ø÷¹Æ¸ŽËLÌŒË3bf0F‘QœPI…’.Š“])’ˆ)¤èB[(%]ä²Û•êìn‰v·Dm¯¶vŽT[ÑUJ—ßù:ûê¼´¯óÇû5ó×|žßç÷{žy¾ +É%Ž!9ŸkųxÏá)-v€ùû¶bE8{⺮`u©¬,“ÀÒ= +*¡ÌƒŽ/óãÅ–éÅ”„ f—L7ŽÚ=[¹+Î"|W‚hÊW+Bw¦K'çÙÛý¸’,:Áýˆº¹€í}ò€mD°õs—±ƒsë±ì¾×^RŒà(’shRÀ’X\)‚øƒwPCÅTŽffUò¢*'êEL;mV1ß$´b¡Ù„ýË-‚ö¥‰÷m´W¾Câ_^!S~\æ[~ uI}÷¼’ù–ŸÒÿ²ý¤q-vP…ëß»`G)@N9@ΡK +³km ºN3ê<©ˆ:fjm0orm˜îÄÚüÚ¹‚ñ5ñ†5KŒÇÖ¤˜úUkÍ|ª·YxWï³ü¢ú‘WõE‘×ÑNѨª—âQ‡?ó<D¬†:‹{P‡û_ù_a~þ~€ŒC8âúå×8ÿá,~Ú +n Ç7Ld¦±c¢uübu}øÞ
ɯúõžõF#ë÷¨¯5v¯¿`¬©o7Öœ~aâvò½©Û "DfŸ/ +®=á@fG|rÀïG<¯òaÄ5Spo‘€¦ÅÜ®k@}Ý\[À¥u¨Ú"AÙC9ÝXD9ÞXE9ÜÐÒò›E´ýÍC´Ý/gPm{ã1mÛöš±i%ìPå˜_„ù9˜Ÿz ±`Þw˜Ù!? +¶£À¦Ód@úïptÍë®Å`u/Ä÷r)Qw ey¿†²¸ž2ð;eÖý”2ëøÌNÌÏÃü4Ì_r`þyÌ¿|À·`Ä
+B_¾
|ozrü3Ä^AÎá¬k«¢ˆDC+_ŠˆC(b9&æ±41[Ba +ÊBùh;Úö¢JT…¾F§Ñ·èt“þ 즄Ïé~á +`ÉTÀRi€¥°àyòFxºsî³.îq|þãr·‡Ûµ„÷¶ÕyÜßÖêyo«Õë}Þw8Ã>·9û|nrŽol™ö½¾å„ïÊ–Òµ-ˤeÎ=òUΧ䋜o)‹Ìƒœç`ó¯À¶£ì"Ê&¡#Þ3©ð<#¾äÆ“´ÍðQZ2î½Ô\ü½äbÂ$•ÇÍD½×õÞ+ mÄk ݾKñvÒÕxùrü~¿Kq”·âf(âÎø/Ä]˜»p6âŸQÇÿ4ÿñ3ë` (;Åeû +Wã})†¸˜j&-¤ZÈó)=”³Éýþg’GN%<‘4IK:4›t!x&i5äXÒé䧡G“HÆÂ\È‘5)XèKX’7`\wÀrÜáß>xÃ> ÞçÁ]á¸.äà–©øKü<÷¹Å^ó9e>gx:ÒÉ,£ßñÌfÿÙŒŽ€™õMî`Ð×ü‡tWèDúL˜+ýípúí`úýðé_„ïãþ+ÂÉÅÂÇÑ5ÿ‡¥ |¾ ¾Uˆƒ‡"wxPä
w‹`EÄ„+â͸EQ"þ\!ÏýdA¡×œ°”8#P“§ó”É܆€‰œVê‘kð¡ì=!ã¼½aûyã4gÖTøhÖ©È‘¬ËtGÖ]úïú ï;z6¶&Òþ +,}²sQçDŸö‡%¨óIÝà¶ÔV%~pYJ‡ÙFÜii~NÂu?V,ðš•'Š”äÃZÿñüÚÀýBsS` ô„9øƒ´¡¼}yt{Þ\T_Þbôî¼›ŒÞ¼¿1zøßDwó±5Q]‚ŸÑ_Zûµ|#x„~s÷Kn)ñ°¢$ÀU9 ”48UöÌ*·â§å©„‰Ò\¯CÒ"â’R²³Xí?"֋ꃋZBû´¾‚=¶‚zOþᨮüFgþyfGþ*Ë’ÿV{Á3f{ÁOŒ¶BlMôzà4ƒe¨ë ε¢FO‡å>pZ³`JýÞUžD/ãy:ùĽr y¨´Ì¿_ª
Ü#©
¶•˜C{Š-4k±-¢C<L·ˆÆ£ÛDÓÌÑYV“èÛ,úmÿù‘e*Ƙc½Ÿ×Að@på/U¢Þ«8[é ³Z*LéØàÒnÆW&Æ*2<j¾Ï€JLê+“SzÝrCpgiC¨¥´•Ö&ëŽl‘D™¥û’IV½ä4»N²c”¼S+}Šü‡U+Ř¿`¼ô‚ö¢íÀ*Ê¿¬G½× +¥S +´¨tA*chsY3ͤìŒlPØ£ŒŠ1Fü(Ë ?£—_‰’ßÕÉ¿Š©RüÀ®R`,„¹Þ?ó>FûàêË(±õ^Ô½fjpp´–Q0f|7\»ÍÍ^âa3d{wUåûîÒ•øµi•M
Õ¤© ©¯0ÑŒê]‘Õå}Qúò¦NåbWªŽÇT¨.ŪU÷¿ÇV¨^°+Ê1Â\ïË"€”hÐü¯ üù:Ôùеg=Õ“ÁÙŽÆ×pö¾·>ÉÝjÌô²Ô +ˆ-Õb²Ù ÷oЫ©Æ*CHµ®¦×µGhµ¶(M¥ƒ¡®<ÌRifc”š‹± +Í;Èç±JÍ¿ÙJ
ÆZS¦Á˜/}ŽÎÃtÝZE3¸ˆrÏ î7ƒ®€.ôÜg&£)ú›7€é÷x«9Ðnâz67äMõEäº:™±œª¯ +ÖÕÔ…ijZ#Ê«»ée†!†BUªŸ‰‘êc%úÛÈgèý{¶´ +cɪ0æzO¤ +m1«hfZ<‘f À4K8›j‰eÉ–)B’e†8Þ2WkI—N*Zd]´\Y´N^´EZøzBáA»àÂjrÉ.xÿ» }Ï5AùÜ~¸JÚ(?wjÅ6å +à]ÊžQKù
@Ä Ê?›ÜÏI¡oUÂ鲎Wôp¼ê‡«ã »6DC{=ö7fÁþf:47—BsëÏPßÞ uÛ~¨Úª`ÛvÊÛ?ÁöÖ lo>månV• +¤ §äÜkSþRÚsïÓš¿Esž@Ùa”=î2`¸8·öí”ÝȨlñ3€q}ÛðJCè÷Hb >$˜L$)„^Šœ>Š8ͧÍÇéÐqZt^ñwKÆÐ-¨×uô·÷×D‚«'3®šÅ¸2qŲ’¬'›Év’A²—ç‘BpùaRNªH^É›ñB~CòôËðXÎñHÁñPÁÙCåÿãnžànðÑDOµŒð£ZÂÀu TÏÆ5ï2®^H–“ÉF²•ì"™$—°Wêì…º„=WÅ3užª›Ð¯¾ŽGên<P÷£WÍYgÝÿ¥á¬kîáîáJÓHÜ܉ÍËš—ªgãŽswøqÝ2²Š½Òm`/t_°gÚílH›Ážj³Ø€6õk‹Øm1{¬`µ5ìßÚFö“ö +ëÒu²uý¬Ý³»\¸ãø?mÃp/ð±#ÀÇ8{QciMƘ¨&3Õ“>j6{é’ΆF.fƒ#W°'úµì‘~#{¨ßÊúô;ÙýÖ«Ïe=úÖ¥?Ä:õå¬CœÝןd÷ôìöÈNvÃ¥_¸âÂ…VW.ºD.ºrñ…a¸åûêh+iÁýœ ‰ß8ú†—ÞñôJc=ßa}X¯aë2¬b†õì¾ak7lcwÝ¿fwܳØm÷<vËÝÂnJÙ5C•pÅðƒÐj¸(œ÷èZ<žˆN{rñ)O.iôäÒ¼ûQ¶¿¸ICÛÙмyá™É„GþQèõ›‚ß9ìžo:kóYÌnú,g׌kØeã§B«ñKá¢q‡pÞ¸[ôOcŽè¬±@Ôl<,:m¬5ëÄÆfñIŸ»â߇Ò:ßW²_nsügÇ|¹üÜDùAJðPx8Õሡ°Ñè1¢#8mAq¸”†ÖÀwعÀB‹i©pÆ´RÔdZ+jøL|2`‹øDÀNÉ÷{$
{¥õEÒÚ€RiMÀ1Ùñ€FY•é¦ì¨éÜjz®(3qeÉώÃm)_ +%§#m‹—ÑôE9¢=Â
×#ÆãBdZ"§°S³Ù‰ˆùBCøBQ}Øïĵa”T‡®“Ý(û.t«ìÛ]6•!YòŠ|yyÈ!EiH¥²$¤AYrIy0´Û¶(ô©ª0”NPWï{“›ðÅIÐ'ÇýIj\™è„³1ÞhŒ
Å÷± ¬66M8ó¶èÛIˆ+'.––Gÿ^Vý'›’¨õòâ¨MŠCæmʃæ[‹9WUh.RD–©÷™kìòÌ-v{Í?j²£úí³¢¸ý7$ó
<’Q>ЗH=_2p5Y‚‹Ir4'jqb²j“Q•<‰ULž*”%Í'¾'9”°@f‰ÿȦ0n…¢ n2?öÛ¼Ø/T{cvØåÄdj²bòí3cŠµ{bª´1§t¹£ÛûØaG,wøŠlãºáx0” +•K»<×E¦÷hJ3y5¤YxS}k¥]|‹tDP%VHçEféu±Iúc‰Qú™Ø˜úo‘1•}¼ä‹ºêÁc%õ€¼ïª–ÞÙ9ôÎUs0“í…cšÓlÆfÓ§çveÅÙ·©¤ŽÍ™.J[}FG]z©—%½’W¥¨÷PtðÍò!A™|BT*ŸË—$ùã +ŸìÂ~VA— ³`T”¡;!Vè.J亻rÝ'Ä?$ +Kß±¢åü–îá!Ýýu=Í"åŸ!ÿ<JйÃd&³7–¯€¥|#*Ê·1ÆòPn‰9Ú^oJt,0ÉœóŒ*WmY®Gv™Þ+«ÔÌS–ôK/i÷—¦O‹¥†’ÃûÄÇÄßèóER=ûáK>¤{¸Ks°HÏ_[p¢«"çª$ï¬bP[í‰*‹æšõ(« b–ÝœBË~»üêxmuªSv•Ò%«2ÇMYYè™^aô–•×ø¤–·òS̃‚$ó¤0ÁôŽ(Þôž8Îôq¼éKQ¼ñ[Q‚‘&”½â'à]êÁ%3í£…¼³¬Z‰Z:WtCYƒ?ŠÖ Ⱥ…ÑYwr´ÖpnvCŒ}V}²£²^á¬8¨v•Ìw—Ö•z&×Vók›}ãjúù15þ,ó‚(Ë-a”åW¨ê/ÑUÏ V]Éú¿äÍÿuºÿóTÿ©zò>+ÐC4å¤Å-Î(lõA~Û*hÛ7#»};£jåd´Eqm‰öim2Gi«Ê9©%×5¡Åà×\áy ÙêÕÔ볿é¨_xã,?¬ñ:_ã/øaÖÏùa
ÿá‡Õ³ßãõ`ú>GùSÍ´-ä]ä=mä]]@^7š^/dõ‰‘Ù¿éýAõ‡0©ýœäþXnbŸÔ>¾/Ã!¦WãÝ[èÙcvï©÷Ø×Ýå¹·û°÷îî³¼î%Þ®îŸòB:ŸòB:žù„´³ß㦉f‘z~š²tÐ.tVÊ.ïòÉ=ŠQ7¤ñ![äñ@$ŒoGÜx(3͉OäFŽÉì"ƲìÃÆòöŽ–9íuÞ5ÚáºctÔmûÈi÷m#‹Á#?r>ô÷àáo<‚YÏå,ÐÌQý“”}¨hï§Pv e猲c@¤b¦¼=%FÔô:ìŸÞŠˆ™]› gBgb˜=3)œ™ÎΙîÛÓ»mÓUö?˜nqxkzØqëô §7§/œÞœú³Sàñ¯'X—Àc¯¸@ +v’ê§ì>ʵ’šº sH:D’&îuÃî9_ìš[‰s°c>oχ`Û|‚mq²¥2oÙTÌ›Žh3q6٬ܶ~î¶I»õ¶‹vël÷íÖÍ?á®ýÊní9Ö~íÙWœ¥ücÀÐíÂÀ2 N +ˆï®ƒèîïí€à^üïÅ‚_¿û9ð}PŸVðÁûá)x=¼Ï‡ÂëÁ_áuï¼î²ß1>F»H}o ÚM³´€ô+@Ü°ïå¿lzxý> þ×õÕ¹Åüﶰlˆe£DË‚((`¤W%ÑÄØ 1`A,H @DņŠ(Š< âàC‰-ŠO1D!âŒODQDÄ‚ŠÑïgã0¿¹³;Ë=ç;{÷ûÎ9ÍÁ¢FÕ9ÌêÔPÔY“Þ0s C ¯Y½Ò¿#ÉDHþN„øb:Dó ¼X +AC¸†FrŸ<û(g3Jßù,Zû”=ÀXŠ=æOZÕÿ8àðÐû`]hêÅ%Ò+"ˆ6ª!¸j°€&;àÚ@à:5¨Í£©1Š +}k7¡Ýj æíöGK(þœ]À4ªû8Zw }Äë0ø`Wè. +:U3ñP•„ªÅ¸§Ê@»ê7ÜQå¢M•‡Ven)wà¦rš•{q]yMÊüWÕŒõCÔkºp^øZsÆ{¯æ=fK±m•`½‰éf£ë9/ºÇcë +·®Üõ[¾Ìu_êò£ Äe–p§K²°Ø**2,m7¬Ö›l1l5)0ü.É7TJ6ª¥W¥ë\:dk\^ËV»2YîgØ`ÚÚ(vËšùFµ#9œ.Æ %
ï‰}#úcÏw”ðåJFsÅÃcøíž…žS…[†Å‹6›-Î÷X Þè‘f’ç‘%Yç±ZºÖ=_¶Ú½X¾Êýßò•U¦9
¦¿
»§ÈÖ¥ÈÆþÏtÙ'˜+m¿¿‘¶÷Z#PMŽúñ88Ê>Ö(óÕc§ŸE¾ÞÜVß +™$Y'MN”'-PÌ J7›˜£JÜ ž¸Ã<>°ÂâÇÀj‹¸ fòÄ<.ˆiÞSÐæGßCp" +80(§Ù¯˜®[èu^”¹ÑÖȉé‡Ì˜AȈñäÒ¢}ùÅQ‚…‘¢äˆXqRÄ÷’9áÓ¤³Â–'„ÍSÌûE–Š]¯™ºÝ|jè‹)¡Ç»Mk"-&‡1s¢ùT‹?pžjPEq÷§Ðì·®ÇÒ¼3NŽå±Z,û¦Ò¿qBj¬;·(vŸ<.@0wl˜pvLŒ8!f‚ÉÌè)Òøèxy\ÔÅô¨åÔ¨Lõäȵš"ÿÇuyGEu¦qøwgfd`€™ÁÅ.誈Ši*e60ƒU‚RUZbì2ÇXYKˆ(nŒQ@M\)GOÔ-–h²®kÁ²nŒQ¹û“ã9ùã9÷Þ9s¿ç{ßû}÷¾¯ÖÙìbˆ<Õ31òŸ=uO\u]ÚD¨1èDõ[~:s[<ס='ËyÜÄëµú¨ÖkPž0e £P”0I(ÐûHòôÒœøy2sœÎ&3.Nž›Ô#56CiŠÉuXSìhŒ©vNŒÞ ÖGïÔÆGp‰>Ñ36úoäÏ_kã¢E
Q¿åŸÃYÆ|Œñ7³ìjdÿYÏc¯?4Øb¥Ñ¥IýQ˜4ùI„\ãtÁlœ-É4„ÈÒ
6)‰1òäDƒ")!ÍÎcŸ /TÅë+bõëÔÑñÛµã›\¢âÛzêâ/“Nž¿ÒFÅ‹¢~Ë>‡Ó\Ÿ3þ¦T`'Ù”¬âuy²%&G,5õE^ŠrRÆ!+ešaò—¤š‚¤ÉÉa6IÉѶ†E +ý¢»¸$³}LÒRÕ¤r'±Vaܦ 7îw 3wY`¼ä²ÀðÐ%ÌðRf5áQý–‹|'€Ã&`_°Ô¥³ïå<JÒ€‚täfô‚9c(23=–9Y0eøJ’2æJ
óeúô(Û¸ôxyLZr…i‹•‘©ùá©+¤¬už—bQ‡¦ìÓ†¤|¡
NùNlº¯
1½Ô„˜Duhò;¾æZleÌ鵚¹²Ø÷.f½ŸI?9YJ,6k‘–=¦œQX”ã%rfúœÙ’¸ìitv„MTv¬m¤Ù¨7§ÛÍÏʵÍ*U/^å¸x«óÜÌ=ê€Ì£š9™ß{š€Œ_Õ¢: ]t~ËY¹‰î]°ï%Õ9@!ÉáyFž¦%ÎHÊïÄwèÆ#v©·]à/ÑI# +ÂdaùÑ6óóå¡KRAKrìææÛÏÉûP5+w³£®ÕÉ/÷ˆ³on‡³ßwÉ/Î~9¢“ö;N1‡óÞ\ö,¿k– +]c‹À'ÔöÅœÚa˜Uç™u“áW矺9Âûuó„éu:É´ºÉ”ºTé¤Ú\ÙÄÚå6ãkkl=k·ËÇÖ4Ë=j¾"·äkž)<V‹ +UÝôxÃAæÜJïÖ +îGRRÉÐLwL
{¯õÀìM€ïV{ÌتÅôú˜VOL±LÅ$‹¼,˜h Æ[bOË"ÁÃb–Œ¶IFYVIGZ,Ò–&™»å¤Ìþ†ÔmËS™Ûæ×6n›ÄßÙÇØ·Ó»žmX½ùkØûÕ2€ˆ-À\¶ª>;€I
2ŒÛ‚çî^Û8cGbtã8Œ²NÅŸ¬þi
ÂkÜz·¦a˜5_b[7ÿ¼W`=.¸Z¯ +®×†—×]âï4T[è]MoÉ:À¼‘ë`+×ÀÇ@È.Àß +LÞŒýp? ÇÐf'iî…A̓0ðà8è ׃SÑÿú +Æ{‡tè{È€>-fôn)EÏ–:¸´4@Ûrš–o¡9tšæÐ…·XÖr0ߌy ÛÑTÆ»˜Oï¬&`ÛRÏÀí3`àQ ÷19´*hZ] nu…sÛp2Nm“àÔîU{0‰‚C{2ìOäAy¢ +víõP´7AÞþ%¹ÉóÇP´ýJ^u³qW×ó}@w&cNÜ„7sÞGè§×í80 èu +p>-ÀþœŠó*ÈÏka{¾lÎ…ìÂ(H/xArÁ‡A$üupÓupÃ}ÍDwPÐÁA;Îñú6yDžt³Š±3çæ=€ñSîþ-€ÞiôŽ¥w8½ýO.¼Õ±°û]’°è°#ŽÀ÷Zàr_àÊ`àêHD€¼)PY^ãKø:_À×KôõFà»ÁÁnÜ ·»)kàûp°ˆ9×}Î5ØÊøOô=¼G¯æ;Àá ¿ÿ„·ã¦ø¡pKŦ@
üØ‹…©+pÇ
¸ëÉBy:ð€óxÀy<äK°“¾“Iïd²;ÿB¾$gºÉcîM|Þ¿ +íO4~‘¥à%—ï¸<¼àJðLR§’j|%©ÅcI=r
øׂÜ&|ÉíÀ\þÎÄ]î8îp½¸%½‰²'¸.ÿW.+\òÒçE¦‚0TI¹ðÄ +8Kœ!N˜×>ÞC”ÇðøÙ¾<O}'ãá iøÇ dÜ”Ž[ƒ¸á[„k¾å¸â;—ü¡Ï¯ŸøÆE¿f\¼ ½ƒwâüàNœrg†œÅ©!×pò/Ñ3ô¿Ì94L`º½ô"Œ"}*/¿–â§@%žSüßÂçþãpkØû¸6\‹Kø8†ÞNœQ‚³³p: +§jp2`9N¬Å±€õè ØÂÙÎy€éy’9ØÇt>`:G}ËvŒúƒm›Þ(/»½cH?ˆ®5•¸'ã©ôIp?P;¾¸2z4.Ž™„óc§á´: 'Õi8¦¶ã¨ÚÃêèVW0Õó™.õbf¿z³WÝÈtª[Ùõ¶=h/ÛÔÃî +ºÀîºÇn{ç¹h˸_E›Æ â¼´zy¥ÿ’ÊÉ“ÉTb5ÀÉ®OàÐ7®?ÎO‚ßEOH…hq`âtìÉDgˆƒé)`ÚCʘÝ!³Ù]ÁÕìŽàZv{ð*vkp³hsðѦàÅ!‡ÄCΉׇÜ7OüZÒ4ñgIÃ{ÂÿYûÂ*w¤}?¸Aåµ/‚zýPg&óè™2ÝSÕØ:¡QhMÂÎP3³}ªÙ:5Ù<µˆý@SÎnÔTŠ6hŠZ4uâušq“¦UÒ Ù%Y£éâVkNq+5W¥õSŸH—OýQZ*H—yYêå‡ITꩤމ&ý8šùbiÞ¡'çH¸ûÃ}Ñ1 +»"'b{d86GjÑi`6D¤3-vv]„‹m/
Ÿ%^^%^¶DR¶’[ÖÂ-Û&
Û+[v\^Þ'_þH¾ â{BWG²7ù&”ž3Ò¿|œœ º)Þ-F{ô +[–jfKS¢âÔ\q¡©Ë7•K]¦*™Ó´Ì'×Ô¤È1nåíÆ}ª,Ó)âF?›é?ôý•Ï2 J/ŠWü<¿h¦³Hú]ÙÔçSÛ³žâ5iÔ禋P“ÞÕþ˜›1³3߃'#e1LIF"[”ndÒ3Dîô±Ó’/ɵ”Is,sevKO–¥AaMÛÂg¦uªÒ-õK·\'žQüŸnøŒ4AùšÛ´½´îÒï̶Ø&ŠW‹)—ù6s²†`VÖÛ˜™ŒÒ¬PeE1ùY ŒËf`ól‘Ö-¶Û\’l[)g³Î‘eZû¤[×(Ò¬›xsæUªõ„Êd½ÚÏdý·Ê”ù3Ÿš)¼BùšÏÈó³¤uØ´çÑÌ™KP\Kí×|ÊgvŽå9~(uŒD‘c< +r5påF2y-ãp¤°v‡Y”å°‰9y’ŒœbÎ’S!3ç,’›ì«F{«Ò`ÿ×Û©Rì—‰§*½ý'^Ÿ-(_aðr…<?Eë>袙“h!êÔkS.s(§™N9Š]Qà—;yîIÈq‡#ÛËØÜIl¦ÛĦ»3Ein‡8ÕU(1º<Rƒ«Z–â\á“ìÜ Ht¶)uΣ|‚óñ¯ËûQ©Ë”º\A‘èåòü8éí/ ûH4Kóiæs“>}‹ +$pöGn‘?ìÅcUkÉûÈ(‰b,% Œ¹ÄÀšJ,¢éÅv±¾Ø-I..㋪¤ Euòø¢Ÿ¸ÂÝŠØÂ#ʘÂO‰Çʘ‚—ÊØA›ÿ'“GHoÅtˆEÄ,¢þ9g0°—ñ°ÎŒŒò@X<ãaöh`òDÂèÑ2O +“â1³I›HçqŠãËK%qå•\LùRiÔÿÈ.ó°(¯+ÿ¾Ù„afØÔÔaQA¢â׺<ØTµ5Ú¨E£A¶ ¢ÀŒEE†qA&.TD0j]S4‰VmšX×Zc4DMòõ'á±>éï3ÌÂ}ï9÷ÞóÝ“Tà84ɬŒOÚOZ”qIÿPÆ/yªŒ_,*ã‰Ê·º8Âì¥o{PÄë÷z’NóýÜØ÷-gß‘¢ÄÔn˜’Ú“Òô˜ñé1—>cÓÇ £Ó§#Ó% iïJ‡¥-”¾•–,‹KÍRĦæw‹Ipˆ^±—4;D¸éòÄ!:ùg‡èåâk˜{ëRž‡eÜ‹$“$Ó»0˜• +Lg«6)CŽ·×8cl¦7FgaTV?ŒÈ„„ìxÏ…¡Ù„øìéB\ö,IlÖ|ÉଥҨ¬Õ²Ye‘YÛ䙵ŠðÌ&rM¾æ±"<ã'"*ÂWýB[ +X—IYIoRðºÙ¢M^ËÞs=£ÂÐ\wÄçõD\žCŒáˆ5Æ`ã0DÇ"Ê83…ƹB„q±fL—ô7æJú·HCóvKCòŽviHÎ#iȆe!ëÅ×Ô¦°.e°.¯²I +ÿ^˜ ̦{êö~F`8[Ö˜B99c@±"‹uˆ(AxI$%±è_2ýJÞF_ÓT„šf!Ø´ +º»PrQÐ? +_H +Ä×ì\
la–›dð5i÷!݉tOÜÌø‹ØR r+ZáˆàJWô©ìŽÞ•èeE9æXèÌ 0‡¿eü,sÐò¾–Õð±äÃÛb—å ´–3КïB[Ñm¹(xuQù!ëbÏ#IÉåYØÄ}X +0^-½z»½ò~I8m|E¾&ߦwŽÍœ<P]€GžÀcæä;=ð=›–Îã>Ÿ³>çáÁ½ñ‚‰É¤¿¬ëDtò…Ø;D¼¢éM"ÉP2ž$’ydIÆOÈÀK¬Ãäáä£Åøex†J<E¾ƒß¢ÿÁ'x„“xˆËxÀÉÞã7wñ3ÿQã
Qé Qðà;þ@b CÈ2ÞßÓ¹€¾¥t¥q´L<Áz<†‘®ºLtm£ËB×.Ž»‡Öz¦ê8SvŽ©û'nñ×79û›ñFïBtq‡¨v…¨p(á\àGBHI {ãû-c›G×"º–ã>VÒ“…;Ø€ÛØDW!-¥tUÐUÅñ¸†Ü2Gq§ñ?¹Œãžã"G½@οèêÌ\¨!ªˆ“Û/ë"éÅo™ã8Æ9ŽÎiôͦë=z–ГÂQ3pk¹Mrpq«ÓUF™ŽjF¿g¹§ÑŠSÜÄmå$3Ù‘O"š%ÿCôpb.Ä‘h8®‰ÒÏ!x ‹Â×ÒÜ’NÂuY"®Êæào²…¸$[ŠòTœ“¯ÆYù:œ‘çáSùfœ’›Ð*/G‹|š6üEÑ€&EŽ:´ãˆã=Ø~@ƒJDý¯½dœ j¥|å<\5x¢ñÄ]•7•\u‚Kª18§ú
ΨÞÁ)õ<´ªßG‹zšÕi8®^ƒ&͇8¦Ùˆ#š"Ö”Á®ÙŽFõÎõ8è|\Ú±Ïõln/`uQã.b÷ˆ>ôûòØ<Þ·=¸Í||©ñÂE×>8í6îÃpÜc<ŽyLÇaÏÙ°{þ
ž‹Pï¹=Óq@›‰ýÚ
اý{´&ؼ*`õªÆnï:T{7a§÷ETùÜŧ•¾¢PÑEy"rËÊ]–¸½Y‚t.ú:ଗ+Z|p¬GØ{Æâß(ÔùMÆ^¿DØüÞ…Õÿ=Ôø/Fµ2vù¯ÄÿlTùçb{@,e¨¨ByÀa›î°P¦;+”~#˜‚ž ÅA¢PD +ß@dü!ôXjYî?e©=¡—¢)PÆ ÔõÆž>QÓgvéÇ¡J?ÛõïÀ¬Ÿ‹ +ý”ë—`«>eú¡T¿NøX¿I(Ñ›„¢`³Pl67HòCNI6…Ü’CŸHrCEIίx̲\fimc™?Æ×Æpöž}aëçêþ¨2„ÁlˆE¹a$ÊÂ&¢4lL†Y(6ÌC¡áOBa©oø/ÓåÕ}†ñç\öì)A55ŠJ²Â.à®{]8ÀËîÂ.Ë.·]nr[‘ÛŠ(—Â%Œ¦*X“èèÔ±mSÓ¦i3¶Î´vò!m¦Ó´“t2M3Mš¶il¶/2füð›ÿ9çËó¼ïùßž>f&m˜™J›`O¥fO¦-±'ö_æŽï¿É…÷¿É¥¿Ë¤Â
©¿"¢Ü±Çø˜jÿ}6p/¸{ˆòVp¼\ÉàqéÀzœÏÜŠ5)˜Óhð¼FÓ+" ÓšjLjÜÌIMs"³•ÏìfÙ!v43ÌgNsC™óÜ æ"Ò\ç4wýY¿Sôe}¬èÉ~@DùÇùPCÇéÿÔ +§xJpˆsÊjqYeoªªÄŸÇT‰ïŸÓsT¹ŠMŒ +«Ü§9ð:éÞ¨¢ÿ@WYºöL’—1êÇQòÒ[‹`Ù´KÛRÐ,e QʃO2¢^*bê¤rÆ%ÙÙZ©ŽuJÍœC +òÕÒQE•4!ÈÒ¬²Bº¨*—¾#Io"þIïQeyÙC„UîQßïîÕjàœîùäåy9F¾zÉK°"• h‘·¢Q~^Y
|nù0jeã”ˇlcªek“9Yîà+äE¹<.”Ég•¥ò•(ß ÞŒ)–ÿ#ÊŸ©Äʨr•’ʨ°ÊϨÖ×HûŠXtÐ<´SÈO?ù’Ÿ€M@Su<¼Õ›á±ï‚Ëž†G6ª°9JÙ!3•Ž¶ÜácËìm\©½íaE‘ý´`µ¿¤´Ø¯« +í?&Þ#>UVG•–5„U~BµÞ$íåZÊœ5”·ˆ!òÓM^Zé{£“ƒ§&®ÚMpÖî€Ýµ6W&dw*Ý&”»‹É]Á”º¬è®g‹]Îêêá]£ +³+"˜\ç”F×5¥ÁuWep½«2ÔþCi¨ýJi¬‰ +øÕzÃE{Rp†âÀqb€ÞÛÉS#uôÝé‰EuýS¨ònC…wÊ}j”ù¢Ôw¢Ï‚b_cõÙ˜BŸ›5ûšY“¯‹3ø†x½wZ¡ó. ‡¼¯ +ùÞוyÞw”ùõŸùõÿy¢_s‡j½J`‰˜&FˆÂOÔy]Ë妔7¯Giófˆ-»PìO…ÕŸ‹ÿ +f˜"Œ™1j½¿‘=äïdóüƒ\®’?è_Tä´¼¬Ènù"Ûÿ[ÿ®Èn~ ÈiŠ~Í-ªûJ#0GLÞQ;‰ºŠ;Z€Š +dÄ!st#2ƶãÀؤ¥c8ia=RÃ|+,a_؉”pö„ƒH0»Ã§™]áÌÎðM&)|IûIù7“4e“†Ö¸LZ³Äq¢h릶´Åc€qÈ=dL +П²fIH^¶6]àp)ñË D"ž\Þ¸•½„ßXÑ"vÅŒu+žX©EÌJ +à}œ£óæ@»›R;àNlÌØ_¦ËlL:X;¸ù:8Ѳƒu'íäF7yÛ€´Ü‹û€o +¹*_õ¾6®™ßX°A¶æE—•Ûl–ïÐÇ÷<˜ï²ðßÍâŠsÒÉDwî'®óL7Œ;á +<'b¡g$ò<c뙈ÏTažW–í•'dy•™^kįJq¶÷q–÷)Íûœ”:úŽ”2ú‘Åw¹N½³Ôoö +Ñ¡IBTh†0=4WŒ-‘¦†®•¦„mSL +«'-Šˆ°kzaøù–ÈR“ÈYÎA#[Œ]dóû¼ëÐK½ä3Ùô’f€´ ¦Hž0‰$h\§ñF¬FhM0¢4ᘮ™ŒiáÑBdx¢0%|–09<GŒ/’>_#Müë2‹ºÌãøç73Š¢(à‘Bj‚+Š7&‚‚Š +"Ç +Å0=}ÞíÉ6ÑOÖ¼@¥åuRʤîJÎÔ¸ü(%æÓXg‚Æ8“5Ú™©QN‡F:§ñÎYFœs¡i˜³Üë\oŠqî2u1G;Ï™£ó¿4ÍÿÞ<t’ÏÓHžÏ|íyÒZÆ€2X +úkdA´F¸F(Þ•¨8Wº†»r뚬W¡íšoq•ƒ]U¦(×NÓ ×!8cTpÓ4hÚwà3EM}È~Zÿ-謄%P3 2þOE¿€¹‹Q)a†¿FÌR\aˆ††)¶¨bŠ¢4Ô=LÑî
q×ãn›»'i{ººKŒþî§~î5F_÷v£û€é~ψ,ºnDþÓÔg¦ïj 7 UOÁl¾€ÃÅÌ3CW(š%
›ÛLÑÅmôxI
.骨y=5p^
˜7Dý=ñêçIT_OºúxìŠôLSoÏEx¼êéY¥žj#ܳNáó®á%
Fx±ÏŸûø¸æ Îð@!ß'£=¡ˆ¹o¶4šñh¸‡ÙkÔ‘¿ú”)²´“z/ŽÔsñ@ýÊ£ÞQ +÷&+ÌkSwo¾óªÛ’…겤Rz_P¨wŸB¼'á²BJï+tÑO +}Êg4² g¡æ€‹Ñp"Úh'2Å3®YŒþR)¢Ì¬°gôXy°º•‡¨Ky˜ˆThÅ …TĪsÅhuªLÓ#•¹êXéR‡Êyj_Y¦àÊõ +ªÜ£ Š7Xñ±‚ž¹« 弜i¢Ì§ª¹Ôâi>ïEà,‘²Ñö¨%ÒÐeÒ +¬Š‚áj[5Vm8ìªòÕºÊVU‹å_µZ-Öm—ߺCò[[7ä·¦A-Vÿôsèy¡\ÄÛ¾HJÇç1eRl¥4Ý^kЯBƒÔn£Ôfsµªn£–ÕíÔ¢:D~Õaj^)Kõ`™«ãeÚÊổÃf+]M"«Ë·ìƒ“4(…Ûð-ÒwZ^ÊÝ…Ä;ÿiöâr) Ÿãž“¢ÐínwFÔÎ[¥àèï’Zîi&sMk.:ƒšâ½B8ô‘jiÊj¹pk¹xjÙäµu-‹×âHíN~sÎñÜp¾ÑRb]ŒÏÓ05g9à§#ž§Ñ܆þ‹èïA¿V +xEò{M\0pÈ°ãvÆŽÃ4äGÂhˆ±ã
á1.ÿ:û:6zI®Ã¹:bQG,Ž½Á
¸¥…Ïr/¬’òÖ±Ë>¨¦Ðí[#…½Œ>šA‡¤VG%ËëhŸ€·š8Ùœ¨Íh[ém†“ÓiÊhÊßmlÒ‰GccPÏ¡_ONêIt=‰ß.ýœâ󸤹ë9_ ñ9é%Îtz²ÎuR šþ¤Ðà½gàl€óf1Ñ3¨] &;Jw•>é%}Š—iB®PWf2ÄPäWIðU„®Ì«8rõ´f`ÖDböª4ò05€nt;¡xZjñ~“ÞyÀlý þ—€ÒÒ§p>³HŸûK×o“[ÔÈékòrfä>Ï7vßü’Ý@a5쇃L½í ¨‰Ð
úB,$B&äé'fÝš¥ïåÑ¿´Hßêi5¨\÷µB÷˜u¿Öz}¥Mº£íº=ºÅ¼û¥êtCïê:Æ~ή±Â5Vûìÿð)Ú@ +ð£b4èoØñ‰–‘š +R´ +*Öߨ´ÔíÑ9½¦z×û¼¾Ë“ïµÓxö6*§àí&|ææ¼ÐøÞšXáoýC½ñ1ßHw*>M@'_\h¸Ñ(Ac«{)ÓezO•è<‡ÆzÖ߬“ÄâM½¬7tT¯£~kâÍaý +~ÁºŸ³î‚(ëzBðÔÇEtäIÛä2µöStÌ,R–CÛ‚5˜ÎǤ 9ØUP„Q¡#ÂJ«±ChÁ °ýB7ú„>„¶÷ ¸}=ÛÇÑ]8ƒÎÂc,PxuÝb¾¢Ì'úký…µ‰¾&Ñÿùˆj~GIÿ¿‚F²(£}‹²LÓs™1ì.ŠÃ¨( Qvˆ0 .EŸ¸!q‚bzŠëÐ]ìBg±âNt÷ÁW2Š¶’)ÖZ²À¼¥çXKéMæ–¼C~Êš%Ÿ‘¯X“$º¢™|@5ï©—É)p¸œêS–=eÀå‹”®Ç d#ú$éJrÑ#¡K*C@Z¿Ô +°WzPWÙ [å +`5”À\@mµ¦j#Œ5u¨©iBuc:ãNVeœfZãq¦1^áTïr*LÉ#N…ñKúåTÖ¬`o+&à™&£¤ŸîuÒóh¥<Í”«ÑƒzS<l¦-0›²`ªÍ‡±VŒêZæ +èÍèÌVTYœÐZÚ ±ô ÒajË~¦²,²rË%¦´Þá(¬? ¿ã(-I”)ÍQVNîZ¨/™#d’DH´S–fZèse5ÌÖ8m›QmË€ÞƇ®®Ú: 4u*TÖëPQ_u½*»åö.(ìCÛ'™Ì¾ÀÊì˜Ô~›Iìï“OèóLZeÒº(+#¯ÙhÕ!sd7$]ÄC«A]m4š›ìǨjH„¦!•<¨ r£Ü©€Ò©Âi„ÜU™Ë
©Ë‰k +ÒöX”ú6¢¸#
âD(ò£Ð¯Àv¿B¿ ‚€ù/ò½È
ì?0‹œÀ2²¯€x€mŸƒçÿ¼Ž¯Y¶/ºâýsdœêõ?q»éð +¼e*{a˜Ü +#åZØ~/cÑ`¹Å˹h²œŠfɱ¨L…52î–}Á'2|#ÃœïåÿLyV-J¡!
’‰wìdb€ö›éR,)r¦–'¢?WòXÀXb''‹³-&ð–ƒ%PKGÙ[̲³ô–¥¿ZZF¨…%Y6–5³Ì'áÕRévvÌ’+4Ä»ðxªB✓ÐM˜JÌÞÎ&øl.@ÝÀ…è—¢¿ýå’c…l+eSÉ0º’w¥/qÁƪxø«hòU4–jŠ«:•¿q¢jŸÙû>ç¼€ÍÍi06“»@¼ÿ0›{€Ï]1½ºK%ï’‰5Õe•dX+µ¨aXo/m` ßàÆ£ËP¼;61”Ö2üÔòð×Ñèë†@Ì:X»vò¹ãp
¾ã{”•KO"Þ£ó¥˜br€Ï¯.–ÂË¥ *ôÑ4—œqÁ~³d³%dÔ³Õ³|à$í$;‰GƒñØ=€‡g~IÞƒs{ˆEc¿ÿÄïÓpnk*>'Í“†•|þ]%5ˆ¹!èúðqw4ê¥V
èîBÉB%}lÀN:èÈPÎBpØ$aIø˜¡øvg9Îãs‚Ë~‚DŸDè$Á<É'ø¢=óâóëïQµÜÁ÷%_BfjD¿d{ +²¾ä4cÇþi3TÃÚûBl)Æ–žá¼ +
6oRŒ¹Q1ѧš
ŠþkP´õÌVbÜÙ +UPs ›Qlz4³>¶¤DÙ(9ÊI‰Q&1·S¼9DqæpÅš»jdt/
î«aÑ44zˆ†tÓà®cÓ-Mƒºåh`÷yн\ÿgºÌ£¢:Ï0þŒ+*"àŽEP”E†a†eXT7Æ( +.Çšb´¥š&Zš¤q_cÆŒ5Ö¥1Ñx¬ñXÍÒ¨ÑZMÒäD§? æøÇï\†{ï÷¼ßû¾÷Þ÷É0¾¬tã^ƒÍø>|ß‚ûšñ3ÖÁs°æ1þTG9y™%ÑÝ41ÆW…1~¨ü˜PåÅŒV®1VÙÆ$Ù6es”[ ŒØ2¥ÇÍ”-îWJ3-Wª©AÖøMJ‰Ý`‰?f°˜¯r¼îŸ1¹
6ÓŒk`TÃþ7ƒ8¦“bŽEqgò–ÃÔO9¦Á²›†+Ë®ŒøhÙâÍ`Uš9K©æq²&”(%a†,‰ó•Ìpœ”¸F‰IÍJHÚc0'…+ð
¸
‰?ó:cx#Ô%S˜3ù=•|K!1å'tTN¢—쉽•‘è/[ÒP¥%”5)J)Iq²$[”œœ¡¤d‡-“”`™.sÊ\ŧ<+SJ½â¬MŠµî2ÄZŒÖËïbS‚»•žIÆð•°ªÀ ¥ÄQÎg[Ú)#ÅSi)¾²Zýd±Q²5D‰©‘JH5Êœš¨ø4›Li¹ŠK+R¬mªŒ¶9Š±-QtzƦoÔ˜ôТ¨ôKïjŒí0¥¹µÕÊ;1Uªe¯† +˜Êï‰üßv~§Û˜7m]•œîÄŒ~2gV|F°â2Û-c¦Y1YVEgÙ56«@cì“e¯Ðh»K‘ö•Š°oPxöv…e† +³ÿGáö +Ïr+^eý†ti)̇Œâ¥ÀÎ߶L<G3·½“LÙ^ŠÍé˜Eçiln¨¢r£4:/N‘yEäe*Ü‘¯0G‰F9žÖHGµB+’ÿ’Fäo…CžN#w4"ï'…ä¹’ëV3u°J˜ŽE›Hg$OÉ•ÌØ¥Øüv;ÎSQã}9¾¿" +V0\£ +Â5²0F¡4NHašFæjxÑD•kXÑ
-ªQPÑ +,Ú¬!Eá,ÜV`á +,`r…õè¬È¡0&£É2ÊF75ŸýC¿ß1A +Ÿä¡Ðâ +)îá%þ +. Ò°’P
-‰RPiœKS4¤Ô®€ÒB
.›ªAeUzªl©üË~§e¯j@Ù~ù•~ ¥75 ä
,v·²–±)̃r4‹!ÝÌñRr¾Û:¶ïW†÷™Ò^AÓ<5dº¦÷Ó òÁzª<XþåaÈËd€3A~N›ú;êç,U_g…ú8—¨·³^½œ›ÔÓù¦|§ä[~]=§¯^ÓÜÔ¡µK8¦°ß"ÈE;
ms‰=Š˜&(—ŸÆUtVÿ9^ê7§§úTú©we€zUŽ€õ¬Œ•o•E>UvyWMP*§¼ªªÕ½j4ʳrºUS·9×ä9û¾ºÏ~ înÕ¢µ +Â.úÏ•ú.|«»¨‡«‡¼\½`€º»åé +Q7W”ººâÕÅe“‡+_]“ÕÑ5W\ËÕÞõ¢‹0¯‹ËP}A†…·Ônáwð“ž)¥a¹ž9Sè´ãÙsÔl)´ +}tŸªFÿ×è?‹\ÖI]j<Õ±ÆGíkú¨]¿5|èkøØÖòr¯åÅRKS?Ú`íLàÆÚ5œ…¡`?àu—]§ ¾´<Ï„2G¾3ÐND;zž4j¡4t1úèö].ù<‡þJÉ£®ƒÚÕ3 +ÇGfó:GMÎÑhçIòù
ÀâçÞ†ã* ß¿ç]ÐÈ{€Ý.ù¡ëCûvy¬ùHç8œZZgÚ8”Uçàø|J}®Ð'×|¤/ü¤¯‚¥ëFé„›ÔäkŠ~‹»E’o#v{n¯;tkÃü`Œ3¤ãóõ?M—NñÎÒ=üå]üå|îm-Ó-ÐM<æ
ÕW8Ë/ñ™Ÿãt?ÓºªÃºBà—9sIߦ»•‹m|Òêy= Câé‡ +ÐÉFý¯{ùoèk•ê:þòKüåçøËkÄñOâ¸B—õ<õº u:¯ú˜æ=KÑ[Dp\§¹êÑŸDáÄœlAOЕýúpå@öÌÞF½=+ä¡1ɤÞI *ô!q|@#ŽÓÄq’8þªÕ´Ç‹”¯™–ÙB)÷’‰½Ão“±ƒdõ +$¡&!Is±MÒ4I›&kÔf]zd=Uu«¢®«¶µÓŽvÕ6µÕ¤ýQ©ÒºNÝ:mk·UíŽvÞ·d¬Þ÷÷Úz¿ß÷ðó{>ÔI}ÎRþ’/Öÿ‘xW¼%^Õ½ø¡îÅ‹º7ÈÓZÊ¥c×:š´ŸæïÖü\—Gåãù¸&ßdQû¤qXóžÔÍ<¯pz…ËúÕ}šá^íÖÝóÚés:ñóÒþ’DÁïv)^‰VˆY
=·HÓ¨5¥K¯H:Ò©Õ »¥Ñ. fƨ4&¹$åã^íÇöKcEÿ’»ô¹Äi¹;¥:©Ûp\'zL»}Lçñ5iÉÞÞTx{Y<¯ðò”ž¯+ì='Í$éeK«D³Y¥ãäž5ίéàî¨ g£85Êé¨0w®½•“k8¾vÇ¢±}'G×ÝÃáuW9¸þIîXÿûc~ξ[Þc_ìÇ,oˆ°÷ÿ¼£ÐúS…ùçÅã)z(Ä]Qxùº!šË·¸'&™s±yÜ[Æ©
ÕœÜØÀñ-ÛØÉÊÆŽÆ
p8nŒCqSÜ7ϸEöö³l8ÆÃyn7<ÈRüìŠÛâ_gaÓûì4~Êcä+ÞTh)çæ«æê_ÊÔë4î’·3 1œŠ7r|S+Æ"-4:8àbBË ~ö&ô²;aˆÛÆYLœfWâN÷²#é(Û“Î2—t…ÙÍ×™I¾Átò«L§¼Ç¶”O˜J|ÅkzýÂÃJA.©=«çyJ-ä爼J6p 9™å”\v§˜XJb1µŽÛR›YHõ²#-Àö´si#̦M2“>ÇtúSé gœb"ó㙲5ë;Œeý„Ñìß2’ó±ˆ|Å+ +çO›ôúçÄ =.VÊ%?{åewV,‹Y ,de°#»ùl3³ÙÕÌäÔ3ãa*§pN7“9Œçnekî4£yŒäíg(ÿƒù(¸FÁsôþˆPá;„Šþ."7)ŒðR¹î .‹ÓJÅŽ¨].ƒ%ùY—ë˜Ëg¦ …m¹„K˜(¬d¼ÐÁX¡‹Ñ¢V†‹üõ2X4Lq˜¾â턶ì¥GIP°äݦ‡è2=K ôeñ6þÒ¿‰ˆú7¹Q×¾H¿”úÔ_ÒØNy›•—™’5„Kâ/Ib¬$“SC¦rM6úMNúJÝô–úè)í&X:@wÙ8]e³øËo§³üæs´[®â³<ƒ·ââ7âCñ_Ák‰ðœÒ«6Ý¥Gı ±Yy™Ò¾Lh_Fͱ™˜Óè3çÑk6´TÒmqÐeiÄoi¥Ó⧣"D{Å(¾Ê¼U»h:D‹õ,ëxlOá¶}ŸfÛ¯Å_Õÿ\DVyFšW”fœ•/ªÛäk\û2,ªÖªŠ'X•L—5¿µ˜«™v«
ŸÕI›ÕM«[žêaÜÕS4×,Ðd¿—ýŽ+48ž/QïxKüEýÏDd•'¤{©VwQiÆ>± fô<¡ñaùë¯QÍS³–@M5‰øìxí´ÚKñØ+qÛ4;\49ÚpÕvÑX;HCÝ$õu;p:÷Sç<EmýýâqõßÃ^ÿ†Ú?‹ÿàpF¨ÕÝLÅWêuJ…·‹°ú£ë— üøõ_ÝÚœF<ÎTš¹49·Ðè´ÐP_C}}ΆêüÔ6ôãhÇ®¥ÆµLµë$ÕM—±5}kÓwůğĿ±¹"«\“æ¹FýÅ¢Ky¾ƒzÊK§¾÷ªïqÅÐ䊧ѕL}SΦBj›Êp4[±7×QÓì¦ÚÝÍÝ‹Õ=F•g–JÏ*ZŽci¹O<†¹åÊ[~¡öñ/,žÈ*JïŒRðÍ:±M%Ò¨Ú>Ñ©ñ6µn5z¢q¶¨mIÄÞšNuk>¶VÖ¶JªÚT¶¹¨ðz±xƒ˜½#”ûf(ó-Qê[Áä»—’öGÙÒ~C¼Îß(ñý“7²Êý_”eJ¿÷¶À¼˜ƒ"(¼¢YåRƒÒâZŸòþö
X;ŒTv¤PÑ™ƒ¹³˜òN3eÕ”úë1ù[(ñؤ80EQ`…#.ßõ°xž¼®×ȼO~àS +ü‘U.¶ê.HgIÜ*1Ñ'üÒô´ký*•j;Á€Šîʃñ”“(éÉ`KO>Å=&Šzª(ì¥ ·™üÞòzûÈ
MÚIvè Y¡»É=DFèÛ¤‡~&~OFï'döDÈwKë ´Ä”ô†DP´K·IºN•®ÕAé÷‚©?Š¢ÉL!w(‡œ¡"²‡Ìd
U“9Ü@ÆpéÃAÒ†GI™#yd›GΈ«$
?KâðÅ»$
}ÌæÁÈ*wJkY©ÿœôÆE¿H·M%ZcØU¶V¨ö‚¢QÕ[cȘ06‘HêD:)“y$O–°y²‚¤ÉZ'Ý$„ýbcxšMáÝćOb_O7ù²xÃÄGÆ?#~<Š´µÎi1"ÍÑ¡5»UžÕI»JåQÙ˜ôUžä†!}z
I³±$ÌmÂ8·™Ms™ÄÏ`˜/6âæØ8ïeÃ|/±óÄÌßÆúù£¬›¿HôÜu¢æ^díìDÏ~@ôÿcºL ¢<¯0ü"‹"2 +*ƒ²ˆ5®"(Ȧ((ˆ² (8* +Ž+¢ŽË©â‚©1n&ÑDŒQc“Ô%§iŒ[5±Ç¦MjÔ¨IÛ4©Ñ4>99=žÇ™ÿgþûÞïÞû}ÿ½ßÁTÇ:+Ñ+„HÏ–s©Ã<r0KŠœÍì5}ÆÅ€y’o•Ô£ÚMƒºYŒêjñ“«%H.–r¶D©‹…CÖÂf²\°”Á2`]x +½"˜éÒ„9Ôa 9¨ Hx< ý:ôW0ƒ®–\h„×Ñt6Ò|6Òˆ®ï)mÀ4yéÛxéÙ8Øl›…Ù0fãa[oå·çàÏ=‚oU†fdïIÄ;¶’}ÈšÃMƒÑ
àQŸµ’'Ëèf“ºRšgxšðmîÒvühÂø±?váÇîp©™—MÇ᳇BÛC,š1Ø̬ÛÜÂßÉÇnò±ësøZsI×tâJ¼ãkج9r9úkÐ_/7K4Ýv »'
>Í'ì'-<hiÊùH‡ýiŠð£?:^ˆmä¤k#m« +õy…d_µA½zNÁyeçrü·Ã÷r±^_Öj`}ÎíÍs‹Ã _â2|WáÜ€›NÒ'ÔërÓ1¼|Ì GÞã¥ð›ïþ|`Áö +û㱟ŒýLV˜ý<½HîÁfüØ…;ñ£I+µÚøÿoå—[°²‰ˆm${•»ž +_v£ƒ'ýl©SŽ#§º8ÈiaìÓ +ö3¨¾l4ò´?6ᇼl >UG$Öòo‹Vãá*V°‚Ì[Éèrª¹žª«cÇÕ£ßÁ_ºKïs¬œ4 Íg[{/Ç^³º£g¤ºÐ A' +áhŒEc)hd²²ÑÈcå³Ñ)E£ +»‹µŒ«ZV¾„È,""[Ã.¨vºê._iós°wr#íÇkGý>>wp½•ãe³‡³l®wòUƒS Vw ÕJçhYG¨Þ%Vu.‰ZꚢZ×L-qÍÑ"×|YÜŠTãV®j·ÍïZ¯ª®ªèÖ¤yî-*s?¦R÷wTÒýc•x<Q±á9Ø;¹Ä‘zœã½…WMظnภ+Vz¹iew/Õw÷ÓRþZì1HCŒFªÚ§†$Í÷LU¥çUxæjžgÊ<KTâ5_Å^K5Ç«AE^ÛTØc¿ +¼_Ó,ïw5Óû¶òÿ€ÁÞÉÛ}yñJì'm‚Õ|¯ç^-þ,â¨]dt×Bo£x¨ÒÛ¤yÆ•‡ªÔ8Z%Æx'jŽOšŠ|²T蓧Ÿ"ÍôP¾ïbÍè¹JÓ{nUN¯½ÊîõŠ¦ùS–ßMeõþ +~{''y0Ñ +@Cm
ŸŽøøS‰/óü]TÞËK%~½4ׯŸŠüÌ*ô¬‚ÞÃ5³÷Xå÷NPž²¦ûg(×?GÙþšPª¬€MécUfßMÊà%˜Ø¦ÔÀ³J
º®ÉAá°sm×±´¡Ä€6lEë泊ërü)Æ—9ø2;ÐC³úú(?°fš”®œÀeTVÐ8M
JÔ” TeôËRz¿<¥õŸ«Éýç+e@’lФàÝJ2…ÓJ4]QbÈ—ðì\ÛÕ†î.ÚÆiTC×s¸_€/ùø2#¸«rƒ{hZ°Ÿ¦÷Sfp¨2LQJ7
Sªi´&›Æ+Å4IÉ!š’«¤³•8°RB—j¼¹QñæŠ;§4.ì²Æ
zÏønçž]‡ÑÜF«±f°´*`núÜË£5Ì!.Yfe†z*=ÔW©æ>J1›”l×Dó%™G(1,V a‰–¦øAÙŠ/иðrÅF,Ö؈‰lÒèÈCuR#£~÷ùþ=Ø;iAomÆ +Úá…1Ä +ùžÇ½lü˜Šé09ÂC“"ŒJŠè ý•ªøˆ(ÅEÓ¸ÈÑŠ¯±Q)5U£çkTt©FF[4bȽ0d»†Ç¼¤a1íó|Á÷§`×ð!víòS\7”yŠa&äpo +K#.Éø“ÝM Ñÿ£ºÌ£¢>¯0üdQv•MvD}†}GEepcÄ `Ôˆ\ +`²’Ò§)1Ý®„ŒEŠÏX©‰gÞXóš`>·xÿ7Åe8Ù†V7ºm\›3¤™0*ù»òùÌÊë¤ôÇ”‘á.S†R3Æ(Å<NIæ(%š'*!3Uñ™™š˜™§¸IeP§XËM°,TŒ¥Sã³Ö+:k—¢²+2ë,Üàý=E[ƒl"þ*3ûkÔ6®Á5¼–C!X!“ÿ¥Yð7%ey)ÁjP¼5PqÖpÅZ'hBv’b²Ó5>;[Ñ9%ŠÊ©VdîLEä¶(<w¹ÂrŸWhÞËpH!y§áºBsïÂC…å8´§ÑhEcÖhTB ä‚Ù*™¸'cWòœ—|_/ðWTAˆ"¢Q¯ðB£Â +- +-,THQ•Æ5(¸¨YAE +,zNÅ;àuù¿§±E×ä_ôµ +¿Q`¡CßE§ùèÌĪÖB9‚Ýô<îü\‰ã±*1ÅÃU2Rá¥Þ ++3(¤,HãÊ"\« òd–›Pž'ÿò +˜¦1M]Ñ&CÅ3ò«xQ£*öÃIùV|ªQåwäWþ@†2‡ºÑz¹hÕçKUPy0 íÔ"Ö_‚÷Ä:FbUB*]4ÅSþÕ¾[=VcªC4º:Z†êxù1È£j¬ò)ZùÔ4Ê»v±¼j»äY³~ šð‘<«¿‚ÉkŠCè,d³¡½ +(„ìbjP*%•ã;&KQS¤Ð)°N2L!ßz/ùØü @Þ¶0yq yÚ’!S¶¹Ûª4Ò6Cn¶¹Ú:åb땳m¯†ÛÞÒðú÷å\ÿ%Ü•ËôjGëqÖÙ€^5”Bkž„vj%Þ{]+…amÒè’ÏlyØ=4Òî£öÑr³ËÕ)gûD
·›äd·j˜ v~dŸí°VjĨ6bØÏ3|øÝ9wàZ„V#5ž“YoX«Øh'²æ¬QXúØÅÑè7IžÍÃå¶À]N¸ì´øú–P›ƒ½••ÖJ[)^ëlX=€ßmÁ¨¶œâ|!ü3ü]óùÚ¨rÈ£Þæ©ìƒzf`¦>}t
Íè·à±j®Kœ4l)w)·‹W—že7Úv2ílí{Emgíó¡6Ãk|÷m~snãžæ²Öé0Š(…z§²æ8»E
B×°Hò~Rr_&¹,çÒK8p.£+©Å*.]«¹ðtqáèæÒæ‡Ã‡Aïaa=°§
èGϾÓÏw1«]_ð»¯5Í©PFŸs([Ú\ö!kŽ\ˆ>ºZéõiÄJÉ©mì*si-ñµä±Ž<ÖS
Qòè
zt!êãaØGOú¸>jÑÇbúº`;Ÿ’6úÑ{[
èV‘fõ6S²DÖEÊÁèV¡¿Fr{Íõ° ¶À6xh¯¾ç$íà2þóÞÒ.æc}ÙËÅc³±žìcÈöÑÔ}ü¿¾Ç¹À} +ûá +ü‚þ\eN>aF®Ñ—ß2£×éÉgløÛM†ëæVéżu§õØ ïuÈ <ÀÆÁ=”wš'-Õ]UëŽêõ'üÔmüÔðu¿Ç×}›úœrÇuvxaù”Æ}‚kü˜‚}¤Ó¸Ý_ëC<ÞωüÁá<Òÿ74}t÷WEé/JD3½|t*ШÅ-6¿‘ø¿•øKˆßAüNâwë}üÝeâE|æy\ëY"ƒ·qyW(ãõ®Ð2Ç9ö?9<„{Î=õ;ô™Bõ¼î¯¨ÅDz¢QDüJÊ^GùtŽ<ÎÇ)òø)y¼‹³|‡<NàBi~Ìê×NªðCÚÙÛ<Ï8Ý$£û´Øñ蜚ÔSú%^÷ +^÷µ8×=£t2ÐÈa$JÁ*"Öéy¼I_k±[ˆ½X¯“Ç kã
z
õ*C½—o¼B„ݺª](íDu€—‡x8¤}h¤ÎÈ™Êy²kÑŠ!~2ùf²óˆ]ʶ¬$v±mÄž=j"öâ.f·k‡Vj;Ù‹ôd*[Èj37Ñ¥^}©ú':Ù<¹¨ù£ÑØZG·áH´|è¦?ñÉG|#ñ-t9إĮÔVæ£9ݬYÄžK¼Ä]B'žÒóêbB×éY¾ý‘z¨Z7“ÑÅDfÚV£ý-7м8´Í=»¨Åvj±=²EÁäEü⛈jaêò‰_BüJâ×RùzâÏ"~1[¨ÂR:Ò©§ùÆr²|Š.t}«lcŠ—ê+ø78¹Âñvœce¿+Ú¼¾ÀßQ蹡åMEÇ ‚FñµJéÄÏB!_¸I4&£QKêјÆ<vìT£C‹Èê "µRÁú±€iOÇ›ÙÕÍìøfô8Í‘vˆãu¿>XËû5î<Ò\‡iÕ0w´|ÑòG'X4’ÑHG#|4Jô’Ë=¶Í«ãOÓÜ»¶[;iì$Nb'Ž'±sqb×±sq“ØiRçÒÄMš‹Ó6½¥Zï:íÒum·U¥]K+T(L\¤Mh B€6þá&BĆm0Ú‰3?Ú?~:ßwü}~Î{ÎùÎû¼˜ýŒcûc/ßËÔVˆ0³î¬–Ö]ÔbÎ
-ä|Qóë_‡75—ûŽæòþ©¹üO «op”}ãý©æœãú$Çì1Æs´4WG +:œkÑ¡\»öçÕi5Ï«½ù~íÎj%?¢LÁ€–F´X0¦…Âií*œ×\ÑŠvi¶ø´fŠ/hGÉ‹š*¹§É’×5Qú&¼£”á>dò +éö³e¤E¬ÐãïÇi׸?€-Ye,«Æí-5j¥ÔªåÒJ-–ºµËЬyC»æ=ÚiˆjÖ׌!©Æ”¦iM—5a<¨íNjÌÄ®1]ר鞒¦×”0¿¥ó»ð‘F,YÚ¬^F÷ºƒz¯’ø«Ð§ÝË}†c~‘±,lZ§s±æLf¥Íåš1;5mnД¹E“æ¥Ìam·ôiÜ2¤1˘F-ÓJn\ÐÈÆU
c>¶nzRqëU
ZïjÀöuõÛ~¤þ²?ÂÈ>ä.š/8™lجÇ>Xæz{˜f,3ŒqÚ–¯)«Q)ë&Û³ÕiÔæUÒÖ¦„-¨‘²ˆ†Ê´µ,¡xù„Êwªónõm~LÑŠÇÕk¿¢ˆýsÚâxUaÇà +WÞ§ÍÒÇy…ÞEÒüi—tÈ-À<×3ôM2¶s3îÈÑ6{©’f
ÛË5dw*n¯× ݧG»ú=Š9bŠV©·r\‘ªYm©Ê(T½¦žêO©Ûù¼‚5wÔUóŠ:k¾oÇÜgòZçIñǘìè"Ìr=Iß8ce^F˳HƒÕÔ_mUÌéPÔY§^g£¶8[®éR¨&¢žšAu׎*X;®ºEuÔT»ëŒîËò»o«Í͉[ÿ=µÖÿ–ö¥?«kh=îRü˜‡io¤Þ¡˜yd,}®<E]E\…]›ÕãªVÐU¯.W³:Ýíêp‡Ô^ߧ@}Bþ†Iµ5ìR«g¿ZOÉ×xQÍ·Ôäýš¼ÞïÂo¸þ;|BVWÐ9‡æ4ãc@ +F¹jÂgò{¶xrÔã)QÐcR§Ç¦vCOÚ<jmlS«7¨oT¾¦!57¥ÔÔ<'oóª}'äñ]Pƒï¦ê[¾"wËwà×\ +ZU´«¦»VÎnª»ÛTÕTeOLŽžÙCSª-isè°ÊCO¨,|
¾$[ø[²†&[è=•…>Vy¹ý54–ИÁVˆA: …RÅÛ#Õ‡¨}Â…rn1ª*bQe¤\ŽHµì½nUôú´¹·Ce½Ù¢C²FSÚ]€CÚ;'KìªÌ±{ðM™b?‘9úWY¢ÿ’¥7«3hïÇzÏ£3N Að£Û„%nˆà»£RU_®*úKT>`RÙ€UÖA»6
Öjã`#øeÉ)>s2Æ÷Ãâ/À]•Æ_SIüÇ´ïÊ0ø +Emæ$PÀf>ϳ‡Ë?åÝ¿À}í"Î ô´JH†ï%æ:bvÌ ®™RÑ°$®Hë÷®ã@ÁøíÃpíÇìÀhĈ²ó‘‘`Ö¼>¶5&ymxyõX{†g(b᜾âÝ5‹Þs/w¦¤æ)ö +ž£Oán1°¼Ã.¶þ̓¾ÙŠ×¼ +¨‹U2 E|ñÄÏ$¾—èEÄ/×"|,ÀÇ||ÌÃÇ\òq7õÑ˺½‹§³øÕLÜOgTÓáT2ÝCe÷èOð…ºÑà8[ÚS6óú[÷³Õ.çÙR^‹Ù/i8:4ðìD#<4ŠÐ(G£J3ð1y™J}ôP§Ý\M曓´„»ÕTÌ÷p÷$™:¤ª½ƒ¤ùè`vàá [Ù6¶÷
¼jV˜Ïý^?½á!š=8-:qèØÑHCÃÍhóÐ(f…–£S‰wÔ«óŽMÔ¡öAS4>ä.Y¤ÖÁ«Ô2øa
Ý©æЃj +=©Æ!çÔv®A@{ÐÜÄql5[ê=0f±ÍOã5Ü3\ê6„ª;Ü IC¢tg˜UaÉšæR{X¶ÆõiÜе
Tkøhµ„7ª9|œš†u©qØ5D,P}ÄJÕEnÔèȪ‰<¨jÃIø\ëÐhn8zŒ`üÇfB7×]<ëÄK^:ŒCÕn0jœ!F†x58ÔlÈP“!G†1”ªÞX¥:c½jmœ¨êáÓUeš¯‘¦ûTiÚ¨ +ó•™ÂI•šß‡ª4êkîÙ#Ð[c#;zyÕöÀ\·s,kã³¼4G‡¨Ù¡F“I
æ8Õ™íª5§j´9KÕf¯ªÌÅU¡‘Q£UÕ¬òè•E÷È3G%1ËTlùŽŠ,ÛT{ +íFùìÑʳÛäµ'+מ®œ¤le'ùäI.“;¹FY)ÍÊLéT†c†Ò‹”æ|P©ÎÍr:Ÿ–#õx>“3õÏzÅhÎL§9þµeHcø_#yV†—òRùŽ!ò:Êq˜åqÄ)Ë‘¨L‡SÎ,¹œyJO-QZZ•RÓåLï#}šR\”ìz@I®GeÏØÇ•˜ñ6|ÊõW<h5úÑ›–É<ÀXŽuPÅu9~Šù¬ +Æ*º KQ½2.‡ïÊT¸ž—±ð—^pQ¦‚C@KП‰ÞDÚ‘±P•P>È…LÚÇÔ|ô}ô^…ƒd+ +W\±Q–âhÅ”X]’¤¨’tÈ‘Ù_$“4ÉèŸ(cé,J—*²t=ìT„ÿ°†ùOÃÇ\ÿK‘%7´±ME£F4ª¡Š gžÿR]æAQßg¸Ø]w‘EЪ(* +È-,»¸‡«»ˆ +BÁŒmªÄƒÄD3iÔFƒ¹¦Ui;1&ͤšÄNk’NÇcšÌ´éL56iµÓÖ£c³ý,îdÒ?žY–ýýÞç½¾ï÷}øÌF¦L+ƒ¿‚Ý©`«ŠWJµQ‡Ødv|dÉäÈ•ÑQìJvú”ä\*ƒ³C Î~Å;·+ιO±ÎcŠq¼§XÇïç¸þ¥^8V±„ÕÛœ`>(ù §Ý÷”*i¢ýådÿ_+³;IFYIžñJôdÈàÉT‚'[ñžÅy*ãu)Ú‹€õ®ˆ'/Ñ‹pð| <è<Ï_h¾Ûê&¾åðáq;(ó@1Ï„;³~$Jš~d›Ù«äʼnJð›°**À@0àô +PHÌ9ÄœEÌ“}èO?üµð/¿QŠ_ƵœEgKOËF+—k+:w%—KƒµÃÖF.Ú(\/¶Q¶u`;Ï°-®D¸µþ°M·ÜT\~àvPBÌsˆy&1O Â_?¼æf4`‹‡9†‹V§AZM.ºð£?ÖP“Ãpxøs {ÈEÆz–êÑ3ÈïÏñr
[d÷§àïªç¨!måÄ\@̳p}jƒ”Ϋ)ðšÚ$C‡Ý7¦XÓlàaüX‡ëñ£?X†6N`àÂÝLM6s°6“‹Íôæ¦U|RM»y†žØðSp‰w®+§TQç"Í¡|™ÄÌÕ«^3uK a·A?À¹XWY<Á£Ôe0þþ":„ÛÈÇò1Ì%7ÌÀ¦é‡ p£;q|'õØq¥…žØöøL~xÔ¹”|çÑÂÓ‰9c5ü=’‘Æmˆp> +¶‚í‘Åûqð„î/âO=äärò,êwéÓ}øq€Kù +~±O +y‰À.þ…¡¯!˜M÷ÐwÿAÏÜQ‰þ¡jÝ@Ç|ν†:¹Šª+¥OQ8¿ç|‚¢»Œ»HÓü–â§I~E?"ˆsp‡Ïè×hºë¸Bå„p;ÄC¤-ô>ÜU”n¢3o ï>×$}†ž¹ª|ýQúX5º€Î=¯:ì7jöÀ~ö{°¿û›°=Hj¶“¢=¤k? +óUxŽ“Â3z]WÀ]R¢tè+päk>ü\P\fýFi¤3®Ò[G¥P'Ø^„ÿuz›|¼…Â:êzö:~üùCüE©Õ0-³¥{/ŽÑJ'iÙ:ÓŒ‡Aøó ¸ïßƸE¶¤Ÿ+Z§d$†üŸˆý,¢˜ƒß%ض㷋–\D›ÔêôåK¨Éè˔à!ØAüøž6“Ÿ]Täyï«xs‚cuåù9ú/Ÿ¡¯pÞ#ôN¤õŽÈÀ[f|·a +Gböó±]Šm;V]Øöa;ˆíl/Ãn«vãÇSø±‹º<Φ7vÀ²·#‚dr´E·Aè+|2»ðòþ‘;ú1Ø7bÛŠítìf‚ÙØ.Àv#ÊŽíØ^ˆí +êrz³™SÓLõ›9ñÍð‡q,ŠøãǬƒ`#£v£¿—ÿ÷pFØH±oÅ~:ö§b&'2ŽB".ƒ£ +Ž8¼p°Ù@w¬àÔtÒ±kµ„ªÔÓuÔ£–jéö §.¨¿‚»€3ÂHÝÃxßÂU3 +DeË=G‹£‹´(º\¾˜jycÜòÄøåŽm+¶U5qÝrÆ
È?¤êø½²'¼¬ª„ªL8®€›ª4ÜÓ^ø¶°zô¥¿íþJÖÄßKXkñ'€/S¼üIF-6Xå3¤Ék˜,!K.Ãl-HÌWMb±œ‰óåHªQu’Oö¤zU&¯Ðüä.UûUfR©q¯JL/«ØtBE¦Àp|©'áú6¼½\³pÅ-õÀÏõïãÿ^~w[¢å6ä2™UcJ‘Ó”®jÓTÙM3TeÊÕ|S¡*Ìå*7W«ÌìU©¹VÅã–«hÜjͳô©À²Uù–½šk}Es¬o*Ïú!¸îð=¤pmÌ`cmázk +‹Må–I*µNS‰5[ÅÖ¹*²«ÐZ©‚—òSš;¾IyãW)7urR¿£Ù©O+Ûö’fÙÞÐLÛ9pÜá{HCð÷ÁÙÁ +ØÌúU|ÀÅwä“*ñ¥_ÊñµÔ– ’T“ŠRST˜:A©“575Ksl¹Ê³*×V®DÐì´EÊž°T³ÒÛ5#}²2˜.»5-cD™Ç55ã,øß!
¿Îö°4`õò$“|ÿÓeÔä}Çño…Jx b I€ðä5AI*‘ˆˆà;–ùÂœ¢ÎVÛYKífµn¾”Vúb»›UQ«óÚyUÛÎÎÛº›uÕ¶»]ﶹ—ž]·›×énÝÖ9ö d½÷½'yÂóûþ^ÿÏïÛÀýz|©Á—*|ÌW…%Ye–ty-Y*±ä©ÈR O®GîÜr¹òjU˜×(§µEk‡ +&-V¾_vÛÙl»4É~PVû÷•g¿~«<ÛmYm£ÚÇj8!:œh0
LõÜ«æ·Jü)çÿJA±Í Í(·Í¤B[Ž6p©ÀîU¾½JöüÙò§kRA»¬Ž…Ês¬R®ã~Yœ;•ã|Vfç)e;ßוí¸%³ã?ÚÇ +øzXûÚ]ô ›p
€îUò[(Áp9&ÊéHQ#]vG¶lN«¬N(V^¡O¹ˆS‹kšr\m2»{”í^¡,Ï&ezvÈäyFž“à¢Ò=¿V†û¯2¹ïhöï…¯‹•oh*¢ÿ¸ÖÉøSJøÝœ|ÎwÇÉæI’ÕcTn‘I–"‹rŠòe.r+»¸\YŵÊ, ÊTÒªŒ’ùÊðö)Ý»QiÞoÊè'”ê}üÜ”±äÅöRøæSp’ Àµø@)>”߬È8Ki‚Ì¥©Ê*ËPf™Y¦²IÊ(/Tz¹T)
±j¬hQjE'èUŠo@ɾA%ù†”è;ªÄŠs2T\åú©’*>W?öa;‚íæR©ÔƒÉ|ǤJ€pÏŠ|³THÙ¾x™&')½Ê¨´ªLiØÔªP¤”*Ÿ’«ýJªnRbuD†êÅšX³Fw×lU|õ^ÅU¿¨ Õ¯+|þDñU·µûݬ¼mØo
ø¸W +<ÀÉw›íƒLÈF¾™jâ”V—¨ª’üJô›eðÛ”àwi¢¿LñþÅùƒš@ÀØ£+¢,€Xð#ü,ç~o?Ûcý-õb¿“Øfªä6WBQ9(.îåÃW
-üõRZ N)S24¦êî`ºâ¢‡Xƒ$HÓ)ZBh«B6„€¡)B› +<|.¨¡HF3Å„Ù´F4P(N†iÅOç;J˜N3‡X3ÃÛ.ká¡–&€˜lAĵ )š³0‚(Ìö4ýà–æÃ1‹ø¦ +Á‘Òa:tüPu¸V·ƒŸrŸ4ò›°%Æû-°ì‹ñ|Éé4.ÎF +ô4æGªÖ5tÌ»jÂÒLý?~„ʹˆòy-óJò<Cs?ÎÒD¯¢P@“¾LÃœÖó:Û ’tk#DwÆÃQ}‚;1î?ƒëà¹ø™Rà1‡<eد%íSueô2~œÆS(“X'P–Ç84Fðã~¼ˆßÓ6ÚfÐs0>Cá†ÑxЙOEµØö‚ÛðÞã±—öh4¼7ÓjvP„}¶ëhÅ©øß„ÿ3ô,jñiÔÞ0Úî)á“(Ò'´ +ÛØÞL5¶ÓÒ{ðä #uŠÌ¼M›ß`”ïpEW€íàãhë€óàT¬ÕŸW<~§`;Û¹Øv0‚Å´i%ëômüx}¹%ùêrǘªí¢as9ÇÆjÆj=ÇÈ7ø{L`eº¬RÒ5ã:ú%.ÇZ;ÚöÏÅÆ}÷ØQ`ÀO#6³€ÕZˆm/®¤ÚuØž‚í{°ÝŒíVlE°Ý¥ø±ºè«TeÇê Ÿöе/àÙi²ôŽVÒ›«àŽbõXŽø÷öØ1¸™\ÜG.¾®tìš±k.l{±]‰íZŽÐ쇰ÆV+¶#é]LÊb¼ø +YÇä<H×îäÎ0ÞgšÞ×Á?ø>:†ã1~6âžÍktv
Ø5bׄEÈgÜØ÷ª?–áÇRüX¢ aì¶2)sèÒnþ–áM?Ó³‰ŽÙ®:e•Ž05&9¢ÏÀ(÷F©ýøñ»•ãdè}¼{¹·”\,æ¼XH. &=ôFóÚóñc~tªŽ +Û§áÜÐ:ÛÐ\G8N +6 +CÜ÷C7Ç]'±´c«aV«£DY»]-v§ÒöJ¥ì~%íuJØ£j²§w´)æèUÔ±@
Ž1EÊ×(llV±G!ã~Õ*h<§ãG +W¹^‡kú›Ð[í›KÍBzøßN<YÞµK3±¤œ…JV%‡â†K1çF#¨#¢ˆÑ¤°3£zg·êœC +¹–(èZ¥÷çpïVµû>UyŽÉç9-¯ç²¼îßÃuùÜ7µ;Ð\MZLÊ3 ÿ¹v@–giÞ%‰§‰r1OÝ5¸m +»
Õ»+rW«Ö]§ 'ªO³òWäT]¹HU•+äóÞ©Jï.UøØq}Èíû¶\¾Kry§áïr{oj'“è“Ž@.Èpmƒ4ñ$x#–FÊEˆ¥Þ[¨×ª ס€×¥j¯WU¾ Dä«JÊ[Õ¦Êê~UTÈãŸÛ¿A®Àçå|EFàpJå‹r®ÈáÿPåþOtkÑ#ÝZý!ú€kRÄç]„‰'DÙü~‹ªvy†*ªøå©©—»&.W0#g°GÎÚ…2j—«<4)Gh§ì¡/Ãò…žRYè¼–öcm¦þÕè݆]‚hƒ44O#ïÂ"ž¨âYe¨PžP™\u9ëÜrÖWɨ¯Uy}£á4tÊž'[d©Ê"kdlUidJ%‘#²DNÀ*Žü\Åád ¤Ô¿½EسAè‚,$!†=ˆð®‚P
•<wGÌr6”¨¼Ñ.GÔ){´R¶hÊ¢aY£ •ÆÚT%¶Hű•*ŠoRaü^™ã‡dŠ?¡‚Ø*ëû*ˆÎèvtÆ#ì ¤œýÐihâY#Ô£Y~î}<÷`áœ1³Êã%²%m²&
•$=²$«Uœ¬SQ2&sªE¦T +Rø«^³³Ò¼›{õÔ7ä;IÆ”|f´–º—Rïü(ã +l‚3AþŸ4ËÞlQi‹MŇ̗ +²³™ÁÊh6x¼VLk+yt+^³oÓJf%—Îb2¯ +Ö3ë¶oíc”e}~–Œzõ‡ÊÑÎ.hE7Á5LØÚ\=5Ð-C·h,¯I5$sÔëo%{sIߌËF¯Mı…8¶17v0&;XÔÛØíTºàï¢ð¶½ÒVæÄæåfÖç¦ÔßÏô¤H3׆Aæ +ñk”yRÚ{žòÓ꣯³ŒsŒ"!Úì¥ÍíµRÜt{^sk^ën¸h +Æ‚zóÉ8K!LŽt?Iñ!ÒÃÄq”8fe‘ep¢ò#Tx÷p˜lþöªC¯©ƒþN.a0ÆU´ÙX‡þRÁÖ|ûîÉëíÏë¼e€ø>oHº–Ô]Ø)aþ0K$æÇ›“¬—S¬•gX'Ï0ÙŸ¦“Ÿ¢qßÚ%=y„2¬ãçÕ²œ1@Û¶k#ãÏVR°+¯{ ¯ù@^ëëy3òxޔͺT'áé¼Y{.o¿?$ŽôÇ%ýKŒÉE&Üúâ<{Å‹ÌÍsì™gŸWí Ú´mlé¦}y³õ`¾}ò{ÞÍš¢çó:Lmý`VKs†‘%OÊ,ý~¿€·ˆcš½cšú·l:Wè‹ß ú{Å›4ì“d÷ºÅ§pþƒ·úOó/yÉþCú/sü/dì"oGñGçÛ,’ßá~®à§~ͤy“IúKÚëL–WéÀW°ã^/ë¡}_%Ô¿é,jgàœ€'à¿èÞ€ÂüUf½§yw?ó6sZ)ý +—ð:â§Äñ2q¼„¹„Óº€{‘Esx–ÉûqœÁ~—Éó&̳ÿg¹ÌcÛ¼Ë8þõmÇ~í×v|Åñ;Ž×‰8i§¹ê´Mš£é‘¶ëµµ¬´)ëF‡=¦±C¨¨Ý Ó$@ •c“ÇL †´ILHC‰Cô©ˆCêÚÁ„Ð$PøäPõéë÷}ó~Ÿç÷{žßï÷<$ÈËé%<ù¦þÈt~´nû+ký|>Äî¸
¿Ýœ¾7å¡3
0†(_fôѯ¢=„öÚM´gP^ <ûÐ?ˆþQRã$úgH“GH—‹X†ô¹¡xú< rõ/0Òç°{
>OÃß°yÞ†×áûë!·ã»Ý$ð=‡~7óVÃÿ!RdÝíŒcºsŒe Ýe:Ê#hŸ$…Ïêª>‰+xñyÒëKÌÊ+Dègtž·á°Š—«ÌØ*s½‘B?ØLm*ô×Òу®_×éu¯ÑÛ]Sµ2º5t·âÿ¨ž¤›ü,Ýßôv“#WÈ‘Ëøq?>2ãSü{Rý#Œâaø¼ÞÕCdÚCØþ¬À/6Óük›Ëà*< 3—™‹‹ô˜ÉÏ‹J³\;Ñ-£[Cw‘6Ð@wÍY4Ù:0G‰ÈÇtš7òå)T 2÷ÅdÔ ýV×9ßÝûµÍ-hm[¸°¹=c¬0g‰ÉÅ!´ËX¨¢=ÀˆGÐG¿‰æš‹x°Ìl'[Ïp¼<ÊÝSxö<üÙó:GÏŸá#~¯®Ã)Ê|¯{Ã6Û¾o
'äàhò¢€VtaEÐ.“‰UôÐF½&™1KT–ðä0{Šl9O¤.óô:¾H½¿æøÿ€ëê:7°ÅŽ¥µñãëv9Vá ì—]7Šº&DÐnƒ,úÍãÇnõ¢_G½q´§É9þßGÇ5Å,NÁ 2iœxŒù1öŠ1vœ1v¥q|X‹ÿc3g9òŽ³¥-s]‚yŽãÝlû³äÅ.µ íG;Qô“ègYl”±QÅÆ +6Ž`o‘Rc%ñA÷=øRæ] _ºL‹:M»ò~·ò†O9_@Y_X_\i#¥”‘W»QVÒèW›¿¡¸Z1ÿ’¢cŠÎ)l^QÈ|NAóð#™_Á_üK§±q{sQrr¸P後/EÞuâK²!›ÒA§R¦Gí¦¡dÀTÂŒ(n&3;5KŠkj
Ž(l*ZT0tDfhEfø’üágᦌðk2BoÉzë?u +°7K©3A)<}Pᾄ/¼ë€þ´·ZÕ¶+r*ò*ò«5R8W(œQ0Ü¥`kÌÖ +D¦äÌË=$#zZ¾ØcòÆ®ª%öUy¢ß“;ú&Ü’'rW÷£¿{;iÇ`R¸Êµ|Éñ.íø“ˆZ‹Ú‰ÚŽzŒ2cAbQùcíòÇó2âeùuØ&o;KÛ~yÚNÊ•¼ gò9’_–½í;²µý\¶ÄŸdOÜÑ1ô±×¤5j@*P„<þdy——6ˆÅ-ŠÄ +%ì2“.ù“>í¦|íayÛjiÏÈ“*ʪʕ‘3Ý”=½$[愬™‡eÉpf(HÓiúÍÔàŽcc{S”àÃPƒ2(ÿ:xž†$¾Ä!š´(œ´*Øn—?í’/ãUKÖ/w6$gGLŽŽ”ì²æ*²äè)r“„F%Oƒ’§9Ès*ä©r¯ +AÞhߌ‚M-]N9K-²u³Éma©°À*$MG+],ljèjùž@ÓÔÃiÜCeP¡–®P où)àCù®Ðê$PƒnèÄNÏS€÷!ž6Jô@e«œ‡¬½4U6ó]?MÅS'hu>ªÓ[Õéwë4quš˜:Õ@z¾ŸJ¥Ÿ†¤Ê±†µ{š-´hAz Äï<Ï2ØLrr®YÆ~û´°ÎšEÖ~ÖÚAœ!–aüh„66˜“×@¬A<ã0Ç€fq„&mø&ÐýŽáž¦ ]ú`ta/Çç)®qîÃÇÄ®Q“<HrÈ2Ä?B;ê¶q¸Ž3ÄdŠ¹h’Mæ¢Éä5ù°I<š4”Ûɉíçø¨Iš´ š£ñwáž&ÛV¨B{Æ›ášè!©‰]»îaÉÞÀö6˜€)hâÇüØéÞ8ðwû7¾6òb,ðŒxÌïe’säånÓYúÝ™w¤]w4ÊøêÕ*a7Ç5I{áS“ñØu“ÞÖÉ5›@ŠQ4¡L±)tö—½Äe?~,ãÇabrÊaòâ0sqÇÍq8S¥$'–ÉˬÏ}¿„¿j¸Nk»®)ÆeÌA>óa×E{HY´a“¥Na·V䡇6¿ÿ3]®ÁQÕg6{ËîžÝì9»›½d7›l²’˜²„[ˆ
PbF +*Ãe(P*ˆSS +J‘Ò/PÊ¥j-2È Ê´:ÓÚ±jõ3öú¥H«m-Óéø¡ÛßÉžét˜‡äœÍ¾Ïûoÿ÷¡ýµ’el?VáÇ~¬å‚YÇpYKb×r 5ãc̉ջø»c,NÔÑÕÏY{àÄÏ&ÎœâÌ&¡38¯Ïæ]ìp~ÙᣴX¢±á,¿kÀ:gÞHL6³˜}?¶Ñ¯Ò'ÒÔÛ ðv?€±m÷I[ÉÇýÌË-¨š¯¿¥~x;g’rœ!Öq68¯w©sΕΒmóQQ]·Ú˨#r–s[ ì 7»é—Çðc?}²&{Œ€ï‡€¹‡Ïî—v±ÍïdVí¸¬ÉÄ»H˜²Œ³Ø"òÏ8ñÜíœsÃIKiø&xÄA;Á.GÙâd¿#’#¶h¡^Ÿe~œ WN0?H“ç°ÇHæ3î(ýqe3~VípçáNÀÁEïj'®[œóÙœ;ÀnGˆØ<¶$”¬êضH9®ªX<
žWU¸Ò~ºH<^£W^ef\¢.‹÷euîqDæIàNÁ…Û¿Á‰ïÃï^pÐá³¹ŽýÏU‰6×Kà<`ìˆ,®D$ô+ð5ò>õñµñ>ïÉ¿JŸ¾Kbß&¿>Âf-ý| +þþ‰¶º…Îü”ÝùïìïOl¿ÝúÛûïØð¯£.> I®Q¬¿Aa½M¡¾…2zõ÷øüó2zâ’àÖQÜ{uõºÎ¢k~Šž8Ž‚Ãà pÞ¿‚àÏà÷àºz]uq-óÛù›lð¯£$.ãÇ%ü¸Èî~Åuž¦9Gñže‡m÷~<GÁž¡HOQ0'HÜqþožÂûqtæx€=à;àÆÿxÅy¤ŸƒWÐVÐwçÑ3çÐv/¡!^D-<‡š8~8‰Ú9ÁÀ:ΰz–Aõ4 +ö)šwœ&ú>~|?žDë~—bz‚":À©÷é'¤ö—ð~BiUhŸ +^VˆXe‚û]ðš“ÚSNÚŸ&ãhÝq4æ8Zæj%vآljÇ~†ö>ö^çôån†×.×NÝC)¦u¾†Ž}€vÝ×!¸~D‰_Òvý·<¬ÐâmvÙ\p¸Ç²ß;Ñvâd`ÁIЈÝ"v;±;»eZu&v‡°;»#”óbl/£"VÒÎc(¼Íp<¤
4ïz"µŽŒ%³kЙcp¯_/;muÐi÷Gœ–Ü:ÑžµØŠ +®”š]9x +ðLÂf·]eå\s”u¨Áu§2®U`‹Ò®tøð<xüÜÒ}FuaÝ⪈V¥BÏí¼/|)n5…|j +”÷jôEÔè5•õ&ÔàÍ(ã̓¢ÒÞN¥¼}Jú¨ß|°T ÿ½Šû7+æT–ÿ°,ßYÞ˲<×e¹ÿ¦{áXß|xgqÍ÷ƒÉ ”xW +*+ˆ*°TH*È*((lW,8EVp†¬Ð<™¡%ŠLc³"Æ£à°Â¡3àU…ƒï›Z‰ýEð
Ûò„5´ÜÚxná}dñ#QªÎ£úˆ_‰H@ñpH1#,ˈ‚¸L##3ܤ(B¬1‰ÌT82,‘Q7ªPÝ&ë¾@Ý“à´j#—ÀUù#7´Ž/À7ï4äIhEÐÌ»Ÿe@Ò¬QÂô*õËŠdÖpE©³Ž¦@£Œht)d–4oWÀ\¨Zënù
òYß’×:(uRnópE5æ
-Ãþ|ƒ¬9ýH“.Ð +<7ò¾¤ð%a¹³¼²L¿¢f@ufPa3$Ê(d™ +Z b
ÚX‡üñ>yãƒò$î;±B5‰ur%X|Ü –±øE€ÎŠ}¤¥ṗs&ëo/èEÐÌ»,HãK}Ü¥xÌ#+æ“iÕªDbñ ‚‰°jë£òÕÇäOË“ÌËlSMªG®;lq’fú¦¹Ò܆i–ßÔ €I|HÞÔbx†SÈGdQh- Ï»|Iñy"Q£XÂ+3îSD~õµ +&ƒò§
y2Õ4Xr5ðÇ
9œg—Ï¢)²ˆ¥K{¡caÍq+æX³ÜÔY–φ«$ú/ú"\C¬Þedj(fžsø‘I>'ݲê=Š&=Š +æÜòç½r73DÓV£:HJW §ÛØãÛÐxmˆÇ¶A€ÖlcŸoC•¸%Kˆ"›K+>´|¢¹pNç+=`hi¤y×€)üˆóÓÞ…ÿË~™F5}faüX5 àZÜëZ«"ˆ +nUƱ®3hÝ:£ÕŠZ+neœ¶J;š=ˆ²HYB6BIH€@€°„PÙ !Ѻ/ÓÅNíT;Õ¶ÏK2çÌx:Ûɇù0pÎ=!üïóüÞû¾ï½ø?}fÀé^”÷LÌR³pÐφŽ¹`@Vr¸¡€ñ…@¬GæÝ ôòAÞw"0<¢ŸŸ‡A! +€ÔYð;¯ãày8ûÂï0ä´Ï_õw97º= Ec‰g»@Ò€î“=Ð Ñбõ¹¿QøR$Ή´{P»1¨îj§æÃëÜù`€× ð<z ö +€š¢F¤Ø³Ù¨
)êSÃ"ÌŒ ¨tNÃT—ª¤f`Ç#÷Hä¦Ï8Î00â˜;çIw>Bà΃í…VÝ•‹‰Y”k`Õˆö¢°õ(,7U +UØ+Ø'F|`—€… + ^›EMBîÑðÍ@n/âù›+iúQ¾ýÃ'B/ p¼aT‚/DŽ;—¡C!ÈàXŽ¨BÔ"È0‹cˆr¢>ºQ8ô8/l0ÝŠûÃMÄÐ?þxy~nÈ0áë7|ä¨ÑcüÇŽ›0qÒä)S§MŸùâ¬ÙsæÍ^¸(dñ’¥Ë^^±2lÕ/W¯Y»nýÆ_ýzÓæW·lÛ¾ãµßîܵ{Ïï"¢ÞˆÞûÖ¾ýo|çÐá#G½ûû?¼÷þ§â>üãé3L6‡ËÄŸ=w>1)åBêÇé™Y"±D–-ÏÉUæ©5ùڂ¢âCi¹±¢²ÚTSûÉź†Æ¦f‹µµÝfïpvv]êé½|åê§×nܼuçî½ûŸ}þÅ—_ýùëoþòí£ïþúý“~üOüÿŸû÷D%–}ày1ý<\'¶_ ¾gÀøKÄù<b}¼‡óˉû_Àþ+Äÿ +§°zûÌÞ»»Ÿ}Ã_>xðŠä뇿ïo=züø;xÿþÉ“§Oðßk¡M¼×ê·ü¾uDT_“_²¥ba~CÙ–sñªJÝÉ:CÏR¬àÚ³¹Z ¯G#â÷©³â¯æe&\Wfœ¿©HK¾ãihÐ0 a@À†
4ü·Ñ
wÛ|—Ýk…†fßdKe°¦¡üUhØ_ݯAųès¹ö94H¡AÌïSe ®*…g¯) A–žxËÓ€† · án›_To‹O²¥*HSoÜTb.ÙW]¡û Þ âZŠ A
ùÐ †%4(„ñײ3nˆ¡ÃÓ膆ëí>Ën·ûEõ´ø$YLó !Ü`*Ù_mÔ¬/Qs…Ð …
4ä‰y—"þy–àSIfüuaƹžÑÐgc,»ióê¶0’,5šºŠpCuñ~S9Ñ riȇ•”Û+á]–‹xW¤Yü«"¡àZ:êÂÓ¸d¥Mèµ3–^µûDv
æ9ùŸ7•V0•éN6CC4¨åœN¥ŒÛ#áöÊÄÜ>1tdBG*êÂÓè²ÒÆ÷@C¯Ã'Òie$5›çhÍÆÍ¥Åo×t§ôÐ ÍåØUrŽS!ã\Ê–rz$N¯:Ò #{ÄÓ脆îÆ’n#¢ÃÊHi¬ Кʷ”õkJ´§ +¡A“˱)sØNy6»K"cwgIÙ=éÐq:E‚+ž†³•6¾ºœŒ›…žZg +ÔU•o-/Ó4CƒTÐ Èa;¤rV§(›Õ•©Ð‘„u9'æ_ö4ôqÆb§“Ùf¡¥Õš‚*ʶ—ô‡Ì…Ú¸Æ|5Ç¢T²Û³,»8‡åÈ„Ž¡#Eƾt^Ê鎗ò{<Ž6úX‡“jwУ-VZ†©zQQYÙkF}QLV× ††œ<V›Dɲ ÌŽ´¦#EÎr&ÊÙg³9]|ï’§ak§ûÛŒ%mú[
-‘±j©¾¤tg…¶èpZ× Ô°›e*–5+Ù–¦d¶§ä2í‰ +VG‚‚íäp\9Ïéi´ÙèÏ·9éË[ôæ¦á2CeX‰Ö°»RUt¤6· ®N®e5Š4Ì–t5Ó’¢b¶&‚I‚’Õ.Àúps¹6v.ÏîiXm´q-NzX½ƒS^ï¯Ð×”†ˆJ¹þ¨YVwQ¢cÕgh™òY͉VK‚šm x*Ž•â¶2óøG“6±¾“¾ºÆA?^T÷‚RaÜX*+ª5‰Šâj……¬‹©¬º$«!AËnh9¼|N'ŸÛÄÒð›ÏhG]Ç°©æ.Ú†r'ý=UûØt±i½.³4ºâ'öë$¸ú€ãøl'Nb;niPÚà +˱lpËûð’WDLÒ|rÊÍáV\„`Ɖ‰çÈмVÖêmÓ°iØ4l6
ÿ†m†Î{†Pdžºg0|ÇûÖ0þaÚÍåV]Ö‰ç¡F!ʺ[KnÛ¹–lï¼{ž`¬¿¥²¦?Ã)`èŠo”èh@†½l‚îǧÜ"¢êäsf\Þ¼-R¸tÉŒ)êíN²¹m-¹³ónü‘ëá=Àð +•5¿çeŒ'#1=0h±tH…ŽùhÉ#EËîA¬âìÇg"²F ¸‹V®hÅ•èIÅb½mî0;;×6‘ŸÃËö¬ùÀð7`ø2>¬ÇÒA
:æS¢ã´vI±‡¯QÄ¢UÌ]1‹„WBé%
O±Xo·™æ¶ÛL[çÄn`ø «`ËQ/c×ñˆÍµhÞ«F'ÜJ´â”cs”_´‘+æ!Þ£DtU3(½¤Ë—êí³µívjÃððáÕáÇYyÛ`xN +¦Çª°ž¨»ÚhC˵ÂÖ}×ò;Þ¼–kaOÙFƒ¯º#£}š±ƒ‰‚óT”YØ¥A{\,|4É1Áe¼¼W؈×ÝÜXÃŽ•RÓϾ*m;øÏBóÅRôq}¦ýŠZ鳌ÉÙÑ9 œ‚bIlì¼ØV¨ÈµB%Ò—02Ž˜ÑqÈŒOÔ[u¬aûÜDãÓµé¦7æ&›¾(¥Ú-ÞÈk~«ïÃýiRëîN©œPF +ývhT@Ac< +Ê“6¸€ƒ;BÁ?[±"ÛŠ×ÝT¡a[¥ÜødµÚôúädcW(¾Çi i}EUžóq%Ý”»¡Ô pP–ç€s¤Îávdµ£c…ŽA>ÖGùz›(6lœjÜ;^i<”)7²m©}UðÜÿÉ°Ìw>&õtÇ%4”»a†ï‚Sœ&œHs¢Ä‰e!–e;ˆl¯ƒÌÕ[±Ô°¥0ݸ/Wi<ê™kêQ•ž–
%ߤCüç£ý¾®X¿Ž<p‚C#I‚FÌ2ˆc`7žb»‰TŸ‹Lõº8u—›xp{¦Òðlh¾ñ=ÝW-—Ôöà‚‰ß
ñrïë¹É“wä͉ôúð;ˆá0@"l?:ÜçÇ¢àëHéö‘±./§î˜òí#3>o¾Ñü¶üÆ®O„W÷}Ž/€áê>{âcI_ᜲkôsíÅ,Ëp!Ýmú,Õg9Ï@ÖOØv.‰Rg“u6AØÏ$Ⱥ[µ5¯‡éX÷=õÚšëWǖͯðsòé´ül€‘w‡rl$&ÅÑ"’Ù—;$øù +¨e;©Ž²5+ƒ»j¦K×´4Å’’ª^S5óx{z¶µ~q_=°a8ˆÞ£ie‡/©éÅ´„xX§ýj(ïQ@Ó¨š³‹áʨ€V³ò«f÷=[rSÉPÔ¤tuE‚hÊx{~¶õñ{¯»¶/¼ÉÍ©0ƒêª/©½Šé‡â!=”ñk¡¼[Í8åPÙ&…ÚªYÌü âÝV $7¥yMÄRU„LMoþgn`†#˜á#4n÷%uŸ…b†DÈ@ÉøtPÁf*haTI™åÈš^ʸ¥’°þ,—Šo‰„òe>OUåqÕxÃ-"ßÝ÷8¸çøºgÿƒ3h.ù’†ÎPÌÔ—™€ŒÏMºôЬ]U,*¸¦WPWÕ2ÚM©”~K(ãÝÈd+\‘²Ê¨+x{ÙòÄÚ^o_=ŒN£iÝoÒØŠYz!ËpÆg†'ئ³b£ +ZÒ(¡e™^Êik{£¬°dÊE–DUÁÛ†áaä…}B»Ž{_k_¶ý”—ÓœB3†sÞ”åJ(6úy<d#dÜØž²À’I.h5`U¡—ÄJ¨ÆUPW˜ +Æ +]É_f¨•‹t¥ª‚·Ñ--¢Ïï}ƾ¶×l?áå´mhÆtÆ›²]ÆÑk1¿m(ë´@SV#8«×Sæ•ZÊ‚DC©òÕà"» ¢Bj°Š]ƒÕâ*¬QTðv?ÚÚr?¶mïÃÈÎcëþ´×oðÇõ¿G³#'=cî3þ°«#î²
åF-à¤ÑD™Q€’LÌu@™ƒY°BÕP« †Q4¼ + -àí^¬uó½øÖ½÷£/[|¯½æ<Ä7ÿÆ‘sp%'ôZÒf#ä,ØÆÕš¢ÂDžÉ³\ÌÂÔSæ8ëà2 CÊÃ:v™¤ãáîëDËæoßÙs/þÒ{롽íK®ý‚¼ãmÛxô¨Ãïû8dG»R!k¡L¨¬ä‚ÄBžâ›ÉE¶ ˜¦)3Tì}@ì¯Z‰d`”ˆîî&›7ÿ+õÜžõä‹ï}}¥}Éó}áTäUK8ü®Ûî=1£Ÿ%
vBFcr²Qò„p„œçXÓL"Êl‹ *’ÍÔ"ÉDŸ&š¸[K76•Ù²ûŸémï~Ü~y5µ••Lìu?ô=ç£Z×ç µ“8¦°‘
Èò0k§cw¡Ž€y‹b…ód+µ@²"¢•Ž»¥LCÓ‰–]î¿g·^š)5Ahì€Ýø]@å½Q¸»ã2””8ߌ±”4ÃNÉÐì`¶YÈe)68G¶Qs$’#Žâ¯œmh\œlÚùåtËÛÕró™èB3lH¿a”ûO$Þ+a‘çFTè&Ä.J‚ƒR’L,Ä ¦¨N(;¡1Ð QÔ1²ƒ–v iÒ·¨4Þ°inºé¥ò|óÑÔbó¹‘Õ-dYñÇ~ú·FN좃ºîaûƒ/aºÁÝÆi.(»àˆÂI +JM(-9Œ"IJO¿EÅ|Ã3ÅÙ¦íÙJÓ/i=«¸½½‡½ô#)}ȧÎÈál‡ë1S#ä8ÁNŒ’œ„Œ +&dp$&¢Å#|$b32A:3ç‡9> +¿à%‹¦<$iÑCPM»‡ôÓöAcqdÐ<‰§ºk[cÝœûÔGÞÄ¿ê«ÈÛ¤Yѧ®´¤Û—’‚ 9J©‰°6ä"Y?“1ᣱ&=·è„3.’tÖET•ì]ÉJ0L ¦)<Õ݆˜áuÌp¤í®á—}ñ'®´ôº/%Æ”hT'Ãbj&À§ûØHÁCgÝ0g¥æœdé¼sX]¶’´sF’aFG2Má©îÞÚP÷`3Œn»c8Þ¿ ?)ËJ®¸Òò._JÑŒ«È±ˆN…¤pÖ/¤æ½\Ú”›IŸAi¬9Ä_°S¤Õ²ªb$kçµdýŒŠlœÂSݳax3¼öÄ`<Ö_Vœ”夗]iÅ5_JÕûovç+¸éÀãøµ
5R!¬äÚƒBÒ¦nñu\¹#ô.Ò@33lpŒ1–%Y²þKÛÖ´¬½÷´öÖ_Ë[¶lË6˜$„Ù4饎ö_1®}Eo}ÈÃ÷å÷ð»O(®ìˆE”"9_72èáÓò®NƘƒÉž°Ñx%+,™ÑCò’Tå ¶ õ#•„yž{hXûÈ`{ë‰a¿4'ùÄ–7øPeK(®"ÇÂ*$Ã}ÞxØ-B +N½hã°J&.¹ªFä%9¢*J`mAëG*é‘ÁûâZÌýó‡Ü]ýŽÇi;8ëEUÍ¡˜škàt@ ÷{dðˆKŒŒÙ…´)9kìä~¦a÷ÌÉ™ò醪(¢kBš~¤’þgx¥lØ‚»kØN(Ê?åd'Üiåi/ªi +Å´„xX¦ýjx W:epÑÚC›1u3¯éD¼r~Ïœ¸K6-ä('ø,ÍeS—¯$̻챡·l°o~lPì•åäÇÜuÕÅôøxXOÍøuð`¯.8”ð¤YN›ÕJ×dbö=ñ5P:Ãã)'»º4c]¾’|kˆ—ŒÛEåû²œâˆ+£ýØ‹êƒ1SK<l¢¤}FdÐ¥ƒ5<©S 3rrETvp%¼9®T:ËéVL²ê1O;ZIÿ5xÊÇ›¸;Æ„¢ú=iN…seôÇ<¨ùT0nkŠ…íÄ´ÇÚtPÁ †ŠJ%4%V@3\í +Kƾ”wÏ0åŠ)Fzœ.Ò* ó-ù×”
k0ç&ÜÓÛÄ¢ö]iŸögÖ|°7å8áOôžú섌әôШFŽKÕÀ„@Nqð4]Á˜ÜiD%DªqXª-TÒcÃ굘wCÙðîŽùwÄ ãI¿q·#çÜëÎxƒ½õq—˜µš¡AÌ+ô@¡[Œq5@‘©†&}T±'©já UŒjM¡’0ÿ«°Àª5˜o}
æz
wÇòÒ¤õ×âÛ[ð{4p àvŸKXí¤¬Ñ¨LÀ°Ä@ÍôÔQŽ¸L×Bc§j˜ãM×8Y+#ëU…JÂÏVaÁ•k0ÿº¬·wÛVC*yª…C×Mhômg¯ïpÈêjLì¤ŒÖ +öÉ,Ô‘‰:Ä5#,§ QPŒvèå?v¤ç
=ùJ‚Kª°ÐŠ5Xð§5˜÷UÜŸz…¿’x©³?õ£7´ÓcñèÝM ƒ”RÚ¬ØJíã[€~Ž`˜ÁAÄ
&d¸ÃH&Y#$c×0Á$¬¨áÅU"ËWÿ;üÒ[˜ÿeÜ7ÑuæÆCÁä+fsp·Oë(ÝârW;*q +ãÑŽîd„,A#$9Z6¤ÂmÚtoJ‡Zmio«=õ´a–²Áò³˜qS5¦Ý¾ëž|OííîÃíÓ‚S‚aþc†Oò¤0ƒÉ.v8ÎêŒÆhÜxâ'#TQ*LéI‡H²Lˆ¨Ê†ÚtÙ ÞœõâYÞ–~Ú0˪²aý +Ìôаm×=ÅćÈÓ“Â!A£)# xÒBª1B 3ã°ãQFg2óR!@˜ RÄÙ`», ªú}¿oîw¶YrÖ6[æiì+çaÖuÏc¦7ª1ÝÖ'†ƒ”R÷ áðœ9#lõ¤D²›úãõÕä}Çq¼N¤Ýܱó‚ëqZÛÓNÅU»zœuu«k«@ÕzW¼¡ÈEAAP ÷äIž\ÈBx $„ÜóäFî$@BÈ…„„pAEV×Ôº9;¢mý-ʶ¿óÇûÿ×ùœï?ß««»Žíõ°¹½ôú€‹*9ÉMý‚8bÇÉ¢v¬:jÂh"(VVãÐ@ªýß ÝøÂõTòeÁ´ði¢ù4EJtäªÕßLpø„°»avwñk}n§ÏÅä…œ4~¿ÜµÄ1+¾=nÆ*ã(NUã´ý +<Lµ—ý;såö¬YINÁ´èiBx‰6£æ +«_ˆsøZ¨îîfFGÀìíäÕœµÜ°®Z)HÜB':ò!¯TãUr‚¦_JDƒ©ôoÎt$
ŸÌÄH¢\$Ò\ˆ„åV¿¨ÆéQÜÝ"Faø]|VÈÁaG^¼j2“Ä#(Q6¢"*r¢*&!i"$]0Õæk檤Aš]0ݺ4!>‚DZòÑ€è¢Õ/®rz[Iž®Vº×-¤÷9Œ~ë`q‡L4Á5Ôz]E–Ž¶“åCmdULDÑD„](Õ€þÀðÂðû¤áOICVátÛ^ÒDÛA$"ÊCâV[¥Ó+Á{º$°¯SL:šèQŸ1hâ°GõŒ† 5M|CF•^k¥Ê‡Z¨Êx3UA¨ºPªÃi/
è
²¬ÂénÒ„di=‰ÛŠ¬~i¹Ó+ÃzºdÏ%C6ë@èÃ>k\ËáOÉX¢["†d¬™Þ>ŒÐ•q]i ëB©6gx;iØ°¨·%
» +gd9Ä Ù$*ÉMM¾Å//uxU‚Üë”Ãa«Ž›Äôkºfæ¤á×R×2ÙÈ•\o`·Ô×*ëXê(©§0,OƤAÿÂðqÖÙÎÂù.â„<§1*;¬ÊO[úTů¦ÂãÑà{j8lQƒ¨¾.3&…Bö×aËí:AÛ8—/áð W=ÀæhûS
ÿgÈÜ +Zr-½Žs.‡éj¯)ùkjT´A©AdÐGOÐÛ¸7`©p–HGáùܤŒÃM$Õ€é¥!Öo +…juÔ~XG(ZF”¨ÀixX Z£Eªuò”–ÅiÀúÖ2`y/7eÿäZ{ü~dUÑðÔb‚kà·"UW¶YâÈs‰e]-Ø¡ò5˜ ?×H
0
´ M‡((#DDYa<Ê cÑú0EÂÕúÖPªÛ¯æûŠeÀöîz`]·óQ`Õþ±É%y¾©¥$4–)lóîÖ ùÄVîn´b»”ž:3ÕÇ6Óz&ØO3Òý#£ddõì +dwÖàÇ6³¹ñÝMµáÓf_©’é«ÒÂ=8=ÔM4‘<d3Á
YpnªÓ Ûj\[µ‹e¿êbÛ¯8¹Ž +'?ånu§ÿlÖ»hñ?‹ÖDo.Ì´Ï.ÎVü{ådf]%{j ß⌜ª'^@±Ë-ØèUquäj'Ú/Éòò +mBS )`B€àŒmh!1·Á„Rc£Ó’eY’uß·dIÖ¹Òz%!ë°v¥]iu Æöpd0!L˜–ÌÄ$Í̯ۚ>ð¦? ß÷ÏÓ·mÿýHÓëè¾ozŽíýº÷øÞ¯'ö|%:ùÁWÒS»Ÿ¨Úë
8þ#à^½87Ѐí÷ñ`óSÍÉÓTç”]·=Ær‘{L&‡Êu”ë…~C*ßgNç{i‚ë%8®Áòdp¦?ƒ3 §£ø¥x¥×׆Ï\”aheøeh¤šŸjOœy¤é`~¦î”ÜR²M×OU!ƒKrUœ”h“¡>•˜ÒD¯u”àÚ38ljâ,J0œÆpzÃè—ÑTÍ~¹¸Þ¡{ã&`jm™Óë˜Õµ³îkÎ˦Õt˸Šï«("¤R™(HÕɼX—&ÆQœoAq®ËqœÙË“Í2¹,Îaôh6EeãŒËX=7eð¼NÞ¦;63e0´uÌêO°îëÎɧ4]¶«jn ¬ÅHµ"Q«RÄ€vÐߌ帶l–ãÌa,/Ž1 £Gð#‚ÇÑÂŒaõ†žÜ”Áñ>ehi3~Ø1k<Êž1tȧ´±iØPQÓ'5²D^©LRMé±lŸ)‡ñl8Æq(Ë›G¡|šäㄈ0#x˜ËÖeX +%–Ðàh¿>ŸéµiŽ³”fÊqf¨Œ°àbˆ5\ð³ÂÉæêéߊyƒsÛ&`Ý`ÎÖÚ1kû{ÆÚ¦˜4ŸvTá¢/û“„AšÉ©åYLª"2B™î5—“=Î+ v°:Ì‚*;\òq`r¨!œ=Ñ\=ï
ËÏÚyƒéÀœ£¹cÖÑÊšq’OZO:ªæóᢉ/˜ù)Â,Édu²ªPÒbM9É7ÕFz\W¶ÿj¬z{Be7&¹HÞ΋æê ø(ƒÿÿ†
À¾¯un°é̬³™ußyP>é8â¨Z?]ñ‚µ'…[E(f”à£jY1)QUããµoh"Àõ^âjN^¨lï…‹Ö^$oæGsõ4o -ÞßÒ€‹28ö´>uí9óȽyh¿lÊuØ^s´‡KöOâ3…;(jçÓzIyD.
“A¾sÚÅ÷\·ó5KT1÷ÁE£ +]QIÂ%¥d¸@•¨§ç
[€»±å[ߎöA;.}ï߆w™®…[|•pRBÎ\ÎG;ÓÙA¢š×-œÒÙ¤÷”û¹Þ}S¦ñKUÁªT*Kå0)“!D= +É×Ó¼áµg†w€oëþ‡¶œø2º¹óoÉMü{Ù
Êir³e¬¸Ó‡¢Å¢#ç3P„S + ®ü}ãðfïjª×;8Áwy¯ñm±>3tE`—úuÃ…zAÊ +1*Sï¤öÐ]ÀñÁ¾S¡ûwB?6oí?¬¿†¶>Oo~~´ú¯˜ŠúÕÔZÜJ^]ÍrùrjùªÆÒ[µôâEóÛ›bÌ.¸Aå\¸ÞÔ’wÉͽÆáåÌxYóbþNºëÞ²8¼ww`î—{-CÃÔàÃpŒlI¤nFœ'¼LÈǬŸ/F>Í-/û,zT‚B¬^ªÍÿ¾“÷›ûO>{¥¾.ë™ù€Vþ~1ã“”v¯…tnYHÞI×½{Bc{C¬·ö„ªßü:>g‚ÏŽPÀ‘¨:}¦$%_z–^´‘UðS~nÞË¢üìeˆÌç…Ϫ‹ÒÖÑÅçÖq%©k„Ò”IeÉ?RË’ž6^L|Ê,OxÒri'î ±ÎîÞ¥^y/ïÿŽ >9Ø +²R7 +×øE¨UneÃ2Ç^dQDóL†r¦‘Ó9Iå÷Œ‘[M#D©%@P؆ñš~?Vçô£NÍéÁØ8ÆÞoÂö
@°A$o
á@ ŒÔ
(§pMˆ@ò/6,qkÙ‹¢xŽÕ¤šf°uã¼Þ*d %v½ÂéÇk\CØn׺ÏåÅØ\ý›Ó‚µ9X»£gïh…
Ò?…)lÅ„(9 +ˆÒR7D™…kP«PqÿŠ³ÀÅKf9Tõ$«Y?Êàö.íñcˆ(w
á5îA¬Þ3€¶x‹ÛŒµº{±6—gsváíŽ`ý× ;òƒèl¤¤lHÓk’lÔª¨ a *ç,ðÑ’Y.I3Á¡÷Œ°8–aº ßO¹‰rÏ +á¾6q[“Í·—µO¶ÕèG$$‹_ÄpyØ¿"žì!hgTÄîñ6’! !›E
f_+ÅâRl.ÅîÖ[ƒbÛðuÂÅ©ã@ø¦36÷….®ü}"~¥'¥ñ®>‹]WØ6£èSãLà +ªÃ
1¦fñŒ’¢™Su<*šqˆOëóñh—fuqi6g°€ôA±m8ñ%h?ñw =™ +Á?Nû¿Ùó·¤<€ãø´ÛèöT3ÍîÎT¶ÏTNóÔÔØ”ŽfšWZi[¢y噡r‰x Š((¨x¡à‰J¹š ¨¥!x$š)¦™æef5•5M§Ÿýî>ósüûÃû÷×oÄP‰Ê~™Ã¨w8 Jÿ÷W1¯4G£—u'¨‹CžôÙñ0ÆàVЮ#ÕÔ«š%JFWV]Ö +”œ¼&
7·Ym((CUÿ5XšB¥ý~¸dgr[7h±õ~¯±}ÑëùhÄ87w*A?åËÕ‡‰ä:’LÚž¤6³4œ^or]ÑÍÄúÚþäªú¾ÔÒ†¦XÑ&jìL/RiY‚¦vCAù©…)TÙþu6‡Ae}ì£Ú +½¢³ñ{4â8=ç„Ó?p¥kï¢ùòÁéõ¨ÚbÄPÐÂVg(3»éò]¢¼BGi¸¬K”É{h•ŠnzicgªX©eˆTCýÏPý½ T!Ù¡} ·´†ÖƒN¯¯t[¶>59wèìÀ#;’vÞ‰)¿ã‘/)+Fš$ev+«•ÕÌÓ¤(ó»’”’.ŠRÖ«PtSj]ÔêÆΤ +eGr©Jc(¨D5f&P}Àj-~„&s‹wûlŸèÍ&çÌÝn.Y„hžÚÄ)æYÒQtÁ…вüÒE~£Nkb´r[iWrÔÔa;¥¥¢=¶¹VCjRic.«´ñ—TÚ„j•ÆP E²&Pó³)4üô´í6_¾±ëàÔÌ.«›K{OkVœW<>D‘Î:±Ew¼òóôa’¬>rç:–ÙÁlHÖd(ÔÙÍqm‚–˜6Ér[uKT[ý|ks+Au¥•tÙpP.í0™ùVhúaÇëîí»f'¶™
,í´Õ¬ìñR¼:!]:œ œseåŒûäp‡1"ö@L)ãF¢”¦K•%t³þÛ•YÝ‘×@ìÉ Ú29¾ã¢Û!—‡kZÃÛÔb¨ýÎ.ïúæ£zÛ–…‘¯7.nÞYÙá¨ø´Ç[úÊ"BôÄ>žß‘1íÏcŽEäÑG¢‹¨C â¸z)¹?"êWŠïãWc{5:±£«Dª•ïUÕ„ö¨/ +j¿DAÝ?Œ¡iÛWÏú7lZØð7íÊ·û«;œ¥°Ï[ôú†ÿÌ%š½ˆNJd&ÍDrâ'IYäñø\âhRî6£0r˜-ÄÜʺ6”WªŠCô¥’`}UI¾¾$Pß,1ÔoDAÖ/V:×þeöņ-ŠÕÍû¥`æ,„žÙoíƒY/ݱ)Ï|ÈÔÇ! 1ÃiÄûÄTܽشˆÙDöù™Î¹ét^È73h’Ÿ0!àûß-Îñ/Ïñ—åúŒ]6(Ö£àê†5ú~c#턉‰üÓ—¦R05Ânûl°:™¾êâCçLyí!½Áa—1Q˜_ñäsOÉq!)” %5à#Ñ‘ä÷03Ùg!—îý 0å̃âTÏûå©èû2†¡^6£†:×¢4C_Éç¿XW ›L‹à»³ÀÜ:
ìœipÂ=<ÑÄU_ßðAçÞþð[T˜ßëXŒÏ+j„÷Jr¤×K&ý‚óx‘‰?ý<—pj¹xrYåþï +’¡FÚÖ ÚuF5Œ¯1ªx»n]!üýÛL03c‚…y8Z‘áø,œvïcApÖÝBÿéá^€G£äubÏœ‚ï“«É>'>±ýŽäùûsÖõCa€Ëûâ@Ci4kP
z#Tù=”‘ +|G§F¼¢1£—©<êSJ^ÊR¬0ý!Y’±@*çÝ'VeÏ.åÜÃÕçÎaù³‘Í³× +f»3áý‚éðaÁíÈÛCØÏ÷Ã6bÈ@ÄÀFLÄÀr†Œp`E½eR°+)©1Ïhœ¤ÇÔÆ"¥0ãAlqæ<¹ŒT•;K¼˜?C¨LãESØáT¤Z8q]41(ÅÞ
ân oào‰>dl2.bà"†ÄÀ>c ¼@gàaЫ\Bðï¬XÜK&=î×”Œä%?}*àÎÇ_àÏÅ–æÍ¥‚iÒÅ¢IbhßX<»"¾‹Õ õJF±ƒ’Aü ¸—0(é&~>à ÞöµÀC×ïëe ÙÎÀC¯fáƒßpcð/Ø´ø§LVÊbJû-?k.A”7_"˜Š©NDËŠÇ£ê%c„Æ’1üÕÒ;¸Ž²;¸þ²AÂͲ^bYgT™†ôù€‹2Cbà!†,OKÈ=ëyçЫ¹Øà7ÙÑøçÜDÊvZêC&3OÏãÏ&L%H„qâ1²¬ä©®|4JYq›ÐZy›Ð-Õû¤½¤>i'’:ºOÚJþ|ÀCÞ>1d#†Lă¶Ÿ3‚Ñ«ùáÁor‰„çÙ”„ÇÜTæ›Ã›cääM'M$ŠÅc”òÒÑØšŠr]Õ0IU=ufˆØ#ëî©é ÷È®ÅôÈZTÿ!¼Î¢š<Ð0ŽãŒZO¶sjÓžq©kuÜQj-Š‚¸€"eA‚‚€` @XB$d%!@VI ûö%$lj@A¨˜A‹VªÖGíè;ß™éuzñ¿ÿݼç</¶Wæ-¨D
4ÔPµå ¢Æ‘-ÀŽÜìaX‰ñ¯kSÒžÔdá§hù¤»äÊ[djíÍÂZÞ
"OxÐ Âɤ×Î+›3
-ç:—³ºÎó]VlW«1»«UƒëV´áº[¼TÔP…ªQ-h%°B· +o††ƒþТ𘷢èÓÏ›Nb +“îÕeRÆYD¦‡^Z?D©–^)æª.ç‹uñZB°˜5y³‚h5K/X¢6Cc¢Úuõ…· úwC-j`ï]õA›@ü=HÙÑèw²ÌKYLÖ#IbþdSjÙO‚lÆ?9…ü¡Š´¿Œ¥î-;rµ6MžÉÖœo¶Š,æ†B«©¾Èfä!†:¢ç‘ì:oýÏÀøÝÀX
{7‚$pȃ€âpÄZç•QéOZãIÅwd4Oc÷ +‡,é¤Õ´™És{¡Ò.»`p4šÉb©+¶š¸Å6#§1°K=«Ä®óÔ †ZÔÀD
ü=Ë iÏìEà~PÿÐ?
Oy¬ÁNóÿ¥9WzµÏîJŒLJ{+•m•É:ø%:'‡l´³JÍVf©Õ\[j32JmF)¢ÿ£€þÙ`¢jø/±ÿzhÙ½Ô
:úÖp(æ™åXÒ”ýxÚD;lN/éUg³ÌR¢XÉ'·72vu“³†¦sUUU•&[Åb®¢XMU6cUb@Ó{ëÿ†Å³„»¾éwë@¹Ë4»À¸ïð4r â±+,vòRLâèÅS™}ŽÔb»>‹Ù¦$ˆDbR«žf©äÖw9WiÁQ^c²UT›-U3…f5URmÆJ*¢÷0P5p¶Ì‡ÆK@¾ý Þ±»üCö?ï +ê;61|âøµþ„Œ®î3$½-ƒ!ÓášxÊUF1‰xöÜ&µó‚Àà(â‘b¦ÙJfX,¥t«©´Úf(«FôÞ‚ÚOg +sªÞjÎl±˜³ÅV^h3æò‘k×åsZo5pϾï ßøwÐl\öÙ°úÙ¥Íëîì\ë¹½{Ç•ûÁ‡;ï„ÆnE¦ËGãˆu?&S¨ƒì‚>|Sv/¹%½³V}Æ)Ö$;ÍšÓF».MeדÛuçEmvC‡'èh÷°QCÝ¢Yаésh]÷×,šî^½trxÝ77nû®í›úÎß9µ7Lwÿ@¢ìî‘,ÞDdu,BºžÆÌ ²Ü%â³kä§{êÉ=ê–Äîe’Õ¥:u©S•.uºÜ¥Êt*½ôß ÉÚ¿BÛ·ó³/ûÛÔÀ’7&V,tOmÜäxº}Ÿöñîéà o*ä<í^DAñxbyÞôì0“>P,8ÓOkĸ¹¢D·Tœà6ˆã.÷HO:{å‰æ9FÛ#OV{x¨AˆšW~Æ%Ÿ=½´à3Ï/?uÿ²l©ýåúmšWÛ‚%/¾æ=J¦=:’U|?šHœÀ”deP2<øê”ëELÌ…“pY?ØÀhœ´ñ¸1û…±}
ñÖ¾Foà/>дp¨Ïyãœ7gÔ3w¦{jþ<äÕÒUíïÖm—¼ÛvûÎ?š6œTòäXq*6;‰ÉϸAJ¹•S†+¤$Œ–Óâ<ôê˜uôè #j¤½6rÄÁˆ`D3£ÜÃ,op®HÎÓçéûøOî±¹³m¯¾\ †ekÄ°~'üÐ ¢äÍá“Ä‘g²ŸÄg¤=Ä`O?H'œšÄOÞ½P{‡\3A+‰ú‰EŽ¸%,ûa\^~l\ƒf/¿ZvllÌk úØÚæÍéœãsipŽíÞÜ9*XðU,_Æ۩°#°‚Žß‡EcßDǧMÇ'%¿HNIxšž÷+ö\Ì£¼¬¨‡$lÄ/¸ptl…ýÌ%ý¹17ô~K^È}
1dÒN<<yÑk ûÈgÔ:Ó§·w¶åúG3”/?™Û_Í‚UßV‚ïVøûçÁÁýYš +Qá§ÞÇý—ù:‹júÀâ8@ϙΔž©ÕZt´V[p´Š +Š +JŠÈ•‚,Ê’…,$@²“…DÀL„$ €ŽÐQ¬£U†"{A”Ê(‚ˆ"¢ "Z¬ŠÞùŸÎ3yž‡ïûçíþntÂ;bìñ7´„è×i¸£ó\Bø+11쥂txNEÁ¼Ð%…Ψ!³fZðs=èycràÌvi@¡Ú~Z‚jê^‚ª½»ÔÑý‹Ö¬Ì†M$°k¾Û•A>d8⇃ȀXˆ
‰<&(G¾‡dl±Â1À?’È Ê¨À÷¹1òù¿3?ðÎë÷Ö÷ÝÛ3vë¼à€jjqBÙn8 J¦–:j`ÙG'`Ý21|»š
;7Ð`ß&øo‹ƒPÏhß1ÞG a}C )Èeðž¿dD#O«/¨‚ö6ØŠƒ½Áâ
ÖP{]¸äˆªéF¡Ã(”þä €åKù°öc¸.#»K<xßõáàz0C |s +æB
û9þtú®‘;“ÐÄ{–p™?ß*˜ŽëNÅÞNÄߎ&Œ nã +nÙéÿÇðåàlw–ŸpŽ¸?Æ8_àQC€Í< +LqÜ;FVâkú)ê+ª>eŽRÆœ%Y8ωÕÜg„zþ4¾Q0…kMa?M¸–ñ4¾7ãqüŒ1콌!Ü}ñ
ÂXÆu;1pC:b`ûÞ!7Ey‚‹!%x©‘Ø„·Liž¡¦¿¤¤ÍRKØ33ošT-˜"Ö‹ž2žà›$“¸+ÒIl›l2¡_þ +N¹‚*ÌÔ1hÈÅb ‡½ dàç¥|ÚQ&ëO%xÂΗL¤–(Æ“+²ÐjU÷)
êQÒÅS÷ˆ×4w‰75}”M{Ò€¶™6 ½DÐ6%hÏ'hĈAˆDˆAºœpÍá ‹òm|(œ"F-œ¤ãç•lú¬Tže'¹Zù8«8kŒaVÒm§F’µÃäËùwIÝýI7 +Úiýú«ô~ýÅä~ý¹”~}ãFÁY;AÆ2ýÍ ÄîÎ ðq¼ƒß@Á¡íP±ôÇB ù^“„›W¥Ñf•Î”T!žªÒsF™¦¼‘›î.õýJsѯ”¾âz¯áJr¯á£×ИÚk8“ÖW\Çì+ªe^_4 1b †,oÐøŠB·!Ì‘APwô}A"öµ†NUqØSJ©xBrR9ÆÏÏaµCŒšÂÛ´s%ƒIme]ôž²+ŒnãùÔnãYf·±žÕSVÃî)µ²)©äô¤ˆ!cµHÃɽ_€Þo”ºCÆŒáP%ØøßÉI/´Ö”J z¤P*ï‹5êaniÁíÔš’›ô¦ò>Z§ù*£Ó|ŽÙa9Ãê°Ø8fkz—ÉÂí.7q{Êʹ=¥‹²O@‚dˆA½û(F¯£ÿ0ïËa°DY0ÅÿÍH ÍÓR'uÁ˜Jª¸£P©¯‹ +;Ó-ÆÖ´³WS›çXmÖzN›µŠÛfµðÚ+Êù–2~§©DÐ]ntëƒ1ȃÆk%”ú~f¿o¡2Àª0~PŽy]ýÜŠÅ?¶é÷K™é· +ÄòÕ‰¼ÖLMÑeQ©©‰k«jä\´Õr¶Uð[kÊתK…mVƒ¨½²HÔaÑ‹ºLzqWùb1ÈCæÖO@·ës0ú¬ƒ +ô&¨ö÷„Úß·uaÁsõQáOëããÔ‘Éÿ©Leõ”ðå-ZyÞÅUqƒ¼ÐR+®¬± +ÿYg¶Ô•ˆ[j‹2Zkô’kUù’6«NÒQ¡•tšµ’.ÓbA&b#åVgÐïüL{×BÕþPë·ÎzÏ7òöÃÑCÎÅF7’ð}µÉÌV3Gv±HœwV“e¨ÎÑU”+ÊmŲœ.5ŸÖÉ[ê4òŸm§äÕyò6kž¼½R-ï4Ûë†UNµÅŠ<W€eϨñq…Óh÷wwÏõ}ò¯ˆ€±+ÿå»Î¡NÜ +RÐÞ9(1ÙBìN¨7׆Ký/ív¦o»œÍÿîó¶šêóuí¤Q{Ú8‘7#ëªNg••&åeTdäÖ¦äT7&æt6%e÷6$gõÕ¥döפfŠRyCÂ4®¸%ÒІT´!KOJÑ¿·ú5h:¬ñã†Åþå.›ƒ¯úqƳ#^؉a¢ë`o ¥£ƒÑt=ì\EÃÉÌË¢³™‚åIWóªãŠ…
1Å·cîÖÇçöÕ&äôWŸË¬JäUžÏþHGÒІ‹û7ƒÀXjMv@«é®o¿Ö\ê³Ô™sÒyöÈíÐÈ(ÁùÎ`€ÿõ;Œ0QÇñøâ¶\~S\~r]Ji¬(§*J(¨
þV!è«.é¯9U0 ŠÍž¹4\Q,ˆ¿x¯\¸€6¤«®ƒ\MPi¸
”¡ÝPõSÉϯF,~þë©Ã®ñ)Ó o§[#d¿ú¡ Ò^ΙKii7Oçĵ%G¶d‚›Ëª˜Ím"Và è¸p°*¼lHU2\](Ääß+;•_"àn•.ÚP -¢òТ«ø½KWéX_iz«ðhÖVýÞ_ÎF·§¼Zù+ǨìËbVo ,)¡7&óD÷ùü.~ ý÷Ò²ÀÎë唎{åôkb»F,©¼WZv¿,âÊÈՈɀ‡6d
W´6@ݾMЮ)÷a`ÜÌcmÙñY£mÃó–ÚÝsŽ¿´Í¸;Ô<'z—<¡ñ'‘I„ÆÇŒžL½Ÿ˜EósÄ¥~âë…$ñƒBÿ®±âÀ¶Ñ’ ÆÑfÍX G8VÌ©+’2·HA–Ê:h¬‡k{d¾v«ÈÌ+I?œU—\4Pí|e¡Ûº`o.zé‚+þ¯'‘?C¢'½ †~|*l*úc215`’Ï#M–ež´f&Çø>#rH½¹äŽñü€¶ñ|jÓx>A2à£
9Û1PÞRíÊë¦îoÆ<œÝ‚x.ßñNWóÖ@øÆƲè5Î…ÿʃ˜ü‘vz!0$lÅœŠ
œKHð›ÉH"N¥â_Ô¤y=ïH÷zñgþá—04™Aìy’éÛñŸ,¿›’ÁEyŠÐÝÙ¬,õ´G} ‹ô¿Þ"}ó³ºbãg}ÊOX£Âe«¬eœKò²'!v™D _¦0YïÙÇ©o£"È‹ñÑÄ…ôÓø¿sã¼^–Ÿõ˜kJ86×zšà99“àõ`æ¼÷Ðt2~@2È“C ByvK¹ß¿éEÚ?)ÈÔ¯ìÞ&XÕ׺¼Š5Î\µµL^sv:³æå±F"±¾ÐþeùŠd?œ Æ¿K õ\⇻¿)Št{]uÂe±5Úyñn4nq2Úuîe´ûäüI÷Ç1’@á&dº ƒŒt®Gº‡e¶ÉRµðÓÆRÐØžZ`n˜væ±àbžÎ, ºS!OþÁ"ú¬†“½¿Ÿ +ðøšHuûÂ
rùœKÇ}*e:.×°Ž~¼Ávøx—cÿñOÎÑ¥Žãë$Z"ÈØoäöi¤eLMoºÊ²—@[™F{áˆ^Ø™„ÎœîÖð±÷Š˜.žzìD{¸@œ—ú…,‚ýËDÛµr’ÍZ¯õê
?«Õ²ÕÊ8Ùrå™DÍÒÝA®
bÊǤðËfL6¨lLÅ0V;fšÁ`¥Kƒ£†dp3% +œ, =‚j]Ìàºî¸b¡O¢žrí‚TŒ!HÞ4‚d€¼T2¨-¹pÐSb‚±j +—ÍL ÔÜDFÐrÄÚ$jí@ç#Hî$‚¤½C´!×±AU&46Aw«'˜(¹‚ÅvG°UµÜNkpßõ+àÕÍÁo5SÓB´Œ!JÛb÷„D}àîÓƒœýºP¤»*ôöC•D•}èüqI™E3€ a°QŠòÚá*ëq°GÆt7Zƒñ¦#`&gV[ÃVpV0wEÀÿ¤¾Jz@Ù¦å}²}/DîІؚ¨¢.£Ý£¶r%‚`U0µ¤j(6 +ÀpUa/SÍ1f´-ÐÏá€ÆuÊ%oð/&¹Ü|Eþ@j ü ¶R×|Úi«„ÛA«„ú +~ŒñÍû9ã_ïyÆü"ã
á-cžøŽ>CzÏBT0ÀBh2@EØÎjp¿BŒ „eœ(;`žuzºP/€Rèþeþ@®¢¬ùÖSWI-A+ÄvúwŸÛÌï>¬o„¬/øìeü<{Ég‘½@|Ëšõ]b=ó{Ç–Ž£
lMi2Ø +øïÝ€èçñžÀÝë¼µÀö…xr Ð9{€"=qéáŸðHÔ{\vÌ[laSBzYF¯¢½ +»Hz1ÒÊ|ÒÇ`öD>eØ1ƒÌ¦¨¡øëXç
5Q5P7y +Gî,`Ow&ºã˜ËÝ iÍ× Þ8ÿ…`Ú¹Ìû} 3ÔÑ»ÞkˆÁãJ&ö¹DDâ§0³
¼Gôñ’MÖI¨T:ð
©wc;Óê‰éçÈíªrj»ª”Þ‘nct¦3:S˜])ÎúlˆG
ìen GïÞŸ™`Þ2²w,‡ì o°o~g‰üå•1öàˆ–ŠAg[ÜÃ$³K åÛÙi½PyƒR¦úƒT«©'5kk¨ÝºCWÂlÓÇ·iòYíê<V‡*‡Ý™æ,àüm˜ç + ^S uåW€øÌ€ì-ó wÛRÈÛ½öCÞßW¹a#ÙÑA&RXoïH•0š’Ò×HòeNNZ-³D[C¯ÒWÒ‘ÓŒäx¼ÝPÀnÕçrºln›6‹Û®¶$t¨œÜi.ÀB
‚ÅS@…Þ½æõÓ w³',†¢_V½)Þ·a´è°ÿãBÌÎÞ<â¡V33æ–NÀ¸š"Ö&iåÕB‹ª<¡0£”]n´±êM…œfS.÷žÑÊkA,|»ÞÄwèŒü6-"hW;P{®+$þw +h— Vïo ý7Šý½·mûß؉=ëOòë;±õ~1þàí#´˜+™ Œß4Rá¯)iŠÒ$D},1×pTPj:«µdñïZLÂf"ºgÔ‹ì†Q«^'rè´¢ûg}6pPƒ½q2–ÿr¼= èÇY`Û<ÿMéV¯ggv®ê¯8°¾»<Ìÿî Ü? +ȸZ+›Qˆ„'5 +EaŠNsDfELÒヸƪ“4ei¥wÍjis¦ZÚ‚¨¤v½JâÐ¥KÚ4Îz[pQCò‚²ì8ºÎŽm˜ñ©Ô×óe¹ÿ¢ÁªËú.ì[ÕZuxË2ìþߣ«Ž2é¥Y|A!’,ÏÖª5HšÑ(‹,©Š_³Ê[V¥âŽE©h6)å-F¥ÌnPÊZ3”ÉmZgÿoƒ§+È¿›¦¥S¡à‡¯ Ä{Ú»3gVÿ4w nÛÂîK»WÞ¹pè竘}çJ زc4Zq—ŸmËÌTµJoDäÚ|‹D]ni®[Ū;Iz³IšÚbLJ±’”ÉŠ6³@€PCÊÜÉååÅ«¿„Sk<Æ+½§ÕnšÕ×°u¶£aÇŠÆ‹ª«‰Ø[q±•R(¹ÇX<c¾(YuD¡’Y2ÂÌ\3×x:‹e¼jå w-¼Œf“@Ó‚Õvƒ(Ý‘‘˜Ö¦uÖg5¤£Y2l+¾øT¾òß/.¬þzàª{O“ßÌ;Û—_¹²ß·¦.lwi
."ÿ,‰d>Åäjl|©¬(9U˜¯Ñ±r³´œ“frÎ%5»ÙÄ0Ý3²„£oÕ'è:ž¦Mã,þÇs&ö[W8ŠnºR¯)UK¦]^6õaÓ·Ö–
Ó›—Ö6ýX~%dgñEl¨õ|AWIg)ÊE§¤ +Ö •šb³è ÇKŒ1¶‹F|qB̳(ÖV=ÝìÐ1ŒmÚxC»ÚYˆÄè†0 ¡;âÌ‚Écµó&÷ßüε³k±ëíŽõß\¶,®º³ÇçÄàí¹
˜`ärlLj•žxžÃcW‹¥”Ê´|…Yuö¸6¢¢NQîÐaK:|a›6.÷¾†”Ý®¦X:ÒbMŸfôí*™7éCõÌIC×<\:»ÜÿÑôç’ÉW{}ÜÏwù/<íص®àÞÁ +á.…r=3þ¿'CúM*${yæCô½ +„É8ÆüHè—ÇA³6 ªM©PnK‡| +g#/Î…Ÿù¡HˆB5ù™ÑÈ]Â…eE*LëÐo–@»Cõ^Tßi <¡ƒ¢N?"»–1,ýÙøVÚa÷;¨×ÆVõ€é>ý&ó¦fÐ|U7h¾ì +c½P’ì‹2A J•¢±$7‹?OCÖj!Lä0lSA»Gú°~DuÜøAYgV\7¿•?²¼Q¼´tR½–6º?«Iû:û?úœK†œ9õÀÌ4d0
³\`å°Qå‰rî$T¦OC…l6Vh£ñ¹%<XËÅȪV´…†a·þƒö é=}ÜüNUŸm§þ›3¨|œÛ£êÊm×¾ÊmÒ÷Y¯úò~2öåýhêË;“Ù—wÊX&9Á4Íæ,5+ÃÇbu¼Ö¦MÅZI(VÓQ¨0qQjå¡°Dü>o
eÏÙÄLp»ñqŸ¥__›Ó«ýÁÚ£¹’×I7ç?ÑþŸíúŒkòÚã +·eûì¡âèz¨ðv„©A;¡{à³€àþžMóyKçÍPäa“Ä,ܾˆ`ˆªŽ¸BÑ…ß >¢
b'iÝ‘/éí¸ŒfüF}ÌKF-á%½:v2±2v’fŒAçi:OÇ¡s=½_Hœì`úž0ãÈZ¨:±*¶J?³÷,Úm:™ìý‚Ë 20%áà Êè§qùqC„²„hmâݨ6foT?«'jœÝ†Ÿà4Æ9uÄ NUÜ»<ÞÄ*‰ÁÐ^š _b`4šâ0ò6YAù÷¶PõÓ2˜í²æß4—ã·í]fˆó”2Òe\w|DÌxŒÃ˜Š˜~j&¹‡T˜x‹XÍú…p%©=æ6òsŒŽ×@4ðjâ
¼r’ÑÇ“ +)ãœ[`b™cí1ï` ië,¡p£<»Õf;/êÃ_ý·à˜Ã +|§ÔA;ÇsÃ÷ëT!5஘‹íáI 7XçÚó˜- eI$-¿>¾CX?˜\Ij(c‚ªžŸO3 ¹4#7›6ÎÉNœ0ÿŸ±ÆŠÑZdü{Ìß½\ù±ÄmÍl©×·¦ÿm#Å¡ÎC¹Ñîýä€.9Û!ƶðÔËœLV£©¢]–Q[Åj¿¤6,ÎKeÓÇ„™=ÿ<Àd0ŒÜÆx’9hËÇ@ZöjK˜²Þf¡{£p—Ý?¥û–½«pùj²ú˜ƒ¾ÆwË“òS?Þ+ˆ<Ú•çß¡¤c›S‘X8…Z-P²K¹j~!»B”Ïl’æ0{R2Y:©Š=,V²G“ÏrÆé=/mDP\s`z¿Š[k “ÐsBŽfÉýÎjv,œ«t^<{ñÀŠ Ûj]½×7ªwÿZ‚uë¼@ð¿šE
מãÄVÊET$£æ²x¥b%RŸ’ν)S ¦È$¥"£B¢ç˸DÆ5rÍñhÚ·xèþHGû¸z³,߾ோ;í^5ìY¢ovYñ¸ÉcSÿ%ÿ]7+ÃŽ´jð~õjrXU“P¬Pó©l•,S.)’ÈDu2qrgªHô\&餢äa±H8š,Œ DOÄ7"æ@š‚Ö@¸Ò*Ñ,…ßXþSµÕúÖi©y—®}ï’-îz.ûíh¯
um¬ÀùÖǟѨé1yÙH‚J%e+Îfð%Šb~jŒ›Ú–Ê‘ÿ!K’餈tXŒHF“yâ1_dàñ“
ˆ9´iè9%FŸçWa`ÉF‹¹ÚÍó¦›ôíNÖoü¸¸¿ÝÍáÆUß®6œ>\w1Ò§¬"6T¡âUŠ"OÄeå!ª<3£2%QÙ*£f<”%žÕIi#b–|TÈ– 8)GjDÌdtm†½”-ÇÀôÿ,_‡ù«ÞÁÂtmƒ…®k³Åƒ®]_t_w]×ÖæíÔÐ|ê`eöDAmLpf—VÆ"‰Š…tn‚KÏÏRòÊ%q¹Í)±y¿I㲇%dÕˆˆznLHK×óé +B—¹æ@ +º6¥X†êå +›TšÉ#””$ãJšÄ‘%ý"\ÑhrLþ˜˜çÇŸ7ðÈJ#—rn<ɘ€®Ï[ŠÊ% +t·YŽkÐ2´4ŒÙcªÇ‹G—f»®Mûó„cò³Àݬ?ÂQáÅ‘}#Ù!ƒâÀ‡á'Gz6⼆úpǧq^½o Þ7Þ}¯½Žó»ò:Îÿò¬Y0y!˜Î`°º¯X‚¶NKÐØg
jŸ,e¦ULÿ²9or^!Ÿp]/?îÈ4úí$BöâõQ.X=Éã´žå0&òõÕ+¼ô…Ažm°‡±;ØÝð2Ø]÷>ÄãÁ‡0ÏÞØã·ÞGzýbLà©€;Zhkµ +.,* ‹l!!!{ I „7Šk¬KGw©KUªŒ#-êX+:–uŽíA=zÎL[·ê8¸ ‚ +B|潚«ô|çwñ]=Ïû¿““ÿhi²l´*5{¬.]0ÖÀáºwp3ÜG²ØNRqU˜‚ç"Ö˜[”> +Ê@qH*œó’±tA<Ö†Åâ³ðEø<"Ž\ˆ‹‹Âq+:}Ñ¡@Ìï9ÛFQ_^$ùW)jÓmŠªHQµ`Reðgů|2
Âé2ÄúˆÁšÎ$„SÒ ócA3-†éq°Îˆ&È"QëŽ5°uvšæ£en .ÎEWÐ\ôÏA¿GÇÉì%w°‰ÜAÝ}Šª¤(h”Çi0uœþ^BÓ¸÷f#†ÎB#lŸX𘋠fF@>>ÚñóaœÛÄ@TNš•“ý±qÊìòýGý¦ãë©Óq‰¸2Í“ý$¿›äß¡(çŠ2»)*%`Ò8¦z¥ d±¥E!Ê;qÞó‘L›.}6DŒ +ø§R‘u–
ÞÅtð:3À½ÆAæÝLd>Íç
1Êy™ïà +‘ùJ®'ÿï J¦CšÊ€‚ÄFâÖKTaPÔ-‚´!’ÆDˆ›XK…à/lðÏd€ßÎAV'ɺÆï.ÜgÄ Ivg‘|ž›Þ[xýbd=“xM°ä‘4d'Ñ¡`1 IgB'öƒ^ +ñÑtˆNf@x&‚v.Yàwg!ë>Y½ð†· +A¹1ö’Å(ªIy
†-|èv‹‘{8šTgP^R¹WÕï¿hÞÊŸkï4OÔïµw´£yÿÌÓý¨wë:ó?è.<C>Ù)´á4˜Â½a#*¢}P›2Ëø3±LŒ}*‹ÃQ™Š’ºÌÖáhA£dÄÐ$§?¦ÒµjÞäžÏ}íÌëÓÜÔõjžèz´oõ¿æºõïW£¦Ë¦QÓ…‚Qã9³g0"7ŒËÊx£&ŠºäÉXÅ›UÒ@|œŽe渱jGÊ°s)w°tèuñVé+Ëne¯ù°ö©±E×c8“ÿ8ÿ²á‘¾Ûx_ÿØø³~° Ëð®ðï¦aK»yØr®pØÒf.lµŽ˜=‘tГ|Ù{]ÄŠ:Ö&NÄ'œéØ=ëÕ¡#«1ƒ+m¬WµU™Ï]õ¢žò²GöFÍýâ&ÝK³ñ_æ¯ +n´[nš®Z¯›ýd(î0ÙÎ[mmEC¶SÅCÅ-¶·Å_–¼³zÓl/çyÁA¾‹²o®"÷ñ‡øñØ”î‡-ÂY#›óô‹z×Y’þ[ïäü¶|¹è×%ëå·+¶æÞpì2\+9TøcqKÑ?¬gK:-ßÛ;,·J/Y_8þZ4àhµ
8NØJ•¾±),9ä²y‚ÒÁL~#œd+È·±.”†Í±LlK2ÚÈŸ9Ð(
êý£váãÍ‹ïmp°o¯ª]_±JùSMƒîŠk{A‡s_Ñ%ÇQû{kÙ7%í㶮Š¶’žŠ“ö¾ŠfGŸópYùò×eMÎÇ>ç»'( »¦•d»È¾WOz4Ì£a[4;Y‡öp§½Ø›=ëñnÕü»†˜[›mì®
.Ñ•Õ+”+×ëÛ—n)ü¦z§ítåAG«³¥âdÙ9׉²+ÕÍe¿Uá|YõyÅ+׾ʾŠÝ®~ç.×ë²®‡'0“ÓFfQCö½5¤Ï&2“‘Þï÷%Žï?1åÉAáŒd·÷袻¶[Ó~ØìýmCêüšÕù§?Þh9µ|{ɉÚýåǪ›]‡]mK¸:jš\¿Ôîê]²³úEõŸ–¼tm_ÒW±íl—y8ÕyÆŸ³8–¥H%C¥E¡S‰²f_Ë–¥‡ã88‹9v!Œ5d¡l!‘Ò´ÕôÖeFišìK4ÓLóÌï÷ýóüñùû¾¯ûþ^ßë¹ÃXYá‹A¢@ƒÐæ»3A…„™êÄîü‚²Z¾—6]M—ú©ÖDî»j+µ§¥.;øìÍfšw¥‡9´&G»7Æ%úÖÆžgTF².ò«8¸MÜ<îm^÷?›7ÅÍäO‡gðg9éü9v:>$·, +ô%tƒ”IIl¾bó樒þ¾¨I^¬Ö¥NÔï{å ô‹:‹+vô—xÑo˜·f‡:4¤ÜkR„¾e iŒ"anH^lYXVt/#ê¦à\Ôˆ 5ú=/%z*"9z&,9j649j>$)j%Š=°Ö“0æ¿{‹È"_…ô©Bƒ4{Y›üS“.u´EÍp£™ê@Ãöî +Ãk%§ÍóYö5_qO–fÄúžKf|•”’‘Pžw™— ¼.ˆF +ã&ùBáWøåLxÜÙYN\ì;.v% +ô#<°ÿ¿{Ï+‡•UÒäÕͤ·íÛHß´ï“zÔrL¥¯ÁNûú¥“M~ÇjK‚ìÊ +ÂOæDûdg%2Ò22YIçŠÂ„)—xÑÉí‚È䇑‚” ~dÒ7*a:<:~–7ÇŽ.°DþDaDñr€Ùò€¥ò°xY~nS‚Ñ›j¤á®½í&Ê·šmµZÜö_¾äs´¢2ÐæÂÅP×ì"wZ~Ü™„œôàØìŽ ³Š‘Ñ*àd8çᇧOq#RgÂy)³~Ò[¸Àž&<påH˜,˜'+•2ðóUi»!
Ï{Táa÷nñÞ®#ë;Ú5›]ôª½‹ëŽçT‡8§•ó<.žõ)Jeò +sC9ùᬼ&3¯Ÿ˜ÿ#/8g:"$s&,4c6”“6ÏK]`‰ˆ·)K¼øý¯•€W’ð¼[ +†î(Ãݾ´=‡›oZm¹Ôá´çb«çáܦӖé
ÁŽ uî151¾¼ª$»<›Å,+åœ)½îWÚá[ú.Ü¿x&, –ÃÌ™ce͇°Î/‹ƒˆb¥3¥à]^6ˆÃH‡<î•€ûŠÐ}_‡Úv—.Wßg¾©¼ÛA7ÿ†;=£Ã×4±iÓÌqå^òb7&øÖg2üëJ‚½ëØžu·C=êÆÙž5sìSeó!~ŬӋÁ¹‹LQ ›è!^ó¨0ZE‘&<è¢A¿tÊAûà6Jã#™Ê¯M7Þ³Óɼã¶?éö)ãØ[Kî
¶ûºÀÑïå×~ÞÏëZñ™“mõ®m=L—ko]š—˜'./1=ª—˜^å˧J–¢ÀÀT*¼-xVGmTè½E…®ûbÐöTŸm&W=Õ“*6VÊ´ÖL~ä²ûì×^tÞÀ™£ì{!VŒ~¾½ï¡«g_†»[o‘·So½Co¯}ßÛž~«þÎM«þ®õ«þ'.‰†˜!0
ð²àÑ2ôv¡³—MiPûR +*GUIE£º´ìW‡äSþc©~öGmÞ3½§þtÆp°‰ïž…Ç¡µÛP†½ãP‘³ÝP½«ÍP›õ“qW«Á'ŽßûËæûOO»Î?½Z?‰ +*ø«¢2~Z'ŠêëDÿw ý +à ¢VÇ渶(.€–@ ÁB€ +Ü嶣QÁbØÍ´'Äž8 3ÁVÏCXÖ|°Š#È⌀.`ì]ÿOWÁï¨+üN¸ƒ~n5|¯w<àóÌ>ý„ÕÞø`À㞣A
OžË_Bý¨'=¸Áöà®q +žQÞvˆñ·Glˆ„üYˆMtBtÊ"ðsÁ+]ð*W„5¬Fh+
!‡½À:æÖi__¤#è;?=öGÐ+b„ÀŸ¬¡ðà à¿á`>ã‚ù˜7ø¤ÃÒO=íà3â@$ñfAœà„õb³–"ºh%ø[WƒWG·Ùámtp:ýÀéf€}6 +±›¤žS g8@>J¡dòÅHJ[Q¾+âÊ<³Í‚:øD¶3q,¼ÓÁà]bûkœû,d„;2È{Çêç!´—ö8?Dƒs3œë“€ÀÙüU¶HXA…ŒP»ÛAKŸ +}Ø,èNÐ&-†*ÅòunH2Ñ ²Ð_Çx+l´Æ´Ew„ŒºÃ†ç؃Q7ÙýQ9/¯9}‚ñð§pïÅ€w3Wâq>ç&Ò!†ü?“È{¨ÉÖÔ¯²ÃZ{d±>@V¤#ÖŠA¯rAr†»UUà=,7ûJ¶$6°^‹ZÂ^%´s^Ä[Ó÷%÷¹ð*·7î!ïqÜ+ÞC¡•;Q× 8/†àËDN&AÐ-™±d_Æ“|Ň¶Ð™ä-Ö‘{äÎ@w.Â…ÖlÙ²Át½[¿ÞàýR[Âøª"¸WQöT¶;ü±¤ûKRgÄñIþO¢‹‚»¢{‚[âÑ7Åc±—!ì‘ î„qÇe•#¶C1„$WLhÙb-‘»Œ +#¹G‘ÿ4³g æ_4®¿egy?Y»ñH_κŸ¼s[½+â–²%êßòö˜²ãÂkÒžø+’o.J{ÎI‡E§eW@Ü©‚è°¢ƒj$´©ÿ>Ä‘|)ÉÖ‘‘³Àä6¦UT”ùN-gÍì7G8õ•Æ/yZ¤\ùИN»³n}À÷™%¡7Ò,Ü«ºíQ—´ÿˆ=¯ÙVÝ!þJy2é´ò²ä„òɪ7Ò£ê·ÒvÍ[Éí»¤V-÷¥@¼gˆ_Bî°Àidg¬'=Š—ØÀ¼Üö…6åM%sz_eøœ_-Ñ~6K]n™t^7 +r˜—
…ìó9戞ŒªèÓé;âOè÷Š?O9$éÒ—w&8’|[Ù®ý]Ù–2¦hÑ[åͩ㲦ԷÒÆ´wI
“ø³ƒšdg’Q@zlZhËR›ájwêËZ¿©OkCf>¨áÿýVE¢Ëu³†v¡$ƒÙ³!}*¯$ò‹\KlWv¨#£Ir8}¿ü`Z§jêMkê·š½©}šÝé#ꆵ£ªVE}Ƹ|{Æ[)!yD‹mìHî@6oñ<l&}ª–ØÔ°ým——Ý£Fæ´ëyNßÔ$,»P¡¤}UžÆì.Íå+*âw˜…‡ÖW‰ädïS6gÖ4ežÐ6d\KÙ™Ù«ËN®ÍQ×dªªs¬ŠªœqYUöDH$¿[G²
dë”Î¥ ‘2V»€òr×G6Oš]mï5Ón6†;^ª.í©‘{vWèº6g³?Ûhä·™6 +[ ++›Ûey»U;Ÿjks?×Õ¬»¨¯Î}¢ûØ0”RiN®0Œª-†1åVƒU¾Õ0.{$ómJÞ ŸlÞ²ÙTÍ¡îp¤<ß½€ò°ÕÙæV«ÏÔ«{ØóÎ5Æ8Ÿ¬—xtÕhWf°lYÏßWf6•nIÜY\#¯-lTWìO©0vé·äZn|”Z^0¨3iÍÆM™qTU–?¦(Ë·Êßyûµ³ÿ¿{)ØL|2‹Òß8›òkËÊ݃‹(7xÙ_h
{¦Yðáñ†ÄÕGêÕŒ¶šô°½çF6Z +…õåæÄš²*yeéNõfSkʦâÎÔ’âž4Sñý´bÓ:SñÖT4¢1ŽªLƦ
Ö ßa&É.&»×òå÷ú”‡{¦Sî·Í |ß>ŸråÇ”³m¬ÙÝü%Í"·ƒJ¿};ô¡µÙuÕÆØêÊb‹¥BfÞ\¯.1ïM),û,Õ¸éLZ^ÙÄ€>ÓÖX:¬)(U˜Æ”LVÅû &ßBÙœ¥3(CUÓÈ沧Üi™F¹uh:å›'Ê¿Ž¸Ûjú[W[Ä¢öÖx×Ö=rzSS +«nW&·º./fkI´iÛViqUÊXÙ¬5XÚõ9–S©Y–ïˆ×ºœ-CÚuåÃyTeØ4¦\¿ÑªøÛuÕä™ÅüæMBXEA«„ +RŠEAPAܵEÜ—#n=3Óv +cÇNUÔž‹,òŸg¦g¾À|øó~zþ÷yî}?ÜÑÃf¡À”Í‚1=ÛŧoéAˆî4ÓµV+ºØâÁok2?ÖmW{$QRYkð+;”£.þb‘î“Š‚¸Â}ëõë˶¤ÞSœ±¢´"{qIÝüü’Óyy%÷˜×óówöç,Úñ>{IÑ@ÖÒmƒË¶\6‡«Eô~Ÿ¾ÛÃу*!Ý®3¢®ãFt¹mu´M原T™Õµh'lšéöy}ªOqÝÜàOjó#«—Ǭ;¸&aÕ…)Ë*>K_X¾?+wÿ᜜}móæî»Íôådï}Ÿ=×@V^ñ`æ‚O‡2òwÍ
YÖóéÙ§D÷ñèN€®6èâ uœ1§Ö³.ÜÑ3þ&Õí“öŸŒsÞÕ’"/jÊT6æ…®;ºT·ªnuÜÒÛfå×î˜=¯¦,=³úËÌôê“sÓªo2/³Uƒ™åƒYeCs²w§ç”FÃRÖ‡ÍDßï"º_IÔUǧMµ·óèø%Sª¿,æÕ\RU\µ,=ã°½CïQØ>ÇwÝ©yÁ'G,iY5-¯yc\vSѬŒc{“SkR“N’oô
/ú£Ã†”/?R«>¤*FÒÒËGRGC€žo#zTFt£šèb=ÚØî×t–G_]Ò¡k¶TÞ%”^
1ßþM´má•D—µ—Òd+/dû/>¿08÷ìÊð¹g6èÒ;¶ÅÌ>½'^º:1¡½Uúº>¾ý…>î’f6#9ñ(’õ‡‘œTƒ¤Ñ°Žè‡Dw]ùŠ¨½‰èÛ½j/qTyÈÊîM¤’{î\Ñ]¥ÉæÛ‘×ÞŠ³_q3ÅmÑõ,Ùük|³ºV®®S§\Ý1«s·6¾³zÚŒÎÖé1×™Ó£¯ vÚyÄÅ´#>¶3ãšÇúåÏD÷]!êh`÷?ÁòÏUtr´ë®ˆŠžšÓ–§Ž¼O}„«Ÿ„Ž[þ8Æ:ÿ‘Þ>çá—Œ‡¹©Ý˼’º×ú&<تŒ}°;húƒêèîV¶û†F×ýByÿCxø]DFvAu:íyDöÃgD7Ùœ«#jnfù§‰Ê¯•ÜâÓ–‡"ÚÐkNkzż•½rþâž ãù=Z‹¬žkCOš]JOŽxVÏ×øžÜcz>–F÷”ȵ=U޽͊ðt2ÿT„þ8èòw(CþŠ@u7‚5÷2Úýω.Õµ4>Åò/í¼NôñŽÖü͈V¾´¤Å/y¹/eü¹¯TF†WfɯfŒOx•d×—a3½/ÏN×·Â!²oƒcØëí.ê×ûÜ‚ßÔM
|{F¢úõ‘Dùæ7‰ò$þ/!õÿò€Ÿà5Zç!¢“õDul+XvvÞ'úÓ_ˆ=7¢Üß-)«_Ì3ô{pÉý~‚„÷j£Z“èx³¨ÁÙáƒY4Cùƒ‡ +¬UC›lü‡wÚú~¨´óùÐdï5òµƒÏIJáA±lbY?ñhí¬GXœaùD›î|K”÷#Qæ;#JÅÒÃŽ7n:¼øZ(᪡3 +B¼H‰c?dšø`©ã¤Øl.A‰ÅTšàŠVK\ŸèŒ_¬œ0låü_õLj*ÙPü5Ë¿C´ò)Ñ<–?ûg¢D(¤ƒ5E@ÌSÄç +ƒÐóŒÄX.š‚"[Ûà ñ$´˜X£ËÄ +Ϙ÷LG«b3Pr™hó-¢Oˆrzˆ’žÅ¼#ŠQ(L(ˆ½…?&ñ|X2¸ñ$ðä¹BÁ9AÅ9@ÃÙAË·A,ß +I|KdðÇc¡ÀkfØ.0E…ÐBcœŠÐÍ<£ôëÿM–ÿø|=»¿¶HÍòUŒÉ`JŒ'WöŽ˜Â›'ž
«Å +RÞxó,À‡ÎQœ±[9B6³œÙÌ'”2ÕÌq¦c„°=/ÀŸƒJÉGp £ P'D@¢~™&P,6‡÷:KÈ‹¬áYf󶱃´e +¤öð¸â +€û;ÜßA2BY
!Þ"¼8è¼ùˆö@"„nšÚd3DæL@ø²IÐl°EÈv{íuDP•3ë\ jv…ªÝ
ÊKS¡¼áåæ¹Ê_™! Xæˆ +’Á@H†ç+5<Ÿ‡B6ÂÜ9„ÉX¾”CŒ'±ÞÄ +ÅÆ+ab2,1m‘
´k¦ r‹á»œVîŠÐš©ÐÔK iõ€ú¬êNæ¾'Ô½ž#êמCêÏ~
<WCþVï…Á§7>ßE…pVCÔ¿É.ó ¦Ï4Ž¿áY¨EjEÖ( Š"Aäø%¿œœ ®„#@¸#rÈ
A(Ð"HêM׫X³VG+VW—ÑZë]Ýgßý/ûÇgæýïûÌó|gÞùà]Ðךß$žƒïi ¼VÀcØjDœ0•Ë!D³ +hzG¬[»ÚÖC€qnü@=âüžúË_þ\ßøßr}As}F}íú„ +nsþàþ[ +Ï«Aày9øÿ*Φ9â|ìºüÕfú…9D¸Y@„DÛB(Ï„ÑK€—´âßÕê÷Dñº·Ì*§×ŒFç—!.†ômz<âöŒvlóï´i÷'´k?~å1KƒwƒÀëZl»Dïi&xŸbÁ6S À‘Œ•àaç[nb<ÄÅ$^ó@`1셢—¼ —®x!JsüC¿þ)Wï<GÖnzÌnÝüO¢Çã1èyŸ5¾e–uz믬+[o±zýÌ|á}• >?2aÇ4;N°aÇ1vŒ“àk +ìZCç‹°o‰—R ï#ÑÉä– ÷³~—H·{/px*Ù½â_Ñ +LJ‘j§Ù°b×»¢ªÍ·û=oò:½~æöy_#¿ò™!§|ä\Üq™¼çwž|¾ó ÔÓ$|ÀQ>P‡@‚¿)ŒwÀÅÙØuâ°sÉW`ßÀ÷Qn2«ô¶ú#5hÁœ‚óéyÔò»R™ã/’ô×£5n3Qº-߇¼/†5ûžuûMüÏ +ÆN Îî:!¸x\ð$hBð6&ÚP(õ‡APo8ö„Ã.S€Ž3‹)mOÄEHÁód¬¦ü¥Ú`ö\íiùX½Óf6“iK¶ì'Eœã²dçRµût¬vÛ阽¾'Äõ;'£Ú¾‰è
:>|$l*äë°èÃáèƒáïý@ï‰zg„´‹!¸U4S€µ÷ +\Íg·[ÝÔÛͨË.¦Ç¬=—"w9™”î9)ÓxOHKýŽÄU|%i¤
Åt…D0ûĬ^ñyÂ(žewE¿&:b€hÙ
ÌF 0$@¯“@ˆ)ÀÁ=ˆÄ®%ÅΩÄs¨?AïÐïÅŸS~+[ov«l‹åLqàÇòÉ¥gr"§2¥.GÓR<G“Õ>ÃIZÿYEà¡„ºc|;³+î»#v”l•œá6Knscÿ$â€S„A +¬j)0«¤@7¸øbœ-Ç®“çȳC¯ŠíÑc½ºS¹ŠòSåf‹‹zê‚3%쥓aŽã¹±.#ª¤->½J
µ;¹,¨3©†Þ*o&e=d}â0¯6áßp]PøŒW%n…8år ôr`édÀ0ø¸»q¶Âʽ-ü=Ó-@÷«ìÐ}ËÐ÷†Mçªü>š*g./.Œqî×È<ÙJŸÎ¬jkFQ¹—Q—ÒÀ®I>ÀL”'ê’®ËO¥ÉÀ+I²Xì"¦) Ä]ŒµEú7ô!Ç=*™nïµFÿØgƒfÐßœÍOÖúÚNTÓF*ø«ûËÄÎ=ERÏŽüŸæ\µ>»€fP陕µ}z;¯DÙ/Ô*'DÊË¡ùÊ9a~ð5iÀÕ(ƒakRe +„-D}/Í +=Ë·D·u–èzõ|œo.5-Bgš7˜ß¿Ýf´6xñ@
w•qoäÆ]œGSIÒö:m†u~<¯”YšSÃѪ[xU¯0'k,Tu!T•õH¤R}¨²€§ÊRlu:¦@îB¢‚LtOKA7*,ЕÚy8>šn³G߶a6Þ²Íz¨1hQoge§!Ì©©Râ^[.÷®*Kó×—äk‹UìM/+Ï(LÏ
Uæ~šš÷P”š÷^ Ì^Z6éj`§«€0¢pöX WÙØù°wÎT™£‹
–hºu:yÀMt5éÜ2¿¯-à“®&bEKƒh}]mŒ[UMÂ6]eŠ_Q…*P£+¤«K+ˆŒ’njQ·@¡ÉµgCeÚû"yÑ;ÁžBüÛä©Ð +Ș +àHt@Ä–ËZ¢—Yý‚ïpÙ€p±{ ÑC
|i…/CC._úØÖ¦-Ö÷‘+µ½aN¹ÆÝn™Ý‰[S¤úÊ;²©ñmÅ´ÝÕŒ¨–V"¬ù0GÔ<E +›os„M¯8¢ýÀ¯"¢XQ•À4ä=ÈEèj9Bßa÷œÂî7jÄùÿõO3Ô>ö)js23ñ²Ö½Ë^;B|–3$tÌoL>,u—õ'{ÅRùF÷j©+EÆæ^O?ƒì™drŒ7œî—N0¸Àà7]X!¦@*Bw´]ªAèdBcÝ
öãü‘ÿù_ݤªžt¤èŽ{Ì+<¶sAöÃ!ý(ÿsÅX亄#qΒѤÍQÿa»N£š:Ó8€?÷&l +‘°C ³DÂaI°)Te´Z=z¬Smµ:í±g\jíÇj=Ž¶.ŶÐZ7w‹‚ÖÁ:V2Ö±. ”©VD¨úŸ×±ý ·߹÷Óý?ïó>÷ÃóÕkÆÊ/—¦–7¼›áªÿÐZT_ksÔ7å6¸mŸæäïDna-r[;~Óóúc³x|ÑþÍD_|J´íó§ûßÚŽÞ>êKËŽEÑ›ÇÔ‚EG->¯±‹çv…Í8T)ýÃÁ©ŠÌN˜Ð²@]Úò¦n|ó;)ŽææüæÚT{s£%·¹35§q0Ͷ¶ÝÈÌm@¦½îyW–µ³´Ô5°;ØþdÿdûßÚ&¢•GyúS»-<Dó¿çæž6zÌ<m5í”Óò©ŠÊöꈲö™²â¶Wζ7âóÛV%æ¶}0ÖÖö©ÆÚÖ¨ÍjïÔfÔe|CÚqÓÁ”ÑóHß±ÙHôõ'Dµìj¾dùû‰V&ZrR@ìð¢™~4ÃEÓÜj~²Û"¬tçù”»Kü\îÄÎÎéÁù/‡åv.–dw®”fº7D§»·Ç¤ýk¿Ürñ{¹åÂ…ù<”¦sHLùI¦SPÔºŽh»ƒ¿³ÿ`S=Ñ{lV"ZÌvЗ;xš~Á‹&u‰¨ª+’*º¹’.£ ¨;Ë£ »ÐËÞ]>ÊvcŠ_ÖYcÒo,°ô¼dîYbìÙjèm×ÿt"\ßÛžÜý8\Û…HM¤êkˆ©™ÝÁÎíD›Ù¬ÛÃò²üDs;ˆ¦^ ª¸,¤ÒÛþ4þ¶„·ã¹¼~o»cdÞɦ
8=Æ
Tx™îV{îÎöÑ
.\æ;vh½H5´mL¯ûý•÷.ˆ•CwÅñÇ÷C×À‘ê·ma3ð>›Á•ˆ^gùsX~µ›¨ôG¢Â[BÊ‘íQ(e>Ž¡´Ç*Ο¯ƒM †C„ra¦xÄa–‡¯yFc…—xGa‡w$xKpÍ'÷ø„ÿÛØl`3øvËoùg‰&_$*¾B”ÓM”ù#|É„@ÒCBZ(( *.É\,Ì\²xòøHóᨄ`† óX&cƒÐŸ Çà ‡W˜!ÏÙÈfpU3ë+Ñl–?颢«DÖ"ó +C=€qœ?¬œœ/Ê8Tóž˜Ë±”籎ç°'ìcÎ??g5û—|óÛùÿMä¼ÎÎþ˾Eì¼Är‰b˜(xSü(b +Dù³ZDÑhÄ’Tä ñ¬/Äj!8˜‰ÌKÌ"f5SÃìdZžm‡$=m2] +{¦ +”-€²HE•bfy"z¡¤Ë} ];Ò|!ÝêiÒ¯Æ ª‘9ê¨ÓÌbDõ2w˜a1¤xÂÿdì]† +B,‚Ç#dXù,èT’Õ<ŒI¬•ìiÒb@o÷€¶Ìêi^;oToø"q• ëý‘P#F¶ +¢n »e@t 1W͈¹<îY0*Y¾œƒ-šCSÀêph(´‘Ÿç {™r¦ú!{®Y‹ƒ±<ôqúšðáôÓ6GÞO«ºg©—YöI-Gd–Èn[®Ëþ“Ö/ëµ<Š¹a¢Ë‚¸«Œ;ñg3&óYHeçÏ–rÈ—pp2.VO)›R“®lO÷s’h¸pVÀ½üWCíKÃrÞ‘ôÛÖGýbû›ìföÖ蟳ëbú¬_Ë{ä=ÖSŠ®ìW²‰½dVºH<ŸU‡ª“6¨Žå@ud¤³³ÛÙÞëeÙÌD‡*%ªd*Ó=†'ø•Uˆî”¼x«x^h_ÑIc¹´»pMôµ‚ò+ù›c/ç×Æ]Êkˆ¿hoRºí'ÎÛ/%väÝR¶?T·Ù¡iµC{$Úæh÷B³gX£8²³$妰^LUp˜6–0Õ,¨¶yßœäòë©šxmâì°Ëå¯F^,]}Áµ*ö\ñ{ʳã?J<S´%é´³NÝîØ9é8¬muœÕsöê:ïé›04:aØ]CÃxvC_7rXŠ l×™@x1”0SÊ=œ¥äîÌJôÍÌð¼>Ã1úҴʀ﫧‡Ÿ4OömåbEÛ„?+[+ÞM:Vö¾æHiîPÉv}‹«>¥ÉÕdÜïj3íq]3írÝ57”`ÜÌg¥0o/ƒiK9ŒŸŒ€<Öÿ’ÿr]žQMgyþ%DŠ +*2¢Ž2XP¤H€„TA¤D ‰@(¡„J¨¡†Þ” + +Àç¶|&€×âüõðt3øI¾ žäl}Ž#ñŽœfr+ãȦéÔ0k4Öf,9ÉnD$sÐ&äºJÜ{ãj<»b›©í1=ôVÞ³™7Åjä=`×ó~f×Åü—YËGŒj>¢Uñ‘wQ1”• Àå°k Œà½Äþ–n‹ÙÆð$o<.°„»öÄÅx:‡»érVÈ–QÏF›"´žvìI–»v$’5 +Js‚š¦t0kãµìš¸ NeÜNEüOUü{¶J€X¥Ä( Z± +Ú +çý +…/ý +E¿s +ÃÌ!ºB„hï• `¼žü/ à¥{o. +×Àýc¸2‡ëå{WTî†KØ´EV}Šˆ9±{[äI
©®µ²rUª’ª:]M/‘6³%}…ø¢_®ø7[¼ÈÍ–üÓ7[‚|äÄ’‹CžŒ_ÛdD[ :·ÈøU°˜…½7Ÿ÷JHðu¹!ܪړ5¶„ñ*·5ÃL³þ² +÷ðXp§;O¦ëˆ kX£MÛa°Ñ‰Ô¦®ÓÔq-Ô5Ç·UWFíR•ÇïW–%T§ÊVæze–ÐRókYE;')Oë'ÌâžÊ{„ùÅ/!ùs[”˜‰Yˆþ)(šÿJúØÃÃ"ìØûj& p¡Õ´kèÕ0hkñZÛÐÄ1¯i8fªÿ²èß.¯Zä˜U™â*+—{H˔ԤÒj†°¸•¯<竼ê£|ˆù»/_‰|b+.1ãó]»°$Å[Ä=ÜÅgp³{W#vÏV€ÁôvYB{×>bc'Ù¸¦½Q¥9jUÔº#·‰·'³!á@j½ÄYR›é.:Sà%¨®¤ñ«š™'+|¢*'8•8ï|"*;R…˜Ñ%ˆÁS"¯h5Ë[øK€¾àãL«Æq¾¶ ûf`34ì&œéw3Tõ1L‹z–Ó²-£#Ê6¥-Þ.Y“ì(l‘¹Ä5+ȼ&•WdC#-¬¡¢¾Ìn¸Ç +V¿a×#Fp¢‡V#ZXþ+*_Í¿E{¸Wp〮`ç÷ö´`ÿ©Þ +¶³fjvÒg:¾ôž¹`KýÚ–:³dëuóÃëÈŽüÚç1…ö{\Eö+¹W†w¸ÜA'Þ@?@ίXΟH» ¼m +þ÷!çäØýð;ïOÿç}î}ï'´~¬$¸~²ÔØ0Ofh¨¼Ú#×ÿv^®õRîÿ+äþu°ó«ƒBWe{;ø¬ÝF´è;¢mù§ˆ†_ x(ã6QÒ}¢Ø§D›ÈúÖ"Þj)ü]…5GPps¬`|Ÿ(|Hü?ô´-"ŸÖÑ"ïÖ)bÏ߈5X/vÇ~‰nHÜ>6JÔ-«ß³æŽ*ù.ÞC4“ó'œæü‹D¹¼÷´»DÝÙ8?¼‘( + +†ŠÐ:ÒÁH>0Z¤ArCOÁY‚ +y‚JL”X R`ƒÈEv¸%’£‘áÿ,ÝM4‹óËÚò/qþ-¢TÞ{Âc¢ˆçDAõD òƒ„38Ó…<àAjt"ø“‚Èá¤@4ÉÑ$H%þ“ΊB+g•l»ÀjÙ›æðùû‚û?¢-ÿQ +ï=–³9ߧ•È“kpg.\‡3”œéDö\‹î$†7çù1#g1,‰e²|Æ/AÌb|ø±ƒ}Ï~è +,À*Àl!$F„ bf‹¡/ÀoŒÚIl¶ÚErhW±õvÐnµ‡¶ŠígGОc7Ø3ö›ºÅG:([tphÑ‘W§·þ!”s-FQ¬^ùw¤MË'b˜3ÄÍ“ x¤Æ 2¦Ëa˜oÃ2î_…†MJv(Xí€À#0œbWaxäØbhpl6¾wh2Âñw#œ
P1—×F¸¾êáœoÓˆñç/ –ëˆã^Äòýèœ"†u€‘Ce°Œ“#|Š=Ìs0/r€i•#L•l«S«©Ê¹ÅtÀùƒé˜s³é_ª&Ó}Õó¯Î
æwÎ/Íp3ÁÖ÷ÿ˜àñ̇á!*€s}té$ Käz’Âxåg³[w1ñ¥ˆË—!v”]kt™òCçéï:Ïszk[êü»mêm£Ëkë×WÖj×kºÞzV]gûIýÜVëúÄöÖí‘
š[áõ³Þ÷ØM¼¯tîÑ:Î÷â\BO–¢$ 5J„ä®bôL“¾ïž+oJ,¶ýI©CC×)Î/»ÌVÕvYèú"a…úyÂ:·g [ÜŸÄïvÈãaÂi ?zÜMx¡¹ßä}->—㡽È.ÄCw&º“] mqm{w'ô♯·šåEÈæ^d›„Ö¬QSzÉ«´ly]jâyòhÇ'½¾P=ì9]}¿G¹û½îK4w’V{ÞJÜèu#qg§ë‰û|®&ó½œxÉ÷BÒSí¹ÄF¿Ó‰ÐŸHDÀ1öv( û»Cߺjxÿmù<oe«øÇõäúRk®Qx“)Ôõï*~Ö/]ö { ânÖ0§›¥êk½'{\NûÊëbê‚NçS–ùžK©ÐIÞì:¹J²×á€ã½Îíõsà‘äW†ƒÉÚǪÙöm +ŒÛS;B¢!•ó³”„^ó¸ž|j,ÐQm~¨ðxpŒèî déŸöW^Ê)Tï?ÊýLß ^§²§ùï3Gw4s¡¾&seàáŒJãÁôíAûÓ÷†ìí}"ô»Þ×C«ÒëÂv¦·˜¶¥ó“›°Í݉ÐÊL„´‡œ™Îó^; ®£Ð‘š‡¨¨n¨=*ö§Ûő•¡IÒe)Oçç¹4\S3p\§C¹uûs¦ë«û—öô[¼«ïêÐÙ7mÏ®2oíScÙÜç¢ecö/–õÙÍë²a©è‹ðÕ}a^Õ¦ýÖ’¹ÿYöÜ)},”QC±œžPÐÓ‘Nt»Ä‹.2gKºJOŒè¬–ãz`H‘¦ºp´OUþ_üwš¸-oVð–ß„mÊ]aÞSiY—³#²bÀëêg«<²-Ïi².ËAÔÒ\D.ÎEÄ¢\„/üæöÆýï+åTϳƃ1Ý#£[ctyœ;-
Ž‹“›¢Ü;ªŸKÕÈ|ÏÃGøn)§ß4äKãúÂé!k¾6¯Î_lY9hMÔò¼-¶%yÕÑË;½0ï^Ì‚¼7ÑóÁ6o0¬åƒùõ`DÌK{ÜþÔ~àyë1ÏwÆ +tµTJ—ÆÛѹ ®t¼Ì(.‹–ìßS±«´Ë¶±yž›Fõ,£_3bBЪaSC—Ï_2da䢢•¶…£ËwÇÎ-87»àfܬÂW±_!zflÌ:£‘Ó‹Ñ2ÛîQýPžuxî¼þ9ÿ×/ÓÙ/etr¢ŠŽL ½“â]“ì·–e¨6ŒÏÕ¬--ò]õY‰~ù˜Ïƒš¶°d†eþˆyQs‡/ë<kXeÌÌâoãþZ\?øjÂÔâú¸©ÃË¢§ƒEM)Fd{è#ç³@ôËp¢Ÿ>#ºTFtf’ˆNL‘PÍÉ®ó¨¨î+à÷ÍÀ( †}߆}fö‘ÊDTDDY‡aVePY”M* X´&F«Œ¶±M0.59îÑ´1iÐh’“ÛKsÚíŸóæøÎïÞûÞ¼[Ä…3r•{°ªõî
×îÊ2hËÝnÚ’½Ûª1Sb_›‘ǯ–ÈÝ*Òª=ËR›Dò”nïÂäa_YÒ9¿¼¤ýs“¿öËMFïÜô""ú,ÈMBÏÅ0Rå߯iç›ËPÒÞ÷QÀt &ËVÀX¹)—»²úÊü—w•¬Ñj+Š\Ù¼w›I½l—å¾¼T»Êœl~Yv‘›<³Òs¯´Q”ŸqØ;GrÜ/+}Ò_š~Ý?#ý¹_†äŸ Š¥IÓQ(MCÏÅ0 +`~'Àý4€Tƒ?PþL)í<å +2Šd®²<…gnn½(3§Ý[’=蛚uÆ?%kÖ?9ë™_röÏ>)Ù(NÉBQj& +S¥(Xla¾¦ûá®”ö^ªÁÅÚ;éÕë4í>#û80Pk +wç `1ÜJ³D}ȸºP:ÿ™} +Q¸³ +bJÐs±—ñ +›²»kpò•µÿoÑÖoíü†È±¥>^˜êÁøAêåwP~Ã1Ú?O +rèoÕ —è}bL¬ Ÿx‘`B/Hb¤ +DÊPAd¨2”¡30€ ½Š€"Š, ÅBKÀ5êZWc‹îšM¢=–hbY-ñæb'œýãsÞûýuß»÷÷Îû}9(zÀy'úóV„œ×&ïq_™ ðÿßûúN”q%]e´v ^Hi¶óØhd£e-r8hQÂAó:²Š¬'›¹hÞÃE‹Ýä +¿gÞéÿÛ'\eÐð +ƒ/“‹ä‚Ëßpú@w Ç$@/#@oZûP/æÐ^õšÍzãáÏ~>+ŒóÄ]Å}ôA&ïÁÌþÝ™‚;ŠÁ°¢Uï'E‡ð†b‹ð‡;ÆÿwÆ>ýë3ë_›qÖàŠâ¦ÁÅÃ)þ0úJƧ(:©@““3Ðä8]Ñz~@ïîI¹wŽ}Ò†€ô<4“ +íÇÃxêAe
õµ +ÆAO¡)tÉX…îÜ6Ÿ eið„Æ<¥q}nœYuNŠ¸"[c]ª)g–Ûd48楯erҺ䚴OÝ2Ó¾œ–‘öƒ[FÚyF2Ä)3
3SQFFaí…‘½˜ +p:‡z@õôQþÛVÌÎt”Ú±ÚJœ–ŸqÅó
ê +UébMË–&YçgZëòòmóµ¥öÚœzGMv+“¡Ù,OÕìvKÖ™¦Ö|ç¦Ö<wUkÐ%YƒÎÉY蘒‰²±þ ãÖmšÃ:úÈ£PýþR€å”9HGÅ$h«²…–ªiìÆÊ9üºò¹ú•e¡“JK¢'-K0_Z”n¥-̪ÑÛeÔÈR—¶8«ó7Êòvºªò†Üâò®’grU2ª\tŽÏEÇ-Êrþötd/$QîÍ8ª£Pý>ÊŸŸÔPýjÊ=µ†°ªÞVÔËÙµuž¼ŠZaIõBC]U„(¯Re–Sž*Î,˶I+-”¨Kª–5;Åw01E½ò¨¢Ï]#‹.“§ò¨BdˆS´c +PFFý
ðŸ‘9P¾ £g?Õïè\Nõ +×(8ùÞüìÕóÆg´„¦¬Š6NZ™`ªjN·ˆmú“ðzŠ²Nà +Æ)J¶«Y†ŠY®šµÒØ»µÛΞ³‡ó;0Ïÿ}ßï›ùÞ'úMZðBäø׋£Ç½¶2î®â-ñc‹÷$Œ)nJójGüó%þÎW¤?Å'±…=´vß¼pU¬ëB`ý›ìÅç¯àîµJÃì56<¹ÖYki3×dé^S`˜¶ºÐgꪉ~E+§øß·bzß +·|NXá²ùc–.‹µtsôÈ¥Õ±KÄ,i)X,1‹$fÄ=bao§y-~À¼ËÙÿ…ù¥K€UÌ^Èõè¥îÜ)5cFi(Þ” ¦mJצ–æë‹JGîÛxiüÆÉæqoM³nx$p̆Ùö;ÖÏ.X¿$lhIix^IUDnIcDðܵ‘³Z"sVIdîÊÞŽ±5¼þ«^ç½Èüu+7×rÌ~vð'î¢l3`Jy +•Þ†,ÿö}`k~ ³I_ZŸ×ÈÓuò«sû…f털\;')ÍY–”h?ÚP¬ý[x±–ˆJ´$ |„·ÊsœÃ—j€ß¢ÿ7
èA öÞR€7‘© +Œ›`¸Lƒå¯RúʢܺKeî‡M +¯¶’¿æ"]`½ÑȬ3V„VÖs͆v~YÁQaIþ˜¸H?+)Ô/n(Ѐ|+)Ð1"4è‰ +(¯Ê2UšXEæj¶¡¢™§/ïË-唞ה^’d–Þ—d”þ×ÿŠ3MD¨1A–‰ð³J^ðW%fA‡ç=X¬ÄÔÌ4 ˆÝÐÝà‡›B y#45ï¢ZšöÑ«ã
©Þ¥õ™~E–¼@C]S_kÍiäf×Øšê!az•S¬®z;\Yuù:\Yù“HUIÂTf"P› _]Ax«<KøÏÁ
ôàî® sЊ3hA}ÄÚæÍÖ`¨o‡ÚŽ”Êö(·2k¬{±5ų°-Í'¿U k)Êi.giš,ìôÆžªq@Ú0)Li8/Jn¸-Jª&J²üG˜l!‚ä:ÂO©%¼µ<Å9<À3°‚38߈gÁ +0ÑÐXã»ßF…š® +Úéúþé<÷h§É#ÊiñŠtÚ|^wû¾æœõÛå¼æá|â1ù£ÿΓdýÎ dœ®å:fÿÎ}õdžð,Œ +`Cíz'fà,@î€Òw +;ékW½ âj0ì\ÂŽÅ-ðêÒnؾ$…mˉ°uY
[–u”MËe”—Wš¨/Ø©’•)ZøÊšxåM¼ôƒ›è*¡¯uÂËÄ]xéçpþNÔAß{&q38ÔÎ; ¾p;è@Ä5€Í7h~ËD·‚@t[ +"* ˆDˆÁì¢Á (Ä®öŵ×`Y#Q×ã QcCì
Ö›¿"9ÄÝsöp~çÍ;̼ï~߽Ú3ïHu1~û}û|8sȼ{í¾gýŸš•O +øý ‰¿˜Êø™üwÊN ÷ÖŸÍ5ü˜³'sv¾ÀÜ/3÷k€òcߦ§Týöª"-ŸmKŽ@MCàÅÇÜšðn“*¸)\ˆÄDZDØ‚I‰{ôüOYŒŸÊÚÇ2÷pæmflß_ +ÂO‚hÅk+-^·°Ã#o#n4÷Â¥fñK³`œþ[7œðŽC¹w²ôƒ÷Pé°O¦â O¶¢ÌgšÅ~Ÿ<‹}>ó-öø,Uîò)QîôÙ¬Úîó½j›ïiÕfßÛêM~/¬÷šµ´æ-ß¿-4ŒË©ÂŸS§ÙÛŸ*p£µ•-lQá犓|PÞ: +l0Ô¬7m°\kÚeYbúÑêþ×Vø×h—ùë%µ´‹? Z+jãs¹¹Þ¸À©íl gÚXâØgzjûö~Ší:J[ÛEJ›ã,6PnLW
¡. «)˜l¹ÚœkµÒ\ ]n^b½Ô¼Æf‰y«\dþ·\h¾,Ï7WÛÛ9µäü +eíuØìŽ-?Á?;µ—Öw +W”tŠ±XÝ1Qµ¢cJƒe†j–tÈ´* +ÎÖO³Y4KžTh;7hµ.?¨Ô~vP™}^P…}nÐ#ûÁÂ~z°Ð‘]N-Û:â3.mµKîžûŽvʺ +Sv–fU6ÌzΣåY_L²ý.4W—:Ï~FÈrÇœ
ú©!{œ¦„œvšzßiB¨ÐŽdOºú„¸Ï%îãâ¹·Ï´•Ÿ7uÑbM7g¬ŠjŽ¥ÝÛH‹ºwP,ˆêª,ˆê©ÎL´Ìë–¢ÙuˆÍŒ®£lsºdë¦vÉq˜‘¯Ÿ±Ø);|a\øNãØðÆÑwŒYo_G=9’Ù×7YƒŸ#Y.ù{{3~,°‘ŸK¢`E=÷ôÂÂ^&© W{Åì^•ßõŒVo™Óc€vJ4yRôp» ÝÇØÓ}²ãب<§¬ÈBcfd±óÈÈm.#"Ë]†EÞtɈzëғã°HáPç)Ç`e8p’¹ˆv$pŸÈøñÀŠÞ(ŠµÇüxÌéÓJÊë¨ø¶O¨2'>R=9®·åÄØ$ëìØAòØÞ_ÙîõµCfÏ ú‘=s
Ãcæ;³ÊeH¹~ÙãˆkZL½tN‹r"}zŒp¬ó˜ýp©pŒùïcü-<wï¬LŠxœ—h‡ÙI1³Ÿ¦÷k«˜’ÔI91©«:»oO˱‰ Ú¬„d9³Ï—v#úŒtȈÿF?4nº!=®Àypì +×A±¥nɱ‡ÜÆ^£.c…‘ɱBOŽuðøµ;ûyïfüÒd 8X2€ñy?«¿ŒÜnÈIöÆää6Òøä`‹qÃÕY¢5£ÄkGôï/gôK³’4Ü!=i¬>µï4CJb¾ó€Äe®ý6¹%%pë›p…j\ú&#’„éëÜéÌù€}ˆõßÎø¸åYI¹%Åû)Ö˜šêŒ‰ƒ›!;Í_3øÃT#R£4ƒb†J²IOd—úÝeÕô•†á7 1P’°„,,.¸V°:,õˆU±‚HÁA@ÙÙ*›‚`-‹k1X«b]Q´êQD˜Îè´#UëѱêèØrÔŠÖÝ:õÎk+Ú™süãá—@¸Ïw¿ïÞÜûŤÚÆ,ÈÕF/(ÖGFWÙÏÚä8;j—SxT‹ÓQWÈc‡ð(a>_è#æÑöÐÅ}xŠk°…ùßÏ+èö$ö|dmýŒ¥8Á…IZä%BNò(If²—4-y’YrR€"!1Ôbaâ\eLBŒUt|’Mä¢,»9‹–ê"VÂâ6:„Æíp‰kv +Žûž<rŽ†X¡‰ºÐ¡íá÷`×Aó¿'‘uHŒ©¼ï§ÐÏ^4?UŽœt[df8#=ÃU’’1Fš˜ác¶(}Z¯Øô`óè´ËÈÔhÕœÔ눔Ś°äBmHòÇú™IFûIÛ’š§']p˜žøÀ> Aˆ>0^舶‡K¼úgÝųô×f²ï]̼޹ù>-Û)9½‘˜;‹r=$±¹ãeѹ~òÈœŠ9ÙaÙ‘Ê°¬…êÌ4› Ì<Màâº÷Wëý3¶ü2ÛOÉøÎÞ/ý¾Á/M触 ÝÔT¡õOv=œå~leösÞÛ²¸s¹r€’Í×)y@|¾ +qöXP8QE£$󊼤³‹&ɧËg†(‚æXåÇ(òSÔÓòrm¦æ•j&/Y§õ]R¯óYrHç½ä´ÎûÃ{:ï\¡õÎv>Ù$Khzè˜Ç:°ö
œw=}ÕlIVæ…|¦²ï(fïYbŽ¹¥Ì.sFx™ÂÊ<%!e¥3˦ÊË‚äÓKÃþ¥Q~Ë-'-ÏVy—[M(Ycó^IWÉÍØ’Sš±ËîÚŽ]*l½ŠH!)6=g°;Ø–m^¬!ËI.ÝI¥À¼•ì}*$®´BP•#«† `Õh¼¿ÊKâ¿ÊWê·jºlÒªP3Ÿªyò‰UïUeXxUYŽ©¬RzVnQyTîW»W¶«Ý+î¨Ý>j·„•Û +aå^öšcÜ{™s½Æ2 |s@ÒéŽ +èMÝ +mv0oë
EÛ2 +½NŽƒü¤?ÌÚÃ!k‡´½ +n:ÁÅ-ZÉUòð‹€˜C@(ÿ4™nOÎyØiÖþ<s PÒ+ëñ¾pÞ%÷Éòˆ<!¿_OEl s"†6,‚qˆqð U/ã`²Å·¯VìoÕý!,!d|
ö™EÆ‘iäCRɇ¤„”“5ÄH6ÙIö‘#ä89CºÈ"ðü·Ÿ¿?ÿaC·5{\UoE_þf +G¸ô„#½ÖŒCÍåôÆcÅš(‡CXxBôòÅ3Ù<–ÎÆ=i,º¥©¸)ÍA—´?ÊÊp]V‰k²õ¸*ûWÌêpÉl'.š}‰óòVœ“wâL¯.tš?Á?Þh·8©|‰åkD_úûX2„=ŸÆÃÜØÄ/Ö#q_=ݪ©¸¡ÅÊù¸¦ŒÇeU.ª–à‚ªçT+qVµ§UFtª·à”z;:ÔûqRÝ‚6«Nœ°¹¯lŸ¢E#Ь’£ é%¢¿ÂÙ‚ÛZ8Ëß;Ùà‘Á ?i‡â;®Øzã‚& +øÙ*üøU-Ü]ï¯)ƒ[kkàݵMp=Øï{©«ÁýÔåàaj1d‚ºrŒºr–¾r…ž_w~kÝoè7CŸ°fC ë$r"”°ãùCÈkKãä©GmŽoµŸ‡³áWkðqðKp/4n¯RàZ¸.G˜áR„•ZˆpPçÍÔ9E;}VÑCÏ)öÓg~Ö¬â(ë”b–}Bq‘}Lq›=£øŒ=ùWΑHÂØH¸ãÈë‘„óCHƉ£W‰ÏŽ×‡ÈG1 +}ñ ûT„½ªï„{TDгD +&tRݱ†õ‘p@Gùô©tŸ>›Õ«/`wg[¸]Ù6^Çg@ÛŽÂÖ¬Î@wV?Ó’å»t3ÒFݼ¬^wKæÔýZV—õw©#‹ˆÆ¡#"$ð9põÁÜ7 +c™Ðãži`à@îJ0†CŸ1ö“)¯QÇê0æ±Û󊸞<+ß[Ð’ëºrÚE
9{ÅNÈÄa˜’ÕÞ’WÞ•Û
ŸÉm†'2›H1ÂØõD„>ãìÃO1wŒ +—A¯)ºÍÑÐiÞNµ›3X&{§ÉÄm.,ã5VÔ4ë +ZE5ù=âªü!©Í8)³çäåÆëAeÆ_•¿•—‰´ÌHÄS–GDÏùÖá瘃[xÿ·qõz½ßž~\ñ__‘ +rW”ºâ¨—†6»t¬BW;¿©ˆ›Ûdåšê²ÝB]㑶aXœÞ0#ImX¦4Ü—jêÿ(IqqJaRëˆ(Õñ‚Øw×1ó¨}€¿ û iÀo{ú7,»dPÜú*˜=áPè‰|Ïv*Ï“Açxô,}k!;«µŒ“ÙZÃËØÕºË+Ô¸‡Õîif»û<“è¾Ë$¸1‰-ÿ%6Q¢‹nFÓw1—±s¨?åFß‹V q#µ¸Ž—¶˜:(0v2Ûµr¼¡ ÷n‚ÝñÕ¡2»ut†×H§yKد£ö6q·wuðU]ûâº&ۺΠc»îc;¿Æîþ·0¶cÛˆ`«ç7±ÿðγ€qÔëGv#Mí +(¢q]×äèÑÕ Æ‚»¸ADET,ŠNPXªÔh{,G$1®qu]{ÖXëÛâîêÙÃùñ¨ï{·¼ûî‰@óx˜g £y±ägΑڛ‹%_ó>É`þQ2lú]f(2C¾¾ü/•)€™šë©·4‹yÀõ³ÕÀ赌A.çÏ| b3õ‹8~¥Zø–9ÀPæ Ÿrx—ë¼;<+"áQ1îÃr\é\—Êp®4骎Up,§2!9ýµ’VŠ3y³™‹ÔLYÇ»HÝ?çÜÄR·O VFý* gSÝ€cµíjõ°¯u#`WDÂak‰„Î26–1ÐZ¦CcI…Ú²*K%”–£\ï@]+ ©!ÕÚ=¬bÐ×ÔC݉ÔEݸr ß6À¸‹úÕÔ¯Ü÷_¶ßÈ ª×AVï +¼À.ãž2ižà.ó'øW¿’Gÿ¡§¶½„Æ™ß5ãÑæ‹H?2„|B>¥N"uæâ9R¸kC°’:k©ñ%÷2S£„VoÃÔà>ê©~ŽéòCø„ŸÓG´¬7ßA8RW¯‡°m!ç +—¶˜¼Gz‘jŽ ÞXjMf|ÎtX@Tjdⲩ±žûçs¿"Ü@#°Ç~¦ðIü
×p‰'ûž4q7Fï \¨ëhK_h®ZGž¥9&ŒÛ‡ÔíGÍxê}LñÔ™Š0&ד«HÃæÆeæÆ%ärÿM¼ºÅ8O_œ…ߊSŒÇ žø8£t”»Z%#Rëúá®ã9”ôST¯‚hgGŸ8ã¥ÚåA´¯'5£qUŽË²Ñh’%à‚|:ÎÉçàŒbN+ÒqJ±'”98¦ÌƒUY„ê +4¨jpHÕ€ƒš&|½‡½ºW°Ø2cíjÞAxQŸeN¸W^/'žëíñÀÖ7´~¸¬}6}pV7§lGâ¸ÝXµ›ŒÃö3Ñ`?‡ìã`»¥8Ðnöës±W¿uú2Ô:ìAµC=ö84a‡ÓT9¿F…‹@Y¥ÎBzƒð¥¶7ˈ¥†Üðn.yJ\µ·C£½;N;tÆQ§î¨w€®Ã°ÏíÔ¹GûT{$a·ÇìôLÃÏåØ敃*¯|Tx£Ì{J½ Äç¶îHfÃKi“¯ +IA3!å·!üZËÉ=–Øk,÷»ð `™;åÕýýPgè†êö}°³Ã l÷ÊŽcPRÿé(ñŸbÿdl H—ŠVJæ€
Òæ +{KÈíÇÚ¾>X„¬¨XÖ? +ýã¤ôþ#¤´þ£e‹£&Èÿ5E‘•¤\•¬š™¡ž¹F3+²Póyd…vfä>›ÄÈó6Ó#h§E ÍÔ(¡ž)Tm(›¹O|ǧÞJíºx Š
òbØcòç«ûÛaÅ@OdFwÆ’˜0¤ÅöÅâØXiQìG²…±£dócÇÉçÆNRÌŽ™¡LŠ™§š“¦NŒÎÖN‹Î³™]ª›mÑMŠþV71úž.!Fh¢…†¨‰*a`+·"Ú}ˆÚÕÃÙc“‚¡œ·âØcòËbuX2Ø©qþHÒ
Éñ&Ì(Í—ÍŽ)KŠ#Ÿÿ©"qÈ4å´!³ÕSâR4“âVhâþÍu™GEyaüùfav
.D‹&¢è‘¨(Ú((Š"¢¬Ã0ÌÌŒÀ°
(‹Åq¡âh]\Q0.cMðhš›4rZ=&©Ic\kmŽmš¸&úõAÆäœþñ;ßý8Ã}îû¾÷Þï}ÚÔyI¯ir“ŽjIŸjíI·4ö¤Çj{’¨²'ŠJ¢xÊUîƒ?3ÝÔ~ƒíF[Ÿ6¶aëØþ>ð¤(Ñ ˆº´Ô¦‡£Ú…*C¬PnH’Òt‹´$=WV”^PV©ÈO«Wæ¦5©úMß¡ÍÖÑYôgÈMYÿHcÖ‹*‹^TZREÅS.qžaŽQû Ø‘läZVóÝÃuÔd¨ÍDµñ9TfŽC¹i*ÊL³—iPlJ“š²¤N“]–—Y(_˜Y®°eº•ÙÆ•j‹q£&˸K›™ñ†Î˜qZ—‘qC›‘ñ³&#CT
¢Ò¢—‹ñ}mðÛf`6½Ž•9àx%×RÏuÔ˜TfõÇbK0ʬcQb‚¢ì™BAö<!?;E’kÍ”:¬92›Õ)϶”˜-5J“e¹Êh^¯1˜ÛµifŸNoþP—j¾¦M5ÿ¤Ñg‰*¢Ô›DešITôržû﵎äð,ÚVÐÌq#×SüTpM¥9:Û† Ð +§còÓ±Ð1W°;’$9ƒÄê°JÍŽ\y¦Ýa¯V¤ÛUzÛ:uŠíUM’í 6Ñö6ÁvU›óP-ª³Ee¢õ Š^z¸ÿº·o!Ïc.ëÀç*ZƒzRÁõ¸ø,ÈU#/oæ‡Àç4X³³s`r¦IŒÎ,©Áé¥9‹ä©ù•Éù
Ê„<¯j~Þvu|ÞM\ÞIrY—û@·PTå<‡¨xÊŸ¸ÿŽ1î.'ï²––`©!®<úNþÍQ€ì¢@XŠ‡#«$&×]Ñ0¸æ i®d!Õe”$»r¤‰®Ù‚’ry|I"®dµ2¶x«jvñëê˜âêYÅߨfÝSÍ*•1¢â Î>>dÝßbüûJxŠyhêI%)à{Ûrs™ +Þ Œµ~÷u´†ÆÕ@‚ˆÙÀø7hYGo†·Ú¥Å Ž$;Fc@G8;#É\<Ó©GÿÎôÛ] +Ýî² ÚÝû î<Mç
hw=†n§];ÙÑG;õ65+¨¹„P×üÖ`0‡ºÓ^ÂÛÐN`Ø`ð~ —jŸŠCp(òC¡ùÂ!ñEAðÍãeÃïãaóqCùè1}ôº¾£ä›úÜC"?¤«6j®e¬õ¤”º¶6Ö€ñÆí¢v÷1þ.êû€Aoý8•ê]@8¦âÅB{|a#üÞhBû>›Ÿn~p»és»yÀ»™èn±ûuòù󘈿°º+¶2Œ7Ÿº™ÔÏXg&Qs45ƒ©9à=@{Ÿ?0ä# pZM¸Ž¹Ž3ÁlF{›ápà3®ã,?ÆgyÙŸå!ïa±{(pöm>/’»‹¿Ð´÷Á. d/`=Èf½CýãÌ70”šÔ§É'ÔþŒü…ü•œ€óJà‚ø"¸H£ò5›ôKãË\Ç~Œ®òÂ¿Æ ¿Îb^?EnûD|B]kÀ4åR¨CÝIÔÅXŸ=ÃÚ +(züšŸ“¯É%ò-¹B®‘Rà&kóOæä»ÁÀm•ïÇ?rwØÜåÞ¸÷p¿…0Á>&üÇ?<aÑÀÎØõÌõì€Æ;’ñQWw}I¿“Ë~½›„%¥…(µ§Ó‹û\ËC
ðˆ9Y‘M»ÈFMÔ^Æ"¼ÈÄ‹XdâçOeÃèD‡úé$ãH$‰'ÄNJH©#ËI3YOZÉ+¤ƒì'‡ÉqÒëpÿ†ÇøèwâÛS’ÉüˆŠ!…Á
"A$˜Œ!¿%±$•X‰“,"KIYIÖpþ
ømœw`7î£÷pwp’:=LÑ
¦êîû¹íç–QCí€@ŽžñäÏE8‰& ÄÈxŒ¡˜:ÔpS£‘ó¯Âáåü›8÷V–g'£ÞËy},Ùqügpßà*q…3|Ë™z¹üˆ:êªtÌ…–o½ð×d,ã›J͹Œ"•ZêäQ£”UÔx‰.ãiâük9W·êvn|…ø’¹¸€S8‡ó<F·˜‘‡8ËYÿÇv™EyŸqüû^ž] Á[£Q@PNA–c9VØ…v9v…åZŽe9 Š'ƒx•bÔzßV,ÆxÅhÓÄšXÓ4žSgÚ:˜i›Ø$f:}ûEm›dúÇgÞ}ß?öû<Ïïù=¿ïï?¼ÿ5T-u'ú@•D¾ù’ÉOkñ%kñ)"¨©ÇÇÈd>6ê”2«j4âhÇGìÇØLü¿AÜãšÜÅI¼Ã¾x×qï1’Gx“•»É¾ñPý¨ÜR*Çê+°GÇsMµÔΆPSÇÎ20›l<@ÿ±?F-5š©ÑAոͽŽÉÞ¸Á5¹ÆZ¼Á¾xWXwq‰+0"<Á°¨â¢¤â‚üMTŽ8UK¾<á¨yÌX>–Ʊ¦þÌsî‹qW\†·¥¼%åá¦ìÀu¥W7®hZpYÓ‰QŸ\òéňïvûâ¸C8?îοŒ3n§&<ĉIŸãØdGÈáo¡N¡~ +øü^ø†?Ç` Š½STì!»Ç|†:ãlGæ˹<vîqäßáû›2®kµ
˜…áÃp>0§§¦áä´›V„#Ó84£ß›Ñˆ3Û±æj웹 C³v`pÖöÌ>†Ý³‡10ûvÍù%¶¿ô™°å%Uè'›ŸÓ÷œ¯8V? â¨_LýHjóȹÂ{ß<µ3&â̬)8>'‡çÆàà¼$¼ör&†æçcp¾{T`÷‚:5cgP'vö ~akð¡?øÐ|^è
¾.l +ù©°>ä/ÂÚ…ªÐCÖ„|“/˜÷¨û@ÜŽFcy¤GÑßñØ9¤Á¡ +ëôX“n}ºô…Â+úRa¥Þ%´ë=¢Wß.¶ê×HÍ ›¥Æ„½²'á¨ìNQêô?Rjô”jýWrµ^•\ ÿEãkpŸùß4rýiÓŠ
2–)ô˜¬I¯~<Ö'¾€ž¤yèNGWJVRÑn0¡Í/´B³¡Bl4Ô‰C«ä6¬’ê½ráUÅe8¬T.j*w4e†ß“(Nƒ*;STéë<Œ§ý¡æUÚ³fÖ€ög€±ô§Ó_±&k
t§ú¡3m6:2BáÍСŘŒ&ãr4s±Hpb±F¬66IUÆN¹Â¸Q.3îTJ3jJ2¾¯qoùØ5vãß•âU~Jº*ÙŸóëDÚ2j^¶ +s•XnöHNs‡\bZ§8LÛ•bÓ~M¡éœOé¦Íô[«éKÕ¤*Ö,U&’5S•lä#æú5/åGòè±i763–µŒ¥+“w.Ö§Ù<
9Sá¶ÌG%Õ¹ñ¨ÊMEe^–Pž—/8óìbIn…èÈuKŹmranbËݪX-û4y–3>ËuŸË¯Èš‹ªää¨ò–lUã'¬ù
j^,à^°±hË71žnÆÓFÖȘÜyP“ÿ"\Ö¹¨´-B¹-΂d”,ÇŠ‹`/(Š +œbAAdµµHy¶Õ²ÅÖ¯dÛ†4fÛiŸ,Û5ŸLÛÏ}2ÓdZU%3_•³ÆÈS¥1î1׫Ô=W̽H;¾µXÇx:O#c©ã³ªÀåEþpÏFIñB8ì1°Ûõ(r¤£Ð‘-Ø6!ßQ"æÚ«Å{“d¶wÉYö>eyñ &£ø¤&½ø
MšýCMZñMZ‘ª¤ªrúª4Æ;¬ùejŸ\ì¥ï³ó®A¼Œ©–ß+ùÛéáX¡EqÉ–Á挄Õü2r˲S–/d—ÙSY¥˜élŒÎN)ݹINuîVRœÇ5ÉÎ×5IÎ4‰¥Ÿ)I%ªœ´â)R’C•’ÉmÖ|„úGiÁJ%¬i"•¤„ß‹Ê +UŠ+W¥ø²gÜ`í/”³*¸øì!mÄMœüVXEÏ]
˜kÇ#«ÎËݳáFz}Òêã‘êIEŠÇ„d‰žAï©–yZÅ8ÏZ1¶~‡´¤þ°SIŠªOŠrÿYŠªS¥¨ZUŠ®!ÕϸÂ\ÏR㻤ÏŽ@šH5ß5¼÷¹¬ IFJód$µLEbË<è[ð¬u ⽉ˆóf`©×‚X.ào¥ím¢¼ÝB„w«¸Ø{Pó‹¡Þ»bhë'bh‹*†6‘FU{ί'ê¹ÔZÏëa©'å|/¤¶¹™ú^@ß,í%¯ø#¦k&¢» jU8"W-EĪd„¯ÊÄ¢n+ºKÿÍu™G×|¦qüû»‰X²YÄ–•,–$–›&ni‡©žÃTUk_Šp’ +"‚ˆ$ÉDäÔ’PJ‹ ÌÔ2‡ŒUcÌLU«ÆÑÚjj‰:Jû›Ï•˜:óÇGr#y¾Ïò¾Ïû<ê’•¬È¬…g³*°¬]FhÖI#tÞM#4Ó4B3`Ži M7-a°*tŠfpY
Sa*ŒágCÑ~mŽÔw®·@Š^dQÔbOEäú*<7Ps#Ô)7Fayñ +Í민Á +Ρ üÉ +ÌŸ¥ù¹jŸ_®vù;\yß)`ñÏj›cmAvÕ3yfó.°f ™øüN5`={e!ñ/–bò¥ˆ¥Rpqµ/ñR»?µ- T@i„Ú”ÆÊ¿4A~¥äkS>ö±jmŸ¦Vöùò¶ÛÕÒ¾U^ö#ò´_‘WÉOjYÌQËx?‹¾„Vv&g¦ó¨ùìžÙRÿ\)¡ +SMÖ4PIŒ…¬Yh¦Àx>]B
–I¶öÏ•Rä)ˆ51 JjµIòØb‘Û¶2¶1oc +é Äš‰äzørjÀŸôE·§ý
èo–ÚTKÞ;$÷]’++«>vöÛ½Æûðc~ìÇZ†Z}-Í¥–b×b¼– +)OÃþ<ì/Â~v—ë–VW%qmÒwÚ¡kÚ§ë:Gç6¥|"gÖ¿lä"\€óNš:u›ƒ[ã×–ÏjòDÑì‰æ+D1ˆ²¿ƒÎx4¦bº®j6ö³°Ÿƒýì–plVcwv·R…õ¹ø+—è4ñgý¨SX> ίu/`¶@Ûàhȉ+¸“ËÖÄ„f7rÞ +¿N¸º§¯!ÚëÝMúh§Ûoµ½Ùªn6\[›Óæ‰ÚÔbš6ºÏR•û\wÏ‘Ãc™*=V©ÂcƒÊ=?ÐjÏCZéyF+¼n©Ôû©–{ó>¼@<¡½ÞiGK
¦†ÐþiùOó)r÷ÔN϶ªñ +×––½´Ñ»ŸªZ½.G«¡ZÛz¤Ö´ž rŸ©Zå3]+}fk…ïÙ}—¨ÄÏ®b?‡Šüj´Ô¿Vþ§•ßæºrž(§©EÏ hà!úפϣxzº ήA{ÛÖgÕ¯™6ùúhˆ*ºkuÛx•µë/{ûÁ*é0LÅFkYljZÚ1I©Z˜©¼ å+'¨BÙÁ[´0x¯æŸÔ¼kÊ}¬ŒPº¤‡üÊÄ~©+OQé +BûÒÛ_Hê¿gî½3sÞïûÎ9÷|/>ƒ¶£Xî$–æEø
êÒ®ºÅcU›8E5IsT¼@UÉ-wdªÒ‘« +G@åŽ2#èXa”:ÖÅŽ;ÌBG§YàØnæ;ö[yŽc–ßqÎò9.YK¶¹$¹_’môqgœìŽø.jÀõ]ÄÓL,k‰c
ac¸ªS®UUê
+¥ÍTEÚ<•§'©,Ý© Ó£g¾Šœ¥F¡s¹Qà¬3òëL¿³Ýô¥w[¹éû,óq+Çù'+ÛyÑÊN·Í+¤ÙfNj?gÑ8žIËK+¼ÝMÍuñÜJ,«‰£†ÚT¥‡©ÒyÊ]̈QifœŠ3©È¦€;Kn¿òÝEFž»Âð¹k\÷m¦Ç½ÑÌvo³²Ü[™î£V†û¬år_°\™¶ÙGF¸ú9ƱÖlƒMÙÔ€xꉧ†º,'žr÷`•fE¨8;J…9SU3GK=”çqÈïɔϛ«\o@^o¹‘ã1²¼Mf¦gƒéò<`9={¬4ÏcVªçy+Å󱕒c›}¤fCV?§Ð8š+õÀ/žn¥-¿…xBÄRÆg±ÇT7\ù¹cå_-Ÿo–r}óäõ'Êãw*ÇïQ–?_nÐÈð¯0œþ#ͧ™âßb&ûw[Iþ^+ÑÚZìÿÈ\ìû¯¹x‰m&æàµÍä}$=é—î¥o…†%ô¹PF<…Üçó/o¸¼ù£•³t¢²¦Ë]§Ì‚eRå +d)=àWZ X)å†#°ÚH +´˜‹›Í„À.sAà°x>0ã¾7ã—Úf|>äÙæxŠü°–²hÃ×A,‡BðóeVVQ˜2Š#å*ŽRzÉT¥•ÌVjé|¥”&)¹Ô¥¤`®ƒ- +V(!x‹± ØlÌÞcÌ
î4o2cƒ§ÌØÒ÷ÍØ’ïÌØbÛŒ-²Í¸"Ûˆ+´cèì/bOÒ~o€&ôj`×ù<÷–H™´ÄiåƒäX®¤Š1J¬˜¤E•Ó•P§…• ZJU|([óCùš +êæÐJņn3æ„ÚÙ¡Y¡ƒÆÌÐ÷Œ•ß3–ÙÆÌòÊlã1tzJٓЂި‚Rî}eø¾eèWJ‹«ð>ÕC5oå(Í]¥›k¦(®æFÅÖÌÓœU‰š½Ê¥WåjÖª"ͬÒôÚFÅÔnÔ´ÚnM©= ɵÏ(zÕÛš\óµ1¹Ú6&¯ègJ•m<ŠÆh‡ÛÊñ|PÁu +ß‹^TB€ûœ:æ ^Z¸VŠÅ²NoA½µØ¦ÈŽ£ˆÎ‰£ðÎXX¤.
ïÌÓ°Î +
ílPXç&]ݹCƒ;ŽèªŽ3Ü~AWo²5änºøýloàl$ϵ«Y‹PÊõ’FÉu+k YŠk“f`W£ÛÑ¿ýû¥‘XÚ5Lƒ»"5¨k¬Ì®I2º8è»8 +ÿ™¶K2váÃWî¦ì¡ë¡ùÚC3´‡d//ù½¼`ö²¸ö’äÞNžï†'øÝëüç@ÿ¡~:Èsš5PB½wK)÷°Éwº“DÿçÒ¨iÄÃÒàý€pЂ¡vÄqˆ8'&Ž#ÄÑËaÜËÓËÆïeaõR‹#$päœKüÖþ»Èµ*5o3s@Ù¢;›\'ïEÍQ¿”†?*
êEû7p~Û‡)=I=ŽÓˆ?5Jzz,‡0Í቙ýÙ³€ÏK'™ä“À€'Ÿ‚÷xþ5ØWh¦Î+Ñ-"ÌlòMäg±¿¦òx4#JÞ”̧Ñ<'á9ø=œ†?ÀóWÑŒ
£1‰9À üe¢ô2qœ§ù8Ïó +ýU&ýÕ. ™×¨Åkà[îmÕïäH}ä›ö+iÞ¯¥ò¼žp#Ñ;9 ÷<üÎÁKð2¼¯ÂßáMøfé]jò>só!&áÍñEš²‹:ŸTK—XÜ—’.SÄËp™8.¦j–káaÖáãRº3нþ”AŽWŸeÜ4ûôÞ€·Rbc¥Â‡ð/¸L³>e~>g|…Aùƒ`Ïš›ÉfNìû€„mÄìáÜÞh5@ßõ8˜ +qÙP +F¬Óeü;{ãv0-[˜žnrÛÅtí#¿ÃLÝq½®³úßþ•j¼Ähÿç8§¯ÄЧm>Gçuäælê–€ž“iÏE£Pï0'o©šeX§×ˆã<q¼L/ª“åúýYÛYº=Œ€-sô\—yLÛçÇ¿oΆ$@€„Ä€!Ø\æ0`ƒ
ØØcƒm6lÂaCH „œ%9HšPÒœm%½Ò´9Ö4RÔ4G©›Ö©«¦iªVíȦ-š4¥¶e›¶ì·/ Òšýñ‘ì÷'½ßïû¼ïû¼ÏÃãü)îÓÍ't—³Ïpg–ÛäÖSxŽÇôôˆûó±x€Æ¬€ZêÔQÃÎùÝÜåNúïá Â0îÑÇ]ú¸ýœsŠ«?‰›¸€ŒÅuŽü€«¾Æ¹ÊÕ]¦ÊW¾‡4ç™ö“™#={ÌÅÔŒÁOJ½5Ô*á:tÔ0ã#4qþV¦©N|HÐÇ5Æã*}\Æ.¼I\âž\Ğ΋x“N.Ðñy^¦s\áÙ§'÷y¤ +©¥¡Ž+´òä9qJxpBøq|N^3„£sÇðÊÜqLÍ›ÄáyÇphþyLο‚î`ß_aï¢o±'LÂîŸç1uÿÇ4ÄtrÏßõX>?Lýéåí…á¸0?gÊpj‘ÇÃJðê‹U˜^lÂÔb‡·àPx;†wã@xû#F°7b;&"öawÄQì\rã‘—±#ò¶G~-QÅX´„MÿÇ7ÔÿšÏÌg«Ø÷¦Q;…O-ý¼ÆñSQóp2"G#q$*‡¢óq`i9ö-ÆÄ2v/kÂΘVŒÇø°#¶Ûc×akì6ÇíÆXÜŒ.#Ë/a8þ6Äÿë¾Ã`¢„þÇCj~Éòãc>1ï1½ŸÍŽÓÏÇ_¦—Cq‹±y,ö$È°31;VcÛÊJlYiÄæ$+6%90šìÁH²ÃÉA¬OÁPÊKL=ˆPêISßAŸì&ze?ÅZÙ#t§IÌ ›%UÂoWó9R2yÀ¹ÔWP›~Xža½ìJy;R¢±U–„±496®*Àpz9Ö§ë1´ÚŒÁÕvd¸Ìð¡?£}™ëÑ“¹Ý™ûC—üMøä7Ð!ÿíY†'K‚Gþ=2%|Å'å>KŸËäL!×Ïrl/ýŒç°ç¢—Í™s1š‰
òe¥c [‰àšô¯©DoŽ=9
èV8PxáWt£S9ˆåÚ•{àQN£Uy^¸•ˆ–Ü g#÷?¡”ðÅ3¾¤Þm>óK,;&Y±ÆÍgßɸl`\á*cÑ—›ŠµyÙäŸ_΂jø +Ìè(´Ã[Ø +OaZƒp«6Â¥Ú‡jJ4«Î »êš°©>ª‡ÂªzB$a-œ¥@ŸSïf÷Ïü4™(c¯CO#ô²Ž± 1.½…aèV-EWQ|Å™h/΃·D¶’*´–á.m„«Ô§ºÍê^4©‡aS¿$¬ê—EƒúŒ°¨¯³ú¾0©ÿ êÔÿu¥Ò3J$a"?¤ÞõJžE>ñ‡ÉN–Å›èiˆ^ú—µ¤«t!:ÔQð”%¢µ,îr\ÅpVhЬ©E“¦v6VíZÔk‡`Ñn&íAaÔ¾&Ú÷EöQý½¨Öü‹H¢ºâ5å’¸OÍ«zà4KáI²½Š='=駛qñfÜš%pi—ÃQ)CSU6ìU…hԕêӣAgF½Þ³¾&} +Mé0˜¨5¡Æ¬Þ\¥U'*-ÐXúQnE™eB”ZŽ‰bË;¢Èò±PY~%Tæ¿I¨L’(ª{ÆÍ:àÛ¢Ã&`aÛŠ^ÒÁq½5ò·…ßë,Q[‰ê†xè¬2TY³QÙX +[PÐ&C~[6òÚ + ô”AáÑ#ÇcÁÙ^äÞdz·aµ÷0VyÏ#Í{2ïÏ óü²6 iÄ-aU‹„‹œš-Ù8YOÖiæ¸ÉÉžƒÚåmìý¼@®o>r:#݃¬®•w¥#³KVû5H÷æ·Að 5ЇäÀf$&±"p‰ëˆ|ÿwHìdÅê“°b† çÝ|—¨³•.â&7P[Ó³MÊó³÷`븪oRû#‘Ò‡äþ$3±2˜‹ÁR$uHYjA\¨±¡,íÅÒÐiD‡®"*ôcD¿AtŸ„¥½³ôH8ÅõMžEÒNÄLm]'{Ï +©S3`ä¼ÌVíjeSËŒ[Û‘CÕh€ê(Âuš:.–:».X¤n0g®<ÊûÌ™+úË[¨F«_sa +¿SðyH1g`^.õ@×÷UÉsú«$§µ’Ýzß
4Ãfp“'E—†g
Ç +m=E¸ž‹ž¤®'˜õ•°ÿ½Å{—xÿ€þÆÊK¸›Ñ4ÂbXÆ94sÐ퉮ïj©#š†M’C½dƒ;Œs¢‘ærÃŽ]ر;ö½Ø±;hŠ(|F‰u€l¨…]pšw¾år¦›ß‡
{é)ñ5Ò“‡Õœƒåä º½ÐõÝŒ>š4ÛïA³p…&ŸB‡á‚£4çÇhÎ{H¿c_N`G#I#ů‘KæÉuŠX4²`ã;ð1°'-ÍÌc³Ù®quÜë¸x-t»äÉžû%—CR[«Ö1Y~Ö‚÷à}8€³6Ò9‚ó4ã.ûHbÇUš(€Mö¦ém™&>ºv~‹f³¿“ت¤×ÙâŽnÀÛäéc8!µ;ݪu.4@¬W¡ ®Á§ð9|ÉÐöé¹ú
ù-ì¸M“ôÅçùyw¡t±{ñÞé>SÝý”½ƒûÓ†ã˜#äÀIÉ?
{çY÷r«¦Uëø +n +Û§*oC²{Æ´¯SöÎÃ1ÊήÚ<ÛA ØÚÆß<8ù~Zg¢Õ¶ÑZÙf€VØ
Õ²¶ÉZÚnœjÚMRuû©ªj?Sfû9ª´/Q…ýb•9Ôj¡Ã&-pÜ-“ãQ;]T‘ó-ºüÔˆçøŽ«¬ÉÒá‹>eo{gÊ)ÏÖQ~ÖÚh£AµN^Z椗0U¹Äi±áEUUnE&h¡ë•ºerÍU±ë|Íw+W¡Ûr¸mз]Êw?¢<÷‹Êõ¸Ÿ5«£¥n ký0¼I²!€vß™‹òWÕ_ín/³›»*Ü}µ¨c°J;öU‰ç*ê4Xó;Ð<¯1*ðJÓ¯,å{ÏTž÷\åú,PŽOfú¬ÓŒÎoÈØù·šÖùœ¦v¹©¬®?)³«E™]žñ×ùïC)Ë!´°*mžU2÷aËÂ.mTêÓAE½5¯kæú†)ß7Vy~•ë7L9þÉšå?^3º¥kz7£ŒÝò”P¬¬ +ŠØ¬äˆ%EœÒˆˆ¯à
†C˜E#à\ç0–6–C9ñ,{rhÉa”ÖV™á®šáÉ‘J‹ì‰}£5¡ï5D㢒46j¬R¢'kt´QÉÑù½@#b–jxÌF½³OCcNjHÌçð,
Q-œ‰§½ƒ× À\ZãZ#mP¶¤GÙjR´‹Rc<5>Ö_ãbƒ5&.R)qñÕo’û%jd¿%ŧix|¶ãó4,Þ¤¡ñ5œðš^JØ£Nh`Â'ðPâ-ø?ªË<*ÊóŠÃ?we1 $€’ +ùœb¬Üoe§Èœ6R¦´pe¦E+#=IÆt£ÒÓs•jœªãLŒÕJ26(Á¸\ñÆMšœ±G±'qAÑÆ;ŠNw(¦‡4‡bS:Fë»
Ö@‹QšU<—Cqóäñl6)c¨22ŸPzfÒL¡J5M”Á¯ä¬T%e™•˜U óÅ™«4ÙlWŒy©¢Ì4ɼK‘æš`þnkB–C‘&Èìå0#ÑOa4AÌ‚é`…0eIFs¥f{È㣤œ@%æŽVBn„ârc59/Y±y™ŠÉ›¢è¼M²ÌÒDK½&XZaY§pË…YŽ)ÔÒ
_+4Ï¡°\Èqh\¶CÌR,‡¨r(†)ŒJ¦æ¾<zn‹?eˆ&ç{)¦À_ÑÁŠ*Ó¤ÂIšX˜ ÈÂtEXs4Þ:MáÖ +…YëjmÖë5Úº]#ÜÀÖó +¶~©B:ÖÈwhì¡í^0J˜VÈE7Q)¹€Ù“ñ1jZM(òTD±¯Â‹5®d´ÂJ"Z£±%)ÍÒèÒ,-SHi‚J›ôTéj–¾¬¥‡PúÜÒð‡FC‘CÓÚžÏÝ +)‚ilúŒu’Oý +MÐÕéõy"»±ˆÅujóúMžï©”5çàZåÁzƒÐõa»Ÿqi¾çÒûÈ¥ÁöÖgð7×`x®Àµža
naÖ”»ÔÈw4Æ÷©ÑïÙ'?PŸü_‚×à\cÒ +žàázö§ â òa:Ì‚¹`‡&h…6¦·5zÀ´õ=Ø}æ»o™þÔx—$}£‹L™_éŽê6o÷pþ Û9oºÁ@èƒÁ`DA +dcaª~P•º§:ì۱߄ýVì¶é_øñ“ß?™ÿÁ4zƒ"ºJ"¯¼Ë<}®ït K=|ÀYxËéC?çÜÛKWL|Y[0ëÏšâÐ2¢cA£ûåدÂj¾ÀÏñãïøñ~|Ê´ù SèÙ¼™T?ÒQJæzÒ9"ñ>–ßuqNÁ §ú?¾%wˆÅ—̺7‰Å5fÝ/”ŒN–þLN>V 1,Çv¶çb{%Ó¨ßáÇ;øñ[¥|;Ñx…R>Àêâç<Z7tœHCåu8 +‡àÀ#>prWJU}ÑóÄs_ÖD¾ÂщÅ÷T½MNΨ@¿Æ7𣋼œÀãøñ:~ÅÃZ‰íu[±¿›Ê8¢}D|E¼›îBm'ô|î€í.85Égo‰ÿÁ¹ó-/Ö€Î(t"шÇZ:ös°_ˆíl—ñÙØ®Åæ|l6bs‰¶©ll¤2¶9=Ù‚ÇlâÍdsŠ¡ç÷ýÛ®öëè"GÙ'Ù#ûõ$:¡èD¡‘„Õìçb¿]P‚ýrìÏÆþ\l.`w,$ +Ï“‘µTÇV½À·W“UD²Ì® ª—£»âîr¼]æê9Ç÷Æ Ž]®€Ÿ;åA¬é1ôü°B†Ãñ9
™(䲬h”°êr4*ѨÃf,ÖRþºÏãyZDd²+ÉG#ºr‹ëæ"Çü›pvrÔ¾ÄÑ¿…+`³Üµ^Þè
Gk4:‘èıŽT-“éT—iL\ç…ƒ±YÌn0Ë°/Ì +ÖŪ˜×ÿIíW=£› Æf¸8–Ý%ÉøK³(-¤¿¬‚Þ²Z¼å<å.z*<tU⮥³b—e§e6ËZ,¯Ólù:M–‰…ñ”Š§¼#|Ë +µÄŸËbFŒkßÕ£(Ç ðY¶ÑgIÄ[™§ÊLwU]ÕVÜÕ
tT·á²vÓnõá´iµNÒb[Æa[£Ñ¶Aƒí6vÛר³©ëÛþ ꬟RmðvæB¾CYÐcbALˆ½Ú7¬c~Õاz<Ö(ºm;pפÑQ“ƒ«¶gm%muvZëZh©ë¤ÙÞG“}„Fû~êí‹Øí'©¿„þ&Öú·©ªÿ¡ø=UöS]g<¥Öà¾]¶[œQ49Ü y Æõ; üÚß«ZºUS§=’öú8ÚRhmÈ¢¹± +©ì°`騥¢³™òÎNÊ:û)éÜC±{šB÷*ùîs˜Ý×Èu™÷÷Éîü
9ÿ §Ã ×e×npS÷?¯ûuBXŒ‰!Ñ'ºDk;4(>Öº•ýº"±tÇQÞ“DY‰Ò3%žRŠ=V +=xÚÉ÷z1{GÈõN’ã]a—÷92½ŸÁäýéÞï±ÓûkÒ=ŸÑc`ê~Ê5Ùî3ât¦ÅááRLrH»®[ú(ï…¢þm$`H#Ï·‹\_!9¾ +²}uìÒàeù»1ùÉð³Ó¿Hšÿ4)þ«$ûï’è(~I¢ïï$
È=÷Ë5Š«ÒXë‚E±_Z#¢_t ½^ꓬ}ÒWt,RTÉŠ$k$S ‘Œ@:;¹¤ŠI
T“h$9è")ØObp/ ÁyvO¼L\ðMb‚ß&&ð¾ø+±#r®ÃròCõ|Ç¥ûÄ ÐpÒ!Ò®‘¶Zjä”öBêØVCq$„’…‰øY”ª!6ÔBL¨‡í¡a¢CSl
a‹‚Tdè¡o1þñ'"Çää÷lg¥qHL‰ Ý¢Õ§9(íJi+"åJ_±1uBp:’ع¢Ã D…SÙÎbs¸€ˆ°…Ma}Ôa½Ü°nËBywîšxf•kf?T#”ƒ›‘“œVJÙïaH=AÛaÑ+\úß8¢9°JöI_ñÈ4)³ÒŸ‡ØÅMD”ùZ‘áY‘ÙXI׃(ORS_US[ÕǶª\µª[UÎ\=%®êø=«ð¶¢@vP5,O8"Y=ç¨Ô%]Ú6ë™mzæ²I0ÏH_º)K¯¸¸ý0l>.³wR¹ò¤×)ÕñŒŒÆZ†šL®-vëj°ëú¨Ö5ë!¡‹Ö/êøçÅC«pøÌ'ºV5œ4X–Ö„†,(zõÛ©g®›ÖCþ¢ô¥›|Dú' z
"ž•þ9ñü&5x¾óªãÅZpTÇ%Õñ’ü
-vz'—5Ñ7ô`BïcㆎSç} óÿ&TÃyéiê0(:5Ö
:½ò H×tRúëw¢ÎK÷’¸Âc£©ÿ)¯j<®)ß^×x¼¦÷rSïå–긅÷ŽšßMìÛz°Û¼[¯ˆ¯è9ø›ªá5ƒYi…Gcݲª9 SOkþI7é‚Þýe½.•¹Ö5âÎÓB²í2â‹“{2å÷ceˆù×eõyÆñ¯(”K–kÁ]XXXv]`9DPEEE-â}Ö3±ÑªÕ68ƨÑÇš&5UcըʹMššúG϶&iLšLâ9šl?“qòÇg~¿eÙçû}Ÿ÷yG¯ã£YµÑÆ&×Fa·‘ÔVÒÊ[Oó?Ÿr‰§&û4Ý‘©CÊƹšäߢÑíÏûԩÕ~á?pÞ +Óx½¿âä6§Oïtò´Âk?ñÀÎÅøüS n)ŒqGŠ>¡ÇüH^òWBéÔŸðqçèsϨ‘سuŠîõÝçÛø8¦Mhl§”÷‘‰6´Îêu¢½F¡ô*üöÁÞ§<°k1N161´‚){:&Ê2lâÖQ|¼‰#ª&öxÆÇ!MgÄM:ˆäc¿Öñw’ƒÚÅ/wõEªcj/ÀvØÏwz¸×YΗ:—ÛIrq”\¡.+
vâ»Ù* +¨¸aÚƒÝøØIîÐ$bNgkbw%[éz\´h3n6i#‘7P›ë©ÍçP]ßIûû4ou.íw:·öh?¹ØK.vi +4jИ€ÆTÍâmnq<ÌMe>¨¢Éì“ô_x¾ùýÇÌËy-°÷5Å+8Þ{wÑÒn}W0z‘h%¨¹KŠšºdhVW—fvËWc·!šÞ½LÓºRƒß8Mñ›¬I~³Tßc¡&ôX«ºž[UÛs¯Æõ<¢1=/ª¦÷gªñ¤jßjàb(GÇË‹lía5ï‹Ã¸öphÆßì +’B48)J^K‚<–åYìÊMv)'9_®äe§T(3¥VΔiÊH™¯ô”g”fÝ&›õ ¬ÖSJ±^ãù@ÖŸ%w°½Mè.³Ñï¥rdž±PÉç2(áûbü¯µò¬ÁÊ4@n›Q.[’²l©ÊLÍ”3Õ#Gj±2RË•Nc’–Ö [Ú\YÓÖ(9íyYÒ(1í„ÌiWà¾S}JjÇæÓntÖsõ\œN-Ú©¨†r>—@ßåã)—§;½·²Òƒ”i“Ó£Œ“ìV¥gd(Í‘£TG¡9ÊduÔ(Ù9Yg³«drþF ÎýŠwþAFçÇ2:î)ÞáSBØ}Úγ´$óô:PË´†ó^ùàæû,žgÙ3•–Õ_©YÙ²â5(Û¢”ìt%ggËâÊW’k˜Ì®*™\õJp5Éèf‡uoQŒûeE¹Ëຬ(×]Egûž“åS±Wg²Ñ’L†1P%P +-Z¢þEÿ'»Ìƒ¢>Ï8þdY–]p9d¡jF¼¸äÞEv À‚Ç®" «!ˆfRÏzD§1j5Œ6É$ñHÓš£‰1‰ZsØLµ5‡GÚ´4u¬Svœ´Ù~·íLúLJ=øíó}žç}Þ÷}žJ,}Z¶Ò—e-=/kÉMÙŠé\!iZP[O»ÑhÍgÀ€J(†<ÈE{,Ú#‹é»K¥!å‘ʨ4+ÝiSš3E©ÎL¥8³”ì#»+W]EJr¹dsÕËêZ W—,®ÍŠwýXf×Q™\gç¼.s%kÅ=~€FG!ç":õP
eP“idzÑUFüè3ª8ª¤dwŒ’‹$ÙŒ4Y!J0FÈbŒW¼1Uñ5劫©‘©Æ§ØšvÅëe<¡HãyEgé¹ +_+ÊTtuP«ÐX\Â~ ÆZpA ŸóxÍA{ÚÃ]è36:<RJ
3àÌHYLŠóZeòÚ5ÀëPŒw˜¢½*Ê›«Ho‘úyù· $½R^ƆƒpŠ`éšêﲃ}t£Ñ +•œ‡¼V@Lâó8´GTKC‘3ˆ¿N²1¦ÄÏŠPìÜXõ÷1Ãø¸ð}\¸~u?®ŸMìgýñ3gú›!ÖÏ0å£Cò1¬ù†æâÃœ`íäv.×ÁtÞ—ÂTÞg»Yb¾3Žôg¡ÏÈï—`6¢•F§¦§fc!ý"æ© +é2A]ÁØ•KpSåë9Èõ(bΠljÏP!ÝŸÂ+aÍp:¬ñ+ø5œ‡ÂÇpH¯>¶?ctÍ$Ý`]¾¤9¼ÉÅs‹Mx›B»à@w~Ç„
‘q`… +£a2”B5ÔÁX +ú?>Ç?±Y>c2ý”ºDÑ|„ÊoIÖ9Ýd¦
ê8Çá8ú>¨//w•@<)Ä3½Ñ̤‰£ûNìL®
ú?>Äß0ÕãÐú +ÿDó:\êÓfk÷m÷tÌä*tìÓ3zßs¨¶<l—`Û‰m¶gb¯IËÇ +´R
K9Òºñ`6¡²oÖ“‹ul®µúÜÕtÿÃjàÔÖÅðÖ3œèI{ÈÅnYа£‘É1™…ÆüÎÕfå“íì;±ïÆþLì5bÏÏJ´q´ëaþ®À‹åxÚE¦:Éd'•Óâ²¾uø#zo‡ БÄÍF¾BWAâ¨t©h!Ã#Їý‰Z‰ÝøÑ…áG'~,#íšO&ZÌD½ïÛX¡ª¤…Ú\@m. 6›Ñnïòs¯ÆÜ;êwÁÞ¯]‡øñ{d¹XN}v²&ºQhdk‰&¡QÀî,EÃÉ*xШÇî¼h!#í¬Î#|ÚBåîÑ,Ö£‘¡‘¨½ìr/Ú!á4Gû®™Z¢-° +ºùÜÁ×Îu¸T&b²¢•ŒV&Ö³ÐÍn˜€Îdt +Ñ)C§ +Z2шíùìÞ%TìJÍ ›µTO
Õe°?<ý®Èq[îÈ Üýƒ}¯Ç¸öŸåXßÆ‘ºº` ŸÛø¾šã"ÕmÖ¼þ6ÍLÓìþC4+ê5F•7:Gõ1SUS¬™1•š1À£šõ2b}rÇ.Rul·ªLTi—*M½ª0W¹é¢Êân©Ìü/G¹î÷$3ïÑ®¤[ÊkK +-ßÍÆŸ&X¢ÕdŽWƒy êÌ͈¦ÚøQ2âÇËc™$·¥@Õ–2UYªå²Ô©2a®*ª,a¹J¬4K°ÈÚ«ëÊ·~ª|Ûß!È{N`8ŒîNZŽu\³Ä>Þ7ò]ÿ›/µøRk3É°Z嶥jºm°\‰ÃåL£Ê¤ïª"iªÊ’ŠUšäTÉÀZM8K…[T`ïTž}¦Øwj’ý9M´¿®ûEå$ßQnr°‰vÎJôˤþ“®ÙùÐ3i“
¾¯Æ—éøR•-g²E)v•¥8Tš:LÅ©#5-u¼ŠÒ&©0PùiåÊäÑ”A^MÔ¬‰éíÊI_ éÛ•¾OãÒ_ÓØôë¸ÅkÏ÷x +G‡Ò‚ÒŠ.¢
œõ`ð¹Šï+ñœÜ”9"Tâ0kš#Q…i*È¢¼Ìáú7Ûeõy†ñG (—‚A–uY`wÙ]`e…]•]6ˆ¬xâM0žxD£†â ‰Æh´ä›hÔ¦:±©M“š4¦‰=Ò$ÅΤÓvÚI›ÔÛ´¶;³ýÿ^3æ7{ðß÷y¿÷{¿ã©Íwi¬©J>S¼¦ªMMª,˜)OÁ"•tÊ]Ð-§ù)•šËn~]6óÇp¢²Då€o ³ã}=׿%؃¹Ð +M|žÌ÷!ò©§.ãÀoNP9M¾1#U3&_Õ«ª,UVÈSèSEᕆ嶶Êi] ‡u¥ìÖ.•Xw«ÈzH…ÖÈb=·x•µpgÐÙŠælA»S¡‘Ï!®ƒãùŸŸ|Æòœ·(^UEÃUYœ©Šâ\•—ŒQY‰Mî’29m^•ÚÆÉa›,›-¢û<Ù—«Ð¾Yû.™íe²¿ª|û9¸)“-ª0—pv Óæ*½ˆ-˜M0 &ð]Ôðÿ*¨pĪ̑,Wiºœ¥Ù*-5Éî,’ÍéT‰³RÅ®:¹&ªÐ5UW›Ìî¥2¹7j´{§òÜ/h”û¤²Ý*Ûu]9®¨rƒìFc3×Îe.æKFB€ï|P eàä;GY¢låi*.ÏRQyž¬VØe©(—ÙãS§^&O“F{f)×Ó¡Q•”]ù¸FV>¯LÏ+áy®ñ>ª¬Š¨F–GµƒØˆ½¤¯ÍÔ +}/Þ«P06F£k“”[—¦–²ýyºÏoÑH¿CY2uÊLRz`šÒ•X£ámJ<«¤Àq%Î(ÑYIþ{J®‹*¥6ª-h¬¬–棘 +qê]øüC“˜&é9³©‡õÏx“Ðò¬1¶~Íc†ÎIÃ2è7e§á8c•~³ö!|D¿^ K¬ÙKŒ—Xð}4YÔ×+]$ØÅ>¸£À#œI̯e'{ +në2.ïSÎïY4¿£y½”åy] ˜çõC4ÏëÝbš¢ú9¼ehŸ€ãÿ'‡{øÌ»Ja,#tZ\S ZŒ£–ø!}‚ŸêÃ5}Lá°Îâº>ÀU¾ÇÆñ3òø õxG;h“^Úåms·{†V½¬ï3šï¡ò]8 +‡áÀåÀJe|âIé·†NSÆ4hTÉO[„ˆ}?±#ÄžIìy´êbZg)±Wã*7êeõÐÆ»ôïj‡¨ÅAªr€™zÁÐ}ž†}FwûÛúŒ–ㄧ
ShÇäžGîV4\ÔšØ~b‡ˆ&öTbÏ n•_Äò}Ø«õýÑ«mÄŠ¿ÚM-vé§,õϵÅ'`|
…/>g,³“Æ’8B-^T*ñG²™ˆ_L|7¹{Ù¢üÄ»‘m«™˜Ó‰9‡˜‹Ø:—w
[i³ò¸ºÉ¨‹
åFµ™™Ü¤¿ò`<WÐ;k,÷—áExö²NžT2yg?‡øfâÛˆ_F¥½tŸŸøAâ7 +ñZ™…9#‹9N–³ZÖ“I:Y'«¨Ö +ª¹\ïÓ9×yþåÔØv÷Û2»Ãˆ?œø™ÄÏ#¾…Èâ—ßKÕýIJBÐh&þtª0—Uû +
þà‚ +!:Ì'©‘øã£×ïë÷ý}Ÿßù<_+ñ–£QËŒ7 ÑŠFQ4âìÔ$íMÁ,«cŽ]³O›‰x½™aö¦YEVWòÏá^e¾Nº{‰Ô{®ˆ´JÚ;ÂõQÒÎ>žï!®ÝÊctMèØè‡:^FÝNÅtúÑf6R´;ÍI¶ha†Ó:fmœÑM²‚ÇØE£¬¼QÝÓÚ£^C÷"Çú)RîQX€Ý¯s<ÛÎÛ +²µuM!}*F«jTêÑò¡ÓÆtj"«Wë²5ž=¦dö¤Æ²7kÄð°†
7,jÈpV†Ëê7ÜPÌðE×,+šs_ÑÜ´bð%4—J˜{JÂCvJ.ØÁïYžm\)W‰eʘ£©£&ó¬šÈ+W*ß©d~ƒÆ +Z4ZÔHAD‰Â˜â…Ã*œÐ@#S4¯hÑ‚úŠŽkñŒ"ÆËê6ÞP§ñø“:MAZ]Æ´® wšRðIJãýôfaŠû žó’X’æ<™Ì1Ù”097»4dnÒ€9 ~s§bÅ}ŠÇÕkIieFËœº,ê°WÈrFAËeµY¾*¿å]ù² +Û7(hß¡öÒ} +”Ské³j.½¤¦Ò7ä-}G¥Ë\ÓÜ“á<:ŸBó %àC¤ØYXcÜÇ)Oø/Æ;Qbé-ÏSO™Y‘r»ºÊ«ÔYáV¸¢I¡Š6+»Ô^U rD~ǤZ[ÕìØ«&ÇÇÕèxFÇ‹r;^—Ëñ¶êäúîÉŠpãhî§ìÚáÆ’À8$¸ï‡¾:jâ‰0.ÕkÔQmR¨ºDí5j«q*PÓ m«ZjÃj®í•Ï—×9¡FçfyœÈí|BuÎÏÊé|A5ÎWUå|þ +dŠšeŒÚTTaÔ¥‚¨OùÑ rc½Ê‰È›VVÃ0ÅÈÆÑË€‰âoúþ +éUÒþNÚŸê` ÝâÓ+/¿Ýh× ]±V²G%K¶Lƒù*ˆ›”›°Ê(Sv‚Mž`á&Ô$›À´&0Œ ªF)~0CÄ0”^e¯oÁC#½üîäY;øø]ß#±íU¶
›bƒg)4O†$I-Yüà@OqئØÀ)XŠŽ¥ø`]ðx)Œk +Ó˜ºÀ»¯æ$yÒ«ì¢o3h$a +<ß…oÃ7á9ü‡â|N¨ƒFb-C¡OoãcÞÀ¹\#Wp9/ã|^Âu½È¹Š|Ž<~K¿¡hM‘^Ñ#8Ìï0lO1|ÕeÔ.åc¾_ú¿Þƒwà&¼©2â؉ãÖ_ð3/ã©^P'ú=‹Cú%îéiœÎ/pZOà¾~†»Œ|œÍâ1òø!Åü} +ù"“zARBéLÎy½»û,|>ŸÎçðOø°séyxŸù4cñ$cñsyy‡0åÖÊ;¤ÐîG{í ´W¡=‡öíhϳ<¶â*wònûY6e6N“ÅY–ìâ]adÞZˆyNÀÇá8°Kð΋eôT¾¼/·df©¼…}?åedÛÐNëaÆãóA{í)tgÙ"Ö£=¯Säq’y9Á¦ò ¢Ü¯3ú +Ç¥èOÌTnƒðaدïwð“ü’ûj~ùŸ‘ m+ÕåÐ'ñº§`¹6¡@;vía´³hO²…Íè0y$ÌË>íf{;¢{ùÕn2¿‡ÅµSÏ°ÝÞ€ÜÛa<—_ÖœêúB~Ëc7EÿE]ÁëÆëÂëTúÍÚK÷2/{¨Ó]B?‹æJŽ5h®g¥ÜIÛ8Zö±rŽsÌœáÎy²û)«éuþçþË&x"¿<”ß傽ǃ‰Ü-hÛQtýú1ôè§Ðï£"‡ˆ‘Eo’•2K•n B>@6»X=Gµ–‘œ£Rf©Öf}†•6CìÙ<ßËo»'óGÛôÂqÈÖ‰JúeäkC¿}7ǶŸaŽð1’¬Œ1úˆ1ŒÞ-ŒÄ4+fÕ:O¥l#«¬¢¨à‡©ž<ñ+xrŒÃù¶dŽ™û8òö”rD–.¶w-¶ +·2k‹9ês†9YÃÞµšÚXEN³f'Ù;VR+¨ ÖË8WYž\N¦cÔço5ÌÌRÁTù +>K¼c´@»ZûbK¶†ëIç~–ï—›—hy‰Y£E6Vh¨°Fƒ…~
, )³¤Y}E õ¥ÔS”Q·iT]¦I¥LkÕiºSíÅ;•,>ªDñƒj+>§VÓ%µ˜®ª¥øºâ%9µÀib"î6Ž·NÞ&!Ëç½ßË€µXf‹2e†z˪Ôc®U—9 ´9ªTy‹:Ë;ÔQÞ£eåÃJZV¨Í2§V˼â–j¶Q“åAE-ç±\RÈrU!ëu…9Eàqösíèmo«hnáÿ0ôÓ*÷ò]7ÏtÙÔµ´Ti›U)›C¶jµÛê”´…”XSÛÒ¤ZnÅiþcÆ„šŒYEy…j0Ž*h|JõÆ×TgüX>ãEùìÿà:'?'ÆnâÝ…=XKÛ³’ö|”ÿÐý49u_;Ï-s)é(WÂa¨ÕQ©¸£V±Š€š+ÕTѦhEJg¿Âάœkpn”¿r»ê*Ë[yZžÊsrW^RuåpSngN5pñwoc-u@[>CÐ)¶VäÓB.1W©š«ljtU(êr+RíW¨:¬†ê¸‚Õí +¸ûäÇøÜ«äuo§æn¹kÊUsJ•5_–Óý#9ÜÏ«Â}ƒëœ*«s:„þÝÄ»v|ÚOýA?tñ¹´bq¾o&ŸFò‰xL +y,j¨µ+P[¥úZ¯üÞ ê¼Mòy“ªõuËã‘Û7)—ï6Uù>(gÝ9|'e÷="Ã÷Ù|¿×RßuÞœìp +›9?ÑÞ€öڣس^è€V>7C„ï‚Pǵ§Irag+Z +e´•Ê–°ÊšpÈ’p©œÂ1“xi²E%É”L˜Æ%ÉI$1ILY’Ó(‰ IpB'žÄP½ø¬¶œ¶oÚ+h{Ñï‚$×qhä~ü\×rß…uc ÊHÊÖ^"sÊ¢’”!SÊ©%) +SjŠ¤ñVé`Óø«ôVà4NaRRRlœÖäÐIÙ‘Ó]hÏ Å†d “ë6hŽ3 +Š Gñ@e" +ÅJG‡CÀ)ãØ)R¨ÖZ§ÌСPflÇik©RA Te¬jÙ~ÞìÛNÿøξ×>ßç÷¿ßóe`À.˜Éц³ñ£?:ñ£›œô˜…ÖMðº' +Õõ>ºî=à»è™wðã$ñø)
tŒ¦9Ãa|ƒ$ÆÓ×Ñ™¯Y¼;Á6ÐîÂù¸f¥ð‚•â_)ûÙú…ÜØb¿Û5خǶ©Ú&b{¶gb»ƒÖxûµOË)¥5dâÚt;m´G/QÀß'*;ˆä÷àì›ÀÓà)p¾¿Xåô¾Uæf{&‡ÐwѺИ¯¡íöP¯àÇnâñã.ÞN”ßíÔÈVjd~ôÍêEá=×Kxó:\?דDtœO€Õ`X >¶Êú¤ÕÞû¬-`‡ˆU±2°›K«ú@ ¶+°\£g©§Q”Q´¨‘õÔH/5²?ÖàÇãzûORýz”æ^Nô–é·l·ß°ÅǨ Ùc~g¶;hµ$»ñíi=±è•
»ÙlYnlá þWÀPƒí:l7`{¶'Ñ!ØnÇî-àn_Ï%sˆÅƒtAz·›Šî†×D—…w¬mÀÜ_P|û¬Øª°”Ž]>ç`ÛtdûØJÔa¿ûã°7‰#u:ÕÑIDæQ±R-4ƒ,M§GZYm‹þ +ó*ÈÏ—'ß'·;¬<w¹rݵr¹åôLR¶g¶Ï9<«e÷l–ÍóŠ2<?Qºû×วŒ|ÎlÏ…kò¨™1¸C@Ï"øS‚|ã^PP˜,w¡My^C¹Þ\¹¼…Êñ†äô•*Û7T†o”¾fÙý3eóÏU†…Òý›”êYɾ7•è;®*É{GÉÞ˜Áæƒðµ WÇ!êA
¨ƒyAÞû¸¹Ï-¤œ@ºœA‡Œ ¸åɊȪ’-T§ŒP“ÒC-J
±Ó†–)1ô”B»&Ãaa0ÈL¸bZŠÝNø¦0‚uÈ£j~Ë@$À_@ï½ÀÃuÏŃd„SåˆØd‹ÊŒä*#âUz$¤´H™R¢Ã”mTbt²¢•(º"ÊI݉ÑÀ)¡„a³„é%ÌÙ‰ÝÙð>ÀÈÙ¦A׃A˜çAà‡·à?L—p”å†ßÍewÉ^òg³¹’;¹ï†ìn² ¹,$„$Ð\ TÄ ‘’ +„‹ãD¡8Vª^¬µ”BqÅ2¥…Z†N¥ö6¥#Œ2ÚÒ¢±íØÙ>òÛq˜—Í;ïùÎ9ßùÎËo÷Òyn”'È[é«Ú%gÀ+{ ]Il% +eVPÈ!ÀüdŽ"Z‚ˆ¤ º"ø8Œá<À<]ÕLpUq-Ãî@™Ô‰h +²¸öc>
)ë
$ÈUc—£Ö¥¤
&ÄSÜa +(ŒÁH w#Éâ)Â<a–s2…9¥C§>ÔÞq-ÁîüJò€íFPª¸.ã~1¾äñ›Íµ¿~L{‘ ®MŽH²ëiô
4Ú©“
-JG l”¢šl+@È5¡¯¢c`œ÷*oð
>40E70¥c»Û Ô +¹WŠ/üæpí¯¿ýdK©—,1!ÊÛÌa7“¥•fÞF3ÑÐbl¢‹álm›¨‰B&†xjG¸´ä›Ø„øÐ× +¡É·à¨Åe +Ä×)VÞ’)V¥óšp—ÈË»ôK4Úw(¼_“à¼ÍBÎñáÏßSÕûî4n;6YëÝas¿µ¶Ã_¬Ëâ¡Õ"™¤³àxPæz^dŒtÐ +u|L/½ANþAùÞ#ý•Âú$^{Yzÿ<SþÏÑUŸË)¦®ý ”[x30•IÏPJ_e:F=Žè3ŠæSÔå?)˜(ÑëÈG,â¸J€.ãÜïyó_Ÿ +ë¨âù³£Ãt€0ÜPÌÜÏqû5Žþ;‡@ãH×1î·q¶(ûNì{€‡äÀQ@¦ÁS ÏtìÕOxÂËZV1j¨¡ƒTW€ÝSçUE¯¨Ò_Àmç^\[ÅÆœŒ$-ƒzÁlÐÊuÇÞž5àO}‚Ž8¼¬!
dÀ•W!\¥ðTÃâÿFl·ãU"[ËyºO·µ½dð¸n‚8÷âÚÏ(GÊFã>ÆŸ9 D¹®!žMǧš)‰ª±;Lr+ªj›OU¶,UÚòà*†«‚.V_½¦ÙZUbëR±mP…¶¥*°Qží!ªy7^ÿœ'’q~ãú&÷À¹ˆ±§—£>š@¨å^gU ÂcS…;Y))*wzTæ0Tj÷«Äž£b{¡Š¥*tTàˆ(ßѬ<g§rýÊq+˹Z™Î•áxJ~Ç!¥ÛÏÈ—|
ÜqmÀþ2øË»‰[ÁîU‚2žO%Þ${*v»TäòªÐåS¾+Kyî<Mu—(×]¥wXÙî&ez:”áéWºgX>Ïjž-Jõì”×sH÷OÁUð/×ZlÃÓÇ(ÜÁ¨Ñ" Tr¯”àOï¤%*ÏHV^ªSSSÝÊõÊIõ++5W™©ÅÊ0*å7BòMJ3:eòKå1VËml–ËxRSŒ—å4NËa\ŸÉ‘JßÆöbøæ1Ç' ªA9÷J@!Ïóñ%7=A9¾$eùìÊô¥(Ãç•ßç“Ï—´ôP&#}º¼éòøcrûçÉõ?¦Ë8Ê« +Ão6»Ù$›,›Ífw“ýI6›l~vIHBHè&@˜J$ +†$•AkJJÁJ¥´RZ•j¬Å¢¢ÌXµÕZdZQ¨µ t:0ÕVªv¤Ú–aèV;èúÜìçè0/ûåÛ½ç=÷œsÏ}o +|ŸÓ·Cy¾d÷}K¹¥Çe+½ ï{²y¹3°½¾ë‘ÀÝŒ‹sÁlP⼫¾¯À—`™Mþ2»|eyýù*ñËðÈ(!ªUh+ت‚`—œÁ>9‚ò7ÊœRN-àF Æ¢®‚Œ6`|K‘ZiÐ +’ Ä—¢|A|ñlòrå
:ä)wÊr©(4K®P© +ùQ~¸RÎpBŽp³ìáNÙˆö/B×܆hD †Ñ²!|½ÊÆPNc%|½aÎ#hŽpøŒƒJF¥0ß•ãK <G¾r›¼¹ò„ìrGœ*ŠºTPéVÅâ¨ò+·*¬œXç“€-¶ Úc +±-€[©ê ø1Æñ!ÊœåޅÈïöJò +qÅ´õ¼öyÖ¼#
3Á×6\/5ð†ø»”ð¹áÍï™Qÿã´øŒÐûˆ%úÆ,áiD e§ ÄÆ$~l¡6¶“[)°Íl&`“,Ø4Åoö!š˜$>öë2ꄯ•ýÖóMSÄÙÍ~†w9XeqrÄ‘ìÿÇ&Áf°ÕâÛÁíàNjänüøµq/õ¹‡Xì¦6ï,ºƒéaç“Òôo¤©©“ý¦øºš=puV?ü&¾kÁ¨Åy“ÅG«C&gð–åÈ3Üd…¹L(9!éQjä +öì!Îù#–¸°„î6ko,c\ÉŠðÿòAü(øª²f¥ï‚Cà~åÌå²y†Cv„Í&¨‡Ú“äã{OKß¹¨Fê*Jˆ¼¤ªÐìy“W³Ï=烀%¢Å͆çqe‡#3 pÜHáÇå†\“΀³äåjô<9y™¢{‰@Ÿ&°/|N:‰gT
·î"bcö|'àkÖìðuÐâ4Ãà•Jg-®_€-¾__ƒßƒ?×Á[àmÎËrr™³z‰‚{Ò¿î”þr€ßGQ +•-¦@¡t¥÷˜%þ®"}€vĮ̂N£|S tÏLF×8$P¬ï3\¥PßE¿¿M +3l3ÃÔ‘Á–Ä)eX›Å%üx?þÁ<ó>jø*Šù + +þ-tûëL4¯áÇ&¹ßqXÏsh^¦x_¢xOãÇ‹øqJ»tR{õLÇ(Ž£ú™žÖßPõÊ&˽Üvƒ+p^¯Z!¤‹3ûNe–8ËqŽYæÚýÓÄóøñSâqŒ†u”ÆñêsÝašÅ(æCº™2ù”ž ˆ¿Mñ~“]äô +¥{mfß{ÌL¶ƒmà5øÎ:'“`6Í?š)³=Å|wˆœ|_APÅŽê±ÛL„籟.ìöÎL²ûi$_¦y=Bãz?"÷kŠ£zûÝDZ}‚§“p_!B<DKƒM`˜2:~b•¸9^_±ŽÁÃÊ#nÅÀ‹ÝrŽGL_À½øñYêã^.=4ñÝäæ.r³‹Ù‰;ÈËvÝÂo'3÷é“x¼…llÖy‹†ã`<g•»áþ’uÍ‘Üv‹*Ð49ÙÁŒ9ÍT´
?n#/[™©neú»…t’¹™ÜLhílˆ +ÑFþßÀ¯n$'ãDhŒR-ë©°µðƒU`¶ŽüVÚfµ&Ó&L{ü¸ìØs(!lÇ°]‡Ýv[aì`÷ÝØ^L…öS«ù7 +ÇU;MÅܧ°,§Š¨ú~x?ú,<fñﲸÍU`®s%™v½†XSŸ«ÉÉjjcX~l‡ð?†í¶“ØmÁnQèÆöìp¥ßÀÓ¼ÚJÕÜÍU¿Ÿ¬=ŵÿ[À}mtó¹ÏÚ¿¹ +6ZÜæº0×jT´qlÚA!vÝ „g?†#†ýö“ØoÁ^vP}TÊ æùN²ÔAVçQQíÔf»^Ð\Nû\¸çZ]g¯³ÿuÊJËꘑ*F:tÉœJÓ3Òš¼pàc?†ý¶RØl¥BæãMæ™fbÑÄÎfsR0¥¨º$Í<©7Af¦û™ º5†²e%Ñ"æÙH'#ݸñ°î +Ô8ïc Ò•£h¡C‘ü|Eò\ +;Š¶{²ûTn‚¨‚ö¸ö¤üö6•Ù»ä³÷©4wXÞÜ*É’ÇöyyrÃûgÁEðo²šÑØ/óè(Ë3Š?³döoæ›%3“™¬$$`BH@¢¤ˆ‹€U°d“ì(Q¡"‹¨EED +TP‘M(ˆÈ–º€- âZµ"¢‚"K¦¿wæ;=§žþÑþ4œs3_æýîsï»Ýgü}àêÂß–6¥(M@ÏrAˆk&ÉЬõØ%êvJÄé^ ;’îKÈ— gœM@™ø ú³Z|ÎâuÍ9I<Ž9âv,—}“¸l‰+팸¬ O8:ê¬Câ_ªmkÌ÷<bÔõ™$ìµJº×.!Í)AÍ-A&.~OHtOÈŸ§H¼ZsÑ´ÖâѪÅÝ$NVÚ±i³%M["VϱxˆÙsRÌî„Ü¢Úx:À{u€>4ù ›gqéºYBzšt»ø}NÑ}.ѽñz½âõDóEÄ£gqé%âÔ+Ä¡·›~ƒ¤éÅ¢“NÔéy}d8/aÇKbñrgÀß¾*bNEˆ} +Aß3Aƒß"¿Mü~‡èºK¼º[4¿[<~MÜ¿¸éâÄÄÈ[°©¤[Š%ØVÌA²[ärÈNjð?‚„ôåý]༆–¤e˜y +´4J¹C96g! -dSCI23!Ýrmœ3™ò‹AÈæ{ŒZ"ÔŠ˜% +öESjh’ërÙ“¼³‚\¾gRG¾Ðùì…×Íßì¼ÖBË%ÁxPÂEWjI],-™“VÌI^T0‰ªàG š¿‘FZÑœ^IRkA#VNŠ,c.š'äZ–Ï• À‘Wœ:ÂÀÏg/Ï\ðÚhÕÌL1—$ã’iêRU—kkuÑRG[ê¨bNÚ±ÙÚáE«ÊAΚh˺¼†ýÙ†äTI‚n}RÉ»Ë@S´å3$Î(õøìå¹Þ4Å[f\âÈ"˜À h /\4 š¹éD×SGwêèΆê†ÝŠ¹+yÞC€F¶3‰gDõv6gTû„T” Ÿa[>uÄá
Áë…ׯµ¥¡µÒ4UFÀéh„®Fèºô4¥B@?ÖhöI|
búaX_ôá¬êMbêõˆHŒù†Ð”–ð”°tŠ¨%Þ0>ëøìB¯¥ÒSí
Î. ›¶z$Ãf*|Õ¨j@8‚:F³FÇ0'£YP£yùHŒ`ÐpΪ¡¬‰Á4°·ÐM
LH9:K˜²Fðf°ýáççæöÉ ™âT{|´«„j¡…HÀÛÀh#O +6izEq³Òæe-Z^YqÕÕÕ暶UíÚ_WݱS—ë»v¿á×7öèÙ«wŸ¾ýú8¨vðC†
1rÔè1¿7~¤ÉSn¿cÚo§ß5ãž{gκoöýs~?ïù.xè‘?.|ôñEO<¹ä©¥Ë–¯xzå3Ï®Zýük^Z»~ÃÆ—7ÿyËÖm¯nß±s×îú¿¼þÆ[{÷ýõoû¼óî{‡>øð£Oþþégÿøâ𑯎~ýí±ãß}òÔéÏœ=ÿÏŸ.\Jü¯ÿôÿÂõ›ÌJ±]Iö YW¢ÓQ¡dg+Ýù/RÊK”ôr´·Râ+•úk‘ßAéïŒÝ”7)nƃeÂ-Ê…¡Øp›òa¬2b"NLUV܉w+3~§Ü˜‹P~<¬yG+Kþ¤<©Ã”ç”+/bË:åË&eÌ+8óš²fòæMÌy[¹sPÙó>þ|¬ú‡¾T}£<:I?(—Î)›.^JŒ>¹\Í»%À~¾þË÷_¸_b2™Í‹lv»ÃáÄ·Ç£a…O×ý¸áG8‚#1<Á\Á|ÁåLÒš”7?3'é
Öt뮶;©fÀ Ú[‡¿mÔØq&O6}ƽ³fÏ7ÁÃ[´xÉÒe+êØ.j·¬[ȤƟILiLŠT*‘‰N„¢©hýòj~Þo¡ø»'¾Gô©~8î3gÏž;wí?]¸pñâ¥ý‰ºÆ¶ÄÓeÞÄÊÊhbm‡üÄÖ®-;zW_Ú5¨æÔîaãï3ûЖñ‹ö®›¼j×ê©›¶œ¶sÓ²»ÞZ»dæÁÕOÌý¸î±…G.
54ÔÐPCC
54ÔÐPCC
ÿw
+ž¡†u%^¡†]½ª/Ô¬9ùúÐ _Ôºÿ½×Æ-~kóÄçw®¼eë·ïÞðÜûV¯¸ûåOÝ÷Ñ¢'æ~¹HÖPG
ÏVFë©áÕ®å‰=½ªÏ¿1 ÿ‰}C&|±wäœwëÇ>ùÆöñ/n{yâ–
/MÙµzÕo.¯›¾Ñ²{ß_°dî'—‹×°Š6RÃk]Ë/¾Þ³ú̾þýïÿ{t–tž +)“U£k„aê"a¸>WÑ~›Õ“Ä¢™¬
ð?J!ƒìÔ& vøeÞàzz¶ÓÃcòÁ-Ì£>ÿ$CkS®F–ŠkCe\ ¦)Æj3Jñ-)|’‘ʉ鱶d(;¼ÔØnZÔÚÿs®ÝõôË>w'C71}f¿Dm<WÒ,ÈQ•÷d¡uY•Õ¯¢ð¦øb…Oi·6 €|È :´ÔÙn\h²ßó[÷ÅSÏÝ<Fǯ£Ûú%ÔáwE:·°!D|·%K—¢‰XuŒˆ # ÉÍÖ?ý×° +”úÔÛþ}®Ù~Ï´ÉÅv|ôʵ§ž¡Mƒ¾4Yg`&_`3ÕÈ’; +TEr-ZF•båäJ¼_©±6PüÓç@ +J!CÝÁÕ³Í'×™í¶™ž:Ú´Ï^tSM_CˆÆ¼‰¬€øŒDzŠ1$›ÚÊ$7‡±M¸¢0-¢‰,¶6PÊ÷¬XPüj²ãäw摳ÛZ_8žl|ërE:ëãNxc³‡¢èñ´~T*¥Ã vâ2pFB6º”ÜÅ´6 Þ²ÈvÿeF`åàÀ±5m“gw¨ß8ØÈ€óÅ’9÷[yÓÞˆ´§XÚ’DBGG<ÂÆáñ3))Ä•‚è‹¥[¨Ø²l^¹ë‹Ñž=ËÛǬSÏžÙ)vÇÀÉñÞ{7wÆoïø8œ2… +‰˜ÄbpOñ8ô">äßäÄX4 >J´6 ÝüÙ3ÃæO;F·.×Ìþ^²h»ƒÎÊÎÜWã}®FÍ]ÇÏ…Þ +{óEÍü‘¯"‚f(/cƒ`Ó4„µ½Ñ¬ÿ¤çñ7Ÿh¦^!}wø>8¾5œÞKÇhàÊ™Hàí€AΡ Ô5à.-F\
|é{Gq÷{ëá»ïim=Æ/ÿ¤Zý©táçUpàûpdK*8¹+Øï#€K‡ÑÀëD0€Ÿ +¨3þ +ä×çëüý¦j„áò°”^A³µ€\¢ËŽ‘*´†ºÔ$,!µ2.«KÃêãGv[ÚÃ=ÈÀú×ZP +$Aê=]æüüž+‚#†¤zwþ^‡X¦aFÕ*²b«ÓZ*SR»D ™&^\¾™Ëîµ4Àúh`C¡Í@v~'¨¿x¨<\æÕ¾þÏÕAÄGµ¡i]8¶^@(W±IŠÚ<Ê}IÕXžAï-ed›YIÌÜDV¿¥ýa(„e¡úü „—·Zÿg:8éQCHz§,¬¨I^ÕÀPÕQš%ìx£Iï-ÊÊ0ç2˜™¿˜,탡 +8gÜ: +ElA–,DBHHB@¾„- @„%1, { „E¬¥Š" +ZDÐÖÿ|§íñ>^õ‹çþwõžó>±ýL³pæP8:HÁå"ÿ•—Oêl@Hü4†@D E> E…ߧÐñ÷hÌx3ø{=–p—Ã~ß@¾ÃbI»ËbüÆΆ)Ëõšy›µ`o%†³6…àâ”öÖË5~)ð +}çOztõGr(î
‹yÊÀ‡ÌĆ¡ŸÄ_
x ÷{œL|ß@¹mÅTÿæåÆÉí+5s7*àÄNØÈ3GRà¼]xž£Ú…øçŠÿ)Üó†|9x‰æ…^d\ \dyû¿bûø.pP¨…dß÷m®ký²Ûk—µÎm_¥ +b} þüà¸\¤÷ÎhX½L3ùÇå5ðéj1|¹‰‡¶%À±/h`·?œbàÒ!4øöƒÐ£( ÷†ˆ^@9é ´S—aã±6îÀ¶½‰ïäïørö¯²Õ%'¶‚ä«ÝPíb
5—íAà¶(Å=‘)|FÂÌøìëIÉS|F¹!†'ÓÑòÝAcI¤n#V¶´ê4j¼Bkn¿{C.bÈE¥ˆ¡ÒaÔž·…‡=Ôú»½’aƒg*"©÷tîVîP*GhHLÒÅf)º¢sUíQ…ÍšH¡¶%¢²£‘PÝYµ¦ÝÜ~5ì[y‡6‚èøV!†zgkhpw€¿K +Lèy}\DMå3û3Ù]WÑŸ¦ÖÆdkšijJ©®‘$ÕË#d=U$y—¹AÁŽ•‡ +¬7BÙñ-P¿¶Õ%P¡Ü_6†`×…3Æ$äô‘âè}N¬¬+5A¥ILÖ6±2ºUŒ<CÔTE.3•Q*{ÅY¹½3ð7@9b¨±ß*ÄÐäæ +Cű- °ÿÔNÖÐâæðVãí>ߊÆ=jÂÇÞVy& ¥¼»˜Þ Ée¶©³¹=™†š”<S%·tX+ÉgJŒy±R½¹½3!鱿Abhv²«ÃÏíW<æÚñ“Z,ë–2<·_)é*£ª4¥¬6%ŸÓSÍK3J2x&aª`8?A8’Í®èÏbKæöÎ °Ú +ãz„E\¿ ÝÄËÍNË^禗pÓ$FsƒÂß%ˆA†”ˆAëhùSÏ·özOû}Ãô±Gº±Ý-á•êrcµœ®)«ˆí.&xÅ©¦´Âœá¤Bá›W>Àή0šÛ¯†½k@ˆäGÿ +*ÄÐîh¹Ô÷ý\¿‡ÇÌ°O؃ì^LA›– m¸Ù(UÐ4Å2fw®„O'p…¼¡xaé0³°|€YPa47(üt%ðƒ1Ô µÝΟ;Ï\0^°›vwŸºívgÔŸÝgÉoBþ®¼™Ø l ´æÕÐ;Óe¬^Ž”cdUd˜¢Ëéâò~šPb07(úÍPf¹G?»Ï^÷œ;87ärzú¶›ûĸ~äŽ_|‡)8WÑ…·„Õå5›S䶜ÞS«’rûI’ì’TdŒ¬’èÍíC!b¨@õˆAsú/õç<»qÞvòž«ÛÝ—q†ïýXMCAÙRFÄ×àªÓ¯Tìbkt-¹#²šÖsUÆêÃV%ë±Uù}8Y±ÎÜ@€Šö®©åŸ@ydóëŽÓ;fÎþûјó©û/¸
Oy`ÛðQ\Gg”êCÙ8 §•P£&*)ÊÈ&bµWÇl©Mì@×fvÖæ˜#b\MG6Íël·OžÝ?þÀñäw3.®}ÏÜCU(šä&:©Àš›Ò‡+au*¨mDYD+¹6¬™ZQÇ(ƒ®±¯ù«ÒÔ~ÊŒ&sƒÄPºçcP|¹öMÛá
3¶[ÆÇ¿Ú3òØñ”þ¹ËEÍ‹KAòIT¤`—9ŠIK0ás¢
á…ä^RéÕŠ×E«î`JÛØ2_mŠ¥M«67n·€ò®ÕÕ/tÿ]wï¦ÍæáI‡}ºYÇSšÅóßÔ½tóN£Âxh*wǼIHŠº‘N¦d…
Òr0Œü #‹ïoH,BéSŠ}úÒÌĈA¾û£7šýarÐúã‘ûÇ>Ñ=sØß¼töDí[gçò×nžyÏQAÉÓAÖ$ŽL½N'3 cÔ8ìFBÈm}‹Íõÿ.)u#=Õg4Ãì b›4~nñ¬o·ÅèøÞUº™c[šíöËáÌQ8ý¯ +šŒ|˜Hñ{…šÈ ùLdšTý}Å«¶íËoÝݸ\7½gMÓ«£[e`³·þÃG›p=ÇÔêÏ¡nÄ×Oü"ɳ@E¿dø¡çYþsì@¿\4êyj÷lf°÷lVˆ¹ê/Ëo˜Ö.Ó=Ù´Býjï:Þ*€»ÿÏn½Æ%}¨¯ã¶êlÎNmg[µ¶ÖÉS›e—é²ÖJKÉÊnÞ/T^ð†¯ ‚ˆP@QQQ@@PA/]ì,«Yiåén›múìÿéôÙûÿ»ó¢¿÷ßÏóâyžRؽ‘ +û·eƒ[ +„ìÁCä>ÄyE@²÷)H;ˆ…¬Ãaã”#Ás´£sEÇfKûÏ–¡î?æ…ó,£‹æµ?_öV3|ó~lú¶¯ÎEfAx8䌃ÀíáX·HÜ©?BÆî +P¥+ß²£Š6/… +äfÕì^
GŸpÖ„1~Ïù)‘Ø$ÂT1|RB¿’Í.»˜Î玦ÔTMª¯Iˆ†â僱š¦è.Yo„AŽ¦7†7†7†ÿSCÙkCɦ¥ÀCµ»?‰—#4wÆPO¨Çù?NÆÝãfo0©”qZãbNYÅùLnõ¢ ~(¹VbOKmñ²k¬ZeÄu¨õ8MÀB̵‹€‰üÕ•Û?„ú?©§#ÈŽº‚,ØkNøD”s§:#ã:'‡>V\À9OeÔ“ØâtžÌšR2'‰ÚLø掞8µN£éhm× é•¡1”!?mb#ù~GPqEfVô¸ 7UO$ó²K.”R+‡é…
¶\f‹9³\cLÔu%×uë›MêXy¯ßªoNhkG°WüÏÀF5ˆA²k(ö9‚ÚÇÔ˜ÙÖÓÁZâð·$)9—«3ËΕçíÅ4©™R¬éÉfôi¼ÞNb]Ÿ6µÙ*MZÄIÊnAÓ‰¦W†2ÄÀùv ·-‡&Ä Ú·Ú»€6 +›°cSΙ#ͺØÊvU’DÖœÖZ×ã)F– ¨¯˜Ïê/à +(ÜF;¹Lj!—¶Ñô§¡ +14!Û +èrÿf¦³ýס£^wÎû‡Ž„¦YÃéÝ]1|•6¡Q¬HUU5gv²Å¹=Åuts¾°ÔšSͳe׈2xRKFE‹MP8ˆ¡1H·| +¾Æ$^åýÇy9h‚:ÄжrþíÁæL~æ`švú@óÒí ìÞ( +ü÷CøA"ÄûfÞ?²Oâ /8áעг¿”…ÅÎVž:ósMxô#âôL]dä‹Æ¨ˆç‚Ó¯ÓŒy©ËÈå….ýÿZòíìÚrp_Á‡OþF‡ýËàà6ß™
a»ñ·©^ñå¹c àP4”Ž‚Š#‘@94ßp`ù…çX(ð^«û<ëØ|ͳ¥”º…<ضœ«JÀsmxoƒŸk¹ÅBŒûiÀ팄ôðëä}…»C¡Ä3ÈžÁPµ'¨{µ÷$°÷½N}ƒs]Ôÿ˜ëÒ +ËæðàÝ…TØòf¸½
»VãàÀ;±pd}l…ðÍÁûþIÀm
€t×ý?än;$Tá‡Ç äC? »ùE}€Šöeó {,æî· Ñk
ˆ|7(Ô„±^ÀÃû›ùœ^–ø”BÍ|XÆλ_À+ù'QTy—ÐZs'³1™Þ]û%¾§~"ÕÜ0žâàÞÄ]á_‰¿,p¶ß
¿þ/
ÕÈPá¾Xè¿àþ× ñ +T7€á¸û¯ÆPŸŸŒ1!OI¸û=ù·;sécâáPc¹ÜƪQ™¨µm%·WY.éë(í°I‹ÔýMÈÁÏ7¹…˜ÚÙ€µú•¡þƒÅ A†dÐ|LÇÜg±Ÿ±èGX"nJŸVx«+›9ÜJÚ%rS}•ZÃd5LV%´¶THûÅd•½¡Hm¯/6˜Ø%˜ÖÙ^ÈÀA†fdPì] =ÈÐ{Ì}Æìó½-*ä[[|òSJј*“9(#6aâ"¹–[¡R°©)ƒ‰©|« ºÅÎ¥t9Xe*³\of’{{œí•ý8
®o@ËÎeÐ…úÏÖƒÅoÇs{÷“Èé¸ä WtE›ÁìïÌi2´È•Me*icµAÄfa<&×ZO—Øki*¥ÛQCÑõÖPÌ:gƒZd`"Ú<–A72‘Áæ·ãÙ` ÷¿/F„L]8“|ÖT4dHc`JB“FF’É%%*± RÏmd`lÇʨÚkêäŽJF·ƒL×a4³ÎÙþgà!ƒÌãMPïù˜}ÞµûnÿáÒI¯#§‚ï\ŠI¾êH(t˜SéM–@¡ ÊZ¤EÝ< Y_'¤öÒølkWÐOn”:JTŽâºKIIïlP‡,d¸.92h÷ü0Ÿu/}ݾ
øtúZXÐÄèiÜð…ø‚¾¾šÚÁ—ªs¤MJ¶¬LGk6WJX}¥"žPÔbÏ©ìy¼©Ñ¤w6¨[õÊ Üº:ÑíÔïy{Öæ³ö‡‹G·=º~bÿÔxHàõkQIƒÃqùFŽÚ‰¥sÅB+GCê¢+K´UÆb9#ɹ2‰ SÚ²›uAdÒ;°‘¡ö½ù ÞººÜ—€ÉóçÞ<rÔuzÂïäíà€‘ñˆDëÕX’úbbu›ßȳd53MÄŽJ}‘ºX[¡ÏSÓLËP‰-iª.^¡7§ÉÍ:gƒzd¨C†–÷€zÇâ_-»—?òZsÿú‘-wïúyÞ˜ +¸0o¼C츚P%¼”R_;˜!ª²çÈŠ]DY“ÕKÕáÍlC²©É”h”£Œ†$-¦q6ଜœõó@ºe>è¶/znß½ìÁ¨×ʯ'm¸yÏ×óòtÀ‰¾©SqªÛÑ„–ñøò†ëÉÌšÑt^ñÅìæsç‰ò4{¡g%wÇ÷Q5g,lm´EˆêÒÄÚ¬Jgƒdà››çÙmÁ“‹»–Ü?°âÆÔg‡øzÚúû÷Ü‘Ý‹Nç“PÀø*µ’|3“I;ÇÉ! R‡‹Å‰Cä–¸5mÑçke‘çyòðÿ°_goMžiÇ#ÖŠNǺ_¶ÖÑŠ bÝZ…ÔŠ"ˆ(² Dö KØ!Ù€˜ +z*£Œ)SüžhSѪesÀ¼s«ß +óÓØ‹ö)[+ã,vU%8ZËÀy‡pßsÁû
ð¸T zÄÅ;v6Ùø.3 ò-#0l†ò&Ÿ. ž‡¾.
x¥÷›ÒD
êþ…êž¹|cæì«es`Ó"5ì^Y{×åƒÓ¸íJO‡DÞ'"EÕ52p!À8Œö‘ È;B +.›Ià±- +v…AÄî“@²†Dl ¤î
€¬ü€¹ï8p}!ßÑ„û½¡ø€”:ê.uXbÌ×,15£óç(`Õ¼b°YÈ…K2àÛUñ°w
œ×‡‚»õ ðµõü_ ØyCÜ7^¸ÍR·ƒÌí@ßqX; +BÞdI¯RËâ&“Ô‰ñº”qõéã±MYÏ¢Ûhc„.Æ“¨ÞœGýì{a·87NsÑô·áoÃÿ5díX¼Ý‹¡`ßJ#†o;àíAã‚”cÀcžxË⇿¦ÇL¦ŸN˜HV¥<O¨ÊxF®£Å62G·²F‰Ü_½¹#‘ýyCaCüþÐ[yh²³ˆ¾}!ä·D?¬Ù¡u ÷´ƒÒ (Éëƒ ÿ†—Kœd&¼Ì’¦=KUÐ'U²Qjx#$ÿ~ŒYx/º³ðñ²h0²_|%|@t)⦠+cuvu³&«Ñ¤Hom9vÖ(Ë8_-ͼ¤Bä"ΆyP€äÛÆa)Ô!†f·ÍïZ=¦Úpã¡ÁÑ”: +ã²2EØ)Ë–™‹Ø*Ÿ¯«á×kXòF%³ÒTƨo‘ÑÌæâ¬3M"ZWMí¢M‹ì,Î×ó ÐöS(CUöK¡áÀ—Ðâºi¦ÝÃá·sþ¸±ö໦¨øëz2£»’*h“gÊŒ¦ª¦0O§æÖ—çÊeœ +“„]k±[ÌF[³ §³öTNM¸ˆA„ˆAg¿Œû¿€6WÛ鮣ö//wíÄ
µERú$zGu¢ Y™.«-¥«*Å\]Y¡ ¾D i,ÊW˜„y:3?¯¹•Çi5ñ¸z·[‹&ÈûŸ¡1T oeýçмÿ‹÷g]l^uÙó¼××m¤;8h =‚ÜÓCo«?ÕP™"Õ–gW”—²ªK$üúBQq#¿Pnâ µf¶ÐØÊä›[˜üŽº~·MxˆAb3Ôˆ¡nÏçÐâ¸úm‡ËÆÉÞ#»Ç®ú¸Üí
¼ÚFî4iÍ +_§£–(ÕJ©‚ù'ûuÕäÆq<,2ˆ´ZµVP”\Q JUd—}‘=„5@ !a ;D‚HD‚Ȏ¬¢ìЂVŠX«ˆ EtÄ>óžž¹'—s1ŸûïÅ{Þçÿ«Î.bŠX…Ü›Œ|þmz^y3-¯¾9ÛÜDÍ^é®’d
L¤‡4T ÿëä~·îþÔm®¾8d{ê嘳Ùø‡Ç@_h[;žV'Í(«‹Ìç×PJ¸I•¬kiµ)%œFš€'¦\½ÖWTÛÍonŠåuÔÅåwWIØÈæe©É¹U'à–®Òz‡Á÷+ýfjoÆl´§Ç/ŒŽºcº}IâÎÀÄê6K ŽÈËmˆ+Ψ¥U\®f\§V²ëãÊónF••ˆÉe×o‡•·ŠÃ…wE‚î*IüÝÀ> ¤áºæfh:¸Ö¥¿óÝ°™ê˧֚Ï.šþünñ&Öõã(¥ÁéíáÜÌæ袔[‰¥ÔÆËÕ1õ¬Z²(§>D$hÕÜ$ˆšƒkîÕ+{*%™ßKGuÕå î¸ü×öS[—ÎoŸ{dª<5mq|ì…½q÷¤««ø‘¾jÄ?Ž?ˆgpzB9ŒÎ(µƒRÓF/oeV[¸×ƒš¯ÖâZªEþ-M¢€Û]5¸†¾rI@Ö.iÈÙ'å7Ácrk]:›_ß×SzöÜp÷Øœ…æÀœqë´‹sí¤®dŤ§2h¿DäÄƆõÓ‹ƒû˜¥¸>n¹_¯ Ò§·ªÊ«W\åÝÓ[îÓ1(”\Ax*²P£&‡eµä¦~ûQaì¥Ñžþ·æšwÞØ5¼rr,›Å`¦±¡ì)||òdh2e"š1žÈ!>LÎÁ¦øŽpøžÃW1CBzè†Àm¨Mà><\( àî”ò¦¬W•þØyPzæÑ¿dÆfµ·ö-ª´-›ŸhxomPñÎÁŽÿƒá¼ñÃ1^‡Rç#¢£gã¦iI„©””€IVšïD6Óë)/óD˜‰~Rå:.Îrï’äî†òÝÒЬ,õÇÐN©/T¤û´ÛV
÷Ö]Ð,[µÒãÿyÑâÊ +Æ)uÅ߃ö仉'/RBHo“ƒþHôŸgÇø¾âÆy½äQ0³Å èÙ +ªëL=ÍùE‹D€·] +DßIô(¡>Ý‚ê]Ø+ÛòQë[ÑWý½¥_MŽ¬[èfÛ1ÖÝ-©ëþc×C\ÿDaˆŸ)Þø5:6`5Í»’‰óùäµ\ˆÇ,Ðï+ˆ®ïE$çEqˆ$ ìÔrëVÔýŸ7£zß‚jZÛ'WÚÛ„pN%Œ4X`®E»3@D‚ß…P Y Ò&(öþäà©NÞÀvö®æ/ž›ûWÚm½ÜÝåË
Œó—FI,ÕË£FîýÕ9"/*J×À~ùÐú–º?¤þ*\8
¶'CÁå|Ïà Xd}ˆ5ôš1RLÜiꜮkæ|s'Z8B•¥ˆ¬$1Ú"‹ºÛ³ uó±ªò¯od®‚šü8®”:;ãáœr8˜ €•†8ñÏãÀDCˆ–+Dê8CüN@;å)§/Sײ~²ƒœŸl¡ðŒ
ÏZC¥DîÝ‘A5ü"ƒ*{&#UÛd8p@>ý3NlÝ]80Øã
æ{Ñ`·ßÜÔÀç àÔm¤a
äCVsØŽX@Òs`5æQd˜3…Üc&À?.‰Æn)TÙC*Ë$²\¨)àˆ¢/ò]¸ÃÙN`¼Ë,w[ƒÃ€V6/SðW1 ½F@Úgáû JUâTÏC¢ªÐ÷Ÿƒ4û€$€¢"1‡ä Bg$ê*AŠÁH·P'
`újAjÈ9HŽ7Zª
$d;A,
Q¥^ëäjì¿Cë>ÅAk„6Â*¾‹¸8òÞ$lû(|ÞgŠ<ã59åñjCÿoø_j@nE¬†DioK§• õüÈ0W,
`{k“¨ŒX3 _¶*ÇâyžëÑBìçˆJÜZ˜ˆ°JºEZ n
û€ï$/F.ŒD¿Æ>Ž™õy;é5?î5³HøoCìIH>¥,½À1S®½d{jCþ<°¢, 5Éè˜ujöSœ h5ª<äù:y)´!j‘Ø»@¸Ky4@ÇÝ¿4ã÷$iÂgŠ>æ3MöMØ$"
qÈû…‚¼ã:Šyî;àš*C¾äa´‹Ó‡,²°¨.1Ò½?'qƒþLà‡.Å\‹|Q÷&¬Žúš$NzE¸sùePêäOøýÊÅN¤úM%÷úO_ÚP÷È@<Ò¨© +†ÔFI%ÃÄ>aOЀð~¨¨9x,÷&i<³ž4ÁÜÐÍ›€lÞËG6Ù8<dãí2Kõÿ^ŸQMßk +ûdº•V¾[È6窳åʺLƒ¦:ã–ÖaÑ)ñVµŒÐ+•fñÄ™ÃL{þjÈGJ6;o‡TX +Ú£«¡æôƹŸÝo.yMÕG`ŸâbF)é‚ÌB+‹Do¥S9&j™°®+3%*M®F«Ì¹©—g·êE™ »[ÆÏäWæ>`Û…HÙ7KÝ +¤Aï±êNmüÝta×Ls ç¤)û¤öJŒMŒï’ +îòòè¦ + +§¶„.ÒQY2%Y¨®")u"bŸßbää¶Øù] +q@À$Ù8ö@ášÿ50áöE Ú¿ª¬úØpÒõùü®—þžæ0Ì¿b¢ûõ‰øv9¾ Y˜C¯ã°uå7DŠ’r™˜V©®,’é8d½I6…÷ªRr¿¨”<ĵÈH i(ß´ +é½’Bú ß
dW'`#g!ÛæƽŸÀß½o=¾îUǹ½˜C;‚|{Z#"[o]M©¯IÊ×jñÅRE6‹')”oTWV¨(¾ŽÄVòX5ÆÖê¦U“[Ñ+Í+äÛ”Õh(Úà\¤A±Õjöº|l>´ümû±/^ôžýêé ï7¶îK>Ööðˆfs,ÎØ'¯N¥ñµYJdXÊ®KɆ2_ÄÓf dz‚ÀhÀÌF<ߪ!ðz¥ÜA=P„4ÐÖ;A%rê¯@ýžEsw¾]úºÓkÍäЙM?_pïï8·#,¼¾-:Ym¾–+jÀQYµåņ<YKçªèòG*—h“ez}¢¼IŸ$·jp’^iŠxo\GJÖ9‚ÐÕt[æƒi—ó»v÷O§ú=Wþ{ìÔúŽyè´ù{7÷†„Q‰UmqYœ–d +Ý„/¥4ä°së +„šb)ÎÈR$Ī8ƒV}ÅpKsÅØ©ŠÓô‰ãUƒ•ö +v|˜‚yô˜l”¯@ƒj…ÃGórÔè€j`b™Cû´ÛÓoî+
o=]«ÞœÚÅý÷áÒ×þ§È3a¾93WÓg’C“§3"㧉1±ÓÔ¸Èé²ká¯xI!/¥¸ )uJàTmªÿsöE7óËC»€¿Ôj?EX¢z‡¢Úf–£?l^¤Ÿs_)óØÀž;±xöÜþÂًٳa'Óf¯œKšÅùÄÍf`cf‰‘³ÔK—çÊ‚Cgy!Á$a—~W‡¼¯Ž¸øÞ‰}g‰ô{×e(]P£æù¨®Ž¨;#Q7ÿølž¶¸ˆaÿÊ +8´Ž +ÇÜòáì`öá äÛxˆõˆ…d¯( œ¸y§Br&ègƒ€í¢ó ¸pô>¨÷õƒ;~¾`ÅØó}ÕÕê„jéuBÕüàŒRÂ*G!lu)ƒÝË)à¾6<קÀi·xðÝ
A;/CÔžPHØi‚ Ë=Hßøõ‡1À=âbPz\ +‰¿ƒ„Ë!Û:Ýþ Õñ.òÉñ‘ˆ¾È7შ—¡ÃQý¡¢lñ‡ÿuXkØÍ@qŒ³å» +,Ê.`fû@ºü +ãý·”|øƒ€þW¶(þm†ÿšj¢¼$2_à+ØÏ’jù=èâ‡ñ7ewbîʯÇt‹[bs›â{3ëúiçÒl”E q`®B¤õ”®3@¿{ý–CÞag0†»ÉIðy¯&K¨×<^R¦ŒÜKÓe<"šywqE’Τ*y{b½òVâeÕuômusü]Eú¨.ñIv
æ9óTÒ‹t[@â@\m¬5“@¼á;Ð gØ5,¾ËÀzÐy´ ÔýC^¬ïp..è•’ó\ÈJy˜%`Ü¡+8í”ÑÔ|ÙU|©ª%ù´¦Û¤»€½¥;‡éÔžÆÞ“U&?â—âzY'qÏ™¶øæ@Zel¤yeHëé·Nóι`õ^:V|`ý§â÷‘Ñ~ƒyIÁÏ´Äøn)ƒÔÁã0o°$ÜËt¸9ͤh$jê •úº”úœÓ)Wr+qí¹e)]ÊbB·ÈšÚ“]Ú˲P2âÀAzSéì +<æ@ñ¾%£eû×½+r*ôë³¢CRÐ*©Uœ•q‰+äýÊRHÎÒs”§©ùÚ*riN9éŒá$±ÙXD¼e´’:5ò}©‰ò˜k¤ô°m4d¯O[iüìAÜKòFîøJ½®úyíHu ÛËÊ¿žâ¸Ý6ã®ë(¤ßäÌŒ—WË‘J«XUä+N/2X©§L–´Æ<3õfžÚ¡Ï¡Ý•ëhøZÚŽ-¾9ÐÎ"ZÄÁ²y +”ì˜=VáµèCMÀš¡³‡]ûjÂ|»ËbCڬ؄#‘ب¡3kel^¥P$-á*UÖ¬\½9Ãj40ÊóôŒsf-ãšEÍhÏU1»” +æ¡‚ù˜gHGè+ì@Œ _7 Y¦@éöY£Õ{þUç¿z°áÐÖ§u¡>wª¢ƒ[‹1ñ,b]•Y¥Êä•HùÒ¡Leäéôúl‹QuÒ¬`ÕZdY-IV›Q¾£gu‹DYø¶@Æé< â‹üŸ…›¾ƒ +÷™_Îx:Ÿ÷[9pá Ë£ó!Þí5QÁ-eè¸ó'ð©Õ& +㤞É-Pq$F™D¥kô +É(á›…Üš|·9ŸÇ»eâñnkx¼n1—ûP` #•±|"ÈœìÀ„ÌâŸà”ÛôçöÌjò]Ñwéà¦{MÁû®×E»P™[[’L(Ï'1¬F:רgK´j¡J®PêERƒ‘+.4³Å§ò3ÅM7óXâN-Kt_Â>Úâ›kéDP"ga^c¥'qö®q÷ÜÁK>Ëž^=ðSgsוúãGÏ×ÄÅœ*OJ)*J¥çåS9ZS¦XžËW +tr]¶:Ç¡,È£+*,4EC>UuÓœ®ìÐ¥ËïKÓeÝ"[ +·ªâÇI£g·M¹¸kö@«÷â‡76Þº|tïŦðÀÚ³1Ñ¥Õ|~y +M_LaËL‘ÀÂQ°M-à ͥæXL$}™9UÎBȹn&ê;t$í=)YÓ-²0Ç™ºe pÕD¨Þ`ÿ©ÑÅaèŠÇŒç¿{9výî¿áZk gÃoaGª£Q…uèdC
Žª¬ g Kév1[F?!RS +Ôz‚ÅdH¶œ4%Yêò0ùÿa¾Nÿ©Îû8ŽÿŽý¢˜²u‰©)¦H ‘dß9„sç8gáœ[ölIƒJÅ´\u]Iãšš¢G£1´h™h’êjs´P²„+]Õ¼¯ß\À¹}ÝxÞþ¾nü~ÇçÝsDrü^½ôûG{¥«TAÙPIþ
ä=uzµ:Ú¬5>tÛk¿½ã¢7øØͤ﾿Mw/ukÛ
zDs7›u´#)yÿÏ)òª6YAÉO9e;Ïí‘·TÖ¦þP{@Üüý!AsS¿¹µ‘wæZCRsÿÁ?UO>©R…¦j¨&;Žš«áŸß¨}ºüúäM[¡‡öZ +W£}×^îwÿ±76ôÄMãàU¾°ºK,ÛÕ‘–»³=«8ãRA…ôbyµ¨¦–ßÚ°ŸsáÔ„ÖõÌÖ«õ uìŸTqZžV¨‚"²¡ÎD
'Í(¸`A™í^IyÝ¿’20d«uû•»Qç¯Uë“P—¦è Æßãi5w¸ü²["I^OjfƵÌ<É•üawY9¯«¦*¡³¡šÑyê;zç…Z×Õïè]ÿªŽk^wi°T”ï4¢ Ù„ò¥Ý”xwg 10dB¹õÖV»ó»IÛ°¯Õ™—!NG£|÷=‰‹ªxÈaåò~iªäw¹\p7?—ÛW^Àì)Žëm,ím*‹îm+ßÞw4XºýÆ‹Âèk/TA¥!G—Rpn ñôª.qï¾.qstå× [ÝÖqÓ3c>VÇF÷¿¡nÛ=RøŠõRÄL{‘Æ
e‹øŠ"I‚bw:C±/ƒ¦8’hÎŽº˜CºžñB‘ñh$3bà\ÔPpJŸxÖ®Côõü…èy¨Kü2c¦~þßëžq_vdÚËrßT€]åûp·Â÷tŸìInpú¤˜š<!‹IšÈãN”0Y{ØŒ‰\Úä1~ÌdsRÔd› ò}·0bê(|ü(ltT%4êƒç4ˆÞ_µˆ+·µ‰ögºÄY¥¹Æ)¥ÝâF¥«iÒó›r¥¿M¾2Ì!sŽæš:Çñω}•² +ëÂai&Ü–Iàm‘„ UlDZ1ÀXK»uäÈZOŽ;rplŒ@±}v;„ nS0œqÒ) +Ñ8¨NÔa©ZVhæa®ôEp6äb«)þf1³ˆDÌŠp°V† qURV@fé+_}냊5^¨Y»
‡Özâ¸õ4[{à¼.ªÔÖN!šnÄá‡Q=¥A)ƒ¡Z6Ì4¤X¥=&ôcຄ +/Ã"ÂԱ˼Áüë6pͶBhæérwr,¹"×ÜÅÎØmá„Ú¯7áð×8±Â§T:ÝM¾— ªQmŠ_©‰a¬Î†¹&
–:TØêÃq‘Üõ½àe°_¹!l‰¢–8ƒ¶t˜†àÚC`d‡£
¯G¶±- +ŒmPjbjRJ¬T×F\GˆõºÅ +î¨/ìûÑó¬Á˜ÙøáØiÆmœ>MKÿH{· +D6XkB´A2]d» ÏÛ¡æ(¤["O@~bN{@¶×i‡ 9‚ä–ˆZ£ ìˆFÒõØ?x¿Ñç9ýŒ Ï™ÓÌaÖc<áMÜûãcüóøyš*“·K"Ù²^rò¦ÎÛ¬"/c”›cWŒŠø—üȬòƒ¬>iÇ©œŽFò9úÑÏñŸÝ¬…ÄÛœÜ{¼é„çü1æHÒHü„@Á˜æ?ŽŸåô³”ñªü¯!i&R×i#gƒ.ŠœõQêi„ò@sTn·BÇÅäçz!§<èyõ“¬1v>õïeJû?¢VÞ¬ #éCbhšw/eŒ=(}Íz›ú,~L:Àœõ%|H¼Åžc«‚d²A@6ÈÈ}“GnÞR§Å¨Üj„=˱—j…*–ÊÅn_J2}ò‹Ãærªcf32gÒŽñ¦$MÂIñÙ”qÁ¥´Q~÷Ž7ÜÞÌל¡ìGÌ᜻ ïvÜfOJ¯s¦E]¼Y¾*H±P‡¼éåk´P´N•äæÝëaˆZ¿åØn…ZÆÆÏÕwe…ÌÿCI~äT~%c"«Ž7*kHN¤¿ÉT$žßùŒ÷Kácî͢ܧEwØ/¯sG²»xïvtð'¥—g„ª@B6$“7ýù®Ï°&Ï5àoÂTÜÚ#¢G¢Û:«â +Þk0‘x—Ï¿ÃæQšbF-•£&çð*ˆE ¥‘jQQDkbaÄ 8?RŸ9ÅQ_Ñ3£æ‰kỵ@Òó`„™‰ôãú ïܦOªË_,•Zí_¬t86]âaªÉ¿e?œõ¼'#¶‹èa
<˜RÃN`V0epIt&¿ªæ‘+ÄÙ¤FI©7)ƒüD”F™ä¦P^2’)³$9enUH4 ïÓqé!uL(Ïnø_©ÙŽß+Ü;WcÿõT…û¥•]vˆgGjx@c5¬FÈ¢”óøLGçŦ 1¹¢ôèRI +.INë–Ê迈“è< ýE¬˜þš²d ÿþ^mŒdÈùF1øPaºí]í{fê펎«¯_.õ¶íÎòhÎ"Ô&“ÃÊ%J¡ËÌå‹àL8YÂVˆ¤±E1³F*dÞ‘ Y“bÇñ±S,Aìu-Ÿ3ÐýŒGr¤kƒü¯uAééõKê‹[~²0zÑd{d´îÚ…þ +ŒÍU€{}.ο2ƒHP%G“s%F†(–¤1/S”ÀUJøpµŒ·É`î—«‰‡á)¿ŠFÐV"ЀŽÌ¥É‘Žì‡ò¨Îÿ+Oû½îÂæ¹–ïvN¶YzØàr¾G}ú¹ÔÏMÄú•dGàóÒ©äŒäX†\ʇÅ@˜.âÆçKX‚ +CÐ,‹Êñc LÁ3˜ÉEGD¯æs†‘#9²h¢ÿhÿ©>¡÷®ÉdëócVÆ÷[œL:ê<¯ÔWÞº^^r« —™M&É31‰©\_.âs¤)"†$WB—I)‰
2’¸_F‘Œ ©‰“0U8M_ "X»Ð ¹“ä=SvXk¥î˜Î›ö³ëž÷šn¹kyð^»ãÙ–F+ukQEov1›¢ŒŠJÌ¥Óù +›‘À£§ÉÈ) +11¹8)<¹^JH¹'HFÈ'¹‘Ò阵€(ä|x'È‘,ùûÐ Êý¾é+í×=§t'†Înê·ø²³ÛáL}››eYƒ·K^m€wZ%.DRÉ/¢ÑXJVlt¾€KÊIŠÏÎá*qˆâ¶$XÑ- Íb3'a\ÚtÌZ +É5@;ãØçA‚‰_°Ùm@ñ%kPkjÚÍ~Cf–àõeK0»ªÁJjn@A•Ý((ÿg4”:£I€á?|—kXÌyÇI*§xè ‡¢$%ÏçRtšæÔšfš™f¦fjjš¦3Q*jS$¬b…°ŽÇéZ\«ua÷bí®'¤„q˜(Õ÷ùïîëñâóúþ\×}ÿîßý¶Ë
Tp0ÊÄzS¼çs¼ˆŽ(2âãA·Ùîòh¤¯ŒB–mT«Â‰c4Û탱Û!û× ÝÑ]Ž~è^닧¯q¹‹D:ÞM"µÞ!‘ê#‘¶M)†ùÔXë‹ag˜ +'ãd¸›&Án,ÂD#fa$È‹ÂÀøO0¸K!´ðG¦¥”–>(¶òB¥µ'j—º£ÙÆ
‡m6 s™+.\ÔIç9¢þM©î‰´¥D*€ñ9æN`±Ë(°7Œ…‹ÑFx‡!À$áfþˆ™ãƒ„¹^ Íó +Œ'Ñc´þ-uh“&éÝæWä‘ؤ/1Ï(ˆê£"B`÷pà÷´„È7Y®³ëke¸9òâ¬Ë¶E¶Ô™ù®TxAT€´æðGLroœàœùÂîŽcþ?šüK¢–ÞO~K¢RÞSŸS?‘{i_â§cÓ#:¢u6á¼J‚UÙO‡ÒÅjoS„š£p³ +’í'r‚"DzR¿qÉÎ1QcÔç´ÖM#¼öø)'ÉبïXךäækF/û%m˜ÓG{Ï~B¡?dŒ%ÝKžˆ¿ËD¬.À±š¶±võ¡X5êu3QâiŠ²`sl‰¶BÕE|çq•Üë³¢0H+«Œz/©‹}+ÜK~Í?Hâc½dŸæ¾`vóŸ1nûèOÒÿ¤
¥?dhø=L-ç6k”q“=N¹Æ™LÔRî +=d,×GžJœfb«‡ *`[”%¶‘íƶ¦¸h‹¥>U^Ø°¢ló`æÊóô=Ì>þ¾Ô§ÜÃÂßÙ’G¬ó¿0odÞg>õ$Èn±Þ¤_ç¼ç_Iá\âŽ2ÎsÇ)º +Û$·ŠZ¥½…-™Š½™¯2šdA£ìCª.þqÈ êþ{‰™¨'Þió:ÃÑ&šCŽD,{Ú–°îÁ^¦ÿíú´è«;2(+r9gJ‹' +*¤GUÕY‡s”²[ó÷euî•-þFv½¤Aþ¸dOöse}ö¬Nñ6½Vñž¯ð Ùâi(&ØAìÌ;}ì_;cä°›ñp‡ßüþï‰sº»Ÿá£‘}¹V’t¦*›ÓY®´—–IVeï˯W6嵨÷ä~[T—sªd—âJiuÎýÒje¿j§òeÖåkq•ò@H[2YDÖ,%¨!æ¢i¥ÞäAGƒ®Fƒ>sÿ:jùàhìÚ[i~Wš¹¿ß#J:Q#g·Wå Ú*J¤-e•ÙÅ»”uMêjõÁâ*Ugi¥êrY…ª§¬Bý?u…z@Q®––«5B]üã ø;sÔýŸîúŠk:Ëâ +ˆ *HDPŠ¢]@?«®ŽÀ8*£ ~ÆYѳÿÝ}ÎÃ÷sÏïžsîÁvÞ:Â×{ˆ:,¥—{íþÙç²ý~'ÍøöÅ ×B½zj£Z«øÜƲԨ3ÅY Õù‚ò¼i%9Õ™Ùç²ÅÂö‘p0W(œ‹D/‹DË)¢ì·‰ÙÙïy’@4–!M?a{g6—-—KRï.›‘~°‘4à¤q·‡j4Úh¥™ëÙ^åß\“À«:Y]ž_^š+(.*NË/¨Êå×g·ædˆûÅéâ)ñ±üÂŒ¼åÔŒ¼·üñŸ±’@Œ:ŽmÁC–ã–§yþSçnÂë~câó+™‡×Ôǯxï¹Þ`×Ýìq±é°_ýÙ8ΩZAdùÉô¸¢ +Ñ‘¼òÂTaiEfFñajÑÅœä¾Ü#Eã¹É%/„ÉÅKiGß$¥¬ÄI±Ø;8®Œ‡Ò-88½
wà>\ÖÂ/é~½e*=3rpëÍAOƒþ^?Û¶¶[cK8£¶™Çþ¹!)¢èLj¬¸F˜”UŸ’^Y–‘\Q›Å/?/Š/¿œ[>–_ñL˜ðóRZbÙ›$þ‰•8I ›Á÷Þrԫ⾶oýØ{q{nvÒhã䘽Úõa½î†õ…^–k]g¨Oå¥hVñ…Ä0qÓј¬†ÌÄ´³âdÁ™Òô„ÚêL^M“0êTWöᚢõO„Ñ5Ki1Õo’xU+q’@6‡\ET)á I}îQFË£Êè×{*èÞ´!éæ¤Ý–þ17ݶaŸ½
ƒLçê¾jiO$3¯#>$«M•Úr,îÈ…œ#qÍÅ)ÑMUéç2CÎuç6Žd7Ím\N ;û–~æÏ8I «ý“jÐ÷ôû€<z<!‹>TDôˆ×fl”»¦\µšoÓ,jo:”
{åFøeõDzS{““zÒbb»²ã#;„¶Wå´×§jëHjNgv̦³Ú_Ø-ï8çßó$t¬%dõòèi×F4;$îÝ‘FSÉhä‘ŽTïì^Å–8í¬›ö6©˜òÛ_p›í&£§ŽÆò‡ùÁ¼¡ÔðÃׄÑ!ƒqìŠDæÕú$ÿ«íß!c`Và7ð61 ÷=/°{5J’qP)‹^^ ¢Ù>º;JB·f6¢ágdt噡mÁB¾á±ƒFÕœ§AÑCƾìû,Ç´™POþÝhÞÄÀˆÉ6wBš(ˆ¯ˆò¯¡wðhãñԉ9mb%š~óc„ÏÈçPI _}8-…æۤЫÐè
<F=¯Që+©†ß¬äO¾8°µø¹»Žè)Ý4miËÂuŠyåþ(<Ÿâ4'ôŸ+d1æ*9´¹s\Ê\gˆ×ühˆç£'عìýË_lï{³$2ZhBhº›€F®I¡+“DÔ>/οQÆÕý¡·¡òKrák{5áï.š©ËTƒÄå@ó˜%®uøR”=w1щµ˜ê°˜íá»XäE_¬¢Rè^K>KC÷å˜×÷Å/>î/×i’¼¬Eèþ%„Fûð¨o”€Zgˆ¨aAÕ¬©áË×HùkäÌU»-É«ÎÛãV½´"WýôCW9FœÕH³ Õ«€Õ”}¾«B[úZÁ~ÊZůµ³/9º}¼êôã§)g×OÿrvùôÁÙeíßN’ü‚õàfB½ƒ8Ô2ŽGu³R¨bE•|Õ ä|Õ#¥5“ã¯ÛlŽYwT
[÷Ð`¯Ów®iù}ÓõùÆÓ£}xÏØãù=×Øý{©ÉPcæMæÎÐeáC–0cy^aÞ[I2Þ†P_B-7:=ƒPÙåÃ&\hŽ‚Ά80’‰€½dØÌWPÔhà¿ÍØØ'Ì
bpÁN'ÈÔt„<ƒP¦m§uì༮-tëÚÀõÝÖ0yª'I7Vÿ:V¡Òy„DË8tp|PÃGÁ."ôIL0“a€<7y€»¢+ДœÀ_ÙØ*ö¶ÅbTm€¯¶Ò·ZAÎV(Ùf§ÔM¡QÝÚ4L _ÃnHt©«¡’ Ÿ#”Dd\(ãY Nðm"In`!í¶2ÁQÖÜä¬"o¾d`n2ƒàM&¡`±Š† PÔ‡ÌÍ»!³”+iC’4+kB»Du£Øý±d- Ä_F( +â€ÎëTðn°àÚRûÁ¸Ì7X‚5Éì7óFp—ÖŠ´.0d´!PF8²;!\vÄÊj€@ndÊ©XNNÈ«ÀI‰€¡C +*È°ïwû;ýñüÞï9û]笇ظmÞ@èXø ªo#Dõû +âÞÓÂ4ß/¼¼ÀqNé6KLMè(£)|„Þ1LëÜó‘Òƒ"_ǽ'=ŒzC|KxEúŒN™Þ÷ˆ +÷i~‡¡·ÿ £èh/y¨kJ=@µæ+Hö›šà ‰p
Á}FÍñœ@¤ë-ÍæafðG^ÑÎANEä;Vö¿ÑGñ43é%å<õ9éjôSÒ]ÆCâkÆ”¿¨wéS„߀½Î€ÈŸ™°« áÖ +Ù4ÉÀpµ1:?õ,Ôy‹Ð7«ÜËásõ†Ùïëœ_ÔïpyP]y«”êÛWÀÙ~1GyF¯ÀŸÔ¦ÐŽ'XGÔùÜE‰ 6¡&¾ZÖ,«”žL(“ô %Ò;HiÂ{I 2Â+F,,ò…jB&)Ö +nE>rSiT½‘ÕŸâòÕŸÙyê zžúÕóíß¾§C7uÞ27Û‰Z»¡¦5/[|çüÙ²íÛ[‘Wjˆ»Ê™ÛN™ø»[ó¥QMÙ*jm†–U•–É-M-š4åcR<7±U‘¥>«4¨¯©2“_%di> +35£±™šñèLÍÝÀA»€,²tÔy]l ÊÕÆrx¹í»OûgæõŽwÛ‚_;ñCO=aCçAÆÖ¶2îîfS<®Ö¨ TæhX%™ÜB}¾0/D’¥=$קUèR:U©)?«RµÏîƒH§û‹«ÓŽ1tÚñhk +œ1PíŒ=ö
fàÌ<Ìý^gÌKv½üœ;φº¶žÚ»úp;iSe#ÔÔÌÝ“Û &èëZJMrŒú`:/¡2O_^*”ÕÊy¥ÇNi7Â.»ð*Åü²a^\‰…W<Æ´HÑ=¤;aà€f¤~.æaûl̽ós0ýW0}W–Ûuõú8™/l_Út.Ò³ºƒàWl¦ÿî:jòÊà +µ,ƒ0Et +Ø÷/uÄÎsYq[[7üsbMóFuaÓ¶Œ¼ÆÝ9Y
ßækê« +Uõ
EÉõÅÊúÞ┆¡uý9©§&ÓÓNMitÁæùûÉÀ÷tò°‘InŸ3 ×.3ÉÅ^9w©^SÇ°öV¸Õ‘|§ýפœŠ®”Ð3¢7\X%XÓQ"ù¼½L‘{~«:ãÜ®ôԶʬä¶ã¹ò³õy²³í«¤m½«dmC9ò³Š–éTeóŒZl7$chäI-Üif+íÒqAÎÞ3$M‘SØÌc÷CVöÅÚïê{n»ØÐ _}#/¦àzq|εõâô«åIª«JÅ•J•¬«*-±«A#êêHO¸r—ò{š¸kJ•xñ£BrA7좑þ£„Ü£‘«tÒ~NZn2Iý##r¢ß’ëw×ÿöY°Éî§QÖÛž7<–{—<LÌóYÖý¢È´{ëx)÷Êãå}"I_¥DÔW%ö5&Å÷uÊù÷îÉù}ÃÔzR"èXp"]~«$äÁ„üÒ¤GÚÏÑHsœêa’ª§Fäà«%zû_±™ÿ œ_þr¥Õú|»âç2×UÏÕ^™ƒÙ~©ƒ…AɃëB“ÊÃ%»¸¢ÊhÁ`U,°Ç숋}Þ;ø&.v`œûoÄü?OÒ]GHÇO„œéÔ#'oÐÈÑLR9<Ÿ|5bOûr„Íܬ
˜Wª
7/Ðò¬³µb;6ÙI¥ÍtSh<eÚµÞ‰Ú-œíN?ÁÈþ€¸‘£±#?G¿k‰½9:°"òÝ»®v.„û:õœ äB!Í穽BÈá^=²ï)ƒTLšém´§•Mz0‹'ýŒr'ÃLÓ§¢ÍS¦„‹’¦’–H¦RmEÓ¹ö‚ébGþt™oz»KÌÌ^×È™ïܹ35³Mžá³ì°¹Êvèì” .5ÒBAíEBÝ"ä«Ç„là ›°Po
–ÒòáÊȇ¥B°±+Mg&„Ø<JËh¬¢»˜K=@±aI¶Û¬ +Ó¤.B¶Y +^Œø3C±Â \–?bY>.‡Ôˆd#hŒÝkìŒâyË°q¾¾œo‡oLlqÄd)jMlpÆÔ-:¡2Ø{›-O)zIHÆ8!J"†‰Ã½HXÑ>ƒ--Ît?xÒ9ðÑg#ˆá†0†¸Œeˆe:@À´ƒ„i¥5Ò!—e‰–96±Ì°Ãpõ\€C†¦8ªâÝhˆñÕ‡" `BÊ‚,ÚR±)ÓÌ!*²BÂk÷Ø þ;[ð«íÁ¯s@\‹#âÎ/ï’x7)÷Á¤üîÞ{Ê4æ<ǃ“.Ÿfàqèqô!ócB±‚E”1ä"SÈTæ,Bâ¦%WØ"á€=„UŽœ^Ájo›3âv¡›+øw)ýnà¿¡ü×ü) +>ùH™áÃmŠW] fà{Ó!ñև‡‰” T\c¤M¡PšC¾j1de6î°Câß!>êQD®Hhuƒ°Ã«Þñ„à)å5‚Qʤðš£LÀžÀム+Ž.Hp¡AêF‡Ú•ŽLwò8(Xa„‚hSä‹-‘§^‚ìdltf‡'Ôß,ÿ˜rØw6¹&`FQ4%o™L::!»öAz;ü½ô׈QÉ›•o%ï¹CÒ¹ˆ7I{-GÈKŸ+à¯DÎ4ÈéÐPý*êy…ÞL”a5×%B)mPëø1oûLö6ïÉŒ=~ãi‚Þ«…Ž¥Ô†&7rGQoå1ÃI×yC²‡üWÒWñ/dcüùlL¿Üg)¢BèCBt˜š!Å‘Ž,ªï:飔Êc}€!Ê"LPÆ·À:™ÍÌš§ñ¢bϱüM¾ïrþü6s_øæ`äkõ÷ÿc»Nƒš¼Ö8€Ÿ„MEqkK©ëXÜªêŠ {HÈ’„ì @ bØ ›ÙB-@"D@ÙD– +A°^µ£VP¯ÖöÖ¶ö^µuãÜ×ïùð›9ßž3çù¿ïÌßç)1à ÅŒyDêÆ>$
…< Ýù‘ø‹ô{“ú>pš}n0¡—• 1á[ n32Þ+øÔù»$lw€Ê} êðb¨:¹ò»î•‚±ùX‘Û¯QòƒÏÄ)Gó²¼rŠüï…U`î0kq·è&üL¨…xƒÖOš¤“Ôû”1êò÷Œ·¸Qf#ôêç@O[ a#²ù’O}k½Tmµ‡ê=Ž0ÍÃù}Ú‰ÿÓ}‘BÝüs"o×£X©Ç}i¢ç¿$ß6h’WŒ»ÆÑÆØõäÑ°Vê0³+ô +sˆ~™1Íèe<cô°^“{¸w‘;ùÐׇ޶@2òáÈ|)Ò·‘»¨‘ldº9Ìç\ø:÷زßsüW?Ë mšU³wßN’xLÇÅyZe)~W#31Ãâü ”ÔÏ«¦öp›èÝœvf'§eaO°Î³çØfî_¡fÁ<±U±-"Ø,‚¾¶@*2—ÌAzoò—h˜±
µ;ìß|ãôgÑá%Ï‹N®šÍÃo¼ÉÜ5¥zŒ%EŸŽOôˆÑ÷Hs ]:ŠE\jÖ1[çØ&~7§‰7näÝá6~k¼§ÖG@|m$ÄÔD +ã¾¥^‹t¾
hXøµÝ«’=Žÿ)õp~\êµòîiì†)mè®±žû•ÔHÏ^e¼WB +¶]žIl. š¤¥cd5«NÒÄ©[xÑ _/šæWJ~ ¯’¾¥ëeT!ƒ¸r²2=H¾«@¤F:Ÿ+êCñôË +7ûgUüTu|ùL)fýxÕíJ.ǽ']âyAëoV)±¦D
ÑŸK«Õ1
Ñ•ìJi=·,ÊÌ?Õ',Ž´ +uÒ§üâXäK–ÏStrˆGÛù‘HßS"2‘÷(Z‡ú§l#ê7Ã6»Çu{ïÔ]v½2ð«‘Òξַr„ÇÛÒe~Íj¶>9•X”E«T2KãËØÅò^Qì9A~ÌE‘6fL”óH˜ÿŠ•¯ø@ËS@‚V±¶@ö((Cú^ò +dŸ!o5ê•Þõ¼n3úaÓNû™úÃKǪý]/—wtë˜ÍùüãÍ9Q~uqÁŠXžšN-Qå1‹’J8yŠj^NB³03¾Sœ?*ÖÄ?g$ý—“©zš©„$ÎŽä é{êå +¦:¶ GÛ.î5y¯ioÀnm>KÙW£g®(žÔKƒò‹âñÙÉ”4m#%'Ÿ”]ÆϬÄf´‰eýiÆ´$:û7ž<ç-3.û#%.lb$ŸzoöðæÌb0[·Ü=·Üê\&:7¡;ö/êj;ñE« ³¥¾¼W_v¨¤Šï•_U*Ñ”(ÉɧÓèŠB-K^P•åDjωÄÚ^±H;)–äÿÊ‹*|Ë”|¤Jó Á‰d!ÙÉÂ"ð¤ÒÜ5. +»±0”i¬dÒŒ,Š±‹M6Ž³ÉOÃhoht#$1êaˆ-0Ñ ¼Ôp·€ÉF;0rÞô]²Ãö mì3`Ûfouw)ö^£ÄlÑô“w+{™ßÊ/ñŽJ»#¼E]±þÜJË’BïÈ'Q:*(Äv#-¤½3×>ŽxJ÷¿!ÛaɃm© +Ÿ +Ï|:’‰Ða9‚‡äz‘… +'¢\áŠÙyž0—ù¼.©ö+\2lZñb憘ç†ÆØg¹MñOs¾NÐÿ=ɪíHéÓžK{¤¹*¸¯¾+¼£y&¸O¹™ƒ„î\Äýœ‡ØÄÜ0þTAt¾LÓÞiñ£½/Œ±v¨NuÄ‚—7óužcżsæšëÂJ>æ?.\ÿ0sÒ}ãöÔ»y»ÒÍmßÎ9,¹©?-íÖwÉnèog\Ó?‘]Í}oDÚå|$u™0ãRâ.`ú» ¡ïÏ÷aÂÌ¥ùS™¨¡÷¨á .Éá͇瑲=ž/4ñúç[‚–/Œº[¶$þö¬•É¿¯Ü(Ü*ºnÚ)ý1wÆ÷ÆòËÆŽ¬K†Nåw†ëÊæ=RvÎÎ<[ +b}Íî_›`ß»FìܽRÍý¡Á|±~vLç‡U §kêÇ,“´W®–ªøTy |«zßœº–Ù_çì);”÷•ùŒq—ùc“ù‘¡É2ªi®@Vs%dM•}Q á»OsçÐüÚ·–ÐYVp¯Öø3?
c>ØËéÙ tº¶Få}i¥1è\CiÌÉÅóÚëÞú`±´márùÞkU{*7iwÍû<狹_æí(o3~n9‘ßhé2mµôšþ:oHßXÕ¶ÿf»>£šLÓ0 +«NZ
’¤ ßÚ4D•¤#/ÌC +ÇÏ¿+2T¾Vk·Âró·ðRº‡¸ÐtLg¦–¼åveàî뢰%1Gz;ry³r)R~1½)£Ü¿>½ŽY“ÚƪLéa‹“¯…‰’&ÃK“—ÂE©¿±Ä¼u¿òsèæ->‡¼T¡ÜC"Þ{Ù˜p#¬WÀ¿7ÁÛÆ°ØnAœ“:hO6zIüw
V°zE'í:JâÛÓ<ZY”†œº$Kä_É—0Å!¥¼Nvqú`Xaún~únaÆ?CŠ3ÿç/ÌF4Œ\’¼U¡(|ɺ€rõpz°*у_Zõào2}øNfF˜¹xDk¢ÕÓh¤±S! ÙßUu¸]çÔ"Lv¯/â“«´rA©ßùÜ*fIvSHA–œ“—y%<‡?ÁÍÊ\àfgýÊÎËý=0_€è#«B'ñ-¤âÍ™¿ÖÄ:xwjÁ‹6XìÔ…G]; “òÚcíî›Zè;z‚-/I"l[+cëʼnnÕçyd±0—VZTìWTXÁä7°²Ùü¼þp^îMnzî<—'ø;›_ðßÀ¬"ä‹Q1Š*‹ï€§
¨P–«ÔáE³&|I¾ëљ˦„‰nka¹«a_û SykÐ^ic¸MCí©cÕÕ ®âŠ4o¡8ûD¨‘[*Ì,©cñŠÛØ©E½aI…£ÜÄ¢9nbñ2'Eøfz)bðJñ?‘RDU…âp|Mø$T‡W<mՀǚ0ק“ý&0ÚwPýj·‹A·œº½ýbàŸ¥ëšæhqÙã%µ)^ù5™>9Uù¾ç*Τ‰%ÁIeÒÐQ'Nt=ü´hû‰/þÄL¬@Œ¤ +ä“TŽ¨ªPî![
–Ë +’M1e?0Y²~¡rDãÈ…#CdUˆðVð—€&z 0Œ·_ÿ@Ç]=h»»‹ÐxÇV³râ¸pÜÇD0`Æ¿ÎÞŸ:esöZœÃé¡dçè¾÷jûJ•¥h *d¾þŠAC1…½bø)VO(¾P˜ýÈóTµŠ{økÀœànÀÞ~ýx{Éo¡eFêg·CåÌ5á='ݼioãs“~¦)wC,âïDì¹k5‘t$ìÖ9Ç›— ñ27ÿñzOß1™7ml€â36Eñÿ|blÕ‹6Š<è£È•~WõN°P0-¸Ñ Âù7š§HP5¯ ¢#(^ØCÌ}l¯•ñgIó´q‚LOÎ…›sž²d?8{ øÏ&`V`ǘ9Ðfê©32gòÌ ‹÷ì´‹×ìï™ÎÞ÷‘#ù:JžþÚR%Àì€ñn€+Wqþ
œ÷gåC5(~¢Ù/õÿr!õ…µZÂí˜çƒÈçÆœ%¶ ëYôÎÀgñf~ÏÒ÷Ðóöù,ž·"/Öò|&³öx6dã¶tÏÖméG·ÅU·§ëÖnߣCnO¾6ßp»` sçãýY9P´@þ-HUÂYå.B¬ò )RyL“£ôØÀRÒ7*ƒ71”[hÊÓßP•)ÛÉÊ,SOeÉNweÍn×å6s—e……óÏw,œ~^´p\þ·…ãO¿›;¾CdòÀÐe€.|‡-¸ƒŠ{ +5ìCÝ–è†á^ôûÑpZÅ>}¥w ½Žóñ
<H[ˆÅùì_ +Ö°Dáš{PŒ¦9JÖÚr´w¢2í¨IÇué|‹†u¶£©
&è9öæ+møªïàü‡8ÿ)@Îg)èk +ñZHÕ2E¶¶1Ê´
±JÛ +ØÝRÀV$4”³ˆeÓPͦ‘2‡‰4/-¤ñ§!E:‹£
>&¦š¾Ïµ|[a3Soÿ"jÓóˆÎ9O•=®Ãw¹ý60ÿâ÷åG=ïÊ/xß‘ßôþIþÄûÅ;ïÃávM ×+˜3 çï"ᨠ¡¶D[1`Á@*é»ä&™ä™äËD3>¤+õߤ©L_$«ŸªŠì~YTã|?®Ñõç˜V÷±è.¯Ÿ¢z}nFþ•s#bˆ{=b˜wUyÚwTyÕï²ò¡ß¥ˆ7ÜQð>³áv&®§cᢠa$7ŽôÞdÒ;3,È!7É#÷È÷ÑžÈLÏ Õ{šgú c ûNÚr‡“ËçÞPÕ¹_Khößȹ×Íû&v‡ß……ýüs1ûÎD
<}Ip"ú¶àXÌË€‘Øß|ăs8žÃ‰p'Ü4!â÷ι„t¾l2K
%Îôd©s¼ÔoÚãbɬ»Ñ&?æ$³¯«3¾K/šw)Úó|ò*Ι¤µ¼“ªÿã‰=GíŽ:PôuÜiñ¸ïÅû㟈ö&LîUÁw( œ¡dx
¥ÀC¢Iîb’¿Ì€B¾ …R2Ó +{Æ›*WúI5GûneÐŒ›eJãÑ¢Dö¥åéNg³óÜN¨Ë½Ž¦¯ä^Òäw0µ5ð@r—p_R¯hhñÉ j_Ȁ꘴?ñ²lwâÙî¤wÁ}©èKƒoßpú–Â[bÉ
RH~6é[EFV˜Q“µlƯuNŒûõîÌ×èŒV+Œ.”ÇYŸ*Ns:šŸív(·Èû@VoŸºž?˜Ñ,øréÆà=Kº%}©;¥;RC·¥Ë·¦œWô$ßVô¤‡ô¤CØ“ÿ/ÔàMˆ7&wУ°œ(#³ÔQoÌ©G³©±¿¸0®6úN»X'3<Yc}¤"ÉñëµÛ¾Â|ï¿å•óúskù}Ù™ëE½Ë6…ôdô†~žÞ¯èZz ¼sé)eûÒ”í/B;ÔEYìÌ_g.¸š`HÞ"é{ºddŽ:}êe“!u¯ÅŒº±Î‘ñm3—uºQb0ReõUÊqhEú¼/Ër½ûŠ‹yÛª¶æ5uç6‹»rÚ¥Y=ò¶Ì¾°Võ>åZõñˆõÕÈ–¬gaks&%ë–C¸>üõä_GTä·«Iß+&ªgR¯VéRZfQ·6èQ£mvŒó>¬ã-"ýƒ–{ë9ôצÍÛU™åÕ[^ÈÛRZÁï*^ÔQØ$Þ¿A¶.o³¢9wGxSîß#VçŒD5ä\ŽjÈ}¤\?!m,DPSÖÃO’È;ÈÒ!oQ‡z½R‡[3º¹~:õ¯ö™Ô7³©S½´·éío³hŒ³ßUŸâÚ»RíÕ]Çí\QÊo+¯®/]%n.Y'k*Ú¤XU¸MYW0Y›?U“)ººàaDmñ{Ùg¥Õ•AP_¾&¤ýç²(T°¨ûõLêf‹ºÖ¦CnšAÛlMÛä¡õU»`Ö`«Ü|wóB»mMIs»2<;?Ëån¨-ö_[])XSY/^]Ñ,+oWÔ–~¡¬*é¬(9]Vrž¸UQþ.´rÄÕ•ÖT¯ iääiQo«hjl5M]_§M:Ï4êÒç:ÔÉ-–Ôp÷|æ¾® +½f–ûí?pfÃÞŒ¶ Ý=!)÷B’3&‚wüÝ7-•éÙèºï:«ÃÀT~!3ß·…Œ”1áóײ ¿~\·btžqÒj©ñZVWdx¢,Ò¬¬d‹°èX‚]~a²ãáüt—¬¼,÷ŒÃù^é¹Ç}w:œ}.()»;x{öÄìB’ržû%FeÊT¤A¹:Œ']HxœðuE:À€áÓL8Ë„ëM|èj2§Û$ì†Z%ÿä©ÀÕåÕá&E•›óËâŹ¥;¥™ÅiÎûtK+ÌóL)(ñI:Z㟘ןח7¼5ïQp|þo~ ¨Ü^ˆŠ¤B”«ÃD&¼Øð}€ê8™ûjh¸]Ï€Í4\nåAG« ÝÔb¯yºÑWYïoP|&lmþ©M–95q¢ƒU;öUì–í.ÏpÝu<×c{i‘÷GÅÕ~[‹bŠ.n.Š.zSüÔ7¶dAW‚Šm¥(W‡I +ºÛ +€Ûµ +½km•ƒb÷Á>±ûÐßÄî·§Eîó¶îŸ¢
!T§*<M:ÐÐÞP×
Pq ` óRGØ°st9$ŽšQÛFí™1_¹iF}åÏ
ÓÙ´,hd›~€jç*_Õ¾5^ª\#UéZ7ÕWU‡™\Õg&ùÆLþ匩ó_ߘ:¦ÎYl¸ ÷,yí +pö@U/É¿ý.?y î!6>Ö„ðñ!ô‰>±¦üž8Ð^“®LI
Ådð—©lÙT,Çq*‰+™N׶›>¬³~ºLW4Ó g3s‰'|:DŒñÓÏx‚Éžà ê©»ÔÐDÞa5é`á +Ó˜+ñ°Æ{X®±YËñ2kY|üu‘S—Žõ‘þ}ö.?æ@È€çO +©5¸žZ…ŽÔJTP+Л^†4#h=Œ¥upÍÅ,†–08XKt0ØØËÐÄ»‹“75LòU$ÿ;€àxü ™#€€0Ç%°uÀ—ÂjÔ}4„åd/KÑôP@é ˜ÒF)ÅAWJ½)
¦(Œ¢ +qŽz—øŽú’øš:O|Iãç~`üÌV=¥Ñ.hÖ`™ t
"ð7ÊN
¢qQTMˆÖ†›—AH†ç¯ü$2øĪ3šl5žcî ~è[ý>`Äô-cŸéÆÑ5¯éSfÐÿeþ‚~Ëü ý¹Å#Æœù}Æ‚Ù½ +ô±Ô +Î n½§—ƒOY x–—‚Çb íï- ô;ßÍj„®ÊÕp¾:£ÔDÇUè°ÊŽ0®ô\2ÔÌÔÛÙ¾ªckœY›,ͦ©&k\Âw‘U“ªEbÏÊŠ:Ÿòò¿’²NFQé³ ä ‹_r*(¯äVP~é[† |Á·°(B0ßl5ôg>B¿U t]†«‘€Î*Õщvut´c%Úß±–0ÒNÖêkc,ïl 3R5n^ÓÔb]¿•ãP+Ëu‘H‹<D5ž¥’ZoaU“Ÿ ²ƒÎ0y¢ý,®h*(Kt#ˆ+~ÃàU}óÍ« +_¤Å@&B/ñncï¼VÐùì}í4ÑI@ºõОn+Â@—‡fw‡¿î¶m!†ÍmѦõ-IVÒ¦û*EŽS…\à^R_¶¾°®Ú‹/SPyµíþÙÒ¾ +„N«šìÄîÙ‹Ýo—.ê3G½»\5¶÷RuZº‚õå;6–¶'XTªÒmËÚ²…ù®Í%¤Ü¦* +·±Þ‡Ó ¢±å;é©òñ€dùqf’ü3Yþ’žÚðÅ7½(ló‡Ðƒr„fêšnEèv¿Ã8¼¡Á¡¥¨wØu9©·zkËûWHw†‹{bÍJ»S‹:·Øó;òœs¶Ý³ÚÅäUWj›Ò7IÙKKPŽÒc•“ŒÍÊ«ŒXåZ¼ò/Ÿ%x&µ ãñ=¯pø¸„ßàÔ6„&z°ûáüáa„ºG5Pû˜j³W“ÿð:júL8þür“ +ÁêV.`ÕjåÒâ-Ñ>ûd÷¥³³|&3ùeæûþÞ#3ï¾0ÞÊÊx«’=©öKvçH–å»ÏÛUì=kç¿i;m_<eë*Õ¤-Ÿ‡OزE“mØ•e8i0’¾È,ƒ)<Û€ªÔCëðãªÿÎÁ @-Ý?+¨¿mÀ†ZºÿÔI`u'³¢6„³ü@Œpqu²Íûû³æ|“'›QUäþÞ¾YÞ•È'W.ÈX©ÌÞ³.$³Ü N+¯O)?®/o‹Ðïî
KÙm +M-Ãà´2TÅÛn– +¥®¶>H[Û4î@o¶Æ¤ÐÕ`€®ýGºLspf=À1Zƒýe +€Õ +£å°¢Óò¥¢Oô\ù\ôDù»è‘EÉ +u6~3p:þ‹À©„7”‰Ë?ûM$!Ÿq6òOFÇÆ’‘§5(n?î` L<»§h¼;Ãß$îðg±/ì䇟å³ßà'9}ÄÍr½Ÿç¾œ)÷XL×xÍs*}æÒêH3©-ä)”ÉäÁÀñä© QöâÉaö#ú {›ÞÏþîd_ÊO”¾4ä×{ù`¼{9è¸5(g†}/Çþ“go +à[™#|Yx +ÛCJdCáJé,K!½)—þ.R.û>¼Hþ_†R‚T +DQ!²5(à{îA‰½W°iÀÎe$ÀJæë÷Á/©§Ûô£wwT_ÜßZÉþ IŸq¤®<÷xu™Ø§B£ð/Wk(¥%•´’â†RÕ"W„K‹¦Y’¢{‘â¢O#ÅÊoÃT?1eÅ(¨°Q0dkP6¾ î¡;Î`͈½»ß"vŸ™&'3{Â@x½1ÊþZ}ì¾&ãe·ºjÎá*÷˜¾BtB«/ôS——PTZ}¢¬Ž.+m
–húÂDê©¡z™ÅW?ä«¿‰–þ›)*E´ü2D—¡ +ÌP¦¨cÔƒ +:ÈŸäùß@=eOR +G<zúØúYÓ([Ê +ÃÒµ³ÐŸÆƒŽL#ø#ÓZ3Äp'S×2'2õ¼º´há©ÔÑñä,ÉÑÄ,¿›Q ;ÿ¹mu\‘ݾé«U{¦¯w¨ŒÝæ¸+¦ÊigÌaÍö˜Ë£¯¸lnsÙÛ§.›ŽöeqhW¶D>FŽô +ÕÊÈiÕ…«g–$Y”(2m”y +qAn‰$/§ÖI.ovÉ’kÜÒ³{=R³‡d)Ùç=“²”¥ÈuMËaND’žËÄýJ³ð×TêCÍŠj@ÙƒÕÀþ`g>:kÍÐQ;‹k«ñÖi¬Z2E]±\PUnZV=CUœ`Q¨J·VåÚåª$YÕNéùM.)ù›g')v¹'(dñŠs²8Å]Ùšü»&ä3§Ä&I*`â‰FÇga¼4g˨”}˜öÏ=õ@W½:êEh[+åšêæè¨ÕïéWÕ•V‡š(«¢Dù•ñæ¹å©VÙerÛŒÒ"‡Ô’JiRqì5ªM®±ª·åhå'*o{D«þåºZÅœb‹™„ˆ'z” +㬖“ôu1¢ä¦D³„Æ«¸…mÌÚRûUõjÇÈúõNauÛg}PwÀ5¸n˜|ï¬þÅù5sU3b7ÑêÃ%z†©Ctÿ}ÀŽvÚ=7õ[€*J5Pjfqùoù–Ez›ƒS:B‰›¢Lã6ÆψiO3Úk¹¾Ø6¬VÒÖ*YÑÚ%]Öºß)¨õŒs`ë7Î-σZ˜Ã²f&^ÞÌl'ú–~“þLÏÁ êÿ!Êß½ÐPvK'í^Ûe·.=Ó‘Ó#Af'—ÚíÃOìÐÛl³=Rµ-Ö4²+YÖ•mÒYd±bkµuÐÖfÛ +Ç›žüàCàp+ö·WC|;¶wT°¹ÓÀYßíä,ïâ,îžçÌïüƒ3¿õ‚3ÿñÌnN¶“úßAù
”_zÓÝ×|Jù”ý>eû|¼ó5àr°¿£ÛBØ<˜«‡¶°xèóGž˜ùhfüìÑãL{Ó'é0yZLÖA8Ú
á³c<» +ãÑÇ0~2ãŸÙ$Êo¢üòœaÊ?Où”@Ù([ö@z°ù0ÌÃÌçF=7…é3˜¼°…𥂗î0zå
ƒ×‹ ÿz9øcQÐù-
¼7ÅÀoÍ„²1jîØ5ò„Œ‘ßþ«™ò+)?W$ÐÝïK¯ó(Û²(Ûâ0ý`ò +2=˜1™ ô™|f Ž‰æL<ÉB€ß_ý!3zøýè3:£B³‹äÞ$Õ”¯ üDú(â+Àÿ;`.e»þ
°»ª3eÓÑ)߀z„Çøô]" &DD,‰=q!^d1 !ô¢Ìè‘5.BCÏNMÂÄ´[:8¿eçÊ1OŽM[À1“ +€,æIÐøœÙÄKŸ`btVù`¦ŒºóY.uË»„ñ‹w5ó†×2ÖU¯&Öß½6]òÜn|ѳÓøÏ“óžMF<MÏy~ozÆë¶ÙI¯fCÞ¿›ðƦÇÁ€76ù#ìuç™Am„ƒa¡G‹ÑÓùÓÑý€¹Ä-ÿâƼòò\%ãÇ9ZÖy¿%FçüjMÎú®0=í»Öì”ÏfóaŸv‹o}¾°ø‹O¯å O¿Õ€Ï)«c>׬¿ñµ>èû›Õ~?lùµ¶èóÃæûü°ÙÇð\¨È‚º„Ãa‘h<‚ž„ÓèN¨;º:ý-4„ ‰£Î˘'¨Œ‡™Î×›
Ö[
0Xö4[ößÂ>èßa³ß¿›óµÿ~Û}þ'l÷ú_°ëñ¿o×0ÆÙ'([wb+`Ù5ÿ0ñþð¹Š@hl‰FcYèqŒºe®F9¡Ñ3Йè +n±ín³ßÔÉí +Úë°+èogÐY^GÐ-º=øw[¶kÅÀÖ[?‚0^õcºŸø_’t-‰…®Ä›¡‘:•èçýñaŒqñFûbe¦=‹²-º£µV»£ÊØ‘Õœvk¸íᛶ…No
ëæo ;(Ø6ì¸1ì'Ç–ðgüõ¿;¬Äö͑ض9 +Û|ì¿/‘=‚ú7SºœŽÐ…tú>ÕLµCÒOÐ!él¢/5˜Ñ“c´;)Õ´31ÓbG‚Úº=®ˆÓ[n×[ÇÝcàm\ÔL¯_Ô&XÝåØÝ'\=è¼*ú¢óÊè
1ïø†Xì +úŒÐõ„F ö°êÃÜsžûr-P·Z€v©§Ûsý¨-9!¬–¬E¦k•)«rkCFg™\k¿tq©C¬š®–-s¬L_',—¶¹”Iw‹K¤]uÒ¿ºIo»§¿qÖÉ°@·ÓÀp'½ŸØ‹i°àºqꞀٳ¿ +Ì×*08Lz‡Ð¿dÐÈà”¡cE0ïè`Þ +–;ej׻ȵŸ‹eš=nRÍq÷4íew©ö™8]‹…²,X\€iÀ›ôPŠÐ%ô28Zû 2¨ƒÀ˜×ÔX¡µN¨¡vQSãKé«‚X¥•‘&Å æZ½Ô:¯\ÁQ-QÛg•9(J+øò’F§ô’uÎiºí¢ÝW®Iºcn‰º‹à©(Y÷»SŠ +X+ +8"8Kl‰Uk+“âÕ.DéÕÚ:¬ÖZÀ«uÀ}_»Z¥þ¸?ž•äÏy÷÷í}rÎç?hžô<Oz×wûpf&pœ{°Ÿù»–±|Î eôI²óSaNJ >L1+¦'Ǫ¦$Å;LZÞ_3~ùPí¸ecŒ^:A?òÓižÃ–Ìñ²8Ágàâ~ý³üû&îhÚ;±ÀØ+ñœ±Wƒ&½^úõI>äÝ7AþR9™ûÀ°ï{™¿u{À±dÕ*`}œªÂ¬4=f¤15½˜”©x/µ‹j\jÇÑ«;ø|¤vØÊñ
†¬œ¢øÙG
ûXèÕ{E²wÏ”Lßø”m»¥nÜ5ålã®É÷ýº%½ðé–$
Ý“¤W÷åoçÁ×óy?²ÿ»8ŠlJeÒ¤5œý29ûeïg»aÂ:_Œ_„qëÚ‹QÙqÊáÙ=ÔC³8Φ9NÛwíûn½×ÎÒõX³À£Ûšåž]2ÖxuÊØjˆË8ä›Qæ»úgClús¯¸4Ùˆ<ë+al܃½¬?/
ÈböÊ, q=0›³èDŽGcr5™ÛÃó04/ƒó"ÅÀ¼®Š~¹}T½s‡¨{æŽrì¾e‚¦ë–é.ræºÅå,ÕEç¬vÜœ«ï°ù GDΈÍ÷ôáŸëÃ7H}øzéQÏIÞ¸ï;˜¿q-¾Žç€ÙóriÛ9îâüÇѨŸÕ
}¬>èmm‰žVâ±¢›5^t±öWt²SÆYÿ¡Ž¶NqˆÌŸí‘¿X–ŸæbÎߢm—¿_Û6ÿ´¶íž*mè®ç®¡;¥k莿+àÈgÿs˜¿–µ'ç +®dí ;¬À¤ýÀH΢ýl@—ã@‡“¡…„éѺÈÁEA0[T‹V%=вdKÆ Eé4++J“DÓÒu¢I©UøŸ>%üKïˆÆÅ¿+ü +¥ÒïÔTÙÁü
ÌOÍ–°ï³¿&3{ÇÑþ_3ÿ[桧À«à_îßîð©ðwE.†R¼.uC£KáÉ—†•Óàñý"èÿ“÷ËÛ¡»rœ®AWYÝE ]…ºombþjæ/eï?fíSX÷hf÷?Åü ârh^øUž?¨¡»åÝmw¸Ýñ¡fp½íݸػÀÙ> +诮·—j'hjÝàXëU5@‰Â¨#ñ¥¤†ãÞø5¼ékxÐk¿ ^øñ]zB/ÞHfþž¹Žñ,d~Љٖ‹@«Ë€ÿO¬ý&Ðàà|P×Ê:¼t^¸’;5âo +¤¶@]ðªñaôŠë\‡ä:$¹d‘’–wÞXÈüé<sc‹ç™ÏºÍW¸÷× +RJ<QýIý–hB~l!ùó»áu?BÙÚö¤×3LHí{BºÌ¤ô)¤!×ÓömY‰½p>Ž:çR¼p¾„§ÎU¨u~Œßœ%¹Hüª•x¨•â]²…/d ²…×ÁϦ¯{̽‰ +º@åï!ÌnÓ€\!CuÄ~´a/ZólEâY`<7"Œ¦Š{ÆÙÂn\$n—‰›ÆÏÅ
ãq͸AühÌ?÷ˆËÆŠJã ÅÅ€2EyÀuŹf¿)Ï4«S–6—Êb*¢B:UlË|³¤Å 2œëçšÚû ÎÜÛšñ0¤#ªZ÷Åàâ§à âŠi†¨4ÍUT˜å¦$Åw¦Tå9S¦ò¬i“²Ì´MuÚ´WUb*P™ŠÔ…¦JõÉàêcÁÏŽ¶–¥ú~‡Ó2W
©„Œá:b\Qíêq¯}n„EàŠ%‹󖱢Ì2YQjùPYlž¯:e^¬úÆœ¬>iNs8aÎr8Ö.Çñh»Ž¶vûŽ˜O82ŸÓ0ßÕ|aù¯Æj‘š|‹tÚm‘Ž¯íªGF8BFñ¯"xÞY º³ª;ºÂ£ÇÕ¨&(n‡³1PÓO|3Bq"z¼ò«èÔQÿt8õ/ǃ‘KœöG¦höE¦ÿé2
jë¼Âð‘Ī}Eb±'{¼Åc\jl!ƒB¬!„$K€@$6±Ib·Ø±@Œ…Æ8ÂÄX$vl'®×Y&‰ÓvÆíL“Ž=iÓ&“I:MÓÔmšôö43ûÇ3÷þ{ïyÏ9÷û^ê+b?uU¼L»$¾L¿(¾Î8/~›?b.ü†±”JÐϤ´ÅT‚ºJÄ>‘FþIÿ‰l€Ç +|,‚ßKið #Þ–í‚_ÈÒà¦LAº–YB e"®dÔD±G_’¶Åž—vQƒéÚËéãŒeÉsI²ÀZ”¬°OKBœ€äÇ/yÈKÿš3›þkFJ0§¥}únö3‡ÑƒL̽ø{T€¹óçƒ +¼Ÿ÷røð†r\Ëý9¬çf’W•”9e‘AEEôr¶5öŒ¼‰º ï ²z˜þ¬!Öœl’=+;ÅÎ\æù2×øS™·ÞÌ‚ Ù‚ñ¬ï¹cr‚0GåãY)kXÿŸPû!æ¾Jî«îEÀÍBl½ +Ó¢J!@xU&‚æKîöþ>zpu¯6¢Í˜7ð9‹×o=Fl›ÁcÛ
½61Ù]ŸAé¨SFµÖÇ4[Ë©
– +†ÆʪnäXª;ùÕæ¸Jóq‘©ÊŸp´ê|’¾êú&]ՇȗIzó"ƒ™ˆCøGÍ/Ì_p…3øúu×8mxßÇ8Ù„™§‰Çš¡§y¸šRHíéGƒ"²Ñ^m³—QëlFº¥¾†Y]gçTÖµóLµ}q†Úq‘Î:— µ“4Ö×6•ZßG¾HÔXÿ#*³qeµ_k%xa>Å}ü +¢-¥±ÕÍZe³™ijªg[¹ºÆnAYè°Ô>_b9Qe5©Èþ^R¡ýs|ÿ^¤²‚b;ÁGxaþ€}xçà&Ö¼Žú+˜?º1s Çð[Ü®hhwñÁá~Ý{I6W*¹Ö•I©væFVvǘ:Ë©†Ž +zy{-«¬™£nsóŠ[‡ã +[gDùŽåø<G(AéxùsB®ãßÂ<!@xù‚æ!îã=ôàú¿Šúçú0÷
+†ÌÔÜA;=g°ƒ%÷pdž)^†g‘/=vEî¹'û£ }à /}€àJû Âózð:ö`
ë?7„Œ¡8^ô` f +³ÇT,è||Ðú¶€æÄ(ñ‰I*ßr/‡’ç+ŠPNi#³§*¢³&ëb3&[iRoCâõ²yØ©Þ5ÎAï[±÷S¶xâŸlñ8Á:8öÌ0wp7zЬwaç +IV´ä”•Jòþ;eߊ+bop$rOðTÔî२]ÁÛQ;ƒ¢vžû.zÇ2½ã,³cé)!Œ‚+¨ÀÚ}s + ùêØwu콚/…$°'¤€Ý!ì +éaGÈJÚj#myH[C³äCçÉ/l¼AÞ²ñ yËú·”篔ç_!"ž[{ÊeÔ_Dý¬}d{€Ú
+ͦ…”IÙ´†6Ò6*¤½TL'éÝÁ;<¡wxËßÞPß-ÝÙôÖlùÙ¦-„â/ü¦õ§!ô9M¢J£%´œrhåSíaÖÞ·¯q–%ºÉRÕ³doð”ß6zò'D+7·l9º²¬‡/„6BÙBÏÿIhêûZ, ¥´’=ÌeB3·2³ÏX‹'(ar9‡íóç!^ññ¸ßH¸÷„»3DG¶ÃÂÙÌz´‚pèÀštÐs<l9Úaš±4 ïÔ3ðF=‡@:^ª³ð\•'ªµ¨WmBª +鈛ŠÝ„ìp#×?æû(IÑ‘íðe=>1ãE;w<öêˆ;A¸Þ&WÛÆE÷‘8ç>Uî“Qá1§=æH?y,’NxdJÇ<²¥2uÒQÏ-R‰ç.©Øóì°×iÙ¯›²½ÞOeEÞB¾‡v½Wøá§jz•ä/Ã+«/üxàã„ëí=ñK{+Î~†rKNX†¢Ì2Z*µLŠ-ÉÒ!KŠì€e®l¿%]¶Ï’%ûÁ’#/²äÉ÷X +ä»|ö* +}Ž)vú\UlóSlñ}§Ì÷ŠM…bc#ß?4esZà4ÄéþÕtU£¦“çü\qª³/ÊüƒQì]â¥}þŸIEþcd»ý¿”úO‘ï´Î”ï°¦)¶[+¶ZW(7[sUùÖͪÖÝê
Ö#êõÖsê5þ÷ÕÿôoPçtêU]„*»‰²™èÊ60ÿ>§´k½€‹t&TŽÊ +]d“²L—’k»$d‹>=¤H¿(ä˜aAha^èS}ZO¡#›¹=…vn˜Ð4Ý›–¹jfWpj/Äs'Ï ?FJØÓ×€‚7äGúbCdr#ûH91²•ýåËûPfö£Ê蛤^Ò'Y›Þg¦ÍÂÞiºù½3lÓz¯2Ì ßh—¾Ë8;¼Ô8«÷û™½ëíRú}J_¡#Ò6{ÆÜŽ +|—`BV¢–ñÃÂÄ`)-¡·,5!Z>ëÓÁÊ”ÁÃUÓÖL¯MŽŸ¤›7]?1n®Ý—±öbW›þ»Åq\ì>óØØró˜¸{ŽcâìÇÆ;Ò“m³û|/²ÇÙÿƒ#Y.õÛh=?góo™ÃŒX<¼5æÿ/ÛeÔä™Æñ®‡Ö©GAkµÐ¢ˆÊ!¢†#@‰ AåðâÐz@TªBt]O »®°µÖZa»Ý]ÇÚ-3Ýum«µènÕ~û×êL§“ùÍ_¾|ÿ÷ù?ïû~ψµi¯ŠªÓ扫t‹$å©ñ¥))2kŠÁ±89ǹ0¹ÐÕ’´J‘—T«2k7¹gk[=LÚƒžYÚSšLí^í &3iH™$¨²’%QùS™‡èû{ŒýKž·rèÙ»œµ>¯5é•Ø`‰:Ãd¬1ÌUæŠKõ‘kÆR‡âô$iAzºc~šÉ97Í⚣[©X®«Vuî†ÔúÔžé©'4i©ý^ºÔ›š4Ý#ušNpK× J¢æ×â?˜ÿsYÀIjËöç³çËe¿C?Öå¨1ù Ê4«LÓ±Òôº¨Ø¸P\µØ!?k™Ôœ©sÌÎÌr2ò\²V¹A¿Z™¡¯w×émꔌýžÉÇ5Iú‹^Zý
ŽÔIzÁ-Y/(‰b˜kÌÃÀÛŒû8µ²ß(b¿Áq£¨1;£Â¬A©y<¬¹/£È,²˜ÃŹ9‹$Ù9 RSvŠ,3Ûà¤_nvI_^,×™*•)¦
nZc³:ѸÏ#ÁøM¼ñ‚&ÎøÇûêx£à–`”D1̧ÌÃÅLžŒ»‹Ú¿·²çbI¾c¨°HQbQ£¨`,È-˜-Ê)›,Q’LËR}~’,=?Ã15/Û99¯ÐU›W®HÌ]§ŠËÝæ¾ÄÜîkîòŒÉ=O®yƘT/6*¢Œ5Ša®pݧ'˜‡æ¥ø.–Ÿ›8VrVb±ªk}9%“`* BfI¨H_²Pœf•¤Z—I“W¤É–09%[\âŠKå±Euʘ¢-nÑE{Ý#;ÕEç<]UGþàQ(¨"ed æï\ÿg¹ŽSëµÛVÍk€zŽeÔçµìr9²*¼a¨ðGFå4è*CD)•á⤊EâÄŠx‡øòéÒòLÇÅ«r*q‰*«–/,Û¤œ_¶[^vÌ-¬ì,ùÔ-¬ôž*¬TPÎ[É +m¥ ¦Ÿt3Œû +§ðšÕÎsk]C«[å¯WQ„TÿYR3 YsW²Zת眧'J#Ôo§nË ¡XÝ +·ÞõPõ¶BÙÛEïE(z¡<ó”§(O=§Þ·Ð÷zú]ɸ-ÔÖw "N +Á“ýz%qâßx:)$„D-É"d©%
d+ÙAöPg?uã1º¨q +ðâ¯x€«´ékÚõøžÜ%w~…àíAãE?4ô‚t¯N"³È|GÒ‰™XŸyñë8ÿ&>y;uvQ§
?à +~•ZðïÂC¾øjü«Ã]¾ßóóñ¿·ùøFÒŠ›’6\—lÇUÉ~\–Ç_¤çqQö¾á¼BÄY¥ˆOU"Îü1J±¿”üà F* ö!ŸzR}ºÀ/Ãñ£&4ø›º +OÈþ?Èþ$Ò[F²M|@¿Æ380Jƒ]£ûb«^‹Íq£±!ÞˆÖø,fM\³2®]WʶÄUqKõ“¹ÅúiüB}£¤Y¿HÒ¤_%§o“ÍÑï–5êO³õW„†¸‡Â̸§²ñ¢”¼ÊO£¨%Rë¥kýLÍù™À!jy{“Io$(ñ'ClHüÖ&ÀÊ$–%™˜¥IfQ¢mNôpM‰åÜ<C€Ÿc¨•Ì6Ì”6$4Éf&,¦'¬—OKØ!¯O8ª¨3\PÔ(¦$>¦$Š2BZó +⩦P
ÌÀ)Òž‡s=´n#ÚŒ2´¦tŪÔh´¤Çâ´1hNMaæ§f3sRìì÷NŠ—Ÿa¬ä§C’°1,36 +µÉKä5Éë¡äe0ùj’ñ¼*`¼§ +¤üG11EÙ«ü` +rÙ²WZPÄ—X}5 +²Ö .k£Âa]ª²[׫mÖ]šëÉNVëMâ_j«UTXEù„gܤ:œ![GÉæî Ý´-^šõ]4ë:¥¨u¾†³&¹´¨rD…ÓÀøœiŒ×™Í;¬œÛáâ^‰ÓQ%µÛk›}–Âj_¬ooUçÙwj,öš\ûuâ±Úb•„‚Â3¾²Ð^ ¤Øw–ÑY¨ ÍGãðâr`¦‡ô†›Cµ»3ªÜ}Qáye¼ž1L±ÇȸÝfÖåÎçœnowKlE~©µ¨FÈ/zGn)\¨Ì)\§Ê*Ü®6½¯É,úŠx¤2‰Js¡¨ ä„ðŒKtNRöSìÛ*©4~®$š'õô®ºð—jà+í…’Òx|ÃQ䋃Ë7Žqø2Ø ¥¶ t7¾ÔÍç•–Kr½!Y¶wºÜì] Èð®Q¦{;TiÞ£êTï—ĪÔQ‘V"Ê_ <ã3:ïS
öPìí4v¶†¨“¹´N¡±ÜOï½~%ÜþnpUFÁQ9ªF¢ ÊÀX«Ò˜üÊlÖRiår*ù¬JŸ$Ã?IšîËRýóåFÿ*ErÅVe’ÿˆ*ÑI•XñP™T!*’ÊE9!Œ{Á:‡©;)ö¶`õTÒu´i
’/>òÅ”aB0ÁHŒ½¼¹¡1È™ld²B™Lf(Ÿ5…\Z¨„O N”$ë¤IÁ¹2Cp…0¶º]<¤ˆ^PÄUÿ ŸôTˆŸ$ +ñQö’S”ƒýoÙß&Ý7h"i4L#ÝUOsƒÜ:
²ë{Â\?™áa0…G!=œˆÔp:cç0ãÂ66)ìa
õ~nLý>®¾ñ¿\—yT”×ÆŸï›°Œ3,² +ʦ0‡'Æ-DkÕ$F5O465"¸eE©8€¸ÂHÝpjÜ%Š±©§‰&*.ÚTÓ¨(1Þ> +&©üÎÇ÷÷y—{ßû¾ª¾™EêÔÌ +9³^“œÙ¬IθIžÿ³&9]hÌéBmž×Á^îÁ]ôuõKY²+Ç¢ùVæÏwÈÛdX¶'†äø!-'¯Yã0ØÚƒ¬ý0Àš†þÖèg#Y¬¤Tëû²Ù:Ga²f)’r +”/çlV&æ¸TÆœä¦Ò˜õXe\*TÆ%¿RÏ=PC_7f1³&¬àyÈeVr¬âì•Œ ƒódô³ia±¢¯=©ö¤ØÍH¶÷‡É>}òßBRþ8ôΟ,í³$ƒ}‘o·É½ìäX{c?&Çؾ“cò~RĬäv°‹ywÒ÷RŽ@ùÔ´ÚƒÆ`5÷GÕQk׋WÖI%0–ê‘PCi4âKˆ+MA/Ç@ôtC¬c4b嘆HGº;ráX/us씇¥°ÒëRغv)´XH¡k…üœô}/²q©;“z“8¢Žåxøû@ÿM€i3_ôpz"©G¸3Ý*£ViDhe +B*"¸r8‚*Ç¢kÕ$T͆UüªŠá[U}•ºÊVè·<„¾B@_.¤ç”S}·YÔžÃqp +5ÇQod%0¨0o¥þ6 r'ÌùÔ·î%è\:+’àã2“Aðv€—k<]SááÊ„ÆeƒÊUe]#9Kî@UûêÝâŒ{!ãm¥ßéôyê`<5ßäX:xõkƒ‹þ7 +µfRg>u–
Ëp6êQ§”)ÙÈõ\s;SU[ŒÅwh¦W˜Âp•ÿ}•«´’+\îDøë ôZÆÂBÓ…9 à×îÄH^!¿£æêM¤?Ó¨3›ÑÍÄmæä&–SÇŽXC56síjnŸÝ¸ÈX|£8¯ð%:ÇU¾àj-ä̈@oÚáÁX¨ ´^ÞzÚÂXH±Œo2ýLÍ7¨7ŽZ“©3¶ÏåñX€È¦Â +êä󸮥F5*pš±hf,NÂc<ÌGiéaæãõþ&¸ÿUÓnOâG;ôŒ‡Ö<#pW€ +.+†â¢âmœW¾ƒsÊ)hQÍÀçªpJµ'T98¦ÊÅQu«KpH½nu5šÔuد9€½§±Çó:½ÚPï#à"uOÑ +Ôv"©ÚA;öý®*< ·µhõŠÄ?½’pÖ{ +p’-/ XbEwõ(àKËeë‹Á*\Ðyã¬>'üâðY@*šº¾Ž½o¢1ð¨zuAS±;hv§cGðbl^†š;ªCŠQ² ÎÐT„6`sØQl +»„²n?JŽp!•’’!û
"–¥¬'õ,ƒ½YÊù<Å÷ã8æ‡}á‘hˆHBm÷þØÑcj"G£:r<œQ“QõÊ£>Ħ¨lˆZŠ¿DÀúèB©4z½T픊£ë¤51n©(æ¼T{G²÷²ä‘UHOicÙ{ø†WÞé¾À‘T^o}Økd4Æh±»g7ÔÄPßåñiØh‰2ÃX8PbxņéÒÃiuB¦T˜#å'äI¶„b9/a³¼2a‡¼"aŸ¼ÜxFñqâ-ENâcEv¢³:YÚÉ=–ÓkÔ=ןóÖ@Î|¤áU –×߶Þ^pöĦ¤X¬ïcBIŸXc†Õ¦QÈ7ƒÍ4QZeú³”kš!0}$-3-–¦år¶©P‘e*S,1mU,65*šN*$ßPf˜)ç›…"ýîšêŸJ£ÿC€Æ¡ìqùs5¿•§¨±>ÅÅ}{`µ%v‹«,iȵŒÄ2ËÉj/e[&IK-ÓäÅ–å…–y%[‘a±)Ó-%Êy§j®Å¥úÑeÕy†ñçÞ™{D
ŠK]
¢qÁD–pFf`¹âf–Ù•ÀD +5.ŒKãq-5zŒX›˜TkÔÚÄœ4§mz‚5m<96ij4IÛ“dú +«õq¥¾Jôé4uúç4µú´Õú]R•þìÕŸ–+
oê–zÈWryjH"Ú>ý|Âzßeí—mìA6³G#¼îËäŒÉulI„–…£ð¼1kLsÐlJF£É„U&›à3-ꌡÖX,V—‹UÆZM¥±I[aÜ(•wÈc»Îm<©+1¾Vlúy¨+6…ä"SH"Úâø?ñ7©w‰Úgø‰íÌ:xÝÃu¼H?6š#°Æ<Mæ‰Xm‰Eƒ%õ–4ÔX2„EðZò„ +‹S,7{Ä2ó +Û¼Z[b~^*6o“]æýºBó‰°e–Ka–?’º‚ŒL¤KÚ^þÊZ¯eÝÔ}%Ÿs¾ƒ™“4¨Ž…k¬ah´EƒíIÔÙ¦¡Ú‡*›¶t”Û²m©Pj+Kl¥b‘Í«qÙ´…ÖµRu‹l·îÕåÛ:ÃòlÃsmï…«¶/ÂÔ¬œkëCzÌÜ¿åÈužú]˸9Š¾D¶q-ë¹®Æl-ê³#Q£Œ…W™‚ +eÊ”$¸#J”L¡HY"8»X¨‰Êr]©×æ+~)WÙ$/U~®ËQŽ‡)Ê…pEy'<[ùœ÷!‘‰ô˜Û܃—YóÙöÁżÅ1t7Ùìžãº|üÛŠ¥ƒQ¡ŽB™Ru&ŠÕ¸ÔTª¡@Íjž¯:Å\µL£ª5ÚµIRÔ€¼XÝËR…YÕóäVx¦úO^¿×YÕL¤Çܢߗ¨ušúÇJÙû@¼o¤/ÕìK¹} Jí#PdŸ§c:–9âápè‘ïHGž#KPªãX&.q¸5ÙŽš,G£Öjo‘2ì;uûÙq.,Ýq3l‘ã>¯ßÉéöP/’ùÞÎá^ ÖÉà0GOÆ4l¯ä^\NèG×VâG¡3 +ÎñÈw>ƒ<×\¨®$丌Xâʲ]9Âb—C´¹JÄL—WcqÒ¦»6H&g›ltÒ¥¹^Õ¥º®“Ou©Îoå4gH꣰Ÿ+y|'‹˜{©ßáåûÀX²…¬[Ôrz²¬TB^i$ÔÒ1ÈqO‚➉ŞdyRaõXéÉ,ž|!ÝS$.òTˆFOƒ&ͽNkpo—RÜr²ûŒœä¹FîÉIîÿII¥¡>’KBÚ^Þ gŽSÿ@-ûÀH þz¸Š¹“¾dWBVåHX+' Ã;
ï<˜½)XTe‚©Ê†…UªVU(¼ebŠ·NLò®Ñ,ðnÕÎ÷ÔÆ{OKqÞ«ä)®ò¿Ú¸Ê6®â'.ÒïSÔ8\Ç>¬âûÀ8²4’Ê•Ì]
Ì\¥n +ê¨ÓDíÔhÃîÉ9ÆçYþÎÐ’Sœ¡G|ŒÒkwql˜Œ£Cyœe¥ç䑯›Ã†ãžäŽo$Oü^17Á¸æ Çxô
³âÒ°,\pÌÇ9Çbœu,Ç™áU85|zœ6ã„SŽ9íG÷ˆ#èqGF^ÁáQß Ãù1Ú]Þâ sÔhž¤!È“¨ÏëíŸÓxå»|¿ã!â+ÆÈ‘ãpÕy~ãâ‡ó.áèÇ)×DœpMÃ1×lt»-C—[ :ÝÖà·jt¸mD»û6toÃ÷O°Ïã$öxô¡mÌ´Ž}„–qo°c<óÙ6„WL7OfRß›Ú +]Ó& Ãs6L÷ÃÞ*ìšgš°sf2¶Ï´a«×R4{b“Wš¼*ÑèU†Y[Q?kP7«S¨Ý+¬Ÿ}]¨žs_¨šó\¨ð–…uÿÃS^ë÷¨}‹)æ³Öù¼ZO.º˜†;¼±Žv{{bçûs±í%š}4hò1 Ñ'
>VlðÍDoj|‹Pí[Ž*ßõB¥o“°Î·UX3÷P>·G\=÷ªX6rÞbé|Y,y‡P<È÷\÷¨{-œ©]Í~‹t…±¾S²ï\ `ç<Wl™?Mz£a?êüT¨ñÓ¡Úψ*?*üÒ±Ö/å~Âj¿R¡Ì¯B(õoJüwˆEþÅþÇÅå}bAÀ]iYàb~ <@ÞÏÈâ}®ù6õ/G±çdÊï&‡8ÞÃo;蛦 +1Y·V´èê%³n§” ëPÄGŸQ˜¢o(⢒×D–ú1
r›åç§qÀ)jw²üÛgeÍg#ß«ø½”v,vFîâqX¢ŸŽL½lú +©G¡5]SDŧˆ2½äX–ˆ{ÇŒƒsI,ý©ßβoWÐLj9.£]ù´ÃžàˆÔ7¤$L†%aç#!1¦ÄpÄ%ê`4kN‚Álôæ<!Ú\*jÍÕb”¹YÒ˜÷KjË E„åsE¸å>y!E˜å_H”¥«Ü÷^ú¿‹šXòµäò<’jŽ‹éú#5Y‚%Ù É`JžcŠ/bS`H …Þ…ÅÖD[ÍÐZÓ…(ëRAc-"¬Ub¸u“¨²î•BǤÔ+Rpê·R°õ9‘¥”_èã¾÷PëpûÞ|Þ l6’ +ŽiG}’dcÍ> +1éc ÏxÑÞÐÙ@k[„H›Ûb¨íñˆ°[fÏBí+„û:q‘ý#1ÈÞ&.´•í—¥€Ì{R€ý™h“Å2Þq‘ë<–Í3IÍÝ+Øs±¨#kþËv™Ç×x¦aø>ÇY›=–Dö…lvBP&-~˜¶ª´Ú,È"d“’åˆ%‘ÄžåXƒÄVjI ¥5bÔ´Æc´1ÓZÚi«CƒªvZ3ß\‘Ìoü1\rç{ïçyÞ÷{Þçæólb™>Kz »4&ÞVqñ.ß]#‚4"!RÃhXâ0Å&>§¡‰“øŠ'ÎÔÀÄdӀĦ~‰ËM}’ªÌ½“ö˜£“Þ5G%]3G%>4G%æèVâÛhdö ³e®T‘Á>` + 3“³8ßE<ˆgTJÅ&;iHŠ§bRü48%LSûh@jŒú§ŽT¿´±ê›6Q}Ò¦+:m–¢Ò²‘¶ÄÔ+ÂÔ3m—),í„)tîUShêShŠñ„°dÃÜÊAr¬Cc#º«±†Ë° +ÏŽSÏì +Ë™¢ÐœçÌSPŽE9kåŸS+¿œcò͹,ßìûòÍ2L¾™†É/£·R¹ŸX¿Ý²|Þ‡B¼§…}€©0ß ƒ±ŒÑf…8*¤À]AÞ +,V@a¤üÂùZƨ‡e¢|,3ämIU7Ë"uµ¬”—e›<-ò°\”Ga‹<ó™XóÚð‚Ô|Ó"i
z˗З–QƒbjP"M‚1+¤Xèaà·ÂFÝJÔµÔC]J}äU"ϲ(y”
’{ÙH¹•—kù«r)O’syŽž)/‘SÙf9–’CÙy9”~#Ç’Çr*az.nc[5(¢XÒÅhda “Vñ>®‘ÆcËF®g øWàA+%×êŽr²:ÉÑê!«„ÈÞ-;kŒlqêl}Q3dcMW‡êÅ2UóP¦¶ +#[yðº†LëÛØ@î«Ñ^¾RÊE7_Wá?7Hq›ØƒÍRÄ)`+ú5èo—kÍêTg/S·Î|!°Žadg,ŒÉ@£©ãPÕ‘XÖâuw\êöŸÁxº2îèÕìÚsìš/£õü)k¹S +Ü>i¸ì“Þ–lâoaHa1Œî~R=Ci}_šCP
¸æÛÀo Ðõ,^ÏÇÏÁ×<÷OXI½-äAÎ ÛèGhŽFoz‘<€^—Ã’s£dwT2GÿÝvNÇIâ8EïaÞg0?Ý:Ç™g +šhrMÙ@-šH¬‰Î|-ðßý·Š/‹:'‘ó´Ç†Ö£¦?¥ó<!9¡×‰ÄÐsÃÐçá÷ð¡ô‘½ôŒÒEÓ%o†Ãé*q|Â`ø N3
¨™—®™sѼšà&°'͵€ÜgSë×Èy\ïÀ1)êôOI§Ùû³Ô¾UóC¸l'F
h†¿Â§pšÜĨ}Þj”0,·ØïÇ]†´o9-4^ºWB-ìI¶|¡rŸvˆw€œ‡Ÿ¤ 뇮;y:\ ö—XÿJ»Þgpþ_ÛªÛp¾…{féô=5ù‘³úãb0´)ÆT ¥@âÅ63Îá8=À½/ð0qðL‡Y0r¡–C9¬+l…°Žànß׿(ÜÏûO=Òüõ‡§¸wàv«çÅWrnÇ¥=Ž è#`<L7 2a!ë/Öcë'Dc=PÚ¦ïµ[uPts”ç3ÝåÓ?ˆê›vÍV¾‚ÏáFkœø×ìÁÜÀ"`<ÏÓÉg::Ih¤é;e뾩EEh”Ï*Ö¯`íM¬½ƒÌßbýFݤ×u‰ãr[׈´™Õ>†¿<Å•Ölíd˜løÔlÛëÑÍjÖŸœž%§ñhMFg&³õ…Ò9ÙäG–Eúq\#Ž«ªdÍÍú“êôGÐç(À+tƒŠ|Ç+e¨éÿ`؛؎†Ô‡=ßvEÓÍHr‚Þsh½@¯¢ñ:sØét4²ÑÈC£ÕjQµN«Fïi-¤9c<u”j5’Y# +
íÔ·cÐbŒŽz‹¼;«#‘w!·`ý™sqQÃÑ‹ÎDâžÊªo 1G'‰ãâ8N¿!Ž#ZÁÚkuX9µz›Zìã{õ§äKíB¡õÔÖAíS´üŸy[œx݈ç:¯Ö5ud]hA>äÖ‹]DN£Èg:“Й¦CŠGaoA:»ŸƒN:KÑ(gÝJm§5¦½Úb>ªÍÎi£Í-mèøPÕ
UÙª|ŠÇ´”û´ÚÊU¸Àçˆël';êà®c¿ðWCÇ(ì<Dûlã´Çv‚vÚ½¢Z»éÚn¯ûdm±Ÿ§Íö´Ñ¡PV‡bU;¬U¥Ã&wÜuŽZãø;rº¥rçG*u6´ÂÅPÉS<B÷+®›«´µóÁ´ü +×éZçš µnÉZí6_+ÝÞT¹[‘JÝËUâ^bZ-ó8¬¥ž¿U‘ק²ty¨‚®†òÛÉk§ÅŸVÛ“Vɵ׈`ÎæÚÙë×z-wV§›6zù«²k¤Öu¬ÕÝFª¼ûX•vQ%ݧh¹÷-óNÔïT-öÎ’Å'_>ÅÊï±N‹zÔèMßýÊõ=©~W”íO™þ†2Àÿ|Íu{¹7WØ +h- ZåE%¼Hy!„@$ +6¤g¡-=é…X—aÁÚŒ +¬ÎpŸQ¦?|™mX•¹
™Ï +oæ^áÉ:"ÜY§Dâ’X©ø\Ôfß!’¨U<ຒ¶ƒš§‹X´`ƒd?¯¹|ÖÍÜlΞˆö¬H´) E±k³Ó°:;Í9:ørLhÌ)GCN¼9uðäúàÎ]‡ºÜQ›Û-\Ê°¨QŠjåIY•ê¢Ì¡úTæP/*ITÇ80Œ´TfÚ?Ú¯>²§ØÎ8žb팣E5ªyhV-†O½
jêÕùð¨Q§¶`ež®<œy
¨É[ƒêüváÈß&*ów»¦_Ø4#2«ö]Y¹ö&ùŽHâ4c¼O79÷‘rZM;ë ‚—ìƱ™¹ ð½_3š9ðjâáÖ&c¥6.NÕ:ªtåpèªQ©÷À®÷æ_/¬ú'EYÁQZÐ'³Ë̆wd%†ä["ÝG”Œñ+æàõ†¨?XÅu ;i¿ºøÿ&}6ó±Ê0î‚(ÔÓ°Õ9†lT4° +a+,…µ°åÆ•(5ú`1„¹h‹(.z^˜ŠÉŠLC2£iTVhú#ù†H÷…Ec¼[LÛËy¿Bí~'°×ÅZ$[«ésùÜÏ8ܦIpšf¡Êƒ +ÓbØLËa5e¡¬XÒâXŠÍ0—ØQRâBqÉ*™[`4…Áüœ(0zËOd:Ëy™¶ôc™Öò/"É´fIèÆ¥ÆÉJžGÔ=L+ÞëžsÓë×Òë3ŒÃY&Pa‰€Õò0ÊJÂRšsi:ŠK•0•éPTf‚±ÌŠÂòʽЗ?]y‡ÐXŸùÖ}"Ïz\¨loÉT¶È×Be•Æ(—„š¼me-Ðr¡þA/°{"Áz`-ãòò]c,³M‡Ùb{,ŠìKQhO…Áž‚Š|è+ŒÐU”A[Y…üJò*WC]Ù¥£[ä:öŠlÇ1¡pœYU×D–ã+~–„¢òg9þíæ Û€}M¬Úð.¶G}\ÆáfN*KqõC0TGB_]Í"hj–!¿&y5*¨P9ÍP:+ëZ‰lW3®
Ètu‰W¯H«=*äµgDjíUòO!wIBî§F¯³Žsþ/QwÏZîÉÇ€'Ɇ5ìyøÌÕ0½(ôÈ_µ{”î8云í‘CáÉA–G‹L õV¤×;‘V߈Ôú +ìbc¸ë'.ýÀ¾.þ¡v7u7RÇj÷ð<xÐï€dú‡¨ßL{‰}h?Ío?pÿl²€ÐÐøÐ
ð’àÁ3À‚`!õ3¹ý „½nÕÃßÆpHBÏó̵ƒ½\ƒ}¬C~ÕFà +€Ÿ’¡‰daCŒãã8Á8†ÇMÑ/¢´#<hFXHÃLà0¾ÀïÝàoþMî /ðÕœs+µ½ý<^f
ð«9ÔZFø!®ÿ0ñ0ùgÔ~œù?lJÎ2çǛфùmÔóŒãÉ(/£Qp£Üä£ÌÅèaÂAF¯ðý„Íù{ØÊ|¯gn©í8˜N°_¥þIêŸfs gœ&¼EMNÍÍç8É/É%6I¿f“ò›‚ËsÙ Ð_e¿¡»ÆKùÜëÜø×Y`×9ÁÏ“É—ä[´3çM?j8ßbêªNSÿ,ëšÑÔœöóq-.#›à²bÄñÈGäwä÷2à“)À
æä&×æÓ8àoËMÒ-^|·x~ÁÍw›“¾Íº¸ÍIüý·ä3ø™s™©GÝåÔûÅùM}c_×üð¾ùù3¹IþB>#%L-[Jଓ¯¦ßpm¾c£r‡ù¸«î±6îñ0”¸%&^ââJïËìö¢I$‰"³É|’Hÿ£ºLÀš¾Ï8þxË¥^È©œI @’„@ +WÈ›O!ŒÂSÀ\ÇQs2sfN±ÔKÆŸ¸/~læQ@RfV_ÑÇ»ôñ×e€ëò}ôÓÇ›èáN؃>®É%œ¦‹×q®Î±Rg¹r§©rŠœaðgaô°ö¿·ôÈ¿oj²^Ô“2Ÿ4j™˜‹…ŒZŠ×èã}\¤ôqŽ>ÎÐÇ)tâvpgîÇÏp/ó/^â·_ÄŸYop€jûGØ7‚0Žú¼êîò8ÝâÕû=]ÇæèOÍ™xÑÔ“3’ç‘I<î87+]J…j®übfÜ@Fê´Rcãnã)Ù͇¹CÎòÔ\ÁvîV¸›{³kð4‰žðWÊßy”?
äõC~9èç•wyÔDîì)ŒBÍ8ê%3¢Ž§/DìåÆÞQ¥ØíU^µèõjÀöÑMè½]c:°uÌtŽ=ˆŽ±'±yÜe´ÿ›&ÞÃÆIÑæ-`ÃS< îm^i¿æõ:À«¾?_˜ÆׯÝã|px\LˆÄÞ‰R윤B¯·=ÞVtù8°ÕǃNŸ2tøTã9Ÿ%h÷]g}›±Ñw6øvcß>´úG‹šý¯cíäûhš" ‘¬xÂ^Q¼Žyö‘³1À±H௸}^ØåçÿYØ:9?"Çæ +ž™•Ž5Áf4ç`Up>VÌ.ÆòÙX6»õ!ËQÒŒ%!íXº5¡‡°0ì<„_Euøg¨Šx„ÊáG|L½w’ø +æ«öd*g>÷°
éIàÌÇšl–°)X>«#¢±"B††ÈTÔGP™…ÚÈ\,žSˆEsæaáœjTÏCÕÜFTÎmCyTæG@YôÌ‹ ·QûoÇ +Oˆá}Åö«ŸÚØ‚Õ±Õ!½|Õu²
iKdŸç…•Q~X=u1‘¨cQl2ÆjPkDeœ
qNÌó ,®¥ñ‹Q¿Å⟠H¼nÉ(”œDô +ò¥ŸÂ•ðà’>áµ.SÿLç¶>{H·h§%°’kS'öF$$¡¨”Æ \*C™4¥ z”$d¢(ÁOB܉¥(L\€|Ù2¸dÍpÊ:àïF®ü8ìŠ7`Oú9IßaÅ0ï²Íx•ú'29g°ÝI¶°ýiãgkèž>È' B>eò`”Èç¢H![‘ŒB…ùIF¸’lp&9áH*F^r%ìÉK‘“²Ù)í°)w"KyUŸÈ¢ú(Sõ€ƒ`¥€¾Únæ:ظv`é`볎>VÑG-}”+Ç¢$Ååt(#àRÆÁ¡”#O• +»J•Ùª\ØRÝ°¦–#+–´F˜ÕϤî…QsD”¡yUdÐÞ _AdÐü +»:ÙêX5)°h´Ä„Lm6ÌÚ˜ÒKaL¯A†nôº6ètÛ‘®?þ’Hc¸NþA‘F?ŒV'ˆ.³§©÷µw°ý/äÌÉçZþ¾”õ¨d=Üô‘§÷FŽ. +}†ºŒ¤Bk\µq=ÒLÝH5‚Ê|Q¤4@îA¤4 "Õ F¯±'˜÷Aj?ÏxK1Ï#ŸMQóó2úËÏâÌgž€LÓd˜L3aŠ€ÁY†t³ +Z³šLÔ™yH³!ÕRUÖ2¤dµ"9k’¬¡°^€Üú>dÖ{|~y–0„‚¼BcÌ{?µwp$é(ã^ «J¸ô5ÏÅ™ë”i½ÕéÖ h!PÛ¢f“"Õ–U¶ÊlR²íHÊqC‘SyÎRÈìÍH´oÔ¾’Üsç¾GîBlÿ$v’œaÎ3×#Ì{/u»+9ïTq/𹼜ýþ<ö»ü¿\z1:EPçyC•€”¼YH΋D’# +‡rGdŽ$:m:ó!q•AìªE¼k-b]ˆÉÑùg••|A#Ú% Ú9ÌiÆ?ÄüwQ{Û"î…î>ë9*VÐK!G½èè%Ù=²B$º§Aê…Ä
±;ñžÄyÒë± Æã@TQ æÕ`NQ#"‹7#¼xŠO!´ømò9B‹!¬H@˜‡+9Κ ~/µ;9_ +4’ÿs]æQQXWþe‘u +œdά<Ȇ3D¾Ü$ºÍlÀ×J´—aÛb“²WS×2®—m”zAWÚ„þfô_•œ0'»Ðxn¡é³ÓÚií]¡'ÐØ)ôvba'©ílî–uPC!d Ý|îRš[Y¿å¯pÐÍÝÀ 1þ5Îâ6©Ïv)–ñ4˜0úì”ÜwIw£ÿ¨v +´Ôe¾J]¬*éT¡âN›´Ðu·¸þA·2»_T‘Ç=z6kÞ\F·‘«ÿÝXôá·”×Ýaôw”Ú͆§´ÎÍSUnþZå¥=´Ì£Ÿ¬žƒUê9R%žã´Ø3E‹¼¦i—IÙ
…*4,Ö\ÃJ½hX¯|ïÊó~C9>Ç5Çç¢fûÞSvçæVfµsÍ÷¸¾¸öpåîN”¶ÆÓ_FÑŠp®ôuQ™·–ø„¨Ø7N:÷’¥s’Šº<§y]Fin—ñ*ðKUžßtåúeiŽ_¾fûÏ×,ÿeÊ +XŒ€m2îWzà»J:§Áw4#„Š÷Ÿ ÿ^o®c®–Z ן¡à½»´‚R¿$´ƒxª(0@sƒ¢”Ü]¹Á}5'd f‡Ó¬ÐÑÊMVFèTCÓ•6[3à +5=|‰¦…Wê…»¦FÔjJäQ¥F~¦ÉQ·59º¹¨6>Ä÷£h@h;ì™3¸bʹvK‰É|ö§ Â]9¾ÊŽUVd¬2¢ž–1ª¿fF
ÖŒèš=ViÑ)š=MSºf)µkRbŠ5)¦\c7+9®ZããŽh|ü‹¿©qÝšyþ…÷ñ»Ý}´;†ƒ¡Ä`síØ¢¾ô—¬#;ÎE¦Xo¥Çjz\”Òâºkj|M‰V“ã‡*%~”&u› änS5¡›Qãr5.aÆt_®ÑÝ7èW=öhTbF&6jdÏѳ¹•‘‰mû/×åu™Æñ¯—T@T@Så¢Èý2à0È]`H°ä²¨1¨`yä ^ÖK$ëZf*h¹YÞ)=æZֶɶ—vÝ:¶µk%Ö´Ü“›®Š¥³Ÿ€ÝãÙ?>ç÷ƒ™yžç}žç}ßçËšá£ÆŽLô¬ã}%q4Çbb\9\ö0Í
ó‘-Ü_EáÓU¥‚ˆåG$+7ªœˆ\eGÚ”Y®ÙQ5ÊŒª—5ºEéÑíJ‹éTjl·,±ïÉ÷5ÜãÝù?N“ÿÃøÜ›Er˜±a
#ÇŠæ+âø q”‡-z´ +£Ç)?z²r£ƒ”¦¬˜XÍŽ1*#&UÖØ,¥Ç*-ήԸjYâ—Ê¿R)†ÍJNØ¥¤„£2%öȘx~àÝ)S +·nW˜õ€fZßVhÆ<û€))}€#ä`/ëߎïö2z¡œ3–•2ëG)ù) NVb5Y]•`õR¼u‚⬊͘®˜Œ(Eg$(*3E™³žY¨°Ùeš9»F¡YË5#kB²žQpöË +Ê>£Àì‹<o)8ËÙO(ä^`ÝÛð»yçR…Ô̳Ž1¸ÂμËgyĘJ®¹#ã¡ÈoEäLQxNÂrÃ437N3r“4=Ϫ¼|çÍSP~µóë55¿U¿ÁKò+8)s>åyS~ùNùC@žSûKèüoÅ÷ÆÞ–t/ÏÚ*zXlȤ,bI&–XÛPÍ,é…cR4QÁE +*š¡À¢(M+NÔÔâTçÈÏV¢)¶ +M¶-Õƒ%«4±¤CJöɧ䔼K>áyC¾6§&35‹äÿ¹JzY¸îQÎ…Zz-¦ˆ§€XÒ‰oyaë+Ø>J¥ò+¯)¥“5Ù¨Iö0=hÓD{²&Ø3åSV$ï²ù_V«qåOjly»¼Ê÷ʳü¤<ÊÏ˳ì:8åe ûÏ,â\¨ã~Zʹ€4\öS©š÷¹H£lâ2óy1†’Ÿ€ª!šPé&ïJO¯ôÕ¸J?HyU%ʳ*UcªòäQe—{Õ"®n’[õF¹Ví–KÕ«UõøF.•wåZá”ìÄþVümh È ÆFÎ…Ç©ï…ËéÅzr@LÄ´ýI¬ãê†ËÃ1Zí˜(7ÇT¹:BåâˆÕ(G²FÖeéº
¯«ÒÐ:;л¥ñXÛ_ÁméQg?Ûñߎ¿µÍÔáI©~%g#Ìã=Ržb«Óù|J“ä
cš†Ê¥ÉUÛйMÞÀÒÄÐ\€\<l¨F +ØHà-4Âöñ—9xp!Ì–ßbhpj+ëÞˆ¯V¾ÖÔJx«¥ùmÒH25”§?ÿ÷F¹ÂÐ5 m[m€m¾ÀàÓÆ%ÛÆEÜÆ%ØÆfn£‘WSÄÕ,b5:³õ.Ã_B±å†´ÊÙO;òo-¶W’®eë9›7°6q&m–ŒOIá0|Á3.Oãƒoúv‹0€naí`ðêð‡ .þ×6tÇ#|NA·¬“žÞ¯‘øs4à5ƒ{àÔ|·âw9>kð1¯ƒ>$mIÈÒÈg¥ià»üSÎQ;ð½vÿâØM»ÉG'ùè$]ÄÑÊ0ÂP´‡‹`ÏC@ÓuQàNwäûôÄî+ +}àÔ|7²¶Å[Ù‹øËÃO +áFwJ]øß#y‘ûðùPR¸ƒˆƒƒÔåúaô#>eÔ¥›8ºº¹tºÙÔÝ4v7‹íÆà1êq”zýîjÅÏiW|?ü<g>-/Òƒø +ÜÿWðOØÁ×1xNÀÉA^‡S€I½ANÞ$'g¨ÍÛãR‰ã,áY†ƒú³§h¼žmÀþèyÏþ×µ„u/`Í…¬35Æb¥ÿº%÷ãÒ°“ƒ>ÞZ™ÀïÁÒ…Á\âèOpn„ô!µùp8>cûœá"5éec÷Ò½,¶Ã½†KªÜK²f+¡Å³Î`ÖéËÚÜ߆¼…ÍßÀoá÷ÀOô!|…¿Áøz-§Kp…ú\uCÀÑ«×éÉ7Rn±Wosøܦ©ûHv‰¼ý;”–;¸
âãÀÂÁ™PeP
h€fhµ(ÈMº‹²ûEyEÖ‡¾»…¶º‰bü7:󺮢gïéßþ‘Kp>€÷û5ïHCaxÂ$˜q`\,<¤ïÑu}èÜ[ªÃörl¯ÐwÄq8¾%Ž¢þ®¢Ì¾F^F)^Bg~I¿ AùÕgXú>?ÂYøuº!ƒyñaMÓðÉZŒøÊÄÇì—êŠ`{!¶—`{9¶›)E¶×êïhÌQ»çÙÀh¥;Ê:ÏÐ.çi›o‰fÀï»p^‡ÿ'Ѻ7/}£ÉúJ3ðG©ÍøÈÆ~1í`×9UÐ~YKmÒ@k6Ó¢?ªÚµzGOѺÛðÑ©ÓläSäâ$ß8Aä¯Q©n<ä¼r_wà_pYÃX›;þ|ôrñ¾"ð“ˆ4ìçê-ÙØ"el• +Ö±ûì×c¿ û«Xù:V;•ØŽý½tÆý’ˆ^Àâ*×…·ÎûØ5·ëhíú·š9óÂß$Ö‚Ÿ— V,æa߆};öplÕõZ|Ô㣠»-Ø]¯çéÑç¨É³|k¹øÓÕÓæyF„;lÌݘ؀±m°°¹Ù@°an_€L áb ’ +Û»þï3>wi‹·J>EOOUE79¼äð“£›}¸Ž!\£Ž+Ôq‰~¹€FÆ6¶øeƒÿõ³Êè;K¯0š—Éûÿø"ŽWœ©íÒ½÷€×úMêy…÷åÞ‘ÛÈ`¤ç‘ËHžRžÅÅsxx/YÚ±É8]§Ž§¨c•~9ËøXÆze
TtšŠç™ÔOÒ¢³ø„QüB|„éÇøŒ¥æc–š29w¯²xzž£¶°8ž-™çRðLò˜ÉSγ¸hqy¼äi'Ooi=ÄlØfÂf1¾ŒÉðsß÷Æö½„cï`4ò!F¢?Çјop4VÄðcü:‹öW»y,=Äó|¾¡`oÅ”>1ëѬD¤`1*§£u˜‹±`6ÆŽ™ØjLÅzŠóa"Îñ¸nÀhüFâ§0œpC L¸ŽÃ’{ì¢_ò‡ÿŒCI"éÿð±šå†%ÿM–—{ÄM–»«l‰¶˜bŸdK° ‹ÄII¦%é˜LTc,QcI%‘:0,APÚ€!iŽH;0 ëE¿l‡dcdsèI^EwòUtÊïâ ümä¿DGÊçð§Šð§‰{+ñ3òïšè¶wˆëLíçYfV€3Ô7C;Éã1"—#˜’#)¤¡/Õ†C©•ÒêГքî´6t¦wâ`z?:ÒGàϘÁ÷2–Ñ–yYwàËz^Åω?¡9ûBü’ï¾
x±œ6`¹¿ÌuƒïKlÉfi“qú'˜þL)„¬ô(ÔèRâ ‚@v9üÙN´g»Ñ¦ô¢UéG‹²Þœ!4çLâÀþE4î?‡Õ-xÔoÀþ êsÿ@ü‡¿Ãyö×Éý<ËüŽ‹m–“6¨à¼Ç6(dᜡgmÏG—J‚€*í*%ÚÔ´ªð©ðæVà@n
šrјۊ†¼.¸ó£>uù§Q«ÙDµö\Ú×à,øøNÝ¿‘Ï{x—mð«ä½Íÿt°M¬°œc[:ÎoƒÔÑCíšx´hdðj2q@£F£VÖ·¶õZ'ê +ܨ-ð¢Z€K×gá1TΡR¿‡avÃ+(7~@üŽøšÁN<à™_&ÿ-7p…%~ƒXâó îRÇ +c;E즣(3@©y6óuX-/£Äò>Š‹Kü%Å"ßY™‰û´ÿ=rÞ`Ûw©™ó±p€s†¦:üÔÑT:“Õ&9œ&*M¹p˜a7›Qn.C™Å…RKlÅm°÷ ¤$ˆâ’iX¬ga¶]ƒÉöŒ¥ïŸGQ©ˆ"›È}op¹Kþcmß*qš-ù$µRG7u´2V<ŒU§5«åÖ”Y÷ÃfÕÂj-B‰Í†b[,¥n˜K}0•u¢¨lÆòåËÐÛ¯@g¿‡Ç uü†ëWÐ9Dî‰($^#Ï/c¡¾Ÿ£H0Ïuœï´G'}ãcŒÔ1fìöØìI(±§¢Ø®„Ùž“Ý€"G ŒµÐW4£°2 +ª& ©ZB¾óòœw‘ë|j×'Äßø,r¨ñò<G¾«äÞêäÔÅ^Ÿëq¾÷q¿ƒöi¦j诲šH˜9å08³ w©QèÒAç2£ÀUmu5ò«›WãGnMԵǡª=ƒœÚPÖ}Ùu ¨ûñW>‹PÖŠü&âEÚý&ù.wëã‘mç×¾l…Ûi“&úÇIßX9¾éëã¡—BSŸ†üúä¹5Èu¡vÛ òT!ÇãÒÓ†ì†^(F‘Ùp +ÛHo¼´Æ"¥é!R¿ä³ˆô†=Ü%Çù.p$[;ÌÜx„ñÈu¸Ÿw’£I¿¹©Åј©E낪99Ír(›³Ý¬†Â«C–ׂL¯éÞ:¤ù|Hõu!Å7yËI$·lBÖrÒ–ûHlýI-_ðY„Ì·‡Û´ýÓä?7¸7žÎs,› †‚Œêi¦–jÚ¥”ZôQn Yþ8¤ù¥Hõ§!ů„ÜŸd¿2¿pAÚÑ„¤Ž + Bââ„ +Ä +Díˆú!L`Ÿ°‚0ó•À!Jà Ôû{âëe7ß#b‡É½6ɼ0ÅX˜a,LÓ|öq¯†zJù]PSSm$;†„á8D'!b8û‚ +„¿-,F‚I>Èd0éÌ ÿ1Èy7ȹfˆÃÜÐ{¼ôœ5¿"ØIq[ä\9 œš§N‡¹úç€î98™ˆ<jËâß%"j:†Ã™nŠ³Ô› ‹}H»WdBLl!pˆâ!Cü¡Émþ8ç݉]^|vcœwÇÄG¸x‚¹‘¼K”zb‰±øóá%\D ¡å~ö" '$Dß± ,²ñ[L"8[.² [d±_d±]dá] -ÄtàBˆÁ¾FÜdä {Šƒéü—,Jœ&æDla,.sûIJZeNàHڶΜ´Al…\•D +!á{Ôù·ã¿\— TÔçÅ/Š²"‹;ÃÃàû&Š + +AWŒ¸¤F&Ö%I£AbŒq\«—¨±±ZkÔ˜ØU“Ø$K›xHjcb”šX›NÂÔ¦9œ{þÃ,ïÞ·|ï{¯ý¶Á £
+# +0ÁÒòÿØÍr°‡úØC}ìeHn
ìN÷sáîçB:@<@Aï_Æ €á}GÁ{||´>Ð|¸§á_%~
‡/.Ë)._ì»ï‘\Zá!„,8]àu'0ÅòÃB +Û°]‡íx:Ûðk %´ß^ÖÏi opÂtDoq¤>!;ßp¼(cv;Áöïiø¸ ®w”™|¾ú-±8¯8,ØáÈÆ~>^À‡rlWa»†©Ø¯Çþ°¿@Zª=ZAÛXÇf8Zµ•_m&:-D´¶`ƒkÁwp~
>s–÷…ŽãÖŸzãK?¸"à‰'f)XËÁ~v¡cñØN^¶©F[4E›ÐÑ‚Ž&tlÐ2£™¯!'«ùæ*,4±2ù"Ñ^ï÷qÎ6çQ{œr¶›×¨‹½ê_\1øa…#b¹€PGcᨆc2¬õpÌÁîÓœ”çõŸ.EÝÔÿ˜(>£©œ;ÀÒÿáFø¹vÎÑfó|ö¤únüÚŸüá3a#<àH‡#Ž8Šñ¸ž +-FÇ"t<C},Ô\=Å;ó:':»4›†:“ìÎàÕSõõpÿWh«çýàïËÞéϾÃ8°™Ö²m¯Ð;VÊ›jï§gŽ?&xlx™Žþ\ÍGÇ\t<©QðTÀS£YÔÇ^MçÓˆÅT¢5™ŒMÒ!ªøm*èSÕº|«š.ŽG¸H;=Õ_:Æõò)DZËHÒÈÕóâ²ÄÕÎ>ðÃ)¶Ír±k†K†¦wÉÕ´®ªëZ¬)®ešìZ©‰®TÛmºjºÍÕøîKUÕ}•*{lVEσÓó¬F»]W¹û=àx„óð‹æú2²÷‚u¼ndy>˜ÑƒøÌóêªÙnžšÞÓOuný5¥W´&õ²h‚{’jÜ3Tíž«qCUå1Bc=ÊUá9^£=§¨Üó •y.R©×J•xµh¤×÷~KÅÞm*ò¾*òqt<O3~6“+W<XmaÄ`ZÌ•7/”±‹˜Lõé¡Z/oï *oƒÆzÇjŒw‚ʽ“õ˜w¦Ê|«Ô§P%>¥éS¡â>TÔg††õY¨Bß*ðݨ|¿V
ñ{Syþ+¯ï·Àñ¿0w^óÛ¿ÖsÍ6ò|–ÿš;ÇÃ:rTè¢ +?O•ûùj”_°Jü#5Òߤbÿ*ꛪa}sTØwˆ†+? \Cª•×ošõ›§ÜÀç50h²ƒv++ø¤2ƒ¯*3äž²Bð#èÞêëu
£èŠj€ýv®}˜Läê$7£‚ÝTèáA*2¨ (FùÁåÛ588CƒB)7¤P9!¥Êî_©¬Ð)Ê£tÃ2¥1Œ¥†íRJØq%‡Ú•áàéP +x¿wÁÛœC¸^_ +¥DNRRälÙ£–ȵZ¢wÈ}LÖ˜Kàp(щCpí€Ã`é¥<é9°ñk6£àd>«²FÃB£‹r£<”é£Ì¨~J2(-*F)QñJŽ¶+):Cö˜Á²Å×€Ør%ÆÖÊjœ©ã"ÅÇ’Ù´]&ÓÏgzWqæÛ2™üïà}‡àó6ø×1¯däZžÊ§yo":*Ð1CБç¦T£·’þ²Cd3F*Ñ'k\¢¬¦T%˜Êb.T¼¹Læøj™âëe´<XK£b¶*:ᨢ¬À—Š¶::“àP+±ßç«Ã½‹¨Ö£yé´Ô £EÔÊ r–fí.›ÅS‰_%Xe±„Él‰•)!Aq ÉŠ³fËh-Plb‰¢Ç)jÀ㊰@¶…Û¶È`?¢PûïÀ-^;Âmí&ö-ð¿Â¸·¼„õ¤”zäù8ZÆ›2>†ÎÔkJJ%Ø<d¶ù(Î £-T1¶(EÛÍŠ²Û™”¡ˆ¤<…'PXòXR¦*4e¾BRW(8u“‚R)0í×ংҼ׉øÛÿˣ苌à‹XÏæð¬CK:JÑ7”8eS#vbbJwStª—"Sý‘¬ð´…¥ÿÃv™ +Ë¢s»àh‚o]!ûól´0=r-,Â÷‘ƒÜRÉeïõ‚÷"çw ÌÎE9ÍŠt&€d]½á¤p×(…¹2dp¹âž®`w©ÝËåïÞ"?÷AŒÌIp]~®/OþNú)ø7ÃÙ8OZ†5,E`Öl"–$ƒ\Fyñ^3¨ù$2OÑÓüdÌ5Èà‰Tˆ'FÁžDzz(Àóˆü=, ŽgüƒBæÎå¾à5=Ï:¤©“©to9tq9ôsðo€»®\ªYÈñ{×\þW†ùmùõ!TWjÇû‘äe(U@!—CÞËÁæå€órÀx9ø¼l¼^„ìEÜ^^ž…Ç›µŽMC75ã"ÀkCOMð¬…w%¯U-aªxëÄÅÔ€g#+¤þüÞ¼°H&rþóñQóñ–exº2ù²DÀÁRŠ§*¥¥é +ÁWQÌ%+@3‚ÃT.¤VÞ„ð;@_KüÚ•|VKš«ÙH× Ò˜ƒF©7×D`aÀÐLr¸µ_hvÈ£<È£<iÄ™“F¼F6·w‚¯§Àõ›hÐes-ô*Í*Ÿêë¨1Ë×2eXÑI˜ä3b3 +x
ð©Nwà8^oÜ7hð:9Ïš¹ˆQ¸L3xm\á +ãû +ñ¨%8¥b&qOêœÖ×,”¯´ ï¸7·G÷˜¼;¸Õ[çs}„»úF7Û}ø#8Þ +y
7{•//ñx§ƒû8xéÿäðƒBõ/üÝ?”¨»xÝÛxÌÏd!¾]Ê¥?ÉÃ8 +ôò¸J—q‘q`ïâ2Ï“Ç9cÊšô¦vé·ˆùuXÎðßi²<©ï˜^Ÿ^GÁó õ¡~_[ÌÍ'22–8}@-®á1/iñäï š›zˆ]@ì"bÏ#v9±1®¥:¦:fà)dÜ̲ù%•8×)=‡`ÚÙAØ€}`7x¦#vL*%¸Èêºx[f¸áéE„Aä>š¥‘Nìlb»‰=•èÓ‰ïeæç2žùįÔ~òxV«aßÈv²];aÜA-¶±…Š63Ú§am›ÁFÀn‰fÄü±”:–ÖiôyŒZ¥G”ÌúÂ1”øc´W6—ÍÜÄÏ!~>ñg¡Äbâ—»E,C
ÚÀÆú™¬%ÛF¢Ö3“«QV¼µXnÁù8×±wl=‡¨Å>tñÖÈ3ê¡mÌI³†Á‘Bþ6òwh=úX§)päÁ1Žb8æ{±Vò·œ–òe5µ¨¢Š‹YЕ(¬Þ‡q#ˆ%ÆØYÊ/²Õ>ø`ëÝ.¶²F¶(†ñ$ÁÕžp< +G +68¬§jÈ£ZÓ´„<‘Gëå ž”“UJ©\ #›‹J‹õ7Ía¥Í{6h¿^b{?Ëvö[É!®{8v¶‘϶ºõ +!J$õŠ£ºÉDí
Ï@Æ2Ž-DåÊ‚Ç ÏxòP¨žâW²“¬`–Ök•,@9ùÌGó‘§Y?À[ñÔŸöã0GÌ^ŽÝméí8rÖК¬¢.5~aŒÍ_\Ýô¸ú0žAð‡ÇO:¬YTÀ W*NüÙÄ.gõÔðd
ÙmÕ$¿VMô{Mnÿ+rÞ“+È÷ÎÂ}´GXo|/ØÂýžìDëA]ýU¡9fyý;kfÀÏTØWùƒ5-h„rƒ,šlSN°C“ƒÝšâ‘;d–\¡%šºXã«•mh–#ì€ìaÇ•~I™wõ˜Ñw™à[ùá~É8êÁŽÛ:ZÚ²…´Eó¨‰7*HùáFyÂb”ž¤Éá=41¢Ÿ\ƒåŒ© ÆT3f(Û8NYÆɲGNWfd±2"+”Y«´¨&YMû•j:.‹é²,æ/€ï>RÁ+ð·Ñ†îâhkk‡â÷ÒnÑ‚”Ò–Q“|æk²9TÎ(“Æ›â•mêª,S/ÙMýõ˜y¨2Ì£d3[•n¶ËíÒØè\¥F)%fÆĬШØÍ»W#â^Öð¸wõhü
÷ý„8Þ÷Ó‚î%mâh«§õYÊÿy>—šÌ NSiœ•kTFì¿Ù.¨¨Ï+Š_£‚Šl#Û03À +(0.£D4DÃwq©;hc¬¨9©&Ù¬i’&VLlkšXS£i›&=iÏñ´Zcܲµ‰UÓtúœÛÓÎ=ÌÿÏðÞ}ï»ß÷½kPqˆQE!µ«0Ô©‚Ð,å…å+7l´F„SNx¥²Ãë”1WÆUJ3nUª©K)¦ƒrFž7äŒr+%ò.^¦önrïÆÓn-dÀò<Ffx<BjàáB'e1R±iˆ +AÊ7†)דMÙ¦$e™Ò”i¡ŒÈQJ,Sj”K)ÑÓåŒ~Tór%›7+)æ)%ÆüDvËi%X®ñû_J´¸ûð"uw‘wãç&|m#Ï2,ÊEÈf¾JÃ
—JáQ`ñUŽ9@™æaÊ0•f¶(Õœ ”§œ1YrX +4ÜRªä؉JŠ–ÝÚ¨ë2ÅÛ6ÊfÛ#kÜ+Š;¥Øø+²Æ˳[6à÷ö’~v#ãçšR´ÀçGy÷«„ã84R‚^sú+Ý6T)Ö`9¬aJ¶F+ÉjS¢-Yv[ºâò_¢¸ødK¨’5¡^±ö%Š±o9ñIE'¾¤È¤·ÀeE%}£è$7ï¹Ã¨ù‡älÇ +l¨`ÆÍ|n‚K-<&³Fehek–V‰ƒ•h”Ý¢x»IqöXÙí²&¦(6)G–¤"Å$WÈœü ¢‡ÏT$Éäø¾ŒŽN…;_T˜ó¸Äç;ŠpºeÏÐÿNrn{ +É*Õ°¬I2dÏPpö<å´(0§C9ûå?â(8/ÿœ›<39‚§ÈÓAþMØÓÖª»ÖlîTi&ÏSy?žžŒæ;¹pM¡gqô$*ÂrškPHn„†åÅÈ— à¼åP`~‰òÇË¿ Ì–¦qHA»>+ßÂ#àC
*üBƒÜ¼gŽ¡ÞíŒþ«9›¦£G0»ÏÅs%\*èË(¾“E¯’Y³XÖ'btŠýT¤€¢P%ÿb›†—_q–†Òà’qò-©’OI£”,Wÿ’êWÒ¸1 %¿åógàŸº¯ØNò·Õ Ç:iV¨4‡xžŸû±iù|‡åU<}‰¢/!㤀òAò+Ð 2ƒ|ËŒò)³h`y¢ú—§ë¾r„\áršYþX +0“嘵rŒCÆ ìSÀWæÖ.jÞBÎõõÜ豉óÔ4°¼/Æ–dÃ%žø„Ó› BûMñÕÀÉþêç +æã0wEß=Ì\°.ìBD.„å¢×"°c'1!MdbšÈô6ÜÚ1‹;‚œ-s8›æKópG`O+y‹É‡K*üâøžéaÉ@È¡3$Ÿxºéµ\òµµ\ú5\t5\@5™ +Ÿï¹XÃáÀÂßÃXÒ +nm ×Ú5ÒÒÊ¡]ÓÖ±@!H]/YùÎû@à&ïÁóÜ +Vx´ÒVx´Â£ŸÛÊ%ÓÂå×RÓZºöq.|æj&çULÒ+q4+ÜZO¬XÐ9HfúF$‚|‹6K[Ð +^ú?ni 5è3|Õ5¼îezqA#ˆ_Lì +ý^.ê¨Ò{ð83øºwð—¿‚ÇÛð8‰#=ŽC=†·:ªn$ó2µƒÉyÒ?t,¯àY°ï?8ÜìVrŠšüôÈEžr¤?ŸØ£éì8ýGàñ:ërX³ˆÝDìùÄ^‚³]MÖÇØ2mú›ù~žƒAÂ馲.²=
ö€Ý ÃËá&¸æ•‘GZ§ÑÅq’+œžYÈ‘LüLV·€8†ØDžDì©ÔRKü‡©§‘øóX%Ä_ƒ"6’c§vñv'¬¶³iÚPÄ6Ô´…¬ü +8K)gYÃBðDài†§žmðô`ÁÓð³÷$Ÿ«Ÿ]vàÉ>N×K<¶n²¿î'ø2LYÿ%u )tY¶€='±e¿Ì*•³™à³í\v/ä<eð¬'O„Ó7sKZáꄧKØ{ŒlYõÐsêÀ£[Ȩv2»Œo¥V´RíZáßÞË¥íÐî_¡Õ^˜mOaϲh¿ŒÓ‡Óá4Ãç€Ë
‹žrx‚ÜŽ\¸šáj‡«KmqýjÖ¦øiEãª9á‚š–µ!ñ¾¬†¤Õò +bª÷áü:mí:rã"8…œ+GS ‘¿ˆðIñÚ–™¬VƒQQƒUͧ6¼Ú`(Vƒ±BãZ7Ö«Þ¸Qu¦6…Mݪ5íRiŸª3)˜yNUæ› +˜ßV¥ùUX>T¥å3S +)1<«øðÙGƒC˜ÎF%„™-Ÿ*.„–ÿE8O#»çwr'EÆXw3ªnçy~iÀ–jlõãñq0:™R”±Þ¨´õ¥F²•ñ()R¢ÄH•â#õŠkˆòÃÕ‚/Ó +ó¸:;_ ˜ÚÀU®:G +Ê2¾X&±–8äÒ«¼ó>ï’—_{ ðîÅ´n¸šá¨a¿"örÜ„Ÿ²·*ô_üŒañî|n]ÅàîãÁäMð>¹gV°c´B~®PøWðÅ +I·ÑÊŠtÿç¼÷‘†9c/gÛgè–TW6\ÆÛ÷_Ý›²Â¸† +{mfŸ5¼*c?™ìÅô,küòôs¼5‚§Á™¨1#¥ê‹šÄàbÔ°þ¼> +9È1ö’%c›ôÙŠP9œ`-¸ çïÀÑ’ïo±c-™Ä^,p9õ=å±R ëûô˜BÚN<¾£Q¬?–õ[92ÛÙõtÖïdýn=L<ÖéAÖßÈ‘¾]«Xe»¹¿»\Ÿh¼÷E±ô󟧢x8zõ‹'¨‹môH2ÙG>eè÷k=:BÇêt5ý²J´R“ÈÂ=pt±€n¹ˆ¬Ñ½(\ÈæSÝ°té*ôO²ù.r”œŠ—ž?àä˜b¿Ì˜×C"œföã€'›½ÀQÆê~ôÙm½«m†§žIšG<º4›µ¡æªv³ƒ·û©âŸPAo“½Û ¢É ÿyš#äy®™ƒ©Ònžs´mE×»o +œö”ž8ÊáðÃÔ,ÕÁÓ +á)‡Çcž:ª³Êh†«ž©¬ÝÉ_‹P¶’ +~”êÙÅ/k$?‚f§OþàyFŽŒ>OqÅm›¸r¿ÁѺ¼!.s¹Sc‰£>;\™°ä±§"öã¥üp᪇«®±pMdíptóv¹†‘Zª«f ³^Ðéw@d +Þ-a4œÇuÓAL&cÔjHÖ¸A©ð9àÊ‚ÍÍžŠàò*P}LHuƒÂª4Z5±Œªê¸9Âàˆ_'üùâŸÑ`ÃKª0\REÂ-U$Fpˆ+mw¹´£‚äª_ÃÕ²¼„±‹q¬ÓÅlIŽî&&cÌqjHNQ8Á¢:Cšj²U“¯`b±ª+4$±JUIµ +$5È—4V•ÉíªHž%oÊ•¥¬U©q»ŠO«ÈxB…ÆwU`º¥BSDEà +Í*H½WžÔ5r[¶)Ïò´\–ʱ\’ËzD”öÃÿ$#Fžöá#ϯñw泥¯8!7#kÈßš¨ +‹Yå›J-*±äªÈR¨BK¹ +¬UòX‡)ß:Jn[«rm3ä²/T¶}•²ìßR†cŸœŽ•îxGéi•3-»ˆöÂ÷Ü[×Õ1n‚ÅŒ€sð¶ÓÐÑJnFS'džR¯ƒñ*¶U`·ÈcO“Ûž¥<{¾r%r9|ÊI);AYéã•™>MNg·Ò+åÈØ*{Æ^Ù2^5óMð©l™ÙÁöý¼›ñ³kûî‹°HŒ=S°l-~ò@£Fª¨‘òÜy2“”ë4+ÇiS–Ó©ÌŒ\P¨ŒÌ +93‡*=+¬4L¡={ŠlÙ]²æ< KÎ7•êÚ#³ë¸L®_OøÌ” +ke,¼K)EmJ.š¥¤â¯+¡x£ÅßU\ñQÅŸáy|Î;îröÜÃÈ»°ª…ž +Ÿûnâ-ÜÌÏqSýäãMâ8ûz{Ž†õSâx8Nk{ÜM)»(é3Hé4’z¹~=ÈëÇ1pÄp;ÀÍTÁþ¤_+Œ}XáŠ' Ž,ý?u§ô +Îæq¼@>zñS'ñuÏã/ŸÃ
>£zŽÍ:=E;¦§N*Ò£nž<¨7ÈÌUí#Ëû`Ý:À.ðœ_ORòËìÜ ÔpÙùµ/±ç°öh=‰kë!G¨Ë!Ü^7îï ÊY¿ŠöñJ¨gýõz\›áhçßÚ×ÓDt†*½bn¨ÞÐ6ëù^Èþ489x,ÃØ‹®h2š +‡çn1
öBxæÁSÎÿ¢Ú(fYjç›C(¨—êõÓi>'{·ogžçÊïáºÝG;kç}+ñl$n9¸Cà5Á¥…r²§xx’ÙK<¹ðŒ¢sG“ášÎ‰¹®x*‰jê]r¶ñí~"}ŽnwUL%oß NqÅOà*c}œëe;WÝ&âYC›¯%/‹×P8¼fòfc_1ì)žö” k.\ùp‡« +ÆiÊædgqeê—dñÏʺèYŒ‡³¥½Ã1@3¯åz©MaL$?óÉÉr2ìC¤&…X5>È¡1A.å%jTPªFgiDð
«a!w+'t†²C‹”V¡Œ°:¥…7)5¼C)áO(Ùð²’å1|!OÄwòDútÎ.®÷ÝX‚m )‘1—‘›PANŠ©O!õºÇç´†*ßdT^„U¹‡r.eGx”‘¦Œˆ¥GŽRZäyS•bœdS¹<¦¥J07*Þü¨Üæ¹Ì/)Ö|Q1–ëà{ÅZ|zþýxÈÆÏ- ‘k~ïkËæ’§™Ôf2µKmFØ•i1)Ý¥Ts´¼æ8%›“•dÉÇ2\ –±Š·(ÎZ(—µL±Ö%rF5(ÚÖ.‡í¨ì¶—e³]_‚[¼÷©¾}ØÃvÆ–IŒœ¼Öãm3–ßlò4LbÉÇ‹ RšÝ Í¢„(›â¢bä¶%Èeó*Ö–£[¾œö»mŸ%‡£TvGlŽõ²F·Ã²D¿(Sô™œ’Ùù/ÞûtþN¸Ûð³›±ˆëA¶ ›4Ÿ8î§6SÑÉ42’ÚdS›wˆâœFÅ8¬r:ŠŽvË,»3äÉ木¨˜é²ÆË»Hf×™\ÛéîR„»Wáî~Ü×ÀM>ãþdß{àÝÁ¸×<
=‚ZìQ1•ð]!µ™2ŠYäQ›,j“LN\ñr¸,²¹ìŠrÅÊêNi²Ä
—9~œLñSeL˜«È„*W*,q‹B=ì9¡ Ï +N¼¾UH¢O]pí†wûLúÂ,úXÆß•|VLl÷’£)Ôf9É#'äÄCNœÞPEyL²xl2{œ2yâeLJUDÒ0’Ç(<eŠBSf+Ä»PA^›Óâåð2ôz6½—Á·$õßÚÏþ;àÝŠ%kšå +Í¥B+×tʵr‚)—ØD]᥊yÐÙ +ݸü~0)\ü*°á¢Ö¸É½¯Ã»{‰œXfm…Õ°Èÿ³Ù2É÷V¤á|ÒßµÈ=růËÄ”èT£±MÐTÆÛ©ª±jE¤ZWíÁj©^v›q–¹q˜*ËBÕ˄ΆKZã[µo¹5Öc[¥_ƒU°`¥8,õŠïGñÑ ¶ôbK‚^2Ù“:£±hhÓ5“i|1•/jöZV<ji¢V +ôሕ¦æ¦Èå¸Kk4‘ëU»ø@ú®ò{.ÔJ£1Pâ•¢4à™öÅ—qEÛÚ` +1³T÷ƒ<ȸѹm¸ µüa‘éÀ-ÿí߉MKvÇ€z«˜´(j-|ÑBL‡9÷ðÏ~×àô¢3ÿp.ÇQ3
xÔê€GònÃ߶dÜÇàN¸;¹|Ü›ü}áï6Ü÷'Ѷ$œ3'ÙqRý<%&§4ãS|qJ~œDzRÍ>ù”çÞ‹•x/Ã9×ÅÒf ž|®Ê¸'y®Òj= kÍâٱ]øý0¸’Õ!,£‹Ú£p~ †œ¥Ó³´qÎ0rNÝ<ÇçˆïüQððÙ—cž;ÖÞ¥¸Ë`|øº<˜\ø¾“äø^ò\e>´›ö¥Pë³ÆF<?WŠÃO£cq|”€x™¯ª£¯iøoÐç›räM‰ö_¼a«{ý “u| ©= Ø&RÿŠKâïæå¿š—Û6¤¿˜ÛßW$þdvÿƒ}ê÷öºßÙ*ß1?ÿšX߶¥½i¿{…#_â¬ú\ü–YŸÅ3Nmc}¾
§àË6ü>±Ó|d†ÿÀüþ¾)ü]“ú;¦ø_šì_³Ãü‚/±ã…ê9ûÔ³ +Å3¶±§%êOl»OIœ' ø<!=Žå19ãéGãc“½&É}/Üù>•3d,‹ÓmB¹ñ²=âE;ÕÏbW8{¼;Ô +Ã,g_æì…Î^êìUÎþ*IltþB¸›t®‡l®î ¾xÀÛ÷Åý×Çá(´À¡¤
Ÿ$¹/¶‡³“gáÊÃÓÇ ç—:{¬³'Äivœ—6½l`÷ÛÄîµégÇÝvÌ;Åå˜Ýêö8hûCºžŒ›ãûÒûQú§Oõ)ØÍ s‰'éÀÓI©=Ò.ù\¹xºãèëü¡ÎÅþ±Îïì)îñç×9žó)#+œ¿ÖùyáJ×ø¹9š¼½Û‰»xs'5íÀÛ†í°
Tªx>)í3ÉtSI½•‚/WBé)t~ÿø¦-ívì·Ñí£kè´É~¹ÇÆ»›FvÑÈNZÝÁÛí™ÛâªØâM¬ÞÀsëEp]ü†z>óDk;áùdŠµ¥ßédI8š,yùb¿iŽ|ENàüb”¨WÄVûåf{Šc–ÍrŽVÖ€co¬“5Û(¥É‡¨÷žX‚e1/âýÜ sÐSG j+ƒG’¥Yùv¿œ™øºáꎣ7Žb%8ÊpTÈŠ*J¨Á3ÏL<sð,röêXÀ²y<3‡/.¥:jšM›³¨o&î8c$|(KÙUV‰¦u´#í³½%nˆ4œÙøxzÈ‚Þ8â(‘eYŽ§OL™õfûd–'gðöt¾˜*jmê™L›Åc¢*R£êÔàoÃà å]‹; +7i¹û”´]ìÙÆ–¶q¡QŽ,‹.n–ƒ/WO<}ðÄS‚§”2Ëc;¦:qŠ¿&yb"'ˆD5}V‰d%ÕŽ•=c(¾BöU¨åøÛð–rÜøÕ¢¤€½þßΞ
F³5ü²Të™ù2g®{åËÌžîÔÏ@¬%²¤W9®*\“pÍÀ5×'Ëâ"Ñ-¢e]wÅHÍe„ì†Ï¡5NØk¡Zì>¸JYß–ËÙ²œ_h9õæ +ukŠ<©¡q쨔+cåìv”Ç0•´×jk*®zç/jWÎPY2„ÂÑÄ@º8~ïRø¿¡5î3~Þ¦µnÌ0^iÛè³5Æ%Fõ9F€|2™fÆ¥eàÍÆ™ÀW€µ®~î5ˆÃñÆUƒùbµSå +7gaæV^hÊa,¹ÝÓ½)C"ƒ¡Gú`C³îÁ‹äÁÌëA—àNîyb*ùcß4Zï̲IhW¾GóóV
‰LêgMb©g½XÞ…8|ÍDIQÂËNh<)OŠÇòz”DòDïF(½´73–Ï@tßi–½iN½i6½ˆÁ3OLfÿ1ì;¼ïCuIËÙ…ïQáÌ|ÄÒ{b _âð€?Zøj`&¬Þ±.v?._ŠÆ×û¤Žþ€éÏ‚þñ(3–ÿ8”—ÑWÒ—Û>Tz.²Ø?ƒ½‡µ¥.7ãi<Ÿ¿%ÿoD,!`R•8¼—\à‰)ÚÖÐó`.Ð .¯jÄÈ¥HB–@H‘1°%ÚíŽá@TèªXb¨’/&f:û¦.c¨K4®#1ðwsb©‹=˜8|ÁÄL´¤fÇÒ–œ§µxxC¹ÐCxìtœ‡ŽóÐÁ $2Nºæ(‹ê˜mt†5&j0T?ŒCpmG2Žaôè×EˆhË9K(ñU/0q&{–´ž@âAk +D&Žxâˆ#Ž8j$,byüb!p,dêLðY¼õÃ]Ù‘!1š‰¢C¾H£l‡p…õÊÏøŒÂñ¢Á„\q .»÷…°àçâU%NšLH„ö-Rø‘dch€’Ê +Ñ^ô¡û@äDˆ•À½3Hvägxíq™|òDêp–„*Ýжhc´æHê +?R‰#•3Iõ3<†Ã ôP€ŠSÊ,§>Ÿ†ˆÅ Øž„Eé†q…„Ž‡™\·¨=ß-øR'6û†¦;Ûø9IA³Š”zɆٜI6—|XdAî,@œÄW°æÖ¾+Y?†µ[ð»Ú“©C÷iB”F-¦›ý™(¡ÓŠ †-A[(Äã÷¹¯üožq@ +ᥠ+™$Y’&y’(™’ê•«$ûëuÒ½y‹„ïܽ{’Üðà!y?züø÷ߟû³¼¼çÏóÕüUQEUTQEUTQEUTQåÏ!ß`¿yò
¯çÿ·bQEUþ§äò±o‹µÿ°nÎÖb¯}S“V\+Îáè¢ìeÅ:<=¾cÿoÅ¡Š*ª¼¹°oW±µ¹gÖˆ ûŠ±ŸŸW¯÷ÊG&íù;‡êDÔ›&N8:< Í‚[¦ìß9¼qtïäåOŠ âá¾ÏÖ*Æ®Š*ªüGrïì~“¥‰\Ý13¥çšÇ¦Ìö.æ§K?jÊaó˜è`[á–°Á„=7%¤¤Â¶ý +st¢P"M8<ê[^›R–6í×+;©k¯
‰ˆkÑõke‡U ¡ —lY»jÛ9e‡Ks§í¾b"<ƒÜ.îòRE•?Ü<wxçÓæÜc“c›eÝ0eß;ª¾ŸƒQŸ›°_¯/¬îj“n+;¬íàPèà’|VÑþlLuÃý`Ó]ù:kfp]”V†í"þ´¢Cº]‘C”bwÒÊšžQrÈ[Ý+ˆ ,|j…w:®¸ÅõeýUnÐ3cöŠíß+:|³a톣¿<5aUE•·"WvÌMíqФùüâ>¡¶Âlª)ûÁŒ%dátÍU¶Ÿ[ÛPYúÕÊ‹#Œ¥Wq†¢ý€rF‡tÅGz]‹¢âî(9dj_8ôºª`¿Õî…]Äü¨à°ìK‡J7HŠÓK‡wsÿÙþä“Ø—1TTÖ..Œ(r°Û®”ÅÝõéѵ}4fŽ>¦z±‹{–ÏŸ·à£µ»LÝAª¨òïÊÏ»sÆŒzfÊzkfL°½(¿Ö„ýÔäCõ~ h?›j¤}«CJö§3ëÕEÐ%‡/c_TV¹ÙJÓ*½p°ÎT°_ëú²xEêì×y\Íùð_’^HÙÚ¨;WiˆÙÉÅ
Y¡A›"ÝÒ[öˆl£!¤I²vå–^ÙŠRª9$ÊV¦d2öåþnqÕy>ÏÏ=/÷™—ë<öy÷;ßsÎóýžç+N˜Èw $—ÓŸ°ümWy0¦’ù\°*c »†<0gלˆuNä@§Bö„‡É!“ˆÉ
‰·ñ¯+‘‹G[Yš›uï?Rê|÷^î—Èrr¯ÝýH®¬/¯å‘žíëªüŸÝí,´~$¾åÒKý]×Kn±`ÅÀÿôlëï¥ò‡Á=ê»Zò5ö[7ì‹q|g‰Unr§¯Ä"~²F§8ð—ß›-cYþ¸ÙÞÄ‘\à³–-K1¿EsÁÁ÷ +®²+ +sÐ=ét¢®##URuMÝTÄü„¤ó—³ò‹Ëî?|òšÇÊúôzq+[:¨º³ÖsâÀê‚åMžnþÖ´áÛÚËòú›ä‚¹3´‹å3šoƒ\P…¡7.‚B ¬<¤L0 + +òȆ×èˆ ÀDGr€<ƒ6§ +üˆž83ð|6Ô~!Æ]{=i¶»ï’5á»$€²>¡*²OE®t³OˆªŽ¯œ1À°Ñûoâï,Nõ4•ÿªðGO\Ùž~ÙêpcÝŒ)ì àGàRÂÀ0X»èÏQAÁl²(fà4ˆ¦ ƒM<ÒAoc0 +ÍÓÔ Ý†/¢UÄ)ã öÐ|›íáJËæn¡×P‡¡W›‰ +Øx ì£À—•°k’àFÁEà‚Q®…`0|”=t€[“
1x}Ô +RÔ¡àWvHý +p`+gQ€£(^±£‚1£ö¦¤¡×±ÇûÙ>¡±—9¨½Ú–ã騬ÿ¡*ó®^¾œxú§ø#qb ,Y2aHwcýVMëOüb’/f=-ÄÈ/} Öô‚-ö´£`=·œç€¾}’ék஄)˜ÏÀ +Âð§à4ÎÜì€`"þ¶C +ü€È^ÆSpÙ|Òv:Q ú h Z€¢1 +€¸VKȘ +=V…yí!´pÁ’°Ýñ‹ñLYÊú´zY*K;—x2þð˜}{"wîü7ûeÔrÇñ„"Iwž:G”Sy¼\šV[´<¬6'RÜÜÕ¹n%Ü:溬'5Ém¥¤ÖDtbè¸Z·¦òºL\·&$ +³–ܾŸï~vç¿×Ÿ{¿¶}ß»Ïç÷ùœ<%E…„&Ýg™§‡›ËÔIN£†¡DHÁJÓê"ÔNÆ„dDè]ƒ Qè!öcØ@ +°d *¨°>7
º8P°W%
\ò² h¢`3‚^l:®9º3â Ðc<…ÍxWo67µü!ÌõúÊʺî¡Ìó·[ñЈZÙÒI‘ü4Ÿz{z?cŸvTäg‹„‚C |Þ®ø¸˜Xî.þqDh\â1ÓyâXǶC>¨M|; +Ý¡P† +ê`(d¡B÷G $‹8½‰‡º¥¡&Ìú{j?›ŸS„®£Æpä´¥ÁñW5zŒáN®K6Å•V·áiù|QþAhüÁ4×ݪª¬(——•Êd*®Ýi„³sZdD(k}P` +âÈ®|BpWãù©×$ˆ
¨ï¿%IHþOÞ¿yÓé:ß~0?_(g¦‰D¢ô,ñ™¢rE}K¾cШ+)ÊJ_*=ˆÍI,€?!ñ4Ðl=Ã…—[ P½Õ®¿=¸Äž¼ [˜Í÷þö ©}gö˜…OZO$oê!xLõá=é¥5ØdbBCö) ÉO¡Õ´¶>ñRÛIðrþ\šš’r"#;¯@V©2[ƒÙk©þ«‚˜›cç›Ìlz½Œi5a#*¹XÝmþ?”;¼6ñ2.Þ#œ:ĉ֙LiÃ’¿«ßÌðü_ +%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 15.0
%%AI8_CreatorVersion: 15.0.0
%%For: (Alex Afanasyev) ()
%%Title: (ndn-app.ai)
%%CreationDate: 9/4/15 3:31 PM
%%Canvassize: 16383
%%BoundingBox: 0 0 612 792
%%HiResBoundingBox: 0 0 612 792
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 11.0
%AI12_BuildNumber: 399
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%CMYKProcessColor: 1 1 1 1 ([Registration])
%AI3_Cropmarks: 133.1001 617.0005 229.2402 713.1406
%AI3_TemplateBox: 305.5 396.5 305.5 396.5
%AI3_TileBox: -106.8301 309.0703 469.1699 1043.0703
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 2
%AI9_ColorModel: 2
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI9_OpenToView: -15.999 799.333 3 1812 991 18 0 0 66 135 0 0 0 1 1 0 1 1 0 0
%AI5_OpenViewLayers: 7
%%PageOrigin:0 0
%AI7_GridSettings: 83.916 10 83.916 10 1 0 0.8 0.8 0.8 0.9 0.9 0.9
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
77 0 obj
<</Length 2579>>stream
+%%BoundingBox: 0 0 612 792
%%HiResBoundingBox: 0 0 612 792
%AI7_Thumbnail: 100 128 8
%%BeginData: 2456 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDD7FFCACAC9CAC9CAC9CAC9CAC9CA
%CAFD56FF9999939993999999939999999399A0FD54FFA1FD0D999399CAFD
%53FFC3939992999399929993999299939992CAFD53FFA1FD0E99BBCAFD53
%FFC3939993999999939993999399999993CFFD53FFA0C29999A099A0C9A0
%C299C29999A099CAFD53FFC3A8CA93CA99CAA0A0A899CACA92CA99CAFD53
%FFA1CACAC9C9C2C9C293CFA0CACAC9C9C2CAFD53FFC3A7A0CAFF99CA9999
%A8C2A79AA8FF99CAFD53FFA1C999C2CA99A1C9A1C999CA99A0CAC2CAFD53
%FFC3939992999399999993999399939992CFFD53FFA1FD0F99CAFD53FFC3
%939993999999939999999399999993CFFD53FFA0FD0F99CAFD53FFCF9999
%93996E9993996E9993996E99A0FD56FFC9C9A1C9C9C9A1C9C9C9A1C9C9FD
%FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD
%FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD
%FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD
%FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD87FFFF
%%EndData
endstream
endobj
78 0 obj
<</Length 65536>>stream
+%AI12_CompressedDataxœÜ½‡žªHû üÝ@߃ ³"æ¬ÉA0GTAAgæ¼W¿…v°ûtÛ=óßÝwöëþV¨§ªžŠ*ää„*K%’ˆÆOT7él˜yÇõ®×´‹u6í[þNÀ¤¢1 +KYÙZ//š¦œá£dÚ8naÐã éòR\2¯V
F“á•qüÔe{†•ËŠm×ð
‡×颺q–•5Œ6aÖÒ$kûôzë¼üAÕ/o@/Ÿ¿>\>Þ~ú
îåÓ0嵆RuÅþ~¬ÕE³/^ +~V03|ó² WY¿ÙÙR²”W¯ +sø®÷MieÚú\ÿLZ]
âfÒ7‹~‚·}#™—ƒ&]ÎÀAtØÃ+ ô{›W_š"æ¢bÈ[èH̯nª©¯;#È;æ¿GåÏõþþ¤ïÍ‹£ÛdÀ?¾LåÍ‹"þ:*Oc$<›¹É$`À.åt‘4p‘†U}
ÌåüëÎm]€¹à¿}ñâŠm‹Àœ²º^ÀÖÃ5¨ÃGÓ/+à)T0âÙöy`ølfÊFr<!¹ƒmW$—Aúe=c‘ËÂ
E‰OI>+30Âÿ(úFq€$ÀÖ€zÏ…_‡¥¡ÍáÛç;ÊS76ÏÛ9 3;¢<1ǧkªÈiÐÔ6Ë××Æ“ÿ–[ŠÀ"l6±Ëpv E|¾ñöM¸¨gd‰ÇÀÃ@P3Çt¾^¾|~ß»¡¬A*öÖýv·©ÿ¡hÆñnØ×;À´}É<~?4§ü×t\ï¿ŽL© *ràÑÛØo÷~0(ÈŽvtøã¹< +ú¯£Á1íxò¶aìßïøϦ¤[G @¯¾ÿ6~üïÚy°º]·—}ŸÎ¹[ן_2wOÄï$®¯ë¡?(Zbÿ2Ù½!þ;Qö–S“Vÿ’uúï„éýs•ü·‘öùÿ“ØúuÇí÷vû½·ýï*ù+!¿kÃûx…7~¢¿¡ÿßt¿¿áÿ¿W)þ>¨‡ÿ¯ïÿÜ~ŒüÝC{Fqq¼>;¹îSvP’¾¹HÅÁG{GÔ»äÚ3K1ÿP¢ò×Ùєճ´T5õüœ\O ¼Nð2ú팂½Aý÷Lî)~}-Û‡€tuuHzQ…·u¨×íø/›ïo%g€XÐQ4ÑèÜl;Ýós†¥Ú\[‘gõyÙ½ÿºŸÿ§Ä_yr+š8´ó!vàjž—†dÊÏј߼Éó>Z2÷·†lÉEcö–øL6“ŒfSÙÜFW,®Ûøß×
Ïâ}™îÊÓ÷ÙGPS‘nû@nm©x2ž}•PÎ!=ww¬ì0ãˆ;^S„o!í
›úa—¯¶›N¥©¯A‘7/¡Þ{»ý>3ˆ©²ÃzU·Ø›çG騘 ñpÑ®EÔ
${Û4€ØËùx9;:’½}ü¹Úr¼~xF/õ®XÛozÄÞ™Ò‹Y:T +ÈØ>à°®ûa>2óðJS +ù\^ßö{‘söoö‹æ¾éöQL}”ô—ü-†ØàoùUÆŸºo\_iPÑ
hîsñ€[:;hiõé˜÷0}Õ>éö9Ž÷p «ùëÅwÍïâÙ{î7.GÀ;ÑzãMMÙ»¸[^¹^ž-æ}l@>‰iožýÆ¢—Ó¡³Øß;ˆëžcìî)ÎgAó¾mØ'J^(Õžáñ©§Ø;ðn;ï×Pb´§.?ö†Góp<ÿª+šf}æÓ>“”±ºËÔŸh»ÏrïÚ_f»;çcž¿Eâd +`_@µ4Ã0Ûw5Oö5!üÚ±åÙüëüZt?€µ³×{ÐL‰;²ÈˣƷð³Ž=IW- ð +ö\MÚ}³Éä°Ï`)µë“©»!bßä¤gPü?ö%]Wv±@ì¯æOÇ‘¯˜kãrÇÛ¯òÜãËòƒñ‡bíݡϢͼ%ï:˜×Â!ò˜ +$§K »z•õCñµ€Â¢·þ÷Êý)ì•‹×ÝÑWïó>~ÄžõÚR^Ä–L +\•ì˜ø…>ËMŽ?â]çuÊk{ˆÖt(¢SüuŒþ¾ã€q”/ß +¾)·Ët¶¾Àa\¦"Š} Z«cíõô·ãëåTK¦†`¬í… +1ÂÄOœÄü\΋‡¾@uÉRzÜ„ÎûÞx=ðös]4ýõµ‚§5 ËþÐw ·ÃÑ$åeEOf´¯-±1îoö&Þ•_™±Åyš‰6¢SUõ•gí¾ÂÌ¡6›Âˆ±HwŶ+ä¥V!/ݽ»ìA‘þ*®¥zOÐJÞÔ{2Ê5ÙʵY…UJØ:œˆTÖSJKlr"áÞìçzÛÂ0Au%Õ’Ú9ÀÐ.Z.
wÓºàÞgÒ“Ò^ÑœV^…'šÖÆf‡QL=îÖéÚ{‚_j+]N8£e§ë8V×)QW–§ÝŠšñy1ÙyÒò¹q¯m–¼*tÜgÊtïâÌÙÃí";(Q±í¹m½§n}¡Ù÷-²³‚¿Â·VOßjjd wiiÁìéx +ê'ybéj7/ç•°†Ã‘ædnF½D{…\RÐ)l ¨Âº¤2bÙW™tœ’GÙD”uWŠ/UI¶j…rÊïêÀÍ.~6fäEÆ-õ/™1?ÍdKLÍž…%›ëY)Ÿëàîü©Æ”bc>-f8—»¨w;p‰“¥rÜTéò®Ü›U¨yýT…CH´ºîzP«Ôjµ +q".¨®\$“äT +S¡bi…uÛå&*¾ÉZ~³mT«'7„ºäv.NÙZaÚBk&·Ãëb!Á6Ò/6´±Úk2NChÁA•n)Ái£Ý<4³˜·ã`“Hÿ€)ßà ÂOR%xyè%j8"×!1K5{˜JCîL6!“É®UŠ9$^–šQ}.œD“Üb[ØðU®ˆñvºó.¤õ¹ Å‘¾HÓ™~ÎtçÝu+m<A=<’Nõè0ê+Ñ|b€ó
}¥Óáö2ïØàe:N-Em|2;±Éßt¦è¬åŸ‘ôp¶õW +sÞÏ8ùüv&¹{I\ZBãä’D½æ*Iú+mdž y¤&e¥¶šÄ×ÁÜž\¯!n°¡²Úh‹X;a«¹%•µ]¢2JîvL¡¸'8ª…ÒðT›uÒæ¡@7Ž‡c¸"ë|8!±Àìd,#æþXB/Í£– +Ÿ È/ +§ƒÇ7K¢+c΋uÆ +;µñò®ˆÛ¹Ýûmß-qòÎÓ˜ø ÈCG8¨ß8¼©ÄèèÝdô£¯ÌÅw¦;~®ÈwH±Ù +(”O
ÖÛ*ƒ— +ä +uˆ3»“—ðbW¼DJ +éŒêÜ¥CÁ(œL +ð4—Ãbùݾ;pŒ‚•¬+ÈøÒñ ê¢yѽIèNRx™J…\¼–š-Oùt‰)Ìž ô‰ÜÄ2^êgá–̮覫Mý¼s5ò]«è/¤<ÞÖKg±½\5JÞ¦O)|h¬œíŠlYƒ$BF¢êß8éêx³—ÐÜ|tF5¦«¥úÕý.…ÄÚ¤‘õéëÆ®]1šmqh¶<ìÆi“j´Î½Ö–ç‡-†¦Wf.‡#œá<rmbrpÈ잪äÜQMºÖ£5µNwàT”‰zÆÇ'ˆ™‘›?ŒhvÉ–9Ì·ñ´ëå»rÃìÄU½#Gjš€"½£`a.ÈGFÉ.eÉî’èm{hÚ™é]ŠU_<ÒõAÒZ„»VÊ’Am5 +'Öó'h´”Ü«qc-œ&¾B;1™·fÝiÝ™Í|d>[Ì0|Þ\¹ò‹vÉ,ÖD¬ Ña_&ciy<À9‚8Sì!%•†Ê†ôÕ×|j‘Ýèefë-GÊÀ[®ñ9¥òGfµC]’ŸðŸd
š]ípÂ;éxšëýb1è°kx¬å3ÇSJBW¦w ø̽7‰˜f•§ˆ°>-¾&^[ö7b_xqšp–ëfÇå났ÊMx#B£ÚIÑu|$#D¾ q!¿hA¬“Þï’ú._™Véô2?Ä…á2=´‚=”Ê;ón|ÌÕqOΓƒs§‹o£qšiô 2-4ãD3^ +ÙUÕîœÀ¦¥Âdºà› t¾=w']¼“¢x•‘,Éï‡r¨+ú³)„—ÉѨycå@e*ÁºéIL¸Ðjß$4ˆ5‹§-²dFù@žØ6]„¬/ ZäÜÙ/x¶+}–^õÒÑ\’ô§XYÜ„"°0ìbÄ¢‰$šÎSJãI:Gâé%š~r¤T%Â:
§»YßäÆùL;I†Oðeâ™Wýc:5!ƧB
6&#^ +ŒoDÈì˜s®+Z™œ2h‡˜!}ò ýxGÆK—3Q¯SP£Q{Î^X&2ÃF(nÆ\!A[ ~£¶åsÝ
-%O£K¨y!6®\èÞ,¢àQkW›”oQkŽ`_¶JÄK9¹`Jz?°TÙ'ˆˆ˜Þž·2ã\´tYA¤gÏ–4ÄÆV§™%D:”èå©<‡æÂ…ˆ®Ûåú9é9Œƒ&A@ïvÜJ*!kúò6pÜÁ¸gkªló’G‡—Ña4yRR¦,ÇzdîD±jÑÔ15)ã-‡§³*í;,x/½Îˆ@öH±Ã@)¾èÏ*©ó£1ƒ_to§¶]’d™hž¦<õ”â‚ Ó™C@ÊÛÇÎ>š8LÚÍy˜µUYVØATË1#‹f†)¶°e²”‹§+‘%øŸ¢Ó3¡Œð¥›W0Z¦˜!u¦X×`ãî9•_¢ŒE§Šóyäèï8‡&ðcôvL-x¾á:s)QÇigÌÌÔß”döhT£á†¾\q/j5Jš„RkW@ì:™íkŠ‹ /3¤EGÕê +_Ú(¿= +›Å|2³Ï>A\¬<ÍPßYz Ý#·aŒytvØdÑAÖÈts|šq2–9w1«´¦„.‡£š¥ +2%¦JŽ»ð(ÉÉT†èG™º0•%bIn;î Ÿ~‚øHìÅžîT¸‘ˆ±ŒgZG§2fLÏ1¦"e=‚kI_¾}Œ†ün9‡À”;w¼ðzò,VÙìB„ý!.ÜOi:(w¼Ãì‘ÑÉ©Z©åýn cs#Eõ'ÐeÝÒ==(ù…TöC‚IE¹}ý<t«Sê*iÂb«lå¢
·@n[4ƒ`õe¦S8mù-ãNÑÌ®½uÓÃpŒTÝ’›ïäb …ÍÔdÇ¡({$b.Êà¹@«#b–UÖ0#.kš‹îd/þ¨frnÁ»Üèd.^XÄ"mÿ<ÖL¨œˆc)¡–Ö÷cº5”ÙÀ–84×£Dz€štXåi:gÒ#1ÝkjÓ%Yw9¶™3~YàËCNb±Ú¢sœÀì”L1Ñ<ˆ“q¤ 2¨7ÊüTou’íÒ¨ÊÏ£ƒ±_ªÂ©J§òtãµ3%¬²†.¢ìp›X¾ˆ¹…È 5m°DÄpÞOòÍýŽH¬pÛõ2ŽÝÅÝ.e wN•ºÜ½ïW[b‹8à ڒ)èD–Þ6ÁÈf7¦+_Jõq?EÔ6X’Ã/mwD„\GBìaÖ8“Ó!‚£c"KIܱ¡gi×ƺ»‚®„z¦ZixÂí¤J)¥09‚òÄö
`îv•Ëû EË Jê6rß9#3®f¶B:Î׬̺ýB“¯\ç¢zëtè8ÙìïGâÍ1NŸˆdœ¤BîIq±ÛŠÉ} +óó|Ü[;r.ª·¬çÏÅú)w&Û´Ê%ÏFçšäŠü” +Œce«N1#¸ÊsªqË +“Ê»›lk™#ØFŽLe/×læ»&ëÈò
e¥<Öî-èÚ¹¾ê·3¹Nñ.wo4ß +nÊ|I@#Ÿž ä²_µ¸s31ð˜âÉ*Š—ªdñMDé +Ù° V/'åz‹¼¯9AU#Ę'€Oš";Ët¹‚ +·»(m¬“Ó&Â,œzۤƣžª•)šsQP¿”áĬ5JFÔ`ÝÙaËi%¥@bCž~–¡ƒ‡>ïPaäÚx+5BÃÑ°X[©%)¦±„*,1jX&4ß”†·Åøµ&ƒMð +ìÏbè ¢@äVZǤR Ȩۥ;¢»_·ƒÝ=ëi +Po·JuÞÜ6^î”öÐXª±$ƒåýM–Î]¬˜†Ê”„˜QÏH•[û`¿4BF¹_M2Îvvœ +9<Aí•Ã÷åËÒ¹L_Ƶӣå 6F„颴h´tßRM†“̹Ôní·zQTº…z¹¶ÊQ-Ÿ‹I˜øðàiåêáÆJšøk+¶Zl¶„¢©–dã³~!´=4Ï6æXÁ‘\~ÐæKÚ%ïžš½vtLµÛ¡Šn¡Ñfp(@#~Œ¦·-qAˆô(`2rš_c~tWµñøTlÕÆ`q°6àù}¨N¤q·çð É
™'–<!¦ $#Ì
gƒ¨õ‚-Y±FZ—kDbì º žâÖ%M]‘ÔÝRÇ6Ç0yØ$Z«>ê2Qºá'“ ~IÑ‘ +9^2Š÷xý²"…±‚ DðDÁH£^fߧI¾m&¤râ%Ø•ôóÑb´Œ[Qw¾#‡QeÁ5s“¼¯Ïd«í"~Jbóx¹·ñé¦N“ÈU‹
¦Œ.ßïÕðe>?ö¨ÑVÈ&ÙÞkÇOÄ–îLùT)gáƒ1a¼!Nd;û¯* pj½.Ýî»rø°e†™õpÞ‡–¼5D"À[žè}R4R¯MshMÙ‡ÆÆí›ã™( ›aOæC7¹óz¶cç +tðŠ¼ì Dhç0ñE¦<]<=hðy|Bß¹àÕt'µÓAŒŽã&^êóþ¥«Íêx5‡Ì-Å–5"=-/Åa-?héýIàQ«"mçI™Æ“±cgÌå9ÎðàÆy”Ýžò4¡Ý3`×Å@tÜì—عƒyXëEؾÏãþð¶Eú*u*8i¦1ØϦV_–Úé¡›¤yÿšäêh•lw²2O˜ª†ÊÁ3ŒyúñÕªâàùÃg(‹ msLû:¸±2ät¨…‹4Í¢—aïÄ_ +„Mì¨5qê`šžâÆP¹ŠÛ—ëú³<~,MWT€ãaÏf1i*3 ù +϶·Ÿ‡%˜øt©¹/|Q¤¢Æ|I19¹2æÌãi8¤¹ô§&“ÍÞÔ·è‘ÉÙž«h¡V]D +-X¥¦³+¸ËøáNç àÄ¥§fSd:$/T?'NöÍã8™gÈ‚æ-´4hQêïÍP—Ðë‡nÖ{ŒÝ O4‰ ÔÒÜ‹W&/§Æ…Ê¡Óù8X*€êu‘éÎs$eê~zàÞ(“ÌÆU#Ì1\¨àR?1Œl–Ñ?„–p 1aÓšg Z2óʨ^i-1ÓÃÍž&D‘AºTœ–däU󴟸۬h2¤2‰?A™ºR=c¢ß`®ÉÀqv¦8”u.yI
Ýuf‚/ôø‘Ffª–À4\ôgt¦[ˆíÊ":â½-y¡×I_2Êv#(®ì2.Z9ècÍ°cêLl +[NsÌí¢8†Ç!›à*ŒÜɘxïûùŽçÒ«ÕýZϯ>qÀìÜe·µÚ„ÎÛ+'êËŠD Z©>AÂN'ZbzdÄ)ˆª®:W`ZhFt“£©ý´Ð^Ðv0‹nVÎØúȘ/ÐfÚ»Ê`ˆ›¶œ(W:=Åw`ÂË–I†ÜUî4 q¨ÒÚ±²\÷_XqÓI&…~j…õ,Ä¥2ÎÂ|P&ÊƲҡ#ˆ³æ’gúI…']Ñp[nöÛœwlY“¤2ùãC™ãÄb5ªi¡¾¸“I¾~¤š8y‚:…ºµCm߉EølÝ# ¾d#œ¥š¡$šïc—9®ÅW‰)¾pB8TdX. +£XûåÎÔßÄ#éب=™¤BÆ—¶WMh|‹¶c}òtÒ¸L(EãPx–êƇ”§ A°Sk ñýy‘ÝäÆ<œžùÅp´tÙŒWýN]0ᤫÙM8³;R?zÝË8>'„¹[#ÅÖ^ØU³|t³Ât:ÈÈxeɼ[Hêñܾ~uÎqI„µ<ÞÛ%²'v¶™èh‹ùÉÙèQ3èXz†ÊqˆáÙÚ¸Z¢F~hÎGöh"€¢
‘Z•ÑMJFœŽNžlåNÝö$ Ü¢¯Ïù£F(sÎrk4âÄ;<Hn˜ê%¶ãNUkfïG‡ö#€JÚ׫õ†[6mŽ.BkžŒˆáàžoDœÑ1/u‡NHÞŒ³®å˜R'Á)Vx(%²¼¶nÓ‚‹‹yzÃõó˜sÖõej!¼ªU»¾rÔbƒåª–½äÌ+¤ 2Åù]
A@½Ý¡6•×NÆÆ +ZŽ"KlØD\dÒ¿DºÑ)<ot
ª‹6ÒÊb +›…¦ržH¤SÜTN{ÿSç¹¥(´má'¨‡*¢˜A$眃9çüþ—ê>}ÎýY5FYŸ›µçšs±ÑÍ +Їîh̓YEÅ)Å…ë{Um&6ÛA¶ê˜ÏS}{¢wçzS·M˜Ac5#òsEb;~ù\ËQçß,3×䮂喘Ïn#ð[Ú`bn‘mTݬ +^u®$ëÝoï—œ¡~Ôà°ÞЪÓΛ©?×N õàI‡ž–µzî”Ø1ÎÒ·Ù¤axÿÅ,a5QaÌb-Úg±ÑØeaT˜/Af9#Íå=”V½H²=ÅÓ.ºŽñH%ÐN¬6‡¿÷äá~¾bõ@ïiÒ§PòÕ÷EkkñnÑWK똉ó‚Á6o½»¢—k—˜Gpº¿òZ±2h/Á%æV5×)VÂç¾ö¤d¶ÏA&çé4nŽÅËŠ“óƒýæ%±W˜K~¤C]#§À4œµ&çÖ#›\4 ‘¿Ï=lŸ@»òêÚëêæ`Xš´ "<šô°Êõä®#ãX|?¢mYoôͦÅh3 +ºE/¿ú5ÍÎF©Ð¾¿FçÒS&GO§x¯‹ñù0µ·Ås#´O.‡’¥”ŒyˆÚ×qkctæ‘~«vóÀäU«k¿;¨ñ±;Ö:íÉÛoë攊PwÁÌiÿëRTÁ‹(£¼ïÓóáÙANVê¯ [§¦”ÜÍá‡È{`ãu’Mrâ›]YEÔ–ÕJð{²%Î|°N3öÎõõ"ØP@ØÊà2ßûÕõžõæô®aÑÒ3/¨N×´26Coá©iã±_1Ѫ5ŒÓ”£éÐý‘Ù‚•j>=;kÊ£:µoýÙÀ“ÐïЧ™R;=»« +ds,¤«KKob|ë$̾ü3Á^RTÎ!röPëñ[–bÖÚJ´$‹NwS«Î¥ÆºØÉÎØYîÀ¾„Œê”T¸VYõD‚›yô±Ð_5 Ÿ¿(ÃePjF\û…¶ö†fõú7noª +±eÑoZx
n4ë*wãùI5Q~:p8¯ûzUÝãÜ)õûK<ÈàÖltx{U«9+ý"yÝu½+£³ÂªÖlhßžÁU,L¹%Œ<ÑÊ¥qœ¯Xyµ–ö[}e§_zÌò…¶lÄ‹‚:ˆb©ñ™)¸Ê=~¾#> A\gËQ]AjÎë‘íwhÁpí1Ûèþ°úâ”Í +ôÎó´5Ï}É¥Q>€JmN€ˆ¿|T_>†~`ÛÚ´'˜ã`*ßg3…™ù4"â·ÅV)…”€ÝàçG¼’§™²Êêväîl@_#™hnfQÛ®§rá€çÞRæØÎY¾³›\&n¤lWuÈ^îðKZ>ÈMrÄ` “÷¯*mÒTœ1ÓÚN«nˆteÞš8¤Zß!—-§?§l¯ÖOcP&4¼‰uÓFî-•={äe¸6#¡¿2_Ø…“Ä"†ØÖj™#’_5Ë2<7·z÷Òé|²K»uÒ7Í“kƒ€ +i+U¥æN*îÄñ”Å@ÁѨ¢ 5ϼ¿˜ÛÍpg-¥]Sâì5Ow#¶bv˜+Mß’ÒÌ e4ZK.éÑš?¬VÁcÎÅýËh¤r•<»^êJÀëÒ–rûÝu¨á7•FûÚ|ÐtRÑ2‹ù$KŸ>Aç‘[rëͧ¢9ÿî²dO4bà¼Ä¬z>˜•fÉj¹V‰Ïq$NbµŠ¹^£ïI]e®7û€ãÛßÐêJRP†VGþs˜Ap^ÎÚý9´úí/îf
Š¾&⼌ !qLñ±ãÞýŪ³óÎëa,ÕºÐI›ðÜVà§c†ûof>ý<"3›E†˜N:ßôò×mšò¤Íì‘P0ˆü¥ìé„>a åu,¸*UG|± gê +LÔp ±@^å/;¿šªñn®Ü«SÔÎ÷ +sNãhèÝмÆnÛâPþÄ@GÕåÂ7<àmCž1<+ØÞïÏÔ}v¥r£æ)©óî-9,cV^W™ùíÈV•r¥FÛ{¦%g4±›Êɳòä¼^í£Õ*—Þ¸ýu™õ©Ìƒ—%¹XVAÏPÉÌx›S[A.~_:FBäÞU¸í†–~r½5YWŒš° +›º> +m»>yB‘Åß›¥žâkâW³j¿OÝè5¨e¸ÔT®~Xû,´.qï— 7‚JÚqÒ“f²Ò‹åT¸ÃÆRÕ+™±Cõ<W‡øR¹ +_1•7CÉW\úÂêï[",NòëÂÃ'KsÞP½vihå÷(¡Æ‰|/¹5Z-£é×·ú*2¦Æ‚SPé¯^ÆÉ=ó™¼æ JQ“fr§wn”V®qmØÚ}K¬‹)Q;òTnä>ù[™bVˆÏï:êZ¨\ä·´9ÞŸBM$÷•Ñ‹ cPÅê'䔚LTý_ûj’¶I[êL<‰9NôIñ{+*; ·‹5³Ø¥J|«v¡×ò]ùÈà÷†`ÃÜíî©:#÷|!x2MÅfÀŽ>k†ÇÆN`ðP›ƒÝc®Ø…µ7T½¯´¦ÔHÑ®G(ZÕ!ÿYCéÓÚ.÷ÞˆZÿâx±¼äšœ\¥¥M?5ˆƒDØñ2ÕÐNÒ¼ûI±|TÝÚëˆ÷ä«âµCÓmÁ*,&ŠæìD>µ· ^’,ïÖ¬&q—¹T°ë×Øì|qu:€•h„ÔKF8¨7Ï*®í:È}Ó$m}¶”-X!ÖìQ\:šŸìïÇ5w6*ðâÀ¬0ü +“Y@ã†ß릙{ÈvÏ,"ÂZè¦Ø{¶3¼%?:ýN{&®£Û› ½g«hÝ`ø!Øtð?-5çT¶oXIiìñg¯õ’ùŸ3IÚÇéN‚H½:Š¡b‚Ý>V–Hî|¥îæe^íLšú"Oâ +ÒítóëF:mãðUÊãpi„ˆøû ›‡R»ˆ¤í¾g»Ößz âNzœìøgì56]·OÚëTºòU¤Ó6u¨ŽÎkS=G+^ºóŒ]Ú¢¿GÜ2¡¦R*W6;«¦mvjK“ò÷ÐÙh¯›ˆÑ‰Y‹]†œn;ÏT8ú7ÿµd »È·pË ÷MÇÝf¼éo=žz¸:úy~1øÀH`»¬™»½ƒê^9ýTÁÙ¤mÖK£êNõë›Ûd°·f! +¿QÎ\^w¯Sƶ:ÿRuf÷»êËSéÛ*ݧ=}IC]>‡9H<ÌW¬vwLw¬Æ¦Ø‰†%/5ó™ÃÝÓóÄ¿7TÝ(½'ï~1gg6k½ý>m+GÕnXˆ>sÕŠÖüŽØ4²HI-óÒME}tâø\Y_
½-î ñÚ˜÷B.IºLŒmlÇ KŸôǬØ}Ž”spà¦J_l¦<wE´“t—meŒª“¯Ã½‡ÛÞh+=j.6cÛ2üŽžBäàÇH«bÏÄaŽ> oëÔìÍZ×££h°s\M²Ÿ‰žx|ª†=Y²&ì,©y¡8[ÖÚýß ó¯àw€fW'f³©üp„†Kl£\‹k,w}kdð¶S¼Vï>ÀD”W½°ìo +–Ž3‰•÷TÑUy{WµŸ¼Ð¶„Öqo“ïm°ª¡Á*s“ˆm]
ÕéXXXé]œ5an}VåtÍXáieü™ÁF@ŽòXyÎ(W¯3ÏL0+Ol<w™î@ëÕRµnCä±Ý5 +à]çÒ"l>®G)ùú±^Õ¡‰r/¾F¶|Xu¦‚4݉ùÅEYxÖ÷àæžßvq$è¦'šëQæZHÃü¢ÛÂéh¹ÏÎ|.®BâæÁü|xµ¥»Ñ¸ÄlzÔaúrzU×£I³ç„ºX®j›Ýv¡"ØÒp¾694*™d‘W²=ª +ù˜"ü{²ë9È)t¯÷ò+·)*~œŽ”S/àˆ6[Þ4Ì¢f
y™ê<·T'¨ì1ÂD +>[â£IÅP&jWeÈÀ&åGÕjÛ¨š@nÃ9Z9œÿÜØaç|ù•ì€êúõ
qý>/MK³ß‚-æ(Få+}–ÕËî+VöJ.R}ûCÙµiE¤µbÅsójÁ»a¯..ðbÉ%‘puÙ*%îmõ¬LÛõ±~ëÙoÐlÈ“žÊiôð“×{Üs>v‡ôÁKð—2½ëØ.ŸºûìÜdÑâ>®~~ü+ìßa°:º–`ÉÕla©×kúw¯ÉRÍ-«;îÉOÛ¯ó*TQ«Üs¬ÝLËSR÷1>ªˆ[^(„¥æ¢íG´±ÍÁʨ§\©(ïõ«½ò=ÓØ6îèê-r`;óå^ª3ï»»êxŸ •ƒ¹Õ:KD8k½ÒâÔm[{Ì=ŒÏØy¼íÚ ™PÚ@³]k‰ñ$Ø~t£ÔëʘÌ.ZþU@卵àÕQEÆugÊ.ËÖq|Óö*bñ65Nm›H$ÌÁ—«¤Þ¶Þ?uHf”}£Ö/Êïë…ÖC2ö½’ÿÔœš_œß¯cËܼº\ +cs â½° Þ¬^Ì+*òFÃJXþß39¼øÂü¼Æ r5ˆ'Ç΀‡Î^zê"¸öol( +xI¹FœòÁ2ÉSIQ’ƒ'ŽÖÞÖ×î'p`ïõ«uôæÜmÕÛ>m¿ˆgã™~´ÿ¬ˆl†¬e_*ùÞ×QÉ™hMØ3eø"‡Hy×ë:´Õ0b¼"zÏfT·Ì5Ü3¸r?ûÏöpL>IñÂ^—¹Ãv-.jƒÓ×ÈUK¸]“ŠªŸ
že¨,̼Æf8xdT)ŽýCOíÀÿ¬É¨‹Ø~" RÌGö„š¶Ñ]0m¡Õ./=·Î‹ZžöIñêJ/œEç~sŒûúRð“Yn~ î§DÈWÅ,<Ÿmb$_âÀO˽†?ÀšõæC=6Bdwê Ë¢8qªê&y€@øSU´Ù/ºf÷€MI¢õ8«¤kYÕ¿í
´Åø†*å}?~¢Uò¥âžÇÇ%*¼£ÿ œ‚å¢Þ%zZìñÔM«Õ.Ò_•ºœ¢'¡X¦Ú 0#Þ
·++çY +ÉfÖi?é9…ñáM,ãÉÔ˜l”·B`º‹˜Z nDO¡çüî/ʦؓô ^€§ü²ß%[£aWóÕõ;áF»½hà †2ì9‚·A‚ÁŠÖäÙpǽƒ þöše&P¥¦˜ía€¥.wœõÝ1Q3(ŸÓ¢ùâ7˜R÷h4ŽÅGÈËBP¹kŠ•Ò_ÌêU¤´²ëþ» ›ô+³®~åïûúµ=Ìêy¡ý$éGY*cdéjûá½=¦ñ_”ÒŒDsÚØxŠ»Ã²~Š`I·ï¡‰cÊ)Â|.+I¯ìÌ¥ïv‹s¢¤ŸýôÈćíôÂtÛÍ,¯ö&±Õ¡æý©3vê·gò×ÓStÜÏú·< +qÞ&B K}iní+ÍòÉˬÄôMf¶Õ÷²<à9…Ç+”ØÆIÌ[ÓZÁì¸(FÒ—qõf(Pÿ=‘ªgÑg+ÞZ~mpYR™‘1>’Wu+(ÑNÌáí¬sÚEÞG$×d=É-ÆMQ²³>)0¬BŠÊAgªë2¥*á×–Ô黲¨ö†{GÌ÷£»>5+æYt#aÝ…–មïÅuo¬ž{ü^¾+§Jô-.V¤>šÀ/km'Nƒ¤âÎKl(ô¬M ´o:ã³°Q&Úø3¥æV½Ñ»‰#‹£Ð£Á˜Õ 䋇[¹<gÕ`!PwÉ/W—£[¢€ßó–™—ÆB¯–…ü’Øv\ªöá„}Šz£I!µåF»+V*ãeQÅN%uOÈ~Ô=âXŠ’Fì1üËZçA²as”Ûo²ºÆJ§qöÜïp)÷<ñ5f…GÏ1ŽðLdÜD›.D}^¡EœêƒÔqo(žÆÓÙ?g[€ï©ÅODÊêKëηû(v +ÃüÍØcÊ|ŦÕu„)*!*¹m²³íñŒ”ÑmÚ²ùoÕ‹§ÎYÁϘm¶/ê67Q:¬ºËƒå“Ïk¬ÐòUE\N»€‘4K’ÌŒ9ù +RRD¶½BÏ1:ÁÒf²{vH¿X3«•åL:·ú€ˆñR¹ŽÓªÄ@Äg9“Êklɵ;yRª[’]!º»CÉ^Yóµä]ç½Úiz®[ž_äÂë%ëë¼””ýM»§ÙGŠÅÐð§©Í–q&Ko{x%‰ºTo?þRRÚåË/A÷÷Phíe§#TQ†¿°Å—Y!ÄC žÖ8é<;Åѵ¤%RÅ™¡££þJ·¥ÎÂFjNvcì·÷¸JÑhX‹Ì—ijÀ®jç{_›ª®þ¥Õ)‡.7í.¿ômøæ[?hš5Ððn 2rÞ0ZÖYþñØVÅÁ©›éTuó"‚o´YÆMÅ-ìÞ…‡ž´ÎžŒÀ`Ÿæ{_šúy>#ÄÕ¬Š¸S7Kõ1) +‡N{mv@è N¡‹¢YåîË BÍUñ=bLÂúYÓå©œgdåþ½3íþ]âµ\=ÊÙÿž¬p~ŒiŠšU‰=k‹v¥”ÚxÙO»¬¦ÖˆŠey;ƒ×b]0«|h+¦å¾«§‡
®éô”æ`Âaµ—ç}_¤ŠµÄƒúº¿t7‘nE%»ž¿“Šã{öÕ2ê +³¤õÖ}/^¬-tï(}–Ñÿc’.©ª5Êî…ghnÖ‘²8^CþÎÙ/¿ÊW…ø^Ñh`ÔeÈeï‡T©PËR5XÕfV$ªæ¿Œ®Xš1³®\W÷‰j6ñ0nûÕ“2¾Û4•:t?ˆd¬©€øÞòësÇ»ö]Þ?ùFä{ÿ¾Œz&>˜P,¿Í%¶¾rÞ
ûmhÂÀ8U¥g_~ìL^€AÎêƒJKèJüÓS:j
݈îrdWø% Ícàò!ý\„±¼ÅŒc:•¯žgdávsFz°˜à6"—ö4½ßI'Võc>CldÄÐp*¥þxc\$ãŠ;ë#mGFj +ƒÛ±ëbLÙûl‹tß¹UK¹Ù˜5nIñÀ›õöÕVl¿÷DÒÄ
aA9·&¿ +ïX¾+»ÉÆåHÑXjÜ7óŽÓ ö»½V§êº9"Ì÷?u*1™ÊG€{šÇgÆ[aœ¯Ìi“ÆsÌ]Êx$Õ2yoÖ†)lLè›È¹ƒÕÛ5ñ¥sè@.r`Šv=¾Ü¸‰5íÍŽÞ›3SZ
{ý`™þºmxõšØ¨^Ïu^¢¡^Ì?³aÏÌx)gÈóëÇcÁêæFó¢ôZuuü0nûŠ“]hሃ6bÀ)ÆB·Ãy®Kƒ\ÿL×¾»~#:ÖâªuZœáWàÒ~8&ƒ6ǃ÷î±òQøæÀæ¢~EhÃ9¾†³ü½|^Ã?<É׫,*Áƒ-òñØçñÖ“´;ß/W´?wsâ–Ó?bÜïWB»•L:ÓBò`–ýQ‘UÕæ‘%©ûŸ¦á3ÄärÊ3rV&9¯~KŸýVÝé ýmsæïî ù¨UKµ=鼎›ú?l_™ÒJŠ+wÿð¼e8#{£YC|#)äÜ…iQƒF$µ²¯íT§óT\Mè—ÄÍìe‡ÝÜRš_»î*ôuÞ¬*à‹wÜÑü¥õŽé»'?gë¯}½êd»ê +òýòMì)H…ÿ@-9Üo…Þø¬jÆ•Í•ß=VMâ žkÔ¿ÚÊÕ >œ¯ê"äA{ðŒ‹ÛDLÕI))üaÁÑd«%ÆÓYsMëMcfØ15rRzôt®é‡Þ²Û!1BbtŸk²¾YVªâÃ(ÈÐï–—þ¹nåqü”·×ñ<s ín·qnìàx`§q[6§¯gyâS/ç`¤Áϱ÷f/u^¯1¹§‡,¸rû\¿äàæfÓë{£¾·²ÀZpµ1b0þ†J•’y÷ñÉ?Šä}äI3 +ycˆ-¿s.Ë-`–ÐÅ7kÏí´î•‚µV³ƒM Hè¾]j!É(7äøwº&ï˜àêÆñ{‘'?I¨zi—¢½Ùoã«î + sëB+Ú/€k=³jÃñOaOäxÆô+UŸÁ2#¤—BV`r×A_4;z•Óøx¿<jƒü¯ØÛœÇ49 +ppšbÈÿaÁcÿŽu.; +I6æ½w.5 ¥åg?ixºŸ%QVõJÐ쨔øA¯^t3O)ü!ÓiÄ+TYÑaU È´j\+]G…+‹¨u£µ3s~ ?çb½5~FFÇnç(¦(]Qóô…y)ÑRú€Wúèðü¥çÒ¾zÙÅŒEéØJÜ°ÒþØçBÅ· çáIÛþèë<‘ðdÔü²ƒ{ØŽ_ÜW¡%%è½ì +ÄUTæ•Ù5<m,¥&ë™X3¤á’ƒÈe¥¶³ÿöaæpiƒº[hôÓÖ +†›ƒµ×>grù~éƒMñNïÒìðjÕWá*³9iÃI{áPç×dˆgÃALo§x`Ãî<v‚ÝenÖÉXí
:ÄÐmµ&AìݘEZ)”]®D0Çý$¯±åÓf±k'ó‚!æ(êÑ=ú½ÚWXË®µ öµ >¥›pûZ¸ëñUtígkñ¯çœIúMÛÊø!%ÓOA\?í•ÜF·9ýú?P*ßvMF`Ô¾V+Œ&ßgž&çÿ¡¬>/üFŸN+Çu–R0lÒ}¶‹[}^÷šd®*g XM ¥sy`mO2?¿©W±6µ»ÏO•ÜaÍÞ›ï*ëV&¿â°×Ãõ¦Ùð©’ Ž+ OÌlkrÅŸ±Ö;RBŸêͨ³ðÄdŒõÄô:.W¹«“Þ'V`‹@e⧷–ôž_3¯mòë» Ã³pÏ>$Ó¿Ö1[nŽpV +Ä.[Ÿ.^QÎ)vª¤,ºò¦ÊC‰d…Ó3ÏJÓ<ðû©ÿ@ªz27’?Š·‚Y# +c ߥ½€LDL_¶9HÞ~*5äI’íç¬&³îŒ»Š e÷«Aj>„MN}à_åYÿšdä.=°%F(;¯±ýåîOë+-IJïíð̤ÉÈ°…'·O5Jq§£¾ûˆKŽ.Ý‘¶«›#<ö›õúêhíðÝ'ɘIßÌu&ƒ/ϧGÒâ›^¾÷Çp'qÇ>dWÞajªÁ¼ÇÇËŒïíÃ× ¯>Ì¿°í˜‡Å¾:JÐ&Ûã€NPì€=oÓÙ.¹Ú¦‚É7Ò”œuÆøÜÛX‰åôXßY£Ë'3µòÕEœòÌ÷°‰äUë§<?¤ãjüTXe¸:›ÇQ£Ä¢¿à·÷”m›.åáåŃ¯éX¥#Ä‘çË7?X¬TÀ¥îmµ=öæÌ𿾗²´ôE™ˆM\æA$Œ@¬ÇqÚ2rYÜúÚwÛàÛãW¯—Þcg´O¢yt<Ž45¾rëûši;fŽ»L‘'VyÍ,ˆ¼-6ì´'{,½ÆŸaïž×Jqã
Á¼ Ôá$¹–<ÛÓ<°íì¥t +R²ÌÖü‘Ÿ±Ò}M¡£5]–…@ú|eÜ3g5’º"âî8DÀAô +Ö#q±µ=ñs´¡ÈÀß®(•ªœ(õ +O‚oƒ†DØW²ÄùZLHÁ8t¤ã6ºä)'K¯+—ˆ½é„tðVöÙÝøˆçob(Þx\ÛÆqTWz‘Â÷ÏyG–u×D®Heªt¾'mËÊ’61JÆÉ>(×× ô¾ÓÙ‚bŠÄ쾤IçüÔÒÆZgñ˜k_Ö!$OŠ§Ò¹Z Ö‡†BgÌ\àzàËÑ*ù{O.¶…õáh‹µæ1•ïb!¢ƒöqhïmƒ>^¢¾»ˆÖvúu.eoø(„âåQò”Ê4Fš6ÓRø8‡}c.$Eó3YÂ_ÕFcû&–Ç›éÔV^€h¾¢.¯աÐ?v3…,à!Vû»!£ ‹!BèªlQðºRÉSëÒYñ|ˆhJÝ û“ðaÀ+ÒÆ_댿_ò °*LZÉë˜.ó«7‰Lë‚l±ÔÀð”Ò'D×ìúçJo(DcÑnÔÎ ×Ķ |¤{ïá°2Ø\Hõ+;”%|~µÐšê¯çW~VÃe–¬³_Uä€M“jîÇlq)«’Õ©T‘åÿã¸üSÿx_a8lh*ÖÌVÊ•‡|q-å#CoJ<Ðÿ®Õ,åZíE¾°»Ép<U;ñ•ÿc$a:)ó1þþÌy³Y¹C1R¥ZãtV·› ¨p–möÁÄ–ÐÇ~£Ûò¼²0ÆC©ç¯ß£‰‡‡ÞYiR +JÌ:J½9+ÉoÉ*ŽË%©Àø¦þûBÇN‚^P +Ãó]©X—øßt 眄fAÅ`íY¾ì® +Ï÷4u™>ÿZiל\wyáÀØ—‡™…ÈÚP]šC»™ïi>ŒñëÐ1FµûCn9oㇻ½xèIFémçHu'Ë©fðZ´p‚ Ö‘^—tÇ.Mcc£¤*Ý´0×±Þ¥ãÙæ#üL¤F"•f¹È7ý;Ir+wà^ìJÛý’‹Ûô,…ÜJi« “kHœ…¦RÖ›•°êð”Ú‡¹FKâùÁý)åîBJ³¯;÷ˆÙ¹dï¨ ;6Ÿ +]I¦FÏ +¡¹åG™¾ +•7ï°ã ËzóßÏ3ËpÚ^FÖQâÀñ‘½„¹ë»$WÒ|¶Æp{JTYðº™ôðôÞ!Á5kËß1_a«‘º¿g+·°î§Ü#:Sä”j›5ÏÑî0ƒ“OdâÈD8²PcåÎ_²`bG¤þ¿,!YŸÎ×O³µ)(á²hž…ón̶$Tx+ã)»B›®;‘×&†6— mµ‘ˆç¿c¾Cî¤óãU5ïM¯ÈF /}Ê>ïÈ7÷"÷Ï1 +Ëh^6šÊܬš»§\/oG¾´ÿÝH9÷&h,8q¨L•¿´ÖÆ·³dÞÿŽ*Z|½ŒRXµ">Ržg¿¥'h›5c1ɯËÒÐþÎ`U2ÅúFlÎMÔ-Tõ©íô¸î
”à¾ô©Tõ"3€u(Íkæ°
i‡ÍÄÐsë¿c¾¶jòÔÒneM±Lÿ1úý¾$‘[â¦þ^!º8hl^í{žkÎ@ira4ù ‹A +,³sg4fLwÌ4+‘ÉN¦Ç›õs÷°;AÂh—‰ß«V-Êr+O»ëTþ;ú¬˜å|Ñ…`ú™ù{Hr"Újõ>m{Åt§‰hñÉ:pûÓŒÒ$lzÙ:Õ×¢ÿ‘2a·õõd¤Ý›À÷Óæ¢?!È»UDfº„š|X´®0ê_ÉjciÜÙ
+&”QØ_ÒB%½=!P~Uy6éç¹|8fèQ/¬ƒœY0Ь•šÁòSãó€2¶7ƒ(ø +/+á^-å¹ þó#înë=»:¨‰6òþâ¤O[¿-)ìƲ!r +û;¾†bÀT?Ç|·twÆ4ûjT¢G_CfÄå³KxNùl¶Ž82ßƶãr}ßwLÏ4´‚‰òøÂvƒcÂòÔ=z¯å{©ôð¼{÷¤aa+ïžÙÊe¾‹°Î>B!w}[ ÖsGÍÎQZâÿ&Il@ùEm’ë‰ï†ÓÃh¦TC¸JwãwÕV@ê€:5‚cò§1ü¦g5šfæ‘»™ÿ@&Ï ×R:?5=TZ†‘ôFÃ5É^·ûÉôÛð +9sÜüÔr@ë+<ˆzõä µþÿŠó;ìW×µÏÈ<Mú–pî÷ÜîS˜µ„ê6÷ÔäûÙïKí?Í6A3ÉšõÏÁž(Ç¿™“1ç—;žŽ÷'=d[(9ý/9QoXo-«¼*×Ì^tžý€Ÿ¥žÔþÞ2˜°UùüMŠ½›Ÿ_aÚÿµl4*£X‰ž4£ëSßšY”Jûv1rÉéôÙ¢FçèÐN¿g2"lNf˜Åì|ˆos ƒó±z±™F
³g±êÐ/ØçàÎDƒã4o0úé”ù{—kR›
.Òr"bä¤ïô
Š/W.ADowﯟv燰°”^Û”›¦õ±þÝÏ9~ó¾Ÿ|²MLþ«ë\WUY¶O°•`Fœs1眳ïqÏ=×¹çüœß7Õ¢©0Æèêjô²ÓŸìÑíUÄ©îhiT +éåóÔá—ݪA$RØݱ¡ù½ÀöníàâC„÷êÄYÈÌ&¶nKLasŽØ“àRíE“ë·;}ߺí㔯]EÅjøàÒ?Ý[Ư)ïÚ°²8æX®\êV.õµðŠVe\1ßë¢B㈈¤s±ß¾ñI{ÖûNëæþ¿+Äæò§¿j7×mŽP\Þ+Ý 2Õ˜¯bî}Ã&)¯ÌÜ<Ÿ{–ÜVkWó%³´ü5äUÍOmR'XL»žÒCo8V° +î +Ÿ@\!®¤òÌ_éJß}6g5J`QŽñn`ˆ¸DkÙáÙ[Vý"þöÀß½XáÌœIÅœL.ã$ÙÙÕ¹•|\ÑÆå¡)Ø$×½jsaÌt kEÎ×ø ¸ÆÜ4<Xî¹³2™m[駷"ån€$Ó¨…{›"e>Fwû3EKøƒ´é€g9²iÕî8\ª¥©#äGuTÚ_@°À?ínñKU×îÇo¾Éñ“áxx6âYÈjáå¥õ{Ÿ7sÉ‹&(ªjl¯þÂÐçzà>Û‡éùå{ï:+q‰ˆneIÇ–ˆ‡Î¬Rt`꾜¢GZªÞ‰ªweBJó¹€jv²YeT~¶«ÚëÚ‹1Úykº/É÷6“™6ï¹i'qÓòéëtpiÞ£µul*‹<B¥µÖ±clÖóåä=¸må¢xëĤ;<ÐמZñ¹PÄqÎæ:ÇÉ)•%Œ6SÚŒ¾Ó´t–om¼ìûû¢=Á‰ÑÆM(.˨ìëž1B×yÝ>Êò¨Y)Û]Œò„’©‰9¨”kÈ¥}¿¨i¯¾g&Þé±`r§Mõ ‹~ï°›G‚¢ìG/ÇÀoÛ¼X)SõQ‰Pc9!ï›|‹´swÍJÆÔþÉ°,@mpX\ÂȸÚ:löN:í«¤¶tâƒ>k–~&u‰rMÃ`fÒùd¨õvñ •1b°é|§ù´:ú"›ûÞx–yð±Ï¨må|h¦}n3^ÐpÑ*ëÔZï…O»¡Þúe«Õƒi}Q ¨Ÿæ¨±ïªR/}év{–=Ëv±?ieâ ¨Âj蘺‹i»F“mŸ'OØÁå¢K¤¸G0*tìÝÝÿSs:
J,…=¿T9ÖÉŒîŸZ¤™w–ß„˜á™QÖfk§ÍEÉÝ=”‹-ª¿2__ öÛu‡H0JW>¯rÍa¬rª„t±SÐ Q;þìIë>´yöác.§ùšPýA&É$GUS®Uý”¡ZÜ[T?&½xiªr«>à™²Ž®¥ÉDƒ½_淋SxÛ=QuŽ‹¿†”yjS'¿_Sç=Ñ‹ÊÖjCÊ¥iyVU×.m(ß™™ÊÐQ?C&€;„7ž8þcJô,ЀÀöð¾õ´w+3Ü= +naTÈV±Ž<º…'»¾LÍÚd} +ÏOÝMËœÝW?I¡«OÇß;Ù”5”°E¥%;@û01†EìÄ +¦ÚËÇ4Þ¬{^ +¥Tq|<:±8²Ê`)ZõmÜJÄýœn³(†Çí¬ÝÌóèØÖšqjÇ„xÑž/Ëüh¢8Žß*=I'§tTH*àm=vµÖÄÝRÚð’kOçœòÀ Ñx Hd{žçRóÎ,6 ¬|±Í»–“Ú®djgcOíµû
VxÙÔ˜‰Û<q}Ù0¿–3–Tív]×pÂ4Vеë=¬h}&ù#Ô~L:6Bœ~”z·~.HVU:Ö’²E–^‰»(—E+%7Y¤(PºÄñXÁ½9*3[œqÁèªY}bô·Ã‘©dá“ÆŸM‚Î-<Zü‹yñ¤ ¤þì -œ.¯›2êø@Û¶«šPù@<Ý‹”ÿÕ`u龊çžnUe”_ÌçõÙ»d~jØ>é*š—Ú˼UÀSšºhšUÔ¼,æõÆ6n•ÛÓ%\è<gωyêaMî:jv2CÚ§fÙé/bc"±fµVP®£pîQ†~Î…Z±L^0É®©ÝöRV”4qTiC_lRåV€\}¬¾Y…(.Ô<&K®¿ëwŸÿj°B<–¡TcMŒH¦ŸKÁw9·Îò»ÅI±hßñ‡J½žöÊ{U7e?ðó¹UʼrÔC¿]x©U¬Zc•F˜¹ßšLFâªgŽ4´±Î’—b‘ÌE÷¦¶_jŠ×ZF>š› +
üwÉk—×Ì—¥|IoÝWýpAh×,ˆïøäJ)XƒOsw.–ýNÐ rf)gõ•KKÎÇ ökŠÃ…‹un"Jcn¥’,+¯|[i°yŸ<ÊþEƒW6 °þ»|€Öq|³¤èóÓͧª–:ršê¼œ°Šób“Þsà6œóÏç—Õ´YÙ´Ï}6ññ×¥P¼ð±e_êì/û¿‘clÃ\þ3Ïõ÷B<ïx[·ó›ÆÁƒž¹Ž_¦s¹ +rÉ{^kYT>;'ÀŽ1ÒìÇÏX9JJH¼Å€Ñ‹ËgOtÄ×Ú'›‡KWOþe«<¼àvjWêÕõëÓúÁå²Eû5DK‚Ä ;"•²*ÛÔâìÇ}¾@î•.isõàEOãV¾]*Åð>¢Uª¯š€è§%[®L~Ú +¥xæ³¼¹§ÔtÞ»öi?CÂ[MKy^fQ÷¤6€:t¹¾þò¡_“ìwàøΆù{¢[§/„}rÛÊ=–ôžÜï„cFoe™‡“}áD%&À²hÒÀb¥åkŒÔ¿âú3Ñ.¨;ÿ1¤¨¬ÒdÛï„ñÚ¢VT°QÁÚb™p8G×®!¬NjK=žÍïeÄûSu”¯Kž[‹þ +ä°×Y` Ë©·ÕÖŠzIäÖžlÉ=]ÖÉ= Ƥ§Q³ûÉ8²îm|+övÍoÜævÐúÁ&âÃãxÝ\“ðµ¥(iXM¤Hc"üÌký¸n˜dq_‹Àc¡|~œš¤t¹»}%ýkHAHö˜’E%ç†M6àkl3L±U*L3†œ¢RÄ4ž(Ê5ËF_¥ð‹õ–ãÿHZb öÞn×¼VâCþŽRåíõæJÍÇ8²E«©ÓÇÞ-µØïþþø\Q bkÜvpêFÃù5%_Iˆ=‰±„ýÝapˆÎ +â§úøí<¸û®£ØŠoúÙò›!uΩÉäùÿ.|•‘9·ôXVy*7*·Âãt•e“ýá]ciºŠ§æ¹Áäãä^¹å¤ëðW©?L_CøÑhxÊü\-ŽûÝ“©7ðt²!{öêu*þ*Þ1&vù#ÞæwVëåNÌ?¦pZÉé‰}šôÏì¾F‡ÀÄ~lõÄýZ-wÆ5NÆa›ïäâzq"{›EÍMª»ßA‡Q†-b5©½gßåÛ©_îÙ¡ôjÀçªôQZë •JåûH9E#=ù¯—,Ö¦mG?€€«Iý‚:O·7b†3(¾gnív]læ…eûÝiü´7ìt3¸×AC³bíÙº2ÎN©ý–¿ÃÀé=IxLurëœKѮ˟æ¥úY*"£$½ò»f©”ŸŠÍf€‘£oíˆúÿ,ûœTóV³«M»Ó5²ií£¼Õnt‘‹eY^æU«Åôú´^”ÁNŽ-Ï»ÎæñCoÒ«7ÊîÇ0÷óÔ÷ðZ}oi§Åœ»YTV™Ú±„Ôr€Ó®¥·øȵïŸè?¦°›‘z·taà‰µViÔðlp™ï¨ÇñµÌ!µGI+ÙY]ŸÔ•CÆÞNô_{軳c´¢²HW‚W³ºï¼ q]_†ŠØ:N%^¹t)¡X¬ûšìGküÝÒMrÿ1dÔܲcn§ï!©xÁG¸!ÂÍrDúiÆ‘‡íG:åžr‡¬OëA,'J—ojWzÍs•ñÁW;ÕGS(ßû´±HjÒç¨âYÊͬ';Šr"βžl1v8DuÆѸ2)T»å(?Àµ…ô̘¸>[èà½qÊê0ò²qä +&äIraDôí5ß~H•…üÄ%uhGAc'19×øy··Ûž´bvh½• Û·íóqøâçkÝX?r;Ïf¶°Ag†õÔ²;5Û©vlôn!.i;+£Þ€Å>(6î1JŽ¬Fº‰›p†7 + ^§ã®¤k‡N ÝJ±ÎSœ®Ï‘żˆ€L#ãÀ¡ØZ>
:PìóšÕqñPáŠj%6Hr°Š#âøϨ*ÒGAdÂÛ<×ù)ébš€e™?¸hÁ#}ªzÒ»?ŸBwf^²M÷ØxÑ]RYÞ¹¹×¤¼ÜÔ’×\éÞ´ZÇAÔYÇNÿ6h¥š»¹è´*|^GÃIô.^êüºð¨*û‹*doÿÕÍÙâúræÔÛg`ÒÁZ<É=àÒÖŽE²‚ÆÀ‰R^[liŸ]¡ëÎYR|qäSfœFÎ¥ÌA¶õÞDñfAì?™©rÜ—jŸÞšf/i¥Ò%Öêç‹ +“ BëÌulóEç,ÅWÖ2
ÕÅm¿ Ô¡ÛÊpŽ·(
ÝSdä–õ¾d«ŠVc¾’„—ŠüOÚe<¢ÉÕuýVÉ®=Í<9©E£Òñmõqb/ßF"'´£Ì¯)¨¬™cßKXE]¹!ªNCáb·<ÖF}ù¦E>¥Ö@q ëø½ŒËù§…Î)‘7Y›¦û¶Îwz6:Ý+^å0–·ÓÒËC.Qí~t!òn`¼‚ +¬U¥“[êÝG3³àÍŠYª‡Ø¨ÔV¬=D˜2“VE£»(Ö„
EÒž='¯¦uj~l•ƒwù?PÍD9ë0QKª°Œ‡¿Án,!ɹåVÎuÊÚ|”}™±”Kwu[“ò\Ës€=o–³w¸ +”íuI¸õSgG?Ü/Ôjµiðð,óKäî‘`¹%ïc}ïÞeYÎ"~„TE¼hËÖn3^$&E»Žç$–{¿B¨ÓÇ`7–Àå\²–WJ>è;|ÎξO¢³g vDZTÐe÷^ªµªK¿£”Z<BȆŸ]"ÎbÚšŠY™JÞr·¬H3D–˜G8¯Æ^B¡òXZÕ˜Q_‰ò¾á¿†¤=ãðlYEvù™ÈǼ12«=d n•žyLO0§8né—êAn^`ß‚;ÛRAÝŸpù8½‰ß“z€¯.n}QÙ½sò9£š;kùÒ!ÊF|uh¦X/TáZâ³*Vô›÷ÊXÍõTíºÜ›c“ÿéI2‰vi}’3dÍä}M9ÊSHb(–á@QOÓÂÜ€ïÝ&=_[Е‚P¦PhhO»€úìÛj‰xéj”q1½6Åkš|îêt;ËéÛmžÔ±¥ð¡íai`po¸©×AEh‡clMNFóhü•´ôƒjý‚ùD®Õ &±!7‚> +8Þk©Ã—†M³„pš]×ðë!Šx¢ÅCY+Nt>*qa:g@IWºÞ¡,Ðhg>–ÝH]Wégy\Fg±–zšÚõOü¸£¼–žñ)ÔáÐkJAWÞ%£Øp;¤ŠÇy©9½Ü¯‘¦&ž* M8ªâ±úÿÁÚ3ÌjpJ¾ØQTVd!碂Zw¶vê¾ü¶Ô9m¤êÚ¬Ù»AÕÃêÜ\V™åÃéöÚ?}°fîê
io êj¹lˆ÷ùámÝiÂ1‘Y‘3ð툸¯IÃÁ«;%=}[É‹qî 4ßÊåÄ—¾–
) -µ`>—¹¦4ÅÒ½òö¶˜…Ò€<çM}˜‰%\kô‚âG-0+gë½áÿÑ`¡• ó’Ö¿(°öX u“‡”;–¦u=‘È5j”ônÀfn®/UnœÞ‰Ê?J½ÅEþǤŸÈˆíC”Õ‘AßìBͱ=ü{· ÉÃæ–Øò&<¬ÕÑ^+Íósr7gÆ>úå~ï¾~bHƒ²¥s +445c¨Ã"¯g_èb˜‚\®±åÙž=:²áãm87‹uÝŽžµÎ¿¬¹º{¾·Õd½[46¢+”'Χ3ýZbhâF÷î.+˺詨TÞrîôµj{qú;Åãx÷õ‚ŸÔásaÃYtoÌ8 Š™QâÃЇ†ƒÖÙþvíÎ8¦‡Ïê.7®Â%ç9¨Ç?†¸¦%t®™êÀEĬÆu¿=ÒÉpP&:…W/‚è ®ëÅÆEÇ®ÖåËÁ ‹Ðàoìqºñâh$Ê×F‘áq~SðjÏtE·µ,iA5‰ñrî¥X]rÛ“ä&®é
ÒCèzìBÆ”ô»ù.é²Î³ÂöƒVÝXM=Þßíï·ò —»×û-ìH3rÿ6í¸üù)˜YzáÜ,ý“´2§ê9·{¾!³ÄÆ—_]0p¦@{Ayn©æòÄÞ‰²^µÊ¯‚º›;Eç¾:…À<Ëh¯”ÖëuM[ ý‡úlÕr24Iî:2·ÚD˜/í§¾$ñ!´¬éìœígÿù(]œÖ÷+vóæïÀ„±<á¤1 âÆ|…q¶¶WK ªy)õÌân:µÙêVÏ›™ÔÓäm³x¯+-ê™ËIúsÒ@kؘi£b…³ÞðûÊIÇžc××Ë:9§îBÝFÑ÷=/¢ZZ•û¸Ï,*mh*þ•ùü‰±³DRwÛí55Ér»…G{ßâq—V‚%/ rÂ.wÌ?Z.¿ÎÀnLìq—Xýhk›~×Ì ¿µðû +Cð/0ÖÇú•vUöÏÀ$˜]—ßÔù[µæ3ëÇF0ûHí5Êþ¹JÒ[¤JÊÏ×\öùsÿY?Ì®rHØoɺÝOTVÅT€¾ƒNPý=eÞ¨ûfagó"Ò©CÖýÞá}Ûܹ0Ðd³ zîdzÀä‚…i{dzwS¿ +ÁÜXŒÓŸ%iøÈ úØøÀ^‚"£IU!¤½Rpê^Ãl4Üë=C{”¾Ú¼T¶C7ý}z,'s¸‡Üeå,ò¶ݽZžµ.sŽ³²…â\ÙÏ_±4½[ÉŒ³¨ÌêŸs +»ÿhlt'y~î°ß&¨Ó„³ðînu¾
뵎B9m÷Tt‡÷:·¯3§Î_¥>ûkB¹Á’¹t‡%_¥w=X»Ìe¿öŒ½,Å™NX®èg +5|b‹0§§%Ç‹§d=w¹–uH¨NqÓÿÎ^žÑkÊâÿ›r8â¶g¸÷8»Pü$å·mv·eQ@UŠûv؃²®ˆ%B½%ø¨ñU榊Óá“󳄿6_=ùö‚?dD,Ë"{<}bh†•›:´%˱ã¸ÞÏ1¹ÆrW’æÚâhoÏß®úÃfxŠgÀ)þVèg-Em²Ë$¯Cîa±ÃÁŠ²B2C£Ô,*5Òo¡)£]ÊýŒ¦å+µÍ\qÁ-rüRJ¢µV©%š†£Ä:TºË¯^èvGd1Çd4LËüì{ëÔïÑîÃbÑŸï‰T:Ú½
½¨æסeôâÆm–«è®?Ë[?íÂÍ]Ò{»p†Zû‰»“2ýWæ›Oö´‰=—«P!±`6˜)ï´uíájE iO:æ¸å¦cã‡`®½íõ¿^ÎT%~:£‰G³}¿Yn—ý(:Û:8eüýƒ +à¢þÊRïÅ ýÜHFÿÇK8£‡é™'ïzïF0´éá,´³Ûý ¸¿é±V£¶
W§°oR'=GŸÆ˜3&xä¿×ƒ•á.èâ%Wª9hè¿/“\ÃAÚOø³èÃ0ýÁ9 +yúõýò°Iý?¦Ð7šÌ³pnêÕv=/Àé”^ÕR—yî¨Í
þ4žÝ{
W€Âà-ûG’½œøW ?ÈË?P¯¦¸©~JÿvÃnáðª{‰+ïµz}óÍ—Z :Ÿs+IºÇŸÉÔúuù 1—q,ZfN/¼ç7§Ž‡Jö:ßì\v)€2´ÿäfÎ;¤üd–ñ΂)ùÓ+ÿÝxüí
>Ëtêž²P¶‡J®~2:}»KWɦ¢LŒèÒ·H šª¨²˜´ç1ðÝ1øÇKœ"eý‹`éʃ٫[»ú脶+5¥QÛиã*JBPì<[k]êÒOfmP +Ó‚¬§í¼ý_/‡Í>+õûÄêºN:aâJãiU¯®_†¦½³Ø—ð2†–qÛ3„w{zunú?/‡:Ÿï‚Õ~öI–Íf5¸[ò€jÆQn°FA@™Xüf8Íö)ê}z±•Ûÿs×4XzŸ¬}‡è²§ƒU?…xŸá*§^›Ž/úÑÉ(àÐdpâ’¢E÷Œÿ5dÙÊãq´÷«&š˜%oT?í¢S«’1äýz7½hä+Q¤<} Ý›86»«µÿÿšœãßœ@«X¦VmÍí"ø8+ïs‚¹z¤1̳ô'*¤>&Ü”b¾±Œ*Š08|玂é‹î^?NM ŒÔåÎìdã†N¥ 棼°‘ÞmñÝÎå%^:IÎéæ6¯Ð´¤R/›•fô›ü²¯p¹Ètž;"¢õwª41å¶D©¦›wÔÏj¥Œ ¢°¤I‚¦¹.«9ZS–ªŽT@w†;Ñ™A}f–럎ãñB»~Þ(3¹WÛŽã3U=ˆ1w-÷SȈQImZXà£É²eLK'Kó,åk`z(°¥\43]-[duœg>j¡§ùóŒ±ò
Ôâˇ~êba}OÚ Ññ :É·-¿íKf«´_uz{pî:Å›ÎÕ£ŠÝëí·0D3lɪ6¡Æö¢9½J÷Å«c0iק‘ÞGy>D"„Ÿ‘`ï‹&Ÿ‹¡hÝ +haÞ¤û|¡«Þø¤äs…÷Š}4›ª ç»ç¤·Ï^!j¥ÙwšÖ˜ˆLº×&'$ðƒ +í}ä#6¬×™mŒ +-.:
ä†Tuõý(¨s†©*tîp0Þjé9£I„ø(ý»[²Õ¹$Ô6继¥«»¥ç^³!¹Ö0J\–n‡*ͦϙѹ7_JÍ{íâò•ŸhüVŽ4‘`Òžè™ò殹ÝöoÿÍ úžJóåg^›ÞÞ^÷¢´5 ˆ]©“
Þ\D>8‰Û.·¢
ÌŒDJ\ÞÉmx»0ó:È-åù¤Ü……ÚbçÕ¤ŠßÔ\£—#¤õËqÉè¤d9ÙÍ»i[î\+†I'˹•[c5m~~·O +HööÍ÷ðZ«Í£p#NvÓºÕ<h¨ìAÒkÂ+ûŠ#cX°•ã¹yT0hbåÁžñÅJ9ËãëÉÅh HóåhgÒ^¯…Tí‡.OÏøÝ +:Àoo±ö†{†Bu×OizÊÍõ”™†ô“rJ>Éß*´/Ô„By®ÂNÿ˜€ÖkßWãíüë%ðV¥µP<–&“Ï%¿ÁŸojŠ• Œ%µ|bÅh®”ôpÁðYœí´›…ßLÄ3³Éq«åÒŽ•½&aéC‘WŸX¿O.h4xÃÐ2ˆ{©¾óÌHêÏ·–څ謮kÙþ¿¬ön¼¤¿÷Êyþéó
àÀ[”#äÔQº¶ +Xnb‰Þõ Áš=6Ÿ-5KGFojüÕÖR_Þ¼
VzÏß±31™P™†‡>—ÔÜÈ1çñQ÷&Wí`¦ãPWUì!Z‹èž1Tü1Ä鿳Le¹#y7:,¸>¶¼;~K•Îs"áýe¹î ƒÞFùÐð8éË£Lähô\óõ
6.I·>üºÜ¬Î¥³ Ÿ3 @á³ã1Ø cGq¢‘Se6ø+P +—P¡‹`T3,äÀÆðߪO2.s(9y‘°Ê~Np¤´Îž¥z©ƒMr>K_
ËNt¿u‹¥Ýý( +»íÅ©Éôi®UÏzwœ˜ÏþÞ¬
írǬ{¥á‹Œˆ³°l†åáñÖ‘ŽkjîÀTå{ñM”ÕJ¥NV¿
þÅž‚ßß-1ȵ>B0f‡Äšt_s–ÐÆFƒ†ä-^Áã^ñ¥ ˜û
ƒ÷w”$“3Aw½~ã* ×/šR¹±ý‘mèW–™QPÊL{-jõË5‘Cëç¾½“?û~r°jQZœ4.†&œX¦¼Q/:¹¿Œe‡-7Àîè«,îLà´~–©¡é›jü½õ/ËÏÕµVQ·‘Û‡ŸpûºÉÉSLžÞ#bz¨ï͸Fë|ËPí=4'›ÏÅ°æÿ¶Y.öI~ʵ‡=j'%½~©é±}1²_™ÔÞ="à”;ž|@} 1ÝÂйcvw!bÿ¥®ÕnšrSžIÅ»‡ù±öÜ#uB|Q9wrëÚz}Ô\a“ÑkæÆÉÙÑU!2ÿúØ_™¯oia°Œ±& +‚>·~€>¤6S
>Ýð‘ßs¡6¼›ù‚M•¯ŸvŒÿ"æŸÄǼxÌöñÈcÛ4œa~ï,oºø¦¢?ø&Äu¼CHßš'‚×üe÷ö³÷!ŸFá7›@Œ0I!‰ë4߃üw©=´Ò¢À±±ûd'Dõ}Eöâ\6êO»yX3{YÄ"¹œ„Eýšr³Ýò¤Ùc¡Þ~(Žœ)ë¸RÂù†v–^!¹HªO}±zÊó*‰»öláÿxI‰'¶–Ä~Þe+•ÂËgy¬]Òˆ¦¢ø"ë´0Ü©F–>Rq5Eó‡ùŽª(¸þ=î>¿†d–hédo•jØFâm§:œ7·RXÒVMO³]Þ="èk?ÓK-o™½ý¹²«þøIáÂü(›”—F5& k—*1[ŠÑi/@ë +aÄ•ŠÐÁlf&ÿ(èAÊG?ðZ×ñˆLa:§zC f +Í• +»5”
c{ðŽeû’åä‚gï;öø¼´7ìý¯)’ìƒ\IJÎî~]4OÔ£í>B#rt¡—ãtçåóÚÁnÓpíu{ÁŠôòUÒÆüÑn5zГA.HÜ ¡æ«üb'v¶¼Î¹Ïx¹X!8eoáÁºØú©XZyæüP.òJ5 –¹ÒN±êæÔ¸ƒºt“áª]‡Q¥|̸Ø^æF¤¿C\¤Dsîà»û;ƒüP¬$–½¹áÃÂp, ¹í'~2ƒ[Ù¥Ø\MÊ Ô#¹ÅBÅd
Á~qÏü´Ì˜pºRÿE°¤‹Iš™=8f†cz ++ŠrGvœÛõýÿ¼^êõ:fðÒu*µÉØ*hz\…vZ•º¹qM‹ñO¼ÞÚW¿/M0FzÿÁî?@hwÝVóÒ®‰Õ°\ï™ûEÃçHðÜìÛ¹™ŒÅfÔrúå¼ó?†«“Ó³ÂÅ‚k€köx¹¶lFÃæ¹?PÉÒqØÒ£³Ÿv•o.êÿùô¿_¶n‚ÎTè5GYFtfåÇ6àç-Ž“§œžgÿUoœs³
.8Í*’ñ¼ˆÿcÈ¿¶7,šyÖ`_ݱf—)dçÀ”çru/Àôݘ>_§A¯á°mFJßך¤k°BWÔÃà@·àuêIå¥ë[e왕ý—”ÕJÑZ%¾ï±ö0jem¶Äüi’Güyö¶Ž¹cÑ1%ÇKE Åè6Ç©O‰ñ¬JñQË^Õe•oð”™JW +“-ƒÛV—ty)f—oéŽÖhŸ:"¾vkwa)euŸ¹§þ
ˆ‰ÜÒö«Gƒ¯sÀÙuÊ #§åpàÀ•t¿–
î=¿`’á¢s+|D¡Ydd7¶JT£t’Îö¢þoD‹ÚóÎUÐɉó ¥Ê{ô$Ð×õ@2Í6š§®DMõ“ø¸õh¸ù
#鲕¶ µc=½ÒŸ3ÔµWãëN*…ëW÷î¼TÆžc¹wÚÌ°rÔY…lÆ!õ{®øêR˜z@½ûwøTÁ‚Ç@îŠ@v¦¯u›TS5éVÌüO™QÂu¨™Çùœ_ª*/ 硨¤Ú 0‡'~ÛâÂÞš·À¶¾°KYN¦ïàÕé&´Ê8álÈ;ïaK»±3cw¥Ü¾}AŠãr›pƲ.¼èÖ-™ìÚ£®ª;£ü´zÒ¾ÂÔ,Õ¢7' +>.Q'<^óÂ-^XÆ7í-šR¼y¸b’bªU9J±ìÂ|»mËúeè©xéd)a´úÙ»3¥µ¼a¡g>§?Ñ¢X)Èÿ¬ïZWVKº¾‚uÌ$QA‘ 9g0ç€9œôÕÿ¬~÷îþzÿ'Ëg(3T£˜³ªéégÖ{ îKª3a„bÃá
çø³5 + +¤DͽÎèH„Ìo¿ +YhŸ?eÿ쟸bíñѯÞux={]¾ƒ¨õÞÞ¸7FÛîâ-@nÿÒ7Ë5nÙFtÆV/7êL‡yÇŽPé¥Éh,Ü4V@#5®tX®Ð±3.0íǀ֦ǶWŒ;.yª„'ëšØoÊò)ö’ññšQû-цæ"—€×Éèµz]k +1Rº³·áÃh¬ +Et< +ƒ
Ù2#3ÆGXi4¡z\5Ÿ¿ÝâÌ&±± +ýmÖjyôµ¦·¤#Øá÷UdßcK«šüÿf×HÌ4*·g/N®²•Ôç¦ò©s0‹WøA
Ø‚Vuý8EK}å|ì™ê7£-YªÉò÷ëäÏu÷~?éó-c€ožíëÍHé +9Þº·åzxt†¬5‡Ìawò›üYi£ÿüM{úßi?õJó¶Êqì¾í!æ¾b½gšÐšeÆ÷ñ…ÏæëòþÚ"Fµï„ÕÚ›ñ".ÕÁæŸÆDÄÒe&¸2t½Ú½6ã2¤„h¸ëª2w;²©ÜÎYŸ'Ö/±u~¨>οDfD”í³Ôé’ä‹å˜cªA]$x¤>ª¬\x–ýÓ]áÙÝ/w>ÛòÊBÚÎÿ°ª¿'»š×Ö^©Žt »©°ÓmZ¡{•¤ž6_“q«{}æ`ÿçü‚TšÜÿlN'=Ï‚ÜÙò´(Fc‚—å@†ÁCi•Š÷WR•5_Zÿ +þf+ÛØ îí0ONÖGTr¢Á¥ §(§ï»tö³¤>œúmùT„vòp×þÓKAy“Ïÿ=\þí—d¤#yuU«°BEê:ú©Œ©™R¥Ê ¥Ë +v«©ÛzÛÿ¿ßþ{ ÝÕ®Lg껕w™‡“ÝôCÒº´s ùÀWóB%×br!}ºB=þ}Y7™Yñ°ü½qñ÷i“ãîê4ý˳-wß +öŽt²m#w<] á·Ðhg«˜³¶ßD>c,î¶U«Ð½9b§ˆ¨ôà£6%J3àM,®¥n_B+& û yâ°
e&Ù G@ŸÁsÕéÊu8)¦¬M»Ì<“#¡‡½Ùº~Û³›sò³£ðàeÖãú;4ÄåñZBÇñ Q tˆ’´SyF–I9V.¼VVjrv¡•L6Õ³ëè$õë÷¯ß3lLäîïÌ]°–ð ¯v¹pgí¸¦œÞóÙÿœóž»Jz +FWe Wcå¹YÕÙ&
Õ“TÛ7}B‡òÉ +wte¨w›EçÒ¯Ÿd6©yï©ÜV舀ÅSƒØc¯ÏÍju²°I<2xjT·|u~²0Öá +ãêŽN«,2$ß^€Õ…QÕ;6ª +ÆhrÈVl‘~Ø‹) œJƒ,_+î,>õ¹©@To{á,1÷±ä'/±l^bHœîVÈ.Òvq=Êlo“ë-ùµNRÅBGmz}I^K”Fdv]; +g}lp¡QàN¼áÂ]È„Ê“‡9¿ƒs‹¼¦†•}‰¡-W3Ä)³AÅ rÕí¶…ÑÍÝ‚ÜÅcÑðá½åbÎ…}L;YZ°VÃcÈö +xø¸›È|Üy/›ñYìÞqÙ¤-l¿H׫Òf"ì½ç´JIØt!΃_è7çÕ:º˜/ç²²oŠä²)ñå^E~ÑÒhm•u›¬Ög8ã$3£iìêÄ*Ù´*¿wºKâ@küX‚Ãã^Yè'çanÎlqUË°Ús{¦ZpÉ¥™{]=ž‹Û¯jºbòàH<׎ÏîŠÝ¼*ñ®úÊ*ôõý²ÏÛT«¦%mª«êDYµpW-dë¶=U ‹PC¤ÏŒï©,¦‡§Š‹Õ6è¼ +î[‰• +zÖ«’lÀ$Ÿ¯˜@K';鎦·–2‘¡º¯¼OšáP%sÄùhQ–úI Ú—æÓ=vqgøyÌ”n9S×H«ý¶¬vS¨æ\u³Z2ÎPí³ô8Ã*~ +ôÒ¬ÉjIýîZ‘?òÝúÔ´~X`F“W%S_æx«•H€~&«NáG‡F½ë—yÚ²qAÒìïåNTði6ê0¤Á·CWÚgÑï퓧Ûk¨·Ù—Ëçðµ£5HÕmï!gG~·ó6xõ©Y$rš¹%ììØLÿUaffž->±™ÕÝŠÂFMí¦»ÒøÆÚD=_J´åÃ4ï»Ë‘Kuäf5G@±*"âˆÛ"G´5-AfO·•ƒT“ؾ ïUŒ]srR5-¼ï|¥–†p¼ÒÄ`?Ý绨QÚjâ}.&xhö¼ý yç +U$C&잶AÄG•±>w”\<œHU0×\•shÕÉ=(Éê”èÊAsQG'ô¤ªì‰!…ÞEk<Ôîñ² Ìw,»Î½Õ~YåÏâxÍýEUàz`¡lZ1¿¥©}Gï*K°#è]æQ†*º
+ÍJ¿•ÿ:_°z6©V¦õ„(=ÁýEµ5lùÇÑúƒ*U~6±ðQ +ëÝ …§ÕͶÿèèEƒ@pêz>ë
y½å˜¼ç‹q\ámRJ N{xôð êߦ9Ñ4úªÚŸ/µÓÛí'@Ÿ…ùÍœžá½¦%í7â¾¢^ýzŒ)”ÅñB^ùHŸÃ©Ñ§âŽ[ä[_2»^>îÍ~öÖÝ;ê·üÑ&e/‹ Ie^IÖ_u—ìXg:/¢‘ö¿ÛX©jl#¥œYNϱúÜ—tÿÞ˜µµ«Ö#h•ä#\ÜsûlÔOÈøZÙÿÞ;ŒÊœÙ*w[óÌ]R³ÁT[E(Uñø)Ú:HI4ÿc_ß}ôkš¤}ÌÞ¦ÈW¬ín«Ù:ìÀÚ\Xo`4$ª<¾Wè:ƒ;«‹÷kΓU³B9±ínšÚ¬’†tG¸ÁGfãS„:ó#ƒ ɲ{bæõé'qrø˜ÀNýN¹ÓËrj¥Eˬ'ežØ„R BÅ,&ho¨¢â-~;úê +¨ëU†vµ‰+Ìß¿ã!õ-
è•FÖ»Ä +8Þ;ù\È:HÁ_ªªµz£¸é;ˆ»³
§>VÌëWñ£näbNÕó5wÐ*nt–¤UF˜ÖÖípè,{X_¨©¢_Íô9s¿¯Ø¬(³ÌoðÈÙçÔ+·±·~Às'Ð
OR‡)*´î'Gg£ ™O6NKW„Ñ7ÕJRß ŠŸO1r¡nÝ.ÓdÓ]>NíÁ\Óž-
{rŸå“»Vc€;¢9½X¹ïwt$cõštÕu\§Ÿoö¦OáìE}Èp4k:q¼{tTÈ1Ƴ½½¶&…aiE< Kaíe&³—¡Þ¨;ÜZwÚþûM}ø¡£ÒQô~§ +·m@À¤ZOÞ:
Ú mAD÷R¥ª¿ç·^<BªŸ@ºý"8œ”VÆÄé.¼ÂÎy!6êsÛ~9¶ãc±D!ÀÎ4%^L’š‚~l[z±?¢@¾Üsר†öëø»ö7k¼ÖôÒÍ¢ëBe‰£‰'åûrJÆ9ÍxøV5ÉÈ8.×/})ÀRôîÚ§4éîÅ°ò=ÞvYG¢¸ìytª~8-¼…Ò5ì.‰WÖml
ånÏx#Èl–îºV#›‘P}๿øò 5±‘ë;®IÇÊ ‰ªvpž…]H7üwÅ+¯×5‹þf>V¹ƒ—€îiñ:.ýTn]z*»þQCzý¾Üă —,[x7yLVró²&6í=1·¬Ïºi÷Rœ
H-«Ø$Ãà³]¥Ñ‡ÊÄqëïÊeü±iQ-Ég0èÆ^DmîÞK-rås¼`‹v-¾%j÷úEÌÒÙú‡Ö'•FcˤÉUnŸÔì%uè;cC/òѬW¨jæSyT}Rè-Ë‚Ö| ‰µ&ðx ¸zýðó õd3kâŒË
šÑGgÃq箆÷zËþlåú…ÒsÄÑý7æ9ÃgÌ´ËZý¡MG‡.¿¬¯l•³[|l;ÉXBUÍTÀFWÇ4ln>òˆM]Ó?Ó÷¤0AÏõà±Ñ0ïWkÔÜ,Á§Öi~;¸ý +ùŠ„ârk°ùþ +¾Ý&è4[ÒœOÕb›ÙI¢ìÊë‰)ïÖl1»+ÎeT½²%™?Z »{i¸‡˜–²ÒQØ—acŸ³ïïmà¦3„WG¼u¬ÕÇ‹:¶ØYׯ0*Ür+r¤ì’ZÖâVC6Œ^ë槙®î¸éÖQæѺµ;ug~ÇúòôØƃY¸üVûþªu}Û¹Lãy9Œp[ŸBz‘eRïØrzHQÉ©;:\MâÀFU¯Cv²™'OIaÀŠ€U´J:wÎ>5_ž‘^Üvx!Ž%£ûYWgÓ|Åòhˆ—Àòµ1x"VMÿÞ“'c‡tÒë ?=Fú¨ +ô|ó +7zˆò´uü*†Ò½“⬔î8k¨
aŒÞwhhbT“ x/æ³/UûÄLön‡ÛUOM醫Ð*È +Ïçï
§quTSô' +¬å*å"ݾÓôȶ]YGùŠ™wýÕo êÅP³Á[¾^Ö«÷ni‰m6Å÷yTmŒÏiM²`“åÓ+¹xŠ„Q¯Ïl,Y(òŠˆTÔÿbš.ø($úw±¾¬ÍÜ+'ºÿÔůöêޛEÚrܔ̡™HÃ(4<ŸEO2æÏÆÄüUŸXCv²SêäÔÉLæê¾Ñcëu™5¹0íg%Tª9Ý{o# +ù¤)-¨e÷™#¬qî¾´\ÊföPöb²F{ˆ"®ü-zøj;Ëq1]\cÝ+MIÎêH€>Åw‡ÃãnúÌ¥DH®GÚÙVå;“uOIÆ$¿sÛý +ªúߊjÉU’Ú~<#UúTI¢¯)_ºêlÝçq½{žMªBéô0›áÃÀ9ôvkÇ¥Ñ[Ä+}ÄšŠöÚ[¦òÖošw"Û*n‘8ŠÀOFÝ’-YEÁMõXÅu)²3j°TÞ[Aò®½5k¡|õ Üì
=ÞíAÝXxª¤|$Žç\¦c-¤©¶…Ûä°•£$ +K +ú¬}
c½çþV•†¥f¨¨ñÛíUž&Õ
X¨~òÌu3Œ®CM{Pìþá¹cuÿÎínëá¾[b>€6L»¹æzÂs±ÇîÙÆS¼G÷r™¼s"Æ<ë@dzGÜ“huÜóDÏj +G®žÐÖÐBØв֧ӋÑH³Â„·"´AÅc-.øm¨&?[º×m·«5bSÂÈè(©•-WˆŽö`§³=|sva÷KëöÐòì˜Kš\ö-Êæ2;î I£AÎáÛ†í\‘¦>c÷ÈAKÝd×KR¦Á›µØ"SÍ+AÜ»î9½Ça¬5ì´ßÑó¹8&ß-šÅ1ðÉ-¹éõùY _ý*Ψœ}¿núð +Dz×LT¸+äZ¸²,õEf+¡þ¸ +yg¡i›iªw´ôT·|úÈù¦=-7pœàíåòêj£¦ÇYÇrý6ÌèÂ]ýHÓµÙ¼f› +¥‹ù]©]W5˜ÈzõÝ”?¼äÀ&þŤ¼\UíÍËã‚u}TNPÄ×{Ú(5\»æ®ý6ÿì„õsdÚ)Í« +–•dÙähôÑ×°!Þ; ¾#c¸ÔILm”‡Fâ-ûÚü}®&}ŽNÓv.Å,ùSÜY„7×欴ò<ñÊYyNeC™@ Vˆ€éžìÚ·èât@aÂtëÕ]:|^½ó½LŠ¬oKÃþRλ•|·f..DŸëËÔý•oî/P= 1–ÁsQ›·4§>ËÂt¼E#¦®ÁçPëÁª\/oåù~‹àà/ßLã5vºÖkOíoOf£¦9÷ð1x;H¡â>è,¼cß³£®¹²P·™ÍñQ"6ß«Ò( ·qœÂ©)ƒi‡±æ•j;íÀV–æ5êób'D»l¤í?‹8`ÊŸƒÞ=îe
Ã(Ì}ÏGv7÷/êá½%íø@)? +$§ÕVÎ0\
?k¡€‡%5~4Þþäå±’/UÞ±™½Æ´
:èÊ]u¬
ƒë{ç +/‹ÆAT¢'Wd¯ôC†Výoø +aÛ¼` +ã }ò(R€Eì!v1÷v§Ãg«SGK°yûJ‰ùœ +Ù]ÚÓçµ¾Ú¿5ømË‚–:ëÝÕÅ·øÿ(:¯4U +¯à.€ Š¨ "’›&'Q1çœ÷™Ç™oªêÔùªÃ…¶1~ª¸‘0»Y)ž¦ê¼7ç;ÂŒ±*–ñ5ùAš-DN͆Íf—w< +é™ïC±¯æ¬sˆC~5÷q© 3ê¹³E®4øË1æQ/Œ+½Àd»y›±ÎÞñ.>ã\s
‚i»¤ïVÝÚ°žŽªì}@w‘?BÜTèÝÚyòæZw¾‹b+çÅŠûx~ÛoÚrÔMl´ûíß!óü„urÎ&߯{–'ŒÑ?Ðð궻éqgD.}i3‘’ñU +X¶xX¹þS…Y=ß<ó]ëоÅÎf<$êÇ]=‚óDÓç‹¢«ƒâQ˜)ÿC&‘$¢<{}Í}©°lÆCzȶA“!É:¹zßjíHD”$XEW",áâúìa÷ÕÊéSÔ”i}8ë|=S?ž‘öåj¸}4׊ƕoŒî\„–Е;³,Ǫ+¸ +=é)ñ¯”®c§·vž†¥©‚Õ߇ËrÞ³5UhX1bU£vv-2—Ëj_û=2qa'EîØ”»8v<½krØÞGÊX}·§µ_÷Èð®*çrÏjþv_ç]j|5ÖHÒAåp֫»:[ƒ¯F+ÏÝ¡CYE%¿o;«Ù(Êú~ÌŽÊ‘²ÁýIpYýír¶ºÕpWÊnw˜»óÌ[jÞ§wîø–µ6V`ëËe~~¬ÔätÚH¢4r§ÚÄìí¬Ñdzú)ï7ÁšN"Âw§Õëão†%9K݈ý@û:Uª‘C7-SW™£<®Œ‚U*©ËCEœ§lÐŽªYïòÖ•^~"…“¥°Ò®Z×KA'jPG_n^ßÕCøÝ>VŸÖsú‘á$?ÉclV½ƒ«’<”žYT–H‚ò/5RïC¾[mÜýν´ÕçÍ’'®[°ðznŽ›Ÿ¸8OJ7µpPpÞËm!ŠºÐ!^Ô⨠-n‘ÅÅVŠk£‡Û¯d:VÎ
ÙMÝÝXp« ø:]¿„Ã12jŸ@)‡ò@/$gçFm@Ç7ˆÏ&ÁÄÕˆWÖO`ÎÉådÀ&Ì•õ#•Ïyþ¥ÞYOjEªþ9&¤÷îö›È`Èü—‘õWDÀBcÒ +<8“‡Ž§ÞÑÀ*æ ”“ÕÝOhôóÁÖµDè€ê«Á’L´–àùÄÖ´ø7Ï͸¬ˆ“ÚóþÕö^:p•òC
Ÿb c½Eø‘zZËôÛ¥¥ôžÞVxص;ûóô§˜ºéj³ôn¤²æñ¨Oq»7Æj͗» òÍgDŸ¾¨Þúí7ܤHxÅØ®~|o]¯ÖŠfT@±,úC¾\Jo¤žÎÞȤ٘wžz¯8èÂZ;Ñ–&>ðz?œÞê}]’Ú«vó×cœ1Ál^½Æ+f›X +7ÚRæÀƒ(r¿yµÆ%xíUš Ú€™Ž©·OPœPcKÚ¹Xü|¾ÄóDi€hìz&>ð)Í[Ý~S8 |Å©‘Š¾¸fìÎ +ôKT¸% +Ò§ s³¤ÏgšÚ@+§tXù‡,ío;†“ùàu‡¯)y†ä%D`%YìtíkÌŒ}·+»OŽï]ŒÑÒpä5e$/Þ'–ÕRß`/[öÔð0‘°>k3ÅLSnù\&ܬx·hwôwÏ"Zíáa‰Mn9‹
ÝŒ28¼ÆP8ntCC}f1]0ï)<c
¥°Ä“M·—2ÅM÷¨¶¢ö¶=«èC£û4ß=ʨUÏÄÛ Í0¶÷ÌŠÕŒ…w»ŒG@ºŸ_/gð„5¶beÌy‹ôD5¥¡{ÚÒv ¥O
¤"Åt§z\[Õ[õus±@¬Þ<Á1öeôkm9P+G2>zf“•žEŸêb$\—g´WÙò¥yžA©BdG¨šåõ5ÄüO×Ûó×Ø÷køI|ÁªÂS..Æ\¬¥'Ü›¹«¯®¬-¥KëÌÞ»Ó“Uå£ņ̃m÷>ïSÛ¨ôJoÿ×L3“8˜=vu+Ïè™ïX Ö†2{èŠÏZ>°hL(B.+39½&´ë¨iû +œL—¶ŒŠ¼Yý1¥,ÇØS8´ŒeL +}+¸Š=År7{À…!â¹W4WùÛŸ¶I Í)z£icÅCüø.Æ”O'»c®á8ÏñÖÄ}9iíÀ·«Eü<œ<¿“ààÛ_óp]Þ: žNÜÚ^ÀäVú[ÈêmR¢#©™S¢kÄYŽ5ñÏ$èÅR¨¸»úZEÂÛÏë-îZÏžâ{¦Bã¸8îõ~)7ÊJ¬[³i¥?¿ ÝcÕ–ƒYÍû¬;Aª¶6:Iätçì².Ö6Ã÷Yßæ¹–uœŒV˜~lÚ ¹½ãpbÍ{=®«àµ’=?’¢£B<»c°·oOw¤2÷M’?pbÇ};îœ.åLŒ\•0L°y^ƒjTÖÌÝWþ!Ûn!`Kñ5ø–¬'ƒßË.A5:#Ž€ŽKmf>ŒŒï·•·úW탹•OÍðˆÚ",ÚFÕîÎ;ßLiŸoÔ·r€ÄrU—qK…Ûˆ}ìÇHûZÙè=_jLZµ%„
™4+aáá…~ß[U!ão˜° +ÌÅbˆ×;êL#`à=#¸¿Oz´ª²–'³ÿ–[KŒOÀ¼1Þ؆]ÔÕöϨ”ø‡ŒÔ†f×kÁÅãò϶~f–Qùlô{3¹<;2.©xrFb¡L†•cÅ›?ÚÜû²ýí6Z¶"atîܵ÷¼•,e=ÂL'Ä>ÿ‹ó9VÝEkƶâœÃébFÛù†ñÄWI3Î,ˆèš4œ
¹ÿè„…;S5HìI³¬{ÛŠ>éîs#ÌbŒta†‘!ûlÀ˻̙JÌ6³è§8õÎòiDu¤”íutÛö/rÑG‹üÕÔ¿G—]¬ã–[?–¬¿5š:Þq¨~¨WKÑðÞ6dZ\˜¯0ÜИïIïø9IÿOúèYAW‹š#Uê¾} ½„$oÞB36ü=²áœžŽÆäñ5oµT¹¤u#<Ôª´ïMÉ7÷&PÁÛ}‡›»ÀÌl6s{_°MKf¾=ŒšÕµÌ]œ–o~ê»DG›N/¤üšåôĦE| +Ëê©í„f½Vo,FM#õts†-ƒº\K[ýM‡có¾)rÎpµ³z¯¦JÅ ÝÊ7fÏ==<ëjeý?ô +-(¶ú%«]åmÓ¥0¯PaSŒ[…Þ[:9úûn7oÚ=”¯œõÞâÏ@¤›ÆOL=æÆ¡Ô…IæÚ¨åbžn×XO.ëüÍûJö?d\é;œS‚¡óãnÔÔn}UÌ.‹øÓÃò—
þx;&-àó—›Oµ9ÈááV+“Z“…>MžÜ;6ãïƺ=;ß°XvÏ“ÅGœý¬vº‘ùèW³BŽ¦ûçòxÛrX:6UþŒhWJøîl´Z}*S½¸V§â@Ð^ëÙysQO{òUð#±»Oø…§…yð·{Ú>ÊÎeÏ.díF¦?uªÙöŽO½£Æ™ÇÃã`¨/A—ölÔ^ý1júB¦9r±y•Æ•˜óŠ‚˜W?aª”a°…*_g3%?íãFÏwþ¦äšì«Ò™ž¨¾ú©Ô[î,«V¶ýºFÉ*„÷d³!½ +ÕêlgÚ¾E©‘r–ú/~/ÀÄá<í²¹Ûäá)lŒˆÞñXóEÃ8eý¥(9èÑž7«ß*ŽFô0e6cÖr¿ª¬KîÙQßW#èTW’d’þе,VÛPjG‘-.Ò¢†ÏF×°”J‡ÛS>~65c¢l¾î’Ôlµt—Þÿ¾ºvZ¶ä‰E
pLžŒsš
Ç›RK¼s’7û}³îó§¡\,Z]÷»!º!kZºÒ|ŸÒšIi¯Ût¾ªÛ;+í-ütì\åØ×±uÜæ¯b%EÛÖß.ë¬r1i—NÌÄïÊR¯Ï5é¾
Wëí\Isq³_:<÷&._9AŸ$°°ƒiüœŸF:>ý6c`{-¥.¸à’¶““ö°åóTÑ%Þþ2µäQ5T»£ßvóƒ¥c´”ºö꯵‘Îi5ð’,ð9%ð~U¾3³š>îàLvÛÊçw€ +HHy}n½—Zܧßó—â©ÆÉ‹Š^ÂRÂù¬=R[—YJ‡e*•Ê°¸Ò™o"‚Õ¬µ{òû¥¿ø¯6WLÊ0xŸ3d0yiýmŸ‰6ʤj4“¢v¨LK +Tƒ®^mN^íûe´ºiºÿái_âæ¸ÐÞ¬mÒ£„.™{½dƒ\¥F-^{Þ
ÙUCy/‹ßhx \y»§êÖêíM ?"˜ÆÅmµgro‡ldŸñi…X«ò>ìï7#>c‘¯þ¥œ|öבŠ,zùÖ(òQ]tZ¡2Ì>ºV]-v%–V¤šhºSÓW†S]xàŠÏâøôS’™L³Õ¯¡¢6/-LÃó?$ +ŒÖò;ÍêÑ3õzó|SGŽ½*1eÆӃ͑ñŒ™fâÀ”kN¦‹1áXØzÍ(íZ«jŒÐQ{Xú´4Uõñ¼òóZ3¨ÏÏ‘± ûýÈÌÜ&suÔ‘ÊF¯Ë~4¿„ZãµRVuQ{¢ƒi×h¡Ó”=tõH׬aôÙÓ`~[ôƒgN97Ú7 +,…m¶¯ëÅÔαÒ8ŸéØ烧`3—XÒµxâܲµ¹(8&ZÙhéy:w„yÚGZsÏÛ/çW“6g ¡³³ŠƒG»=rôfÅúæ+VS»{ò—eoêoªÆ¼Eƒ<ÎÆñ×5÷Î 4Â@AÍßàä~”mlò þ$ÃÁ'íX»Û€Ô:l[f8ëÀÉåÛG‰¦ßYûî; ¬ÏçüΫv˜×Aú´¾÷oâï´À9Jk[ùųùäR´oÑÒ—W‰ +q£ €”ºQ@f±po1áíÍAÝÜŽXenmßh¤E}R¨Ÿö÷Ê;ßýT9i|kõ†´ºÒÖý{"¢Øv§¦ +´íÊð_FqS:õ ´Ø3…HîµÉxÐÂüuÓÀÕO‚Ó÷¨˜]1n¦H•áyv=Â& ¸÷q(‚"é«Mñ•£97~¯×[Ô¦†Wq–åX0ð=c‚¢•¤‚iû¹yù·µÌŽ¸;ÿ.°Nò+‰áªmó{Å
csØâ]³´sáʘ‘Áæ—.9ÕØ›»6ŒîFÞ¿zuÖ«—z"¬Œûí¿=ãÇÞq¤cL+t¯Ÿ”ä
endstream
endobj
79 0 obj
<</Length 65536>>stream
+Ôz^財,î>Õ”«t†¶lô+Ÿ÷Èt%œdL +ëåb™äKóÇWil$½™ î£Eàj½60øÔðºmˆ6žÔð¿·9NÂ.\½³4„-óCùÕÇžH³|£¯}9ãÀj¿k°gúØgÅyË`énÔ”¤Ê§’h9õÍÒ¨<&‡íônºûäÓ3sühõWÎx¿šV¡Ñ¯U¶¢.OÛïNsrdjÝBôx8¿:Ö_;¸ÀG¶‰ÇÄ
„æ:ꘑ¶T\súk~§îòFWþÄ%ĦkÅiÛ¤Âcd¡§JvÅšMÔ´õïL™Eîí‡ûRQÞGu†d ólf†ÈæL[lÒ…¡ò¨¶4nVN-Ž)±JèCÄsU³³<±|ç€QZ''¬›—梾aãÌóÛ–tÉ«ÞÏëÏ—÷°À%¹2ýÛ¦6tM0ðÒfóÖ©/Ì)~óiØÞø”úÏ»=É“ñ¸¾°|KkVªáÅ*7cýEsŒ“rûy1Y\¬½ƒ³ +Ìiqñ„¹cëþ=Ê’s²´‡Å¿ù!ýÍ/ìÃâLVWºº”…5-ÌÁ·øî
¿‘=½IV•–0x6~¹„6Ý©ô2vT@üØqilqVZ
ÎF¾§’Á»æÌDv6öNS¯‘æ¸Núm“ÌmGš&°PcEls¸˜p:ÑvvÕ;^í$ÚYŽ1ûÜØ*£(¿È8§D6óÐìÕ—xè~ûœ3ÝhÜNWÆŠÎdÖ
u§àžŒÞT*ÙÇ¡•ç'½³†U¹K^9÷33fü³Î1ŠYò;Ò?„v΋žúXñwËÎÇõ—º¾ésñó ª¥š`Bøþ©ÅÖžõ$¹J†TDÕ%Îœu瘲Z'µ€jsv…¨F‰õ˜_<L¯«. +D®øûfª™³«Ú™bº%²íq6G…ºBÞ£c®þ^î ëˆwì“åX™¿ïÝÁ·Ä«‹Á~Z¥ÇΞϴ´Ÿ<{/ú9«õ¬ÁÖƒÍ+vZý¾à…*ÖŠpѨر¿Šþn'´ä<•\ØH
atïÒò:·kúµ²œ]±n.ä*z@gA¬^ĹPµe‚݆øfÍÅÀÙ(Z”ÏGEÌæäuQ²ÕújäûǺäZwo®¾“üÄugÞ“Ú‚¹ö¡N±]wE]ªW€Æ,+ó–syØÓÇ36Ð>¿ø8º"‘¥w»zÑë¯õwç„T}a{„Sˆíqs¸ðLig†…iÙ”õQÉhñVH3…D]mžñ„ÜñËV뽓2›y˜_1h;žP¨™R>ùû³Ü:뾈ÿ=|&áÚ¬ÎY?g4Ýõ
ö#"mçMoîŽoÕ°“”?KHËÖËžD<ÚRÉX¦-ÉÄÛ‹¿™]å~‡°o½ç.Hè~W.•Ìšõ ž¼©‡ÓK5V7¯ëÊÑé} +×’¶´ªsœ©Ï†’iœvÓ4Wí¢çô[Í5óeÝŒŽçÁJGb'–2âsë=Ó÷Ó×»mýî;šx±ï¯ü +ß»ˆ³? *:F 4XRIó)²¾:MR#kß|rÈå%öÃ_ÚZÀ9TÄìQ·UjöKzÇV`ëeìó®Ö›W-`ýM-;=yP›H¿I/¬x)×ËÜ(Þh<‰û«Ž +® Ž þ†‘Ô€K¡ºƒK«¾Ú¦Qºâ´qocÃC²„ÆC}^’|ˆÌÙÓÛ=®ìCë)[%Y”%X,Üý°}É( +PC¤óW›Ü•–ÒE:xåÆ<óiñý:Lé6¸E?)tÄ“t…óE¹ìKÂÑ#¿ïKâÝÞÖN´„ÞìØÈü¦?™"?Ü®7yÛãÿ¦›ŽÔcåŘEÝR>i#ø¸k«lusišÛCÒ3Þ {Â6^_óo侂ÓèÆ}+ì*¹o¶¶èXêô™dÑê‹x×zÄ»÷á3‡Ulý½_iÊBm†¿auÄ2¬—âD<|ZÃ=⟼g~lŒ~óÀÄU×yàc)p¿~¥UAÄzf=Áùl* +Ce/È]£™{¨cƒ”
V¢%3¨™OÖ*èÌlO¶AN—ôð«OËO°¦ò¥°%õ;09yƒB¾äÑ„Áˆì~ +´œ9_‘í&?0öòœ¯êirß´‡>Iâ{™ñ±½p؂˾:‚L6.´ØrßS[ë)P9K> ¿›ÁÙgl¬ä‚¹T¼c.žÔí’ɦw +}ÉÀƒG¸ßKèú“×›±yÃÌxË«ÙZé]ŒJß^}•3^ƒ¬]÷Üh^eù0ˆÛv‚îPÄÎ*oã|¼
ï Rš(êp='þ|r2ºvc– îÊ6vÝÔ5/×y/\eœ®0û6ì47bX—;ô¸ppÛâì'êÚr³Ee£Ë’UAz^Þ4½ÜÀ遲ËE%Í´kÂTÕ~“ÿ±R;ÕÄø5˜kôµoY +!ÚtF´“·ü‘Ü4½ÅäK‡Èc´”í9¬ÁósÞn“Ö• +`¤¦ETDp|M„ü›yø–IÇ~¥R;xX‘±¤z€>(EµH*M‘4árHøliõw÷âùl +º°…RÕ›Çò2Ž Ç›ª:ø*ïrù’(ÑÀžµº•ú¼3–gËÓ¯Ñgæ7;T¹Ñ5Ê#ŽÇÑ”Õ9„>èŽsØDÍBñ¨´ÏÓ¾1ñ¿GãäJؙʈM
°ŽŸjX~HýZŠ[9ˆõÎ|D•îs0^í¿;íÄóš^½¶šN4‰²h~®ºÒÙ)x¬îŠË£~|צ¿·úoÁl€²mTñ嶪ýù±&¹Ó¤ü¹^û§±í
mýø>ÀŠc1Ã=0œNuçy>rξ!Ü“¾ªjå·£ñ'y¼ïëâ-Ën{{MAÉÂ\£ªôߎ¾vQ³ÍŽN$ +âXÙ¹Å_i…ó"ʾagn_Ñ\Pñ˜Ý,m‹˜z÷0ZS.3ÇáC0³zÉ`iPH¸w±ìWSíCëdo”ô~†k¹W¸’†o…q^¯¯MÄmÜW°K渜®îö_|ôÄB¨Ü=ZõO€˜EäÈ[u¼ËBÂ%•åØwNµZ +^ýMÇÔÜ.66´G/Q)¹5}Xƒzs ‡9iô»ŠÞØ j¢Jöü‚µØ[ìv¥º7¸“”{Ý€’ÊÏw^]y(^2óõ^¹“y~<P4‹ãäoSíîMW))èÛš¢‡jÛeg&Ãã
vvåG¿ñ¡EEáÇ6¬ÔÎis¿²ZkÚøB¤^s¢gA©ËÚ%轘^ñxPt]É4Ù¸qƒ“ØáUSÕœf,ãÕÙòž ¹çLRÒ‰_Ç~-é«?[}2ûü¼üx±×|
øP ’›^ +Èwúfû‡dHÑûž@¨ŸÙB +ò€y¤…6Ÿh«m‰pÚóü½n}®eÈuÙl§N< +LaZlÀžâ”l€±-á +û>Ì
ù¾Õ÷ÚA·×<_Œ™xÌ·|“íeM3Ô¼;‚П›ëÊ´®‘ÁÀØhÊíõa5Jg +.í§!å‡9¨\³¸üec£…ŽÐ&´çE
ZB¥Xß_‚ƒ1oÝAhq£Ÿ¯¹¯³iQ‰õˆn–à€"iƒuùiî¸ Ó¼3GË& +·ÍÁ—lÍæ:œ©ÊÀ¸šE3:iÙ¹øI…6W—Qy„™¸‡,lj…mŒ#ŠhÓÁKþÖ¬½^>õ³çšE÷.MH^8³~µ{OHOì±=ß/Úz´üLÂœÒ^ZA]iŒ¡È^Ró€©î’¬‹un‹'áæšFàöÉf§43§EâcLÙ<4¨Ç½7l'¤Øú-nE<'n‹«ª·¾Ù_v-<÷òwÊÎ%9ýšÇö«¬ÏãÃ:w
½ÄáAïÇ;džùî‚Qu%·’[õŠíÓDªó³Ÿ"+½÷2ïJ`„·Ç‹ù@õêí‚
&Ô” Ÿµ“^¸GÓ¤•!¸r'O0ìÌ×g©e³ ¦’q¯›zu/ô&#EkKr¾NšÛê½v>´pöþ¨WÜu·>¥"Ö†ÖÍ˶êõ¿qŸ»†¾òFÇßn¢6Ì]PËsDöWˆHÐVEnïû†¯Oã›åœÔFº)o_Sm±R͆C¹/·:ÎoX¶XèÂoÛƒæLðöF
Ì°¾/Ô»õ´dPDóûÌ×PÒOÍ5}NqÇÓÒ˜GÎÈŬ•‰õ?Ä~¾–r»eÿe¸^YÔé]æBg)¶¡Õ:hŸ–CÅ«×ÍávµŸØm×F—Ÿ",²²ßkëÄ©Zs²Ûßào¼<™$Cbu‘`™Zž‚ÖÕ»Æ0QÌæ{înÒp[¨GôOžã9äkv·Á`Ûh7ÈÑ×rÚ\`îa[#Ø¥NÀ{à `ç~AîÈìshLÜWW,BÍ{³zùãC,;æ>ì~«U,ZÆ°>o†•>i
Áá o»Ù½®oÆ1dýº5’Aí lºžË¹7Ï/+â󱤊#ë"õÖr0æ²z:º¨·ð*{nkíoþ7µ©)¡ªâؼ¤ÜüZôü¶ÝA€¿?²q’½ PPª;(He.?›^€cƒÊ
ß÷I»oÒj ²¬Ÿî ÅçR|YøUùVöKë´w“çÌ)ÍGÏ»µ·qkž¨¨K¾Ó[Ê'¼C|¶ú|ClÌ µlªd•*h‡¨åEùüÀpÜüª£ƒs! Zé6øB·7îÝ¥g‡ICš(¨Dw`M/ÿAžÇÕR(G)ÓX‹ã9‹—]ŽCŸÙ½^oà:¯í½ÚÄ[q‚ +0SœYº^¯¢}T-w-«£h‹á?„ãcaæhº3LFyÑŸ†
¬#÷•\ûLÉ&.Û&ÿŸ£³@sU ¢ð +î""Ä°ÜÝâîNŒý?æm`øºëtÕ2ÝU¡<ñåÎ:×k†w«Z{¢s™üä-(×Êã®zUFaÐUœŠr^߯z7v[ò7q5m¼ìœl¬}÷ѽâ&mLWìÊJ¾†¶*Mv5µ +hüEÌ"ú&B” ÅÜ~Ú¾¡õ<sTßAZãÕ-ðíÔ -Ì‹"ýÎ1y×}öºÖMÊ—VYÓj‹›wŸ8¤ü=I¿#'{ÐU:·n*c€˜Ø_3‚´ÀçÅ©„0¨i¿*%Ôè{½¥òÖ~ÎÜŠètð×(Ûop&ɽÌ;JÕfœâIÇTVÑ^ŒJ+1º¸“FÝ×1w;¿*èd53ãÒ¿Aø¹¡Ð˜øëJûø5‘ú¡æN"ùŒ>ê¯fã Ü“æêUwÌB`†^ªpG£¥ó +º%Àº[~^EaˆEúo;Ï~µÖŒ¤Èè€îíFêQ®mjŠ‡šR÷ü+89ȾØN›÷Áñ@È[FÇ…I¼úê\Pà’ÚÈ+ãS,/Úþ j—'r·æ úéµ8ÅÇóVSEf2ÊowËzàë[‹ÐÙb»uï Ÿ +mœþÃc÷=§ª~“ꤾrM`M»›NMFY|Ô±e|¢4^…¼Cì¾›u€Ý¥YZ¾á_ñ»˜7u ê´¢çSÃäë¾lYÖ‡„í©9Ñçwó!Pï·Ô¿vë5Ú¹÷ÎfÖ:75à4m§h§¨3ê0ô{»µŽ¿Õøá&‹ƒ‘†,bI¦yLBÓ«¹z|ûv¹ªW¦*d+…’µý%P3L8Dpm¨™•qÕÓàOÔr~šã]7Äräõj³$§Š™ü}D›“]hw篌î7yp{:‘,L§øS“Cð†n÷oeQÇÃCˆ~Ù©ËöÄFÆ<áDqö6ŸÞ,×ß&†‚œ½)ø •ÍqK‡pXxpû½ÕÉj¬‹qntR=æ–¥[U ·ÌWf&<hEŠFŽÂ‰€œ.¶·A]ùfa7®ajéüÛŽ”&AívÐ5ã8>Þ~A{×sN Rîâ÷©ppÒX³Z£ji¼ù•·…•RùWi1Aò¾ÎcèÀ¼TÙ +িêÊ5®ºûV—éÃ4ÙiÆcˆÜm(Ö×{üu:êûÊHdõO|ˆ¡ÁUÁ½1ˆç¶yž)K³4¦ÀI0ß窹Ok™ER&ƒ—Oý‹5«æ±mpÁ"ý
Œõl˜}‚Ïž÷¼ìVüáþž8ÿ +Ün$EN6fß\Í°ãW<;>¤ÅZ~0M‰‡Ý¶|ŸÖVäpøò³öч]Ì–çkYõ²2T.Ä>jR}é}u“gUÑ¡ÛY¯§m5ûH$ÑBå#×ÕÎcyb„?+4f>Ösý"”@NõËkÿò{³9¤8lfL·^ó½çñyÖl~ïÓÀjã°‘‹«Ë›'$ñxü¦×¸{ Óùpõ®˜d5uD‰Ãã;(±ØÇœåi‘aºü:ºNæ•U«í¢Ò(K£ý^S*ÔÞ@[S¾OÖ‰§®}ˆ=× +u#’KŠkìšD
‹&^Ùú‡‡eÔX¹ßêŠq?~†ö7êoöwò²‚:…©$`"
_ÃP
Âi/*krð±¼%̱Nd +û#´c~|ìdSöo${SÅeweK71Ò™¹ÏjÓobÙ1ÆX½^¯µ‰Ú·Ê@îܘfqöÍ1>ß9rþÚ%¶ùºãz®5S7{ÅTcƒo|jÖ3;$ðøFLø‘6yi>Ice“VíºÙ›Qü†ãd‘ۨŽÌòëú§ºåZ¶ÍV-Ò¡ÿ +O^hLârÕä†URlç·±Ÿ‹Fb¾ùã§û=>j^¶¶ÖÞ¶¾ð°ÿi:yT
½u\x»:WNä¿¿eVWçÚ+¼kÓ7åVsÄiwøó¼c!@òüt"¯zÚ;ìö-ªEŒ[§‹<½ÖˆK,„ü^û>ŸÕ»sô…ÛH<G?øšñžtwn•¸aG´|ŽDáÑñHT¼BùžK•´øþÝîð:?b«ÌšÔN‰†ì^°ù©çGsÍaÂtôÚ^ì?;cº|›®è„Pð(Á¹bdûª{À–q.€zòvW×>—|6†v:vO&.Ž·¯Ä[§%«ËvâVÇt–’Ô®+°fÝ™†nSây‘[§ª´™}Ë0öÉÙ¹ £×ù^)S¹‹+gIfíñ. +,·ØmgeúPÐ˱¹ 1Ø™ +ÛŽ[¥—¤¥×§SºUoçµo†³9ÍÝsÜá=Ø“šÂ¡;t]ÃÛÖ]¯Ã>É÷5ÝÒ>9:ù5’Єûð΀+ Îp~ùºŠ¸p¡¶ðÚÇ£©ÄJú}]»~b\˜E7›xé¤8¿Y–á-ï ¸ó§´u$§AÞ +œÅÚ̼îJÔ‹S—`Qó+LÜáf·¼9sæ×pK©òû2øúD<óœ„ +WÏ÷¯‡²Qá’´›B¥£¾„ÎÁÏŒèm¼ó°q(tP²Â úˆÑxÀ«“—j\ʇ˜§ÜfUôã%Wƒ°µ*uÅàÒ0¾Yçè#^6Dâ‹3±ØmÞpÏ𠈋Y)ӺѬ𨒩³³8©ÁÚ“cúYš¦æ¥s(ùfªtNШf¥ +½ò{~ϦÛ>y«F>ƒU»\¢¬ïKË‚÷³rŠÕ6l4ž0ÿ +Øy$q-|z¢Ýü¦×huãxíŽÈëÔ}¥2ù¬7λ¦Î·1/¢9ÂCÍ™°ÁlYaÅ´îÊ%C’oºÈä@Ûvóqè{û±:‹ÑóªL#t©þl
5Õsɹ #1ÌÉIÉ¡C%z¨Ë³ÿ„Êûþ{FÄïЛ ýñ.5o¾—˜©Û7{.2Ëkˆ{iƒ÷b-ËE·¥µ®?ZÔ÷¯Í€í>M~ ˆ–L9Ê7)PxE¾/™¤v‰Ó7â®u£uTG7É4æ̬õ
fÞO§ƒÕG¡¤Ë°þU”R™d¥‹Î0b0þ¨7"£Ç9áð~Ïôh\”áM5ýÂñTM§‹¼áAÔí*RÕ»ÿ¼÷™ß¥Ê»öë®e•ÆÚó6'/S7šcdÊjÙo;ýðmZ— á÷NÎò +×(6(‚%‘Ol- +Cœl^lU%sp¼âÿ€þoéL(_#«V]µ¸XsžÃÎêÖ<l¼‚åÓ9B¹ê¶®²/m$ˆnlÑžƒÍÝ{2ÊCnÛvÛy'Â}écÖ¶ûMSWnOD¹û›3r.íæ>äœ Q™ô¾J©—!MžÜO·½îý^ÏÄ(óýœÛ3(X‚|L;WðÉ9Ãí{ 0oÁ`ÿ:Ö¾‹¸»Š¸’JtOõØ`:À:tÁüŒ(ý4/¸Ó|¼‡‘ôõ‘{0éOH +•áçÛm«©àº]”¼ÇÂIWõNÚ¤³=Op[=pÔÞ)9Ê\“2’¾à‹•}'ê™k¾s`É#Vµ‚-ýmÖÌ`¬ì\"·L×·Al–=:ž€_9¡çFLYCYRWuFíÞ÷¤þq3F‰:ëD/Ã)ËØ•ÒN¼_5«JµZœ‘†fd3'c$vš÷¢V*ü˜ÞÊaq$]]Ãêå»y©ê¯ˆÝýKsº¾ë|uëž +/†ßû;õ= :vÇ0—Æ*€ñÉ™÷øÚ~Èñ¤yzñ|OJƒu»GtÅùfÕQóÚ€B•]ôhŠ,,ëøéØÜsPéøü¹xdöÙ%púçe¼Þœû3ÔôQ†ìNÏçc‡$8i²D6‚<Ë¿!uǪ³ø• à;à¼GöyÓIQ t¤‡Æ‘As‹G„Š}Ü'i±…ͦŽÚëVR]5Šº/ŸFë}¯ÚyîC0[AÚcë4Q~y6ÝÏ™k«
±ûü.‰ôl¶Õx¿ZY.Ò²qí_ôÑ© ਩£#76¡6ãɨ-ôG[ßÎæ5ÒƒW½ø +7r8åX·ÿTûØÊ8a²Ê<]Wó {©oëh™QûšˆÌLä…̵ÚÍ¢›´$·ï`–[s©}ú¢l²zÓ"Êf¡øÁÕÔÄ-^DŸ +ó«Yz>ÆF»·þàb`¢nîç–Î*Cíü^š!³dÒ@ïnU)ó§Ó¨’Qx]ˆOÐRŸlEÛBÄš&¤˜·žyÍx왌PχMø Î[…gWäÇ ·ÎLv^@¥÷Ó×QüþWåÞú•o¡ÜÄ¡©n€hŒ#Ýlä ”šw¦ÑZ¼ø©4פúv©xP‹®xoéR‘_½ÊI)j…GöÚö²©æ^£N=‹uõoT6dJ&Ñ pÁ)Q“rƲó§”Kýæ„3®áüLÄrGé7Û]nñ#3¿×Ú]6—xé»FÝóµCšaýÖý¤å˵ҷßõ@dTöâGUµ€Nï"wçã“ÜŸ¼“p*®jÙᇚbí‡?.!#£Œ}È?]=É'B•ZÐÈAÚúͺRi®†Ó‚IèÄ"ÃÔ·§:§‡åFøâ-Vó[Ÿ2vgF˜ßî0©É¯°ŸWLh>—gýAe„Üä$,`ÝØ + +¨¯÷h?··ÃŽèu|
ÝD(µÜ¤ê°½© ÅŽ6Êõ•kŽ£içÅß3?÷)gùÐ35s‚ó/çâ—ª +kÍ*‚v•ËÒE0äáÓœÜÖ{Í+Âñçìm?Á™¬JM™Õ5O˜®L²©°…Qmìí¾HFNÞV2:ºÕtÇS°Twö’ב<VÒMÙæQC!‹‹ûÖ[ÝÞv8jkÒvõ«„ñ"ÔÕƒÜqÿ0ÏkÿjQ<<v7Ãa£ÐØ&Ó†êè„®ó˜/y[Uµl#.¾v§ÝgMö
îsܻ婰@îÚK7³~™v>Ûe^xZÕåaÌ:ùµ4“^×ÇÛ ½ç8¸ÒóÕÊÎD”;WD²$¡4cáuÄ™¨ +UZ£›Í%Üqb[þ¨j•%q”æ7ädR·ÌfÞ,v>ñºÓ@¬g"þœÞÔ‘g·v°Í»ÒtêÑ1y»þÍO’®ÁªälçӖ~°ýÜš•^w€*åK;kŒ×ŠDOœpw§
#ÁÞonÿöwçêé¼'½ÞOqíÁ;„¸u™„Ý}¹Ø :*œE×O— K.xÇ^†{yIúÄY#'Ä©í[žñ.³`²s_¶°©¿%,Ôyÿ6îölF®·éœüŒ½ãôø³ÕmÛÂê +Æ]¸K¯^¶7æ§ÃïóŸ73 +#</‚W U©…‰q0Zßj:Eôa÷û#Ú…Úù,ÐNødå6Û1ˆP·º9ͪÛPð +¸;,{kawÀÒ̳Ly5>°§;hoF5í`]odøgøöÖ& íkî©~,h\›(³’\'Y@
O° ´¿†šìÐ7ç=ò½ÙH%úâ
¶»qûiÖïÆÇ?Üã&âA-Ž7ÖNyoýïoÂÈÜ0ëê\½Sò{íý‘Ùxµ(&ö_·yÿÍSDµÖ:™ÒÈ°Ü•tàu™Yýû{æv<-Õ°Ò%7kéwà·ÈÚ™¿ÿüÜw¡Ÿ§«û
E]Õ".ënk¾Ó¾º²k=§ß¯ÛæG0mÙ/ë§söÞt•^àÀ²•xðÄ1<`L€™Úšiî‘gø«ÙØÚs'\JD¤š…uû–æÎÊL—ê©™:®:òªëô'|Âlž.Î|Wî\Ð +å!Pƒñµã•g» Ç/M~Ýc~þïæþg0w +*’ÞÈkÞÔ |¬×Žn>ÙŸÝhÊ-`Yª]pÐÝ'g– úözäû“û}ðBL¯ÞœÈ…ß_ì§fòžJSÜ»›™Ò,7‘(}õÇC·#më‹‹€¸²‹Öwss®2TÚ–›žEL +øÒ7«Þ…ăåH)TÄdïÛmŸ:óÂz%‹oð¸T†ÿ +Vvô¡‘"VЛïËØ6çz¼g@¤Ð˜ù\=íþE^‡_¨—áôbײ]àäç@VFRêØ´_›Àô`l€¥|ôtPŒz%ÄãÙÂ.î=ëшèºGçê:Oòu +æ18n¾áLÊB^dþƒÎ‚ÐDß'R.¡˜SÞüD[¿Î1E
sZ±ëºç¼l74Q©Mƒv×¥èé-ú€ŒNVß…*Ù= '„ ÞwúN—þ‰êûFüø±-¥³–æ«LBjìåþxº‚ó“Te9ï§ÅžÓ'üû€•¶yËSctl”,q¼0aA4¦A
<ç…9¥ ){¬š+¨j¿—O•ý!åbÇ>É”Ò}Á»ºüA!ž˜_º#r&\ù$ΉŽÔðÌÎ…{r±læ´³vðd1-ñ|Æ~×ÆXM9ZøRZŒÍMïn˜äÚá†ãýÐ1Z¥åßýäm•¬ûõÆ{¤
ˆBxØ)ÙåLO" +´[tàM‹»D6?/´išˆ-Ë=¼‰$¶bk³ãó”çÖí…9¼L{¶v<Ö%ÆZ¼ôhkÇ'®®’WÅ="õíCŒÐ^¤ãQiîI^x`é~-ðzƈuŸe¶-À£ÍC¡èájýµ+w“ŸCc?^u¾5è©-®ÃZgÌžÎÇ"|µ@´ºàÝàÙ+a\G¾~ÍúŒúÇËx(’ÄWæò(éy+%•Ñ¬|ÁÅ‹¸rû~ãmh¤Xä½àœ(ÃÇ!“½»ûÊçhÖXž9
]ùz̸°âýÝ—†Åi¡~Û0ò{‡öHãįjÓUõMÿØ~ÄîðÕ ±Ï0ÖÄݱf´V¼Ã£’0š·ÛÜúrè„öüÑVñ<ÇI«9ñ+µ1a ßü6(,i±N>~Îòs«¢®—ÝDáuÝjð¥îò€ð²ÁYwߦT$_q9V¦þè”Þ©šTýóŸÛ—¦ê·@à™)¯¨jˆé)º¶ +Õ‚o¯ÅWx|ÌhßÿéÛ6©`¬iãÃÙ·˜O0èO³Ÿ’@3Q¼Œ?œ³ +§‰úYö7òÕãré<u¡ÉVµšæAãR!Fßk~Ö€ kR[;Æ_^v(¶/”¬ÅRuû[èQÜ\gt¦uwØý˜™sÅõÓ=¿bÖXZóàw,Üë%N†Ýlõ_»çßÏeûœ
ëN>V’{Fš’:xÖÿj¥tÔZ©5!ï'T´MqUÕßãoáÜýʾzÆÑ#Ió¿ãÑÖ5Ö¾!¬ ²®ÝNË…€ÃX¦NFÊÊWtè«·½ØãËàøóSÕdÐá?¢5˜ßýˆûý]"ÓáÐ}…ÉÅ]ï{Kò¦*œ•ÏÈ)¼º‡Hmêözî ¼È9ΉLo,Ö`¯¾IµÑàæ‰üéúšÉëëLf¡±¨ä^ØÚ¸öóÓð…«C!T±îVßzÕ“*˜åG‘ÌSŽúŸù:à°)1·nnôŠó=ô,ØKÄá¶E†îî"ŸZN:$\÷·;|¨#ë÷áïcö¯÷à³!¨æ±õ(ŒôzÊ/·¯6nxWJœ% ãÚKý[ùùÌ€v:ʆüñ.àÙlèi!M[î¼zQ`ù±(TS-[û…¸§,pŸ@3‰…]TäFeʨ\€GFÝˬRÕM[*›ï1s„ýáÏ1óÞ:•©øö +8)ùDû*×Ûq¥jéÞÖ$iš>\Þúk‡¹†Õ€(s4Š¸X…©ž„i…ctÔï2¾E^¦¾[áF½Ô•ïºTüx9W®k¯ÏËè&š{²ÊµèebWN¾æÄ&Ný•èÞWG÷÷žÕ^Œv²:-•…¾ñŠ¯$ؽ«ÊxãÚÛQç…•7«ª>–©ÃhØv„vR¬?ÇÄÜ:k_›‹gt_36 +9T›Ícžò +Ý5¤&K(¼rJ€«FRƒ"™wkiôë¦rÐîÀ[*Õ[èï²Q'*o¶rfp-B› +Phì¦:#”ƒ38ñ”Ô·©5ÅóŠ†ìÏ¢þÝey®w¾:³çëÆ¥Z +½ë†AjóVùl°¹gæŒ}ãvãšm Þ*ØÚ`0ó´mÄ`Úë’nþîÂÊEÉ_A~õiÇæŒoƱ—ä$ñ4ª–ô„e«ŽS”Ì6*ÀÛ;=P«2›7l¤ñÛjóÇ™–ÛÓzÛV×áGßMg•Þ±zßÙ‘_ÍjO,ª– ÞÉÞåÀ1¤Yß©ØéWMç?^+Läz®’k{à`ñ|Ÿ•ÝÎá)åærØͱâ\ÙnbZùAB© û8ÅÎlh0,™ƒû™nýÔSs5Fúõ©ª~Õ+×
ßóôóÔS”fXX}^à +º‘^³Ö‡!§F«Î|·•«xnh +´©Âd‰'x„Õ@T;ݪžîÁoÿMdû•yÒ¬£‘‹vÔÄMKĺSÁÓÀÝî‹ó’ñÔÉÂ7(Nn¼$|ºþ×ùlxvqz [“¶æ–ï夣M„†ÝÅHÿ +?*wº|vDO[Ûmð=_œtp¨Ïqð·–Z¤Éô.Á¼Q°»Æ[cw¬âU‡tÓt·›:W×sÊ2dÓG$3);ãóש44ô; ‚ÇÊ40KÏü÷©?àP¯—u)õ1ûëÔúŒ3Ô\ +»ýëã +äŒn£t~Ü[Ž˜BKǶë{>ïœkž½å2×f‘~ŵý_¯Îe'q«HÁ·¥ëƒ]lj÷ó +òÍM'¯onŽxÝÜ@¬…ƒŽß)ûl=?ö2ÓÒxbñäâ{6dˆ/\{ˆÛClEÝy£ï6WƵW˜£`ö +%ôÁ€–w²›¯ˆÏ'xéU.&Gi¯ú-v&÷òïS‘"«?Ý“ŸÚ½`º=á…hüò°68‹u44²R«ðáj^Ì,ïKÝOËø^ŽÖ(_#†áõÆSÍuh4¤ªßa¢c__®.sÿaû=ôæ=Ç&ø’'^p(£PEÏ—Vº¨¾\‡'¬ÔßõóŽÚ‡Œ4-õb̉í5 +öþ؇.y8•Sp¶{ÜœÊx麘TÿµŽÛs×Á^6ØqߧÕuô÷߸9ñ×÷Ùƒ YŽržBöÂñ#Fï’@;ÓðuŠ3„ºHrܸ¢;+Ȭ¥KÌ@ ü¯¥½Ý“Û˜ñ6OE·«íä÷÷ƒI‚ô¬+¯Ï¨ð•Ô;™ª\a…Ų7Èzºë/ÐÚ³½ÂmGå÷#¼OÙ…"ØHp.‰úk(ý3Ç¥ .«‘@ÞÕåÀñÊtϨç“&>æNýÛð]’rË$þ¬`#'#B™–Ÿcê©L~FOML‚ÂÝÁ{*°º¸“æJË·²•Ïœ¥_ò
=dn³ Ómú›)ìîYöõµˆàú.šÌÅj„p^…Ã|ZP³¯ÿh;ÓuUnmaƒ½`ßwôô" +Š‚
¢ˆþÙGÿáÜÉ—¼y“ìµ²²þ<póšÞ5ž¢ªFY»yê#j4ËÑÄêÝ6äí”·ÉݯÚÍ—K¿PîHîÎæu¬æÁé\»O6Ô0jìçÝM9×kÆcê1ul8¾3 kh.mc`ºË±0øì´~fzzCÖvS/€EžiÝ,tâuÕѺbL1ð™ìæ›–_/3ó¹!ZjÇ’¼a¿¸è…žÖ[Ú•3
#b–[ t<BŠðxÞ¨—¹Ë‰/3äÑ‚zérºÂbà0B+_Z›eÜáëÖŽ«Ïû¯y/YT?6¸³²&ÁDz=~‚vi„°Íö¢â|x8è MmäÑì…ê½ð{‰€¥^å:Nò%½2»<ÎöéÌä²–2×2E`<{¥‹=aЇũ§ù×îÌ +†¬nQrëmÀcO°×ÒgêÔ\$uc\ÍÙñüyu3ŽÑõéSªZhQð•0|Wß1|¹(Ρʺñ8a^ +á5‰PUÊI’4±·35 V–ZÅW`ž½CÐü™UŸ3¶ª®‘ICª£cØÝ^m…cîñ¬¾´kQnÉq8¦€q£7L¦¶zMƒµÎà9Ý.[(º½²èÌ+³ð<W“†< +qˆz"ØÓêc‰È–¯ùäZmùƒۨÝ-Æ0CèäFζ°»k%}EÚð¦þáó¼>¢Š;Y¤qCÊ0¬‰$Õ[¸ªI˜~@:?N³ƒ[Q±T9ÀÈ4Ú¨Žod¨!ïJ6Kêäž½v¾9,F5%/ŠÏOÆú¼žÑPµÁ“P%}~Å9ï¯hiÕQ“$œ_ï%Ó¦w'»ë©3<;uÚÕ‡7¸yϯ;&\)ÒW[Ä34‚€¡–H˜ë}¨æ™C%Zsë–ñÒrŒ°ìhÆÚ}>éù§¯Ôôيퟫp’š-å†z5Ò̹¯ˆc¥4ä‘5ªŒ´˜&xs¡ð5µ€Œ÷ô™¦³¯Ò¢,ìéù‚PßÅ£Fq¥’ÒÇ”¨F€ÅJ#¹+ÙõôÒû¦ËÀÄ_Ýt0\R£&ÒX—žÜñé@M[Ez‘‹c§¹BƹƒØ„bŸƒ¸CˆÍÑšo?OàðTÍ>\&»!Ra?YÞº‘ý$™ˆ‡'3'¬tŒ«§ŒÐPj„R!Cžºá¾VÜa2WÐýÙé°_Ó§·²œzÛ'ÛKõ kzlÕ4Ù@wccÙ¢þeÏO‚ÈS£î¸l™h”Ñýg
ÖëUsËÍ9sçÌV
ÎÃil!Ãçáa÷:É·D+sš5‚Ë¡Osc"ÿ*l’dÔºà ÐTžÀÎÉ BÅž ±œïÎö¾\žÇšžÌúð®†_‘®‚R}1ç ŪVp {Ô×@ô¢ª
?¤*/su¸å’sší][í‡K""rÞ…T|Ì4›4ü- »–.6µðèˆèeæŸ'MPL‹ï[}DÏJå4õŽ»…dîUçsTˆèNûÃÅ`vï·or–fí“„õ—¾Q_æÄ€>«W›\{Be=Ë.fÛór™Vn<ì€Ý&™ø¬Ô*Ç–2™W÷>V{´{µk“ÙJ]ßUÊý²â3}£ÖÂdh产¸‹Ý‰_N*³4{2îÞnŽæ=·³ìÅù9Ä)’MîÔU—Ã’õ+÷’œS ÎŽ/ +q‘Õ_Fw«ž$ŒFíÜtT|£ê‹ÛôÜ…7÷GÐ._M›ã3‘‚c6®Õ`ÿÙÂbîPiÔ…H°Ô+G#‹yð™Jê‚÷‹ÕYiÇDËj‡½¡¯WàØXÌÈsy(@ëÂà-”ëÐG«Ôazc(3Qqe‡¼@¼‰fÇ69»©•"ÆbT;B¤³¬¾‰A·Ã´†ðÄÜ~÷³×zLNJUÆrr7öéù›ØˆQµáºqè";…¦çBŸA3oÁÄÔ Bºñ+×Áž+_!¶j¿é~t%küðL—оOO±þ¹×z~Ř2ã÷€
²Á9oê£á&ó*â†
tp`–·jõ:@Ö1±F.橪íÖ +êâ”TÉ‚úÛ=O9Ðd!Ã×ÖÆžÆBI5I%‰4Ž?7`+Ÿgù>ÙKcÄ+»,Y N²×Æxw©2ìšTU,@ÕR‘i”hNçf¤»Ho·Ù¦Äˆ¼FƵÎP™K`Çz¶/Ç@t;KXój\ï#š¶”3Ÿˆ^Z‚&½ÓÎɬÎô³‡©·¤ŽtШöÑ,ÁTú%Ó÷ãÁÀÛÅÝÐ@³Î +&tϬQ¥Jͽծ:aˆ”}5É‘éúdü¬/ºÇ¶{×ýd")•^E +ɽ ˆGÆó¶»Äæ&ZÉ¥oãUeø ²²´hqÆ°–ôˇ7]vïÓÚ¦;daŸtÀS`XB‡(é“‘üì=Ä7aå9¾âä•{»qlÑrWlóKš)cò}ÏÃuÂGÄ=ͬéé“£*´l¯©‹.´±ÎXÍw•Áî¢7Nf¨Þ{ÀíJ["wœ‰C¯˜Ô¥5<ͧde¨Î©J×öˤ–÷á€Þ×ÓR¯¡£€ADÒiÏŸµ9:8.¥Ënß9Ÿ©\´ŽÉüé>£xG]/†²§Çte•UdÚöVŸï’vƒÌkVå¨;ؘܺÃ~=н ðËvšio\¦Åò¨GJg©Qó«~›£öŠž±å$>2sd3ˆFsEŸqâ6ŒJغÓÖ»¹yï³?Y?ZÍàV}ºpßÌ"?E©Áú¹ª8%‰``Ò%ƒã}1õeÈ䮰Ρ¬4GúO``qÐ~áí!o·²3£Í²èù@Vþ¾vj²æ¦škºHë¤È̾E™c‹ÍSo”Ïèå‰D¶áqùNŽ7VsΨÇìpÆ¡ÎÐP£Â,7p†e%{ÚP˜5è蜿OÔ]½>27iÑÈÛkî4Ȥ%3töúl¼æP.eŠq7—EÕ]Ó9¢3?/ñÛ³‡7Úθ÷¢«Ê¢<' Ïú…«ÃL{e@”D$ýfG¨kÊî>m—ä«|½µ_ŸYw–dXAƒI{V8h¯dÎ=ÚXï±lm˜¡ËÒzÐð”PÀ½SÈЇRzP
;0N;Àˆ^ma6}Ôq-‰$Z=q˜õÙöš¡G +*ã¥ÐfD2µ.…gjW\“´ðAŸæ™ Rš¡8Ý£•)Ñàý˜ëqbüù±NÝHæ%¢PwX¥€ÂûаÞÄ™*CÖ‘ÎÌVÝê{Ó›Ó5ÌQ?O¡)ÒôŠçt2¾&sËêK“ºW»Qø=ê’Õ{|kwOy†ºZˆC&_M²Ð¥FãøeCªZ邧ýjØûÅ3ch*e˜ü¾í,»êhÕO>%·€4²ÿ®à
5‹;L©d )VÈZ¡L˜–ÑöhËæÒSñ‰dÙÇ5>à°œäa—/iEàgÒm×^‰ñ¹´ºe¨¥Œ +̱ +ÚÜrËOúÊ™
ç•äS¸i`<Z™¥OÁ׶ês´ØK
šÁ6~gúÓò<ìéVÔ:k^æ™!%t·ótå]gõ=ÿîP…®TnK£j¹Žfš2F1“;‘2Vµh ‹ÏúX™Ý³Ó’QË¥À¹¾Î3žB½ýYQ]÷B3g 5ÝjIÁ–õ7Ïœ¬n,˜Ðû]’¹¯ËDzÌb岕7}¹WàÁ»91ÑÝBk1U}’Ü•òã àà2³dz-vUʬGl)Ébˆ° WÛËv@!H÷Ål½Òn\~å®x™Êèé +¨÷h¨åm uª/5AÈúÂ|Òá¾î‚ ýRð.í}žÝÑ[e7XZâXš"€Ãl°,„]]UX:½-›í«Ñ ¨ì”?Òól¿]ïP™€ÚuŠzŸ¿÷ª:·¡ù;doíÈõ•ŠUƒêÅë¸W¡VÍÏSÍÍåòê“b“(,Mor"Ý7ø X'³uú”ÞÀ´G„Nù®i4Sƒ¶5É·–ƒ™m(Ìñqb¨no+µÑë3’à7({]kÔ;UÇbÈ¡4§‡´wMUìñL3ˆ×A˜ô~ï
'¯4T–”$×=gÓ“qp…Šî5f™9õŸÃ¢w5iÖ=tM)À"cœª¥Í„“‘Š ŠöòzwïOvŽ˜ŒûüùmG-Z +„ù8“Ÿ,_®Bi7ßA¡n-àBXñ*ƒ^ýAt+s–gìa°wÔí”Ý°drˆkîºIzµ™SY¬ŽzÐ(zpÍn·'n¿rKµB+`“¼RC“Ëæîår¡¶¨˜¥VÅ{tv¯ÃSŒÀ]T’Z`Ž¶ÑÞ¡›çÄÍF%ãÉÀ¯³×½MTØzl’[ß°ØààNDfççìÊOÚX
Y{èõl¹þ&ó¬G12Ä…ƒZb7½r³V‹:9Ç6¶å[åi:éEk;6àrÏ[ºWº<yì2æöá>ÞÍ;‡¢Da« ,Û®ßÁhÒòI’•d¦Tl×f]ó2Ô…óæêïâAf㈒vYJD‚vp꽈¸dؾþÌÖO‡f@^ËsŸ¹W}·Ö)†E*H?ŒµÞË‹cïD6·<ãr®ëòIK¦DÅaÓuöÖt÷üZÒ +³µ1V³4Ý\Tf±XŸ+{ÝÑÇ}vÌpÁHﻕœK[öfÄG,´7r¡H»ŽŒ1ÊÆkÖ‹‘E_WˆÈ øü”dâ=k0 +ú
˜)à'ÿ7uùÿÂüÇû®x&=ÿÏ5þ»ÿýñL?Ùø?¯Ë¿müÝ/ßÏð“ÿ'uù‡ñL?ÙøÿªËO1þßwÿ/1SÀO6þ;ëò#ñLýlã_—Ÿgü¿êþßc¦€Ÿlü·×å‡ã™~²ñ¿Ôå'ÿo¹ÿ+f¤<¹ ¼…//`¢¯²ß7ƒ¶ëb8ìG>½ÝØRïvÝö3¶Þ˜›Ì»¸Æx¼¨ƒW4»[Ä[6ÕÑóû%üýõtߌA'“Äó䯯ðý¾V¹WÑW'¥Ö!¿Ívsœó%·±o•Öu»Ì·ÓÖe€5öÜtf¹K2¾ü!RŒ¢q såÿÛCà©•¸ÿhx
ßÙìëJ`Ñ¿_:ÍÃÆegûÚ4·Øqië› Ü¤)=Zãðþ¥{ózFªÝ‡ªÉ½³l:® +øËKß _ 1h'íó„Á}$6_WWžO]•is¶7Ý–—ö`Ôw6qtóÖ»Êéª{‡ÎcÅ7Ѳ¿Ú]”lñèŠûÕ}Ã7‚œñ%üå¥ôØütU¹ÞGFó”[BñtÛ_^†À¦îþó¶RævYtŒÞñV<çZç>”7åüT±“ˆoÎz!’å¿-1Ô»&ñ<Ë$K:9àõ¾’q€Ÿw…³MšþhÝ›ï!éÍXV©!td®xßÙkÝ~RŸÎÃW²Ze'•TÌ z½Zt¨œú—’þþú_ʯ ™ä¬?¼ÜŸ¾ò¼îåüeÁ?Z§a¦‹Ú}æ®+“~âþJè®´å£ÓÝ,Hý¨¬eÙ•ó×—-VwMƒç•ÆÝgùG$üYiÍÃô $ ÌüüPûÇÍ.òù«g¸íCygw-˜{W—7O.F]Qc$g©éÖe/oì‰-•³¶)°“êjh’òÙçÞ-Kÿ¶$˜×æ/˜Öü˜UãZ8E¼âÈ9¶f/Poùˆ˜:ÉoEÅlm
%7_n%'(šbάøó1«.$L’9•H/ŸºüŸô‰!:lÆPPâz…s£žÂWÖ0ÂCµÛH[Ûr;§…ïYSÍôXÞÒm6é“Z[•vÍÞZ<T#C`w¤ÆóV^YtGªÈ
fcá‡%©ËÄ% (Æõ¹ áCfëY²ëØÚZ»è—:ðT§Â¶&£·öD"°%È«(ÒÙp)økÉ_&˜º¸õ³÷h®“*±_Ÿ’þE‰¡c¦™„rÈ<"e"žq–JÆÊn[·ÖÇCn»LSÙ‹äŽE‘A£ž°ÈÚ°Ð@,ZhÔ÷ß®`üB†!ž{h÷7Ö«wÙo‘ðù%q=SlÆ‚Œ^½W§»?«Ä*ï1M÷Ké Œ]_^Ó|g£@‹{A.Bœ'Óà>ÂÍóŒÌX5iÎ +øí<®O*õÐz‹¥¹O†ñ툮ï4'Wٻȇ³Øæb•¸qc̳ke +1<Û îºA—8ªA¹
¤IUÉz“ô²…ÉlÒí/I¿ÿ°DJúñò +@ÖùŒNÌõÍÌ“&cFì™kTð/J +ø:$ûRŒÁÑžŒÁÒë ¾ñ3«]þÂtlÈï¼Ñ brGËCÅáCÛ¤Þi+£™p£†X`=íàlÖìÅ4–åËÚj›×õ\ÑŸúîP¼§€¯ÃËßc&9ò‚~ƒ|S]~8ž)à‡A¿©.?ÙøËýoÀL?ÙøoªË¿ÏÄýŸküæÇýŸjü¿àþ·Æ3÷®ñÿW]þÅ)üdã¿0?îÿTãÌýïŠg +øÉÆÿM]þí4üdã¿0SÀO6þ»ÿ{ÐVÆ„‡ñ3θ÷!ä÷Áûð0•‰Ý±LÈwš¾IÜ¡¿•·Çf9ÑîÖꜽ™ë~][—Ëe
å»Qä±´v*ŠÁ?”ð‡‚_@±ƒÍ×>sÖ#œB·ôõ}ÅÊÖrŒï+gSr ½±Åêo•Üð±ûÈ?«wsFñá:¯_B£ÑñçS8+RCºü;ò{Ìqf]©S”Â)×*Výûd48lr¶'™›èœºe_Oæi«Ptú*¾ ƒÅëíLçUë5èTP¯ÿße÷ü—’d¯{ý’€Š…ô˜ ¨t}„†WN0µxêÄ‹Áqúv±½Û© ;h[NÓJŸRÀöŽ]ží±ÈZÓv[ÛãVN§Åav)à[^ëÕHB +—ø 2oA˜¬BK_òyò¯çÿPb°’xjIû„àÞ:®O¶—¨§ìÓ·R—ý—yr{LöÖ®Tk¡ëáê„ypò–¦¹°êŸUƵPŸô—‹ òdnÐí +Ìûrá™ìQþfùÔåï®Çh' v˜ÄÓš¬âúåæݳ-48Ëj»ÐR¨lrç[e%õómuÚÉÍdÔ$(‰‚x˜¾–bM=&mŒçÃŽ²è.\‰P¸À¦‹é3#.ÿ’ÄPo_üú&ñ…Çõ6§F½¤^Ùýqs ÝÍeûî¾bý¢Šu¶@¹T&âqTDE°²‡ìEþ",¤ÅDîyÏXžoÇfý*ÿN’ˆýgÁwIÍ÷…R*H\·üÍéž/¸‚þ¿†zo™vá[2Š¹WÎÅ°É_7Ö˜¶ÛÅED±¯’G²“™J2ærF0¹k ·b™ú.Iy)†äS! e{øAàÄáç–óh_øµ?€Ì¥qˆ,‰fx_hq¯ôâ¾±j‹¾.v¹3±ÓÑsÄX’3f +â6!n÷.Þ¯ŽØ¨÷PcøèäæžÐ½># ]>ë–6 Ààí{vûwä°ƒih»^WhýŽ|Þƒª¸ƒGAPÁÊ€O˜><,)@²„–']{SÙè%
Éßî:ìÐg.ÙksîŽ$+u;'ß’=¯J”3óºøþÏ$ü奿”d^7âÚ[Æ5÷˜Œ¤eàò÷xú67…òD”–ßkzóƒ9-0û]y©%9²÷m§Þx6_ߟ¶Aö·àíoÂÑÆßÈ®tÞôjøÕz,‘‡“µÈ÷ï’ð‡‚ïýÌðà ߀™~ô0ÿ+bßú
˜‰û?×øÿªËO1þ3üdã¿0SÀO6þ;Ýÿ‘x¦€ŸlüïëòóŒÿÂL>åçÿ…™Œû?×øowÿ‡ã™~²ñ¿ÔåAÁ’6J@÷Z¶Š è{Ýæ¹|¡ïû–/ÛÏÙÁkô~7ÖUÇ/U,§N5<»UHâ)†}ožo£”V'+ªÍÎÖ’kÖàÕŠÖ³ç2™ÁÛ1zýI0'_˜ã¸ÌqñüQå}³ÆÛÒå(¾’,É™æì˜iŒ)·ðô•]ÍšN}Ý>Ú-$<o¥6vÚ(v0®Ù“5\Ö/fü*ÜÍ´uˆtÌœW‡åõô÷’þþú¯ JÏ÷)Å+§GÈi¯0s¾% .Ð<u*Øô8yH¤[„cyGÓrÏ÷ð`·üÊuÛm“Ÿ±²ÿµnÛM£˜ÌLåòÔ‰ntÕ8’<./÷éáG$IàÑç×· (Xº.c¯øQ'w|…Ù|\¼V±aë$î´éÑX{¤k“cywlù¦ÃÙòÑnw‡Á¶»³oÖÓ¾_Mã1N_õç®6òg0gU¾d]µÇßw)àëðå4›Æ8‘0Á\^Ô©^áT—®dD·NrJ2oä4©C~¸Vö$2Ø8'ùáÙÂ[¾m{ÃÌÃÒóÍ»9ë®"ÑÊKsoU©—NòK^ïd£§:ß )à//ýèUA§áE¢ôJ@½nñêÒzóܪU¦Þó¨Ð‡
]UÝ’áÙ;&æÏv/<¶=¿™óqös¿”ÉB°ª—ç×eçz +eãàz<ÛðînDÌÏýÞÔF_ß$† è¹}ŒÄõë®;H1(—o3 S ¿˜ãÌ14w.Ü=w;Pºk:Ù_
bËú«úsé©áÑSÒ…þYÊÛª/¸Ýš#¸µòöKRÀoçß%¿&·T¤Äà³wŒ‚Vã¾÷R1Àõrë|YèSÿálâ~¦:4Ž +凇(·ãûxè–‚Ý`Ö¾pJy~RZÁÍÇÎÁ~¤oŽà7¯–YNF-]=jæ±S4JÚ˜„^šŽ +wµ}w*r–2âÇ…‘ïRÿºôàd^½ãŠ÷Ï{u\^Ú’“U,¡ÏÖBœ!×/"gviù{ö^v¿I +øCÁ7HŠ&ñ£ÏFp)†ú“ý“ïsÏ{L7‹·í;Û ªÝ~iq–î§/JÒ'ïxfîm²yÜ5@ø´[.;øVÞœ†¦Xac`ªÎj¯ôš™*‡™öã#3Í_Üï’ÏêèüÔÉ$ º{žÃÝó1,c…Тµ^@a!uîÙíµ{pg›mœ[l×û‡¿ÕÂ^ÇRÓ»‚)íJ
ók#§ÎºògM©ËtžŸk”Ó2Êߎ?"1hÓÏ_0ŸE1†,:icq]ˆ£¨§fJ7§·o_ÚÝ=Úü[pzÀU0ñVNZ‰¼¢ªF–]ÊhO_‰‡nÆà[ó·Â
º‘™UtžÎ;s‘Â[²A•n²ùIVú—’€I<1k”ÜCE>®gäíóbänŸ”e®õµXõ³Yh¼(l”¼ +‹HÆCä5M^<¬+²à#ûå×FF6î"<³Þ=4/y +Ç9}ùýòy»×¯ç1x¢Ð…€Â ׉õ¬ƒ—Ø=|ƒxf÷|#noæžÓÒ[±«®ÒD.¥·¨H -pêUàÛ™)Ï=çSϘÅ÷Y…ËÜÔ.¿KÂêl¥‘_0íý †ŽC:®Ç7-„Íž‘NÑ Ü¹~n§œ×¯µJ^]?ÔªäŽÍ®5SþÊ1¾-(4åK«¯×$›öqŠÉíË]°|Š"ò;6ñg’Dì¯.ýAb¢DNݸ>!°‡ÖG™‹Pµh×›mŒ‰Çwcq’Õì‡D·yu¾ÃÚý°è·™)7ÊCs6#gÌÜÿ¼Õz_ŸSûL<§*ýLÒ¼Ž&bâÿPRÀ×!†@9µ2Ÿ¡ú8 P¥sØ¿ù‰=É?ãBtvË,î$qN¼ÜL¿Ä*sãÖ`§N©Ãäg›.]j̺IÖºT5›ë‘Lßï§Õv˜ˆÆM%"Dbh¾¼'²Q¾g›Ç¢DðÛŽs²^Ì2Z +XÎ.M‚Œª±ˆ´ÂžË¸€ÍYÓí¼ƒ<åúR‘ôöã2YÏÖªßT‰æÙ¯áRyYÃ;¦ +S¡+IÓ–Oɉ°Êä†"êD."ÚGV?"I +÷k.Å5Ja“³ëöé¯_ûÃk·Üi^è‚1ðoÍ'z\³…»Áý勄펔ŠŽÃ¬½}š`›³šG»å=»þÌŸ·ìyÝ^šïû–?ä_IÆ×åÖÑ?”/ÐoÀLräýš¿©Ë·‚~f +øaÐoÀü¸ÿSÿ¿"öïÿ…™~²ñS—Ñø/ÌÄýŸküæ×½ÿ3ÿÇî<SÀO6þÏ냥Š—àÁP‘‰kÁuƒåÊãe¹ +n[>x~>J}˜z¶~û‡ò{LI¡?û-7Ÿ’qãþè‰xö67õÚå˜z§6ÔAŽ1Ç3‡Ü §îñ¹lîªn{ï@ìéh/&XJò¶ÂÂó··sÙÜf«ÛFzlb3
ßcÛJ’þÿ/ŸÕÑÿ(ø{IÈŠ‰ñYkkþlc´bï…¥¨foÖøR»VÖ`÷$±¹7ìºÌavo%ùþ7MsW+
w´ Pñ¶"ðö6·÷ú´‘gR°éúÒÓL3—›¾›·ýÕÜï’Ïêè¯ç ˜D4ø´P× ?“oÕ»=”á:f.¹ê•Í»§«`Ì<-¥¦AÉûþXï(›Û9õZÅ·›ÂÂ߶£çg\½Xÿól36ºqÂXñ5_ÔöËËsþ¡ü3°èÏ6Æó<¿¥€GèŸ3á”Ô®ûHƒpæ÷ósÌp®ì¢ì`½;Ї½Ãº“ôbœ6á3{±"išúkÛóî¡ù†rX¶ëM[íM²›?Èguô¿KÿL~ú¶©Ïþ@#Éèçר3ÏgÃu–ª%ÙïžÏ³áÜWÂ={4ÌŽêÚäÆJܯ-×áš´·•tídÜ¿†É´oÏúuuœÏC5,T÷ÊPv7ò«·1¿_RÀ×!$-ôÍ$-ôm‘ŸýF’Ñ£ (O‡ë_ ðv¹w©—–ð©[lsÇ·ckø4uö$²òìö¬íZz¾´_#Ãî^'Ïô^;=^îR$íÏÛ¼_ôÚ–3Ê”æodýåWLJn)ûkw Cq‰¤t?“Â÷Þ©ÎeÖ»°§|ºÍ‚O‰õ‘O®s®t÷p²×[i½Õ)k»Ñø9°UÕ*i+#½yྱYËK¹šþg’þòÒoƒ£†÷hó³ÃÚ)®b¨OŸ£€'3÷ñð^½Xµw3~\ñ‡‹²í–5ѱ;§KÒƬL¸°ŒÊ°khB«·RÕ«bÈëÕ{-! cn·kU$6x¯ðÐÿ¡|'ÿj㟌Z1ÂéÙ|*™û*jÖn[)?¼ëoò,ÂgÕ˸å펛AææÈë5¶ªê«Eå±T£\¤Ê&-Å]oµ(±øú°æ$ù>?9¬|û ÿCù=æh¶1&˜Šì?[‘~n"˜¸?×ã+ƒvÈÓíhŒÝN¹ÖlÛÓtòÔ¥²â$%c(’¸O{ïe! 9ëUÓ×U¶&×…—«¿”ð÷×<ð˜4NúìÆ’ÆÙK@º÷¼T3™ÇruCàd.gN$ý¸Nj{¯=׶ÃU×Dû*k·"%¦ +;,7”-vÛÒóƒ`þCùýS;!IÓœ(q}â»OAìÆ÷éøU¼úåL÷³>¦Íi÷XZñÛx¦-ÖTÍ_hŠ9â€0‚ßÓ‹p§Ù4W§iÄÚq¤{›d
¤u³ÍIÚÜæï%ü奴‘ß\$ §þüD^ŒëúÃyhÐ-¸•¢cæ¬ +øíü[%£yz¸¦Ÿm-_.ðé²¹nu;ï(£
u;¹E¾Ó1šÖý¼a¾.Lá >©ÃÌI“ìu–%øM.‡ÏKï¶Ì"¦Ò\ +ÆnÕ×>ß%Ýrï»5 ©Ë÷K\#Ë_0gXO×>ûW÷OÿVy>zS*3e3É‘¯D
èŸë†øÝšÇG^K:dË;Íì¹¹/N£ÍŽh¶s˜À{‡:N}§Ö]mïGÛÖ<™qgv]Ïœ›ÿ—’þòR\-±»”N„L@{ƒãÊ.ñáó!_Wù0Óº×Û빶øÒ-ÏW$"²|¬ïm5wûN”ä•»J]Û9t;Ú~¿s¶Y§sß^ÒÍ؈x°NF|OÇ£áþûåL Ê|Ü—˜äVzIµšG;çÃÉ¥IúÛ?ûqû·Õˆ9Æ•x˜ÕkúÞ¸ô³f,h{Û·úžÍ>¡«]Ç;±¥^©0!4=½¬û ùäÉþ~‰k†±úMšæâkãâ³-4IGÏÄ#ê +øCÁïAßÊð³?IB9O@•mðäá0ÿÐbã¶å‡_‘°S7*ð®cü³oüf(0ÜÍÍzO/´¦¿Oæüj_…Dù]–r8["VkÄ⣫ ûeKý~ù³™ýü ÿÙÈ|VHús#†Ž‡ëó|/æï1ÕƒÝ6ß¿4õ^Í4·§Ü»½8Æ´`ˆÖ“¼•ÒZ€VâjŸ‘ge‡ÑLÜî@ã™ÝmÉ3úCM$V¾$üvþ
׮Ǥ™ºýÜg#xÿó N:†Úˆë™ËùÙRÜ=‰µ ²lö΢šÇŽ€*P)À¹°b3®5c8¸v…eLTÎ΄ˆŸp:ÉDcnÁë7…Ž”ÊÌVþVI¿ÿ´©õ>Ž$ÏéU\oÇçHdÒáÜVÊWh8êœÔAsÉ ˆÚ½ Žš›øŠèЇ—ýñ–ç÷Î\¬Ìy„oTc<ùy’$ªË>'01¿\±^PYu%+ß/¿bv²IŸ¤u?ÄÇí³ƒH,û¥óˆof/<gwýtù>ßÁë|c@å™q`˜©Ö&Êôñšˆäê9áïú”ë]t˜1òCœžeƒÄŠž÷&*“–Qå7Ir±ÿ,øK‰k¯ëúPÌè$MÄãzÅ\ÆõëÀ¿ãÛ= JGà|;µ»‡Ý:·86íõv”V×Vs¤Nò‡¡„Öççë×÷â“…' +33I._4Á¸
•$›CBíùò»$|b°˜ÌjÁ(1^³ÛIãl qð•(Ìæœ6/—ký +“üŠ‚óݹN0ë‰öýò+f?‰çißüì·œÇõÝC¼¿œ]2·j#sÒÐÛó°óGiëM«º•ä-©²MáÜ쵸(l¶`;h“ǾÞ%òpˆ…%`ŽFÙQPDâmb]n®ÿARÀŸ•þAb°ñ2“›}š‰!ðZOnz…Ÿ¹á + N âÀ,hôûïXÝ{×sjW÷YužóþsÉ/«»Öµî$$w¡g-·Žß%!Ø8Ù÷çVT6j7¢Èå5Òs͓ÕEæõ`rý`#¾Ÿ±2X¨/qžÅónI ôa›Žh½0¹M*ÅñüiÃÉÒô³oñØÇÙÇ»Gd–À[4óŠg³U
ñÏ
?_vXW’h†rVóoþ»]¬}Â) Ž/‡Sm¦o$³|Q²™“#Ö„¶3ïõ@@ÐésZ8‰‰cÒã…’ÎŽðÂ&?TúË"«Õ%æÍ}–‹“b½žë³¿Ãò?ú8¨çà0ÙZ…0”½Ô}°3Àí0µâ“´íàz®dÌ7+y¸Vr©‚.Ö)Ù˜½‡´É—ªÍ]ëÉàǦKØ_B=ÿÙoy{± ?K°äšM3» •eÒE4?Ð
´8ÈæÐZßÜ–ZÊÒþ3V†'~Lc×Qµ¹v +<˜åú3|#÷Öœ’³hQlIužh™Ÿ?í·o¶¬±8Û^F¨i»ZಽÕ.`öGîΤßd<`ñ +dãj¢?®æÒ_H¿`årôC°?ì>
¨xÙ£_鉼µè,ÝãÏŽ¸’W5Fl¶X8îÏ“òœ/•W¬´QdX›¡†
ö,¥½uæÖàx”¬Aî=ºö-‰qúhÜñèë¬Ð%+{§*û¤fQúýøBþñG RXŠáP_Î%Së¬tR7Jvü„Ž4*6/ÓöLÏ®Y=︉ŸŒç#µÎY:Îf“£U ôÏGÎ-ûØ[ÚÒ7IØÓå˜Ñ)wF©E?Q5«síîô¤îÿ9¢ÞVîXvqõüBŒ”¾AÇÜ:fèXyÏôμÌcfžœÕÅhDÔÕ!‹ˆ;ŸˆQ*§&ôl~žRÞY›QKZù±*õVÝ‘ÜÃ}R&c‘\“*†oÈÎ30uãÏaÝ*wÛH„„»¹“å–2ŒnKQ*$ŒyJéÓÛÐD&R•©wä¦þ…0£<Úêß*b‹ž_Û%®Ÿdïܨ^»¸{÷VB…ÏJ¨0%¶M†ÿ¬eΈ¤@.º‡ +)ý;¾ß•êïXÙo«^Ñ„Ž.JùÍpž’t'MïééÎÐî²– ¤Ö;ÓS·@jô®H¼
¥BìX¥N¤,¡ ‹>áZ]ã:ÝÌmD@½ŽÉ0Tg”eü†dþ +ìáE›D>|ýZ€€+áŸí[*šcÛ›àS».¤7iq‘®J‹•®ícO½<kÍe}n.ë]ït!ðþíB—á9ùêG0ß*Éàð‹è74aŽüߊ~Ãëÿú[þ\ôš_È-ú
ÍÏ +ÉÿhÅÿ>bÿWüÍ/ä¸âÿ¯¿åoQ¦v„¶Z:N†Ðq
RÚ‡¢ê-ãÙ«A¦âÞ¤<`'ýÑÜÒü-lƒÅ5N¨âUéO•ËsÞÕ.ëwukŸàPýüN—¬ó+î:«ØÊ4KwÉî`ü®0¡mB˜yh8ñ”,õÇúØýú´[)(ÊT²áÛ™U‚Œðèxž‡¢´;±—")ÜVåxqUBuuy>úê…x£›ó›Ëéçmœ4ÏÔ,w;Sl+„†¹èx«óž°Ñõ¾Ÿ×ÿ€Éæà#z˜îBQnÎ|Vma:"PsŠÀ(¤˜ìœîËS̵½É}Í8Îås¦½½ôGÂUâµsYÉíØ]ŸßçÜîLEãœb—sª[‚£ÿ¶ñ<ÞÈy KÕÛmÿÔië»øB~|ü-ªPð*z£0Šóþç9y ” +¹3DÄáVÉÞ7u +jîÄ>ÌEîP“ü¬[ÂÞóÑèºÙ;ð*åÀ¨±Mïì9”[6‰‰-ªæüú`Òâe³Z*ç}Öy:å,&{´¬ÌÒñÍsûu$ãï5¥sÙêã¸û‡ŸøB~)øþS/c0”kúóøù”(iÓçcùÈd£®Â•C9á~AÍQn¥<ÛR:˜}!ׇ^„¢—%ª[+ÛÙN…äÄ:Þ5ÛX´2ÁþÑ·¦vÉ—ök»ùØý>cå5`vã/°‹× è{݃)ÉkJf÷Jî2~øûA.ZSçJx@‹-ÿ¬h×îùc;¸`³Ë»“]XÇaU4/Þpu¬8®ª‡¸°=(ÛŠ¾)Öþ–Y cª¯+úq«Ö½¹öGøOM‰(Â:ßö>O!Ï>ûW
P.ïáˆü¬‘ë\ôÌç«á`Ì´¼«¤RÎòꮤ¿›X£Ö”3Ë9o4Žºpè²éù>qPÅQï¯7§RO׊»¤®zÂv§¬ÆMVù¼ú¾ß•þÀîÏ!ìC⊶QXçŸÇ¥ÍÜü³1TeÞŽRBLßßâ»ä†ëUâöp-æœËú¦pNÂ\L¦»ÅÅñ‘§Üf,=x”Û.×ÕÔz„§ÉNVåüzµ9ʪ7ÿCüÐüÔþÑ~žëîÂêÎ <X@ù†q´Ÿ'ïéTTð‹íNÕ‘Tƒ¸èH“<MÃKÏXUøÞþý樉.iíz¾3ª/R#eõ|Oe5|Š«¬¿iÿÖd ᤕx,râS©ÔœÃŠ?SØ4]PÎTyP–U˜ŽF‰ %|!aV‰²Þ¬ÍU쎵jŸó–Û>ŠÃ~ç°9dÚ»ì,ÝÕnf•TÅEÊÏLÐ_Q-a(
òŒ ‹œ¼´Øº´œTë"þ[|!ÿø£¿D‹)ù³µ~Pøìì~¶1NAùjìžõ¶çF‰y+ +ÐJ”v—OríwJõ“ puý‰½{dn67¥ä +ΓÕ?¶dM~¶%½Ïb~è%Æ„ãEy–s7‹sç. â?ÃOÍÏXùäa¾ì´aw9PIÚ»‡ô¼\ïýaÿîó¹LÊ‘»ÒÙJ\ËÇ°W©(°n±4YY7¥Š|ª&u¥¹„{{Q©lÈYp3BdÎ!Ò>ïzž5]c9“2§Å±Å¶Ÿý–Ã(9ë¼?•F¨Å±iŸC6èùž[¤àXIì9Ôâ‘9ft‘¶3¯TQ›¿²%eÍÝK+„——§^™/™MSˆùj›ßšOL«“éé-xm?žóÏpöÏøB~WúŸ¢µI”‘½NÇ "fµhnŒÀ +fŽæ¶‰kÆÓšùÃ>˜æ¶E3_PÙ(¬ôêº buƒù¾Ø´1aöª|’x49#¾’““NÆRnαùÒlšž·þ ØÄÆGö¡yæÇ· É&¨ ê蹤²òý0U·þmgÜ•š‚3§¬Æ“¹¥ö9»•Ñô9#ïÉqF<GTv¬É¬ eÕüt°~aË^WÇü„oæL÷k•Çb\Rp› 8"ü@‘ªM@qâ8°‰éÏ~Ë:¨ŒOì£%‡óÐlT¯QÖï¡÷Ó²Q‡ù¾žNN^·á'”—Ï¥$)%Ëq*%lðljÊú™ '9ù‘ë‹å¡$qVYò4’ΌƯÅÐ÷³ÇòKtlsð®”t?''aW+ âÅýˆ"Õ¡_‘¦3ûõ2ôóÕY{pêæÝw—Q>^+Úô±2,kÔå9#JÎkÊ‚à=)-Z°%¬•eU/2›Óì¯2=èóa°gr£^‹?(ŠÔçi¤’Ê¥ývŸ~éÁ\6Ž@ÛöË*±l%¯M(ÖaÈ6œ˜v%ý(…beg »‰¦ænû˜”ï5/lŠ%¬W–I1×RßDx?Ïû4}®´fp2©nú¬÷9ŸÿÇÇwŠÛ!ÿ×ëòôò•Ó2H¯¬ó¨óаL™ÎB:ŒŠÝí¦)ÝJ¦ð9‰B¬‚æy¶-nÓÓ³êNªÝy8ŒM7f7%îÅлjzÀÌ’ù¾i%+ý†¶éó?€ðÔídkßÀòó}qöÙÁz•ãÇ {ËT×»LÎfÊì(4y(p
N‹óÏ¥’Í\Öb=%ïfÔ›9L'×ÙqR+^/£Öl³›pç}£!ápëŸX$Ù/l“9zšBJtQ)5)»ÃR” +œ'S‹½ïÖçÍ’=‰ª[=<…ßÈHÁ=²íUîÄs‰?ÿ Rïö¯Ç{šá‹O@Cv¬—‡!c›wç0J©Ì2›ay*äŸÄ8¢:ƒ!Õï÷™!vdè’ÒNé=¦¼·ÎQ
\z«ÙhÞkå‰T)\&»©ŽF + +W¹f7c³uùiÇÊQë®9m¤(ë Œ.©Åñ¡“¼ð{âyYí脷ߌˆ¾¶¾E/E]œ¶’6æâ¿ãùy
Óå¿D‹©cø9w øy +ù³Z‚¢Ï©þðCÖ‹ˆæáåDÒ+œ>畤+§sõ^=Î{©†¾ +:=8í»;ÚmPŸõdéÅn +UgªqRNU½ìAVÂÞ\’Õrm¹ó÷ì»ø[ó©/A±é|Nñà1PZßÉÏ· ÏÖ”Ûê!ŽZÛ=%ˆ?y<_níç®=ÛÍYã‚ŠÂÓÛóQiOeê–5‘†v1æõ«‘ê2[*«dmå°åj3|.V‰ÀK}\ã¿ß +¼˜ëŽ¾˜‰>þÅ2gö¢ävŸy†2 Eù™ð¬=U-Jä^FP؈¶»$ËëÎÝc°·qŸ8ÉCÂÑÒÛÑFÍhåÀÊ©ÍI*/u®(ˆ4œ[ŠG,l-jb°DÅâtq¥ øT–û`ò]@ÃJ`e÷ó¬5çëüg¿e”+8î?prªÜé ¹÷§ËíÅY]ò÷KvÕ‹ÍEÝ}êDev9ºöÒfåâ[ÅY"¹z›"
œBaiE›â‚ó9?ëÍ|÷ÄA\ Lcqú_ÈÏëÄߢí +9]3©ÎåT¥ŽNž‹Þö¼¶üu€*¡üR§w‰ÕÄhYÊ`^÷zIAyø>¯±/dš®®#ú}N?££)]k§»a‹ý.`(É:À”Ì +vöj +}]ØÃã47–Ncû_‡¡?vÙn¥
öÓ(Ñ7†Q¾ÏÖ ¼ŸKø㾑¸N`€Ž£_ +4ÚzM¿€]µ(uŸÝéåéÆñÃa¬^m*‰^-—ÝeŽ$šhïÏ;£EEm¢dã¹XõjÒì…gåéÉEµI5Gí†*©èÌž¨Xƒ¬â9ô¥wŠ)á¹Nö<òŠõêW´ý…¡¼áÈ°ìɽš;[| ˜<w`£ +¨ìCôZo¶Nìnç²Ñ<I-Îì9ý^ÓIï~!²¹˜õ—@fT@N§ßŸEû ±ïJJa2ݾ?‘h“.W+6Uà +QOìää}‰æÈÖ½[…Ø÷ˆ‡RŸf±ù¾ß•‚âøM€r¿'>=-–?C™3éÜ1¡-ÎûRÊIh·‰Éã̾¹'ÇÞŒ~ÜØiqOÆø¥Ä³ô§ÄSêsó¬Z …µ¨vÌ^@ÕodÔÉú¤ìU +=öðèöF¤ú¥{“¡üa0êÝqeÒkÍ3Rµ8‘x¥h…èu:"á‘z·ÖÍnú€_;Æ€ :Ì“‰ÿ_È/±âeëê.ƦN\w•g[§æƒéJHê»ÅsÛ‚Ùkè¨ #}ɳÒ*
°Û±J/PªI5×ïV¯-Ýrmë4ñÎ)p|!(Šu +ÍuzÖ9Žñegˆ’J'w ·m«Ííñsd}g´‡íô÷ŒÔv%¡c¨z5¨}!«ògZu) +£„àÅömD<G.c²—°/Tº*X½=…0Ó¤FkybÇ +E"eª]£S ÛQ…&Ûçe‡nsh‡mcWrÒº
H¾U6ÉåÒ*kôê»Ð_›ý|kúK•’šäöü‚ðsmh(Ž¸ÚÍwD(2y««ÐîâºíEëï0]¶:]»ú8ð:&¯¼«EŸ•PÐÆB5ñYEZBkŸÇݵŠâbç=ï}½ìNí¦D_ˆÇòózËÇë¡Úi^5nó÷rùòû<6‘*xm˜Úuì*·a +Q¹²lsõĪu“bµUŽ½
îªÞ¯½NðÎ߶³)Q—sOÙ·F¤{^Ca¼°þ<Ù1Düú.@þ¶òA>nÕ@!mϚЀ.iì³>¶ÙÑðÚ]uuPMûY,Œñ"÷JE¢~@ïòxX 2‡]-ß
^…lö)6èŸã a¼O¤D_kn|:š~š“·`ÞQPàæÚj1×oàE¿¡ù…ü×¢ß0üûoùoD¿¡ g°ÿèßšÑ&€†½:(àñ õ›Ð5½3ý©ýÓ¦ú½è +W×yØ x3[9$#Š.'Õp=hâÁk”ê›àI=:bƒDqþ~öœûý|Jöéws痢áÙ˪C϶å§{Q×…óyc}Þñããß +)#…"Û +Ps]E¢ftÅîí%ïc!QÆð`K¦È Ißúþ>vÇ~Ÿ½ ~Ú?/=c¬=ƒÆŽ¢ï”Rÿò@𛵖æÉ +?oË*p+6NX€)"¥ÛP”ãiˆÃ*[:´½úϲȿãF¨¦îñECò$Öº]kûÎìyù܈uÑ[}ê”`aW§`}½çCãÒUÃÏÙ9íq4æDswMÝmYqGñéï +
‡ÍáÝY¨;j +¤™_Í7yŽýÄòKÁO@ÇôvF`™@…ùç5úœg\úœnJ}Îß]€R¡ªÇáV¼Ü7…›è»BìM®D™䶒OùiøðÎoé:U9å÷·º‰
¥ŽáÄ$eÔª#NobÂj¿>ÑëŽØÒ&/±‹µ}L×eïþüÔüô—ö{
3ÐŒè{^‚i½O}Îq˜=|üµ‰ÔhpDºzÆöÅ"ù¸®ï.8÷ã{â4f°ôQxŒ²FO`‡h³©îµrßí]j—êϸY[Š_ˆ†Ù¥¹ên®¼"ñüDÁ˃ñ7 +&ëe¬wÃáp£ÍîøV‰íîaµ/Ï¢i»Öâ¦tnóÚÞó9˜Åü:–‘é»ëW§Ûwƒœ¾k]òá‰aŸ„`¿€æé7@Ÿt·pÈ/§(ä¸ò½_½6ýÒiN:m25>Ã\‘çÏóÈéÊXÞÜð¼¢ÞÝÄZîYÈV<]°ÝžÆ,ì%Î<ÈoÓÚ9¦‰¾'¦2À&#æAr!¹AŒt9/ÿˆ/äçõ_¢X™ƒ¢¾E8w.ªé8&s…µ¬Š7÷¬Î²¥þÉ1^ýUâ„Ý8‰.µzÅ•â|’¥!oÎÌÕf+/»å7ÇçÁ¦íÒy2F}w\4Çh†¦r£ÊuÞÙcwÌmœîøìùo +i6Å{äqnc?|AíÜ•ÅŠ™ÍÄ¥PçW³¨)Éüvï¹£Ô߯cÿ8ªjâuØX‰w¶µÖÓÌcÔl°+W&†ËÁ¶û…=ùÐù +6úÂH#s'Œ[áúitRr~æ—"H•f””O±vµ=Õy}¹ç>ƒ<F“þ/Ì)gyYõ|Ù>2yúìQ|\A”[™îëi4ºïìbÚ}5F"Ñý¬ëü¿&û9æ†ìàÊðý44,´u·g[oŒ¾5i×ÜÕ¥Þy-q…ÈÌÒÄãìä²2Š‹×KùÖ`´Ò{ôíÍ
©…A +=|R‘PÉn‰D£pêÒ2è™Y¢Ã˜¬“íÚì$/w*µúÏŠâÿ¾þ@)¡°]V‰k&?
Nu«é,·ìn—æW÷q~»šš#{ñh®Â¹!œS-b£Ù/³ÈD®Ðe
ÿBèêúÜíÝi¥O®s£±Å˜y÷í¬ºH£¾é°<nvrå‘Ó>™RÜìtM*ËÇ¿P.Š°¿ ˜ÿLÍÔ‘Rù¶¹»‡¶: 3œä¸´¶X[§«0<ä"n/Ò#-sÊ2fõ•ïY£¾V뵃 ++8ú +í"ÔÔÒ"È׋°ïƒÜ¥î>ÇNáù¸IäQŒœB<ËÊqe¹mDzèD‹Ã‘Žêåãð˜WþœPå.õÆfðt»W?vÎnšX·E¨nËÄYÿ_È/ g:0¢›ÖäÙR0-4az +(”G:lœ÷…<±Œhɺ#qU8`Ñr)ÖîáaÒ¾¯Ê*ŒÉÁ0TB^•ýQ
;ƒÒÅÓcØØl&¹¨Dñ`õ+SÍDa¶óøB~^ƒ|6i‚˜¾A¡8ë”\@QÐVÑPˆ +ÎÇÂÎj²@é¸÷wÁÝq¦©æí¢+G+
úø믊QåÚKÝ/–ÿŽ¿4óÙÔäö0 Õt
`Á'GÆŠªy`l¨Ÿ_”Jpêsl|šŠ˜¸·í\ØuÞ¥ '™
¯*]?mIM)œ{ê˜+·°]®cYH¶¿=^E÷ñ²ø…ìcEø@¾‚@ÑŠœ +;Êu„å-º£:¸<srâüºQYëP£§#âV?ëÉijkŽ÷Íɱ4çÕƒ\1—»í Âo‘÷e¢Mf=ö +n:žyû'Ÿvoâ‘Ø¥ŠNn›ÉùÕÍkô5ŒmŒU·qg)#öe¥NQßÀg¬ììH .Mƒ"6ÿ"Øý¼Tüˆ>gÓŽÖX¹"«ëMo'Îþâ²;,$+ÏN•£³7ú=ö`S1w»‡qÞfÓ-g“÷Ñh}|Nh_—7©‚ºHR-E*Ïr§Ð¦WÚ +ëI;5 ¾WºgP Ki€•}P¤¶PÊ÷?‹¡×üCÄ·u8¾l•LÇ·†rçJ<¹nbbbÙÙÑ=¼–ºìäåý¶Cj[ã±Ùm +1j¬…»|Rë#ÂVðV-’;µzr¥I‹Ê*‘ŽzRºª"³•ºb–Ú?ð…ü¼þþ•ZŸüsÇ€¢hAQb|%ç‘‹eC,‡7jx·ù¨kG½Ùà‚X©¡iÛ'ÎÀ[a¿£´ì•Ã•-i|1§¨>*n”V=¯¯€jZÒ[¸¢‘]<ÄìØÎ/GÙ]t²»¸0x{QôŠo + +ï)Ô<¸ìç̓Pó¨ÏÚÐIÜwbñ¹ð\øBœpG×/ŒthÊGé½4Ø#µÔpS܇c5L£¼ü”³UŠ>‹b>U”×E¸›WË㬱[:BË0^ücØ(CL›3bZÿ‰/ä—‚Ÿ + +©Œè#Î?Ã:g·ÏÚc¼§ýœáÍ÷óí}ŽßÆšTò»h•µ%žo(ä<„)`Ãï,\üMÎÚLÞ“yª´d86zÇÓ+/ýDYbÃGyÇÄïö…érÀt§“:_&U6$ç•o +bÉê•æÕ ÆïõE“+8{|\1JÄ—·}F©ñ ]ËÏióöVéBµy¢8Q¼SEºY¤ÎÒ¼Iß|ýwøB~) +:Fº:ÁdÙ¾…ÙàÉÃq*ä¢Ú¸}/´X&ÍýoÑ”Ôj2¤FÝÆDê$ðP¯³hsõ´ÔðPÅÝ˶)Q{½éûs£“Ý;umlÜë$zOÔvü+W£+h¹–òZͪ¾œÂQìÇÇ¿c‡vžU#GmiºKwæ¯>±†ïƒÍÕ®oø^×#f”ݼiw‘I÷”®”#vLë˜S£Üæj³úgOoÜÂñÚíüµÚÉ8Ÿ•Ðû¨Nü¿ASŽ/WõEò¯õÏŠ¹ªÞ*ùG#(Ÿ×ìë€ß3Q¨K\´¬ÍÞåjƒçÒ©í8ZdU–I¡Rÿ6•×T3Níˆ÷A:v3—ʹÍU=w•¥×”z½{CTum”µ÷ù¬ÑÅhä«ÿ†UL1€9r%ÍòYy0}÷K·m~\ª¤ò|ÑÕÛ«o +²HYÙýãr&$ÕÙäÙøòµø¬(žK(ÈÑ6È¥ÇUgðìntyW±¼;ÈìÈphdèVdp¶2ÅU÷y4æ™ÏyÂÃÚÕ7ñÕ¨Q¡ìª†¿Cr;oðr`öúããñŸ¢—õ訊 ?PtX‡eïr\jÇc5–2Ȳ{dsdü{á2»$•J9hÛ+CÛióyŒWäs8Û³P4^<&te—«Yã..Ç@KôžÞ½ïÜ&oþ0ŠµÏ“)ÙRÓ + …‘ÐÑÓý¬‚# +#FA)½ÿ¯\{³ÎYcöúþ<0=g?]ñ}Ë¢x^iýü,—Ú¸‘ ²P‰ê#"ÿp¼L%L^(rªw_NÆÖMdV_ÃpyXdžÎ^Œj£mŸpû›ÒNmÿƒäü€ç¤´íáÜÑïr(-g€Íb„ráЀ¬MºIažSŸÁfjÆ㸶ˆšÕûöÁ\ísØÖØðîéTòƒÜ³n.{ÃO"÷©rkWÙ«¶õÏ·ênqàÎg·Ò£Þ‘ú«Ç-–½éj"þ; +0XLôº€ÅSaN>²Ó[év„sÂuÄ +܉mfÛþÇÅ}.”m©·¬ÃuË\5Çc
s±Ìd™‹¼kç…DwŸs8Ãçä›á§†ý‚%æвݴ›O[³Uûw +›/ö¿ãùëðÝ÷á~syªZ…± +E
fù´÷æî„ÝÔûœÎ\ÿróµ´‘lér;³j{4îî‡Õü¼$5('^HeëÃîè‰Ðk1¦?¸tFEëû–ýNƒ¡µI[ƒ©_\uõßõn¡ÿ.´Iˆ.9`:Êÿ +6Í1ÔÜvñlçp´ÌUéåõáž·ÇM¥Þ—P:Z'4öYn{AfQäøÔ¢_¤ÍÙ5ëÊ©¥u#È)¬N³¸0˜
·jßm»¦¶NK
Ùuk¾I
ñ‘œÖ}“¹DëÞqâßðä +Eý,O[¦¾‡2ªÉuÛFr`Ý.ýŒ}™Æ#÷ ÔkþöQEÃUÝ¿\ÕÝ¥g㢕ýAìwi…O6Fœ7µ{¡hŒæfe_‹Í¯ÚÚšzª´£‡Šê±SùŒ¸ùLÙ˜’|BQ>®ø«ëÿßè‚zàð™½|ä”@±w×^ãCzôíæ ¸>£ÓJÁìý‹6&»»xXÕŠæÁPNBtÓ–@ªˆy*LpôoäpÚmPƒÔøZÓ°6ÛT +g1y¨%š42P«†Ò¾7ñ¨”TÍ )¹„LÍ]üßÏô +lé +µÔܦµg3^©÷£ +W{zV`G€Ñ®ÙîÊ»kG·pÝfu…ŠíÌc5¨¤û»ƒ_»}®¿ª¤IuTJ)R(-Ýq»g1;Yœò)€
µúý%€‹ÎKÀzõî7ÿëò+ +-êpx˜ô®ÞŠz+1˜‹ zYNgÎé`áKçb–…i¨3e7dçq¢+LZ¾a>Ú‹:'rõ¤Ü]«N½³î”ÎçϨÛ>;«°=,^òdòÄ¿äÜéä½øŠz³ülñlõü>e“ãe²{³óQ¯És?Ȳ Êý™3S[$3(·|=Iu/¶CõÔ=IJùÌ%½iä¦Åt®‰w{½¤Ø!3çzû²?t¸Û*p5Œš³ÛéÆ>î«"WuÇE.¸òáùûþ +Ìi4˜Œ¤-!ÜÍ]#µlÊÈäÞ”Qj£s»á?–Ý¿ñƒüヿðèÖ˜åQÌÌ5Üë+”êê‹[¿gÏRö:¶sÛ62®ÞîUƒ{4;%3×Ôêõ2’LÙ±ù`Ö-lQ7óg¿]¿}÷[²ÀÖ"65WRLö¨çZØU¯4•Ê‚mô;G¥~Ùfºnwõ2—yAÄ4};ílj¯”]uØW¼-±Eåm(Î +3ŒÉµüÍÆÞÇôUU¨õOjÐQìfV’Ò›^_ð‘Ù1ºªÝŽù7&–¯íŠÎƒ‘›ÄÍ|ÑL5(vš«Ë}€§i£ ý 5û#Úµær·«&}öUcêß±§â¶°Ê†R{¦CÎÉZNg<"}Ä.¬çpWåq-PÏ9±sºQ`ßïž‘À‡–¡pÉ’°K14‘\:-"ÐÍü£³nP¯ú¾^ùT¯ô¤ÓŠkNIW¿—«ry³ZY=®Ò)=•JæÞ²Êë±³ù¾«£ÿçƒUgI4æwA¬Ùëé³fÞ[›¦‘)Î6ƒüF8«tp¥%Û"±ßf;Áˆ&Ú³+°Ÿõ÷ +#Ñ?ªØ=øw8|YÉ›·Ü +UÜr[úL}AË5%>/%(‡IŒHxjS+·‡õÀAÌï¹ +ÜÕ®9Ýí¢Êƒe¥S€©ÌZg÷¥Ý˜:–ˆ˜¸PZ½Ï4.–Òè»0°l~"gsùz®Z!~«™K®NnnhÒŸðƒü}P}h +ÎÈS# +€N'@ñ }Q[X”Tà‹{à÷¶pW_A×ÅÀ&5ÅÔ¯6@]ò{R+Ê7l€æ{´5ÐvBÛ' +ËÖ‚¢êæ•ŸÏd{~~©‡à þ.—^*Í4Ÿ'ÇÓâëâbE÷ÕÍ
Ù~{HëÁäByñFãÍgV=Ì[ùWüWô™ÌžZÍ Ü¥Ïƒ\1eR÷¿ËõO@°]º2€×•.À.¦žìq}úƒ¼gfõʃÆñyV·'µj¼â€bÓqEfñ(ÌÙÕˆîž:aB¼õû§QœÒy`Ÿ+WÇ8ÌÅ›¶FÚch¹÷+¾mì¹Á:' +g(ú¾Ëwµ3Èi½ü÷|è ç°Õ’{êH“ý<oŸ=Í(÷à8¶|_—Ï›4Ô„@MçÔäZ”Ž£óí¢X'‹ÆgÇ)Lf‹ÔÉ?¤÷›ß™ãŸý&eWwòõÔÝŸ’¸ªG‡ör!s-·[uÉ>Àêá·¿àUc ë¼{¹ƒU +äñ÷åDãÅóA6÷Qª>9Ýeûv¨Ÿ›Üç}èž_Ù½Ò¬ÛáeXÜTóXíY99³é±F‘[òü[t…Òµ¿Ò+s®$î|vâ^ÇYqed¦åà^±#o\²^W¶`±l%?yòWüG“@ïßw +çÔGÈ P0……¢ª?§Mtntq{+$ûã¥>ÞÞkV|ìUÅ|oË“efÝ î-RÝü2‹GåÅn8nÌÕ&jƒ]Fœ“PsÆz0¶íIfõƒØÍú8²f[º8qÃL~¼Šw¹1*Ή/ð_0…¢Í÷ +6Mìëœ+ƒÍ*¯›3¶£¶tžÞ¿ê^ïÕïSϧԞòý\¶F‚Gë&N¿½4×K¹=æŽÍ->?zIiZ%ÚŽ§kÍó˜0YbØ`’Q¸ÙX8OcÔ™¦4btP:øH#[Ø(*¡áùûþoÀÎNY°!ßŦRë\ƒ¢ª ?@0Ýp9¾
øœ}i"åÅ¡g…ÛÝìOëøàß<~Ä®Ô(¼çý³”žÞ1ü-Ný£‘èå`iG°DÙâL¹¡Ë#šÆÙKmaÿ–6JE /ˆÑì|‘ý +éuù»IPŠÜnлçõjïï,ù°+ñ£¡q0[O“Æv¹Q©ã¢Ð^¦áZ í¤±ŠL– +ìýÔ»–é·Ë4óEûfÿ÷8*©P”V¶€ÜŽž P;W^÷¼Ð}¬®KþVÂsü™³j]_«¡ƒ-gUúðò\ÅNö³Û;9-“¼ZŠŽ%<Gg´ó†ù~¥e‡6?Î
˜[î§TKCdZR{ÇñDŵ3Äå£öNï”ºÍ )u§>¿ŽIc8‘«æä‘õ̤òƒ<£!Å…Ò§Ó¼>Ú—ÆqÃ\aVÑ8«ëy{?YnŸÛÅü:Z¯§
õè[^ÿ~ï•`tŽœ‡z©×°yŸ¥û. PM°3”JgZÉgƒŽ<(Cº†þþ‘©ª›’Üô-ŸFÞ[!ƒËçW +@ØŒ8ŒÜ ÈÊ;)ï?ùPî=²?ÈùÝ¿=ä›OoíêÞžŒ[l¤•ésþ1¬Mæa馹²»Ñ®–/51WÙhÜÃ^¤
q†w¡½®»H»ÔèôVšÔÁÅÌâýüA:=½’êf7$èvžå÷¯€‡¢/î +-³r!uæî¯ÃÁw^—]Hùϵ¶°¥:°èYäκNº»î·
Ì_ŒÇòäyÔícúJ-ä½\M=‡=Ý„®>»ë|+Ý‘ö%mUº=ØÉb›23Ä;jS<æI¿üáI–Éðƒüu¹q×ùþüöl°ëè<çUï@¦Qo_è݆+æOnÝÒ‹Ê£\r>"ËLüP”Fc¡7¾§î¸ßÛSµÈ–rå{UÜžv½v1W}Àßrl±Ÿ¶žnå¸QÂUÙçtY‹¤mÖÊ—#¶î®ùW‰…ßÈòf +¹8¼Ø*ad˱wæ¡ã¬?ú÷í?žkþÂDKñto KöÚ¬–SmËÕ侜†*eíÆR\ÈMÅ9uAnl;þæuâ¼ÿh—ýæèô’`ɺÊÌÚ¡õ>Vë}î‡-W¼c?Hë]:7¶Å¬óÜ.ÐÅqDûu}gæoúšO÷‡KMÖEͺ§na·üR3mš‡QQ_¬ŽÍþ~–[S½òiìÑñ±€ ›YG;ö7|Iª¸G¹±Îþ
˜ùÅ™T‰¥[Ó[Y¾ì47Ù죹¾ôñ&L +©¦ˆ÷K¿Ž–ÚrOíGJÞ—òSuF¢ž{ή”ÙSÝŽ°i¯ü°|3icõÑy·@öUO©*aæÊI³Û…ήßõ]yÜ¡°Â¬}÷+ΖöGv¦íC†/{Xb«ñln§ézSêõå&QÉÎ~Ä
ß«c
òÊUê'£Uý«™ý¼ªˆkn;n»'&ßžµÐ°kãPÉ FJ£–1»×÷jZ»¤,R©kéJoIMAžíÎÐÕzíVpÎ);açW°`–ás×Z?Ÿ×æîý|6sZkôF©>|[ízÉCú¦9úÖ—>ôR?}+Æ¥_qÀýF{\…–{ܯëÓ¤Ê5,ù“cMz*«F[øƒý=ª÷œó‘™ Ž÷öŒêžryš¿3†{‰bça]²ª0+ª ·¶\Áiú]lÙ8IÙ}ýªeƒz&:tíÝÆk‘ïÕjßÕÒêë)šÕÙ&ÞVYvž‚8 ¿bã Íú²Ì™ryúZ>JV.£”FUƒn”Û§ÚÁ^±âEÊ𠤑êŒRy¼í”ÏEöã«ÌZ™ïÁ¦|S«æäÆ°‘ê×GÌcD‡.˜Õâõsõ=ôøƒT¹|.ª,‡t%sSòåµ¹o–E“ÊhìL!ÎÞ¯XÊJ½8kh‹¼E8$i<·vn@0lA«œ´¹ô™z3QÆŠîwòÕßòôS:s\½3kùðjWíÝ̇Ýl=˜ñï“üºžA*µÕ«sùÅ}·® +ßG÷ûe4|OJr£èQ‡s¤4ÖŒ¨üç”.ž=²XvIØ_þºü 3«Ó',‚ºbÆ“eѾo¨…
±·nGj÷ܯ(ü„Þi—n
‘xŽš}a5†tQ¯ +ךªHk™ŸH-(rèÀ¿…lä07×Goâs÷0¢Cï‹Dæ™j@`̯ +H“/ƒl2`A6XI »‹t]àÈš
dý +I¯Ài?Èk¯‹£gŸ/¢š¼†ÌWo«üLú +¬óºñßåІà,ÊÃô‰t› +Ø} +Pt3‡¢^sK¿B|å +€ê"ìÓGbåû +&MÇÈ…›â÷-tB2H9ã8âÁì±81Þ½—5vf‡—KÐÿ®öœšb?9¼WDÖ÷>ëܾ§ÃÉIá«ôö8,°›„MÉNiëê³V“G}í=A²r!çzBeù^qž‹rVÄÊÄŸ +&és]ÚÜîç)SRŒ÷¯ø>™¢ hb‡ž +ÇäÚÄ»ÜÝ]ÚL¤ñÐû´—“%‚ù‚TkÞ¬œ³·ŽU!vËÙVŠÔâñz^z›»>‚ŽRš2ΤeP›®ªˆÔJ¯„óH¯|‚d.pFN:ëç¯ +ø}û}ïˆ>ò; +®Z9$ìÄÂH&~i'‚Í8£èÌ8JãÅÒ‹rü7~| +»?q~¼Œïþäý&Óší7MUƒžµgÏƸä;ž1%K×Á¦`&ZAùt +=yÒb6Ýgº2GvùóÔWÚ#Úr“–1e›‘°bØD½´:©qÒ\wƒ\SDyæi¢·²ÝD÷·KcGg“†tÆÓ¿âô/œï§ï̓°å¾´¬ÍÇh‡vøW®9é×1~sªþÞ—f‰ØïÕ«ÚÙÎS½ö¡…½ýêœPæui·k)±¯L4`ÞXd·¼ÓiÙBJéK¯‘¯†²ä¤ðfë§ÒÅnÌð\ï'q½˜÷ÒÿÀò÷ý±s‹êÛû‘§=±5,ÍMãYt2åii|Áz5cFµ™áš{}²™+¡Ëì¤9w
D‘^]ŒeùÀ¾äÛõ”UåZˆÎ0Ÿe£Ãd6ßw>¶Ð;3iÊ´â5´VÿX?/¼¸^ʧ1:8+uz4Åú‰O$>ª…Kþó+vWN¨2Κߤ=é¤Ý2ìÜ÷M:ø̨AîqÔ´Rhšò”'§½nõºÖ¸tô·Áù‡‰°iÄ,¶6‡nµ¹¿0L“,wÅF‘ï
êe±gÑæÞôjQíx©5œTRaí\•ÙaíWÞcQ¯¼'•CÅÍ +á¯X¹g¹°(±î´]SÞ +˜§ôxÐÀß:×$ê•ž½ÏX~ +ymãd>s
nÎ]šÌZê³ÍƒNò
*º‹t8wåšÓô«sI0*K—×zÞ.£wb^"¢GiÍ϶x^dNÅRšU” +d6¹È\86YëU&Aßó,4F|Núõ?dm¨i›P³ ¦+BÍ÷yЊ +D?È+·("Ï©MÅ¥ MGfµÇ>V™ §½kóÖmQÕ[VäŸ +æø+£0ÁýkïhâCÑù¶‰vñÐ4ŸÈjO¶Ô˜Npy̾üÔL|)ÖJ{¯®ñì×é³H¼×ñåظD·«zX“Y.œn¶•;xû̽Í[Aoô¡/EC,ÿ g=,Q¬sŠÞ1å?»—±.µ +1½¸ÛØ}|f£q>‘¨Ï˜á‹G§á,#ìïoñôºj l©„ºúÕ¤q9úT;?Jþ{UËù<…ì>¬S¦þ=å+¾Ç9¨Àüð›O +³L'8¬Dåt.æ©Ù|Û·1XúÝ ±Ûc`wÞåN“p[˜‹ÉføèfÖ£m™X…ŸZiU¯3-Ï™êÒ2y?§ +òÕÍ–'ÉB/2óœØúL/Õg2½´S@õ’°åŠ¶ˆ³ò=44÷LúšEÄ
¡`z&TƒãmÞ¼˜ÕT÷9rÂ]ò…ïüxgo5n±)ÏÀf¼£÷|ë·%8·ŸKÔ>n'¢°Å†¢Kl¤²sùqÌ´„ÙL/²NKÇÛÇ©¾¦‰Ý ºOëyhÄáùûþ/À~^‡¢ŸXDó:9zú=“{=ï½FæÁWmô¦jòr_‰Õc{\nøØQíì +üAÙT¢œ¾²Ckâ±Lm¾„‰åÆEF«Ì÷ñîà:'Y!šôgª÷8¹ùêSËŸÛÒëùŽÎÓ!Ÿ“ÅyNÒ({àôø +9<o¥+¹¾He!~÷Ì=Wì™w¶ñ^þ =3düÞíÃì¥2ÛóÿØÙ3 +ìCiúmœ“þi¡Ý”ƒ„{ꞧ£uR¹šw‹â5xLw1m§S,6Þ«óâ2ºÔ²U=ü(Ar‹¸þR°E
µ(E9à¡.œ¹-Uj£U¦F'±™sžÂlÊAÄ’0ÎæÂëBúbã çZˆÝŸðýæ= ¨Z´£×ÑœŸÄ^8lî=q:·¥-}"û+þyr\ð»ÙøàÜìwô +znlÃQª!YÝlÒlhwU÷çú±î”?â”´ÜÒî²Là³â[¥Üâ¼]àSGVèh²ø°‹£ùÓM˜¦dùqÇ=àO<1{«»Jñyç/Ú4i›e5ËÕÏ•ÛºQ&e£L+;G{Í^Š5„wúQšëý‘ª'º^8y&}ÀŠÞ²Gº4„Ÿ“3…õŒIW}YètŠ½2>’R£ f†Ys‰¨WY#º»ƒ‘’4;¬qu
»>hM;”Û¶C\9ûr‰Yv¼J3¼3#Z‚iPMie·t%ÖÏ9_¯Sý÷‚6‚Ɖ®Ì÷ïZ¨ô*µoéµñy´¨ÑâÚ¯ÆØò»wô{ù6QÙÉ/‰†…LŸØ5eá\ã=ûÛd°IÓ‰Zž€”4¿:•^¶>d„ß:Ã[uØž¼®µ<.¯<Ý·6´ymî[úóiÛjªQ8Ù¹z)—i³ê25«±íUŸÛ·Yer5¯Þ²°Él¥-›0æŽ*©ýy ¯ÿ„åÖ[ ³‰xùX=®˜Àùe<¶Ÿ±?”{vøèe†õDP."ÝÑãÛŽ”¬È1×[ŸYu<³%áæ´IÆŠ×(‚î¾^!»Wz<èE5{Ô~W“”ŠU>ˆZ¬ð’Ý,¯Âk¯Œ6ÑR’þ]ÿ¹ªÒ5»G0B¢9aÎ U‚¨` +ê·ò¬~|}·®¦Ší•û>kµ^XOãEê|þî F^Zô/ùFÞûä„øÇþßù?”á)ÃÁàÎZ£S0§ +FØc`–Ô—Úc«ƒ—òÇVÞßusñª©ƒÏ“ê‘—¤ŠžwŸòi=GJËf
†ÔM“ +½¥óÒäœË©s½˜MÎÛJ¶WRj™!Å6Ó–Ì÷ÓD¬LÉÌgË®Ây2QÀÓürœúàÜ!!ÅÜ_ +þ€ù).+Ùq“)íÜcÛp@<oÜñÈ[ùÙˆI¿Ê¯ëâU0´K¬|¨NŸÁ”]?)çlÞ#.¾†@ÏEaJ%Ð`èß± +/½|çå‡îô)µ¥ÕCE&›ûÖo[°^t³à…È-ãûÇañ§Q1}s:•â-'ÖêWæ5^ne™=‹Ø»ñ,ðœ÷(x8mFöÈež§c£ÿ<æì0ø‹o{©ÍÛ€(G@bË ½’ü}^ìñûÂ;Hk:áÜóùxïj6 º¡‰t0YnxV™onK´³¿²Aιðf|;×»û»§HûįêÂ?³W}q©:È•ØãŠ(ž2¨s8æÀùv(!ûÐâÇl°ýo*Æçò +ëriÌa„‹
HßUÛ2ÌÓJ㬗çóÉ»ÎQùàØô7/jö¯åç™>7ä:SìDt>¯ËÎAíeOÕ=JÜí”™q¯cžY~ìQÈX~Æ®Y¼GM÷âm·1[’eÛèrÓ?SãúƒëgyÖÆ/Êý€&4¢`y~&¡ûí÷é¦N²,Ë÷W#ó|Þ
‘þó€]},W8·ˆqÍío¬¶ƒ£³ñÉž“‹ü¸Œ=þÀ¹Åò#ÁØßÃéqßÈO/¦:™>ŒDcSFÑsºÑz65kÎðq¾š»L¼»{xÛBÖv7åâüô°Æ½ö·½4zž•8i…»ïcCÝh}.^½+
fÉë~
ªÃ··c˜3>ìr'Ç*PÇ¢©µ°:ïå
>77óÛÊÐZº¬›YVÓ±Ñâ ‘Ýñy7“èǾu#Ù*~iÃüL
°§ªR|í¤H÷œ-Gƒ÷QÞ áá/ +ù2q¨šB~¯¸iÊxzÇ@z¤³™ÙÎŽ^ÜÖs,q[xív›r Tê̹dDr4{rû<iKZ]K}’5¥”-ÅQ†RÄž]ó/`_”ê +§d¹'Ò*±þSgú˜Õ]Ciº ¹7ÏÎgêly6lúJ$OšÜ +Í…âœæîˆÉ©ôµZû0ÿçÿ€¼Ôv±|¶ßÒøZGŸ5ݳ5'»7Žéì5á45ÈÇp½[¡¶¦F%ü$ú*žZîc})6¾ZwN™H¶“ …|¹/¨•Åá½lÏçj{4cæå%]!Hi*ÌzÖäaJÁDf‡ù‰ÌU§“Çå,AbuZCßÊ_ÀÆ®Âò<+ŒÏðxåܳ8"ÏfùÊ©Ý+Vœ·æh¿kÌc7`®(Z÷¶—&NÕ +=5à©LêÅ©mùÃ|Æl96NÙE¦2+ÍÎV¡Nß4²?‹ÙDÉ<„ñ‹´Ñ›nñr¤g"b¤gýáè=_ð]w´½ô ÍŸúñůÓ×°¾/ºV«Z:]~é ëë⨊¾ Èî6sµs®ˆ2>Ô
Ø^¼jóBsxá6ùàÁ¦úÓd9á?ÈÜ=H䌫7òt5À¨ÉkäuÆÛ6鑹îÃÃv8–Ê—Á12Ñ!Ñ<
†D©ÊAÒp<fÿ?üàÿƒtü܇¾L·ójÖÉ|üü‘z/s{Ä2F¦x-ìøæ±iqó‰¼?>91÷înøp}²¸m¦à2&ЂeºTyÍ™¡ó¦qˆMår6û]O6¯åqª«5GXAN¡À²ùö¿\a^¿PÑ~Vh¿Í°ýBª+õ—=úO`÷Nübú\paï˜>•WËŒÕáÈônÐMݱ¾i£é²‚zqOt—ÛźzÉH\2ZëÌþÎy~™?ï;ÛxÚ¼ôRc=ÈÑèh†SiSä*L¿_̯½JYSº‚ +0}Ñ-|¶õ@Näœ~Âö²rU·_JؽßH/¸\›ûXjH¿“™|Ri<î¼µ¡£n¶¿8÷+I5ìÕ™¤ÛŒI¼ýù6¢‚fkô.O›4ÚÎd·o,ÒÕWáͼ1¿ïçÜ2ëgÌùwÌÄAΧ0c7>Û{[K”!ÿ~ +×p®º”,]ivŸ¯õ6˜5¸U~º;OŒêŒG³mšýÁ—×Yî¯5Ýè5ƬÝm÷×NoÔ}µ‡tiM†ls6m×®³5 +y—¯s«ŒY/wŽÏz¹ëÔëålmVóÍ©P[7ûÒ_üà§r¥Œ™û”€ìxU‹c?Äbš†1fëÒ]R×Yãlß&#suOoGd”3âòà6;}1ÿ¤{ÍàÌwÞŠ®vÝvßÆeÞm¥·‹ 9ÿˆ Áb*¬ýúmåSµPL5±1XQÏÃѤºó ”Y§F)ÔaB5Í+W›ø{m§!Z =Äj@"S«mï#bàˆ<>âioXºO£A5ñÞK‹Ý§4;Ã?lÉxÖÊfëæ’á·
Ž_ìëþ÷êÔPÔS+E©ŽŸ«‚F¾YímÆÓjªs–+C·æ@âTc0³¨`켂•zü_è9瑨 ›~ˆ^gà¯âµû¿éhÜ?ŽÓS}ßíªÕëT:ïn°Hwp’.·ìç¸Ùdv~£Â”à¶^ãóËšü©T<lmªïiÕ¨öÃSÙ×A·ôO™&ýlÉYd¥ÜkAÏÖS)²Ó©[,¥£Oáv·[…›™ÿÅFyaþ"Í`~»Š{»óÒç_Œ#§¢˜½Wö²íŒXöÚδ3©æ%G
þ–êâçCÕZ×WæË~¿:D/“Ê„<ÍË'á²*gž¾\Ê'î¶Èõ|«à› Ì_ò÷úÈK³!–{y»rNe>ý\»4f³‰Ö²;¡vÉöj7ì/d²!¼ì»&³LÁ[ÍÃÈéèûžâY›ÖI
„f‰É_¾ÏƒíVŸµ6†ÆTL>Uô|Å+„ogJ®,䊗í´XðN¥@az^švÚ9uQég“Km’í•;ËÌ°ÖÓ–²ÒÓDb{äIËÆ䬿úîZ½Ö×*pxà˜¿X×Zþ…¡E`ÓQ©bý/Æœµ²äa]¯±‰ÚM²fõ¢SùÄ›viÙ`Ü"×] +ëAÓÏ7H$̵³!¬—l¯x|e~Ÿdл•J‘„’³Žš!\}W$–ƒKç&~/§ósl½K•?Ðû÷QiÕh£Âã©^h†ýîêü·Øˆnß=€îj4D +þ¡µnö°Ç\™ôP9“‚é=æ¤í5¼àänpÙrÛGæO +ÎÐ<bäÁOB£Q\ú؆zTqZ0³ð4¾ì8%‡ºß‹M# +žzÖš>·Â¸Ž¨b¦(c—SSðÆí4®åû›JÝ6ËI•6™qœ]j'æ}.˜ÖGT4Ž?82zGHn„„Hýâ—ôh@—Gü D§A:ŒˆAÚ]Öt&ý?†¿ +u+¶c%ÝýÁÛ¿¿l½×ÞÒk§wKÏ+-µz-íuþÅuíûÈÿŠR]7"ƒµÇVL=oÊ`Ùò„‹²>®Ô8ë°fR/¢°O.ìžù™€Ó
6LRb6²’Ëj8“%yP¨ö´~¹P>ô¨JáÒyÁ£œâTësÆ!Qk5ÙjÞœä°]“x&I“°¤rãÔ¾t§ò}Ð8‘Xûÿÿá!™8V÷\l£èµ[Å@y賸¬ìU4Jí™t»£/ŠpЛ…=&¢œ'&z¡[œ|kè”^£ãó~…žzµåPùÁ»ÍiÃèt”ÓîO +Ak4/¿›S¶“mØ'¦ÑÈe=ºî='Û:£V_ufâë…w&ÈbfP».Ðþ/`oé&ûÝ£iŒÚÕø¦_¿ëcäÇååu`ñ<£Ï«øy7íøýd:·1¡ÞÀÐíß3Ž¸TúUÏêôêGuÜI–Ëeû³šmtÑØ´Æ—žÕ¤a&×X<'QýÒÚõÒîQ« +ö–µêÞR¨û„
kÕ
]¢DgѤê¶ÿÿZŽnë›Çæ)ßn2±É{kj=<²#Q3ç7ó¹v£ñv¸<j?`¬}ŸJ2l•ro˜êvð^¦ÓÏ«íQaØiV“qÓ‡LÃS{b£ +ƒiy:Ër%Û+Ë¥\qh™z)»Ÿwaå
ó… +séýàù°5æóBò>åkö
Ë×ÄJ9_[T*¿P>ö"\ž'‡ÓŽ©Ã‚šÆÿ",ø’Ðí8Ûtžø¬.S±¦Lµ7nU]é½`½ìwíw…ÈΉr¦9Í•òÝ~©ÈºózÁ/Ì;…êFçÅ·¶È©ùƒM¸‡–í¾)/óqR¹ï®Õîws*“žtzzÒëÄùç?~ðq9¿»ˆ±Ãâlwþ/Æ"ì+:oýÊ5óÌ{F½®QuЬH•IÑ>–3wÁ.å£Õ¥XzσÂz0æ¥I?ΩóÚ;›œëX¶Wª§3C*ç0iK®VÒDÜj’³.=$\Caˆåð½Å/ÇŽ¹&87«eñrV¨ãå6…”¿Xm˜òq™}cº“ÄíaïJç¾qiÆ3xµ;ùayª$ãRþ¥¬ +¾¶ó÷ý@ɽNU8×ñ2ZæsMŒ^öiâeÈY{g®¦zIJoùøezâeÂ}cëÙƒ@%&* êk¤vry”ê5Õõžêµ2{ƒÄïT¯¦~ô’ÈⓈ‘ÏÄT +^Ô@ +dᗂɤ‰‡¸ +äc€TX=”3¾@¶Ïïµ8¤\º”˜Ëp¶ø2²
œr…¢òb&¡üEyIGyÀ^þ@Ä„„qU3 +‹ ×ô€vëßw +£76°æ± +[wf]»ÆŸ +éìw9”$Öèr¸›Å}Æ>"ÆdBl³77¥ü²¦QÍkõÑ1ˆÂÅKljžÚ;Äá¬ns‡b°Z|NiíñØß×v"m*©-gÄ#G56 ~Òß½U¬#Ì»¤áëbw7}TF»´Ym>üÁÿ~ó
*Ùÿ[]N` ÷ËìùH®ãp´ˆ7†ŒÏÍônᦴ²`“ôa{\®ú‡CMŸªÿ÷uó›J|‚Ù«±½«ýƒKú`*5´½.õ4ü¥Ò;º}â·Ž–hÛÅ€¾m`Ê’Voá ¡Vëì@ _ã¾"ªž"Zƒþ/ +Wµ¬>ÚXSi3‡‘dH͹HØ7ví¶xg½ªºâ7ƒÅ»
KLáܳ¯¥>ÖО§å¸l7æÓ„¤çéº9ýÅkæ,ò9]9"ûÊ/`w4%£J–†weõájïfgåÌ‘Ëœ÷=}5ð^øÚ3¾ôv^ÙÌ®5É쎺"9‰'ë¥ÂÏùr¶ºâĪõÝ–Ù‘³ýÒ@zîbŸ4ÂAõ>óL±“žå3ý*Í.µ1]*–á|lzóÑ;]j]Òt©]ª|)ÿlCy×¢Êûro|îŽÊ×ãu«æ*ç˜{t5g¤Ü·|a–R›2+÷M³*N—Ål•L?äËþxÆÉX°íïOÓSdOYbHY_ iÏ3”?Ë_AB—œ71]c¹Êä>'R:'púLêÞŸHÙWùKé?ÿþvH3Јy‰.ùö<.Á˜ºæ[¸ušw¥jý¦>ßD"¿“€ü¨¸>Ožu¾Â²=N6‰1ÞÖ|irnqè—¥ù,Žv³åýzøÁiîj_`Ã:¼&’uÄÆ/–Æízº;Ú©7Úm–×Ñn[@GIl”¾ÿú£àç‰ÅË5¬áíTÄmX”ךcì÷ß_Öï.XblÄ—ï)Ýóé%½",ÜZžç5‡â”u·Í¼÷Ár_—èÅ4è±óÜ8%Ð×½™WÙœ<œ•;Ž¬y8›¥>7&çÖÓ:Ìà0(ÀùØÓ2Ĥaa8¼sÅ/…_¼‚3N\ýlýésìr«›³©ko[Ϭiks¹²–'É:-CÁ=6>üzr#9µE™œ‡}òrìX½¹Ú£«`š§¯«i“åIóÍ£·Ú<¡æq¶–¦':ÛwRÛF?7FæèØÏM¬O¾¡òvá/~ð;2ÅÁ¹õ6‚“'?.VyÆø|³weœ0P¦Tiâ§ö‚7Â.|°ˆb.šë›êÕsK²s©Î—*מÁv0½#z¢Mv¼«0âhp©m†c»ø}â½Ï]û‹].ê±r•èÞb¶Öå·oº[íÌnµÆ%]~‘Ê@ +…/ù_éç>v‡êÄ?VøÃÅÔÃœ«-{ìqÓ-]:0WØ*…baµãG¶¹MÀ„Œé×ÞËtáC΋yµHö¤1mXoo2N„ùðï¬6YQú’3{Üöív×&þìÜã:Þitùj[5ž“¶jô¶ªHÉÞVYi«2ßVÛ©Ü/®>Õ}ÙóZöfµ +ó³A¼o»Ž«¥_žis_I+¥ÿ–X}ý4_‹å3šÝ¥ëä,7ÙŽ³•|Üÿ<Z#|³éÓ"C÷ÏåÓ»Õ*R7,åôÎ3›vÚ1ž[ïLmõ—|¹…`ñ°iÞÌMÓÜqϦ¹ŽÈ¦9'óáõ‘•w5Jÿ²»fE[…MÇ’Ò,¶åÅUMdÆêr±¬¶Ôy)è»ÃÓ6ÙJÆ›ÅG“Ì#?ÌLjw6Ý~ÉbÆÝ{¿6ï¼Æ•u;é¥7O3
k¿5Ø6ƒæØ Sc¤ô67hdºžÜÈPÖ£îœ1¼îì©|ÝQ +¹_ض@ùû¤ \õ™Šœ72]:ʸ03Ö¼´QÙr^ϯiûäHXó°·vcsvqGÓâå>œWýÏ Ùé^ +ÅîCeàD›ÂŒTiNÚ©]marQjNâŽÙ˜Ýû—º×“zaóÌ׸O§[[¥0±Æ=’°Vf{pKÄ,GùÉð7‡¿ÞKï\·Ì;Jßr-Ý¥4n·(ÊË,3XÑÍ67M?6=Ì]ƒõ øÉ}~8¼ôêéÞ³ÛÊN·ÜÏÀ{L¦•Ö^é7›Ç]³ß̤ú³F.nòu¶;×jüPp©ðཨz&—®>ÝM»ª0
¾úÜwýj3‘jÓ¿ä*ñl—ýžmüÝuæxpvÑ12'q¡ôÌ•:e6K»·égÞgÇø-šöùwÒI|Þþ<s붱—÷m¬\[$õx5g +‚4Ü$izÅr½<Ê5këce@=ªS†jH‚\U#ïøƒW@+=cŠWRà ^6‹[6 ñR®ÃwË~È2–úd~¡gÕÜU«u[Êä–{¾Q°5†<…ò¬fdøñ˜m,úþj>îôÖÇÁÞœW»Ãze•ŸÖÂÊb]Þ7£Vs+gJiLŸT;bÕíôœv3UÑ¥b§‚DiyЄ2‘Œ½,\ŠN$§Š‹-V.æi‹.ægG»p~¦£;®¢?xmuÓ¿Ø<qÖ• Ò=òwÌa’Vgb¦%Œ-„cûþU£;©™Þkxw¢M=5öyõê²b¨]¡‚‚Å®lÙŽ]&k±_:½Šp[ÊNºhÑ#Ù\± l«…kíÖ)”-œÎp‚Ã>'×É0×D7Dv3MÕ³ŠÅf;Õ—Fg€\B!ïÕ×i½îeM»4·?ø,äÒتíVý + âé‹5êE€HbN
o4@Š¹5HÅßuð£æ‚Ô.õ©uý®ƒ@ +æ" 5Ǻö$1s“e2<s°½$«Êñ¡tÒâ‰ÿ:Fv¸FYe™z^{Rþ0VýAÝüÁ]Îì÷†»†Ñr67…Þo +ûáÛn
ücק¯ç +ÇžC2+zͦ·u;UÎ.œ~A;Û£´žƒU|"U6u´ÛÛô1+(…Ãò©×¬kIïXœÿ¤÷A-·ÞS +c™
;ís%£k¥NEOÓ%ͬ¾‹Úð~ñÝÑ=êÀÂ|¬>ÿ·†W^•ÁÍWÕ}R¡Qú”ýÏÕ`:ôh¹[o>t`·²8¹X8:ýóöp.mMë–å«2âo{aË>ÍLJ›Í‡›”ÿÁuJU]/==õú̵Qg îzlíkÛæ*lqȦX/åþV÷ô
ðÞ>#ìç +EY©ƒx'«µø %l|?ëç]x1üÁ"Pøµ³juM{ìpa‘_$öÏkµÔê2Ÿ’+.×Áÿà39EYDï©Zëv½&®×ÙmŽÎ¾X³NNýy²BE÷psÛÇú¾QÀwbæ·EjD©Á1×Uäúy$oÊû…¤!ìJJµ²ˆQ]M˜0ÝãzFÃéœkÔ|› «Ò{–ç|ÝmsVeØû-í²/'l£{þ«£ððý¬s3Ifå,ÊîÉ;ËÏààìG5óäègýp³Ù½™¤ò®¾?cŸm1™¦U±˜.ËñàØ´€îŠæ¾:†%và?óµ½ô9Þ›žd¾ [úª¬îNÜ:0n¬ô´b&*$Ó²ÔÔv³eOXËÿ]wº¤(°-û +ê"PQqEF™'DÁœEœ@ïÿ£zïsúDÇûýyR»º¢ d®\@mÀ§JÇ%иÂï§ÉÀ4JIR}þ€—‘:?ì—”DP÷½Ü\;¢³zbeϧÏûÍ‹Ó¶™÷Q?Å™³tjÝá`\A˜±ƒ÷”~lÎ9íüáåIüÄõñ=nÚc´Þ FD¹¶W= ü€JÀ¥´µåTaåü¤ðe¡ï$²€”Y ÿO²rûþ¹ärºuñÝŽcûþö„¬Ü5ò(ÎòëÚ^¸”ç1§ßzrX{ÌÒÅæk'dyÊ-£»°Þ.IØä¶ìÇyI½¥³:"‚³©£°~Ê›WKÑ-Τú _^%Žu!ŽBäš³üä¬ò#ù·Éþ!+ó o°òùð6‘¸ûWA^åúL™n“/¹‹ž
D6nb‹Q„÷4ô ’Ѹ¬!íÊHí‰ùé cl|Æ~À)´J³3IáHy"‹Ö–vš¼Šp[§E*è•Äß”.ÆßÔÚŒ¿YÏ3›qiŽ’ Ý»ù/iÈ·ŠW™¼žöKc¶þÃÆî±\dráÐ|êÕ¦÷É"–6¶ýr6›°™žÍʼû0š£ÝW3öjy2 :QzŒ»ª/ÍÊeI9„ûœ´oÖUñTM±M×}æ»Þôˆüãž»ÂaØ
aÓÊÆ`Óªqà0zåÀgoÉy:ñ¾´÷¸ãfìjs=¼ Có¥0P§ŽÆM•9Š +æl¨²¾)˜ýÃo=Ùx'Z¼u²Éà5(Ž¼þ«¦2á¢TX¶/×à:&5ZìTn’Ð+
ÞÂn.7ïÝ"ÖE? ó5ÚEÆï90C?†*C?{ã#§GNúf¾V9ýÿ4IÜ̼Ì*µ §¬xìú“νº@Mç*͆»fn Ð5ŽÜ#Ôn¬}ž >ýyñ÷«‚í ,G[—N5ä=ø}‚nçHñ³úJäeGc=Àž³ +MŽüìYÂ,ÍéÃQ"C‹()›Rã½$õ®x$nŠý"Ìf¹NôÏ+†è_‚€è‡+1MÕ×/Ï?ü€?ŸõæúAov³zÅ«`¹5ॣß&s›<}Ú¬ˆ¼6÷ì˜Zøªºi„¶"ÅáJ:có£Ø›1 ÿ‚›çžÅ|øÙÕžÓÛ´DqÈ8TQ„¤&$"’Æ +‰NôÞæGÁb@(ò¤ÂËaOomÊf‡<ÿÀ•œâ³‰¢/WÕáH”Æb0oi‚¸û‡¿ðËLdŽsz‹2Ùò–Ìbùl%1Øw°k§ÁúÍ?ëõø‡]ùDk”o–Ût¼^$;×@lM›ÏÏxBè_^c&š£-`¤§pßæaÆ»÷U~VnOÑžV¦^<Û³7¥ã|)8!ÂÖ±6þNHûœ+ì`O˜5+ÊÙÉ»R?5Àþq²ÅúG-š÷dïÐ?ÂƳ?Ú3÷_øÿ4[
†Ý?nÝ +vÆ3Ž)‹SS³¦ªn7.'&”‡sÅçaÂèÁÐûSuL7qv1ìå
ÕãFgr@±wg‰§DÄü=Ù@×8_W¢•*Fj
R@T^1úÙö{×ããÒ3&\±×뼑^¯úšÁ‰ÏïáDuï°UšüËê-€á +Ííb°ÜûÖ&ÈæúM«çÓƒ•Pn?q–§t£›¬CÞïJ¢ùyB,¶¶†à›‹-Æ:…3ºùVh•©u*#£]»Ù¿4°AïÖ!™^_VFðì¸rºïNáÐ]Ä£¬K˜Õ|%žç’€Þù4ݨã-ÂkÇÓöÉ/÷¿øÜã±szzq5<Ü5.–6¹¥&Ÿv®Èg³ÍÈ“J>¤b+7ðÖ`_áÑùrê§yžŒŒŸˆƒ´×fØ7*ι—ÈÛG9¿ð¼T`,†:]wHâïJ—:Lùhµ×r+l—Ú³NêÍV¨ÕFP8mZâ-=· åÿrûKžwFôÖöæszÔÏ‹‰[O•ý ¹É3»AQH[D°uÕh!)kÂhÚêzƒY¿;,½˜.°í:n؃íM€$íjKü´¢Ëï3îZu2›G +G¬(Æ…<ÆkÏ~?žÖòÜ«Ýô6`ƒ+Õ^^©¿Ûš=ä<O††˜¦Tƒp¡çáÍ*›ûݯ«æ®¼+®eùjeåºû‚Àã€ãúI[OÑ-]6…kIL°Ã}¼÷òëv°vÿ 'Làäù½XâyNØmZ“)Ëì³XÅÐ~¿_kwþ¨Þ<vå:r‡µ-«Ü¸:¨„etX‚+«ÀPOìpNZÚl_ó’Anüb²£â ùûv†—^ +~¼Ù*¼„U}îP¦ñ”߃ÿ2 æarßߧü6þ!ýfP–~#¦’~§n7ýÓaúm JúyŽÍôs:úéçÜ:äŒî9›OΧœ~.ÝFÛÍ™¡9‡aú¹bº4:“”îIóðÍ¡Æú%’IòT˜¼Æzz¿$•Æ]7³ÿ#ñ¿dÀ¤˜·.Çÿeý~5~kãa=ˆ"’U’M¿7{œ÷Øwy±Ó¯Z]ýÖÁÏ9Ñ+ýŽÀbê·ºPZë÷êwßÜž@ÞeU ^âYf^¶Ÿ{â>}6üÚòÑÞ¨×$Q&éí9÷*·95ãÔ›6bw(×Àߦñðlß²BŽsÚ׬€ˆÏ¬@ŸJY;Y¡Äap^ +°xë v”ñ‰í›_ ÇWx#n¯Â¾Ÿû§^x6q½òó›—:ÇÄÛvïqa7¸«yïñ ŸXQk”dmqÃÇ÷S×µÄÕË>¬×óÄíQ;Kûcí\SWÐ?äq!y„&™G¸¤Ÿ[øìÒ¬ý˜!Î +ÉŽÌ +ÖG|o«—ÉKž/Íg«oºn[_ߧ’yHî‡å-A[«×m¡‡À€ö`œí“Z<l>Û1p)#Wn×ÒW/³œþ€gYÃãù&‡©Yøîgëby÷JÃÒnấAÅÈÃãò@?â%+Î-+:àç·¼ý>!N×ä‡z)7yè$$Ë)Ÿ÷oŽº6â¥à/òÛ¯®àz½»ˆ•ý弆÷s}µOOãò¡p¼PQùØ
ƒ Æðþ!fÄÞî1òî=Û;ÑR*ŸÂÕN·[½SÚVó?¾Ù™qa£ ðþ6…¿dŪgEá÷ɯÏ3+¡ôoy9ïêûî>ÏU¸{ô¬Þ‚qìÊwKÌZÅÒéDm&GØ‘ÍâËîÞ~ «]JÈ»i +ç0ú"Ó{DÏgY¸ŠÍbÈM·µíöq·^ 7ûŠ6YŸÀv¥Ç•[ôß +çÑ^Ý- ³é†ì•ŒhP©é‡JÜÒ›Ã3¢u°€˜†ÇŽ™§Žž—ÀáP´T]õuP¾—ÎKaàiM)Þ)>_‹WE7G?ÈëãòôËñþ³Ïפ´9¼¤ê<ÌØhwC
ÞJÄù™à\ùûQz÷3³“[0#ŽË½¹èëTpÏü«7®í-J“Ø IïÊvƃCá—©zPWT¦¯)%pd~)„RTôIÚÔ+R-OšÄ<Ÿ‹‡^#ÊAöÿËî/y£´ª·«ÄôÖ{O½Ùa}RÖ×È«þr¾à<±u£—-ا©ÏÈ¡îš+—ÜL«çüh7Ö±Öõ¤×¤oÀ5êåÁ<jêP¸t•`yÁäÍ|Ëä=V‰ªT{ä)ù¨ýY çiÿ*hýeQè< ”MSè–®aÎwÿËîŽ.MXíXm9Û\ܧ¤PGYržÀ:ǯŽý€sóÆq3·BOÌu»mO!õèã¥i0>¹ŒÇN2rÄ×[]2Ç‚ÂÞ”’¼Eô¦´ëp=©.‹”Øâ8QÐB}Ê߀¥Ï÷Ùlj›…ý‡J·‡Êgãäf»Éš›ÝÂÝ/Ñ?$.ðܦõÀ„›9[›ÁZóýF&{Ðeð¦ÌRû;´Š‡§<•ÈÔÒ'„ïN’¹´ÏëÍýˆÜ¾òF-w¥Üe2Ô ‹R£×Äv¡Üt®ó&Õà¹Çžpè[tY¶÷ÌÇz§Ì5;ÌÓ&ÌgÞr¤ð,ñ4þ7Ÿ=å{ÿðº²^XÒÖjεåzþRœSZgíçˆXŒ´&§’cñú¹9×´ž"ÍÇó¨ã +}ØÀù½©ôÆÑPךµáä¾l*ãß±F¿Ï½Qø¯·–kù 5M"âøäïµÇ—°I…ÃÉ°ÁR¿Ï0Ý9I¯•µL—OÏÙPª6¶Ô^Qî”Ú,Ö(µ*9žûR{Øþ²B«Úö/—À wàâ²X[µ¯é3£¹£~¤ÎÑÁ…5« +ø°`!K£@Ô–h$Lçõ|LægÆçÎmÊzâºÄŒU£7„ÚFˆ„kùyM5§î”œ¯Ù™`1w®U"îÞD"†äÙï[²Cž×ÿpšÊ÷u¨(v¾~YáèÕ\VÎx>CŒƒÑlYµcôîÁ»#7Gt¹ßWÁ;›çÛÑX«òL„«¨Ç?Öà†s¨Ë]¢«˜Y‘ö“Þ”/]ÕÔê°®0mªÅS(Ù•yî·»2tüQ>ù8:,Ÿ±wÁ±wqÉáè€ãh3Xÿ¿Ø¨ársåÅy +:¡46/ 4î0(Ýí[(]~@tø™®þaWëËÕ«Ï—‚åϸX2fËwK™6¼=vñMWVU³";±É¿pºÏe²ÉpÀx9bKÆÊ¢#Ôö†x¼¡Îñc‹ÉžI¾ˆÁ¤WÀç1^ÃÜã ‡úá€BKµÉhÀ³ë†Å="Iö‘d›B$¤;E¤Æ4@¤âtõÛIcåÃ6´pËÎGKÌt34o²vOCuSŸÁÂ}‡U8/<•YÝ·˜ªøÅiùŽ‰ÃÑ›Ö)íKÏÉéY‚Œð7ä³ü¾cC¯ýAW…Ae°I{íA•â ¤ŽªÒo
Ö g½ +ßÔY$>›ßìĘÄcqìYÖP>–µ>ï tVô@]K=è÷l]&‘¥;$æÅ«‚»•«}åtѧâ +]wÊûAØ/^]~"ʵVèŸzƒFïŠRHÎ8ØLNÓîmoºö{õìÚ©ÝëÚ±¬uóms»Xü€š¿ü¹Øᶵµc»nf™5¿5ÑPÕê®G‰Ûï³\†4(CíqÊÖ +wÝ_Á}`\~@°Õog%]>5ŠæØmW«]ÀzV [<’ãR9©mÌ +<oÝw°(Þ,ѧ_›¥ <£õÆy¢×î®ï×$ŽKi2õ€4éS÷wÒ—²ôö¨Åï¿üÖ`Sc—#mÓï•Ùä!3y´®Í{ùúN¿õf9ý™Nú±ÿÔÁÓ?up#ÇvÓeå¸MòíøfWÇËäÞ׶RH_U¹˜/êòS>"õ¼Çêc®û]ÇØ£eìø{×ÍÛCB×ñ{$œcâ½x]—¤ð¼Òû_ +{ôñ—ÀæQpÆ&ÚLuwÀÿV›;Ø7ýÆjõw[¼}/ý*e:¥çô.÷ÒñK´¡ÙS1Šîãx‡ÖñÙß/oä|×:In_ú•˜¾ò½=KðfoÜú
®½ØÙ©ë·É/«ÏÊ?‡Çé¤Ä—|ï'ûvl¯ÆñáÊqñÁ(c׿dÀ*Ì=úy +k• +ßcV(’¿˜ë¤‘2qÚIá6Q‰Îw.$Éy0º=oƒé
G¨ÅoÕzÎø1…O«?UW¦o]/kÛº_xlÃð·nUËš'uÜ'/zl8ß½ ý&ÊÏKD-Öç æçÐÿLNÿǵßþÖ“û§MV¿QVØÑ—û™–Iñ-ÄóÊãR+AÉý³i݈Ψ¸–®,{©ÜYù\» ãS3é›Gm€.ñ‚ð½±ÝÏhb¿G‹òu·àµ|‹²hö<ùV€S
Yü m«õÌßÔ;µãzd¼Ž«ó}³ÿÚlñȃKìज़¬X%Y‘0¯YQ8>ßN¿î·dò¸‘õ,?’¯àÁÎ +lBG½‹´öy¹¿{_|G<Êl´Ä )*åqÈÞ¡iÎg+¼[u¸h#•óúȘõ¸”çUj¯ºÉVúïÂÜGóùé0Õ|]é}Ö·ð?,ùÝö/yß•Ã<Æò:+nìSV|]n)ß]%÷Ä¡v1}$6gå•'@VgïR[Ì"úÞ+†e§YÛBV¥³QΕÁúÔQ?àºT¸•~ª)AÒijõfþ³Ž/}û(m—iÛ8/IÃyß~©âÑös¹¨¨;â^:ИJ +o
ÚüCV춷Yqm~ï¶m.¸7 n8±õ秉V6ö¸ºQIœ‡[élÅë3"½WFLëØø¯r·µÌ€joI±uÜû¾»ŒÇ}É][ݱ›/@gN¸ó@>Óð\¨H¾tl–€ï|"mûº¯(³äÅ,fÖb¾™
ˆÉÚz~øÕ?dE½Ê#4£û}Ös®‚ôžœÎ ¦î‘+æ [S +«0]Ÿ³ØËW|}î¼óÁâ²ôœÙËcÂ×Ýh\Ù‰¬îÔÖHw1ª`èü<D¨¹Và;Ƹ±ýû†ªÙ0—Ö‹ÝîE|˜™$VMêXe¦6³¦LzÏs*÷gJÆFŠüÈw7¶~×–ð6fç‚yÒaQÝ“õ È|JÙu5fÝ %ÀÊÄlI·ê¾îÁ³ão—Åqx|Î/ØêkßzVÉîŒß{zgÛIÇz}UÄ"˜ iz‹ oŸùxÊÒë™±Y'+£Z…Îz´³ +º¬’¸vxÝ4EÖÝœîrrZÞ?d¥Ò8L^ïšs©? +ƸwⓆ=`¸9U‡ØÆ>„ï\–¬·.-'.”/¤ãHæ0‡D6Bµ/3-?,²ûÌÌ¥r/MW|MAoÓ2ÄB„è;,"õº‹ÚèþÒ&¬æþ€“®KíÆ7*|Íú=&<²q{‘³rGhf;¿,þ’•ÔÝáVP¢ù1ÌI´Âæ´ñÈU²ú ~:#ßl“ŽJ7¤ù5*çÛb[ì×±R?\™ß…¿7‹¦q™–y*1 yêʪ_ÔŽiš\î`k£ÁØÔ»ôè‘Õ6Yª£y+•$›‰²ô=H¡Y•WèqÙRŠíÆâ—ß7³äý—×ÁDÂëv¾˜ïÓ< +kί{ËégÔ²·,AÅŽ£zëÁܸúìì…ÎUËMË,uqgZitÖú>ÌvÚ)8ŸµöûpŸÀ‰—þ€c«éGó® ©©bvTrmcŠ_Ù JQ~ë2wjyRØ$ñ–$ȼ%È·Œœýüû—Ù_î`â_Cb¶c†‰²9³î^§!¹d["ìÖæFmxö +pÒBqºÑšš!^3½éFÞ$FµÕø³»ñ@^F¸Ð½«î²•)þ*)ŪËüA¤Ð&iqïrª¨RÛ|N+p/L8:•!tºÍIŽ4ûÅ&š1ûKâ€øòd€3âWu=bÖ÷â:áUI^hr¯b£pÖ²†ÂnžwÖ¨÷7¿øóufL¦#a>F¡îrD”ÀJe·Â<¶gyÓ^=䊱ýJµ‘_Õ˾+œ¡$fT–xãBθ;ì„œuo½9ëÑÂr#ÎzÖ¬_Ì_¦?àŸæ·¥ØYžû¥Ö®®²šÝÎÜrÕ/ÎQmÀ¿ïØ +¹½T¯)y+¶@ò-h$Sâc_mò½—…q3"äÙ×ò;e‰¹f²ÍíÉdÛÛ€ÉBMɉÍ_òŸ–3ó/1§dÞÞ=+úæ|—äÀA6œ'²7"“õɳ;#¾^Éo,dÔ³zKÓÇ-lü¸ƒìÈÑr~vm5ŒtK®®8Gª‡äJlí ½¡3?½}ïÜcP8TkÖØÅB˜OCe™ádÓAüõ@š5Í„f-³G³³¾”³˜ÒÁ}ó/Wh¹;æ†hëJÉ>k¬«\.ä™®;æj3,
ìRÔàÑ?ÉcDnV”ZT–âïÙ*ã‘´/pSqì6lA·¾Kþö.†Üã–9¬qMX²sʘ¥|¯2…5 +ºlj=´ ¸»/å+kÕØ Ûö€F@l¥ÀönòÛq§l¬jîaæè̪¢“ÇD®«à¾ÿÍÇdD|ƹP/lÑt3¦¼>Th©[‡*Ò$¨ ÞäÈkÞ)D²jê’6çøœêø˜‹–¶èשQ:é¼Ü‘°+´ÈÜÐ}åUÒú…±êH$ŸÅú
Æú
j©ô½ÝäÖðœ.ù×@sºv4žÑÝo´[ê`ô·jrcœk% ›§aÓë<©Î‘(Ó¶Ö în4À_ADý>AŒEÌ_ØgÊ–^Î`#ëAe_9 µM)éª} wVF^ç‘ð´ZÁ½áçSüèÞÙ6Ò½£ŽØ½ƒÛñ?”îç#ÿŸ +½ý¾³ª)>M^C’Á@-§…ºØ“ÓË–Ò'¥¹Ù‹Ó¶LŸXa±-¢+±ÚBóN¶Ö”T_QOë—»ß.–=Cøæ½.? Œki×æY¨óŽ´ã(M¥ý9Nûs&“ögKöÛKØáÛKè2n{ßÝè/KA[ÓÎkM‚Š1ñh~À Oß/
îÓ¾–h¥šæû…°ƒ,F¹s}4Žï¸?Á«ïÞÕÃÀž1Ô[½^ýˆÂÉ©ÀÀƒNUÊ3½¡ÞŇ¼“«ÅEǶ¾íR½_n^¿Ué +`'
°gFxIx3õ +K§êa[HæòÀ‡õ +WùOá›>ju’pk‚œb ÞõBó°}<kvŽ+««÷,uü‹×Ý}ÌcvàÙ4þ|ü/Z)ˆõˆÍ +Ã+9þ4çé¤)×^çл3ßûy³½§d¸z½ýÚêó.ŽÂÒ‹»œjÏNá'4kS=º5JZõï'ªÝ' +cG–Ùëc&ƒSù mi¶&‰Å;!‰¥ ‰MJüEøKò"ët!9%âÜÊp}5»?=-oð Ó`©§Z…ß÷¾)`ͤ¯xZž}}ß8í4È,×îV'
Û=+Êb„ÉJ :+1T¾eå¬ÐÔø)¯‚yAß~]É+"î‚2'6@ÚŽÛÛV—r~ÆhX¾OïüÿÂýåæ)Sóð8¥òcjeÙdé¿Û-G5²Â¾½+õ¼Ô,^õ’NKoB:¢uš6=Nv?z®1EM½†ö*ßÙ×Tè÷ב×pÈåYq/‰—b,îáF&6,¼"ŒÏÌ_»î‡Íç˜KÊŠ³@®ÀYå*’3å~aÿáÏõŽ?—~ÀÍ鼡<¼ ž +çs‰ºÝŠüòýú}ÌÍÆ/“}…/—%êÀ–ñ¸Ò™Â^šŸ224Ü°d(”aX 's*’‘)Ö°²ÛR9ú—á_þ\˜ùs½#x=*Ÿ_„·=˜›uªf´J¦,ç0é›P4"ÂïUYµ®OYøf%IK
q•z‚^|a¼Y¹Óœ]ˆöÍF,ánf:x+$Ç¡àg/*z×Ë? U'Y˜<|#Ž‹l±é™la×9š+DŽ=$ÏÕÿထџ+¾—uIW!Çk× ©ØÞ“›ÀíGdÙ_+je²’P<žç_áò‰ >)Fî‘6-xKrÏÐÔT¡WÁT£Á÷ÔŠä" ”ÁtG›;ٺ݊„>¨·‰îkÊà7'?tLÒßãfoá·)†çˆyÝH¡þ²ó½¯ºžj/n¹’[”ÓVéõ…ïU£M_cŒ†÷ +7£IÙ7#±½¨ùDé½¹çœ9,ÈYª0ê1LYÆé5%ÐÃægåÚ²cJùMòÄq%†[^j1n>½/öÄßM̾$†™
MRˆ¦¨ZÅ°qÍA(ãÚÄ_¢Ê8TVèòÀy¢] æ‰ÖÈ×/&_ò*šQ#ž*>w’ +—|Á˜ÖÜ«ìÙ¬ßY`X +jAƒ3Ô[·‚A൰ ¼sªH%Ѿ<¤¾L7ý¾<húrÓ‡ûr)Áÿðö£ÁÿÃÚqyÉeaÃoÆb®¬Å<Xæî.5ßîžýÔGKz¿Ãúù½&/ËÇž„›Ýaj4@ IJŽÛË-Œ¥Å#†‘ü…F—Ñ#ßûh±p
8îm"Û¨ê#P¡µë7ÊĽ7–ìr¯
¼û°Î
Xç+¬å/¬wÝ.¬WÖ>'ü/“4÷PÐÄ?7}Oe¶Ó™ Ô-“a¾|y +x`8N[QãóÎ!çbi¤l1ª¿¼ ßÇ;E¾]FK®5àe¥„Ç1Hã%×ß_WJ¿Ù;½ÉìáÀ×ka÷zèkÍÌ<W{ÿÞÝ™C®ƒ÷^óÞÿ¦¼h´;ØóŠw°ÓûåÏ'|¹Þ +‚Š
**Øa‡½¨çÿ‘ÜÏÞ÷Ïx¿?‰YkÔ´€ªY3¤¬¦ïÊìR†+êÌ(W Õg‰Š³†Ð£¯I
¶[6·æ¤ŒZÛ·ŽÅ'ŽwFæ|‹ +V»¥„·O¥¤Â•J§´—l_ø—1“Î *Þ›Ýd˜(ízS5Ï$ë`÷[篮r_+oÏÞÛMŇiuÚ¯‰‚²óñ±™ãöé¶ÆŽtþ„u€øüÝ)W:k‹RÉ#žT‰Nª2zë5MtHG=”ÏUÂâ3‹R‚ïMŸûE´5ü¶.ÔòçBA9ÑtAYÕÅÎ ©íÙîÈtÇÔ¼ÖÚ%Ò˜àªZfå+=ZõoÔÛ'¦: +·Õ÷8ž—7ëçëœ^ñå¾úY+³Ö}\PqxQÈø ýÎ%c÷Ft)‡ z£E«íX‚W1h¦ma”»nòÛ—™æö7½9#؇¿ð‚ö]öÚ±Àg”Å?²Ñ²9‡Û¡Žvã’MÖ£5dCáò\ÍùuõÅtúLRýðÔº¼5ê3Œ"–~qò,zHT»p©Ž #èO w1[@Uí´Í‘\’ë%ü+G÷ºðnô– +Ä@B‡ng¬ LôS¤ðû”ßï³£BÐêa[ÞdÄo Ä&#þprñ£ñŸÂ÷æ”sŠT„P͘îøù®ª·Ó?D×-úè¨ •ƒÜê3¨‹\| h΋püÛÊî2ÂX1×8 +ˆçöú?õÛÂ1k^*gMuš_ H§<ñûL/ìŠ@ÖQÈ£päƒvòÎ%¿á7 T*ËŒð”* +eTà?þJŸéûwÒ·±µÓ´ÅiZ³Ú÷IšªµmÆîñ[ƒ3HƘÌxJiªqŒž›Náùàõ5çã×ç/È^GϨ|Ø<õããðD:ßócM¡:¨|ï1W/Ü眺d¼qs¾ýÁ2¿„×Dƒãßêhþµ½RËÓæ¿H?uŸ~ʘ›¾£“•¦o+k>èÿºf12«Œà’WÌe´ËG>•—·ÚKÝž§~8ZuõèþÀóüìßcæ6º[÷÷ôŽû…ðæ¼ó«[%¨î¯IM¹\©Ðx]ȹ°›{ö1·yöÉ I]d–L+ßY"'×à¿H?—ÅZ´ëɽùO´ïN®—¾I2ëÑmm™¦Öð?uðiž,dáaå'âæ¨{L_¸ÛßK·ÊäT¿v¿§Æ•š¿ìË w/ì*×??Ì¢bl–¤6¿úù¨NsÒ{œ þ 9êOM<¬¥±y@g›ÎÞf7½=þ²;Zöþ%ý\,Úb+ý°'#ýp°u/ïeCkúoü•ƒìì?Öûöçn÷LøVååÒåzEËçǡ΢„òÉt†Ê À+Úi~`ÍS¾ÊÚGÃc;‡õ]J‚:Ý—9ܹgŸ‰Ë;¦§]z;,ÝõÍ3d:©RÌÎËú}ú8ÿt/í?Ò/ÕrÒϗɽ’¿ÔœÿÃí`úZ\Zá£_«‰ŽâË°a&ç±e=“ZUýž4F
A,Z +MìÛÚï§ +‰[ÁiCY®¦ž±DÁØŽ¬ö.›Å"¼RZ„N¯yZ$¹:ï' +?{(ÓÆLعF¶
ý¦„¨ý‘~_C+£Õx~i§yªÓ~6ÅWëzGµDí-ă5gÔøʼš[áœó²óò~&«ÈüD˵ýÚ.ÑSîÙ2vsâºuZ$K¹¸è5,b~Ý:ô|`M¤Ùã±7²´<çd÷9 +k¸ @YÊM¢ÏšÔ³:nvõqÉ]¨?ðßÁßU‡µ?²ð‚ÖÏíû1˜¨ç`¬P§¥Çõ.íz®Œn¦)N¯–¢,Ks¤;hwqîãþüæãó9÷®¬fã»Þ!{]f«W°Ö?ÓE³Oó;›,Û1=)œqÜRcŒµã·µIàs‘ôz!!îV×9åxó.ÿñácŸgšç™}•ŽxåLþîl¼
‘íøõbÒË-±†…¤¯0óVWgR¢44»SíUNV²LŠóf4¶òöÖß7ì£ßþô®£“:xºÐ^ŒciÈlžäànU³–Íf–]¼üð/}Ø7³¾ˆ—;ªLO—,éà*þË;‡Ñ½k¶øÓ±Úb‘"ÊëÈcóË•ŸQ¥pM磩—¾|PžêqÀMÐNð{^ðþ¢éWüEgÔ=ýá•YŒ‡ìh¹Œ’ŪŸÒ‹]r;ž½/{yê4yÂà=}¡1Ý5ì©]sõt;qIYt¬;܃0º.òÝÊú üñ;I3âÿx8å†}†¬¶ÜÎìziìñèhƹÅÜféš»N£Îí9)A/Øw½OeÔóa~È)ŸÚ@Ô>f:ù´û +ˆ¶”Äʲ‹Ö‚>õ[õ{´òQØ\Kæ¡ÿå’†/k²nI*¼LÙÒlfU¾“-’1c«áív9$ót÷Ï,µ\~R¬ÛŠ®Ù•ÜiÞ턱âœÓµî0Jlµ‡ÃȵŸ¯uß–äxbƒ8´Àóºoi2to.ç4Ô,曄¹YƲÙ2×ÄhlßØÝöùF{DVí°FÿBýñÿÎódoÅã}IZa˜Zö
áññOÛà8¼+³°?CÕ…SwkéiÇ©Öón—iâN_hÒí« Ï)Ö§[Õ¬Ú•nµÂrÕmÁzð710·¬±61×>5Úçé»Axï’Ñyp¼AF±¥_ÎRï£üWïS—JƇü/’¢ßÚÖ^o)Jr'r.?ÓÒÄ~:bÝÚ>»+?'yÞ[ù×°‹c‡Ø=¥×«Ó_\?íÑê]°'ñ›°fÇ'Ý +·;¾…@K¹iÝÜnv–‰ç6†£GÆiý\VØë}G|ê,â!Ú¨wc4©gëýúëÍ2>ŸúëÙ-g̪¿Tþå¸[©Í
üÝˆá ’3è³FÇUØx
Ò€Ü{zÿtñV/p©i}Ù~hõƒ=¥škÎurHê YÙF¹‰ú-ÚÄ=‰k8wI6¡¦TO²ôþMëi¾=ÑF¯Í¶žÊï[]búå;¤ª®žšª®çjõŸªºe±³ò¿üÀûþ0VqÞ~oDuŠŽ®ßÒ£_×.q7ç·'Tý¶¯…P`kAOpnŠåw³!³\€ÑFµô!Œžö¢ôëê#è\)§j~ýÓ¨§+8Ë.ê +JŒ²y½µRëåà\‹'P3P’PÖƒ ®¬‡õ‘²éŒUÖ~¥RCñ/;þìkËC£%̧7‡œìÄza8†nw¯`ζ*ÖÌVíÇwãÙ€¦-#ò¢fsL{¿¼7Üdù1z·¢^³’ö¤&MÌØúôÊu tuþ¹·Õ<ûÔ²™(TÖŸÚQ)©Ã?î¸l/[Š\6óÙ¼/—›ÈU.+>"ÛÓ”ø¥ü/ÛoÎÖ¢žÅ𳯓ãNŒj…Å»³3H~?û Óè¶ +ï›»1ktrcx +Ÿè·];Õž'ú5 µŠõÀvˆ:8vU#ûRmiuëµÂaÔRZÕГwÞe&—¹ttµ—T=ÏPñÜÇDÑc—Ñãâ³xºH¶‰ð?¤êîPþc!\ýŒ–+•òþœïÃXûÚétصýŽŸ£VC%:f»wïx;Öïè)Ò^Üç Iì^¯Í±æ)D…,^klRÙâ2¯`®Z“Ûµ!0«ó[ƒuFcÑ[¯Ö"ÓÂîÂpo"ï\8þUí8ü‹ìÞ¤¡Œ.ð²]†“öǽu!¦~ºEYjø’¨×Jˆ³sgK–†³ü~ޫчMG{
ÔAý³´fõÜe´Uuu©¢{ZCß¼bY*ïHE®TQVê¶PY¼ìq]d+l[5Õ!ÿÚõ—ü¤ýºrŸ5•çfÍéoq*.î~`N…n€›Õë7ãÄÒ¿,Ýå¦6Ï•NüÄáPj æk K\_É_á»i±Á¦Mb¤U‡$¨W[c_¿†úìR±ÖQ>´F¹²Ÿ}³Kœ¤(Qɵ,è-<†©()¤ñS±¸ïêsêË +ÙˆšœXý†ä˜5o‘ÌZÀLÆ|6̺zø2ëb¹Ä¬>”E¤jé¿ßw+mû·ÛÉf]õV—Â×í/Óޚa#©2M¾R¶jT#S‰÷sWv§~_:—’¹DX¤ÔEäÖÖ[—zyAÜE8k’fÄeY}\c—å«Éº¿3Â4cjFïÊζ÷/uDY"ã®SîŽ9?¥÷w‘:ìŸÿ‡…ä7jSkµ•†ÓŠRîôå»=eÕC=q¡1hC5z¢m¥ÚÙ˜,1 Üž/º+H¦1æƒëtÅ×É‘aèÁi+p°iÙFÜ$˜mÙe˜Öq®ÐûbdЄ•¸TçˆNÉ©Ç$Ó_¥Õ{Ç«Ãc¨V‡§å¢:\7³¶:ìmŒc±:ln +ÌÂ@RÇI<“ûÑüuhºÚùjå`ºq!ÔÞ<ªaEÄ•¼ÔµøÏòlpºzsYÓ½õ™í§4c²‹uËàÖôBðCúÓ÷Q Y(QÝ]%¯¬"ýGO«>Ĩ]‚‡_™Bì¦"Gዘ½¿(¡Îú2¡ÎÛcBms7BÕ¡òËâ¿L㣞Kîí¤E)ËúÄùjµJ߃1ôŸQ6?c¹«¢=ark¶9d¶3i×k4)ZotÈAâH®·«OúWÇ9îZyëJZ 6TQÖ¬zOšX0U…ÈêÍòR˜gó~¹0ý.ñM͹ã¥Ñ¡€íD]ÄìÖÇvT5Kñæ<f¼â¿ŒÏ=Â,ˆØñ|©h/®ÅÔì¼’£6kí–5¼~ŸŠˆrÆDq飻±~`’0ƒóûw^Ýrãš•‹foëí·òÁǖǶ7sæ †W-Çz‰|ô2q´/OÅû¢ GÚ—- +Hèù÷2)ò[,Ë-‹ü¬†‡ŸVéÑ$7<ì6å׆/µ,ã”Â|d)þf#ÝÈËœ_x•1ÓŽ
Õ–N*›¸u±´uf[è &»ÅG¨ö‹¾ÞŠbe¿þiò9¦q/(Œ™+(µS¹ +”;¸½ÊÙèÍBÐ>Ô]7áÆààÀEîáå7/|šoMäe“=´û®îP{‡@ÑÖ‰\ç4rd/×úÁ…îL +`À¸˜ÒËøœ +‚",aèyqj·|Äðîý¼:]p;>Ú€]À¿¨`Á?š +cþT¿\„ý®ÕWãóÔln‡šênƦ:X}ºO+úWšäl—Ë™sX6ÔÑ%ÚfϨå@¸;'HØö¾øâø@¨EǤù¥Ð5çLkëÍîlc¼ŒOnúéó•iíÁPÓ\DR“Ð(’ÿ’~‹ù·žL¾”"Êܵï/²©‚¸ƒóxu‡›pÿ½“[ÜHK¥ºÎõ
qi-²0¥:‚Ñ]œ¦Íá‚öt~YÂ9û›Ùýgu¸¯l¬d>Ÿ0Ó/,bSÕlÒ“ð:U&úàkW/3£=òéãC«8ráQuTY9•?†‰©¤_³¨>›bWºøÇ2q*4áü¾Šnqÿ†'›×eš¬ô ÷þ#+íI»SdO˜ùõa=˜6<súÝŽi]ö§Ðã8žây>AÞïÕ¸©‚ݸ•Ï¾íŠ/¿\íäG®àÃä¾c‡½ˆ6·‚?p}ýÜC ü{oã[ö‚Â÷”MŒýË_õû:”Ü©¨/Êñâ¿›/\V…HÙFñí/zñâ<Ÿ@yl‹Ó|°N +û?.%§šß¦ïÑqø²²¾x½:ÃóPœn&ð0¿í?Wís_B‡//ìa¯Æ+½ÅD’zšyv»Ë]oÛͲ»O§5UJL¡ÑÿâÑ.„ê97îq?ðŽm|е¾;}"'Z'‹>±ˆæ|‰‚óÚNëÏuŒP0:)HqxÑÐÊàÞp>KÛû“2¥yŸezµëx¹¾êõ´‡î÷²Å×¢ÛxO¶mm•üÀʽݽ+ .qî2ÎÉû4œ®º[´/KåÞfÉe!cS´ï— ð/7fd©G+*1›¹?).ËT÷=÷ú¨Gr1Y…ÖxœMká¨;Q÷?ðµG?%›Àû².êA¢[éeÓ]çbÕýzÇZûìX®³ˆzN¯Ge&óv?N·m¶Í^íÑËÍY©¼.[S@Õ,y÷µ¾ÎòÒRßXvïgù/.²Âª»A{H®6ŒZé§üê×Û~ß·3¿_½á OûSc¾ôêXtìBòì6•[®ck·¢ëšç²“Ä7Ú¡óçl´lg¹Í¡À°};ŸÂÇBÇRȪßú^šËVõÍÈ_MC*Íõv ˜M»âš%"·7Kü4â×*ÿ_$Qù[Û¨T]•Jáž}°ä9ÁŠíÈ£õéÀ¿ØÝ>¨rÞ–ƒn©Y^»GžNœ³Ì=Û·:ÚܲV°ÇEl½e)‘ƵMnå[
™
ÄV³à=³™ì¦¶?pþ+wã(ó†û´QÝÌ-ýlõ·úÙ&RÝ+¹ÿüqŒ·‘²É?áJè}H ¥þÃï<ÈÍ`¼‚ÆÞÂ(¹ÝM{Ó픯ás^‹¬Ç†ÖxkýÍÅz¿Ï©•Ër-MØšËé oÁ©j¶´×ØMNR£äã¸(¶
f†úyå-uÝœ´a;ÿÕxÞ«ÖŸi¹Q¾ñU}¼Y=3¾¹ßêhÍÕŸü±?WEqµyŸˆÅ¨~@&Û…xÞ§—U?×ý^‘>;îñË[Ó zö‹%ÆVð&¢Vˆñûì4nÍbOKÍÖÍ„{B/4ˆ®žÍûFçj’ú…³8Ý{NTí.Zßß÷ê/®8«KËÆAý4vµcxÆNSsíh¡æFæ=c
Ôœ3ûüËŽÏå…¥“›”çrgŽŒ ¸üÀƒÉb¶ì™¢=ì“Vct2lé¾r¬Ü:ì7Wí00·ÝÕÊľ÷cƒxž®F6¿ôËì‘ÓYèh##Å5¡ˆRõ‰Uë2®êÌíºjÔÂ~1þkðC{*+*¦Ô¨)¦lÌSA.æçVÓî?lƒÕ’‹ºÎˆ˜©—âw?·K_]YQ¯q§_Çš¶ÌXõV¸6&JP®‰Ëj–'7*u}aP
}£÷·ÎI{àÝ›&¸ýw}rö!õËLQuv+*$$\-|#õR£lÅÍ‘‚êÛµlmà›Œ·ºEé€%éP.M3âDÆÛÂGÆ5*›_~é›sa?qˆ +3³ú +'|ú4øzÆë¾wé}/°¤Ô1ËCDÓ‡¸(ÖƒæŽUó¯MVDw
¥5¹=ÉdÂTB©[‰´‰èý»ÈtÖ_axÙeÙÿbÏ8/ùošûHt«Íš6»xL}V#1KÝ”Y~‘ +Ó˜_lfyÛ™å]¼³0f<ÿ%8w&(\¾ÄplWÓîn>ŠÛÏD™þ•½³æ|üêõ [êÖVp‡Q°yK’‰c[“ÈK»%öÕ…'²ø;FÂJHîÀOfõ+/«nÊÍ¢ažS
ƆÁŽb‘ÜSbL£ÜdÐBoD[dCãûø©}cÔþ¸jRûÕxEí§ù+%ÕÇ¿ÌßÍ3ÙC 1ȉÏW‡l»¶(LÌ}åîêüö ×Ví ;6I‹×‹|(§ð©Q4xù,¹ÙyùCŸ«ç +Ï[6rKgÖ¨rOfíÕ +Î )ýþE®¢¼k¹Jíä*¬¼Ë]ÿøÛB»ýÑfPÓÁä«.KåmÍÌB|Bæ˜kÀ¾G“â±]•Â,›
§^J*‰Tôy…Cæ³
²d²ïC)k¥:É଴uàÀôâèzOÏ2qFzôÁ€3®ôï
@ŸŠc@¯–'@¯ 7eÐÁ×ôlrÈx=þèô瀲V_'ÿ»ÛI*<ê•;Ê\[óÚÆœ14ò«Óܱ[^ »tÆFQ¼%*¢ÉM9¿yæ…Ü©¶ +8[^n0;n‡½Bð9B<¶s +þ=fóÓ»õ(‡wÜç67ç-nÙ˜q»örþ÷JE |ú…ÝBýóÃRg—óp ²µØßá_Òwú
tJý¿ÑÖp-£ßÉøY }:…–—º ÁS߇…‡™Ìð{L‡ä®~Ÿ_=É·Êd¯^»ß½ñW½´.ƒü©}a—¯ÞÙ/¾†g!.É´L,Oߎt8©ïuŒ8˜8"ã¶z0?Ëö>V—Ý?èìØË^{z¤oCÎÂœ®#t‰Œ9ýÛcJš½ZÓ×WwúO}góä¬ïÖµºUÆÖíJÍÌô2€\èì$I[F)™bnåôulê¤&6wŒè¦xÔo½,†WSß[ßzsw¨7Ý]eù»Û|LmçávP†²üå•6>ùå6•ÿ¿Hß¾œét]IÓ^¯œE8¨þuêë«%êݺ”ê×DÌ[—kÜ?ûHa’dÉzøŸÔã{sÔ/·ýõ—§=Œ/;77~ĉ>Lcj=ÛAioÙ]˜Å@„Ä:ín™µ|=eW'÷ÒWÐs–ú·5ÖZá5á¡«]5ãL…±¹!à¿Ãéû@1é[˜—2’,Ú4Éú¶9§î¸WÃÎzXNäí${ÇÕ~m‚¾«,ÐVLwËÆP#R=¦ÁZ¾ Ñjž%]+ȇv?ð2ñd‰•{ÔÌUÒ
ëùÐFš¥Å¡9 •ÝZž÷*ˆ=»öfÑlP#o3.×…‚Ç~RüÑèÿ~ Êo¬P%}‡)ñ,ŒßÈ=~t²{?™V'—£è¯+ƒÜv`슑9“«oºãWy°«-ÄΈšÝ£Æ×s',sçþâð|ú‹ªôæ½8¿œÓv9ž
Žt2ãÆö+ð?^núV¥©rx³?ðŒms¢¡ø|’¿noㆆæÇEGüÍ ‚ÿ¡ÕyäÓÎRiNøV¯QÉ•®ÇFKßíwT´‰é~i³è[²\voï¨UÿB¢x//Hüž]ÉsF|‰³á,W^P®Œ#Ìž~ +Xgløá4‡ñ“ÉâÞŽ&Ù0—éæ2.6Ÿo¿µ/">æ4ÈQ;=jÃSÍÉ”ú¢l¡ú÷
ûýãîZø'ýô»Ü²ó¥Z½À®'X§ÍäC/Ö¹lù»Ê†ÔI¸g_Ëßø8 ¯g —¾ÐT%¾èD§¾•ñj²cÆ%»bë>Ž²QvÓÚ£JYïþÀÃÓsä)i6\>—퀵‹—þèÈúÂx†y“ÏGðäxãõÔ—w#sþêè4ý$î½þxX·}V‚¶;Ïø÷¼SÔãÙ¢gõ³Væ×ë© +-Ç~ôœ¡-Ü&sKÃMknn?pŠ÷צQ>½šÈñ›3›äiÄoØ\…2cA4\©ÛГYØÑiè>Õ®ÇÚNt6©ÆQQþîyå/’¨î‡Bò¿œþر¯ñûy|”ŸNïêG—°ÿžõ¼ž±k›»?‘dqmŽxÔ¬ôû0[ócÚiå)Ôo8tn6ÇÔ¦ØCÞéWãéO£j˜_ý\tºåãÚ
;0?°ÆùZ÷ß”Uƒ¾¯¹ýJUÒCî SAçhÕ”½Èxÿ‹í4.–£ŽyÍ0MŸGŒÒŸ{‹Héuv¦áœEY´Ÿ¼ŸÝ•–¤V¾c×ÍêZÑë5Ê›éØè`ÑB?’N§×£vë=.wKŸõgX…êBÕ÷ºIªµÒ@TÁîÚ¬iÔ«å'R–ÓÏUiÔºE¥iY£óÕYÆtŸ1?ü˦~¸à!cÏ¡¿§©/Mõ›R×%Õ»ÞæÁ—·@ÌU›
©Ì™¤Q-7’©::#TûÚpÊMê/ fùX}¼°·ê¶jÍt/jŽŠÞµÅõ×`àÊòÅqJQnjòæwäÖŽ]H{¢’ö +–ÚÉG•ÚçóDj_껌æþödï°.œgØ‚N³UÒØ!—ÇþgR ºØâè¶ïF¨YA6g7cPiìsKÒè$^g†ãšÆ¯–Íú=vÔ}ªµã;¨…ˆjð +cúØ\–zy¿ky/œ¥S÷´;ö¤åÔ[°]§ûÚ¢l‰Vή±‘ÆÓõ‰É‹êl éjîÙ¶kº”
î«ÙØWP(˜ÉÛÃy-[pö—ÂMrúÜGª°-DìúãªH‰7IèϪ–Àªƒ1ÿ(#;~t}ùÑÉäùQÒȲ>~´>o2Þ1ÿ(vD'ÝÄfËåF¬Áïz¦?;ý¸Ñ¶TGPM‹Ì“UiáÚhþ)ª_òCª{gkH#WSÌ-fÊ1θ2îkCé v‚¬Ç*‰Im‹=ìy®.H…A•Ìì¹Eð>¼ðÈ·¸©¨9ùoÙïLHÙïeØï°ßápÉÉ·cüv›mxYËØ4Ë@¿ƒ´õûv]<°ý¶°Ä¬ÒCjF‚IÍ$¦ÎÉIö=4)+è¹OÉ63%W_iRyÙbÏ+z"Í0cázo„'´6ü N¼¿>>¹wé•ã¦{ã²+ˆûÙy²1Ø<Sè3ѽ·bye$ctö]Æèj†ÛYŒnl‚ߦïþ¼}ںɨ:´¾›{ËŒ‰¢„%©Î;'´VÀ-D¶Íz¬êP±—¬pS¬šÀí&MþÙÞwxñtrïiqÆ +³âj q`ZûÊfë—Yš§"Ó(a4½i7êt‹8véR"FÔ®w¸g3˜›Mc¸åP;›È²qjW—6tiÞØÒ¥Am3W`ó{ååPkå&ïA+ڇͿÂwýM{¤²ÁûE¹¼©À¢ÇÇÀSWœ—¸C•ûd™Wë +:»¸ª«
º=®o'?0³ÊßC¦±*ÆLÑäÏt+Ö^4fOª}<U)¢K*dçê¹$9óê…ï]ªAĪ—ªÜ®^ +§YõR,®IRÂþa–—R|ø¬ƒG×~RKûm/û?p³4µLýf’ºÐ¤Ü6Tô_øoµÎåÆv‘…·v™1Ù)Ë…¶Œ¯IãEÜ¡ö}H9ýn@UØpEž÷#Ùcêå#äªýY¿\y@'ñ®Œ–’]»€HQñDLâw‘˜,¾-b2êN‰×þ²þ—i‹ñl,^]¯/,lôÇljcŸ“jI’ȃñ¯ÕaÃc=GÇl)Ç(·P(‘‰W’=ÆH:ËY«=jU9$éTgÔ¯øž°¨ˆŒµ%Ò{x!¦£×‡PD¡Tž}®\WsM<ŠcÜ0žÜh,Ü#7h!{4ZýÀ¸ºË?üF{›KÚ¯JoÞÜBD×ð^³^;WeûÖa´×qN½&Eý(yòŒÄßʳ-=Þ“%Nò™"j¥²\^´«ZY#êV9ÿò½¬•å$žà
9ð" Øfa=°–ÃVaéR»7ÒKÐã~¸E;.ÐNGÑÐŽt¢Ç®ºD¦¼úão§ïÎip:Ù¹73‰ôÓÕ^—ïï!«{AɆV†åÁª0›ò£ª©¼À2W)-‡5³$Œa)9êX*U𳞎ÀF»ª‡R¤1-^>Ѧ؟¥ç"[W@ᑈÂhU©ýÀHŠŽºÈdG¬ÉâøFd}! ·×G&Æu¼–øy‘•·úÀmõ}Ë\fÆ•¾÷ê›òaõ¬ þ‡àÙå´OS'òJTù7‡–ÃÓÆbŽÏýÀh¯öÊé¾X›—2òÆrt†$#Ó}Û@”ÑÒA??B€È-àù»·‡ëÁõçUÍ/¡µ7–²?³ÔœóW¨9øàPsÚPÓiN u¸^þÀÙ!Ùt+ið¶çneof·™ö†·^äE-ñv:âŒL;í.Wõ¡„$ »XÆâïE=RB +R%ðâ6+äWDˆç‹ÝYÚR{j]? +„
‰Æœk¿x'GL:#p2ÏK@î +§Œ! +r0†Õ`¦.³¥¬œ-ð~¶|ggŸ±|äÌ~–%¾¯,¶Ke–›2ò90(žsÅ<:¼`¹JÜ/ê¨}PÏ‹¨fd4@Ã;ÐHu•á_ +h • +-ö?èK°ÎÛ +Äi(>Ù¶Ô8“ÒPÞà{¯4-¦y¸‡èwÇñ£õŸh.®ùŸRò +éü•n[ù{òöo;‡áÄÿO7‡@d; ¶g Î@–T¼"ä2¤IbiÝéÌ\ôþ`@ú,5 £îÈ%h—a>2úï4U"毢øÿª„ŽºiªÂóŒö!ãüúgg„i¾E¼æÅý‚¬–ðÔ-å±®¶´‡yöš÷˜éØwë>ìÜñQп9iàß*ÓÍì¾&Êmu¥ïýe€”nçGSƒÎ>–’Ô±ídZIÆÿÿ»
¤ŠOfô*ÿVB3¾Êÿláp§SˆÙüÀ¯yAJžúžy<Ì„ùÞ[%;ðzMd¼|¥æ8y¹Ö)öŸçW
¡vö‹ªž¤–úûüªÚ>}]Ç;©çþø¨ßGáa-ìû¸¿w}DïÜBNÿw•
iÿ'¢õ/ÿ^½”a`ÿS =ð¯9|¨?õ8±³q!Üñ~:»Uüïúr]÷gY'É´4¿¾íù뤞æßøQtDAá`>Ç¥½õé”wµCî*Q‡{OÚ^[cmËî—ÖƯÜúëÔ££µ|¿~V_¿N¬æâ\üÏó«+üóÕ/i:µ#,äþÎ>WÈ°Ë/ÈøÝ:«×n¶È¾°‹F=IMuš—¥ÎQ¿ƒ½•žF;dËÖ.¶W3\mÙx¶ÝøåÙa#Wçõ”\Ý×òåôÎVZWhùb¶×ß_"Z«(¡‘ †v¡ï,¶\¸øâ9OÜ2O:ö_¤éZù0þ®pMøöÿÇÖ›®) +,m»GP‘*(Ê<‚Œ‚¢(Š¨8Ïó¬ç¿)»×êõ½×î7XM’‘O‘÷c”ƒž{m3Ïl‘ŽWXÉï˳E²‹›KÊó>™¯Ì>¢=Ëv;5žÀŸÌË 5q@¾;^éùþ؃Èñhk“ó±b6I€ñÇ„ÞyÏaHurƒ[{
Ä;û}ÙñâO’¤hŸ 8©Ì^PÉÅÏ/Ò^Ú‹¾zÄâtj¿»³ƒ²@f÷Ž—gc4›?kµÍ,¡k—©q¯¾'ö»½lùy›LU—Kè+
Câ·–Ú;4AÄ4x‰ëý¾}屌âDÙ'q6y,z&T8Ds›}DÒ-tW‚Ôõô{§‹‰Þ¢³}ÎO>ùÒ‰ŽÏ—1/]kZe[>ý@ÛÅž˜c¯½Ms¦ý®WâD4ÚŽ‰IôfŽ´ë Úï~ÿ\ÉõAÅ+Æ•©‡Ç9+dzæ2zùö\œÛ܈ŠÑÙíz¯[£³s‘¨Ó@•4²Qs2¯ñµ}Yù¶€v…Öý^m·dë2Þ4yçüþÔökw/r|lÀ{³-u÷óOéØŸvq}\ÏõÑÎ á%®Ô2ïDýLÁŸ¤÷BÃM¯@†§¨¤Fnm< +,Ap^¡ ´ú+þÁIþÁk:ÿÀNmþ—ú‚Pc¿èÿ¤ã*ÉÄÕÞhÓœVÝn§ŽAoKÎt—#,lÍê—)û¬Èìòªeà-(O×ý\¹ lQ¥¤¬(¹–׳šÔØ£¶D5źx¢ÝPl}†‘Mö³H¸êÐNèâúƒ4Û0ÓWš—/ªÎ½;ë67¥9§ÁÏ7§²*§¾»7”ß}nH]ã_ô¾µYzxÛZµÆhÔñ©¤d»êþ ÚÕã7Zaü@¹õ~¨c¸y)[÷©”ffF®#^Ajb.žz—ÛUY¸·†Ðõ²ž bDÀ?vZ{Ý ¯È›
÷þd.Ü0Ñr\6×%Øñ,£²†]k°0“K%3»$Oæ×daÔn¦˜õX8;ŒXC[ö’Xv2Ý“_Zv¾Ü®]£½Y5D°ðk«<6PÇÆì^.\ij¼™!W©Âé$0Íç„[, ¢Ë§O2ÿä|‰W¢@ã>ÒÄá’üÁiK¸Ãe]nÈN¸æ’5nË3—ÞÆ~kƒ— +½ª°uÚËMU®4:wÚËÓ>í¾êíí.½"›Ñ0s˾ ŽÈlfM´Tlyñ 6óxãô´Pm8Aaê7¹¾GÎâYKïrDN|_M>Üg¼Îs‰ŸK'Êc‘c'ƒr™5Ußbó™~™·mÆñáS$ÅùD{-cGcìøImop‘ò£¦D^'—†zŸ’â™F$GG®JD6\÷‹>RŽíÐúÍýºéjc[·¶Ï}eoÕ¸ÑÙÇ•[:*Cw{⟯ʎK®•;…Í›wªYƹôJL±³ èµ$ºc›—«ÔÎñ›Tƒ™÷Ècç0&["²!™§q#.ýUž2‹ßÇ]ï™…^ŠõáÂåšÆ{JPÅ{ô9ÄïA¶‹ßíg§çCÒí›^»…5ß™;ˆf2YÀVÊ8T*ópF +fÚC&ó3§gø=³èƒ]KýJj÷Ƚ)Êfóä ùýËÙZµX’
+qåï&Ñyk„Km<F¼.¯&ì]Ëž±!nf±tÐX&ÐLtÌœº¨~mQ(²0Tßñ6ªO£vŽL:_tytqjbùùàòÊ[·½ð©éwxÍh9ùZ’wåOVä?⓯äÂ,aì@í½é–ä +£!rƒGc€+æÁ>…
—i횊e¹ŽoÇjôò +[f:^Jö2Ú—÷ù.®0/º»g¥ˆ6ëmd[Ì,‘úz#ÛÌZ/¢\9(¢h¥ýETyï3]3®NKWÏ<Zµ2`Lyá.KR«sËñÃñbíRÿ7š`Š'’ëöØg"ïQSe¯¥ù˜z”œº›+‰n±¸:ÌȢ׋ELÅ+È.£VÜi!¤±‚cqU`Zþ=a_Å|xó•<ï?}øNµ§ptÖRß‹–ßÁÎÏól®ýE°hî75¹˜‹ìõ<vN;T5½ÖaÜ¢¢ð¸ÁL¡z+F2Ôó¼ÜîÑü °-¦¦üXh%ËkìŸù+”Íý@ùΞ+å…¦Mú-½óR‡{—R–GÕzë‹4„±3¤Î{0”©bBnœé{9}B'9HÚ\szï-æôfÍÍf»vnïÂÕЖ®>]t-ªcTëÃl}¼lÖ8©=ˆñ¯ðÍx.™%/åèìüµ¢Þ¥ˆ‡üuÕÞÀJ£y‚´eûeÝá'Å-Ÿ›`ž3v"—ƒn9;§ÆNiŸ‚ÌŠ§Rï"ãÞ[°•//PÿT @Œ€ˆNÔD]ÜÂq@˜û + ,ÜK¡6kqý0s\Ö19¡^ÓŒ–¤É/Óúã˜bû¡Dµ">ñNµ+ÅÔŽ‰jçž¿õK¸\Ùœ œµ¹g‹‘û +hª¦°Ú€¶/@;•cŠKÐÕ€´K× +Øæl?C +ØçÚ\¸€#Ë-À™ó!àzÜpÓåp3Üþ]Ü¡îåí÷f +)neÀ}šÍߺ + +ˆÕB5Å ¢›_±í+æ;<)l·àülÊПç¨ÜÈÔƒ-5fj\²í™i¾1õo{\Fÿ«Û~ó€Cí/~\a6ÿW¿Ò6\©J=ª¯'–"ié·°¬<›@.Çs WÛ,Ÿâå9I§y”M=ì‘rÿ”Ð/~•PÖþóÿ¿b¶‹ë³Ÿ}ƒG’çï“ÒµôÝáú#̇7w]1ñê^!õŠvKÆ¥þ,Ø¢OÕÎ šgz$wN!¤ö7Ûš#¤·9<½ãý ìåÒþäÌ}Âxíeþà·ôÀoVgºùúA¿rèW ýf+γŸ†^&÷Iq¿¼ÙûåþŠ†ñùBôºsóݧ³Ö‡Nܤ£t‚<<«!qè—vÿ©÷…ß³úÊ.µ+•ÜIìý˜×7îg®ýÜa¸:ØônE¯ÎÈò\3¤%·o›ÿH›TFR`¹üGýè}7V’ø]WY¹l9É;7_|ëÄÉÞQœ“£ý§–›í³×j·Û};7îkz^û™ÎõOþj +Ž¶pH{ÂNÛ¸Á®57íÈrÈÇÚBNݬ¹JZÓ«å‚dÇÄð|øŚﯓõ¤ñË “AÝFzûÚ2fÓAå"ùgÈÎûøèP‡j_G½ó Æz|¦Wv%b`VŸ‡]ZfŽ“Œî]§’{2ÏOlÓ!—Ö|Íì,§ãÝÌÕ£“F¦7»£Æ®ˆñ† -ý(Zz6f:³È¼*—Ö[®\Ú¿ÒáX¼‹Í˨
õƽ¥2©‡Â-›%ýõ%ש‚ù®1ãõÅãƒuú$W_ú,õ&í
æTÎoΞ +…²qÓª"‚gWzÓ¬azhìVl¤!ÃÈ ßÓ¥ÞÒÖ{MmK¥Ó Š@õ(íþÉišì™¾úƉú†wuð즳˜ª +n +5ø‡¹i—¡ÂãÃî~WñZZå$7PxNÔN5ä>Lð¬ÖúÉÅÂÝž&ìǪ6hØ\Ÿ4Üĵzê;MÚŠ~ÊdžÞZÌÒø¥r--Óî¸>ŠúZïUkòB_«ÃRí¤ª×=P3…•Çæ@)C‹»«ÌÚ^_™…ÄI±”I±t[„šÿ0CñÚ¿öý×Î¥giÎm±Þ\;˜ûÌV³ÕÌep·gváh¹ÙÍɬ½–ƒÚL€Þ&¶…ʵÿ!+b&Ëi±(šs†:t8GÕŠ†¯f.í°<îÌe:͔ټ°Sì úü„Ù ²;Æy5:¶´ÍçºÒ–ܤúiEIõ³k¥X6þb5ö'ÄäpŠL·ŸÝÓðPMðn1‰Vµ#•±íX½š›Ûlo4[ÊFçDñœö˜X¦ïZ¼vrê÷‹ªÖÉòøqe#Ù–•yî`(öôã*ˆ4äE2Ú‰´ÌÖ’e®±wañÐÜ3bPVM‘»®p›á<ñpá<%Ì(Ý4ÿ0:ÂCƒí^+é÷lŸ$QÞí_%¾¼…&¥‹Aìm妖ZyÔ„^Ëùö*Ãi<«8¹bI^Y){TE¶mów=qŸL‰¸%žx˜œ[b`!}‘¡ì…p>OB˜ Y¯4IþŽÿæ2ïm^ +Š+^0(/µ^j‹þ_¸t=‰ºÒ®{h70;ªY»l:^’Ûºh‹q˜\Ï•Û˜Þhez¾P³÷h£Ì—ÁQ)¢Ñ]ÆÈð#ù,‘ìƒñ….ð].yR£é|+lðwõÐã{YdÊK[÷À½üM:*¹Åá\ù=S9°;ª¬çìHßØ‘ªìÈÌÖ9Á0ÊkÓ ï‡°YŒK†w¯ÍYÇ|u?z2¯6Z¹ù\—§9®8K~!c³ûí±[æ!\êzVè
„¿-œï1#–—Á½Ì½Æy“|S‰ ÃÃ<aGtËêjýÉB™[‰™n]…±ü«ÏXΔ)Ð
ˆ±³ÌXÎÊûI?;ÛÚý)?Z…Ò»ßn`§‡îl¶«¬U0Z•ê[{ÕCyÊ÷—JñÄÏÒ¾¿LÄ–sYÚzÇß÷+/—Á›{ +æÔšŒr¼J³£}'õ`Y=Þé,T.3dÀXkÀj«%½$ˆ]}&] "µQcÚhòˆªç(@mô¢DmßIºt©¹q•²mp«õãmV©ŽVÚÂE*ÿé‚Œ?ÕQŸ;(¥‚¹0Ù`0âBgÁ½íÖ†SÏ£3;æOV¿_³ÌÌÎ ŒP$SX©<½[*íòS›.Ýï
j3ãcªnsŠ@Îgr¿.C?Ù¬m9’*qz>Äéu|§Ó”'iºì4R®’MÛq£Ý0¦/¬Yë]Õ±¦yÒ8)oX{«GÙZ#©™eB~Ox’‡œFÎQËô¾Ø
yO/Oú•v‡j3˜ªO6(E42y (™lžtƒ¤‡½qÖŽ"Ìac‚›üf½2xD.^²iç\Æ1öìÖ®¸¸mp¸8¹›x”ÃRk‰wïy§Ëö—“f©³¨{ò•+Û¥Å‘Ð¯É Ö2›ëS)ÝŸ‘#ó>^¦ìøS2öí:¤ÑÅuNùì{C¢Ì‘LáIœJ†«nàS' ¿]÷|z–(ʨ©SÄ:Ø+ßjaýÅnˆ•]f‹´ÿF“F •F¢£9šë 9¦pDsl‰F+ÕŽVÔ…&ƒ£*–øM»Q«Žã›lî7¼O‡Pyv?Òñr(l‚¸(®8íÑš2N¥4¢üAÜ'™n<ÁïNs÷Šñ{u–l \_Xù ç0ÐçJèÈqiT/e4·>™¥4ñK–X‹KùçnY\¤G±ª®Ñ¨XÊ–Udš0¤&·7È:ãÈ: Ôbq^µ¾øÖúNÁBÕA*i<Âõ-LÓ–n꺂öC<·WGdrk6¯´æ4ÖƒÆÄeÜ`ï´7ÐуH}²éei†hûR!¬ßŠK>þ«÷\,õž²±i©#¶Šà«aµ°÷Þa¡‰«“µ_Ÿó§@ÎçÛÌQʳWLJ¯º€¯
¢˜g§K9ßzÌ/þf§»‰:³-?µÔ•çZÀTø¦äd¿Ö| +Ñvrb§ÂkC×*ÕÙZf¦¸<·‡¨}â¢ÛÞ&á¯f…yXèÁó?kÈ-f%"(ä¹É<õ`á[#+Á%š°xê6¡gû1„ú¼µ‡”û#.=!÷ Š^.aæã\RšçrÍ ex5!¥}µêçg¾ã̆i\²E^K%¬\4EH¼ØÚ“Ç(+™ê<·'O
k…ÇÝÓ +·A!ðý|gý1ôªh@D›‡3T>f_h‘¹Üˆ5Ñ\å±¹\÷¬e§áeÍW3Ê,ÔÓ2SÍêÏLqòN¯xo]ØðÕÞùvÞºu •Rho€õZ66B
½'åujp™*Á ‡Êû+|SÍäuÄŸ®ºA'ýÓ²˜ºR³B‹ûŒáû+I u¦w?õýef©ó«LiÆlÁÆ®œAñŸ +OJqv +ú (ÖÉ +€ª~H@µ1ÅÐTR +RtF€)¦0 Ʀ¨ ¤×BE›% zíô·›‚ +ñÈ ³gÙ”ÅÉ«o¿‰ÔÅm£ +|½ó‚UÀ>rVãtËÔnîÐy%…ä^m¶+Ðæì“Þ„èQôÔ +øõdû„v^ Gèì_ñö‹zG +ù‚+?ïO{¦dVÉFc”ŒôãLêW:?Õz
r©¾Nü^U5ç^M¼Ôò—u³+ÓÅ ¤X#-/®G^®F ,—$Ì”6y³.ÕQGܳ‡±Ø¸»ïŸà…Sƒ …6WöÆ°“ÀerDŠPK¥®6xO®ñÔiWVAQÆ»¾°3^–«möF“ÍÎ+W»2ÔÚ«§óǤ<.§e¨~\+Öá~”—,¸Ë¥q HCÈKuXGŽcQb³ØDê²Ð„SçžZK¡mð-#Â!ß
¶k^T•÷ÌÌQî‰*o-NiŒ¶œÒ \|Ê)*Úýñ ŽB±>0¨ñ¤Ý§6€m{fÝŒÙÞ霰i±‡
~ 5sìuËе+…gm$£ÀšIõZk+î÷½³HÓƒGl-Яyþz |w†3¼h«2÷¤;&Ÿ×uNa=öS—l‚î¬öô‹l¶ÿ‘Ùì n¤‘øDÓW̤¢§{G Ý;*ª_Ä¿ue[G×ëgNUIÏY"ßôsÕØjO;™©Yr+óL+»s¼#5¨/6÷ÐHh +K„=åäËÄ=-ùÁõn†SNC„ý´7›T ä„ +›Ýµ<fÒØuSágüI.ô|ÍR¬DÚ©kuºHBsÚiPHŠiºÏZ+ô|z)÷Ð>½ ýVœÖ=™„œé{ÔÕ‰šxÞT™³½žŒÎñP<„›@åYÄß–›!÷ÜÎ&\™Ü¬ØÏñq`+ìûÊæ²Ô‡™L4˜1ý6ÆäÉKÏ2íÙôîÓEÑ¢Öè}Ly»Ê‘ò +YPGp§çåÙ} w•V>½z$‹1{¯¤àÅC +ç™{ïPnؼà9!Å\æØYC8„Yè©-2³þõ•±Y› + ¥ð +]ïF?:$ãÚç&vjEéíúÒýÕLÔ7ÔÌN +hÃÌã´?¯R‚lØr}UOýWô :µm`ÕjÄEox‡N-ô¡»ç¸“¸¡²XToÉqÿU%(÷pž3=mÖ bWp3uMŸôÖÎåÄš›|Š±òÅŠ5_½Ñ>u×býp":[iõþ¥9ÚN7ÍÜÑZ5ÌnaÞ†Ùºîñ³cïûÖæáNŸœÇðpÑ
§(áò–ÈU£“"U¥¶9/®i9å¨^u€9lØ•Å8´sÕÓÀ2o……•ô“YÍ3fñT"ŒW-Øíâë»éd¥ïöýß<¥FIܾ(1l{÷^J·khK©=ß
Û<êu±°¨Q‰›x§œ6öŽ=mîv4z]íùâɴć“É8Y{4‚#ÜšÎ'Œeçt웋ˡlV;OÃ,‰ˆkÔúhCßÓ¹¨±nŽ+'|¶´…§v-»E[|Hš°©ÕÕ‡Ï/ÕXÆò)"6EÂ1®Ÿš~OZR;2·Hc©wñjÝ‹gU¥õ8šèuõà÷íqÑ[3Ü[˜KÚÛ™¥$º›ÊêcàÓ¤ï{Qo"9¢r +‹l¥Í3’víñšÖ•M[},Æ»Û^ù}‡g©w1ì¹çr¶°Í)ã•È(F¸·XèŒØèeØ$é<ûE“h»ËàB\½|Ý?awWêd6NŽ£'Ö¼ÆæJϵMÔZ´ŒÍrÝÓ÷·u’ÞZº,*íÁk§Ý²à¬u·ÌK}’BVzAU-¼œdZtYDe/4Å8‚ª·ø–ìd‚DF6Ÿ½´òtžm q;Ôtq»b¢_+¾RŒð(Ýìhq»¾3ƒòhå†{Æ6Nò:Æúêè…áÊ*Î#c'H==XN[•óV®W¸—jâ•ŠÔ¾¡ŽÊŸ¹µH]„궜]wÎʤ³~)ðc“‘çñ5}Æd§aÒj3’W“% :¦èÇÓºH:ÅX8ý•\>Oþb8(1aïäg]¾Cí|‡®b)z4ßAZTl!»-óuÆÇùc®šÆ¼g»À5W?ÑèDIå²¼wµž¤7ÕAñê©@ØøåJ:Í+f²éÉ‹Üi$ë\Zӥ䅋¸ã…‡èßíŒHöšyá˜>'³Ü°ü%,¨|‡×]^È-º\¯Yœ§±˜LWö
ŠÅ…Œ6;Ø6ÒPkW*±ƒ©@²ïœNõJf£BÖNò ëŒqá7ã—þÿÈ:Ï5e•µ[AD‘sÎ æ,&L˜³˜õü7íûÎ5×^ߟ»ûÒnyº²žÑƒQˬ2Fnÿ¶éf2.öÝ¢'ù’EíݺYÝ´3ö£ÒÀáÆT?Å£•®à£vYnÓz?Õû
†Ô~O"U+(‰Ê[˜[ÊðôÎ)™Q¶¥@î&–§¬™ÈÙý—ÑgHsnHóq–Ñá”Ñ!ü ß/Ýúr™mä® _îªYŸ7¸³ßÈK÷1†™Ì«Ó±çè¡j-?¥¢Y™ÁQ_‘U½µý4´+ÿ 5½…EêC᧪Օ–ÊÛϔָ(™Åèõƒ*Pó†ÉS…deò5ÝÎ}i^CëRÞlM$â
NâjÕBÅR×D†]ÔD†ÛÅRµ§8ðâjšN™Ê¶åÕKÆš/Ù&ûÉ•Jçc¶Ý¹-2¦W%eC«$M«&7còú¹µöµkwQTQTQm5”Q6î*Ð<Žd_ÚÅ2šÜVÒ¼ƒ¤|Ö¾K$Zƒ$’;ÒâêˆÉb)Ê»"ãÌ+Â.=Bu;Ùÿ ßÓaþhn¾ñ.”ùƧºãŽ‘>Ñp_´=Sãå[t›¯wPÝŽž1ˆçؼD6éë¡ÉkÕŠÞn%9Íð›YÕ.âV¼’ìÌjz^0»Ð–òãr_\#å‘Xšõæ"Sßí„øL„êGz§h¿Þ‰ü±BÚ|S¯–xéqísI”Ýpaáþá4º"²·U`o{iÃiìæ¬Ï~ñƒ¶>—©$œLüÍæå7ñîÁµ“æÌÁ†›ÈÜÙï–žäÜŠfL9e,›žëˆ+-òTA\—^%‘Ù½j®/tþ-GüqäÅ|³nx™‰O\²KÒ™û,’¢ÆqZîh²w’ϳ½u·Ãšzżôዉž"Ï8Ñ>Ç8ÃdÉDï0/‰a¾hú³•U¾5(:O:Ïl˜Éï3žV˜Ùäµ?0ŽãsëÕn+µ’®¢jdYO¢Ä#²êÒ„`Và›§M•—[—^ï=Nëácö˜K¶ö¬¹ì]™Wë1C•¢˜\Vï|z’“št–˜Îh$±~;q$y°Ô¬Óñ©Y7šÓÈ.ÿN±£è,œÐ
rÕ6¿i'ÁnmÝ=3}“}…os÷Ìõõ²j©Ñ.ËxVóÅxq…:Ówø–Ùò¸N±•gûÕ\ñe-£ß`†Q?d2Î2b p‰éÉ–ÚÐÙªy¦Q¾ö¢fÏ=A冔D™B†\AÇYŒÝ I×’®w)b+).QÙPcbK=ï$)àdqØ£jµšªÿM;ñO¬xw¹û#|Ÿ«ÿ¾•‰ñ©HEÎÉ ûÕ=Ë+fÅaûWÚbF˜èÓS™ÎÓ>Ð+Ô<k5©<ZìQļ3&WÍ’,I¯I_„tĈm§ˆÕì’#xŒ²ðâYÆExˆKtûˆw–âlcíú&ÂÎóèŠK˜€á
Ã!+ù¦~ÓN²Úé|Í ëdûGö¾LľúZµ[ò,J*¿z²-äøÖm“e\†qyÈ¢æëC†\#×±·¢z¾V >DÛøQxãž™âÒ¬³Á’Ü&ÁBù¤(Ò˜ºÞèè£Ðž¾è£éšw—â–v¯È³ÕБg;×FupNqAÐ ÈÒkÊ9CQ÷u]ìå~¼1Ec?Õ(ÑW!µÑ–Š—]U¹ÀÂÌgFלGcMÈ!ËìÀě톇…q)í,0Ö-¥Ø6лð袽3=FͶµLÑ?!/õôB¢;G N¿"Ãã÷Òƒ½±Ö‚o·„f¨ÿ‚‚ùG„‚h^‚â×~Åoó#â-¢,+øJyöÈß k+†C‰fSõÝ@ò<ðÛ"Ï-jÜM“Ķ5ûýhÎ'Ëã·‹Ÿ¬nºÊ«òÆ«y$S̈®VáÉvІ³ÕÕ +ŠÝ* +d…Òü´d1½=pQë6 +ài«Q„ˆ'™—RHõ¥.`äÕ0 +ºN‘»¤Ø€Q>Å,Íl¤x. +9ùUzéíÌJ¢ä33b-|m¸‡2½`OüM¬ï˜¸¹]RìÀŸã^2EGJoÏÚðýIÿ¯žœÒ£tœ&Áü¯ˆâí¯§—zž¨¤×†X̀؊ÒÇV0ÄwÕñ( +(¸çùµ«›í×ATãñú†RÓ9h&¸¼ðÛQ¿¡“,tƒi·‘ü-é[ÈíüþuÛ~ä±ýµ +÷\^D’MÎ?aIœ»÷5‹kq†sø€Ê¯˜œ/ù7Çú»[ÖÿšW¡·üÜ’Æ#{;ñùvÓóÏÞ?Ž±]þ³›Ý”ÖÒÌT—·k.ž5ÄYØ'$;+È?ù«W5^Ø÷_ÿê¥ý»'Wô§ÌOj$µËÂn,íë(©÷á‘z>qÞfºCã!£çàp"ÿƒÿ/f@Ù#ì9Ú–n÷Á׺úƒ.žåw4ÿ4 ÙÑíÌ¿‹—˜¡Éο~&ü≎¥Í…ÜŽ©‡„ö¤£44’›=ÃÙ÷;ø˜üÀýð•~ìí~€4F½Enºê‘«Çå÷Îú²u™ýÛîì§A§&{»?à/Úö‹ï(~k<¸›f¥ÎÁnE™ià™ñ1·ñFIi_Þjûzôlí;Q¤"ãÁØó~ìÜÓ~ÿϽüœ{äüuí®È³[¦hÐÙU¤SãD2<6D6lJY¥„»j³|ëÖ¿4ZƇ6#¯°i:(5>ó×ÚaãFƒ?VÑúµ×îýƒÜIÇŽt§k{&ŽBz„>žìÇÖ“îàß-ã;µ³+ÞœNaòá±&UCé$5Û¡¢v[·®4hõcÜ|FjÜŒ{ÙøLŒMcœõ?hÃC·zœo¿ë¹Æk‹ò¯‘Ƭ®¥|•IVae×Ñ—•š!þ¹w*üˬü‹o\ÃWOžð3‘‰"}lÄ_;»B/i'i«žv|·0] wnÚo…hŒÝßðàŠZƒºUÇ–-¯¶(ös5rÛ/U×ÕIZæ—Ê®9ëTjò>ªð—û´Ü4Àª,=åS)t¼gñ6éàÅ^ö.MÌÉþ …¨0nÚßä?;•L±2R\/VÉ*OvŸ½2˜ +ÏIt(8èø’çǼGn@..oÐ\ÀžÈ¶qÁ¢HAAbu +Îê—5/—ÝõËÕl-·îyÇ5<÷šaõâÉZ‚ºáÜVÜp•]¶®6W[áL +ŠˆÇét—j
ôø^[‹›ò¹œþíbÜ-¼y¡QFx3=/ÎúžG½ÓÎÅçI,áYPÁråo„×Ñg[¯Kv¯âÏlÖá¬g ¯…ghO>µ$÷Òš®mÜÌ=FJK0CçuŠbg8"Ï`{ßÒu²wKv¶Ñßب#|R´¨/†ƒÜÞìHêo`š|©HMhõ•ió˜,´sÄ}X
èh—+û›WÏîOD;+*ÜÀku•©{Å2+·³¨~PW/t.™5yf¬Ê8on‹9ÃÇ›q2'ÛS ˜vvR ¬97«[D„Í•SÞ™%pû˜ô4àm)U]¦˜¼Œªâéwol€™ºÚz¶Êèo²ñ鞟ûÁ"{Wß4³MX){íÅ4ðT*ïyʦQpõ¹_ΤjÓy‡íž“¹wGÔŸÏí©uHÇat>Zó2z³ò,÷¶ˆ½š%Ñ¥Lú=HG̨ºsËàYº¨7êÙP—¬ÓB;œ›Ö^_hM4=MíŽfšÚË<RŒÐ/zÌæ*7Œ‚+²ß9¼‘?ʛ +—úM·=J™(›÷OǷ´Î80œäl_tlX¤ŠuÍRšŒ)ÅÆöå®ê²qÔtã¢7¶£—.uo˜Ö~~M]Úšz+|Õ¸>Ê3®ÄJÜÅë„üIØô(òç" +SÏ<Qm³m4œdFB¿cƒUÕ¬Üùüox‹«uw]µ¼º¬drº$gKº!ÍvŠ-‚â‰Å–’i%[*Ýlã8¿Ó¸êeÊ|vxΙ‡á›;/$×fd…Sn〽ö™íZ£kÊ‹y¬"óØì¬A¯w¬Á¨/¶ëºŸF®;fJìòÈÑquãuí`œ^/Ób1´è¤[1ÄSh]ÞtTk½Ñ¨ž•¥¹’ö +têRÞ¥%±äoÓ÷˜Pm®d¾Ñ™êÜù1095?uÙyȳÝõ£Â<u´•Â0ƒG%fìùrGò¯+=–3í^†<
w‡Šý°N8SØrp%%•!eº@aaùƒRµ¾S8¾ª‡Ž@ülý–M r•Ý©‘µÆ¸¶ÑØç+šQíùÊè‚;Òü]Ô„ù£3à¹$ës쑾îsìLä•ú3+eéq}T¢=q•ö•4|~t©8$FTàeWŽtNäbÿ…†N“TºV%Ö¶L”'‹1Qžæ/ë(|¯‚µ63¢<.ÄúÐ{VTqƒåI[¹x7ý¶tüÓþìýƒê!¡–Õˆïr¬½qíf4þ$.¬TyÖ´†qʼD{}F£fcRikãRxÉÏ“Kµ]%·yHR½sD”_ïÁ®¬¾/µx¹xýÝ+
î÷"vÔ†XËÁN)Ö$¦@,ÖR;1v +…;•Gé©vÐ`çA‰ÙiÓPPfÑWøÖz%¦ü•½¥Eÿ以sj+³½GI`@ø»R¢fµO3;™Øl:Q©Þl|ÿüdñú)âbƨ§h÷°3´šbºÅ”Zæ–b‹£3!§æÒ!‘û)’òÐË(Òò6ò0õ!ª×.é +ÕërÚâÄO[ÁsÆójs«\M%ÿ +ßñ%Äõ{éð'S7Ø{g¥0Éi”%Ó +—1ƒüžˆ£žŠµ±‰©`í¢×Í3v«¿™ö¨ÁaŠîykdÐ"ÄVòü¾nyxÔÓ]Ø5÷mh:2—ï&oÈ×z +4íLChÚÕ—0´žó…Êxwºztðœ93…f¦¯ÝnS™`ÇÒ*-u3ö¥Y†ëiƒ¦*–m‰,á7?l{,Ö^Ô´Gõ4$âÊbj6üiD><–Ö%ØMn
(Öá vaóîÈížH17Ò~ŸÜf«€Œ‘YŠ8}jV“ +¸6Ú +Á®·Õ}ûOQ¿…ü‘’¿ò×üõÝþk¾ýˆû_úmãýÆ›ÑݶØ2Ô@¨ +¯oÖ3ö¢ˆ+’³æ—¿u}ýÉõ䲊üo„Ã÷ï¿›º}#þUpÿµá~¥Û÷¢ +t[íýpXýY| +Ë[
é,S´_Djù.`ßnÎ_ëêWýŸ2Ðg(ôî¯&øu-äÈKõšá“Æ3§Ÿ§õ»[–ÜÝ»°[(óò–‰ò•
?±ëkiÎ7W!É„Ë[™ì-{,?\<ëütaŸùÅ|¬JÛ9Ü3Î3ÿå>~sG3M4&§17-ck²+Vë“S<Nø=Aü×YM¢¾1¬ÿe] óvá;ôæÔƒGû\…·;2Œ›ê»yY7áð½R—äWfÉùX™Y¬ÓÂÿI`E)3ƒ2“þÎNøš7ô׿ŠÖGê‰î{Š2ŠžÝì2²Ÿóà= eÄk~œƒ·)òéõÒûöØJºþ›»zº¹~¼#Û›æJÏËóOݨ̰nRÉèNË<œì|f>>˜í(dŸ‡aOL’èÙNî‘};¾csîëô»×sœÙãý +3q®¤ÁR·x‹ßçâmö–Š·yÝÿA‹½|Ñÿâ;Ž19ØKéØ1PœÏa“ë–qËÌ㽪ÇÙ÷¦Ž- c@Ñ÷êºÂ}ªeÎÅ+»†KWøÄÊÇ°¤”›ZÃ(%ýª] +¶÷ƒ–Ô÷ W¼æå¢ Ïë…g|íü=ÊVÊ*ï1Å$ïH.i!‡ûÙ–xý`Ñq_)ž|°èòê³Xñô¯÷·›¶e§–Éäfi]ùÞZ#WI«²«ÃrS©ý*¡å¨¤>›qñÅ›¢ ÇÂs’Ü +š¼òŸ€óãŽçá
Båâ +ÅåNrØÁÔƒ‚dÚ™”¿¬5Ë>s_‡ÙÝ€œ¦kKþã¼ãx¼fÖ<=ç<»/=ï½Ýdy!¿ŸØŽÔ+¼»Ÿ–E"ûZQ_MʧޱSÒ¦Tµhæ;ù‚ƒXÅü8gUóðÊjæ&Ó
µìð
+B}§áÆ/+ý½Ï\gIv×Ýܳ5ãôöŽÑöšÎ›ðdˆ`ÝdªÈ®†e¬ÌmÑÉeLjÓpž[aìDÕÞÁq²?§H±?çAÛ‡úÆþ$›tK¿Ü?QÆ8°¡â$÷znY\§‡Ã…&7s³{±,—o? ¶#Ï_?«¾Ï\øl¶¦Kï8P«žô1Zn2ö{nèUG™Û¬gz¹ö2c£ó<oÏ?¨µÇñÈÏ$ÂöêUÑFĹec¨`á^±k.ÙûÊ,‚‡I5^œ±qÖEcSœ/ŒM‰KRdŸ½*Í‘ä$•†½šÞÛ^÷+ÓúÜõ‘ûA½sÁÏxJ6Ý+ò´ÝKÿéeînÏ͘»8ï…EÅqNIËž(I×ÎÂØÈFb&¶fº²rBþ`á§ÆÅ,*í§IC;ÔØÄ0kp‚¡ëûÓ §×GDøƒjg¸8×Zñý¦)õ«)rQSšî<Å6Iñ¸wêýš”KÝ}~š[Pr˜=ªzÙ½Ém?3˜}lgT*«Ô£D2ÍžœdËFÓshåºZú·˜Ë§Y6‹QÐ0i§Ö1¶ •I<ÕÜn¥×·½.6É«v–¦Lj¤zU?’žòh6Ê ƒÆò{ZLäwLSò(¸çäQîË£†–ßójú‰Ü6Š&T^ëûÂgÄOæþj{•2jgíØ-kŠEÊ{Á,éuÎ,¡CÅØÚ-ÍàÖCGo°_÷›¢v®_jšr¾´ÔkˆôÕ®'OTñ–?¨2ÈöŠ-Žoòû|‡e×XFš¦4=ÀeÉo4†âüó>ˆ0ÂÄü´èŠù8‰ø“>†çæ˜{~ÊI$nóeïe+ó¢¶dZ‹Âƒtæ7v“‹lðó +§7šÒ%æ´vŸÔëUUÃ%,å ‹ž2ˆ3ùƒg*òèToÉnkØ—ae3‘bYKX@Å…Px‰ù×ïx#VÊL˜˜=–Î0ü®?Øò5[‚øšƒZ|-ƒøÝp¼K±;5iñ.õÆïMŽ*DC¯·šÎ„ë¬Ân1ö´ ëÍùDÒÂPaÕ[oK¨Æi@(‘2çåOu Ê¤ý~ìL-) +o˜P¾?i~o%,/Œ‘kÁ‰ÊÉñÇb/uÉg;¢[bµw»ÉÜW‡ˆé—Ñ9ciÙ#ýºOÞôpN3t&ß±iˆ¢êÔäÏ~PjrõT¶‡‰T¶O·¨É}³ !ßWZôë–Ï©ù¥wùà}g²…jæarzk8êƒÜhJ&' +ÒlÚ¥Äe$aBÅ[C|=BÜé“ìåÒl§×ãÒ~ÿþêIL¸0«xsé7ƒåéáͮә^µKCÁ6¦¦º£²çâ“BÛ[’œkºAæ‘S•$æÁ„XåŸbUXóĪxhĨ“¹÷~WÖ±É%G›Òâuê¥gϹkÍ8˜Ï@ëb²¼½¾*gW„ ®°*%T6ö51qÊÈÿ°zì¡ŒurHúÝòÒѹz
uË*5õÇåc»€úý‡>9o©!™WJ£”$¡í†XÅô(UŒ`DH÷çV ¯†Ô(Å:Áy½Ìà¼Ñ¨âÕž2Å·»Îök£Ò36ϼk³®µÊÏ«_Ù[}D¬@³º*å¡+/l>•^•âþˆ²ÝRb5æM†8Dô@PÒÑy²™L…$À$Ö é¥ÍºD0•gßñR„WŸ%ÎG‡;fTkÒ+k2¹"&í^CLÚ“
%F“‚[Á¤%:I‘Û¦¨xÊž+‹ø›bnÇ튮ұ¯¼“—%£ïŒòÕ¼žòiNµv3Øy=z‘Ê¿$²€^P¢,í |nè¯y/P\ÃŽsÙIQËcÍÆ¢ŽÉҧɲ¿@ÃN÷„†SF5¿+!wœÎ¥ØÞÈÜ#¦{ÇÓ{æÞd!·+·Êç‰÷Ñë6šS{¾Í¤ŸbÆ)ý¾aídIùQF¶Ï9ÏKƒf»ïNM¦$…Ž_øîÓ‡°“6Ä1y6¤Rìy´Cœ´CR6ª5¹—Ë•ëÒ×™øEÌG~íéÎ +YÙßo,qêêi^}¨ã0c<½*㓇’…)HBó
ÀNã!Œvúy +±J-~3C î6œ©Ý]©49;
u›0‡K@äÈ$E„"o)Þu@8ý9 2Þo'N¸²lBË¿1߸OÍšµµž‹•r²Ò¢¾±…]S¹dÓ˜I2´Ç$Y¤MŒà0€`§ÏB»ÈEÖ„]¦HA¾™ùõ(æ3"H(ííI¨e¥Ø€„ÙZŠZÌs H¶tKñ!ÉuÓÁô& q°N1ƒ +ßeÞ]¢æã¶FTW°„%ݵˆö¢P@œ‰ÇC3ëÅ +XI²èD– +`jØô¬²RËÔk€ek{À¢&i6s¥ë—ÖDAwíŽÈë»:gìÙø•€Ø{o»œÓÕ¬µ+e`?C¦…üÞÞÏŽöWOÆ\ÀV
°]7ø#ã²×Aé¯7X¥;€+冀
cÀ_À“Á5Å<¥‰)ÖYÀÓ~xJŸ…àîýàApþüë^ò’q¾yÕd&³¬ö¸Û'n2Ȉúé”°ë\, ÷š‡ÃF𷤯I9s¨ü‘n¹·Þú«ßZ•Î_÷׆Ëï__O/ª-ÿf:t’ëŸÞDhÁæÍÓ2k„ûý7ÇaÆá°´§@AgE{.å\gf‚|m™)²ë’ÕšÐÂne#½^€Ýj@Å]KÇÿç_3ðW¼ý/poõß2î׆{âO@ÂO ™GH}•Ò}ªs)&á¯n‰9k ã +¶ßx„o2ÂZ{|²G÷}Àù¤pÇÊ·úµtŽÛ¾×럓LaxºùÎäd,œùÑÞ˃{@ÖûX»ÝB½·¥×ð´Ùe†÷Í’#x¥nFä²Ç¤E$]ù§£—çîc“¾“g±3Cþˆ>®Lvå"7–NWòÿ¦
4Ÿ7²Æ~.|gÎíO=õ.s2f[å0fæ.åMõ³¶×Ò¬ç®ÔU-“—ÆÎË-"Á)Î?-³2w¯rmrkæ?^¼p¼QLN‚Ù´Œ6wi‡^ÆÇòKœKgĦ7¼uª³ák}†ÆÓ€¿ÛcEöçñù7uõozÃuÍ_9ô +™Ku¤î©ßðUaÙ7d:pŸ÷?Öö¢:»ëü>é–ÉÓˬï¯N}@þ€âaS¢Ùv*J[½gVÏê[ÆûÕmFž³l:Èóóƒ6>ÌoŒÓþÿä®~5ï]þ|i-ì]â|#Wÿ¹‰?A{7ÄzdÜ£»e<–:»âÚèÔè§6ù$×Nš·r[½Üêžž´¾êè3=¬}4íÏsÔ{·iÃCáež3»z@òçÚ¢l<k¶‰U×õ…PeØ©ìÂRµÂ߯“òqð@ËÇhï–C¡ü/¾a
õäQR\ýØòï]fÑ<´Cqó+‡NMûÕ:5Æ™ÎO‡Ÿ¢`o¶¶(BRÜBZu]%¬*sD3•]“ö+üÍ•ºTnêJ½””v)´³ƒ´¿+q±çÍv…çì~/8¤ˆå?ë¾’WØBÞã’iÞ0"ÅÈL1µ¾˜jkû«'÷ +Ð3I‹›,Ÿè0¬cs©S-3Ï~¥&‡åcë8ýAËMå³*%=x_ +MþRR_ö«ØË8PÑ„¬ùYp°›ÿ,jb~\Õ<¼i¹¸2vs·Ë‹FR
+2Óõ×7öËúü”ÝE”9
1+@\ººH×CÞ>+ 8–Âa¿øÆ5|klõÔlü-/Ì«–’ξPìÙõ_%4[Îs™Z^eZ¹¸Téç¦?I±_‹Ú~„ûÉ_·.—_‡ªòzøÌ
ùdw=Éò/÷ŽC…õš™¬ì&Ó¢é†þ$ÈܧZ¦WÔ†“Ž÷Îs' + 9Ï#GbÕÞìñm<9b‡×ìŠIÅÙMèÍmo¯h:£t +KBnBÅDº¯ezШÁO×À<^AŸ:v‡Æb˜~îCîs ¸<j˜ÓW æ ‚k”¹qXóÅlø›™4¿ù!š~lyjedqåOY›8wÎaVß1/ú’”¨3¾ƒ—ìhNNi¿Ÿ´f7ä¶<“ï¿áçq +ÃQó@ÂŽüæ¡Ï•Ó ÏPÒBž•ˆ§à45MÑ;œÑðOàH· pÔZ£€ãT`¯rÍë’ZºR²óè£nˆ¯gNµeܖѳ.‹ôsÀò,Ip*1F˜AOúÐ0µxù¹wÅwîëŒ{›šœf r§gwxˆõ_ÐD®¼!¤“ +Ó«’v—؇\dÇO‚ù˜7ì„àWôb^.Ƚµ¿ÁÃêì e7 8å ½";ÂS\9@øœš¢â¢z*¢föRÄ@ÔÕ[Š#
ˆ|õ÷îÚô“=}ʹ +0QžßØ©ì=ÑËLx À#h‡Ð¨ÿ›oIlêi¡—)HpÆI •ŒÈÌÐJq +ŽØÕÌ’ZUª|£XøæRYóPiäödI:Ó¤pqA¥×þ_Íû¾Ä XÕ¡ô%îéQLT §5ôZé'P<ãµ»+àÿÑöŠ#ë’OP‘òÞŒ@x„÷N œ@x„ý³O¿‰ªúôìì¹»sï™™Qn…¾L)3£B‘Ì4Ë[`N°Î£ØJ¬ÿËÌž›mc€ÍÁnÁæv`ýÅGéM:`U%XV€‡£àb^*xO·®ªÎÕ~ñÛïmjTŒ¾Ë*]–Þ©d›<ÞgT³L’Er“1Ù”ÈQ9}äÛ"`]FþœÅÃÓ¾;Éopò] +E¸â®ñn:Ê8¡}¬l*òPñþÁSÐiÆ–Àêȇ” ‘¸ú#Þ½x¤àF¶à7ûȦÕ2àgëàC¼=Z4Ø(Ρ3À€ÐåU TF9 dc äðâ'ò¸„ϯ‚ààÆàÎÕüSiJ +m—¹wª›eè÷+E¶¨vx±šçØĽðÿÒ“#)9o›[¯Úÿ%ãæÇC .°9ïöH¦wþ‰àí õ9¢¤zj¤öRòøñŽJªÛ›Ý +¼âÔNÑ8ˆ}vþ*¶¨Fóg}øcQ¯¡¹›Pýföwñ±&’G8|Ÿ^<þVpô[oñø£÷_ÒFo?ªmæÓ.ÚãX +aÏ3ÕÊS€ÉÓáGé½0ö…Üÿ-ÙFÙEîþÎXâ-ØÆ-ë×Ò!]/.ÕPuNgëY;†™[û0¢çݽË;O®Œ‚¥žšlËOÊÝ)ÜûÂýCæºð•ÅÕ_õÃnÛmÏË‘|-\%ç^‚“æĤœòŠÒ™ùpŸ9ôXšq~Kœœ[[*z?Ú„êZ‹õ‘7ô"v3§/ü¤»Èå0"ŸÈìÓÛ7,Õ@؈®!¬;äSZŶ+e™<ŒõEúR7çžYỈa)åÞùÌÌ·3ù™ƒUœi¯7¦âºÕu• ;™t¤Õz¶žç/|Mt”|Ô¡›ît‡6V8Ñyã¹V#9´4]4Ñ;7n×õÞeFÃ86k«°°o,“»FsáÊÃÁÜÓ‡Ó9ÑŸfRÝNkDáð…»M&}™t%‡
å9Ž¹÷èÑQ±Qò&‘C7Á3ÃôË^ÚøWkÎîù¥ŽÓã¶A¯[“èEçЪ^;J(Jíó Õkwó%ü´[µâhböÙ•)G¹!]]#=9Ú#k‘>vâ3΋ÑþSã¾xRG#ukßÝSjøîÉ¥aúaÖÄ”jõéù«Ûs¨×°”ï“®\g¦tZt”ãuÝîh§íÞÖ¯¯c«{][±§ðnŽR:ÑxÏ +bÃ&†ñºW¼ëÄ6ѯ-«·}(óf>¿SW«Žî5"{m…ÅDZmô[~C¥yë(ûÚ³ÝQºX[?¯ØVعÀûjp4šÉ×1ÑpÓÇtõvÙº—»À“®ŽNmYºÔjEöÙªúÕg¯êH临¯RÓâçÐs.Žò˜"åŽõ„k±²S¥~öÜ,ÅÉí±øXïµRœNe~CÄqZÃ|ä¬íÖ+h…íʼaƒá°N,ªnö³^Õá³+Ã}•ÛmÃJP¿¿+âé“í4õå(7”+wâo±¬¿µÔO½õR%âŇ'¦‹)æ +ïUÒ)Øl¶Y@·ÃQ>'îW¹e‹½äŠZÌÑ!efýþ±•uï{Ö”rôý×/Q#Gzrû\߬"zU‡sΡÅ;¥p8.•bïy½8²ÇÍ¢…z…÷ü2)¼ü²`Óü¦€úÆ!ŸãÕsžØÅo¹eÝ~åŠr Íѧ:™uô +ó…g¹°+f‚þ\ψÏMÒ>L°‚¢F3}öFÓ´A>ö©p]ÃR}‡‹¥ú•”›êWÕg*Üv‰†ïÎö1¬çðdÏijX¹øpe»`““DžØÆà(–£J2먊å.z.tÓe½f¦fÎzñ¾ÙÍäzj+ïý"}v¯~ºc߃´ã§T¿€\Sqš}Z?†Y#§Ì&ß»žštë§T=•„×À•E"g2ûqŸâ â1Ê$ˆçz™ ^‰0‘Kä¿Uù:mœf˨FÙ¹bU735Ûíf‚dÓç àÓŠ)©~ö©¥â$ûÖA+;oJÅònYl–t«µVÒ›Ý$zè^Ó›&rª¿H—p_öˆSœ~p÷˜?²±˜c¹¢LÄYËf+¦Dœ&¦D¶ÎÆamòÆÁ/6ÆXš“†}ñõ™ÃTùÑ+¦èi9»é5,[Ã\-5H“‚eê”TKÚüOxõ+•ÈÉw6Aœ1¾ì°Z¼hȱ8}K¤bþ “9‰R1ƽê3˜tf-=횺}4ØÜÑ3T +ÛèçµqÖ;å.¢…ÁŽ×úõ¸¥Åe¿®Å•Â\‹«òK}\å„KG}„ñY[i‹r·Õiç©„V°["n½tUNâV—¯ög©ò…Ç6åÊ;æxi$Æ=i`ÖR(jJM‡™ÂÍlL2T"éçe!¦LÁÒÂM5£õ+½¢5õ±?uÔQ«–šX)ïËà¬Øæ QÐGJ–½Ñ.û…ËÞØéɹ4È9›à!œ +r.“hW7ûÙ´˜aõ¬Ð[dRCyd$ñÑFˆ³2÷é jœ$ùihÅëM¿\öýRY¿tcØxj7ºðÒⶨO¬H|áêh×aU«îJ*—šâž‚˜b»¨`6Wç|¶.çv½¾´Jl=©øf÷ã·Þ⦂ˆbEheDþ@v„]sä»Vví¬
a[«Èì$¿0>ªµÝ¶ +éHOŽ—3Îl”÷D4sÐîÓý]Kì«uüêø»ªãN쮂÷P2äû©`k‘çmƒ’ÉPe¥U?.J¥xN“X²Ÿ7«eV¬”Bç]TÂêTsë€?Q“o‡<¯u4›»«6×½Û>gŽHÂ#Å™ãl¥Ü“ÞÃ\9QrÒ±Œ’JqU‹‰“5ô\Ó†[䥦P™u>Ž÷‚œŽ ¬Ü£L¥Ü‹TšõC8©uŸbe9¢P\ž9²B}ó”¹'™ü)f¥øÖ£Yä®–Ûàzpٙ׆Æf76ñTXæ5^XÌ$h~áL½¬d¾"˜4>J1iu"ÛwVÔ…’õN„ɸ¯ÞSq)Fʘêâû§BØúE¦ã‡ƒTnuq;S×bUd|QXò;a_”Ž‚¼aÎü©¢Þ¿p^Û«oîÚHá\O)1œùËìÝÝÅØaË°IÁª0“Fˤ“á‚AAòLg3Ab:N-§*UhU<ªPŽ¿©‚£&¨…¿,Q¢ØµÏ±{ÑBÛËÄÇŸ\YɆ¾ÍBb(†™žs‰/¢Ø³·Bc Vüé<ó:?Xq×ÝtËÅäÁŽ½Ÿ¦'6©¯Ì+ܼ˜‰÷‚µÉ³,ƒÊ•žºI:;¹ÀµMØR‹ZòýE×Ãé'k8é +ø(©´ xΑԬxA`ÀŒì§@fµ +Èù +PP±ä`¿ò®¤Æ~YçÞÇ[‰ÞX‰q•÷lâõ2À‰¡©^Qu"J‘:úÛüD8|ÒþÂûkµßíoÏ«òR€6ª§€vÍ1ÐÖpî£M| +h\òTRC e™ÐÄ9+Ä}ÿ;›ÎÇÚÝV{ŸÍ +Ø´ÖåŸÐ‹ÈŸü'Ý6Jø½û£ÿNßl¿¿¥Ûïö;2¡ÚÒ¢¨„Èm{ZÖ~Œ¶…S +ø£í±"9´çWýã”ÐÏ+ò‘u5 +
=é“Þ*Ú-kç mP8Ž[ßxÜ7Õ׬;d[ŽD_¤Ïwrž½í¯ðšq3?=?Ê•7T¦5²§OÅÕ$î6Ù¡59W'Ù‰~X”DZˢ1™×áð=VCtš¹røžî/‹«r¿ÈúAD®sèò›hÿ©æÓ§‘íítxä÷¶xZÅ|Å^ -?ë-c¼GúÎÌ^kdüÛ¤G“‰¾«yãØ)·ôÜføîÛ»aúi^*ÏŒX·þ2öéeéùÅ<Ùã6¾[ºÚÞi*c«}î\Êmý.õZýdßoÅ7GÙviÁIL¹Z[6¸NÕoÍh¬È^ešF2Þ8¬–ñá»ó@‡è ¤úË´Ç@xÈý"&Â{¿OÏ“v7(s¹Î¡F”:Ê‘¨~;XÃî»ÝŠÝÃnó1|ÿøWßSÔkØ8±®{zWÏѱkmé8HÞy|Õ‘ßñJÐÉ:?ÖUØCœÃø“YV£Í§JᢕÛúú´½"CÙW,ìŠuÛÖOÝEóѯlšÉgi×pS¥SÃF'¸’Ë^éÚ²¸åjôf+UýÊI«rû½Y ×ägï'åe;‡Î=ç4M¤ä(w¶Vî$…v)tµa©oWÅÇ|~,Zð.,¸N^*Øü3W@÷çyÞkÑ<„j,ŸÓ²æï—ø£˜nP,î /®ø"±±ÊºshÅëŽrµ»åNÌ@hN!øë²þ8ïJ}ë|úõ&ÿáQx/n `Ó¬€úO*ïU0.Ÿ)OìU=WTŒDŽ>³YÇèT>êèíÐËÔ’âò³ØÕnfhÖVñ}ÎVIõ`«p(Ž z‰?Ò¼£FZm%¨9µ²~äáºþ•* «v<Oléܲ:ÌçŠâ¤”£ëÚG="]Ú8ëhò4ô„y¦ÓÖñ‘ìÃ(s´›Véj« þHŸ§C$mà2.öB*N¿ë±13–%tÉ÷›%Ýfç’´5•K¢a¶•DoùóÇ;jÌŸÀÕýèÐpÅ(’’#z§g¹s_²‰³•/¦;i^M¨d@°“©Ð+ÚFÅTn=V^ÕüŽe±‡Aò½=Ünõ1KÚ±Jx-b›ÈiÊ)A\³ø²7"âô#cþXLƜԤãQyfÞ&4ƒùJ7k…plËö>‚V,4g‘÷·ðöNVÖoŠ<Ÿð9–êgK¸5*²HÒuvï¤Í¿ˆ„W¿ÓßJhNa¥q–5ùD|Ù©¤ãE£•‹ùƒJ!æ$ZNŒ{
êf0™wÌZz74%ô93sÞ7šùÜY?¯;ï/\ï”oœnð¹¤îºÖo4Z¿™E´~kPÔúmÛÕÂSõÅR8(äŠÛr"}ÉÛ’e-KdbÎ_‘xq’ºÇüÙõsb§«ŒN³f]ߦB8çÿ¥„Š¬ÑÌꢡIU?/³¦Þ)–“ºÁ4l-ÜZ¿²¨¨ýº©Ž÷j©ò\y_*{Åíî^ŠK +úØÙ²7Îudo²ç¦Uٛʰ)+µÀo°¹œ³þôƳ§€"&pù—q\^CC½´Ozç.îtC~ïµpý8jýòã¬Å¹w¨>vÄ‚ª£ºEª–l3ŠÛ¶xÅÖ‹pÖ§ aͽþÈ’sq?'ÏwUZN”®TLWgƒî÷¢?O"¢“ß«"Oç‹"Ï0pÆ΢O‘çhB¯Z6«‘cÙµºËM-± + {5•¶*Ü2%b—¬@Ác'{=i/çbÆY&ÖMZŽr/©hUP‰-Rô§cNt2+Yäñ[L–|F¨mG˜Q—?lÑÅÎ7{+¯Æ †;ÛIî|ÒšÜùLÜù‹Ütq¼µL}™µ¬ g(ñ2nÒQþ½vï®ojê,•Làr~•[Kk„_J¥*¶’J"ð%fx„k1q£ì¶"Âï…Ú|~¤üæÆe8émž)‚W]“ã.vIåºØ8É»g‘½5âmvô<6Ä3óœz3Îêq×:c=ëKÆzµ(Æ:cpSÀVÙÖ6b2™%žRLx½H½Wb_ê¤Q½*xpÞKëRηY°…á|&ÔÏ-þ`!ÈF}Éç™%ßÊgÖÜebn¸n:µçL®raoA÷Áj³Ïê5¿ÒÌóEIÌx‰3©ò8Ï Ö¢§·âŒÎÎ'jþ¶ï8•Ÿ6ª•æ•pŠŠÔÜZ6‹©û ˆÁå×T0}KhÃéý©ÌüäEZ¯úpn)V³ÌJh$çê”\^ÛÉc®'Sο\Îlã{g_s6Q½.™—øÚ0ã'{`RcíÊ ©Ì‹ž!m‚Îl·µï•?šYŠä:¹$ÔŽp-¶cQ•û1¢ªÄj„àŸ„°ÙãD•-iÙ*ûÊ[¯ÓÈŒsf7ôÚW'÷õC^bÜYâRÍ@hoK¾Ýi͸^]³÷ã}È&Ùõ™d{C&õhŒ¾pµ]z¦V§4>m,¨Ef¸¡ +øâ@Q‹SH®á G–Õ4C²—žJl§÷4QÍšB$¦#B”¬=Þhm0¼Ñ.¸¢¿\á‡Sì´o +M1¾åBg +ïJö‘OL™wé5fÐl¯O–Þ¡ +SºCúXØ&¹ü¹GT×Á€Ûá?èooÜè5ÞÄ +G\™·oع~À°sCä±N²Ãô÷>†SÆ…ñy>{?!£æF@,6nƒ÷6ì··½ ÖfÓ½K9“ ÇŒftlŠUÝ*‡ÈE#{%dtà;EfÃűÁ‚M¾´)“¾îGtöÑèS…‹ï6äƒ6!¾½j`¿áB;áëÔÑfÈ\€†¯ìíOÚo4^>3È“çTĪgÓHìëÀ}'¦Àvwg€e*,ÀbLBИ4ƒßÉ6•Ü‹é8w¹©po«ÂÎŒHN] …f¯sˆ4ovT¯Ì·-Li¯ºQËf¹OÑ—XänïQˇ]¼99ô±waF?˜ ýçrŠ<Kþ³ç
bèLãâG³Ÿ9`cW +ÂapI¹ChâB àrÚxâZx²2¸Ê\!? + ®õó +ð.œël¤NR¿uJ²ŠÍªÔ.Uøá;2{s5¾gÇüeÃاʒ&ûøŒÜgb×-ðã>6ĵ‚9º4äØÇ`Öò]@ Þìyˆ4í¢œ>@h‡ +àáU÷ˆ\QD^¯"ñZByQ€PÙX]³ÚsgJòj#ÿ {'ëÀ‚ùnCÏÛ•Å’ˆGìÁbúqtw'S\ÛW],F''È# ÇçyˆV8Ä„†'8%7€x•w€”× ‡På!œb€T›. 5{
H}’ó
@bí6Nâù- yÇxÙ¸L\žpQÚúGø6³‡}ûÈdê—€Z£¥5)Œñ¡€û×Íõ}(Õâ±)ÈIï )zÈDzÈ|ã³_9X9¿BŽwá(¡ŒB˜1^ + ÄL +ÂÊ”dE.·€¢Š( ßbçW›Õ³¹HïЊò½•üu/|û½?âÑÎÝcç‹T¬Mw;²š+m¥¤ùßš÷¨±]!¶ÓX@RºÙ”—€¼õրⷠ2ø P-Ô´òq/>ù/К&B¨›ŽŸÄZ7 +„c °õÑ°…X+,[š)ôº“ª½Ì‡CŽeí\ 6¶>ÑrœvO¨OÙï?JwDJ¢>=ù[JŽÁ‘ùÖçåÅT)ê€k¸qÀ-ÞÀYðÙEðž0†Ðú´ß¿…€ÔÀ7È$à^ðVux-Me³€Ÿ®ÂPó¤p% +÷¦K¥MœŠ€ÀØG¼t +ý©SD)Ò“?l>BòGOŽÄÛ…Ÿ +4c_ê½µêRzsè¶õ“ÎñÙßͶôŸöûÖ¹#^‘j’#6‘H>†>ªõŸŒ¿ÿòÝþ!4!Ú&-rÛ~n¿¶k§ +nÞ¬@È7 zŽn]ç¿ßäÒMû}¼³~ܲŽN¾2AG2µ¸@fÄgâó&^³Ud`¥;Ù])mF?Õ/üTœSÞÖ#xǬǾî[ƒ‰FïïGa¦ýeš¸D{w}á‘Z[ê'óÙ¼W*ÇrEÕ"94#ÞŠ²}tL»™è' ,Ó»™«é³+6Ó[ï¦
,9Lõóú8§’3ë±Î.Q¹ºµ,®wLºµaøÑ`¥ +g-Âz,5Ô²IºœøœE`¦ +Ü”¶÷ÊBaKcÆ‘š+³;•{¿qŠœê„I‚\U©2Yë’9b±i1bS6b“á<™Ø'øÐ#"Ûw/Ž9³¶-qo_#ǯÄn¥•ÐPÆ3^Û #öÞZôØĶÜfRK®É Ñ¢3nÁ9·i:Ô|°ìRù„ףȗ?úÂÉÕä0%KéÇ’,9±=ÉòåØì\„ØÜ9¨ËqB(\ËøžI
ðúæàõmÇåi@XVp9ÑXâr2‹¦»·ÀLÀu,%fE²·L=G=Y$À’oÛy—3Ÿ×óšU;2¢tæýhPcY§¨z§N®åfƒ,‹
’M[
b‹Z-N¨x1Q B¨£¾—•^uP\žx\vu8Vb'gRÄÚÕôý`ƒÂgᢣ=6WB{œâ¡fp¥§¦g÷éóÊÌÕÏR¹TÛ +Š²šs×[Êe‡ý€I‹é6UÑUཹ®÷?Žv
—Û²]'ª¨Z#„>SÃëg
oR—öBg†ZÞÂûˆµÓ±'¦£ +½zgíÕ“4&¯[ÈýœX"ÃÎå‰$ͺ^,áðÙbÒ>¬4WcÕ‚@k)„!žÅêÌÚðm:g5f&³^ž-cmjážaýɾȰmCr¡ZÃ÷}¾†Ëg;°Ö.a-LgIØ“ÑëÕC¨Á sÏ
ÐXö"Ã"ÉVSo
®n&aº +Òýë ¸’C“¦På’¨ºtÊöžÉlœQÌÆäE©oóô”é\x¢äs¡ÑòàýiÞh¬Ñ£ øˆ¡hÞ¯“å|¿Nl׬bÚ®ã{¯â_ÃNO¬†é%Ð@{—gy˜Ç62¼?HrÉOÁ»h«öO }9¿:‹s¢wEQ/Yð‚Dçó;@‡% #©P8¥h+D…æM6Úá–TÓûíS*?GAY2>ÛU¼Hñ¦=¢Úûl¯Ô"×7¿Ar ·ITÛÅ:!êVíÇžZÃÎ9Ž±:»Üˆ…¯Àm¬ÚÀV6=€žo€c¡s„ðxŒux$À¸F
`¼<‡p{« +=ªpáÚdywhÕobÛ©ãШb礩?ù:×°ðU`Éq`…]ÂΓÖ4fšÁ`-ØØ6QRÖðp·´X—‡WÐ}š +àL^*k$ +øŒ¶Ÿ[ø?ÿXåü¢ð…cM¥‡ïk–OrŠø¤ +WT sÒ$ÁÀ•x•}öl—7ÊvT÷³«.m_¬BOs5—ÓWÚ”¦îússçL³¶±>]¶ß_«38]N¢%õ`jŽb&ì¹çr&Q\Œ²=®»Ëö%¤ ¶âJÑ1¸\iyul¼[WR¶ûøô`¾v]gS
¥¢5š5‰ôZþ)¼ÀnìSÝL|ëߧŸYã¡žáj`ÔdPtl¯º[¼ÝÊÓùÈyHz¸ƒ]ºŠ,z«”²<;Rn-‰h×wŽ§õ–|ßA™mäÝ$?ÊîLµsÔƒÔêÓµïç†qW8üÚ¿«ü…Gu†udp0z4ùO1
Ôx5lô²»;°ž¥...!EŸØ®Ã˧ª° YšX4
_ö§¼v,2}X&wñ]cs +>"rÇÇð<þÆ*±ûßÔñï®"¼¿ÿMÿî*~áÿ®Žÿew–´Éž‚cï}æIÏÙ=j/xõ+òò8Û´æ·Ì|ëY\Ugg!í.–=Y;7xWŽ·r‰i–íB„ÉÄ‚GCv¨n²üß_øïÏÿC¢æÏòÃIóÿ‰þ7+ö?$úhÂÖÿgþ×òÏ5üßÚúÿoš_ø?ÜðýZþãz±òŸmøŸkù‡þïjý¿@óÿ‡þ/]ËßSOØúÿlÃG4¿ð¸áÿ†Öÿ«õüÂÿá†ÿÿ]Ëßx#Á³ü³
Ñ„s˜¶áÿ³ÖÿoÕóÿ‡þÿq-÷ôo)ý—4á“ÿŸmøÿqëïã4sªOÈÖ…õ ¦W‹ùíîCsú‹æö͸…f¶þ¤l\ ÑDe™Õ{'bx<LÈ¡ +tÿ6xÿ1|áúâCÔ>6gÊ
²í”v¹ß®+AEX¶zóÆüV™ogï[æ
‰>h—V-jÂÞ6ĸòÊ£=GA† 6ÔÔ60ë=×.×/Ÿ#n«›>töáåxd‹Åà½úxð×U´õ!:mÌãûÖfæï)Ñ™Éú¢ÂR¦pú9IÀq¨ºG†Z± +Ý©ú yöì ùø +K-;nxÏBÆŸÙ ù5%ªú›f5ÑÅàXÙ@q0l=fãF{öóÓ½7ž4n]ì‰^ÿøÂìT+½³vñ`? W© +Ü<a"µÙ}§ÄuqŸøj‹‰Ñ{x +°Ç gU`»ô·×©—:õö]¼ÆmÛkÆõ[•E|ý7ÂýØ檉d€oë +±l—oÞÆ´q*ßþ{ð…ÿ…ƒ6ˇߒ×ÕbSËêºVÏæ ?ÍÏ°0[u‹³ØbLÑÓ螃0ö<÷“Ý̾‡Rk¿³ðbØÇÊV0kU3ÍiS~“ㆮF7|ᦈ››R¬µð+*§.Ïÿ›¶ó\wÙºõè"P\Ê9çH9gI @( Ýÿ)d÷öþ¼í>ËíöŸ]¬~ô2'UƒYX–$YÎ\‹RÆÍíx;gIÜٶά¿Çú±Tj¤e-BOîÔýš{IøŽäeÇ<º'âBÁýÄ µþ’X?hZÛAU5+7¥¦>HH’æ2Wámt¶â0{ƃ'2!,
×Ï”8™[dZ8Æ°&â»Ë™ÇPgà {¿B!ÔÉ%áGEúƒþþ¸i·„¦YM™ªNŽ*5yª4%¡Ô +Kì…vç“p):,‡=¸rÖ/¨{‹ÞK8ÜHsVR”¨ÍÀ¯ ×M‘€°»‡ûÿÛbàÙ~3é侯ªü¯ŠEaÛ³j“ Çæ(%Å‘JµIÈ7=?¹SÀ¸½Ò(r$rµÆ{¤[¬à07ñÝË8`?’ôÓCŸ½\[ê3}ÒäyÏ«rÄk¶£’ú$UBî‘û¾!Œ~DŒ0j=i_„5ÃŽJhÜr4`Ü,÷0§V0x0Ïc;Ѹ¡ÿPÀ¹üìÊcp[Ú-]¨4-Ï‹â +Ÿ·°ÝXˆ#ÿ¶ÜØö¾ÝIŒÇîm2@üU¹â˜Vü^Ñë¹Óöý¬¢¶o_a³Ù—ÌS‹›g_Wi,Ò¨¨õ‹˜6lOФ',¨ÕEÈ¥{WÞÄ~oÆ¿“ô£ÖOÈ7ÐO`Æ ßý„üø\~ ô˜`Ìÿ» ŸÀsä?›øœý_'ÈþŸMüÏåßNüüÊŸMüÌ’þlâÿIöÿa<Á¨ïÏ&þÎå$þù{Ë_Š'xîÿÙÄÿbö'ž1è'þ¿ÏåÏ%þ÷–?‰gŠ0ã_1;õ7fõƒ´ý¢¤þ_Ðû@¯ÿõ½Á_ +âY¬úòÓû +(„Ç ëó¾}Pa㯨ÖÉü µ +ºsSw +©(bÊ‚þ_’“8\Õë“<ǚމ߀kÌ*¬Ûq|$ºbþpÅ8̆e–Ø/OL·’w¨1Ô3}$ËûM¦/âpDƒhõûc +¹Ž3$Ò¡í=̆ñSûÛãßÉQ™Ê'1¼Ðö0µÊ¤lbo}TwÑxp-/wÌ™âé°’2èxÜ°ÈY¿ùɽ#Ÿ‘ÅÎä0¢0…6ý‰ÐÅLd5^öpßUñßp.ÿÙ?èì½xœÌþ¨ +PêÇ>`yš]¸F“oÒ!µZÒñ%BRR\’¿¸ŒËu }qÏÇ$ Ô8må6BoºÒMå¿X_Eüß˲äÜ!¯·k;¨Åuò#µâüÔòÆ0ñû±F¥¬û”T'
œœ9CŽ0r
i¿QL¯;4VŸ<H”`×ÎéŽÇ{˜c2(<襰Ȼÿ‰Åÿï½Å<ÝÖiiQ£‘ÝÄÅíiß¡SEærl‚X!TÈ{ævXäþ0Î +8RV§>HÐ'÷‰Üj"Žt ƒÃÖ‡LƒãÕ<º½ÔïKt.`cÔ÷É´N®k˜<wê3”ÄqiÌp<5Ñ0¿Nb{mbû +;Ã8µEÛÓÚéõý-ÌÜá
·—Û4ïnw“l}»K™ÅÝVÅ·1è½ùmј2Uù
ʆÏVHJëî[c´ß[¼ ‰JÄÇA5„Såfa«VqcÍ7åÍǾ^YïN©ÚꜶk+T7ê«Ú€o,ý8ÙXz²µÜ“Èg$}âÂÊà ÂJ˜†¼½ºÑ›ãì9%e”Rû¹^Í
ß@–z±KÚ +@¡ƒ©/?œ«+÷-؉AÒ«Ør$Éœ¥ah;Rb%¹¢àž(™«8™ò¡ róûïHúmÐO`‚ßï‚~Ì‘ôSûmÐO`‚ìÿÙÄ¿1£ìÿÑÄ*bÿN<ÁùÏ&þÿw.ÿâ²ÿgÿÆŒ²ÿGÿ{Ùÿ¥x‚ìÿÙÄÿ͹üÛ=(ÈþŸL|&+|oƒn4P]‡ŒR‘ U'M˜*©.ÊÍ8^•îqz‘9íêI/v¥‘Z<KÉÌå,ʸꊓ +þ/Iú®á@EÏ&Æ¥¾‚ö< +ãÞ_][ôHcDÉ_Ä4nøß½Kj‡Üq=Ùª¹¿0ÞzçÿŽ„Õ²
0+E€éN"̃ + +ƒú‹%ýÕ U.DT{¸ß‰‰-±ÉóÏHt.?9ä\“vùš¬•Ìëh±¨_…ª8’°µÔ…-9î°då¶cºò£¹shP¢Ä›„.Üåýf† +x%‘d°Ú]¤bÚ|ÍH„Wöðƒq¸ð8äñÝ8Aþ–Ø}|˜ó%Å ‹ÞJƒô8Çòz‡šeÛ]¤MÓ“%ÕŠJM¶"9c'ÊÞºš<óSÃȹŒ$rõ—8Bc~Ü*8<èÅ¿Z„ㆄ¼Dì?û¿$GòR§WxX»na–:I̤§&òä–íìë'jÒ—ëä¼èÌcþDÁyùÊÒDž(ˆ¸]aYÌmô)ôRzhµö‘Õ¸¬F‹c •·Õh½8úYy;ŠÿÓzÐûrü˜™N¦GÏ›|ðÍÆbLe–6ºä‰;û]GNû ŽÀŒÛô—¢K +«Ë5%ÓI¹-Îûwå%èaÂ1`.±¨òÝIÙ +ˆ¨™AG¬MkZ›×s¨Ù½F˜Å(¹öð}m»FofOG»³öyà£"òhìºðó‘ëÁ£Úu¸›¦°Áb–ÃíüÙ‚ÇWq´1›™ñfu¼6…;^ÓF$‡é7‰Aß5|BŒ³q¿à¡9~†¡µ+^Úãð«ƒ>.©,_'ÄNkTÍÝ|Ú¸mó–F›"‚¥Ö•Q=½ÂèTféŸíì’Xª¹e+ÎäW‰üXÐíUaѹϋóÚ+–IbÐw
zkGÝä,o2²‰–N¤0Vè7 ILwËkˆnNò–[׈»º¤„µ±`gǹ0¸žç‰èÎ"ÿyõ——©ê‚éœè‚ß4[¬Ü&†
F¶«yæ $ÿú +õùÈá–ƒl?,O«&¸÷'—vüt+
c£Q6=QsÇÙ£VW³¾JðìYmý³Bݯ¶Òé+Ž|7¶Ì¦ê'™±+ŽÜ›gÎr¯šò¤ÐŒú?¤8u¸}0ù¿
/?ýfúmÐOÈŸË?ý&˜ïÿ.è'0cÐNü/fÿwâƒþpâÿû\þ\âߘàWþlâߘ`Žügÿùìÿv<Aöÿlâ¿ž`œlÂÊÀŽ@Áp®<-Hª¼NÌ&ß0Šs€>ï +ݯ Rþyä»noÚìL•JUæ3ʼ¼{HRß¿J©Ö2Óî%Z™²8"Þ<·oüzÐO°hO¾3kߣîÜëDõãgë + ÜFñtí(ûoÐcû? ‡ºQJiÛ/v(þ**U¬FÕ¶Ð+òmCiRóïâì6» ºÞxk·½ñXûÅ•'¹Ól.®Ô=̹äór:’£¶ÆcïͯËWPî®Õaéi +Ÿ0ûAëÿ-t +ÂúðùŒcý<h#š!Eõ6ÏnEH„ïÅòï5è…15ÊÊ'"«_¿:¡û¤ TÆБ€»H0Ÿ¹iVNß$}×ð÷òè
ìñ´§ù‹Cêq|Õâã”NJÙé8œd©X:‰¹Ç:zûö^ƒÞ„SÝßö2\û¸"Gº$ U¾ó¸ +«™8ÀtÛ +ÒVA*™Š2`Y®<%ó—ÇÏÌö†×F»"æÑû¶Ï°‹¨èr‡¶§å
ÂèÉ-¾¬
<lak8~Û¬w2Xï&ÕÖz«î3k±y!\o3ÇËæÊqŠ’·S2˜´£Objr¶ö9ævé’›ÑiŒ€>ù™l¨ÈÀm_a1ègàq§SÞ¥Si»Lq•Íú9¨l>öÚzwŠW×åéå]~Y_¡œÚøR~é]ðær¿]µ~*Q½åß·¬bÕ;äk^E}Î’+žª7ÔG¡ZÃÛ…ÓÏ/›Ý"œS[ó817ÇeÁ]#*å¯ð}ÿº$§¯Û²õ¸†1hÁÔõç¢{àãóp‚Çç<„$çvžšÇû“ôLôÛ™ÙxSÍþC1ˆz~éˆi¡žJÍ(«»tñëÆ) ²‘ìîÌÜr¹-ºléfIÏenÑ?uÄùˆ{)3ù⛳4Ä™S%ŽÓ¬?;MLbvž¬‹]wR°[Þ¤ ¶.ã]¶žbã—¿ÿCÑ[éþQ,)ƒ;½¸Žá}ÓÂttÞáœô*oË„2Zï×up-ž“öz¦žvë骑ƒ'[èŒíGŒ+˜¹©
7˜™0ª÷ÆÒÐ÷ºÊØ·´!±îÃÖG÷0¸*õÓßKúé¡°¼…f@VZX.™¥°ÄäGл?3½Û÷¹‘¥p8¢ŸÌ»¬W>ž–vVžŽV3X[õý“ºŸ¦jC;Á˜¿Z¶ryÑ@,ÂQÈ1ì*dqã)d +»*Äå®Ð½ýº|ÃŒÆÉ¿ ú ÌôÛ ŸÀŒ’ßýÒÏå_LüŒùÿlâߘ û6ñ±1ñoLÐýÙÄÿø\ +ÃÝ·Ä oûŸÀx’+5,OxçIÞóõÍ3F2À$Æ=ÓˆW·:l:¼^! SÃSUô–~¨½
fG¹–^¶B-[¾ofvä,a*®ÜËf|¹û¬DŒîMP+_AYû³ÕŽþµ–¥, + +§Û¦Û1|êYÍÝuâÙË®Ú*,\…†^Ž|÷1[f[Gî1ù³†aô6_]‰¥BÀ8ñùU r¸âÓ<üºü7æÖycR÷²»Ç oõ±Ïn +ZNCÔ-¨Ž®ÞjÄL±Õ2Wqh#U‡Ö\1¡ibɪ—/à~¡ƒiäƒûg¹/ÂgI@RQqµêFåÊ8™JO~5Iø\)+ØŒ{Zti¿$1轌…¿@I/M_A×lötó-3oÝ—:Òs(Íj/7ÈQÛ=èU/û2§=üÈ÷¾.O¢ªj¨³½ñ+#%Ö~².ã%§'šts&u¯?Ô_—¿0·òWÌrij7˜{6½I|ufþõ\èHä3º/HUƒbá¬Ü«Ð]éö×/ÕËãâ *\>D5Ë«@ÈróëTYŸÁ¯}‡ns/‹êN:)”Då;³×´~'€1; Ë<Š§ó@!Ï^OMŸîµAÝ,äî3aœ½æÕ²ŠŒKŽrŸ—BùYÂ/ßí¹‰ŠÝò}¨FÎrïΕn^øÍT&Ÿ’n’#ˆÓyË¿.ÑHéRúT +Š_Aç‹›gV™Ó½ßš…þsª;Å' +Vn5ïÆ î¬ÖºÛ¹±¹*žäT5ÖrçPéûeâ\60gQ‰´*Bõ*BUÇ.B +ù#BC!®òS‰ÜÑŸŒI]«wÏ]¸öúâ/.•—}=Ÿ3–®H
³hØsÝkÖ)YgUÁzLÏ|ùöz0×YʧFÈÝŠ¾o¹ôå¨Ô’ƒïÎížGD†û£Ì îT¸'‡ÌP®öë« žu^~gÿYËT‰¸]‹¨çëÜ,tÈf3uPnÙ<Z³±2D¨p˜–ÎMYÖ7¹Ý¿'2½Ô¨ÞRˆÓ0Ë#Ôn4í1»d‘vÉÎÅÚ%+)0¯Ü
®ñë +v §¯Òx½l +ņոF1¿`˜Â… ¹‡+Ññ¼mº•Pðßd¿Ö["t«¸ÿRe9Nûíô1ÜoÓú–Þ,ó¿É]ý×ö +áêþt„Èed¿Ô[v[-TnhT"‰nŠÄ¶é²ßèIoòyIˆAïÍ/IXáæ +Ú‰åÖ¡¥&,Vß
÷»¹\Å&;Âí«¹Ã‘™I`.Ž’èeWŽê-O8ÒµÄè+ßJ-Çfݪ…Ûfv.¾1Êîþ×åÊ‹Æç$úᆅ¤ë6Ð +”â÷}„ÝuF°°xMvr‹í d6Þνúxc~ÄÇ›•|o +SwºÞêêt]0³"á‹·Ä oûŸû¾¯·;9Á/zÓSM4?ç¤#².±CÓ§ëkŽQÖE„•O†
NQèa2Ëtv›oé¹M1;˯áQ½°:ÓñUíl—þR--›²´¸N¶å
ª‹;©ÍÙW»ñY‰AßöO#ˆôl6DÊÑ'šòæY±4Ëår©1”?ARý¼Ë¹8½ý˜µµc=«}²—íSÙ^0Çyþ¬[Þ|¸¥ýy‚Ùd1ãäYê5¸OU±NçJ8ÍØù×Ä@J©_—Ãbœµbj*9ûàúRG!áD4ßLjYAÒ…äp{lW›jã†Z—ö~10Ùý<U©‘³Ù0ÉNuÒ¦9G—'ÖBT'"¬O™>ÞÙs\Fº‡Ñ9[?P¡èŒj£ŠÿMbÐw
?sÇS¦2¾No³äi˜ÂáÄDÒ|:¾=-NÕMÍÖ§KölOç2Z˜MÍîz69j«4¶ï×í¸Z³>&ÐQ#EÃSC²ºd†-sÌ
në±0`’]iÐUºj?춌_’ôÞ(â|Àñ/“§QÃ;vv†¤9Œ‹ãÚGš¯eÿ!eæiô19ÁleŒ¦Q“}u†”ï¬Jý1íûå¼?j.WýÄi¼éɳî.ÍëMÂÁ¾ñcº«5Æü¯KXš×ja‰…˜°´X'ÂâK˜‡ÅÍѺùJ%ƒ.I*ŸOÓæðtc»ÃH¿1¦áŠñÑJz9#4gµ8hHÐ9jˆ\;jÕrú¤UIG«h¯³êö¯®êÖÕÍ'oª/?Â>Ý¿ ˜½þ߆É߃~3ý6è'$rô˜1è·A?ƒþpâ?•ý'ž û6ña éÔ£ìkÙt 쀚æÍ?ÕS—¤Ÿ-ŸáNmx¢«Ëí!‰h3Ç®4ýÔÊõr×<i¾>hh¢§¹3yR]Ö·Uwá¿1}Õ'oQöó¹P¹ý‡ÜÝ/¿$oP€ Ña ]ÇÃRN^„EÄ“ óI_±¥s%ìÇ ãì¯Yž§M®ªêåÓ󤣈¢«5À“ËÕ{3:W[Åû–£â9ËUë¢~QëëOá ⳸÷#‰ªmr(,1£FXr²èü@£Ä‹ÞáFœŠ _ñžçJ'Ý?rûÌÊJ_Êøx•4½’ÊÚÚ9Šg1=ªU3wü£Š£ÖI¿DG¹lhO¹´¸ +jI"PÏ{Ä“]xöMxÄ“ü¨Ì~`¶¯íã +ªm#Pmþ´Y~ú*Z(8îöÑ:Œpf.¥ö^‡…@ÒÜ"tÔê]ï¬ú«Ùõ¶BÕ8ý/^=3/º2Sí‚8î0Ï]>¯%Ž¬½—
ÆUPí—äf*}ÁŒ²¿0¨oäº @ÙlÎq¥Gã8É™'«˜{…´:“ðTb…ž¿Øõíñvê)ôâ¾Ä2¡‘ªgî€'Q&ƒÃÑúJšÄËò/IXºí[ +ó|ûÂm{¦ÍV?vÓèöuº=L+sxI/1軆°œbÛa¹T¥þ‰/åž ñfÿákP5s®âe +ÅúÀ\qÃn߬æ媆¾ÂàÚUæé‹4²+‘³¼
¸}¼ÒA7w¤ØøÛOærèp2!÷ ‘˜¼`Ì^£ÍgåAAâKý§yæëÛº¬ 3 +OKGaÓêšfg»ÒIôcš‡u5 &…ÍBO9~þ¸‹3¤rå×úðISpÙ'…-g2ºT ÈH{M‹ûÅx ìs©.÷ ‰AßöÃrQî„åv•—) @Yg²ÿÔï{»L—dê|þ JÇWmÓ¶rui”óB¯MHM½æOaÕQ\’§DRX1H’vBÙê ûûÅkláV±¨âk»(ãkµ(âó<ôòÜ/ÉÿbA<9HA÷fQ¸^”ô!å–=<ö¤kÛÒçù¹—U\?»U#Ž•‹ÚåªiqñP2lã¡ÞöÆE´ñRŽ0øÖ:b•^FGÏÆMFϸ+ ç•Ëae>dßæbÿÙÿ{ Ë-³–'m +dŸ šây.h÷½åAR.ÌBy›ÉL›µ¯LÌmo‰™% úd%t.Ž¸¤´àýÁKj4ŽšËˆHÛ½òÙrrx‹üO[Aˆ£!"~`ˆ´¹ÏJzoþm:ó°œ.)w¸ãu=îmëLÁ¡rÙÆ)Y9NÍS¾†+„3bþˆªœ›º:ÝÍœ‰…2•ß¥–;r;á?‚ùþSIwÏòA‡{eC™²*·ŽÁÿ’„å±ÓËÛˆg›˜Ž0;UéQO7Àù:¸ /ìÜZØjg·ÆXíð™pÊW·1Ž¡OuƒIÒÚ5¹¶âÄnD
‰íTߊÛé9<neýf혡í†KFÜñK’ÿ&à\þoÃ$,o¼´
âÙfžà¶æÑ.¬àª{ëqíзGÎ~®êe½…Œ«âz6ê³—[kM‡Ô…Œ¾Ö88(d¦VUÞëºßãn ø6Í
ÉÈV6¹‹mn‡ƒ±….’ºHñ—$z—´q@âÁdŸ AöŸó°R˜ÓFƒ4ƒ4 9vm¬ã’n{®YÛ´è᎜Q©ÃûòÉüè.`˜œ¦"ƒÛ‰øÛÎ:8¾Ñ9†y;Šª¸ÞlúzS2À(¶Í+¿$a™ð +0)hV¿Ž–unw›àWÌó,<)“@t¸KÜ|Ñ#ܨóK{D¬PTÒø¤p»+³è¥“$Þk¹ßÞâV9ÿ±Ìú?+R•Œªúwƒ~ÔúM² +¾Ò/IXöŸ÷Û„Õ>,_Œè38ò¿éå2‡µ[V%¬ +Ù¥iyQc‰m¹uÂ1ÄI` g/£AHõÐNb1…Ÿèc +'Æôt«>ëÓm¶™šm +ec¶Þbüb]Ê3k1ûÀïVÈÖÀWÕvÈü’„•<Ô +õ-Ľ]G‹Õ帘ŸNÚ0] ÜÙ1©a DŒ(i#o®Ž„ + |Á"5*ï¦/¿º]ØDm³êõõŽºÕWÎÙh®jy¦½Üo‘î"І½µ˜çwk8™³›íêG9Š?9V–ÕnXÁðè£-¶q‚²õ¥î⎈ +Tƒ™¶òS)îÖX7?Æ‘äÃï´áä¸Ëvz·Ívl>Ö³z%AKâì&·¼-º<3çØIvözµó3‘hgãbµ2UBm:«6:¿$W¾™+†•Gô]…£"OJzÛc{€±ç2Jmœ'P½×ÅzôÇVû]x¦‘Ô.Ïå•_t´%%ìÌE¿’;ÌGqë8“Ûœ3ƒÐ;[š·‚ÉŠÉß&…jê1>xÙxTo¹Î¦F6È/‰}ÏKÎIn¡Þ::wñäè]@˜Ô,]b}O«ÁZmwÅ
¸ÆÖ^"Ė̶ŠÍ¥&ŠÍfÆÇWÎäÄrtvRÌÑüø$bÒ¸|›)£32ÐFXuljf÷8ôGu{ØT*îàÚ?•¨Þò[+aéÍsY— +{úÌ(YeF`K¡¯}φ—ñWr[¶ôúêºbžÎû`8-„ëѤ4gãªvð—µ-nƒ†mÞ
îU0æôFc¢ÿLÎè>OØ~<l = o)¿$ºÇê¼”§n,#Öæ`þ‘&úƒœ“P~ƒköòA‰×ùJ=¦›61ÆehDtÒ…!Ý¿VÜØjô_ªÒî‹=±ßOîáAOùØŒ{Se6í¥gËeWg›îì:fÐÅbPg½ë’¿$Òâ1„™çþˆ +GWßÝÝÜÙ…:vÉu6õËGûDÚå6ÜvëíòýÒnÙ[¯…õÃQ«Ï,þ^bÐw
áÇáz‹Ç(,6+,¦råðƒé£áGowºŸ“ƒdp¿o‹þ´âtÝ‚Þœ9ˆÊíÆG9Þ¸ÃþNæäa€V™C<WàqÓb•<9Š•¤š©TLÓT2žmNÀ5§t5Çû]ÿà¨ËgåG˜ çÿ]ÐO`‚Ùëï‚~3ý6è'àþû\þHâߘQöÿÅÄ_^÷°8JÌ‘v‹År5üP§Ø;û‚sG¯ÝdÀÞ‘’Ÿ®x½óQï,loNïN䩈{u‰<¡ cIµ’`¥Fh*§£bÎfšn¦]Ö4ôu4ô¡ìzã‹À{hp}¨u(UBF›OHXL¤aq‡Å½w +‹f-ü°×{ ²sÇ>‰ ﬊žž9öÎ;½¿²÷s9²•8ƒü…¡-‰mó¦ºsv=*†‘¡4c‰ïL#_XuK^8ºE¡ÝÚÉ¡/×…@N¾ÜmΟ¨ÚlÂb!@÷åIXîvX÷ëáÇ
%€ÈöÍ’Á +€ +øÏçáîÚZðœ›óVM§âàåÜðöÆ+KÑ
ÂÌÝç’·²Ñ»¤sF>iÕcí¨â¬ÿ~›à+-†~ˆã³áò+¨q +•ÏÛO›q•…à>dŠ‘ù,9rÈZ™è+Ìwƒ~Ôú–°h`ɯ µ*ˆ§½ +©(WÐh½t¿ö›ã´¿Ø2•3 +km»“®-ruƒš+ìÀê6»24¼Øð£Zërú, ٸǯZOitk&ÅÎ2ÉßL,8žkG@ÌìµÖ’ú¬|Å챫·Ÿ\õ£W!ýã6,«êÃ9OîWÖÃR¾^wËnÙjtìëJ^GRµkŒ7vŒ¥y5ÆWºò4ôø¦2é9¼*1Ím¤½¶pûE±"¶ÏÚ-7‘ + ¤þi ‹.zƒ¸ˆ§_B½MXN·•°¼#o·Îí +]f³.õyÅÛu.ãùâî«ä1Åšµ‚œ@k:¡/˜EîDßzÇÃ^_`G|mgdücž°S6ÅaÇgŠ’¡±£—¡€äÉIúQëWй¼ UÏ×.zùy_‡åNO +ËG)¸ÝâT0~ú¿Ðån5À¶Îµã˧$Ëyº7ž:ÒÌ+Xl“ +£ï[šõ‡„6æ!UFüÀÐzÂæÐZ`3híhÓ(–¸P(¸Äg%,†ÀDÌMXZ´Ïïìïèý¹ËÔ\+
Û¿“3uJûêE»›S×M™¸ÓC¦ig.¦"&,ƒ¯b{•T¡‰€5‚Û%§®¾žÁ³4<KÜÕIsE¾>øèßo¥% +!:ùY KÀ1¸
U
ËåÄ<,[6¬ð¡s'¯P"˜JÇ¢Wýä°h³Jb‹RöˆÊûM?×"Kä*‡t[]|£/‡ÄÚ"æF#Ie+]pa7¬3üŽ¯ãÌ.4Ü]’äO%}×–*Vú+(Ú ,[Š +m§aeÈPÆðb^“uÞŒ»„-ì;5«ŒÖÇêhN„J¯=£_U}MfI¾zHEŸ6ŒV=gʶ¶.¿:9†±6爐Y@[aµWìV"·ô.NÎÉÏÊWLÜ9%vx׊ïow4†a%tñ«Àm9ö«º´‹‰õ¼:BG%¡ZìU˜xêÔ"sƒÃw6Ð +
¦6»íìxA7y̦Vvû .Ýœ¤¯N}DZ¯s~“e'lÚ¨÷9ýY K³k6,Ù +[eSÎCÇÕ¾ºw–múÛ?ã¢?ßáÛl’„ÓyªÆc£A“<þÌÍBe¼¹6Zã"½ì.¿ü¬„eB +œ£j£mbLíí‚w²»™J/và[Å_Èds?c;ÇÑãÊãG³ŒVž@W»X_ÖŽÓݺ;è„ÝkŸkÔý~0I}VÀÌBJµ®°†ou¡6Ã.´Þä–{ᲨØ:;kâ'7X‘¨¬:×bg‘$‘þÔJšýÉ_ŒÆèôc2Ú×γ!Uä–ƒûÛ˜'ŒôŸÍÞÂ-0ßï'*¶'±7Ô®*¬î¼3v>+‡ùl$*Â3Eñ^œ¤ÿioº¨²ô{_Á¼E±¡Ul°QìE°AQRïÿ¤µ÷ë9kìªg½ïùòƒIÍQóoddfDd’ZyBt£Ðc&‡?RFÈp
ÇdêJú}>Ý»Nï†ñà#RB¶/"THÖN‘ÿì2/¢ZÛ
G4×%Æ<ët»-Vb‡ñšBŸ>ØC(¬J_È®I+Nwñ~¿=øvïª,oÙpdåÊ“±^wPwL½ _z;ˆ§‚$eÖs¹3"ÒQ«.fM‹§‚ùlx1¸.¾ó~¶Oj¶7fTßé‹ÙÒczô¦É—ših¼œoP¯Gk³\7ÄM£ï—Ü?ÅŠT;íÄB„¤;¥ÅT;/÷,“.ñèÛ4›tûùIJ&Ÿ|3žÛ%(¯Ûàvƒ<Ç:JªÃŒ¨cŸ¾G…&Ÿ¡qK³ÌEÝhÍ×µxgîkVwîÖØüæúƒT“ã1ª +ø>¦>çë‡Z+¯Ü?À9à\23 +eÚèÛúöÇøQ« +Íjx,ø®‘=_íiÃë4S_窟-Y6OÉ„†óˉ_ãïS,½Oúp‹¼/w÷“qÙÆõ»áoÅÝZLÝ×ÿ +äÇK§ $æ3è+}“÷%ÑŸ2ùªã”Ñž¶‹®‘S|ðÞwýWáf|•pwÖý(fóYaa¾‘ÏÜlJ—™™¦<ÓØD;ãàß2·bñß2GÈšrò}äõ«:šÐK@2ó0¡ú:'|¡|ß‚1÷N0ášãó»Dn³Ÿí#¼nmVhÖ^¡©Þa~³&»ÙóQX™K?Z˜iÞ³ŒöÚ2
dd™ú¡8ÖõÞµ?ýA~]þ@È62Ïýlsʀݧ…ò³Ê÷ä–ï&ÁöÛÓ- ¬t.N^Ò=Ï^˜Û8`;WKWa–äºCÙßãPÙd³
ÅVÖ/Õš±”õÝm¼4c4×¥lw¦£{Ñœº=VŸÑ²QýÇøŽ–æ +}ŒIPÌ0&tÎRJ“U$…n§sPÆÿjhû÷£]à±ð>uÿ!íS{õÈJ›BvíëLíÎ@ZÞáU»TʶF6¿»áYS¬§ p i$‘ú…É?ÀdŽJÐ5[3PüÔ^ tØ~‹wµ(§¿ù>(ëåKüNíŸwt-ån“°S½¬^‚pô©Vs'¬{ÍåE´kÑxú@·&Õã²?f¥5¶ì¹©Ö“®äqª¹½¦FÌI›PÊí‹ûä~¿îÿ +ƒé^l?wkò¡{óÏ°ìç·Mü(Vz¯•Q¶ßÀ–…ÕÊÝLç:;t.·¥Ý~ÙAXöÊnª‹L»Éö¥öbü!KuÜþÀ6Ï@{?µ½åGž6Ç×#ÂKX;‡ÕãhèBm·—ocÝšk¾~kãò*9“ļxÊ:Ĩ$Âþ}WH¾‡E¦»â¨„vºZn÷[5¾e6ŠH€ÛRt—²Õî
ÐIGtÞJgmŸ‡Ãòßž‚â€|‚â›øõ2þ=µ~ýȉ¥ÙñÓ£±Œ»ž¹¬¯¦·ƒ4o«ã‰q½O0 —Š3OmFŠC»ƒÚ[9KœÐb›Ã(îôŠÅwsÓyQÎàåÖ•¥¹–š?ÉÍ[+»h‘çå¬užÑq°ÅÇÿ +z‚Û¢ôFЬ‹av¬¤¦Ù,ð‹\¸7y¾ÛUùÅ8Xý7ü { +Þ‹9w +ÍÀ¹ã~°uj¹ü’qÞ¦%=É“õûïɺ~À¯C1£És×ë¿‚c¯·åÓRÇÍKÃv©Ëbù³ž´ª×‘ñƒ4®°ø¾j¾…¨º¼0(_ù.ÆœØ饸lÎ,p™äYcwËró +$”&5ÑjÕñ¦19Ynƒ’×—ßâùëþ¨R˜º‘ø×`ñÔ's¦—Sæâ§ÔœÍ”dÒu¸óÀº½nv0j_ÒŠÌ¡ Å‘Kþ³KvÜnàYG±Îß:hÀ÷þÓÝ×B“/9õ-‚æêÑZÆë†8¯Öâýœ©Y½c«Æ¢÷~-äÇÿ +7¿7…Å98rRpU™Ä?Í'ØÑmw[)÷þ +{s°¶øŸ*8Œ~¾Ÿå¬Pá$ž=¾¿H¿’Ž#âŒ=fS‰¼/:T=zk9.Z¥2í(]záf~…íJ4ýî0›‡Y8¡Ýö
%ð‹qævz¾ª'wsQ÷Ž›zœÁÆ_þ ¿.¿Àê<€eKPès/ìd]^ƒÙ&Þ4:ðγ îÀKFŽñx~-×/üÁL‡•;Ïôµ +‰n‹N;lÏwƒÛ>´Ç·^ËÖo=8|Þòל`!žÍM×÷Òõ¹{Déí¡´Ú{õSŸÿ + ® ö“5 ÔÅ-!3ÔûY3Õ܃#¥{j0i„;;×¼IO«ó]KÒÙ¶Š¿´Ìή>^Þ]Õzoõzs\-t÷T¡°Ù2¬¶X¯ÎysÕY§«¿Ôþ€T(s¸¿|[ßI€ß¢NwøÛ’UPlLF =@<Ý QÞvúY¯^Ñ·FÉh3Õé0/}š'1ÿRoÈ>YÎë× ö´/!“÷Îô&ÿ8¢Éë¼ÃÎ/›ÅM´W;äd.¥HžÚ£lMµ‰}éÀ\szºÌ›W +6ÀÏEÂ~7±Â”9ú7òy/@ñŽ_AqSO?ï™QáaÓK(s÷¦on®Þúµr
.Åï·3觥uZŒè×B÷=%eŽëu-»ZöíÙâ²OësmºXÆVÏž9~4³jðg +¯(PÇqJBfž?ìƒi¢Àùåœuö'°“xdz*XŸ¹Ï¢j¬RæÇ1rº´:á‰÷êjG§¡:§ÚG â +¡º·_èü7ü Ýœ»A¡TZ4(C‹®ßòÝ d'‚rÚäžs¬)Ý{úkróõ•o$ž{zUü½õßÖNû}·©´Ï–né¥c‡ÌgRmVr?ˆ”×´£ð¯v_±‘ž¤$´Ü3² ÑžvÆ3sùí?à½çà|NA¤È€âû¼øž‹qûî·ÜâHr׸)Óˆ("£À¢öÉ©wwŽÞ:{Û¶ˆ]–coXv5Ó]gNôŒýTšÒþ3ʇ-| ³º0ì?ÓÒ¨;B»r&ªtäÖ§Ö–×ã1ùÃ7[ÿ +•¡”":ãN_,qÜèo›Q«xârùÅ'xåùΆáù±cñÏcÃ)SÂ;-5Uï%6¯Ñ£õƒüºü€5
Ä Oiîò6¯÷šUŸ@Ÿ˜Í¹²1—ô6}ž#=æm¨§66y³JUq;~8}Ü;Ró€Àù¥s¼ñ#ñº¸LZÕ}&<‰ò†O@ñÌ5áÅ•)Êe‚'ÍenñŒ{/w&Ï>0•·ÚfŸå©ôg +7š|‰¯õáRuCljñ^®ÔXÔd¿û-ÝS¯jRjU(6æÔçj¹ÎåÏØÏSqU:F¬µ¾ÃÜ…j”›“Ö#í)ž¸ˆ†%R냦:#¼ƒü Èð +‚ÝJP^¾Î:ògFÔF¤É§ÜûW%ÔhµµZ¼kÏjl¾½üOT¾P"i>~Õ?+ÝjX¨äH¥ìÌšÄ@ü?ÈßüÂêt\×5MCvÙïg÷¶Lí…ô™÷¦Ý‚s0D"çB²´Ö|Æal¿”½Òý54Ö|Õ¦’ªYVö[-ü ÿ©„RTe7!•\D ß"h—ôæ̈qŠQº¬ôeiÜ:8¥ræ”ÊY$ú3¬OöTžÞ¦%rœmËßz²|”¤ÌÒí´Éëšo2ÉævÍ0£ò™k³Y»nÃAE˜qU(:%sV¥[Ží²36åÂ#8#æâ•.¶w-…è^6QR¬"÷49yøYˆ†‘x|j4p¶Ô!F? }f +ÐTËyYr@¾ ÿØŠ +Ðl‰ùkïûíØùùþ:·?‚<zAî“ ç¡Y[×ðÄiЕDºÒõ¤Ðkòséå¾ê‹h¤–O’Ëúyˆ¡½3ó×&(\¤åßðƒüí@5 +Åà]ÞB¡J&КßèJ^Ô½= +ü€„Zå&Ôº„2Åû÷
P$€üK’~„ ¯SæQxÆò«˜5ž—UZxŽëh÷I^èqtå9m—n”ØíÓË×(lΉ¸ðRݽñßðƒüuPG‚Bû:´è}á´9Ä@ë
Aá: +3Oßõ‹]jzò
ÛK÷Ö1¿-Mÿ€ +Ôª- /bî Ç +ûù·¿`4묽Iû{
ügª}ê ¨¶qOp>õyÉÃúTËÛâ³¼ÜÖbí<cãjgÕ~DÁaô0úïÙ=Þrn¸Þ¤/þw ñô”kW²õƒ8G%Š]ý3 +vûÄß@çÄ€Ô*Àmc +–÷a] +€˜`ôߣT€¿©õ¿jö£Ä†2ß7¹b=vñƒwªwÎ!ø¨)ƽpÓK´0kP;¿çn¿Ö9ö>Õ™oé›ÓAV^Öû=T{½…¢£âŸñ]}SÎÐéÈ×:g3X´¯"ç逸Ìn X$Pl[ß324@ì»—ÎñƒnÜl<Eëm.v¢uñV@Ùº/''þZiÏ¥³iLuoéÝä×ÇæµOWþ$Ûîs0X(.Þ›OÎgÑÒ“YóÏø·L6½…±zÿï Låc€bÝ¿g$ßýcëUë[`ž¼4·³Œ¾ãÜ[úõöhÈ¢®Úv“=%ª›÷2y²x<È í>QçP:P³ÍbÚ7V9j?^\*¥Á\KŸ»V=˜´gVµÕ2“MæÈ¿.¿(ÌBºéÚó²„Bí|ã[eœAqøÀA¥‚/$•âAŽçãœq_â2ÄÊÓ½ðîå¼`Æ0ß÷²oõáœR‹d©Ì®>ã›…Ó«W›ý`)åñ‚\>–Á轋ÕES 3Mc=xCìýo +ç÷¶9 +eÁLÊÔsPâ{á÷ÐPôz~íy|¦IgÅâäÂ}ü™{ÔDû Yøf›P™Ãº“ΟìÓµtß”Åcö¤Ù´i{i¬a¾¢ï+¶8=¶úÂÛ±œvêVYMÎixÄ¿ðƒüuÿ7ü[¨UÚl¡sj(†þ·Ê¨€DÞÈsö\”î»1Iß.¯]û +Gõ‘wx3G}>Í{_,Ö9 ÂxÌV¼ÞÎzÌ”£¹|W}¿=§ƒšŠjr7/h¥2<íÉNÔiŠTªOzRÁž
õvºÕþPˆÓPæ®öýVYìS}â¼cA‰JÛ ä›×$ ‘T,T†hÔ¿*ÁÍ„³ÐãeË{¦.O6OöµýœYñ-´ÍÖ)³›º»êqâË×›ZóÎé1ý0ãYé›%ÁË’Ï%36_óIJ>6ýeíÏ +Ýå6“zÆ&U©ê¬(Isfå~™<üð³üßà€Ô\LŸ±Í|@i¾j~«Œrœ&ƒ[0[Œ®Í{h¹~-8í»L6˜ÔEíF)Ï:[8¤û®Ê©œÏ7GÇGQìßöœôƒôØd«v²~!ö¯ŒÛ½ƒLkäÍ8Ñ¡†NÚWj7Pݹ9©ôwü3 Âö +àèÍÅšd1„ÑxRÝpÈË+ÔHÉFÚ!I‰‡”çîË©ÒÖFÜbúë’¶\«ÉŽX “ +¡Ge½]ê4ÕÆkyë-E§ ×ÚjX餥NéÏ +cËÒe±ŠÁzÚ*V³ÓaôÔ»ª‚³„:ÅìñÔ*|nóMA¬í=t7»Eh—Å>ygYC!æµ?ä‹Ú÷=¾Ü\SòÖæ + +ÈWäš +Õ6áGk©Ð-êû +ËÛûL3Wa†{Ï}¯Ü2.ÔÁŸâQyø[€üh
‘õ¦ ×sl/uNPaè +zêÊ6@õå +>OkÌ?ÓÈ«¥6TÛ„mÊ+[-=ž"¨öù¹b ¹lšò¹¦ôór‚z‚ý<ÏÙý£Î·aë€.ý!¨›gƒêªžP¾Ž\±¦öáùëþ/€¼áŒ ›^ PÕ[€¼9» +µr]ŸËÐu+æäÞ§+Ôz‹AÎÀ‘o»ˆtäj#9ì7}ƒé‹È6v(}?„-YûÄ´NÖS]±©ÊNßN÷ÞçÜû-@~íA™ +53Ð:§Öò\°FFÑ÷¢ðê&¤µ +B$ÿ‰oùó5`ö‰ð‹ò©q-kåÑi^¨.èQ“íýõ×Ë€mÿ ËCö(؃°Ç,”L¥1÷;ïêoР+=P¨¶Ý,s| +gôJ2Äh@(œ8À®Ñ+@ÈÅú[|ç§5}…º›# Ú ÛœaQš<ÖµŽŽ¼áÓ-{uʯ›'GÓˆxûé„é•«¯ó‹1‰Xêe£kص)ñxrjDsm%ÉøC9ýÐa»Œ$<¥Á¦o|Ô~£Ø¨¢…Ñ-¡rš£!*•Üoeò*(0çÅ·*æŽp Ä)ÜKwÏý{W)H0‚½==ù’^b¦[bßÎ~^ôÂM>¥&vP2ÖË£QéÔ‰i eËê½o6aèó£nÓŒªä¤?.I[)°ë©¾’¬°Ñ9c÷ü@‡èã‘JD:ÿƒ¥ô;÷[ +¥êÔÎúz»qû—UqQºÏãGæmîÊ!Œú¦ç(F'µ8_Tà ^¡yî_µLKª^c¥ûe–]öy~vŸ´„õ¢“‚JA‡m•ëŸéŸƒCö·€-.M¾kI1-ê³WPœŽ¾uÆóÈ +^%
–<ï”g㈥ÁžïSóµÛÍ;vmøºY©Ãå©ŸÒË÷ÄèYe]ÝäG…zˆ÷ýs«Ú›5.\çïí-/~6²šÁÈãÓÁ;K©SèZ¯a¾× •\/2'Y‰:Í~PÈ)Ú¿ª¶Dû[¼Ëï²/eÈ+'ïïç]§’òŠmšüAÖr%nsWO[NîÇõ¾éžá6Æ¡6µ{ñ¸ItÀ¨ÿR3ý[ÞE{–F–:bÅ£E§k÷Z#üb6/Ö,ló!JÅÖn|¾“ò¤$)ÛÿÝ9ü½ü7@çœMö†Q/q¢ÇÛ0îÀ½]Ïe·ž;Vé»Cg&¹]æú«k½;Z°Ron: +˜Rzñ4þ øMFoõø{¬×÷æU¦Ó6ë„8FõæõxéSå£56¼ñ÷ÕªÒ,£ +Ñ"8m¹*“Y>ÛFŠ +·^²ïÆã§ÄáK*4ƒSê+¦Ë3;ÝàìJ3üA8~Ýc¸WÝ/ó÷ÖŒ´¡„6•PÊ7Ï!ü +±Gz‹'žcö§N‘îZK0Ûê£ÃŠR °X$ c˜ÃgÐÔ'³ÅhÂW<SAO·õ dÃÄi䥳wG¡x:b yóCT ‹‡*B¿Ã¥³´Å¶'©ˆE0ŒeEqòŸlÊÁÎXâñãXÏÿÂò×ý_ +?H½¦ðÆxK¶Äæh\*ÖéAåNýÁxÙí¹Ã!ÝÚ Ã¬Jƒ=R]ÖÄ)QœÎºÍó¤EV’1úLðUîÂH©Ïó{¾{pñN›fÃV]¢&?fÜ.½Û²’cxa÷FÀ›éºQÜ”jVå.T“µ0© +Åωúd•ZW'ÝíHz5 ÙzUŠè¿ +†„?°ª¿Ê¡ÒáB¤îÕdÞËùq“u”j—Uó2M>ŸÓo=yu]Ô¬îñPµ÷ïëðïTe7¥ÉJî±i—ûlwU.¼»Ò[T%÷b•ÍÔ‹C]n5V£m¾8ç®SB¿8oè«ÂŒåÓFÖƒò\j½ÕEǤעFÍŽM‹c`8׉¬#k€Qíl#˜£hÝh> í:~*`[–KÛN%”ráyž“Ä'í•Æ"÷,ûïyãEMRÅ*Öw‰è%ÆKç‰ù|ß.èaûèzÓ5Uu.\ûê èA±EQìE±EQl@TQˆžÿŽs½{¯ï[WÍùãNª¦WñdŒdC ÆMž%•œ~¤$“¯I¢DŽzmì‹Í*hôëm(‚”YŽˆÊeÖYðE@¯JÏm´åÌþáX´”•W²Ÿ—ÊÝgNZŸ¬Úé̤«Ø¹d4ÓÆð2J¹â:eNô[ªQÊ‘©F9Ûc>ÏÞø?ø!þ/_Ë9g9
7.>*kfíí²Û¹(“Bó©($sÙå*¹¨ã†Yæ’½[-Z²Ñ(ˆy±g¢¼˜cJÊæ>`˜áð`üÝ¡JŸçiC~lR¦ú82Öø´md>4 긾Ö)©•W Ì%Drø+æŽ$£ã†ºzËZƒy÷pVIZasMþúçõ$6óþb—ž?'+.ˆ9ñg${Y¾ñ‡p–§4:-¤»©”9jekR.0Ø£\¦ÅJµFW.Å|ú2©´gS2ƒß,BíÓÞAä™ÞâFù‘ù+ +½«K¨‘t +µ¶r€èêõo>9çÁ>ObØçAÖø©w„’·w€ohà³-JJ„PÆPãQSoq•¤õøþ½ë(k7ÿŠo‹åºPè†Ó +ï +¨2ïÔ +èµ£ü{º
1\ +ÿ~³pœê\_C´ñùžâ!BKÀÔØÊ.’ +ØÙ
(óª~Ï‚¦¹êüyÆ6òé"øn6È]\8^çAn¥,Žï9峕¿ûÃÊ9^î:i‰N§CŽNÔÝŸS¶k2ëÐÛçmÙ=¦á‡°š)¾º¦é5·ÊŠÙ¬qçni£´€«´ÊA¦þ +@ábPsèI›²v +ô[°(l<$åF=]Zýö´+ƒä½m"Mr#n¬é®Ë…UîàW0ctt}£+Û6çZŽçXÙ‡k˜é‘šPSf*9° «s¨v©²Ÿ¿P¼ +;þóQÿÙfºgÀ—7ȤýÒ«‚Ûáþ•éû·îZ½,ï›ÅáRe{̧{g»ºlù[ÔŸ<×}ú¬®k†Xr+#{®8ÿx0³ûÌ&®¤\&lÄQšÚMcÿ +'p5ä¤wZéêžNñó8NRv#ØVŠ÷¤U8±5ýS>¯æýJ¼›Üjäq\ipçâL}ùÄÅOéÊ̱>Wk³âóÙ®vpuM'E£ß{÷Ê«NüCôBbøê³ãW_«Œ£¿P¡…zÞ¤—àð +ÃÌùɤîµ)ÌtOëúþt«Ž‚ýòCáÛÞ¨SZçßZ× +WÏžN黇[žÄ éÅ÷`´ÃMIgi*.ÌÞ²šÞwÛWØ#'¶ûle<ÞH¡P¤¬^}ÝÎõ¹ÚÅš]x7Gl6ù!ZéVúÕ:͈Ç_g¢þ¤{cãÆðŽÛ§‡Ý#G•zv3õ¶óV6ùNÇX½øÞÙÀ«o0ÏÛ¬öÜ
+*¶ÜÁèU‘OYº8·Zon—K[m¹ppš7u6Jž„ÖâÉ<_«EdOxÛ¥³Ð<ytM4¬ÎSÍw=Ìâ†&¦ŸÅw®Dj¸»_úrmÖ>7í†Ö¯[ƒ}®a†r½¿læå±¾vÛy¶3 +&á©®”W†¬\•·Ûkì3rWÔד¶²¨™Í‰…¼5sBo)X'6/àéU¯j?¯^•¢Lµ;˦´éàº9Cj “üp®DÕkxÛ7œôî.ØfåÔiΙeRíŽã—ùðcÊÓ0›³´Õ%¹©duþQrµˆ‘ôu‹ëµê~£K¿Ûýv6y©ÍYekÔckl×6½i tÙZíçï…Š³HY™{•ô-CñÃ
ÈURå!Sé_h¸Rª;ù+î•iºûiTÙë’³¤i#·ŠŠ¯œÞ½¯‹³q~QÑ@Íñ¼±ºIû"s½GÜ7ƒ.!RE—m_Þ
î‡h>(¤Ñ0ΩŽ·š`¿ÖßfOçÊ™1-Rå µh”§iYæV +Rz0n®*m¶¬±/ª|U{È_á%/š‡_áQ/mÉŸY=¬EJ'1š™N¶NzÜâh°nÌ•‚„o¤å}yêuÖ•{7Eïva9§š›ËÖ7)P®«k³ê´÷ƒŠ×;My|¶Ê3áu)érz~.¾Ls\½–é7nùZÜ(!t/Ÿ)‚ëœäŒ½€ý§¡Ùå¶6ų&7ïQ:¡{Ä´×qµ#†¸’oʃê|=…>Ùf+FW~Ü7í ³qšF¡{¯ì"¨‘ç +ÞËŸâ7ì6v›5}·IèÑ +„µ÷g´ÈïAˆ0Ÿ~k0kv]©ÕkO +ÏA³ +ÔaÝê +SᨼôªR8[¼oLåy³çý%£Û¼sT!.¶³9ì{’iú»yµ”SjÝNVméZÆ·£]†£›6té<;ff,Ÿ5Ž–óW¬U¦‰ëÛÑøW°ÅÚŒD}
Ê™c,Š¶˜´ýq£Ð4ªA±Þ&:œ eP¾r™zu¾˜h’Ñ©Š\ƒaEìdp™ä™è¨çØÄZgóˆig8º°ó¾ÿJCœúîPÕ„2ó Í>c-ƒiWœ€Á’]‘¶×Mù¯0Þø=ÕjN<ŸHŠ–jÔ•¸}ÐÔ‹ëg½¯À\ªH%÷¸@S.$”3{¢ˆy0”;N¶éœRf³¹O%Ÿáðl‰åi¢’Òq-ÕÈÝÛŒ5‰%Ú^¼5êhK*…4Rél_d†Ì¦ˆËqY#.§ÌPáñ~ˆëÿbz«mž#{†RTî46 > RúBye¯ôܘNñsÎòv†ƒŠž³¹wå†6á§
ÉRììδ‹ýè‡ E¾ú¢¤Zî&’Œ£ U²¸Ë8—6ÚŸ;ŽP{.‘$j¹ˆ©o"Ä4Šô_p=ÍœL7 +Àvi`úF–F*X¤ ^ÄÕÿà‡ˆ^®V —ôªlE6ë÷87ý +ï¥TY<½t +Ï«ˆÑ´1ìÞQV«_½¬Q:ëÔ2ílºiê´ë{øo +c~÷'/V@EU +Pž^”~S +@š +
‚6 _Ê +)‘ÞX˶åùÛ<>%ð +} @3OFwŽRì +
…8ºgöY¹”¸°_ˆ7&{ש$ŒÏ
£ ;bv¶=ÊöÓÙß<Õ·g©ÔsWYÞÑmµc,$å7¸7ª}3ðÇÕÀ¤³ÖjX
À²Š}q˜¡‹Ú¼ôž78ž£büší¨Ûó7ü#“â¥.•Œ˜Ý{R›ó¤û“ä5ëuˆ šq&Ý:w
Q»ynÞ§Òé´]ê34ìùˆ³¶‰²?YYÓßÀ üe:YyEƒYŽ¯jј:FK2Ìl¼`þVXd¶<0#N‡dÚOÏ`‹MœQ÷ñEø +úñzØÿfŦ°Ï×ÛïÉŒ—È<Ý ›qàT±ÎœÁk¦Ç˜ÞÛdqsLRuSõúËòd5Z¼ï!Œøæĺ±œV×v½1÷¤o£eꇥ´Ï¯à#t!﫯@ÁUBÄ}«‚瀧àyäò ©g L-ù>/–JÇ3îwÏ"2o\dM.ñÈ×Ï$an7‡óíx±Â¶„pÉ3aPYΟD[oTêƒ9iÌÕ)[yÍ´"Þ[©z™°‡ïÆÎS:Zÿ!Ó¤iö¾4œwGÒp1¼Jçóú6H=Ö—Á u‚@öÞàÔ.¿»Ð„6ÄJph¦põ…×ðö½õQÎÝJ^sØy~u(ëWî0¦ +Û+=õ™¨bïæ;L¦«áG§#3ì!TAÎÌ•þ#ukŠÉ§²‹á°-å,½Åž
»1aÔ[}ŽïÑzù¦ +µ§¤okÏ}¯ß§¨ß›w¯™ñoçæ¼»¿M¬}§¹Eùl
´üñú`ò?„]o9Kjæ3fpDrËz‡âõ®ÅKs¶Eé“Ùvë¨ï
û9Üz'¦¿ +¸Çùq.qÛ½ó\2!Y{…ñÌú”P”ïyzˆ&ZÕ–_ÃS•Œ3þ…ô×Ù°"îy»Ý9·T¹¤?ïK2V}Ý~95ÜÙõ<¿+çõŽâ¯»C¡áˆ{Dè{%…W“–—â:ÊŦêÑv("÷òÐI'×B{g] +Önîý?ÄŸâP*¨©sëaKcº +—~;uÛ—Btª7:þ¦švý=_|=’Ѳ/ÅÏIºÄåç™ðõÈ^–ûgfÒúž¨JÕÞi!]DSC0mKÑ"Ÿd)©öä~Òµ°™ÁË¡ö´9î;ÑŸ(½ç2qoƒ&6ŸdtˆËå7L¦ÆJL*¬"Ùˆ7Os.±óÐ'Û©õ*/éEœË̤©¯Xžl™©äÌZŒ5·´X6¶”$(6©4â²k¸DžlÜð‰$FØ|بP¬áHƒï°A
iT$iT±„þHC`I9÷ + +øÄý¦—ÉdwÚ“q_ïÏÜÜAÂç,ý€Ý6PæíVþæ-G(4·‘> +ŠN³>¾üŠÿ +½=ŸŠpöµ÷Þ;½“í3•»o>5Ã[Û,ï˜G9üÁñoý +…*¼ +ãý®A1S¹3Îi7…àÇ¥õ¦1ZËâ° gLy/ƒeí¤!zñûW±AöÇyÐKVÿÚïl¥ŒÖ\KÊ¡³’”UÍø
ßo0 +½4äAEo§+Òœqc}¢=«ö¸:<^Gžy*t´AÙ3KöK“—ÀuQÔÛ{+ZƒÚuöC43Ï`××Q#ÿmœ”ç1¢›Êd¶jºYoõ}yþ ƒKÁñuKŸ[„MÕ‡Ûµj€[ôû˜Ú3x ´A~ŸÜòóÔêÞžµÙx,L>æg”“쮃›äO:ÏÞ³"bÝžÓ]ÄåÚLT›Þ5è64ùªÕËÔêér;¬Uy©\«ÕiÏÖµGÜ2êÓJú±F~XþÀ—ÚmÜÒR£ˆøž÷˜uÈ +ÓÇ®ÀH¢Î?™éaèIi\®¨ï\Òîoó©<ìQ–4ínÝÞ²R€+¥î¶ìÄjª`-Åϧ›ù!^ª?hЮöÎ[Nf- ¬y¯Z/»Tm×û“*êfuó‘
¡ÎÔçB\/OCØNÑìyS9?ÄÁ¿SØM‘õ¨uM–Õ¨òü“Ù™ÜËõPý ¹÷hçKʼn۵Áí•ô£è¼ßÁ®K„¨Û–ó» yõ“Æ,Å“õÊ-ŸÞJª& cA©³ ´—Jïùñá8úx‡ñ&ü`™ü€ß-+T{¶¨ˆ™úä7øGOÜŒ€Ù5rnÒÎ#Yh)ZPíÕ}rÇX_Ýlm_ÉàÂúäɦý‘xuï™Þ¢ÙµM¹“*¦-ÕˆvM®t8×
sÖ•ÖGh×¥t•Â%¾’¢>¯È‰Q¾\åkY]i…²*
&%ØY•ŠzYÒÆ·EéVÐ&?ÄŸâ?87cß?ÒÔêR`UÔ¢…íîî“Àû\ÕVV<Ëõqî/sÓK÷íÜ»ôÊ#:é-Qjiô»Õ,]Þj=žFËÚ¦êí¡óX]ªôjö¬¤-“à³{·X.„d·4ãû³R™ =.òÓY.’¥W£¸<,õø4E#$¦¿á¨(t»=‹³˜>¡½´‹Î}ZÀ0¨‘h¸²šß{`’=tÚ9µ8<5ç=™hì(Wû#A°w#±*IýQEÊk_žX³ki¾_%Ü«¤‹€g«ÅÆr$¶ô®ú +íðœÚÒ)à9q–á䛧Rø"wœŸç¿aŽKļӧnÕÁtœþ\ÔfÌ;²J-½uñ½k{lÑl@'´®7å4ø!jDž!º”ËV<2ÇóãG®U. Sª¸ŒÊÕ®Œ^ÜÔª»Â®Õòò.ÂèÀ¥sr«(d=[fs…Â>sûT˜Ì휇3g–gÆqj”)¬õ~ˆë°öZû—aÑ}–Ù°Wu“9wï{ÈܱÚY›5ëõU{Q=Y¶]¹p‡„Ÿ6V.‡vªT}Ù…âDZªEìb4òÇ©Ò͹º4ø!rl2™dóÈd™áˆùŽåûš6†’²óbÊÔ>bªÁmLæE4cËĵϴ…}ï7,«Ã÷}¦8ÌE}wÿ(ü!zˆuÛ¶44k-75ã/^mT.ÏÚ;.±kÑHAAÌ Q^âxccÍæ>(Ɇ¶G§Ÿ''›Ò—jäœ*Óæ¼-Vî +%5ЕBÆ.éîð÷A*Ýu‘ÌP
…¸8r@\ÜrbVú
óT!w×mGé^ܶV«Ha¦`—Á´éañ=DÇ1ÛÔóL˜]e/Æ{ó=#¢y°Øyw³O)ùÈ|ne‡ÁBÆ£ÉæSx†¤Òü$ÄŦ0"OqiœK%ŒÏ)mÔ˜„Óï®Õ#bêQ‚4„QiÔj2Ò¨‹—ñÍŽþß:ª+_ò‹ýÿZѨZ‚˜AfeÎ$†…N‹sìSC]¤œ~&bÊTÄcy…K +?·*̾€«¾?Eò9Tæ_,’OÜ[„®þ‹?BÑò‡¨UÎÔíB¡Ö¨ÕÎPëFÈþ=ˆV³R_ +3P觞XQ+ŒYA¡¡ÓèU +®Z`à½ZWˆÕ"! +ðî¸k×À©Ô`äl}B&ãð†Êí&ÀXë»sÞ:Àð²
З|Ø= +à•Ýw›5šD³ež¾'Ž¼…„õÝmK8O +¢=I%tA-¿Îv»ý¼Nå™ß ³h’´7GC:=ø…t
_ã +Ú¹›á™¹7ùJ +Ó<T˜¯}Kí:UžÅ縸Š"Ê€#9lJ©C@½··ëuPH¼yhnò²Ž%"åS÷qjû·téxヲú>WXlí"5ÏÔS´î4eÅÏmkó~#“
ÆfÖëîèµZ¹Èp¾ÝÒÚahïûÈ(nœá +>ñmáÞ}Ý2·¼PL]¹u1sn2!w”ÍÎ>qãñÚ¯¶˜=%B÷W—L.^jën”ÉEú‡XÄ‹Zaþîg…9Ú¦»Ó}pW&'/ZLҽײéA4¾>‡•q¡†(ãB×Ô©ƒÕÒà5Eékÿ‹Þ +çée¿ØOÞVqk£Wî9V™^n4lRÔ€~^ÀU©‘bhÙöÕVú–º/;ÌïÒXp줶vo‹·$âƒlNØgÞ
þˆ—;Ü%Ó6¹QT:r£
SãFîCæFƒ³ÄÈÍGH(E*ú_€}ù.^eÉû瘃K܊קä{p™
z×È™æš;Kž¯}“˜ÍÎÃ[ÿ‰‰¶%tXí³jX@{ +Á†2YM¤©~ó:ül'ú²xi)Ïül¥<Î`Ü•xWÙ¸Qn±´Þ1nZÚ30îâÑeÜñYbžã ÍZ»¥ÀÞ®3þ·…5E÷é°øòO1^AÈþ6ï3…“KOå\/éŒÎ£’g¤ÕçN÷Ò£«U\Õ¶h½7ò}¡ël:ªÁب-ñ+æ^£µYâU+wŽŒ²&QÐRó£Ó|³užš°)îè5¸ÈèŽó +¶„Ò*¹R¿˜UMô<KD8ÍøŽû‹Þx:u:’r&èÌ +¯Êßã†í:SÅZµVYYTWS;¨øK÷XÉ•ö¢È^¡2Ñ:á¥aô.Ço”,<Ze>Ÿ¬’çRÛÊ-…gƒ£Þ+»vq"‹½.,§;<°ýÞC¯àªÄå“_ÃeQýÅd±äöf…Ð|½ÚËÞ
=L;’™Xüý…Mß,÷ÈšÕ«ŸxÆV²ë¢L/Ð1JO‹R=³[)Ìߘü"úAó|yrɉµaœ][“7¸ŠçÞ릵nm d‡cäfCd¤ù¤^îÒðíܛ–)¿Qþ¿aF+'02Ùý÷™xÏ:Ò¶ù¸\6e“Vä“+ë¤Ç”ŽÇ”.Zí@.8²ÕËó¥^?'V#+‘¥!Þc çмû5:È +õ -lii”q†Ðâ)èóÍÁRâé|9ßq« Å´òÏV%ˆçø`vý…1wŸkeh¿fõ»ê§¾4næV«;.Ù&¶<ÏͱYÏs¨ÇrðÅf²XLSX8}SX Êp¨!Æ<RÏN8˜*Ê|†©4[ß :€Ž +X˜€÷âIᛵÝÆ V6¸3 ÖÙÄÚ_4A§™g¦Õ?£m_ì/R¨B~Rˆá¡rFH +#|fd“ÏÖ(&Ÿ‚VKÞ‡5Ÿ¼LKÞ’ì‚®ûa›¼Ùê
0† +`=®ö,æàÞOÞ|ÝNÞ½¥Ÿ¼•æ°Æ“·škª2÷…ýÐ ù"|ß‚W‹±øa„¹þ
endstream
endobj
82 0 obj
<</Length 65536>>stream
+ŽÞ}ÌoÞòñ"»ò Úe)ùÌ×ä£Âbò!;ƒä¯fÉû˜Ù”à€$ïS¡h“€ypï%ïsiЦÉ;¹½Jõä“÷»C}÷彿1{’þ‡î|±““O5V~‘B÷I3ðw¢r
§™ÖK3Ås}+§Ð€`R¨*ƒßòöÍ´Q¿™ÞÕŽ +Ë$þÍÁrÜ7ÕìSßñà†X#ÍìÝyš±Ÿû4î8i¦iãi†¸×ÒL¥ö×ÀzøL“¶ +¯´X_›H¾¾²•ô,píQ–¸ÖýZà”ôÞÐ[£›`Ã-'Ãë+w^æOC?£*¢ü”b”qÁ +LaaùG¿£or/?8Öž»ý…{ª¨û8¸þ òùq|ò곸†2ëûÕ7¢ûXŽ^·‰]/^9Nc/0bôή5:ÉÊà¸[¥ÆQí\ôC®ÊaSŠøAÿ¾Nálò‘Ȥ-Ã)bOA q¡–¢[HÑÌ]K‘¨d§ˆÓÛ¼z‡zô,ñxŸ_ø~Û½Šw +É4nL6Ã_gŒtåáª~YJ´õƒ^à9;;¯…ApÆûë)0hôXŒô¡vg;ácZÕvÉâªîxxÑÛ~Öã^€Ý?íM胻ãÿ 8º0 +xÃLŠÖ_¹ÿ:vŠ^îß)ƒ©~"ÃŒõ,÷·nÜ•õÍ]°Ç«P)?/ÈCÎx +Œæ¹ÇCeç\fÐyr×.OûÙÝÁVÚZå-¨2[‹ÊŠ7%ý Ž‚KÙå÷ÇPsLbX’žÌàX¹7ÆeO*¦W7.
»ú‹y3ý¼ö8·çÜ9³F.‚û~·†Žàz Bλmj×)ê%sµº„{9~žc×ÊT—xÓ¹ÚOw2Éyk›u»{KP—q[*§f·£#¥œ”†ý\B
åœd\ä–iÔÃ÷A¿Û¯‚nw”¦Ncùƒ~þ3hTûn¯@ü"EGP”F!sw©ìëT^žO{΀v;Ì›ïkï6ç#}Z1Fã³DšXqž/…Í)ñà;éûvR³íïœÃÝê|Ü!3™
ühTð¦ñ°<Ô?Ƶ$fõ8+Vuº5ú¬èÚ|Çùš q˜&Xoú©e¨kíKEË”å_¤hpý3s~$ W4£Þ"2Û;ìÖüv”j´¿E¯ÍÊÍøá²
ížs%䦕_w¨QÚ²gSS±àcudBìŽÔót5$ÚqýÏz}žý×6E´÷"~P-3GTzJ7 –JvÁJv7l(Ùë¤þ¥ö}K(Ù…Zú85c(Å‹fö¼ÃÈë~ú¨ì·yTñ7ò½Z=çSσ}ûŸüÒïÓ¢¡Žíà{Þ÷X±Ø®ÙÛ¾Œa”ŒÁ¨OÎòlú‰FÚG™ÝÕ5f|” +\–n|RüÅŸSó6—N4»ËÓ6ðæÛIe7Þ»1ñ>Ífå·5sIf¹ŸpzX¾™3U±ZžÌ«`Ä<'éìàÑïgŠkKÝÌ{sE!J›^)L#¹²y>¤;y€;ÏÊývJfù6ïØf›wƒG›ŸŽÊíÙ+¬¶ÓrD´“ײØaÊëÂ/RlM#W´1‰÷3˜:Úi°]ÓÒk³ì²7/R7¡S²'\Ì€ž¸µîi3”itxfbÂx:síb[[EÍ^zÃÞ¡“ŸÈƒÏ}Ùmæ[‰Vç·ö7?íLfZ‘äÀ´ºm´º-íÖêŠL±µ±ŒŠˆÜB?Vé½Ü¨ð‹$ˆü¬b{_ ý沤o!ì6‹ßô¦µÝȵ?wodáµ½gj›'h(—·ñÌLò:5šT}J(º=#Ãèßtk÷±49z³×R6íÓ=‰h,$ìYÎ +…ý„âuÕx½By=‹äùCW$øË”e#…í‘ÏÿâþÔ +¯ãÐú\·ùþ&üA×´›
–ÉÊŸÏÏÒa$Êokì`4`éé°Q쇆kž}oD¢¾I¥/›òEÅ.5L{´´1ÚËÝ`"J½lõô^(ž«1Oì›(W;
?(kÕÞ=Öj”"Ö*¤YÖ‚+eöFÖK\Ìç¹aÏýâ&H¯×~FJG ›¡·0ã`®ÕåK©³¹x{Te®º1Å&¦.Üw —ÔGý÷YU‘Ó»wjÍrrc.Õ$7Á™Ž`]:m´:×ZÛH1…¾BÏøA§±åPùÊR¯f†a>Ãj3õ +½æ¼ªâ9ñÄšs¼RnÎÒ|©™âxa°4÷ƒþYüå¼Ó‡Î§‡õ¤$„KluÝMG>¶š@[jjî?ýñ ™Yèšì†=µ¨~l…p[[Ù‚¹{·¹e2%†Úå¥.æØ9'ŠôƒòC³ÑçÆ“†Í6ë…ÕËÇf«&¼éNiX¢ÑWU¢üY= |A©n\*RÝXA¹?³¿ˆÈÍùêO›ƒ·xW÷³#¤ƒëÅaáår¼C/ÎÌ¢£þ:Oj½:Siw™IE—æ˜5ïxùðЖNáCÌk,«v‘Eí:g]Ú<Ëèå.êæØ/OiiȆTOSž¤6XåÉ×=‹ÆWè@Á
£)DÏ7ˆ’kòÿÅnƒS§u³¤yl·s©÷gmù™ÊlT+)¶ÞJ&%z‡Š”zQT6´Øê_Æ*œZÏ%íâ.V+Oöe4æm6ŠLF/7šè¨,ÐY»ªR…)m“eKX7Ïùn¾c´ÞX˜Zܷ浸©jto”«>ïL¶êöóxÕm#ÿðƒþ}íW‡›Èƒ¯Âqj–[Á$Ã8žIÔŽSý³ºšji÷»®YïŠ;±-ðdgÁ2KZm3×Îh®{åESÊtž?¨pz@Èhy(äZzöݪ[ZU¯=ŽÊ¬š\½C•§ðOB¶deé¯íÊrä'Øqb]aDÇQã*È/VܦœùU8y“y8#sc¦–AëBÝÓè*\zJ;ûñ:<9Y1üÂ(òÈŒ¨ú=6øº=9kuZjºµ>ÝÖÜËûV}·ÈLuë…jÆð©Jûòê~‹5‰l´
Ê»ó*Þ—JéFƒ´t讥þCKe.BŠÇÛ.4-ó‹EÞ@#Ç
1¼[1àxdÛŽ–ßÍîKZöÛ9î.ódóMÉýd%e*5vz¬þóÛæ'z(%¹ÓlTÖ¸Û¼\Ê“a)Úë·’aŸ3Å–+GÜ,Üë¾\°âª“v¼CÞ´‘\:†ØÜ\ä‚Üì™@9~pƒs|7‚³Ÿ÷,ó—ôϵýÎÎ’c5xl쩦Ô}«ûr"CkÏ÷„³bŸæè†9gªÕVmS.‡ÕF¡Tá¢2J!¦zÃ펜ü4»^åÞãÛ>×Br÷ìªK~ÀVЫ–ÃåVHâ9¤&c»ãaŠ©Óþ+ö4*ä4*êwT7"Õ™%‚êþ…ÝÕámy_ôñók"çîr.\ý>åQd‚©O|½ÒYzDÉ 3ùu>òÜú)æÄjEË®Ç%ÜÄsiÞíÊÒVu5:½#r¬RÏoa˜*?ËgÄðPrGÐl¢†ÏÈ7£ÈV;ÏŽÏãÐc4ª#Ë~·‚:òD#Ìv.áuÎmueêÀq|-)h‘;šD±Þ¹æsü«†f1úTÁs¯WÓø󃢑—Ð +·zv׆©â¢›a*câCpr ž¬n +°
×€Ý1I[Ù' •Lr€XYD)€ +ˆòIúÀªÿð†‹õÿ¡‘¼‹5ò ÂÏwxHÂ@ ñH!ƒx¦?A´Iš|@u|2#ðÓ«°•¼ÜwÎ7ÕœüäÝm\ƒpÀ’·Œ,XY69À^JÞ½¼0¦ß|²’;&osI$V~¬ñBƒGýKãé÷¢?ÿ#Œjqš›÷z|ç³pj VÃ@@¯KÉç
3ß|ò‚”’:&ò4O>½O>%œ6¥+”|Êßs¹[̛ɇNÛɧIi€ÑððXÈE/¬cdaÝ)ƽ$cýe‘11ÕÈûYî:ù» ïgN¤îÃEþåßIî–fÔÎù˜¦€O.ÍPd-…žºB®¯¦œ±S¨Æ®R(7?¥PJ’å¾&b_)ÿ ¯õ©_IÃ9ûn^ûÙ³ŽÊ#|>‡mZ™ÆÇÜ(¼Žç÷ZBù«‹Ô©Kʤԅߩ¤l +W§€ØÄA;È7½\Ná$ÓLပ^òÕ~Їù£¸¦,¦·6Ù\h|¸|ÐI|iqÓ÷yµð3†Då“Ü=׻ř9á¤éÝ¢~ªÜt?vN—°Ù‚‘íÇ*[8U‚Nß!|ÿ$•}ßçÁµ¿ÙÝðÂF§¹¿¤pvÂsw€çõ–"}6M‘ý +¼Ë)ršÏÒfÁÞïÙº¦åGï"jáðì,ç¨IÚ*2„ÞþPÇøëž‚(pí‡N[@vÉ”Íí¸O»²]ŠýæVD6R°î¦Ã +,ÎÌ‘ÙŸ§¶¾›k
{ëu«Ë`Ó*ì|ÐÆ?ùùyö±Ñâbf}lÖrëʈ¬¬.u]ÕíUϳÔùA—n~s[ð§›{µwiŽX»ÂLzŽ³˜öÞ$2Í/Šð_RøÇ)ÒÎÜ@„lœ¢£”¢—,þ*¢ì6Õ¹ä,W$*,NôÄ·«ñ¢d/º´9tšúúÄ×ìÕ•..½¸a§¥»Á‹w¶”YJnîùúI5aÖ"cº&wù@Îñåjç‘\±ÿ‚ÙqÞ +Ãâ&¡FNíg»#ú•1êXþ’Ñoþý[ò>ùh)ýÏë¹—Á1ÜçUD×Ûè¢ì½0ƒ&Á&M¿Ü‹†ëÆpd-ßîÌ_ kç6+¬º;¸òNcðnØîzÊYsS•Æm‚ì›]3G[›ý Ã}õãŽÅäd\ðÇÓ¨·pL§$ªÖâQ¯Ï¨«–Rí·6{ª6GŸ/ß·J¢ñ®ðüËŸcþÚí»^³¶{wD϶ٱ +ŽËæ4{W±/ö=®T7X±²œ…úÑÎòéd2Øá6WœTÆ+¤Íî)FJxî
ûîr0Œ‰a†§ÛJ/ì»ÞM›ó}Hƒ¼-¡ŠI ô`ì;Va£\_Ê´è +«Ø~ì÷/Âöu¼p×ä=/—¡z¯ó¼â)î%÷îLÜì{hCnÁwáÂq´ç_¯ae8C
kÃu¦…7´Ïy˨ë¾ÙVYQ{!ÅšrT¥çÝs‘ÞI7œ½uÕnL¶“ÊqÜNªáåm'5"í4‡Í¤Ó”kÎdJÆ¿Hä‘—\ða¸…;½ð Gu¼ÆéI
¦Ç‰©Lž›‰`CiÜ5AOxŸœÂa•^ņI N|^óšÇª*ÝmZÉˬ ‘l·{N߆t‹_Nçq~ûí么Ÿ ðÅü¸*‡¶.ÂQ/Åâ'Eøñ—@ñca±øQ?÷¿ü ñø1>ú”¶Ûaha±¾m9géÕ–ãy¡ZºQ[±3$É™»Ñé„:€#äô;÷U,ÑÚ«#ªì A±×Ÿ²uy Øn¿¶%:sÐÚél®Ê6d/<úQ×À5×;5ËB~„*BÞ¬„Þvýúò‚4ˆ[x%¼¹ýåÎàò)j¨¨×ë|åfHwÑÕk:Ì<“i»ÐûAÍÝìÁ‡Ó 3 µÇPO¸¢×o9ŸƒêÇÁ]QGnF>Ø\÷ºÌÒ„¹R6^má<é‰h_´²²: +â0äû®ÿäK¬ÀUŃÄUéû–L,ІáºsÇÕèΗbëö‹«—!Oá;p×›s´š{ÐéãÌ›‘íÄÉv`Þ'yXó¦Á ß_ŽEU[¯—S5_p‚^g¹úmß¿b¶D‘ÎŒ9ÚËƪ&vÎàœ•÷rG(ÊÍ>OˆÍ Wc;;OîLü„sL“]ˆL³¶÷™I¯÷d&¼ßöø+Ûz·¿œî}gBÞšÚç¿ö™N‡Ñ¶?vß0ÃõT6œPb4é`Ö•}oÓî'ÈH¾Ìê^—zA»NºxÞÚ³}‹›ÆkõÎrQÐö\ƒ7NœÀÕ5¢ÇRÝÚø›ƒm5WÍÙzzmBY§Eu!ТxÜÐb™iÐQ½ÓKš¹ÑËrýú‹hœåC? +3ÿ<ŽùóÁýű…תúÐÌRßs)öíUµ7Ñ䲬4-ѽÎÛu'íUk¾}ÆZjfý¤ûá«^çS‚`i+G3¬[ì4…1aÐm§µ ºæðHnãG†TœC*ƒã’Td-&ó·:èYù°t%{ŸÊoB˜Ÿûk›ÙyÖ\º·±áڢ홣£qÐvø‘T5ód¤×Û'Ú˜Ò¬Š¹‰Êµ4ìúY]˜òg½ês·Qõøƒ²~!f’a1ÓüX¹|ÀUçx*gU²hrNCaýÌdßõaz¢êÃ4¯×DãV»‚žRíº© +?¦N^üæÏs£En¦oœ'éÌ.½·‡íÉèw¬O¯7bðVgyËRÂqB€v2Ëvë8µëÙy°·Roæy’ÀFýÆ°·¶µ¶®'5ГM¸¸ÖìY ÿµÊ•OùÃVZ#N#V÷ÕœÀšåK9ÀÞ¥²ÿ®Ërky(gÖ±´“øÃZÚ1ÔáËÎjLëÝijۼ;–„±óMwŽøŽMû\«,Œì´äé¶Aë79›©,·¸‚4vbýÈR„´îK.í‡?(¨EyËZa9¿ï¥½V‚KýÒ¨Z<nbqÀévá²|ïfÿ€L)?,Ô/³mþ.Xûü½aìóÖ1«´›à†SéÍM=7Ÿ€Vߧ³(ÆbÙ“z/¶tüÅ°œx®P!qÏÖ-¹©ˆÛnRÚOßI¡± ¡ÜëzÆs¯èM—!7Ý£ýgwì‡ÞøÙO‡ºg—„‡f[iÌÂóPýAñµª¯p‰¢SGYÇiƒc£Ù òZ„ùwþð‹IÍ–ã‚qYáõOj^š©¥wË<Ëí‹
J“JÅÚ“£Qbcöß?hñT»>óMV³°A<ñ
•+áø†¨aÛÊaJuÑE÷‹ë +ÁÉôqé‚„¸OÉœSˆÏ=Þ¿’›¾£åmyØe·šÚŠ(W×?[ñä@ÒjUá6(”¢Ìt©÷'‹åº¯ßîÈ Î%ðÍðÌã°ÌA³‘ö?™ÐepnB|£ØÈ`gC<Ùðÿ3tµ[øfGéJç;Aìâ?IИx®¾$é¯ÌrŸ¬îËt±^z,ŸÄ"9xDt®+%"Žs¹Ù Î`[©• åFåYüÝJþÿÔ±ÿ#yû'äØ|£&ý›µ%Ñåwz„+ˆVÈ}‹€ÏÄzz‚X'ˆgMpwÿäÆïî’÷9$ˆ +õ]ò¶‘mòF.Û$ìI²˜Ÿ“¤uO“Dl +}}!p™oÓÞÙ‹ái¤ö)[À—ÇQ”¿î/¯Òkßà ¿ÚK!¿{!&¹sOxo+,-/@»ë³ŸU—iñúP¡îëþ¥t[÷·øu]¿€¿³9¿k»Îæ6)<F)¼9ÝSØ}½žaE=‹û-¤WNàsG)ä»3Z?]ŸÙ“E;l2e7¯FÛOæ0ݶ:×u°švÅg_îdž~#‘Ú“ËëÃÞçÖD³?ñn.è>^$¹þõ]LÃöuÁiôeþ)•O¿ +'gb®^kûžf6-T–»Òq‹•2ÌXP<Ûôõ½‰2õãh“æA;ù»Øºs(ü²ûK +?õï ÃÝþæ¾êóS±Pï›nNÝÁ©ø·Tô‹Õ}o5¾xãåŒØopß;΂Úü5UCÄ%ZÍ‚ScP[NÆ&ÁØk[¯sQ³¸<1·ÐÜÔ\Éd`¢ËÖe$#4ÜÉpuXOƒN+Á ür#ã4ì“o‡ßWÛ_€r¼Mð§öå²?AÃ$·îàxÝó5íÙZŸmvE¦eqñI +ú\êÓóixkìÜJ½Nn‡øm?‚³fíYyü™:1lœ‰
¤ÎHÞõôakö Â
o@3°c¸º½ôÎuRÅ”þäá{ý¦›ÙÙ}Ù~ ¾øIqÆÞru +qÛ
y¶¦ùQO^›Ù¹à¹Ø‹ZBô‚ã֪αÒõ`;&sØL¨xu´æuý9öP2¥e>;ê¹1¯=ˆÞ8{Ù¨CÇN¡÷ißá¡@›µ+7õ3í£ê²'ŠªX¨ÍU8ž†_v_@ëâ»ð¿lþ’"Ë8º½ìÑêHÄ‚³Ý’þfЮt½Ü–hGÍñ[“r×ZÛiH¡íÆòÒF½¹9宣íâ‘ûÌ.h[&ѯêv¾Ýì»(ÛÖRNÐ4ˆ,UtÁù.ÝS/x¼3½ž»azy9på}žØ} zù^Óÿ²ù²þKŠB…óµ%3Þþñ9ŒÐ@iFýucˆt—‹Š Ì»¯ 5-ƒ^¶ÓXy{*`º• °©)#·Í¨°Žƒc=3nCº}nà}w_(ks?CªÞ"æUäñî)øå5êåï¹Ü¯ÐÑÚ=*fÚ<ª
éâÖ-@t+χÿeóeýeõ—W.˜†/Ãyi1ö˼£y¯Å½»èUaz[¤Cf¤¢ÍÕ%z¼:9ßü˜¼íááíxƒ¡£…Ù`®ý×O´÷2FԻȩè¯)YgÁö +æ¤#—õ‰Ñö¦®dz§]'ƪ¯ÝÛU:´r7;´j_6{·\Yý ß…÷—øÊÀÁ)4.‹rmÖ×¾¦-Ѷ;Ïé¨àÖÜ\ÃæFPnÜ9ᤙyihTùá öçúìoûÜéyÒZËm¬b¬ùQr¤Úɽb…+ÉD¡ÖèÖ0BÈ<©u&mðoÊé¾ø^žbqÑÖKb3b§@,I + T–¹M÷aðçᑯcŸ¡7Ë1ýyO±ewt;µl~6FÚ¢
F)]2¨XiöÓ`Ž¾æõ½±ÚÍÙ%¿éò±U=v/L6–¬ûõÓqNÖž…³’¸Ü8Tk½[vZ8
„\š,xŸh}ƸÈG5.šn–|ñõ\ñÅÓeÉkå€Þç?èŸÅ.k®·ùóðhS«Ÿ‡K‘*õg¥Õ çÐ¥8îÖ{µ)•1m²ýLíUW}´ *»Z{ÐëiW®ªÙ•ï}ç•?]ÚoÔOÚÐçû¿Eä9*´ð«Vò‘&ð¥‹Óç*‡µËš•Ü_„¹«;™¹‹ý9[_n<¶nÍì(ôæ¿8…ÏÒzÛ½Ží•S^ø +¦òR-nËGnóÌÇÄ“½8Ä<Ì|¡™èy²ÉL‡ní
“Z—o>Õ9S +3§"…µ—Š݅ÁÂœê´ +£as¡ÏÜfæ¬iô¾ÞS2ÝIµ~*ÖOÓ +S¯~µ6ó‰ŽïÕ8X4Ðj¬´ÇÕI¦?¯ÚaZµWôoÖ·T.ºaä¸ã(?¶áWÛ]ÖçšÁ+e¾Q•ØˆÈ¶T.÷f'qþÖ„—Û¯*6Êà¸ä>†—G™Ôú¥Q#:QÓF¥&nê#K‹j·çìY£ØVeD¤V™m¤NÊF6±Õ#!ö‡UBl¶‡ôÝòºÞ˜”×ùòo~POè³Ñ¹´Í=ùî/p¶¨»Âv'~¦&õ$ÇÝ¢jŠ3(nU4ªÙ£ø^}Æè§ê®Ôb•íøTå]Év*ó‹ W„ùÜ©d„ûšh¯ñãZöq>)w/ûbiGÖùRÁ™
‹¶¹-öAG¶Øß³z±L+“ÂñDÛ…£_LÖ_æ»{ná8F}báÓþh†ªæ»VûŸ´·$
+ }FY:X²ïº÷êkäGúɅŨ’œ‹Ä~‰…ΰR•rl¡vìÈù›ë›yK.xy*×?æ÷L&çØf=Ç4KJ6ÅÎ^v¶
3ÙÙø
j˜ìL&YîY¶³Ü&cýµÔÑôÏàùáµýŽö{µ$Ú›bLò—Ó§Ìd„'J–ŸÏ¤šàÙk9à¸C±R ¶9&¨x›Æ÷?(¶9QW¬;ÔR¬;}æ±,_o »¼ÓFwx€*±¾D•GæŒÖ-lº<r˜R¢óØ! +jÑ‹Õ)r ¿À¨óÅý‹í ¸Úü'Š5õo*ýOâ»ÓÎ ¬PtêÍÕ‚Ê7Îå*TåqöQÎ×ÔS¡¾
Ãì|V÷1ŸznÐbõÂgòy‚kèž¹u럌U5óÐc±CŽV!†²?(Ä´‰`w‡}\‚GéAŒË¬!Æï:,8™sQüÿ†y¨¹¶þiNŒ?iïŽçÏ[B-³ ›ëì¨ü}Ô‰V–©j˜Ré6¾æi39â«‘¶GC4¿Cˆëe=ñîü2/<AWü1ï.±Ù}b9†…ØáYƒØ@ŸCì¥|Øôš…Ø÷¼q9gqõqq®ö…ÓðÀˆa$x¤–º‰&eÊǶ0œ¿9~~ºíå*Hº€ŠƒÏé™ãÔÚ
øÙ -¡|”±ÛĤæâJü
âêúÝJÉx6ˆ£ž8ÄÑù"Äõ-âVXââ…ýïÐU +…þ3ÐÖ~§‡¾3#äþ«ÊõÀ*Üùùuº´ÈTdІ9W-F´¹f£Q@Ê„ßEñÂ-_ødÅ"÷@÷Pp…/Cé±Ìv±Nz{:zü_R·ÐJ +â¢X¿éå9ŽôzôÝJgVïÄ +8kn“d±¹€hÓ7T)Ž tÚu 02þS¨9ÐÚý§Pd†Åïק— ¯Ö+<;çbýÔ¿3ƒ=rvlÅa“ÝÄjbŸâ⬼G|;úËŸÏþ’|F• +BóÈRUÉÅúó‹2ƒ÷~ ùìÙóogÆڛϚòõ8µõdÚnÁ“Adÿ¥»c?c‹¾×½µÆäG¤Ã¿H2´ç§qéƒ$“lÇ +™ØWŒ›¥×åB–81¤— xØ—aq뢉µœìd•+d·‹Í½Í5?ûš3µÜôš+W¦UnMÜib¨Ó
ÆKYñßEÛö™žïù`5Z{œY½Ž—W;?.vYîŠCgXïyžk¥Ñ‡¡Û2(÷/’Ìz>þ£×„/ŽÛ×™ÙÃ¥Gg×?©í
¹hË_–æ‡}g0ƒ)b>y@Ä>ïÇïN +½övñ¹ª–m9z鈜TòÀœ•¹,&òÊ—¥w툇iÜÎË·Ê_'W›»/ÎãnÌgì{8Ü° ï„w&´xå)%Z´~ òP{°dÝBMÂŒæK¢åNrDKﳄ9©zÄé‘Q>È8Uly¸’ë«_o$øâ͎ં÷çNT2¹Å«÷>`%_Ún~ ©·ŒïâÆsBصZ|$z÷èyb71<£(Ö€Íò¼ÇðëÞŠ–fìêyøÔ§]8?:~}/(EŽ¥)†S€
m‘Á†ò¦‡Ý×—4‡Áîþ^Æ‘äö/öhëÔ_œJNoÜ¢W׺îðÕÂì’àu'R…ëGñ8¶6B»j]ø1s„ò(wýÜa§/¼Ë,A\a +8n¥£×2
©Vš†UÚö zÁfé…=®ÝJ'9ªX‡n•påt:ø,Ö¤‘4:åf=tŠå )œ+þaŠ5G ¾äB?Í”F¡Uã©{ÕäÙ}I»[îÄ=üªËd¢Ëᥳ\«9¦X^4iE J³"ž<E‰J\ž>´Ž¡Ñɱ“¦ZOtfr(t‘µØÞŒàq[!Á{[)å°¶˜r{÷SJšÔÞ +„3è¶ñûÓ qœˆ˜7™ÉÂtÀ×4@yf·A$>¼¶·Â‡y§7ò~·uÞÀnËRÞ—–ÕcÖI“Z1#¶Z&–Ž÷[æ’þð}#!Xda}ÜÔ¦ê€inx«^ë¡ê;S(J‡ü)ábg2¥únCDbf†ùür…¥cžs§‹4_ì—ÐÅüÔFMˆFÖ—vš] e„N»¯¡<„É`Þºdüc«…Isà7+gf@5>kÖ_ùsš=¿A¸žlM©î£_÷«”l…ûÃÔ3ÓÛ½ª¦ûŒº½¾xïó?\QTY™§¢àÌ‚»h/T³´Øaxš#èÁ§]n·:عuyö“Vy/¶©ÞjÞK"Ùt£¥Ôˆ;'³1Žãú›"Vuf:ˆjs虯å¤n窮J*îçëª8›ÕbSª…ÆW6ýb·²QÀñÏúZš5ÎIH±tŸáÕi>B¤Æc\â2%åM×æ½›Æ×Ë%ܺ^ý¨A1è¨6OÐttáë‡Z^>?«ëJ ªJw©^-
'Xe‡ß¹ŠZÀŒJu3öËÇ^f_n…W)gZ%ø¦é#qVŒ\§RŒx„/:!Ø-:«8Å»¦ãýïæ‹W/HƒÁ{jö<)úȼv•²»îðcE«0ʘÊÃ6uïä«ò ¶bmÕ ^P•È-]HÙ-<G¿0&äea,„a,–’üëª |à¬á<Ó-1yêi)ï 7;÷Ãg×9.È°Ð +ôGÐ +Êæs9èÌæ çÏqÐõo¾Óûëb[7.&ö +›ôê>k툕èJ…da¨#ÀÙÞ3ǽÌ-«åöKýñÀÍ¿ŒËÝ6Nv—»Ùªô\€Çrí +D½â
T·µ@Oš ñ` á± —ôinxp^Ò¿pµ‘mÚ~ÐS¡Ç„xJtóü¸E§ÔVüî#ôµBÜ®¢%ú¼x_†~ž}¾ñ’3<žÓ1Îà)Ž€ÎX€Îr¿:çæÀr +™ôCûg¢íäò«ë?«ügï¿ñª +nüʶí8™¿ô8É•4BLL[i„…Ïz°138§1B@ŠZýÌÆþ¿Jè!=!.7I!?Ó‚ÍcÊ2=5î™Ä^¾˜É5V~¾e³ýœ”/Ý'¨îcÞØÜ¥tyäú¥èº¯àú?‰_ŽÊV-¤¥:“ÒsÌ?úôÒ0…]JøüÖÁS¦p\–þÕ¨äXŸ9½âÐ}2[Ï‚½Õü1¯ž7îï«æûz¯õä¶Eqè¦<¼ft +B”fºƒ¨>y-¯Vö¹¹¶§õÿ$~]GƒO=yBªö'‡ŸF»”Ó¶Ýql_þsõ¿uð2˜bÔžoÁFóŠLÜW
¹{Û¶»âM¹ZtÀl;Òbx=SÓàj»ÅåÚ
w?ÐY&—ð.@ˆí¦³W‡…3yöOx2>ƒÞð¿[#;~e=µ Å/dÏÅ/ê¥7n3½F‚'„¿ù\ýWt}NøéóÁgÜÌm+‰ùH¯1ÕkëÚj^G
ïŽñ‚ÈŸ=EQÎTÅ5O“áÌ=É&8òôeut(ÜoCÜ3/lâBo‡{3 åôºl:eÁúM†6ÿ¿Ç»~ü6m-¶Ìǯw3öJkiÜj?
yà=» +=»—ç:2ÈÍñÜ(1ý×ÙçèÔm[壀éè°öt¿›êľYì·Ò6¼ÎõíÜÝMôÌM7Û¯ŸÅ3° + [v¯´³cu¾ÄÞ\)Ê¿(oZò—øýÓö<òg½‹%Á¥û¶’ïñ›Ybfc\/Æ]Çy«šåðñaÓ©Îw'%Ùn/£üesÛTã
Viƒëñ°[Z½¹±bd]å½äÜP\,Ó[iQ¤Kéˆo¾-ëËyE;G³ºo5'WmËN8îCj%8àI~<µÄ¿H€îÃL€Ž/§{å¹h¥7š¾ÇÈ[#Wg.îÆNœJ£ûºþbÒër×n½5Uz
V,V›-ó¥Úv!
è˼7&³cQÉÌô[œ†Õ >…%2‰ˆ=A'1x°´àÛ÷ýfrôÇ/zÙe‰ç·°4’«€0*¢4Oîô÷ 0}h 0ÕGíHb{ÅOËrÒ8ìvÍÒþpQ²[T.WS8‡,Öf±;¯U[ú¬I0Ãi[Qf“Ž®lƒQhžý<~ Ÿž2Þ,·Í{ÝÕ»>^–sè¸ ÕéѦ.*£²5v†jô\kîôí6×tÐÞ¢ãb]Áéľÿ´ +ì_$™LÕL2mܾbXŸûNÅ~Û!Ëfeýn ™uF'Ë‹³“‚W'·5‹ãYz5khzÜÀ—ÏÕl´yÏ7£ +»=
µÅá6¬‹ +µÛ +˜e×ñ¾™•ý&“-Ó¾ îAx ªósÖÎœŠœ Ö¤]ªþ í-Á]8‚ÁÝÚneKÉàƒIPíÞ0ô™ŽUnqæé:rˆqòt‘íú¹m¡Óܬ¶Ð?ßåx"ÌBú²Vr3 bq+€uaØ®^û€þÝ +€÷ +h#]*×ì‡ù4·l&àâUí½Í°8š
·9±š,ÁsEýŽìÔZXþ®ÛêQÚ‹ìéwéö;7˜íÝ +µŸŠb¼n¥R1™ÆX馘iô+ýŒzø,á–p(¥,ÚipyæŸò²g¥\GÿL +þÎ_íŸÒsñrAô|K³ø9)Á'¨Æ¥Ç¼N¢œµQî«6áßÅÛt/º»ð¶Å¦çïÞãw™ö°ã¤AÒi˜«ôœÓɧÅ~5ë·N¬ÿ¿:¸]½ì{¾…y2›‡ø{yíÁKö#gÀûxý{±Ï.n[¤·½U†Ö9Ò’á=ªûèjhëråÏÊtq +Ø(¼+âü‚lÌÅw/VÈÙ_Ä/4£Ä/pÉÅÉP¤âØ;¤EmÑn×üÖÁSìÓ“YË÷·73wñl~ ›™µèÐqÛQ}<Ưæ;`®ÉF¸8Ù}ï‚,nf8,<çXyygòXXœ&Í4Aûvrä5ø ¾„î¡ìÌ}ûÊÜÐw^ÐþæÉŸMür +rüB–lÚ¬–ÞH +N¦!ûõÏ
Ë)19îâ©2Žhnq5_àþâ€à%æÁçÙ+Àéåó'æœ/çp©qÌ
ªÈA|6Ò벯L +ÜÎs–¯£Ï®\!"£¶Î {kóº‚ìŽFoá‘Ö%f®’+“æ–+U¦Ë® —Pa|\|¾<m}2—‡oh¶/T*³šÒjMO…œ6‡3ib'/gÒF{ÿ9jç½×ÆF<‘‘ñl؆Á5 Ö>õäq»¿ÉýäîcâêT³å󛃀ӌ%§.þz쎻ÖcÓqª¹}i4K¾AÌfšÆëÓÓ¹çL®€îMú»Õ2¸×¶» +–ѵƒVÕÎ%¦™—¶ª^ÙüNE¨7,DÕ_`›]ù7Á¢ôå¾{ÔÄäèí2šK9Cæ§Ñ¨û“w¸¯ä½?RVd:wÍgk1@®Ê¥/úoûý:”í,x…|þJ˜’wíþ-Õ¨ëº]hç[=Ð`Yª×X;«($½áàPPâ¸ØV(J LÌdV/ +ø³>½9眜ûи7×ΪŒûÔ5¬…ŒŽÌrŽZ5عèÍîêµÍ¨¨" Ù=’Žò"J¡'yAžeKª%[‚ÆXÜ€ÔR,ã½0ÍÆÕôRñ§LRå›<Er—ü»ÏÙÛÌk;A™k÷Üâ‡Â‡<×fÓ´üÃÅÃ6Òö±°…VžÕ&ãÅ<7®tàhàJ§e?Óß-ÁJtC]îœHoN¢‰z3³{µófŸ=²j@ +Ó4*ò¬?€eèîã’ˆOYqã/$±|[肆í\þd…Sî2Hö\;†Ÿ]—2Š]HpvÌY&Kæû–,`Ųø±ÄÉÈý!Ì–LqC›StnºA=˜4'ùá™®9˜--Q
6Õ´>+˜*F㩬7 +3L"™Û”iUiÅm£]+vI[LÛ· þ\'8¾eÑ=®¿ëÚÝ{Íð»˜9ݲãmxcÞµZŽaL¥gQ^¥g7äLsî5ŸçéÙ=—²C8;œ¸†&6:C<¥öù<cå]‡Ù]ì9ÉÍͺZB÷zãäõY0¹„˜KRÙ8‰[7ídÞÀ¥Ì§=N‹»._‡–2LwØ͈l¼,›Ì{[2l¶³¤ç‚qùèÜ攥¤l¹Ek™ÜŠ‡=¹•†PÊ<G½ô²_ŽÕwŽ_n42ÅKbÝ+á(4ÀùAhIl}¦[\uÐó/Y÷cQ’¨ÀúÄÞàÇ\{χ%"âá™áœ§[è>È ÞÅ +35¸æ§j}Q0Z@4–’¢Dîì¾EV÷OõçíN‚÷q‹†ì´JéØ«g±H¤RHüù²%3ì¯IôAv‰4†mh‘IŸbvÒCû0íùìÚ‘Jž" +GÜåý»Ò-@›}5™)Kã377⯠+Ô4úB³SºOÄaØ ¡ó—±´ÏÚaD’âŠÚ¬Åª”Í'©i^–8'E¢¯xpè`·çÅ°Ö[éŒõúz*K”i-#d6¨®³$(ÞM(Æ´>‚H7 3_~ ¤î€/Ëmïøkýxß«´ú¾
3ëî{L’vlÎ%s"3óQšÓq!U± +©|Ÿ8w‡"=©-~µrWvŸJy‡ôôùÒñD§¾'Ce³+™±ä¶È¬-eµ3¼®Y¸²;pegáÊLzÀw +ÂmÀÊÌOq÷—yX°É ;ÝtF-üÚ´—à¥Ý.ÌîR¸n#NIÁî’“œLgU†8oGî,¦<6¼¬ÕNÂf‡?‹Ï;ÔqxD§Íù
e/éõË:¥"Â?õöšÀ;íR ±° +zZëÈß½VcC›68~§#qxµ‘IßQIÀ¾×5a˜™>îåmNKÜÅöVÝ<`~¬’‡úNÚ’@À#ÑÍfæëL6,€Å#•D»ÜG»Àÿ@íM†ÐÛòl0j—µh ï¥#¬&ü®ù#°ef¦ÅVsö€›ý|žlÜd\jtöC·>®Ç›:jI-@Àf¾ßŒ½x\j´ ¿k´X}Õh2Ÿ|ù¾›IfÝ¡Çõ÷Œt²¥jU¿Fݧ2_½wb9]j<³éÒúÜÓ„Cg•6Ù® +è~ÐÙô]@ÝÑ«€jvòeÜX5ù½Ñ³©ø•ÞôZˆ…éíÙ'L¨:aº˜WrtDRB¹Ï +ݺßSÈj¡}@Kf ‡ ôÙœÇóc§Ê¤ô”<‰Îû¹×ãîç‚%²IG9FŒÁX"ëÐ,Ú3çÒ6Ä
ó;(‡/À¬Ø§ðìòºYA9ÀÍ@€Wúì&ð%Í-ŸjAìuZÇp£*Wû˜ó²Ö‘îÁÝ9><p#4rìÖ%Mjë/*›
F—Z–‡åãq©Ë‚G$+w$Ø›h°Ê¥Ì1Ÿ53zÈz@ض>õ1ëv¾ +žŽ+¤Š˜ +À¬—òŽÜb„”×ÀíöìKO,P´0¬(³ËTªxòÊBˆVMâF0ußIÊÏ1F?Pš^ú “Æï NÀÔ¾`»ÍgzñÉû=ïö[Áµ»+ +™0bqÔŸ +[²y”wóñá.T&…›Pq2Ñ—kgÕ¢vWU/¥}šŒÚóh\êæƒ({èÿ@ýxÉ63-ÐVŽ„$c‹Ö,]/t|ÍbŒz=¬£Þ=\'=œ¾AŠ7{UŠ/·äɺ֑³å&-ñ!JùºaŠ’4 Û]¸ªõÒ•×-5Ç7èjš]pÖ<çs0?»¤\îÝk2‹þÃõKLAj“›µùqù†‚L®w6sËi? ,ÛZ”’Y*l(]×]Nƒi·§¢ÚiØÃýÌBñËíãgN/Fßå¬'¼¥ÕÏKùé¸*ÊP +°#-¹Û
&’ .7âúú¼ˆåNæ)¨ã"(ÔH¤È¬Î]²Âµ‘úºƒ)²ÏÊÒb ý0þ¦¶gheô¢§Z‹îŽ}ºëG‚+×ß”r!Ý•ê—/Ç*(á«B~_bÙ94Ú¢³C<±ÀÜÐYSo:ð©vWüåª#w+/„»&Ê×´‡×²ÌB¨ƒo6—7îÒß¿¹öýu]üZfŸ~ÜdÇLg^sŒgè„Óé=ÓÐ춥Ä|'¦ +ëSÜ(Gó"•ª·O‰#RÉ^/BR~Î佇{ØÎwûvPšýѱŸyç|Cë
ÕÅ—œâ?i‰R°¨$ZÐOáMýàp—ð=á4—H[Ì“aÓ͘‡Cy·½"Ãh^žçƒÏ%º`ÜĘK*–»"öÑóNÔ1±ŒŸ’n?½ØmÊüŠŸ.^ø…¨&ç/[üé§ýØÜÄ”J +‡B#=¾5Û5»Cx„°žºc˜wœW–Bÿ]ï¹¥*´Eë>A=ÄT@‘œ3ˆ0a@D1çœõýZkݵ÷>çþùUM§„9ÇèÓéã•74 +•x©Ï^î½Ú +@)ÈçPµÖ#(eÿ%…³Ê¶ÜžŒ}éúz%ÅÒöâ:!b´[äÅh¶Mj1ês1j;ñq÷âcNo¿˜MÅ<?”Ï2Ñ#¸hÅÃתNcåЋB©Z.ë¸eŸFg.¯èuÚ¤Êãw^52^XÒË·ƒ¯J™H« Jò-qò·j]ìž•C¿”¦º…åd¡%dñ)TiS|ÊUÑHÏú°ˆï„|vвaò“|}$@´ Ês÷ÁV€òç`ÀvŠg1.0NüÀ݃½›…ébY=Sɪ
w¯Dxo+¯Dδî<¥ÏݦU +wQÝIKeÌbE9¦û¥¹¹
å-äΑÛKwA¹Jáµ’“ÑfE£?d„Qê ýÀ\ \¾8÷Bn‘Z.9gl«³*‡•Œ˜Ã´ížÃØù–ÃÐá†s´É/Æ~êÎõ'Bâ[6Vž;¯(ïgPžW×^¡©ÎLœû¼î´îäÇ}ps +¿n°r é>»%
ƒkâë’ÅAЉ¦½]£Ùù(ØNæÁO×Ì—ªÉ-ö¡ÌáܹÄV«D›ÙíÛs¦ÑÄŸôñ²èãæÞ£“z2'ÓÇÐÙ0̶’`R\1¼!;>rZoªm$¥IQÙ™;ÜN:%Ro¹¶ÔŠ-cJvu×ÝQr0Ò0ñ².ŒI„ž¬ó3QæËèÚç–Þ%é÷9Ob&~ϯÙM¯sfkÚêÍìã;Êp0ÉѧiÝ¢EôàSÝŠ2!»Ù•Œ|Ÿ%#gÔ%#ÓؒάÉ(ȇɯ¿ˆA2—‡»Ú†j–RaÒWV¥õ~â_NáX)¹Ö P6u·Ñ‘¡?¥Å¸Œb|¹ÞN +1Ü'™ƒÒæ™fæd2ÜuèsËnÒ!ˆhñº˜P·îkC©YæJ>nšì»’[8Y+‰<ãT èøâE±|Â3wŽÂ3ûRÏôá
žñ_k<S¾$Ðw+¼Ý×ßHò X—‰F52.Þ`OJëk±cSÓ3G·Ô}»"Kz5`ø¹øÀ`¶îÖPêÎÝÒØÝHb¤C<aÅ àaŒOóq/‘ÏîÙ ¶ðKÌÕwO¡™ÜzÔrr)¡»y²„5ÜÌ>{ÜLrÙãäágÞe¦Ó¤GF™Þ`2`õE¯zj$³Õò–«µ%øì"ÃÚ¤èÓF`Y"êé„-ÚrȨŠP,78v§>(ZÎè9btŸ#˜3è~`¨oV8”Kµìió,ýÀÙv®gE¦ÐÍ\Ñ8ÓÓûŒb™/ä - $šÊ¢—Ž-äê+8^ó0lÕÊ•¤Òð{âníVM°-¿èž‘ᯘDÇÅ©¼‚k³¤†QFÙÀp˜tU¹€LAÌ_«V"-g41hóâ~6{ne!äùØ!ðð|$’•üÅ°̨ÐäQ,$˜×¡bêAYCŸ¥©ø”Æj”Zg¼¤¯LUˆvx0 +ð+WåêÃ,_ér{ÓdN^Øé+¹9Ö +VkµŠYeµ4è«¿zra Py²#$èk@°oá¡[öAÒC÷€°¥æ@„F ’r6ÁQ¢ÜùdÛŠŠžüIå’gb +Èݧ
ä° +Õ^<ãJj¤¾§+ÂLœÙ5`ô!WR\Ñ/þ§ž<Eê]À¥öýö7Ìá£ßbää“Þ`Ô7@éŸ/Bx5ˆjoVêÌ€zàO@}aÐP¢´²–Æ€†“ÉKü0Mpžå)Æ›Þ(+ý€ù]¸½S£{iq)eôc/ UuÚúOòw<ß¡ü—øŸxûK·Ñh +´s—ÿ&Ú&Øu.4w·íïMȾÙÔèJê`! +l~unÜ,¢Ê4æ¶æd,ͤ·rÇ¥÷¶>ZZÛÖȃž½á¦†Cj ÍbŸÈmbv«_m¦ú×V?×—¯71ŠÔ‚Û{Çø¬[AR[ö,¨÷øEzÒ¸ÿÃã9zÉÞ÷³×ò¢ö:qç´œÂx‹4¬þÒO5£¹¼b†Só”ZL0u£ƒìc¸)¤ÓñÞI£ŸË¨A›Â“Ž¯õq¹/Ÿ)#ztäB¤ÝM¯÷îUýžùÂplFaº¯»³v颧*x•¬2vjûö¦CG³SûPŸÚÍ\÷ø_QùV¬èè|0ðÜNëÝ’¯C½Y¿q©N-UðÆ¥Gä7•¨sè8îß ý*z2S<ôÕ³¶4NT3‹Óuð²ØÍ]##¨(q! žûJ§î¦Û—ã¸Ý¬¹ËÖù9½´:iÞÓ=¹©Ö›¡?@s[?å]c„Ÿ·ÿüfµ¹}fÍ'ºCNÃ×¢Û~¬&e ÃÝ&]Ž›gZ‹¹{ÎŽž×›—ì—áê„Å.1êb½ +*ëÔ©?¬GûX®¤“Ò¥žm]:ª%Ýç|óÞ;«M-—)ø¯•RõM©4F½xÔ°õô®>]Ùï:JžØš›Õ
–_T© ¿þ+{YZýÅ,¿¸.Îæ ;}tÙ±w×É|¬Ïã>hEñ®\ì!ÝŠN›¤Üu)ØììVd¥ÝšªA+89£f5Wþ»>9ùækûhŒÍcên ›W¶>«cd}IBm9pô‡¥êfsö«4“ëWüAaYáÌÍÝkO½±BÍUâÝÔyZ÷•Ó‡vKGó8ï§Éì<5l%Gò°%Í'Q~MùÝJífwULnŸÞU¦uTÕ¦nV¾U5gÝ«—¯©im¥`›1—ÎÕ:ŸVA)]iÊ-Ô;ÏF´×)%÷¶z™nçùh?°cè«iy8ÊÊùê-M]§”Øaq~µE§+Ïÿ Æξ8†b™]^4Y²Úµÿ¶ŒQwýÞ4Ú—ußn¾¬èû²1©^…º£rj¤ŒºU¦,·+Ís5ö.R0÷¤étçöØÝÅUO¯—3ØIM)¬<*™l^VµÒÔ›–JÙí«YtY>.¬ÛÍm¡š'¡…dòv£¼ìÛ,–žç«kÒYäÃýôöÃÇÎßí·éK„¼àa§–kÍ8'Y’+ðulß%jäÐc*dž'{åÛn/\Öwö:¦‡ŽÊ£›°,#ª¶/ͲÛ\BÝÖ»¸Äg™"^Û…êá*¨kÙk©’?)£^^XdWÖÕ
ßV—¨¨æ£¡„ Æs3b»S3BýÉ/zoo¼]7fVàñt|3âSHTGƒ¸õÄéjc6y™µæ+'IÁ½`qȹZ÷Æ9æ‘6Ë…´î–fµv»„â~Ñ36Ó"‘zo +µz*дð°ý¦åO—B.ߺ¬u},5K1Ò®äÎlêötnÄsìnXÎ]0 üÖÑÇ[}úqü!=Z³•<1IûôÀ@¬CÐäì¨i=n•ÚVèé•öjƹÀ‹.Âåß¡K9ªÿÉUð¢[±°ÅèF¬Ðöå¡ÍÍâe¾“ïòâêtµBòú6Ÿ>@Ì>Ç‘&èdúGE}¢]›zf(Œµy~qѤÅh¹y§¥®\h¢®Œçø‹X˵Àè‹eWÃðñ¶w…¢É +Úu$‰ê5æÃÐ6UÝ}öj¬cu‡hiŽñÉà*Y Wo7¥¦•?Oç^^BÏ-+ìdú–*qó{Ó(Õ>Õá²ý0òÞÒ'Û¦gYHÐœ¶’×0¢ÛP+õÇPÙ¾KG¥>¤…±ù†ÂÈ«ñP“‘R·ç¿X +‚›+ÉJ¡'öú›¨™~FxC=OxÝÕá¢F `)YžSÇ °¸WoCÁqc¬ü’âuª‘-;£Æ^)®›[*ñ¦¥eM`¦®ð[ŸÎqTGy“ÕÜQKÓð걬V÷¯ºJõù®²7ŠCÅOuòÉ·Ék#Û›t-ßS’¼Æ01¢ò’ðö‡%Á¼@Ú+~¬(0o¿JoŸ²1o/ᘽ³qJ
&dàbƒ´©§;Á[6pCl{úX*—ÚQr¾£!eiÉN3ìq2FÔ=4|xʨÔîJ(¾NI +—«ÚÉlx²˜ìéúHER7b&âH+1:GÀ—OwYÊey¾Pq +Ül·jq9ŽKfKvy¾vy¥Jìrs°Ëñ1f—Ýuò¬6ísèf7g•3 +„³nI¦QÍIKé}Ü×ZУuû +FȘ’mmC>¨¤ÞÕüG–xó%‰0ƒµƒžj·ûÏóŒ#"¤à¶÷p[JG¸M<z¿Yï^¿ˆ¦Éös|¾ÖýÓÈ…|ýë÷ΫtF62ï©1*#¾ÚeÀO››;[”3݆Á…’ßY@F“ùI(RÄ{Û‰8<X„¥A‘~‹>>Žkž¢)6Û¥X¹QHå–§ó:ZÝÜZ‹œJ¹µ&Z3Ç=tÓš%pãf7üÆ}ÿÀÍiª~®Ü)?.;c¸n_˜“m¥ô›¬UÓÉpd +É +v¨§Ø?èv‡»’ú`xÄ3sçŠa©ÈF£LŽDº½´î:ÊðN9{¸ýl3xöà,¯(ËÌù]3‡!w<Ö‘p+7µ~_Á/öE"ª‘i ¡Sè!¡¡‡Èiý"¸¬u¬QÕ±£g欸D>^|ÏÝžÈJë° ÅXOç> +|K„ès9~“Ýðl¡sFwUxŸ Ú»Ò›ìžHoŠÂˆÖ0‰œ<8cÉ´Û)¶á´4C£q€ì(„ Ä Åti{iT‘G©Å?pe‹¥t©œ‹ÒÓˆˆ xOÿ¢n¯²5!œîÒ43(œ¸‹oŽénAÝÇMEŠÖ#–w +Îð +²“ÂQ<Ñ=ß¼eºzê„ +‹Å3ù–\õNyI‡ +¶|ŒÚåĺ‹ë€ 'p˜ ¹ô4÷L0§•K€î³1 [© Ûù" +Pè<1ü‡ï}+ºÙØÿÀeÍóÑtàëÞ¥V’Ãz]Š³©È{Š|"†£§‚ú‹T*£ì+Ϥ$ïP¶x¹F¦ú +„žK°Ð5Û@èö@è$bÁÂpxBPd„ÒÒ[g]Ÿ½+êœÌÉŠjîFüº±ìÒþðkRFÛO<ž-ZÇÀù+%}—ƒÄÔM"Œ?"®©—€ØŠë@\<:@|k1ØõH¾óþ¤7Ì1&Á¼¤£ß2Z½9çJ@Æòm ÞÈâØ +£G@uÐï³ùIÐÍ×ø›½,hW´^(ž7B¡vÚ+^pl§ +ƒƒ<S&{m%.wæŽÞníSæ°™‰¹ëÚ}žï«q~¯¨Ñ^úÈ+·89)j!¬1qÞ¥xcöðw¦çɛƲwš¦û 7)¤ñȈ¾ø5´¢Óûwxÿ‰âZïsõ¼G!v¡½¶r»tM`73žUVía.}h_üÂ"væò&ªÍ":jNßÍ(˜š—(šŒåx4±Ëùx¦ï·ctx=<øýá313¤V:ûdWœ|¤>hs÷í@¸TÓý®lC¿¸Uø‹Ÿß‡ÇçӿcÔâÍ벤úûcëLwæê1_mÔÜtÑFV«¹¼š§ïÆü9M·×ðx¦Žr£¥9 FøxÄk™©ï©³ë©=hSg ìµä[ºÜ½Ý—/X?Šd~Ú{GùmÏÍ[8ί‘™1BwæäÚ]tÝ^ËêòðÿBr^x™{uçZ¹ó«Õ®Ýk§¾¦Sï³_’Va<“¯>Ütã}i3œ¼ý²Ÿ}ùø¸EÚõúîÅÊ
ê¥ûO4›2Dƶ;+pr‹F°t¼r€¯ÛõNwÛ{ÿ:i³|×:Qún O[o^p»Ù5‹ã¦’VG_ø13ü"9¹}ôB¦Ëï½Ñ†÷K¾ð§y±êŒs¶®7Ö\œÜ¢Ú—ªÝ{’×KGF+D’ª¥‹Nóã8ðPgÙÙx•]‡º5Ïm_í<Ú\v‘nµÝu¶%Š0Ý솘ØTŠNÞaŹ۰Bbú¹¡úµ^xû|=³2ë5GšÆ5ý/~à[–䲇û¼V‡°ž$ÅJ;n•ý|_]Ô…<¦x϶˜0Ãj|àmM£C/ªn›»ÍV§°ˆš·Ã}ÚTù×Êï³?•É^Ã9ÿjÀ˜Õ'—þ׳r«ÍG½†Y§ZYçÛU2ØN+õ'w©0BðøͲîjºçJÏkø?8ïÏì¶l5Ÿ³øåÏã3Þò£ô;cu=pç:»‚þÀ¦Û†Û‡gL´¤ üWyf&úÉmÀɹS/尶谣væÕjÉÜV)Ô=UíàYaÅäµÂ=æ^QTpƒe)ï<ÄiÝÑz©~ù]êìËq.Ÿü–ÒX&ÜRé†%dVë–¨üÃQÉÌÑåyt¿+þsÒO¥Ðz°íwŒ¶»LS7üŒoÞ¯o?ž‘úôv&jî ’ª5ˆÎW|Fñ¼ÓÀkýÀž˜ö{îu3» +=›;çcçèÆûì€4õ*[5+S†èˆ)úW½8OSn±<ÂBRƒÞqØ[±_´ë0×µ“R:°éÔùƒú³½‡ªNöž«Æ%¾ôš£ÐEãj[š%ía¾ù¦êŽN 5ï濪›£*~WÊxíCuÃT_súÔ¼è€èV+çÁ³U†Ö\¿T¤Äq)óðVEG¯í‹ˆo…Õê ýÀ’ÊávÝ·$›Ñ“íÚ¡më‚TgVgN¾-©¥ÚfxwÌp3lÿ'ÆakSé¤étWºöÛì h„º×4£ZÇ1YeÂ9ä]p:é,ÜÛ~~sž«T&Ë`æH±”ÍKfÑÙ9Nk„Bå= +d|Ø
â9µ™±Éú9Ï¿ko+°úYK†žœÙ+‰–ñZ¶Æ ‚Œ
SZ?õQ´0~`Ý6ŠmÝæó?ÀÔæËK«‘o<ü!ý]¿ÝÅžN£tlÈU¶S <Y¨¤Ayu/$ãT*¾óï¢K¸™Â:1ön±VlVxÙùã©üÀy¡¨6kÖ àØ™a²0{×óÞx«àfÄY6Òn‡ÖíÍÁБºRÓJÇ8ÖжyU—RIUÝG¶™€l«î>ÛúƒYª¹ÐjfzÄÑ›Ózv£×|?&åÚf,K^·DàŽy`R¥\¿'øX¨Nà‡Ý8âP¾– ëZ«Š–|óÑ?:¦žºÔŒ÷ëqMéƒ1ÑÇýÎFϤ†gm6z¥>l†!TÏ©(*Ý<¥VÓ#…¦GyB$Ùo/²ï›`M}yïšótŸMÇÝKírlן€z©êÏÑÕÝVΤàT_2{_[’-Ö6«[]3ŠN¨ Riƈךj@rµ =OÏ”Mmž»„Zyi¹ª´T½‡sT¶zç©ÔÁ“6/ÉܬS–ÎN&”Äuw'Þjc^¼«É*–<ôšIIÚò¿ÄzàOgk$=ÐʾÓ!ÞAÃÕbE\í“:¾6ɽÝØ~÷~¶n©ÒÎŒòÁóa@Ö÷䌛—®¢æäpS]uäò¬V¤RM%îAGÙN×…ASù°Âv2OJ7é¼ëe%‰½ðbØ‘ +¢*¡éÁ0 +Œ`˜BE0Û\k}·ä}ÓlL¼Ý>MÚçM[e–dN&ÑlÁ}î"¾4ïwrúÔy[7£w4õ‡°3 åigîèMÃP¨•¶•SI±Í*õÉLU˜âÕ–,U‘›')óíjOêÜZ#I ++±‡¦.¢º4“êBVH5Ry>rZ<Üɬ¸©LPÜ”z¸Ü4ƒ7¸É©ó°B5x˜Fëcú=Nõœp¸n¥ðZ«zL¯ónŠõùbe”GóÈy›IÕ|Ð'Ë÷Vs&ãu²ÅÈÖø¤4Òû§|,Dæ4)]ZQ +ÌÈ”äô¦,ö +§š¨1hGxµX´!uy[¹¼yøeR\Éìb‚5X·8Ÿ'íügq—<?0‹Oɘ»þbÄ{q:$••?¥•f%ÈÖ×H]h jõ²üK/®Ð½º.Ž7JC°–r«`í¤ Y¾ŠT˜µê*'¼iÀ +ƒ§¨ +f¿l'[,mt=Þ^}©^{ÜŒÆ'ÚÔ¶ì’ï=X<xä˜êÓTª¬Ñ~º8¡Ù‰“¥ÙžU¤ÙF·F7¦Ñ_ôÚÕøúé ¥dç
—Ïøž†Ùf²Š¹jŽµ…œ5M!ûÒp8}PXÓßHÁ!³µÕy)˜päÇeâÁry89+šW–&<‡ÞÏ»œEÖ+ëU–Èù¦V‰-½W´ WšÓãd}¡Ú#D"“Á%»slH*n6M*VÎ&±P%»^¹Fv-+y&*•é*©ö#·›Õöð¶á¦)Ê(RÆ™±Ä.ó•½Uª‡œ¤k°Þ«ó‚Ï°•¤¯ärVgËõΉÙ2«S{ÆŽ%Š>XŽHsÛŽAëóÕažuJ<q!y‹ý)©BËC²piÂ@#VО'GíÃ'Í'&
2Ü:æ’9·‡Ç¯Œ¡ÑæÕJ7J㪰¬×Ê¥÷U·OÕ9cÆê(££ûË[>-®'1šë[¾°[-Ù +¡NéfžS1¶#ïòL†‡â›T›A†xñkŠ¤áϦŒ1o©‚ãàùyÇÇáæm€Mee»Ñ3·P 2‡
¢<º¶’b•œ¦Îhå¡jè™{èê1ts˜¼òr5q»ûu÷s2üš¾K±ÔóÝ(d~`c¼dÕ-X¼¥›ù¸É¾cWËpIfFöäÁ
[lºkm±RctÆPöòÎ-•Í¹C3YÏó- ÝÀî³”ò‹ÝlãÜŸfÙ sδõdïg„~NC®Æ¬‰tÓÁ n;¹Ây7#HÅ¿
§£ŒWçÚÁˆÎ»xÿåk–¾ª0zùÚÈ*Ü=x‹Faåœ}nÏ0·Îš|¤á9>Î5’:9·làìß}Ì3çlz“i/¨SFtír¢Ò½î)¤{£dD ÝüT
8zcX›[ä1 ²fV-=9™&YmÒ…â˜ñ ÷[Mö>ô>ñ^s2Rßí2†L=[<Ý„á"«ÖûZö{54_âÇ7¦±‚Žä£UÜàãè¸Èy»Ò4ÛÞ#$ìÇ°1Z® ²ÜAùÙõÁÒSLO¶X:[õèÔ‚š©)瀔Áš×Z r™N +Þd†±'…4K=ºJ©ßÎø¤ßç*•Ý:ËÇöÑ2)œÆ6³4êÇkP½ëk@õ +{@MÇw@Í +¨1…*ä½ý. êà‹ê5[Ý8(³íZÃAÍDÑTÙ Æ‹–ŽãѲê¶j¿ Ø}ÞsU£xÎ\ÙÝÑ¡`òæNyûÙЫxèóãèzLÊJ‹s€Ò\Û +/õšÊŲš]%S$:&œC®‡ÊbÖ‡gë¦|Õú8º]ÉŸA}‡òòÿ3½áïÓ~¥ÛÂv
Ô w±‚€Ö)0@»àEô} ãó+ÐÅáçÜץȺ쮸8ÐU¾ +ãBêp-Ô2y^ÃöV£vïªÏïÌ}[ÙŽ¹®¹E:ãòz©Eµ5oº+jŠÌ—>ºG–쪪þæ +»Ï½8¿_ëWý½ˆÿ¡çÒÿ+‡jC.w³üâBæL¡rb£á'zu^ÙGhÇߥëF{3˜pí>SýU
\†Ë}þ’T}KvzY.Úè}7¿z÷Ó\޾ERÓw›B§æM¦'cµªNÁ—!u0Z–r¯‘‡†Ô_61ÜxûL*7hó£ÌÿŒð£ó·sõ\<ºéÅag®íó¦tÆ«êëœZúé¤&ægzö¨®„éÛŸ«ÓtghNìû°0.½;å1«#úÃMq©Å¼ïÝÛÇÙmm†Hf˜p¬¤ûò5$¢GH˜‘özǽتžþ_ÖÕp\,Ýþñ:Þ§®ç;så‡Ë½QlÏåå®=5Ao‚t[ã1Úï%]ÒÈK-ÎCj6xÄìªm2Îô»l;×—O1EbÌõÞa,õbu©÷ÒƒŽÍ·"¼Õ-gå~]´‡¯ÏMB:Ôñh¶}±¶ÙÛmñÅÜö%hùÿÆxéïVjó.ªå'c¾¦ð!0b?;Ï„ÍÄÍ¡ß{“°g>¶£° +ÂÕÊ䧫.½J?Ý{•šäì*4Rg½ý!Wòü¾Rõü¹Uû‡KÅl‚
¥3É·ã£_³"cŒ1ÝùA‚•ë¾:›y´}rZ©Ÿm*Ð*©ù}9+
Ë|æëãmÆ©gT®Q›gA-ç¢äèíNªD·»¨lûC…ž_oÞÁ¥!»–I·£ÄŠ+eQÇ ]·[~ÞRÛrRì3å;,'ØVJÃÓÄKúÊÏÃÇÀ ÞË“OGµì ™Ç³TwU²u9X©¦zï^ý*žü¾%&kýKÕ³i¯at‘¯’|QÔGMÛ;"¡ë5gIózI97HAƒØ¹Û™‰ÓC¸UùUÖeãì¿Ê©N²ÉòœPœê»XÊ]Û…EÕ]\¥EÙëV´“>´üf¶ôÅn¬Í__QyÐ}²µ®7wÔVw’NfþƸwu4Ìk8_ßT׶±«ìtõâ+nʽL¸s_XGwjy0¹çËf)ë”F'¦^²ÛF§8½å£biÒ™–ÙáºàžÀÕÞˆ<dSa…Êï‹ÏdïçÙ¥^·NÞcf ÷GμΦ¶Ù-/JfWÿá1^ÍÁ$‚îc¯}Þ§dºÄX˜Ô^®Ú?º×sjåv‰éÂy¨ëC9Æ·Ò¸ð†“ý‚Y²Xd¾°—´‚WhÙöæ0píZsÝÈR— ï³qž+Hs«}¨Ì?|™Ýk7ž…Šjô3·ŠÜòPŠíŒnÝ5S‡z¥¢5ÌÂ?ð÷aq{,®Ãæ½9±vÙm¾¼©T[s +újçÙ8”‡ÅŪ4Á…I)£h›bαÏâ“ÏQGÆhþP^Rù&Ÿ–¬óˆ2Ž•ÌÛ̬˜¡ßjýÀ¦ÊzF¿³†mõá̸ëp®—Õ&LÒ²rÝQçÏÜ@uDZÅÌ«¦¬!´ð‹Õ-m«˜ˆæÆ9¸~SŠ6›)ûð˪,e×ìüøËpÞ±½(TüëØÞ®ËüawÝY€Ü-©"Bfx/ã¦ÚërÆ +|U±‰(UmÊ+TÒ+þÀr#?e¿d6«Òq~*HÇþÆ–ŽÍY^f{{†À¦Q;XÏ‹uwŒp^p\eÊ£óüQtÝãÞÞ5ñy¾EF#+@Ëc³'¶7Æk2>&sKV1}Ô†²ºm)´6è‚Vª·
eÆEuqÜWTÜ|·”
ÄöªhÎä}vp”Ùv:-Ä*+ áу·Ñå¡xå‘.%D9ˆ’ªÚÎñ½ß½?èµ´}³P£f{ÖÕ®¤„öœ¤Sz»¼?ÍÌû»04h`¤e©#¦¾×Jÿ¡¡µ9¬ºÏ3®âƒ§ÔpZQ¨nÉûZÍ‘}eæÿÀÒ©¿¥¶‰NÄëXÛ‰ÝÂè-<Ž8%DžÅ¿oX›Ãç‘·t ðgåù¸\ø]·ÆÔõ}ñ‡Ùm¦Ï†]9"ÆI?óp·|Û(m“cìјÍsKÄ:Ò_Eº¾ÍTOÉl•MŸ¾(4–ò~ÝÌÊœ<¤¤Óc+HíyÆD‡+Š7¬P•j-<åýHÐûÈF +óuò[¸ŒÛß±sb±s8gq‰ø2cÛÍî!8 +Ù»ÝúMDBèE +̳²;Æ[I.Ÿg¼½Ì&Õëe‚ÞØyC—MBŸŒCÜ:ŽcjígØÄBwX’¯XfRz眬ŸÉåŽ]µˆf1»
[l]}
3‡8È4W6ÃáŽtÊbé8íÔŒœ[¦œá%åþ+©S»Ò¨*xªWF®l¾ã44¼¢]ävÚß +ïÎ|Æå TÌÐN‘·¤É À¶ÝIJ‚ØD+:Ìînm¤ +³8ËŒÚÛÌÑž]2-€Lrô¢È¥é±HÀ/
DºâøÞmôàž +oaõ5€¡W,Éq[Õ!ãÜ õæ¡WAPaµ+ÿÂ/§O{Þb±¤Ï=óYLŸÕð”JÝå«øxZ[¾ÐëÏ™m15¢$ÊŽ£ýèbÙA¹…RÐÈ•y‘§‡±çÖΙ9ôí;K+2‘뢔.€nñN#Ãw+UFì)X–w€Làc²ð[¼'âÀÝe°„gr +Íï•Ú!åõœB0(Ûgœ–ÌxãÚò‰¦e±õ¾ù”¸c+^}A]øã˜0sZ²÷1”Y†(Õµ:-8ÚÚuÚF©¹ZïƒJZ + âîå'Ý”4U!ÿE%Ô3ÝR…³KùP$cRÊ’ÊaxJ‹Fízãœ} [EgE‹)†îØaöžõ‘›£‡°!gºéÉ{ÞkµÙä¢'˜|®à&O`
È·~NÐ}*a Êb‚SPX©(<µL0MŠh*€‚•& ÔWä«'–ý…›ŸÌƒÂ‘dKVÿTn•Íâ“8}ïm`¾Ô¼>éS:‘ L•åóz™=œ´>—#8µö‡iT§€šÌ{€ºƒanhØÛšŒŽ€–®@Û"èjD:i´<ÑQò[èp¸t¯˜t$Z€öß! ›—+ =µ +ßY–þ#ã"*¹.¡z°€0æ\ \ÛM ŠøˆÖèÄŠýè–¦'8w€Ø]&ï†Kˆ½uòŸýÜ+ÁSâ )qmÙªí4Û3,Qa:U²@L‹¶ž8_BâÁ™ƒrýbòõÚÿÈoªDð¹*ínûµÜ~#¾ +î7Âែûµ»ö¨ÉÅÈ´Jꀂ‡,PÄ‚”<;JOÞëòPBn”Šo¼ÖJôêê[®3—Zs»e7 ,$¬cô`êdŒÊ)-Úžù«iÿº’¿£ùª¶ÿܶßà†¯tû/¸á¯tûù–¡ _Ëm¨ß2@«Dÿ‡®ó\SU ·õôE”‚ä$A#ŠbÎ9Çû?HϹ×ÚëÙçÏÛfª‚úÆ3j”´N¡´‰°Ú_{E #âè,ã¡}
þ×üý$Ç4yúg²ZÖ?Jh’»¸>ŸÅ(â1F|Œ»ú|æÉüßXÛ°þÔfaðø8“ÞÃ\ÍGÈ»-ï…=t¸Í9úqsÎ
ô†µ1õZ~|3ˆ®DTÚþ›h¢[l°küCoõrá¯L›ÌßODÐÄ"šXWÿñ'ÉìôW^Ž õã1Ì,Á*í3?ðñ—øÍ9,éÖ8 ×òå$_¶ÒÕ¸øÏ”}>èpùÌðú)€…ßÈÃÓ«lùúì?õµ¶òn31Õ&H×êÌ|…Jâ
Môä|« Ý6ÙÁsñ©žÖÃœCå{a5oXé]¶âg|>(Ÿå)Hm7Ç[áp<<Ýùå çýšv®í`„nãkù]-kÐf×U¨/™‘¹<—.ÞRÜ2á"dV‡ù³Ò‰•vö ·Z‚Ä°šÌéOäÐÿÓºZXVÀ•h¦Rçúã»ÇNâpCåé)wЖs7a–ÅMù©9kzD{+n†T—âòÓ\„ij=VŸ½¹v|gCá3›A!´þ›¿Ê=&ØØJ=¤AŽ¶îVÑÙ6|û¹ãœ›4ÑhÃjéè
Ùë_mü
\ˇæþ›Q7ÝM¨Õ|½U3Óå¹°[-nîå4VîÏÙ§þNO'¹6qÞcb¼2gì<ÚÚ=aD/zò°÷ô¿Ö™Û¿5–~?î^(’QÞPÏzШûîÚHŠ +çx¼w±Íù”xUyôðÐÞ6¼Ý_=ùcM^ÿ"löw\žk;Ú™"‰;ö@µ2Š·Ù6°°?ÈpÚÙpEbpè}ÂðÚƒúÕG×NU?]dÜN‡.ÒFCl>";^vʵ·•µüUGi
Ò¸‹ÕnÛ“iK|"çf¨‡Ù¦’êU~½ª‘ÿ…ïk¿-ÜòÆvWØÇר¯V;™ËéxßL%ªóOl¤]:ü܃zu¥‹[ùÐ]ÇCÇv•t‚Cuܸãx܊ؼ%^7›f(/÷Mùy½6"ýúlè),]8¼ÍB-þß²~øÕ¹ŸïW±Ãîà{Â")ùÄÍ.U¶aµ? +kÿàæBàr +³©hÍ£Q~å¹Ï@H¼¿^»°¾&2mq!ƶ7²º…íôÞ*ÐËuçÎ7ˆËÐ +”×¼-Ƀ©ˆÊÝxÞ*)C·Û¨2SJ^ª6¹‘-c+žºÈ45[š•5í2ô?rõu¦efà䥣Åö¥&•‡%~¿‹Ç–?[ðR> +Rã±æ'÷2é.În©Ùß9¼¿'/péÍ7/*ÖW…Ýe2Ê7µL\ºÝ¦yWŠMSiVz†>®õ=Zëé(.I¦Fú¥q V¾šýÕ’\cÕì³/)}j(TöåÊ5?[—YÚŽ¤fc¸’ƒ{åÚãÈ»‹MWTËW ª^“ÿEwØþÅèDµG!ÕÍ:
x@sáÔ†â^Y€Õ³ígäe^˜yCó!^BãõÊ7pyûzú‰v´¢ËÔÅ%¿Pq©²W6ðè¦PÎâ#ï¹wF®]pRfG† µà¢* q?Ê]c5']²]±'Ù‹XT‡»0ÐsYÁ+œ€Ûý7?.æù?PU.ÁP:Kƒö©)Ö–ã'[~Üò)ÃÐSˆ¥ù8ëCÃÌô;z~ƒ×5´>®¨¥Ï)ø?½ïÉûÚ{"×5i+†ÆYjyÍ—$’ãt®S›a9Y}³âãCÉbohXÂ'])ƒÝ±#@9ãAõÂ#@9§ç)¦s-v•Rì +B9ñ¸W&8Œ€Ùþ |D\hªþ|Δ/ +Ø[ât´nÒmaîÙŽµŽºìjŠïÕ+r½æÔ¤Ó»Jby<Ìu¶›ENî±÷F¯¢¶4ð)ûñF=R0o'‘Ÿ(o/¼—››¥&çB뻪åN,qêÃÌ6à%†¾êýDï}Ø0L9±¿ðŸ&*ôg½æGW-Ÿy”;1`ðÇŸœèÉúDu%«m…özUé¬Ê^îV&*â3QϘ‘ðYÔ§‚%6tÝŸùIçýäm›Kó™LçÜR™å²ø@aW×w‘%ªÆTû¥>Ã÷ýL7&yˆæí»HˆOå¼Á™ +Fu*F‡¡Î—CóÙÓ]Éf'þ,jz·YŽt\iñΟƒñ9GóDOV¶s©#jÁÏ)"æ‰záP¬Æ§ùó“˧Ãg +Ä[ Ú‚s»æ;WÖ»ÌÞ,9úd˜]¦˜RÈÑG·nÒMþêS—Û£rÏæš¼÷q@ª©6G¼&ŠGô‹åÑ×8‚xÅŸ%•Yþ“?! îOF9Z¥‰"©5_V¸)ìõÉÝ©ÞxÔ—k¸SZZU°æóo_ªW¢Â*»®G-–üÌ{Ìnx›0,èãž;Òͺy§-ü®—tù¬²T{øáÈLkdw_/onÓ&Œ6» RÒâ…ç#Æaýîf§7h‡ÃâÇa¡ð¼…Qø( ¨v04«;¢¥•¬í·™aéeöiy¯-T}÷—ÒîKmòÑÁ„®ò(–ÙõÃv™ÚŠtéæ=W§®E% :¨×§¤e4#Öìå ñîb/b *0a¢E¤–/ˆÃ»r3ë°› ¶¤ëŒ•s'Ýôâ‚Ù×úi(†/V$VzmÑzµ¼†ÏEÅÍ»Ùüe*<<ìá[nº•~NU7mfˆ‡W"©c9—ºNŽ6©k/®÷›Kƒ€èK¿²¼ÐWæ8b¸Ûì<]³ÎxûÉbU2‹•q¿&š¡ú×s¥Ã SínàcH†
$€õÒz20r¦="êD¦_dàfú•®zÝÑG.V:*juOèS/Ž ½²'˜¹Ô¾”¢1·¹e ©3ûYP¡néŒKjý‘ÛHÞÎfA±‚y•R#©vÖû”áÖ³Ìáv™F›¿ýÀ>_ƒ¼&‘`ž•‘œÛ(ÁwêÁᦳ‡•*‡ÄwŒ¥šŽ–‹(.©ôè$¬ð ‡®MÖ6TÛ+§êsÉfçj×ÓCçÛ|ªf湞dâ+|ëuX¿}«ÓâЮzæUÂ'ãv[g©|æX{;H»|õ‰LÕcH!ÜÃÝ%¬²»cúuμÒý ¦ÜˆËŽ—å5¯™šoó +—_q½¿˜<XôSu°ð_/ØOÑžš:€ð[[r±´-æ;Á5c Èì¡Òìj/]_é…qÔ€+ËúÜÛ6Èhªøø?–±u£ädŽT‘ûN¿'§ +4nŽ«|4R³Î&L9ò{–}t ʆqDªû1š* Òd5Æv +ð‡ÿøS +R€"Ús@‰—= ,壟T>+Äm@èvŒÓPö ~CX_¥W³ú€â'Y@á~P©ŽÈkÝqÈQ°^îˆ72YVá÷õ·8jVOåu×Ôc¼Ÿ…¶<ĪDØÍä²
÷©K +„0¯y0\Ü' C£¶Ï¿÷È“,o`hIÿGON¤äö¿ÍÀñòWÆ
ÇOÀíðéx²Ç¾‚ꀵ=À3½ÃÝŸ‡)¿ÑKuo0ßO+€oæ€÷ÐO²¨›eAÏ’ÚÚjÎz¶8Ž-‡8•zôÓÙ*óúd”ÈxÀ0œº§¨‰sþÓÉìùG@N\À¿à: +lýzz7ÉtHd܃*é@T€ÄÐkq‡Lcn@|”i >Yä2ääP9Œ(€\ÖXñŸâu§êëþ¹"½kÓ<¿K%ÃèÊ*¾óðq'í +×LŠþÈПF%¹ÿø€ðxªüâ_‰ˆûÙ5 Opˆ +m¤}ŸÄ¿ÎËØ%ÑDÿ—žÌ\“˜Ý„Ò;?ð¯yõæ¦Úsm·fæé4n×ÍÄy]Ocb¼¹èùì=äÖCè׿z«ñ¿þÕˆë}ºQî¯õ`wmèY çE,±¥6êxDkû··Õǧ]eÇR›>ºÁ¡M®
«_k+P§óæmP›þkÈ\Žò„ý—T™kÛ³>Á" èéHDQïËGÃŽ"¡â÷>vЃ¢fÜ+»È¨6 +]¸9﬜æºC¬šûv•¬‚Cv¸SíÕ:·zPK¼±æ-¼²Mù
+È”ŠõϤ٬íפn¡á£6ñfS\³†ìÅvüÈì$ø“îT‰/$—çüÌIÔÚa#óÎFná¥ClâeÚÛ’Ž·éÇ
:P[çF”oÞÚ¡Û”‘߈´¨Qÿ£vÝJ‡Ý:4k6:™~·²Ü®ª.q>T±öð=6—®l[U©ŠÍ;tiÏk¨ãÇ}Æ©r/ª1Îp¡ÛøzMU‚í_B_~jé.2 ¯íëî~à€ÛgvÍPÜÚ«©Å»6),ãÍÏ÷xÕÍ^YUyä|bÿP+UîaVè\ômÊó¸U+Ÿ{RP?FT +⤤¤G;7*^®Ž©˜3ôº¹Ø±¨lÉö‡IqÒ8gŠ¶PþƒýHq³|\÷ïK•í¬!hI°ul +ÔCqQ%¦ùc=š÷j±nôÁ¾üëÙVСÓÓÐ&]ÒWU±·(«ÓWH¢>•·ÛñF®†§“tx]ïRcI¤$¾¬a¹`[ s¹jOÃ×É•ÐúP{, +0‹3k…YŸn#f}^¾X<¥QÒ‘t/ó±Ýf +%˜¸"´¬3CO»;ZMLu²èèù1\SŸrI©TÏyy×oèÒqãš¹ËÁur’ÞðŘ¢ZÙF›úL…þXFdž„”î?øü(Hñpe›åŠûçWƒE¢Î–.~™ÙHû.ã#¥½w¯ÍnJ9êTmD4»k=iv:‡èÚ}õ‹p“fœú¿ÑåG5ó*–‰ÁÖºöª£DOÖÐÙ¾ªø¤V’Ùþ<ÿKBÇÒŇv—EuÍØ€bJBª§×ù±tù6q3o>çœÜsÇ¡âÊ.{ò›-kÕ³YMÆ÷>*½ß‹.ÍqÕj§V”(µ?d'ÂyR6øx<FÊ&}#;jŠ¼žBˆ¼.©Û_jezB•Þ‡×Ëö«mâOÖ¥fG%°YUæXÌÍ]7a^ì¹YM0s™Oïyn¶<:œ¤}Ëñ[žêq½ÏEoÂlÑpÅø§Ã‰¡èI×ïdšæº6Ih$QâòS$CÒˆgm¹ ´³ðÄ?Á•Ã‡Ò=À‡ôù‚ªzŠÐ&VŒPÁuÜÎWi¾J&¦ï¸P_6ÆÇRFæôd±ùqÅÞÓËóãûBáæhMbWbEc‰I×fªL¿ÄÐÇ]>4_ºa2Cê<ÉÍ©À¶·TŽ‰®äíx¤"ŒxÞô¯·GW.>
Ü*×gÙÉ.õÈfØÍW¥j6“ž³¶‘¿˜4³ ¥¹’™$S;ΣùÈ‹zm@ÝìP%â
ÉÜ®^ÍÉ׳+Äe‘Åa§v\ñ±$dHÃPÍ‚IµHåüR…¼Ëý©D£.ñÒc¢ŸKBßäŽð½'nº0žnÜ™l1•Ó±E!ô±R†£ëÒàŠ’[ŽÈìŠp%gúáF½Çꃮ©í/ò¡{ò邉³t³Yÿ +ßL¤ëTE]^¹¼'-–4›*}T$™Ê]N"©ÂWè×ßyœß>jã>žÏçÛ?0õ~v:Ͳ(¶Ø`‹KúŠ•Új +]?jZé]”ÌäÊ6?é#'D;!Íù3‹¥S ‰wÊiÕ7r<‡Ÿ‹EŸ:öke +£”ÛíQ¿qU¾˜J,ù~å©k¦¤“êŽ>>Ö¹,z—y”61)Ã…´œ±€´^f ûõ:|3Æ!¦N#XžàkXÞ¶ïéˆY¦ÓÚ‰b¡O«›‡Ìí«™š°Õe + ˜çJ +ññqŒïºÕ© ”yC˜}Wr—[®X‘QØ|]T¬.åã¡?Ìukû¶·é‡KÕ}/²gä
|Ü;)ñè«%¡þ›óø)Âáü£¥£ËÓJë¨
Ÿˆ÷CV$6¡´îôRS0˜¥2ù͸óÔd]‹ñA¶Ô‚lÙšƒ¬…|b<•ÙIŒKü9 ’È“Â Û§1R¿¨•¥½”®|sø‹ý÷¦Ã£M¨ÆÔ9½DÉÊÚ& ‚df±Õ^CÔ”`‰°r8çÒàrÓSE'2 +4Î$°¬5€&VŒ
ˆ,T¯5 +TŒµ Ëm"ÏmQ@0@ȧ Xf.K +»~û œˆ·IŽCb¾Mrþ*¸<¯+ +„ñøè…@x@¥ÓòöGONšdÑÐð?–[DýöÊ_çm"—þ¦7üOr¿ÄÛ $ki6ž‚¸¼ºéÇuiæX2;YÛB@Öãn/—. {ä +âJ¶kýÀ<]éÉ4È̹lÍÛÈ{+`iœÐ_=ùWÓN•¤'*òÿdîþJ·ÿïþ+¸áßÒí×m›ˆ·I^ÂërjjO‘⊇n + yöx³WôQŽk C„ŸÕý¾vþémç2l<ÀMÖUxùZ5²uey®,$r ‰¯œ›È¡ÿ™Äÿó¿æ\æïÙÛœXS7¬ú’®å™¿Ða¦ô7r YßÉJ°+œÔp‹…hoCDïÁšíG«¼Ÿ-l¹ZܼÍ~!ïN×¹v:½à™y{f¦•f'sÓÔ'Ødß{èî:&V2Q‘gm¾š¸V»6ªÝþ³?gò×ïÕQžtv{sÃí·sîs^oÕÉ=Y-ë-ƒÌ]È›&1û4ŠÌt"±Üd®¡â¢ÊØKÃúh[„ó#z ;ÃF<䜫Ts ¥^?J³(’›ûÞ'Ú½{VJ zЄ¯uíÌs“4é«[.¹kâ`mWykûÏ$þÄ^›C÷ÃlÔûµ®>=ÓAÍOyâ<çþØóÖh›?÷Gôì3ä|ÙÙÉ.z¶&§_ÿªù +ãú¥;1‚O×NâTa„…Ø|Ju¼ì‚ïë—Ö®Ò¤V#à.Ñ°HŸ}ó…h34Æ•ÿ¤®Ö?óS¿ne½Äºz>H©U¼Û@뎛‡™ã•6eçÒ>=-ª7”L¦;ÑÌ\8·L=tÓõbgUìùím¹ÕU¿pG¿× +ؼuÊ“¦ü,/Ϩ¾iè u¬ó[šM@-þ§³_utMU—*çýUüßã‹Ÿ¸ÖȬ«ÿBU±ýĤ¼uN—æÌ<J¢Õö>Á溩ç¹M¯½së\WnÍ[À¿šòÝ€àF¤ñ†önsujJ5;SѪóRŪºxÛñW~³ì{t¿VÙ6ºÍJ•_t½C{=ô¸Çq^>G䱜ֻæûxIA2Š¹ÕŠ•œ•«uÚùl¯úœüIàêdÊ8hóCö©®´A× +‰Z4(°j†b~Rê›A
™u&UlåÏ}¬o*ÛZï\¡Oã§wh ò9\eÊr&J·þ™))©s\WºÏñSv#1œÏ)8Ã’è9ÐFkmºÜ+"‡åÂvøbcW)xò5Wð”i½@¼·×ñ ¨üvØ ÄO#fÕhªÕQuµºöîjµáÜþ®§K©±¿Z~‚J•±|¯!äêeñ™
J¡ž Ý(Ÿ¸:ÌÏ¡£lh¥ŸŠÏ½‘û¶çµfÚÆNµLaÕêO\pùm¸–òUåeZ‡A¶d5L7ØçÉdbEúlæÐaÆ=N5ÂJql(tö#ŸþEèWàDTŽú4£Ï£3µU…µÄ¨ôˆ‡o®ÊÎ(Íhq-müZ¶çþµúÛØá<ŽòÛ:ÎÓOtn"vc5tõhžGêÕòÅ—™ƒ[iã6g
Û°ús
«ºNIŽ6¬7[šÅƒ™]ª7uÒÉ’ªmsu5ÃÂ[5£Öâ^©fŠíWòxL"+\Æ5Ec ٗʾ¾™–´TÔ)ά©oã-¸X¨ŒÇV~7/ùoòLž¶-^CJf°âêf.pB£›®
eÚ›é}v¼ÖõÓþøÇèqÓF
´ô”CÔiͧÕÌ©')‹Ö»¨ài£%WŠ£©LaüMÚv¤T«¬|‰•Ç‰µÙç?t¤ŒÖæˆRsºàTîÜý‰ƒè¹ø¸üáY¨W0;yL3µ¹d<عjÜßKC«¢n؇Š6:~ZZ¾EôÔéªÅ‰¹PQ»¼U–™ÎYÁKƒ§¼Ái™ +!BÚ+²(±ýz>ׯñY¼VÕ‰ØaÖáÑ2p¡—³«B/_ØÆß„žÔ» +ö왑Ò|–ì´_ÅûwX&F6qµ¬@ËF$™yÝ\®Tm¼µDÀ¤Y-ÿÊ)êL`ô¯j=Ö‹J±+ò¦QmÊ>uã1Ív$íGÏ…ÄÁŸmî4'ιVÃùˆ×K##ÊÒž¦šëTøÁzÓç!ZØsãÃ)Ã!ÂÂáó°ä +Cí’àæÆgóÒu^R®aÑ™”DêÎÉÈça¾±œ6*ëi³Ôù$T•U)#(åËŽUiÊË~oHìbIœwwrg‰©åÄÓošÞC¬1åÕpõ9ÙÚýóà‡ZâÍMro(sÈîã².çtYìüØ2žä§â™·2Ìâu;1ž +tªù=_›v ¬ŒÐ½Ö‡+·5ô‘4(Å{l!>-…lZŠÌä/‚Ôp*´Ä}òt.°j’x›Ö4Qa»áyZ{‚nëHƒ?ÜñCÞªYsnrr·œÝ +/슇üî4“eÖ¨.2d9²éêèüÀ4Ó¬©Æ‡KQüÖ)~œ›Æ˜œ¨Æu~¢ŽÂáÜæW¤ÃO LO›B-ïõM•)6´i¯UR*ÊÜ”ŽRÎ]ê!—ZTº)BˆÞ8/ +eŸÅ%䯬ö‡‰tØOÕ”Êv¤Vªaƽò+%Æ´Èó°q¥8´ÐÁY¼Q&˜Ê¥ÅÓû|G¢ëðÌ ÙÙ©Hµ¸w….x“¼¶¥.ÙÉ×&¤O7DÏ9^-K¥ðA»Bá©ÇZËt¾šEÀ*'cNA»£Ëģ˸ÖÀÐ÷}Íê™C‚,œ©r¹<Ó·©A¯ž†î¯5¹®"N®SpMá=ÜÉ|Uyvé/)ÆçÍ,]Ïc(uÚk,_âZŒìM…”-ß"žä¸Dôvû¡ÕÞm|ðÁ¸948dµÙÂtñÂæX +ÃœsSAW¹W%zÞ(ãŸÏçÝž0ºó3þm±Ïl‰õ%Ìø·JÏï<‹’ º·B½D/
SYwU‚ÛÔ¤Vÿ鈽(gPz*sN™å™Ía@QgŠÎ’7õ†Ïò™ ´Û‡Ã‡ÊSÄ-”Öqh©ÙÙI¹ìemqÐÄæᬋ¹Êã»Ç°7»E½rå‘Ùng™LµF‰ÈáÔ-!€ |îpƒz•†ƒÆ²ƒðÌè€ð™îi(ý}•î"pñš+Ï…^èº‰ì» gGÒà‘b7î/ly‹òqÑU§È[À‰¨uÀpËЬ݌hl‘òq6‘Ð5}0Pïð)¢d“ö3;Ãigj©Þ9–K¤™A/¿(§áKéÊÃm¢ä¤ïÕ{/Ýe‡8Ä7‡´².×Ó]<¿IßæÎ5Û‡ŠX¼£Åò™º$¦o
WÂDøŸ•#@#Òä°eMfªô›§‚ŠO/#pk2Á²™¾›A+r.›‰/eÌŒ/ +4Û¶#²!.ÃWiÀí¹Á’Ûš§Ùý1ÝÝp +2J Í •¯‚˜ûéÌ~¼Ì-§©¼‹ï ð”öåHelúö͈0†Ac¦’H>L„oáó:|N›¬W®)t#zdø(3øÈ‚ÈlæeÑJ'—É° +_ÛY +–a’K?f|.Ýs,z¯\xa2Émמƒ8UàĘþ ÷-ÐGY蓪Ÿ/zœ¦zúx +l¶>)´rõ²ö™Ãàë%¥{
™Ë#“BÂ>°~Sˆ±Ö +_á»y[ç‰÷˜Ò²³UOB·,' çΊ…Ã(`Òz<pKÑ;phMœL +ìø¸öø¦cŒ + +ÿÖ“}P8ÞÔ[j5Z€V+m@»]@wïc@ïs+ÀÀ`òÏ'`:.ãüMjeBÇLî¦6=¦Þ&£{`˜\JLzƸ÷u7Ôà$¢CÈÌvkF0öcbœ‡z]U$l›ië\©ƒõ®þú“¿
ùêɉŠœˆ·•Ü0#{öÇ|›®þ8p\ñØWç8僮V`7½š€›U€›g瀋æ/À5ƒàÊà¼öpÒÂü*½ôg™¤7¨¬@ â8s¸³uo·'‡ôuí0âôÒcßþ[Oþ¶æWJN\À‰ø×û;xüK“Ü„–JÒþÆ'üz^uT +Gër®©õt)ΧëE¯yDí3(è~&sµWf!3ÚÚrvD/DrÈmfÐß¿50©/_ˆ¸Þ"‰³{ŸžV陿ݵÓQ8/^÷!¶ÒR‚µ¸=ä8IHZök]ßÝY¢‰þc]=‰·+ïÏ#âcLæ2)‰á+ÞÊ°öÁ¹¼pâöXíßj™N¤]w½žù\»6MÃy~´±YÓ‰OªC{ëuÏí*9}‡Úôp§
Ò +Ä+Ù¼ua±)¿Õ|#2ÛµúgòÕ-´qûùæ®ÎÍ$cµ[ÝÄ·Z׉À_µ¶æ/Ž‡§—Ü+NœÇO¤ÆÞ07~…sÓütV¶’noK<Ú¦7:üj.àÞ/B3”îWÕ\¯þºµúЪ¶êдÖlÔ‹ªóru\u‰h鯪“½OÏJUÌ"Þ!´9{ÍóåóÀì”+ÿ,çà¼ö/×jîK¡S*ofaòM6žÕíÑÖ*R‰ZÛYæÇ€Û]–g¨ÎêCƒZÕ&x[³ö\»Ò³êfËiUñ±Ê¶îúì°Þ!¨ç<îî+ås·e”Åw«Pº
¥’Íj?°Ù›¶«£ðÈ–¥m›â¤–‹ȩ¤Ùó€ïØ®ä¦ìy‡ÿƒÄ¤ß݃ºþ#ÑjZ<©!3®í{Ä°îšnë.Ÿ;z§,>õ¨t‹ªÓ’+÷9š]ž\¡3y:¶K'Þ)Úä%[Dö€¶]ð6v&•‚—ãü¶k•óU5 +¬Ãà9µVálž§ÛŒyžuŒØÜÝÒJýtŒ5úá;Št,Öú®žÎn•í$¬—iê”äšw>q¹â@‹·[´ñ‡gÏýGÍv´]X5ñ¨à Ò$¿íH‹¯CUÎoCd¬†^ºZ<h¾Ì ßJ™9xŒ·Ù‰6”lJÒŸkµ ëT»®}é±fñÞYƒ®™¬ÝèŠÝ¥}ŒîóVnúJDå0;ðßñ9fÓu¥æq=÷µùÅi²m÷Z× +^ý&ä·Á<—§ïsÕj¨ñy{¬Šf`Þ*f.
5Œ°µ
%"=*#]'ĹöÙšmXëèèßÔIs~`ÕnYeb¼â*~^^õ÷
Ù3ó3™„îi;]ˆÒvöéKU·¼“¶óÖ>A_%Pºu«[÷S³R/ÕŠÅ]¥œßÓ-Ó¼§lJj•7îƒÜwp›áõç|Áézv‘Ó†•µ¦YÔ½ A‡tIµù´¯"²©ÌGzWqóîP^ísÙ«·2É.Ru”“·‰\cI9Þ%Êb°®÷Äœî…;}Â`!|§ëBÏ….{[÷:´‰Ç°u¼1àô³w +ü‘Sà3ÄO›È´úÀ´m¬ +…bÍ+cÖqGkf¹>^˜rGJÓ›g›¥iý•§êc»Ež‘ó’l-†0)–7qýB¶Vý yÆSŠsŽ³f”âSî lä9Œ¬ó-_Ml¿j–ñ™¡\.ð(Bí%*<›N:àñ™€y³a<¤Ë4Wi‡TêëìëÖÌbõˬ´Sñ@ªMoóø€®RÅ%u¨7Tƒ»òÜfIR|t
"Ô3
ü9 +æñDOáz¦ìàQÑáÏieBÄ÷™iÃB +…Ë”¬÷iUZKÏ|NϯÒÖëÌÓr¢¾šÁkÌ0ó7SCdARrÝ+³*Gˆ‡Çš£Ä‹7«áƒëGá‹}IœMî0ŠEºÏd"Uað …všÎ3Ë"µ®œTI$úå—dÕ]ˆãäƒþàDÃkh„B²%¼UŽq5•\ǽ>Þ2B¾gåÛîõȱ–²LÙ½IÇ^+Ýr¾u{³5ÕÌEåµØb%¡ƒÂÅî!¼¹ç`qËÓŽrë…O +—CDrWFÙTðyÓËÌ8¢ÊNöAJ†ô Ôº pc$cØ#eRXÍð˜5kjè+;wÐ!yË¢ ÅÔ‰ží#X¯· +åˤY‚R4¿™§’(åÞ×µ¾4_ +}@ãø]¢9 +ç31øæûæHe3iN¤Ùb%å“Dá÷ë‹Ä¢£"èèñíYÏXÚ*WXÀÔ&`zg
0s,˜G:
Xl\¬@´¡”¦€ÅwÀ) +ïdˆö|Ķâ±p’p€$º4xD‰ôÊ@|# ^VO næ Nf} v#ˆ9 +Pl['ùzŽ“©ál¹6ú‚5ž5™ÕôV‰ƒ9p§tÉ!ËféžÌNK +‰Qr®Ùýuÿæ8ü_ü6ƦEâäUã'è†Pr%
Ê3§ÞŠÊïÂÜH °×Ã#| ;<Y Ùýpoöö³‹Zø4Wbg:³‹ú¦G)+¦›”‘Õ\«ÿñ'Ã’¾Ô:®ç¯8¶ÜþÇýû/ÁýÓÿm¢v°@SYhA?´ïCY.€6ò" µ9hé÷÷JÖä
ho +ôÆ'5yÝf3Î*qª—–ÎL©èEÎgɬ³Ú¸¸Ág||ǧâüÿíâ5Þ¿ã¬<Þˆ~çüÕãz2ûïKëSE/úxÁ{ØE;¦ö%c·1¯ÆVÖúš+8«°ä¦V‰½›]:g)¿kpu2Kµ90YHƒi—¦“}>»ŸÊþã]ë+r¶s˜x*ã pž¯¸¼ÔvÄ›±û»“ÿ—Õ~»xÝ7âðãÐ8Øt+íú*Ì_üeTÞuŸún¸H]î‹8pàŸÑÃõi²÷·ñ©ÐxŒ®•ük6\0L\-,‹|ú;H½-©ŸE
½·Ì¦Ý½òÝ2»iujâgÚ>5½K[ 9±uí'»¿á_ÿjc\X?øoªxÿ7!6¯Æ}¼~sW¿8t|ÊQìHßÝ¥ ò§JàÜæàÓy¦ã[ìãK¥GÏ~—[/Ú·è·OµÅèoþêÞÒïëm³—Øü(8Þ}<?±GS
t™RëYf”©-«x³FŸú›8wõoÌjù4”Êe?I–J×ɹp¹ÚÓåžnmýÚ,'F×⚊Wðn™Nm_Ž¶Âßšð=š‰‡ü¨Ÿ¡üÀnŠqª¢6ÐY=QÏ’u÷׿JïŠÙjY,+{¿XÔÔf³|êtzeå9—ÚÎv]'àZìeŠø×;º8h—q‹ùÏN_çǵªeçü +zîZ¹Y³š8
¦=÷î†1Lœt4fµ-ýÒY4>ÁqX[æévuS¦ƒÊ¾öWj2½¨ˆ}W>µò×¼¬„¥gI¥ÞÅ^2-¤L¯À\—òãBMͧ™^"7«É\V€—ç²Õ³ôMx›NkãqÏg”©¹y!#!B!}šÕn sù¿òƒÇÛøãH‰aOLaqBLkkôú +¡É—Kú³Ÿ+i3—ÿÌír>M™µÜ¬d6¡Ô¹,7œf—µÉ*KŸ‡[oÓ\<eöÝÃ3SK<Á÷]‚'žö“›ºN9Õö2V2\vrÉ^áÕr£;wƒêõáºR[r>—uÏù\·O(ëª8ˆeRÃl¾GOO—¸B8låZ±çä¼|šÙð™YåtoÓ8©™}{ŸÈˆ“>õOé´oGù´ò¡«©ëXi¦Lé&ù3LZTbâFkoé¥êÎu¹îÙס“–öÀA/(mguE±‰°›¶ +ÖÞ+áò°2OlÆL”(g0+QöRs(ëó¯l¦—K•[í¶«n•D¿hÏå9Ü¥2%ÔÓjÎR2$“=¯Ï¸Ñr(ºAa¢8ŸíPwÆ•ü,NZ¸eô +öÌ'+6q#ֲ÷‚i,ú™&6à>½£¹ïf-ÃàÆi‘–?¿Oë×m¢¥·+ǵޮ®IÝ^5ÝgK½]߯bùÁ{…KãÝÈH¹Uéö‚§c~È2²«ØÉ'UVÝdbË9&IÚsþŽØÙÜ·‰Ë‚´ +ú”±èp-$6½»–([¾]³–¢<SB…‚qš™UC%íæ®_WžÞ.ö§Z¸[mµ^
Ü4KÊájÐ\©ª«[yåžÊ¸ßº*igí(i·Ù†² +àäz¶ÏgôYcÍˬ0"Tß«"÷lÊ<œÎT|ˆ6ÕÉ1?xbG±ø?WÍÃ,ù1Y3¥"§;Šj‚`ôk$Šz{éhÚƒqZïVMiV§›S_梢ñgKu—ÂP™0æBIo›'ynÞL¦(Ümæ—ŠHº#1Ýh/nmB·¹wM¬(v_Ü6rƒfÿY»Uäqiœ[”·µt«PM»)½ Û4˜ áý&K¯Šè÷"éÛ:Ô;Ûû[ïTBD{,6¨fÓ¸W_׈W“F$«àIÊd¡»J&ïeœ®–ä\¹Õ)ã8Šý÷\bó(VÆÍ·pÄî¼P_TÒü…~´ø涷ãîbOâîV£Âk½wo>¨~§üƒ—d9¹RI%*‰”Cd-=Q]d8£µ_z")|4Ç\?ÕQ>S“ŸÄUMn¼§Š¤½·2Åʨ‚çʤ¼ z¼L•z²´Ö÷ ©†I‰‹±Jéµ\Ö¥®ÐàºþRÛíxíB=¹®^e9ó'ÙÝl2ï1³w +'¢÷?xÿàüU]a|¼X.̼D®¯\.±46òý<ëÜ‚36÷=&qzV¨^ib{%¨‚˜2ɬe¶2'öµ"Er‡Zž,ó¡OnÒ‘_Qj“+¨ÙÞžêÏ’½—®yÆ·ªnÕž¬š®ê˜¼¼NßÒæà<ÄZqNSÿ((‘±ãÛ®zä‰qãz•lÄFÇô‡
u‚u Ç|>…O€Å`Ÿ¡gÇlŽ©ømªÐÞL)ÆOdy`Ä Q›ŒÊ„ä%g¸¿2 üLeó„do|¢Ö‡7ýóÞdyé$ƒÛºhm¥¶cÜœ¾¢¹«5£dO&3åÁ[<È +|üÝì·OÙ#×Û‚-û2;Ö€3¡±Io˜ƒ•5”žE†&ûEZÙ}*¼Ir[²Â[MâP¯ˆºéZ@ð¦qUqõY-b·€ÿàX' >XG'ÓØ5kâêzÙ,FéÊ“ ãN„nÁâW5'ßê$9eäUÀ$~^z çò·êìÊõUëȺó–ÉPý5=oÍ4…noT1;pŠ%or{Á ²Ò’9RГ +q›6QŸó„œã}¼¹Nq´ÜÁßwå™õ±„>•DµËë2<ÖCä-®ÔÎhÖnÆÉ,é[iÞræjΖ2›utÛ(*Ê¼Û ¥íøŠŠõ\é-hHr¥a_[õÈdr‡Mé•5ÅÖŠ;²òj^ˆc±
¶ònòað–„‹xË*Z¸özX7y¨ÂK |d+ä½Ú„HŠ3X0mR +¦IËÏ“3qžzìû-»XVr¦æ©¶–¬›²B%Œ${T8¿½7ßé^CÎvË—/O˜#½ {ª„6·¤ðJn EËœðÖ4wÃu¯òÄB¢ùÁºË)% +Ü
uºš‹Œ¢\AÝ~x“Û^úˆ,FAÙ§ +ü2§LÓ :=¶×‹gÑeVCùcoñ¸M0‚N1nÐS>Ìô6{Òtý“5îqùòdi~Æbó„YÓÌ™´ Ï+ pö(Á~Êl`€ÊìX@U
J% åPTÍèBY® +R뻼m®ufqy„KnB/¨æ<ÎBr9XM/CÀj:ôžÜ"`7¼ü‡ß*pùÞ×Â{ýº:¹“R +M ¼›íLjƒôˆ‹ÍˆK‹b°w¿>ØfÞbŠÚ +æwçK¼=f¢W¥ÿÞ_ôÑûz +Èéýä¬Bp‚S»ÏÃGïÍ)M²k}µåW‰Ý\^:§¾öM<¸Õ͹÷ÌX³¥“IÎèqÆ›–±\qR£2µñ©T錮µÎd6ç» ê>žƒÏ0ÉÒh¶ÙÏRâ%Ž‚늻NÅ846ˆÆ¬6ŽøöUç¿i>xWpîL/Ðæ>;÷î§oäÀ¦6£ƒOwZFèñø”?ÍF×ò~=ë3ø¦ÞqðéÕ.ƒÔ«|ïg÷Ñ[zî»G/3X·ÌäèξR—~ðŽxœXmåzηڦÔn†ƒÞªió¯Uó]â=Š mŒC+â˪ÄL4Ž3»xmÅ¡PŽQãßÔÕAê±AúÄ( zËÔ’ýÒ4Tzôœ¶:ûb”lŸªW¯uõ÷…–~ÛWš=sS÷£Á¦åΩ×øŒOÃF;Më³\¸®ëϱVàÅguSÏUî²Ô*5ƒË•OýÅ°¬|îTgðزZÊlêw'ÿ—‰ÑJ¡÷k]ý2¼ØY³ÚV[ž,ýÀ¢àð'©UR»úÌNð=’(´V`ZduSi±•}£$ÄþÕ¼ìy½tí{‰RÛ®&‹á¨ê{©A©Í¦‚K^ùq‰ZæÑ}î–›ÕîTŽ¸äìì²²sÉfég¤zeg)Çû÷ãü«0Ÿ÷bØ
GŒ¸}©õ—Ö¢“F¿º)mü²¯a¥RÛ¼UŠáàáÇq¦pñÂÑÄš‚Lv“ÿ, +Ç|š.\s³r6̇t”]‡–lAî|wòwX¯¬Ïå?;ùmþÒÑ‘ZI«hŸºÎÑ}Ê jH2Ü$¾›ø'Ûx×þ¯ü»“Zúô¥8 +¡™ÍiÌjK×ΡPpÑw2®ZVvY
oãsŽWVø.wKä2ûŽW†2hfÄç ›>
ôò™NRíôt‘2°õ&Î/ǤE]®n´AàäQV0çspXg\z¹xö¬iÛYãµµ‰ç³–Áµb-Gøù‡È÷¿_ˆñIŽ0¦µ¹,›2=îÚ“Ò§¾Ä¥®Ã3§s6i+É–[Õ
+gÓ
ŠdÒuY)댫RÑI‹FÕAO®ÿu¨ªnÇ&n…ÀZvü©U0ÇëÄf°<&ÊNôHðÀÀÍZ¦&™þɧe«cøEyo¨Ë*ï÷
U@7†_ᶱÄh>>Ï¥vçQÊ‘ZÃþÁ3Rº-'ÈŠv]•Bœ4?yÙ³zóe—.j-[Â*è#úzTeëi&¸7â˜û›1%”ʧ™\6ü¬Ý0T²ØÕ¯«þX7ØùJ÷àòu¨Ö2ˆç’ÀÓ¦ºz8P>é]ùDBÊk¤º9Ž¥u=‚m•oÃÇI:—ÏÔ]:‘´uFt°›MZEªÿI”Cáaî£ÅŬ¹ƒ›qšt?¸ág/C…Þúu±Ä¡D¬nС …[TÕzÚT£#í¨ACɨ®’**Ÿk£¡ŒÛ‹¾’6‘…<˜g9ë,0™¦.-'·ŠTðz‰!O¢ÄP;¸Þ—iI…<ÛöA¯²*ušíV¶Ø|z©Îai8™`ÂYlrV{éw°¸ë¦àµÇ@9i½+zÖ,ýzQ£ýþªµëCu¥è|.$¦¤uŒTÐç~pyÖS%9k¥
™xÕ\i9ç$Ù×ÄÍŒè‰ål~)ìWë»P+9Œ q÷$:t:¼ßðCÞ÷gï7År,u +Áç…ቬgŽ‰AÚé®j3æÖ¸o z—¹?5{‘¿ªÉ1zT&ár§d²Á^ÉÁIÁšþYž³µ«LzÙ»´ý—T8
Q‰ñW”¸u‚XA0U8xp…R'¬Œ zU¾©nº¼z§ç?8×I”®œ}(ö1ì:¬â
Öz€#ój`*óÌ +Ìk±/U§5ÎãíU5Ýt7Îgˆy²~_iõ}ì†Ê´LŸåEv¶—©aa#aARqªn¿Ôºj$–0Îb¥ ]EAuŸB½ã~Ù,âüï³|s±’y-ÿHp-–æÌŠUfûO¿ÃÚƒëœÁë†A23ŠÎ,›ÆGŸZ Í•›õ%*w°²?8µÀ +…rÓ‡Ùu½RN>Ÿ¨cÓêA2•Ô…Ô;ä¢tþ.çkדT*ÖvbÕcVÂqp˜
z2êŸíZÛÛ1G^ëo/Ü="®K³gn4ògFF`íGSgFöÐe’ï[ž¦™&ϳ*O-O京âd‰?YÄ®áÕ‰ªªí‰ª–‘‰]ËB!s%ó
¼jI.ºùd[\e(úlMªcáþ†×Ø’WnRi5;ŠbÕÚ +Jþ¶ä[ãþŒ×Ê”»Ï“S.AeVìsÛ²ƒRåÈ:\çÆŒzÈIY;”A^OšöRˆHœNóµŠGÑÒ¶N–ZäØ…øtAÀ•(Jˆv`â±XÅ•ôs++àîÁƒrÎÞ÷q/£Tßg¦VB<6E=ñêÊ,¿xÁU +wklï((KfÃëãù‚ëaõÙÚ˜ušïáÎŒBd—ßÔŠž‘ìŽöVò‰&ŠöZjõEw[8¹I¬y²½ub_ÔÒDmV q÷p_²v¸r> +1ètÐYøD-ýË’bÀeCn&ÏYöð+É2\9žò±šße I=j¸ßy»¸êeÊؘ÷0£ˆÐÛ{¡V‘`ÕË!€ÓGpáÜ 7#ÛH0ifsù›ÔNYÌ4omV–ii™WÇ».3F5kÃèö%ðQúÀõÆ
ô›f<Ò¦†"cxqrªÉWº3â`.Ö„4m¡\θÿ¹‡x“Ñ\ÝæiìVȘq\[èçò¨uK6‘¡9œ" `¾Ý2`Èlšö +À'EXã:µÄ¥qÄ{÷Ä‡Æ x”…HFÎB™´ +лÛг|í Q´_¹Â£4CS¿(å?éÙ£¯Zý‘È'Ö2¦¯T¹áG„ÿ`Bì±:ßÑdµyý[Ô¨ìa]§ó‚€?ü6kM¼C0áK,¯Z€-÷<(×Ê—ÁVœ>”õ°ž6q +ùÓ÷u +°Üœ1Ôÿ/Áu5À9cp‘\”¯>qé^’çP†ÀSÂ7Çan +´&¨-Y›ã@
C¨óc¨ùÃýKz݇TÎÛJ§©Òá&²Q£Ž WÀ£{Yÿ˜¦cžüÛ’ÉLþã¶ý_jg6Äè6.äO¯´¿a·13ý¦$üš\¿œÔ„«ÀlæÀt©0Õ\5ß+9`ô¬0r. :Q +Ëà7¸ö[^ŒCçzÿÄı[&Æ玸m‡íSeü†rÃÛ¾Hr¶ŠÉÍžñÒýh +lôvIºê×Á´ð€©Z¯5KIÁFn¦F÷sKBk‹féÙY|5Æg:ÅŒø°ø¤E$1XW'² +:~K”‹³¹GSÕKLB
?Ó ,”0Tep½ÿºÁŠn9CëÁÇp5:êi5hxÕUZuås]÷”qŸ+èÓ>ɳÁ•³nÆI«IËéi+-çž--ZG&ñdWÎfŠ½x(‹ás^€×Ø–ÍdŸ}pöÜx£1¨5ü[餷çŸ^‚¥fqå¥íýÔzG(³‹êJË;”𥌛7 ¤µ® !F˳/ÈYËPe╵¤B²œþ2Xd\7Ó¨-–³ÎLäÉÅEدS´P+½“‚įú‚ÿU$½Å« +µZµV-·¢v>ýвéfz£;“ ÃÄ·aCS×wßj’o”iÁu¥‚^y¶=Ï䬹šËÄs»’–ƒíÊã \p‘@†âf¿Da¿0I¡–Ïñ‚Dw4þ´9$y¿Â”xU(t¸vc¹àÕy²á-’Ø^÷›¡Êözó-Û0?Ë†Ï WnJãV¶X¼db“²
—a”)×ì·Ö–®*¢Ÿörn认bç1·ÇáX¬8õ±XþT¦"_ÎÌ„ýC› µº0$Y[ÿÀêÅÞó~É>ñ*—»s×}ýŵk#Œ3¬'φoAg{£bšy¡Ã +ÌÉ€”¤Çc† ÓéC§3‹ÎR$‘þmëû]£á ^7å&g¤ôõ'Ûo"æÉjò*žåÜËßJl[ˆBc8ävrÈ7Ô€o΅߬ËS^}ãSîÖ|ϸû\°ê}Íö%äÀZ/áʼ†vÄ“%”I"†»§öƒÓ‰MÒعR¡rÚv@‘¡{ Wµ3Feß"™Ò$¶™dDl=V…b' +ÉÆ«–nÅqð`+˜
}ŠiƒÌâ¡xÜç$•´ôF86V3þÒ.Ž¹{‡÷JÎ<{ì3¹è³ýûhÀöw‹k{£1ó&¦3&Y-DÝíèÉí~¦3]üAã ¡æQž¦¨Â@!×Ì3I²U¹LìÄþ€šä?j¯‡®…˵ÈÿÁq¹!< Ü%\öM;—'•T—,›ºõy£Uk êhÐ +ešœÄjUZó—MgÊÝæˆ}®.}ÖAºfäU»$:â;p~SSÙ:#ï|{
P¹g~EQƒÖ\ç×w²D??Ä®BDUHÉ„p¹xC¹—pùf÷°Kg»ÅZ‰‚Þƒ‡Žv“A
M ëšÀ<j>Žfvm'‹IG^&,N(rzw•Bâdcï.•†ÁAh,ÁŠ×Óõ)QÔù Ó“JäÛ´çŠ-¿-*o„-ŠzD]rÝÿÈ’ƒŽˆÝÕ²²R:"?ŠðF}ƒáŠCðØå“‚+q¬5žæÐGZh"Ÿ[ ƒ½§ÒWÀ‡°Ê`´òN •Bi05t¯ªãy7çù„˜7ÙØ]co±z/ïù«óXq‰~rÂ:#dȤºƒíùzëËùot‹¢¨E–ú›&±§–m¢ºÞ÷ ±uâð4Áb…+}å€]íÔ
kS@ÃÒ†FûHAYI"ÎePcŸ€Ôcþ +íM‹×³6î§6}ì:›X;»üzz
r?G{Íp‹Z:qF‚žøD\+‹ñ°' +Àxj0lû +\ÁbðÍ·cÏFá2&Þô¬{RK¿Ô#7p‚&öókóË“å=¬q½ï`7ø¼€>j³2L–`ŸL +çÓÃg° }½£T¦Š@YЀòpJñ›:q¨ +è$Bº §Gº9L +ÍQŠxœ(tt¦˜ ¤i…¹'©þuygöè‹À·`ÎÃ[yh¬þ”ÔAŽà›ŽóäÌíGð<ú‡àâ`²E0½•˜i>hÛT‹+À<§;Àœ +ÂÄÐP‰Ù¸P. uI PÃ"à7Ÿ®_ÈŒá‰ê78°QDª²ËÒø}s#ÐÔ¥‚ýáî1âŽKŠ£Šÿº€ÿZnÙé7
øÞþÍßáíßЄo^‚f; 7½WÈ-Nriš2o@:<n@ZÜ4 N éȾ¶^—Wàqï*Ï]ª+*¡Ãå:Tá—tÿŽÓ¿Üöw`¾é
¿à8àößþcû-·©í?ÄôË`c\ú™r@ós”UhIx{ÐͨûÔœîU1—@e’P¦›@è°³ôÙq+¥,,|þ„^Ägí³ÇiÀ°¤Ý¶ÿ·ncNú?nÛ8#!6ÚV;æN[;¬sѳçSbÀ¸ß>‰F÷Ö†´ ¾ž%€>>Ž8¬…U(¹bæ±~ÌòÔñ~ÝÛ±[:¶&ÿ‚í³xþ-é—dÇÚòþ¿9
ܶqÂî¿FÛßXÛ¿Èöv~»Ùd
à +÷ìþv^5„
`ƒõXÓ‘ +¥xp‘Špš:-òrQpõŒU4øCþ¸Roy‰‹&ò™ø¸œó¶¹Qn,<Ü\ž)ߟßÏúgÅÊ*ò`ÂÞÇï{ðí#§·ìÊ;•ü–÷%º–©kÑ™ÎEâ>?\uáAœï…Aõú,j(ZpµJ¼À„+dþ¸dSù^Ïæ¼5WÌ;ÃÚë§l‡lV½l‰:2êð1ÏT3…uúyÑ.i}JÅÒ⶚F4M£ù=e©Ähö\ hsÑlrÊ;Òoß¹Úr+ÕÞºÞªñm.Ó×Y¥Ç¯²%¢cA(ÛÌÝÕΫ0Ô»fÔÁýž©¦"HZ—‘Wah4–F}†L™J)j•:Ef
êL§¶î1 ÓŽÉš4ß:x!Œ&cý$MÆkmÊÝ2&åîŽÊu§â4I,‡o+߉ﺷ •Hdõ(’Ń÷NÓf +m%…ß
b¶„xí@ÅÀ;ˆ8í˜N%82 ¹Ð|4‰EŸ”k¥0jÀÕ’ÓäÑY•II@82C5dÂ;¸1–¸;‘Ï"ŸÃ†I?Âïì'‘/¬9b<9¾*í_s°üü™«jø(VJ,º Ÿ¹ÈçŒV7tDK˜Lç&ª4ï%§4Y?Ë”k.FÔ µœPLÔšA4ˆ›A7)õÂ2CÄv„ç¦NÄxPöC‘gºÏ¤šG“ÊèÌ$K9ªœ¸ûB'¡*—i¢Zæwñç“Áãº~¯ÇõeÒŠëæ$q©&Rë ù,Û‘jæ]¤\©{v6ÏÓX´µaºÂ >Ũ½S˜“'ó<!.Z_"&YV"òÓ4K’þ=.'ý#1I*¡$KZMÜ/9#¡N*V¢Zà¶ñçmzŽësûoTžX<‚é˜iÌ+±‹ ±(>ÑCXt½)ѵHG;<*E;‚‰vúT.ºÞòí¸6ê…T']ÚÂX>Û¹™š|ß3v8aÑ7ÑÉÑ›…®,'g»º”xàq1¡©¸”¨Å})Qõ^’Â;£ÒpÇq#rT⑶3‡x.c«8¾ŽµœÜ>å¹ktCªH´³÷“Ñ—ÎãÛøœÃù-5ÃÉæꀓE1¹§|sÏË3æzS'ÓVª•¿Æ±êƒ ™¢`[höÖœ_ÓØ@ßÑ»B°"ϲFLÀnš,/ÙQ¢¶ÆŸñtûq¬ab«@c«½:ŒµËƒÆ£Xô¡L¢›…:‹vëæ"šDݾ5_¿K·«œ‡íþ§bNÛ;Dy™ÃRTl9YÚ!2ê4ã‘l8ÒˆdüœÉì‰h$³béæþÎU+Æ}K†¨Î<æ½K*¶lßùäw*99ÏÎ'бÚ=-Å›žÛYyUˆÅD^ˆÚ)~íÚA4Ù«ŠÑd½:Äwhu„fc‚SÎB]b‡¨ë`â?c)¹òˆœsj"2òï9ôZ.¶ÐÉÞ„oò.„…çX—çZyT
Y„Ñ|”jŒ¶x©lefD^fÊÏLØIÃýš·É³.D1ú˜',+Ç—|³øu?j·;|´ëôñ]¯ÔÇû(ÓÇ)3чŽQJb€‰w0À†QFÆR›¼9::„¾‰d¯ë=z>tZ*aá›&1áyí^G&+!õèuƒ„튄õn O$<Uà_”®O#^±dÝ×o¬¦Ýä#Í6ˆó—Äw.ß5’óÑa–ß+ró|1!ÚKu|'W¡Æ\i€S.u1HKÝA?rVƒADîFF‘\2:A¯;rŽNû¥eøvï8/ÇTÝCžÈñ‰,–Aq©„ Qz +3{¸ß…Í +¿Ý$ô^L·ðé,Æ]ˆWVÞ•p7¥Àèãô¢}t>2.EyT‘>¬«¢ßf<X$bFHäžP/i¼ ±Þ!CøñL#X¬×D°xlq9"²¥ÈuݵeŸzÀÿ§›1o¶Šf¤²ÕZgœ€½½ë½“ ²Ú$9LãGy‹oé1îŠë!N?Ë~d¬dT9Eøpu»é"MLƒÜ6}£€ôÊ'³™WWZ ØÕYAø6‚ù4”â÷ï°ƒ`A=qæìÐ!Ø1sF°
™B°!!ØXx~Ë,ç/qÉDØ"öÞè„Ì«W}ru¦m"fÄÖëé<ÊôgÊî“l]ŠLÐÁ-Ì Œ\*Ûðð?»@Kþ€kc‚àIEEðî}…à‹´ƒà6w€˜_!|Ábò•Ov¬"‚o=7ö‚/x]‘²Þî¼²#x6ÿ¥f9W +²ô»è›:ÉñàË'¯´w|…Â…\¢3UñÁ˜b£Ô})º~0<|V"Ë$3D°#!x¸*#xMš"øHŸ!øÉÓhŒ0‘h™µ‘èÌ:"ÑCØG¢·ìbø*>¤è±PƒØŠHtÓ€o^ 7$*ûy$Ê?fH´H¡¯ÊaÆ"Ñès‘16ŠÆ~„Êæâ7¢œ¨“ÈlãÀçRÌÄ÷Æðkλ £³ð¢eB5ÉlnWQþ+©L/¡$Öúš',œW>¹q; ±IöŠÄ.“'ÏÜ¢H<›¢xR(@\ÚHmŒ‘˜o‹Ø>}bV¿‚ÄTqĺŽÄòuí½ÉDº}=P_j©'.z{ot_
øD~{cra±Œ+=#\_¡ÚW³ÞIå/•Ê/Qÿ]GÊÞß^žH‚)ǾîûB +Õ&’˜éƒ×î
Cb$¸å ITëðMÉ$¼„’+$¾ÏÄ‘øü¶|ã\ªÇîh:øø»š:±l6¼j.žîfHñvÞ„#$·ú’ç~ùôUÒÿä“ßyÒw1ð»Èõ{;'<%„àžm„Š}„èÌgÑM:‘ÜM1HÒ=$¹ò·H’ó)$™_¿åI¢³8ãâ;†NˆxòÉÏx|Þòqi°?¿w
AVúùk¦ûùä÷Öo5ï}ßUÀßKÝZÎ+÷¥Òõ]rûNOÖ±B5lJ¯ÅoUhTŠ&¦y|\R{²Að?гŒÛ +gÈRì™HD³$ŠŸÆ™#7ÄRÅw>ù•wÿ’O~‹z»óÖóÞ*á"ýßw¿¦nß™ÉT{ü¿_ v?!)MBÔÈ{íÔšÊËH +=f&Ø3¬á“Ès}ÍÙjÔ¥zË%›Ä“ŒŠùVlìqdPÿÑõ¯¬í;§ýVóò(¼úþ—=øpüRßúäö[Þö½K·}eßyR)•ûº£m‘l˜_!3³Î!éÇr‚¤#@ÒÍSóõmŒ‡]!¶{àiLét¨¯_øÚDùK}ò+`_,zç´ßƼռ…¼÷"øVñû¯¬í;YúuoÛo[ʾ󤯯ÿzo[,ØR8\¤Ð)ßa/;§ütÄ#ùhÕArv‰@rz}ˆ?5|’«”Pñ¾néüÞ}ãKžZõÊ'¿ó¶ïˆß©ä·1߶µ}oÒðÎÛ~+´ýödïD¿ÿÏ„V[!åÒf‹”æ„T"›È«ÚöÀ¤‘òÐí!åŒl!¥]EJ,‹ÏóÿƒªÊSáÀ¶"£Ëd§mës,.¸É¸©œÉªL‰àŒ(‰Gš *!,å4Kr¦5¨osÈœCó·è¤X”Óê°L×–›ŠÃožµÖôç+_hÎŽ³•‹'îíc–IuøF®ÓkíÚº€¼ßŸã%æRÓÖðX5Ôß[ŸÇщ›aý5èótæÇð½z”rÑ¿(Wè¶!/
ŸÛ®*Ø0bṳ̀¸‘*ªè#{³Ýèû§ÛÜ]²‡JŽ~+¹:KCæ~!µ|êºqêÝ ymë·g„‡½Uù%üß®½žëÿëÛŸv-„}Ï·?íZûžoŸu-„}ônûŒk!ì£wÛg\a½Û~Ý5ø%£áÒîYaèD<ô"猡â”/í£½y+[×réD$k½¼›³®c“Wr~§SÇ>ÉôåZ-å˜a¨™m,ΗœÖ´b_\Ì:¾4ìµ²›JªqïçWÐÌ}¦n”õvã§lÁl:-™Ë€ö1¥:„ë×»¡-õVÙÙêeêµ_V«ñÁ´N—D½>- ³æQÞPãÈ$râ²ÓÚ¸À)óbB™]Á+¡¦õÝC°z±‰—Ë£es¶ÌEóW·Ë5±Î)›2´ZéÛûpOß&VåӮݡ0w ‡Ùýcì‹ÒrvçF»óñÖz¾,g®ÝF¼é[ØMa·ðf»¾Wx5à(ÃëühÙòšš¼nƾ~óù{.‡°?íó÷\aÚçï¹Âþ´Ïß\†.&0D½K$\=C3óhþ1l —ýŒ¶Ý1–R/:N¹®½ýËË[$ÆmýdßpÙê? Ý…¤F'bVÓ-²PNŸ¨ìøˆÐCzJ½Œ®¦z{ ¤×’»aÙHnqÌUo2þ²º]*÷77·Ú锓u£í +lÁuJ½èTØôç´™¥Ëj5|jºˆÏ¤yN,zЧeJï@XbL|
ŠÝ¬b- ÇÙõõÍÑr%‡¬ÉÆË¢ã.ú¼!.Vœû°œ)BŸÜöᎰÒqz¿jÐ,Ñ9gbÀ󘂈xû,’¸l[ãìµ›{ÖüXºß}y7 +–YA»Õ£—
¼[Ÿ‘Öé>÷Üû7ÿ´‹!ì{>þiCØ÷|üÓ.†°ïùøÍE@ÝÂ=@j@c{0Ù Re_©›»ŸxÏG‰Äâ4ìY®[ë{¯Ÿ,O +m?
¦Üø='¡½«™Ë/OiùppÃNæjÜÔ·Æ»ŒoVÉ2œ)xŸõ`üYa»Nš%:øÓxÏ”^BomÐ +[mà™ÂjÆÄŒ
U™HŒçì;Q~!ìç×a¸)á«Ð) +TG_Ûm³{*úÎÅF‹Ó:ß ÛF<¿Z¨Ùñs¢ Ç™8îœe^:^Æ]±èOZ}´¹c¿‡öÃK +Ãζ¢-YxjÃÉv]h½ „Ö5–éñNÿÐÍ”Y˜-_óäî*|?‹GÖo´<Ý£|=*Z‰Û%ÊÔlµXƱIò3K³ãÞeU‘äA?'–oJºµV4ßí'©®Øè“?DûùõÐB
¾©-³¹ ·b}\¿tÃãùѯ®Ÿ{ƒ´ìÌš—ñöëûÌÕBoÖœFåcit´„¬xïVèš–ÞÖŒx:&c92ýBØ÷ÎzÒ†ýi²]Á›“Áý:(UN2ÂL\SG|GÔ®±;ì"}B+Êr”*ÈûÓ 5ø29Я\Bè4ÆÑžÛ½DºiµWIÜt¿Cÿ4 +غ´cjFX2ÔÊns…ëW©â1AŸÇ³Ïž'šÑŽZj¥ ¸L¹µî uÖáO-–Øo¸¦+nùæ µ4Ž²!6¤œ1z#„};þ4 +P¦Í ¢R·p›6ôñ%véZ‡Éä•!Ùš—Û~Óß4ÜÕ•OºKm?¾u^¬äC#qW¦fÚŸ,uÿ›aÿ:ñO¡óîл˜³…Zܤ±{éVl¬'žƒLìÃ4á¶ídò¼>nçU‘/xËzR¾˜šG5A.£³ FÁuåD׈۷‡?ƒ¯2Ëg8m¶Ä ¯3ò5Sz("H݆þÝÃÑr ’ë©çH'÷P¬Å=ô‚¿E× âÛ‡avŸáÑDÂóìq¦µžuG¯ôcDò¥ÃÂ~~ý_ +&e³='R亻-|!ìýòU¨øø—#•©»Ìáã +`€øõ
BFÎ¥åâîÈ´Gý×~´ëò%]Ñ™…]œ¡ƒYzL(5œ9³Ä ²âü–Ô#=¦ž@;cID¸CZOyn¡ý(`[~zjÄÚ€¾ìÕ{ÖFoÉ Q—U°Š±lmµloK‚‰’s͸''$›ŠIłض€É£öì‰7ŽüÝloúà@€6Ø:–ÁužìªAþ!À^žâ^ÏJd\ÙKõ°¯'GW[²¸ÊªyŽ+º„(®ªûÛ4¹Oߥ ˜bD’—•kOª×nî \¹;»¶Ÿ%Ûo£Ù~ÐbûuÀZkâaÿ:ñK +Ö¬«ô‚{ÖtC‹¼ÙÆäªÅ5 +‘š®Œ›ƒT 4és 6¤ÜI‡–ÿÂ;;ú?g? +€!ªó׬/·¾†Œ…Îö.8OâBPÜ PT·õST³¹JJß$[CcM…ñ•ÅÌÕõ*Ó¨nͱ˜?•cs§ëÕ‚óC„°Ÿ_ã?BÓ-@Ê(ÔZA—F 0½WËþ0ãR5(±]Ñëiõp–GÚN†EöðY¹!êÃ&qs5š-3Dí¥.£ÊŽ<m½‚³îDj¾þ c¤B¡rÞ¶U@ÝNw@_÷À,”`¼D¢S÷A$y‰:kr½‰±Wâ+;!hË5mÎÿ;a»ÝÈrrÕíþnÎ(¯oOJ¸ùüSæù +³õʽYœ+Žñȃ¶_g‰>;MŸŽRH˜æ4تÆÏÂ~~Ê‹ç +ûT`*q]$zQOeÍó,w>\'õ‚äÈÖ8±”¹|Daï—ßÄ?ü¤Òa(³ÏÀžÓ#ëÐJÔ|ÚÆoקg°~].é§Ãù꺚Gžìmœõ,oY
–íì-ìˆrP™ûÌU‚òîµÉHñ(¯¹;"Z{⢠+Añpy—`Fg;K×éU³×ªkÞ/)xËÂçKªÖbD¹Æ…µçâ=wÅ:žÔF9%rC[Ï\m¡QoZ†orM/ùëaߎ5–à„ +h±8 +ض·~6»ûÚL¶Ûáï:ö£Kÿ ÉC
0ZtrY7¶ÚβvËM~á'ÍØNç4¿Lff3&n£·—æd?°àÜO Òñ#a2€?ufTp⪺xnëAóÚ2íð¥
|6~ŸM>Ó4‰÷»€my½ +ˈŸ=á<YÎmƒ˜h–ÃdŸÇ§ùž7L³»âñºäm|Ý·âÛŒÂò©±Äym*]5iY7$"pi3Ø×½ÖéÇa?¿þ†‹R{}±ËÁ²1Zq3[@óÍH¡ö`]«íx‰”OPzãPc·Ö܆fyr’kRÝ"tì(·k
)×ei¿ËÕ=EèÕÇ%¡_ÏaXSj]B˜|!l[ÇeÌ"öªš°ª +°C¨ä öÆÌQâôjFiÅmcÑ0⦑¾võqQ¼Õ|µÔ”ê«Þ^BNVÕ¦LV«˜ÌTž–œ©èÜ4Âà˼ð +a@j…`ÒààÌõØÎܹ-û n´?õ‰;a˜ù®$hÚ¶š.èŽÞˆtpµí%¸l<y¬ïî~ˆöóëú™!ìÓB? :öY¡ù9ögü|Eÿ¯þÿŠþŸ ü[fûËË|Eÿ¯þCýåÏøÂþràÒ–?ø·ÌöwO†ùäW™Ógÿ•!qÂ\^c€fW@˜5 KmP'¡äßHŽ»DÔ†xâsYù0rP£ßR¶`»R·WX8ô°´[Ìb½Yg{ÛMœŸ,šÔ¦,gì7àúåÿ€LJ v&êÆ€|&¡Ìc8×ó8Ów«6„½£ZÍŸó!„ymu0>ÜäÔõÛ÷Ùö±‰hNsXXØQsalµÜjMb¾m
⦻‚+ê‹q§g]GšæGñÊŽþ׉¯B¯Nhz +v]@÷Û$`êùþ×B[¯Dß.b´smlcÊiëðYy[?–ÎJáÍ
§L+]£-ój]³à¹¾¡=ª·ÅJ]ç{_*—ª·PòÛãü—¾ÿSh¯WËÖä +ˆºœ€?ŸÔ*¼ò› +Þ¤wèçyùª·ÜŸ +GùðŽI$”yÎgïrU2
G˜kÔÎ3ç”®1ªO6:9^.yY;—²\f8‰r1qÄ$Ѿè«bÿÙÝJ»§<·™½^%¥õìJvþC„°Ÿ_ÿ*´‡C¡sJ½t©X#{+ÖéjžŽ{¯æSÇbÁèn“óãÐ*9öPw&ˆ4Ÿ•ÁSœÃŒö¾Í‹åôúF*Òã7¸(ôÈ|r0ð§tŽž°êùòâ7HÍ}–¤LÔàðYP`/âý;4/ïëŒ4ð¶SuwòJ½Gyª¹9ÞÄÊ}A“3~jÖ•Öè`?ªbÙR +Âj£å{BúœëœÚ\žË›ñr»¤ált‡Rk+ÑüM +‹ÑõÞÏñÊŽþà OwŽJ(t²Ò@*ú¼ûh' O'gßÚ×íÍÒÙ'kuÀ¯ÓËD3[R‹Vµ8±+\VºX[z _{ Þ™5¢!ìý1þ÷‡î[O´a—ÒoZ‚›lØC7ÝèŽÂoàÉ +n`N¼ye/ãþ12gЖ,mFO–½¢ë.äÔÅa³æa3Ç$2T—ö³Ï=¤;OW[7ß¹y©o/’4h5çkÀ¶Ç#¤Ùk‘†PEë{K~ +ŠCJ¬ÃokMWÔØ&}žu^âï7ÒþløÊÁ*3¹>.iJ=¦Ô´e6¬ß„“Óͪº…3ÝÔrAÏë‡e7„MaO–*ç•Üç±å¤—;ù*×@JËVÜÞošî`ï5¤ì +Ô½©©çîËXÍWm²¦Tw©Z Ùe«w8¬ªÍC¹ZÅÎõÊÓºµ*:wë|Ã;;úÏ?‡ù,“Êâ,ffÊ#¡B¾2|ÊÙ²àrñr·xÍTÛøªÛ€âÂú¸ µâ³g}Uµ1Ô*z»gV1Ù© öt_6{ós¹EÌ/ÖŒ»(N¸Ôa\ÂýBÿø7€ Na<Fiìdj€PÒpIÂc\(Ÿá˜•)Ã%sbæ +½“HJy(ÔÌA¡ãäå«Ðj
+ÍhPèvda—ÆQ¯vKLÇ3MáÜÆ-ñ”(Ò‘8¯ÇÚägûá&£íÓµ¼åÊ}rÂv×5émËÁæjcìnûë +U"p-ª´.€n͘›ÌRìµ6z +çNp’ÇÎtì^ms¶Õ¶ÆÜixØÂŽFûËM|—Þ¬{GtoÑyý´œöWÐ1}qô…IuÕ_ úè'~ö í”9_A™ì¨ô¥˜öÇïJ{s“¾å¦5î>çF§íþ¢ì/Èp¶«(
Õiš‹Íf k²é™Ö€sv
2Ëâr»ÕÑfl©q³ªò¹ƒòC„°^ú*´X‚~.½WaèU‡ëÏÓÐS˜\K…0ƒ{†1ÒA Ïv.¬]™œ¨Ùiî§mÑŒaÇ<ìõÉaÓ[[b?·_e<ïlæWf £—²ò¼ -V™I;ùu +[_ÜOò³ÚŽü×&DN9ȾÅêæ|CλóÕ¸VŸ/+㦳ɦٙ²¡ +¶ž§ˆÅfZ²ZÓ‰V‘ÆÄS¤ŸÎ-¿s†›üP"…rYÞœ©0w¤˜‡£ß³õçÃ$'™K{µ3Þ=ÕÛÄNžJ+K<ÆËêÐëø&€}_#ª©é|ض泬ßӕ‰ی›èT^íÉ‘Üž•¤_ÇW™ýN9ú]o9,¯àÍY†B{L¤Rþò6Eï¿vd¼^äÚ=\¶¼´b½áz8¹Í²&õv¤!jdQÎÓ{{¤Zž<Þl‚bÇå¨{2Æ£¤v’FI;{¿üþ#´ý¬§_õ–M(sÙD³(5^…¶ËàfúàʲbæÜw°-ûò0Ú··ñô`ås“¾±diAÛž~žÙbÂÞïýI#±åu¥!œ|i><\GãápªIûáÂþuvŸìCS:*×»°³ ¯"˜s‡}ׯ•ÁýqYg¹SZ¶v,jô6ŒïõÌ*™êêñô±3?³N)—§íID=Âõ‹Ü9tÉõ8”´ËTÌÝ»“’iJ¿3ÿ”¹àz°«ÏÖïÉûRš}¢K_/=žsœd¾Rl:ö¦Ü²&Ú e˜àÜÒèý 5+Vkì¤éçšr²)µ¤:â¤6á³âHîW/íY¡(©_m6Å7BØ·ã +Ê/!„½_ +3œE(ª{f¼{,Žpnº²±ÖÃ-FÙe%^U˜Ë4lî^lØ~·i™šþë +ŠÂ2PT¸PSª +”nÀkWU6Ù«Vñ”Xy®Ë“J#Q˜ý!쇗ÖgN™/£¹è\õGÂùNNö:dC4‹ìÝ›µÈ´ÛøjÆ7Ý%ÖÇk\S*–^½ë»Z•çêzyå`Û{¥?+¨ƒGÊ&•[$‘,ã{š.Åb¶ÔIUŠ¿Ž%^lÔ‰ø€Ïýi¯*ùò8>Iˆ¸ÊÆù´[qz¥›`®M6Ò—4S+>¼|åi®«t£·ÊøNé•:´"–âG}\t$S)ò™µV$.ŽQp'®UÜ
ÄÝ-ÐwôÂòG¿þ:@²Rº‚ÄSÀ@‚¥ARt1¨¯ +€Ð…'¬ýU2^‡5žaQ&?£ežÚÃå©Ãö Ü
T~„ O ¥H~+L`Läá½'iâwôéõ"…óK…k}v–/ëcL·GªÛ9ÖRçá¢Ãòq{í;[»–’×fºÚ7¾_÷¿Çu*
XçMäîÄ ä§> + +µ +™‡ ò7<ŽKjT|ªÂ $šâç¯ ƒ×Xöò®Ukââ¤%.Ÿäê¶uHqûݾǯ/.|Û·V³˜ØlÖÇ£¶¶Wý)¾ï v"˜P4¦› WëÉ 5Î ï!8(LÜOârn_Aåõv»BØÞ6ÙÛ4ä›0êÌ/w¤°<i +PTQf°Î¥+(ôØ(¦²ŸÄeyÿ|&ñW°™+Åû ðXoZRG§UÛƒµ¿wTUp&K]ÜVw¶hiZvj&¬Õ|½°úÊͳÛϦ²¦Uª…ù²>)OZ¦)þ+|æ—_¢“9Ö÷Öäwš +‹1…x–šžSîýئGÅÛÙÒ—ÅäÅúb‹ûü›ÛÖN©ÁçP~ƒ,ÆŠŸG#ZŠ^JONï)¥©``È*ý>ˆjâNþ +€Ì; +€l +ÝsôÔ¹tá1쥹Û숯.I»woîðiwgë׺°FU’“ó}¾š”g³LR\Õ³©ÏײN|v”ëž°¡¬Œòƒz«Wï·:–I_ê7ƒ—Ô_„Iá_¬5-¨Ù·úŸ¹òñÜijU6~$n·¹F]©þE;’ìþ´Ó›øÝÄc*ÔŸ…m¬:b!ž•G·X|E§×xߣ¼ÜH
«Òíkg%ÇuøAµgÛCš/©Ç¶ó/¤gfóÒ¿ Çw +
›A뀿ËÝÃ:>ûŒ¯Ob(Ú9î“ϜӲä‰ÅGÆu–xL뙣âÜËr59.›)à üxr\ÌFÊZ©™cõ-§µãvjöØ¡Û3;ÇpܽûA·Äwb¦Ú#^ÕÀ:JHºÝ Kÿ + ¿%ñÀ\fò!Ç>œf;ʘ§þ
ŽÉ«%š¾,*w>¦›z)=9ô&¸ ç± +ßmz°éÈÃ~Æ©O8ìXœ÷ÈkVg>0»r
8Ì} NLíö¸uBþtšÖ
Ðz|MÑ”a߀%ö_÷¿GÐ`¯\Ì8[€“{3wà†Aãå੯”ÚQØHvk¶‹ØnχJÁlh;ìgvjö—ƒ å>›–»žÒiB³ÃÔ@£ß W¡ÓJv¦tlõUÚèI+êíH6µ®`˜‡»·Ÿâ{wԽܶÚR}|±sÙµ¾AÈÂbÎÌl™{ôE‡¾„ò9
©¸%õ3Ûãœ=‹[ò6S‹óçÎ’®>èجšFj)ê½£Pj3ä©Ô¡WþBÚ¶0j´¹Ü”jg.z¯åH{¡5,ùÓ…Vâúl"m=ŠUL<YóÒ/Š˜YËùv«äÌ{VîøW½+W¦íÎ’"šN§†T7û–ÚqWÚ™sÊh
o³…Ý2Nó0#OM¡ZöšdÐç5Ä&—hb1S÷Œ%ùß»£ÿýÁßaCæ¦=mőܼ¸˜Îeê6&BzðËÊüÑÏØ«[¸¾žP›¾¨·]Lµ9ü‘m
ó·\S(+_Hã<wÂÓ¥êžvìÖË/·_»¯|mÎ\&µzê6†öC©.9 U[hvQwþà\‰3æ`áñ 01È|î¶ +Æf
{g@Š1Œ›ÛÍÎwíOU@(ë# ÈÓàv\ +p!cdÌ$¿Ïîp8X˜‹ÈÝ;!È^e—û§WntÛ±ñ³¾ôˆÀ˜t[TÝíûý½£Úœ]‹Ìryžãý¨oJëÃZË»{K)Ýv§Fjg+¤¸2#·W°¦—•×½ÁCü) è
–§ŽAs0°ó>Åî× _–"wòUPȘÓxZÙîŸê»Ãþ²š-‰ûÍÛ+Íi#58iCspØøþpŸ¹1c[³Ý»/w6µ³‚sËܬÕÕbÝ›Îf+LàEcôäÇÿˆ/ä/ +¨™öþÔüÎÞOXãÒîû¯ l2¾%AûÙÆÓGÓwnRoò8Ó‹'ØÎtbŒ®I+q5ÒëáJM…ûÕj£¶ *BnnQé’²#Ù¾”èÉãÓ—ÇçìPÎ/ë×0ß— +Ïù–U3©½g3`#mâO¶mû™˜w ’¿«³Ë‡i¥p5)z¡`xÑI`že‹‰YŽÔ©\-Á¸RªyHIl‘ÖÄhôù µëpY±ÇîOÇÍ¢]‡oKÚUïŸÏž?÷ 8{ÀþòÔ¼[ã±»n'7¹Ô°N–??¸’\íU™¾m°È÷õ;±|,^[)˜÷
%œåÑ;˜Vn¤ØÒ÷È$Q×Éqº¤WN z'œ`oXvœºÏ˜o|!¿îÿP4çb0K€\Õ«Ã>””`?ÏîãÛ áš>Ö:ƒ¬ŽØ²²Ûöâh!éÄyUœO?ßã‹úUÍ0¥ÛlÂ6ïÓêyN^G<f%5r×5”?ÚT‰Ïg•Ÿ>Çûyv„kîOñY[*7@ì¶)ãc(•¦°Îéc$©Àz+¾x0ù˪yÒöâð±±ßÕònC¸ÛƒÞh7O‹´ +@L[pµ†Ü æžlÀ¦ÉÊ ¸’Ïvl¼î}cdO½hÜ e©™£"ªae®ÞfUîõwK&ùv”ãËt§Sß‹ôù|œ8qáÏé>¸ÛHÔ_ÒaŠ3Ø7Ù{;µfïí§ÇÇÅÙd÷¾¿<øà„IûŸ—“Ò°õÚ `ª³x63ŽAfL·jºž-¡÷Ó‘7Ùv„Ò|}éÎ
-~ 3[V–¼ý…ˆëÁÄöUÙå¥Ãã8P×}¸X +0¿*{N'%¾rÝö.á,—æø.†FÔTRËþZ&æ%V-ÉmÎo‹(žé p–ó*¡+Ý5úHZ²{îž=±c±êw%žˆ™Y/•ê¨åsæÓ `¯¤[—wZ•©Etå§ +’ë§YtïáµÑî|Ããõé‘ßè? +ðã*ý"©°WtJ\uFºÑÞM‘ÝNûâØö÷gýSb|¾IFi5V#ƒl9ýôâÙà[ö¦±›¦ôÙ +§‚Ä”Q
sBÿ +Ëz»ÐoªÃë|!òýucÅÍøÚ;Ï—åܸ£Ò”c¸Ò‚Ý™‘ÙQ§=SHŸîé “ê”Ëz¥3•Ç£Îo°Ë#ßù=¾ï Ðç 6ÎVrz-žÑ«ÁëÎ CÞ;a›m7/>6g~š2šG.,ZžùÃ{Sêˆ&5&0‹ág¸ßj…çÒÊQb‡7iÁ\ +U¿tn•ö‘~4ú]×õ6Ô“ÏÉThºCºfšý +õ2>•rÎÏÖ0/¿šByŒ4Äz¯Ëív¾v_7ʵzªQ¯.¹UmeÙ^ÅàÙa…&$©¼™¨j¹[Ø®Ë)ïᔸjâ +‘»ÿÂgwô<ø}1,VæGR-O©^µ:!mgÁ/˵Ÿ±‚i×›bR§ ä”˪-ìbj
±ÆoêePµ«¡•„Aæ.8VḣëäòF¸úåÔå–¸Ò>.e|/YÖÎHC¢pÐRÅ‚Ð&kùóšlçE†êA? +
У T=l +ðô…x£»8ë… +,Q·¢}Îq0aœ÷ %@à‡- ª5 +“x,b›/$’çóSÖ—q8ϵ3ÁÂ}åÑéZ{´=‹¾¯‹oêÑO&ú-»Ý_N|Ë:ÐgWs·^qpl%áÊÿ#¾_÷ +/¿À +W(ºl`ãìÆŸXK 7bŸDÛM<-k÷Pß×GÆk·B=Ñ;GÔ~|ÈuÑ™Ò'>Ì—æºEëëíU]¯ð'±Õ/Uk¯ÉÎÈ[ÖåpÑ*×Sª1Ÿ—ÔDúMÏ»S¬Ø÷L]áædYÉÖ3ÿ>óKá ++þÜ?b €Ïù–߬üçÖM¤lf~°©Rþá蔯wîÒ=ZR§°{»‰ù^;òz÷xªÆI(išO(«e£‚Ù*ÐœýÜ$e8#+Û¬)Yþ†Ï\fNÍp{Þܦ&³Né +äoQ€+ÛÓg¬çöä'-”¢:ÆëRroS<€±ØyÍdŸoò[
ÉÖÌÌÑjW ÐËhÎ2*;ôübäâ2-Huv,MŒ9±§ÜÓzäô,w„þˆ:Âüju4x±ÅÑ`Ï“¿ð…üåÁ/ +@./dx“ˆvÿÙÓ»m2<k¿±iw¸|ëÌáÕ<0¹‘3ÂýÚèâØ«Þ܃â +iŠ¼•R8:˜î¯‰jfŽŒåy=Ý)–ö +DØÆTþÕ eU{‘Å_)aœ&Ñá£Ù%úÆÅ-öìs»ÆâD²ÃˆÓÓ SÉYSº^:¨å9R®önƒü¬MµK-vZ›Zèê_ñ…üå vÙ=ÈÝF¯ëÝ,¹G”Ó]·,N»vØyY8µW÷ë`¢½oç•*äÜwÑNá'^|Í ýµ±Á{»i±ÈáÖ>3®˜N5žñTdJJûµÓÌ6ƒ=®íäcœnYV·ÓNZçq»“r? +p…¢]oÓîžÞçvz9zµ¶}²ú…´¸×~ÜÊ„ÓÉUvôþÄÄöÌ™1`jY'U^_䣡¿$;»DgÝÚ¼´ypÓu1)Lö5ùürùÙO~¤Í>ë›ÇÞ¾5¾³y« +º%B;Z(tQA·ßµ.Åä˜qÛ’&‹6â¯íÖ€yÝZXznî¯Uº9l§®üwøB~Ý_1q‹Œ9²XýÚ_yš5ÒÖ¤¯¨gü‰(µ¹[“ìBÔOÞ†_VçÃAÊLL8l¯)láÖ6˜û¢ätB£äѱ™Rï– ºXû~¿Yjg.½vkXšö›e-5…Zd4ÎZ~ßÛê³Qx÷k|ý÷ب9°ÌÁ´³šÎÞôÒ¬8Ýy!®ÁßEŽÅç[th +dRF‡TäœÓ/Y±°«1óÓ¦ã
ÆRïmfD¥ö)¹9½µÖ°˜±š‡vh +Õ¦ß8/˜øW÷eÚ(Ô+ ¯Y»[X¯6ïõ¤/¤VÏøö`ÓS¦µ’¹¶ìæ³5ešz¶¦ŒºÛN„ôà4ªy›Ë µ~x=è<ºå»uš/–X6‡ÀËÞ®Ïb“¼_ªŸ7ùÛu¹ív?/ñksHÕp›^T[(¾©Ä{úP¡Iá^~Ÿ7¯òF| ån©X†¨Tþ_È÷euYTŠKFÛ•"è”DÊc1ëÃx~\p—\t½)³ì,[÷ÕÍÍ–3Î횤;Ô½¥yÝWê½Zãgµ•¿+Æp”*¿#èå¾’=”K™»Ò*ëz·ˆ=¯BAhr|Fþ¼é»?ÀòµUsJ‘Ñš+¹‘¯—èÁ¦{äëÁ¦ÒµaÝnk˜kôg%É×Ëñn\]²#©b¥ÜÍaj‰+ÆZÑ™Åë"Ü‚Ðôvù³q>䋉ó%'³g?WA☜I²Žqb9®‰V^h~!ß—ßdsÎd´ƒ2»ÌdÇëÈå4@‰u 5t +°+½ØÔ +ÇäÕ0»WQ ¯õ‰3q´©9õ–wÄK.kò¢µh×uÕÈ/Ê*íŠó
¥ç~?4±B`|ÿô>i¡Ÿ¿%å’÷&Èù;)ªŠ»uЉ›GÔ?GW%d&/æ\Aj”·÷J¹né#ŽÚX ³»ÎÞѾ!€ÅH»eHi9ÎóŲï¬U£fïçïå;œwQ£0O½?Q’Âu±¢’ÍÕ +3çR#؇šs€õ^Pô¾†ìŸóBÛŸïÝKÏÐõG¦B:·ÂÚꮤönüÉÝÝ:QÁnåâÊÆŠŸõÕ~Zmë×¢ÒѪ…·Ðês^¥÷ôtžneJ¶šµfÃIë*â"‹Ë’,Ü6y97sˆé¥zÀÿ_ȯ{€Ò]¢& ʹÛçàHìóáóv|¥’RHñÓÅ;bÛëý,ÞŽvnþà"ÛFA'`Šù5vÔʺG^ëËàTn/Úƒ™›~ö%»#ù¨ª³ée ÒM0Ò,_yI³^€hå¤j¦‹CˆØïñ§æ¹dbJß8Ƚz-ýõu0ÁhîçØŒyY‚Öå€ÝöáΪ)k ²kW,âFqÐÈ/ÃÕ ¤¾)?ýV{6*l9¯²}ÉÇò¢¨n‘ÅDÛ—¶ã©…í}ÌC +í(.È¢³ä'òî¼Í¾¹Œv™¼ýÉ‘(ëŽWñÊ—í'Æ_kõà§ãú +™¾‹[Ür8;Ò"*g˜ËQy_ò
ý3[|ß–åÐ]I….òPQíÎB>僓¢eò9Eë”âg$\%k#ôNžÆPëÉdÿ rû0 +È…{ðJ¹óƒ^‡›P:½cyxПôÊ}ÂÕÒ½ý}ÎÔ×,)‹ŸI·j £€YÆhz¦s¡^ÐíÚ®¢áíVSÑ–˜ s7W)g¦’eu÷½Š¼#{æ +¥zá¾g¹ +‰K‚X›ÕyXÝŽVõöÉ)oÛƒÁ+éä(ßñ™Í“Ì‹øAÿ~ j¥%ÈÖåÈ7ésì>vG7üÃI"®û*»Ë¸ét¯²ÑKKiñ¬ÏGS±m¬Ç…³¹&ýÔDzÓëªöëþ]®žs‰ÄÛtw›jÑÊ:ÇøVoG'M“aëwíÖä@¼¸j¯Tá®F©Ð.ùìÿ ¢á÷É`¹ÔéüvutñÂz>önf–Îv„¾mú“–ÃÍ«®Ï^mjÌkŒÝwuO=ã$3eÿ*q%îÙ±ã›÷ëüVž»I¦«îÊ&Õ`—ŇöàÈ.[nMH»Öj«òÿ ç×탺t¼åh?,7-·UÖWùí:ä[¯eãT„sò¬{q[VA¹ôŒù˜ýÝ +Ÿ««¾•ët>>w‰ŽvçõU´¯¯å&› ßš»—»:¼{l:W7…¹í5ÑÞm +K¾Ñ´—³NÓ¦¸æü ÿ”ÿ0î¹Xú!GÜu箫6iÖ‡«j^™/Rås*/zlîŒÁéd§O+=Õ4VF/yÓ)“l.…vŽpŒ6Ù[§‚ß.ŽX+ Ïös¿6ÙÌë)5E™7¼£å6äi-iȳ,ÓűÔñ¾ø¿ñê“’-ý nÓŽ„Í7ºK¦Ö‘g˜Ž&ùþMö=&Ù’žo6e²sÛ½t)/‰Dã2t{1ãK=Ãi?rÝ€{•:·Ö»Öù´Ò¢L²¨¢•›R°l7XÿAôª0¯Êî\ïgûd=z7ëùyIøß8 +ϹàÆÇuk£ˆqc–ìTÊ›ü¸®WfK™€É$ˆV9hûrká$Lª×„S!hunõžÐnlÊ*×:7¬V'ªX§ÖÙ7=±6ɽújhôŸ¦a©^H>ì÷†|…©¤Ç“ÚÍIïk–xÈÔ,©Tü?è¿>ø¯¼Z›}qYY<–•ÊÄ;ØåQõºj»¯ÃA?IÝP‰MïÖËlð¸«Ñ£7_¾“H{ÆžÈÖFÔò¬£Èµ¦×ç[
ßä §ÔÈÞy^xq&c¶ä%Sþ,¡‡Âûa5vPm’^I|±TYj®Â峈ƒû¿a‹¢UZ<Èk~âÕÚ¹ÔœL^ù¾·y×4“6—rë¹_ˆ2N¯ùÐÛP¹kmºÞ‘ÅŽƒ°áÜ£>`r€1Y4]» ¢oßÙjO—+Km”?A^(ó…ú÷Ö}i\+¶ýƒ½ÉÙ/Ê
䡤‹dbÓÿÐqpéÉî„’&³ë}²T ÔÚÅU{™Õ[Nz¶×©Åf¯õÙR‹ùîàÛb‘0bÂYiZ³Úéeµ‰› +GnÝ2Ÿ›JÎp|*aÑøZ”kã¸àϦŸBl°ü íçsá6frã³·}CÍZŠaez»ú~Ð}0í¦ß¸i-Z¨~P|TnÖsQF“ +_Ž˜*Ç¥†%;¼ŠìuZaÊI¹Vñ1l§Ã²UÎœL¾èšÝ‚?-öò§%¢æ‹©TÿÍ™<0³7÷ UÏ=SŸ*9§<Š+ágr3.>ÈL̼ g6$ Œòÿ +@ǹ!@ßæ`ìû”3ìeÜ +ðb¼y„
MÐÀ" 6ôÁ…W:¾ë +JCØÔÄYØ
ÿÛgà°ØÈ.À¬%Úí 0$85€uð¼F*¼gÍg¡ä(–ôãEý–PWé¶8îÅ_0© {à
Ø”Ø +j\Ñο +x€ÝÍA¡ÒÀ„YXÁ0ô…^ +芿IôI|}Ž=ýxfÓù{ëÞcn2#\wMK
•iμèåóì\t¡ïy¯±»ã^³èê¶×7°/?{q[—¼}w¢îr÷ºè\Ý·½G[f;O+¿â¿2¤ãÏÇö{WwôÝŒZ.6 +Ë?èZ°½â¯ +íøi{=èù0Fx)¸«›Þyñ +ÓúÙ»o»½¦×îü
gË5S³‹çrV›Æsž›$jE²>beheÚÍŸœ.cG#sc‘ieÇسCŽd¶B´~4u¿mhñ½'‘ZÛ@¿ +Î>瀣˔W{“Žë^ßwù¦ç×{ŒÍ˜FO€D•¬MpdÆ¢<ïŒäúP6µ–mý ÆÉÆ÷f®-âfNñIãL‡¸1àò;â̯ +»Ó=R(¶læhÃ(Z¨8¬‰ÁÀŠt{p7Ιa%‰Á}©a³Äò?øAÿ)ÿ +¿ÎI(3xÏát„žoI~@î)<ÞGeŸHõ<Ç&-_»ÊîÆ7íÚ̯×Êö³[\x0›]«— _VoãŸæ ãßF9÷@ÓΘî³×VIO÷ˬ†Ê
Y•Žß1¦ÓÑMCDC×vZ¢Û"þpNÊ¡±£óÿÞ…L×>ÉùÉݔɅ×â±Øzº²?W1Ñm–Ræjc|´Xå“Й×Ççý4u|ã}®š§Çì>¼Ù©× -ÒúoVó*I†Œ¸>/ȬٻÜ^’YDÉ6¥”¢¬7Äìÿ…ô_ +ñ”Ï/Õ«œeB|ªÍbˆ|«›R,U°kíÚ»(#6ÃtJœ%¹·8)ð+ +@ÑoΛEïrÝûƒ£“’Íý¹Õ„sònš«L»tly¶¹*•<6û8ݪ嗼9ÞŽÔÁz¸0tbyš(—rqÙ{à«øÆJû®Àg~?6½(¦ÚÅOs•P®µ&¿×ª§ûëÖ¤3‡öÂUnuŠ3ýÆ…Ÿúï +')Ååu®~§goI ¬lø¢¶ePºÿ|5T«Ð\ü ½Ïü¸eœu…Â%òÛñ¼wæ¸LáÎ:ršr~Ÿidos²^xŽòŒÉNjµÛzÅUcg%U›ø~PY*Ïyùs¢våÍ@ŽÊ|qŸ.9ãTÂäJ"ÓY|ïßgûW¬ýÉš³%³²ò®˜¢Á•ž•%1i _Ö:µØp\Z±"…Oþð¼ªj+‡)}ÿÝÓ›NÕ&ÆFŽ‚׾ѫŸræÒ€Õ—»¹¢Ìt«>î²ïƒž?mˆY~À»|™_ráMAT±_1¿¿$Z*×Ï—§ÝGëøT»Ñ®FžjÛ¸Yç¸ÔªÆb~©ÞЊ03S¾Æ¤zR%Ù•hï™~É܆Eoä‹äß²Éf•p'ÚÎ!{Ûm.ß,yzÑ3
Tr)¨¥¡5)®ìˆäçö1ÈÏý +ëPa?Ãä´ + Þ’ˆÃj +õyLögüý:ŽÞÔóÜ*Ï"·ãâJ~,=n‹éàQ»Ma\yŸ!Æú–°†w[D»(úd“Ìu{È–Ã]Üá.~Ñè^²û±p´ûíàf˜ãÌš@WgŽJY¸ù&CÎ7ŸÜÔo€œÃ‰‹t•:ÄQ¤‘Z¼‚ø||–züxT +ÈýyNò70öê·TÓìDHºÙ»Š…Ê0ô¸Ü4$u|}É9ÿÜ¿Éñ©<´éã,ã–ýÄ¥ØovTbX?Å6{7}-z²§P¿ û« +úIú€l|ß”§º [ƒïÛÏ+ùWYÀ™ûGÔÛQïòR/Ƹ0 ؾ>¸£¼÷ƒzÚ¦¸áʜڲù´ä•Ú¬Õ)¶Þ6{Ù•dKËV`Aª .òõ®9..Þ¼dºïy éY´Ÿ“³ZUÏLþý7ÀÈâ{ +Ý9íŠyš\+7Q©7õƒÄ´‡£O=ý²Þ¸à»Ûæ²l6óÕu9¥xéS—÷"xm°¹¡‰0›Y¦4}ŒynòÈÊ„½žæÖûp¸O—ˆ˜´–(a?—”ÕÙ¸¯_mH„2Í”K@“©È¢§wRX˃[ۅ뱟®œïsµã;JñNmzäÖr…¹ýnp›
ò´½•çƒÅ9µçf¯Ïj§ä=IÚ6b} +#ÚÊP£ê¸«»£‡›£Þ +»Œ<‰L¼¡ +}Ë‘\>_¼~œ75^c +–$lâ‡×]‘à)6Í +„çêß +bÜÜõ¤tã`)t=˜K¥zþ=d™rf(ÖÆwX}\Ÿ«j£–ó+G{VZâ*Jf»¼¾u—åµÊk›~ü?è?åmÏQKS«"S¡¿HŒK65à¯Æ[58òÝ{¯N”±…*.µA§'cŽK/ç¬#‹v“¼ä¼úÉJ˜pö¼Õn«ë«o/éj‹`¿T8**~_>Õ(g¼X+’Yô&óuQn¤NE2ßy/´öF-hÂüW¬ +~53KmGŸ‘1|€R-?•Hóž?¨”91±0È-™ŽUk68.ufY‘vþíÕqZÝ–Ñ°:¶ãʲ7•7š±.9ÞSÂ"Õ/’q÷RКý8?h›é\¸u²¹ +–Ô³·}«—µ”ÅøÏÕ÷–ŽOBñÈüŠ·UÀè2^¾]ˆ•(gÞÅnr:£ý€âò+ÑЊ]’1™l5Þø…ÊRšýy®BV®—°k¥Y$T»}>_ø\¥\Ù+YK:éøp¶¨ät\R\ñ¹#ùZêB83bsN¸×po]ä!Úßðƒþ9ŒõsðlÚØ]¹ž¹«Ø
Ï׶uÚØî:5´Â:dʯÆÚÌ„÷òFÜKXX‰þ$•äìñ«dFŸ,ƒ÷2t“naW(äÆÌÒ„3ÉÀÙ’À^™ +.·°æo²<–C*:Ô1Z$vÄT_bjlŒTrFúW +7KÃA l(¤Ü° +k^öaÍËóUŒO +ÀžŽ p¡f|²>Íf +Îü2ŽýÙ¸è„ÓiÚŠ'¯Æ*c½+nÞjOñöØN¼™•v‚£Õá‡wkíÛW«cN_ðƒþSþ€ñ Ê' öùÚ„M9ü>”±r~ÖÄgt©zt ãÅãøñíÔÞÇv´ÃêvþÀ[!ÇvW{ú .sTm87Ùp2³2Ö¶XcÔÜNZÝÜÑJÀuŒž¯É¨W&Hó µk&}I¦:-ìG¤òŽF½w5‘‡Rð…ÿ7@*r€èÅPfpêmK¢_âå‘ŒV§ë‰Ž§ç¨pöq–yy…{w³¸ÙöVõÕ@;‹³×“fwÉS¦³“8œpm|be.ÇÕÛÌ]Ó/IqÊ +aˆwÓÃr{QŒOõÞ:,oÌí0\ª£X8ü?Ãõþo +E÷o +€¢×Úõ Ÿ›Ar¦>‘~µ¼Ë2øþ^Y;øíF[÷×þ ³ZÜZN0k©ÈÓêåéQ~6 †ô\ìƒsµªéCSÝW:%'%½ž9³t‰¡ùq7ñ*+ác3¾ÙÉ1ïô@–©›"læ%ûírüÙï‚âu“pÿ@\!9V·p~0ØÚiïj{Ý›6Üm5¶+Sßȇ‚¼¼RÉF;¢7ûÛèTz¿Z»‚B«|ß&´Ž®ÞEU Ç5ù‚f[½jÍÄùHVºm¬b +ˆ/x|W9t¨
÷hù3ÙÖQ¯×QèhÉãÑäÀ»ÃãN@ܳû7|×ÊÆßl9Ê*ì”wÕYÝn²NyC)biyõ,~>7Æ9àöX»+'Ãr×ÀÓ:vVp5;½dåò¤[–¦‡¤.¶š›¶°òß«T†?h‡¾PóvÞÏí¸Ò™»µ¢á•h˾ąhÕÎÇ¿Œûv º»¿ÍV7ÌïªßÙv +^IÇJÛOÖ*l¨4ž]ÂÁú½ÿ=¼7¦èì©Œƒ†;7et7h·»¡Žßü§rVKéÞ]ÞRsÑÊw7qRpÚjv|Oì¶BEçÌ3k1ã²3ɺ5?…C|$¶IE6Þ÷?hËjÚÞ»¿áñ”äÖ©1Ø÷:•É;¯µ•ÛÈ)@-ÍÛ˜ÞuÊòñRi\˜ +¼×óÃAg°^i‡<(†dE½iO~Pq]_dº¨Õ øC +uò}¯ÁE”Ùi=PScçþ`Ò\¹–ÓLaÔ4o“^¯a¥e3¶Ívûè5ÛU×ý +ܹµzwNóÚ6kd–«%I•M&'®ùY„J3cÝàlÙÀ§Þût¢:éHÆ×_JÜÚë:9CõÞ ÷ê='µû‚ž—󆌟ݦ¯)bU¸±ÈlUݦ,•ê¤Œxœdún{ã}õ"[Y%Òo\ï¥9ª”›Ó.¡P[^¿<Oí(7¿s“ƒôi±ƒÎ¶GRSè×؆d6¤º2é}·Ø2y™¸Õ†÷ô]®V:Åem8xµá` +åzõt{öضœõ:Å(Îb‡€jd¯jŽ §rI‘L%q“Vùs¸ñ%g°Þh}˜‚?5…lbYùbj°È™‚µÍZ½Ù‘ŽýSL7óF%—A•Z·.ÅU&ù¹or3ˆ-ö7L‘ÖëaŽ35¨°'ŸáŠ\§Ýc—¬—|n¦dífkê'sq«Ý¸ÚÌ|žåÏþô.9};S”+:VȾX2_øäé\AY•é&}©QË~Ä’3àÉÌý¡Øëeâ2—_ý ˜o+GLÎ ¦uY +ËaózòžzÚSòß`FÙòµâI®§W¾px®Y%íúQB¦5«´ÜU–"¾)gŽW·(—‡p+dŸ¬—ׄŸµºÝ¤'ŠË÷/$_î\ ‘)ßqo^~aþš|cZÊ?9M +-â|©Ðb#cõgbzf:ƒ4¬j•JÝCj9ÝÞ!.¯?øAÿ)ÿÈj dzÛÈ$h …vb¤Á?]d<°™w™¶™,OÎÈŽý>HŸ±Dg±@Ú
"Þ¡p懇ÎëH{(1‡§{ + @=ÀïÆò„;™bq1ØCœ¾ïäÊoÑ$[^“íÕ“îhsþ@¦Ü‡_öz0P\ +
&"@g ' +úHŽ¶ÈÀÂR8@™Èÿ¾!7ãgG ³é!v>ÈX/X餔@¨ð_'ßd¸þª‚LŸí@ÜÇ 3à`ç`fæ™8ÁVaü’ÓËû‹ÜšÑÓïÊ×/ÂðƒþS†}>-¤‘†Bƒï¾ãª+´“êT•—°ä +Í gŽÈ|Ó +ÏSÓâÉLÑ5ÞÞÛÓñ^ýè¶ ¼$z{$j/\òjß\ØûWA»7C÷BÉ!Q6çç#”{üKPuN·ã´¸ ý×Êü…28ú-ZÜÿ
ÐhòPæueÎàüFø½ñ}µ_pøóì8òˆt{é•l!6ß^óþÄeé¶ì‡Qçöœ_»îÑ {êäxQE=:+=9]¦Ýt™
âøø{÷vc½/þ÷¬QI9ŸBIH¤tŠEB9Fñü÷t¾ûw_¿uÝûºö?¯æ²Ð»1Oc³™NWíhDËúv²·ÛeÛߌ¸½~¼ón4_~Ð]®¿¶AI÷·“PôþÐ.Û4K¾{‚S½»ÅßE¬ß§¦] +‡Oå竜ԑǃ3ñÛê’¯_¼åº{Î/Ú£PÚ\Adq¼¦ÆÁ¤›v`•²Û½ƒ%§=Â$w?Kž’ÝH½d¶ûCZÚ+Ž7UOª«l*ëÍT‚ͼb›Vv³[ÇgÛûbó/üù5#Ò¬yBçB?ÅÁ´“æ²ßg(IÜñub·G,ì_7dˆÁç}¤C{‡W¾Ø ˜Únè{T_Üùp~¶
hé‚pãž=oïÖ¯«ó¦yÒãtmV·'á‡>1}Û¡RÃF®c×ÎàÁnå¾OîÊÃoë•WKœÔ¹d>3TŠ}œAŠ'廧“æ‘Å1žo¯GÐ+ûvó|îÎót3™Àþ| +þVë×w+¥=y;c]¢T›lZoXYSÇÈtº–mÛ}]"#Za¹el…[vl+Äâl§‹0?[-ä|ê-d"bä…ÌäÁ|Õú@÷Y5AÏ©RÿKß‘† +4ö+¤þ}%L·ž=ù!‘«žƒu¶üòsï>²XaÉmÒDc½î©ÔÁáÀXM~…—ÉÊ¿ƒùRlöBƬ9+8‘qgO‰ÑòK}ïX}Ñ[êúÂélôE0Xé/zñ‹!ͽæŸ_ºÿÒw¹ÍQû.º´ãûýá\·ØÇŠ”†àŸßù|ß¾z6~oÌe
u>æ¶l³’°öÁ‰Zf¡»cs––$C?¤s}±½Ûó•sqåz¦Wm@w23ϹS3ï~V4”7Vº:Z[C—Û)˜ÿhš`ϛԲɧyø5Oó×™óèl'Æ¥«³c‚ûúº‘ðz+¿ÉÓæ͟κÁ«Ý£‰[ÅOPY¨8Õ0›Ó'e]0GühYC„1õ²£ò§ÎQ/âK)kxU)UQ™Ò‰©Ï½¥Zd¿O–T‹SÛøÒìéÞLñÜeGBšï¡óÇb[‘¯[s'EõeÊ.U“w§úvå>b$X3QëfãÕYº•sfÑ»9Ã4.•ïÙò3bŽ,‰Ž–кOåøبr´3Òõ°ÙIMôqŸã>5fÜPjÊã¹4ÏÜLé&fu¹~oÎÿ…Ë@§Mú›!1&“¸ÞÆ‘’k“§¸DÐG‹#zû<tœlëÏž±¡wîÖÞÚ÷КÂD¼ úÊÇXL0L‡T½
—xe–/›j15hùlŒ8é6&§ÓxÐ4Ä„n‚Fø´z¡`?o¡·½ö„Ïæ©Š–¦šbòvõ)ÅÝæÿèCùvŠ/wÀžC¸ð†8=NæÁ!ìVà÷`Ö çš{Ä/Ž«×«¢¹:,®Ñãj¼lªÃ¤hÜ «-**2¦Ôä†Ñ$¥Ö8ÛÎ×>×@Ói5É^>G~Üdßü¸5¢'XC–&V5„þIÐ…uÓÒÀµ|¿bBNÝøž1™HÞ_«‡OÙ„nø‡Ùôîól®d·ÕÕòì‹{“ìHïM²±6jHõHèR“Œü*=`²2](Ÿ¦Èd\ZÈØ*7Á¤±Äçya1.MM$]ר:‹[ãÒ¶ Žz¨ó<“×xߧfÿBŠ9vš+'ÌÕkj?èé!)¥À˾à$ÕíeTÝeuo'‰V¨]ÌEË(»úç99h;ötSOåV¢Ô›{X2ø6í$HIØ”ÌÚ„³û$Ï›Ô`\.`“Q-›×9"ßrС.Z÷a»¢6¾í +üKYé#ùj£¨ýTÿ0ÀÉ47ÍõÎb'*Þ\~Ÿûœ‹Û7/º¯b¿¸Þ¨–]ÐK£%1”ÕÔX)g>|Ó ríÎÁ¸UÇbɤô·ø™VPuv¹I®6®Œnµ5Rˆáˆè0¶ƒpÆvÂt=°ëýË€¹7*,)<û +ÛÚИÏf\³î«ðƒþ-ÿèEBûÙÈŒ©ðŠ(…€ÝžðäI9¯Ý¤òX½`ö„ökV_÷Í%Ó–tTX.f‡ñ”Ù`x”ÍûM\‰€ÕoxóïºU¤Qänê³>4Ëš]~ÖÜ ·XÈ}ÖöWýl¿uîíÐL¡Ï›Ü +Éry²=šPãÖþ47ZÅê'h;1Ö*æöƒV"”Váþä_øAÿvd¢ž^„@“T°t©]ħ‘©_ï3Y#/Òû`ž¡T +GÏ©wæVãK:TÐ"‹ÝÀI®½8æbîå®N&M%“M‡FGªÿ¢oäðó]©Òæ3Ã|KÄÕV3œ\³ætbVSöÄŒVpb–gÀCÔ§DC_)DCÔåa{¾bÈz ÷?Vš=
gùºÏBàÿQf±âé¾=Y1`¹-zìOvÜS¼i–iN”PK¦óalžr³Æw›7cÕÊÚ®uªkQ«2·_Íúb—%´÷§ÑˆšmárVO”ò®nѨnå/½´NoJbíCVÕÚ§’Wþ…ÍÊZÁVä.žÆg]µÒ•×êñ?…Ô¹æ
öøÒeæ˜t8ñ¦»q/×ɬèé³MXLlÔ-¹]Ÿ4gtE%îAoÚ&í5:µIT_ÙvR[»Vp•fÕ»j£*Þ|•}fvªìÑE¥Â«™~…ïö§¾Ñÿ…à¦N/ÓBWMx7#¹sŸnès©Š»ƒ‚=qºÆÁ]tÇã“Ô>>x+:#Õ¦6[Éé=9±õžyšÔ6éMî +±YÍM?ëJq•;ü e &¥3;Ï–êç¸Q¼ÍX®8gF±…Èa!År!^¤LÁ¬—Æÿ‚ß×yž£#y ©‡¿ +ûÇÉÈ¡—/ÁøAɱ—Ñ[g}tkÎiòIP™Ê§þÙg2uäå«;5,Uݯ—OËu«tvtªÔÈ,úÅ® +æd-å-É3rŸËÓÍõ›îš3v :ž},¶³“ùw…ª³
±ñ€Îüó]ÈFò«1?“øò?Ó&ët>£®Þ.¢LäÚ¨|hSsÅ»_××A¥ø”OåÊ›¿”óøA±_xæ“Ã;É}¢ë'ׯÇ(>lóØnq«dûÖÌ +ýb=y=âö2s +ßU«³4£Šh1Ó(s$r‹üÑ¿ è–êEpÇ¥cxÓŸö&ëŽC÷–´a¤úŠg'"ôŠÐÜ(¥ój4+ÎÙ¦^0ÇY#ß-9äj.ñl<¶°\JÙY¡<ô´iù¨ÄöOuL]Û¡ÿüAá8@5ï`P·µj@Ýv‰°4¨K= +)ÔK)RWê)BoZ uSøöâRX/«)<¿»šÃ¨J¡ïfIÐN.¤ui§ÐªÁH"ÀnžB³ØJ!⌎ +ÍsH +9ÛF += +WÖ¥®æ;)Œ
Áµ`Ž|Ïãõ5ÀÈØœSèýx¦p®—¸6S8ÏÖàíhPµ“õ£d'#³úÄtù/¤°“Ë…ÓÊ7û'Ùø]ÄŒ$ ôÌMRdç›)ÂC»!º·W™>¦Õv»Àè¦Éij^ÔW +ËÆ º¦°R +«òw7`ØJõdÃ4œ×–Í»/|{_?÷£ƒýœäÖ«ÿPtëRøSB·F9Í”£zš™–ÿ·28c¤43Ĭ4Sí)r1¿÷W"«'–"“Ö7n¾yðiŠ´êàZJ£5€
ÞYz\R¤\NRe3 +½«5½º×ne¿¾|’sq¬åê_ +6)ê QŠöÉOŠfÔRš O—?ÙqÏÃЕž¥U`ÆÒ#pâêôæ?ÔsÝïùÛ
ÌÙ÷½Å6°›¹Ö®iÞí]œ(‘ÅÙƒŠVä£7Ê+Ùu(¼cûöÜÅIFLã_ +£@èê»uòwAcVîO¾Ë3Òì²è}÷¹¤ÙÜzÞÜwW!ÖxhPÊÜõè>¾-_¾¦Ïƒyej‡õe=ñw—Œë‡gglõ†")ÂÃ'OÕãJ8ÜÃ<xž«}úòûÕvmìáœ8ó×7^ýƒôoù€1@(ÿÝ.›¡^ž±½+~· ^¤Ø`²MÆÀ“zVqäùhžÈÞvŠW¤„6ÏÛUÄDûév»†|ŠÚSý8»‘Özx”šî¡-Ó‡`±ï]÷ïâô½g¤]ÁhõÞŽ3'Ó-ÙÞ‘ÙèÞ´`ϼòc©¸‘¡H_L!ÍÜ@¦ß2%¯‘býqÿ›)Åó“eâìm<“âýJúá5#§¯sžÒа’ Åc34ëAÒëS{û’ì8Ãûèë)ïFõ»¾ÝÏSg[ˆ ߛ氳 ÔÛ…ëʆ¸•€»6Sv’L 9Ëp§8ËçIrè…+ü)JÀÅ4[•«ÿ¥r° +ãͪCõt¯
¹Y8ËÅÄý»Ù{*ŸÛ;DºÕÂ4ÎHuñõh0ïHcNMmÂ2Ÿí$‹œ3“ÍíM +ÈxÅ +½sØ +b„™ïýÂw´Dü +hœú•
µlØ°Np°¾µ /gà]…ð!׸ëù5ÒbZ«ÉôÁ.k-/Ê5t8[µ5®ämÕC“8(Òîq–mã1oìGL¼FVøØ%à ˆ™''ÙYžåsÓª<žœç›qqÖ{Nkò¹WgÀïÖz‚å}æ_H±fd*BóL*È‘zÑéž‹?o Ðy{Z2LÁ˜üYÖ²öŽ+4¬Še÷L#ÈNt›—fw»,Ô#.ºJòö¥ûÚ>MõÞMìzÈSè¯ÒÌ#>ßð›ãRÙ調PäT± +æérsç¸XIæ—QX'zcá%3_tô¡°ôT¨°IÓ>À¹JêÒ]âÝÈq²±„4v†“+²*ûÊb.ö:ŸGó,Û’gÅ’g(u„ +¤ûTOÕ¡>Ü0¼n&”é!Åì{é½õ;{º7–Ÿý¶˜$Û3,=]*Ÿ×™Îê¶R.]6vßµ×£\{î^Lv&t!QQk³¹d$ï¥ø)kaã4ýɨ‡|áèÜGQw˜p³W;;Ôo¨}vÔ`µïŒpqeô×a7Àmµ<°a–f;«M—]bWš}
ß¿‘bŸ|õ²«õ2‡tKS^¬§×<·âµóïvþÔ>/gâøÉæbÅôAïÔÐò!£\ú!/=›u +AGCÖY›dd;–`÷0ª«Ãó0.WŸl’+ Û|û›Ù«ÙÛš…aOyÙÛØ¡‡Z…ÞvWìôYvÚýAû›£Ýù>¨ÖÏ%$‡h3~m•£ðÜXkèaûñjÕºÐìÓ‹>x«Æ§ã²Z³0RzÕôáJQQÀ"mÆ‹¥æò›O^Ån~–ü!%¶B¶;*=H|ÿôv³cŽ ¦Á/8Û<˜}6Ò [y–òÝÓ<¡˜â½I3¥üAçît=ÂN÷®¯oRݽÜØj€ê^„+Lgó¥LóíåÌNÙ8VëÓLNJJ^cŠ #à÷Ï—ƒ‘<Òð¬>|‘–Å®îCw0Pª‡>'`·^>
“nhl³ôÅŠ€7N7h¿£“¥ÓJ!¿Ózçs½sjÓW³KÏڽοpÍÊô +32ìIÆôÍ4ºR®ÛÌ4'Ð(3ä¨Þ—H¬Ø7Ûùjßm•ˆá©)MÕ¡ª^®q{dÚùÆ!é5Z«Ç×m«ÛÇNÝl.É?øAÿ–ÿÀke‡/Û·÷Åcý8ëÙEñ 6¬ñn:ÐVk^¯Ë¡Ãåæý’ªÎéçÓ;v©átà…u¦ïøCnû¥b{ÏU‰váÚgZå¸?S(A%4F²³¯¿vÁ½N¥líý0[µùák¶ÝÔà÷1[Ýx£ºiµéêÀƒÉÁñäK¼Ôòï³î–È£ªž…ï]6ÛÛðŠþ²†Î¢iôÂñP¡×‹LŽxQm“’×:úQ«JYi³ÁxÑšÊ
ó|oÕSêÕ!ãký]UzùþªŠéÖ¡2~ůJ~7.–Åü Œ–åÒ‘UK¡É\J!W(•Âß.I{†ü¬Úªp1zóÞqVeM_‚k—W6ðjèx´Ù¬Ú±‹ºÐžè¯Q“¨x¡§˜ÿƒ6–…ê¹nWÏ:lqH
]sù*ñÕʤ.·ÊÓþŒ)EÞ‚+Õk¡RÔæвgú‡É9¯|Ro•óôÜbrŸAOÏ9ÙNœ³“W)gûµV®Çàÿáý[6>¹éivzìö#§†ö°/“f¯Öfø¤‹i´çT§Ø¯÷Ö»–|¿š»•âs}-Kïù½“?-·R0yÏ'G£Îò9k\¿±¤ðaÛf±Ýò!cy¨¶ÊÀ›Í +l
84Ñ“ßâÑÓ>ë<>è)@_ÐþH«-äM*áû‹Þ¢W›s0ŽmÜÅ´©æŒa½ËߘÊ~ˆpå“©)%•™èÅ9Û[Ìqs•·Äâ:ׯÅ.>lžvØÎ<°\zŠ²s{ §MòA«†eT¾QAæÓ>Çg‡‡)"»øA¡ä¡!Ë„ßP—š” níÔ†¿ wÚ¥íd:k;Cç9YöjÖÎ Xs%5¹Í¨Ö?L)ôîâ|°¨\wû„‹»³û蛵6¼q6°f|¶‰*
x)sÞr*r:s8k&”\+¨Û¬y +ø/…@ +#99£)dÌ dΛÕ.‘o¦÷iSh))4*¯R¨.“Ï'|¥D` +¡5ð¥¨(&ýQ{®%“+óñrtüÀ”.’ÂûM‘\O‘:]Há„Þ6t +;o>…Ä<…Qq“BÑ!J¡])M!KΧzh|¯e–g +4˜E§Z<Î&Tí «íàé·úAnŒö+Ð$öEÍý4´wÞÀ:î¸lî½Í„šWz¹´+΃Íåæ2›™ãÐ?è†èÏ©/È_H3º–IÑîKÑ´]ø®$R,Óú¦—É«ÔÊ÷ø¥Ë×~
ÖιÝÒ+JÝ?Ę49Œ÷ð¡ôñÑåw¿ñwƒË[þô ¼cõÕñÀ úòæ5Ù\1t¶!ø¶³~Ögç…•q§³Zµl»ðìÙ°qèØðæB6¬ßZm¦áo +Ç–í¨T(-ýìmímN<yÓ˜¸»Š¦m kcy.8¯Û©æÐ¥iÛܹoƒ‘OX±™,˜‘-×ó,|ÿJ—“–RYõ8¾pj1Ý¢Å4*4nüBŠ6Ž@!Vu{ °ÑNñœÓ¯…KçºÁͨ,~š‡Åµü±=š¿ó[жU÷Â<–›ùw¡15íÏxµ‘IVlú„Ñ#Ì-ƒJX]Çr1=¤óœÅ¦f}Ü]Ú!õ¸"ຉe ݤضNa=âñéTuTû…U_Ù4;lc)Ö<”_÷Ù¸¿Æxù{›ÒyBeó‡×³Tð·Öº¹Ö™K¬ŽÂº3îiöZŽ‡8ž•Ÿ
ËÒ´uùAÕ.ö4U…¹üÎéñþ]Õ©JÍé7ÌjN¯h}Äwg.'C3wIUfnä6gî+¨ÏÀPû¢ò οz›m4Åì´òƒÞ¯ö‰¦cöuÒ¢ðÑ®·dÏ>fèvúªU7quK9ï„ælÔ;KKÆ"‚3–y‰.ž¡‹ƒ¾èð—yªq¯9$Ñ°–a*¹ÙpC7Ô±EÒJpŸð?¨" +"qÉ»OÁ&ÈdÓ]—&¨’<—TwÁãÖiÃãþõÃ:›¿õ^¥I¶\(NX‘(ühœ5äYƒñltÜõ‡nqùãûý¸åäƒÛ¦Þ»5\Ù‡+~k¿—5n˜3žç{í›O^ò
“Þ¬* +¯TóuYº-nó©Ù´–¢…7‚wƒÉ&i]ùí½ñæsåAa\ÌqÍÑTð¸Q¥Ü·Fr’ŒNÅQq\Ô6¥ñäz,Œ'o0~ñƒþ-§ÙƒÞVš„Ê¡x2ÕF¸+½ÖWËþÚ.Ø®¯{Á2šÓ±i41T·¡uYã浶zXí{JõÌŽ$=“ˆSJ³Tº†«ö:É&˜ÏçîÐy\ÓdT `œ«{h}8ǃasŸÃæ=oÖ'Ç©ÃI‘;Ÿ–…/r¿bÅ~øÑëhÖÜ‹ïÐÉ»æf0‹uÒ÷ÎAvmM•¬¿h“«A³xŽ¾ø¬„R3ZÒEVLß./¬¥¡4ñø–Î_Ïï] ¡7’BÿÄ©{/ÎÝ= +âšce"fÐ.´tÐåœÛ m;k>röÉùakÅæ~!Å&~á‚?6¯à£8¸œ\£Äk¤íV“CÑYÌ‹ŽkX„ÎÝîü=›Üʘ¢øûê7Ÿ¬6[âÛ»õQG|ÖùÍFáÇ_p—çj3Ô51`¬ø)Ü_³J±ŸÙEžÇójÏ›H—þ .dûkå”@¯OnÀ9ü/Àµ|ñEd¢©ÅÆ{kEÞµ¾8®ßo|oc»T¹³mX«ª5wÏ`¼ª±rŽß¨ƒ +v>=\þ°¡ºÇJyÚ=‚†ÆðÏF†Ù·Ì\ûÜþ +ùN«'á_dᦻÉÓ÷ùRäóEè{µÓò2`wÆÊ4BS&‰£,nîŠ.Œ–K—?e–Ѹ>ÑR.ÆÆø&±2ß.þV^t{“¦È1Ó*3íÖŽ&v8¨ýN{î©Î¶“ŒCfڛ̒h¶5¾=ص‚öÀŠ?íõ¥Ÿ#᪀ý‘êÜî[ùuÖN‡W%u˜ÏOn;ç•r}r:˜Åk*ñ’ˆ£;v6¹g1çKåÎö§Ôß¼'p‹*#Mfd·1=ºã•)T*/É>JømöÓ¾¶v}-ÓÊyF3‰ã¦‚æä‘}ÿ Í å¾À›<Îþ»t/.)¬"{ìâ§Å=êùú 57jô9,§ŸãK›QqÊuˆüE4àôîªÏ/Õc¯ÜWLÓÐÆE±Ðyaƒ:õ.0 +ÎÍׄ6Ž–ç-~4p›¢ Ÿ‰0<ÂD^®6.7Ô˜é;¿1c{ïÆŒtrYÅij¬šý…m-z‚¹rÁÅóò²6ƒ9½Ù)[u¤äʘB~=UGíá|2ØŽÃtLudÚH=§“L2!õ‘òO +™•2k”íQÒ&Z“{¹Ó<µÛq¦;2QwäÕÚhzëcÝÌAiÄrÍ*ClͪýÚ2Ù¾k´ã5z|ƪÈAaÓͬ/«Òùu2;AÅ×&›áF6KðÇûùÈ@n›Íbã”QñÎ å—½v> ÙÖa¾”[b¶›á²}hʣœ¸{„ J×BC_¢D}áàÝÚ;Óæk'êÕõÞßVÑRþQñžë|…[vûΚn+xþõ*ûFÄ•e¾œ +-¨‰š÷Jö²vгXðõÇn÷ÌZä¨ÂbL|hÍn$©{ÇÁ+ƒ¼Í4£â¹]_n(¢:™Š¿ÊÉ•B¡ ü)».…‰”j]ûRœŽ¯Â£#…¶•+ä—yº™{‹J?Ǽ"éÍÁVÇÁ7ãË
GŽm̓¨x…jÛ'†Û Šá“8ûúÆŒwª:®n¦™˜±ÆÚhª³Ùã\îÞ¹5Oz»G\ÝUs²Uà'—ƒ…\))e-ÞHD-Ä£žOtd•§_Y7×Ïe÷¸+#<û$Á°Õé}²-`Y¡·«¡'7¡Ñ*Þü.]ìï^«—L£tÅ[$v¹JÈ|–ñÒ"Ø÷/Ì*Iךüj|Ý‹Á®Ú½{w‘A!ÑÞ:UwŒ%Éî€n"µkùn brýÄáCâ2ÆvF(dË“²%hþ ¨4Xë™óÖ³2œ¿AZ%S5ÿ›
ŸP·ÕÁÂ6ÔmâwÕêàC]jTø&l€…ò´×m¾ŽnLvÈœf?h÷þÊHd†GxøéV±<Ö,ÎZ9·Ò•žÝ,÷z5²}l ''"3gϦÛ~BÁ¦T$!Kýt .‘ëÐc +zI +7 ³§}á@ßìè7ßn¥’sàMµ›|Þ¶œ|öïUò™·÷ÉGXÜ¿yp`y±] +û]Él7R¤‹‚XjOSx-š),¶)Lb—®?É`,â/NË/Õ‰'?ZÑñ!XõcQ8€Y,.—žÒCV ù£Vo9÷Ù\8ÜôÅùsí™â…‘KÍóúš§Î(qoGœ±&þNê_Há÷æ™"òã•"š¤”†ÓL{[üfGI¼f*›"ç•œ"êe™d—Ýs[Ÿâ©¼x<”‰þ¹_Ý%vobÛòÍ`6ëk³%¯KöÚ¿¼w¯ñ¥W€å|$Ì3[·ÑVM_a!ñ£"¼AürÐä<®›Z@6§•}‚LÊû¥Û+ýBŠpúB_@^
]™…ñ + +7PŠ¦Dþ¿•¬Y*$A«ÖõƒåZçmvÂò›Œ†'ìí3ó‹ÂrÇi¨·å§¯ƒ'Ž£‹®£—[Ccd3£oøú>¿!ÏOËy.IÖ¡>šj¯ø~µ‰É*óy‹Y\?Â-¼tÌ~.ýçù…4£3@cãû ÆóN³C®f]¯ö”H¼|ëÂ7, +Fvl>äòÞ)£Ý®¸ïo‹ÌtâFgÌbÿ1×F'Þ8/í¶·ßRÙŒ<V8ø¬Pö‚Yœu¯,÷p†\Xj´8fO3*°WS~Ä0h'u̸J¹Œ¡QYøè¾ýåÎêì LøÝX}°oÖeûºöÉë<žÇñáI@Ï}¦¿A·dTqϹŽ·ïXab÷N
eÅúyÓéw{¹î»Å1ð‹J)¼› +wù>“ëj?0£™A«ºÁuºzû½–æt†Úkïç'Ñìm7£ÙÑÖì— +k÷Ž)ÖºÝô•Ïå¥eõ¼PÌ6º +÷ë[¾äÔ¬Ôê” +br«‚3Ö›·= ù]`ÇA© ŒN8ªqgj†ÄiØdÚOÖØ9–èÆ,)'·µç÷tØ\oo¿ð¬¼¯s¡~ƒžºÞn¥ÉÃÙ,Ör2Ÿn‰³T2õu[Ô™yÙм7±SÉ;’/Ñò%µ3"®ˆ;.ôwzi‚
˜ÆÊçé5.ß½Q»ò\>ªÃf²·X +ºî ßû«‡õûоÝG6ëïc™vaÿÔƒn½,ezý…û‰îaÔß…û¬.z`Þo˜{gÍ°Mkµo9Æâ:=HºÝ‰FÚvxœ©G#Ú(µƒ}”ÚAï.®ÞÈ[@++”÷\a,ŽÊµ‘Ü|µ¸YõØê…͈]d—ò`‹¾óZn{îg¢¤Öú Ìî¥ÌØâ5Ædž‡G=¯T¿qù…[÷b܎Ƥì„ánžþÒqP5gY|¬›dw6Õ¶ñd N7ôT¾5FKÐ_H¥ç‹vX<Yøôâ'Ý2.GÎ]'ïòð1Œšì‹ÙЃU2eûëûHìy«ƒÙtä2…ŒqîŠÜ
¢Ã€®Ó²XSèðXÚwEþtïüøÊp\ËŸÃ_\¼MïØÉÅßV縻¶am½ÚÕB‹«s½÷j‹ªDd{r+wã§Ö"™‹ýæg3ÙÍNG¾xžßGj™zsÍ +õئÔc™î:éÜ;W#¸}qþ…Hü$g§ë;W7ߞÒÓ
ða*‹À2,õ®icí-HO`qÝÌJü—¬±\Q÷Ü]¤ÎÃE.ÿb»îôWû\#•J/ßµ˜R™fºÕ\sL72u¥ÓÂi›¢ö@ZÃMòƒ’]¼YixÒþ8Ï-Ù…æwÒj˜W2QÝË/
»Ü†ô`·~ÏŽÞjr¯¯¦´œ{åÅL¦öd +—$†?Vüθ¶>ŒFÄ.3½ò%bkÖÆÓÃ`pºßû8¿N{VË0åî¤ØµA4Ùé´[u–êÔêÉ4ée{Pí[ÞlûlqM²Ôž踅…©×âPõ +0¿¶¼¶yùƒôoyïª÷ÀÕ=tëdY{»TåØ1 YÞœF•^lðw¿Ç‘K´Á:¸Ë"ò@d5}ÙÏ™«-s"äS÷LÊúÖà>¸ÍâTRo–€Å>f‹Dj•^;Ûl +‘ÄÍÉLÛÇÇ#&¦æ¤HT:GTêÕ-Qþ̯Dù¦^ˆiÝú]i;Û¯íÕÛ·N‡ž÷ÿÐõŸkª2[𽽨˜s"ƒ$AD1 ‚Š‚bÝÿ¯ìµ®·×w÷óç„Ù³m†E¨QƒçØI³Œbýl‚¦{¹«#Öøˆ¢Ö„(–‘î]ºfÒ=ª¹’@ÏUUâ¦-ü©Õ},ÕCŒ[O”‰„{VK}o·zÇ^ëÕæ´ÐmZŠÞÑî;·}Ê·¶‘.AžÜîïG\»op íy×Ö3ç\[çêò/äÜݯÅÆÎ_ÌŠÉvw;+ +íIÊp,i<gÕ$}ô—]üÅljè–wQ6{b~`d§6TDh)«þ^_zýÊcöìúì†V’é\·I¹Ó+”:msH0W [Dô¯ë)5énXhf³6ÓÌœçÛÆ\ƒë!jöÎÿðÿ.6]<.§0º33Mm3ìù˜¸ß§ROd¯äXfx®à„)VÛhžÆªÝÈö«>ávÚO¢Úó#7jc#gÞJѬÛZ%蹑³iC›ÜÜÌâzƒ‹JhÝï°b]¼]—µ#ŠµQþžÕ|—¬ÕtgS=g“su<£êx| +ÿÅj|›øæ»9z%VãdÝšIG„Pù…ÿÓËì
•!ÌHè£ù½Öè^ ¿ÔJ7x©Q¤®åš‚Þ›µzZÇj‚5¬†þS¯Nt̬‚j›þ<+qÉWô³Ó.?ˆ<S6?º^Fõ}iU_¤%"ô~àâg(.‹Ÿn?Õ|\\oãË¿˜/ÖWß›µ:Çùÿ”æù6—™}ìrÄÝâˆwuÚÝÎñ\iej•|]êns•¸ÃæËÏßy°åE¦K–R…Jd¤ŽKÐê8/ ›]Ì àšÆ³PHŽpÞ÷;íüpêqù¡.,à ûá ”àQ¸àຨíàz'¹Áuèqÿ?°±›jÛIï¹Xþ§8œ¢1sh?Eb¾}ÓˆøŽ{™Ö›l)ÕàÒSž÷ߟÅ"˶ðÂÎkÑùýÎå¥.Ã'˜×`e7[䢶»Íµ7ÏàÎpùž™·©\ýœ;Pr䈄OˆÌO"ˆH{%ˆxwEˆøt|€÷^LbãløüÛÌ~v2(yM™Xd[,R)åÑöË,ƒþ¥!,ðJµMàɇŸŸÕßyéÀVáÓf׃ÇLˆç4~Md
I!3ó1Ë@«)ÊAdW;"{E0:Ò7DöÕ:D"MöŸèúú;C•-C$^¤!’¨mÿ…’sZ±÷¦±Á(ÄsŠý Ý#ÚË€éÕê°^é‹z¡È¼ãL~ÈIo¸1NŠ¹NáSÎö+›”D\ổ¶Òƒ +Ø +SèQÑ:íûo<…0¯–|Ò’|Öm6ùH5ùô‚eò©w€!xW5?I>u>u¼šÐ¼™dÛÃþkO‰W¾¿`Ÿ»çyô,Ðì~Tf‹Šò-Ž{vöúÀ¬âÕL§Å+ê«ÅK2ä—UÏ_V™.üGš©6¢4#õÂ4£÷Î`
ÐÁÊH|šé·[)ô”ˆZ¬¿ßño=…ÚÝu’«uýW¡…„`¬ˆß‡Óàý¨5%ø~ºèå{³k6nÑ}×»uЀ +—Õoñ6Ƚ*Dº!l;¹ä®Ìë\‡ÞÙ#RÓË{ªŠ¶<w˜Gwâ+b\ùIÎøé©ÛKË3·Éã}Û8¼Í³àlxŠ×«à
endstream
endobj
84 0 obj
<</Length 65536>>stream
+ñ^“ãfÉÚ\Ä®•ëø7—6KÑ΋c÷u[È÷𲨙»ðËyQÛái.€¦4 …;Èõ©÷à½Ä¯c|Œ øpºÀ*ä×Ae¿Ï¯±·cAêÄ’ÓÚtšö½!›WåF¯ßù£°Î@¶b
®¾r—îjUˆ]g9ìƒÅQ=Ç‹Ú5ýÌÕ~«2o>-ü6§9›Ý‘?CêÅxÁ¥ðËéK`,ÜÏñ4Ç\A´78|*}xÙƵMXŽ§ö*3ôÍ~¾§çèzwhTÎä™Ümód«åúSá‹ÖÖCš+¡ÿî-¥Ö•XÒ•›‡ÜNš·¬íÄÔ3ûÅìŽÛ²ºƒ-ßÞ7ýûͺ•,Ûz†êJÓAp³§ðœ;Oag|ÖvwÔvcùðËü·žæ6÷ØÓT|ýÔ
7”›¾u||ý +]±2H¡Î²¯zºÎ]¡Ý–½Ã÷yBŽE†Í"zÓdgï“ËÞñÇ–ë.³6×Ý•þ‡øÞ㈠¬-jî~p¾.܉_Òí!Ž×ùÔ—cáJ™s*A¦ì1So'§Åj®¶òV™WÊû±»…r¶¿¸IùÖ(–ªDV¬Úe¡Q©¶ø ÛÀ~`N'«{Ÿõ&ƒ×’]ðؘ÷¬1ëÁgÖìÍ`Þ'ÃÕÍv°”ö—Íq2m§‹õtüâu=wŒòGßlœº:VfâüÖ_‚cÌØDrk*îbr®qCµ£3º2¿4×#¾ì$gcC±5¸ŠrµûÆ…R†× ¤Àé¯S}dôc†ù´âCÕ%½=Ó:ßÚ¥Ôî£÷é<ié?0ÍZ¤C;…ñ–ÉrsûËæëf–‹h´Ù²“ùC"}Í=ûêReÕ¡¹Pujêj‰Ú{"ãÛ┟¬ ãs)qŸÅvX^ðûX¬éxÄ_š ;¹•ïö ò0”©Èþ¦Ë0Es=G¢¼qlR¥kÃ'åžþ"«O´MV_Ô„<˜e›*Ýû¿¬)±Ëü—‚à€+ÿ!3«[®Ödç6$8ºU)–ÕEWg‰¥&añRÏ.³îèÍÎ(y[¶GRQ˜bPmuÝõø.ú8¤^Y¼¾}
¨Ò<Ërr‰æ‹r‹òiøÉ#¦‰Ä™ÚDÓŒü‚R{—¸ö©ñqÙÍUnCŒ“Úú_„£¾¼÷õm9}ª7_»›•±éÜÄ\ŽZC½Rѱ9žÖÀ5™F+
iw¬ Ci‚b£hüõZ_r¦òÞ²KñzÐõmÄ°%ýA9áCíq±H=¦A„Mů]ŽÃ»Š¡a³(vÐW½¡‹{RC§÷}ÕlÃ`ˆ|Û|Yc³#ô?³ûÅݤÀ²-4?·†Oc¶è¡—É,‹¿Dm=ÈQÖ¬T†Ù, ÑzÒ:Õû€{\^ +»RBc°÷ÃÕ×8ÆÄÒäDÉ9öJžp6%"š„ñëW±G·ÓC” „¦Mõíd#Y´}éo“¸Üß^^2’-ÎV +tÆðaì¶X*Š`Ðb{+P,7¨úóD’"/ kŸâw·ga¯uÕEßNéˆÒ…êa3ù¤¿c›ùÞž¬5z›#»õ!wÔÏiÑiÙô¹}UJÅö•«ÛÓËtÑžúÖúnOÙª}Imë·ã„öŽˆÍ²}/M0t0¦£ZF/¼,'I™'Æ›‹W‹ñÊq‘00'Å’À/bd#m£ŸI£LW“ÇÜH>ùÞí‹d´ëìÇ©WËgÝf9u´AÒŽwÒzæb«%ófJÇæJkÀÍÕ°+4‰»µh¿n[Ûúöº²Ü®NƒüÆL›9ÈÇü‰:UgwE’wc Ĥ…±ÙǺE5…9﮽û•Ü-íÕÛp¡{ŽùN·ÕŸ‘kî)u¦»¦Þ¾—°U{v{Wm¶põðjZ×4ßÌô;íÆ`¡
~àºû~LëüFòëÅQ/S/²Wó#^’îª6ìXÿf-DwÑ—V–áÎnæäÊÓÑöVŠV ÙͧŽPg³ÑÀÞÅr¾/A÷wNo•¿7émæÕpí\ƒ&F^°ºGUøº˜¨õR`/k幫ÉÍNT«¦óOuLÝjÕf–!+wP+"í–ã¸ø.ÇG„-ˆk–{;×*÷–8_¾ëe‡Oþ™</
e(Ê°Ùó[].{8‘[Õú’6Ëuzk7i2]øV““¸|Û÷¥ç£÷.-X¹S»ønUA/©h½C£HmêÛbFžE…mí
¯i» +'!´ß¯aÍZ‹[pÝð´re–÷AW¯?p!¯mBXˆç\Øçs`UÍêy#c–å6ôi(„‡sÈÑ& ð ü2xÞU¿º,„ÇãD@Ä
"2íDT ÝCDvþ¿¨ó"2“Ë3aÂã7¤O¹Ñ +Xã׎§[æcDäúWˆìä ÿ?šÿ_éVk +Øâ÷½ŒuðÂqØOµË.&ˆ‘ô_Y¼<ùxrEæùäZâë™sÿ¥P”“?’O¢öLÄ]ò‰ÄÚw“÷
±ÎšÁ·‹ˆä
ûp’F…V’®"I5g˜¤Ó’6€Ýð¾$©T€™Õ$•á`@&äy*¾ìÖÙxrÏ‚÷(¯Ëѽæ4_?ðí<®½n*V~Ýš)ô’BèÜO!ÖØ5ÙÑv6ÉÇ“AðÚæ°7ßA¹˜¼²¼Ñ•¼‰”¼›ô°¶¿ï¥p?$Ôð%™jåñŒ+énö²O~ŠŸÅ®PM¥ó¨ {ê>²àÑÅ6×Ùmp¸¼´á»Ñ=zƒ[´.!ñ õëßìÖñR(ظ`Íئ"Û)dFA +*™äãk•ä3<ô’O¤êÙBVzîŽÉäYÊgçj9»¹+£’wÃjp›LÐk|‰gÜëïëýùýôÓÅêåõŽú‚©rQ¶¥/Î^vë$w ¦'Iûtl¯JÁ!&>Ç‘f*‘—fº'àmÓõ +ûQKbf( +ŸXÅR2=1¯}™üñh5"ç’ï=CšS&^Ù3¾õd—ÙX«7jñíRcq¦˜š9ë4{Fºì€±˜>È5ͧRc"'gKmÎθ3”¾L…#ŒoÝäÕºžJ§”“²iµ:äºí¾è™ì@8¬”± wö+þdÖÏü˜}Wø1÷äù±ªéüx1×øÓÓùØw¡þqŸF‘0wµ·‹¨êžoâÐ~Ñö`
ÏtTy·•ŒwîÜÒáÞ™Ô†SWœÔu<
fÊL@Ö#<—qd2½î%æ¾ÙøÐmlïÂv€ÄòhSäðÔæÏ¥É7GU™Óvôœ½µ÷GÖ¸)0kÜÕ;ËÖ&ìÆ +CKÌàƒE´1ñÙŠ•Ú¡r{«“ÛV„Yç%*g%}0ô +‚$2´&(«ª ®°ù
w}e=ö~AË¢Õ(Íèͬ‡Ï½Cök4%TD•Ü+›”šÒ“”Z„ÜOp™*†Ó1U|-J¨[£?"±V°÷|¢;W{®lèÇs¸’„ýçÆt׌F6Ôh5M”¹Ð†äϳQ’œ5ÚŠJ‰µLCšù†Êw ¼Éõž‹E¯g@<Ðÿ67Ú©Ì_t^qóTIô›¤dßâ”ï(DC4¾ŸF*í>9µ{DC.J +êª÷á§G¹ÂÍÂUŸ]Ä3°žŽÄØ×¹J»§ñŒò/¢EU*ÜŽ¬ç1°÷‰V¹ãÓùÁf_AŸ›Šâ¹›ˆXBŽP¥ˆ6BeÖbѱº/ Iuø8dj×¹w’é&Çêò|÷G&~¾rz1ú¶˜ÚËÚuIèß¼.œBöõ<½ï÷dkÍêI:ÇSÒ˜‘Á…Ó‰0è/ðkÔ´ñ^¹¹ÇP¸¡K¡ÿFÖRD2î´ßg‹g¾·cj³žP;~à^qwhôøDç +o_‘kŠþ˜?ÜÂàaKŸL/2b™ˆbíHœÇ¾C^–QËTŽÙï3‡î£µ÷çú.Îú•hÈlKXû¶-0®ïåÝÖå”wÛÍGž‹‡Ù|aã×`C +ÓGe[_ºs,„—>úáÓƒðný áÔ« áÒQ‚pYÛBøŒM!Ü$PŸwgîØîãå=˜Oïã—ú/crI§«ÙV±É¤Ówõ¯o¥%¾õäŽÀÕ]ù‰O³„Yø;…Åþ¿`ÏÂùˆa1Í@¸{,Bø«ßxEAš•0¯6D8ÓDœ‘ +D¼rˆ„ãDæ×7ˆl +Õou´Ud .ÿä]~ÄY÷2O7ð…mŽ4Úv¡ZÆ®¹j»œI‹›l5΋M”k +„]F Ešö¼ñô}îö_ùþ'ËÚ"6ÏìJÍ$4nBdçñ}T* +Ø—ñE°øô +7Y•´ðøOeöõ‘½ôµ©’ÿ‹äS†ìäý¹X dk‘¼s¸‘¤<¬'É>³ +÷§S—Ò‡×æ2’¡•ïÒÓëÞ«KZº)Ÿõ<Ž˜Ð‰µÜk·ÝÐÛçûþ«ÿ/’W¶’Ïò9±Úzò>ðßýòÞ,æÉ›9n“7Iºë?’tiå“”¸4’´ÓÁ†¬ŽÎ8êãÅL¢ÕÓ‰ãí³P;íå–w¸Ëºw¾‡øÖÄ¢$îP—ìÕpÊõ˳0£×6L´Èʲۚ+~8(Ð^˜ó{»0w!¼³;mïþH¡|m (€@Ëž|&î4ùhÐ*ù}/y߸0y´gòFn…$SºÔŸ®ëwÁ~J6~]övöÝáU9ªñT9×[tY^‘Î;<ï9ÿ‚£…Sdjq”úi8¨¥³ëåÈ €› +x
¹8è¹¾µ¿ó¹ÕÞ,€d¹Ü–þkz\üÀþkèÎI!…\:`
I§)Ä6ÁJ®Aðc´·½X¾?öÏZzƒ0÷ÊËâåµ›Ô£÷aÒ2ç ²-spÞéëái?7• °&Ú42ºyœ(ëõáív‡ù +÷涞ìQv]ó>TÛ9ÁÔõ:¸é–ìúÌ9à™#ç^†#=¯ú)t[€¾hNÓLE[¥™ÌÊþovO1„v7ͽ+Ö¾#¦h^Îb“}c¶O9è×ËÕý|Ùï€ÃˆÄ}’aoãr‚—+Š£³Ÿë»BÏ[¹â<rÃ;9òÞÈnÇç*öÛ5+mfYÝX?9zºÆüêä+fÕ?Òe,Œžf,ÃL3¾³|½Îâ9<BËx¦í´ˆyœÔÓ(/š‡Û®¿Ýãý~àÙëòõÞ¹N9q}¿’uŽA±èÔ•úVÕZÝm«Cáöt6`6·×p¸™--mýüø‹5>‚<ë]ï¥åê+xÀ1K~çLû’6^ãñxQ18eQ‘ÉÑ/?ðïâŸðVóW‰eÌkÂî„È©}¨P42ä>qìn†”¿¦)y·³¦xÍv2ël}R7¦Q¬—‹ÊÛz¿°E÷ª%+ó Z+£Av±ÜY½,e&âb¿Ýk‹jþeÍ•a÷8oTÈlcCt¦[gÉxTΊa®l ÊBú2ü#ͤ‡ešÅ>ë뵔Я| ¥}ì0ß©xŸÐï†Çf×9ÆŽ7Š²ÁZŠi}’½r¦¨·ôLô¼,E½ëBîÉü4c²óFHMÍ5f±!÷f½ó˜4ª6z}èúªß°u2·¿O7¤ýO³·§qHQÒ +0<ü"þ‹ßïšü4.9ï¥]nÅì©¥x<w¯ïÊJ»¸½äÕÍ"ë!–Ýõ¸UÁóÆ‹ãÈ1çjé;7§9ÙÝøñÑxÒ\d`ŽøÐW)÷Ö!jO™í´>Í¡v_ãVgfâg ѤÌöçê1ïjm:¯ŒÇ9n:’øEP.Í)—±ð?|ï&¸¨/Š–~`]Þ¯•µÛ»TÏ™ RÕ¾×æÙuúèVî½Ü\å21Wæ8»÷sªñj¦`§Ç•ži€\¶÷?rÉ¿³ï“JÉÿ¨#fŸÿÇg÷Þ·J0¦L™:7º¹¼6šñ7W~ÆvV^Ì8DÆ/ã£÷…ý2øãqò˜Å5“é¿eo?/æ('¢á®=‡zÕõzMf~à• +×;þû#”,Þô¹íArºø]o‡ur©DÏ4±¦³*ž_yö0Z6’à–¶ˆwòŸÓG”êPYPŠi‹ŸTS”ÓŠ5+gaðb}™y‹¶ÆP¶½ ·°ïÐ0q>Q¼
½Èá²X ŽŸA—mŽQp+<̳¢Îõ: +…ºíÍŒäж×wófÜ/ˆûO$Ì¥žôZÝcƒ@º5¥;çŽ9ì4g[½ÂUëFÂ~«?CnÍùkYh¤diXÐlÔ ·Ü¾Aιr*8Hý“®úõÏÅ +CªµÊŠ«œ‚‡ +rÍÞª]ôcYÓ‹ŸRü˜4à’±¨ð¥>~³KýN®XêCc¤ø˜qhñ1"‘?–í^SŸ10¥LkÜRã%‡Y[JJ•>Àãþ˜ŠO¤œ;šG»Mr/.kÃŽÿÀåKÜÒKˆZY_-Ü).®ÓS×ý{áÝÏd +ëU-Pî¢_Èð·A!3‘§ùm;vòƒ›pÏÃf¶ +ïÐõ +˲.§¨yö¾Õs‡Õz™“;;;W½½Ù“ÙŠ³ctøù³Í|PÉD~¥X™Nåi@ñIô!C;¡~kÓú%V†úa +-ö$Qwl.ÆqRo4O÷+ƒ€¡7{Ý*Óf)±¹Ëî6>¨
„÷àOtá
„
[Ûÿ”n1è?{!¼Xx@8Î| \õKßzò®Ó…ð—3€”Õ!‚Ëø1vß±u bÇŒ!Âkì1¾Þ…ˆ=¯fÆ/ñ>X{9£ÈëVï£\qÕì!ŸoîHRéªèå.lWZ +Irx¦4¼V Lþøm1úòú§nw@x9ê·Y_¿è£?·x²çñæáµÆîC¸ÎAºÞ¥Çá~¯Î“ÏMy×JqD‘¸í|Fטg—×Þ~â^’àüÀ—y•Øþ_$ŸÒTKÞ1¥€¶ÍˆIúزIê„ d>ö굸L ÷þ©ƒW²É*Ç×^ôžê<¼f¹ºEò^5+ ƒ½)I}Gd]‰5™^ã>¿öv¸uy£Ý=LƒhUsïág’C:žag§žóËÂô$¼ŸÓà@»“@®ÚÿÐóµ_þ[¡%FÊwï`´mF +,Ë…¹Bot憽ÉITÚ³@ÖÚÖ|Ïz»Ã6ãCGCkû´£ü ++^º»<kryT{/ÿ‹äA´;UÑVÉG‚ŸµUpÄ3l[Ï"ú^ßλ Ø/q·&/©w‰¨fãæîùÏÉ_>sÁˆ9g÷R?¶Š·Îa*=Ñý홣÷^àý绯ø8ÍžušÛ^ûD»Áz^r‹ãæTÖUa«T>¼*î¶'
û/R¹¨)«Â©Ûßà]5¡£É]YÑòÕ¤5)¢î5õ\4γc(ͬC7¹{4£>ј^=$Q»½ÎüÀ»<¼-¸»ð^wKíWÇ‘fÌ©v«ì²•¦†Ý6nî& 5ˆ5mY+¤O¯>»Î`Å” ú?d÷7êš]F)4:ʉ=úÎ º]¶qÅÎXëŠáî…ŽÓ¡øꌊIüÿè:Ó5UeM_A]*ÎÊ 3È ¨ (‚à¬8£¨÷ßhuÖî}ºÿ¼‰U<$IfÄ÷„‘+—3•eö11æŠÐuBU3ƒ``ê«Ù)ëfVpõÕúéÝ+ûœçì’òô gá)7E©)ДSC»÷Næùƒ3i:û±ƒ%§WhSvÔis¶ö©ïftêéxf25ý™©4†WìæIÇ`ìRQ%™CÛ3²Èo‡1ž]MÁeaQ˜;HXϺ\ú\ÃU|RòuQ|{Úìùž;;„D7»IÛÚŸÆ«û1w& +ß]ÅNÁÈ´¯«p„ӹȲÜÕ|ÜÊO“¥°¼ñJzÁsSzÌNí¡ÔWÆúâT½ê¥æ¦¦uÃ,©U¥˜ø +#tòÐgxö)—¸M³z˜”æ`ÅÙ›uܶ0>]z1År¤zßt•¢a¼·ÇêuÊ•ù0¿AvºRK£RÔ{i*2)öæ@w°™zÇqOëYxÝ»lB¨˜?~Ñø/Ä}¥Ÿüã®»4»lÏ+H¨%xiFjüÛãú趴Ùq\kub{xÓA뮘PñMë:aÌP“ΉÔA\!²ª—ÍîPSã¾=ˆ`ÙÀFÞÞÌ]ï +M®=b¸TçšTT:tºn2QºÜªéwfÕÚ»#Ä+8Å ý +¬$wdÛ‘+eã!W0¦ÞÞÞDøè¿p‰_=}¯ùùö +|¯èµ×ˆ÷Ö6Åž|<¾œÃy~‘3=03¾¶ÏÔU¯„Ìà`¨•þ¹¯ ½Û°EªÍu_:,v›—F§ÔàAÔ–Ò>sž¼® +K¹2žÚ;ø”i×Ír½¥ÅJúV¶ç=”Î2xM±.Kg%IçaúÕþá<6õ
‡Ò¢;ï³x9A¦¡çÇû™ó´ñ½q0y´4ŸÇ…Öïýó5õYâ<O{l²¹×ºÞ<BºÙâ•êä³sV‘[+I^O繚Yií¾ÙÃò´ÐLa/™ýoK£$ÚÊ“)ÌØ> +;_’Üú þAí‹:š6§Ü³¨_·–0‡Îé»[vWU§äœH÷m=½ãPÞï]
ê+³>>£ÓeLæÎÝ·5xwB¦WèäÍ^M)9†\5¢Ý¿1lëH5¥:lª? d^Û†˜W¤&³µ ÏX`GXž÷ÆóK¸Ëg;Õ]Š$ÇgM©Æóç~Šµ\ù‡Ã8VAóaGHoFJȤG«%{$ÒXÌœaÍ£¶ŸZ“> +Sµ_çgšÜàEÄdšsÓ›…½ÝI{¬/LvkÜ>O‚;FƒÅ'}2‚*mðŒ@c¹ò4¸ªOÚ—éßH¿üAéƒâ›Éó¢Ìáñ–÷35ÙYhö¡jQ;«Cúå£'çNŽ¼Ëús=I£‹ç‰ãûz-¼äÌEhnê/>¨áyÔØZ³½¦n]eI®2à›lï$ËÌ¡Òפ?qiãxÞP7yP¤—É
räø9i$>~]äøÒ*‘tðÅ/ÖÙ+×õ”÷ÀÙ™ëó|cäB\ÍPŠÍÜÀª½.¹}š´Î3³'>6ìPð4ÜáOžóùìäД»{ÚcëSœåºf©Ìîöyˆ…àÎèÄÑçÞ¦nG¨GQ
Þ&'#{I¼·á
Ù"‘v†…Žu#2wºLd¢FñƒÁ׸âKe©Ê©w1Ž5Þ]´c1%Ü¢®GÙz®O·oW¥z¾{’C:Òq¿©dŽ&·iå}®zb·ì +ø¬Q››G4’³9Þt1äÔCÈIúìø‰œ¨(œ ¨€Âý{ +é”ÿ"°‹Ïö4
+J±n¸"¦§tri¤Óß +| +KþB»Þ¤ß\êv,6 A™òidÁÜ#º@t¶…%“Û¡.w‹ò…¼º…w„Àå-f#Ž +:èrz)R¶ +9^l×2${S²0)ïËeÔén_µ-jžJ÷µÎ§.u˜ë›FðGOþšôÕ“ÿeÛ~¥ÛÏXùéö[#B½¬}t[¢ +°Wû[ Á3þV´ýÖßc+#ðë¿»õk)vÄÉ3|ô“g+è$‰Q哤YR°ÊGQlzF’ðõ0Åôœ$B1“€R\é$‰öÿ_ ý_åäÊßDÛº˜¸Å•°›Æú“;ªZ·ÿj³šrÿK¶9054\+IòÄ›IÂ]è¿Öê©
Í×45³—^™ÿ-áPN±ÂSã +ü7Û¶ÕMáS\Æ©eÕ qóø*a—üþ7Õ/›÷G¶g¿ïa}_¼çõ7ËW–K£Ç趡ÄåW’½î9qÿïèé+°û¿Mò"2Ýä/ZÉsÐM{”ó)6µ‘ïüM\fV)V·¿:øNØùŒ|øÅ-ÿÈv£ö]ÚŸÔx _õX>£¸d–Ý[7.j©UÆòڻ˱)\.h0xü¶rÆWªxr*ûá1d§)JþÑ…ÞÞ‘=^¦_ÞÃûůLûª.Ä´Se6yòd’c*µ’¾OÿŸnÙNó/!æ}Û4øÂ:’kWh"¡ý-“ç‹ ³g+gJ§¸m*'§èõI70Žì~á|xçG!vXEy§xÙmšRaW
ÔG-Û[h…¨›aùÕÙ Û³ò_H^›¢œ¼º‹fÚ©ž<÷2“<>ŸšÜm%I§«>Þ’9Šåä^!çœ/ÍýæKÇÓ1Qöñxx÷6¯ˆr‘tY÷KbUÝm˜¼Ýó£Æ +ÇÔfX˜6×—ÎJ^ã»Ó`åÀ…ñÒÅ„Í’Ëà§[È";PóÐÒóVsðßøÔ‚Fëäµö¨ÔÚîg»<“N;8R“íG®Ê·’Ž´x6–ïMg…Z{´Û„ˆ»tŠÁfhWÖkË÷«;P<¯h±r_º‹ÊkÉé|~á_>ùü‹ÑEæ±I…ËW †åîk¨÷Î,¨¸×~Ï!ß°î¤w½Ïqo4cÞh>Ã=²=¾HÞzÚ¿‘÷ÅCðD¼î…è½H.‰‹Ñ™Â?àqJ<4 –‰ÍÉ-qk²ž——ÏKv°ÌäJ£XÌ»óv·„«}uVh< +zSê2;TäçLÛY9ÿùnPÏÞ¬G|w:Éc×ÃÚ·IÐÿìÁ=Ÿd,s;h\‚ú!y?:íä½`¤LÆøé ß«ÇlRÌF‹ˆ|Dmc}ÛœëÕÇŠ‰€üBªp¸Nçõ ßR§
½*¾9+è? g/ +Õ,‚¨ÖÌøžþÃçÝ0VŸ“æéU³ð¨2ìT6£}å¹zŽ Ãò½¶v‹¼QŽ‚ý0÷ð/‹LÞ£ñW} +3„›Ã+ü¤å òXYa}g[!
G݉ŽA߆‡½ÅèÔ˜îGY”Ždk¾2±Ä*æ¸Ü#Œçè$SÊò‡³úænnUŸÛÊަ”²^H¸ÒÅ/íR[¹Ü$™?”p_'|PXæE/™Wb? +¢k4Ÿ5|fñNŸvtsOì9^íø¢Ó²Í$bd,$κ•dÉ"ÕnÇG}Íx!ºe4½‰kdøÃb(†½¾(c½½–rÚºj×µÊàÆvÌÈÔ7ʹ¯×NùÔ·D¢S¡wÖVù_˜Èü"îÍ+ò‰å›[«7B–-ƒÏ‡°@=üxÇE«23W¼Müq—öab^FxÍ|[âwÖ…¾âC©ã3? ¾Øù‚^‚BYë—=Ú¸ƒþèíöIiÞG9<ê] + +1y…Xl‚Bèé€BÂ
…ÊÀõ‹ðÛ#¼ÍNeÐ#ýnXï¤
UOÌ÷ïuäÞmM³»ÖåÔtøйtXè2¢)êv£I69ó„ß©¨„P-<´
oQó%žO®¶œnX9SûÔêÜb±QËk0:P¦4rÜ^edØçlør×0U(¾m(Ž_6GÓŠçÑŠÇ«Ë?|“è'û’™öÊô›kÒN’ïMu$I×—í,ÞKLEt›åSÜ£GĬI‰‡cPf[Ýn5zèaШ]AfÍ +“õ õY«þ¼æÌút4\ÕGòøk3×kb3°j"ÞÞ×ĬqùÅýÂËgŠÜxhMØQ3ó&‡ÛCŒžH±»À_Iû¬o"!Ú>‹Üb|ÍO-¬ÛHÄò$l·³©SE\†&]IƒXÜ×_ñ!¨{cp[çòRϦ¾U-XïJ5I`ÕE$ +UY‹†•õ…˜WºÖæ^Þ=¸zy—èFy·BvåѾþA§yùât«I†·ïs»i¶—RGÎw¸çÍ^E¥¿Z$’›FMÀf´CgM|iF +:×,ÄÑ´V€†TUZÍj¹±Q*›ë[¯¨5©Ô¤nXŽòÁ¾<XÞn?`î ÙÒp'×JþŽ)^a²W$¦+¿pç…kÁ‰ï•=Ž{Z^o +Ž‹ÜÒõ¦’þC16¸Jë[žz¸ÛúÔÀÉ^Ñ®‚.Š8‘B'¢t†¹Ê™€Ëo»¡µ¶*ô||ˆí‰²¶-#Er}" +à +“Ü.0QkiŽ÷˜8Ì{,å›oó‘Ïø—ˆ,JàZÁes’[p§CNÎôR?9Wi!Wóó\û¹çÒèë‘›?Ò£¾µDŒõ³ÚÔ.ºJ©áN„äÆÅÜý}çåQÍø<ÇúhNLú=µ&k¦XÖKºè¹F^¨Fxz•åjÎd7ÁeUiÞÎÖò÷Af¿‚Ì £„ÀqçFÀ°Ÿ$@Ê)bh ¶4Pf4JÏ7Ð(oI ‘I< ‘µÏ +'0/{øÓ¦ÿNñ®˜oòéhBÌ÷€Ùã€9-ÀƲ`z3I±+§¸Õ¾0jp¿ÝZ*Ûé-Û
鵧ÊÍþ¥ÐU¾áµÎc?µÐKßÊOšrã½B3ȶ@¹äY)° +Q-·3{ª_«û}²)NK'\yÈ8‹¸ÁèÿÖ“¿ºíÿdÛÒOcõG¼mE»?âmTþÔ»U +ÍêÛËQ7¿Å¾Gÿó1y†¦<i<½(gÁ)œÔnO¦âŸDÛÀü[Âá«‚ƒŸýÅØ9V~ðk¾‡U†¸ç"Ë'QŒK†Ö¹uoZÿº§´áµŸŒíË‘›N/C`;?_ÄÓöŒ/ËÉ)“™cÒÛâGöHt~c8:ðWk|ÈŽTç‹ðßñÉ36›ÉÓ¡ÒgîZµÔFµöG^næ?Ò}¿ÿðó¦sËÁ<^ÖwÑmƒn×þ}ñ¼™}î|á7¥3îë'§°GIgOü€Gv·g>tÙá±I׸·_’oc×}_œí ÷7G™?oÐÍ»º¶Ro`ë]éÊ‹+ê‚ÿ¼ª:“vjNžùa1IŽ~ýûô‡Ð·[ïÒ¦•Ž}<']ôg¡¶2°}¢–5ÿðî凬l÷KütØuŸÓÓvÝ6Gi”lÐå$³¶Ê“ü*îy•uोîÈÅÛºñþQüÔ† +Ù¶.…û1TÀ–¨¥)T7ô_ø•iŸq)54HêI½×R“H:œï•³ùÖsǤݯ²ßË7œÛößoéÜ ó¸»Š»›Á2„Æ’=-…m¼EÖÞ„s)Ù¯Ã%wŒÂÒìr ÔôÞg{%—AÛZÙÖ¹†wÑ]Ñï¨3·¯Ó”¦øŒû„ô‚ë&ý‚˹Rºî›/’—g“Ég÷öL\Î…Æët?ˆç“ã½N‡ìŽ:îª÷ým}Ù;ïÅ…¿Ôày«×!BeÒãÕïH³¨ftg°6ÒüáylyW~6ù="œÏ¦÷Ás3¥Ï¹£;ÅkwÅÜD,µIîœãÆmÞ5U$œ +sÌÚ=ÏÏØõ®›ªCà’wñÌÞe%A/øþ^>„ìêµëŸ +!›³ ›Æ«,Ÿît1ŸOFÇ`õ3ÍÔAkéU4ìÆ”±MÊ&vÓÍ(A{"nêxQ_ë㢾9kôå9•Y}e÷Aò`×F2ÒÑ]Á:*éc™âV5íápm$éÔg°½ø9|×÷ÉÐ;„xH{“¾'aã0—z¥ÍuŸy¬€ñq·(ä·^¸¾¿FA/îŽ|<#ÓÉ°»w³ |/.júî;›Ü°èTÛN݆Lé±KPgÃ[Vá"›q'î™Nµd‰CM
ö)/‡ïip +•×[TUoÑ7A[®·3Lp×:¦ƒß¿èï_…4Fþ6ñ橳§é¼ÕØžµC~Œì{؇[Û™qèùÞ¸@iSöj“VͲÍÚŸÛ0íîGÎ&6ïPø6i÷T0¦Àµj +Ç©ÏN/ŒÊéHÖV$jåIËôJÎtPÛ\6}^ºöᇕï¥Î ÙÃ*Gõ¨{Of·îØ]ÿ×ÓNâÅ8‡®Þƒ.8¯^Ø»ÛðnêÝëþ8i?bÍÙŽkÝÑÉ>iY>éä4ζ@¤ÏåX[½/"ÔÁAo^/õ õ“Ázg¼Ãô0GÕÑs¬ªäôdu'Ù¬óûŽ/_晆ÓX, M‘rçµ°«¼Ð+—βŒfN_œ'<»½ôzÐby«æfWú{€’ÛOã5³B¨[¶¤‰†WG:CЯµµ†¹ƒ>O.úú@L}þÞùÔ»õpL{ª¶mf»Ä.vYήv¼™×èðâŽV‚ÅMTòz_^\{¹DÎWíuR¾µ«Ê¨ÔÚW„V«³ar‚ÓÒ‘¶ +×:Þ轺D&Úã„5ZO}"$ÚçE$ +.Z»cË?ˆê‹/Ú5Ü•y©9f†(¥>/¹aU?úö¹»ïæë5¯…ƒ|—Oš¼jy^ÊÄ«¶¬MíBpѧ:8(tulQÆX;:XQ7Î¥rlT,1A{w=ÖÇgôD´7"ÀgulÀf½¶„±Ãò ݆Kºuì1tkÞ0æeÒÅþ´<i|ëhÛ”DTLé>Êë÷¸ª)½6“¨ƒ>hÊ»r“¾véŠLð‚“Çdž.7Ö{it>Ó¨ÂG í{Ù +ñ¨‰³’‹èûÉA‡¾ Å;Œ›xŠq‚(çÖ¬O^ŒVg½(¬½å^óë +UójTóŽÞüü6µw>X|áuëƒqy¡>ÜœÛùuí=ÕÜ@:Ê°•D€µ‡l”¯‰Ý¹ax!‘ãò^€/×{¶ì”ÀAq2lCÎr¯ý€¼íú³ùu®Oê +# Š
dõÑ-Ñe 6PXÛ(œ8Á¡)ŽRŠ·òûÜbMjîNá»G¦yÌ ÎèÙEå0;¿E/@%«™cä´ÿèÉ/KÈö±÷Ñ“ó€«ú÷[Ìá«àî2!@gš[€Æ¦g€6ë +ÅBa +i“Â>þ-PÊü&Úº… +[ÿ›ºªE‰›’‡_8çîaå\Ž—Ю—†gìÖ½ž©ëž¼5¯ý$Óº¹Lç‚Î2ýóE¬›g|ŒÀS,‹Á1QÛ›#¯ÍYkÆGùñ}°_²9s_ò¢áNÍŽµÿ@5ÔɓΦ&)t!5®–K!”ÿölÌ<|0iߥmVÿcùPÜ6(¿¼öïÔþ‚zÐùŒ‡Õû‰Zå_G·RÈÞýrñÀËÕ(l”á(?*c»
s'wUïÉm¡ð.m†ÅBomUkÖ*¨óu®¾Ó˜ÁA–l§3ÿ§Cæÿ…äÙ?¦èsÀ_k•j\´×þ ]P·MŸb±Ó:º¥vïÀGMc¿Ä+ö®êž'[hv˜mÐÅ"õÇÖVi±^Åê:ZQÑú¼t‘u¼x›»×‚/à<¤“Ê<ïåÑ°V™@-ÈÙ¾s›Î ½qó‡ð9ï‘LÙGO·ÒÞÅØ¿ø•i“D-|ž~jí]Z÷XÞ=ogÜ{œïŽGù¡l÷l°Aç¹ú*îøÒ…®é6NÂ<$·íy~©¡üŽ´`#DfPŸÆ³AñäùÇîuî£ûçÖ³ÂùœÆ&œL©4ºs]zŒLÞ N„ìÒ›dçøq¶åû¸Udãq~Þþ!ye!ä1ãÔÒ5 +¹×é¾`N‡YZDys7ÇætºrÊÍpñÖ?yãséŽ\Ã’WÍö|Î?vòéýïJ‡³©ÓÈ’n2ʲ.ûÈ‹“÷R&üŒCµÆù¹<u”¢¹´7æúh×rÅ÷hyÈ–GºujÀ«±œ~@ó:RO戎ÿd ºõK¹âñ
FÏÝîÖݯm¦<]¾ l¸ˆ‰.íd0Ûo¶ßãpzó‘;Eó·ÉŒÈ¿ÆóvÖµ²Ó©ÖÒ¸ÒÞ:fמ5Š¦-~„T†Šeô…AGÇ
ßñÈP‘1&Ï᫯›Æ£¯ÕÑ\³¶ §;ý4¶ÿp/•È™.¬J»¨ˆ=~À7ßoçÊp:
ú/[óÏáè]pÛ†Wub÷‘³. +Ù;m¢z½»½î£¸´ºLwïv¦ûKØÉÐï"Nß‘òÕ«Ü¡¤½.Ùvç4¨´v˜µz·· ZlñIz!ð$äŒÅ³y+‰xîôÙJõSƒÿÄDEÕü^¶°jö+*O…÷s?®ínÁˆ/MC(‹’¶ŽKià±(×T2\Á]æô©§ÔÉÏ–"Áð@^„%oœÛîJJØÚ-Õu*«{é°u.Z÷ñüxæEœ+×…PÁžm:|A?9N6<;å³Í7/¶š~à¦hÌš~®æÿ€ßæ‹ùÀªó-xÉøãÎ1v‹Ä5²ÏùCh>_Ë‘¾ª“þq™`ÝŸ—:ÙŠX“‰ˆµ7@‡kíë†Ü‚ôq_Òß+K¼Û‰håî·Ÿ©o)8¥rÄ'qã]Byóì}^iúÌo +%¡Å…ªop:´äòË]º7]®æ»œž<Vi®¦¿G¬“õ«j©¯ê5í0þ•íFþ€F€û¶ÖÓI¹GÌ6X'ûÁöF>[âICæAŠ—ME⨢4‚øäÜ´x'<5‚¦Ð¯›¹ÂöÈ…«çk™Í»Œ
„Uœ;Ïl‹\úôu½ ˜šÕЩ³tD5G)FÓ?€4÷‹•*&8™©”÷ïߪÖd»X¡ëôÓé>!.+7”N9µ\œ}7‘y÷iÒ<ÐôĦJ3'5®u|X\Á(ºì +#çl'£í™4¾2½ü9ÃÔVHÖ0ƒ¡áèS'gàSF»z¥°DRX9c¤hN?p) '?à·Y¶AeFÎWV¬»}ágGóÝ[,õ
ìŒû¸€u;êí:…Dâ…gø)•€ÍY'_kæv(ε!–cWC^bËW¹ËôHyÀôĵÃÔÁ[:ÆèèX_ÓHƒ<R§«ñ¢ŒÙ£BÞòIŽ–³.IÄ”x`Ç31Ž1¾/tbü(ºLˆñ!3þbQ©ôË>‹¨ÙI÷:|ØDvv2³`¥íW®ûöBì+²j‘ÒYütw~6ÁF˜åŠdXb+ìfzþ‘dêb–§µCU¦êSg´kQÆÛK;Æ?,È›F$y`ÄCŸ ærÃð×HlãžxO½>œÏxæ4„ñÌZî§8LðŒ·vðæë<þ"<@TÉãM!;ˆƒdD¦g£u8l5Ø=Õ7ru¬¢í¿ŠMð8¹³•õbê"Gë„ZKŸËyla”É,Yòæí%ÒV³*IÕ !ñˆø11§Q?Ëìv¸ç½n8/° DŠIzEÂòèØjÈ3x׃Z¥!‡¨ÚÛùƒn7û‰óg/O[Y.÷«~OéùuØaw»VIÌŒõÖñ,P‚Û«W¹Ò0HhÝÏ&”>2Fà2I™4BLb$XgÈãïÖRÁýB¬áüºdãY“Ÿý€˜w×XÞ Î%“¥µ£›îY@«c {í´Bì*{Ù²ƒì;¼ý3{[*»Ê€íëdø6g§U¬ïÐÇ¡OÚaÐi›Ì0“¯¦Êò³: ±µÆîMÆá&&¸ŠõÄýþ4‡Ô½†…Ó†µš
+d©±Ü9½†Òߘ2”¸èæ‰/ÑZS>"QfñBàV¾Ÿ +:7ÌŒ]ñQºVBÖ½…¬Ç°
]¡ª
]óùÑ/.·ås`¶2ù?l½çº¢L´µ}ë JÉAEÁ„ (&Ì9ÇóÿÕ½ûÙûýþÜm[J˜5®Qc’é<¸Nª=«®ÍVa³wâB=ªØDÞ+>Œ°/·dV=ŽÏ4PçW¡tîüB/×И[ÇGîw2»sÁ6y¦Â2—B“9Žƒ€i·F@°-Ý©hwZæ·8Õër*•SfuòõÊEä`˜y“ƒ‘d’Û!ÎÜ'_«C‡|Vþ z²?pÍK¨ÿ^õÒî*µ{5ÄÞìà@•Ñ̪o«Ý_pö“”®eÄâq{ç(ç~aÙæåÉ´Ooˆ‰o‹YúZ(st7ÝQiyº(RVºFõ9Þ#ß~aðÕ`¥pIp<››X„0±ƒDÀkÓÎZÔi˜E½{=îòYu½lù݈qªxÙëúaÕ8,ÕÎ4Ój(‹w]ÍíÏÕùz´øãnlãyeΕŠ²ôqœ_ ·7ãÝ/gJªWrøª½Hc0„I(~DD*æVÖ¤Q+gçꢙµÞ ‡¯fŠ;P#žEE÷Ö@u£OO=ø^ˆröò£Ü¡˜CÝL¦…TÞCÙNÐÛ7â/ã7§£ÙC›|¸50Ü_+5j´2s©\?/Žro–sbéBSáiêU~]‰L•=áÎþqÅÉúüÀØN72X´(ŒODôX¼æÑ6ÍV37ïf:|üåJW°AîÝÊé)w +Q_® ¿†D +‚Ža+°A‹°AÁ
8µ/Æ÷—ô¤5]¦áKúÍ:,„>Ózjéún*{%–)›ÐÈ”MfÔ²Ðó!Ôü¢3HÅvµÈ0M!ªek<L[ûv)O™e-¡„¸ßV¥bñfn>&%8ž4r0ÈÜò
éÍ%]ò†OWWÊi—R)Rð1ÐèŽÀ(g0%ʱô +“æ5–Wûæï/[5º_èÁ9»£üÀgnJ»'mM~Sb“<ØoTl"Ô&êè¯úG¦Õã=ëRæ¿JhÊ'ÖÕ¿a¶ÅÕc”)žîæF¾ß¬ƒ_-“ÈËVV²º¯1çƒf‰gnd©'?måOâ´U:¨gžv·yжÃN9°‡ÚïÕ äÇœøx lé7kàPEí_|S–âÞ+ýÀó§ÿ
Àø•>4ó+4?Œ™ÊÝG×nXÓ©\ Ïw/töOç¼?9ˆ³8„xe»Q…ãj®;ÄWŸ[ëžbˆBë„f~àÕ¡”%–ç*Ì,ÅMVZ´lÌŸnÕžk—iwf<ùÝ4Òw™i)%‰SdˆÑÜÌQ~ñÿð|ºô¿†™7k‹?/tgW'ïÓEÏò·Ñ’væ±elVŠQ^ÓcÂ^žËŸÆâfßÚe{ëÎCæÎFÂv4ƒºÛéÔ|VS$|î£J +ºNV&öžs)3¦×*5r)Wž[ÏÚ</³ÕàÖ^ñLQÂgH§’ŸÏ¹'û#vær©_„ÍIÖ§ûQYnVRe¹r!r¿¸UÓ·ù³NA³bÓHFéÈz?øxþâ@'y¼-]õ1½¸Gnöj
Ïõ«3×æ à~øì¦ÂP{¢Q¤›>4.^z%¸sëÍØzZï®êzÔuèÑ¡Kü}‚ÎÖuv ¾½½gÊSpºÔj§ý˜1æÇ8z+n’ªÏCÒkM#Qñ#lÀ
Ç[“ž\œØ
}Š¸Žx…¡”Iõ?½Ò7Þx¶ª‡D8ÌK¼`)ÿw¬^îlë•z‡>øßåçcïÜyn<ñ©<Û~`ÛjjXwŸ:pÃ:rãàðH_JØYhg^»Yi³_^{üpžÒÞÍiæø1'+—÷2:”§ùÁÑ,‡¡ÐlôgÓCÆåAP›³®Ãµ7í¨wì0éÞÕw›Ó·w>Í Og™víɶZ†E7< yˆÅJ«
¼ïFÍŒ§‹ˆ+¥FU†ªõõ¬Þ¯×ZÞ°Nqöà~Ee¨µ~/o«Ï:qÖNè¥×^/¥Â çù¸W±—±l©[K·Šæä9Þ%òÚžÌÌÂvN˜L~`w0Ù,ݲߵŠ•ý©9]ïoÍríÿ€ŸÒÈêYß +˜i<[
ø>›Ãõ„¥jÃÁk¡´úч1<øÎÞ>£¾Pu‰v.,pnªVÑZpß·šè*l4l2òë›Þ!þàïäÖ2sç7N\{Ÿíë‰x؊ȧ~àêr‰ªVšK•á 2+†g¹Ví#ËœÖÒjkå +ÀÝ2¶füÿƒCº^ý•ð°ïË£þ¬N·ªô*ùn"´uÁAâšßtÆéÆòÝÁëõ퀯µ^Íñ³Ç²}«ßk¶òJ·«a>T>|X)ÐÌ´ôµUâ+Âg¹R\ÃeÉÐ%Ç-i%’_9fcÂ…&S¿ž‹Gæß_Šî{Ð(òÃiûÿ`KIWx6›×±Ÿ’6a”ƒGÁV‡<ÿ–=Zíü½+5ñ¹Rgæãøá#m«µ7QÕCT¨ÆYÍšRrÉÊ´¾‰ åʹØ*¥¢_ª¥;sWîLÌ&ºXÞåXlKä«ÈßkX¡S^‹ãËÆý<ï¹¢¶5r¦ÅäßkçÇ¢û_,rUרCSbD_ãëØWVîW†ð¤Ë;ŸŽ§+»jËZÚr½%gPû\ž•±•{YeIƒËÕ²E–ÖË–`în]Íl3³x|-«E¡zj®DªS©¾ñ`ØÈè½jÛü;ß‹÷’fßé|~[dõ‰º(èÅ7ïêqñ³ÐfÎ×,yRÖ,niõnþÃâÈ©Éa]cl{äõù÷éÛN»»±ÝŠ w¬2é´oñ«nO·5ØLvr΅Ó*tD4]B3ú¦QÊ¿çF5oàf#ŸZ·|}ÒYuS~̵ٜŠï•Ú[Ãð‘[^‹ZŽPuu›)Eê–m jýlÄs±øϲù«I#Á<Êc©q'ó¼…åÂqÛ=Ñש÷Î={ÅeQ«·#gëö=kaýêÝäûT¸>»ñ¥Tþ—мÑri}rDÝôçq¬ÍÓ3þ=|l
³ˆVn…iAÎ>{u+Í6jFï*=«£ÊÁM) +w)ÛòyF1žÙ/Ýò²_¶_Ôÿ gÔf8u +mIžwÊñ•^ËÎn'Ý—‹”ÓÁ[|ãñ锯å1EU9a5B±¿+ +°l~†«_^»CíÜ6\õÉ=~`.F»©*y¶žÝ·YjÛÙ2ûæ˜c©½Se©Yåê°kM'Õ_ñqU#‰»³—.¾7Íú™ÔzؽSÍ(žeúÊ”5Œ¥ÎmvŸ£Üåw‹XrÕ•˜ò›a"ï<ݧø™•Âx£h=—ené·óœ--*ìfzo±u‹é³4ÖX0ûóóÆ´:NŸ•öæõ&-V…-ÚU†™2í¤êL{>SI´gLRª;j´¾´3ÏÔ. —pþ¥[ÁÝj1xî„|Éö29ú¡Ü¤"ÉK˱[ÎÊgŽ0ª/vKL¶¾Ý,ÝLÅUs`ÙÓzWKôÙh×hŸ8viqÇL©[38SÊé“Ï‘/“a‘¨‘:|š“ñŸŒ±+‘¡úª!s±Ì›ýƉäÕÝͨc-ñM&ï=‹r'µÂë•Vô*1Ä•‹¦<ÄBíò]pþž1‡Érɸõ÷>áí·E@K‚…R÷TŸ¦‚ÉF¢ÔRÊ _¡Jêíj›ÂzLŒnÌž(D‹ôœ¢Œ--çÕlƱ'ÙLm‚g3fÑÈ–&+[êvÊÙè:¶BœaÒÝN«¼âñøhÕ+ì9‰–¨ÎöéA™ã7ÍBjÁëÌH¹w¶>Š¤wÌqð˜þÀTO¯ÏÉ׸¾&ó°w$Á~ó$Æ'Dy'ÒÍN;-5[.nJYA›øb^ñ,¿Xcë«ôÆ(eÊ »—^F›Chˆ²ñmúoÝ…FáùòŒQ@.õvméäΨm
ÓŸ&7Î^œOÄm~}À·ÎÆýõ{‹ -A¤qõ +y¢»<'L˜‹²è +šã6 ñìŽ;a›¦ùÄ꬟ƨ÷–øÑýÐVAÉ£\Ú³3§Ý£›9yŽ\Ï‹;ÒíäID‘ïEøñûp°‚…iˆ‚>JH7÷þE LHÔ7F‹ŒK\ß ~‡³7{šáv‰ø›ü×,‡“>+àh fÎkéFŽÙ5¾êÓc”{“Œ”jÌbÌ·Èmr» AƒþÄ—ÕB&ƈÃöVCO´`]ìzéÏí¥G½Ú%]Ð`ü†¢Q[‡2p¦
!Ï*©EY9
EË_üÉé˜Ð¦û<¥jñâQV¹ƒyMÇùÅÎp°8÷ŽŒôùgv±èñ¬Í`¤7ˆ"8…8ót±RY¥a<8BÓõê•k/Bi&›ªº!•åCÔ:ç ¥ã´”êÁ€b5Æ˶ŸgP)«£[äµeýÀIGA—<õð†\yÀ죯ßp “.Ž4Ž@\Ù(Ë|½Ó•éþBÏ–/¬5É]'io`c-!Ìm@ý¡o +Šý#ÞÒÅo€oUüƒú@b÷^bÄTxk´€Dœû@rêk uàÆ3H“b H[f +ñºÛZßmÊâ@ۓОØ4Æþ´—ME‹•ÐDÿLðo¿býí>–,âï¿êèo6B’›mÿETœÿ‹ch‹gˆXÛ§6ï^#|øzë[æÕ5ánõ;ÒîLoÖõrú×ÔëNœµIë.’ݤ+Õ_¯j¢&rh)ûwf›D8¤†ýÀI2?Ãt‘x|ÊUîa,kò="šúÝÜ~û½Þ‘Æ´z³ŽÓúu%LÝ«}=—r^èð5;òüþÌMœ×ÉGŽäñV
ªGeõÿÅÃ&ZmâZMW9ô¯L›I%â]â¶eþg¢ƒÕ§6éú²ßÍõry‹/óû+áOþ'r`¹á=ùЖ8ÞJÛ¸Þ_l…C˜Ý*ûOý߇siñO' ø7+ ×Û¢¶^¬ÇV—>5,'ƒúøfÌŒW &êèÿA<F0@È^í㘿ÐݱvæµuÇÇæ|xZëÎþ㬻ˆí·s±=ÛدârÝHÉ›ÕÁö+n.œ—>.?·šüY({™‡œEÌ>¾'Ì ^W›šï“ÍÅa„ÍÈ×ÄÁÚäxëT©?ð¸AæÉÑ¡™ÍþšWÿ÷ÿÊ¡åãI¥.m1{ìÌx"»±:º®JÌŠ›êÒâfóÚüÙ`Š³O·fPØSó Ñ\ñ‹°1èN„bFFãÆ,G.Éì‡ç¦zŠ§4Ä1>{x>ÔÞç°?*˜‡~!Ýö¡iëñkbýüÀO!z]íC{òÞÝÙ7A·27Dpì/}$ן?kl43ÎðjjÞ³§ÈzSÏ !©1½€2#7‹CŸú0ƒ[ë#”óóë_Eô_ÿêHÃ*}hD7z¥´èó²9°¥·üª£ÄòÜi0È?xžì»Rµã{ë¹çç¦óxk·ø‡ÇÇY½¯$²>^„·Ø8öÝ_úp¿<×vPqŠtÃò„ëÕ‘‹ña<s§‡~àP»ñ‹¾ñâw½RŠ<s“¼X\9wœJu¶5 +é4(9ëZ9ÆçÎyÑó¥ªÞ¾õ:V[y/Znh¼ÂÖgª®[tþiFN 7KÑŠat›È^ìüÀÉŸ·*:MsVî´fýÊhžÑV´XB¥qã|‡gf§;ãûÆÃS‚yÁ2º«r½ÚifÃ?4êñ!h[}O¼Úãv Ø3÷Ú+7Ô½}<{ýŒ½s« +AYÍÑF…¼±õUËÕ‰³Q©5¤¾_£ìÊq]*ëðú®àðm½a_¾nwRÌ/΀|o¶©Ön>Ó£É67i
o¸ûí(=‹Bo:ÖÐ +9ôáÌ?8Å‹üºupU}3€¦Â$hT¸®¯Ç5ïW½Aãñ¾äUÆå庌󷥹}Ì7Å#v¸yçùþþƒÌw!uijù—SQòú®¢çAÓ/é…S`ëéáÙÓ¦l evæ*·hÎn¹ª¦à¹,¶É©µšPWk]fR*O©Té\Œ·¶…øùU¿GInúó7uù1x j-<w5jñ%Ž®àßÕúñðfî´ §¥…Ñ+ë»üÀ+]óàÖøèÅRÑáÌ‚ÐÊÕ5«¡Ù‹”[Üð|.«2ñL\]¿ +ñP£@¥ªŸ™Ò¼i'…
V°|*’ì±GÎã™,‚;!]'
#,\Ý_L »Ã¾ííì´#SX¯~¥·/8Á¾òMÕ(eS D—º»‚|.LòùÁ1Ò‹“ÝR+.‡Ü’ÅGçJucʵŽ e_)³JoË +{YäSçU•=Sõd ÆR×}î%E(ñ™zrbÛgI¢ÖÌEßÁD-Tó¢æJÿAĤ‘k’©ìnèÌÏõ‘¾‹VA³ÁÚï’=h¹¼…©âyÐÚç??Ò,¥9ÊÙzuªÖ‹Õµ²Ÿ5ãªOiµ¦ùt^Ùó¯ézRwFñ’båsâ“ë•Åþùص1 +Ÿb°F4ñŒgÄÐ@)ñ‘
ùIÁ1Ž*Õ2y>*=ÁøÂÜâ¹X8½vÝS ž{C‹´ì<Ù®·G¹:þ4„2ùx§wÁ;êQ“«[^•Ö>5’ϵő°“‚´|ŸåÜCQ;%j§!&|¼=#Œ +¨"Òrü ]¯ÎGÍKÀ—´Â’G>Û7_W(§‡+³>»zíSìêÝ‘9<·Ó9œ]h F÷ööš4êëŠxáA7jn³¼_ëNS•*|åë¦Øt½³V9‘‘“@º-—ñ¹LDY.…Ïñq +Âû*¤!öÃG‘ð¥†Gòf&pów*ÏU†r•ÃíA‡]“éëÜý³Ó +[½¨ŒQ< ³‡º÷œµÔ{dûüt v¹ª‰ôÙõ³µŠ²d)¾~`v—áiv¶€aM¥Ûs‚¦…Š!SW~ß‘©Îå×(“ò|˜—™[äÓÄ»ý’‰¡6‰ü}v!†ò!Þµ·’€ÌmP5œ…Á=à–Ç“7ÚÀ›Öº`Îë¥Ú…·Ü,7s”^a ¸æW9o´‡}aÈe7X‡iaó.}rVÚ#Ÿ3ZØcêÚ×ÎTW«¿ÈÇÈO“}gK Ä{¯ä‰aX#îg'ãò:kÖáT¡{>;Jn
ø¬ÄggƒÂg«®”E°‰œ5µ™ü›{"—‹—ž°ûæîn-k½Ce˜ø€KÇÝÇ4ÆÅ2«9G"-ß¡ùI(qň¥'t‡êÞÝÙ?RúcâcD‹˜Aç=aL¡+5UØ–5O‹Ï[¯¤Å +ŽMãÃÁŒ8÷^è¶#°(ýXX™C¸Z¡ô뀣
VÑmY1bjII˜¶ÿŠ.·6jæN?pãÔ´×ΰâŒ+¶XöÍk³ò3¸)¨Ç+Ky&ºðø¨:§/Š€øÙR#íãócº‡WÚüÇó•¶NGÌ™¬Yit—á ”i;Ræ(ÌãJ)ãÞˆV†&SäR–ïH=Qˆ´j—áUš!Ò$À)‚DÄ¿!¿ø½ÿñSeðt ¤|ßÐúÖŽâI„U¿5ƒbÿŒUuÛjJŠ2"<XÝ`¶•n¯©\h²eOuÑÝeÚÎ?ÓîOÃŒ #ä +Òëú鬃"×v(ü qîι‡Fú7ÇéaêqIçƒ:žNå²4~_úÐ|ç•éñé|e+¦ó›ÔyhÈCX4•ò½Úõ}â.óLµ—¤çÜBU‘F:„óÄdõ¢´½#"`O°-TédÄÚôÆ^ö`ÍiöÒr0Ž÷2Üí–i£iˆãÐä\ƒ!s´cRs8KY³Š
Vتˆ"½‰qNÂì«€P«> rÁO‚+ üájŠ¸Žˆ¦þºütÆqß+ɽ¿,¾&lO_Wç¶ÒËs¢‘Ì¥2úc¢}Ľ5Ë\T?„_&è¦ÓÎ —ªœr=@h#?ÑÛ²±» +ÄU"˜t¹èû®ŸX›'{A%Ñ•-s}›ÚÝßëÛu.Š«} +ä_Ðâ4¼ +²-¥Âr5(AªšÙ+¡Ý?K%t²Æ/t2•OpxsòiyÝÆS«“j¼ù¼í¦Ô+-¼Ï¼^¾+W®í@7W{]Þ-h²‡óÊ2ÛÀÖ{¶Nì—bÁmr5ú|ë1Ç•®eûܻڶ¯¥šÕÛö«*I…•°)OÏ»¹· +ÆôYŽv0V.5«Riþ¾TK•Õ(*áãUÆ\×
Å\wëšYSÌ\‚_Qº¥Çcw¹ô~àƒJ°Zä•7"²íÇøütSÄq×ÌÔ©m”¼µsdûgûbÌÞÕ{cWÕã![äŸlLž¢5nк•>ÒÅò´TÊhÊl”ª¦í—²ÈphÖÜSü+î®ÙK±ÙmÁ…råíEÕ*636:w2mtÓÙwÛÿ`y» ›¨Æ/ÆÃ\©ë÷çJµÓ®¹ö«‘-ä½ëÛTmëxi+ªö&‡¸ê«ä+ÑÂ*v¶‡r¹¿½•–Ø”²LƬ=p¤ú<[Ük¹ÈŽ +ZÁ#³ ìBÇè²ó¶!Ÿ¡a¾_06y-½|éÃGê73ôÔ¥h“‰ÿÑÌÏÿÀš¨B²`>.o7ãö£=MÁîtºäx¹œwabä} +¡[³u2÷`5)HÛŽ—ÔÃûªÖÜ)Ð2Òi”«ÌR‹nQ;ÕY±g•ôË/¥q·R +ÓóPù˜›Pr}ËÒÅA
©#Uk’O*ÄûL߈9nõ^Ä‘|;Šˆ‘g`a0•™‰úFÓü´{ä•ž7VΕë|’ªŸÛ-¯8ùZôŠ«i~p,·µÌªÛR×M³’'»§4ÅÖX>Fý…,d†[é²Øœ¥Nõ×ü’,Òiñ~Óp1WªsÂ;3É ƒZò^µ#¤Œ×’/î*On¾(n¦E7ÓOn–Ÿ¡1Þt¢ÌX¼ªÛþ¦]a{én’Øð×ä,¢TÓ)^j8ìÀç…nækµ¶3êò)õlÈBñ¥Î‘Ň@OÄ\—[oÓÚC¤uòóÉ[H¹7„ŸÅ›)[ááͦÌYìrè«3ýÙ忱¶=%X‚,™ÌæÑZ2›§…°„²¡Y‚žQ¬]ßÓÃBn{kuäš6hÃ’×ØkùªÓOqZÍ,³†®m—šum +ÇŠ5I~Fµ¯j
‚¦0,Žâ£3‹BÞ䶟oKnÖAöœUÔî7Rìr¿Ê²¶ ,¡›ff
¦¾‘ÇÝ=^èƒZÅin™6hnEOinA´‹{í‚ow9ú w©$¥ºGòÂïËæȵT§Óà°²c¿7JÞª¾.t±Ó“_ùÂù°Î‘J³/‹'ΆÇæ;TãfÕå¬Q%®ÐÒε§ÁŒ%šÛ-³e?qÕÇÔ?⇡G•}pæ,íRˆNsz:÷ʯ´äm“BÈ ;ÕHU†¿2Åí¡‘äm/”Dä }»€¨…7ì+£Ö*ã:·M¬â\ÞœÒ\¡ +o}zAöjS™Ž$ÕÓ<²g,vå›%î Ál{L‡¡ß|H†…ˆvmMóDt¤Î·ç“ò{LIåMÞÑ•JgÑ&^R·G`v÷úl™&@¥¬dÇB©—‹õ7ìg–ÐWAèÃO6D¯}×k+²ŒI‹8ýÚmÕkU£z½T¦‡¸`|PÒ–ú¤œ”ûT»W…+6Ã4•ø{q‹uÖ.Õ@’"rLÞKê‚ìeœ=©£;1v)"‘¢Š”7ål‘Õ:øÔ[®ðrÁ8 +Ã"¶˜Ý=l±@î8šáxYp|l³q=–ÝÝî‹]·KZ}Ödªá ¦Ž^e´¬/’’a¼»ˆFtÌ›"ªäR˜“.[ÛWªT§Ý±Èœ’¯¯gµNžOä+»‘Â_ÓìxCn²Ån)þöñé³ñÆËáÅÑ*Îcq}PIJõƒ‹nT{ŽÖÞð¥†.Ó"›Í̾]PjRÂÐÚµò‹]~ü°-lÝʹµh´ó«±“—Ö +þÚfG,ä¾iÀï
žkÄŸFzÈ5om—}†Ó5R˶ËYÏZø¬†ÚñUTháè¾ØÅ–ýγãJË~î{´^ÌÜQš*Ùý~LgZnFÏpzÐDÎ)zŠx“åãFÄR|%èž„:|Ãœ3"VñBþÝóðröÆYyßZ¯†ëzçºìânXT¸¬¢oè‹å›R.ýú[,lð-Gªû!u;‡-Útʘ“¾–âù>½œX™ƒ½©e\âÑÎp;´‡œ›òñÙê*Æú‚ˆŸl +¾ª$v9X¥ +õôs§C·~…>Wˆ€FÝeúÜ3Û´NîàtXX‚ν + zü-È Ü•ÇBßyÇ÷Jýý¸U³)hgö½Q¾ß¼U¹p,Š(_çY¡ÄgÈ¢}¼á5[g丂ó&ÙƒP©Ö”‘r%Rݹ0Fuc°ˆq? +ÅëŠuk—úáÎy½w¼™êèð¬ðÓý§F.÷ÆžÜî"Ž<n±^ú±!÷÷º‘z§W‡Œ¯¸E–YúYYYt¾8º½æ<×®äl6R2òiZJ©R¢Ö&ÖÕ_94PÌôÿã*—î×}¼[êãx+(à -‰ÌÞØrôiâz«Í••›óß<XÔ7Ѩ̟Fm®ÙHp¼Ôu‚©ùtÑ\oD6öWãµzŒéÕ¹Ï$ݲ·Ž9(÷=ÉCýÏhÿNòWà ’ýœÿ†0ϾÎÿ•C%|¸rS½áâV©Íæ!UÝÎŒsñ<5ïåW„
•Ô„ˆÄ̸‘Qˆ‘›¥éá¹NpCŸåÁÍåråÂ?pøìV¨=¬z¤Õ½>4êþ?ºÎsAUmÛÖOP1$ç IQÁ„"˜sÎYßÿ¢5מëìs(C1Ñ[5ZoÛðz»øý-}Šèí.“Ôfóv‹;+ë0ÈÀËP¼Ý_4åW{ú0›×WO>Ä:ÚÌDÐ\œòÓúé/6ž©aq¸É+ó*_ë‡L:êÅ‚2èWrÒhüª=Î’»6:"O±‹’·˜˜ñ¯È'¨µ)X«Êêt¸¯g…P<•ÔfRMç±ÞóƒGÿ&ÌO?êh±{«CËP«Ërð×°ú/ë*Q™ö¬¸ëÏŒÍÉLKÃ*¬3½keÇwÞ-OhB&va#ÑÑnUiÕ^®ÿ ÍSCm5®×nĪ:]u˜@ž×yy]·Â±6vœ[
]VAÕeºDeYۧ˛æÃ,W•\Ùß·}_|—ï^˜×3 控 ½â_ü G¥øZ¯øˆ§Ã0òFÌÃ2z·\Šé¼Ãõ«ösÏÖƽ¾Cq×K5®aºz™©råtml—Ô:/g«.U.T–•²[¡÷åry4êeîÜý Óhÿ ¾xOùÐX-J×ÁíPÒòéšDwÞË¡âX,ìÇõ¸W´ÓÝT½péªò[\’ç³¾ZG„º½Nq«µ§é>±r +Î$ÙbÓ3Ö(T ¶l5Vr®uïÙ»³hgõånhö™ãÌLÕ.kc$¦Fþ-Ýõ©%½uv0Ÿ4ͦ²FR–ZQ2•ƒçýLÝ!·QœÀÊñl©?ˆÒUúJsSz&!1Úžç£^jEq%ìV›Ï
xÓ££Têy†ðÚûùÕ™xÞ¼°¹c-Kî.óu"3u}{ò|ÔtÇ#" åþ¢yUu¢Ñš·R+½Ê^å²Ñ%³§ö #V®˜râiNi>=M¾fGŽÓB$«×ùJêêüK2ñ³”~/¯Qú}¾_%S*À1”vQÍv’£2·a1Åš/;j9DºÉ½HÅÎ2/pœíž%o +šw±ê¦PõTnÖ3·2âyÓWÂÌf¬È÷ÇR¾Î¸ƒ»Æí;û”ºùƒHf’%€ +i+X4Ò°¤ÏÄIêüíq±ZˆX=:‰X…’¥wJ´÷4PƸ½¬TÚ-¥
Øl»Õ-Ý4ü¸£±.:ܾlŽ÷Ö¹»w’ï‚L}Í?tLÐ%-%[¾!°'kV“ž¢IÝ“Û—€âŽÓC¸»J[“Í1
×ѧ8ML´ßQ˜['S(±NM w—¿ê6®<›Bhž¥Éd¦Ä³Œ¼O0|Ùߤ¾èËڤͨÍn¨ÃF€Z¥Ê!®›^O4yÇm½RùSÃÛfßÓ7ð鮪 +R5+·•¹)õ„FVý^1‡†~oƒD,bÛ–ˆá¾0oòS¡”s·Å~µ¹A|¹–fxVïêÜöúœà7ûì1#œØÆ}M²R·ç°Òü´a›xRÆ6^Þ›=ê!èYJyó³z¯ÙëwÃä*VjõüŠdG9¼m±¸ªPHráŒYhÂuÚ8Ö•Käç¤l¥‹“dˆ8/ä„RC* +””/óå(_çÙB+æÙÊyÄíxlÉÕžÖ‰zq²ÒÒ“úAØ&mf˜K<v™H—;ŒŠ÷ô}YÇéN«hÓ(\Ò÷«úþ‚QiãݵÛùiÔpëýf*×mýFKDÚ´PÊŸ¹È2¸¥§:'ÓÓc{¿š?ˆüPÃB9–5šÝU¾òñ;íÊ÷<Wçð{¨*Û4³-Vå+“Û9sYÃ{&ŠÌ}40º3{J´Q²mê-½cª¶TärŒ¿rä˜äg?¹×'•›C/ªÿD_žµZçÊ Q ÇqcW5ÿ‹%”Xjv]-R¹Þzt1Jº;W@øÄsìK¢ójëÜìTö„ŒtVvF9æJìFõw~R¿<2HƒîÜ…6mLKcêíôÖÔ@|^©Ü9SÐp(ã“'Ñ}7$f
yE¸Ò>EÐÈ Hø6!ÜüìIÌZË_´ËM}Þ‡ÍQ0½.;Õúý|Çü.ÿ*¹N27/œÐ2“K/}w×™(ö¤¡V11Ù°¼VéÇÀPh6t꽨AïQ–°¨QÐñ‘ã0$m«¸$1fr&ÜÚ¤‘e|ùž›8“O×±-{šcÕ}å…ñ½œŠñýÖ«žÌ+¶«œq‚G\‡2‹æ›ëK{Öœö ôN•ß?e +:²…1òÖ9}¿Ï¨ =JO1.™)ñ5ok1íÌN¥¬œ!í#ª’X“ËsÙ(îÕ+dÜiâ+ûØÙùkŠm=i‡ÕäÖã¯w=LÊ:Úp@•ˆî9¯Ô'ÒŠiÅÙ>rÞ’—•óJ°rš±¾jZHVg´Ó ¢Ì˜Øƒûlµ¸ÍCùopƒ9«°èY~çÛÑkÈMN†žE:»[gˆù•ñr´T°íc¦aµYRØ %¢”¬åHÉ5´±v¢‹1*Åø¹hù;a;É,2*|÷Ve¸ÃØ#èU;] ¾sP?½¡Wc¸ƒõ|‡;8óHŽËì¦awF‹ZM'&ßs%\’-V2\ñÜ`¬ªž¹É§³d;µ©À§ŒˆyÔà…:w¯ô m±Œ\ΡŠDA6ÁÕAÔ]…h.‚;³æ6ÜÝzSÔÊE +AêQúAR…žî€YjÕÎØ= +8`r¬ô +Òfœ¼îžZiׇlmæ=³e›Ù©/?5•8bs¹Y±LÜ'y«¹!¿õI6þ3€Ïºµã¯ñ÷·›þOþî74᫘~¸ßÞ¿6Üœbÿ¶NËjdŒËdÌ&2¥¬2Ítëãƒp'riYSÉ+7`2ÀæJ‹ÙUëÔkki£ªCÞÌ1-Šoö“ù¼ajP¹ÑHÿ{Hß|Vÿ×mûëøMðÑ“ÿ;¸ýINøŠ·_ßí·YY£·:®½.<E 3èn4z£ ½ß²€>¨ö>T¯@_Cì?a¦Xêïýû_÷•pÒþiëõÍFøfÄ6vÿ´ ûmKôØ”…û»ØRî¹EK¿CÞкé•sC«+ÿ:ãoÁ•h‚ø²”ÓI%~¡cku®<ÃËiŸ}⧠+Gã7ö“‚ðƒ|ƒ¾Ãû½“ÿÓ‹êÿ¨1$±[a1'®DuÈ7Ò0sæ¢Cþ‚¡»8µÊîí—Û±63Y꬗Õ_m²©d‹¸ákº×rqr^Û…¼Jæ1‹?fºÏŒSŽž”º<ë}k‚¨æØEàËhé´™_Sí'mà«Õ~]«ß{úÿË\ûƒüÊ¡ûµ9ÄÐt¿PÉ©
äûšn?ÞË}î†-äù„š«ë‰03ö=yš;·´É8ÓÊNÐN«0vÞ
g´´þˆž4jÃ*Þh¹Å¤;èÕ¸ªÞÖßnYð¥§^3P×x6>ݲ¬Jrµ7eÅ38#WÃ}‹Yý‰k€ãÇ…JÛ_9Ô9žKqij‡?jLsÇJ4Ac§?&z^R¿“õf°wsÇþ©lÜz׺ø쩧tªÛUÒh׸idg klêkb{œ³3mtìš±‹ÅhYT#z½[Üþ= É8†âåA6åçÚo\ûåq#Î?]f4Hý:Xî¢ûÕ¼¿zò*»ñ2 +¾Ö®è×àß,2AÀý ùªå²ßååa·'ÅmÝH«´Ùq/>*/–pó<“á]ó“:4\Œ*K_•«1õÅË{Uºv7Û’Ng×D6wgàlÞŽEÜâØ¿Et{c~{V‡E›8ÁJaòf¾)v¾ªÛkß#+
m&¹°Hs +ÞE³±Od²Ku</YËÃæcŸ¾˜õ+hXßÐ^w``¹˜îÄæ•“ýäë\]¤ØY¹F¿#OAáÀíZ½À±ðrXD7Ù¶íòÅaÁ—²Ó})òUµ¼·öÝÒÉ +ÌÆ=w6Þ¹0?B³×é”ÊjÄZ0+D7MV*ƒzñƒ–xëã¡}Öíü“Ô1nïhsì¾ÔæBãùèQ?ž£å¶{=[ôt'7€âÕe¹”Eç>/u¤Aääý^Ù&+7¿9E+¨êÊÜé-×sŠŸ‹²ñ¶Ð3Ÿº76»¯æÂ^gkééÉ€«‹»>ÑÞŽõ R›{…´Fn¢¬ZÖî•y•™í3SÆ”ÃÝ*(G´>WäþÅ¢yö1ªîظ;l]+Ñ;šíÓ:S/VbªÂ•‡§ù÷•Sx„íº/•¬ÆÙ°²íæ kfy;g{k ©°¢+ƒ¦6ßble¾gjyøNæÉ*[ ™ÚL¼e„ ++ÇôŒQ¤Ö##·ª#gf»¶to”¶’~¹ÃéW¼Ê¥_“÷4ýšVÎ_H]çÅ+îï×Z«Y:9eըǀõ/939ó»Ãöec¯Òq/Ÿ†²•lgò6¤‡)Zi7̨kcnªì`UÈÔám)#Lž5¥)¡"˜Ž| µ‘)îBºO½Ô).ï’A`hºZB:§,-q4•“½/œÅLDÓ¥—0½dTÁÛ}aÇ¿èëãuܦÅ}=ŒSg7@Ûk£²OÇœ×Ù!§øºì +µá`˜kózÍ„ÞPNóVg)S÷õ´"HR‰ËQ×dU–,©3κ’a—*é7Öj¦s^;
IÛ‘8º‚¥Xk'µ[@pZ ú–ÁûЬÂÓÛ˜ÛÔ^7®jì$®š…;\µ´<p›ÞæÉU,Ç/Ú17ØÍnåPª»Åc¶’NoÒ¥÷¸½Aê˜ofÆ㯽VŸûD!³¿OD9æ_¼d¬GBzÀä4LuÑkKD‡G˜Šà¢BS öÅdÃ/ƒö”gÀjËmÖ̃«VÊ8Ç«ÏôlM{Ѐ9Óщ oÏ(V‹ ö–9«Áþ‹n¡7íDj6zókþëbý6D³â!aoÒõ±¢ûffŽµ–¶fDG9w¶²¤+ÚnŽÜ²È$kȼ_Ïé<#z·y÷K\u°®q|9±V²Á½±fÓÕ…i‘Â(«Fš¾E¤Ck¸óƒPϹz zDS½0Û¤žg~C=Wü–ÖIm×q©Q·n—Í<;—«ÛÅ«à·Ë{ÅT·´Í‡ùGî±{,™Ôn«»áÉwhiø2eøUž ¹~úø`ùþžgÐIfÓã·Îœkbi 9Q^Qƒ¾-v]ºíã3ZWJGêy[§¨ÞT¨1̓ó“ùÖcKLÑAL±KDŠó™Ÿ‚-9¼ÃÛ¶õ{ÉùÖÞ·‚bð¬V…)úúˆÐ]\;³…òrÀy¯
’š÷2§šS‘Þ$iŠøhÍr‚¾!˜ó5 ™V³ôí‹t»7Si½tÍQ/u¨ÞÕ¨QÙ¸'[,eï&ä§vdþX{SyG\ÊøqOŒW8u¶PœºDeÜ“Ë3|ÑœoüxØÆ[µßo¾ðMT_dázå8J^¿Â™Ž'ÀBA,àlÞ¤w?ˆ^N‡™p;mH×-ÞO³Í⛢;¼MP}I¡¨ìÅâ©Ô(PÈQa`’tc“ÈÓ†N¶9Ä£é +÷ªì§ùˆÄÖ/ÁĸÜ0@÷°¹øAÐúŽ„Ñú>ç¡{>3Å8»¶þ":Ì:ƒfö˜\˜iŠlTd_÷=¨`X§¥|^0sšVÚ"§Êm{$8—øÍFÏ0±ˆÒ$¥qU±¤â#¦†%“ñ%ÐTÜ[U-œ.JØ&óh`•GRsÝÊÝ»—+P9/w9Å:êüQð[ +QH¢ˆ(à2DÂlvœz¥Më’Ž†Qÿ‘•µÊ…˱UªþñÅz”Òt‚è¦ÕsîJÑwl7§7eî—
ºû¦£,§ß+Û¶Vµn<ƳLÝï´,Ô}M‹ƒrz¿“ã ‡êQÊ£3¢TdŽ÷ý¬5¤2ôÌÞ&9®> sèP‰:ÐSe×°e6á}Õ3ùݯî×fì?•Vðë¶f™y1–Áú¥†PÌ-eˆÀ{ºµ©²g9K
—†€¯F&Â-¦· +i C6ÁMF”7c·Y„ÛVr5Òáe=wÜÊŠ…N(•Ïˆb +¾¯]P4³=€ƒçG»ÀSÏ4(Zt+Ag&ábùm+˜ ô¨š^=lÛÍ_ðyg-0¬‰Ó€ Œ¦ù»ôÌǼØ'“©–' 8'auÕ"‘ˆ9pÒ?Ô§k”ÝôÒPªºÒR#.¤>ãƒiÎ>Ž‡ +á ™Áæ'óÈ)?ŽÕB„_íßà†FyÉìµ™62bãÓ¬AÙ•F¯=•!w3i>5–'py’˜`¨%x + "=y¾òœ + Èn +„[j
„; +î×ø +%»VñfŸ®iâ(ƒË(«”Kè:ÊÍE€²+€²×“—Jh¶kµo!³ôžØt8m×È4æP8÷éb–ª±wúuÛ¿nÛofÃ_÷k¾ýÛ:í¯tûŸVeZ +±:_ľ½Òxhg(:¸Ÿ€N½>½Òž
+û-Ð3!ú¿Æ¯Ûö{ÿRù§©×7á›[\ýmÿì ::·1õbnhå%\g<®\ƒ`\–’`]¼KÖ=oÔbõÌuËá) +¯*_"ôOÿ©ÿ=ÌÛOŠ¥%ϦΕ‚}<½Ý{¸Zwio,ÖúªŽ¬s©WSt—û<á/Å)Q[„Ñœ_}4š«[´;ë +èpún¢ÓiîJ¯'cM>MÐ^á5vS!>òѱ8¬RPa°¯\’+ò ৩¿i¿æUt!^¾wòÿ—½ö¼Ig““+Œw +š¯—Š9]îsðr¢Ïý\]¯Ów}ûžŒ•<žé}bLôûÉ~Ñã&?¬bõô›wÔA@EFÿT‰¬~ÈœÞ5XTzêy×ì÷c·30ñyfOméñK²jL¬µÁßFY_ë7õ+ŒþIoø¦×žÄözþ/9ôáÎd,Jc¢Û-7ù „÷CÆôbÁv»²½ê4mÛzÚ±m§´kYÏØE³ ZºY$òÉÙÚ”ËÜçÎú]K q’k†ÊªÔ¸và°¡¾Iе6×ú{º7ê7jÕ¡U³ýÅ×µZ%Ž×ÆÕYŽuÌ
×t\®ÎÕ¥hM +Eré׺Ú5ÎMñé@är8³#ZBkã©¥p_•«¡xP›ÍPRãÆ5’»
õ!‚®)~ü«ê¢>È«›:45Ž5›(Ü«3?€«ÄvÌT|á¡–7¡ê–¹[?ö#ŸÌ“½Ó0ÿßæÕRì” +_Íûk¯ø>¢5®/¯›è׺»÷hUÉÍ«yª7@#VJhÐÕ‹T}Ërµ±K5tžÕª.•Íþ •er%®Ð{Ý)o‚¼_æÎùšdòMïÔ)¶½ÐhJ×Ápé>&ó£k&§dgàgYÚN²ÅqÝnѳó´g‘¶]•~1‹8yíË«Ætpã +=ùt»O®‰·Ñ>wim\wÛ…á,0’ÙNmœªÄrº-ojÑÑß7ëW_¼6_žü¬B¥8[ÅJZ*¦Ýn!æ÷,L;w :Ð*©>lv\°gõY鱉Ó)(ø´›ßtŒE¾jLoÖ~HV‰ŒÜiÖæÂ’ÿJ°Âs +5ľ˜·+R}TÍò=½_’â"âa#¸Þ‚§7ùΉ+KïùTM*qO~(m÷1$ûÎ xÇÞaVD7çµíòç½MÁ¥àËàÓÄñùÎW5±ö=œ°‚¬ÄåN#]Î)hRÅnË5«mÓ49fl¼÷ݳ1h¤Iº\í¤Ç÷¹>n×î1qà~¥
-«=Ã$¹%zo"xÝÇ÷ZñP[•·§BÏS"¸ìšpÆ-ÚÔε‰}Ç+Ðçf5ÏÝ+
K|;Qî4¨÷r +\ý Ù¸XŸe5¼³6»^´3Mzz1ÕÅÓ°øG2†&JëèU–5W«ä5âyo¨~.;QèpÍl&->Sua¦êËÞ6ӹ͈k:•î £¢mŠÍü Mú¦Ã¸¨˜-ÑsFĹj—²k+Ï[×dçô]-ÛiÃì–Ëx¯™¢aq¼¯¾¦Ûi¥©£g«¹«¯÷êTõ`•Ù,ÇLÕ¿¾~eç %è²|&Ž®¼Xºe^)~Œ0I›o}I{uÇ N«/ŠV;ØR)¶$ŽÒ‚aïÁVËÊ<å‡ÚÁµdbh/ám=/ì›VöŽ‡ÊbÍUZ·§YAs—’¤®”¬®2íl.³ÕKÅ¿¨ùÊÁkו†¼ås¼íÉ-L¥Û‚ÙHmϾ¦Ÿ×œîµa!«q¸„Z"ÂT–Âä.ÃB±û¹ÇJ(Ιak.L1Ñëe‰j\ž`Åæ= Œú4‡ +a²E<ÝmlÌM +¼~hæb2²ÍÔÕ”´Ò.Ëdjñ”R½ˆ‘/©H3…Ž"ÝÑ©!éÁ:ÿƒ¤_é{)Ý» ÕtJÅ›âÍöÄü¬1¦äp'×àÉ/Ô<Å—ƒ[—ì:W¡SŽÝŒ»k‹{Ÿôœ'\EÓîðB×£ºNº7ÉfkÞMÿ e¹xÃK¹ôü^¤lun·(k¶ú®îbš’Ù½qBŽ$M¿êW4=q¤\Y1‡ÒÂÔ€2‚CˆY_æŠü¯”yé7¹uûØç*µàØwéüƒ°u°"«ËL³³õÙtô•ït´Éåè«’í2rØ3²ßu
ZÍ#ã5 ¡`U7±¨ø±QnaµzÚVX}íµÿ˜k}] }–N¶Ø[E!…«)))~±pqž¦]š['ÓmŽãC…Ý=—Y¶Þ»YÑãªÌ‰vb¦yN¹ìé÷R´º¸‹TW);”qǺ仳<“÷¡“ïù%úA(Ï¿h{õG^ûéòo¸o«ª÷$Æ™
ï `Ñ.—ª}£x?VÕZ#ÌÊm&Ã¥a”€xï%¾8.:½ØúãbÅîcBð¤yÍ'W1úZÑ2t¬>fõ˜CMª[2”)6€ØiÙGÂ8[ ìæ$&0Å=às$T¬Ðlöè5 Æ×Ôo·¾æ"Ëõy&[üÓ¹íñ?ˆCF8œ?=§Çì@1Gº×y™¦4ÈK½m^±‡pÕ…úf û ¯çøMk™Du;-,Á–¥L–)@ò98ûiµÆu.@]ÂÞç–Lo?>Ï4NŽÖ9leC¬,ð;Œ9¥E¬œVlLû8¹ß
¢ýò6Í
_“÷¬S>?³4\Zbq5Ê`ùÿºfaÆŸj›€ +•«tr¤œ2W…ÒÞKæ–lÓ_´¶ªÞ)sª=È!¡¼I8Ì"ÄD)‘„}kñD¾i6%óø¼îVpò=ˆ±Õà=ÅÊåÊcÙ7n÷‘‰Özzˆ +ÙçiŒ·*”¹ +°›˜m9 m€ÅQcôæµÍ<™¶ßŒg˃›xÅaV¢¿U±L®#Ie¡ó™ÊC1Ám!.ùfÌ5šG縔NxØ•CâF2Å"e—T +!;)€³8ÁˆLðÎeôm$…~#?Jð8 +A[ ¼q‚ËP¨ +KI€|¶K€|Ù£ž|â’Á/ß + G™! cøÈjþ
—ø´˜ûMÆÞ3tY–®X&M‹<7{1﫾!}áÝÇäó!€ß!RJ¹)1èéRÿâ£ÁÖÇÉrýô-ØEÝbÐf¡‘`Ôt_&hÜ +Zº\ÜÐœžq_^¬eÏH–Qª¤#À¦:¥á{êg.Q²´U ^-ÀlØn‚âä£ÁnV{Àl3 +¡ôæàUr@ð©f‚Uò’rBÁO³½ôìâ°”¼×:bŸXã¼ÔOÇ~ræW0G« +-5•§çQUÄ32Ž ù²ð +Òr ¤#²—`sé8f@º]IëÔ– Ý- ݨz íuvy«ìC>;ÍÀçG$JžÏ8¸jâQmË!…à‚ýÛ +Ëæ„+Ð×¹”Oæ—zž{‚äøJî4vÛ9›-²±GßÍÇ&fÌn⛦ØÚ›fÆût{—~)¼5œ¤2|Ч[Û«ónܦʾ§Éó–Hd¹«šóž”jű'¶Ë#aaÙ@ÚùMëÕÏs÷×ØÚwñ…•È:w²‡œ‚Pçìu*=~¬F¨)³ëçpã½õ8âŒïEÝV2MmÖîM5×Hß5âýL«ËÝQýÂtŸ`qøbT¾œìn¿ÙÊDë]nF
ÔÐs_)ïÖcï<›É¬Ï´„|ѦšÙ‚ŸæryîvÊåNýq!{ÇNVÃbßì–âšñ^ÇMcP·
h?èéã`9ÖÑór®ÍZ×FÜßgÕ7‰Wf3T°L5§•ýôšW×ù´:Îå°Ò²Â‹²"ø}ézŒ§ÉÒx6“oO{Viáii°Á Ràª=O¾ìw&n_µšE\—œ|x(¹Ð#ó1›Æ \õq=/ëè)¯ý š«ä³ê²/¨ô+ëd6ýR9SÍ5e?n´”ÀöäÓ|>‘ê°–®æ*i|Iw1mÊJQ|_—±héÆV´ŒJZ„A¦š ×ù¢gfªIý3¢Þl+¡ŽÍÒhù×RwÒŸg¦8ws|Rͺbt¬ŽêrSÇ2›žŒ)ûM*i”fåÐ%Y!EEºž¦¤e +ùô‰¼´étj?HˆÇd(ák(ÂùìF°§;?O§(Þ=7LžŒÈ€+£ãÇÌcœcŽ}—cÞ™ö]¸î:Ã¥h6²íBºF6é·6ØÃÖvkÛ_¹+´)ÿ1ßÂ^ײǨ¬·@åóê’nõ.H?}7•6“r:
Ú1-æñ./‹™,é™&`×GžŸ·i'_b[-ê]Ž¥G3v{c/¬ ×1æH°:#ùíêB_XeJ·öBgz´M·ž‹}ÑŽQ{¾´ÜðR)å‚‚^Q¾-ѼûFÎÔHíµV<øÚkñâÓèÖ„Wš¶—’ôÝè)"Úã*ûd³\6ŸŠR··Æ +?e°nì×»2g+b4ôD¡ +2R÷¹&…YX¹s•ux`dfµ¡U¡½¥îÇá‘2äÞ…|]W/²?~!d®ÈÒ$$%btìe‰Bÿ騥µpgÛâD¾bÞ{@côÐÈ£›ü=þAÐ*w¸¢U6ÐMm\Ãèí¦‰5«ü›Áä"ÿeb±Û=ÂÞ¼K+.+³0Ÿw´ŠåùJ„¦ô°wa2½Ù ŠÔ£6\“H_‘-%Q˜{mo : +|J[(‚Œ×@'*€»GÎÀ&*mCEØÚÉÙpilovàqÎ!€-Ze€-sög«‘ÃŽb#Ã.9šÔ„Yš–Š—ÒO.^¥@䬉!\Îã~+Áìå6[î‹ŒÄØŠ>ŠÑÑmV"23Ä$ŸqEjÉÝ ŠRÚàýÓ൫“¯³7¸
à
ÔoC2aúðf¤oÃÁ.Þ*Ñ +\_•]f9ŸöOšÙꯥA¿P0hlÖ¹±H³qT‚Ô¼H*ÇðyïN´ïEoEæVèÇɉ'¯`›s„FN‹2C³ËÓÌ" +ØÞŒ +*quQZ¯MO"WŒªÝ{"à{üqZFÜ{ßœ`W¶ü“,vã|2¸Ï9þ nô ÜXT¥ÕjŒµrB€Ú›:yzÕE¯ +ÔÓàÔÕ@j³VjËÜ~Á„ºmÝk½ÚÌÝâé7O°1î†l}| óÅ>µínws_ëðî¸Zë²Í_`³
7ÐÜkëƒ>áÖêh%¯ô9¸¼™db ¸Ü«Äš³4(.¦&–ïÙþÈë翇®þ~ÿÔS´-ŸÚ(Ncã#{ ͵´›KSm+6šÑõ!Z0V
2žY†RnÛ°Åyâ +·ocy”A†çlˆÜ,…Àeÿqe«ôÈ6uÓê2}Al¯R’se–TjÉëh«Y• +ãFCíïê·&Õ#P'Pë链ۮÔýÏekïœèÁ«.ê6Ï¥CÝlãmtŸ6<Ys +Õ°v]¯LâùT…senž*”,>e/T +‰z±$å;…C%Û/¨çÔÈ:7Šs+*›|;Ú:åáÁþ@sØd˘Ë(ÙI>•È2ÛM5Ã2›ôªÑÑÒVO¥½à’ü%tÕ‰OžÎýÑì=Y_ˆ.Zoûº—ê0,ŸËsc{-Ylåmu²›sTþÖŠ²ùw’¯Æ•6ŠLƒŽG²“lTϦ¹d23·â™·‹çÓ–’,§¶õ\3%ßjƒd52]çrIÜ& +•h§GZ^¸îÍ^Ü4«ÎÉú +'ß<½nÝðÚטÆÙb ZìªÜÐÕ¡˜éçoMaœÓÑÍÄ$'YfžË.3Ü&¿K‹‡Ô)Uò› yhšhÒ¥ £3h‡ëÃ,>Ñ6LožšJ¼—± زë†8ÉÄ&¥C)Æœ¸n”»%V+2‡#^4á—öÑúÕ
X
feÌ7¿nÇô%¹F *Ù]mœ‹ÝØjøѶݼ@%Ë̇¥´¸”“Õ (AdQKDˆ~3®3Í®>4›C\7§±Ia´Š1ûþ6:¯LQî<½F¬àÌnØáRôʆCBù)É^‰™L:p[Nkˆ—ŸàÝh½JIÓtÿl aWíà‚Øö=ªk›šÌòÕd|‹wÓÆÎf|h’7¸”^<éd5%"øIׇÙz<–öÆN^EME¬ +û
uH«“Æͧz @\™wg…Ç•©o5º¢>+m;^Ïaøú¼,<q¡-•qŽ÷|Y„{¨Õ +è;3¹FéBõ\5.ùQ*ÞK¦ÔXZœKKKûÂ>˜÷Ïã¸MZ +¥ßª[ôù¼XÞ/o‡õ°ì£*1é0¤$?;ÎyÏË}ÙôB-±]ÆbDÉí>P¡W_¢™v¦IÞˆmžÂÕ+O©(7ï.Ô{©E°l
ÞHö(3}´®÷›Æ"ÜÖ™xÍŒƒ‰pð*{_05]•n +Ƈµd/Òa¾I~Oö6rAÜtZluNŒÈ¦$ôª¦*èþF˜6{ ÞrܤGÖ¸´ž²óÑ`Çš)•ô¬æã€ÇÊE-WôÌ™íÎ+0;°Û+ñ§j”Þ–r çû³“ÍÕšPJó&7¿„ת»¢ˆé¼×O× ÜWhBg©&ª{oÐnÄHÈXzÌ¿å‡Cß7ŒˆoáÒåñržhŸcÍÁHby=k¯Ïðx;fÙEWÆg÷ÓGk‚Òþ½ªP—îɤšzgL…ˆ‘‡ +‰F„ +†©ªçÒ µöXÉcC6S:H2´+ìÝàZ{¾x¯—áµ|DQV$KÉ*°MÁ6üh\pÓüqÆ.ÒË/šKϺ¶Ø{ +ÚñÂìZ'ˆ)§Y’Q<G×j…Ö´~”º’ö"=”ÖÉÎqhû–d´„ˆþm.ñN"E1a€y²á"ˆœ?Q +ýh!ì¨9FÝ +é±Àî´sÒ³zv)ßøF0ªŒÓþôÅ +ø¶Å#ºèMTWK.‹QöHöH¹ÐÀãCúÄÐcº6—Ô•—6Tó?Q¡f"»P £³½@¢&«ñu4A…Q OÁü§çó6Ë‚í;‘IŒÝ.{»G)ú!,+]ô´,C˜Õ=Î4ÓÄÎÞ´z½P4»ÕÁ*|ºéÀ@¹æÔźöù¶ÑÉÊ?‰Ã[6_¿ŒåÊv©Ð¹Õ!»Þl‡DË©>1ˆÖ§D¬b°·¿÷ñ±ABxÊ£qz×’±YaÙXÒÂ8l×Cóã€æ‹å‰Žk±RÔd‹‚¨¨Žb¥Êl·°þ&˜]a9Õ˜ Lb¸'à˜¥Ï6áÀÖê DV*ªyþ—kÛ‘OìgSïÉNžíÐ;£c¡KbT¢‰k·:ž +À-œ!Å6›„gX¶TÜÚ°¼bœBè +Mˆh~¹Œ ¢%˜È6Øï %ÈoÏ}ø]Óp•7#йHVau°º£}ðÁêèÅsv”ȹS8ëm’J*¸õr ªË¢1o
=„9k“l²ªl &)]·MŒÏÆ÷`§§ÌU742ƒ”0¨b›·Æ-t%ßl{ŒpkT\t/ȶvÑR@Ù +Á‡)š…ýJ² 5ê»4j$hÏ<AÉÎK ݇Î6ŒE ¡h1¨.’¶3
@ÑÌn¤jÉNÛ/ħ³Ý-´K¨„çZºÛi*¥xÊ”n–I™õrË2C0'u{¤¢Bg‚ÛÃ6ºÚÂMÔ+ß:Èö÷‘R™ ¾xlWÇ)Ûƒ…ýÅ! +]"$û
¹A +D¶D
ØEç +áà= +8•™h)B¡¨¥®5ÏþØý@_\”Ú«ž!’צÆn™¦¯«Ã™$Š¶›ÁÞ…ÕCº4‡]¨ÚŽ¡c¯O;&w +Û0ÊüâmØ0Y +DµZcý¡ÿpWec‚gøZ ¢§« €]¹'ÇÝý]Þ/v©b—%>l®;ú3SÃÛœ
_Óßþ›¿:Á·…°MzHë¡“x7Ò6¦ +¨àšÊ~1ü‚°usÛš¬ËŽº¹¸Øé“3Çʼn%YÛ3Åsk—=Üœ”ÛÑfÚÎ6rwµ\W±ùfu6æ‡U`:¿,ÛìZÂù±ˆíÀ=áÀt>†&–ݤñ6e4>б¼Hãª(ÝlnfX÷8ÿu²›¾k¨Ë7±TÞ§Ö,²ã*µÙ!~ö7¾e›ii¬ÍRg&âäƒmb9ãm|›Ëã•9ª2skx6çåa`=¯ÚÒ¶Ûï©«QkÂëÙ%Ï]fè':&ÕVÚ«lØj‹ëäé~—zVa·qîq~7tõW>ùî›'÷.ªMñZ,oƹ7Šfš½"ƒ‰Ø=NGê´¹Üò…]¿ç‹ŸzC-tëNÂ*òãÊ,™n¯’"ÛgœÐ*qŒÔ<Xœ=ÆšêŽ5Šš¨ßê‰\=|«×k½ÈfT&è}•œ´˜Jš]š¶lz#s7ÑÀuBWòÉnã\:t"v–Æ°áÃýؾû@»“`P7Õ'¸Ù<˜—b£!kõ[egûŠi¯¦ƒ©-4:šVÉAQ™$¦› +3™Ê¦gz)s‹=\²„+YÜ–h¡p¨IZA½f+wJùvÜ3þ@óð9ÅÌ;QkˆpÑͻꆮî'\su¿(+{Q2.‘×úÂ=:ôlÅÈ:\»QÕaxÂT&úP(›tÃW²¸j XòZ‘¡lÅvôd¥¬FÀÌZ[ÉÊ·#¥rî[µ\/Þhç°q£oLoš˜óMf^Ø^2ܧҖßTR¥ÐÄHz©nÒOÔã<‘".üºÚ¦õŸì&Ch¯âíÒ¡÷¼«&¥/‹%ßÔÃb›¿5›‡\/–9›C#™ä4ûGêÕ,—á¶YoÚò¥|©m-áO•´l(yhÙ«`?œ5>P{ µr‰Û¨UNDèY;Þ3‰y[Ç/º!Í<±I51×ô4:oëô=᪑Uß˸-¼‡×º©àZöTIc•ºš¿5–Í6HÙ~r6íaÚéUaÒN•Ôj/Y
Úm=w¬™DKëD;aíðÄ:Åuyc‹2¬B×ÉM‡‰¥åWûr”»,‚+tI„·=o!ìÃn¨š<l‚ç¹A8ìh.wƒWݸ՟àfØm•è^ëi±c™›zg¶î”î=Ñ@šiçSÛò.eœÛ…L¢×²qAM\-ó±´wYŠÎËËZ”;-í¾D¬À²oûQ¸ÙLÃ>äº +Uã§mð<¾ž‚4n™D„˜ õŠ•€†öi¿¡…šê¤e»aéHV=説̇ÅåOh¯#}©¥bv_Ê‹žz)ø¯—yWŠŒÉG²ÉC=§'Úú8 œèÎK‡@ÄÒ°Öƒ!?îI<p›ù’v6bàUÐÒz–^Ö°^÷ËfçÇIþÒìU™Ûp«˜‘íÕ·P¤ÏK>¹”ž²M4¥jþº•ª-(ùeOݽçBS+F½UºÎÅ +u>çQ³?Ï,É|;yÜG¬D¤Eb“ü\Œ¬j^“ñ Ö÷ƒT†
ÀKÕ°-ÊûÉÃ^TÓþ½Oe.WM1C§Âèî³tÈðyq:+—’lA:̤šTÍÆ»Þóª0õ½£½Ø®˜QË>¡×DR‚jwìµW!G–?Heê1?ë-ç'$eµÑíÕLë´ìËv
¨á±ôdÒ#…ÈDùc< +¥L—Q’›uYÅꔽNª‘(Ù$‘%Ó%úyyDÄ©%ß*{|4ÙB8ÍÂ6=%|(–©uŒ
+E47íŒÐÜ, PÁön"…ëx‰nuÙ%íž#‘’¥ÌVñ3np|B +»è"Ç¡–>ªjc2ŸRÖ]¯_ºø÷´¨Æ¶ŸÌÍ¥ÒÂSLg:´¶ïÖI4}+ã£k©ˆ'[¥2N‡ul;Xf~ÛÊY¡K!|Bs׎ +›€lÒ©RôlòˆtÊàJàr‚UPã¡S×o@u~ P=Î`Щ?S +7@s9àË”¢iîHž¢ò^ž…Â}¼¥Ñ·VV‘ºFHjÖ$^Ä$™ÍóÎ#o×#ªµ×‰DäV²L0æÎÍã^{-† +k½aC£l +óR3D†u®˜mVXƒN×b +„O-pCÊ;΀ÉiÀÔ°`z˜‘ùB¸C„r8¦¦¬%¸QÀqO¾c¿ýȑήBðÂ×õÏׂo¿oǤ0Ró c,Kq¾0G#¸¤ÚcGS¹‚qa³€lÖ”…ÈR„_ƒ+ÝHV³¥ tæ&(ЄoàŠÐ <k;>?l’€«³&€k…€ë!À
*`ëÖpÆlÈKV/ÃFLsžÒÒ5¥'ݳçc(R
vÁ¾§4ò›–TñU¥[R‚#Ç€ŠÍ8NèO”©z{²ŸŠqOT¡^¸Z†¾+ N—*hAD(ïÀSc àÝö +à}ж/ÐÊ8–ˆ‡èØ°8Ú6§À&‚«# +„B·C’H'Ò'ÛˆëÜQóõ>ãçÀ ^ ûa ³ÉÀ†ó sykCÑnÈü@töÙ0‹t*Ûp±‹¬ú@Gi
ã€ýY[Ú´·-_²¨¹¬2{p%“½X"Ÿ÷«Zô°j +áˆ0 Ü\»ÊÁï›JÜòyÒg0We£PÞ£q~’¾ ¾fgr0Ø•él#Ú?Õ)ÀZê`ÅØÊá`‹õ£
g`¥ +"Ë«å@ì"éËé„÷ÆÄ +Ó.,’YäUL$Pk¢ aoIEíÖî¤
¦Úè åä™,°¡…"ºñ +8{ÈUcê •
¦}¿ræ8Ê›ÊZN•‰‘í]$„v/²Ší©ÌS!ˆHø—žtxí´<e +®P·ÿZÌ8»<\:..ª +÷kËîùnEà»e@¡´PhÁïÄ9cLñÉg (ªUª}Úÿ@°‘f¡ã8¯#…]¹ŽeÃÃ
Afæ4Ù«n"tpp¬0Ç
¼d‹€ÄyŽaÂ$ê/zu3<•A=a·ÝwÂ˪ZyuGIzt镵ýC&Z[]{ºLRçøJâ#‘”>‹·3à˜>dë˜Åæd¡¢çWÁN£N
7%¼<§Êù)RÕÎ R;Øâm¬,o¥[Z°ƒO#Ånç˜öhø²:²ÜÄS¦£öâ6ÎvÒ2 `™ÕA§û+ÏÛþ}Ó'ìG“pòÝÇÛ§’Þ_Ô†ü„ôéƒwðokí}§·ÿ´Ö>ÐwzûOkí}§·ÿ©Ö>п:Úþ'Zû@ÿêhûŸhíý«£í/ +/&¼—¸½–b
f~'üØJõ¥ZßQë>«5‚¤Y sþÜ…27\·lÍöVÅ[BÊÈ:!UB%%Q«Tµ¶¿œ§
±=»6ÍX‹kM‰\äu´\èFMqÐk‰è¡Úí©¡\i¶ª«ÙñJµ§T_[Ïâ‹Î»×ÅÊX©V·¶.É…ÙfuÒoŽÊù}2BFôT<A£éðH7Ž ¶³5>ÐOpÁ‹I[¥8äÆ_ÿÿUÏñA)L3ti'8#r"±‡YRç[ÕÞæ²Î]:•HÛ£hâÚ¨Ê-»{™Ÿ]1‘ìè%¯®Ë#©C'ù2=1ŠbNƒÎÍù—ûl7ÀÔBÛ ðPF{ÜnSQÍ4b¦¼Ð7Ë$”à +~ñ5Ò>FOO×ri.Æ™P¤}vF°ÇÜc¡¼˜‘ò–Éã½ÂdsØÙÃxB”£þºZiÞ2éê©lÖå8·lX7ç³½Ü6ŽÇT§ß˜4zP¸¾°tú@•QHnÓ¼>æ9¸<I¯7ã~;y´;x#¶<SÙÒZž‡FÎÐ>mÂìiøyÒ³E +³åqTéƒ}×|Þ-NéÔÖh²„ +]cçÆ›;g"1=Ð$6JH|¸Fgè&GUm5µwK¥àò\…utPH-.qhÍ["·VrðTÄœíÿ@m-·--;:̓†¡ÑáN|ž‰)óÜ*Á5
+¯dFÙ:×óåWÖ®_Â;¶Ò"kV]Ω[{<v[E—Låɾ=‰Ó@
Ñì°_£Õ`nM<¡bçu†âê®"T-{PÑ«Úãq_žAÌZUÎû¦=(s“—¸l·¼’¶Æ +Ç®”ižÂønd}}®oçgW‹oõøŸÖâúNÿi-ÚcìÿÓZtrêÿ¦ÇßÚþøK·”o)ßR¾¥|Kù–ò-å[Ê·”o)ßR¾¥|Kù–ò-å[Ê·”o)ÿ¾”úpó×ÊÒ_•Âì·bn0øoÕØ·”o)ßR¾¥<@NÈ•¿RNº8»…]ÚÀÿªx
ȏ
ý×;»L¼Hâä_êË©:éïœUÛÿm}Kù–ò-å[Ê6Uæaz•"ŒÆ óV ÿ• “†°4Ð*“%Þl—Xµœ±])ÐøOJÖJR¦|#&åiœø3{_!cO©È&äÁþkÕ‡BË#_3Ç÷ò-å[Ê·”‚ªµ|´eú_X¼
]cð!FüY9f7ä¯#¿Gí³ÇÕ—N(¡ˆˆW8Ú~}vE¤€‹ÀþGJxé¹Ú_ÀÎÆœ¨:Ò´vÒã›±+ú ã^|ËL< ¦h>×Û‡ÃÊô:¸™íËwBß"‡D"S
+¸?ú_V»â«©€“µû¯ß|ÝüºžÊøú–ò-å¿XÊvÆ'÷νxá?{I–›‡`[i£üŸ–¤Üfñ€ +ØÕ Hê«;2Z©v5Q +gÍ0o&Z?mÌu#BumJ»ÜßbLKù–òÌ|m½ÿJÊ&)Ïýì ~3w~©¬SÝD„Ù§dušøWeòÙÕð,9>tm~U35g’Ç5-/EÖ«b{`Úž®¼o÷öšNAö¬ÆÎ(ô¶>i9Æ’ +ïÅ”#Îé_×¼õ[ivy)Qo¦£À‚±½VAßÜcÂèùþÍ)f0±¸›PóÝßÝ„žvÎm;Ñ×·ä1zG +£7]~Þc}+ÖfçîÍfŸ®ßÅ©Ù,ÄB^çq¸ ¿.ùëúø^u1ýþ}?ÓNæªd¦ŽUF’ÕãkËHÐi“ý
”Î…Þô©Q 3Ÿjž=xòÚ`s‹~þŠü”눎¢3^H›Û9О_þ~£ÿ[Ê?KŠ/˦×j{¦×~ït ±Â>2ÙZ¹üEIfÙ$k>É™Á‹¯VŒL.³e½´;¡¢?9¡g›×N6⩾=ï¸þ¨ö®ªB°9¤\Ÿ£óvÂÌ +xPûáOŽ±1ÿ²ûË SÇáá±HùÕ))¢-×`XÃúýVgòÝ(p«pz餪‡•ç…¨“a>ÐœGùiú%¢]šV*w'®ñÆ~Sàó‡õ쟹€S$}~á?!‘®ë¾Ñá5ófä”õäݽa™ô½¯_¸n€-ŽûÔÉåá•r¨yõr8QT5‚ÆöÅÝ-;íÿ4^àŸ9¾¥ü?”´†Œ¥¢ÁÁø‹å”
KYÖwȵìÁ;ú*Èi¡mkíŒ`'Ýþ3×â”ÈðìÐz™>ü}–èÜ®_]ïÛ\’ç[òndçþ]å¹ÄS9óL4+/T ·
£ßݾšÃJký˜¡oØxÆq|ìùYÕøç}K‡Å*9’ÁÜKt¸rëîîý–âöŽâ~‘ùnëCЕxÕ.@^ʉ—Mk<Ü¡~Qg5zíÓ¹W-¿qR™”ÓŸ±<ÈÇ^5
öxÎyÔ—ò¾Rxåªû7@Hú›j÷N—[¹.˜îY +~O{‘ÊÙ^E~FMŸþÆ£N¨mÉP?œNëÅASÌ´öôב“ÿ=3ð[Š+eOÀh2?oàoXáÓí”_AòÑ÷~Úžò›8f_)ùÊwÉcÞŽÔn|0Ö}¤¾ÝB‹ÎK¦3q#–†?ÇL¸W.Ý}lÔ{9ñÀš‰»9 +-ë1ÝßxÔÞ©6–{Ï|{³ÑÝw!WëŽÞC™wž +Ö^ûQxXËw£„¡f:ë(ñ±½—}P¤´t
1.¾!šùÏÇ7€ñfÿ‰ VŽcîÂá·ÝwŸìøJ÷ÍÈ Ý»ó4z»²¯¤¹ží„ÂÊ ´üj.Ô^«ÞòÍ:žÜeú·ûÂŒûÿCŠ²1¯òt=MÕEî:—@hÉ á!þ6Ü`îçÕÉ}dbÝ·K°<™ +ûî3ñ-“ã^Òe=!¦³/í-nsSwÝâ¡—‰Ì1ËËc’¿Š®uþI†[ûž™_תÐLÿ%ô(ÍäÃ7ã¯QJÅÚê1Åß,]hŸëÁ—æ/n£Gùvpà:Àö£^úqK`÷já×ð‰Z-w÷MÞ½1¥ÌÜuyäXN~~S/÷MC\Dߌ†òñPÞ›”ŒþÃXåMùåHV໵çâ…W¾°JÒwÓ|—›€GEÿ]´øÅUz9ÇF;»šow*âTQžÊaè8Œ{C·nazË<û™ÿû3ì[ŠmF‚\§³BÇšÖ7ÞrÁ6øÊh"Ü°¶Œ3dôÔ»Š†©JÜgÞèÝßM¦9u9žO8¸çó‘…C1Ó¿¯/“š×‰ðf}¤ÖvÏñéó"·çŸ?¦@Dú™š±k‚ãXû1_³›”2ŒSíkì:]ú¼ûRbŸsâ®÷~Ì^¬ˆxÕõG?º¿µãñ" +¸k
M>ò¬é0.
ÜN½÷²#òiùá{ Òëù„Jvö°ˆë—¿5˜C!Å.àm˜žö«v±ž‚8£™ËëNje¶¿W}x³/Êl»6
º?rÿÁýò”ªoâïˆåñpöní‰èû€bq:îÉî7¬6ú÷¸ ÿ†9ü¿/…ÙÌz™õW©‡˜Ó´7۵—Þ)ë|‡¾/'êñ*¡‡’ª;`ÄùP…—~I$és—x๚~‚ï,-ÒYÊ;+ƒ‡ÀkwmêLëO¸7ŸçÉ=®û> +ñëK +è‡Ï½fø({Ý¥“i·gÊ}êÓ¹ýèÙ1´ù¶v_Å_V8òe·»Ûûß›¤L”k
9Üz¦QB~,äNf¸5ö¿Žš`ó÷~x_H•ƒjß¼Ú}XVãwÍjG~õ\g +Ä}år|^Ú¤»yàøÛ]†:©,"]¦{6¶6θ+LaD>/zîN:gà?‹k¥ÂhÉm +‚³Þù<‹æȽ\5 ó‹‘ázûÅŒ[GVûŒ;¡MíµÍÞòóe›¾J¸“X"[¯g+~lÛ£ïõÔ:¬ýpj^©Âr¯p÷1¼ç¹ï÷
1†t"$úLU/t֨ݫ¤à_Ûñø¹P4GKìëÔÑÒ?Š?/#’êM‹>|¢ð¶èYÝéû²¦Ö ÇÙùl²)ä™ÉZüØr.ùzY>à§A'¯+—ÊòðÊ¿ÝmkûVÑñxÂÛæúe—›™š“»%'Ökzz|{ØÛc5c(ÑW^ཫ© ‡ÿ1˜ú ߊ4D~}UŠ¤ÿ=Šø6_ÿñR¶Ó¦
*ÞÚº=<–ņè/¼¸¨ÒÙƒ} r@ +BX&–¹SáeÌ’û˜;^‚Š«-áΫO%{zöIÃû'œ[<W‰6 +‡‡+óì8½®ÀMwJÉóÓ–úyÿ.ž>·rŸÍ™~üBU¨ÅŒËô:g4~g¯iÅ’g‘Ö‹ÖU9ÚûŠhà—Wö1‘ßDœ€kw>·Éî™ûá +úð— +cAÕŠ…}õ}{î5Ø/ÇÊ>ýá·(¹Ãï»6ÌÝD +ÍÅ—£l?Ì¡27Þd|ÏÛ§ÉL¾ðË.^(}|¼[f5è“x[Ù~ +vªc3ù™c¯N«»‡ßCå—Õ¡wã½[XhY}Síøn™>ñ9Öù"—ÁŠ©fEÛœV‹¼€M:ùmhðž?^¨ÜIäÊõ@k3%ÛñÃHÿ–òÿ¯”S@ïéý“çÔü@›ÙåuUÕò™h%´½œF¥¥Iß/ˆÏìsG*<OAðN“ÙYêPþmƒ¼"÷ï¤xÙÿŽS÷3Ðós,Òi<?6÷ 7Ç™ª¹»Ïäµú}¡GßÈvut7Æ4î¹å“c´/=|&HM<W¬äPê±D|sȉîàFŒ–_-ð£g]¯»ûÊY“g$ô%“Þ 7bÛZ4»‡‰žÍÛ·¼äš"ï4
'’Ë~%9åÃï×|juèó;½pN‘ƒ³§p—4Çoòÿ]Çé·”o)ÿ!)ç€/2=3ê@=mºOý@óùÈ@Jwð~͘´cÙÌíÒÿbÆZ:Î7éF‚õ ß@þ|k\Üe×ö¼«O_8voGÚ_•t¯ÉÛ—f¥|ž¾_r2¸Ð+çjw?ëͲsVj@å/·øË“G¼"3ÿµ-TN¨iu°¶WÏ“ñöí9õˆCÌOd²‰Õà‹dœjµ'³>þŠ ñ
»©Oøqé«\¢Ð@Åø\f¿JNõ_3f¿¥|Kù¿%…ôfV• ˜ÅÉþzJõC§•¿Æ¾{àlÛÅ”Ž¦¤˜¢ÎÌPo6bBýTûõ<{u¹ nrüøØYxcá¦ó®OFú^‚¹i!Z~,]_£—«Œ°Þ^Å êIL&xJNÀ6šð³§t,€|ñó‹°Tµ2/>¸÷ÂîM>NFòƒ»û‰œ\Ë÷¦Ù‹òL[B“úD½»³?E#$ýÔ¾Ÿ}¸¥‰1[‹FÚvñ¯ß_ƒo/rýk‡
»þíGÛ·”o)ÿ%R˜ê$5-‰ÝNv[hS¹N¼Û-…ïÚ} ¥V_…zÙàÑŸgW)¥‚ðfhzM«Á±Âÿiï;·FšDŸ€w0Aä rÎBdLN6`0ØÆ`2»ûíûì·»•…$D˜{÷ìùfÎx0’«º««+uUWS ×VÊ
¾¬¨ï¤Sÿ-—!¿ÊÿMÛHºًšdg£ïS«¹$(ÐÑà +þ½Ç—Á ëøåM>‹nÛ*âf!~¥c-hZ{^|Yf]S°¾îjÜì°/2ë`ýšÁ ‚¥²Å˜¾—³‡ýG°.Å·€>ÌnǶXwþñÌô#6±ÁÀ„«.É[ hl ™•%à Y³;¯àJ¸¦1#©µ
K +˜gà)Öíã¶D"g÷Éï8
§E翵1ZIvÀ +qSº¹ÞYùï5¦ þL¾`óÇêL—ã‰pæù$Õ_³•}Û-PV#ñ•6: I’‹öMÈÜÍl)ÿLô”^}ø|%Ð4¼¿¶%šßæìíÏ8 b£6vß`KÄ^ô4ݲ§6Ùå²1‡SÓÂWÚD¹\p±œß‚žÂ¹|[7Ôëíj +ˬK¸®Õ·?ƒ¡äÒêKug®`½PmºgãNÚkÔr‹aœu糕ü” +¶€/WØYq¬"æYj.²ÄŠS3E;‡!Gœ›3|ùUŠ¨¢ªÁXÆEÓdi‚H +G“åþ=!¥×…Ûw<Ž¬j‚ãZô2¤DZb«DÙÖYáA1)5ÑUKjÞù‘¬>¤#;!% +Añ½O¿f3uhÃÐÖÕŸ€0À…V˜p¦<c#ýì4ÓÁ÷R“(¬R +/Ÿ¶ÂÛ½™ÊäѬK"P:ÎæÜ‘ŠÔ~W¬Šjtä&K‡ó9vûí’põ£)†ž¦…ëg1þ€ô<ÒƒËqZ‚öâ~¨æ=™¿×Ðbãæ˼ž½C@êæ1g³¾x‹ã;ÈJƒ~JEzûeô«0ûNEú$%±)ß=<Ó`HcÇìƒ@ÁæénúMÜüôÓ'X¿a”Xì^+Èœè+>=üÎC”ÛU‡>Ø]WÚ@Ñ%
¹ ¾_mâKƒåìÛê9íO¥ßrŸõµEd.Ñ‘ÉoljX<ºjÝt»’‚Û0ì¸|Ìœ:8Âçt½éE–ãÐXñž¬Ï¼¡ÔQÜ8¦bÊ{‡œD\b¤žÄþ,ò·6µO~.¸pÎéÐl÷ítºvú;°ÄÀköÒ¼
[DܳJÑÃ`õ+rÍ‘Yÿá_€_VÃ@"ò:HEwa÷åÔè÷຀7ƒ¡ÆÖ*ûz%2ŸÏö—¯šÈì"°J·‰©;³éC¸Ç¾_¦"¯5Z0ž„¹à"t>ÿì¿MCTÓÍvjÉúcv¯S›’~>[Ëv“¬u õK0¶ü|#ŠŸÍzÆ×óœ.~¬×å7Hs)Y ÞÉmÓ‹èŒVDˆôñù‚‘3Ì¡¥•…¬>ìk±…L÷³° äîXnæî„–75²PÛhh‘½±æg{ÏOŸ(yIÏü)7ËXÍ,RµyßÒí¶Q+`–d‘[¡£T4[T(!Ìüú.à =™M€‰˜*ö#ìm?3¤F^¥sít0Üüû>2`’\ö¨¦ÐU²86ö6kž/¬ÝM®R±Ä®tåzƒ%@,2+Ó©”ñ
tBüÝgR5SÚÌ@1;ß!–U±ÜÜ–¿ï©-Ô†%ëÓõ{õÀE†9wH[#-ƒú)]¸ç<¤ñrmNÌÿÂvþ™™Hù×Õ7')!¼ýøñóv*{zA \[mûK|…Kkbf]báÊÇ!F¦× +‡Šø¬><Ê‹Ô²®w¢\Ž¹(SÍÓh9ÈœûËLFÒM³ =3ümW N¦™ +9«Ÿ2 SQB;9ªÎןkû–´Zì`ù0àJ¤Öè°1ºvé#¸@©ÃŸ)?‘ôQ»Žsà/xŒ¯¶wó/Ò\·ù‹Œxµñ®‡ÖéÖl÷Ey‹ž€î;ó§ýò,¥Ta·gv%§_–ž76
F¯õtëÜñ\*ÿ(þ-@meþÀ×ò£Š…å-€×H¬ (VWôÒËÍØ¡ðÖõ™›mŽ+ïµ½QnúQÔeþlFž‚fxŒg}$k}°ÒKÞ¹½oß]Ì*”¯ XÄ‚uLîbÑÈH|þL}ÒxÞ-2¾sx:ÀÓæùäè•?sHPgnùý§ˆâ¼q"Jf3 A‹Ô¹Qz=ýC¦Qîd,jÌ¥3°Æ/׊”K›±ýò=Ý°N€†üüsóÅqé|‹où˜h?ÐsÊg;RÏÎäÇØóyÌ˦ù¬_dxâîsŠ¾zÊ¡o&¾Œ;}àT>ÅÉÉÚé`YŽíß`5ŽÖ`dlkÁó ›x]¼–¾iÚg2mÃî^Ù•å'˜6 +ùÁd÷d$»}d(Ï.'Œî õC£¦Oˆèò>ƒ†ÄDG=
ó òS,ЩÏ]`§vì$æ6¿¹Ñ´%íΟõòÎèî¿ÒH%X%Áf_<F‡ßâk;²¡Ð‘düšõ™Œ·ógçnœ.-!nõa +€)÷yÖC¯o;ìµ—¢äÄÞˆæÂÂiç¶"µ-„ó‘ýþ!MðÔ;$2`ȧ·û£fw¼£å@Ï?æ@¤4íV¹ùÜè°«¤)‘…?Ö-RÏà$J6½Ÿy}2ä>gö9Ì"èy’ô·:#\ø ´×b‚H÷(˜ŠŽçt;œ +Š×œŽ¦¢£N&¸)¶ÝÄè{äþ~kr1À€¼¨ÏÁþ[ÆÀ„¦hŽ4æ+;.É©5†»@iùh;CONëȸ~6ó©!üÝ;€±Ì™õ"ãÎ.µo&°_lÖÏ=¤ÞýÚ¬Õ
|‚?0÷;³<Œœbn¯ ƒŸ +'HÞ£³åÂ\Ž_kq:ï^vÓÍbM½}qÕ¶§æâs{˜/æÔW`ªÅð$·™3Â/ÝîIfñ½Ü´ÿubži\ð{þ7’Éw¶„ÿ#|Ø™wÙªv NO^øÉã‹5"^öAƒý„D½Éö)Ìÿüª oƧ`Q ö©Ço~´¦]Ǫµ{È´ÓÚ«}¿Öþóû¦µOæ@¥~:SZ‹7ÿ§5ÞÌðiÞé„$Ék¾£×Ð@”þHà…R3„2IˆÅ!sÎÙª•0úµ-æ)±Ò`N×Ñ_´óñ\/³h¦\ÇïXdT¯†‰!‘ü‰&Ý!gÆògleGÅ5‘{û°MÝÖtp–ÒÒ ‘^¤»œf{§V€³ÂàüÞà¬[Zsáh‡¿è©Åw˜Ú©CC894µèù»ë#ô{1wx?„Ò…À¶fÕ
úù9G$etX®®c˜kŸS‹lySË:¬MßÑS pk +ÍLþ„© ÁÑ.¾r<¢Çöá}h/â._ËÌŸÆd‘=†ÈS×3Þ®ŒøÜèFD}E@ö0Â1 +°PhëîwŸÎ±J!=šìU‡Rÿyj䤑ú}œÄUÈcsÕ‘ó€!Ø´Ô¤âd»GÈ
è±z+!EœL¡ýÀóúaGiÞ‘2gξ$yߧiÝd‘×=çŠÀ€g9áª#O©‘Z.WÕùæ‹W³6€Ô·#c¤)ÂB£õ¯_u'9¤ÓÃ؈ue’Ÿ)à•DzL¼@ÂÈ̵àÛ¾
¶ÒHc:óÑ4¤ÎnÌbN¾8¤Œ¿ªá\Bi@ohuQi¤¾Á'G…¦äLuäèlå궤æŠçíçš,RÓâ;õ*3SëpÜÕ
©!EÉÝ,¤5Li« +iî}E +f:LN®¼åüZþ\ûcp¥o$‘V‡¥,ÒÔj’MsH9i‰Ð¾YðVdq”FZv¼—çûIik’ŒÊ"Õ`µ÷B)#3×·,Þ5õCÒH+úsë{6I"íVÜ[)X!ÚNÞ•_Ë!-ãÝ7%ƒ4iéŽ{i)¤`]zÉ™Uv®“IúÔ“AúîÃG¯m‹4ÒÚë÷oŸˆYR
&žëèälÈ"ý«ÛŒ}9¤$>iìcRH5ØQ÷š²ÞÒǬ$s¿Ž€ÒPAÛ«á +éTwÊ7Mòpî½ù R +ü¥Ò«>jŸÿ& +7 µ„O/9¾0v¦o¹„ÔSH±JÌÜÍÆz)™¿ÎX{†Ã2#ó´`Ÿdíwé§Õ4ù·x-Å.Ÿ×š?¿ÇIÎ&ó´ÿûç=º<2Oÿö[Çjâž +yl0ªšS‡Ì_¬o,w_>컌4”¤Ø´ï‰ëìARú¯ýyÒ½.¤Ÿ~á£ÓoQ'ùë5æ]³¶–”¦ØáŸ4¼©†ÙŸ:/Ÿz2Å×Fæ>½B‡ôä神î)Ÿb@HEÌV,¦ýüëóGÜbMõ¬Sîibg‰íÐ'(ÑvHD%ÂÃ/’^ÀÁ«g‘k†4r%(çpÓ¾¦µukíD³§µwÇ-è\¶µæ7Ë~ªs•Õ:Ê` õWAêÏñí +Œ¦•¢¥%‡ÛU
mL¸+Þ?#wׯ‹TïZÆg`áérÀÙq åæAç1ÅëÚÙ1lùº0¡÷š5^ú£Ü™¡¹âÄ5©Ïò.TGŽ²Hq2xè}ˆ–A +ã7:‘A:+ Íký"¤@‹qhóùÀEê
ôûÀùAš_É;â#õµ|ò6RMÞŸz©-ºîÔdú ·í¤‘úR
& ð7.‹ù2H7 <‡™Ò)ò’dæªËãY¤È‘E +푇ÌE@`»R²hªÛl
„}¢¢vž_¬¾ô›¯ú…ˆº×¸VÅ{À;OVO^ÀY"DÄŠ'4æF»Ù–ÙkïƒOYhÿaÊÒ;>ο6«vÄÉU»Ç”Äy:Bä³7ù»©nâÑô–¥Ç0mfP8)±3ÏÛbÁÐg\?ƒ?ôÀÊGÀìE0ž7ÂmÍü’ð/‚z‰Dãý +×€Ý3/Ñ憌—ü†~@f8ô¸^Ù¶ÄÌ[àÒŽ*€!wêà#þœ²ƒb‡tT’k©ØÑDOˆE*êI½r¾Ntô£É÷É/ç%Œ»\Íðb~èÇ´O(¯Ÿ7ÙmW¥ÖOÃ_¼„½JsåIÎ/j½}ýhiy±‚ùÖæ6bÉ3C¾»ºò:»«`vüË´ïËÒ]ƒÝÂY[÷Ô`*\Û9—tú•4å]ÏÚ9ùÙ‘áä;ˆ%=ûF,zrïÙ·TtÔ{×jŒsîÜè˜gx¥ ˜/51—àÚÜûë‰Ï£A²Ý¼ñƒ®´ËAŠ™seÁ-¹+-²Só¢åŠÔÔ„»LNijïzÅ©!B©=$'-Ç9|1t®ÎÊbD³’fö}'T^¡äW=!Â)àsv +ø_ÔFÎVØ–p¡ +¢ ¶oLuU·((“Ás×ÏÖ¿Yd/Í°3ÏÞ“†KÒ“´gÌ´ùÅØ`Å”–dÚ‰–üuç ¨–Ä¢ñ˜¤ðÉCÂ2Š‰¶,FÞêÎay¢@®^*&uëç|–UKLÊ~’µžÀàgZebÁù¹DCÒ`—ƒ +ëdÅFÝ~ôòº2ÅíÚëÊ#Í ›œMŠ6¿`eM:ëÇ›ZÁ«¬f†Ø +‘¡)
S“q¡)]F¦4‘Õ!1¥€×_Û/×™ª¬t&E[ÂÊj‹(îÊBE(Ã2–°pjOØ/eNªås ih…êï>Ov0/7!Áêß4!±ÊS +±
(¶;Þ +g¯ŠQ_¥ÍËd©ÉØ“ƒRèú¦Ì¼~YJò&« +SS¤–œji@åß¡˜.g?;ʪ%dÁ^ä®)ΠΥ¿¾¹`Þ…³dú+eßHm¶-°a +Õ¢"¡Žë$=º#B2POœÈròì¨*ù–&cbd.”+%ƒås„‹”ü¯
ªÊFi{Ñ Î` ’Â%ðñ«åÌMCÞÌÒ‚•q
¦u„“‡kè”+èxZì¡:›b\—gÔÐÉ ¥+èø6Ì#5tÊt\µàc5t<¤t¼³×‡jè”+èÕ‚ÔÐ)WÐ)TÞTC§\A'ª¼»†N¹‚Ž«®}¬†N¹‚Ž=I|°†N¹‚NX‘zO
0!YZ_ùÔ;n/ß®“¯ÀJIæžñ´˜šAÁ!®•½Ågf‘q.•EðF\ËsQbªÏ¢8Ìu:ÉÕ +XÓõ+¹äTVçu:™äsÉeé$u&þFˆýeª©UežM4¤ëg| +Àìjç§\3rrNíüPö`ÔùÑùCåðnŸ»™èòa°ëûåÖ¢9)³Y–]…¹£ûáѨ_NJ´ +«kUçDŽs7Í¡½/68T•)O
šî׳n®»©HѨ(vS1VžçB±›R*[÷z•0 +WÝ1'ïTVhIû4Â,à±æmÈ„àÅ.Èk>¹Jñ0ÕõbJ7¹½äM%¦”L–Kh’JgÙêg”uA*&¨ œ Ñl¢0 ’ÉóüµZõå0’…ýLµàu`o'esâ–:¾Ë«î°ŽïªíUÝrA+…!’%™!½6ÙúuƒRÈg—Nbý$ëø×t®êõ£#˜ò5ïj÷gþzMŒž!¹ìÊ-òãç'祊dîŸ$SžC±+3·QLþ(äŠ %Ú“~ƒèÒÐæEõÓ3lÙtI¢bˆÝì² ®•-^ +œ¶›úqE:Ÿ’¼½MÛ–w:{¡]?]áŽOf 3ªtõe +êP#
íµl5Æò®üŒšÄdÇ\oÂó
4‚Æû·üœ{ÃFÞ•oÊ•™ZÜ";5
¦ŽCwåGî
c2‡ášKÝvs]dêÔ¥uq®îžÜu‘—ëêT”È•Ž +÷Uäduië +8ÖØ£^G&—áæŒçŽTØ[.^UƳø(.a»<[g¨Ú†`!n«ˆ’¼q:û¼‹€!¨®öV9&»
sïù”iµÖ8 ÷n4[Ç´ø3¶!„r™ «÷Šà\߆Wïî à<zÕ…Ù„rq•¦=LxÁŒÄ]S`¸4œŸMÂß]5¥C¦"µ÷œŠÔ÷ýÓ*R¨çU¤¾ïŸR‘êÖ©)º¹b.LuUû3*R5rójE*€óx%)ª©ª¾PDq4’×@ÓŸŠú5ÑQ¸4U&ÉH`È·aÄl¿Ø†ó•…P›mûüR8y-öÌR¸ï‚¾³NnW>·îI~å•R¸¿RFp=V +'Ž*ôÿ‘R8~+ºäìiwP*ÕVßx#<¬«$HHæŠoVª«»ÿB5ñºžÖx‚b®1|؆™…—Ëž%©ÄY§KERlê]3ä•ÌÊÖÕ 9B˜u£6•Ž +v°3Ÿ[)j«-ƒ4 ‡MµG²vÅ +»W)lª-‹6Õþæv¥¸Ë¢PìV÷{xH…`¨Õ4‹T\açÿ
2×2ug… +;9uÊ"ÅÉr¬.[aÐc¾ñ!Wì6Q*v3DH…ýøú¡ÒP{]V§rH› +ä•» +vx.×!…«j ®+`>Ñ•xgkÜ¥üÀB½éÍâ* âÖHZÅ{¶Èö”ãT'âäOlŠ²G8‘–¬RνtÊ‚Èê·Ïˆˆk×þËèk©>VqW5«kúÅØÁ*s®äK{²WòIE9WÏê$'eýÒgIOì$'Õväž(ÜÅ¥gW«!å"½uã¿r¸0¯O¡•¼¯ïYü¤”<Á¤f(;¿«ÍF¤ç'ÎO&TdN«’Š>#j‰~-eZõ~Ù^»/_*£Ypœ†îj5L-ÝCqÉj:)?€…{R5TÀ‹=šNjj›'ŸQM'• +éä³ëTçZ—&ÿ¢ŒŽÉýUÌT¹Ú N!GmU$Ì#ů<Ú <Ø;l)ÕÕÿ.ë‰`¯4ªîº¢ƒåjNù•TÞzf6TëyÙP-•ÙPW2Ãë*¡ÔT>Zî< +A¹=ÖÔ"8Ê*O£ŽÊ¨U@pn¯e—’ènÁ;°‹k%.(ßÅÅZúÞ[!°¬rñ +Ͼ»bóC`U5<ÝuIJv]~V…‹%I¥B`Y8žÅr\Ù®ËjB°úéÒt¿½2¥»½½A¡öíiaÔúá µ¯4R[ùµ>â0=†.î)¾«t +ELœ›T”1©,bê‹ÜvþÉû6 +S+1ñ)¦Ê{WQ11;E¼¢_)£“ +ÍÙÃ!éƨ"½v28 †ä Ms‡Tºh—²çg6›q•agkÇ(l-]VNi0}g·~“.ËißäëáBHÏJ‚z8[ôó•W„9Y؇
‹i·rçúJExs—,RÀÉd;ÓàÇ·…¥iü*11Ò¥6wŽ° r%îñY¤âÒ4_ÿ§•©üÓ™eKÓ4Øáüá–/óŢòçzëù¼5¥ü}aíߟ|Á!NnÛmY¤ÆÊâg.…Ì ](•á5úòHsµ·¼,yQóBN¿ˆçÚ¸XU°5iôèÍç•ïE5˜ª7}ïuïYêÔ{´š¬$³;˜Kž×bÕ)'æÄ‘”¶ÃE
„Öªíò~¹ºq{KvŽR³k©0â‰|õÏ^4¤‹.fj»|©NĤNyJ›nM’’{RjPùò h™ÊtRNº©*í¦Ô*…0îŒR®*M=?mUdi©Éí!”S6UÌõ,à naN¥!]di]œ%©.¼%KKq¿Èäi!ÁEæÒÏ ++ç «‹Î_Ïp%Æ9Ññå=1ØÛo“ïý”{Ú¹õ8÷„S0µ÷ÇãcãÜÃq-ªŠs÷ð‘µrd™Ÿµ +ðîKh9] « +5˜ºì:aA— +©¨d︻« +Pm
ú+Yr¨¨”?US¨¶õ‘•« +Mù$£pOoÊwQ3ò4å{¸¥ª¦|¼º$¥AU|ïr¶sGÝÝPOéë'ͤLW¿G+¹žv7”ª¾~êî†z´¯]FøøÝPŠ}ýÔß
õH_?þZ=ãn(é¾~Êá2©úÊ{úúÉÕ$Tq²Ú¾~bƒ]ØÕïâ–æºü¾~wWÙÜÔ×O1æPFUÏÏ è*tõ»¡¥b_?µqËÇúúñªî$¹Ýîêëw[†ê½}ý”»úIäÂÝÕ×Oy÷j$pnï맬èÐ\žÐ×O± +Ì!ò_î.wWîê'ˆó_·[eûúݘ}g_?å®~ôãS_€«ÜïáV¶tW?5}ÔôõSsbõx_?å4·Ë[hîëë§ì©‰rïîëw¹£ù]ý”ë^Õ÷õS³.÷õS4–¹8ŒbÂõâj_?µUiõõ”‚]tõ“´-ïèëwïÞ¿¯Ÿ£Ñ]ýžÑïú-*ûñÝU÷ ´ÇžÑ×ϦØÕyIOè맜؊º2=¡¯ŸB¬ + oÐú¢°"Lk~³œµ—©êôVÂæ•ÊñpðÓZë÷¡ár`£·Wõ§ýÛñ§èÚž§¦Â"¶&ßC¶x²h0mšlºtƒq bhu·ilµiUL‹Ÿ#Ъì'ÁÕ¼òZ}Ô~Ê‹V8\{/ì»-÷®üÕúi,×¼«zîNòód’µY~þß׿º-úµ³
S§Ö2›¯A«ÁtÛÅօᆟ¨eXùìÚ¶ª9±7üUð9¶!‡d¤®µŽòU'óº¶E?})œÄ“ œl÷H<¯ßÖðükíçpX&‡óOÂt4Ùk38q-]i™ØÃL•x¨ö—D‹ÊÞð\789¿KzÜõº”íôº êÒÄñDÉt…Œ§ãŸ\Hª‹ )³o"R¹ˆ‰µvûZ?ÃþÚjÚ^l“ŸéùÃi°±~ÝŠ®3X½•/™>ZŸ/l¬lli¨õžs+Æ_À6ò¨#‹ía9rÁÎ&P-¯ánÊò·Ï¶DV¡9AG[3ÜÔø]eù”HMãÖãËõ2ûnÊu²¶°oæÊä<…ø®ZJ}uÚµt!ðQ³…ýñ$64çÙQI_@3õd¶µá¥n(ÚÓ3ó°cgÒ\(ݹq$–]N]n¸8›ÜçjÆ]ý•Ã3)Ìí¸kºw@o€ø·@aÆ·+o²£s¢ÃF²ëMt®5îòû,è@±Ôü±¡_ÁvnîÁ¯)õë踰£O^C,öAN,oeükœúNE+Úw™?L;¾ù`@ÉÏ{”Åfì#;ÿAÇ=g8ù¾ã_ìœ÷Àa(þ0jH10Ww¾¢›²ßÚx¯çÇÎOöƒÿ`Ááw.Z%øk8,XúsüÕCAž±©c@4lÔK³ÞÓÑp°Ç +þÈhí²Fýj‰Õ"‹‰›Z[Cg„O[ZGÚ›€?æ€Ïûåp°kíÚÔÜÝKN^Ôã6ÈÉuÏAîÜÃ7ƒì&M妹Uj³w}¤º¦æ ÝŽþš‰â[ ”nͺT,I:Y+lÀ¢þÞ®lkŸðRhU Í.IãàëïSÛÂa@Nì}úõ;VI· Ÿøj›È:jG&Ùmbñ¡ ¨n 8N +=>µ˜Ä—q§x³ÄLüs"š.ÐÈ +Þ +Á†6)}ÓôÙkg¼™7ÐG*ÍT$·XfVfs#W¨/Ý©}Ú•&ŠË#ÐHîí®ùˆ%#͵+MN_!ý÷ÐJ+R[ƒ)Ð;w…„u¶ÄÙ¨¹J7Mpò-SL\=£Á;ºo˜ºš‰'£ #_¼{y#(ß×V£V“>¦µïw(F+Ð(ƒŽž-`¤€¤µfìZGÈ1ž¸À8ÀáëIÊBà]~rëfmu°úª6û#b¦» +Ì^ûÜš•Ütjræ†sÝ}ûo
°í(-'3p³V‹Ù` +‰HöÄl´xS¬ÔPà7ÓŸŸeO¶ _™üFFõj( +Æ°9Šÿ\0u
æØ8Bk…ÈÀè£eñNäóñ*Þ=š8Ò/ªVú +®Ëúõv×`OƒÉbfÎ’T¯ù]›KƒÝ´½îœ®Œ{€Ç¤¦«ÀcRÛë9vÃöºss)ð˜ÔöºssQv~æ“Ä‘Ÿhz`H¯¦µ
Í)mí#µöɼ5Á³ÀŒàÕà¹I÷^µ–¯}>8™,ZG)<à‚Ïý±Vð^Ÿm—2n 5þÜ8Ž’+‡+Êq~ÄðÖ¦{=Õ;}ä§Ä)¤&V_1ø'†Éˆ¸9yú«1Ø»Ãþ|{úîøØM=q9[þylj2Þ«²+ñÆ`%ܧŠT|ŒJ7º+>¶ÙÈvÒ×G. Öƒ²¾Š”§Bet_ßç&sv©}³¨U2”z£š,=Ê‚Í°Û>«Û´8e‚£…²l£kE9WÝÀO½·¶±Eå´Pyã7›É¦õ=ÝîüŽUzI蕵Sñ8¥®ÃVÇmT
/â·49Ydz=ýU±»Ñ'*wR1éºÓ½KJ¼k°xáѲ£[ÿÉ…çEHþÁ…GËõË?ºðhÙaÏútá™SžváѲßuÆwËÂs{ÿŸ\x´ì0‡ä]x´ì0ÿ´…§
ûSÒ&J™ænl“Hšf³ó©ƒz+¹wü?[…l®5tg*~^]’GXHg¶ s‘Ž³Å[¹9c +ê&•{œ&õdÛ3¿"}[ßT˜ÄyVßólPãÐSâÍ +Õ%Q ¬˜/ïal3Ç•`.÷à¸RÌÎ öþ–/ñÑš±mç6Â÷,ó¡…ì{#Ñ{*yLaV’ò˜"SËç>Ý·ã-j%Çc— x<v×4ø<vç4äxLr‰G¡B#kMÄ{ƒƒç8°Š$O#«¥„•ãJµckd« +Ù§<>W2!¡‘VÃÊideÁ%[<l}T#[é0;ûëè)ñt¥ÕkˆdË”‡¶ø]¸hOŽ_jÃ?Ž±ÄªcøÃ$¬§º8»ú/ÐS¥½M/SYUú£+«È‰…*¾šêJHpÙØ‚J‚ƒÜzX é‚…8A¥2•Eõ,rzÑ]jà33x› :¨»—â<5äÑÒå«Ó}H:ˆ:\?_º(ô’†M7¬ïGUMº¢Ñÿ~„¿²… 3]‚™LEY;ã?Õ
‹üh8ûͬCú¤ˆ²îžSµµö©ß‰Èܤ‡ +È Ó,.IâÕqµñƒÎ‹%tâ‘lºcŒ~d‚å]ºÞô +ödÞ¬cTzçòÙgûÚ>~yd2È–¼öt…d#=™ž‹™sŸFŽîh™Ø«˜ú}Üåwš8ï!Ö¨lSä³¹ÈȆ:¬×‰¨øh, jH™¡·@ß«€f¬M“q:ÜÄ¿K®„—êÍ$¾˜E¶¤%ñbsmp‘ÕÃ0Hk¥…Sˆª8‡ Ðçû]´nÑ#ð€ð "hWõ+qb¦ä;pÎ^Åi*ÓÑê΃Écþ§=Ú\$’µ€U~ÝÌ©¨`(M³‰©íƒ¶ +³j}*ö$ø3R) Xºæ%½ÆZ£ÂŒÑ@R N0V«‹ƒÞdÇgîúy?^Ò5Š®ål^ÆK¯ï8¾XeCžÚ°Û EÝŸECJƒÿy)á‚ʽF©èúÙbÀ'D/
‚)å/œ³%=û<fÜöÊÔ`š`ËÙRî‚!5¢¶‡x‡D.€òA+GBÜ•ð™ù¥¥t„ˆß [âs2BW¢$PÜÒm[MH‹
Æ̶¨nØÒÊ ;²°gרÀÑÎìT0 +k´™‚QZèMÁ|r›‘¶Cz.Te=U2éSô@ê¼À¯Y'󇤋>å×·ÛM?¶ðÝÂ>Q%î(BRæ¹Û+6vÇ—ùEîöq-.»øvY®ˆß-¬ +…üYÖïç;f¶~¿Æ¯ßÏûØ2õšu†kNUOÃâPX©¹©ª +MøVAèìÛiÛ ëY?
Á-AíÕ-¥<>q¥j¸èÊúd’AƒýltXØë9¦Gû +îºjÛâð9¨Êza„²]²›‰e+„©ÆÆ„?D—)Â3KŒ=¬ÇÒ¨Ä9=¤ÁMúN·Î†en8¯Ã›ÚnŽ“=£ó8EW +¼„ü¡Ð‹«y^/¯‡å÷rób×D5®tÑíîlæ[ò°X´ÿu"¶Ÿç¿Åæôyq¥[Ùb1ä'ŸÛùâÅŽÖñ#ÈSv møxåLsJ_áüª oƧÄ>Hˆ|Ó®½‡¹Uà‡Ú>´Pߨªtsáh‡¿¨hq"¾»¼.—’RÈ,²ê‰Å!sÎÙª•žH†¡@qø£k°\/³h¦\ÇïJ&†Dò'št‡œËŸ±•×DîíÃ6EJòòf«JøÊNðâ0ÑÕfÇTó¿JðGÖÚ×µ—q,qu/FJŸ¨R!´ÝX;`ŒXTƒQL:5ü½S7w˜âúF‘«~ƒ‰ïA +úD/íìÛöíÔ:NQqƒU¡s{a‹l¸lœÍjÊÝ4Cw™Àì)êÑ·Õÿ~ÞE;ÉY`dÖÐA¸¦1cä{c걜ïW´÷áý…
ú–aê}ã!—3_‰ñ¹ñôæB·jq§Ô§Ü{ÉF}âûôíEß1—zñGþÖÄvl£›+ú¾t¹sEÜׯHQ‚Pyb,{&†ä¢Oèçç Ø(ßìGF¯[3º‡,cYê)×)PÈäpg;:¬lùu·ÿž.´3.™Í÷0Q*”Y+#¢ê[z÷W6æf¤L|„GÎN×RW7R«›GƶpRKèödt÷e—°wü› œdVü¿èâH8RR°y”-¼ÔkHIKé~À¡º¼A >€öÒ)±]UF×ýÁ[Êvôø¤*¢”(ºØ[tœB7 +§m‡Ä«›zÔâÐwèÄÌüj6ÚJ¤cbct¶ZsÐvÉ.¥w“Ï‚fù&6`víY¨DÅÚQœ¼Äu„×3¼ƒ‹šù ukÈýl:BC”Ñ +x¬à ñ‡¦QTÜ2<¦vÇ’MÏ•1.7 à;9;1¾F†7 _g*¥1̾m6Ù10Yn4ˆû6¦ž ‚Ž‡vü§#îT&%ÔÈŠ‚ë3}Lê|&‹I}^Sü_4í“ûÝf* CîlQùd‘Š=~¶¨|²ˆNŸp¶hS<YÞé}ÿÙ¢òÉ"ƒ}ôlQùd‘®/{ølѦx²c}2‡€Â›ž1qƒwþwõPQòîh%ˆ‚Eµç‰lî®Eµç‰T´çÞEµç‰ì‘Eµç‰üýrû‰¢ÚóD†“ï;Q´©<OÔ`œ(ª=OÔ<t¢¨ö<‘»ÏÿžEµç‰LÕ‰bhˆ¢Û=ÉmæüCC
†oZ‹Óy_ðO2‹ïå¦2ý×â q¿Pÿâà_ø3~q{B/¿üâ‡ßVf3z÷Åmy©l4ØÄ•>œˆåçi¹ÝLÿz‰À¯úÕJ§H¼D^¨w'àÝè‹ŒŸ€·Á#<©œ¸_\™ív
Ÿ´ÈÞKî¿vÛÃé…ßÞ¾d[ëïu—Çål½¼f>Ñà/ið_ÿ?5{Í|xÕàN·ÌÃô{á䜸×ÿ²ÒàôtÁ«ÿ¿”À‡_ðÕ¾¸ñ—êËÛ™C0MÛëuúÜÁ—€w|÷Ë÷•Çã»qÏ‹ÛvB~÷KÀ ^rû‚Ô+ÌŸÛïô»ýÆãñ:=¾ ï;'L¿Å +0000000016 00000 n
+0000000173 00000 n
+0000012793 00000 n
+0000000005 00000 f
+0000000007 00000 f
+0000898766 00000 n
+0000000009 00000 f
+0000012844 00000 n
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000018 00000 f
+0000899023 00000 n
+0000899054 00000 n
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000898836 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000898907 00000 n
+0000898938 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000014492 00000 n
+0000014305 00000 n
+0000899139 00000 n
+0000013250 00000 n
+0000407899 00000 n
+0000018031 00000 n
+0000017918 00000 n
+0000013543 00000 n
+0000013744 00000 n
+0000013792 00000 n
+0000014376 00000 n
+0000014407 00000 n
+0000014681 00000 n
+0000014954 00000 n
+0000018066 00000 n
+0000407973 00000 n
+0000408301 00000 n
+0000409331 00000 n
+0000411961 00000 n
+0000477549 00000 n
+0000543137 00000 n
+0000608725 00000 n
+0000674313 00000 n
+0000739901 00000 n
+0000805489 00000 n
+0000871077 00000 n
+0000899164 00000 n
+trailer
<</Size 87/Root 1 0 R/Info 86 0 R/ID[<BF69F81E96544334A8E7D429EFA7300C><365881B1F4BC4D76AB444D64DCC167B3>]>>
startxref
899335
%%EOF
\ No newline at end of file diff --git a/iget_android/app/src/main/res/values-sw600dp/dimens.xml b/iget_android/app/src/main/res/values-sw600dp/dimens.xml new file mode 100644 index 00000000..a125d298 --- /dev/null +++ b/iget_android/app/src/main/res/values-sw600dp/dimens.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <dimen name="default_padding_left">48dp</dimen> + <dimen name="default_padding_right">48dp</dimen> +</resources>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/values-w820dp/dimens.xml b/iget_android/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 00000000..63fc8164 --- /dev/null +++ b/iget_android/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ +<resources> + <!-- Example customization of dimensions originally defined in res/values/dimens.xml + (such as screen margins) for screens with more than 820dp of available width. This + would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> + <dimen name="activity_horizontal_margin">64dp</dimen> +</resources> diff --git a/iget_android/app/src/main/res/values/colors.xml b/iget_android/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..0c82fa3c --- /dev/null +++ b/iget_android/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <item name="ndn_color_fire_bush" type="color">#DB9710</item> + <item name="ndn_color_grenadier" type="color">#C04818</item> + <item name="android_color_gray" type="color">#C6C6C6</item> +</resources>
\ No newline at end of file diff --git a/iget_android/app/src/main/res/values/dimens.xml b/iget_android/app/src/main/res/values/dimens.xml new file mode 100644 index 00000000..5d96952e --- /dev/null +++ b/iget_android/app/src/main/res/values/dimens.xml @@ -0,0 +1,9 @@ +<resources> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> + + <dimen name="default_padding_left">16dp</dimen> + <dimen name="default_padding_right">16dp</dimen> + <dimen name="drawer_width">192dp</dimen> +</resources> diff --git a/iget_android/app/src/main/res/values/strings.xml b/iget_android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..b8ab18c8 --- /dev/null +++ b/iget_android/app/src/main/res/values/strings.xml @@ -0,0 +1,75 @@ +<resources> + <string name="app_name">IGet CCNX</string> + <string name="service_name">NFD Service</string> + <string name="action_settings">Settings</string> + <string name="nfd_stopped">NFD is stopped</string> + <string name="nfd_started">NFD is started</string> + <string name="stopping_nfd">Stopping NFD …</string> + <string name="starting_nfd">Starting NFD …</string> + <string name="reconnect_to_nfd">Reconnecting to NFD Service …</string> + <string name="loading_logger">Loading logger …</string> + <string name="log_settings">Log Settings</string> + <string name="checking_on_nfd">Checking on NFD Service …</string> + <string name="accessibility_open_drawer">Open NFD Navigation Drawer</string> + <string name="accessibility_close_drawer">Close NFD Navigation Drawer</string> + <string name="drawer_item_iget">IGet</string> + <string name="drawer_item_faces">Faces</string> + <string name="drawer_item_routes">Routes</string> + <string name="drawer_item_strategies">Strategies</string> + <string name="drawer_item_logcat">Logcat</string> + <string name="menu_item_delete_setting_item">Delete</string> + <string name="fragment_logcat_general_operations_category">General Actions</string> + <string name="fragment_logcat_tags_n_log_levels">Tags & Log Levels</string> + <string name="logcat_reset_log_level_defaults">Reset Log Level Defaults</string> + <string name="reset_log_level_dialog_title">Select default value for all tags</string> + <string name="route_list_actions_title">Route List Actions</string> + <string name="oops">Oops!</string> + <string name="error_cannot_communicate_with_nfd">Not available, check that NFD is started</string> + <string name="route_list_list_of_routes_title">List of Routes</string> + <string name="route_list_refresh_route_list">Refresh Route List</string> + <string name="route_list_add_route">Add Route</string> + <string name="face_list_actions_title">Face List Actions</string> + <string name="face_list_refresh_face_list">Refresh Face List</string> + <string name="face_list_add_face">Add Face</string> + <string name="face_list_list_of_faces_title">List of Faces</string> + <string name="fragment_face_details_title">Face Details</string> + <string name="menu_item_delete_face_item">Delete</string> + <string name="expire_never">Never</string> + <string name="face_id">Face ID</string> + <string name="local_face_uri">Local FaceURI</string> + <string name="remote_face_uri">Remote FaceURI</string> + <string name="expires_in">Expires in</string> + <string name="face_scope">Face scope</string> + <string name="face_persistency">Face persistency</string> + <string name="link_type">Link type</string> + <string name="in_interests">In interests</string> + <string name="out_interests">Out interests</string> + <string name="in_data">In data</string> + <string name="out_data">Out data</string> + <string name="in_bytes">In bytes</string> + <string name="out_bytes">Out bytes</string> + <string name="in_nacks">In NACKs</string> + <string name="out_nacks">Out NACKs</string> + + <string-array name="face_scopes"> + <item>Non-local</item> + <item>Local</item> + </string-array> + + <string-array name="face_persistency"> + <item>Persistent</item> + <item>On-demand</item> + <item>Permanent</item> + </string-array> + + <string-array name="face_link_types"> + <item>Point-to-point</item> + <item>Multi-access</item> + </string-array> + + <string name="face_add_dialog_create_face">Create face</string> + <string name="route_add_dialog_create_route">Create route</string> + <string name="fragment_route_details_title">Route Details</string> + <string name="fragment_route_details_next_hops">List of next hops</string> + <string name="fragment_route_route_name_title">Route Name</string> +</resources> diff --git a/iget_android/app/src/main/res/values/strings_logcat_settings_activity.xml b/iget_android/app/src/main/res/values/strings_logcat_settings_activity.xml new file mode 100644 index 00000000..47d52218 --- /dev/null +++ b/iget_android/app/src/main/res/values/strings_logcat_settings_activity.xml @@ -0,0 +1,52 @@ +<resources> + + <!-- Strings related to NFD Log Settings --> + + <!-- Log Levels --> + <string-array name="reset_log_level_values"> + <item>Verbose</item> + <item>Debug</item> + <item>Info</item> + <item>Warn</item> + <item>Error</item> + <item>Fatal</item> + <item>Silent</item> + </string-array> + + <!-- Log Level Mapping --> + <!-- + This mapping is used for Logcat arguments and should be in the format of: + <display description>:<logcat priority value> + --> + <string-array name="logcat_log_level_map"> + <item>Verbose:V</item> + <item>Debug:D</item> + <item>Info:I</item> + <item>Warn:W</item> + <item>Error:E</item> + <item>Fatal:F</item> + <item>Silent:S</item> + </string-array> + + <!-- Default lag tags and log levels when no previous settings are found --> + <string-array name="default_log_tags_and_levels"> + <item>CommandValidator:V</item> + <item>FaceManager:V</item> + <item>FaceTable:V</item> + <item>FibManager:V</item> + <item>GeneralConfigSection:V</item> + <item>InternalFace:V</item> + <item>ManagerBase:V</item> + <item>PrivilegeHelper:V</item> + <item>RemoteRegistrator:V</item> + <item>RibManager:V</item> + <item>Strategy:V</item> + <item>StrategyChoice:V</item> + <item>TablesConfigSection:V</item> + <item>TcpChannel:V</item> + <item>TcpFactory:V</item> + <item>TcpLocalFace:V</item> + <item>UdpFactory:V</item> + </string-array> + +</resources> diff --git a/iget_android/app/src/main/res/values/strings_main_activity.xml b/iget_android/app/src/main/res/values/strings_main_activity.xml new file mode 100644 index 00000000..d5115106 --- /dev/null +++ b/iget_android/app/src/main/res/values/strings_main_activity.xml @@ -0,0 +1,71 @@ +<resources> + <!-- General --> + <string name="pref_category_title_general">IGet</string> + <string name="pref_category_title_status">NFD Status</string> + + <string name="version">Version</string> + <string name="uptime">Uptime</string> + <string name="name_tree_entries">NameTree entries</string> + <string name="fib_entries">FIB entries</string> + <string name="pit_entries">PIT Entries</string> + <string name="measurement_entries">Measurement entries</string> + <string name="cs_entries">CS entries</string> + + <string-array name="pref_sync_face_titles"> + <item>localhost</item> + </string-array> + + <string-array name="pref_sync_face_values"> + <item>localhost</item> + </string-array> + + <string name="pref_title_system_settings">System settings</string> + <string name="pref_title_rib_settings">RIB settings</string> + <string name="pref_title_strategy_settings">Strategy settings</string> + <string name="pref_title_Face_settings">Face settings</string> + <string name="pref_title_Face_group">Face Group</string> + <string name="pref_title_FIB_group">FIB Group</string> + <string name="pref_title_RIB_group">RIB Group</string> + <string name="pref_title_Strategy_group">Strategy Group</string> + + <!-- Example settings for Notifications --> + <string name="pref_header_notifications">NFD Face</string> + + <string name="pref_header_face">NFD Face</string> + <string name="pref_header_rib">NFD RIB</string> + <string name="pref_header_fib">NFD FIB</string> + <string name="pref_header_strategy">NFD Strategy</string> + <string name="pref_title_add_uri">Pick uri</string> + + <string-array name="pref_uri_list_titles"> + <item>None</item> + </string-array> + <string-array name="pref_uri_list_values"> + <item>1</item> + </string-array> + + <string-array name="pref_strategy_entries"> + <item>ndn:/localhost/nfd/strategy/best-route</item> + <item>ndn:/localhost/nfd/strategy/broadcast</item> + <item>ndn:/localhost/nfd/strategy/client-control</item> + <item>ndn:/localhost/nfd/strategy/ncc</item> + </string-array> + + <string name="pref_uri_display_name">URI</string> + <string name="pref_default_uri_name">udp4://127.0.0.1:6363</string> + + <string name="pref_route_display_name">Route</string> + <string name="pref_default_route_name">localhost</string> + <string name="pref_cost_display_name">Cost</string> + <string name="pref_default_cost_name">0</string> + <string name="pref_face_display_name">Face Id</string> + <string name="pref_default_face_name">localhost</string> + <string name="pref_prefix_display_name">Prefix</string> + <string name="pref_default_prefix_name">localhost</string> + <string name="pref_strategy_display_name">Strategy</string> + <string name="pref_default_strategy_name">localhost</string> + <string name="pref_addNextHop_display_name">Next Hop</string> + <string name="pref_default_addNextHop_name">localhost</string> + <string name="pref_nfd_dialog_title">URI Selection</string> + <string name="pref_nfd_summary">Select an URI</string> +</resources> diff --git a/iget_android/app/src/main/res/values/styles.xml b/iget_android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..f851cecd --- /dev/null +++ b/iget_android/app/src/main/res/values/styles.xml @@ -0,0 +1,82 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <!-- Customize your theme here. --> + </style> + + <style name="default_dialog_margin"> + <item name="android:layout_marginTop">16dp</item> + <item name="android:layout_marginLeft">4dp</item> + <item name="android:layout_marginRight">4dp</item> + <item name="android:layout_marginBottom">4dp</item> + </style> + + <style name="default_linear_layout_padding"> + <item name="android:paddingLeft">@dimen/default_padding_left</item> + <item name="android:paddingRight">@dimen/default_padding_right</item> + </style> + + <style name="default_custom_white_button"> + <item name="android:gravity">left|center_vertical</item> + <item name="android:background">@drawable/custom_white_button</item> + <item name="android:textColor">@android:color/primary_text_light</item> + <item name="android:textAppearance">?android:textAppearanceSmall</item> + </style> + + <style name="item_title"> + <item name="android:textAppearance">?android:textAppearanceSmall</item> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textColor">@android:color/primary_text_light</item> + </style> + + <style name="item_secondary"> + <item name="android:textAppearance">?android:textAppearanceSmall</item> + <item name="android:textColor">@android:color/secondary_text_dark</item> + </style> + + <style name="two_row_item_title" parent="item_title"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="two_row_item_secondary" parent="item_secondary"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="two_column_item_title" parent="item_title"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="two_column_item_secondary" parent="item_secondary"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">right</item> + <item name="android:layout_gravity">right</item> + </style> + + <style name="main_fragment_linear_layout"> + <item name="android:orientation">horizontal</item> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="main_fragment_list_title"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> + <item name="android:textColor">@android:color/primary_text_light</item> + </style> + + <style name="main_fragment_list_value"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> + <item name="android:gravity">right</item> + <item name="android:textColor">@android:color/secondary_text_dark</item> + <item name="android:layout_gravity">right</item> + </style> +</resources> diff --git a/iget_android/app/src/main/res/xml/pref_face.xml b/iget_android/app/src/main/res/xml/pref_face.xml new file mode 100644 index 00000000..b05ce892 --- /dev/null +++ b/iget_android/app/src/main/res/xml/pref_face.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + <PreferenceCategory + android:key="faces" + android:title="Faces"> + + <Preference android:title="Create face" android:key="create_face" /> + + <PreferenceScreen android:title="List faces" android:key="list"> + <intent android:action="android.intent.action.VIEW" + android:targetPackage="net.named_data.nfd" + android:targetClass="net.named_data.nfd.FaceListActivity" /> + </PreferenceScreen> + + </PreferenceCategory> +</PreferenceScreen> diff --git a/iget_android/app/src/main/res/xml/pref_routes.xml b/iget_android/app/src/main/res/xml/pref_routes.xml new file mode 100644 index 00000000..322f5840 --- /dev/null +++ b/iget_android/app/src/main/res/xml/pref_routes.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + <PreferenceCategory + android:key="routes" + android:title="Routes"> + + <Preference android:title="Create route" android:key="create_route" /> + + <PreferenceScreen android:title="List routes" android:key="list_routes"> + <intent android:action="android.intent.action.VIEW" + android:targetPackage="net.named_data.nfd" + android:targetClass="net.named_data.nfd.RouteListActivity" /> + </PreferenceScreen> + + </PreferenceCategory> +</PreferenceScreen> diff --git a/iget_android/build.gradle b/iget_android/build.gradle new file mode 100644 index 00000000..028f8b23 --- /dev/null +++ b/iget_android/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + maven { + url "https://oss.sonatype.org/content/repositories/snapshots/" + } + } + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'net.named-data.playground:play-publisher:1.2.0-2-SNAPSHOT' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} diff --git a/iget_android/gradle/wrapper/gradle-wrapper.jar b/iget_android/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 00000000..13372aef --- /dev/null +++ b/iget_android/gradle/wrapper/gradle-wrapper.jar diff --git a/iget_android/gradle/wrapper/gradle-wrapper.properties b/iget_android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..25146f8a --- /dev/null +++ b/iget_android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Sep 13 10:38:45 CEST 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/iget_android/gradlew b/iget_android/gradlew new file mode 100755 index 00000000..9d82f789 --- /dev/null +++ b/iget_android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/iget_android/gradlew.bat b/iget_android/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/iget_android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/iget_android/settings.gradle b/iget_android/settings.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/iget_android/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/scripts/compile_androidiget.sh b/scripts/compile_androidiget.sh new file mode 100755 index 00000000..499df54a --- /dev/null +++ b/scripts/compile_androidiget.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +cd iget_android +if [ ! -f local.properties ]; then + echo sdk.dir=${SDK} > local.properties + echo ndk.dir=${NDK} >> local.properties +fi + +if [ "$1" == "DEBUG" ]; then + ./gradlew assembleDebug +else + ./gradlew assembleRelease +fi + +echo "Apks are inside iget_android/app/build/outputs/apk" +cd ..
\ No newline at end of file diff --git a/scripts/compile_androidmetis.sh b/scripts/compile_androidmetis.sh new file mode 100755 index 00000000..2d80653c --- /dev/null +++ b/scripts/compile_androidmetis.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +cd ccnxandroidmetis +if [ ! -f local.properties ]; then + echo sdk.dir=${SDK} > local.properties + echo ndk.dir=${NDK} >> local.properties +fi + +if [ "$1" == "DEBUG" ]; then + ./gradlew assembleDebug +else + ./gradlew assembleRelease +fi + +echo "Apks are inside ccnxandroidmetis/MetisControl/build/outputs/apk/" +cd ..
\ No newline at end of file diff --git a/scripts/init.sh b/scripts/init.sh new file mode 100755 index 00000000..1d547cd8 --- /dev/null +++ b/scripts/init.sh @@ -0,0 +1,192 @@ + ############################################################################# + # Copyright (c) 2017 Cisco and/or its affiliates. + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at: + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + ############################################################################## + +#!/bin/bash + +ABI=$1 +INSTALLATION_DIR=$2 +OS=`echo $OS | tr '[:upper:]' '[:lower:]'` +echo "SDK_PATH ${SDK}" +if [ -z ${SDK_PATH} ]; then + mkdir -p sdk + cd sdk + if [ ! -d sdk ]; then + if [ $OS == darwin ]; then + if [ ! -f android-sdk_r23.0.2-macosx.zip ]; then + wget http://dl.google.com/android/android-sdk_r23.0.2-macosx.zip + fi + unzip -q android-sdk_r23.0.2-macosx.zip + mv android-sdk-macosx sdk + else + if [ ! -f android-sdk_r23.0.2-linux.zip ]; then + wget http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz + fi + tar zxf android-sdk_r23.0.2-linux.tgz + mv android-sdk-linux sdk + fi + mkdir "sdk/licenses" || true + echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "sdk/licenses/android-sdk-license" + echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "sdk/licenses/android-sdk-preview-license" + fi + cd .. +fi + +if [ -z ${NDK_PATH} ]; then + mkdir -p sdk + cd sdk + if [ ! -d ndk-bundle ]; then + if [ ! -f android-ndk-r13b-${OS}-${ARCH}.zip ]; then + wget https://dl.google.com/android/repository/android-ndk-r13b-${OS}-${ARCH}.zip + fi + unzip -q android-ndk-r13b-${OS}-${ARCH}.zip + mv android-ndk-r13b ndk-bundle + fi + cd .. +fi + +if [ -z ${CMAKE_PATH} ]; then + mkdir -p sdk + cd sdk + if [ ! -d cmake ]; then + if [ ! -f cmake-3.6.3155560-${OS}-${ARCH}.zip ]; then + wget https://dl.google.com/android/repository/cmake-3.6.3155560-${OS}-${ARCH}.zip + fi + unzip -q cmake-3.6.3155560-${OS}-${ARCH}.zip -d cmake + fi + cd .. +fi + + + +cd src +if [ ! -d ccnxlibs ]; then + echo "ccnxlibs not found" + git clone -b ccnxlibs/master https://gerrit.fd.io/r/cicn ccnxlibs +fi +if [ ! -d cframework ]; then + echo "cframework not found" + git clone -b cframework/master https://gerrit.fd.io/r/cicn cframework +fi +if [ ! -d sb-forwarder ]; then + echo "sb-forwarder not found" + git clone -b sb-forwarder/master https://gerrit.fd.io/r/cicn sb-forwarder +fi +if [ ! -d libicnet ]; then + echo "libicnet not found" + git clone -b libicnet/master https://gerrit.fd.io/r/cicn libicnet +fi + +cd ../ + +cd external +if [ ! -d crystax-ndk-10.3.2 ]; then + echo "Crystax Directory not found!" + if [ ! -f crystax-ndk-10.3.2-${OS}-${ARCH}.tar.xz ]; then + echo "CrystaX Ndk not found!" + wget https://www.crystax.net/download/crystax-ndk-10.3.2-"${OS}"-${ARCH}.tar.xz + fi + tar xpf crystax-ndk-10.3.2-${OS}-${ARCH}.tar.xz +fi + +if [ ! -d crystax-ndk-10.3.2/sources/openssl/1.0.2k ]; then + echo "OpenSSL Libs not found!" + if [ ! -d openssl-1.0.2k ]; then + echo "OpenSSL Directory not found" + if [ ! -f openssl-1.0.2k.tar.gz ]; then + echo "OpenSSL Archive not found" + wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz + fi + tar -xzf openssl-1.0.2k.tar.gz + fi + ./crystax-ndk-10.3.2/build/tools/build-target-openssl.sh --abis=$ABI openssl-1.0.2k +fi + +mkdir -p ${INSTALLATION_DIR} +mkdir -p ${INSTALLATION_DIR}/include +mkdir -p ${INSTALLATION_DIR}/lib + +echo "Copy libssl and libcrypto in workspace" +if [ ! -d ${INSTALLATION_DIR}/include/openssl ]; then + cp -rf crystax-ndk-10.3.2/sources/openssl/1.0.2k/include/* ${INSTALLATION_DIR}/include/ + cp -f ${INSTALLATION_DIR}/include/openssl/opensslconf_armeabi_v7a.h ${INSTALLATION_DIR}/include/openssl/opensslconf_armeabi.h + cp -f crystax-ndk-10.3.2/sources/openssl/1.0.2k/libs/${ABI}/* ${INSTALLATION_DIR}/lib/ +fi + +echo "Copy libboost in workspace" +if [ ! -d ${INSTALLATION_DIR}/include/boost ]; then + cp -rf crystax-ndk-10.3.2/sources/boost/1.59.0/include/* ${INSTALLATION_DIR}/include/ + cp -f crystax-ndk-10.3.2/sources/boost/1.59.0/libs/${ABI}/gnu-4.9/* ${INSTALLATION_DIR}/lib/ +fi + +echo "Copy libcrystax in workspace" +cp -fv crystax-ndk-10.3.2/sources/crystax/libs/${ABI}/libcrystax.* ${INSTALLATION_DIR}/lib/ + +echo "Create libevent" + +if [ ! -d ${INSTALLATION_DIR}/include/event2 ]; then + if [ ! -d libevent ]; then + git clone https://android.googlesource.com/platform/external/libevent + fi + cd libevent + cp -rf ../libevent_files/* . + ${NDK}/ndk-build NDK_APPLICATION_MK=`pwd`/Application.mk + echo "Copy libevent in workspace" + cp -rf include/event2 ${INSTALLATION_DIR}/include/ + cp -rf android/event2/* ${INSTALLATION_DIR}/include/event2/ + cp -f obj/local/${ABI}/libevent.a ${INSTALLATION_DIR}/lib/ + cd .. +fi + +echo "Create libdash dependencies" + +if [ ! -d ${INSTALLATION_DIR}/include/curl ]; then + if [ ! -d curl ]; then + git clone https://github.com/curl/curl.git + cd curl + export SYSROOT=$NDK/platforms/android-23/arch-arm + export CC="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/${OS}-${ARCH}/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT" + ./buildconf + ./configure --with-sysroot=$SYSROOT --host=arm + mv src/tool_hugehelp.c.cvs src/tool_hugehelp.c + cd .. + fi + cp -r curl/lib libcurl_android/jni/libcurl/ + cp -r curl/src libcurl_android/jni/libcurl/ + cp -r curl/include libcurl_android/jni/libcurl/ + cd libcurl_android + ${NDK}/ndk-build + echo "Copy libcurl in workspace" + cp -rf jni/libcurl/include/curl ${INSTALLATION_DIR}/include/ + cp -f obj/local/${ABI}/libcurl.a ${INSTALLATION_DIR}/lib/ + cd .. +fi + +if [ ! -d ${INSTALLATION_DIR}/include/libxml ]; then + if [ ! -d libxml2 ]; then + git clone git://git.gnome.org/libxml2 + fi + cd libxml2 + + find . -maxdepth 1 -name "*.[c|h]" -exec cp {} ../libxml2_android/jni/libxml2/ \; + cp -rf include/* ../libxml2_android/jni/libxml2/include/ + cd .. + echo `pwd` + cd libxml2_android + ${NDK}/ndk-build + echo "Copy libxml2 in workspace" + cp -rf jni/libxml2/include/* ${INSTALLATION_DIR}/include/ + cp -f obj/local/${ABI}/libxml2.a ${INSTALLATION_DIR}/lib/ + cd .. +fi
\ No newline at end of file diff --git a/src/libdash/Authors.txt b/src/libdash/Authors.txt new file mode 100644 index 00000000..3e02b3d6 --- /dev/null +++ b/src/libdash/Authors.txt @@ -0,0 +1,10 @@ + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Authors: + * Christopher Mueller <christopher.mueller@bitmovin.net> + * Joerg Poecher <joerg.poecher@bitmovin.net> + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + ******************************************************************************
\ No newline at end of file diff --git a/src/libdash/CMakeLists.txt b/src/libdash/CMakeLists.txt new file mode 100644 index 00000000..a873e998 --- /dev/null +++ b/src/libdash/CMakeLists.txt @@ -0,0 +1,187 @@ +cmake_minimum_required(VERSION 3.5) +project(libdash) + + +if(ANDROID_API) + include_directories(${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.9/include) + include_directories(${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include) + option(ANDROID "Build CP api based on ANDROID log lib" ON) + set(LIBXML2_INCLUDE_DIR "$ENV{DISTILLERY_ROOT_DIR}/external/libxml2_android/jni/libxml2/include") + set(LIBXML2_LIBRARIES "$ENV{DISTILLERY_ROOT_DIR}/usr/lib/libxml2.a") + set(CURL_INCLUDE_DIRS "$ENV{DISTILLERY_ROOT_DIR}/external/libcurl_android/jni/libcurl/include") + set(CURL_LIBRARIES "$ENV{DISTILLERY_ROOT_DIR}/usr/lib/libcurl.a") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} ${ANDROID_C_FLAGS} -std=c++11 -Wall -fpermissive -O3") +else () + set(CMAKE_CXX_FLAGS "-std=c++0x -g -DLOG_BUILD") + find_package(LibXml2 REQUIRED) + find_package(ZLIB REQUIRED) + find_package(CURL REQUIRED) +endif (ANDROID_API) +set(DEBUG_BUILD FALSE) +set(HEADER_FILES + include/config.h + include/IAdaptationSet.h + include/IBaseUrl.h + include/IChunk.h + include/IConnection.h + include/IContentComponent.h + include/IDASHManager.h + include/IDASHMetrics.h + include/IDescriptor.h + include/IDownloadableChunk.h + include/IDownloadObserver.h + include/IHTTPTransaction.h + include/IMetrics.h + include/IMPD.h + include/IMPDElement.h + include/IMultipleSegmentBase.h + include/INode.h + include/IPeriod.h + include/IProgramInformation.h + include/IRange.h + include/IRepresentation.h + include/IRepresentationBase.h + include/ISegment.h + include/ISegmentBase.h + include/ISegmentList.h + include/ISegmentTemplate.h + include/ISegmentTimeline.h + include/ISegmentURL.h + include/ISubRepresentation.h + include/ISubset.h + include/ITCPConnection.h + include/IThroughputMeasurement.h + include/ITimeline.h + include/IURLType.h + include/libdash.h) + +set(SOURCE_FILES + include/config.h + include/IAdaptationSet.h + include/IBaseUrl.h + include/IChunk.h + include/IConnection.h + include/IContentComponent.h + include/IDASHManager.h + include/IDASHMetrics.h + include/IDescriptor.h + include/IDownloadableChunk.h + include/IDownloadObserver.h + include/IHTTPTransaction.h + include/IMetrics.h + include/IMPD.h + include/IMPDElement.h + include/IMultipleSegmentBase.h + include/INode.h + include/IPeriod.h + include/IProgramInformation.h + include/IRange.h + include/IRepresentation.h + include/IRepresentationBase.h + include/ISegment.h + include/ISegmentBase.h + include/ISegmentList.h + include/ISegmentTemplate.h + include/ISegmentTimeline.h + include/ISegmentURL.h + include/ISubRepresentation.h + include/ISubset.h + include/ITCPConnection.h + include/IThroughputMeasurement.h + include/ITimeline.h + include/IURLType.h + include/libdash.h + source/helpers/Block.h + source/helpers/BlockStream.cpp + source/helpers/BlockStream.h + source/helpers/Path.cpp + source/helpers/Path.h + source/helpers/String.cpp + source/helpers/String.h + source/helpers/SyncedBlockStream.cpp + source/helpers/SyncedBlockStream.h + source/helpers/Time.cpp + source/helpers/Time.h + source/manager/DASHManager.cpp + source/manager/DASHManager.h + source/metrics/HTTPTransaction.cpp + source/metrics/HTTPTransaction.h + source/metrics/TCPConnection.cpp + source/metrics/TCPConnection.h + source/metrics/ThroughputMeasurement.cpp + source/metrics/ThroughputMeasurement.h + source/mpd/AbstractMPDElement.cpp + source/mpd/AbstractMPDElement.h + source/mpd/AdaptationSet.cpp + source/mpd/AdaptationSet.h + source/mpd/BaseUrl.cpp + source/mpd/BaseUrl.h + source/mpd/ContentComponent.cpp + source/mpd/ContentComponent.h + source/mpd/Descriptor.cpp + source/mpd/Descriptor.h + source/mpd/Metrics.cpp + source/mpd/Metrics.h + source/mpd/MPD.cpp + source/mpd/MPD.h + source/mpd/MultipleSegmentBase.cpp + source/mpd/MultipleSegmentBase.h + source/mpd/Period.cpp + source/mpd/Period.h + source/mpd/ProgramInformation.cpp + source/mpd/ProgramInformation.h + source/mpd/Range.cpp + source/mpd/Range.h + source/mpd/Representation.cpp + source/mpd/Representation.h + source/mpd/RepresentationBase.cpp + source/mpd/RepresentationBase.h + source/mpd/Segment.cpp + source/mpd/Segment.h + source/mpd/SegmentBase.cpp + source/mpd/SegmentBase.h + source/mpd/SegmentList.cpp + source/mpd/SegmentList.h + source/mpd/SegmentTemplate.cpp + source/mpd/SegmentTemplate.h + source/mpd/SegmentTimeline.cpp + source/mpd/SegmentTimeline.h + source/mpd/SegmentURL.cpp + source/mpd/SegmentURL.h + source/mpd/SubRepresentation.cpp + source/mpd/SubRepresentation.h + source/mpd/Subset.cpp + source/mpd/Subset.h + source/mpd/Timeline.cpp + source/mpd/Timeline.h + source/mpd/URLType.cpp + source/mpd/URLType.h + source/network/AbstractChunk.cpp + source/network/AbstractChunk.h + source/network/DownloadStateManager.cpp + source/network/DownloadStateManager.h + source/portable/MultiThreading.cpp + source/portable/MultiThreading.h + source/portable/Networking.h + source/xml/DOMHelper.cpp + source/xml/DOMHelper.h + source/xml/DOMParser.cpp + source/xml/DOMParser.h + source/xml/Node.cpp + source/xml/Node.h + source/dllmain.cpp + source/libdash.cpp + source/targetver.h) + +include_directories(${LIBXML2_INCLUDE_DIR}) +include_directories(${WLIB_INCLUDE_DIRS}) +include_directories(${CURL_INCLUDE_DIRS}) +include_directories(include) + +add_library(dash SHARED ${SOURCE_FILES}) +set_target_properties(dash PROPERTIES LINKER_LANGUAGE CXX) +target_link_libraries(dash ${CURL_LIBRARIES} ${ZLIB_LIBRARIES} ${LIBXML2_LIBRARIES}) +message("libxml ${LIBXML2_LIBRARIES} ${LIBXML2_INCLUDE_DIR}") +install(TARGETS dash DESTINATION ${CMAKE_INSTALL_PREFIX}/lib PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ) +install(FILES ${HEADER_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/libdash) + diff --git a/src/libdash/include/IAdaptationSet.h b/src/libdash/include/IAdaptationSet.h new file mode 100644 index 00000000..eff9c7ec --- /dev/null +++ b/src/libdash/include/IAdaptationSet.h @@ -0,0 +1,367 @@ +/** + * @class dash::mpd::IAdaptationSet + * @brief This interface is needed for accessing the attributes and elements of the <b><tt>AdaptationSet</tt></b> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.3.2, table 5 + * @details Each Period consists of one or more Adaptation Sets. An Adaptation Set is described by an <b><tt>AdaptationSet</tt></b> element. + * <b><tt>AdaptationSet</tt></b> elements are contained in a <b><tt>Period</tt></b> element.\n\n + * An Adaptation Set contains alternate Representations, i.e. only one Representation within an Adaptation Set is expected to be presented at a time. + * All Representations contained in one Adaptation Set represent the same media content components and therefore contain media streams that are considered to be perceptually equivalent.\n\n + * Representations are arranged into Adaptation Sets according to the media content component properties of the media content components present in the Representations, namely + * <ul> + * <li>the language as described by the \c \@lang attribute, + * <li>the media component type described by the \c \@contentType attribute, + * <li>the picture aspect ratio as described by the \c \@par attribute, + * <li>the role property as described by the <b><tt>Role</tt></b> elements, + * <li>the accessibility property as described by the <b><tt>Accessibility</tt></b> elements, + * <li>the viewpoint property as described by the <b><tt>Viewpoint</tt></b> elements, + * <li>the rating property as described by the <b><tt>Rating</tt></b> elements. + * </ul> + * Representations shall appear in the same Adaptation Set if and only if they have identical values for all of these media content component properties for each media content component.\n\n + * The values for the elements <b><tt>Role</tt></b>, <b><tt>Accessibility</tt></b>, <b><tt>Viewpoint</tt></b> and <b><tt>Rating</tt></b> are generally not provided + * within the scope of this part of ISO/IEC 23009. However, a number of simple schemes are defined in section 5.8.5. of <em>ISO/IEC 23009-1, Part 1, 2012</em>.\n\n + * If there exist multiple media content components then the properties of each media content component shall be described by a separate ContentComponent element as defined in 5.5.4. + * The ContentComponent element shares common elements and attributes with the <b><tt>AdaptationSet</tt></b> element. Default values, or values applicable to all media content components, + * may be provided directly in the <b><tt>AdaptationSet</tt></b> element. Attributes present in the <b><tt>AdaptationSet</tt></b> shall not be repeated in the ContentComponent element.\n\n + * The <b><tt>AdaptationSet</tt></b> element may contain default values for elements and attributes associated to the contained Representations. + * The list of possible present elements and attributes that are common to <b><tt>AdaptationSet</tt></b> and <b><tt>Representation</tt></b> (and also <b><tt>SubRepresentation</tt></b>) + * are collected in 5.3.7. Any of the common attributes shall only be present either in the <b><tt>AdaptationSet</tt></b> element or in the <b><tt>Representation</tt></b> element, + * but not in both.\n\n + * The <b><tt>AdaptationSet</tt></b> element also supports the description of ranges for the \c \@bandwidth, \c \@width, \c \@height and \c \@frameRate attributes + * associated to the contained Representations, which provide a summary of all values for all the Representations within this Adaptation Set. + * The Representations contained within an Adaptation Set shall not contain values outside the ranges documented for that Adaptation Set. \n\n + * Adaptation Sets may be further arranged into groups using the \c \@group attribute. The semantics of this grouping is that the media content within one Period is represented by: + * <ol> + * <li>either one Representation from group 0, if present, + * <li>or the combination of at most one Representation from each non-zero group. + * </ol> + * If the <tt><b>AdaptationSet</b>\@group</tt> attribute is not present then all Representations in this Adaptation Set are assigned to a non-zero group specific to this Adaptation Set. + * @see dash::mpd::IDescriptor dash::mpd::IContentComponent dash::mpd::IBaseUrl dash::mpd::ISegmentBase dash::mpd::ISegmentList dash::mpd::ISegmentTemplate dash::mpd::IRepresentation + * dash::mpd::IRepresentationBase + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IADAPTATIONSET_H_ +#define IADAPTATIONSET_H_ + +#include "config.h" + +#include "IDescriptor.h" +#include "IContentComponent.h" +#include "IBaseUrl.h" +#include "ISegmentBase.h" +#include "ISegmentList.h" +#include "ISegmentTemplate.h" +#include "IRepresentation.h" +#include "IRepresentationBase.h" + +namespace dash +{ + namespace mpd + { + class IAdaptationSet : public virtual IRepresentationBase + { + public: + virtual ~IAdaptationSet(){} + + /** + * Returns a reference to a vector of pointers to dash::mpd::IDescriptor objects that specify information about accessibility scheme.\n + * For more details refer to sections 5.8.1 and 5.8.4.3. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetAccessibility () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IDescriptor objects that specify information on role annotation scheme. + * For more details refer to sections 5.8.1 and 5.8.4.2. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetRole () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IDescriptor objects that specify information on rating scheme.\n + * For more details refer to sections 5.8.1 and 5.8.4.4. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetRating () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IDescriptor objects that specify information on viewpoint annotation scheme.\n + * For more details refer to sections 5.8.1 and 5.8.4.5. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetViewpoint () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IContentComponent objects that specifies the properties + * of one media content component contained in this Adaptation Set.\n + * For more details refer to section 5.3.4. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IContentComponent objects + */ + virtual const std::vector<IContentComponent *>& GetContentComponent () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IBaseUrl objects that specify base URLs that can be used for reference resolution and alternative URL selection.\n + * For more details refer to the description in section 5.6. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IBaseUrl objects + */ + virtual const std::vector<IBaseUrl *>& GetBaseURLs () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentBase object that specifies default Segment Base information.\n + * Information in this element is overridden by information in the <tt><b>Representation.SegmentBase</b></tt>, if present.\n + * For more details see section 5.3.9. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentBase object + */ + virtual ISegmentBase* GetSegmentBase () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentList object that specifies default Segment List information.\n + * Information in this element is overridden by information in the <tt><b>Representation.SegmentList</b></tt>, if present.\n + * For more details see section 5.3.9. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentList object + */ + virtual ISegmentList* GetSegmentList () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentTemplate object that specifies default Segment Template information.\n + * Information in this element is overridden by information in the <tt><b>Representation.SegmentTemplate</b></tt>, if present.\n + * For more details see section 5.3.9. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentTemplate object + */ + virtual ISegmentTemplate* GetSegmentTemplate () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IRepresentation objects that specifies a Representation.\n + * At least one Representation element shall be present in each Adaptation Set. The actual element may however be part of a remote element.\n + * For more details refer to section 5.3.5. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IRepresentation objects + */ + virtual const std::vector<IRepresentation *>& GetRepresentation () const = 0; + + /** + * Returns a reference to a string that specifies a reference to external <tt><b>AdaptationSet</b></tt> element. + * @return a reference to a string + */ + virtual const std::string& GetXlinkHref () const = 0; + + /** + * Returns a reference to a string that specifies the processing instructions, which can be either \c \"onLoad\" or \c \"onRequest\". + * @return a reference to a string + */ + virtual const std::string& GetXlinkActuate () const = 0; + + /** + * Returns an unsigned integer that specifies an unique identifier for this Adaptation Set in the scope of the Period. + * The attribute shall be unique in the scope of the containing Period. \n\n + * The attribute shall not be present in a remote element.\n\n + * If not present, no identifier for the Adaptation Set is specified. + * @return an unsigned integer + */ + virtual uint32_t GetId () const = 0; + + /** + * Returns an unsigned integer that specifies an identifier for the group that is unique in the scope of the containing Period.\n + * For details refer to section 5.3.3.1. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return an unsigned integer + */ + virtual uint32_t GetGroup () const = 0; + + /** + * Returns a reference to a string that declares the language code for this Adaptation Set. The syntax and semantics according to IETF RFC 5646 shall be used.\n + * If not present, the language code may be defined for each media component or it may be unknown. + * @return a reference to a string + */ + virtual const std::string& GetLang () const = 0; + + /** + * Returns a reference to a string that specifies the media content component type for this Adaptation Set. + * A value of the top-level Content-type 'type' value as defined in RFC1521, Clause 4 shall be taken.\n + * If not present, the media content component type may be defined for each media component or it may be unknown. + * @return a reference to a string + */ + virtual const std::string& GetContentType () const = 0; + + /** + * Returns a reference to a string that specifies the picture aspect ratio of the video media component type, + * in the form of a string consisting of two integers separated by ':', e.g., \c \"16:9\". When this attribute is present, + * and the attributes \c \@width and \c \@height for the set of Representations are also present, the picture aspect ratio as specified by this attribute shall be the same + * as indicated by the values of \c \@width, \c \@height, and \c \@sar, i.e. it shall express the same ratio as (\c \@width * \em sarx): (\c \@height * \em sary), + * with \em sarx the first number in \c \@sar and \em sary the second number.\n + * If not present, the picture aspect ratio may be defined for each media component or it may be unknown. + * @return a reference to a string + */ + virtual const std::string& GetPar () const = 0; + + /** + * Returns an unsigned integer that specifies the minimum \c \@bandwidth value in all Representations in this Adaptation Set. + * This value has the same units as the \c \@bandwidth attribute. + * @return an unsigned integer + */ + virtual uint32_t GetMinBandwidth () const = 0; + + /** + * Returns an unsigned integer that specifies the maximum \c \@bandwidth value in all Representations in this Adaptation Set. + * This value has the same units as the \c \@bandwidth attribute. + * @return an unsigned integer + */ + virtual uint32_t GetMaxBandwidth () const = 0; + + /** + * Returns an unsigned integer that specifies the minimum \c \@width value in all Representations in this Adaptation Set. + * This value has the same units as the \c \@width attribute. + * @return an unsigned integer + */ + virtual uint32_t GetMinWidth () const = 0; + + /** + * Returns an unsigned integer that specifies the maximum \c \@width value in all Representations in this Adaptation Set. + * This value has the same units as the \c \@width attribute. + * @return an unsigned integer + */ + virtual uint32_t GetMaxWidth () const = 0; + + /** + * Returns an unsigned integer that specifies specifies the minimum \c \@height value in all Representations in this Adaptation Set. + * This value has the same units as the \c \@height attribute. + * @return an unsigned integer + */ + virtual uint32_t GetMinHeight () const = 0; + + /** + * Returns an unsigned integer that specifies specifies the maximum \c \@height value in all Representations in this Adaptation Set. + * This value has the same units as the \c \@height attribute. + * @return an unsigned integer + */ + virtual uint32_t GetMaxHeight () const = 0; + + /** + * Returns a reference to a string that specifies the minimum \c \@framerate value in all Representations in this Adaptation Set. + * This value is encoded in the same format as the \c \@frameRate attribute. + * @return a reference to a string + */ + virtual const std::string& GetMinFramerate () const = 0; + + /** + * Returns a reference to a string that specifies the maximum \c \@framerate value in all Representations in this Adaptation Set. + * This value is encoded in the same format as the \c \@frameRate attribute. + * @return a reference to a string + */ + virtual const std::string& GetMaxFramerate () const = 0; + + /** + * Because of the fact that the type of the attribute \em segmentAlignment is a union of \c xs:unsignedInt and \c xs:boolean this method is needed to determine + * whether its value is of type bool or integer.\n + * If and only if \c 'true' is returned, an invocation of HasSegmentAlignment() is neccessary to retrieve the bool value.\n + * If and only if \c 'false' is returned, an invocation of GetSegmentAlignment() is neccessary to retrieve the integer value. + * @return a bool value + */ + virtual bool SegmentAlignmentIsBoolValue () const = 0; + + /** + * If the return value of SegmentAlignmentIsBoolValue() equals \c 'true' the bool value returned by this method + * specifies whether Segment Alignment is used or not. This is only valid for Adaptation Sets containing Representations with multiple media content components. + * If \c 'true' is returned, this specifies that for any two Representations, + * X and Y, within the same Adaptation Set, the <em>m</em>-th Segment of X and the <em>n</em>-th Segment of Y + * are non-overlapping (as defined in section 4.5.2 of <em>ISO/IEC 23009-1, Part 1, 2012</em>) whenever \em m is not equal to \em n. + * @return a bool value + */ + virtual bool HasSegmentAlignment () const = 0; + + /** + * If the return value of SegmentAlignmentIsBoolValue() equals \c 'false' this specifies that for any two Representations, + * X and Y, within the same Adaptation Set, the <em>m</em>-th Segment of X and the <em>n</em>-th Segment of Y + * are non-overlapping (as defined in section 4.5.2 of <em>ISO/IEC 23009-1, Part 1, 2012</em>) whenever \em m is not equal to \em n.\n\n + * For Adaptation Sets containing Representations with a single media content component, when two <b><tt>AdaptationSet</tt></b> elements within a Period share the same + * integer value for this attribute - <b>which is the return value of this method</b>, then for any two Representations, X and Y, within the union of the two Adaptation Sets, + * the <em>m</em>-th Segment of X and the <em>n</em>-th Segment of Y are non-overlapping (as defined in section 4.5.2 of <em>ISO/IEC 23009-1, Part 1, 2012</em>) + * whenever \em m is not equal to \em n. + * @return an unsigned integer + */ + virtual uint32_t GetSegmentAligment () const = 0; + + /** + * Because of the fact that the type of the attribute \em subsegmentAlignment is a union of \c xs:unsignedInt and \c xs:boolean this method is needed to determine + * whether its value is of type bool or integer.\n + * If and only if \c 'true' is returned, an invocation of HasSubsegmentAlignment() is neccessary to retrieve the bool value.\n + * If and only if \c 'false' is returned, an invocation of GetSubsegmentAlignment() is neccessary to retrieve the integer value. + * @return a bool value + */ + virtual bool SubsegmentAlignmentIsBoolValue () const = 0; + + /** + * If and only if the return value of SubsegmentAlignmentIsBoolValue() equals \c 'true' the bool value returned by this method + * specifies whether Subsegment Alignment is used or not. + * If \c 'true' is returned, the following conditions shall be satisfied: + * <ul> + * <li>Each Media Segment shall be indexed (i.e. either it contains a Segment index or there is an Index Segment providing an index for the Media Segment) + * <li>For any two Representations, X and Y, within the same Adaptation Set, the <em>m</em>-th Subsegment of X and the <em>n</em>-th Subsegment of Y are + * non-overlapping (as defined in section 4.5.2 of <em>ISO/IEC 23009-1, Part 1, 2012</em>) whenever \em m is not equal to \em n. + * </ul> + * @return a bool value + */ + virtual bool HasSubsegmentAlignment () const = 0; + + /** + * If the return value of SubsegmentAlignmentIsBoolValue() equals \c 'false' the following conditions shall be satisfied: + * <ul> + * <li>Each Media Segment shall be indexed (i.e. either it contains a Segment index or there is an Index Segment providing an index for the Media Segment) + * <li>For any two Representations, X and Y, within the same Adaptation Set, the <em>m</em>-th Subsegment of X and the <em>n</em>-th Subsegment of Y are + * non-overlapping (as defined in section 4.5.2 of <em>ISO/IEC 23009-1, Part 1, 2012</em>) whenever \em m is not equal to \em n. + * <li>For Adaptation Sets containing Representations with a single media content component, when two <tt><b>AdaptationSet</b></tt> elements within a Period share + * the same integer value for this attribute - <b>which is the return value of this method</b>, then for any two Representations, X and Y, + * within the union of the two Adaptation Sets, the <em>m</em>-th Subsegment of X and the <em>n</em>-th Subsegment of Y are non-overlapping + * (as defined in section 4.5.2 of <em>ISO/IEC 23009-1, Part 1, 2012</em>) whenever m is not equal to n. + * </ul> + * @return an unsigned integer + */ + virtual uint32_t GetSubsegmentAlignment () const = 0; + + /** + * Returns a unsigned integer that when greater than 0, specifies that each Subsegment with \c SAP_type greater than 0 starts with a SAP of type + * less than or equal to the value of \c \@subsegmentStartsWithSAP. A Subsegment starts with SAP when the Subsegment contains a SAP, + * and for the first SAP, I<sub>SAU</sub> is the index of the first access unit that follows I<sub>SAP</sub> , and I<sub>SAP</sub> is contained in the Subsegment.\n + * The semantics of \c \@subsegmentStartsWithSAP equal to 0 are unspecified. + * @return an unsigned integer + */ + virtual uint8_t GetSubsegmentStartsWithSAP () const = 0; + + /** + * Returns a bool value that when true, the following applies: + * <ul> + * <li>All Representations in the Adaptation Set shall have the same number \em M of Media Segments; + * <li>Let \em R<sub>1</sub> , \em R<sub>2</sub> , ..., \em R<sub>N</sub> be all the Representations within the Adaptation Set. + * <li>Let + * <ul> + * <li><em>S<sub>i,j</sub></em> , for \em j > 0, be the \em j<sup>th</sup> Media Segment in the \em i<sup>th</sup> Representation (i.e., \em R<sub>i</sub> ) + * <li>if present, let <em>S<sub>i,0</sub></em> be the Initialization Segment in the \em i<sup>th</sup> Representation, and + * <li>if present, let \em B<sub>i</sub> be the Bitstream Switching Segment in the \em i<sup>th</sup> Representation. + * </ul> + * <li>The sequence of + * <ul> + * <li>any Initialization Segment, if present, in the Adaptation Set, with, + * <li> if Bitstream Switching Segments are present, \n + * <em> B<sub>i(1)</sub>, S<sub>i(1),1</sub>, B<sub>i(2)</sub>, S<sub>i(2),2</sub>, ..., + * B<sub>i(k)</sub>, S<sub>i(k),k</sub>, ..., B<sub>i(M)</sub>, S<sub>i(M),M</sub> </em> + * <li>else \n + * S<sub>i(1),1</sub>, S<sub>i(2),2</sub>, ..., S<sub>i(k),k</sub>, ..., S<sub>i(M),M</sub>, + * </ul> + * wherein any \em i(k) for all \em k values in the range of 1 to \em M, respectively, is an integer value in the range of 1 to \em N, + * results in a \"conforming Segment sequence\" as defined in section 4.5.3 of <em>ISO/IEC 23009-1, Part 1, 2012</em> + * with the media format as specified in the \c \@mimeType attribute. + * </ul> + * More detailed rules may be defined for specific media formats. + * @return a bool value + */ + virtual bool GetBitstreamSwitching () const = 0; + }; + } +} + +#endif /* IADAPTATIONSET_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IBaseUrl.h b/src/libdash/include/IBaseUrl.h new file mode 100644 index 00000000..206ad14b --- /dev/null +++ b/src/libdash/include/IBaseUrl.h @@ -0,0 +1,69 @@ +/** + * @class dash::mpd::IBaseUrl + * @brief This interface is needed for accessing the attributes and the content of <tt><b>BaseURL</b></tt> elements + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.6 + * @details The BaseURL element may be used to specify one or more common locations for Segments and other resources.\n + * A URL that can be used as Base URL. The content of this element is a URI string as described in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.6.4 + * @see dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IBASEURL_H_ +#define IBASEURL_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "ISegment.h" + +namespace dash +{ + namespace mpd + { + class IBaseUrl : public virtual IMPDElement + { + public: + virtual ~IBaseUrl(){} + + /** + * Returns the reference to a string representing a BaseURL + * @return a reference to a string + */ + virtual const std::string& GetUrl () const = 0; + + /** + * Returns the reference to a string that specifies a relationship between Base URLs such that \c <b>BaseURL</b> elements with the same + * \c \@serviceLocation value are likely to have their URLs resolve to services at a common network location, for example a common Content Delivery Network + * @return a reference to a string + */ + virtual const std::string& GetServiceLocation () const = 0; + + /** + * Returns the reference to a string that represents a byte range. \n + * If present specifies HTTP partial GET requests may alternatively be issued by adding the byte range into a + * regular HTTP-URL based on the value of this attribute and the construction rules in Annex E.2. of <em>ISO/IEC 23009-1, Part 1, 2012</em>.\n + * If not present, HTTP partial GET requests may not be converted into regular GET requests. \n + * \b NOTE: Such alternative requests are expected to not be used unless the DASH application requires this. For more details refer to Annex E. + * @return a reference to a string + */ + virtual const std::string& GetByteRange () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object which represents a media segment that can be downloaded. Should be used for single base urls inside + * a representation. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the media segment + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* ToMediaSegment (const std::vector<IBaseUrl *>& baseurls) const = 0; + }; + } +} + +#endif /* IBASEURL_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IChunk.h b/src/libdash/include/IChunk.h new file mode 100644 index 00000000..76b3314b --- /dev/null +++ b/src/libdash/include/IChunk.h @@ -0,0 +1,88 @@ +/** + * @class dash::network::IChunk + * @brief This interface is needed for accessing the information belonging to a dash::network::IChunk object + * @details Provides specific information of a chunk, e.g., URI, Hostname, Port, Path and optional Range that + * that are needed to download this chunk. + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ICHUNK_H_ +#define ICHUNK_H_ + +#include "config.h" +#include "IHTTPTransaction.h" + +namespace dash +{ + namespace network + { + class IChunk + { + public: + virtual ~IChunk(){} + + /** + * Returns a reference to a string that specifies the absolute URI to this chunk + * @return a reference to a string + */ + virtual std::string& AbsoluteURI () = 0; + + /** + * Returns a reference to a string that specifies the host of this chunk + * @return a reference to a string + */ + virtual std::string& Host () = 0; + + /** + * Returns an unsigned integer representing the port belonging to this chunk + * @return an unsigned integer + */ + virtual size_t Port () = 0; + + /** + * Returns a reference to a string that specifies the path to this chunk + * @return a reference to a string + */ + virtual std::string& Path () = 0; + + /** + * Returns a reference to a string that specifies the byte range belonging to this chunk + * @return a reference to a string + */ + virtual std::string& Range () = 0; + + /** + * Returns an unsigned integer representing the start byte of the byte range that belongs to this chunk + * @return an unsigned integer + */ + virtual size_t StartByte () = 0; + + /** + * Returns an unsigned integer representing the end byte of the byte range that belongs to this chunk + * @return an unsigned integer + */ + virtual size_t EndByte () = 0; + + /** + * Returns a bool value that represents whether this chunk has a byte range or not + * @return a bool value + */ + virtual bool HasByteRange () = 0; + + /** + * Returns the type of a <b>HTTP Request/Response Transaction</b> in <em>ISO/IEC 23009-1, Part 1, 2012</em>, annex D.4.3, Table D.2 + * @return a dash::metrics::HTTPTransactionType + */ + virtual dash::metrics::HTTPTransactionType GetType () = 0; + }; + } +} + +#endif /* ICHUNK_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IConnection.h b/src/libdash/include/IConnection.h new file mode 100644 index 00000000..4150d562 --- /dev/null +++ b/src/libdash/include/IConnection.h @@ -0,0 +1,69 @@ +/** + * @class dash::network::IConnection + * @brief The connection interface can be used to enable the download of segments through external connections. + * @details This interface enables the extension of libdash to download segment through, e.g., SPDY, CCN etc. + * @see dash::network::IChunk + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ICONNECTION_H_ +#define ICONNECTION_H_ + +#include "config.h" + +#include "IChunk.h" +#include "IDASHMetrics.h" + +namespace dash +{ + namespace network + { + class IConnection : public virtual dash::metrics::IDASHMetrics + { + public: + virtual ~IConnection(){} + + /** + * This function should read a block of bytes from the specified chunk. + * @param data pointer to a block of memory + * @param len size of the memory block that can be used by the method + * @param chunk the dash::network::IChunk object from which data should be read + * @return amount of data that has been read + */ + virtual int Read (uint8_t *data, size_t len, IChunk *chunk) = 0; + + /** + * This function should peek a block of bytes from the specified chunk. + * @param data pointer to a block of memory + * @param len size of the memory block that can be used by the method + * @param chunk the dash::network::IChunk object from which data should be peeked + * @return amount of data that has been peeked + */ + virtual int Peek (uint8_t *data, size_t len, IChunk *chunk) = 0; + + /** + * This function should get the average speed of download for the specified chunk. + * It should be called after the whole chunk has been downloaded. + * @return average speed of download in bps. + */ + virtual double GetAverageDownloadingSpeed () = 0; + + /** + * This function should get the time taken for the download of the specified chunk. + * It should be called after the whole chunk has been downloaded. + * @return average time of download in seconds. + */ + virtual double GetDownloadingTime () = 0; + + }; + } +} + +#endif /* ICONNECTION_H_ */ diff --git a/src/libdash/include/IContentComponent.h b/src/libdash/include/IContentComponent.h new file mode 100644 index 00000000..9f3be97f --- /dev/null +++ b/src/libdash/include/IContentComponent.h @@ -0,0 +1,83 @@ +/** + * @class dash::mpd::IContentComponent + * @brief This interface is needed for accessing the attributes and elements of the <b><tt>ContentComponent</tt></b> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.4.2, table 6 + * @details Each Adaptation Set contains one or more media content components. The properties of each media content + * component are described by a <b><tt>ContentComponent</tt></b> element or may be described directly on the <b><tt>AdaptationSet</tt></b> element + * if only one media content component is present in the Adaptation Set. <b><tt>ContentComponent</tt></b> elements are contained in an <b><tt>AdaptationSet</tt></b> element. + * @see dash::mpd::IMPDElement dash::mpd::IDescriptor dash::mpd::IAdaptationSet + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ICONTENTCOMPONENT_H_ +#define ICONTENTCOMPONENT_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "IDescriptor.h" + +namespace dash +{ + namespace mpd + { + class IContentComponent : public virtual IMPDElement + { + public: + virtual ~IContentComponent(){} + + + /** + * @copydoc dash::mpd::IAdaptationSet::GetAccessibility() + */ + virtual const std::vector<IDescriptor *>& GetAccessibility () const = 0; + + /** + * @copydoc dash::mpd::IAdaptationSet::GetRole() + */ + virtual const std::vector<IDescriptor *>& GetRole () const = 0; + + /** + * @copydoc dash::mpd::IAdaptationSet::GetRating() + */ + virtual const std::vector<IDescriptor *>& GetRating () const = 0; + + /** + * @copydoc dash::mpd::IAdaptationSet::GetViewpoint() + */ + virtual const std::vector<IDescriptor *>& GetViewpoint () const = 0; + + /** + * Returns an unsigned integer that specifies an identifier for this media component. + * The attribute shall be unique in the scope of the containing Adaptation Set. + * @return an unsigned integer + */ + virtual uint32_t GetId () const = 0; + + /** + * @copydoc dash::mpd::IAdaptationSet::GetLang() + */ + virtual const std::string& GetLang () const = 0; + + /** + * @copydoc dash::mpd::IAdaptationSet::GetContentType() + */ + virtual const std::string& GetContentType () const = 0; + + /** + * @copydoc dash::mpd::IAdaptationSet::GetPar() + */ + virtual const std::string& GetPar () const = 0; + + }; + } +} + +#endif /* ICONTENTCOMPONENT_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IDASHManager.h b/src/libdash/include/IDASHManager.h new file mode 100644 index 00000000..5e4688fb --- /dev/null +++ b/src/libdash/include/IDASHManager.h @@ -0,0 +1,45 @@ +/** + * @class dash::IDASHManager + * @brief This interface is needed for generating an IMPD object from the information found in a MPD file + * @details By invoking the method Open(char *path) all the information found in the MPD file specified by \em path is mapped to corresponding IMPD objects. + * @see dash::mpd::IMPD + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IDASHMANAGER_H_ +#define IDASHMANAGER_H_ + +#include "config.h" + +#include "IMPD.h" +#include "IConnection.h" + +namespace dash +{ + class IDASHManager + { + public: + virtual ~IDASHManager(){} + + /** + * Returns a pointer to dash::mpd::IMPD object representing the the information found in the MPD file specified by \em path + * @param path A URI to a MPD file + * @return a pointer to an dash::mpd::IMPD object + */ + virtual mpd::IMPD* Open (char *path, std::string mURL = "") = 0; + + /** + * Frees allocated memory and deletes the DashManager + */ + virtual void Delete () = 0; + }; +} + +#endif /* IDASHMANAGER_H_ */ diff --git a/src/libdash/include/IDASHMetrics.h b/src/libdash/include/IDASHMetrics.h new file mode 100644 index 00000000..748af7a5 --- /dev/null +++ b/src/libdash/include/IDASHMetrics.h @@ -0,0 +1,48 @@ +/** + * @class dash::metrics::IDASHMetrics + * @brief The connection interface can be used to retrieve DASH Metrics. + * @details The <em>TCP Connection</em> list and <em>HTTP Request/Response Transactions</em> can be retrieved. \n + * This basically corresponds to the information neeed for <tt>Observation point 1</tt> as defined in <em>ISO/IEC 23009-1, Part 1, 2012</em>, annex D.3.2. + * @see dash::metrics::ITCPConnection dash::metrics::IHTTPConnection + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IDASHMETRICS_H_ +#define IDASHMETRICS_H_ + +#include "config.h" +#include "IHTTPTransaction.h" +#include "ITCPConnection.h" + +namespace dash +{ + namespace metrics + { + class IDASHMetrics + { + public: + virtual ~IDASHMetrics(){} + + /** + * This function returns a list of DASH Metrics as defined in <em>ISO/IEC 23009-1, Part 1, 2012</em>, annex D.4.2. + * @return a list of dash::metrics::ITCPConnection Metrics Objects + */ + virtual const std::vector<ITCPConnection *>& GetTCPConnectionList () const = 0; + + /** + * This function returns a list of DASH Metrics as defined in <em>ISO/IEC 23009-1, Part 1, 2012</em>, annex D.4.3. + * @return a list of dash::metrics::IHTTPConnection Metrics Objets + */ + virtual const std::vector<IHTTPTransaction *>& GetHTTPTransactionList () const = 0; + }; + } +} + +#endif /* IDASHMETRICS_H_ */ diff --git a/src/libdash/include/IDescriptor.h b/src/libdash/include/IDescriptor.h new file mode 100644 index 00000000..3983e41e --- /dev/null +++ b/src/libdash/include/IDescriptor.h @@ -0,0 +1,68 @@ +/** + * @class dash::mpd::IDescriptor + * @brief This interface is needed for accessing the attributes of the <tt><b>Descriptor</b></tt> type as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.8.2, table 21 + * @details The MPD may contain descriptors that make use of a common syntax as defined in this subclause. + * The elements of type \c DescriptorType provide a flexible mechanism for DASH content authors to annotate + * and extend the \c <b>MPD</b>, \c <b>Period</b>, \c <b>AdaptationSet</b> and \c <b>Representation</b> elements.\n + * The descriptor elements are all structured in the same way, namely they contain a \c \@schemeIdUri attribute that provides a URI to identify the scheme and + * an optional attribute \c \@value. The semantics of the element are specific to the scheme employed. The URI identifying the scheme may be a URN or a URL.\n + * In <em>ISO/IEC 23009-1, Part 1, 2012</em>, specific elements for descriptors are defined in section 5.8.4.\n + * The MPD does not provide any specific information on how to use these elements. It is up to the application that employs DASH formats + * to instantiate the description elements with appropriate scheme information. However, this part of ISO/IEC 23009 defines some specific schemes in 5.8.5.\n + * DASH applications that use one of these elements must first define a Scheme Identifier in the form of a URI and must then define the value space + * for the element when that Scheme Identifier is used. The Scheme Identifier appears in the \c \@schemeIdUri attribute. + * In the case that a simple set of enumerated values are required, a text string may be defined for each value and this string must be included + * in the \c \@value attribute. If structured data is required then any extension element or attribute may be defined in a separate namespace.\n + * Two elements of type DescriptorType are equivalent, if the element name, the value of the \c \@schemeIdUri and the value of the \c \@value attribute are equivalent. + * If the \c \@schemeIdUri is a URN, then equivalence shall refer to lexical equivalence as defined in clause 5 of RFC 2141. If the \c \@schemeIdUri is a URL, + * then equivalence shall refer to equality on a character-for-character basis as defined in clause 6.2.1 of RFC3986. + * If the \c \@value attribute is not present, equivalence is determined by the equivalence for \c \@schemeIdUri only. + * Attributes and element in extension namespaces are not used for determining equivalence. + * @see dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IDESCRIPTOR_H_ +#define IDESCRIPTOR_H_ + +#include "config.h" + +#include "IMPDElement.h" + +namespace dash +{ + namespace mpd + { + class IDescriptor : public virtual IMPDElement + { + public: + virtual ~IDescriptor(){} + + /** + * Returns a reference to a string that specifies a URI to identify the scheme. \n + * The semantics of this element are specific to the scheme specified by this attribute. + * The \c \@schemeIdUri may be a URN or URL. When a URL is used, it should also contain a month-date in the form + * mmyyyy; the assignment of the URL must have been authorized by the owner of the domain name in that URL on + * or very close to that date, to avoid problems when domain names change ownership. + * @return a reference to a string + */ + virtual const std::string& GetSchemeIdUri () const = 0; + + /** + * Returns a reference to a string that specifies the value for the descriptor element. \n + * The value space and semantics must be defined by the owners of the scheme identified in the \c \@schemeIdUri attribute. + * @return a reference to a string + */ + virtual const std::string& GetValue () const = 0; + }; + } +} + +#endif /* IDESCRIPTOR_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IDownloadObserver.h b/src/libdash/include/IDownloadObserver.h new file mode 100644 index 00000000..b78198d4 --- /dev/null +++ b/src/libdash/include/IDownloadObserver.h @@ -0,0 +1,58 @@ +/** + * @class dash::network::IDownloadObserver + * @brief This interface is needed for informing the application of the state of the download process. + * @details Informs the application about the download rate and the state of the download. + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IDOWNLOADOBSERVER_H_ +#define IDOWNLOADOBSERVER_H_ + +#include "config.h" + +namespace dash +{ + namespace network + { + enum DownloadState + { + NOT_STARTED = 0, + IN_PROGRESS = 1, + REQUEST_ABORT = 2, + ABORTED = 3, + COMPLETED = 4 + }; + class IDownloadObserver + { + public: + virtual ~IDownloadObserver(){} + + /** + * Informs the dash::network::IDownloadObserver object that the download rate has changed. + * @param bytesDownloaded the number of downloaded bytes + */ + virtual void OnDownloadRateChanged (uint64_t bytesDownloaded) = 0; + + /** + * Informs the dash::network::IDownloadObserver object that the downloading time has changed. + * @param downloadingTime the time taken for the downloading of this segment in seconds + */ + virtual void OnDownloadTimeChanged (double downloadingTime) = 0; + + /** + * Informs the dash::network::IDownloadObserver object that the download state has changed. + * @param state the download state + */ + virtual void OnDownloadStateChanged (DownloadState state) = 0; + }; + } +} + +#endif /* IDOWNLOADOBSERVER_H_ */ diff --git a/src/libdash/include/IDownloadObserver.h.save b/src/libdash/include/IDownloadObserver.h.save new file mode 100644 index 00000000..0d67c852 --- /dev/null +++ b/src/libdash/include/IDownloadObserver.h.save @@ -0,0 +1,58 @@ +/** + * @class dash::network::IDownloadObserver + * @brief This interface is needed for informing the application of the state of the download process. + * @details Informs the application about the download rate and the state of the download. + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IDOWNLOADOBSERVER_H_ +#define IDOWNLOADOBSERVER_H_ + +#include "config.h" + +namespace dash +{ + namespace network + { + enum DownloadState + { + NOT_STARTED = 0, + IN_PROGRESS = 1, + REQUEST_ABORT = 2, + ABORTED = 3, + COMPLETED = 4 + }; + class IDownloadObserver + { + public: + virtual ~IDownloadObserver(){} + + /** + * Informs the dash::network::IDownloadObserver object that the download rate has changed. + * @param bytesDownloaded the number of downloaded bytes + */ + virtual void OnDownloadRateChanged (uint64_t bytesDownloaded) = 0; + + /** + * Informs the dash::network::IDownloadObserver object that the download rate has changed. + * @param bytesDownloaded the number of downloaded bytes + */ + virtual void OnDownloadTimeChanged (double ) = 0; + + /** + * Informs the dash::network::IDownloadObserver object that the download state has changed. + * @param state the download state + */ + virtual void OnDownloadStateChanged (DownloadState state) = 0; + }; + } +} + +#endif /* IDOWNLOADOBSERVER_H_ */ diff --git a/src/libdash/include/IDownloadableChunk.h b/src/libdash/include/IDownloadableChunk.h new file mode 100644 index 00000000..d7189cd2 --- /dev/null +++ b/src/libdash/include/IDownloadableChunk.h @@ -0,0 +1,93 @@ +/** + * @class dash::network::IDownloadableChunk + * @brief This interface is needed for starting and abortinng downloads, reading, peeking and attaching dash::network::IDownloadObservers to this Chunk + * @details Enables the download of media segments with the internal libcurl connection or with external connections that can be passed to this interface + * @see dash::network::IDownloadObserver dash::network::IConnection dash::network::IChunk + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IDOWNLOADABLECHUNK_H_ +#define IDOWNLOADABLECHUNK_H_ + +#include "config.h" + +#include "IDownloadObserver.h" +#include "IConnection.h" +#include "IChunk.h" +#include "IDASHMetrics.h" + +namespace dash +{ + namespace network + { + class IDownloadableChunk : public IChunk, public dash::metrics::IDASHMetrics + { + public: + virtual ~IDownloadableChunk(){} + + /** + * Starts the download of this chunk and returns a bool value whether the starting of the download was possible or not + * @return a bool value + */ + virtual bool StartDownload () = 0; + + /** + * Starts the download of this chunk and returns a bool value whether the starting of the download was possible or not + * @param connection the dash::network::IConnection that shall be used for downloading + * @return a bool value + */ + virtual bool StartDownload (IConnection *connection) = 0; + + /** + * Aborts the download of a chunk + */ + virtual void AbortDownload () = 0; + + /** + * Reads + * @param data pointer to a block of memory + * @param len size of the memory block that can be used by the method + * @return amount of data that has been read + */ + virtual int Read (uint8_t *data, size_t len) = 0; + + /** + * Reads + * @param data pointer to a block of memory + * @param len size of the memory block that can be used by the method + * @return amount of data that has been peeked + */ + virtual int Peek (uint8_t *data, size_t len) = 0; + + /** + * Reads + * @param data pointer to a block of memory + * @param len size of the memory block that can be used by the method + * @param offset the offset to start with + * @return amount of data that has been peeked + */ + virtual int Peek (uint8_t *data, size_t len, size_t offset) = 0; + + /** + * Attaches a dash::network::IDownloadObserver to this Chunk + * @param observer a dash::network::IDownloadObserver + */ + virtual void AttachDownloadObserver (IDownloadObserver *observer) = 0; + + /** + * Detaches a dash::network::IDownloadObserver from this Chunk + * @param observer a dash::network::IDownloadObserver + */ + virtual void DetachDownloadObserver (IDownloadObserver *observer) = 0; + }; + } +} + +#endif /* IDOWNLOADABLECHUNK_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IHTTPTransaction.h b/src/libdash/include/IHTTPTransaction.h new file mode 100644 index 00000000..756a1550 --- /dev/null +++ b/src/libdash/include/IHTTPTransaction.h @@ -0,0 +1,56 @@ +/** + * @class dash::metrics::IHTTPTransaction + * @brief This interface is needed for accessing the attributes and the content of a <tt><b>HTTP Request/Response Transaction</b></tt> + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, annex D.4.3 + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IHTTPTRANSACTION_H_ +#define IHTTPTRANSACTION_H_ + +#include "config.h" +#include "IThroughputMeasurement.h" + +namespace dash +{ + namespace metrics + { + enum HTTPTransactionType + { + MPD, + XLinkEpansion, + InitializationSegment, + IndexSegment, + MediaSegment, + BitstreamSwitchingSegment, + Other + }; + + class IHTTPTransaction + { + public: + virtual ~IHTTPTransaction (){} + + virtual uint32_t TCPId () const = 0; + virtual HTTPTransactionType Type () const = 0; + virtual const std::string& OriginalUrl () const = 0; + virtual const std::string& ActualUrl () const = 0; + virtual const std::string& Range () const = 0; + virtual const std::string& RequestSentTime () const = 0; + virtual const std::string& ResponseReceivedTime () const = 0; + virtual uint16_t ResponseCode () const = 0; + virtual uint64_t Interval () const = 0; + virtual const std::vector<IThroughputMeasurement *>& ThroughputTrace () const = 0; + virtual const std::string& HTTPHeader () const = 0; + }; + } +} + +#endif /* IHTTPTRANSACTION_H_ */ diff --git a/src/libdash/include/IMPD.h b/src/libdash/include/IMPD.h new file mode 100644 index 00000000..7e69eecf --- /dev/null +++ b/src/libdash/include/IMPD.h @@ -0,0 +1,207 @@ +/** + * @class dash::mpd::IMPD + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>MPD</b></tt> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.1.2, table 3 + * @details A Media Presentation as described in the <tt><b>MPD</b></tt> consists of (all sections refer to <em>ISO/IEC 23009-1, Part 1, 2012</em>) + * <ul> + * <li>A sequence of one or more Periods as described in section 5.3.2. + * <li>Each Period contains one or more Adaptation Sets as described in 5.3.3. + * In case an Adaptation Set contains multiple media content components, then each media content component is described individually + * as defined in 5.3.4. + * <li>Each Adaptation Set contains one or more Representations as described in 5.3.5. + * <li>A Representation may contain one or more Sub-Representations as described in 5.3.6. + * <li>Adaptation Sets, Representations and Sub-Representations share common attributes and elements that are described in 5.3.7. + * <li>Each Period may contain one or more Subsets that restrict combination of Adaptation Sets for presentation. Subsets are described in 5.3.8. + * <li>Each Representation consists of one or more Segments described in 6. Segment Information is introduced in 5.3.9. + * Segments contain media data and/or metadata to access, decode and present the included media content. + * Representations may also include Sub-Representations as defined in 5.3.6 to describe and extract partial information from a Representation. + * <li>Each Segment consists of one or more Subsegments. Subsegments are described in 6.2.3.2. + * </ul> + * @see dash::mpd::IMPDElement dash::mpd::IProgramInformation dash::mpd::IBaseUrl dash::mpd::IPeriod dash::mpd::IMetrics + * dash::mpd::IRepresentationBase + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IMPD_H_ +#define IMPD_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "IProgramInformation.h" +#include "IBaseUrl.h" +#include "IPeriod.h" +#include "IMetrics.h" +#include "IDASHMetrics.h" + +namespace dash +{ + namespace mpd + { + class IMPD : public virtual IMPDElement, public dash::metrics::IDASHMetrics + { + public: + virtual ~IMPD(){} + + /** + * Returns a reference to a vector of pointers to dash::mpd::IProgramInformation objects that specify descriptive information about the program.\n + * For more details refer to the description in section 5.7. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IProgramInformation objects + */ + virtual const std::vector<IProgramInformation *>& GetProgramInformations () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IBaseUrl objects that specify Base URLs that can be used for reference resolution + * and alternative URL selection. \n + * For more details refer to the description in section 5.6. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IBaseUrl objects + */ + virtual const std::vector<IBaseUrl *>& GetBaseUrls () const = 0; + + /** + * Returns a reference to a vector of strings that specify locations at which the MPD is available. + * @return a reference to a vector of strings + */ + virtual const std::vector<std::string>& GetLocations () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IPeriod objects that specify the information of a Period.\n + * For more details refer to the description in section 5.3.2. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IPeriod objects + */ + virtual const std::vector<IPeriod *>& GetPeriods () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IMetrics objects that specify the DASH Metrics.\n + * For more details see section 5.9. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IPeriod objects + */ + virtual const std::vector<IMetrics *>& GetMetrics () const = 0; + + /** + * Returns a reference to a string that specifies an identifier for the Media Presentation. It is recommended to use an identifier that is unique within + * the scope in which the Media Presentation is published. \n + * If not specified, no MPD-internal identifier is provided. However, for example the URL to the MPD may be used as an identifier for the Media Presentation. + * @return a reference to a string + */ + virtual const std::string& GetId () const = 0; + + /** + * Returns a reference to a vector of strings that specifies a list of Media Presentation profiles as described in section 8 of <em>ISO/IEC 23009-1, Part 1, 2012</em>.\n + * The contents of this attribute shall conform to either the \c pro-simple or \c pro-fancy productions of RFC6381, Section 4.5, without the enclosing \c DQUOTE characters, + * i.e. including only the \c unencodedv or \c encodedv elements respectively. + * As profile identifier the URI defined for the conforming Media Presentation profiles as described in section 8 shall be used. + * @return a reference to a vector of pointers to dash::mpd::IProgramInformation objects + */ + virtual const std::vector<std::string>& GetProfiles () const = 0; + + /** + * Returns a reference to a string that specifies whether the Media Presentation Description may be updated (<tt>\@type=\"dynamic\"</tt>) or not (<tt>\@type=\"static\"</tt>).\n + * \b NOTE: Static MPDs are typically used for On-Demand services, whereas dynamic MPDs are used for live services. + * @return a reference to a string + */ + virtual const std::string& GetType () const = 0; + + /** + * Returns a reference to a string that specifies + * <ul> + * <li>the anchor for the computation of the earliest availability time (in UTC) for any Segment in the Media Presentation if <tt>\@type=\"dynamic\"</tt>. + * <li>the Segment availability start time for all Segments referred to in this MPD if <tt>\@type=\"static\"</tt>. + * </ul> + * If not present, all Segments described in the MPD shall become available at the time the MPD becomes available.\n + * For <tt>\@type=\"dynamic\"</tt> this attribute shall be present. + * @return a reference to a string + */ + virtual const std::string& GetAvailabilityStarttime () const = 0; + + /** + * Returns a reference to a string that specifies the latest Segment availability end time for any Segment in the Media Presentation. When not present, the value is unknown. + * @return a reference to a string + */ + virtual const std::string& GetAvailabilityEndtime () const = 0; + + /** + * Returns a reference to a string that specifies the duration of the entire Media Presentation. If the attribute is not present, the duration of the Media Presentation is unknown. + * In this case the attribute <tt><b>MPD</b>\@minimumUpdatePeriod</tt> shall be present.\n + * This attribute shall be present when the attribute <tt><b>MPD</b>\@minimumUpdatePeriod</tt> is not present. + * @return a reference to a string + */ + virtual const std::string& GetMediaPresentationDuration () const = 0; + + /** + * Returns a reference to a string that specifies the smallest period between potential changes to the MPD. + * This can be useful to control the frequency at which a client checks for updates. \n + * If this attribute is not present it indicates that the MPD does not change. + * If <tt><b>MPD</b>\@type</tt> is \c \"static\", \c \@minimumUpdatePeriod shall not be present.\n + * Details on the use of the value of this attribute are specified in section 5.4. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a string + */ + virtual const std::string& GetMinimumUpdatePeriod () const = 0; + + /** + * Returns a reference to a string that specifies a common duration used in the definition of the Representation data rate + * (see \c \@bandwidth attribute in section 5.3.5.2 of <em>ISO/IEC 23009-1, Part 1, 2012</em>). + * @return a reference to a string + */ + virtual const std::string& GetMinBufferTime () const = 0; + + + /** + * Returns a reference to a string that specifies the duration of the time shifting buffer that is guaranteed to be available for a Media Presentation + * with type \c \"dynamic\". When not present, the value is infinite. This value of the attribute is undefined if the type attribute is equal to \c \"static\". + * @return a reference to a string + */ + virtual const std::string& GetTimeShiftBufferDepth () const = 0; + + /** + * Returns a reference to a string that specifies + * <ul> + * <li>when \c \@type is \c \"dynamic\", a fixed delay offset in time from the presentation time of each access unit that is suggested to be used for presentation of each access unit.\n + For more details refer to 7.2.1. \n + When not specified, then no value is provided and the client is expected to choose a suitable value. + <li>when \c \@type is \c \"static\" the value of the attribute is undefined and may be ignored. + </ul> + * @return a reference to a string + */ + virtual const std::string& GetSuggestedPresentationDelay () const = 0; + + /** + * Returns a reference to a string that specifies the maximum duration of any Segment in any Representation in the Media Presentation, + * i.e. documented in this MPD and any future update of the MPD. If not present, then the maximum Segment duration shall be the maximum duration of any Segment documented in this MPD. + * @return a reference to a string + */ + virtual const std::string& GetMaxSegmentDuration () const = 0; + + /** + * Returns a reference to a string that specifies the maximum duration of any Media Subsegment in any Representation in the Media Presentation. + * If not present, the same value as for the maximum Segment duration is implied. + * @return a reference to a string + */ + virtual const std::string& GetMaxSubsegmentDuration () const = 0; + + /** + * Returns a pointer to a dash::mpd::IBaseUrl that specifies the absolute path to the MPD file. \n + * This absolute path is needed if there is no BaseURL specified and all other BaseURLs are relative. + * @return a pointer to a dash::mpd::IBaseUrl + */ + virtual IBaseUrl* GetMPDPathBaseUrl () const = 0; + + /** + * Returns the UTC time in seconds when the MPD was fetched.\n + * It is up to the client to check that this value has been set accordingly. \n + * See SetFetchTime() for further details. + * @return an unsigned integer + */ + virtual uint32_t GetFetchTime () const = 0; + }; + } +} + +#endif /* IMPD_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IMPDElement.h b/src/libdash/include/IMPDElement.h new file mode 100644 index 00000000..616b5448 --- /dev/null +++ b/src/libdash/include/IMPDElement.h @@ -0,0 +1,77 @@ +/** + * @class dash::mpd::IMPDElement + * @brief This interface is needed for accessing additional nested <em>XML Elements</em> and <em>XML Attributes</em> of some MPD Classes. + * @details Due to the fact that some MPD classes may contain additional <em>XML Elements</em>, which are not specified in <em>ISO/IEC 23009-1, Part 1, 2012</em> + * but are attached to them, this interface is needed for retrieving these <em>XML Elements</em>. \n\n + * See example below for clarification (inspired by the example from section G.7 of <em>ISO/IEC 23009-1, Part 1, 2012</em>).\n + * \code{.xml} + * <ContentProtection schemeIdUri="http://example.net/052011/drm" additionalAttribute="abc"> + * <drm:License>http://MoviesSP.example.com/protect?license=kljklsdfiowek</drm:License> + * <drm:Content>http://MoviesSP.example.com/protect?content=oyfYvpo8yFyvyo8f</drm:Content> + * </ContentProtection> + * \endcode + * \em ContentProtection is of type <tt><b>DescriptorType</b></tt> which is defined in section 5.8.3 of <em>ISO/IEC 23009-1, Part 1, 2012</em> as follows: + * \code{.xml} + * <!-- Descriptor --> + * <xs:complexType name="DescriptorType"> + * <xs:sequence> + * <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + * </xs:sequence> + * <xs:attribute name="schemeIdUri" type="xs:anyURI" use="required"/> + * <xs:attribute name="value" type="xs:string"/> + * <xs:anyAttribute namespace="##other" processContents="lax"/> + * </xs:complexType> + * \endcode + * So <tt><b>ContentProtection</b></tt> can contain additional <em>XML Elements</em> - here <tt><b>License</b></tt> and <tt><b>Content</b></tt> - + * which are of type dash::xml::INode and can be retrieved by calling GetAdditionalSubNodes(). \n + * Similarly additional <em>XML Attributes</em> that are not specified in <em>ISO/IEC 23009-1, Part 1, 2012</em> + * can be retrieved by calling GetRawAttributes(), but please mind that all attributes + * of the Element are returned, not just the additional ones. So in the example above both + * attributes \c schemeIDUri (which is specified) and \c additionalAttribute (which is not) are returned. + * @see dash::xml::INode + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IMPDELEMENT_H_ +#define IMPDELEMENT_H_ + +#include "config.h" + +#include "INode.h" + +namespace dash +{ + namespace mpd + { + class IMPDElement + { + public: + virtual ~IMPDElement (){} + + /** + * This method returns a vector of pointers to dash::xml::INode objects which correspond to additional <em>XML Elements</em> of certain + * MPD elements. These <em>XML Elements</em> are not specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>. \n + * See the example in the class description for details. + * @return a vector of pointers to dash::xml::INode objects + */ + virtual const std::vector<xml::INode *> GetAdditionalSubNodes () const = 0; + + /** + * This method returns a map with key values and mapped values of type std::string of all <em>XML Attributes</em> of certain MPD elements. \n + * Some of these <em>XML Attributes</em> are not specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>. \n + * See the example in the class description for details. + * @return a map with key values and mapped values, both of type std::string + */ + virtual const std::map<std::string, std::string> GetRawAttributes () const = 0; + }; + } +} + +#endif /* IMPDELEMENT_H_ */ diff --git a/src/libdash/include/IMetrics.h b/src/libdash/include/IMetrics.h new file mode 100644 index 00000000..c1498727 --- /dev/null +++ b/src/libdash/include/IMetrics.h @@ -0,0 +1,62 @@ +/** + * @class dash::mpd::IMetrics + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>Metrics</b></tt> element as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.9.2, table 23 + * @details This part of <em>ISO/IEC 23009</em> does not define mechanisms for reporting metrics, however it does define a set of metrics and a mechanism + * that may be used by the service provider to trigger metric collection and reporting at the clients, should a reporting mechanism be available. + * The trigger mechanism is based on the <tt><b>Metrics</b></tt> element in the MPD. The element contains the list of DASH Metrics for which the measurements are desired, + * the time interval and the granularity for the measurements, as well as the scheme according to which the metric reporting is desired. + * @see dash::mpd::IDescriptor dash::mpd::IRange dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IMETRICS_H_ +#define IMETRICS_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "IDescriptor.h" +#include "IRange.h" + +namespace dash +{ + namespace mpd + { + class IMetrics : public virtual IMPDElement + { + public: + virtual ~IMetrics(){} + + /** + * Returns a refernce to a vector of pointers to dash::mpd::IDescriptor objects that specify information about the requested reporting method and formats.\n + * For more details refer to section 5.9.4. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetReportings () const = 0; + + /** + * Returns a refernce to a vector of pointers to dash::mpd::IRange objects that specify the time period during which DASH Metrics collection is requested. + * When not present, DASH Metrics reporting is requested for the whole duration of the content. + * @return a reference to a vector of pointers to dash::mpd::IRange objects + */ + virtual const std::vector<IRange *>& GetRanges () const = 0; + + /** + * Returns a reference to a string that specifies all DASH Metrics (as a list of DASH Metric keys as defined in Annex D of <em>ISO/IEC 23009-1, Part 1, 2012</em>, separated by a comma) + * that the client is desired to report. + * @return a reference to a string + */ + virtual const std::string& GetMetrics () const = 0; + + }; + } +} + +#endif /* IMETRICS_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IMultipleSegmentBase.h b/src/libdash/include/IMultipleSegmentBase.h new file mode 100644 index 00000000..06d0dff3 --- /dev/null +++ b/src/libdash/include/IMultipleSegmentBase.h @@ -0,0 +1,66 @@ +/** + * @class dash::mpd::IMultipleSegmentBase + * @brief This interface is needed for accessing the common elements and attributes for the <tt><b>MultipleBaseInformation</b></tt> type + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.2.2, table 12 + * @details It specifies multiple Segment base information + * @see dash::mpd::ISegmentTimeline dash::mpd::ISegmentBase dash::mpd::IURLType + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IMULTIPLESEGMENTBASE_H_ +#define IMULTIPLESEGMENTBASE_H_ + +#include "config.h" + +#include "ISegmentTimeline.h" +#include "ISegmentBase.h" +#include "IURLType.h" + +namespace dash +{ + namespace mpd + { + class IMultipleSegmentBase : public virtual ISegmentBase + { + public: + virtual ~IMultipleSegmentBase(){} + + /** + * Return a pointer to a dash::mpd::ISegmentTimeline object + * @return a pointer to a dash::mpd::ISegmentTimeline object + */ + virtual const ISegmentTimeline* GetSegmentTimeline () const = 0; + + /** + * Returns a pointer to a dash::mpd::IURLType object that specifies the URL including a possible byte range for the Bitstream Switching Segment. + * @return a pointer to a dash::mpd::IURLType object + */ + virtual const IURLType* GetBitstreamSwitching () const = 0; + + /** + * Returns a integer specifying the constant approximate Segment duration. \n + * All Segments within this Representation element have the same duration unless it is the last Segment within the Period, which could be significantly shorter.\n + * The value of the duration in seconds is the division of the value of this attribute and the value of the \c \@timescale attribute associated to the containing Representation.\n + * For more details refer to section 5.3.9.5.3. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return an unsigned integer + */ + virtual uint32_t GetDuration () const = 0; + + /** + * Returns a integer specifying the number of the first Media Segment in this Representation in the Period.\n + * For more details refer to 5.3.9.5.3. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return an unsigned integer + */ + virtual uint32_t GetStartNumber () const = 0; + }; + } +} + +#endif /* IMULTIPLESEGMENTBASE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/INode.h b/src/libdash/include/INode.h new file mode 100644 index 00000000..96bc6e88 --- /dev/null +++ b/src/libdash/include/INode.h @@ -0,0 +1,97 @@ +/** + * @class dash::xml::INode + * @brief This interface defines the access to class members of <em>XML Elements</em>. + * @details Due to the fact that some MPD elements may contain additional <em>XML Elements</em>, which are not specified in <em>ISO/IEC 23009-1, Part 1, 2012</em> + * but are attached to them, this interface is needed to access such an <em>XML Element</em>. \n\n + * For clarification see the example in dash::mpd::IMPDElement + * @see dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef INODE_H_ +#define INODE_H_ + +#include "config.h" + +namespace dash +{ + namespace xml + { + class INode + { + public: + virtual ~INode (){} + + /** + * Returns a reference to a vector of pointers to nested dash::xml::INode objects. + * @return a reference to a vector containing pointers to dash::xml::INode objects. + */ + virtual const std::vector<INode *>& GetNodes () const = 0; + + /** + * Returns a vector of attribute names belonging to this <em>XML Element</em> + * @return a vector of strings + */ + virtual std::vector<std::string> GetAttributeKeys () const = 0; + + /** + * Returns the name of this <em>XML Element</em> + * @return a reference to string + */ + virtual const std::string& GetName () const = 0; + + /** + * Returns the text contained in this <em>XML Element</em> + * @return a string + */ + virtual std::string GetText () const = 0; + + /** + * Returns a std::map of key value / mapped value pairs corresponding to the <em>XML Attributes</em> and their values of this <em>XML Element</em> + * @return a reference to a map with key values and mapped values, both of type std::string + */ + virtual const std::map<std::string, std::string>& GetAttributes () const = 0; + + /** + * Returns the type of this <em>XML Element</em> represented by an integer + * \code + * Start = 1 + * End = 15 + * WhiteSpace = 14 + * Text = 3 + * \endcode + * @return an integer + */ + virtual int GetType () const = 0; + + /** + * Returns the value belonging to the <em>XML Attribute</em> specified by key + * @param key the name of the desired <em>XML Attribute</em> + * @return a reference to a string + */ + virtual const std::string& GetAttributeValue (std::string key) const = 0; + + /** + * Returns a bool value determininig whether the <em>XML Attribute</em> name is contained in this <em>XML Element</em> or not. + * @param name the name of the desired <em>XML Attribute</em> + * @return a bool value + */ + virtual bool HasAttribute (const std::string& name) const = 0; + + /** + * Returns a bool value determining whether the <em>XML Element</em> has text or not. + * @return a bool value + */ + virtual bool HasText () const = 0; + }; + } +} + +#endif /* INODE_H_ */ diff --git a/src/libdash/include/IPeriod.h b/src/libdash/include/IPeriod.h new file mode 100644 index 00000000..10ec9244 --- /dev/null +++ b/src/libdash/include/IPeriod.h @@ -0,0 +1,156 @@ +/** + * @class dash::mpd::IPeriod + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>Period</b></tt> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.2.2, table 4 + * @details A Media Presentation consists of one or more Periods. A Period is defined by a <tt><b>Period</b></tt> element in the <tt><b>MPD</b></tt> element. \n + * The type of the Period, either a regular Period or an Early Available Period, as well as the \em PeriodStart time of a regular Period is determined as follows: + * <ul> + * <li>If the attribute \c \@start is present in the Period, then the Period is a regular <tt><b>Period</b></tt> and the \em PeriodStart is equal to the value of this attribute. + * <li>If the \c \@start attribute is absent, but the previous <tt><b>Period</b></tt> element contains a \c \@duration attribute then then this new Period is also a regular Period. + * The start time of the new Period \em PeriodStart is the sum of the start time of the previous Period \em PeriodStart and + * the value of the attribute \c \@duration of the previous Period. + * <li>If \em (i) \c \@start attribute is absent, and \em (ii) the <tt><b>Period</b></tt> element is the first in the MPD, + * and \em (iii) the <tt><b>MPD</b>\@type</tt> is \c 'static', then the \em PeriodStart time shall be set to zero. + * <li>If \em (i) \c \@start attribute is absent, and \em (ii) the previous Period element does not contain a \c \@duration attribute or + * the <tt><b>Period</b></tt> element is the first in the MPD, and (iii) the <tt><b>MPD</b>\@type</tt> is \c 'dynamic', + * then this Period is an Early Available Period (see below for details). + * </ul> + * For any regular Period the following holds: \em PeriodStart reflects the actual time that should elapse after playing the media of all prior Periods in this Media Presentation + * relative to the \em PeriodStart time of the first Period in the Media Presentation. The Period extends until the \em PeriodStart of the next Period, or until the end of the + * Media Presentation in the case of the last Period. More specifically, the difference between the \em PeriodStart time of a Period and + * either the \em PeriodStart time of the following Period, if this is not the last Period, or the value of the <tt><b>MPD</b>\@mediaPresentationDuration</tt> if this is the last one, + * is the presentation duration in Media Presentation time of the media content represented by the Representations in this Period. \n\n + * Early Available Periods may be used to advertise initialization of other non-media data before the media data itself is available. + * <tt><b>Period</b></tt> elements documenting early available Periods shall not occur before any Period element documenting a regular Period. For Early Available Periods, + * any resources that are announced in such a Period element shall be available. Such a <tt><b>Period</b></tt> element shall not contain URLs to Media Segments. + * The data contained in such a <tt><b>Period</b></tt> element does not represent a Period in the Media Presentation. Only when the \em PeriodStart time becomes known + * through an update of the MPD, such a <tt><b>Period</b></tt> element represents a regular Period. However, an update of the MPD may even remove a <tt><b>Period</b></tt> element + * representing an Early Available Period in later updates of the MPD as long as no \em PeriodStart time is associated with the Period. \n\n + * To avoid dereferencing of a remote element containing a <tt><b>Period</b></tt> element solely to determine the Period timeline, e.g. in case of seeking, + * <tt><b>Period</b>\@start</tt> or previous Period's <tt><b>Period</b>\@duration</tt> should be present in the MPD. + * @see dash::mpd::IMPDElement dash::mpd::BaseUrl dash::mpd::IAdaptationSet dash::mpd::ISegmentBase dash::mpd::ISegmentList dash::mpd::ISegmentTemplate dash::mpd::ISubset + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IPERIOD_H_ +#define IPERIOD_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "IBaseUrl.h" +#include "ISegmentBase.h" +#include "ISegmentList.h" +#include "ISegmentTemplate.h" +#include "IAdaptationSet.h" +#include "ISubset.h" + +namespace dash +{ + namespace mpd + { + class IPeriod : public virtual IMPDElement + { + public: + virtual ~IPeriod(){} + + /** + * Returns a reference to a vector of pointers to dash::mpd::IBaseUrl objects that specify base URLs that can be used for reference resolution and alternative URL selection.\n + * For more details refer to the description in section 5.6. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IBaseUrl objects + */ + virtual const std::vector<IBaseUrl *>& GetBaseURLs () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentBase object that specifies default Segment Base information.\n + * Information in this element is overridden by information in <tt><b>AdapationSet.SegmentBase</b></tt> and <tt><b>Representation.SegmentBase</b></tt>, if present.\n + * For more details see section 5.3.9. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentBase object + */ + virtual ISegmentBase* GetSegmentBase () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentList object that specifies default Segment List information.\n + * Information in this element is overridden by information in <tt><b>AdapationSet.SegmentList</b></tt> and <tt><b>Representation.SegmentList</b></tt>, if present.\n + * For more details see section 5.3.9. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentList object + */ + virtual ISegmentList* GetSegmentList () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentTemplate object that specifies default Segment Template information.\n + * Information in this element is overridden by information in <tt><b>AdapationSet.SegmentTemplate</b></tt> and <tt><b>Representation.SegmentTemplate</b></tt>, if present. + * For more details see section 5.3.9. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentTemplate object + */ + virtual ISegmentTemplate* GetSegmentTemplate () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IAdaptationSet objects that specify Adapatation Sets.\n + * At least one Adaptation Set shall be present in each Period. However, the actual element may be present only in a remote element if xlink is in use.\n + * For more details see section 5.3.3. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IAdaptationSet objects + */ + virtual const std::vector<IAdaptationSet *>& GetAdaptationSets () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::ISubset objects that specify Subsets.\n + * For more details see section 5.3.8. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::ISubset objects + */ + virtual const std::vector<ISubset *>& GetSubsets () const = 0; + + /** + * Returns a reference to a string that specifies a reference to an external <tt><b>Period</b></tt> element. + * @return a reference to a string + */ + virtual const std::string& GetXlinkHref () const = 0; + + /** + * Returns a reference to a string that specifies the processing instructions, which can be either \c \"onLoad\" or \c \"onRequest\".\n + * This attribute shall not be present if the \c \@xlink:href attribute is not present. + * @return a reference to a string + */ + virtual const std::string& GetXlinkActuate () const = 0; + + /** + * Returns an reference to a string that specifies an identifier for this Period. + * The attribute shall be unique in the scope of the Media Presentation. + * @return a reference to a string + */ + virtual const std::string& GetId () const = 0; + + /** + * Returns a reference to a string that specifies the \em PeriodStart time of the Period.The \em PeriodStart time is used as an anchor to determine the MPD start + * time of each Media Segment as well as to determine the presentation time of each each access unit in the Media Presentation timeline.\n + * If not present, refer to the details in section 5.3.2.1. of <em>ISO/IEC 23009-1, Part 1, 2012</em> + * @return a reference to a string + */ + virtual const std::string& GetStart () const = 0; + + /** + * Returns a reference to a string that specifies the duration of the Period to determine the \em PeriodStart time of the next Period.\n + * If not present, refer to the details in section 5.3.2.1. of <em>ISO/IEC 23009-1, Part 1, 2012</em> + * @return a reference to a string + */ + virtual const std::string& GetDuration () const = 0; + + /** + * When set to \c 'true', this is equivalent as if the <tt><b>AdaptationSet</b>\@bitstreamSwitching</tt> for each Adaptation Set contained in this Period is set to \c 'true'. + * In this case, the <tt><b>AdaptationSet</b>\@bitstreamSwitching</tt> attribute shall not be set to \c 'false' for any Adaptation Set in this Period. + * @return a bool value + */ + virtual bool GetBitstreamSwitching () const = 0; + + }; + } +} + +#endif /* IPERIOD_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IProgramInformation.h b/src/libdash/include/IProgramInformation.h new file mode 100644 index 00000000..58c03750 --- /dev/null +++ b/src/libdash/include/IProgramInformation.h @@ -0,0 +1,69 @@ +/** + * @class dash::mpd::IProgramInformation + * @brief This interface is needed for accessing the attributes and elements of the Program Information element as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.7.2, table 20 + * @details Descriptive information on the program may be provided for a Media Presentation within the <tt><b>ProgramInformation</b></tt> element. + * When multiple <tt><b>ProgramInformation</b></tt> elements are present, the \c \@lang attribute shall be present and + * each element shall describe the Media Presentation sufficiently in the language defined by the value of the \c \@lang attribute. + * For each language, the program information may specify title, source of the program, copyright information, and a URL to more information. + * @see dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IPROGRAMINFORMATION_H_ +#define IPROGRAMINFORMATION_H_ + +#include "config.h" + +#include "IMPDElement.h" + +namespace dash +{ + namespace mpd + { + class IProgramInformation : public virtual IMPDElement + { + public: + virtual ~IProgramInformation(){} + + /** + * Returns a reference to a string that specifies the title for the Media Presentation. + * @return a reference to a string + */ + virtual const std::string& GetTitle () const = 0; + + /** + * Returns a reference to a string that specifies information about the original source (for example content provider) of the Media Presentation. + * @return a reference to a string + */ + virtual const std::string& GetSource () const = 0; + + /** + * Returns a reference to a string that specifies a copyright statement for the Media Presentation, usually starting with the copyright symbol, unicode \c U+00A9. + * @return a reference to a string + */ + virtual const std::string& GetCopyright () const = 0; + + /** + * Returns a reference to a string that declares the language code(s) for this Program Information. The syntax and semantics according to <em>IETF RFC 5646</em> shall be applied. + * @return a reference to a string + */ + virtual const std::string& GetLang () const = 0; + + /** + * Returns a reference to a string that specifies an absolute URL which provides more information about the Media Presentation. + * @return a reference to a string + */ + virtual const std::string& GetMoreInformationURL () const = 0; + + }; + } +} + +#endif /* IPROGRAMINFORMATION_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IRange.h b/src/libdash/include/IRange.h new file mode 100644 index 00000000..0f85f98d --- /dev/null +++ b/src/libdash/include/IRange.h @@ -0,0 +1,53 @@ +/** + * @class dash::mpd::IRange + * @brief This interface is needed for accessing the attributes and elements of the Metrics <tt><b>Range</b></tt> element as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.9.2, table 23 + * @details It specifies the time period during which DASH Metrics collection is requested. + * @see dash::mpd::IMetrics + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IRANGE_H_ +#define IRANGE_H_ + +#include "config.h" + +namespace dash +{ + namespace mpd + { + class IRange + { + public: + virtual ~IRange(){} + + /** + * Returns a reference to a string that specifies the start time of the DASH Metrics collection operation. + * When not present, DASH Metrics collection is requested from the beginning of content consumption. + * For services with <tt><b>MPD</b>\@type='dynamic'</tt>, the start time is indicated in wallclock time by adding the value of this + * attribute to the value of the <tt><b>MPD</b>\@availabilityStartTime</tt> attribute. + * For services with <tt><b>MPD</b>\@type='static'</tt>, the start time is indicated in Media Presentation time and is relative to the + * PeriodStart time of the first Period in this MPD. + * \b NOTE: For example, if <tt><b>MPD</b>\@availabilityStartTime</tt> is 14:30 and the metrics collection is intended to start at 14:45, then \c \@starttime is 0:15. + * @return a reference to a string + */ + virtual const std::string& GetStarttime () const = 0; + + /** + * Returns a reference to a string that specifies the duration of the DASH metrics collection interval. The value of the attribute expresses in Media Presentation time. + * If not present, the value is identical to the Media Presentation duration. + * @return a reference to string + */ + virtual const std::string& GetDuration () const = 0; + + }; + } +} + +#endif /* IRANGE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IRepresentation.h b/src/libdash/include/IRepresentation.h new file mode 100644 index 00000000..0762d870 --- /dev/null +++ b/src/libdash/include/IRepresentation.h @@ -0,0 +1,159 @@ +/** + * @class dash::mpd::IRepresentation + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>Representation</b></tt> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.5.2, table 7 + * @details Representations are described by the <tt><b>Representation</b></tt> element. <tt><b>Representation</b></tt> elements are contained in an <tt><b>AdaptationSet</b></tt> element.\n + * A Representation is one of the alternative choices of the complete set or subset of media content components comprising the media content during the defined Period.\n + * A Representation starts at the start of the Period \em PeriodStart and continues to the end of the Period, i.e. the start of the next Period or the end of the Media Presentation.\n + * Each Representation includes one or more media streams, where each media stream is an encoded version of one media content component.\n + * A Representation consists of one or more Segments.\n + * Each Representation either shall contain an Initialization Segment or each Media Segment in the Representation shall be self-initializing, + * i.e. the Media Segment itself conforms to the media type as specified in the \c \@mimeType attribute for this Representation. \n + * When a Representation is not a dependent Representation, i.e. the \c \@dependencyId attribute is absent, then concatenation of the Initialization Segment, + * if present, and all consecutive Media Segments in one Representation shall represent a conforming Segment sequence as defined in section 4.5.3 of <em>ISO/IEC 23009-1, Part 1, 2012</em> + * conforming to the media type as specified in the \c \@mimeType attribute for this Representation.\n + * Dependent Representations are described by a <tt><b>Representation</b></tt> element that contains a \c \@dependencyId attribute. + * Dependent Representations are regular Representations except that they depend on a set of complementary Representations for decoding and/or presentation. + * The \c \@dependencyId contains the values of the \c \@id attribute of all the complementary Representations, i.e. Representations that are necessary to + * present and/or decode the media content components contained in this dependent Representation.\n + * For any dependent Representation X that depends on complementary Representation Y, the <em>m</em>-th Subsegment of X and the <em>n</em>-th Subsegment of Y + * shall be non-overlapping (as defined in 4.5.3) whenever \em m is not equal to \em n. For dependent Representations the concatenation of the Initialization Segment with the + * sequence of Subsegments of the dependent Representations, each being preceded by the corresponding Subsegment of each of the complementary Representations + * in order as provided in the \c \@dependencyId attribute shall represent a conforming Subsegment sequence as defined in 4.5.3 conforming to the media + * format as specified in the \c \@mimeType attribute for this dependent Representation.\n\n + * \b NOTE: When decoding of a dependent Representation is started from a SAP in the (Sub)Segment with number \em i, the decoding process does not need to access + * data from the complementary Representation(s) from any earlier (sub)segments than (sub)Segment with number i of the complementary Representation(s). + * @see dash::mpd::IRepresentationBase dash::mpd::ISegmentBase dash::mpd::ISegmentList dash::mpd::ISegmentTemplate dash::mpd::IBaseUrl dash::mpd::ISubRepresentation + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IREPRESENTATION_H_ +#define IREPRESENTATION_H_ + +#include "config.h" + +#include "IBaseUrl.h" +#include "ISubRepresentation.h" +#include "ISegmentBase.h" +#include "ISegmentList.h" +#include "ISegmentTemplate.h" +#include "IRepresentationBase.h" + +namespace dash +{ + namespace mpd + { + class IRepresentation : public virtual IRepresentationBase + { + public: + virtual ~IRepresentation(){} + + /** + * Returns a reference to a vector of pointers to dash::mpd::IBaseUrl objects that specifies Base URLs that can be used for reference resolution and alternative URL selection.\n + * For more details refer to the description in section 5.6. of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IBaseUrl objects + */ + virtual const std::vector<IBaseUrl *>& GetBaseURLs () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::ISubRepresentation objects that specifies information about Sub-Representations + * that are embedded in the containing Representation. + * For more detail see section 5.3.6 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::ISubRepresentation objects + */ + virtual const std::vector<ISubRepresentation *>& GetSubRepresentations () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentBase object that specifies default Segment Base information. + * For more detail see section 5.3.9 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentBase object + */ + virtual ISegmentBase* GetSegmentBase () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentList object that specifies the Segment List information. + * For more detail see section 5.3.9 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentList object + */ + virtual ISegmentList* GetSegmentList () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegmentTemplate object that specifies the Segment Template information. + * For more detail see section 5.3.9 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a pointer to a dash::mpd::ISegmentTemplate object + */ + virtual ISegmentTemplate* GetSegmentTemplate () const = 0; + + /** + * Returns a reference to a string that specifies an identifier for this Representation. The identifier shall be unique within a Period + * unless the Representation is functionally identically to another Representation in the same Period. \n + * The identifier shall not contain whitespace characters. \n + * If used in the template-based URL construction as defined in 5.3.9.4.4 of <em>ISO/IEC 23009-1, Part 1, 2012</em>, + * the string shall only contain characters that are permitted within an HTTP-URL according to RFC 1738. + * @return a reference to a string + */ + virtual const std::string& GetId () const = 0; + + /** + * Returns an integer that specifies a bandwidth in bits per seconds (bps).\n + * If the Representation is continuously delivered at this bitrate, starting at any SAP that is indicated either by \c \@startWithSAP + * or by any Segment Index box, a client can be assured of having enough data for continuous playout providing playout begins after + * \c \@minBufferTime * \c \@bandwidth bits have been received (i.e. at time \c \@minBufferTime after the first bit is received).\n\n + * For dependent Representations this value shall specify the minimum bandwidth as defined above of this Representation and all complementary Representations. + * @return an unsigned integer + */ + virtual uint32_t GetBandwidth () const = 0; + + /** + * Returns an integer that specifies a quality ranking of the Representation relative to other Representations in the same Adaptation Set. + * Lower values represent higher quality content. + * @return an unsigned integer + */ + virtual uint32_t GetQualityRanking () const = 0; + + /** + * Returns a reference to a vector of strings that specifies all complementary Representations the Representation depends on in the decoding and/or + * presentation process as values of \c \@id attributes.\n + * If not present, the Representation can be decoded and presented independently of any other Representation. \n + * This attribute shall not be present where there are no dependencies. + * @return a reference to a vector of strings + */ + virtual const std::vector<std::string>& GetDependencyId () const = 0; + + /** + * Returns a reference to a vector of strings that specifies media stream structure identifier values.\n + * The attribute may be present for Representations containing video and its semantics are unspecified for any other type of Representations.\n + * If present, the attribute \c \@mediaStreamStructureId specifies a whitespace-separated list of media stream structure identifier values. + * If media streams share the same media stream structure identifier value, the media streams shall have the following characteristics: + * <ul> + * <li> The media streams have the same number of Stream Access Points of type 1 to 3. + * <li> The values of T<sub>SAP</sub>, T<sub>DEC</sub>, T<sub>EPT</sub>, and T<sub>PTF</sub> of the <em>i</em>-th SAP of type 1 to 3 in one media stream are identical + * to the values of T<sub>SAP</sub>, T<sub>DEC</sub>, T<sub>EPT</sub>, and T<sub>PTF</sub>, respectively, of the <em>i</em>-th SAP of type 1 to 3 + * in the other media streams for any value of \em i from 1 to the number of SAPs of type 1 to 3 in any of the media streams. + * <li> A media stream formed by concatenating the media stream of a first Representation until I<sub>SAU</sub> (exclusive) of the <em>i</em>-th SAP of type 1 to 3 and the + * media stream of a second Representation (having the same media stream structure identifier value as for the first Representation) starting from the I<sub>SAU</sub> + * (inclusive) of the <em>i</em>-th SAP of type 1 to 3 conforms to the specification in which the media stream format is specified for any value of \em i from 1 to the number + * of SAPs of type 1 to 3 in either media stream. Furthermore, the decoded pictures have an acceptable quality regardless of type of the Stream Access Point access unit used. + * </ul> + * All media stream structure identifier values for one Adaptation Set shall differ from those of another Adaptation Set.\n + * If not present, then for this Representation no similarities to other Representations are known. + * \b NOTE Indicating multiple media stream structure identifier values for a Representation can be useful in cases where switching between Representations A and B + * as well as between Representations B and C is allowed at non-IDR intra pictures, but switching between Representations A and C would cause too + * severe a degradation in the quality of the leading pictures and is hence not allowed. To indicate these permissions and restrictions, + * Representation A would contain \c \@mediaStreamStructureId equal to \"1"\", Representation B would contain \c \@mediaStreamStructureId equal to \"1 2\", + * and Representation C would contain \c \@mediaStreamStructureId equal to \"2\". + * @return a reference to a vector of strings + */ + virtual const std::vector<std::string>& GetMediaStreamStructureId () const = 0; + }; + } +} + +#endif /* IREPRESENTATION_H_ */ diff --git a/src/libdash/include/IRepresentationBase.h b/src/libdash/include/IRepresentationBase.h new file mode 100644 index 00000000..e7b7e688 --- /dev/null +++ b/src/libdash/include/IRepresentationBase.h @@ -0,0 +1,181 @@ +/** + * @class dash::mpd::IRepresentationBase + * @brief This interface is needed for accessing the common attributes and elements of the certain MPD element as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.7 + * @details The elements \c <b>AdaptationSet</b>, \c <b>Representation</b> and \c <b>SubRepresentation</b> have assigned common attributes and elements that are specified in + * <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.7.2, table 9 + * @see dash::mpd::IDescriptor dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IREPRESENTATIONBASE_H_ +#define IREPRESENTATIONBASE_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "IDescriptor.h" + +namespace dash +{ + namespace mpd + { + class IRepresentationBase : public virtual IMPDElement + { + public: + virtual ~IRepresentationBase(){} + + /** + * Returns a reference to a vector of pointers to dash::mpd::IDescriptor objects that specifies frame-packing arrangement information of the video media component type.\n + * When no <tt><b>FramePacking</b></tt> element is provided for a video component, frame-packing shall not used for the video media component.\n + * For further details see sections 5.8.1 and 5.8.4.6 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetFramePacking () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IDescriptor objects that specifies the audio channel configuration of the audio media component type.\n + * For further details see sections 5.8.1 and 5.8.4.7 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetAudioChannelConfiguration () const = 0; + + /** + * Returns a reference to a vector of pointers to dash::mpd::IDescriptor objects that specifies information about content protection schemes used for the associated Representations.\n + * For further details see sections 5.8.1 and 5.8.4.1 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a vector of pointers to dash::mpd::IDescriptor objects + */ + virtual const std::vector<IDescriptor *>& GetContentProtection () const = 0; + + /** + * Returns a reference to a vector of strings that specifies the profiles which the associated Representation(s) + * conform to of the list of Media Presentation profiles as described in section 8 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * The value shall be a subset of the respective value in any higher level of the document hierarchy (Representation, Adaptation Set, MPD).\n + * If not present, the value is inferred to be the same as in the next higher level of the document hierarchy. + * For example, if the value is not present for a Representation, then \c \@profiles at the Adaptation Set level is valid for the Representation.\n + * The same syntax as defined in 5.3.1.2 shall be used. + * @return a reference to a vector of strings + */ + virtual const std::vector<std::string>& GetProfiles () const = 0; + + /** + * Returns an integer that specifies the horizontal visual presentation size of the video + * media type on a grid determined by the \c \@sar attribute. \n\n + * In the absence of \c \@sar width and height are specified as if the value of \c \@sar were \"1:1\".\n + * \b NOTE: The visual presentation size of the video is equal to the number of horizontal and vertical samples used for presentation + * after encoded samples are cropped in response to encoded cropping parameters, “overscan” signaling, or “pan/scan” display parameters, e.g. SEI messages. + * @return an unsigned integer + */ + virtual uint32_t GetWidth () const = 0; + + /** + * Returns an integer that specifies the vertical visual presentation size of the video + * media type, on a grid determined by the \c \@sar attribute. + * @return an unsigned integer + */ + virtual uint32_t GetHeight () const = 0; + + /** + * Returns a string that specifies the sample aspect ratio of the video media component type, + * in the form of a string consisting of two integers separated by ':', e.g., \"10:11\". + * The first number specifies the horizontal size of the encoded video pixels (samples) in arbitrary units. + * The second number specifies the vertical size of the encoded video pixels (samples) in same units as the horizontal size. + * @return a string + */ + virtual std::string GetSar () const = 0; + + /** + * Returns a string that specifies the output frame rate (or in the case of interlaced, half the output field rate) + * of the video media type in the Representation. If the frame or field rate is varying, the value is the average frame + * or half the average field rate field rate over the entire duration of the Representation.\n + * The value is coded as a string, either containing two integers separated by a \"/\", (\"F/D\"), or a single integer \"F\". + * The frame rate is the division F/D, or F, respectively, per second (i.e. the default value of D is \"1\"). + * @return a string + */ + virtual std::string GetFrameRate () const = 0; + + /** + * Returns a string that represents an audio sampling rate. \n + * Either a single decimal integer value specifying the sampling rate or a whitespace separated pair of decimal integer + * values specifying the minimum and maximum sampling rate of the audio media component type. The values are in samples per second. + * @return a string + */ + virtual std::string GetAudioSamplingRate () const = 0; + + /** + * Returns a string that specifies the MIME type of the concatenation of the Initialization Segment, if present, + * and all consecutive Media Segments in the Representation. + * @return a string + */ + virtual std::string GetMimeType () const = 0; + + /** + * Returns a reference to a vector of strings that specifies the profiles of Segments that are essential to process the Representation. + * The detailed semantics depend on the value of the \c \@mimeType attribute. The contents of this attribute shall conform to either the + * \c pro-simple or \c pro-fancy productions of RFC6381, Section 4.5, without the enclosing \c DQUOTE characters, + * i.e. including only the \c unencodedv or \c encodedv elements respectively. + * As profile identifier the brand identifier for the Segment as defined in section 6 of <em>ISO/IEC 23009-1, Part 1, 2012</em> shall be used.\n + * If not present on any level, the value may be deducted from the value of the\c \@profiles attribute. + * @return a reference to a vector of strings + */ + virtual const std::vector<std::string>& GetSegmentProfiles () const = 0; + + /** + * Returns a reference to a vector of strings that specifies the codecs present within the Representation. + * The codec parameters shall also include the profile and level information where applicable. \n + * The contents of this attribute shall conform to either the \c simp-list or \c fancy-list productions of RFC6381, Section 3.2, + * without the enclosing \c DQUOTE characters. The codec identifier for the Representation's media format, + * mapped into the name space for codecs as specified in RFC6381, Section 3.3, shall be used. + * @return a reference to a vector of strings + */ + virtual const std::vector<std::string>& GetCodecs () const = 0; + + /** + * Returns a double value specifying the maximum SAP interval in seconds of all contained media streams, + * where the SAP interval is the maximum time interval between the T<sub>SAP</sub> of any two successive SAPs of types 1 to 3 + * inclusive of one media stream in the associated Representations. + * @return a double + */ + virtual double GetMaximumSAPPeriod () const = 0; + + /** + * Returns an unsigned integer that (when greater than 0) specifies that in the associated Representations, + * each Media Segment starts with a SAP of type less than or equal to the value of this attribute value in each media stream. + * @return an unsigned integer + */ + virtual uint8_t GetStartWithSAP () const = 0; + + /** + * Returns a double that specifies the maximum playout rate as a multiple of the regular playout rate, + * which is supported with the same decoder profile and level requirements as the normal playout rate. + * @return a double + */ + virtual double GetMaxPlayoutRate () const = 0; + + /** + * Returns a bool value that informs about coding dependency.\n + * If \c 'true', for all contained media streams, specifies that there is at least one access unit that depends on one or more other access units for decoding. + * If \c 'false', for any contained media stream, there is no access unit that depends on any other access unit for decoding (e.g. for video all the pictures are intra coded). \n + * If not specified on any level, there may or may not be coding dependency between access units. + * @return a bool value + */ + virtual bool HasCodingDependency () const = 0; + + /** + * Returns a string that specifies the scan type of the source material of the video media component type. + * The value may be equal to one of \c \"progressive\", \c \"interlaced\" and \c \"unknown\". + * @return a string + */ + virtual std::string GetScanType () const = 0; + + }; + } +} + +#endif /* IREPRESENTATIONBASE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ISegment.h b/src/libdash/include/ISegment.h new file mode 100644 index 00000000..32355ef5 --- /dev/null +++ b/src/libdash/include/ISegment.h @@ -0,0 +1,86 @@ +/** + * @class dash::mpd::ISegment + * @brief This interface is needed for setting values of a Segment + * @details Several methods for setting the values of member variables are provided. \n\n + * These are only needed in case you do not want to use the values provided by the MPD. + * @see dash::network::IDownloadableChunk dash::network::IChunk + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ISEGMENT_H_ +#define ISEGMENT_H_ + +#include "config.h" + +#include "IDownloadableChunk.h" + +namespace dash +{ + namespace mpd + { + class ISegment : public virtual network::IDownloadableChunk + { + public: + virtual ~ISegment(){} + + /** + * This method allows you to specify an absolute URI for this Segment + * @param uri a string representing an URI + */ + virtual void AbsoluteURI (std::string uri) = 0; + + /** + * This method allows you to specify a host for this Segment + * @param host a string representing an host + */ + virtual void Host (std::string host) = 0; + + /** + * This method allows you to specify a port for this Segment + * @param port an integer representing a portnumber + */ + virtual void Port (size_t port) = 0; + + /** + * This method allows you to specify a path for this Segment + * @param path a string representing a path + */ + virtual void Path (std::string path) = 0; + + /** + * This method allows you to specify a byte range for this Segment + * @param range a string representing a byte range as definend in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.2.2, table 13:\n + <em>The byte range shall be expressed and formatted as a \c byte-range-spec as defined in RFC 2616, Clause 14.35.1. + It is restricted to a single expression identifying a contiguous range of bytes.</em> + */ + virtual void Range (std::string range) = 0; + + /** + * This method allows you to specify the start byte for this Segment + * @param startByte an integer representing the start byte + */ + virtual void StartByte (size_t startByte) = 0; + + /** + * This method allows you to specify the end byte for this Segment + * @param endByte an integer representing the end byte + */ + virtual void EndByte (size_t endByte) = 0; + + /** + * This method allows you to specify whether this Segment has a byte range or not + * @param hasByteRange a bool value, \c true to specify that this Segment has a byte range, \c false otherwise + */ + virtual void HasByteRange (bool hasByteRange) = 0; + }; + } +} + +#endif /* ISEGMENT_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ISegmentBase.h b/src/libdash/include/ISegmentBase.h new file mode 100644 index 00000000..a29a4eab --- /dev/null +++ b/src/libdash/include/ISegmentBase.h @@ -0,0 +1,86 @@ +/** + * @class dash::mpd::ISegmentBase + * @brief This interface is needed for accessing the common elements and attributes of <tt><b>SegmentBase</b></tt> + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.2.2, table 11 + * @details It specifies Semgent base elements as well as the type for the Segment base information. \n + * The <tt><b>SegmentBase</b></tt> is sufficient if only a single Media Segment is provided per Representation and the Media Segment URL is included in the BaseURL element.\n + * In case multiple Media Segments are present, either a <tt><b>SegmentList</b></tt> or a <tt><b>SegmentTemplate</b></tt> is used + * that share the multiple Segment base information as provided in 5.3.9.2.3, Table 12. \n + * If the Representation contains more than one Media Segment, then either the attribute \c \@duration or the element <tt><b>SegmentTimeline</b></tt> shall be present. + * The attribute \c \@duration and the element <tt><b>SegmentTimeline</b></tt> shall not be present at the same time. + * Segments described by the Segment base information are referenced by an HTTP-URL conforming to the type URLType as defined in Table 13. + * @see dash::mpd::IURLType dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ISEGMENTBASE_H_ +#define ISEGMENTBASE_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "IURLType.h" + +namespace dash +{ + namespace mpd + { + class ISegmentBase : public virtual IMPDElement + { + public: + virtual ~ISegmentBase(){} + + /** + * Returns a pointer to a dash::mpd::IURLType object that specifies the URL including a possible byte range for the Initialization Segment. + * @return a pointer to dash::mpd::IURLType object + */ + virtual const IURLType* GetInitialization () const = 0; + + /** + * Returns a pointer to a dash::mpd::IURLType object that specifies the URL including a possible byte range for the Representation Index Segment. + * @return a pointer to dash::mpd::IURLType object + */ + virtual const IURLType* GetRepresentationIndex () const = 0; + + /** + * Returns an integer representing a timescale that specifies the timescale in units per seconds + * to be used for the derivation of different real-time duration values in the Segment Information.\n + * \b NOTE: This may be any frequency but typically is the media clock frequency of one of the media streams (or a positive integer multiple thereof). + * @return an unsigned integer + */ + virtual uint32_t GetTimescale () const = 0; + + /** + * Returns an integer that specifies the presentation time offset of the Representation relative to the start of the Period.\n + * The value of the presentation time offset in seconds is the division of the value of this attribute and the value of the \c \@timescale attribute.\n + * If not present on any level, the value of the presentation time offset is 0. + * @return an unsigned integer + */ + virtual uint32_t GetPresentationTimeOffset () const = 0; + + /** + * Returns a string that specifies the byte range that contains the Segment Index in all Media Segments of the Representation.\n + * The byte range shall be expressed and formatted as a \c byte-range-spec as defined in RFC 2616, Clause 14.35.1. + * It is restricted to a single expression identifying a contiguous range of bytes. + * @return a reference to a string + */ + virtual const std::string& GetIndexRange () const = 0; + + /** + * When set to \c 'true' specifies that for all Segments in the Representation, the data outside the prefix defined by \c \@indexRange contains the data + * needed to access all access units of all media streams syntactically and semantically. + * @return a bool value + */ + virtual bool HasIndexRangeExact () const = 0; + }; + } +} + +#endif /* ISEGMENTBASE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ISegmentList.h b/src/libdash/include/ISegmentList.h new file mode 100644 index 00000000..803df66d --- /dev/null +++ b/src/libdash/include/ISegmentList.h @@ -0,0 +1,58 @@ +/** + * @class dash::mpd::ISegmentList + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>SegmentList</b></tt> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.3.2, table 14 + * @details The Segment list is defined by one or more <tt><b>SegmentList</b></tt> elements. Each <tt><b>SegmentList</b></tt> element itself contains a list of <tt><b>SegmentURL</b></tt> elements + * for a consecutive list of Segment URLs. Each Segment URL may contain the Media Segment URL and possibly a byte range. + * The Segment URL element may also contain an Index Segment. + * @see dash::mpd::ISegmentURL dash::mpd::IMultipleSegmentBase + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ISEGMENTLIST_H_ +#define ISEGMENTLIST_H_ + +#include "config.h" + +#include "ISegmentURL.h" +#include "IMultipleSegmentBase.h" + +namespace dash +{ + namespace mpd + { + class ISegmentList : public virtual IMultipleSegmentBase + { + public: + virtual ~ISegmentList(){} + + /** + * Returns a reference to a vector of pointers to dash::mpd::ISegmentURL objects that are contained in this SegmentList. + * @return a reference to a vector of pointers to dash::mpd::ISegmentURL objects + */ + virtual const std::vector<ISegmentURL *>& GetSegmentURLs () const = 0; + + /** + * Returns a reference to a string that specifies a reference to an external <tt><b>SegmentList</b></tt> element. + * @return a reference to a string + */ + virtual const std::string& GetXlinkHref () const = 0; + + /** + * Returns a reference to a string that specifies the processing set - can be either \c \"onLoad\" or \c \"onRequest\". + * @return a reference to a string + */ + virtual const std::string& GetXlinkActuate () const = 0; + + }; + } +} + +#endif /* ISEGMENTLIST_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ISegmentTemplate.h b/src/libdash/include/ISegmentTemplate.h new file mode 100644 index 00000000..d7072956 --- /dev/null +++ b/src/libdash/include/ISegmentTemplate.h @@ -0,0 +1,148 @@ +/** + * @class dash::mpd::ISegmentTemplate + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>SegmentTemplate</b></tt> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.4.2, table 15 + * @details The Segment template is defined by the <tt><b>SegmentTemplate</b></tt> element. In this case, specific identifiers that are substituted by dynamic values assigned to Segments, + * to create a list of Segments. The substitution rules are provided in section 5.3.9.4.4 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @see dash::mpd::ISegment dash::mpd::IMultipleSegmentBase + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + + +#ifndef ISEGMENTTEMPLATE_H_ +#define ISEGMENTTEMPLATE_H_ + +#include "config.h" + +#include "IMultipleSegmentBase.h" + +namespace dash +{ + namespace mpd + { + class ISegmentTemplate : public virtual IMultipleSegmentBase + { + public: + virtual ~ISegmentTemplate(){} + + /** + * Returns a reference to a string that specifies the template to create the Media Segment List.\n + * For more details on template-based segment URL construction refer to section 5.3.9.4.4 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a string + */ + virtual const std::string& Getmedia () const = 0; + + /** + * Returns a reference to a string that specifies the template to create the Index Segment List. If neither the \em \$Number\$ nor the \em \$Time\$ identifier + * is included, this provides the URL to a Representation Index. \n + * For more details on template-based segment URL construction refer to section 5.3.9.4.4 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a string + */ + virtual const std::string& Getindex () const = 0; + + /** + * Returns a reference to a string that specifies the template to create the Initialization Segment. Neither \em \$Number\$ nor the \em \$Time\$ identifier + * shall be included. \n + * For more details on template-based segment URL construction refer to section 5.3.9.4.4 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a string + */ + virtual const std::string& Getinitialization () const = 0; + + /** + * Returns a reference to a string that specifies the template to create the Bitstream Switching Segment. Neither \em \$Number\$ nor the \em \$Time\$ identifier shall be included.\n + * For more details on template-based segment URL construction refer to section 5.3.9.4.4 of <em>ISO/IEC 23009-1, Part 1, 2012</em>. + * @return a reference to a string + */ + virtual const std::string& GetbitstreamSwitching () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object that represents an initialization segment and can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the Initialization Segment (template). + * @param representationID a string containing the representation ID that will replace the identifier \em \$RepresentationID\$ in the Initialization template. \n + * \b NOTE: If there is no identifier \em \$RepresentationID\$ in the template then this parameter will not be used and can be set to \"\". + * @param bandwidth an integer specifying the bandwidth that will replace the identifier \em \$Bandwidth\$ in the initialization template. + * This integer will be formated according to a possibly contained format tag in the \em \$Bandwidth\$ identifier. \n + * \b NOTE: If there is no identifier \em \$bandwidth\$ in the template then this parameter will not be used and can be set to 0. + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* ToInitializationSegment (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth) const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object that represents a Bitstream Switching Segment and can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the Bitstream Switching Segment (template). + * @param representationID a string containing the representation ID that will replace the identifier \em \$RepresentationID\$ in the Bitstream Switching template. \n + * \b NOTE: If there is no identifier \em \$RepresentationID\$ in the template then this parameter will not be used and can be set to \"\". + * @param bandwidth an integer specifying the bandwidth that will replace the identifier \em \$Bandwidth\$ in the Bitstream Switching template. + * This integer will be formated according to a possibly contained format tag in the \em \$Bandwidth\$ identifier.\n + * \b NOTE: If there is no identifier \em \$bandwidth\$ in the template then this parameter will not be used and can be set to 0. + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* ToBitstreamSwitchingSegment (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth) const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object that represents a Media Segment and can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the Media Segment (template). + * @param representationID a string containing the representation ID that will replace the identifier \em \$RepresentationID\$ in the Media template.\n + * \b NOTE: If there is no identifier \em \$RepresentationID\$ in the template then this parameter will not be used and can be set to \"\". + * @param bandwidth an integer specifying the bandwidth that will replace the identifier \em \$Bandwidth\$ in the Media template. + * This integer will be formated according to a possibly contained format tag in the \em \$Bandwidth\$ identifier. \n + * \b NOTE: If there is no identifier \em \$bandwidth\$ in the template then this parameter will not be used and can be set to 0. + * @param number an integer specifying the desired Segment number that will replace the identifier \em \$Number\$ in the Media template. + * This integer will be formated according to a possibly contained format tag in the \em \$Number\$ identifier. + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* GetMediaSegmentFromNumber (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t number) const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object that represents a Index Segment and can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the Index Segment (template). + * @param representationID a string containing the representation ID that will replace the identifier \em \$RepresentationID\$ in the Index template.\n + * \b NOTE: If there is no identifier \em \$RepresentationID\$ in the template then this parameter will not be used and can be set to \"\". + * @param bandwidth an integer specifying the bandwidth that will replace the identifier \em \$Bandwidth\$ in the Index template. + * This integer will be formated according to a possibly contained format tag in the \em \$Bandwidth\$ identifier.\n + * \b NOTE: If there is no identifier \em \$bandwidth\$ in the template then this parameter will not be used and can be set to 0. + * @param number an integer specifying the desired Segment number that will replace the identifier \em \$Number\$ in the Index template. + * This integer will be formated according to a possibly contained format tag in the \em \$Number\$ identifier. + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* GetIndexSegmentFromNumber (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t number) const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object that represents a Media Segment and can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the Media Segment (template). + * @param representationID a string containing the representation ID that will replace the identifier \em \$RepresentationID\$ in the Media template. + * \b NOTE: If there is no identifier \em \$RepresentationID\$ in the template then this parameter will not be used and can be set to \"\". + * @param bandwidth an integer specifying the bandwidth that will replace the identifier \em \$Bandwidth\$ in the Media template. + * This integer will be formated according to a possibly contained format tag in the \em \$Bandwidth\$ identifier.\n + * \b NOTE: If there is no identifier \em \$bandwidth\$ in the template then this parameter will not be used and can be set to 0. + * @param time an integer corresponding to the <tt><b>SegmentTimeline</b>\@t</tt> attribute that will replace the identifier \em \$Time\$ in the Media template. + * This integer will be formated according to a possibly contained format tag in the \em \$Time\$ identifier. + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* GetMediaSegmentFromTime (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t time) const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object that represents a Index Segment and can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the Index Segment (template). + * @param representationID a string containing the representation ID that will replace the identifier \em \$RepresentationID\$ in the Index template.\n + * \b NOTE: If there is no identifier \em \$RepresentationID\$ in the template then this parameter will not be used and can be set to \"\". + * @param bandwidth an integer specifying the bandwidth that will replace the identifier \em \$Bandwidth\$ in the Index template. + * This integer will be formated according to a possibly contained format tag in the \em \$Bandwidth\$ identifier.\n + * \b NOTE: If there is no identifier \em \$bandwidth\$ in the template then this parameter will not be used and can be set to 0. + * @param time an integer corresponding to the <tt><b>SegmentTimeline</b>\@t</tt> attribute that will replace the identifier \em \$Time\$ in the Index template. + * This integer will be formated according to a possibly contained format tag in the \em \$Time\$ identifier. + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* GetIndexSegmentFromTime (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t time) const = 0; + }; + } +} + +#endif /* ISEGMENTTEMPLATE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ISegmentTimeline.h b/src/libdash/include/ISegmentTimeline.h new file mode 100644 index 00000000..809ee735 --- /dev/null +++ b/src/libdash/include/ISegmentTimeline.h @@ -0,0 +1,50 @@ +/** + * @class dash::mpd::ISegmentTimeline + * @brief This interface is needed for accessing the subelements of the <tt><b>SegmentTimeline</b></tt> element, as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.6 + * @details The <tt><b>SegmentTimeline</b></tt> element expresses the earliest presentation time and presentation duration (in units based on the \c \@timescale attribute) + * for each Segment in the Representation. The use is an alternative to providing the \c \@duration attribute and provides three additional features: + * <ul> + * <li> the specification of arbitrary Segment durations, + * <li> the specification of accurate Segment durations for one media stream where the duration expresses presentation duration of the Segment, and + * <li> the signalling of discontinuities of the Media Presentation timeline for which no Segment data are present in a specific Representation. + * </ul> + * For compactness the syntax of this element includes run-length compression to express a sequence of Segments having constant duration.\n\n + * The <tt><b>SegmentTimeline</b></tt> element shall contain a list of <tt><b>S</b></tt> elements each of which describes a sequence of contiguous segments of identical MPD duration. + * @see dash::mpd::ITimeline dash::mpd::IMultipleSegmentBase dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ISEGMENTTIMELINE_H_ +#define ISEGMENTTIMELINE_H_ + +#include "config.h" + +#include "ITimeline.h" +#include "IMPDElement.h" + +namespace dash +{ + namespace mpd + { + class ISegmentTimeline : public virtual IMPDElement + { + public: + virtual ~ISegmentTimeline(){} + + /** + * Returns a reference to a vector of pointers to dash::mpd::ITimeline objects, that correspond to the to <b><tt>S</tt></b> elements. + * @return a reference to vector of pointers to dash::mpd::ITimeline objects + */ + virtual std::vector<ITimeline *>& GetTimelines () const = 0; + }; + } +} + +#endif /* ISEGMENTTIMELINE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ISegmentURL.h b/src/libdash/include/ISegmentURL.h new file mode 100644 index 00000000..236dc923 --- /dev/null +++ b/src/libdash/include/ISegmentURL.h @@ -0,0 +1,94 @@ +/** + * @class dash::mpd::ISegmentURL + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>SegmentURL</b></tt> element + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.3.2, table 14 + * @details Each Segment URL may contain the Media Segment URL and possibly a byte range. The Segment URL element may also contain an Index Segment. + * @see dash::mpd::ISegment dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ISEGMENTURL_H_ +#define ISEGMENTURL_H_ + +#include "config.h" + +#include "ISegment.h" +#include "IBaseUrl.h" +#include "IMPDElement.h" + +namespace dash +{ + namespace mpd + { + class ISegmentURL : public virtual IMPDElement + { + public: + virtual ~ISegmentURL(){} + + /** + * Returns a reference to a string that in combination with the \c \@mediaRange attribute specifies the HTTP-URL for the Media Segment.\n + * It shall be formated as an \c <absolute-URI> according to RFC 3986, Clause 4.3, with a fixed scheme of \"http\" or \"https\" or + * as a \c <relative-ref> according to RFC 3986, Clause 4.2.\n + * If not present, then any <tt><b>BaseURL</b></tt> element is mapped to the \c \@media attribute and the range attribute shall be present. + * @return a reference to a string + */ + virtual const std::string& GetMediaURI () const = 0; + + /** + * Returns a reference to a string that specifies the byte range within the resource identified by the \c \@media corresponding to the Media Segment. + * The byte range shall be expressed and formatted as a \c byte-range-spec as defined in RFC 2616, Clause 14.35.1. + * It is restricted to a single expression identifying a contiguous range of bytes.\n + * If not present, the Media Segment is the entire resource referenced by the \c \@media attribute. + * @return a reference to a string + */ + virtual const std::string& GetMediaRange () const = 0; + + /** + * Returns a reference to a string that in combination with the \c \@indexRange attribute specifies the HTTP-URL for the Index Segment. + * It shall be formated as an \c <absolute-URI> according to RFC 3986, Clause 4.3, with a fixed scheme of \"http\" or \"https\" or + * as a \c <relative-ref> according to RFC 3986, Clause 4.2. \n + * If not present and the \c \@indexRange not present either, then no Index Segment information is provided for this Media Segment.\n + * If not present and the \c \@indexRange present, then the \c \@media attribute is mapped to the \c \@index. If the \c \@media attribute is not present either, + * then any <tt><b>BaseURL</b></tt> element is mapped to the \c \@index attribute and the \c \@indexRange attribute shall be present. + * @return a reference to a string + */ + virtual const std::string& GetIndexURI () const = 0; + + /** + * Returns a reference to a string that specifies the byte range within the resource identified by the \c \@index corresponding to the Index Segment. + * If \c \@index is not present, it specifies the byte range of the Segment Index in Media Segment.\n + * The byte range shall be expressed and formatted as a \c byte-range-spec as defined in RFC 2616, Clause 14.35.1. It is restricted to a single + * expression identifying a contiguous range of bytes. \n + * If not present, the Index Segment is the entire resource referenced by the \c \@index attribute. + * @return a reference to a string + */ + virtual const std::string& GetIndexRange () const = 0; + + virtual uint64_t GetActualRate () = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object which represents a media segment that can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the media segment + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* ToMediaSegment (const std::vector<IBaseUrl *>& baseurls) const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object that represents an index segment and can be downloaded. + * @param baseurls a vector of pointers to dash::mpd::IBaseUrl objects that represent the path to the index segment + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* ToIndexSegment (const std::vector<IBaseUrl *>& baseurls) const = 0; + + }; + } +} + +#endif /* ISEGMENTURL_H_ */ diff --git a/src/libdash/include/ISubRepresentation.h b/src/libdash/include/ISubRepresentation.h new file mode 100644 index 00000000..a93605c2 --- /dev/null +++ b/src/libdash/include/ISubRepresentation.h @@ -0,0 +1,70 @@ +/** + * @class dash::mpd::ISubRepresentation + * @brief This interface is needed for accessing the attributes and elements of the <tt><b>SubRepresentation</b></tt> element as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.6.2, table 8 + * @details Sub-Representations are embedded in regular Representations and are described by the <tt><b>SubRepresentation</b></tt> element. + * <tt><b>SubRepresentation</b></tt> elements are contained in a <tt><b>Representation</b></tt> element.\n + * The SubRepresentation element describes properties of one or several media content components that are embedded in the Representation. + * It may for example describe the exact properties of an embedded audio component (e.g., codec, sampling rate, etc.), + * an embedded sub-title (e.g., codec) or it may describe some embedded lower quality video layer (e.g. some lower frame rate, etc.). + * @see dash::mpd::IRepresentationBase + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ISUBREPRESENTATION_H_ +#define ISUBREPRESENTATION_H_ + +#include "config.h" + +#include "IRepresentationBase.h" + +namespace dash +{ + namespace mpd + { + class ISubRepresentation : public virtual IRepresentationBase + { + public: + virtual ~ISubRepresentation(){} + + /** + * Returns an integer that specifies the Sub-Representation level. If \c \@level attribute is present and for media formats used in this Part of ISO/IEC 23009, + * a Subsegment Index as defined in section 6.3.2.4 of <em>ISO/IEC 23009-1, Part 1, 2012</em> shall be available for each Media Segment in the containing Representation. + * @return an unsigned integer + */ + virtual uint32_t GetLevel () const = 0; + + /** + * Returns a reference to a vector of unsigned integers that specifies the set of Sub-Representations within this Representation that this Sub-Representation depends on + * in the decoding and/or presentation process as a list of \c \@level values.\n + * If not present, the Sub-Representation can be decoded and presented independently of any other Representation. + * @return a reference to a vector of unsigned integers + */ + virtual const std::vector<uint32_t>& GetDependencyLevel () const = 0; + + /** + * Returns an integer that is identical to the \c \@bandwidth definition in Representation, but applied to this Sub-Representation. + * This attribute shall be present if the \c \@level attribute is present. + * @return an unsigned integer + */ + virtual uint32_t GetBandWidth () const = 0; + + /** + * Returns a reference to a vector of strings that specifies the set of all media content components + * that are contained in this Sub-Representation as <tt><b>ContentComponent</b>\@id</tt> values. \n + * If not present, the Sub-Representation is not assigned to a media content component. + * @return a reference to a vector of strings + */ + virtual const std::vector<std::string>& GetContentComponent () const = 0; + + }; + } +} + +#endif /* ISUBREPRESENTATION_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ISubset.h b/src/libdash/include/ISubset.h new file mode 100644 index 00000000..6d5c8566 --- /dev/null +++ b/src/libdash/include/ISubset.h @@ -0,0 +1,54 @@ +/** + * @class dash::mpd::ISubset + * @brief This interface is needed for accessing the attributes of the <tt><b>Subset</b></tt> element as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.8.2, table 10 + * @details Subsets are described by the <tt><b>Subset</b></tt> element contained in the <tt><b>Period</b></tt> element. \n + * Subsets provide a mechanism to restrict the combination of active Adaptation Sets where an active Adaptation Set is one + * for which the DASH client is presenting at least one of the contained Representations.\n + * A Subset defines a set of one or more Adaptation Sets. The presence of a <tt><b>Subset</b></tt> element within a <tt><b>Period</b></tt> element expresses + * the intention of the creator of the Media Presentation that a client should act as follows: + * At any time, the set of active Adaptation Sets shall be a subset of the Adaptation Sets of one of the specified Subsets. + * Any Adaptation Set not explicitly contained in any Subset element is implicitly contained in all specified Subsets.\n + * This implies that + * <ul> + * <li>Empty Subsets are not allowed. + * <li>No Subset should contain all the Adaptation Sets. + * </ul> + * Each Adaptation Set for which the value of the \c \@id is provided in the \c \@contains attribute is contained in this Subset. + * @see dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ISUBSET_H_ +#define ISUBSET_H_ + +#include "config.h" + +#include "IMPDElement.h" + +namespace dash +{ + namespace mpd + { + class ISubset : public virtual IMPDElement + { + public: + virtual ~ISubset(){} + + /** + * Returns a reference to a vector of unsigned integers specifying the Adaptation Sets contained in a Subset by providing + * the \c \@id values of the contained Adaptation Sets. + * @return a reference to a vector of unsigned integers + */ + virtual const std::vector<uint32_t>& Contains () const = 0; + }; + } +} + +#endif /* ISUBSET_H_ */
\ No newline at end of file diff --git a/src/libdash/include/ITCPConnection.h b/src/libdash/include/ITCPConnection.h new file mode 100644 index 00000000..3d4f4867 --- /dev/null +++ b/src/libdash/include/ITCPConnection.h @@ -0,0 +1,40 @@ +/** + * @class dash::metrics::ITCPConnection + * @brief This interface is needed for accessing the attributes and the content of a <tt><b>TCP Connection</b></tt> + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, annex D.4.2 + * @see + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ITCTPCONNECTION_H_ +#define ITCTPCONNECTION_H_ + +#include "config.h" + +namespace dash +{ + namespace metrics + { + class ITCPConnection + { + public: + virtual ~ITCPConnection (){} + + virtual uint32_t TCPId () const = 0; + virtual const std::string& DestinationAddress () const = 0; + virtual const std::string& ConnectionOpenedTime () const = 0; + virtual const std::string& ConnectionClosedTime () const = 0; + virtual uint64_t ConnectionTime () const = 0; + + }; + } +} + +#endif /* ITCTPCONNECTION_H_ */ diff --git a/src/libdash/include/IThroughputMeasurement.h b/src/libdash/include/IThroughputMeasurement.h new file mode 100644 index 00000000..c35cb9ae --- /dev/null +++ b/src/libdash/include/IThroughputMeasurement.h @@ -0,0 +1,38 @@ +/** + * @class dash::metrics::IThroughputMeasurement + * @brief This interface is needed for accessing the attributes and the content of a single <tt><b>Throughput Measurment</b></tt> entry + * as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, annex D.4.3 (part of the HTTP Request/Response Transaction) + * @see dash::metrics::IHTTPTransaction + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ITHROUGHPUTMEASUREMENT_H_ +#define ITHROUGHPUTMEASUREMENT_H_ + +#include "config.h" + +namespace dash +{ + namespace metrics + { + class IThroughputMeasurement + { + public: + virtual ~IThroughputMeasurement (){} + + virtual const std::string& StartOfPeriod () const = 0; + virtual uint64_t DurationOfPeriod () const = 0; + virtual const std::vector<uint32_t>& ReceivedBytesPerTrace () const = 0; + + }; + } +} + +#endif /* ITHROUGHPUTMEASUREMENT_H_ */ diff --git a/src/libdash/include/ITimeline.h b/src/libdash/include/ITimeline.h new file mode 100644 index 00000000..e1f8e953 --- /dev/null +++ b/src/libdash/include/ITimeline.h @@ -0,0 +1,66 @@ +/** + * @class dash::mpd::ITimeline + * @brief This interface is needed for accessing the attributes of <b><tt>S</tt></b> elements, as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.6.1 + * @details dash::mpd::ITimeline objects correspond to <b><tt>S</tt></b> elements of the <tt><b>SegmentTimeline</b></tt> \n \n + * The <b><tt>S</tt></b> element contains a mandatory \c \@d attribute specifying the MPD duration, + * an optional \c \@r repeat count attribute specifying the number of contiguous Segments with identical MPD duration minus one + * and an optional \c \@t time attribute specifying the MPD start time of the first Segment in the series. + * @see dash::mpd::ISegmentTimeline dash::mpd::IMultipleSegmentBase dash::mpd::IMPDElement + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef ITIMELINE_H_ +#define ITIMELINE_H_ + +#include "config.h" + +#include "IMPDElement.h" + +namespace dash +{ + namespace mpd + { + class ITimeline : public virtual IMPDElement + { + public: + virtual ~ITimeline(){} + + /** + * Returns an integer that specifies the MPD start time, in \c \@timescale units, the first Segment in the series starts relative to the beginning of the Period.\n + * The value of this attribute must be equal to or greater than the sum of the previous <tt><b>S</b></tt> element earliest presentation time and + * the sum of the contiguous Segment durations. \n + * If the value of the attribute is greater than what is expressed by the previous <tt><b>S</b></tt> element, it expresses discontinuities in the timeline.\n + * If not present then the value shall be assumed to be zero for the first S element and for the subsequent <tt><b>S</b></tt> elements, + * the value shall be assumed to be the sum of the previous <tt><b>S</b></tt> element's earliest presentation time and contiguous duration + * (i.e. previous <tt><b>S</b>\@t</tt> + \c \@d * (\c \@r + 1)).\n\n + * \em StartTime corresponds to the \c \@t attribute. + * @return an unsigned integer + */ + virtual uint32_t GetStartTime () const = 0; + + /** + * Returns the integer that specifies the Segment duration, in units of the value of the \c \@timescale. \n\n + * \em Duration corresponds to the \c \@d attribute. + * @return an unsigned integer + */ + virtual uint32_t GetDuration () const = 0; + + /** + * Returns an integer that specifies the repeat count of the number of following contiguous Segments with the same duration expressed by the value of \c \@d. + * This value is zero-based (e.g. a value of three means four Segments in the contiguous series). \n\n + * \em RepeatCount corresponds to the \c \@r attribute. + * @return an unsigned integer + */ + virtual uint32_t GetRepeatCount () const = 0; + }; + } +} + +#endif /* ITIMELINE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/IURLType.h b/src/libdash/include/IURLType.h new file mode 100644 index 00000000..67f893b5 --- /dev/null +++ b/src/libdash/include/IURLType.h @@ -0,0 +1,61 @@ +/** + * @class dash::mpd::IURLType + * @brief This interface is needed for accessing the attributes of <tt><b>URLType</b></tt> elements, as specified in <em>ISO/IEC 23009-1, Part 1, 2012</em>, section 5.3.9.2.2, table 13 + * @details This object defines an HTTP-URL\n + * @see dash::mpd::IBaseUrl dash::mpd::IMPDElement dash::mpd::ISegment + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef IURLTYPE_H_ +#define IURLTYPE_H_ + +#include "config.h" + +#include "IMPDElement.h" +#include "ISegment.h" +#include "IBaseUrl.h" + +namespace dash +{ + namespace mpd + { + class IURLType : public virtual IMPDElement + { + public: + virtual ~IURLType(){} + + /** + * Returns a reference to a string that pecifies the source URL part and shall be formated either as an \c <absolute-URI> according to RFC 3986, Clause 4.3, + * with a fixed scheme of \"http\" or \"https\" or as a \c <relative-ref> according to RFC 3986, Clause 4.2.\n + * If not present, then any <tt><b>BaseURL</b></tt> element is mapped to the \c \@sourceURL attribute and the range attribute shall be present. + * @return a reference to a string + */ + virtual const std::string& GetSourceURL () const = 0; + + /** + * Returns a reference to a string that specifies the byte range restricting the above HTTP-URL.\n + * The byte range shall be expressed and formatted as a byte-range-spec as defined in RFC 2616, Clause 14.35.1. It is restricted to a single expression identifying a + * contiguous range of bytes.\n + * If not present, the element refers to the entire resource referenced in the \c \@sourceURL attribute. + * @return a reference to a string + */ + virtual const std::string& GetRange () const = 0; + + /** + * Returns a pointer to a dash::mpd::ISegment object, that can be downloaded + * @param baseurls a reference to a vector of pointers to dash::mpd::IBaseUrl objects representing the path to \c \@sourceURL + * @return a pointer to a dash::mpd::ISegment object + */ + virtual ISegment* ToSegment (const std::vector<IBaseUrl *>& baseurls) const = 0; + }; + } +} + +#endif /* IURLTYPE_H_ */
\ No newline at end of file diff --git a/src/libdash/include/config.h b/src/libdash/include/config.h new file mode 100644 index 00000000..951c7e12 --- /dev/null +++ b/src/libdash/include/config.h @@ -0,0 +1,37 @@ +/** + * config.h + * + * @brief Standard includes that are used by the library + * @details ... + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef CONFIG_H_ +#define CONFIG_H_ + +/******************************** + * Pragmas + ********************************/ +#pragma warning( disable : 4250 ) // virtual inheritance +/******************************** + * Standard includes + ********************************/ +#include <stdlib.h> +#include <string> +#include <sstream> +#include <vector> +#include <stdint.h> +#include <map> +#include <deque> +#include <iostream> +#include <cstdlib> +#include <string.h> + +#endif /* CONFIG_H_ */ diff --git a/src/libdash/include/libdash.h b/src/libdash/include/libdash.h new file mode 100644 index 00000000..01b80bbd --- /dev/null +++ b/src/libdash/include/libdash.h @@ -0,0 +1,31 @@ +/** + * libdash.h + * + * @brief The main interface to the libary that should be used to create a IDASHManager + * @details ... + * + * @author bitmovin Softwareentwicklung OG \n + * Email: libdash-dev@vicky.bitmovin.net + * @version 2.1 + * @date 2013 + * @copyright bitmovin Softwareentwicklung OG, All Rights Reserved \n\n + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + */ + +#ifndef LIBDASH_H_ +#define LIBDASH_H_ + +#include "config.h" + +#if defined _WIN32 || defined _WIN64 +#else +#define __declspec(dllexport) +#define __cdecl +#endif + +#include "IDASHManager.h" + +__declspec(dllexport) dash::IDASHManager* __cdecl CreateDashManager(); + +#endif /* LIBDASH_H_ */ diff --git a/src/libdash/license.txt b/src/libdash/license.txt new file mode 100644 index 00000000..fee56851 --- /dev/null +++ b/src/libdash/license.txt @@ -0,0 +1,13 @@ +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
\ No newline at end of file diff --git a/src/libdash/mainpage.dox b/src/libdash/mainpage.dox new file mode 100644 index 00000000..1a718a6e --- /dev/null +++ b/src/libdash/mainpage.dox @@ -0,0 +1,93 @@ +/** +\mainpage libdash 2.1 + +libdash is a library that provides an object orient (OO) interface to the MPEG-DASH standard. + +## Features + +- Cross platform build system based on cmake that includes Windows, Linux and Mac. +- Open source available and licensed under the LGPL. +- Implements the full MPEG-DASH standard according to ISO/IEC 23009-1, Information Technology Dynamic Adaptive Streaming over HTTP (DASH) Part 1: Media Presentation Description and Segment Formats +- Handles the download and xml parsing of the MPD. Based on that it provides an OO based interface to the MPD. +- Media elements, e.g., SegmentURL, SegmentTemplate, etc., are downloadable in that OO based structure and can be downloaded through libdash, which internally uses libcurl. +- Therefore basically all protocols that libcurl supports, e.g., HTTP, FTP, etc. are supported by libdash. +- However it also provides a configurable download interface, which enables the use of external connections that can be implemented by the user of the library for the download of media segments. +- The use of such external connections will be shown in the libdash_networkpart_test project which is part of libdash solution and also part of the cross platform cmake system and therefore usable on Windows, Linux and Mac. +- The project contains a sample multimedia player that is based on ffmpeg which uses libdash for the playback of one of our dataset MPDs. +- The development is based on Windows, therefore the code contains a VS10 solution with additional tests and the sample multimedia player. + +## Architecture +<p align="justify">The general architecture of MPEG-DASH is depicted in the figure below where the orange parts are standardized, i.e., the MPD and segment formats. The delivery of the MPD, the control heuristics and the media player itself, are depicted in blue in the figure. These parts are not standardized and allow the differentiation of industry solutions due to the performance or different features that can be integrated at that level. libdash is also depicted in blue and encapsulates the MPD parsing and HTTP part, which will be handled by the library. Therefore the library provides interfaces for the DASH Streaming Control and the Media Player to access MPDs and downloadable media segments. The download order of such media segments will not be handled by the library this is left to the DASH Streaming Control, which is an own component in this architecture but it could also be included in the Media Player. +</p> +<p align="justify"> +In a typical deployment, a DASH server provides segments in several bitrates and resolutions. The client initially receives the MPD through libdash which provides a convenient object orient interface to that MPD. The MPD contains the temporal relationships for the various qualities and segments. Based on that information the client can download individual media segments through libdash at any point in time. Therefore varying bandwidth conditions can be handled by switching to the corresponding quality level at segment boundaries in order to provide a smooth streaming experience. This adaptation is not part of libdash and the MPEG-DASH standard and will be left to the application which is using libdash. +</p> + + +![libdash architecture](http://www.bitmovin.net/wp-content/uploads/2013/01/libdash_arch-1024x483.png "libdash arch") + +## Mailinglist + +We offer a public accessible mailing list for discussions, questions, announcements, bug-reports, etc. around libdash. Everybody is invited to join, you can find the registration at: + +[libdash-dev] (http://vicky.bitmovin.net/mailman/listinfo/libdash-dev) + +There are a lot of things to do! So everybody is invited to contribute, to get involved in and exited about DASH! + +## Sources and Binaries + +You can find the latest sources and binaries in our [download section] (http://www.bitmovin.net/?page_id=851) and on github. + +## How to use + +### Windows +1. Download the tarball or clone the repository from gitlab (git://github.com/bitmovin/libdash.git) +2. Open the libdash.sln with Visual Studio 2010 +3. Build the solution +4. After that all files will be provided in the bin folder +5. You can test the library with the sampleplayer.exe. This application simply downloads the lowest representation of one of our dataset MPDs. + +### Ubuntu 12.04 +1. sudo apt-get install git-core build-essential cmake libxml2-dev libcurl4-openssl-dev +2. git clone git://github.com/bitmovin/libdash.git +3. cd libdash/libdash +4. mkdir build +5. cd build +6. cmake ../ +7. make +8. cd bin +9. The library and a simple test of the network part of the library should be available now. You can test the network part of the library with +10. ./libdash_networpart_test + +## License + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +## Professional Services + +In addition to the public available open source resources and the mailing list support, we provide professional development and integration services, consulting, high-quality streaming componentes/logics, etc. based on your individual needs. Feel free to contact us via sales@bitmovin.net so we can discuss your requirements and provide you an offer. + +## Acknowledgements + +We specially want to thank our passionate developers at [bitmovin](http://www.bitmovin.net/) as well as the researchers at the [Institute of Information Technology](http://www-itec.aau.at/dash/) (ITEC) from the Alpen Adria Universitaet Klagenfurt (AAU)! + +Furthermore we want to thank the [Netidee](http://www.netidee.at) initiative from the [Internet Foundation Austria](http://www.nic.at/ipa) for partially funding the open source development of libdash. + +## Citation of libdash +We kindly ask you to refer the following paper in any publication mentioning libdash: + +Christopher Mueller and Christian Timmerer. 2011. A VLC media player plugin enabling dynamic adaptive streaming over HTTP. In Proceedings of the 19th ACM international conference on Multimedia (MM '11). ACM, New York, NY, USA, 723-726. DOI=10.1145/2072298.2072429 [[pdf]](http://doi.acm.org/10.1145/2072298.2072429) + +*/
\ No newline at end of file diff --git a/src/libdash/source/defaults.mk b/src/libdash/source/defaults.mk new file mode 100644 index 00000000..d446c620 --- /dev/null +++ b/src/libdash/source/defaults.mk @@ -0,0 +1,7 @@ +LIBNAME=libdash +CC=g++ +AR=ar +LD=g++ +ARFLAGS=-cr +CFLAGS=-fPIC -c -Wall #-DDEBUG +LDFLAGS=-shared -Wl,-soname,$(LIBNAME).so diff --git a/src/libdash/source/dllmain.cpp b/src/libdash/source/dllmain.cpp new file mode 100644 index 00000000..b624228b --- /dev/null +++ b/src/libdash/source/dllmain.cpp @@ -0,0 +1,33 @@ +/* + * dllmain.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#if defined _WIN32 || defined _WIN64 + +#include "targetver.h" +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif diff --git a/src/libdash/source/helpers/Block.h b/src/libdash/source/helpers/Block.h new file mode 100644 index 00000000..c71462e8 --- /dev/null +++ b/src/libdash/source/helpers/Block.h @@ -0,0 +1,59 @@ +/* + * Block.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef __BLOCK_H__ +#define __BLOCK_H__ + +#include "config.h" + +namespace dash +{ + namespace helpers + { + struct block_t + { + uint8_t *data; + size_t len; + float millisec; + size_t offset; + }; + + static inline block_t* AllocBlock (size_t len) + { + block_t *block = (block_t *)malloc(sizeof(block_t)); + block->data = new uint8_t[len]; + block->len = len; + block->millisec = 0; + block->offset = 0; + return block; + } + static inline void DeleteBlock (block_t *block) + { + if(block) + { + delete [] block->data; + free(block); + block = NULL; + } + } + static inline block_t* DuplicateBlock (block_t *block) + { + block_t *ret = AllocBlock(block->len); + ret->offset = block->offset; + + memcpy(ret->data, block->data, ret->len); + + return block; + } + } +} + +#endif diff --git a/src/libdash/source/helpers/BlockStream.cpp b/src/libdash/source/helpers/BlockStream.cpp new file mode 100644 index 00000000..fd34f88e --- /dev/null +++ b/src/libdash/source/helpers/BlockStream.cpp @@ -0,0 +1,290 @@ +/* + * BlockStream.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "BlockStream.h" +#include <limits> + +using namespace dash::helpers; + +BlockStream::BlockStream () : + length (0) +{ +} +BlockStream::~BlockStream () +{ + this->Clear(); +} + +void BlockStream::PopAndDeleteFront () +{ + if(this->blockqueue.empty()) + return; + + this->length -= this->blockqueue.front()->len; + DeleteBlock(this->blockqueue.front()); + this->blockqueue.pop_front(); +} +void BlockStream::PushBack (block_t *block) +{ + this->length += block->len; + this->blockqueue.push_back(block); +} +void BlockStream::PushFront (block_t *block) +{ + this->length += block->len; + this->blockqueue.push_front(block); +} +const block_t* BlockStream::GetBytes (uint32_t len) +{ + /* Performance Intensive */ + if(this->length < len) + return NULL; + + block_t *block = AllocBlock(len); + this->BlockQueueGetBytes(block->data, block->len); + + this->length -= len; + + return block; +} +size_t BlockStream::GetBytes (uint8_t *data, size_t len) +{ + /* Performance Intensive */ + if(len > this->length) + len = (size_t) this->length; + + this->BlockQueueGetBytes(data, len); + + this->length -= len; + + return len; +} +size_t BlockStream::PeekBytes (uint8_t *data, size_t len) +{ + /* Performance Intensive */ + if(len > this->length) + len = (size_t) this->length; + + this->BlockQueuePeekBytes(data, len, 0); + + return len; +} +size_t BlockStream::PeekBytes (uint8_t *data, size_t len, size_t offset) +{ + /* Performance Intensive */ + if(len > this->length) + len = (size_t) this->length; + + if (offset + len > this->length) + len = (size_t) (this->length - offset); + + this->BlockQueuePeekBytes(data, len, offset); + + return len; +} +uint64_t BlockStream::Length () const +{ + return this->length; +} +const block_t* BlockStream::GetFront () +{ + if(this->blockqueue.empty()) + return NULL; + + const block_t* ret = this->blockqueue.front(); + this->length -= ret->len; + this->blockqueue.pop_front(); + + return ret; +} +const block_t* BlockStream::Front () const +{ + if(this->blockqueue.empty()) + return NULL; + + return this->blockqueue.front(); +} +bool BlockStream::BlockQueueGetBytes (uint8_t *data, uint32_t len) +{ + uint32_t pos = 0; + + block_t *block = NULL; + + while(pos < len) + { + block = this->blockqueue.front(); + if((len - pos) < (block->len)) + { + memcpy(data + pos, block->data, len - pos); + + this->blockqueue.pop_front(); + + block_t* newfront = AllocBlock(block->len - (len - pos)); + memcpy(newfront->data, block->data + (len - pos), newfront->len); + + DeleteBlock(block); + this->blockqueue.push_front(newfront); + + return true; + } + else + { + memcpy(data + pos, block->data, block->len); + pos += block->len; + + DeleteBlock(block); + this->blockqueue.pop_front(); + } + } + + return false; +} +bool BlockStream::BlockQueuePeekBytes (uint8_t *data, uint32_t len, size_t offset) +{ + uint32_t pos = 0; + int cnt = 0; + + const block_t *block = NULL; + + while(pos < len) + { + block = this->blockqueue.at(cnt); + if((offset + len - pos) < (block->len)) + { + memcpy(data + pos, block->data + offset, len - pos - offset); + return true; + } + else + { + memcpy(data + pos, block->data + offset, block->len - offset); + pos += block->len; + } + + cnt++; + } + + return false; +} +uint8_t BlockStream::ByteAt (uint64_t position) const +{ + if(position > this->length) + return -1; + + uint64_t pos = 0; + + for(size_t i = 0; i < this->blockqueue.size(); i++) + { + const block_t *block = this->blockqueue.at(i); + + if(pos + block->len > position) + return block->data[position - pos]; + else + pos += block->len; + } + + return -1; +} +const block_t* BlockStream::ToBlock () +{ + if(this->length > std::numeric_limits<size_t>::max()) + return NULL; + + return BlockStream::GetBytes((size_t)this->length); +} +void BlockStream::Clear () +{ + while(!this->blockqueue.empty()) + { + DeleteBlock(this->blockqueue.front()); + this->blockqueue.pop_front(); + } + + this->length = 0; +} +void BlockStream::EraseFront (uint64_t len) +{ + if(len > this->length) + len = this->length; + + uint64_t actLen = 0; + + while(actLen < len) + { + if(this->blockqueue.size() == 0) + return; + + block_t *front = this->blockqueue.front(); + + if((actLen + front->len) <= len) + { + this->length -= front->len; + actLen += front->len; + + DeleteBlock(front); + this->blockqueue.pop_front(); + } + else + { + uint32_t diff = (uint32_t) (len - actLen); + this->length -= diff; + actLen += diff; + block_t* newfront = AllocBlock(front->len - diff); + + memcpy(newfront->data, front->data + diff, newfront->len); + + DeleteBlock(front); + this->blockqueue.pop_front(); + this->blockqueue.push_front(newfront); + } + } +} +BlockStream* BlockStream::GetBlocks (uint64_t len) +{ + if(len > this->length) + return NULL; + + BlockStream *blocks = new BlockStream(); + + uint64_t actLen = 0; + + while(actLen < len) + { + block_t *front = this->blockqueue.front(); + + if((actLen + front->len) <= len) + { + this->length -= front->len; + actLen += front->len; + + blocks->PushBack(front); + this->blockqueue.pop_front(); + } + else + { + uint32_t diff = (uint32_t) (len - actLen); + this->length -= diff; + actLen += diff; + block_t *block = AllocBlock(diff); + block_t* newfront = AllocBlock(front->len - diff); + + memcpy(block->data, front->data, diff); + blocks->PushBack(block); + + memcpy(newfront->data, front->data+ diff, newfront->len); + + DeleteBlock(front); + this->blockqueue.pop_front(); + this->blockqueue.push_front(newfront); + } + } + + return blocks; +} diff --git a/src/libdash/source/helpers/BlockStream.h b/src/libdash/source/helpers/BlockStream.h new file mode 100644 index 00000000..4b8b3fd5 --- /dev/null +++ b/src/libdash/source/helpers/BlockStream.h @@ -0,0 +1,55 @@ +/* + * BlockStream.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef __BLOCKSTREAM_H__ +#define __BLOCKSTREAM_H__ + +#include "config.h" + +#include "Block.h" + +namespace dash +{ + namespace helpers + { + class BlockStream + { + public: + BlockStream (); + virtual ~BlockStream (); + + virtual void PushBack (block_t *block); + virtual void PushFront (block_t *block); + virtual const block_t* GetBytes (uint32_t len); + virtual size_t GetBytes (uint8_t *data, size_t len); + virtual size_t PeekBytes (uint8_t *data, size_t len); + virtual size_t PeekBytes (uint8_t *data, size_t len, size_t offset); + virtual const block_t* GetFront (); + virtual const block_t* Front () const; + virtual uint64_t Length () const; + virtual uint8_t ByteAt (uint64_t position) const; + virtual const block_t* ToBlock (); + virtual void Clear (); + virtual void EraseFront (uint64_t len); + virtual BlockStream* GetBlocks (uint64_t len); + virtual void PopAndDeleteFront (); + + protected: + uint64_t length; + std::deque<block_t *> blockqueue; + + virtual bool BlockQueueGetBytes (uint8_t *data, uint32_t len); + virtual bool BlockQueuePeekBytes (uint8_t *data, uint32_t len, size_t offset); + }; + } +} + +#endif // __BLOCKSTREAM_H__
\ No newline at end of file diff --git a/src/libdash/source/helpers/Path.cpp b/src/libdash/source/helpers/Path.cpp new file mode 100644 index 00000000..301d9fa0 --- /dev/null +++ b/src/libdash/source/helpers/Path.cpp @@ -0,0 +1,118 @@ +/* + * Path.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Path.h" + +using namespace dash::helpers; + +std::string Path::CombinePaths (const std::string &path1, const std::string &path2) +{ + if(path1 == "") + return path2; + if(path2 == "") + return path1; + + char path1Last = path1.at(path1.size() - 1); + char path2First = path2.at(0); + + if(path1Last == '/' && path2First == '/') + return path1 + path2.substr(1, path2.size()); + + if(path1Last != '/' && path2First != '/') + return path1 + "/" + path2; + + return path1 + path2; +} +std::string Path::GetDirectoryPath (const std::string &path) +{ + int pos = path.find_last_of('/'); + + return path.substr(0, pos); +} +std::vector<std::string> Path::Split (const std::string &s, char delim) +{ + std::stringstream ss(s); + std::string item; + std::vector<std::string> ret; + + while(std::getline(ss, item, delim)) + ret.push_back(item); + + return ret; +} +bool Path::GetHostPortAndPath (const std::string &url, std::string &host, size_t &port, std::string& path) +{ + std::string hostPort = ""; + size_t found = 0; + size_t pathBegin = 0; + + if (url.substr(0,7) == "http://" || url.substr(0,8) == "https://") + { + found = url.find("//"); + pathBegin = url.find('/', found+2); + path = url.substr(pathBegin, std::string::npos); + + hostPort = url.substr(found+2, pathBegin - (found+2)); + found = hostPort.find(':'); + if (found != std::string::npos) + { + port = strtoul(hostPort.substr(found+1, std::string::npos).c_str(), NULL, 10); + } + host = hostPort.substr(0, found); + return (host.size() > 0) && (path.size() > 0); + } + else if(url.substr(0,5) == "ndn:/") + { + found = url.find("/"); + pathBegin = url.find('/', found+1); + path = url.substr(pathBegin, std::string::npos); + + hostPort = url.substr(found+1, pathBegin - (found+1)); + found = hostPort.find(':'); + if (found != std::string::npos) + { + port = strtoul(hostPort.substr(found+1, std::string::npos).c_str(), NULL, 10); + } + host = hostPort.substr(0, found); + return (host.size() > 0) && (path.size() > 0); + } + else if(url.substr(0,6) == "ccnx:/") + { + found = url.find("/"); + pathBegin = url.find('/', found+1); + path = url.substr(pathBegin, std::string::npos); + + hostPort = url.substr(found+1, pathBegin - (found+1)); + found = hostPort.find(':'); + if (found != std::string::npos) + { + port = strtoul(hostPort.substr(found+1, std::string::npos).c_str(), NULL, 10); + } + host = hostPort.substr(0, found); + return (host.size() > 0) && (path.size() > 0); + } + + return false; +} +bool Path::GetStartAndEndBytes (const std::string &byteRange, size_t &startByte, size_t &endByte) +{ + size_t found = 0; + + found = byteRange.find('-'); + if (found != std::string::npos && found < byteRange.size()-1 ) + { + startByte = strtoul(byteRange.substr(0, found).c_str(), NULL, 10); + endByte = strtoul(byteRange.substr(found+1, std::string::npos).c_str(), NULL, 10); + return (startByte <= endByte); + } + + return false; +} diff --git a/src/libdash/source/helpers/Path.h b/src/libdash/source/helpers/Path.h new file mode 100644 index 00000000..1c791baa --- /dev/null +++ b/src/libdash/source/helpers/Path.h @@ -0,0 +1,33 @@ +/* + * Path.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef PATH_H_ +#define PATH_H_ + +#include "config.h" + +namespace dash +{ + namespace helpers + { + class Path + { + public: + static std::string CombinePaths (const std::string &path1, const std::string &path2); + static std::string GetDirectoryPath (const std::string &path); + static std::vector<std::string> Split (const std::string &s, char delim); + static bool GetHostPortAndPath (const std::string &url, std::string &host, size_t &port, std::string& path); + static bool GetStartAndEndBytes (const std::string &byteRange, size_t &startByte, size_t &endByte); + }; + } +} + +#endif /* PATH_H_ */
\ No newline at end of file diff --git a/src/libdash/source/helpers/String.cpp b/src/libdash/source/helpers/String.cpp new file mode 100644 index 00000000..53da5592 --- /dev/null +++ b/src/libdash/source/helpers/String.cpp @@ -0,0 +1,53 @@ +/* + * String.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "String.h" + +using namespace dash::helpers; + +void String::Split (const std::string &s, char delim, std::vector<std::string>& vector) +{ + std::stringstream ss(s); + std::string item; + + while(std::getline(ss, item, delim)) + vector.push_back(item); +} +void String::Split (const std::string &s, char delim, std::vector<uint32_t>& vector) +{ + size_t lengthOfString = s.length(); + size_t pos = 0; + size_t i = 0; + uint32_t level = 0; + + while (pos != std::string::npos) + { + pos = s.find(delim, i); + + if (i < lengthOfString) + { + level = strtoul(s.substr(i, pos-i).c_str(), NULL, 10); + vector.push_back(level); + i = pos + 1; + } + } +} +bool String::ToBool (const std::string &s) +{ + if (s == "true" || s == "True" || s == "TRUE") + { + return true; + } + else + { + return false; + } +}
\ No newline at end of file diff --git a/src/libdash/source/helpers/String.h b/src/libdash/source/helpers/String.h new file mode 100644 index 00000000..73ac6db8 --- /dev/null +++ b/src/libdash/source/helpers/String.h @@ -0,0 +1,31 @@ +/* + * String.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef STRING_H_ +#define STRING_H_ + +#include "config.h" + +namespace dash +{ + namespace helpers + { + class String + { + public: + static void Split (const std::string &s, char delim, std::vector<std::string>& vector); + static void Split (const std::string &s, char delim, std::vector<uint32_t>& vector); + static bool ToBool (const std::string &s); + }; + } +} + +#endif /* STRING_H_ */
\ No newline at end of file diff --git a/src/libdash/source/helpers/SyncedBlockStream.cpp b/src/libdash/source/helpers/SyncedBlockStream.cpp new file mode 100644 index 00000000..84fa63cf --- /dev/null +++ b/src/libdash/source/helpers/SyncedBlockStream.cpp @@ -0,0 +1,250 @@ +/* + * SyncedBlockStream.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "SyncedBlockStream.h" + +using namespace dash::helpers; + +SyncedBlockStream::SyncedBlockStream () : + eos (false) +{ + InitializeConditionVariable (&this->full); + InitializeCriticalSection (&this->monitorMutex); +} +SyncedBlockStream::~SyncedBlockStream () +{ + DeleteConditionVariable(&this->full); + DeleteCriticalSection(&this->monitorMutex); +} + +void SyncedBlockStream::PopAndDeleteFront () +{ + EnterCriticalSection(&this->monitorMutex); + + BlockStream::PopAndDeleteFront(); + + LeaveCriticalSection(&this->monitorMutex); +} +void SyncedBlockStream::PushBack (block_t *block) +{ + EnterCriticalSection(&this->monitorMutex); + + BlockStream::PushBack(block); + + WakeAllConditionVariable(&this->full); + LeaveCriticalSection(&this->monitorMutex); +} +void SyncedBlockStream::PushFront (block_t *block) +{ + EnterCriticalSection(&this->monitorMutex); + + BlockStream::PushFront(block); + + WakeAllConditionVariable(&this->full); + LeaveCriticalSection(&this->monitorMutex); +} +const block_t* SyncedBlockStream::GetBytes (uint32_t len) +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length == 0 && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0) + { + LeaveCriticalSection(&this->monitorMutex); + return NULL; + } + + const block_t* block = BlockStream::GetBytes(len); + LeaveCriticalSection(&this->monitorMutex); + + return block; +} +size_t SyncedBlockStream::GetBytes (uint8_t *data, size_t len) +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length == 0 && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0) + { + LeaveCriticalSection(&this->monitorMutex); + return 0; + } + + size_t ret = BlockStream::GetBytes(data, len); + LeaveCriticalSection(&this->monitorMutex); + + return ret; +} +size_t SyncedBlockStream::PeekBytes (uint8_t *data, size_t len) +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length == 0 && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0) + { + LeaveCriticalSection(&this->monitorMutex); + return 0; + } + + size_t ret = BlockStream::PeekBytes(data, len); + LeaveCriticalSection(&this->monitorMutex); + + return ret; +} +size_t SyncedBlockStream::PeekBytes (uint8_t *data, size_t len, size_t offset) +{ + EnterCriticalSection(&this->monitorMutex); + + while((this->length == 0 || offset >= this->length) && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0 || offset >= this->length) + { + LeaveCriticalSection(&this->monitorMutex); + return 0; + } + + size_t ret = BlockStream::PeekBytes(data, len, offset); + LeaveCriticalSection(&this->monitorMutex); + + return ret; +} +uint64_t SyncedBlockStream::Length () const +{ + EnterCriticalSection(&this->monitorMutex); + + uint64_t len = BlockStream::Length(); + + LeaveCriticalSection(&this->monitorMutex); + + return len; +} +const block_t* SyncedBlockStream::GetFront () +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length == 0 && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0) + { + LeaveCriticalSection(&this->monitorMutex); + return NULL; + } + + const block_t* block = BlockStream::GetFront(); + LeaveCriticalSection(&this->monitorMutex); + + return block; +} +const block_t* SyncedBlockStream::Front () const +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length == 0 && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0) + { + LeaveCriticalSection(&this->monitorMutex); + return NULL; + } + + const block_t* block = BlockStream::Front(); + LeaveCriticalSection(&this->monitorMutex); + + return block; +} +uint8_t SyncedBlockStream::ByteAt (uint64_t position) const +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length < position && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length < position) + { + LeaveCriticalSection(&this->monitorMutex); + return 0; + } + + uint8_t ret = BlockStream::ByteAt(position); + LeaveCriticalSection(&this->monitorMutex); + + return ret; +} +const block_t* SyncedBlockStream::ToBlock () +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length == 0 && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0) + { + LeaveCriticalSection(&this->monitorMutex); + return NULL; + } + + const block_t* block = BlockStream::ToBlock(); + LeaveCriticalSection(&this->monitorMutex); + + return block; +} +void SyncedBlockStream::Clear () +{ + EnterCriticalSection(&this->monitorMutex); + + BlockStream::Clear(); + + LeaveCriticalSection(&this->monitorMutex); +} +void SyncedBlockStream::EraseFront (uint64_t len) +{ + EnterCriticalSection(&this->monitorMutex); + + BlockStream::EraseFront(len); + + LeaveCriticalSection(&this->monitorMutex); +} +BlockStream* SyncedBlockStream::GetBlocks (uint64_t len) +{ + EnterCriticalSection(&this->monitorMutex); + + while(this->length == 0 && !this->eos) + SleepConditionVariableCS(&this->full, &this->monitorMutex, INFINITE); + + if(this->length == 0) + { + LeaveCriticalSection(&this->monitorMutex); + return NULL; + } + + BlockStream *stream = BlockStream::GetBlocks(len); + LeaveCriticalSection(&this->monitorMutex); + + return stream; +} +void SyncedBlockStream::SetEOS (bool value) +{ + EnterCriticalSection(&this->monitorMutex); + + this->eos = value; + + WakeAllConditionVariable(&this->full); + LeaveCriticalSection(&this->monitorMutex); +} diff --git a/src/libdash/source/helpers/SyncedBlockStream.h b/src/libdash/source/helpers/SyncedBlockStream.h new file mode 100644 index 00000000..9e266c60 --- /dev/null +++ b/src/libdash/source/helpers/SyncedBlockStream.h @@ -0,0 +1,57 @@ +/* + * SyncedBlockStream.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef __SYNCEDBLOCKSTREAM_H__ +#define __SYNCEDBLOCKSTREAM_H__ + +#include "config.h" + +#include "BlockStream.h" +#include "../portable/MultiThreading.h" + +namespace dash +{ + namespace helpers + { + class SyncedBlockStream : public BlockStream + { + public: + SyncedBlockStream (); + virtual ~SyncedBlockStream (); + + virtual void PushBack (block_t *block); + virtual void PushFront (block_t *block); + virtual const block_t* GetBytes (uint32_t len); + virtual size_t GetBytes (uint8_t *data, size_t len); + virtual size_t PeekBytes (uint8_t *data, size_t len); + virtual size_t PeekBytes (uint8_t *data, size_t len, size_t offset); + virtual const block_t* GetFront (); + virtual const block_t* Front () const; + virtual uint64_t Length () const; + virtual uint8_t ByteAt (uint64_t position) const; + virtual const block_t* ToBlock (); + virtual void Clear (); + virtual void EraseFront (uint64_t len); + virtual BlockStream* GetBlocks (uint64_t len); + virtual void PopAndDeleteFront (); + virtual void SetEOS (bool value); + + private: + bool eos; + + mutable CRITICAL_SECTION monitorMutex; + mutable CONDITION_VARIABLE full; + + }; + } +} + +#endif // __SYNCEDBLOCKSTREAM_H__
\ No newline at end of file diff --git a/src/libdash/source/helpers/Time.cpp b/src/libdash/source/helpers/Time.cpp new file mode 100644 index 00000000..e6ca2b81 --- /dev/null +++ b/src/libdash/source/helpers/Time.cpp @@ -0,0 +1,33 @@ +/* + * Time.cpp + ***************************************************************************** + * Copyright (C) 2013, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Time.h" + +using namespace dash::helpers; + +uint32_t Time::GetCurrentUTCTimeInSec () +{ + return mktime(Time::GetCurrentUTCTime()); +} +std::string Time::GetCurrentUTCTimeStr () +{ + char timeString[30]; + strftime(timeString, 30, "%Y-%m-%dT%H:%M:%SZ", Time::GetCurrentUTCTime()); + + return std::string(timeString); +} +struct tm* Time::GetCurrentUTCTime () +{ + time_t rawTime; + + time(&rawTime); + return gmtime(&rawTime); +} diff --git a/src/libdash/source/helpers/Time.h b/src/libdash/source/helpers/Time.h new file mode 100644 index 00000000..e7de0cd9 --- /dev/null +++ b/src/libdash/source/helpers/Time.h @@ -0,0 +1,35 @@ +/* + * Time.h + ***************************************************************************** + * Copyright (C) 2013, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef DASH_HELPERS_TIME_H_ +#define DASH_HELPERS_TIME_H_ + +#include <time.h> +#include "config.h" + +namespace dash +{ + namespace helpers + { + class Time + { + public: + static uint32_t GetCurrentUTCTimeInSec (); + static std::string GetCurrentUTCTimeStr (); + + private: + static struct tm* GetCurrentUTCTime (); + + }; + } +} + +#endif /* DASH_HELPERS_TIME_H_ */ diff --git a/src/libdash/source/libdash.cpp b/src/libdash/source/libdash.cpp new file mode 100644 index 00000000..f26c8224 --- /dev/null +++ b/src/libdash/source/libdash.cpp @@ -0,0 +1,20 @@ +/* + * libdash.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "../include/libdash.h" +#include "manager/DASHManager.h" + +using namespace dash; + +__declspec(dllexport) IDASHManager* __cdecl CreateDashManager() +{ + return new DASHManager(); +}
\ No newline at end of file diff --git a/src/libdash/source/manager/DASHManager.cpp b/src/libdash/source/manager/DASHManager.cpp new file mode 100644 index 00000000..7650111e --- /dev/null +++ b/src/libdash/source/manager/DASHManager.cpp @@ -0,0 +1,45 @@ +/* + * DASHManager.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "DASHManager.h" + +using namespace dash; +using namespace dash::xml; +using namespace dash::mpd; +using namespace dash::network; +using namespace dash::helpers; + +DASHManager::DASHManager () +{ +} +DASHManager::~DASHManager () +{ +} +IMPD* DASHManager::Open (char *path, std::string mUrl) +{ + DOMParser parser(path); + + uint32_t fetchTime = Time::GetCurrentUTCTimeInSec(); + + if (!parser.Parse(mUrl)) + return NULL; + + MPD* mpd = parser.GetRootNode()->ToMPD(); + + if (mpd) + mpd->SetFetchTime(fetchTime); + + return mpd; +} +void DASHManager::Delete () +{ + delete this; +} diff --git a/src/libdash/source/manager/DASHManager.h b/src/libdash/source/manager/DASHManager.h new file mode 100644 index 00000000..99ef188b --- /dev/null +++ b/src/libdash/source/manager/DASHManager.h @@ -0,0 +1,35 @@ +/* + * DASHManager.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef DASHMANAGER_H_ +#define DASHMANAGER_H_ + +#include "config.h" + +#include "../xml/Node.h" +#include "../xml/DOMParser.h" +#include "IDASHManager.h" +#include "../helpers/Time.h" + +namespace dash +{ + class DASHManager : public IDASHManager + { + public: + DASHManager (); + virtual ~DASHManager (); + + mpd::IMPD* Open (char *path, std::string mUrl = ""); + void Delete (); + }; +} + +#endif /* DASHMANAGER_H_ */ diff --git a/src/libdash/source/metrics/HTTPTransaction.cpp b/src/libdash/source/metrics/HTTPTransaction.cpp new file mode 100644 index 00000000..2767b514 --- /dev/null +++ b/src/libdash/source/metrics/HTTPTransaction.cpp @@ -0,0 +1,122 @@ +/* + * HTTPTransaction.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "HTTPTransaction.h" + +using namespace dash::metrics; + +HTTPTransaction::HTTPTransaction () : + tcpId (0), + type (dash::metrics::Other), + responseCode (0), + interval (0), + url (""), + actualUrl (""), + range (""), + tRequest (""), + tResponse (""), + httpHeader ("") +{ +} +HTTPTransaction::~HTTPTransaction() +{ + for (size_t i = 0; i < trace.size(); i++) + delete trace.at(i); +} + +uint32_t HTTPTransaction::TCPId () const +{ + return this->tcpId; +} +void HTTPTransaction::SetTCPId (uint32_t tcpId) +{ + this->tcpId = tcpId; +} +HTTPTransactionType HTTPTransaction::Type () const +{ + return this->type; +} +void HTTPTransaction::SetType (HTTPTransactionType type) +{ + this->type = type; +} +const std::string& HTTPTransaction::OriginalUrl () const +{ + return this->url; +} +void HTTPTransaction::SetOriginalUrl (const std::string& origUrl) +{ + this->url = origUrl; +} +const std::string& HTTPTransaction::ActualUrl () const +{ + return this->actualUrl; +} +void HTTPTransaction::SetActualUrl (const std::string& actUrl) +{ + this->actualUrl = actUrl; +} +const std::string& HTTPTransaction::Range () const +{ + return this->range; +} +void HTTPTransaction::SetRange (const std::string& range) +{ + this->range = range; +} +const std::string& HTTPTransaction::RequestSentTime () const +{ + return this->tRequest; +} +void HTTPTransaction::SetRequestSentTime (std::string tRequest) +{ + this->tRequest = tRequest; +} +const std::string& HTTPTransaction::ResponseReceivedTime () const +{ + return this->tResponse; +} +void HTTPTransaction::SetResponseReceivedTime (std::string tResponse) +{ + this->tResponse = tResponse; +} +uint16_t HTTPTransaction::ResponseCode () const +{ + return this->responseCode; +} +void HTTPTransaction::SetResponseCode (uint16_t respCode) +{ + this->responseCode = respCode; +} +uint64_t HTTPTransaction::Interval () const +{ + return this->interval; +} +void HTTPTransaction::SetInterval (uint64_t interval) +{ + this->interval = interval; +} +const std::vector<IThroughputMeasurement *>& HTTPTransaction::ThroughputTrace () const +{ + return (std::vector<IThroughputMeasurement *> &) this->trace; +} +void HTTPTransaction::AddThroughputMeasurement (ThroughputMeasurement *throuputEntry) +{ + this->trace.push_back(throuputEntry); +} +const std::string& HTTPTransaction::HTTPHeader () const +{ + return this->httpHeader; +} +void HTTPTransaction::AddHTTPHeaderLine (std::string headerLine) +{ + this->httpHeader.append(headerLine); +} diff --git a/src/libdash/source/metrics/HTTPTransaction.h b/src/libdash/source/metrics/HTTPTransaction.h new file mode 100644 index 00000000..77c69234 --- /dev/null +++ b/src/libdash/source/metrics/HTTPTransaction.h @@ -0,0 +1,68 @@ +/* + * HTTPTransaction.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef HTTPTRANSACTION_H_ +#define HTTPTRANSACTION_H_ + +#include "IHTTPTransaction.h" +#include "ThroughputMeasurement.h" + +namespace dash +{ + namespace metrics + { + class HTTPTransaction : public IHTTPTransaction + { + public: + HTTPTransaction (); + virtual ~HTTPTransaction (); + + uint32_t TCPId () const; + HTTPTransactionType Type () const; + const std::string& OriginalUrl () const; + const std::string& ActualUrl () const; + const std::string& Range () const; + const std::string& RequestSentTime () const; + const std::string& ResponseReceivedTime () const; + uint16_t ResponseCode () const; + uint64_t Interval () const; + const std::vector<IThroughputMeasurement *>& ThroughputTrace () const; + const std::string& HTTPHeader () const; + + void SetTCPId (uint32_t tcpId); + void SetType (HTTPTransactionType type); + void SetOriginalUrl (const std::string& origUrl); + void SetActualUrl (const std::string& actUrl); + void SetRange (const std::string& range); + void SetRequestSentTime (std::string tRequest); + void SetResponseReceivedTime (std::string tResponse); + void SetResponseCode (uint16_t respCode); + void SetInterval (uint64_t interval); + void AddThroughputMeasurement (ThroughputMeasurement *throuputEntry); + void AddHTTPHeaderLine (std::string headerLine); + + private: + uint32_t tcpId; + HTTPTransactionType type; + std::string url; + std::string actualUrl; + std::string range; + std::string tRequest; + std::string tResponse; + uint16_t responseCode; + uint64_t interval; + std::vector<ThroughputMeasurement *> trace; + std::string httpHeader; + }; + } +} + +#endif /* HTTPTRANSACTION_H_ */ diff --git a/src/libdash/source/metrics/TCPConnection.cpp b/src/libdash/source/metrics/TCPConnection.cpp new file mode 100644 index 00000000..581b0539 --- /dev/null +++ b/src/libdash/source/metrics/TCPConnection.cpp @@ -0,0 +1,62 @@ +/* + * TCPConnection.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "TCPConnection.h" + +using namespace dash::metrics; + +TCPConnection::TCPConnection () +{ +} +TCPConnection::~TCPConnection() +{ +} + +uint32_t TCPConnection::TCPId () const +{ + return this->tcpId; +} +void TCPConnection::SetTCPId (uint32_t tcpId) +{ + this->tcpId = tcpId; +} +const std::string& TCPConnection::DestinationAddress () const +{ + return this->dest; +} +void TCPConnection::SetDestinationAddress (const std::string& destAddress) +{ + this->dest = destAddress; +} +const std::string& TCPConnection::ConnectionOpenedTime () const +{ + return this->tOpen; +} +void TCPConnection::SetConnectionOpenedTime (std::string tOpen) +{ + this->tOpen = tOpen; +} +const std::string& TCPConnection::ConnectionClosedTime () const +{ + return this->tClose; +} +void TCPConnection::SetConnectionClosedTime (std::string tClose) +{ + this->tClose = tClose; +} +uint64_t TCPConnection::ConnectionTime () const +{ + return this->tConnect; +} +void TCPConnection::SetConnectionTime (uint64_t tConnect) +{ + this->tConnect = tConnect; +} diff --git a/src/libdash/source/metrics/TCPConnection.h b/src/libdash/source/metrics/TCPConnection.h new file mode 100644 index 00000000..d4618d7f --- /dev/null +++ b/src/libdash/source/metrics/TCPConnection.h @@ -0,0 +1,49 @@ +/* + * TCPConnection.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef TCPCONNECTION_H_ +#define TCPCONNECTION_H_ + +#include "ITCPConnection.h" + +namespace dash +{ + namespace metrics + { + class TCPConnection : public ITCPConnection + { + public: + TCPConnection (); + virtual ~TCPConnection (); + + uint32_t TCPId () const; + const std::string& DestinationAddress () const; + const std::string& ConnectionOpenedTime () const; + const std::string& ConnectionClosedTime () const; + uint64_t ConnectionTime () const; + + void SetTCPId (uint32_t tcpId); + void SetDestinationAddress (const std::string& destAddress); + void SetConnectionOpenedTime (std::string tOpen); + void SetConnectionClosedTime (std::string tClose); + void SetConnectionTime (uint64_t tConnect); + + private: + uint32_t tcpId; + std::string dest; + std::string tOpen; + std::string tClose; + uint64_t tConnect; + }; + } +} + +#endif /* TCPCONNECTION_H_ */ diff --git a/src/libdash/source/metrics/ThroughputMeasurement.cpp b/src/libdash/source/metrics/ThroughputMeasurement.cpp new file mode 100644 index 00000000..8d2c485e --- /dev/null +++ b/src/libdash/source/metrics/ThroughputMeasurement.cpp @@ -0,0 +1,46 @@ +/* + * ThroughputMeasurement.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "ThroughputMeasurement.h" + +using namespace dash::metrics; + +ThroughputMeasurement::ThroughputMeasurement () +{ +} +ThroughputMeasurement::~ThroughputMeasurement() +{ +} + +const std::string& ThroughputMeasurement::StartOfPeriod () const +{ + return this->startOfPeriod; +} +void ThroughputMeasurement::SetStartOfPeriod (std::string start) +{ + this->startOfPeriod = start; +} +uint64_t ThroughputMeasurement::DurationOfPeriod () const +{ + return this->durationOfPeriod; +} +void ThroughputMeasurement::SetDurationOfPeriod (uint64_t duration) +{ + this->durationOfPeriod = duration; +} +const std::vector<uint32_t>& ThroughputMeasurement::ReceivedBytesPerTrace () const +{ + return this->receivedBytesPerTrace; +} +void ThroughputMeasurement::AddReceivedBytes (uint32_t numberOfBytes) +{ + this->receivedBytesPerTrace.push_back(numberOfBytes); +} diff --git a/src/libdash/source/metrics/ThroughputMeasurement.h b/src/libdash/source/metrics/ThroughputMeasurement.h new file mode 100644 index 00000000..817e30d9 --- /dev/null +++ b/src/libdash/source/metrics/ThroughputMeasurement.h @@ -0,0 +1,43 @@ +/* + * ThroughputMeasurement.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef THROUGHPUTMEASUREMENT_H_ +#define THROUGHPUTMEASUREMENT_H_ + +#include "IThroughputMeasurement.h" + +namespace dash +{ + namespace metrics + { + class ThroughputMeasurement : public IThroughputMeasurement + { + public: + ThroughputMeasurement (); + virtual ~ThroughputMeasurement (); + + const std::string& StartOfPeriod () const; + uint64_t DurationOfPeriod () const; + const std::vector<uint32_t>& ReceivedBytesPerTrace () const; + + void SetStartOfPeriod (std::string startOfPeriod); + void SetDurationOfPeriod (uint64_t duration); + void AddReceivedBytes (uint32_t numberOfBytes); + + private: + std::string startOfPeriod; + uint64_t durationOfPeriod; + std::vector<uint32_t> receivedBytesPerTrace; + }; + } +} + +#endif /* THROUGHPUTMEASUREMENT_H_ */ diff --git a/src/libdash/source/mpd/AbstractMPDElement.cpp b/src/libdash/source/mpd/AbstractMPDElement.cpp new file mode 100644 index 00000000..146d1776 --- /dev/null +++ b/src/libdash/source/mpd/AbstractMPDElement.cpp @@ -0,0 +1,41 @@ +/* + * AbstractMPDElement.cpp + ***************************************************************************** + * Copyright (C) 2013, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "AbstractMPDElement.h" + +using namespace dash::mpd; +using namespace dash::xml; + +AbstractMPDElement::AbstractMPDElement () +{ +} +AbstractMPDElement::~AbstractMPDElement () +{ + for(size_t i = 0; i < this->additionalSubNodes.size(); i++) + delete(this->additionalSubNodes.at(i)); +} + +const std::vector<INode *> AbstractMPDElement::GetAdditionalSubNodes () const +{ + return this->additionalSubNodes; +} +const std::map<std::string, std::string> AbstractMPDElement::GetRawAttributes () const +{ + return this->rawAttributes; +} +void AbstractMPDElement::AddAdditionalSubNode (INode *node) +{ + this->additionalSubNodes.push_back(node); +} +void AbstractMPDElement::AddRawAttributes (std::map<std::string, std::string> attributes) +{ + this->rawAttributes = attributes; +}
\ No newline at end of file diff --git a/src/libdash/source/mpd/AbstractMPDElement.h b/src/libdash/source/mpd/AbstractMPDElement.h new file mode 100644 index 00000000..b4235087 --- /dev/null +++ b/src/libdash/source/mpd/AbstractMPDElement.h @@ -0,0 +1,41 @@ +/* + * AbstractMPDElement.h + ***************************************************************************** + * Copyright (C) 2013, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef ABSTRACTMPDELEMENT_H_ +#define ABSTRACTMPDELEMENT_H_ + +#include "config.h" + +#include "IMPDElement.h" + +namespace dash +{ + namespace mpd + { + class AbstractMPDElement : public virtual IMPDElement + { + public: + AbstractMPDElement (); + virtual ~AbstractMPDElement (); + + virtual const std::vector<xml::INode *> GetAdditionalSubNodes () const; + virtual const std::map<std::string, std::string> GetRawAttributes () const; + virtual void AddAdditionalSubNode (xml::INode * node); + virtual void AddRawAttributes (std::map<std::string, std::string> attributes); + + private: + std::vector<xml::INode *> additionalSubNodes; + std::map<std::string, std::string> rawAttributes; + }; + } +} + +#endif /* ABSTRACTMPDELEMENT_H_ */ diff --git a/src/libdash/source/mpd/AdaptationSet.cpp b/src/libdash/source/mpd/AdaptationSet.cpp new file mode 100644 index 00000000..b1a0331f --- /dev/null +++ b/src/libdash/source/mpd/AdaptationSet.cpp @@ -0,0 +1,343 @@ +/* + * AdaptationSet.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "AdaptationSet.h" +#include <cstdlib> + +using namespace dash::mpd; + +AdaptationSet::AdaptationSet () : + segmentBase(NULL), + segmentList(NULL), + segmentTemplate(NULL), + xlinkHref(""), + xlinkActuate("onRequest"), + id(0), + lang(""), + contentType(""), + par(""), + minBandwidth(0), + maxBandwidth(0), + minWidth(0), + maxWidth(0), + minHeight(0), + maxHeight(0), + minFramerate(""), + maxFramerate(""), + segmentAlignmentIsBool(true), + subsegmentAlignmentIsBool(true), + usesSegmentAlignment(false), + usesSubsegmentAlignment(false), + segmentAlignment(0), + subsegmentAlignment(0), + isBitstreamSwitching(false) +{ +} +AdaptationSet::~AdaptationSet () +{ + for(size_t i = 0; i < this->accessibility.size(); i++) + delete(this->accessibility.at(i)); + for(size_t i = 0; i < this->role.size(); i++) + delete(this->role.at(i)); + for(size_t i = 0; i < this->rating.size(); i++) + delete(this->rating.at(i)); + for(size_t i = 0; i < this->viewpoint.size(); i++) + delete(this->viewpoint.at(i)); + for(size_t i = 0; i < this->contentComponent.size(); i++) + delete(this->contentComponent.at(i)); + for(size_t i = 0; i < this->baseURLs.size(); i++) + delete(this->baseURLs.at(i)); + for(size_t i = 0; i < this->representation.size(); i++) + delete(this->representation.at(i)); + + delete(segmentBase); + delete(segmentList); + delete(segmentTemplate); +} + +const std::vector<IDescriptor *>& AdaptationSet::GetAccessibility () const +{ + return (std::vector<IDescriptor *> &) this->accessibility; +} +void AdaptationSet::AddAccessibity (Descriptor *accessibility) +{ + this->accessibility.push_back(accessibility); +} +const std::vector<IDescriptor *>& AdaptationSet::GetRole () const +{ + return (std::vector<IDescriptor *> &) this->role; +} +void AdaptationSet::AddRole (Descriptor *role) +{ + this->role.push_back(role); +} +const std::vector<IDescriptor *>& AdaptationSet::GetRating () const +{ + return (std::vector<IDescriptor *> &) this->rating; +} +void AdaptationSet::AddRating (Descriptor *rating) +{ + this->rating.push_back(rating); +} +const std::vector<IDescriptor *>& AdaptationSet::GetViewpoint () const +{ + return (std::vector<IDescriptor *> &) this->viewpoint; +} +void AdaptationSet::AddViewpoint (Descriptor *viewpoint) +{ + this->viewpoint.push_back(viewpoint); +} +const std::vector<IContentComponent *>& AdaptationSet::GetContentComponent () const +{ + return (std::vector<IContentComponent *> &) this->contentComponent; +} +void AdaptationSet::AddContentComponent (ContentComponent *contentComponent) +{ + this->contentComponent.push_back(contentComponent); +} +const std::vector<IBaseUrl *>& AdaptationSet::GetBaseURLs () const +{ + return (std::vector<IBaseUrl *> &) this->baseURLs; +} +void AdaptationSet::AddBaseURL (BaseUrl *baseUrl) +{ + this->baseURLs.push_back(baseUrl); +} +ISegmentBase* AdaptationSet::GetSegmentBase () const +{ + return this->segmentBase; +} +void AdaptationSet::SetSegmentBase (SegmentBase *segmentBase) +{ + this->segmentBase = segmentBase; +} +ISegmentList* AdaptationSet::GetSegmentList () const +{ + return this->segmentList; +} +void AdaptationSet::SetSegmentList (SegmentList *segmentList) +{ + this->segmentList = segmentList; +} +ISegmentTemplate* AdaptationSet::GetSegmentTemplate () const +{ + return this->segmentTemplate; +} +void AdaptationSet::SetSegmentTemplate (SegmentTemplate *segmentTemplate) +{ + this->segmentTemplate = segmentTemplate; +} +const std::vector<IRepresentation *>& AdaptationSet::GetRepresentation () const +{ + return (std::vector<IRepresentation *> &) this->representation; +} +void AdaptationSet::AddRepresentation (Representation *representation) +{ + this->representation.push_back(representation); +} +const std::string& AdaptationSet::GetXlinkHref () const +{ + return this->xlinkHref; +} +void AdaptationSet::SetXlinkHref (const std::string& xlinkHref) +{ + this->xlinkHref = xlinkHref; +} +const std::string& AdaptationSet::GetXlinkActuate () const +{ + return this->xlinkActuate; +} +void AdaptationSet::SetXlinkActuate (const std::string& xlinkActuate) +{ + this->xlinkActuate = xlinkActuate; +} +uint32_t AdaptationSet::GetId () const +{ + return this->id; +} +void AdaptationSet::SetId (uint32_t id) +{ + this->id = id; +} +uint32_t AdaptationSet::GetGroup () const +{ + return this->group; +} +void AdaptationSet::SetGroup (uint32_t group) +{ + this->group = group; +} +const std::string& AdaptationSet::GetLang () const +{ + return this->lang; +} +void AdaptationSet::SetLang (const std::string& lang) +{ + this->lang = lang; +} +const std::string& AdaptationSet::GetContentType () const +{ + return this->contentType; +} +void AdaptationSet::SetContentType (const std::string& contentType) +{ + this->contentType = contentType; +} +const std::string& AdaptationSet::GetPar () const +{ + return this->par; +} +void AdaptationSet::SetPar (const std::string& par) +{ + this->par = par; +} +uint32_t AdaptationSet::GetMinBandwidth () const +{ + return this->minBandwidth; +} +void AdaptationSet::SetMinBandwidth (uint32_t minBandwidth) +{ + this->minBandwidth = minBandwidth; +} +uint32_t AdaptationSet::GetMaxBandwidth () const +{ + return this->maxBandwidth; +} +void AdaptationSet::SetMaxBandwidth (uint32_t maxBandwidth) +{ + this->maxBandwidth = maxBandwidth; +} +uint32_t AdaptationSet::GetMinWidth () const +{ + return this->minWidth; +} +void AdaptationSet::SetMinWidth (uint32_t minWidth) +{ + this->minWidth = minWidth; +} +uint32_t AdaptationSet::GetMaxWidth () const +{ + return this->maxWidth; +} +void AdaptationSet::SetMaxWidth (uint32_t maxWidth) +{ + this->maxWidth = maxWidth; +} +uint32_t AdaptationSet::GetMinHeight () const +{ + return this->minHeight; +} +void AdaptationSet::SetMinHeight (uint32_t minHeight) +{ + this->minHeight = minHeight; +} +uint32_t AdaptationSet::GetMaxHeight () const +{ + return this->maxHeight; +} +void AdaptationSet::SetMaxHeight (uint32_t maxHeight) +{ + this->maxHeight = maxHeight; +} +const std::string& AdaptationSet::GetMinFramerate () const +{ + return this->minFramerate; +} +void AdaptationSet::SetMinFramerate (const std::string& minFramerate) +{ + this->minFramerate = minFramerate; +} +const std::string& AdaptationSet::GetMaxFramerate () const +{ + return this->maxFramerate; +} +void AdaptationSet::SetMaxFramerate (const std::string& maxFramerate) +{ + this->maxFramerate = maxFramerate; +} +bool AdaptationSet::SegmentAlignmentIsBoolValue () const +{ + return this->segmentAlignmentIsBool; +} +bool AdaptationSet::SubsegmentAlignmentIsBoolValue () const +{ + return this->subsegmentAlignmentIsBool; +} +bool AdaptationSet::HasSegmentAlignment () const +{ + return this->usesSegmentAlignment; +} +bool AdaptationSet::HasSubsegmentAlignment () const +{ + return this->usesSubsegmentAlignment; +} +uint32_t AdaptationSet::GetSegmentAligment () const +{ + return this->segmentAlignment; +} +void AdaptationSet::SetSegmentAlignment (const std::string& segmentAlignment) +{ + if (segmentAlignment == "true" || segmentAlignment == "True" || segmentAlignment == "TRUE") + { + this->segmentAlignmentIsBool = true; + this->usesSegmentAlignment = true; + return; + } + + if (segmentAlignment == "false" || segmentAlignment == "False" || segmentAlignment == "FALSE") + { + this->segmentAlignmentIsBool = true; + this->usesSegmentAlignment = false; + return; + } + + this->segmentAlignmentIsBool = false; + this->segmentAlignment = strtoul(segmentAlignment.c_str(), NULL, 10); +} +void AdaptationSet::SetSubsegmentAlignment (const std::string& subsegmentAlignment) +{ + if (subsegmentAlignment == "true" || subsegmentAlignment == "True" || subsegmentAlignment == "TRUE") + { + this->subsegmentAlignmentIsBool = true; + this->usesSubsegmentAlignment = true; + return; + } + + if (subsegmentAlignment == "false" || subsegmentAlignment == "False" || subsegmentAlignment == "FALSE") + { + this->subsegmentAlignmentIsBool = true; + this->usesSubsegmentAlignment = false; + return; + } + + this->subsegmentAlignmentIsBool = false; + this->subsegmentAlignment = strtoul(subsegmentAlignment.c_str(), NULL, 10); +} +uint32_t AdaptationSet::GetSubsegmentAlignment () const +{ + return this->subsegmentAlignment; +} +uint8_t AdaptationSet::GetSubsegmentStartsWithSAP () const +{ + return this->subsegmentStartsWithSAP; +} +void AdaptationSet::SetSubsegmentStartsWithSAP (uint8_t subsegmentStartsWithSAP) +{ + this->subsegmentStartsWithSAP = subsegmentStartsWithSAP; +} +bool AdaptationSet::GetBitstreamSwitching () const +{ + return this->isBitstreamSwitching; +} +void AdaptationSet::SetBitstreamSwitching (bool value) +{ + this->isBitstreamSwitching = value; +} diff --git a/src/libdash/source/mpd/AdaptationSet.h b/src/libdash/source/mpd/AdaptationSet.h new file mode 100644 index 00000000..5a17cf4a --- /dev/null +++ b/src/libdash/source/mpd/AdaptationSet.h @@ -0,0 +1,138 @@ +/* + * AdaptationSet.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef ADAPTATIONSET_H_ +#define ADAPTATIONSET_H_ + +#include "config.h" + +#include "IAdaptationSet.h" +#include "RepresentationBase.h" +#include "BaseUrl.h" +#include "SegmentBase.h" +#include "SegmentList.h" +#include "SegmentTemplate.h" +#include "ContentComponent.h" +#include "Representation.h" + +namespace dash +{ + namespace mpd + { + class AdaptationSet : public IAdaptationSet, public RepresentationBase + { + public: + AdaptationSet (); + virtual ~AdaptationSet (); + + const std::vector<IDescriptor *>& GetAccessibility () const; + const std::vector<IDescriptor *>& GetRole () const; + const std::vector<IDescriptor *>& GetRating () const; + const std::vector<IDescriptor *>& GetViewpoint () const; + const std::vector<IContentComponent *>& GetContentComponent () const; + const std::vector<IBaseUrl *>& GetBaseURLs () const; + ISegmentBase* GetSegmentBase () const; + ISegmentList* GetSegmentList () const; + ISegmentTemplate* GetSegmentTemplate () const; + const std::vector<IRepresentation *>& GetRepresentation () const; + const std::string& GetXlinkHref () const; + const std::string& GetXlinkActuate () const; + uint32_t GetId () const; + uint32_t GetGroup () const; + const std::string& GetLang () const; + const std::string& GetContentType () const; + const std::string& GetPar () const; + uint32_t GetMinBandwidth () const; + uint32_t GetMaxBandwidth () const; + uint32_t GetMinWidth () const; + uint32_t GetMaxWidth () const; + uint32_t GetMinHeight () const; + uint32_t GetMaxHeight () const; + const std::string& GetMinFramerate () const; + const std::string& GetMaxFramerate () const; + bool SegmentAlignmentIsBoolValue () const; + bool HasSegmentAlignment () const; + uint32_t GetSegmentAligment () const; + bool SubsegmentAlignmentIsBoolValue () const; + bool HasSubsegmentAlignment () const; + uint32_t GetSubsegmentAlignment () const; + uint8_t GetSubsegmentStartsWithSAP () const; + bool GetBitstreamSwitching () const; + + void AddAccessibity (Descriptor *accessibility); + void AddRole (Descriptor *role); + void AddRating (Descriptor *rating); + void AddViewpoint (Descriptor *viewpoint); + void AddContentComponent (ContentComponent *contentComponent); + void AddBaseURL (BaseUrl *baseURL); + void SetSegmentBase (SegmentBase *segmentBase); + void SetSegmentList (SegmentList *segmentList); + void SetSegmentTemplate (SegmentTemplate *segmentTemplate); + void AddRepresentation (Representation* representation); + void SetXlinkHref (const std::string& xlinkHref); + void SetXlinkActuate (const std::string& xlinkActuate); + void SetId (uint32_t id); + void SetGroup (uint32_t group); + void SetLang (const std::string& lang); + void SetContentType (const std::string& contentType); + void SetPar (const std::string& par); + void SetMinBandwidth (uint32_t minBandwidth); + void SetMaxBandwidth (uint32_t maxBandwidth); + void SetMinWidth (uint32_t minWidth); + void SetMaxWidth (uint32_t maxWidth); + void SetMinHeight (uint32_t minHeight); + void SetMaxHeight (uint32_t maxHeight); + void SetMinFramerate (const std::string& minFramerate); + void SetMaxFramerate (const std::string& maxFramerate); + void SetSegmentAlignment (const std::string& segmentAlignment); + void SetSubsegmentAlignment (const std::string& subsegmentAlignment); + void SetSubsegmentStartsWithSAP (uint8_t subsegmentStartsWithSAP); + void SetBitstreamSwitching (bool value); + + private: + std::vector<Descriptor *> accessibility; + std::vector<Descriptor *> role; + std::vector<Descriptor *> rating; + std::vector<Descriptor *> viewpoint; + std::vector<ContentComponent *> contentComponent; + std::vector<BaseUrl *> baseURLs; + SegmentBase *segmentBase; + SegmentList *segmentList; + SegmentTemplate *segmentTemplate; + std::vector<Representation *> representation; + std::string xlinkHref; + std::string xlinkActuate; + uint32_t id; + uint32_t group; + std::string lang; + std::string contentType; + std::string par; + uint32_t minBandwidth; + uint32_t maxBandwidth; + uint32_t minWidth; + uint32_t maxWidth; + uint32_t minHeight; + uint32_t maxHeight; + std::string minFramerate; + std::string maxFramerate; + bool segmentAlignmentIsBool; + bool subsegmentAlignmentIsBool; + bool usesSegmentAlignment; + bool usesSubsegmentAlignment; + uint32_t segmentAlignment; + uint32_t subsegmentAlignment; + uint8_t subsegmentStartsWithSAP; + bool isBitstreamSwitching; + }; + } +} + +#endif /* ADAPTATIONSET_H_ */ diff --git a/src/libdash/source/mpd/BaseUrl.cpp b/src/libdash/source/mpd/BaseUrl.cpp new file mode 100644 index 00000000..7bafe794 --- /dev/null +++ b/src/libdash/source/mpd/BaseUrl.cpp @@ -0,0 +1,60 @@ +/* + * BaseUrl.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "BaseUrl.h" + +using namespace dash::mpd; + +BaseUrl::BaseUrl () : + url(""), + serviceLocation(""), + byteRange("") +{ +} +BaseUrl::~BaseUrl () +{ +} + +const std::string& BaseUrl::GetUrl () const +{ + return this->url; +} +void BaseUrl::SetUrl (const std::string& url) +{ + this->url = url; +} +const std::string& BaseUrl::GetServiceLocation () const +{ + return this->serviceLocation; +} +void BaseUrl::SetServiceLocation (const std::string& serviceLocation) +{ + this->serviceLocation = serviceLocation; +} +const std::string& BaseUrl::GetByteRange () const +{ + return this->byteRange; +} +void BaseUrl::SetByteRange (const std::string& byteRange) +{ + this->byteRange = byteRange; +} +ISegment* BaseUrl::ToMediaSegment (const std::vector<IBaseUrl *>& baseurls) const +{ + Segment *seg = new Segment(); + + if(seg->Init(baseurls, this->url, this->byteRange, dash::metrics::MediaSegment)) + return seg; + + delete(seg); + + return NULL; +} diff --git a/src/libdash/source/mpd/BaseUrl.h b/src/libdash/source/mpd/BaseUrl.h new file mode 100644 index 00000000..0147c1ed --- /dev/null +++ b/src/libdash/source/mpd/BaseUrl.h @@ -0,0 +1,49 @@ +/* + * BaseUrl.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef BASEURL_H_ +#define BASEURL_H_ + +#include "config.h" + +#include "Segment.h" +#include "IBaseUrl.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class BaseUrl : public IBaseUrl, public AbstractMPDElement + { + public: + BaseUrl (); + virtual ~BaseUrl(); + + const std::string& GetUrl () const; + const std::string& GetServiceLocation () const; + const std::string& GetByteRange () const; + + void SetUrl (const std::string& url); + void SetServiceLocation (const std::string& serviceLocation); + void SetByteRange (const std::string& byteRange); + + virtual ISegment* ToMediaSegment (const std::vector<IBaseUrl *>& baseurls) const; + + private: + std::string url; + std::string serviceLocation; + std::string byteRange; + }; + } +} + +#endif /* BASEURL_H_ */ diff --git a/src/libdash/source/mpd/ContentComponent.cpp b/src/libdash/source/mpd/ContentComponent.cpp new file mode 100644 index 00000000..ce3de857 --- /dev/null +++ b/src/libdash/source/mpd/ContentComponent.cpp @@ -0,0 +1,98 @@ +/* + * ContentComponent.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "ContentComponent.h" + +using namespace dash::mpd; + +ContentComponent::ContentComponent () : + id(0), + lang(""), + contentType(""), + par("") +{ +} +ContentComponent::~ContentComponent () +{ + for(size_t i = 0; i < this->accessibility.size(); i++) + delete(this->accessibility.at(i)); + for(size_t i = 0; i < this->role.size(); i++) + delete(this->role.at(i)); + for(size_t i = 0; i < this->rating.size(); i++) + delete(this->rating.at(i)); + for(size_t i = 0; i < this->viewpoint.size(); i++) + delete(this->viewpoint.at(i)); +} + +const std::vector<IDescriptor *>& ContentComponent::GetAccessibility () const +{ + return (std::vector<IDescriptor *> &)this->accessibility; +} +void ContentComponent::AddAccessibity (Descriptor *accessibility) +{ + this->accessibility.push_back(accessibility); +} +const std::vector<IDescriptor *>& ContentComponent::GetRole () const +{ + return (std::vector<IDescriptor *> &)this->role; +} +void ContentComponent::AddRole (Descriptor *role) +{ + this->role.push_back(role); +} +const std::vector<IDescriptor *>& ContentComponent::GetRating () const +{ + return (std::vector<IDescriptor *> &)this->rating; +} +void ContentComponent::AddRating (Descriptor *rating) +{ + this->rating.push_back(rating); +} +const std::vector<IDescriptor *>& ContentComponent::GetViewpoint () const +{ + return (std::vector<IDescriptor *> &)this->viewpoint; +} +void ContentComponent::AddViewpoint (Descriptor *viewpoint) +{ + this->viewpoint.push_back(viewpoint); +} +uint32_t ContentComponent::GetId () const +{ + return this->id; +} +void ContentComponent::SetId (uint32_t id) +{ + this->id = id; +} +const std::string& ContentComponent::GetLang () const +{ + return this->lang; +} +void ContentComponent::SetLang (const std::string& lang) +{ + this->lang = lang; +} +const std::string& ContentComponent::GetContentType () const +{ + return this->contentType; +} +void ContentComponent::SetContentType (const std::string& contentType) +{ + this->contentType = contentType; +} +const std::string& ContentComponent::GetPar () const +{ + return this->par; +} +void ContentComponent::SetPar (const std::string& par) +{ + this->par = par; +} diff --git a/src/libdash/source/mpd/ContentComponent.h b/src/libdash/source/mpd/ContentComponent.h new file mode 100644 index 00000000..b59ab6d8 --- /dev/null +++ b/src/libdash/source/mpd/ContentComponent.h @@ -0,0 +1,62 @@ +/* + * ContentComponent.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef CONTENTCOMPONENT_H_ +#define CONTENTCOMPONENT_H_ + +#include "config.h" + +#include "IContentComponent.h" +#include "Descriptor.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class ContentComponent : public IContentComponent, public AbstractMPDElement + { + public: + ContentComponent (); + virtual ~ContentComponent (); + + const std::vector<IDescriptor *>& GetAccessibility () const; + const std::vector<IDescriptor *>& GetRole () const; + const std::vector<IDescriptor *>& GetRating () const; + const std::vector<IDescriptor *>& GetViewpoint () const; + uint32_t GetId () const; + const std::string& GetLang () const; + const std::string& GetContentType () const; + const std::string& GetPar () const; + + void AddAccessibity (Descriptor *accessibility); + void AddRole (Descriptor *role); + void AddRating (Descriptor *rating); + void AddViewpoint (Descriptor *viewpoint); + void SetId (uint32_t id); + void SetLang (const std::string& lang); + void SetContentType (const std::string& contentType); + void SetPar (const std::string& par); + + private: + std::vector<Descriptor *> accessibility; + std::vector<Descriptor *> role; + std::vector<Descriptor *> rating; + std::vector<Descriptor *> viewpoint; + uint32_t id; + std::string lang; + std::string contentType; + std::string par; + }; + } +} + +#endif /* CONTENTCOMPONENT_H_ */ diff --git a/src/libdash/source/mpd/Descriptor.cpp b/src/libdash/source/mpd/Descriptor.cpp new file mode 100644 index 00000000..c6eb787b --- /dev/null +++ b/src/libdash/source/mpd/Descriptor.cpp @@ -0,0 +1,39 @@ +/* + * Descriptor.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Descriptor.h" + +using namespace dash::mpd; + +Descriptor::Descriptor () : + schemeIdUri (""), + value ("") +{ +} +Descriptor::~Descriptor () +{ +} +const std::string& Descriptor::GetSchemeIdUri () const +{ + return this->schemeIdUri; +} +void Descriptor::SetSchemeIdUri (const std::string& schemeIdUri) +{ + this->schemeIdUri = schemeIdUri; +} +const std::string& Descriptor::GetValue () const +{ + return this->value; +} +void Descriptor::SetValue (const std::string& value) +{ + this->value = value; +} diff --git a/src/libdash/source/mpd/Descriptor.h b/src/libdash/source/mpd/Descriptor.h new file mode 100644 index 00000000..5cb66b94 --- /dev/null +++ b/src/libdash/source/mpd/Descriptor.h @@ -0,0 +1,43 @@ +/* + * Descriptor.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef DESCRIPTOR_H_ +#define DESCRIPTOR_H_ + +#include "config.h" + +#include "IDescriptor.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class Descriptor : public IDescriptor, public AbstractMPDElement + { + public: + Descriptor (); + virtual ~Descriptor (); + + const std::string& GetSchemeIdUri () const; + const std::string& GetValue () const; + + void SetValue (const std::string& value); + void SetSchemeIdUri (const std::string& schemeIdUri); + + private: + std::string schemeIdUri; + std::string value; + }; + } +} + +#endif /* DESCRIPTOR_H_ */ diff --git a/src/libdash/source/mpd/MPD.cpp b/src/libdash/source/mpd/MPD.cpp new file mode 100644 index 00000000..84e0e614 --- /dev/null +++ b/src/libdash/source/mpd/MPD.cpp @@ -0,0 +1,212 @@ +/* + * MPD.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "MPD.h" + +using namespace dash::mpd; +using namespace dash::metrics; + +MPD::MPD () : + id(""), + type("static"), + availabilityStarttime(""), + availabilityEndtime(""), + mediaPresentationDuration(""), + minimumUpdatePeriod(""), + minBufferTime(""), + timeShiftBufferDepth(""), + suggestedPresentationDelay(""), + maxSegmentDuration(""), + maxSubsegmentDuration("") +{ +} +MPD::~MPD () +{ + for(size_t i = 0; i < this->programInformations.size(); i++) + delete(this->programInformations.at(i)); + for(size_t i = 0; i < this->metrics.size(); i++) + delete(this->metrics.at(i)); + for(size_t i = 0; i < this->periods.size(); i++) + delete(this->periods.at(i)); + for(size_t i = 0; i < this->baseUrls.size(); i++) + delete(this->baseUrls.at(i)); +} + +const std::vector<IProgramInformation *>& MPD::GetProgramInformations () const +{ + return (std::vector<IProgramInformation *> &) this->programInformations; +} +void MPD::AddProgramInformation (ProgramInformation *programInformation) +{ + this->programInformations.push_back(programInformation); +} +const std::vector<IBaseUrl*>& MPD::GetBaseUrls () const +{ + return (std::vector<IBaseUrl*> &) this->baseUrls; +} +void MPD::AddBaseUrl (BaseUrl *url) +{ + this->baseUrls.push_back(url); +} +const std::vector<std::string>& MPD::GetLocations () const +{ + return this->locations; +} +void MPD::AddLocation (const std::string& location) +{ + this->locations.push_back(location); +} +const std::vector<IPeriod*>& MPD::GetPeriods () const +{ + return (std::vector<IPeriod*> &) this->periods; +} +void MPD::AddPeriod (Period *period) +{ + this->periods.push_back(period); +} +const std::vector<IMetrics *>& MPD::GetMetrics () const +{ + return (std::vector<IMetrics *> &) this->metrics; +} +void MPD::AddMetrics (Metrics *metrics) +{ + this->metrics.push_back(metrics); +} +const std::string& MPD::GetId () const +{ + return this->id; +} +void MPD::SetId (const std::string& id) +{ + this->id = id; +} +const std::vector<std::string>& MPD::GetProfiles () const +{ + return this->profiles; +} +void MPD::SetProfiles (const std::string& profiles) +{ + dash::helpers::String::Split(profiles, ',', this->profiles); +} +const std::string& MPD::GetType () const +{ + return this->type; +} +void MPD::SetType (const std::string& type) +{ + this->type = type; +} +const std::string& MPD::GetAvailabilityStarttime () const +{ + return this->availabilityStarttime; +} +void MPD::SetAvailabilityStarttime (const std::string& availabilityStarttime) +{ + this->availabilityStarttime = availabilityStarttime; +} +const std::string& MPD::GetAvailabilityEndtime () const +{ + return this->availabilityEndtime; +} +void MPD::SetAvailabilityEndtime (const std::string& availabilityEndtime) +{ + this->availabilityEndtime = availabilityEndtime; +} +const std::string& MPD::GetMediaPresentationDuration () const +{ + return this->mediaPresentationDuration; +} +void MPD::SetMediaPresentationDuration (const std::string& mediaPresentationDuration) +{ + this->mediaPresentationDuration = mediaPresentationDuration; +} +const std::string& MPD::GetMinimumUpdatePeriod () const +{ + return this->minimumUpdatePeriod; +} +void MPD::SetMinimumUpdatePeriod (const std::string& minimumUpdatePeriod) +{ + this->minimumUpdatePeriod = minimumUpdatePeriod; +} +const std::string& MPD::GetMinBufferTime () const +{ + return this->minBufferTime; +} +void MPD::SetMinBufferTime (const std::string& minBufferTime) +{ + this->minBufferTime = minBufferTime; +} +const std::string& MPD::GetTimeShiftBufferDepth () const +{ + return this->timeShiftBufferDepth; +} +void MPD::SetTimeShiftBufferDepth (const std::string& timeShiftBufferDepth) +{ + this->timeShiftBufferDepth = timeShiftBufferDepth; +} +const std::string& MPD::GetSuggestedPresentationDelay () const +{ + return this->suggestedPresentationDelay; +} +void MPD::SetSuggestedPresentationDelay (const std::string& suggestedPresentationDelay) +{ + this->suggestedPresentationDelay = suggestedPresentationDelay; +} +const std::string& MPD::GetMaxSegmentDuration () const +{ + return this->maxSegmentDuration; +} +void MPD::SetMaxSegmentDuration (const std::string& maxSegmentDuration) +{ + this->maxSegmentDuration = maxSegmentDuration; +} +const std::string& MPD::GetMaxSubsegmentDuration () const +{ + return this->maxSubsegmentDuration; +} +void MPD::SetMaxSubsegmentDuration (const std::string& maxSubsegmentDuration) +{ + this->maxSubsegmentDuration = maxSubsegmentDuration; +} +IBaseUrl* MPD::GetMPDPathBaseUrl () const +{ + return this->mpdPathBaseUrl; +} +void MPD::SetMPDPathBaseUrl (BaseUrl *mpdPath) +{ + this->mpdPathBaseUrl = mpdPath; +} +uint32_t MPD::GetFetchTime () const +{ + return this->fetchTime; +} +void MPD::SetFetchTime (uint32_t fetchTimeInSec) +{ + this->fetchTime = fetchTimeInSec; +} + + +const std::vector<ITCPConnection *>& MPD::GetTCPConnectionList () const +{ + return (std::vector<ITCPConnection *> &) this->tcpConnections; +} +void MPD::AddTCPConnection (TCPConnection *tcpConn) +{ + this->tcpConnections.push_back(tcpConn); +} +const std::vector<IHTTPTransaction *>& MPD::GetHTTPTransactionList () const +{ + return (std::vector<IHTTPTransaction *> &) this->httpTransactions; +} +void MPD::AddHTTPTransaction (HTTPTransaction *httpTransAct) +{ + this->httpTransactions.push_back(httpTransAct); +} diff --git a/src/libdash/source/mpd/MPD.h b/src/libdash/source/mpd/MPD.h new file mode 100644 index 00000000..9bcb38af --- /dev/null +++ b/src/libdash/source/mpd/MPD.h @@ -0,0 +1,107 @@ +/* + * MPD.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef MPD_H_ +#define MPD_H_ + +#include "config.h" + +#include "IMPD.h" +#include "ProgramInformation.h" +#include "BaseUrl.h" +#include "Period.h" +#include "Metrics.h" +#include "AbstractMPDElement.h" +#include "../metrics/HTTPTransaction.h" +#include "../metrics/TCPConnection.h" + +namespace dash +{ + namespace mpd + { + class MPD : public IMPD, public AbstractMPDElement + { + public: + MPD (); + virtual ~MPD(); + + const std::vector<IProgramInformation *>& GetProgramInformations () const; + const std::vector<IBaseUrl *>& GetBaseUrls () const; + const std::vector<std::string>& GetLocations () const; + const std::vector<IPeriod *>& GetPeriods () const; + const std::vector<IMetrics *>& GetMetrics () const; + const std::string& GetId () const; + const std::vector<std::string>& GetProfiles () const; + const std::string& GetType () const; + const std::string& GetAvailabilityStarttime () const; + const std::string& GetAvailabilityEndtime () const; + const std::string& GetMediaPresentationDuration () const; + const std::string& GetMinimumUpdatePeriod () const; + const std::string& GetMinBufferTime () const; + const std::string& GetTimeShiftBufferDepth () const; + const std::string& GetSuggestedPresentationDelay () const; + const std::string& GetMaxSegmentDuration () const; + const std::string& GetMaxSubsegmentDuration () const; + IBaseUrl* GetMPDPathBaseUrl () const; + uint32_t GetFetchTime () const; + + const std::vector<dash::metrics::ITCPConnection *>& GetTCPConnectionList () const; + const std::vector<dash::metrics::IHTTPTransaction *>& GetHTTPTransactionList () const; + void AddTCPConnection (dash::metrics::TCPConnection *tcpConn); + void AddHTTPTransaction (dash::metrics::HTTPTransaction *httpTransAct); + + void AddProgramInformation (ProgramInformation *programInformation); + void AddBaseUrl (BaseUrl *url); + void AddLocation (const std::string& location); + void AddPeriod (Period *period); + void AddMetrics (Metrics *metrics); + void SetId (const std::string& id); + void SetProfiles (const std::string& profiles); + void SetType (const std::string& type); + void SetAvailabilityStarttime (const std::string& availabilityStarttime); + void SetAvailabilityEndtime (const std::string& availabilityEndtime); + void SetMediaPresentationDuration (const std::string& mediaPresentationDuration); + void SetMinimumUpdatePeriod (const std::string& minimumUpdatePeriod); + void SetMinBufferTime (const std::string& minBufferTime); + void SetTimeShiftBufferDepth (const std::string& timeShiftBufferDepth); + void SetSuggestedPresentationDelay (const std::string& suggestedPresentationDelay); + void SetMaxSegmentDuration (const std::string& maxSegmentDuration); + void SetMaxSubsegmentDuration (const std::string& maxSubsegmentDuration); + void SetMPDPathBaseUrl (BaseUrl *path); + void SetFetchTime (uint32_t fetchTimeInSec); + + private: + std::vector<ProgramInformation *> programInformations; + std::vector<BaseUrl *> baseUrls; + std::vector<std::string> locations; + std::vector<Period *> periods; + std::vector<Metrics *> metrics; + std::string id; + std::vector<std::string> profiles; + std::string type; + std::string availabilityStarttime; + std::string availabilityEndtime; + std::string mediaPresentationDuration; + std::string minimumUpdatePeriod; + std::string minBufferTime; + std::string timeShiftBufferDepth; + std::string suggestedPresentationDelay; + std::string maxSegmentDuration; + std::string maxSubsegmentDuration; + BaseUrl *mpdPathBaseUrl; + uint32_t fetchTime; + + std::vector<dash::metrics::TCPConnection *> tcpConnections; + std::vector<dash::metrics::HTTPTransaction *> httpTransactions; + }; + } +} +#endif /* MPD_H_ */ diff --git a/src/libdash/source/mpd/Metrics.cpp b/src/libdash/source/mpd/Metrics.cpp new file mode 100644 index 00000000..8e64dec4 --- /dev/null +++ b/src/libdash/source/mpd/Metrics.cpp @@ -0,0 +1,51 @@ +/* + * Metrics.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "../mpd/Metrics.h" + +using namespace dash::mpd; + +Metrics::Metrics () : + metrics("") +{ +} +Metrics::~Metrics () +{ + for(size_t i = 0; i < this->reportings.size(); i++) + delete(this->reportings.at(i)); + for(size_t i = 0; i < this->ranges.size(); i++) + delete(this->ranges.at(i)); +} + +const std::vector<IDescriptor *>& Metrics::GetReportings () const +{ + return (std::vector<IDescriptor *> &)this->reportings; +} +void Metrics::AddReporting (Descriptor *reporting) +{ + this->reportings.push_back(reporting); +} +const std::vector<IRange *>& Metrics::GetRanges () const +{ + return (std::vector<IRange *> &)this->ranges; +} +void Metrics::AddRange (Range *range) +{ + this->ranges.push_back(range); +} +const std::string& Metrics::GetMetrics () const +{ + return this->metrics; +} +void Metrics::SetMetrics (const std::string& metrics) +{ + this->metrics = metrics; +} diff --git a/src/libdash/source/mpd/Metrics.h b/src/libdash/source/mpd/Metrics.h new file mode 100644 index 00000000..c879f829 --- /dev/null +++ b/src/libdash/source/mpd/Metrics.h @@ -0,0 +1,51 @@ +/* + * Metrics.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef METRICS_H_ +#define METRICS_H_ + +#include "config.h" + +#include <string> +#include <vector> + +#include "IMetrics.h" +#include "Descriptor.h" +#include "Range.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class Metrics : public IMetrics, public AbstractMPDElement + { + public: + Metrics (); + virtual ~Metrics (); + + const std::vector<IDescriptor *>& GetReportings () const; + const std::vector<IRange *>& GetRanges () const; + const std::string& GetMetrics () const; + + void AddReporting (Descriptor *reporting); + void AddRange (Range *range); + void SetMetrics (const std::string& metrics); + + private: + std::vector<Descriptor *> reportings; + std::vector<Range *> ranges; + std::string metrics; + }; + } +} + +#endif /* METRICS_H_ */ diff --git a/src/libdash/source/mpd/MultipleSegmentBase.cpp b/src/libdash/source/mpd/MultipleSegmentBase.cpp new file mode 100644 index 00000000..ccfba515 --- /dev/null +++ b/src/libdash/source/mpd/MultipleSegmentBase.cpp @@ -0,0 +1,60 @@ +/* + * MultipleSegmentBase.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "MultipleSegmentBase.h" + +using namespace dash::mpd; + +MultipleSegmentBase::MultipleSegmentBase () : + bitstreamSwitching(NULL), + segmentTimeline(NULL), + duration(0), + startNumber(1) +{ +} +MultipleSegmentBase::~MultipleSegmentBase () +{ + delete(this->segmentTimeline); + delete(this->bitstreamSwitching); +} + +const ISegmentTimeline * MultipleSegmentBase::GetSegmentTimeline () const +{ + return (ISegmentTimeline *) this->segmentTimeline; +} +void MultipleSegmentBase::SetSegmentTimeline (SegmentTimeline *segmentTimeline) +{ + this->segmentTimeline = segmentTimeline; +} +const IURLType* MultipleSegmentBase::GetBitstreamSwitching () const +{ + return this->bitstreamSwitching; +} +void MultipleSegmentBase::SetBitstreamSwitching (URLType *bitstreamSwitching) +{ + this->bitstreamSwitching = bitstreamSwitching; +} +uint32_t MultipleSegmentBase::GetDuration () const +{ + return this->duration; +} +void MultipleSegmentBase::SetDuration (uint32_t duration) +{ + this->duration = duration; +} +uint32_t MultipleSegmentBase::GetStartNumber () const +{ + return this->startNumber; +} +void MultipleSegmentBase::SetStartNumber (uint32_t startNumber) +{ + this->startNumber = startNumber; +} diff --git a/src/libdash/source/mpd/MultipleSegmentBase.h b/src/libdash/source/mpd/MultipleSegmentBase.h new file mode 100644 index 00000000..386672ce --- /dev/null +++ b/src/libdash/source/mpd/MultipleSegmentBase.h @@ -0,0 +1,51 @@ +/* + * MultipleSegmentBase.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef MULTIPLESEGMENTBASE_H_ +#define MULTIPLESEGMENTBASE_H_ + +#include "config.h" + +#include "IMultipleSegmentBase.h" +#include "SegmentBase.h" +#include "SegmentTimeline.h" +#include "URLType.h" + +namespace dash +{ + namespace mpd + { + class MultipleSegmentBase : public virtual IMultipleSegmentBase, public SegmentBase + { + public: + MultipleSegmentBase (); + virtual ~MultipleSegmentBase (); + + const ISegmentTimeline* GetSegmentTimeline () const; + const IURLType* GetBitstreamSwitching () const; + uint32_t GetDuration () const; + uint32_t GetStartNumber () const; + + void SetSegmentTimeline (SegmentTimeline *segmentTimeline); + void SetBitstreamSwitching (URLType *bitstreamSwitching); + void SetDuration (uint32_t duration); + void SetStartNumber (uint32_t startNumber); + + protected: + SegmentTimeline *segmentTimeline; + URLType *bitstreamSwitching; + uint32_t duration; + uint32_t startNumber; + }; + } +} + +#endif /* MULTIPLESEGMENTBASE_H_ */ diff --git a/src/libdash/source/mpd/Period.cpp b/src/libdash/source/mpd/Period.cpp new file mode 100644 index 00000000..291677ea --- /dev/null +++ b/src/libdash/source/mpd/Period.cpp @@ -0,0 +1,137 @@ +/* + * Period.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Period.h" + +using namespace dash::mpd; + +Period::Period () : + segmentBase(NULL), + segmentList(NULL), + segmentTemplate(NULL), + xlinkActuate("onRequest"), + xlinkHref(""), + id(""), + start(""), + duration(""), + isBitstreamSwitching(false) +{ +} +Period::~Period () +{ + for(size_t i = 0; i < this->baseURLs.size(); i++) + delete(this->baseURLs.at(i)); + for(size_t i = 0; i < this->adaptationSets.size(); i++) + delete(this->adaptationSets.at(i)); + for(size_t i = 0; i < this->subsets.size(); i++) + delete(this->subsets.at(i)); + delete(segmentBase); + delete(segmentList); + delete(segmentTemplate); +} + +const std::vector<IBaseUrl *>& Period::GetBaseURLs () const +{ + return (std::vector<IBaseUrl *> &) this->baseURLs; +} +void Period::AddBaseURL (BaseUrl *baseUrl) +{ + this->baseURLs.push_back(baseUrl); +} +ISegmentBase* Period::GetSegmentBase () const +{ + return this->segmentBase; +} +void Period::SetSegmentBase (SegmentBase *segmentBase) +{ + this->segmentBase = segmentBase; +} +ISegmentList* Period::GetSegmentList () const +{ + return this->segmentList; +} +void Period::SetSegmentList (SegmentList *segmentList) +{ + this->segmentList = segmentList; +} +ISegmentTemplate* Period::GetSegmentTemplate () const +{ + return this->segmentTemplate; +} +void Period::SetSegmentTemplate (SegmentTemplate *segmentTemplate) +{ + this->segmentTemplate = segmentTemplate; +} +const std::vector<IAdaptationSet*>& Period::GetAdaptationSets () const +{ + return (std::vector<IAdaptationSet*> &) this->adaptationSets; +} +void Period::AddAdaptationSet (AdaptationSet *adaptationSet) +{ + if(adaptationSet != NULL) + this->adaptationSets.push_back(adaptationSet); +} +const std::vector<ISubset *>& Period::GetSubsets () const +{ + return (std::vector<ISubset *> &) this->subsets; +} +void Period::AddSubset (Subset *subset) +{ + this->subsets.push_back(subset); +} +const std::string& Period::GetXlinkHref () const +{ + return this->xlinkHref; +} +void Period::SetXlinkHref (const std::string& xlinkHref) +{ + this->xlinkHref = xlinkHref; +} +const std::string& Period::GetXlinkActuate () const +{ + return this->xlinkActuate; +} +void Period::SetXlinkActuate (const std::string& xlinkActuate) +{ + this->xlinkActuate = xlinkActuate; +} +const std::string& Period::GetId () const +{ + return this->id; +} +void Period::SetId (const std::string& id) +{ + this->id = id; +} +const std::string& Period::GetStart () const +{ + return this->start; +} +void Period::SetStart (const std::string& start) +{ + this->start = start; +} +const std::string& Period::GetDuration () const +{ + return this->duration; +} +void Period::SetDuration (const std::string& duration) +{ + this->duration = duration; +} +bool Period::GetBitstreamSwitching () const +{ + return this->isBitstreamSwitching; +} +void Period::SetBitstreamSwitching (bool value) +{ + this->isBitstreamSwitching = value; +} diff --git a/src/libdash/source/mpd/Period.h b/src/libdash/source/mpd/Period.h new file mode 100644 index 00000000..9e97f0cb --- /dev/null +++ b/src/libdash/source/mpd/Period.h @@ -0,0 +1,79 @@ +/* + * Period.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef PERIOD_H_ +#define PERIOD_H_ + +#include "config.h" + +#include "IPeriod.h" +#include "BaseUrl.h" +#include "AdaptationSet.h" +#include "Subset.h" +#include "SegmentBase.h" +#include "SegmentList.h" +#include "SegmentTemplate.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class Period : public IPeriod, public AbstractMPDElement + { + public: + Period (); + virtual ~Period (); + + const std::vector<IBaseUrl *>& GetBaseURLs () const; + ISegmentBase* GetSegmentBase () const; + ISegmentList* GetSegmentList () const; + ISegmentTemplate* GetSegmentTemplate () const; + const std::vector<IAdaptationSet *>& GetAdaptationSets () const; + const std::vector<ISubset *>& GetSubsets () const; + const std::string& GetXlinkHref () const; + const std::string& GetXlinkActuate () const; + const std::string& GetId () const; + const std::string& GetStart () const; + const std::string& GetDuration () const; + bool GetBitstreamSwitching () const; + + void AddBaseURL (BaseUrl *baseURL); + void SetSegmentBase (SegmentBase *segmentBase); + void SetSegmentList (SegmentList *segmentList); + void SetSegmentTemplate (SegmentTemplate *segmentTemplate); + void AddAdaptationSet (AdaptationSet *AdaptationSet); + void AddSubset (Subset *subset); + void SetXlinkHref (const std::string& xlinkHref); + void SetXlinkActuate (const std::string& xlinkActuate); + void SetId (const std::string& id); + void SetStart (const std::string& start); + void SetDuration (const std::string& duration); + void SetBitstreamSwitching (bool value); + + private: + std::vector<BaseUrl *> baseURLs; + SegmentBase *segmentBase; + SegmentList *segmentList; + SegmentTemplate *segmentTemplate; + std::vector<AdaptationSet *> adaptationSets; + std::vector<Subset *> subsets; + std::string xlinkHref; + std::string xlinkActuate; + std::string id; + std::string start; + std::string duration; + bool isBitstreamSwitching; + }; + } +} + +#endif /* PERIOD_H_ */ diff --git a/src/libdash/source/mpd/ProgramInformation.cpp b/src/libdash/source/mpd/ProgramInformation.cpp new file mode 100644 index 00000000..2ba0d6ff --- /dev/null +++ b/src/libdash/source/mpd/ProgramInformation.cpp @@ -0,0 +1,67 @@ +/* + * ProgramInformation.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "ProgramInformation.h" + +using namespace dash::mpd; + +ProgramInformation::ProgramInformation () : + title(""), + source(""), + copyright(""), + lang(""), + moreInformationURL("") +{ +} +ProgramInformation::~ProgramInformation () +{ +} + +const std::string& ProgramInformation::GetTitle () const +{ + return this->title; +} +void ProgramInformation::SetTitle (const std::string& title) +{ + this->title = title; +} +const std::string& ProgramInformation::GetSource () const +{ + return this->source; +} +void ProgramInformation::SetSource (const std::string& source) +{ + this->source = source; +} +const std::string& ProgramInformation::GetCopyright () const +{ + return this->copyright; +} +void ProgramInformation::SetCopyright (const std::string& copyright) +{ + this->copyright = copyright; +} +const std::string& ProgramInformation::GetLang () const +{ + return this->lang; +} +void ProgramInformation::SetLang (const std::string& lang) +{ + this->lang = lang; +} +const std::string& ProgramInformation::GetMoreInformationURL () const +{ + return this->moreInformationURL; +} +void ProgramInformation::SetMoreInformationURL (const std::string& moreInfoURL) +{ + this->moreInformationURL = moreInfoURL; +} diff --git a/src/libdash/source/mpd/ProgramInformation.h b/src/libdash/source/mpd/ProgramInformation.h new file mode 100644 index 00000000..9b12f33d --- /dev/null +++ b/src/libdash/source/mpd/ProgramInformation.h @@ -0,0 +1,52 @@ +/* + * ProgramInformation.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef PROGRAMINFORMATION_H_ +#define PROGRAMINFORMATION_H_ + +#include "config.h" + +#include "IProgramInformation.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class ProgramInformation : public IProgramInformation, public AbstractMPDElement + { + public: + ProgramInformation (); + virtual ~ProgramInformation (); + + const std::string& GetTitle () const; + const std::string& GetSource () const; + const std::string& GetCopyright () const; + const std::string& GetLang () const; + const std::string& GetMoreInformationURL () const; + + void SetTitle (const std::string& title); + void SetSource (const std::string& source); + void SetCopyright (const std::string& copyright); + void SetLang (const std::string& lang); + void SetMoreInformationURL (const std::string& moreInformationURL); + + private: + std::string title; + std::string source; + std::string copyright; + std::string lang; + std::string moreInformationURL; + }; + } +} + +#endif /* PROGRAMINFORMATION_H_ */ diff --git a/src/libdash/source/mpd/Range.cpp b/src/libdash/source/mpd/Range.cpp new file mode 100644 index 00000000..6f0aed9f --- /dev/null +++ b/src/libdash/source/mpd/Range.cpp @@ -0,0 +1,40 @@ +/* + * Range.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Range.h" + +using namespace dash::mpd; + +Range::Range () : + starttime(""), + duration("") +{ +} +Range::~Range () +{ +} + +const std::string& Range::GetStarttime () const +{ + return this->starttime; +} +void Range::SetStarttime (const std::string& starttime) +{ + this->starttime = starttime; +} +const std::string& Range::GetDuration () const +{ + return this->duration; +} +void Range::SetDuration (const std::string& duration) +{ + this->duration = duration; +} diff --git a/src/libdash/source/mpd/Range.h b/src/libdash/source/mpd/Range.h new file mode 100644 index 00000000..f847b096 --- /dev/null +++ b/src/libdash/source/mpd/Range.h @@ -0,0 +1,42 @@ +/* + * Range.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef RANGE_H_ +#define RANGE_H_ + +#include "config.h" + +#include "IRange.h" + +namespace dash +{ + namespace mpd + { + class Range : public IRange + { + public: + Range (); + virtual ~Range (); + + const std::string& GetStarttime () const; + const std::string& GetDuration () const; + + void SetStarttime (const std::string& start); + void SetDuration (const std::string& duration); + + private: + std::string starttime; + std::string duration; + }; + } +} + +#endif /* RANGE_H_ */ diff --git a/src/libdash/source/mpd/Representation.cpp b/src/libdash/source/mpd/Representation.cpp new file mode 100644 index 00000000..fab7b493 --- /dev/null +++ b/src/libdash/source/mpd/Representation.cpp @@ -0,0 +1,116 @@ +/* + * Representation.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Representation.h" + +using namespace dash::mpd; + +Representation::Representation () : + segmentBase (NULL), + segmentList (NULL), + segmentTemplate (NULL), + id(""), + bandwidth (0), + qualityRanking (0) +{ +} +Representation::~Representation () +{ + for(size_t i = 0; i < this->baseURLs.size(); i++) + delete(this->baseURLs.at(i)); + for(size_t i = 0; i < this->subRepresentations.size(); i++) + delete(this->subRepresentations.at(i)); + + delete(this->segmentTemplate); + delete(this->segmentBase); + delete(this->segmentList); +} + +const std::vector<IBaseUrl *>& Representation::GetBaseURLs () const +{ + return (std::vector<IBaseUrl *> &) this->baseURLs; +} +void Representation::AddBaseURL (BaseUrl *baseUrl) +{ + this->baseURLs.push_back(baseUrl); +} +const std::vector<ISubRepresentation *>& Representation::GetSubRepresentations () const +{ + return (std::vector<ISubRepresentation *> &) this->subRepresentations; +} +void Representation::AddSubRepresentation (SubRepresentation *subRepresentation) +{ + this->subRepresentations.push_back(subRepresentation); +} +ISegmentBase* Representation::GetSegmentBase () const +{ + return this->segmentBase; +} +void Representation::SetSegmentBase (SegmentBase *segmentBase) +{ + this->segmentBase = segmentBase; +} +ISegmentList* Representation::GetSegmentList () const +{ + return this->segmentList; +} +void Representation::SetSegmentList (SegmentList *segmentList) +{ + this->segmentList = segmentList; +} +ISegmentTemplate* Representation::GetSegmentTemplate () const +{ + return this->segmentTemplate; +} +void Representation::SetSegmentTemplate (SegmentTemplate *segmentTemplate) +{ + this->segmentTemplate = segmentTemplate; +} +const std::string& Representation::GetId () const +{ + return this->id; +} +void Representation::SetId (const std::string &id) +{ + this->id = id; +} +uint32_t Representation::GetBandwidth () const +{ + return this->bandwidth; +} +void Representation::SetBandwidth (uint32_t bandwidth) +{ + this->bandwidth = bandwidth; +} +uint32_t Representation::GetQualityRanking () const +{ + return this->qualityRanking; +} +void Representation::SetQualityRanking (uint32_t qualityRanking) +{ + this->qualityRanking = qualityRanking; +} +const std::vector<std::string>& Representation::GetDependencyId () const +{ + return this->dependencyId; +} +void Representation::SetDependencyId (const std::string &dependencyId) +{ + dash::helpers::String::Split(dependencyId, ' ', this->dependencyId); +} +const std::vector<std::string>& Representation::GetMediaStreamStructureId () const +{ + return this->mediaStreamStructureId; +} +void Representation::SetMediaStreamStructureId (const std::string& mediaStreamStructureId) +{ + dash::helpers::String::Split(mediaStreamStructureId, ' ', this->mediaStreamStructureId); +} diff --git a/src/libdash/source/mpd/Representation.h b/src/libdash/source/mpd/Representation.h new file mode 100644 index 00000000..a56f5828 --- /dev/null +++ b/src/libdash/source/mpd/Representation.h @@ -0,0 +1,75 @@ +/* + * Representation.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef REPRESENTATION_H_ +#define REPRESENTATION_H_ + +#include "config.h" + +#include "IRepresentation.h" +#include "SegmentTemplate.h" +#include "RepresentationBase.h" +#include "BaseUrl.h" +#include "SubRepresentation.h" +#include "SegmentBase.h" +#include "SegmentList.h" +#include "../helpers/String.h" + +namespace dash +{ + namespace mpd + { + class Representation : public IRepresentation, public RepresentationBase + { + public: + Representation (); + virtual ~Representation (); + + const std::vector<IBaseUrl *>& GetBaseURLs () const; + const std::vector<ISubRepresentation *>& GetSubRepresentations () const; + ISegmentBase* GetSegmentBase () const; + ISegmentList* GetSegmentList () const; + ISegmentTemplate* GetSegmentTemplate () const; + const std::string& GetId () const; + uint32_t GetBandwidth () const; + uint32_t GetQualityRanking () const; + const std::vector<std::string>& GetDependencyId () const; + const std::vector<std::string>& GetMediaStreamStructureId () const; + + + void AddBaseURL (BaseUrl *baseURL); + void AddSubRepresentation (SubRepresentation *subRepresentation); + void SetSegmentBase (SegmentBase *segmentBase); + void SetSegmentList (SegmentList *segmentList); + void SetSegmentTemplate (SegmentTemplate *segmentTemplate); + void SetId (const std::string &id); + void SetBandwidth (uint32_t bandwidth); + void SetQualityRanking (uint32_t qualityRanking); + void SetDependencyId (const std::string &dependencyId); + void SetMediaStreamStructureId (const std::string &mediaStreamStructureId); + + private: + std::vector<BaseUrl *> baseURLs; + std::vector<SubRepresentation *> subRepresentations; + SegmentBase *segmentBase; + SegmentList *segmentList; + SegmentTemplate *segmentTemplate; + std::string id; + uint32_t bandwidth; + uint32_t qualityRanking; + std::vector<std::string> dependencyId; + std::vector<std::string> mediaStreamStructureId; + + }; + } +} + +#endif /* REPRESENTATION_H_ */ diff --git a/src/libdash/source/mpd/RepresentationBase.cpp b/src/libdash/source/mpd/RepresentationBase.cpp new file mode 100644 index 00000000..f7b8970c --- /dev/null +++ b/src/libdash/source/mpd/RepresentationBase.cpp @@ -0,0 +1,175 @@ +/* + * RepresentationBase.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "RepresentationBase.h" + +using namespace dash::mpd; + +RepresentationBase::RepresentationBase () : + width(0), + height(0), + sar(""), + frameRate(""), + audioSamplingRate(""), + mimeType(""), + maximumSAPPeriod(0.0), + startWithSAP(0), + maxPlayoutRate(0.0), + codingDependency(false), + scanType("") +{ +} +RepresentationBase::~RepresentationBase () +{ + for(size_t i = 0; i < this->framePacking.size(); i++) + delete(this->framePacking.at(i)); + for(size_t i = 0; i < this->audioChannelConfiguration.size(); i++) + delete(this->audioChannelConfiguration.at(i)); + for(size_t i = 0; i < this->contentProtection.size(); i++) + delete(this->contentProtection.at(i)); +} + +const std::vector<IDescriptor*>& RepresentationBase::GetFramePacking () const +{ + return (std::vector<IDescriptor*> &) this->framePacking; +} +void RepresentationBase::AddFramePacking (Descriptor *framePacking) +{ + this->framePacking.push_back(framePacking); +} +const std::vector<IDescriptor*>& RepresentationBase::GetAudioChannelConfiguration () const +{ + return (std::vector<IDescriptor*> &) this->audioChannelConfiguration; +} +void RepresentationBase::AddAudioChannelConfiguration (Descriptor *audioChannelConfiguration) +{ + this->audioChannelConfiguration.push_back(audioChannelConfiguration); +} +const std::vector<IDescriptor*>& RepresentationBase::GetContentProtection () const +{ + return (std::vector<IDescriptor*> &) this->contentProtection; +} +void RepresentationBase::AddContentProtection (Descriptor *contentProtection) +{ + this->contentProtection.push_back(contentProtection); +} +const std::vector<std::string>& RepresentationBase::GetProfiles () const +{ + return this->profiles; +} +void RepresentationBase::SetProfiles (const std::string& profiles) +{ + dash::helpers::String::Split(profiles, ',', this->profiles); +} +uint32_t RepresentationBase::GetWidth () const +{ + return this->width; +} +void RepresentationBase::SetWidth (uint32_t width) +{ + this->width = width; +} +uint32_t RepresentationBase::GetHeight () const +{ + return this->height; +} +void RepresentationBase::SetHeight (uint32_t height) +{ + this->height = height; +} +std::string RepresentationBase::GetSar () const +{ + return this->sar; +} +void RepresentationBase::SetSar (const std::string& sar) +{ + this->sar = sar; +} +std::string RepresentationBase::GetFrameRate () const +{ + return this->frameRate; +} +void RepresentationBase::SetFrameRate (const std::string& frameRate) +{ + this->frameRate = frameRate; +} +std::string RepresentationBase::GetAudioSamplingRate () const +{ + return this->audioSamplingRate; +} +void RepresentationBase::SetAudioSamplingRate (const std::string& audioSamplingRate) +{ + this->audioSamplingRate = audioSamplingRate; +} +std::string RepresentationBase::GetMimeType () const +{ + return this->mimeType; +} +void RepresentationBase::SetMimeType (const std::string& mimeType) +{ + this->mimeType = mimeType; +} +const std::vector<std::string>& RepresentationBase::GetSegmentProfiles () const +{ + return this->segmentProfiles; +} +void RepresentationBase::SetSegmentProfiles (const std::string& segmentProfiles) +{ + dash::helpers::String::Split(segmentProfiles, ',', this->segmentProfiles); +} +const std::vector<std::string>& RepresentationBase::GetCodecs () const +{ + return this->codecs; +} +void RepresentationBase::SetCodecs (const std::string& codecs) +{ + dash::helpers::String::Split(codecs, ',', this->codecs); +} +double RepresentationBase::GetMaximumSAPPeriod () const +{ + return this->maximumSAPPeriod; +} +void RepresentationBase::SetMaximumSAPPeriod (double maximumSAPPeriod) +{ + this->maximumSAPPeriod = maximumSAPPeriod; +} +uint8_t RepresentationBase::GetStartWithSAP () const +{ + return this->startWithSAP; +} +void RepresentationBase::SetStartWithSAP (uint8_t startWithSAP) +{ + this->startWithSAP = startWithSAP; +} +double RepresentationBase::GetMaxPlayoutRate () const +{ + return this->maxPlayoutRate; +} +void RepresentationBase::SetMaxPlayoutRate (double maxPlayoutRate) +{ + this->maxPlayoutRate = maxPlayoutRate; +} +bool RepresentationBase::HasCodingDependency () const +{ + return this->codingDependency; +} +void RepresentationBase::SetCodingDependency (bool codingDependency) +{ + this->codingDependency = codingDependency; +} +std::string RepresentationBase::GetScanType () const +{ + return this->scanType; +} +void RepresentationBase::SetScanType (const std::string& scanType) +{ + this->scanType = scanType; +} diff --git a/src/libdash/source/mpd/RepresentationBase.h b/src/libdash/source/mpd/RepresentationBase.h new file mode 100644 index 00000000..bb7fd287 --- /dev/null +++ b/src/libdash/source/mpd/RepresentationBase.h @@ -0,0 +1,89 @@ +/* + * RepresentationBase.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef REPRESENTATIONBASE_H_ +#define REPRESENTATIONBASE_H_ + +#include "config.h" + +#include "IRepresentationBase.h" +#include "Descriptor.h" +#include "../helpers/String.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class RepresentationBase : public virtual IRepresentationBase, public AbstractMPDElement + { + public: + RepresentationBase (); + virtual ~RepresentationBase (); + + const std::vector<IDescriptor *>& GetFramePacking () const; + const std::vector<IDescriptor *>& GetAudioChannelConfiguration () const; + const std::vector<IDescriptor *>& GetContentProtection () const; + const std::vector<std::string>& GetProfiles () const; + uint32_t GetWidth () const; + uint32_t GetHeight () const; + std::string GetSar () const; + std::string GetFrameRate () const; + std::string GetAudioSamplingRate () const; + std::string GetMimeType () const; + const std::vector<std::string>& GetSegmentProfiles () const; + const std::vector<std::string>& GetCodecs () const; + double GetMaximumSAPPeriod () const; + uint8_t GetStartWithSAP () const; + double GetMaxPlayoutRate () const; + bool HasCodingDependency () const; + std::string GetScanType () const; + + void AddFramePacking (Descriptor *framePacking); + void AddAudioChannelConfiguration (Descriptor *audioChannelConfiguration); + void AddContentProtection (Descriptor *contentProtection); + void SetProfiles (const std::string& profiles); + void SetWidth (uint32_t width); + void SetHeight (uint32_t height); + void SetSar (const std::string& sar); + void SetFrameRate (const std::string& frameRate); + void SetAudioSamplingRate (const std::string& audioSamplingRate); + void SetMimeType (const std::string& mimeType); + void SetSegmentProfiles (const std::string& segmentProfiles); + void SetCodecs (const std::string& codecs); + void SetMaximumSAPPeriod (double maximumSAPPeroid); + void SetStartWithSAP (uint8_t startWithSAP); + void SetMaxPlayoutRate (double maxPlayoutRate); + void SetCodingDependency (bool codingDependency); + void SetScanType (const std::string& scanType); + + protected: + std::vector<Descriptor *> framePacking; + std::vector<Descriptor *> audioChannelConfiguration; + std::vector<Descriptor *> contentProtection; + std::vector<std::string> profiles; + uint32_t width; + uint32_t height; + std::string sar; + std::string frameRate; + std::string audioSamplingRate; + std::string mimeType; + std::vector<std::string> segmentProfiles; + std::vector<std::string> codecs; + double maximumSAPPeriod; + uint8_t startWithSAP; + double maxPlayoutRate; + bool codingDependency; + std::string scanType; + }; + } +} +#endif /* REPRESENTATIONBASE_H_ */ diff --git a/src/libdash/source/mpd/Segment.cpp b/src/libdash/source/mpd/Segment.cpp new file mode 100644 index 00000000..31200762 --- /dev/null +++ b/src/libdash/source/mpd/Segment.cpp @@ -0,0 +1,138 @@ +/* + * Segment.cpp + ***************************************************************************** + * Copyright (C) 2013, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Segment.h" + +using namespace dash::mpd; +using namespace dash::helpers; +using namespace dash::metrics; + +Segment::Segment () : + host(""), + port(0), + path(""), + startByte(0), + endByte(0), + hasByteRange(false) +{ +} +Segment::~Segment () +{ +} + +bool Segment::Init (const std::vector<IBaseUrl *>& baseurls, const std::string &uri, const std::string &range, HTTPTransactionType type) +{ + std::string host = ""; + size_t port = 80; + std::string path = ""; + size_t startByte = 0; + size_t endByte = 0; + + this->absoluteuri = ""; + + for(size_t i = 0; i < baseurls.size(); i++) + this->absoluteuri = Path::CombinePaths(this->absoluteuri, baseurls.at(i)->GetUrl()); + + this->absoluteuri = Path::CombinePaths(this->absoluteuri, uri); + + if (uri != "" && dash::helpers::Path::GetHostPortAndPath(this->absoluteuri, host, port, path)) + { + this->host = host; + this->port = port; + this->path = path; + + if (range != "" && dash::helpers::Path::GetStartAndEndBytes(range, startByte, endByte)) + { + this->range = range; + this->hasByteRange = true; + this->startByte = startByte; + this->endByte = endByte; + } + + this->type = type; + + return true; + } + + return false; +} +std::string& Segment::AbsoluteURI () +{ + return this->absoluteuri; +} +std::string& Segment::Host () +{ + return this->host; +} +size_t Segment::Port () +{ + return this->port; +} +std::string& Segment::Path () +{ + return this->path; +} +std::string& Segment::Range () +{ + return this->range; +} +size_t Segment::StartByte () +{ + return this->startByte; +} +size_t Segment::EndByte () +{ + return this->endByte; +} +bool Segment::HasByteRange () +{ + return this->hasByteRange; +} +void Segment::AbsoluteURI (std::string uri) +{ + this->absoluteuri = uri; +} +void Segment::Host (std::string host) +{ + this->host = host; +} +void Segment::Port (size_t port) +{ + this->port = port; +} +void Segment::Path (std::string path) +{ + this->path = path; +} +void Segment::Range (std::string range) +{ + this->range = range; +} +void Segment::StartByte (size_t startByte) +{ + this->startByte = startByte; +} +void Segment::EndByte (size_t endByte) +{ + this->endByte = endByte; +} +void Segment::HasByteRange (bool hasByteRange) +{ + this->hasByteRange = hasByteRange; +} +HTTPTransactionType Segment::GetType () +{ + return this->type; +} +void Segment::SetType (HTTPTransactionType type) +{ + this->type = type; +} diff --git a/src/libdash/source/mpd/Segment.h b/src/libdash/source/mpd/Segment.h new file mode 100644 index 00000000..6f44a6f2 --- /dev/null +++ b/src/libdash/source/mpd/Segment.h @@ -0,0 +1,69 @@ +/* + * Segment.h + ***************************************************************************** + * Copyright (C) 2013, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SEGMENT_H_ +#define SEGMENT_H_ + +#include "config.h" + +#include "../network/AbstractChunk.h" +#include "../helpers/Path.h" +#include "ISegment.h" +#include "IBaseUrl.h" +#include "../metrics/HTTPTransaction.h" + +namespace dash +{ + namespace mpd + { + class Segment : public network::AbstractChunk, public virtual ISegment + { + public: + Segment (); + virtual ~Segment(); + + bool Init (const std::vector<IBaseUrl *>& baseurls, const std::string &uri, + const std::string &range, dash::metrics::HTTPTransactionType type); + std::string& AbsoluteURI (); + std::string& Host (); + size_t Port (); + std::string& Path (); + std::string& Range (); + size_t StartByte (); + size_t EndByte (); + bool HasByteRange (); + dash::metrics::HTTPTransactionType GetType (); + + void AbsoluteURI (std::string uri); + void Host (std::string host); + void Port (size_t port); + void Path (std::string path); + void Range (std::string range); + void StartByte (size_t startByte); + void EndByte (size_t endByte); + void HasByteRange (bool hasByteRange); + void SetType (dash::metrics::HTTPTransactionType type); + + private: + std::string absoluteuri; + std::string host; + size_t port; + std::string path; + std::string range; + size_t startByte; + size_t endByte; + bool hasByteRange; + dash::metrics::HTTPTransactionType type; + }; + } +} + +#endif /* SEGMENT_H_ */ diff --git a/src/libdash/source/mpd/SegmentBase.cpp b/src/libdash/source/mpd/SegmentBase.cpp new file mode 100644 index 00000000..b1d890d9 --- /dev/null +++ b/src/libdash/source/mpd/SegmentBase.cpp @@ -0,0 +1,78 @@ +/* + * SegmentBase.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "SegmentBase.h" + +using namespace dash::mpd; + +SegmentBase::SegmentBase () : + initialization(NULL), + representationIndex(NULL), + timescale(1), + presentationTimeOffset(0), + indexRange(""), + indexRangeExact(false) +{ +} +SegmentBase::~SegmentBase () +{ + delete(this->initialization); + delete(this->representationIndex); +} + +const IURLType* SegmentBase::GetInitialization () const +{ + return this->initialization; +} +void SegmentBase::SetInitialization (URLType *initialization) +{ + this->initialization = initialization; +} +const IURLType* SegmentBase::GetRepresentationIndex () const +{ + return this->representationIndex; +} +void SegmentBase::SetRepresentationIndex (URLType *representationIndex) +{ + this->representationIndex = representationIndex; +} +uint32_t SegmentBase::GetTimescale () const +{ + return this->timescale; +} +void SegmentBase::SetTimescale (uint32_t timescale) +{ + this->timescale = timescale; +} +uint32_t SegmentBase::GetPresentationTimeOffset () const +{ + return this->presentationTimeOffset; +} +void SegmentBase::SetPresentationTimeOffset (uint32_t presentationTimeOffset) +{ + this->presentationTimeOffset = presentationTimeOffset; +} +const std::string& SegmentBase::GetIndexRange () const +{ + return this->indexRange; +} +void SegmentBase::SetIndexRange (const std::string& indexRange) +{ + this->indexRange = indexRange; +} +bool SegmentBase::HasIndexRangeExact () const +{ + return this->indexRangeExact; +} +void SegmentBase::SetIndexRangeExact (bool indexRangeExact) +{ + this->indexRangeExact = indexRangeExact; +} diff --git a/src/libdash/source/mpd/SegmentBase.h b/src/libdash/source/mpd/SegmentBase.h new file mode 100644 index 00000000..d627eb04 --- /dev/null +++ b/src/libdash/source/mpd/SegmentBase.h @@ -0,0 +1,56 @@ +/* + * SegmentBase.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SEGMENTBASE_H_ +#define SEGMENTBASE_H_ + +#include "config.h" + +#include "ISegmentBase.h" +#include "URLType.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class SegmentBase : public virtual ISegmentBase, public AbstractMPDElement + { + public: + SegmentBase (); + virtual ~SegmentBase (); + + const IURLType* GetInitialization () const; + const IURLType* GetRepresentationIndex () const; + uint32_t GetTimescale () const; + uint32_t GetPresentationTimeOffset () const; + const std::string& GetIndexRange () const; + bool HasIndexRangeExact () const; + + void SetInitialization (URLType *initialization); + void SetRepresentationIndex (URLType *representationIndex); + void SetTimescale (uint32_t timescale); + void SetPresentationTimeOffset (uint32_t presentationTimeOffset); + void SetIndexRange (const std::string& indexRange); + void SetIndexRangeExact (bool indexRangeExact); + + protected: + URLType *initialization; + URLType *representationIndex; + uint32_t timescale; + uint32_t presentationTimeOffset; + std::string indexRange; + bool indexRangeExact; + }; + } +} + +#endif /* SEGMENTBASE_H_ */ diff --git a/src/libdash/source/mpd/SegmentList.cpp b/src/libdash/source/mpd/SegmentList.cpp new file mode 100644 index 00000000..d96264cb --- /dev/null +++ b/src/libdash/source/mpd/SegmentList.cpp @@ -0,0 +1,50 @@ +/* + * SegmentList.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "SegmentList.h" + +using namespace dash::mpd; + +SegmentList::SegmentList () : + xlinkHref(""), + xlinkActuate("onRequest") +{ +} +SegmentList::~SegmentList () +{ + for (size_t i = 0; i < segmentURLs.size(); i++) + delete(this->segmentURLs.at(i)); +} + +const std::vector<ISegmentURL*>& SegmentList::GetSegmentURLs () const +{ + return (std::vector<ISegmentURL*> &) this->segmentURLs; +} +void SegmentList::AddSegmentURL (SegmentURL *segmentURL) +{ + this->segmentURLs.push_back(segmentURL); +} +const std::string& SegmentList::GetXlinkHref () const +{ + return this->xlinkHref; +} +void SegmentList::SetXlinkHref (const std::string& xlinkHref) +{ + this->xlinkHref = xlinkHref; +} +const std::string& SegmentList::GetXlinkActuate () const +{ + return this->xlinkActuate; +} +void SegmentList::SetXlinkActuate (const std::string& xlinkActuate) +{ + this->xlinkActuate = xlinkActuate; +} diff --git a/src/libdash/source/mpd/SegmentList.h b/src/libdash/source/mpd/SegmentList.h new file mode 100644 index 00000000..b743c009 --- /dev/null +++ b/src/libdash/source/mpd/SegmentList.h @@ -0,0 +1,47 @@ +/* + * SegmentList.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SEGMENTLIST_H_ +#define SEGMENTLIST_H_ + +#include "config.h" + +#include "ISegmentList.h" +#include "MultipleSegmentBase.h" +#include "SegmentURL.h" + +namespace dash +{ + namespace mpd + { + class SegmentList : public ISegmentList, public MultipleSegmentBase + { + public: + SegmentList (); + virtual ~SegmentList (); + + const std::vector<ISegmentURL *>& GetSegmentURLs () const; + const std::string& GetXlinkHref () const; + const std::string& GetXlinkActuate () const; + + void AddSegmentURL (SegmentURL *segmetURL); + void SetXlinkHref (const std::string& xlinkHref); + void SetXlinkActuate (const std::string& xlinkActuate); + + private: + std::vector<SegmentURL *> segmentURLs; + std::string xlinkHref; + std::string xlinkActuate; + }; + } +} + +#endif /* SEGMENTLIST_H_ */ diff --git a/src/libdash/source/mpd/SegmentTemplate.cpp b/src/libdash/source/mpd/SegmentTemplate.cpp new file mode 100644 index 00000000..b92c4692 --- /dev/null +++ b/src/libdash/source/mpd/SegmentTemplate.cpp @@ -0,0 +1,152 @@ +/* + * SegmentTemplate.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "SegmentTemplate.h" + +using namespace dash::mpd; +using namespace dash::metrics; + +SegmentTemplate::SegmentTemplate () : + media(""), + index(""), + initialization(""), + bitstreamSwitching("") +{ +} +SegmentTemplate::~SegmentTemplate () +{ +} + +const std::string& SegmentTemplate::Getmedia () const +{ + return this->media; +} +void SegmentTemplate::SetMedia (const std::string& media) +{ + this->media = media; +} +const std::string& SegmentTemplate::Getindex () const +{ + return this->index; +} +void SegmentTemplate::SetIndex (const std::string& index) +{ + this->index = index; +} +const std::string& SegmentTemplate::Getinitialization () const +{ + return this->initialization; +} +void SegmentTemplate::SetInitialization (const std::string& initialization) +{ + this->initialization = initialization; +} +const std::string& SegmentTemplate::GetbitstreamSwitching () const +{ + return this->bitstreamSwitching; +} +void SegmentTemplate::SetBitstreamSwitching (const std::string& bitstreamSwitching) +{ + this->bitstreamSwitching = bitstreamSwitching; +} +ISegment* SegmentTemplate::ToInitializationSegment (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth) const +{ + return ToSegment(this->initialization, baseurls, representationID, bandwidth, dash::metrics::InitializationSegment); +} +ISegment* SegmentTemplate::ToBitstreamSwitchingSegment (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth) const +{ + return ToSegment(this->bitstreamSwitching, baseurls, representationID, bandwidth, dash::metrics::BitstreamSwitchingSegment); +} +ISegment* SegmentTemplate::GetMediaSegmentFromNumber (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t number) const +{ + return ToSegment(this->media, baseurls, representationID, bandwidth, dash::metrics::MediaSegment, number); +} +ISegment* SegmentTemplate::GetIndexSegmentFromNumber (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t number) const +{ + return ToSegment(this->index, baseurls, representationID, bandwidth, dash::metrics::IndexSegment, number); +} +ISegment* SegmentTemplate::GetMediaSegmentFromTime (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t time) const +{ + return ToSegment(this->media, baseurls, representationID, bandwidth, dash::metrics::MediaSegment, 0, time); +} +ISegment* SegmentTemplate::GetIndexSegmentFromTime (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t time) const +{ + return ToSegment(this->index, baseurls, representationID, bandwidth, dash::metrics::IndexSegment, 0, time); +} +std::string SegmentTemplate::ReplaceParameters (const std::string& uri, const std::string& representationID, uint32_t bandwidth, uint32_t number, uint32_t time) const +{ + std::vector<std::string> chunks; + std::string replacedUri = ""; + + dash::helpers::String::Split(uri, '$', chunks); + + if (chunks.size() > 1) + { + for(size_t i = 0; i < chunks.size(); i++) + { + if ( chunks.at(i) == "RepresentationID") { + chunks.at(i) = representationID; + continue; + } + + if (chunks.at(i).find("Bandwidth") == 0) + { + FormatChunk(chunks.at(i), bandwidth); + continue; + } + + if (chunks.at(i).find("Number") == 0) + { + FormatChunk(chunks.at(i), number); + continue; + } + + if (chunks.at(i).find("Time") == 0) + { + FormatChunk(chunks.at(i), time); + continue; + } + } + + for(size_t i = 0; i < chunks.size(); i++) + replacedUri += chunks.at(i); + + return replacedUri; + } + else + { + replacedUri = uri; + return replacedUri; + } +} +void SegmentTemplate::FormatChunk (std::string& uri, uint32_t number) const +{ + char formattedNumber [50]; + size_t pos = 0; + std::string formatTag = "%01d"; + + if ( (pos = uri.find("%0")) != std::string::npos) + formatTag = uri.substr(pos).append("d"); + + sprintf(formattedNumber, formatTag.c_str(), number); + uri = formattedNumber; +} +ISegment* SegmentTemplate::ToSegment (const std::string& uri, const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, HTTPTransactionType type, uint32_t number, uint32_t time) const +{ + Segment *seg = new Segment(); + + if(seg->Init(baseurls, ReplaceParameters(uri, representationID, bandwidth, number, time), "", type)) + return seg; + + delete(seg); + + return NULL; +}
\ No newline at end of file diff --git a/src/libdash/source/mpd/SegmentTemplate.h b/src/libdash/source/mpd/SegmentTemplate.h new file mode 100644 index 00000000..e5782a83 --- /dev/null +++ b/src/libdash/source/mpd/SegmentTemplate.h @@ -0,0 +1,61 @@ +/* + * SegmentTemplate.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SEGMENTTEMPLATE_H_ +#define SEGMENTTEMPLATE_H_ + +#include "config.h" + +#include "ISegmentTemplate.h" +#include "MultipleSegmentBase.h" +#include "../helpers/String.h" + +namespace dash +{ + namespace mpd + { + class SegmentTemplate : public ISegmentTemplate, public MultipleSegmentBase + { + public: + SegmentTemplate (); + virtual ~SegmentTemplate (); + + const std::string& Getmedia () const; + const std::string& Getindex () const; + const std::string& Getinitialization () const; + const std::string& GetbitstreamSwitching () const; + ISegment* ToInitializationSegment (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth) const; + ISegment* ToBitstreamSwitchingSegment (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth) const; + ISegment* GetMediaSegmentFromNumber (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t number) const; + ISegment* GetIndexSegmentFromNumber (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t number) const; + ISegment* GetMediaSegmentFromTime (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t time) const; + ISegment* GetIndexSegmentFromTime (const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, uint32_t time) const; + + void SetMedia (const std::string& media); + void SetIndex (const std::string& index); + void SetInitialization (const std::string& initialization); + void SetBitstreamSwitching (const std::string& bitstreamSwichting); + + private: + std::string ReplaceParameters (const std::string& uri, const std::string& representationID, uint32_t bandwidth, uint32_t number, uint32_t time) const; + void FormatChunk (std::string& uri, uint32_t number) const; + ISegment* ToSegment (const std::string& uri, const std::vector<IBaseUrl *>& baseurls, const std::string& representationID, uint32_t bandwidth, + dash::metrics::HTTPTransactionType type, uint32_t number = 0, uint32_t time = 0) const; + + std::string media; + std::string index; + std::string initialization; + std::string bitstreamSwitching; + }; + } +} + +#endif /* SEGMENTTEMPLATE_H_ */ diff --git a/src/libdash/source/mpd/SegmentTimeline.cpp b/src/libdash/source/mpd/SegmentTimeline.cpp new file mode 100644 index 00000000..8a55dc46 --- /dev/null +++ b/src/libdash/source/mpd/SegmentTimeline.cpp @@ -0,0 +1,32 @@ +/* + * SegmentTimeline.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "SegmentTimeline.h" + +using namespace dash::mpd; + +SegmentTimeline::SegmentTimeline () +{ +} +SegmentTimeline::~SegmentTimeline () +{ + for (size_t i=0; i < this->timelines.size(); i++) + delete(this->timelines.at(i)); +} + +std::vector<ITimeline *>& SegmentTimeline::GetTimelines () const +{ + return (std::vector<ITimeline*> &) this->timelines; +} +void SegmentTimeline::AddTimeline (Timeline *timeline) +{ + this->timelines.push_back(timeline); +}
\ No newline at end of file diff --git a/src/libdash/source/mpd/SegmentTimeline.h b/src/libdash/source/mpd/SegmentTimeline.h new file mode 100644 index 00000000..2d0ff2f8 --- /dev/null +++ b/src/libdash/source/mpd/SegmentTimeline.h @@ -0,0 +1,40 @@ +/* + * SegmentTimeline.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SEGMENTTIMELINE_H_ +#define SEGMENTTIMELINE_H_ + +#include "config.h" + +#include "ISegmentTimeline.h" +#include "AbstractMPDElement.h" +#include "Timeline.h" + +namespace dash +{ + namespace mpd + { + class SegmentTimeline : public ISegmentTimeline, public AbstractMPDElement + { + public: + SegmentTimeline (); + virtual ~SegmentTimeline (); + + std::vector<ITimeline *>& GetTimelines () const; + void AddTimeline (Timeline *timeline); + + private: + std::vector<ITimeline *> timelines; + }; + } +} + +#endif /* SEGMENTTIMELINE_H_ */ diff --git a/src/libdash/source/mpd/SegmentURL.cpp b/src/libdash/source/mpd/SegmentURL.cpp new file mode 100644 index 00000000..765cc969 --- /dev/null +++ b/src/libdash/source/mpd/SegmentURL.cpp @@ -0,0 +1,90 @@ +/* + * SegmentURL.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "SegmentURL.h" + +using namespace dash::mpd; +using namespace dash::helpers; + +SegmentURL::SegmentURL () : + mediaURI(""), + mediaRange(""), + indexURI(""), + indexRange(""), + bitrate(0) +{ +} +SegmentURL::~SegmentURL () +{ +} + +const std::string& SegmentURL::GetMediaURI () const +{ + return this->mediaURI; +} +void SegmentURL::SetMediaURI (const std::string& mediaURI) +{ + this->mediaURI = mediaURI; +} +const std::string& SegmentURL::GetMediaRange () const +{ + return this->mediaRange; +} +void SegmentURL::SetMediaRange (const std::string& mediaRange) +{ + this->mediaRange = mediaRange; +} +const std::string& SegmentURL::GetIndexURI () const +{ + return this->indexURI; +} +uint64_t SegmentURL::GetActualRate () +{ + return this->bitrate; +} +void SegmentURL::SetIndexURI (const std::string& indexURI) +{ + this->indexURI = indexURI; +} +const std::string& SegmentURL::GetIndexRange () const +{ + return this->indexRange; +} +void SegmentURL::SetIndexRange (const std::string& indexRange) +{ + this->indexRange = indexRange; +} +void SegmentURL::SetBitrate (const std::string& bitrate) +{ + this->bitrate = atoi(bitrate.c_str()); +} +ISegment* SegmentURL::ToMediaSegment (const std::vector<IBaseUrl *>& baseurls) const +{ + Segment *seg = new Segment(); + + if(seg->Init(baseurls, this->mediaURI, this->mediaRange, dash::metrics::MediaSegment)) + return seg; + + delete(seg); + + return NULL; +} +ISegment* SegmentURL::ToIndexSegment (const std::vector<IBaseUrl *>& baseurls) const +{ + Segment *seg = new Segment(); + + if(seg->Init(baseurls, this->indexURI, this->indexRange, dash::metrics::IndexSegment)) + return seg; + + delete(seg); + + return NULL; +} diff --git a/src/libdash/source/mpd/SegmentURL.h b/src/libdash/source/mpd/SegmentURL.h new file mode 100644 index 00000000..7dfdb56b --- /dev/null +++ b/src/libdash/source/mpd/SegmentURL.h @@ -0,0 +1,56 @@ +/* + * SegmentURL.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SEGMENTURL_H_ +#define SEGMENTURL_H_ + +#include "config.h" + +#include "ISegmentURL.h" +#include "../helpers/Path.h" +#include "Segment.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class SegmentURL : public ISegmentURL, public AbstractMPDElement + { + public: + SegmentURL (); + virtual ~SegmentURL(); + + const std::string& GetMediaURI () const; + const std::string& GetMediaRange () const; + const std::string& GetIndexURI () const; + const std::string& GetIndexRange () const; + uint64_t GetActualRate (); + + ISegment* ToMediaSegment (const std::vector<IBaseUrl *>& baseurls) const; + ISegment* ToIndexSegment (const std::vector<IBaseUrl *>& baseurls) const; + + void SetMediaURI (const std::string& mediaURI); + void SetMediaRange (const std::string& mediaRange); + void SetIndexURI (const std::string& indexURI); + void SetIndexRange (const std::string& indexRange); + void SetBitrate (const std::string& bitrate); + private: + std::string mediaURI; + std::string mediaRange; + std::string indexURI; + std::string indexRange; + int bitrate; + }; + } +} + +#endif /* SEGMENTURL_H_ */ diff --git a/src/libdash/source/mpd/SubRepresentation.cpp b/src/libdash/source/mpd/SubRepresentation.cpp new file mode 100644 index 00000000..34b11e57 --- /dev/null +++ b/src/libdash/source/mpd/SubRepresentation.cpp @@ -0,0 +1,55 @@ +/* + * SubRepresentation.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "SubRepresentation.h" + +using namespace dash::mpd; + +SubRepresentation::SubRepresentation () : + level(0), + bandWidth(0) +{ +} +SubRepresentation::~SubRepresentation () +{ +} +uint32_t SubRepresentation::GetLevel () const +{ + return this->level; +} +void SubRepresentation::SetLevel (uint32_t level) +{ + this->level = level; +} +const std::vector<uint32_t>& SubRepresentation::GetDependencyLevel () const +{ + return this->dependencyLevel; +} +void SubRepresentation::SetDependencyLevel (const std::string& dependencyLevel) +{ + dash::helpers::String::Split(dependencyLevel, ' ', this->dependencyLevel); +} +uint32_t SubRepresentation::GetBandWidth () const +{ + return this->bandWidth; +} +void SubRepresentation::SetBandWidth (uint32_t bandWidth) +{ + this->bandWidth = bandWidth; +} +const std::vector<std::string>& SubRepresentation::GetContentComponent () const +{ + return this->contentComponent; +} +void SubRepresentation::SetContentComponent (const std::string& contentComponent) +{ + dash::helpers::String::Split(contentComponent, ' ', this->contentComponent); +} diff --git a/src/libdash/source/mpd/SubRepresentation.h b/src/libdash/source/mpd/SubRepresentation.h new file mode 100644 index 00000000..f14fbfae --- /dev/null +++ b/src/libdash/source/mpd/SubRepresentation.h @@ -0,0 +1,50 @@ +/* + * SubRepresentation.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SUBREPRESENTATION_H_ +#define SUBREPRESENTATION_H_ + +#include "config.h" + +#include "ISubRepresentation.h" +#include "Descriptor.h" +#include "RepresentationBase.h" +#include "../helpers/String.h" + +namespace dash +{ + namespace mpd + { + class SubRepresentation : public ISubRepresentation, public RepresentationBase + { + public: + SubRepresentation (); + virtual ~SubRepresentation (); + + uint32_t GetLevel () const; + const std::vector<uint32_t>& GetDependencyLevel () const; + uint32_t GetBandWidth () const; + const std::vector<std::string>& GetContentComponent () const; + + void SetLevel (uint32_t level); + void SetDependencyLevel (const std::string& dependencyLevel); + void SetBandWidth (uint32_t bandWidth); + void SetContentComponent (const std::string& contentComponent); + + protected: + uint32_t level; + std::vector<uint32_t> dependencyLevel; + uint32_t bandWidth; + std::vector<std::string> contentComponent; + }; + } +} +#endif /* SUBREPRESENTATION_H_ */ diff --git a/src/libdash/source/mpd/Subset.cpp b/src/libdash/source/mpd/Subset.cpp new file mode 100644 index 00000000..6b0d2df6 --- /dev/null +++ b/src/libdash/source/mpd/Subset.cpp @@ -0,0 +1,30 @@ +/* + * Subset.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Subset.h" + +using namespace dash::mpd; + +Subset::Subset () +{ +} +Subset::~Subset () +{ +} + +const std::vector<uint32_t>& Subset::Contains () const +{ + return this->subset; +} +void Subset::SetSubset (const std::string& subset) +{ + dash::helpers::String::Split(subset, ' ', this->subset); +} diff --git a/src/libdash/source/mpd/Subset.h b/src/libdash/source/mpd/Subset.h new file mode 100644 index 00000000..c56eb6e2 --- /dev/null +++ b/src/libdash/source/mpd/Subset.h @@ -0,0 +1,41 @@ +/* + * Subset.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef SUBSET_H_ +#define SUBSET_H_ + +#include "config.h" + +#include "ISubset.h" +#include "../helpers/String.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class Subset : public ISubset, public AbstractMPDElement + { + public: + Subset (); + virtual ~Subset (); + + const std::vector<uint32_t>& Contains () const; + + void SetSubset (const std::string& subset); + + private: + std::vector<uint32_t> subset; + }; + } +} + +#endif /* SUBSET_H_ */ diff --git a/src/libdash/source/mpd/Timeline.cpp b/src/libdash/source/mpd/Timeline.cpp new file mode 100644 index 00000000..624c6585 --- /dev/null +++ b/src/libdash/source/mpd/Timeline.cpp @@ -0,0 +1,49 @@ +/* + * Timeline.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Timeline.h" + +using namespace dash::mpd; + +Timeline::Timeline () : + startTime(0), + duration(0), + repeatCount(0) +{ +} +Timeline::~Timeline () +{ +} + +uint32_t Timeline::GetStartTime () const +{ + return this->startTime; +} +void Timeline::SetStartTime (uint32_t startTime) +{ + this->startTime = startTime; +} +uint32_t Timeline::GetDuration () const +{ + return this->duration; +} +void Timeline::SetDuration (uint32_t duration) +{ + this->duration = duration; +} +uint32_t Timeline::GetRepeatCount () const +{ + return this->repeatCount; +} +void Timeline::SetRepeatCount (uint32_t repeatCount) +{ + this->repeatCount = repeatCount; +}
\ No newline at end of file diff --git a/src/libdash/source/mpd/Timeline.h b/src/libdash/source/mpd/Timeline.h new file mode 100644 index 00000000..3caa331f --- /dev/null +++ b/src/libdash/source/mpd/Timeline.h @@ -0,0 +1,46 @@ +/* + * Timeline.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef TIMELINE_H_ +#define TIMELINE_H_ + +#include "config.h" + +#include "ITimeline.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class Timeline : public ITimeline, public AbstractMPDElement + { + public: + Timeline (); + virtual ~Timeline (); + + uint32_t GetStartTime () const; + uint32_t GetDuration () const; + uint32_t GetRepeatCount () const; + + void SetStartTime (uint32_t startTime); + void SetDuration (uint32_t duration); + void SetRepeatCount (uint32_t repeatCount); + + private: + uint32_t startTime; + uint32_t duration; + uint32_t repeatCount; + }; + } +} + +#endif /* TIMELINE_H_ */ diff --git a/src/libdash/source/mpd/URLType.cpp b/src/libdash/source/mpd/URLType.cpp new file mode 100644 index 00000000..699672e7 --- /dev/null +++ b/src/libdash/source/mpd/URLType.cpp @@ -0,0 +1,57 @@ +/* + * URLType.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "URLType.h" + +using namespace dash::mpd; +using namespace dash::helpers; +using namespace dash::metrics; + +URLType::URLType () : + sourceURL(""), + range("") +{ +} +URLType::~URLType () +{ +} + +const std::string& URLType::GetSourceURL () const +{ + return this->sourceURL; +} +void URLType::SetSourceURL (const std::string& sourceURL) +{ + this->sourceURL = sourceURL; +} +const std::string& URLType::GetRange () const +{ + return this->range; +} +void URLType::SetRange (const std::string& range) +{ + this->range = range; +} +void URLType::SetType (HTTPTransactionType type) +{ + this->type = type; +} +ISegment* URLType::ToSegment (const std::vector<IBaseUrl *>& baseurls) const +{ + Segment *seg = new Segment(); + + if(seg->Init(baseurls, this->sourceURL, this->range, this->type)) + return seg; + + delete(seg); + + return NULL; +} diff --git a/src/libdash/source/mpd/URLType.h b/src/libdash/source/mpd/URLType.h new file mode 100644 index 00000000..1fcd00c7 --- /dev/null +++ b/src/libdash/source/mpd/URLType.h @@ -0,0 +1,48 @@ +/* + * URLType.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef URLTYPE_H_ +#define URLTYPE_H_ + +#include "config.h" + +#include "IURLType.h" +#include "Segment.h" +#include "../helpers/Path.h" +#include "AbstractMPDElement.h" + +namespace dash +{ + namespace mpd + { + class URLType : public IURLType, public AbstractMPDElement + { + public: + URLType (); + virtual ~URLType (); + + const std::string& GetSourceURL () const; + const std::string& GetRange () const; + ISegment* ToSegment (const std::vector<IBaseUrl *>& baseurls) const; + + void SetSourceURL (const std::string& sourceURL); + void SetRange (const std::string& range); + void SetType (dash::metrics::HTTPTransactionType type); + + private: + std::string sourceURL; + std::string range; + dash::metrics::HTTPTransactionType type; + }; + } +} + +#endif /* URLTYPE_H_ */ diff --git a/src/libdash/source/network/AbstractChunk.cpp b/src/libdash/source/network/AbstractChunk.cpp new file mode 100644 index 00000000..35774efe --- /dev/null +++ b/src/libdash/source/network/AbstractChunk.cpp @@ -0,0 +1,271 @@ +/* + * AbstractChunk.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "AbstractChunk.h" + +using namespace dash::network; +using namespace dash::helpers; +using namespace dash::metrics; + +uint32_t AbstractChunk::BLOCKSIZE = 32768; + +AbstractChunk::AbstractChunk () : + connection (NULL), + dlThread (NULL), + bytesDownloaded (0) +{ +} +AbstractChunk::~AbstractChunk () +{ + this->AbortDownload(); + this->blockStream.Clear(); + DestroyThreadPortable(this->dlThread); +} + +void AbstractChunk::AbortDownload () +{ + this->stateManager.CheckAndSet(IN_PROGRESS, REQUEST_ABORT); + this->stateManager.CheckAndWait(REQUEST_ABORT, ABORTED); +} +bool AbstractChunk::StartDownload () +{ + if(this->stateManager.State() != NOT_STARTED) + return false; + curl_global_init(CURL_GLOBAL_ALL); + this->curlm = curl_multi_init(); + + this->curl = curl_easy_init(); + curl_easy_setopt(this->curl, CURLOPT_URL, this->AbsoluteURI().c_str()); + curl_easy_setopt(this->curl, CURLOPT_WRITEFUNCTION, CurlResponseCallback); + curl_easy_setopt(this->curl, CURLOPT_WRITEDATA, (void *)this); + /* Debug Callback */ + curl_easy_setopt(this->curl, CURLOPT_VERBOSE, 1L); + curl_easy_setopt(this->curl, CURLOPT_DEBUGFUNCTION, CurlDebugCallback); + curl_easy_setopt(this->curl, CURLOPT_DEBUGDATA, (void *)this); + curl_easy_setopt(this->curl, CURLOPT_FAILONERROR, true); + + if(this->HasByteRange()) + curl_easy_setopt(this->curl, CURLOPT_RANGE, this->Range().c_str()); + + curl_multi_add_handle(this->curlm, this->curl); + this->dlThread = CreateThreadPortable (DownloadInternalConnection, this); + + if(this->dlThread == NULL) + return false; + + this->stateManager.State(IN_PROGRESS); + + return true; +} +bool AbstractChunk::StartDownload (IConnection *connection) +{ + if(this->stateManager.State() != NOT_STARTED) + return false; + + this->connection = connection; + this->dlThread = CreateThreadPortable (DownloadExternalConnection, this); + + if(this->dlThread == NULL) + return false; + + this->stateManager.State(IN_PROGRESS); + + + return true; +} +int AbstractChunk::Read (uint8_t *data, size_t len) +{ + return this->blockStream.GetBytes(data, len); +} +int AbstractChunk::Peek (uint8_t *data, size_t len) +{ + return this->blockStream.PeekBytes(data, len); +} +int AbstractChunk::Peek (uint8_t *data, size_t len, size_t offset) +{ + return this->blockStream.PeekBytes(data, len, offset); +} +void AbstractChunk::AttachDownloadObserver (IDownloadObserver *observer) +{ + this->observers.push_back(observer); + this->stateManager.Attach(observer); +} +void AbstractChunk::DetachDownloadObserver (IDownloadObserver *observer) +{ + uint32_t pos = -1; + + for(size_t i = 0; i < this->observers.size(); i++) + if(this->observers.at(i) == observer) + pos = i; + + if(pos != -1) + this->observers.erase(this->observers.begin() + pos); + + this->stateManager.Detach(observer); +} +void* AbstractChunk::DownloadExternalConnection (void *abstractchunk) +{ + AbstractChunk *chunk = (AbstractChunk *) abstractchunk; + block_t *block = AllocBlock(chunk->BLOCKSIZE); + int ret = 0; + + int count = 0; + do + { + ret = chunk->connection->Read(block->data, block->len, chunk); + if(ret > 0) + { + block_t *streamblock = AllocBlock(ret); + memcpy(streamblock->data, block->data, ret); + chunk->blockStream.PushBack(streamblock); + chunk->bytesDownloaded += ret; + + // chunk->NotifyDownloadRateChanged(); + } + if(chunk->stateManager.State() == REQUEST_ABORT) + ret = 0; + count += ret; + }while(ret); + + double speed = chunk->connection->GetAverageDownloadingSpeed(); + double time = chunk->connection->GetDownloadingTime(); + chunk->NotifyDownloadRateChanged(speed); + chunk->NotifyDownloadTimeChanged(time); + DeleteBlock(block); + + if(chunk->stateManager.State() == REQUEST_ABORT) + chunk->stateManager.State(ABORTED); + else + chunk->stateManager.State(COMPLETED); + + chunk->blockStream.SetEOS(true); + + return NULL; +} +void* AbstractChunk::DownloadInternalConnection (void *abstractchunk) +{ + AbstractChunk *chunk = (AbstractChunk *) abstractchunk; + + //chunk->response = curl_easy_perform(chunk->curl); + int u =1; + + while(chunk->stateManager.State() != REQUEST_ABORT && u) + { + curl_multi_perform(chunk->curlm, &u); + } + double speed; + double size; + double time; + curl_easy_getinfo(chunk->curl, CURLINFO_SPEED_DOWNLOAD,&speed); + curl_easy_getinfo(chunk->curl, CURLINFO_SIZE_DOWNLOAD, &size); + curl_easy_getinfo(chunk->curl, CURLINFO_TOTAL_TIME, &time); + + //Speed is in Bps ==> *8 for the bps + speed = 8*speed; + //size = 8*size; //Uncomment for the size in bits. + chunk->NotifyDownloadRateChanged(speed); + chunk->NotifyDownloadTimeChanged(time); + curl_easy_cleanup(chunk->curl); + //curl_global_cleanup(); + + curl_multi_cleanup(chunk->curlm); + if(chunk->stateManager.State() == REQUEST_ABORT) + { + chunk->stateManager.State(ABORTED); + } + else + { + chunk->stateManager.State(COMPLETED); + } + + chunk->blockStream.SetEOS(true); + + return NULL; +} +void AbstractChunk::NotifyDownloadRateChanged (double bitrate) +{ + for(size_t i = 0; i < this->observers.size(); i++) + this->observers.at(i)->OnDownloadRateChanged((uint64_t)bitrate); +} +void AbstractChunk::NotifyDownloadTimeChanged (double dnltime) +{ + for(size_t i = 0; i < this->observers.size(); i++) + this->observers.at(i)->OnDownloadTimeChanged(dnltime); +} +size_t AbstractChunk::CurlResponseCallback (void *contents, size_t size, size_t nmemb, void *userp) +{ + size_t realsize = size * nmemb; + AbstractChunk *chunk = (AbstractChunk *)userp; + + if(chunk->stateManager.State() == REQUEST_ABORT) + return 0; + + block_t *block = AllocBlock(realsize); + + memcpy(block->data, contents, realsize); + chunk->blockStream.PushBack(block); + + chunk->bytesDownloaded += realsize; +// chunk->NotifyDownloadRateChanged(); + + return realsize; +} +size_t AbstractChunk::CurlDebugCallback (CURL *url, curl_infotype infoType, char * data, size_t length, void *userdata) +{ + AbstractChunk *chunk = (AbstractChunk *)userdata; + + switch (infoType) { + case CURLINFO_TEXT: + break; + case CURLINFO_HEADER_OUT: + chunk->HandleHeaderOutCallback(); + break; + case CURLINFO_HEADER_IN: + chunk->HandleHeaderInCallback(std::string(data)); + break; + case CURLINFO_DATA_IN: + break; + default: + return 0; + } + return 0; +} +void AbstractChunk::HandleHeaderOutCallback () +{ + HTTPTransaction *httpTransaction = new HTTPTransaction(); + + httpTransaction->SetOriginalUrl(this->AbsoluteURI()); + httpTransaction->SetRange(this->Range()); + httpTransaction->SetType(this->GetType()); + httpTransaction->SetRequestSentTime(Time::GetCurrentUTCTimeStr()); + + this->httpTransactions.push_back(httpTransaction); +} +void AbstractChunk::HandleHeaderInCallback (std::string data) +{ + HTTPTransaction *httpTransaction = this->httpTransactions.at(this->httpTransactions.size()-1); + + if (data.substr(0,4) == "HTTP") + { + httpTransaction->SetResponseReceivedTime(Time::GetCurrentUTCTimeStr()); + httpTransaction->SetResponseCode(strtoul(data.substr(9,3).c_str(), NULL, 10)); + } + + httpTransaction->AddHTTPHeaderLine(data); +} +const std::vector<ITCPConnection *>& AbstractChunk::GetTCPConnectionList () const +{ + return (std::vector<ITCPConnection *> &) this->tcpConnections; +} +const std::vector<IHTTPTransaction *>& AbstractChunk::GetHTTPTransactionList () const +{ + return (std::vector<IHTTPTransaction *> &) this->httpTransactions; +} diff --git a/src/libdash/source/network/AbstractChunk.h b/src/libdash/source/network/AbstractChunk.h new file mode 100644 index 00000000..794469fd --- /dev/null +++ b/src/libdash/source/network/AbstractChunk.h @@ -0,0 +1,100 @@ +/* + * AbstractChunk.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef ABSTRACTCHUNK_H_ +#define ABSTRACTCHUNK_H_ + +#include "config.h" + +#include "IDownloadableChunk.h" +#include "DownloadStateManager.h" +#include "../helpers/SyncedBlockStream.h" +#include "../portable/Networking.h" +#include <curl/curl.h> +#include "../metrics/HTTPTransaction.h" +#include "../metrics/TCPConnection.h" +#include "../metrics/ThroughputMeasurement.h" +#include "../helpers/Time.h" + +#include <chrono> + +namespace dash +{ + namespace network + { + class AbstractChunk : public virtual IDownloadableChunk + { + public: + AbstractChunk (); + virtual ~AbstractChunk (); + + /* + * Pure virtual IChunk Interface + */ + virtual std::string& AbsoluteURI () = 0; + virtual std::string& Host () = 0; + virtual size_t Port () = 0; + virtual std::string& Path () = 0; + virtual std::string& Range () = 0; + virtual size_t StartByte () = 0; + virtual size_t EndByte () = 0; + virtual bool HasByteRange () = 0; + virtual dash::metrics::HTTPTransactionType GetType() = 0; + /* + * IDownloadableChunk Interface + */ + virtual bool StartDownload (IConnection *connection); + virtual bool StartDownload (); + virtual void AbortDownload (); + virtual int Read (uint8_t *data, size_t len); + virtual int Peek (uint8_t *data, size_t len); + virtual int Peek (uint8_t *data, size_t len, size_t offset); + virtual void AttachDownloadObserver (IDownloadObserver *observer); + virtual void DetachDownloadObserver (IDownloadObserver *observer); + /* + * Observer Notification + */ + void NotifyDownloadRateChanged (double bitrate); + void NotifyDownloadTimeChanged (double dnltime); + /* + * IDASHMetrics + */ + const std::vector<dash::metrics::ITCPConnection *>& GetTCPConnectionList () const; + const std::vector<dash::metrics::IHTTPTransaction *>& GetHTTPTransactionList () const; + + private: + std::vector<IDownloadObserver *> observers; + THREAD_HANDLE dlThread; + IConnection *connection; + helpers::SyncedBlockStream blockStream; + CURL *curl; + CURLM *curlm; + CURLcode response; + uint64_t bytesDownloaded; + DownloadStateManager stateManager; + + std::vector<dash::metrics::TCPConnection *> tcpConnections; + std::vector<dash::metrics::HTTPTransaction *> httpTransactions; + + static uint32_t BLOCKSIZE; + + static void* DownloadExternalConnection (void *chunk); + static void* DownloadInternalConnection (void *chunk); + static size_t CurlResponseCallback (void *contents, size_t size, size_t nmemb, void *userp); + static size_t CurlHeaderCallback (void *headerData, size_t size, size_t nmemb, void *userdata); + static size_t CurlDebugCallback (CURL *url, curl_infotype infoType, char * data, size_t length, void *userdata); + void HandleHeaderOutCallback (); + void HandleHeaderInCallback (std::string data); + }; + } +} + +#endif /* ABSTRACTCHUNK_H_ */ diff --git a/src/libdash/source/network/DownloadStateManager.cpp b/src/libdash/source/network/DownloadStateManager.cpp new file mode 100644 index 00000000..5117c099 --- /dev/null +++ b/src/libdash/source/network/DownloadStateManager.cpp @@ -0,0 +1,100 @@ +/* + * DownloadStateManager.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "DownloadStateManager.h" + +using namespace dash::network; + +DownloadStateManager::DownloadStateManager () : + state (NOT_STARTED) +{ + InitializeConditionVariable (&this->stateChanged); + InitializeCriticalSection (&this->stateLock); +} +DownloadStateManager::~DownloadStateManager () +{ + DeleteConditionVariable (&this->stateChanged); + DeleteCriticalSection (&this->stateLock); +} + +DownloadState DownloadStateManager::State () const +{ + EnterCriticalSection(&this->stateLock); + + DownloadState ret = this->state; + + LeaveCriticalSection(&this->stateLock); + + return ret; +} +void DownloadStateManager::State (DownloadState state) +{ + EnterCriticalSection(&this->stateLock); + + this->state = state; + + this->Notify(); + WakeAllConditionVariable(&this->stateChanged); + LeaveCriticalSection(&this->stateLock); +} +void DownloadStateManager::WaitState (DownloadState state) const +{ + EnterCriticalSection(&this->stateLock); + + while(this->state != state) + SleepConditionVariableCS(&this->stateChanged, &this->stateLock, INFINITE); + + LeaveCriticalSection(&this->stateLock); +} +void DownloadStateManager::CheckAndWait (DownloadState check, DownloadState wait) const +{ + EnterCriticalSection(&this->stateLock); + + if(this->state == check) + while(this->state != wait) + SleepConditionVariableCS(&this->stateChanged, &this->stateLock, INFINITE); + + LeaveCriticalSection(&this->stateLock); +} +void DownloadStateManager::Attach (IDownloadObserver *observer) +{ + EnterCriticalSection(&this->stateLock); + this->observers.push_back(observer); + LeaveCriticalSection(&this->stateLock); +} +void DownloadStateManager::Detach (IDownloadObserver *observer) +{ + EnterCriticalSection(&this->stateLock); + + uint32_t pos = -1; + + for(size_t i = 0; i < this->observers.size(); i++) + if(this->observers.at(i) == observer) + pos = i; + + if(pos != -1) + this->observers.erase(this->observers.begin() + pos); + + LeaveCriticalSection(&this->stateLock); +} +void DownloadStateManager::Notify () +{ + for(size_t i = 0; i < this->observers.size(); i++) + this->observers.at(i)->OnDownloadStateChanged(this->state); +} +void DownloadStateManager::CheckAndSet (DownloadState check, DownloadState set) +{ + EnterCriticalSection(&this->stateLock); + + if(this->state == check) + this->state = set; + LeaveCriticalSection(&this->stateLock); +} diff --git a/src/libdash/source/network/DownloadStateManager.h b/src/libdash/source/network/DownloadStateManager.h new file mode 100644 index 00000000..90dd770d --- /dev/null +++ b/src/libdash/source/network/DownloadStateManager.h @@ -0,0 +1,50 @@ +/* + * DownloadStateManager.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef DOWNLOADSTATEMANAGER_H_ +#define DOWNLOADSTATEMANAGER_H_ + +#include "config.h" + +#include "IDownloadObserver.h" +#include "../portable/MultiThreading.h" + +namespace dash +{ + namespace network + { + class DownloadStateManager + { + public: + DownloadStateManager (); + virtual ~DownloadStateManager (); + + DownloadState State () const; + void WaitState (DownloadState state) const; + void CheckAndWait (DownloadState check, DownloadState wait) const; + void CheckAndSet (DownloadState check, DownloadState set); + void State (DownloadState state); + void Attach (IDownloadObserver *observer); + void Detach (IDownloadObserver *observer); + + private: + DownloadState state; + mutable CRITICAL_SECTION stateLock; + mutable CONDITION_VARIABLE stateChanged; + + std::vector<IDownloadObserver *> observers; + + void Notify (); + }; + } +} + +#endif /* DOWNLOADSTATEMANAGER_H_ */ diff --git a/src/libdash/source/portable/MultiThreading.cpp b/src/libdash/source/portable/MultiThreading.cpp new file mode 100644 index 00000000..5d1fe9c0 --- /dev/null +++ b/src/libdash/source/portable/MultiThreading.cpp @@ -0,0 +1,112 @@ +#include "MultiThreading.h" + +THREAD_HANDLE CreateThreadPortable (void *(*start_routine) (void *), void *arg) +{ + #if defined _WIN32 || defined _WIN64 + return CreateThread (0, 0, (LPTHREAD_START_ROUTINE)start_routine, (LPVOID)arg, 0, 0); + #else + THREAD_HANDLE th = (THREAD_HANDLE)malloc(sizeof(pthread_t)); + + if (!th) + { + std::cerr << "Error allocating thread." << std::endl; + return NULL; + } + + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + if(int err = pthread_create(th, &attr, start_routine, arg)) + { + std::cerr << strerror(err) << std::endl; + return NULL; + } + return th; + #endif +} +void DestroyThreadPortable (THREAD_HANDLE th) +{ + #if !defined _WIN32 && !defined _WIN64 + if(th) + free(th); + #endif +} + +/**************************************************************************** +* Condition variables for Windows XP and older windows sytems +*****************************************************************************/ +#if defined WINXPOROLDER + void InitCondition (condition_variable_t *cv) + { + InitializeCriticalSection(&cv->waitersCountLock); + + cv->waitersCount = 0; + cv->waitGenerationCount = 0; + cv->releaseCount = 0; + + cv->waitingEvent = CreateEvent (NULL, // no security + TRUE, // manual-reset + FALSE, // non-signaled initially + NULL); // unnamed + } + void WaitCondition (condition_variable_t *cv, CRITICAL_SECTION *externalMutex) + { + EnterCriticalSection(&cv->waitersCountLock); + + cv->waitersCount++; + + int currentGenerationCount = cv->waitGenerationCount; + + LeaveCriticalSection(&cv->waitersCountLock); + LeaveCriticalSection(externalMutex); + + bool isWaitDone = false; + while(!isWaitDone) + { + WaitForSingleObject (cv->waitingEvent, INFINITE); + EnterCriticalSection (&cv->waitersCountLock); + + isWaitDone = (cv->releaseCount > 0 && cv->waitGenerationCount != currentGenerationCount); + LeaveCriticalSection (&cv->waitersCountLock); + } + + EnterCriticalSection(externalMutex); + EnterCriticalSection(&cv->waitersCountLock); + + cv->waitersCount--; + cv->releaseCount--; + bool isLastWaiter = (cv->releaseCount == 0); + + LeaveCriticalSection(&cv->waitersCountLock); + + if(isLastWaiter) + ResetEvent(cv->waitingEvent); + } + void SignalCondition (condition_variable_t *cv) + { + EnterCriticalSection(&cv->waitersCountLock); + + if(cv->waitersCount > cv->releaseCount) + { + SetEvent(cv->waitingEvent); + cv->releaseCount++; + cv->waitGenerationCount++; + } + + LeaveCriticalSection(&cv->waitersCountLock); + } + void BroadcastCondition (condition_variable_t *cv) + { + EnterCriticalSection(&cv->waitersCountLock); + + if(cv->waitersCount > 0) + { + SetEvent(cv->waitingEvent); + cv->releaseCount = cv->waitersCount; + cv->waitGenerationCount++; + } + + LeaveCriticalSection(&cv->waitersCountLock); +} +#endif diff --git a/src/libdash/source/portable/MultiThreading.h b/src/libdash/source/portable/MultiThreading.h new file mode 100644 index 00000000..c1b45f5c --- /dev/null +++ b/src/libdash/source/portable/MultiThreading.h @@ -0,0 +1,70 @@ +#ifndef PORTABLE_MULTITHREADING_H_ +#define PORTABLE_MULTITHREADING_H_ + +#if defined _WIN32 || defined _WIN64 + + #define _WINSOCKAPI_ + #include <Windows.h> + #define DeleteConditionVariable(cond_p) {} + + typedef HANDLE THREAD_HANDLE; + + #if defined WINXPOROLDER + /**************************************************************************** + * Variables + *****************************************************************************/ + struct condition_variable_t + { + int waitersCount; // Count of the number of waiters. + CRITICAL_SECTION waitersCountLock; // Serialize access to <waitersCount>. + int releaseCount; // Number of threads to release via a <BroadcastCondition> or a <SignalCondition>. + int waitGenerationCount; // Keeps track of the current "generation" so that we don't allow one thread to steal all the "releases" from the broadcast. + HANDLE waitingEvent; // A manual-reset event that's used to block and release waiting threads. + }; + /**************************************************************************** + * Prototypes + *****************************************************************************/ + void InitCondition (condition_variable_t *cv); + void WaitCondition (condition_variable_t *cv, CRITICAL_SECTION *externalMutex); + void SignalCondition (condition_variable_t *cv); + void BroadcastCondition (condition_variable_t *cv); + /**************************************************************************** + * Defines + *****************************************************************************/ + #define CONDITION_VARIABLE condition_variable_t + + #define InitializeConditionVariable(cond_p) InitCondition(cond_p) + #define SleepConditionVariableCS(cond_p, mutex_p, infinite) WaitCondition(cond_p, mutex_p) // INFINITE should be handled mor properly + #define WakeConditionVariable(cond_p) SignalCondition(cond_p) + #define WakeAllConditionVariable(cond_p) BroadcastCondition(cond_p) + #endif + +#else + + #include <string.h> + #include <pthread.h> + #include <errno.h> + #include <stdlib.h> + #include <iostream> + + #define CRITICAL_SECTION pthread_mutex_t + #define CONDITION_VARIABLE pthread_cond_t + + #define InitializeCriticalSection(mutex_p) pthread_mutex_init(mutex_p, NULL) + #define DeleteCriticalSection(mutex_p) pthread_mutex_destroy(mutex_p) + #define EnterCriticalSection(mutex_p) pthread_mutex_lock(mutex_p) + #define LeaveCriticalSection(mutex_p) pthread_mutex_unlock(mutex_p) + #define InitializeConditionVariable(cond_p) pthread_cond_init(cond_p, NULL) + #define DeleteConditionVariable(cond_p) pthread_cond_destroy(cond_p) + #define SleepConditionVariableCS(cond_p, mutex_p, infinite) pthread_cond_wait(cond_p, mutex_p) // INFINITE should be handled mor properly + #define WakeConditionVariable(cond_p) pthread_cond_signal(cond_p) + #define WakeAllConditionVariable(cond_p) pthread_cond_broadcast(cond_p) + + typedef pthread_t* THREAD_HANDLE; + +#endif + +THREAD_HANDLE CreateThreadPortable (void *(*start_routine) (void *), void *arg); +void DestroyThreadPortable (THREAD_HANDLE th); + +#endif // PORTABLE_MULTITHREADING_H_
\ No newline at end of file diff --git a/src/libdash/source/portable/Networking.h b/src/libdash/source/portable/Networking.h new file mode 100644 index 00000000..6239c3a3 --- /dev/null +++ b/src/libdash/source/portable/Networking.h @@ -0,0 +1,27 @@ +#ifndef PORTABLE_NETWORKING_H_ +#define PORTABLE_NETWORKING_H_ + +#if defined _WIN32 || defined _WIN64 + +#include <WinSock2.h> +#include <WS2tcpip.h> + +#else + +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/ip.h> /* superset of previous */ +#include <netdb.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + +#define closesocket(socket) close(socket) +#define WSAStartup(wVersionRequested, lpWSAData) 0 +#define WSACleanup() {} + +typedef unsigned char WSADATA; + +#endif + +#endif // PORTABLE_NETWORKING_H_ diff --git a/src/libdash/source/sublibs.mk b/src/libdash/source/sublibs.mk new file mode 100644 index 00000000..69173c3b --- /dev/null +++ b/src/libdash/source/sublibs.mk @@ -0,0 +1,23 @@ +LIBDIR=../libs +OBJECTS=$(SOURCES:.cpp=.o) +DIRNAME=$(shell basename $(shell pwd)) +LIBRARY=$(LIBDIR)/lib$(DIRNAME).a + +all: $(SOURCES) $(LIBRARY) + +$(LIBRARY): $(OBJECTS) + mkdir -p $(LIBDIR) + rm -f $@ + $(AR) $(ARFLAGS) $@ $(OBJECTS) + +.cpp.o: + $(CC) $(CFLAGS) $< -o $@ + +clean: + rm -f $(OBJECTS) + +distclean: clean + rm -f $(LIBRARY) + if test -d $(LIBDIR); then \ + rmdir --ignore-fail-on-non-empty $(LIBDIR) ; \ + fi diff --git a/src/libdash/source/targetver.h b/src/libdash/source/targetver.h new file mode 100644 index 00000000..2adeccf9 --- /dev/null +++ b/src/libdash/source/targetver.h @@ -0,0 +1,18 @@ +/* + * targetver.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#pragma once + +#if defined _WIN32 || defined _WIN64 + +#include <SDKDDKVer.h> + +#endif
\ No newline at end of file diff --git a/src/libdash/source/xml/DOMHelper.cpp b/src/libdash/source/xml/DOMHelper.cpp new file mode 100644 index 00000000..43adadc0 --- /dev/null +++ b/src/libdash/source/xml/DOMHelper.cpp @@ -0,0 +1,54 @@ +/* + * DOMHelper.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "DOMHelper.h" + +using namespace dash::xml; + +std::vector<Node *> DOMHelper::GetElementByTagName (Node *root, const std::string &name, bool selfContain) +{ + std::vector<Node *> elements; + + for(unsigned int i = 0; i < root->GetSubNodes().size(); i++) + { + GetElementsByTagName(root->GetSubNodes().at(i), name, &elements, selfContain); + } + + return elements; +} +std::vector<Node *> DOMHelper::GetChildElementByTagName (Node *root, const std::string &name) +{ + std::vector<Node *> elements; + + for(unsigned int i = 0; i < root->GetSubNodes().size(); i++) + { + if(!root->GetSubNodes().at(i)->GetName().compare(name)) + elements.push_back(root->GetSubNodes().at(i)); + } + + return elements; +} +void DOMHelper::GetElementsByTagName (Node *root, const std::string &name, std::vector<Node*> *elements, bool selfContain) +{ + if(!selfContain && !root->GetName().compare(name)) + { + elements->push_back(root); + return; + } + + if(!root->GetName().compare(name)) + elements->push_back(root); + + for(unsigned int i = 0; i < root->GetSubNodes().size(); i++) + { + GetElementsByTagName(root->GetSubNodes().at(i), name, elements, selfContain); + } +} diff --git a/src/libdash/source/xml/DOMHelper.h b/src/libdash/source/xml/DOMHelper.h new file mode 100644 index 00000000..d76d425b --- /dev/null +++ b/src/libdash/source/xml/DOMHelper.h @@ -0,0 +1,35 @@ +/* + * DOMHelper.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef DOMHELPER_H_ +#define DOMHELPER_H_ + +#include "config.h" + +#include "Node.h" + +namespace dash +{ + namespace xml + { + class DOMHelper + { + public: + static std::vector<Node *> GetElementByTagName (Node *root, const std::string &name, bool selfContain); + static std::vector<Node *> GetChildElementByTagName (Node *root, const std::string &name); + + private: + static void GetElementsByTagName(Node *root, const std::string &name, std::vector<Node *> *elements, bool selfContain); + }; + } +} + +#endif /* DOMHELPER_H_ */ diff --git a/src/libdash/source/xml/DOMParser.cpp b/src/libdash/source/xml/DOMParser.cpp new file mode 100644 index 00000000..5feb3850 --- /dev/null +++ b/src/libdash/source/xml/DOMParser.cpp @@ -0,0 +1,160 @@ +/* + * DOMParser.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "DOMParser.h" + +using namespace dash::xml; +using namespace dash::helpers; + +DOMParser::DOMParser (std::string url) : + url (url), + reader (NULL), + root (NULL) +{ + this->Init(); +} +DOMParser::~DOMParser () +{ + xmlCleanupParser(); + delete(this->root); +} + +Node* DOMParser::GetRootNode () const +{ + return this->root; +} +bool DOMParser::Parse (std::string path) +{ + this->reader = xmlReaderForFile(this->url.c_str(), NULL, 0); + + if(this->reader == NULL) + return false; + + if(xmlTextReaderRead(this->reader)) + this->root = this->ProcessNode(path); + + if(this->root == NULL) + return false; + + xmlFreeTextReader(this->reader); + + return true; +} +Node* DOMParser::ProcessNode (std::string path) +{ + int type = xmlTextReaderNodeType(this->reader); + + if(type != WhiteSpace && type != Text) + { + while (type == Comment || type == WhiteSpace) + { + xmlTextReaderRead(this->reader); + type = xmlTextReaderNodeType(this->reader); + } + + Node *node = new Node(); + node->SetType(type); + if(!(strcmp("",path.c_str()))) + node->SetMPDPath(Path::GetDirectoryPath(url)); + else + node->SetMPDPath(Path::GetDirectoryPath(path)); + if(xmlTextReaderConstName(this->reader) == NULL) + { + delete node; + return NULL; + } + + std::string name = (const char *) xmlTextReaderConstName(this->reader); + int isEmpty = xmlTextReaderIsEmptyElement(this->reader); + + node->SetName(name); + + this->AddAttributesToNode(node); + + if(isEmpty) + return node; + + Node *subnode = NULL; + int ret = xmlTextReaderRead(this->reader); + + while(ret == 1) + { + if(!strcmp(name.c_str(), (const char *) xmlTextReaderConstName(this->reader))) + { + return node; + } + + subnode = this->ProcessNode(path); + + if(subnode != NULL) + node->AddSubNode(subnode); + + ret = xmlTextReaderRead(this->reader); + } + + return node; + } else if (type == Text) + { + const char* text = (const char *) xmlTextReaderReadString(this->reader); + + if(text != NULL) + { + Node *node = new Node(); + node->SetType(type); + node->SetText(text); + return node; + } + } + return NULL; +} +void DOMParser::AddAttributesToNode (Node *node) +{ + if(xmlTextReaderHasAttributes(this->reader)) + { + while(xmlTextReaderMoveToNextAttribute(this->reader)) + { + std::string key = (const char *) xmlTextReaderConstName(this->reader); + std::string value = (const char *) xmlTextReaderConstValue(this->reader); + node->AddAttribute(key, value); + } + } +} +void DOMParser::Print (Node *node, int offset) +{ + std::stringstream ss; + for(int i = 0; i < offset; i++) + ss << " "; + ss << node->GetName(); + + std::vector<std::string> keys = node->GetAttributeKeys(); + + ss.clear(); + for(unsigned int i = 0; i < keys.size(); i++) + { + ss << " " << keys.at(i) << "=" << node->GetAttributeValue(keys.at(i)); + } + + offset++; + + for(unsigned int i = 0; i < node->GetSubNodes().size(); i++) + { + this->Print(node->GetSubNodes().at(i), offset); + } +} +void DOMParser::Init () +{ + this->root = NULL; + this->reader = NULL; +} +void DOMParser::Print () +{ + this->Print(this->root, 0); +} diff --git a/src/libdash/source/xml/DOMParser.h b/src/libdash/source/xml/DOMParser.h new file mode 100644 index 00000000..a8b3a9b7 --- /dev/null +++ b/src/libdash/source/xml/DOMParser.h @@ -0,0 +1,56 @@ +/* + * DOMParser.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef DOMPARSER_H_ +#define DOMPARSER_H_ + +#include "config.h" + +#include "Node.h" +#include <libxml/xmlreader.h> +#include "../helpers/Path.h" + +namespace dash +{ + namespace xml + { + enum NodeType + { + Start = 1, + End = 15, + Comment = 8, + WhiteSpace = 14, + Text = 3, + }; + + class DOMParser + { + public: + DOMParser (std::string url); + virtual ~DOMParser (); + + bool Parse (std::string path = ""); + Node* GetRootNode () const; + void Print (); + + private: + xmlTextReaderPtr reader; + Node *root; + std::string url; + + void Init (); + Node* ProcessNode (std::string); + void AddAttributesToNode (Node *node); + void Print (Node *node, int offset); + }; + } +} +#endif /* DOMPARSER_H_ */ diff --git a/src/libdash/source/xml/Node.cpp b/src/libdash/source/xml/Node.cpp new file mode 100644 index 00000000..d04558b6 --- /dev/null +++ b/src/libdash/source/xml/Node.cpp @@ -0,0 +1,1029 @@ +/* + * Node.cpp + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#include "Node.h" +#include <cstdlib> + +using namespace dash::xml; +using namespace dash::metrics; + +Node::Node () +{ +} +Node::Node (const Node& other) : + name(other.name), + text(other.text), + type(other.type), + attributes(other.attributes) +{ + for (size_t i = 0; i < other.subNodes.size(); i++) + this->subNodes.push_back(new Node(*(other.subNodes.at(i)))); +} +Node::~Node () +{ + for(size_t i = 0; i < this->subNodes.size(); i++) + delete(this->subNodes.at(i)); +} + +dash::mpd::ProgramInformation* Node::ToProgramInformation () const +{ + dash::mpd::ProgramInformation *programInformation = new dash::mpd::ProgramInformation(); + + if (this->HasAttribute("lang")) + { + programInformation->SetLang(this->GetAttributeValue("lang")); + } + if (this->HasAttribute("moreInformationURL")) + { + programInformation->SetMoreInformationURL(this->GetAttributeValue("moreInformationURL")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "Title") + { + programInformation->SetTitle(subNodes.at(i)->GetText()); + continue; + } + if (subNodes.at(i)->GetName() == "Source") + { + programInformation->SetSource(subNodes.at(i)->GetText()); + continue; + } + if (subNodes.at(i)->GetName() == "Copyright") + { + programInformation->SetCopyright(subNodes.at(i)->GetText()); + continue; + } + programInformation->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + programInformation->AddRawAttributes(this->attributes); + return programInformation; +} +dash::mpd::BaseUrl* Node::ToBaseUrl () const +{ + dash::mpd::BaseUrl *baseUrl = new dash::mpd::BaseUrl(); + + if(this->HasAttribute("serviceLocation")) + { + baseUrl->SetServiceLocation(this->GetAttributeValue("serviceLocation")); + } + if(this->HasAttribute("byteRange")) + { + baseUrl->SetByteRange(this->GetAttributeValue("byteRange")); + } + if (this->GetText() == "./") + { + baseUrl->SetUrl(this->mpdPath); + } + else + { + baseUrl->SetUrl(this->GetText()); + } + + baseUrl->AddRawAttributes(this->attributes); + return baseUrl; +} +dash::mpd::Descriptor* Node::ToDescriptor () const +{ + dash::mpd::Descriptor *descriptor = new dash::mpd::Descriptor(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + if (this->HasAttribute("schemeIdUri")) + { + descriptor->SetSchemeIdUri(this->GetAttributeValue("schemeIdUri")); + } + if (this->HasAttribute("value")) + { + descriptor->SetValue(this->GetAttributeValue("value")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + descriptor->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + descriptor->AddRawAttributes(this->attributes); + return descriptor; +} +dash::mpd::ContentComponent* Node::ToContentComponent () const +{ + dash::mpd::ContentComponent *contentComponent = new dash::mpd::ContentComponent(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + if (this->HasAttribute("id")) + { + contentComponent->SetId(strtoul(this->GetAttributeValue("id").c_str(), NULL, 10)); + } + if (this->HasAttribute("lang")) + { + contentComponent->SetLang(this->GetAttributeValue("lang")); + } + if (this->HasAttribute("contentType")) + { + contentComponent->SetContentType(this->GetAttributeValue("contentType")); + } + if (this->HasAttribute("par")) + { + contentComponent->SetPar(this->GetAttributeValue("par")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "Accessibility") + { + contentComponent->AddAccessibity(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "Role") + { + contentComponent->AddRole(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "Rating") + { + contentComponent->AddRating(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "Viewpoint") + { + contentComponent->AddViewpoint(subNodes.at(i)->ToDescriptor()); + continue; + } + contentComponent->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + contentComponent->AddRawAttributes(this->attributes); + return contentComponent; +} +dash::mpd::URLType* Node::ToURLType (HTTPTransactionType type) const +{ + dash::mpd::URLType* urlType = new dash::mpd::URLType(); + + if (this->HasAttribute("sourceURL")) + { + urlType->SetSourceURL(this->GetAttributeValue("sourceURL")); + } + if (this->HasAttribute("range")) + { + urlType->SetRange(this->GetAttributeValue("range")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + urlType->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + urlType->SetType(type); + urlType->AddRawAttributes(this->attributes); + return urlType; +} +dash::mpd::SegmentBase* Node::ToSegmentBase () const +{ + dash::mpd::SegmentBase* segmentBase = new dash::mpd::SegmentBase(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + SetCommonValuesForSeg(*segmentBase); + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() != "Initialization" && subNodes.at(i)->GetName() != "RepresentationIndex") + segmentBase->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + segmentBase->AddRawAttributes(this->attributes); + return segmentBase; +} +dash::mpd::Timeline* Node::ToTimeline () const +{ + dash::mpd::Timeline* timeline = new dash::mpd::Timeline(); + + if (this->HasAttribute("t")) + { + timeline->SetStartTime(strtoul(this->GetAttributeValue("t").c_str(), NULL, 10)); + } + if (this->HasAttribute("d")) + { + timeline->SetDuration(strtoul(this->GetAttributeValue("d").c_str(), NULL, 10)); + } + if (this->HasAttribute("r")) + { + timeline->SetRepeatCount(strtoul(this->GetAttributeValue("r").c_str(), NULL, 10)); + } + + timeline->AddRawAttributes(this->attributes); + return timeline; +} +dash::mpd::SegmentTimeline* Node::ToSegmentTimeline () const +{ + dash::mpd::SegmentTimeline* segmentTimeline = new dash::mpd::SegmentTimeline(); + + std::vector<Node *> subNodes = this->GetSubNodes(); + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "S") + { + segmentTimeline->AddTimeline(subNodes.at(i)->ToTimeline()); + continue; + } + segmentTimeline->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + segmentTimeline->AddRawAttributes(this->attributes); + return segmentTimeline; +} +dash::mpd::SegmentURL* Node::ToSegmentURL () const +{ + dash::mpd::SegmentURL *segmentUrl = new dash::mpd::SegmentURL(); + + if (this->HasAttribute("media")) + { + segmentUrl->SetMediaURI(this->GetAttributeValue("media")); + } + if (this->HasAttribute("mediaRange")) + { + segmentUrl->SetMediaRange(this->GetAttributeValue("mediaRange")); + } + if (this->HasAttribute("index")) + { + segmentUrl->SetIndexURI(this->GetAttributeValue("index")); + } + if (this->HasAttribute("indexRange")) + { + segmentUrl->SetIndexRange(this->GetAttributeValue("indexRange")); + } + if(this->HasAttribute("size")) + { + segmentUrl->SetBitrate(this->GetAttributeValue("size")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + segmentUrl->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + segmentUrl->AddRawAttributes(this->attributes); + return segmentUrl; +} +dash::mpd::SegmentList* Node::ToSegmentList () const +{ + dash::mpd::SegmentList* segmentList = new dash::mpd::SegmentList(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + SetCommonValuesForMSeg(*segmentList); + + if (this->HasAttribute("xlink:href")) + { + segmentList->SetXlinkHref(this->GetAttributeValue("xlink:href")); + } + if (this->HasAttribute("xlink:actuate")) + { + segmentList->SetXlinkActuate(this->GetAttributeValue("xlink:actuate")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "SegmentURL") + { + segmentList->AddSegmentURL(subNodes.at(i)->ToSegmentURL()); + continue; + } + if (subNodes.at(i)->GetName() != "SegmentTimeline" && subNodes.at(i)->GetName() != "BitstreamSwitching" && + subNodes.at(i)->GetName() != "Initialization" && subNodes.at(i)->GetName() != "RepresentationIndex") + segmentList->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + segmentList->AddRawAttributes(this->attributes); + return segmentList; +} +dash::mpd::SegmentTemplate* Node::ToSegmentTemplate () const +{ + dash::mpd::SegmentTemplate *segmentTemplate = new dash::mpd::SegmentTemplate(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + SetCommonValuesForMSeg(*segmentTemplate); + + if (this->HasAttribute("media")) + { + segmentTemplate->SetMedia(this->GetAttributeValue("media")); + } + if (this->HasAttribute("index")) + { + segmentTemplate->SetIndex(this->GetAttributeValue("index")); + } + if (this->HasAttribute("initialization")) + { + segmentTemplate->SetInitialization(this->GetAttributeValue("initialization")); + } + if (this->HasAttribute("bitstreamSwitching")) + { + segmentTemplate->SetBitstreamSwitching(this->GetAttributeValue("bitstreamSwitching")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() != "SegmentTimeline" && subNodes.at(i)->GetName() != "BitstreamSwitching" && + subNodes.at(i)->GetName() != "Initialization" && subNodes.at(i)->GetName() != "RepresentationIndex") + segmentTemplate->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + segmentTemplate->AddRawAttributes(this->attributes); + return segmentTemplate; +} +dash::mpd::SubRepresentation* Node::ToSubRepresentation () const +{ + dash::mpd::SubRepresentation* subRepresentation = new dash::mpd::SubRepresentation(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + SetCommonValuesForRep(*subRepresentation); + + if (this->HasAttribute("level")) + { + subRepresentation->SetLevel(strtoul(this->GetAttributeValue("level").c_str(), NULL, 10)); + } + if (this->HasAttribute("dependencyLevel")) + { + subRepresentation->SetDependencyLevel(this->GetAttributeValue("dependencyLevel")); + } + if (this->HasAttribute("bandwidth")) + { + subRepresentation->SetBandWidth(strtoul(this->GetAttributeValue("bandwidth").c_str(), NULL, 10)); + } + if (this->HasAttribute("contentComponent")) + { + subRepresentation->SetContentComponent(this->GetAttributeValue("contentComponent")); + } + for (size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() != "FramePacking" && subNodes.at(i)->GetName() != "AudioChannelConfiguration" && subNodes.at(i)->GetName() != "ContentProtection") + subRepresentation->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + subRepresentation->AddRawAttributes(this->attributes); + return subRepresentation; +} +dash::mpd::Representation* Node::ToRepresentation () const +{ + dash::mpd::Representation* representation = new dash::mpd::Representation(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + SetCommonValuesForRep(*representation); + + if (this->HasAttribute("id")) + { + representation->SetId(this->GetAttributeValue("id")); + } + if (this->HasAttribute("bandwidth")) + { + representation->SetBandwidth(strtoul(this->GetAttributeValue("bandwidth").c_str(), NULL, 10)); + } + if (this->HasAttribute("qualityRanking")) + { + representation->SetQualityRanking(strtoul(this->GetAttributeValue("qualityRanking").c_str(), NULL, 10)); + } + if (this->HasAttribute("dependencyId")) + { + representation->SetDependencyId(this->GetAttributeValue("dependencyId")); + } + if (this->HasAttribute("mediaStreamStructureId")) + { + representation->SetMediaStreamStructureId(this->GetAttributeValue("mediaStreamStructureId")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "BaseURL") + { + representation->AddBaseURL(subNodes.at(i)->ToBaseUrl()); + continue; + } + if (subNodes.at(i)->GetName() == "SubRepresentation") + { + representation->AddSubRepresentation(subNodes.at(i)->ToSubRepresentation()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentBase") + { + representation->SetSegmentBase(subNodes.at(i)->ToSegmentBase()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentList") + { + representation->SetSegmentList(subNodes.at(i)->ToSegmentList()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentTemplate") + { + representation->SetSegmentTemplate(subNodes.at(i)->ToSegmentTemplate()); + continue; + } + if (subNodes.at(i)->GetName() != "FramePacking" && subNodes.at(i)->GetName() != "AudioChannelConfiguration" && subNodes.at(i)->GetName() != "ContentProtection") + representation->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + representation->AddRawAttributes(this->attributes); + return representation; +} +dash::mpd::AdaptationSet* Node::ToAdaptationSet () const +{ + dash::mpd::AdaptationSet *adaptationSet = new dash::mpd::AdaptationSet(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + SetCommonValuesForRep(*adaptationSet); + + if (this->HasAttribute("xlink:href")) + { + adaptationSet->SetXlinkHref(this->GetAttributeValue("xlink:href")); + } + if (this->HasAttribute("xlink:actuate")) + { + adaptationSet->SetXlinkActuate(this->GetAttributeValue("xlink:actuate")); + } + if (this->HasAttribute("id")) + { + adaptationSet->SetId(strtoul(this->GetAttributeValue("id").c_str(), NULL, 10)); + } + if (this->HasAttribute("group")) + { + adaptationSet->SetGroup(strtoul(this->GetAttributeValue("group").c_str(), NULL, 10)); + } + if (this->HasAttribute("lang")) + { + adaptationSet->SetLang(this->GetAttributeValue("lang")); + } + if (this->HasAttribute("contentType")) + { + adaptationSet->SetContentType(this->GetAttributeValue("contentType")); + } + if (this->HasAttribute("par")) + { + adaptationSet->SetPar(this->GetAttributeValue("par")); + } + if (this->HasAttribute("minBandwidth")) + { + adaptationSet->SetMinBandwidth(strtoul(this->GetAttributeValue("minBandwidth").c_str(), NULL, 10)); + } + if (this->HasAttribute("maxBandwidth")) + { + adaptationSet->SetMaxBandwidth(strtoul(this->GetAttributeValue("maxBandwidth").c_str(), NULL, 10)); + } + if (this->HasAttribute("minWidth")) + { + adaptationSet->SetMinWidth(strtoul(this->GetAttributeValue("minWidth").c_str(), NULL, 10)); + } + if (this->HasAttribute("maxWidth")) + { + adaptationSet->SetMaxWidth(strtoul(this->GetAttributeValue("maxWidth").c_str(), NULL, 10)); + } + if (this->HasAttribute("minHeight")) + { + adaptationSet->SetMinHeight(strtoul(this->GetAttributeValue("minHeight").c_str(), NULL, 10)); + } + if (this->HasAttribute("maxHeight")) + { + adaptationSet->SetMaxHeight(strtoul(this->GetAttributeValue("maxHeight").c_str(), NULL, 10)); + } + if (this->HasAttribute("minFrameRate")) + { + adaptationSet->SetMinFramerate(this->GetAttributeValue("minFrameRate")); + } + if (this->HasAttribute("maxFrameRate")) + { + adaptationSet->SetMaxFramerate(this->GetAttributeValue("maxFrameRate")); + } + if (this->HasAttribute("segmentAlignment")) + { + adaptationSet->SetSegmentAlignment(this->GetAttributeValue("segmentAlignment")); + } + if (this->HasAttribute("subsegmentAlignment")) + { + adaptationSet->SetSubsegmentAlignment(this->GetAttributeValue("subsegmentAlignment")); + } + if (this->HasAttribute("subsegmentStartsWithSAP")) + { + adaptationSet->SetMaxHeight((uint8_t) strtoul(this->GetAttributeValue("subsegmentStartsWithSAP").c_str(), NULL, 10)); + } + if (this->HasAttribute("bitstreamSwitching")) + { + adaptationSet->SetBitstreamSwitching(dash::helpers::String::ToBool(this->GetAttributeValue("bitstreamSwitching"))); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "Accessibility") + { + adaptationSet->AddAccessibity(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "Role") + { + adaptationSet->AddRole(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "Rating") + { + adaptationSet->AddRating(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "Viewpoint") + { + adaptationSet->AddViewpoint(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "ContentComponent") + { + adaptationSet->AddContentComponent(subNodes.at(i)->ToContentComponent()); + continue; + } + if (subNodes.at(i)->GetName() == "BaseURL") + { + adaptationSet->AddBaseURL(subNodes.at(i)->ToBaseUrl()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentBase") + { + adaptationSet->SetSegmentBase(subNodes.at(i)->ToSegmentBase()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentList") + { + adaptationSet->SetSegmentList(subNodes.at(i)->ToSegmentList()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentTemplate") + { + adaptationSet->SetSegmentTemplate(subNodes.at(i)->ToSegmentTemplate()); + continue; + } + if (subNodes.at(i)->GetName() == "Representation") + { + adaptationSet->AddRepresentation(subNodes.at(i)->ToRepresentation()); + continue; + } + if (subNodes.at(i)->GetName() != "FramePacking" && subNodes.at(i)->GetName() != "AudioChannelConfiguration" && subNodes.at(i)->GetName() != "ContentProtection") + adaptationSet->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + adaptationSet->AddRawAttributes(this->attributes); + return adaptationSet; +} +dash::mpd::Subset* Node::ToSubset () const +{ + dash::mpd::Subset *subset = new dash::mpd::Subset(); + + if (this->HasAttribute("contains")) + { + subset->SetSubset(this->GetAttributeValue("contains")); + } + + subset->AddRawAttributes(this->attributes); + return subset; +} +dash::mpd::Period* Node::ToPeriod () const +{ + dash::mpd::Period *period = new dash::mpd::Period(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + if (this->HasAttribute("xlink:href")) + { + period->SetXlinkHref(this->GetAttributeValue("xlink:href")); + } + if (this->HasAttribute("xlink:actuate")) + { + period->SetXlinkActuate(this->GetAttributeValue("xlink:actuate")); + } + if (this->HasAttribute("id")) + { + period->SetId(this->GetAttributeValue("id")); + } + if (this->HasAttribute("start")) + { + period->SetStart(this->GetAttributeValue("start")); + } + if (this->HasAttribute("duration")) + { + period->SetDuration(this->GetAttributeValue("duration")); + } + if (this->HasAttribute("bitstreamSwitching")) + { + period->SetBitstreamSwitching(dash::helpers::String::ToBool(this->GetAttributeValue("bitstreamSwitching"))); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "BaseURL") + { + period->AddBaseURL(subNodes.at(i)->ToBaseUrl()); + continue; + } + if (subNodes.at(i)->GetName() == "AdaptationSet") + { + period->AddAdaptationSet(subNodes.at(i)->ToAdaptationSet()); + continue; + } + if (subNodes.at(i)->GetName() == "Subset") + { + period->AddSubset(subNodes.at(i)->ToSubset()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentBase") + { + period->SetSegmentBase(subNodes.at(i)->ToSegmentBase()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentList") + { + period->SetSegmentList(subNodes.at(i)->ToSegmentList()); + continue; + } + if (subNodes.at(i)->GetName() == "SegmentTemplate") + { + period->SetSegmentTemplate(subNodes.at(i)->ToSegmentTemplate()); + continue; + } + period->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + period->AddRawAttributes(this->attributes); + return period; +} +dash::mpd::Range* Node::ToRange () const +{ + dash::mpd::Range* range = new dash::mpd::Range(); + + if (this->HasAttribute("starttime")) + { + range->SetStarttime(this->GetAttributeValue("starttime")); + } + if (this->HasAttribute("duration")) + { + range->SetDuration(this->GetAttributeValue("duration")); + } + + return range; +} +dash::mpd::Metrics* Node::ToMetrics () const +{ + dash::mpd::Metrics* metrics = new dash::mpd::Metrics(); + + if (this->HasAttribute("metrics")) + { + metrics->SetMetrics(this->GetAttributeValue("metrics")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "Reporting") + { + metrics->AddReporting(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "Range") + { + metrics->AddRange(subNodes.at(i)->ToRange()); + continue; + } + metrics->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + metrics->AddRawAttributes(this->attributes); + return metrics; +} +dash::mpd::MPD* Node::ToMPD () const +{ + dash::mpd::MPD *mpd = new dash::mpd::MPD(); + std::vector<Node *> subNodes = this->GetSubNodes(); + + if (this->HasAttribute("id")) + { + mpd->SetId(this->GetAttributeValue("id")); + } + if (this->HasAttribute("profiles")) + { + mpd->SetProfiles(this->GetAttributeValue("profiles")); + } + if (this->HasAttribute("type")) + { + mpd->SetType(this->GetAttributeValue("type")); + } + if (this->HasAttribute("availabilityStartTime")) + { + mpd->SetAvailabilityStarttime(this->GetAttributeValue("availabilityStartTime")); + } + if (this->HasAttribute("availabilityEndTime")) + { + mpd->SetAvailabilityEndtime(this->GetAttributeValue("availabilityEndTime")); + } + if (this->HasAttribute("mediaPresentationDuration")) + { + mpd->SetMediaPresentationDuration(this->GetAttributeValue("mediaPresentationDuration")); + } + if (this->HasAttribute("minimumUpdatePeriod")) + { + mpd->SetMinimumUpdatePeriod(this->GetAttributeValue("minimumUpdatePeriod")); + } + if (this->HasAttribute("minBufferTime")) + { + mpd->SetMinBufferTime(this->GetAttributeValue("minBufferTime")); + } + if (this->HasAttribute("timeShiftBufferDepth")) + { + mpd->SetTimeShiftBufferDepth(this->GetAttributeValue("timeShiftBufferDepth")); + } + if (this->HasAttribute("suggestedPresentationDelay")) + { + mpd->SetSuggestedPresentationDelay(this->GetAttributeValue("suggestedPresentationDelay")); + } + if (this->HasAttribute("maxSegmentDuration")) + { + mpd->SetMaxSegmentDuration(this->GetAttributeValue("maxSegmentDuration")); + } + if (this->HasAttribute("maxSubsegmentDuration")) + { + mpd->SetMaxSubsegmentDuration(this->GetAttributeValue("maxSubsegmentDuration")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "ProgramInformation") + { + mpd->AddProgramInformation(subNodes.at(i)->ToProgramInformation()); + continue; + } + if (subNodes.at(i)->GetName() == "BaseURL") + { + mpd->AddBaseUrl(subNodes.at(i)->ToBaseUrl()); + continue; + } + if (subNodes.at(i)->GetName() == "Location") + { + mpd->AddLocation(subNodes.at(i)->GetText()); + continue; + } + if (subNodes.at(i)->GetName() == "Period") + { + mpd->AddPeriod(subNodes.at(i)->ToPeriod()); + continue; + } + if (subNodes.at(i)->GetName() == "Metrics") + { + mpd->AddMetrics(subNodes.at(i)->ToMetrics()); + continue; + } + mpd->AddAdditionalSubNode((xml::INode *) new Node(*(subNodes.at(i)))); + } + + dash::mpd::BaseUrl *mpdPathBaseUrl = new dash::mpd::BaseUrl(); + mpdPathBaseUrl->SetUrl(mpdPath); + mpd->SetMPDPathBaseUrl(mpdPathBaseUrl); + + mpd->AddRawAttributes(this->attributes); + return mpd; +} +void Node::SetMPDPath (std::string path) +{ + this->mpdPath = path; +} + +const std::vector<INode*>& Node::GetNodes () const +{ + return (std::vector<INode*> &) this->subNodes; +} +const std::vector<Node*>& Node::GetSubNodes () const +{ + return this->subNodes; +} +void Node::AddSubNode (Node *node) +{ + this->subNodes.push_back(node); +} +const std::string& Node::GetName () const +{ + return this->name; +} +void Node::SetName (const std::string &name) +{ + this->name = name; +} +const std::string& Node::GetAttributeValue (std::string key) const +{ + //return this->attributes[key]; + return this->attributes.find(key)->second; +} +bool Node::HasAttribute (const std::string& name) const +{ + if(this->attributes.find(name) != this->attributes.end()) + return true; + + return false; +} +void Node::AddAttribute (const std::string &key, const std::string &value) +{ + this->attributes[key] = value; +} +std::vector<std::string> Node::GetAttributeKeys () const +{ + std::vector<std::string> keys; + std::map<std::string, std::string>::const_iterator it; + + for(it = this->attributes.begin(); it != this->attributes.end(); ++it) + { + keys.push_back(it->first); + } + return keys; +} +bool Node::HasText () const +{ + return false; +} +std::string Node::GetText () const +{ + if(this->type == 3) + return this->text; + else + { + if(this->subNodes.size()) + return this->subNodes[0]->GetText(); + else + return ""; + } +} +void Node::SetText (const std::string &text) +{ + this->text = text; +} +void Node::Print (std::ostream &stream) const +{ + stream << this->name; + std::vector<std::string> keys = this->GetAttributeKeys(); + for(size_t i = 0; i < keys.size(); i++) + stream << " " << keys.at(i) << "=" << this->GetAttributeValue(keys.at(i)); + + stream << std::endl; +} +const std::map<std::string,std::string>& Node::GetAttributes () const +{ + return this->attributes; +} +int Node::GetType () const +{ + return this->type; +} +void Node::SetType (int type) +{ + this->type = type; +} +void Node::SetCommonValuesForRep (dash::mpd::RepresentationBase& object) const +{ + std::vector<Node *> subNodes = this->GetSubNodes(); + + if (this->HasAttribute("profiles")) + { + object.SetProfiles(this->GetAttributeValue("profiles")); + } + if (this->HasAttribute("width")) + { + object.SetWidth(strtoul(this->GetAttributeValue("width").c_str(), NULL, 10)); + } + if (this->HasAttribute("height")) + { + object.SetHeight(strtoul(this->GetAttributeValue("height").c_str(), NULL, 10)); + } + if (this->HasAttribute("sar")) + { + object.SetSar(this->GetAttributeValue("sar")); + } + if (this->HasAttribute("frameRate")) + { + object.SetFrameRate(this->GetAttributeValue("frameRate")); + } + if (this->HasAttribute("audioSamplingRate")) + { + object.SetAudioSamplingRate(this->GetAttributeValue("audioSamplingRate")); + } + if (this->HasAttribute("mimeType")) + { + object.SetMimeType(this->GetAttributeValue("mimeType")); + } + if (this->HasAttribute("segmentProfiles")) + { + object.SetSegmentProfiles(this->GetAttributeValue("segmentProfiles")); + } + if (this->HasAttribute("codecs")) + { + object.SetCodecs(this->GetAttributeValue("codecs")); + } + if (this->HasAttribute("maximumSAPPeriod")) + { + object.SetMaximumSAPPeriod(strtod(this->GetAttributeValue("maximumSAPPeriod").c_str(), NULL)); + } + if (this->HasAttribute("startWithSAP")) + { + object.SetStartWithSAP((uint8_t) strtoul(this->GetAttributeValue("startWithSAP").c_str(), NULL, 10)); + } + if (this->HasAttribute("maxPlayoutRate")) + { + object.SetMaxPlayoutRate(strtod(this->GetAttributeValue("maxPlayoutRate").c_str(), NULL)); + } + if (this->HasAttribute("codingDependency")) + { + object.SetCodingDependency(dash::helpers::String::ToBool(this->GetAttributeValue("codingDependency"))); + } + if (this->HasAttribute("scanType")) + { + object.SetScanType(this->GetAttributeValue("scanType")); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "FramePacking") + { + object.AddFramePacking(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "AudioChannelConfiguration") + { + object.AddAudioChannelConfiguration(subNodes.at(i)->ToDescriptor()); + continue; + } + if (subNodes.at(i)->GetName() == "ContentProtection") + { + object.AddContentProtection(subNodes.at(i)->ToDescriptor()); + continue; + } + } +} +void Node::SetCommonValuesForSeg (dash::mpd::SegmentBase& object) const +{ + std::vector<Node *> subNodes = this->GetSubNodes(); + + if (this->HasAttribute("timescale")) + { + object.SetTimescale(strtoul(this->GetAttributeValue("timescale").c_str(), NULL, 10)); + } + if (this->HasAttribute("presentationTimeOffset")) + { + object.SetPresentationTimeOffset(strtoul(this->GetAttributeValue("presentationTimeOffset").c_str(), NULL, 10)); + } + if (this->HasAttribute("indexRange")) + { + object.SetIndexRange(this->GetAttributeValue("indexRange")); + } + if (this->HasAttribute("indexRangeExact")) + { + object.SetIndexRangeExact(dash::helpers::String::ToBool(this->GetAttributeValue("indexRangeExact"))); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "Initialization") + { + object.SetInitialization(subNodes.at(i)->ToURLType(dash::metrics::InitializationSegment)); + continue; + } + if (subNodes.at(i)->GetName() == "RepresentationIndex") + { + object.SetRepresentationIndex(subNodes.at(i)->ToURLType(dash::metrics::IndexSegment)); + continue; + } + } +} +void Node::SetCommonValuesForMSeg(dash::mpd::MultipleSegmentBase& object) const +{ + std::vector<Node *> subNodes = this->GetSubNodes(); + + SetCommonValuesForSeg(object); + + if (this->HasAttribute("duration")) + { + object.SetDuration(strtoul(this->GetAttributeValue("duration").c_str(), NULL, 10)); + } + if (this->HasAttribute("startNumber")) + { + object.SetStartNumber(strtoul(this->GetAttributeValue("startNumber").c_str(), NULL, 10)); + } + + for(size_t i = 0; i < subNodes.size(); i++) + { + if (subNodes.at(i)->GetName() == "SegmentTimeline") + { + object.SetSegmentTimeline(subNodes.at(i)->ToSegmentTimeline()); + continue; + } + if (subNodes.at(i)->GetName() == "BitstreamSwitching") + { + object.SetBitstreamSwitching(subNodes.at(i)->ToURLType(dash::metrics::BitstreamSwitchingSegment)); + continue; + } + } + +} diff --git a/src/libdash/source/xml/Node.h b/src/libdash/source/xml/Node.h new file mode 100644 index 00000000..552d83e5 --- /dev/null +++ b/src/libdash/source/xml/Node.h @@ -0,0 +1,105 @@ +/* + * Node.h + ***************************************************************************** + * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved + * + * Email: libdash-dev@vicky.bitmovin.net + * + * This source code and its use and distribution, is subject to the terms + * and conditions of the applicable license agreement. + *****************************************************************************/ + +#ifndef NODE_H_ +#define NODE_H_ + +#include "config.h" + +#include "INode.h" +#include "../helpers/String.h" +#include "../mpd/AdaptationSet.h" +#include "../mpd/BaseUrl.h" +#include "../mpd/ContentComponent.h" +#include "../mpd/Descriptor.h" +#include "../mpd/Metrics.h" +#include "../mpd/MPD.h" +#include "../mpd/MultipleSegmentBase.h" +#include "../mpd/Period.h" +#include "../mpd/ProgramInformation.h" +#include "../mpd/Range.h" +#include "../mpd/Representation.h" +#include "../mpd/RepresentationBase.h" +#include "../mpd/SegmentBase.h" +#include "../mpd/SegmentList.h" +#include "../mpd/SegmentTemplate.h" +#include "../mpd/SegmentTimeline.h" +#include "../mpd/SegmentURL.h" +#include "../mpd/SubRepresentation.h" +#include "../mpd/Subset.h" +#include "../mpd/URLType.h" +#include "IHTTPTransaction.h" + +namespace dash +{ + namespace xml + { + class Node : public INode + { + public: + Node (); + Node (const Node& other); + virtual ~Node (); + + const std::vector<INode *>& GetNodes () const; + const std::vector<Node *>& GetSubNodes () const; + std::vector<std::string> GetAttributeKeys () const; + const std::string& GetName () const; + std::string GetText () const; + const std::map<std::string, std::string>& GetAttributes () const; + int GetType () const; + void SetType (int type); + const std::string& GetAttributeValue (std::string key) const; + void AddSubNode (Node *node); + void SetName (const std::string &name); + bool HasAttribute (const std::string& name) const; + void AddAttribute (const std::string &key, const std::string &value); + bool HasText () const; + void SetText (const std::string &text); + void Print (std::ostream &stream) const; + dash::mpd::MPD* ToMPD () const; + void SetMPDPath (std::string path); + + private: + void SetCommonValuesForRep (dash::mpd::RepresentationBase& object) const; + void SetCommonValuesForSeg (dash::mpd::SegmentBase& object) const; + void SetCommonValuesForMSeg (dash::mpd::MultipleSegmentBase& object) const; + dash::mpd::AdaptationSet* ToAdaptationSet () const; + dash::mpd::BaseUrl* ToBaseUrl () const; + dash::mpd::ContentComponent* ToContentComponent () const; + dash::mpd::Descriptor* ToDescriptor () const; + dash::mpd::Metrics* ToMetrics () const; + dash::mpd::Period* ToPeriod () const; + dash::mpd::ProgramInformation* ToProgramInformation () const; + dash::mpd::Range* ToRange () const; + dash::mpd::Representation* ToRepresentation () const; + dash::mpd::SegmentBase* ToSegmentBase () const; + dash::mpd::SegmentList* ToSegmentList () const; + dash::mpd::SegmentTemplate* ToSegmentTemplate () const; + dash::mpd::Timeline* ToTimeline () const; + dash::mpd::SegmentTimeline* ToSegmentTimeline () const; + dash::mpd::SegmentURL* ToSegmentURL () const; + dash::mpd::SubRepresentation* ToSubRepresentation () const; + dash::mpd::Subset* ToSubset () const; + dash::mpd::URLType* ToURLType (dash::metrics::HTTPTransactionType transActType) const; + + std::vector<Node *> subNodes; + std::map<std::string, std::string> attributes; + std::string name; + std::string text; + int type; + std::string mpdPath; + + }; + } +} + +#endif /* NODE_H_ */ diff --git a/tools/bin/clion_wrapper.sh b/tools/bin/clion_wrapper.sh new file mode 100755 index 00000000..2c40ed55 --- /dev/null +++ b/tools/bin/clion_wrapper.sh @@ -0,0 +1,24 @@ +#!/bin/bash +script_dir=$(dirname "$BASH_SOURCE") + +export DISTILLERY_BUILD_NAME=-debug + +cd "${script_dir}" +source ./export_ccnx_env.sh + +cd ${DISTILLERY_ROOT_DIR}/src + +osType=`uname -s` + +case "$osType" in + Darwin) + open /Applications/CLion.app + ;; + Linux) + clion.sh + ;; + *) + echo "System not recognized, edit ${0} to add support" + ;; +esac + diff --git a/tools/bin/export_ccnx_env.sh b/tools/bin/export_ccnx_env.sh new file mode 100755 index 00000000..6172a191 --- /dev/null +++ b/tools/bin/export_ccnx_env.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +working_dir=`pwd` +script_dir=$(dirname "$BASH_SOURCE") + +cd "${script_dir}"/../../ + +env=`make -f Makefile -s env` +for def in $env; do + { export $def; } +done + +cd "$working_dir" diff --git a/tools/bin/getStatus.sh b/tools/bin/getStatus.sh new file mode 100644 index 00000000..a1bff083 --- /dev/null +++ b/tools/bin/getStatus.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +GIT_DIRECTORY=$1 +GIT_REPO=`basename ${GIT_DIRECTORY}` + +cd ${GIT_DIRECTORY} + +CURRENT_SHA=`git branch -av | grep "\*" | awk '{print $3}'` +CURRENT_BRANCH=`git branch -av | grep "\*" | awk '{print $2}'` +UPSTREAM_SHA=`git branch -av | grep "remotes/ccnx_upstream/master" | awk '{print $2}'` + +if [ x${UPSTREAM_SHA} = x ]; then + # We don't have an upstream... + UPSTREAM_SHA="NO_UPSTREAM" +else + PARC_MASTER_IN_BRANCH=`git branch -v --contains $UPSTREAM_SHA | grep "\*" | awk '{print $3}'` +fi + + +echo '====================================================================' + +if [ "x${CCNX_MASTER_IN_BRANCH}" != "x" ]; then + # This branch is master OR ahead of master + if [ x${CURRENT_SHA} = x${UPSTREAM_SHA} ]; then + echo "CCNX ${GIT_REPO} ${CURRENT_BRANCH} ${CURRENT_SHA}::${UPSTREAM_SHA}" + else + echo "CCNX++ ${GIT_REPO} ${CURRENT_BRANCH} ${CURRENT_SHA}::${UPSTREAM_SHA}" + fi +else + echo "------ ${GIT_REPO} ${CURRENT_BRANCH} ${CURRENT_SHA}::${UPSTREAM_SHA}" +fi +git status -s diff --git a/tools/bin/gitAddUpstream.sh b/tools/bin/gitAddUpstream.sh new file mode 100644 index 00000000..a91f2be2 --- /dev/null +++ b/tools/bin/gitAddUpstream.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +if [ $# -lt 4 ]; then + echo "ERROR incorrect number of parameters" + echo "Usage:" + echo " $0 <repo_name> <repo_directory> <remote_name> <remote_url>" + echo + echo "$0 adds a remote named <remote_name> to repository <repo_name> located" + echo "in directory <repo_directory>. The remote will point towards <remote_url>" + echo "If <remote_name> already exits nothing will be done." + exit 1 +fi + +REPO_NAME=$1 +REPO_DIR=$2 +REMOTE_NAME=$3 +REMOTE_URL=$4 + +if [ ! -d $REPO_DIR ]; then + echo "ERROR running $0" + echo " Directory $REPO_DIR not found" + exit 1 +fi + +echo "###################################################################" +echo "# Updationg remote $REMOTE_NAME for $REPO_NAME" + +cd $REPO_DIR + +git remote add $REMOTE_NAME $REMOTE_URL > /dev/null 2>&1 +if [ $? -ne 0 ]; then + echo "# Skipped - not needed" + exit 0 +fi + +echo "# Added $REMOTE_URL" +exit 0 diff --git a/tools/bin/gitCloneOneOf.sh b/tools/bin/gitCloneOneOf.sh new file mode 100755 index 00000000..fecdf990 --- /dev/null +++ b/tools/bin/gitCloneOneOf.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +if [ $# -lt 3 ]; then + echo "ERROR incorrect number of parameters" + echo "Usage:" + echo " $0 <repo_name> <repo_directory> <remote1> [<remote2>...]" + echo + echo "$0 clones repository <repo_name> to the directory <repo_directory>" + echo "It clones off of <remote1>. If git can't clone off of <remote1> it tries" + echo "to clone off of <remote2>, then <remote3> etc." + exit 1 +fi + +REPO_NAME=$1 +REPO_DIR=$2 + +REMOTES=${@:3} + +if [ -d $REPO_DIR ]; then + echo "Directory $REPO_DIR exists, no need to clone" + exit 0 +fi + +echo "###################################################################" +echo "# Cloning $REPO_NAME" + +for remote in $REMOTES; do + echo "# Trying $remote" + git clone $remote $REPO_DIR >/dev/null 2>&1 + ERROR=$? + if [ $ERROR -eq 0 ]; then + echo "# SUCCESS" + exit 0 + fi + echo "# Skipped " +done +echo "# FAILED cloning " +exit 1 diff --git a/tools/bin/gitStatus.sh b/tools/bin/gitStatus.sh new file mode 100644 index 00000000..a586c644 --- /dev/null +++ b/tools/bin/gitStatus.sh @@ -0,0 +1,72 @@ +#!/bin/sh + +if [ $# -lt 5 ]; then + echo "ERROR incorrect number of parameters" + echo "Usage:" + echo " $0 <repo_name> <repo_directory> <origin> <remote_name> <remote_url>" + echo + echo "$0 check the values of the repo. Compare what git things with what we would like" + echo " repo_name - Name of the repo (cosmetic)" + echo " repo_directory - Directory where to find the git repo" + echo " origin - What origin should be set to" + echo " remote_name - The name of a remote to check" + echo " remote_url - What that remote should be set to" + exit 1 +fi + +REPO_NAME=$1 +REPO_DIR=$2 +ORIGIN=$3 +REMOTE_NAME=$4 +REMOTE_URL=$5 + +if [ ! -d $REPO_DIR ]; then + echo "ERROR running $0" + echo " Directory $REPO_DIR not found" + exit 1 +fi + +cd $REPO_DIR + +NEEDS_UPDATE=NO + +echo "###################################################################" +echo "# $REPO_NAME " + +# An origin of - means we should ignore the origin check +if [ $ORIGIN != - ]; then + ORIGIN_ACTUAL=`git config --get remote.origin.url` + if [ $ORIGIN_ACTUAL != $ORIGIN ]; then + echo "# WARNING: remote origin missmatch" + echo "# Expected $ORIGIN" + echo "# Found $ORIGIN_ACTUAL" + NEEDS_UPDATE=YES + fi +fi + +REMOTE_URL_ACTUAL=`git config --get remote.$REMOTE_NAME.url 2>/dev/null` + +if [ $? -ne 0 ]; then + echo "# WARNING remote $REMOTE_NAME does not exist" + echo "# Expected $REMOTE_NAME = $REMOTE_URL" + echo "# Found a remote called $REMOTE_NAME does not exist" + NEEDS_UPDATE=YES +else + if [ $REMOTE_URL_ACTUAL != $REMOTE_URL ]; then + echo "# WARNING remote $REMOTE_NAME missmatch" + echo "# Expected $REMOTE_NAME = $REMOTE_URL" + echo "# Found $REMOTE_NAME = $REMOTE_URL_ACTUAL" + NEEDS_UPDATE=YES + fi +fi + +if [ $NEEDS_UPDATE = NO ]; then + echo "# Up to date" + exit 0 +fi + +echo "#" +echo "# Your settings don't match the default settings for $REPO_NAME" +echo "# located at $REPO_DIR" + + diff --git a/update.sh b/update.sh new file mode 100755 index 00000000..ac1d8e9e --- /dev/null +++ b/update.sh @@ -0,0 +1,30 @@ + ############################################################################# + # Copyright (c) 2017 Cisco and/or its affiliates. + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at: + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + ############################################################################## + +#!/bin/bash +git pull +cd src/ccnxlibs +git pull +cd ../.. +cd src/cframework +git pull +cd ../.. +cd src/sb-forwarder +git pull +cd ../.. +cd src/libicnet +git pull +cd ../.. + |