diff --git a/gpu/CMakeLists.txt b/gpu/CMakeLists.txt
new file mode 100644
index 0000000..8202661
--- /dev/null
+++ b/gpu/CMakeLists.txt
@@ -0,0 +1,67 @@
+cmake_minimum_required(VERSION 2.6)
+project(randomselection)
+set(PROJECT_NAME randomselection)
+
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+
+set(CMAKE_CXX_COMPILER ${CUDA_NVCC_EXECUTABLE})
+#set(CMAKE_CXX_LINK_FLAGS "")
+#set(CMAKE_EXECUTABLE_RUNTIME_CXX_FLAG "")
+set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "")
+set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "")
+set(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "")
+
+#find_package(OpenCV REQUIRED)
+find_package(OpenCVlibstdcxx REQUIRED)
+find_package(CUDA REQUIRED)
+find_package(Thrust REQUIRED)
+
+find_package(PythonLibs REQUIRED)
+find_package(NumPy REQUIRED)
+
+# Boost
+set(Boost_USE_STATIC_LIBS ON)
+set(Boost_USE_MULTITHREADED ON)
+find_package(Boost COMPONENTS python REQUIRED)
+
+set(CUDA_LIBRARIES "")
+
+list(APPEND CUDA_NVCC_FLAGS -ccbin clang)
+list(APPEND CUDA_NVCC_FLAGS -Xcompiler -arch)
+list(APPEND CUDA_NVCC_FLAGS -Xcompiler x86_64)
+list(APPEND CUDA_NVCC_FLAGS -Xcompiler -fPIC)
+list(APPEND CUDA_NVCC_FLAGS -Xcompiler -dynamiclib)
+list(APPEND CUDA_NVCC_FLAGS -Xcompiler -install_name)
+list(APPEND CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20)
+list(APPEND CUDA_NVCC_FLAGS -gencode arch=compute_30,code=sm_30)
+list(APPEND CUDA_NVCC_FLAGS -gencode arch=compute_35,code=sm_35)
+list(APPEND CUDA_NVCC_FLAGS -gencode arch=compute_37,code=sm_37)
+list(APPEND CUDA_NVCC_FLAGS -gencode arch=compute_50,code=sm_50)
+list(APPEND CUDA_NVCC_FLAGS -gencode arch=compute_50,code=compute_50)
+
+#set(CMAKE_CXX_FLAGS "-std=c++11 -O3")
+#set(CMAKE_CXX_FLAGS "-ferror-limit=20")
+
+include_directories(
+ include
+ ${PYTHON_INCLUDE_DIRS}
+ ${NUMPY_INCLUDE_DIRS}
+ ${CUDA_INCLUDE_DIRS}
+ ${THRUST_INCLUDE_DIRS}
+)
+
+cuda_compile(SEGMENTATION_O segmentationTree.cu)
+cuda_add_library(segmentation ${SEGMENTATION_O})
+target_link_libraries(segmentation ${OPENCV_LIBSTDCXX_LIBRARIES})
+
+#cuda_add_executable(segment_test ${SEGMENTATION_O})
+#target_link_libraries(segment_test ${OPENCV_LIBSTDCXX_LIBRARIES})
+
+cuda_add_library(gpu_segmentation SHARED main.cpp conversion.cpp)
+set_target_properties(gpu_segmentation PROPERTIES PREFIX "")
+target_link_libraries(gpu_segmentation
+ segmentation
+ ${Boost_LIBRARIES}
+ ${OpenCV_LIBRARIES}
+ ${PYTHON_LIBRARIES}
+)
diff --git a/gpu/Makefile b/gpu/Makefile
new file mode 100644
index 0000000..642a8f6
--- /dev/null
+++ b/gpu/Makefile
@@ -0,0 +1,212 @@
+################################################################################
+#
+# Copyright 1993-2013 NVIDIA Corporation. All rights reserved.
+#
+# NOTICE TO USER:
+#
+# This source code is subject to NVIDIA ownership rights under U.S. and
+# international Copyright laws.
+#
+# NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
+# CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
+# IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
+# IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
+# 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 SOURCE CODE.
+#
+# U.S. Government End Users. This source code is a "commercial item" as
+# that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of
+# "commercial computer software" and "commercial computer software
+# documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
+# and is provided to the U.S. Government only as a commercial end item.
+# Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
+# 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
+# source code with only those rights set forth herein.
+#
+################################################################################
+#
+# Makefile project only supported on Mac OS X and Linux Platforms)
+#
+################################################################################
+
+# Location of the CUDA Toolkit
+CUDA_PATH ?= /Developer/NVIDIA/CUDA-6.5
+
+OSUPPER = $(shell uname -s 2>/dev/null | tr "[:lower:]" "[:upper:]")
+OSLOWER = $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
+
+OS_SIZE = $(shell uname -m | sed -e "s/x86_64/64/" -e "s/armv7l/32/" -e "s/aarch64/64/")
+OS_ARCH = $(shell uname -m)
+ARCH_FLAGS =
+
+DARWIN = $(strip $(findstring DARWIN, $(OSUPPER)))
+ifneq ($(DARWIN),)
+ XCODE_GE_5 = $(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5)
+endif
+
+# Take command line flags that override any of these settings
+ifeq ($(x86_64),1)
+ OS_SIZE = 64
+ OS_ARCH = x86_64
+endif
+ifeq ($(ARMv7),1)
+ OS_SIZE = 32
+ OS_ARCH = armv7l
+ ARCH_FLAGS = -target-cpu-arch ARM
+endif
+ifeq ($(aarch64),1)
+ OS_SIZE = 64
+ OS_ARCH = aarch64
+ ARCH_FLAGS = -target-cpu-arch ARM
+endif
+
+# Common binaries
+ifneq ($(DARWIN),)
+ifeq ($(XCODE_GE_5),1)
+ GCC ?= clang
+else
+ GCC ?= g++
+endif
+else
+ifeq ($(ARMv7),1)
+ GCC ?= arm-linux-gnueabihf-g++
+else
+ GCC ?= g++
+endif
+endif
+NVCC := $(CUDA_PATH)/bin/nvcc -ccbin $(GCC)
+
+# internal flags
+NVCCFLAGS := -m${OS_SIZE} ${ARCH_FLAGS}
+CCFLAGS :=
+LDFLAGS :=
+
+# Extra user flags
+EXTRA_NVCCFLAGS ?=
+EXTRA_LDFLAGS ?=
+EXTRA_CCFLAGS ?=
+
+# OS-specific build flags
+ifneq ($(DARWIN),)
+ LDFLAGS += -rpath $(CUDA_PATH)/lib
+ CCFLAGS += -arch $(OS_ARCH)
+else
+ ifeq ($(OS_ARCH),armv7l)
+ ifeq ($(abi),androideabi)
+ NVCCFLAGS += -target-os-variant Android
+ else
+ ifeq ($(abi),gnueabi)
+ CCFLAGS += -mfloat-abi=softfp
+ else
+ # default to gnueabihf
+ override abi := gnueabihf
+ LDFLAGS += --dynamic-linker=/lib/ld-linux-armhf.so.3
+ CCFLAGS += -mfloat-abi=hard
+ endif
+ endif
+ endif
+endif
+
+ifeq ($(ARMv7),1)
+ifneq ($(TARGET_FS),)
+GCCVERSIONLTEQ46 := $(shell expr `$(GCC) -dumpversion` \<= 4.6)
+ifeq ($(GCCVERSIONLTEQ46),1)
+CCFLAGS += --sysroot=$(TARGET_FS)
+endif
+LDFLAGS += --sysroot=$(TARGET_FS)
+LDFLAGS += -rpath-link=$(TARGET_FS)/lib
+LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib
+LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/arm-linux-$(abi)
+endif
+endif
+
+# Debug build flags
+ifeq ($(dbg),1)
+ NVCCFLAGS += -g -G
+ TARGET := debug
+else
+ TARGET := release
+endif
+
+ALL_CCFLAGS :=
+ALL_CCFLAGS += $(NVCCFLAGS)
+ALL_CCFLAGS += $(EXTRA_NVCCFLAGS)
+ALL_CCFLAGS += $(addprefix -Xcompiler ,$(CCFLAGS))
+ALL_CCFLAGS += $(addprefix -Xcompiler ,$(EXTRA_CCFLAGS))
+ALL_CCFLAGS +=
+
+ALL_LDFLAGS :=
+ALL_LDFLAGS += $(ALL_CCFLAGS)
+ALL_LDFLAGS += $(addprefix -Xlinker ,$(LDFLAGS))
+ALL_LDFLAGS += $(addprefix -Xlinker ,$(EXTRA_LDFLAGS))
+ALL_LDFLAGS += `pkg-config --libs opencv-libstdcxx`
+
+# Common includes and paths for CUDA
+INCLUDES := -I../../common/inc
+LIBRARIES :=
+
+################################################################################
+
+SAMPLE_ENABLED := 1
+
+# Gencode arguments
+ifeq ($(OS_ARCH),armv7l)
+SMS ?= 20 30 32 35 37 50
+else
+SMS ?= 13 20 30 35 37 50
+endif
+
+ifeq ($(SMS),)
+$(info >>> WARNING - no SM architectures have been specified - waiving sample <<<)
+SAMPLE_ENABLED := 0
+endif
+
+ifeq ($(GENCODE_FLAGS),)
+# Generate SASS code for each SM architecture listed in $(SMS)
+$(foreach sm,$(SMS),$(eval GENCODE_FLAGS += -gencode arch=compute_$(sm),code=sm_$(sm)))
+
+# Generate PTX code from the highest SM architecture in $(SMS) to guarantee forward-compatibility
+HIGHEST_SM := $(lastword $(sort $(SMS)))
+ifneq ($(HIGHEST_SM),)
+GENCODE_FLAGS += -gencode arch=compute_$(HIGHEST_SM),code=compute_$(HIGHEST_SM)
+endif
+endif
+
+ifeq ($(SAMPLE_ENABLED),0)
+EXEC ?= @echo "[@]"
+endif
+
+################################################################################
+
+# Target rules
+all: build
+
+build: segmentationTreeThrust
+
+check.deps:
+ifeq ($(SAMPLE_ENABLED),0)
+ @echo "Sample will be waived due to the above missing dependencies"
+else
+ @echo "Sample is ready - all dependencies have been met"
+endif
+
+segmentationTree.o:segmentationTree.cu
+ $(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
+
+segmentationTreeThrust: segmentationTree.o
+ $(EXEC) $(NVCC) $(ALL_LDFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LIBRARIES)
+ $(EXEC) mkdir -p ../../bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))
+ $(EXEC) cp $@ ../../bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))
+
+run: build
+ $(EXEC) ./segmentationTreeThrust
+
+clean:
+ rm -f segmentationTreeThrust segmentationTree.o
+ rm -rf ../../bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))/segmentationTreeThrust
+
+clobber: clean
diff --git a/gpu/Makefile-e b/gpu/Makefile-e
new file mode 100644
index 0000000..e978944
--- /dev/null
+++ b/gpu/Makefile-e
@@ -0,0 +1,210 @@
+################################################################################
+#
+# Copyright 1993-2013 NVIDIA Corporation. All rights reserved.
+#
+# NOTICE TO USER:
+#
+# This source code is subject to NVIDIA ownership rights under U.S. and
+# international Copyright laws.
+#
+# NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
+# CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
+# IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
+# IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
+# 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 SOURCE CODE.
+#
+# U.S. Government End Users. This source code is a "commercial item" as
+# that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of
+# "commercial computer software" and "commercial computer software
+# documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
+# and is provided to the U.S. Government only as a commercial end item.
+# Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
+# 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
+# source code with only those rights set forth herein.
+#
+################################################################################
+#
+# Makefile project only supported on Mac OS X and Linux Platforms)
+#
+################################################################################
+
+# Location of the CUDA Toolkit
+CUDA_PATH ?= /usr/local/cuda
+
+OSUPPER = $(shell uname -s 2>/dev/null | tr "[:lower:]" "[:upper:]")
+OSLOWER = $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
+
+OS_SIZE = $(shell uname -m | sed -e "s/x86_64/64/" -e "s/armv7l/32/" -e "s/aarch64/64/")
+OS_ARCH = $(shell uname -m)
+ARCH_FLAGS =
+
+DARWIN = $(strip $(findstring DARWIN, $(OSUPPER)))
+ifneq ($(DARWIN),)
+ XCODE_GE_5 = $(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5)
+endif
+
+# Take command line flags that override any of these settings
+ifeq ($(x86_64),1)
+ OS_SIZE = 64
+ OS_ARCH = x86_64
+endif
+ifeq ($(ARMv7),1)
+ OS_SIZE = 32
+ OS_ARCH = armv7l
+ ARCH_FLAGS = -target-cpu-arch ARM
+endif
+ifeq ($(aarch64),1)
+ OS_SIZE = 64
+ OS_ARCH = aarch64
+ ARCH_FLAGS = -target-cpu-arch ARM
+endif
+
+# Common binaries
+ifneq ($(DARWIN),)
+ifeq ($(XCODE_GE_5),1)
+ GCC ?= clang
+else
+ GCC ?= g++
+endif
+else
+ifeq ($(ARMv7),1)
+ GCC ?= arm-linux-gnueabihf-g++
+else
+ GCC ?= g++
+endif
+endif
+NVCC := $(CUDA_PATH)/bin/nvcc -ccbin $(GCC)
+
+# internal flags
+NVCCFLAGS := -m${OS_SIZE} ${ARCH_FLAGS}
+CCFLAGS :=
+LDFLAGS :=
+
+# Extra user flags
+EXTRA_NVCCFLAGS ?=
+EXTRA_LDFLAGS ?=
+EXTRA_CCFLAGS ?=
+
+# OS-specific build flags
+ifneq ($(DARWIN),)
+ LDFLAGS += -rpath $(CUDA_PATH)/lib
+ CCFLAGS += -arch $(OS_ARCH)
+else
+ ifeq ($(OS_ARCH),armv7l)
+ ifeq ($(abi),androideabi)
+ NVCCFLAGS += -target-os-variant Android
+ else
+ ifeq ($(abi),gnueabi)
+ CCFLAGS += -mfloat-abi=softfp
+ else
+ # default to gnueabihf
+ override abi := gnueabihf
+ LDFLAGS += --dynamic-linker=/lib/ld-linux-armhf.so.3
+ CCFLAGS += -mfloat-abi=hard
+ endif
+ endif
+ endif
+endif
+
+ifeq ($(ARMv7),1)
+ifneq ($(TARGET_FS),)
+GCCVERSIONLTEQ46 := $(shell expr `$(GCC) -dumpversion` \<= 4.6)
+ifeq ($(GCCVERSIONLTEQ46),1)
+CCFLAGS += --sysroot=$(TARGET_FS)
+endif
+LDFLAGS += --sysroot=$(TARGET_FS)
+LDFLAGS += -rpath-link=$(TARGET_FS)/lib
+LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib
+LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/arm-linux-$(abi)
+endif
+endif
+
+# Debug build flags
+ifeq ($(dbg),1)
+ NVCCFLAGS += -g -G
+ TARGET := debug
+else
+ TARGET := release
+endif
+
+ALL_CCFLAGS :=
+ALL_CCFLAGS += $(NVCCFLAGS)
+ALL_CCFLAGS += $(EXTRA_NVCCFLAGS)
+ALL_CCFLAGS += $(addprefix -Xcompiler ,$(CCFLAGS))
+ALL_CCFLAGS += $(addprefix -Xcompiler ,$(EXTRA_CCFLAGS))
+
+ALL_LDFLAGS :=
+ALL_LDFLAGS += $(ALL_CCFLAGS)
+ALL_LDFLAGS += $(addprefix -Xlinker ,$(LDFLAGS))
+ALL_LDFLAGS += $(addprefix -Xlinker ,$(EXTRA_LDFLAGS))
+
+# Common includes and paths for CUDA
+INCLUDES := -I../../common/inc
+LIBRARIES :=
+
+################################################################################
+
+SAMPLE_ENABLED := 1
+
+# Gencode arguments
+ifeq ($(OS_ARCH),armv7l)
+SMS ?= 20 30 32 35 37 50
+else
+SMS ?= 13 20 30 35 37 50
+endif
+
+ifeq ($(SMS),)
+$(info >>> WARNING - no SM architectures have been specified - waiving sample <<<)
+SAMPLE_ENABLED := 0
+endif
+
+ifeq ($(GENCODE_FLAGS),)
+# Generate SASS code for each SM architecture listed in $(SMS)
+$(foreach sm,$(SMS),$(eval GENCODE_FLAGS += -gencode arch=compute_$(sm),code=sm_$(sm)))
+
+# Generate PTX code from the highest SM architecture in $(SMS) to guarantee forward-compatibility
+HIGHEST_SM := $(lastword $(sort $(SMS)))
+ifneq ($(HIGHEST_SM),)
+GENCODE_FLAGS += -gencode arch=compute_$(HIGHEST_SM),code=compute_$(HIGHEST_SM)
+endif
+endif
+
+ifeq ($(SAMPLE_ENABLED),0)
+EXEC ?= @echo "[@]"
+endif
+
+################################################################################
+
+# Target rules
+all: build
+
+build: segmentationTreeThrust
+
+check.deps:
+ifeq ($(SAMPLE_ENABLED),0)
+ @echo "Sample will be waived due to the above missing dependencies"
+else
+ @echo "Sample is ready - all dependencies have been met"
+endif
+
+segmentationTree.o:segmentationTree.cu
+ $(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
+
+segmentationTreeThrust: segmentationTree.o
+ $(EXEC) $(NVCC) $(ALL_LDFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LIBRARIES)
+ $(EXEC) mkdir -p ../../bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))
+ $(EXEC) cp $@ ../../bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))
+
+run: build
+ $(EXEC) ./segmentationTreeThrust
+
+clean:
+ rm -f segmentationTreeThrust segmentationTree.o
+ rm -rf ../../bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))/segmentationTreeThrust
+
+clobber: clean
diff --git a/gpu/NsightEclipse.xml b/gpu/NsightEclipse.xml
new file mode 100644
index 0000000..882478c
--- /dev/null
+++ b/gpu/NsightEclipse.xml
@@ -0,0 +1,32 @@
+
+
+
+ CUDA Segmentation Tree Thrust Library
+
+
+ SM 1.3
+ GPGPU,Sorting
+ 1:CUDA Advanced Topics,1:Data-Parallel Algorithms,1:Performance Strategies
+
+ data\test.ppm
+ data\ref_00.ppm
+ data\ref_09.ppm
+
+
+ Data-Parallel Algorithms
+ Performance Strategies
+ ./
+ ../
+ ../../common/inc
+ whole
+ sm13
+ sm20
+ sm30
+ sm32
+ sm35
+ sm37
+ sm50
+ exe
+ segmentationTree.cu
+ linux:x86_64, linux:i686, windows7, macosx:x86_64, macosx:i686, :arm, linux:aarch64
+
diff --git a/gpu/cmake/FindNumPy.cmake b/gpu/cmake/FindNumPy.cmake
new file mode 100644
index 0000000..eafed16
--- /dev/null
+++ b/gpu/cmake/FindNumPy.cmake
@@ -0,0 +1,102 @@
+# - Find the NumPy libraries
+# This module finds if NumPy is installed, and sets the following variables
+# indicating where it is.
+#
+# TODO: Update to provide the libraries and paths for linking npymath lib.
+#
+# NUMPY_FOUND - was NumPy found
+# NUMPY_VERSION - the version of NumPy found as a string
+# NUMPY_VERSION_MAJOR - the major version number of NumPy
+# NUMPY_VERSION_MINOR - the minor version number of NumPy
+# NUMPY_VERSION_PATCH - the patch version number of NumPy
+# NUMPY_VERSION_DECIMAL - e.g. version 1.6.1 is 10601
+# NUMPY_INCLUDE_DIRS - path to the NumPy include files
+
+#============================================================================
+# Copyright 2012 Continuum Analytics, Inc.
+#
+# MIT License
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+#============================================================================
+
+# Finding NumPy involves calling the Python interpreter
+if(NumPy_FIND_REQUIRED)
+ find_package(PythonInterp REQUIRED)
+else()
+ find_package(PythonInterp)
+endif()
+
+if(NOT PYTHONINTERP_FOUND)
+ set(NUMPY_FOUND FALSE)
+ return()
+endif()
+
+execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c"
+ "import numpy as n; print(n.__version__); print(n.get_include());"
+ RESULT_VARIABLE _NUMPY_SEARCH_SUCCESS
+ OUTPUT_VARIABLE _NUMPY_VALUES_OUTPUT
+ ERROR_VARIABLE _NUMPY_ERROR_VALUE
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if(NOT _NUMPY_SEARCH_SUCCESS MATCHES 0)
+ if(NumPy_FIND_REQUIRED)
+ message(FATAL_ERROR
+ "NumPy import failure:\n${_NUMPY_ERROR_VALUE}")
+ endif()
+ set(NUMPY_FOUND FALSE)
+ return()
+endif()
+
+# Convert the process output into a list
+string(REGEX REPLACE ";" "\\\\;" _NUMPY_VALUES ${_NUMPY_VALUES_OUTPUT})
+string(REGEX REPLACE "\n" ";" _NUMPY_VALUES ${_NUMPY_VALUES})
+# Just in case there is unexpected output from the Python command.
+list(GET _NUMPY_VALUES -2 NUMPY_VERSION)
+list(GET _NUMPY_VALUES -1 NUMPY_INCLUDE_DIRS)
+
+string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" _VER_CHECK "${NUMPY_VERSION}")
+if("${_VER_CHECK}" STREQUAL "")
+ # The output from Python was unexpected. Raise an error always
+ # here, because we found NumPy, but it appears to be corrupted somehow.
+ message(FATAL_ERROR
+ "Requested version and include path from NumPy, got instead:\n${_NUMPY_VALUES_OUTPUT}\n")
+ return()
+endif()
+
+# Make sure all directory separators are '/'
+string(REGEX REPLACE "\\\\" "/" NUMPY_INCLUDE_DIRS ${NUMPY_INCLUDE_DIRS})
+
+# Get the major and minor version numbers
+string(REGEX REPLACE "\\." ";" _NUMPY_VERSION_LIST ${NUMPY_VERSION})
+list(GET _NUMPY_VERSION_LIST 0 NUMPY_VERSION_MAJOR)
+list(GET _NUMPY_VERSION_LIST 1 NUMPY_VERSION_MINOR)
+list(GET _NUMPY_VERSION_LIST 2 NUMPY_VERSION_PATCH)
+string(REGEX MATCH "[0-9]*" NUMPY_VERSION_PATCH ${NUMPY_VERSION_PATCH})
+math(EXPR NUMPY_VERSION_DECIMAL
+ "(${NUMPY_VERSION_MAJOR} * 10000) + (${NUMPY_VERSION_MINOR} * 100) + ${NUMPY_VERSION_PATCH}")
+
+find_package_message(NUMPY
+ "Found NumPy: version \"${NUMPY_VERSION}\" ${NUMPY_INCLUDE_DIRS}"
+ "${NUMPY_INCLUDE_DIRS}${NUMPY_VERSION}")
+
+set(NUMPY_FOUND TRUE)
+
diff --git a/gpu/cmake/FindOpenCVlibstdcxx.cmake b/gpu/cmake/FindOpenCVlibstdcxx.cmake
new file mode 100644
index 0000000..3344157
--- /dev/null
+++ b/gpu/cmake/FindOpenCVlibstdcxx.cmake
@@ -0,0 +1,25 @@
+# - Try to find OpenCVlibstdcxx
+# Once done this will define
+# OPENCV_LIBSTDCXX_FOUND - System has OpenCVlibstdcxx
+# OPENCV_LIBSTDCXX_INCLUDE_DIRS - The OpenCVlibstdcxx include directories
+# OPENCV_LIBSTDCXX_LIBRARIES - The libraries needed to use OpenCVlibstdcxx
+# OPENCV_LIBSTDCXX_DEFINITIONS - Compiler switches required for using OpenCVlibstdcxx
+
+find_package(PkgConfig)
+pkg_check_modules(PC_OPENCV_LIBSTDCXX QUIET opencv-libstdcxx)
+set(OPENCV_LIBSTDCXX_DEFINITIONS ${PC_OPENCV_LIBSTDCXX_CFLAGS_OTHER})
+
+find_path(OPENCV_LIBSTDCXX_INCLUDE_DIR opencv2/opencv.hpp
+ HINTS ${PC_OPENCV_LIBSTDCXX_INCLUDEDIR} ${PC_OPENCV_LIBSTDCXX_INCLUDE_DIRS})
+
+set(OPENCV_LIBSTDCXX_LIBRARIES ${PC_OPENCV_LIBSTDCXX_LDFLAGS})
+set(OPENCV_LIBSTDCXX_LIBRARY ${PC_OPENCV_LIBSTDCXX_LDFLAGS})
+set(OPENCV_LIBSTDCXX_INCLUDE_DIRS ${OPENCV_LIBSTDCXX_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+# handle the QUIETLY and REQUIRED arguments and set OPENCV_LIBSTDCXX_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(OpenCVlibstdcxx DEFAULT_MSG
+ OPENCV_LIBSTDCXX_LIBRARY OPENCV_LIBSTDCXX_INCLUDE_DIR)
+
+mark_as_advanced(OPENCV_LIBSTDCXX_INCLUDE_DIR OPENCV_LIBSTDCXX_LIBRARY )
diff --git a/gpu/cmake/FindThrust.cmake b/gpu/cmake/FindThrust.cmake
new file mode 100644
index 0000000..41bbc38
--- /dev/null
+++ b/gpu/cmake/FindThrust.cmake
@@ -0,0 +1,69 @@
+##=============================================================================
+##
+## Copyright (c) Kitware, Inc.
+## All rights reserved.
+## See LICENSE.txt for details.
+##
+## This software is distributed WITHOUT ANY WARRANTY; without even
+## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+## PURPOSE. See the above copyright notice for more information.
+##
+## Copyright 2012 Sandia Corporation.
+## Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+## the U.S. Government retains certain rights in this software.
+##
+##=============================================================================
+
+#
+# FindThrust
+#
+# This module finds the Thrust header files and extrats their version. It
+# sets the following variables.
+#
+# THRUST_INCLUDE_DIR - Include directory for thrust header files. (All header
+# files will actually be in the thrust subdirectory.)
+# THRUST_VERSION - Version of thrust in the form "major.minor.patch".
+#
+
+find_path( THRUST_INCLUDE_DIR
+ HINTS
+ /usr/include/cuda
+ /usr/local/include
+ /usr/local/cuda/include
+ ${CUDA_INCLUDE_DIRS}
+ NAMES thrust/version.h
+ DOC "Thrust headers"
+ )
+if( THRUST_INCLUDE_DIR )
+ list( REMOVE_DUPLICATES THRUST_INCLUDE_DIR )
+endif( THRUST_INCLUDE_DIR )
+
+# Find thrust version
+file( STRINGS ${THRUST_INCLUDE_DIR}/thrust/version.h
+ version
+ REGEX "#define THRUST_VERSION[ \t]+([0-9x]+)"
+ )
+string( REGEX REPLACE
+ "#define THRUST_VERSION[ \t]+"
+ ""
+ version
+ "${version}"
+ )
+
+string( REGEX MATCH "^[0-9]" major ${version} )
+string( REGEX REPLACE "^${major}00" "" version "${version}" )
+string( REGEX MATCH "^[0-9]" minor ${version} )
+string( REGEX REPLACE "^${minor}0" "" version "${version}" )
+set( THRUST_VERSION "${major}.${minor}.${version}")
+set( THRUST_MAJOR_VERSION "${major}")
+set( THRUST_MINOR_VERSION "${minor}")
+
+# Check for required components
+include( FindPackageHandleStandardArgs )
+find_package_handle_standard_args( Thrust
+ REQUIRED_VARS THRUST_INCLUDE_DIR
+ VERSION_VAR THRUST_VERSION
+ )
+
+set(THRUST_INCLUDE_DIRS ${THRUST_INCLUDE_DIR})
+mark_as_advanced(THRUST_INCLUDE_DIR)
diff --git a/gpu/common.cuh b/gpu/common.cuh
new file mode 100644
index 0000000..19b0dca
--- /dev/null
+++ b/gpu/common.cuh
@@ -0,0 +1,8 @@
+#ifndef _COMMON_CUH_
+#define _COMMON_CUH_
+
+typedef unsigned char uchar;
+typedef unsigned int uint;
+typedef unsigned long long int ullint;
+
+#endif // #ifndef _COMMON_CUH_
\ No newline at end of file
diff --git a/gpu/conversion.cpp b/gpu/conversion.cpp
new file mode 100644
index 0000000..1a76804
--- /dev/null
+++ b/gpu/conversion.cpp
@@ -0,0 +1,233 @@
+# include "conversion.h"
+/*
+ * The following conversion functions are taken/adapted from OpenCV's cv2.cpp file
+ * inside modules/python/src2 folder.
+ */
+
+static void init()
+{
+ import_array();
+}
+
+static int failmsg(const char *fmt, ...)
+{
+ char str[1000];
+
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(str, sizeof(str), fmt, ap);
+ va_end(ap);
+
+ PyErr_SetString(PyExc_TypeError, str);
+ return 0;
+}
+
+class PyAllowThreads
+{
+public:
+ PyAllowThreads() : _state(PyEval_SaveThread()) {}
+ ~PyAllowThreads()
+ {
+ PyEval_RestoreThread(_state);
+ }
+private:
+ PyThreadState* _state;
+};
+
+class PyEnsureGIL
+{
+public:
+ PyEnsureGIL() : _state(PyGILState_Ensure()) {}
+ ~PyEnsureGIL()
+ {
+ PyGILState_Release(_state);
+ }
+private:
+ PyGILState_STATE _state;
+};
+
+using namespace cv;
+
+static PyObject* failmsgp(const char *fmt, ...)
+{
+ char str[1000];
+
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(str, sizeof(str), fmt, ap);
+ va_end(ap);
+
+ PyErr_SetString(PyExc_TypeError, str);
+ return 0;
+}
+
+class NumpyAllocator : public MatAllocator
+{
+public:
+ NumpyAllocator() {}
+ ~NumpyAllocator() {}
+
+ void allocate(int dims, const int* sizes, int type, int*& refcount,
+ uchar*& datastart, uchar*& data, size_t* step)
+ {
+ PyEnsureGIL gil;
+
+ int depth = CV_MAT_DEPTH(type);
+ int cn = CV_MAT_CN(type);
+ const int f = (int)(sizeof(size_t)/8);
+ int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
+ depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
+ depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
+ depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
+ int i;
+ npy_intp _sizes[CV_MAX_DIM+1];
+ for( i = 0; i < dims; i++ )
+ {
+ _sizes[i] = sizes[i];
+ }
+
+ if( cn > 1 )
+ {
+ _sizes[dims++] = cn;
+ }
+
+ PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
+
+ if(!o)
+ {
+ //CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
+ std::cerr << "The numpy array cannot be created..." << std::endl;
+ return;
+ }
+ refcount = refcountFromPyObject(o);
+
+ npy_intp* _strides = PyArray_STRIDES(o);
+ for( i = 0; i < dims - (cn > 1); i++ )
+ step[i] = (size_t)_strides[i];
+ datastart = data = (uchar*)PyArray_DATA(o);
+ }
+
+ void deallocate(int* refcount, uchar*, uchar*)
+ {
+ PyEnsureGIL gil;
+ if( !refcount )
+ return;
+ PyObject* o = pyObjectFromRefcount(refcount);
+ Py_INCREF(o);
+ Py_DECREF(o);
+ }
+};
+
+NumpyAllocator g_numpyAllocator;
+
+NDArrayConverter::NDArrayConverter() { init(); }
+
+void NDArrayConverter::init()
+{
+ import_array();
+}
+
+cv::Mat NDArrayConverter::toMat(const PyObject *o)
+{
+ cv::Mat m;
+
+ if(!o || o == Py_None)
+ {
+ if( !m.data )
+ m.allocator = &g_numpyAllocator;
+ }
+
+ if( !PyArray_Check(o) )
+ {
+ failmsg("toMat: Object is not a numpy array");
+ }
+
+ int typenum = PyArray_TYPE(o);
+ int type = typenum == NPY_UBYTE ? CV_8U : typenum == NPY_BYTE ? CV_8S :
+ typenum == NPY_USHORT ? CV_16U : typenum == NPY_SHORT ? CV_16S :
+ typenum == NPY_INT || typenum == NPY_LONG ? CV_32S :
+ typenum == NPY_FLOAT ? CV_32F :
+ typenum == NPY_DOUBLE ? CV_64F : -1;
+
+ if( type < 0 )
+ {
+ failmsg("toMat: Data type = %d is not supported", typenum);
+ }
+
+ int ndims = PyArray_NDIM(o);
+
+ if(ndims >= CV_MAX_DIM)
+ {
+ failmsg("toMat: Dimensionality (=%d) is too high", ndims);
+ }
+
+ int size[CV_MAX_DIM+1];
+ size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type);
+ const npy_intp* _sizes = PyArray_DIMS(o);
+ const npy_intp* _strides = PyArray_STRIDES(o);
+ bool transposed = false;
+
+ for(int i = 0; i < ndims; i++)
+ {
+ size[i] = (int)_sizes[i];
+ step[i] = (size_t)_strides[i];
+ }
+
+ if( ndims == 0 || step[ndims-1] > elemsize ) {
+ size[ndims] = 1;
+ step[ndims] = elemsize;
+ ndims++;
+ }
+
+ if( ndims >= 2 && step[0] < step[1] )
+ {
+ std::swap(size[0], size[1]);
+ std::swap(step[0], step[1]);
+ transposed = true;
+ }
+
+ if( ndims == 3 && size[2] <= CV_CN_MAX && step[1] == elemsize*size[2] )
+ {
+ ndims--;
+ type |= CV_MAKETYPE(0, size[2]);
+ }
+
+ if( ndims > 2)
+ {
+ failmsg("toMat: Object has more than 2 dimensions");
+ }
+
+ m = Mat(ndims, size, type, PyArray_DATA(o), step);
+
+ if( m.data )
+ {
+ m.refcount = refcountFromPyObject(o);
+ m.addref(); // protect the original numpy array from deallocation
+ // (since Mat destructor will decrement the reference counter)
+ };
+ m.allocator = &g_numpyAllocator;
+
+ if( transposed )
+ {
+ Mat tmp;
+ tmp.allocator = &g_numpyAllocator;
+ transpose(m, tmp);
+ m = tmp;
+ }
+ return m;
+}
+
+PyObject* NDArrayConverter::toNDArray(const cv::Mat& m)
+{
+ if( !m.data )
+ Py_RETURN_NONE;
+ Mat temp, *p = (Mat*)&m;
+ if(!p->refcount || p->allocator != &g_numpyAllocator)
+ {
+ temp.allocator = &g_numpyAllocator;
+ m.copyTo(temp);
+ p = &temp;
+ }
+ p->addref();
+ return pyObjectFromRefcount(p->refcount);
+}
diff --git a/gpu/conversion.h b/gpu/conversion.h
new file mode 100644
index 0000000..e4bc9d7
--- /dev/null
+++ b/gpu/conversion.h
@@ -0,0 +1,61 @@
+# ifndef __COVERSION_OPENCV_H__
+# define __COVERSION_OPENCV_H__
+
+#include
+#include
+#include
+#include
+#include "numpy/ndarrayobject.h"
+#include
+
+static PyObject* opencv_error = 0;
+
+static int failmsg(const char *fmt, ...);
+
+class PyAllowThreads;
+
+class PyEnsureGIL;
+
+#define ERRWRAP2(expr) \
+try \
+{ \
+ PyAllowThreads allowThreads; \
+ expr; \
+} \
+catch (const cv::Exception &e) \
+{ \
+ PyErr_SetString(opencv_error, e.what()); \
+ return 0; \
+}
+
+static PyObject* failmsgp(const char *fmt, ...);
+
+static size_t REFCOUNT_OFFSET = (size_t)&(((PyObject*)0)->ob_refcnt) +
+ (0x12345678 != *(const size_t*)"\x78\x56\x34\x12\0\0\0\0\0")*sizeof(int);
+
+static inline PyObject* pyObjectFromRefcount(const int* refcount)
+{
+ return (PyObject*)((size_t)refcount - REFCOUNT_OFFSET);
+}
+
+static inline int* refcountFromPyObject(const PyObject* obj)
+{
+ return (int*)((size_t)obj + REFCOUNT_OFFSET);
+}
+
+
+class NumpyAllocator;
+
+enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };
+
+class NDArrayConverter
+{
+private:
+ void init();
+public:
+ NDArrayConverter();
+ cv::Mat toMat(const PyObject* o);
+ PyObject* toNDArray(const cv::Mat& mat);
+};
+
+# endif
diff --git a/gpu/data/airport.pbm b/gpu/data/airport.pbm
new file mode 100644
index 0000000..6ef2c04
--- /dev/null
+++ b/gpu/data/airport.pbm
@@ -0,0 +1,306 @@
+P6
+500
+281
+255
+ЃЃЅ҅ӅӅӆԆԈ։ֈ֊؊؊؋ۋۋی܍ݎޏܒߑސݐݒߓߔߓфх҆ӆԆԆԇՈևՉڌڊ؉ًۋی܍ݍݎޏܐݏܐݑޒߔ҅҆ӆӆԇՈֈֈֈ։ٌڊ؊،ڋٌڌڍێܐݐݓߒߓߔߔߕ҆ӆӆӆԇՈֈֈ֊؊؈ֈٌڋًٌڌڍێݐݐݑޑޒߓ҆ӇԆӆԇՈ։ًىڎ܌ڍڍڍڎېݑސݐݐۑܔݕޖߖߖߗ҇ԈՇԆԈ։،ڌڋٌڍێێێۏܑޑޑސݒݒݔݕޕޕޕޕޖЇ҉ԈӇӈԉՉՈԉՋ؍؍؍؎ُڐۑܑܑܑܒݒےۓܔݖߘߗޘߙχ҉ԈӇӈԉՉՈԌ؍؊Ջ֏ڐۍ؎ِےݒݑܐۑܓޖߕޕޕޗ҆ч҈ӉՊ։Ոԋ؎ََِِّْْؒٔ۔ۓڔ۔ۖݗߖߗч҈ӉԉՉՉՉՋ؍ِّؐؓړڒٔەܓړڕܖݗшӉԊՊՊՋّؐڑڒٔۓړڕܕܔ۔ۖݗޗޗޘߚߛ҈ӊՊՊՊՌ؍؍؏ّؐڒےۓܓڔۓړڕܖݕܕܖݗޗޘߙщ҈҉ӊӋԌՍ֍֍בْؒٔڔڔږܔڔږܗݗݘޗݘޙߚ҉҉ӉӋԋԌՍ֍֎אבْؒٔڔڔڕ۔ڔږܘޘޙߗݘޙߚ҉ӉӊԋԋԌՍ֎אבؓٓٔڔڔڕەەۗݘޗݘޘޘޙ҉ӋՋՋԋԌՍ֎אאגؓٔڔڔږܕەۘޘޗݗݙߘޘҋҌӌӍԎՏאבْْْؑؒٓړٔږܗݗݗݗݘޙߘޘޙߛߛҌӌӍԍԏ֏אבْْْؒٓړڔڕۗݗݗݖܖܗݙߚӍӍӍӎՏ֏אבْؑؒٓڔڕەږۗܗܗܖۗܗܙޚߚߚߚߚߜԎԎԎԎՏ֏בْؒٓڔڕەږۗܘݘݘݘݘݙޙޚߚߚߛԎԎԏՏՐ֑א֑דؓؔڔڕەەږۗܘݘݙޙޙޚߚߚߛԎԎԏՏՐ֑גؑגٕؔٔەۖܖܖۖۗܘݙޙޙޙޛҎҎҏӏӐԒגדٕؔٔڕڕږۖۘژڙۙۚܚܚܚܜޜޜޜޛݜޝߞӏӏӏӏӐԑ֑ٕ֓ؔٔٔٔڕڕژژڙۙۚܛݛݛݛݝߝߝߜޜޞҏҏҐӒՓ֓֒ՒՕٕؖؕؖٗږٗ٘ښܛݛݛݛݜޝߜޞޞߠҐӐӑԒՒՓ֓֒ՔוؘٖٕؕؕؖڙۚܚܚܛݛݜޜޜޝߝߜޞёҒӒӒӒӓԔՓԕ֖זזٗڗڕؙٙٙٙٚڛۜܝݛݝݜܝݝݞޟߡґҒӒӒӒӓԔՔՕ֖זזٖٗږٙٙٙٙٚڛݞޜܟߞޜܞޞޞޡБББВӓԓԓԔՕ֗ז֕Օט؛ٛٛٛٝ۞ܟݠޞܡߠޟݡߡߠޤߣБАϑВӓԓԓԔՕ֖֖֔ԕיٜٛٛٛڝ۞ܞܞܞܟݠޠޡߡߡߣБББВѓҔӔӖؙ֖֖֖֖֖ٜ֘؛ל؝ٞڞڞڟ۞ڟۡݡݡݢޢޤߤϑВђђѓҔӕԖ֕ՔԕՖ֗חט؛כל؝ٞڟ۟۠ܝ٠ܣߡݢޣߢޣߥВѓғҔҔҕӕӘԘԙՙՙՙ՚֛מڜ؝ٜٝ؞ڡݠۢݢݣޣߢޢޣߤޥߥߥߥߥߥߤޥߤަђђѓҕӖԖԗ՚֙ՙՙՙ՚֜؝ٜ؝ٟ۟۟۟۠ܡܢݡܠۡݢޣߦޤޤޥߥߥߥߥߥߥߧҒѓѓѕӗՙՙ՛כך֙՚֛ל؝ٛ՜֞؞؟ٟ١ڠ١ڣܢۣۢܢۣۡݣݣݤޥߥߥߦӓҔҔҕӖԘԘԚ֛֚֚֚ככך֜֝מ֜֟١ڠ١ڣܣܣܣܢ۠ڢܣݤޤޥߥߦЕѕѕѕѕїјҙәәӚԛ՛՛՚Ԝ֞؟ٝמנ١ڠ١ڢۡڠ٢ۣܤݧݦަަާߧߧݓϔЕѕѕѕјҙӚԚԙӚԛ՜֞؞؛՝ןٞ؟ؠ٠ٞסڢۣۢۢܤݤݦߦަަާߧߧߧ۔ДЖЖЗїјҙӚԚԚԛ՛՝מ؟ٚԝןؠ٠٠٠ٟءڣܤݥަߤݢۢۦަަާߧߧߨܳڕєЕϕϗјҙәӘҙӚԛ՛՛՛՜֜֝ןؠ٠١ڢۣۢۢܣܣܤݤݤݥަަަާߧߨߨݸߕΖϖϖϗКӛӚқӚҚҚҜԝ՝֝֝՟ןמ֠أۥۣ٤ڤڤڥۥۥۤܥݨܨܩݩݩߩߩߩߩ߬߸ΖϗЖϗИњҚқӛӛӛӜԝ՝֝֝՟נ؟ןס٤ڣ٥ۥۥۦܦܦܥݦިܨܨܩݩߪΗЙјЗϘЙњқӜԝ՜ԜԞ֞֝՞ԟՠ֢֢֣֠פإ٥٥٦ڦڦڧ۩ݨܨܩݩݪުުުެޫ߷߹ݸ߾ΖϙјИИКқӚҝ՝՜Ԝԝ՝՜ԟ՟ՠ֡ףע֢֤إ٥٥٦ڦڦڧۨܩݩݩݩݪުުުެߪߵݷ߸߷ݹ߾̗͘ΘΙϙϚЛњМҝӜҜҝӝӝӟ՞ԡգפأע֣צ٦٥٦ڦڦڧۨܪݪݪݪݫޫޫޫޭ߾߾͖̗͘ΙϙϚЛћќҜҝӝӝӞԞԟ՞Ԡԣפؤأףצ٦٥٦ڦڦڧۨܩܩܪݪݫޫެ͖̗߬߬߮߭͘ΛϛϛϜОҜКМҝӝӝӟաաաբ֣ףפפצ٦٦٧ڦڦڦڨܩܩܩܪݪݫެ߬߬߭͗͗͘ΚΙ͚ΜНћϙϜҝӜҝӟաբ֢֡աադפצ٦٦٦٥٥٦ڧ۩ܩܩܪݪݫޫޫޭ߭߯ɗ˙̘̘̙͘͘̚Ι͚ΜНѝўҠԞҠԡբ֤֥פ֣եץצצקاب٨٫ܫܫܪ۪۪۫ܫܫܬݭޭެެޭ߯ݰ߳߾ʗ˘̘̘̙͙͙͙͙͚ΝѝѝѝўҠԡաաբԤ֤֤֣գե֥֦קب٨٩کڪ۪۩ڪ۫ܬݭެݫܬݬޭ߬ެޭޮ߲߱߰ߴݾݾݘʙ˚̛̚̚͜ΜΛ͜ΝϞОООПѠҡӡӡӡӢԤդդդե֥֦קب٨٩ڪ۪۪۩کڪ۫ܭެݬݭޯ߯߱߳߾پӷјʙ˙˙˚̛͛̚͞НϝϝϝϞПѡӟѠҡӢԢԡӢӢӥ֥֥֦צקااةکڪ۩ککڪ۫ܩڪ۫ܬݬݫܭޯޱ߲߳˚˚˚˛̛̜͜͞ϟОϞϞϟРѡҠѡҢӣԣԣԣԤեԥԥԥԦզզէ֦קب٩ڨ٩ڪ۫ܬܭݮޮޮޮޮޯ߭ۯݱ߱߰ߴݺػӧĿǿ̚˚˛̛̛̛̜͜͝ΞϞϞϟППТӡҡҡҢӢӣԥ֤ӥԥԦզէ֧֧֧اب٨٨٧ااجܫ۪ڬܯ߯߮ޭݯݯݰޯݮܲߵַܺӰͬɩŪàjșȘǙȚɛʛʚɛʚɜ˞͟͞͠ΠΠѠϠϠϡСТѤӦԦԧէը֨֨֨֨רררשר֦ԥӬګٮڰܱݱݱݱݴݱݱݯۯۯ۰ܱݲڱʫĬĪ£üky}ۗƗƗƙȚɚəȚɛʝ̝̝̞̠ΡϡϡРϠϢѢѢѡТѦԦԧէէէէէէ֧֨שتةר֦ԡϤҨԧӣϡ͢ΥѦҤЪֳߵݰܱݱݱݲ߳ߴݲܱ۳ݶ㔳ľſôʾ٠ýڸݻ۽חǖƗǚʛʙșțʙțʝ̜˝̟ΠϟΡΡϢϣУФѤѤѤѥӦԧէէզԩ֨ըժתתخ٬֪թԩӧѥϤΣϠ̟ˣϨԬد۲ް۳ݰ۶ݴ߹ֿڕқطԱΟÿǖƖƗǗǘǙȚɜ˜˜˜˛ʛʝ̞͟ϢϢϢϢϢϢϢϣХҦԦԦԥӦԧթ֪֩֩ت֬ٯگگڱ۲ܱܲ۬ت֨ԨԦҥѥѧӮٯڰ۵߱ٱٲܴ߷߸߹ݰذطɼϞȦçĿƃЕĘǙȗƗƙțʛʝ̜˜˜˜˜˝̞̠͟͠͡ΡΡϣХЦѧҧҧҧҧҨӪժթԩԪի֭حخدٯ٭حլ֨ҥϦШҨҧѧѨҧѨҭׯٰڴڰدְ֮س۶ܷ߹ܵ۹߽ʱ۾ھճ˾yOsoګѝÊŗƙșșȚəșțʛʛʝ̞̝̞͝͞˟̠͠͡ΡΣФѦѦѥЦѨӨӨӧҧҨөԨөԫ֭ححدٮخخختԧѧѩӪԩӨҪԧѧѩӪԬֱ۳ݷߵݶܶ۵ڵڷܸݷܵڵڸݷ߹ź܇㚻\|wǍmRqlPwv}zŗĘŚǛȚǙƚǛȚǛȞ˟̞˞˟̡ʢˣ̢̣ˣ̤ͥΦѦѦѧҧҨӨӨӧѪԬ֪֭֬֬Ԯحװڱ۰ڰڳݲڲڱٯԩѩѪҪԨҩөӨҨҩөӧϦΩѭղڷ߹ݴڸ۶ܹߵۭөϫѰ֮ԮԯխӬүճٴܳ۲ڱٲضܸ뚵սԾʋǥĮȬįŨƾrĻ]~u͌wԘŖÕƚǙƚǜɜɛȚǛȜɝʞ˞ˠɡʢˢˡʢˣ̥ΣΥЧҧҥХЧҩԩӪԫժԪԫլ֭ج֮֬خثիծدױٲڲڱٰذدױ۰ڲܲܰڱۯٮذجԪҧϧϦΧϧϧϬس۶ݲر׳ٰ֯խӬҬҬҰ֮ԭӬҮԯկհֲض߶ܳٳٲدղسٲزصٸܽ뙴ˋӱЯɲʫ̐nȷаɭŕƽѻ˚ծeސĘÙĚśƛƜǞɝȝȝȝȞɟʠ˟ʞǟȡʡʡʢˤͥΣ̤ͥХЦѦѧҨӫѫѫѪШЩѬԯԭծ֮֮֮֯װززر׳ٵ۶ܴڲشڲضܶܵݸޱ۲ܴܳ۰جԪҩѬԩѧϨШФ̣˧ϨЫӭըШЭիӨЮ֯ױٲڲڲڲڲڳ۵ݴܲگٰڱٱٴܲڲزذԯӷܺߺ߶۶ٺݽ߸۸ۼƯךꈧuژɗtϑ{ŜǜǛƛƜǜǜǝȞɞɟʡ̠˞ɠɡʢˢˡʢˣ̥ΦϤͣΥШӪթԧҪЫѭӯլԪҩѫӫӮ֮֫ӫӮ֮֬Գٳٳٲزسٴڴڳٲع߹߸߶ܵݷ߸߲گײڵݶݮ֭ղڳ۴ܶޱٱٱٴܵݲڮְ֮زڬزڲگٲܵݶ۶ܹߺ߷۵ڸݽڳִݸ۹ٻ۽ݿ߿ߢԖٙϓϸεɿ֬ō}ȕӒ}̧ƞʽŸ˾éť˽ɻ̾ȰΩǤȾɭЫΦɦǡ¦Ǯϰѫ̫˭ͰгӰѬͭ˰βӺ۲ӮҬҬҭӭӮԮԭӭӮҮҷݸްԱկӳ׳ٸٺ۽ݾܼۿٸٺۺ۹ڻۻۺڹٻܽݼܾرԳֵٵٳִݼߺݺݺݼزײڶ۴ضڽݾ߾؞ՏvקŽݍڻ۷ԙſՏˑĥĥĦŧèĩūǬǫƨƩǪȯͧȣĤǫΫάϩʡ£įвӰѱѱѰвҳԲӶԵӱҴլͩͫѯլҭӮԮԭӭӮүӵ۷ݱղְԲֱղֹںۼܽݽܽܿݾ۾۾߸ٹݹڼݿ߿߿۲ղշڸܷ۴״ݼ߾߾װկԴٶ۶ںܬDZ͏عؾ߽ڜꑱą昶ɡɪǩĿwW~{}æŨŨũŨħçèį˱ϰέέΡȾȫϩͭѨʢġíϫͬΰѲӰѯЯЮϱѲұӶدӪΩͩͭӮԮԭӬЫϬЭѳٰԱհԱձձպۺۺۻܼܽܽۼ۽ܾܽݽܼݿݵַؾ߿ܼ߾۴ִݽ߸صոظطֶֺڼܼܾ߾ߺԺԟԺܿۿܾܿܿ۾۾ۿݿܾ۾۾ؙĦǾb}x_zua}~gd}{t˩ȨũƬȪƧäìȫɭˮϭΡ ǫϦʨ̥ǥǤƬίѬάͬͬͮϯЮϰаЮбӭѩͫϫϪЪЪЫѬЭѮҮҴضڰԮүӰԲֲֹڹڹڹڻڼۻںٽܾݾݼۼݾܳԯеֹںۻ۹ٻټڼܾ߽ݽۼڻۻ۸ڳղո۾ڸؼܿ۽ݻۼܼܽؼսݿ۽ھ۾۾ۿܿܽڿܾܿۿܽڽڿٿڿؿؿӿѾл˸ʷ˹չϥwǾĸ˶̐tے˥©ĿܕȭʷԋǖWvxͿʼȺ˽ͿͿ¤©ǧȦǨɨɝŪЦ̩ϤʤʤȫϰҭϬέϬέϭΫ̭ήϯѲԯӪΪΨ̫ϪΪΪέЮѭά͵طڲծѯүұұҶٸٸٹغٺٺٻڻڻڻڻ۾ܴճԶٺڼڹչ߾ۺطյӷնԳѱѷܾۺپȔؿֿؿؿؿڶзѺӻԹٿؿڿԺ؊pܓ{ھڐ̒dj~ЩŧåʼƺĸǻħȣğŠƥ˞ĕ»ģťǩˬΪ̨ʧȥƨɧȥǥǤȠĥɥɨ̨̨̨̪ͪͩʨɯҳֱԭЯҮѱүеַظٷظغٹػںٺٻںڼܺ۵ֹڽܸغؽ۾ܾݾۼڻٺغعնֻѲɦÿڿؿڿ־־ֽսսսվؿؿؿشεϸѸѵܷٿջԻԻԺӹҺѼӻsݒ~ݺ֑ݽذ͗f݉难´Ķƺǻ¶ƼǽŻùĺȾ½»üüżƽżƽƾƣǣǝÜţǥɧ˩ʪ˫̫̬αӰӬϰѮϱҮϳԵֵֶյշظ۹عغٹٺڸصյԻڽܼܾܾۿݾ۾ݿǙҿپּջֹԹԺպչԹԺպֺֻ־ټջԸҺԳִ״ڶڹպַտվԽռԼռռӺѶϷйӺԸҶеϵϷж϶ιѾԾԺзͳƳշχɬȰɭŬ´˭Ȓz˺ѼӳϏҴԱɺҪȉëȄʌvՕõõƺŹ¸ùƼȾù¸Ŀþ½ž»ƿĥɤȥǦȦȧɩ˨ʪ˪ˬЪΩͤȩͧˤȧ˪ΫϪ˩ʪ˫̮вԱԫίЬͯЬͱҳԴԳӴԶָֺٷַֹظظطնչػڽܿܽڼٿܾ۽ھݿܿ߿ܾܾܿʞؿڿپؿؿؿ־־ּֽջԻԺӺӹԸӸӸӸӷҷҸӺֺֹչչչչպչԹҺӸҸүҰӱٺֹմ۵ؿҽιϺкҸиѸѹиϵεεϵϴγʹζеεε͵Ͷ̶̷ͷͲŰþӥzvȯưǪƌǦƯǰȥÒľ~Ƒwĝǻ˿¢àȾɿĢğŢƞɿĠȟǣǞ ģǥɣǣťǦȥǥǥǧ˧˧˧˨̤ȥɣǦʦʨɪ˪˨ɨɩʬ̮ήήέάͬͯавҳҳҳҴӴӶնճҴӷֵַַַԳҸټټټټٽڼ־ؿۿۿݿܿݾھھؿɼҜٿٿھپپٽؼؿڽؾվտտտּֽֿչֺعָֹֹֹջػغֹֹֹԹԺԹӹպָֻԸԵԵԵԵԵԵԵԴӶӶӷԸոոոոպܼۼҽӵҵҿӿӸճݳӶֲָٻֻֻֻּٿؿٿؿտӼҽӾҾҿӾҺһӺӸѶжже϶Ϸзϵʹ̴̴ͳ̳̳̳˴̸ηͶ̶̸˸˳ŶȷͰʑϺҵͶ̶̽Ե{́°ɫĨǎ¥ūíŢʇɗɽɽ˿ʾ˿ǽŻɿàǾɿǽĝŝŠĝ¡ťɤȣţţţŤƥǥɥɥɤȥɡŦʦʧ˥ɤŤŧȪ˪˪˫ˮήΫ˫̬̫̮ͫΰвѱвѲѲѳҴӳҵԶյԵԵԴӲѶպغػռֽٽٽھ۾۽ڽڿܿ۽ٽٿݿٽٿپپٿڿھٽؽؼּּռջҼӽӼһһҼӻҹӺԺԸҸչָշԷԷԷԶӹָֹֹոոշҶѺԹӹպֺֹոԸԴӵԵԴӴӵԵԵԶӷԸոոոոոպܽܽӽӵҵҿӿӷԱӯϷ۷عԹԺպպջֻԺӼջԻѻѼҼҾмκмҽѼнѼйѺҷжϴδδγʹ͵ζεʹ̴̳̲˲˳̱ɲʵ˴ʴʴʵȵȲݵ˰ʓƯǬĭèƾǦ|ɂƩ¥Čīíş~mkضùŻȾȾżĻżȿżǾȿƽžàĢƢƣŤƤƣŦʨ̪ΩͩˢĤƣŢĦȧȣĠèȫ˫˭̪ͬʫˬ̬˫ʮͰϰϰϴѴѳдѵҵҷԶӵҶӶӴѴѷԸչֻعָպռֻֻֻּټٻؽڽڻػܽՖپۿؽܼۼ۽ܾݽܼۻڽܼܽۻڼڼڼػԹԺչԶӷԸָָغٹغ۹ڸغټټٺָԶնյԵԵԶնշԸչָֹֹոոկٯٲβαٱӻԽʶŰӱַַַַַָӷҺպպԺԺӺӹҸѶзѸѷиѸѵζϵϴγͳͲʲʳʴ˴̴̴̳˲ʱɱʲ˰ȱɳɳɴȵɵǴƳŰ´˰˘ŲȮĴȭɧ
ɆǨäÍĨªĠeÖ¸ùĺúżúƿƿƿžƿǾǾƽĻüž ġÚżżúż¦ǩʩʨȥūˬ̫˪ʫ˫˫ʭ̭̯ίίγдѳггдѶӵҳеҶӲϵҶӶӸպշԺջջֻֻֻּټٺټٹֺּؾڿۻռֿڿۿپីΡڿٿؿؿڿݽܾܽݽܾܽݾݾݾݾݾܾܾڽٻֺպջָոչظշֶֶַַָٸٸعػغػغغֶַַָյԵԶնշԸոոշԷԷԷԭرͱͰذױʾ˺ɯҫѷֶյԵԵԶոӷҷҷҷѷѷжϵεγ͵ϵεζ϶ϴ͵γͳͲ̲̲ʱɲɳʲʲʲʱɰȰȰɰɰȱɳɳɳǴȴƴƲIJijʭȕ°ƫƿĩćƂŨã¦ǜ~ĺ¸¹Ļ¹úĻĻƼǽĺżżȿļƾļǿàŽºĽ¢ĜǾǣġ¡¤ĤĥǧɩȬ˫ʨǨǩȪɬ˯̰ͰͰͳϳϳϳϲϲϳггеҵұδѴѴ϶ѵҴѴѷԹֹֹֹֺռԹӻսغԺԽپؿٿٿٿٿؿؾؾؾؾڿ◴ݸӻغֽٽؽػػغٺٺٻںٻڼۼۼۼۻںٽٻؼػػٽٽٻչպֿ߿ܼԺչԹַֹֹԷԷԷҷҷҶѵжѶѶѶѶѵедϴϵегϳϴзӹԯѸ̲Ƶ˯ŮƮƽпճҳҲѲѲѳҵеедϴϴϴϳγγβͳγͳ͵δͳ̴Ͳ̲̰˰˰ɰɱɱɱɰȰȯǮȮȭǭǭǮȯȭƭì¬ĩƑëīžƿĪnjÄĿĿľ~ùĻ¹¹Ļ¹úúùŻĺĻżǾļûûàǿƾãǥɥɨʦȤƤƦȠ¤ƤƢãĥƧȦƤĥǩ˦ŭ̬˥ĥĪɪɨǮ˰̯̱ͯͲβγϲϲϲϳгеҵұβϳгδϴѴѴѶӷԷԸչַַֹֹֹԻָֻӸҹӼֽԺԼ־ؾؿٿپؿٿöؿٿ־ֽֿؾؾؾؾؼֽܔݶѹַԼؼֻּټٻںٹغٺٻڼۼۼۼۼۻھڼؼؽٻػڿܿ۽ٽٿ۾۽ڽڼټٺԸӸӸӸոշԶӶӶӵеедϴϵедϴϴϴϳγγγδϲββεѷշլҬάֽשƹ̶̱ббббвѳα̵дϳδϴϴϳδϲͳγͳʹͳ̲˲˰ʰʯʮɯȯȰȯǯǯǮƭŭǭǬƫŪīŬŪêǿȾȾǽǽȕīĮĬž¤Ŀýľ{Íú¹ºº¸ĺż¸ùŻƼǽļƾŽŽƾãŝȿ¡çȤŢâäƥǣšã§ƧƤæũȪǨŬɮ˯˯˰̱ͳʹγϲγϴдддвΰ˲ͱαγгвгѶӶӶӸնննննոշҶѸӻռֺԺԻս־ؿپؿٿٿٿٿͿTnaŸ۷ٽ|ޮںǐ鈤˜¼ݹ߽ڿٿٿ۽پھھؾؿؿؿؿؿּֽֽս־ֽؽؾپۼݔ˦һ۷ٺپۺٿۿھ۾ۺٻڻڻڻڼۼۻڻڹعغٸַָعظռֹԷҵежѷҸӸҸҸҸҷѶжзѶеϵϵϵ϶еϴγγδϳγγγγηǶưڰگϯ̫̫нuౝդμпӲͲͲͲͳγβͰ˳ΰ˯ʰ˱̰˱˲̱ʲ˲ʲʲʱɰɱʯɰʰ̮ʯʯʱʰɭǭǭǬƬȬȫȩƨũƩĨ訩ɾǼ¦Ǖ½ǿŽľÞÿÿĎĺƼȾ»ú¹úúúƾââĢģŢĢǾǾĩȥĥ¨ũƬɮʮʯ˯˰ʲ̱Ͱ̱ͳϱͱͱͱͬDZ̰ͰͱβϰΰδѴѵҷԶյԵԵԵԷֹԶѵзһռָҸҺԻպԼ־ؽپؽվ۽ؿؿּئVru煮߾ܾؿؿؿؾ־ؾؽؽؽؽؾټݚיݷԿߺںٹؿܼپؽֽټٹععظغٹعطַָննշָյԶնյԶѶѹԸӸӸӷҶѵд϶жжжеϴε϶жжеϴε϶дγͱ̲ͳγγβͲͲ͵ŵůٯٯϰͬͬǩ̝q˸̺α̱̰˯ʰ˱̱̰˳ίʮɯʰ˯ʰʱˮǯȯǯǰȰȯȰɯɯɯˮʮɯʰɯȬƭǭǬƫǫǪǪǪǪǩĨçƾŽƻǼáãûƾľÿļƿü¼ľſûƾļťŦæèĩūǭɯɯɯɰʲ̳Ͳ̳Ͱ̰̲ί˯˱ʹддγͳͳʹδδεϸйѹѹѺҺҹϷ͵кҺҵҳдѶӸӸӺպչڼֻؽķֹٿ־ҽ߽ҷijc_jnmfmg_isvkhtypsx\ֽսռպӼ۞חgd|ӺٽջջռֺֽջֺֻֻֻպԺԹӹӶѸӻֹԸӵиӵиӸӷҶѶӷԶӵҷѶжжжѶѵҴѵԱбδѵҲϳиӹ̼ϯȮǯϱѵйԴдЬˮʳųʲ̴ϲͮɴͶϵΫ˱{ͨѿйͰ˰˯ʯʮ˯̯̭ʯʱ̱̭ȯʬDZʰɯȮǮȯɮȭǬŪíĨǿƮũ¯ȫūūʦūȨŦæíȧ©ĨëȧĦæèţĠ§êȬʦ½vĿ¿xüý¼ľâàŠ§ħĪƫǫǬȮȮȮȯɭǯɯɱˮʮʰ̭ɰ̯˯˯˱˳ʹγʹγͳͲ̵Ͷζη϶ηϷͶ̴̶η϶γвϳеҷҷҸӹԾضнعݷ}μԼۼֺڻؾӸٷԵҲϰͰͷԵԴӇƸӴϱ˷ѡǼ}ͭȬɴџļðΫȬɬɮˁΥ˫ǀͪǪǭʭɃΧ¸ӥ{űϪǯ̵Ӛک˯ѪʷԈԪݹ䙼~ĈýſȠ˛ƞНҟԨݨ߬Իςݭֿտվ־ֺӾ֡ɥˊڻԻԺӶνսֻպպռֺչԹӹӹӹӽغնѵиӷҷҶѶѶѵееҶӶӵҵϵ϶еϴϴϳдѯαгвϳгбα̹̼ϭƱʯϰЮɭȮʴгҫʳųűȲ̫Ʋͯʵηбʫ˯Ͽuca~g_iaպ½Ѹ̮ɮɯʰˮ˭ʬɫȯʮɮɯʮɱ̭ƪíƬůɬƭǫŲˮǪȬìëħĪĥħƦå©ƥ¥ç©ħĦíʢ¿ªǠʥoUzsžTmik~xļºƾļáŽƤåģ§ĨŨŨũũŪƫǫǬȬȮʭɬȮʫǭǮȯɰʱ˲̱˯ɯɰʱ˲̵ͷϸйѶ̷ͷ͵˳˴̶ζη͵˷ϹϹϺкзϻӸйѻӹѻؾھٶεϺԼֻնʵɽٽٿܻ7hdˇxuwvusuyy|~ƇćĊŏʌœ̉ÉŋLjąŅŋ͏яъ̈Ȋʎ̉ǞܔҌ͒Ӌ˓ӗٓՕՓӗ։Ț֡ݗӚ֚זӚ֢ޠڗњԙӘҤިӛל؝٣ܬڥvy~{x}w{ƍqt{\vwdUVcTwy@gdLnmEebKhfOlgSlhTmiTmiUnhVoiVpgVpgXriZtk_vnaxpbysd{uf}whyf}so|rtv}}տվ־ֽռջԻԻԽ־ԸЛЧ۷ѻռּ־ؼֻռֻּպպջֺֻֻոӸӸӸӸӷҵжѶѵдϴϳδϵееϵϵ϶жеϳ͵϶еϲͱ̲ͳβͳβͰ˱˳ͳͰʰͱε̶ͨȮƫоͫϺιͩͩͰϭ̰ЧDz˵ΪDzϱx~~tvsmolʫ˭ǴήɮɭȭȭȬǭȮɫƫƧ±̪ĬƬƲ̯ʫƬǫƯʩĩīƦ«ǦìǪŮ˫ȮǫĪìũç½þƦ¿ĿpnťMfc|Ľ»¾t73|x½¼ļƾá¥ƟúȿżçħĨũŪƪƫǫǬȫǭɬȫǭɩŨ¬ưʰʮȭǮȮȮȯɰʱ˳˳˳˳˶̶̵˳ɰȲʵͶε˴ʶ̹ϹϸιϹϸкҸийѼԿҳŴƾؾؼխƛƁ̍ʎˍʏ̑̐ˊǑΚהїҙԕΓ̢ؒȍɎʓϒ͐ЎВԋ͐ҔԐЍ˙Ǒό͏БяώЕΐВіՍɗӏˍɗԘՒΗӑ˚ԣݜ֙ӝוћלآޚ֞יҢا֥ѥѦҙš͠˚śė]x9UjA]r=aq:^j=XaC^g:W]?\b4RT?=<:64@@<<<<>>::99 0/
+1062848:<>FH?A>ff=ee:bb?gg?gg?gg9aa:bb7__7__7_akn1^a$RR NNMM#QQMM"PPMMBDCE@B;?<@>B<@@D@D@B;=@C#IL@D'PT MR#PU+NT)LR)NT%JP'NU)PW)PW3Za.S[4Ya*OU'LR.UZ/V[(QU)RV.W["KO.W[*SW0XX/WW*RR1YY3[[3[[/WW5]]3[[4\\9ac/WY2Z\8`b=di0W\8_^kp+QT4Z]0XZ3[]2Y^JqvGpt4]aAjn͐¿ÖĖĕ׌ƘĖÚƜȘŕŚǜǞɝŞƣɣɤɤɤɥʧ˩ͦĞȼ̳іV|qIpm\SXRURorX{uib^`[Y]\__Y`bdeehgkdeedaddb`cdcbdcadfeb`c^]ac\ab]QwquZcadfhfeccdeedf_aaaecdeeghgigdbddbbidafnzzvmubqYs[vbpc|}to`[@e^%K@Ͽѳ˽οѦͿʿξ֠»Ӝֺͼи̻˵ŹɺɻʾҾϽҽϽϻͺ̼нѼϼϹͻϷ˳֬δ̳˲ʲʲʲʱɰȮƴ̯ǬİȲʫŬƬƧͬɮϯОÙƄymZ}Fkq5Z`FB<858-SV~tKik