Spanish translation of the article published in phrack 65, phook - The PEB Hooker: http://phrack.org/issues.html?issue=65&id=10#article http://www.phrack.org/ ==Phrack Inc.== Volume 0x0c, Issue 0x41, Phile #0x0a of 0x0f |=-----------------------------------------------------------------------=| |=---------------------=[ phook - The PEB Hooker ]=----------------------=| |=-----------------------------------------------------------------------=| |=-----------------------------------------------------------------------=| |=----------------=[ [Shearer] - eunimedesAThotmail.com ]=---------------=| |=----------------=[ Dreg - DregATfr33project.org ]=---------------=| |=-----------------------------------------------------------------------=| |=--=[ http://www.fr33project.org / Mirror: http://www.disidents.com ]=--=| |=-----------------------------------------------------------------------=| |=-------------------------=[ October 15 2007 ]=-------------------------=| |=-----------------------------------------------------------------------=| ------[ Index 0.- Antes de leer 1.- Introducción 2.- Conceptos previos 2.1 - Process Environment Block 2.1.1 - LoaderData 2.2 - Import Address Table 2.2.1 - Carga de la Import Address Table 2.3 - Inicio de un proceso en estado suspendido 2.4 - Inyección de una DLL en un proceso 2.5 - Hooks en ring3 2.5.1 - Problemas 3.- Diseño 3.1 - Pasos previos a PEB HOOKING 3.2 - Intercambio de datos en LoaderData 3.3 - Carga de módulos dinámicamente 3.4 - Reparación de la IAT 3.5 - Comienza la ejecución 3.6 - Las APIs que trabajan con módulos 3.7 - Un nuevo concepto: DLL MINIFILTER 3.8 - Problemas frecuentes 4.- phook 4.1 - InjectorDLL 4.2 - Console Control 4.3 - CreateExp 4.3.1 - Forwarder DLL 4.4 - ph_ker32.dll 4.4.1 - Los problemas con la pila 4.4.2 - Los problemas con los registros 4.4.3 - La macro JMP 4.4.4 - Versiones 4.5 - Usando phook 4.5.1 - DLL MINIFILTER 4.6 - Problemas frecuentes 5.- TODO 6.- Testing 7.- Ventajas y posibilidades 8.- Conclusión 9.- Agradecimientos 10.- Trabajos relacionados 11.- Referencias 12.- Código fuente ------[ 0.- Antes de leer Nomenclaturas: .- [T.Index]: trabajos relacionados (apartado 10). .- [R.Index]: referencias (apartado 11). Index es el identificador de la nomenclatura. Para entender el documento es necesario tener conocimiento en win32 de: - Tipos de ejecutables: - PE32 [R.3]: DLLs, EXE... - Programacion: - Uso de APIs [R.20]: LoadLibrary, GetModuleHandle ... - Hooks [R.10] [R.8] [...] - Win32 ASM [R.21]. Se usarán dos términos a lo largo de todo el documento: 1.- DLL_FAKE: DLL que suplantará a una DLL legítima (DLL_REAL). 2.- DLL_REAL: DLL que será suplantada por DLL_FAKE. Cada vez que se mencione la palabra hook/s se referirá a hook/s en win32, a no ser que se especifique lo contrario. ------[ 1.- Introducción Los hooks en win32 son muy usados para hacer ingenieria inversa, las motivaciones más comunes suelen ser el análisis de malware y sistemas de protección de software (packers). Los hooks también se suelen usar para monotorizar partes de un software: acceso a ficheros, sockets, modificación del registro ... Los métodos actuales para realizar hooks en ring3 (ver apartado 2.5) tienen diferentes problemas (ver apartado 2.5.1). El problema más importante para nosotros fue que cierto software los detectan. Hay sistemas de protección de software que son capaces de alterar el flujo de ejecución cuando detectan algún tipo de hook conocido, incluso los más sofisticados son capaces de eliminar algunos tipos de hooks y seguir el flujo de ejecucion normal. Otro problema surge cuando se intenta realizar un hook en los virus que rastrean las direcciones de las APIs en memoria, inutilizando algunos tipos de hooks como el IAT HOOKING (ver apartado 2.5). Hay sistemas de protección de software que usan algunas técnicas de virus y viceversa. Debido a estos problemas hemos creado phook, que usa un método poco documentado para realizar hooks en ring3 y además consigue que algunas técnicas de virus usen nuestro hook. Este documento explica como funciona phook y el método PEB HOOKING [T.1]. phook es una herramienta que usa PEB HOOKING [T.1] para realizar un hook de una DLL, también permite de forma interactiva realizar otras tareas: - Listar los módulos cargados. - Cargar una DLL. - Descargar una DLL. - ... El método PEB HOOKING [T.1] consiste en suplantar una DLL_REAL en memoria por una DLL_FAKE, de forma que todos los módulos de un proceso que usen la DLL_REAL pasen a usar la DLL_FAKE. ------[ 2 - Conceptos previos Para entender el método PEB HOOKING [T.1] y como funciona phook, es necesario tener claros ciertos conceptos: ------[ 2.1 - Process Environment Block El Process Environment Block (PEB) es una estructura [R.1] ubicada en el espacio de usuario, que contiene los datos de entorno del proceso [R.2]: - Variables de entorno. - Lista de módulos cargados. - Direcciones en memoria del Heap. - Si el proceso está siendo depurado. - ... ------[ CODE typedef struct _PEB { BOOLEAN InheritedAddressSpace; BOOLEAN ReadImageFileExecOptions; BOOLEAN BeingDebugged; BOOLEAN Spare; HANDLE Mutant; PVOID ImageBaseAddress; PPEB_LDR_DATA LoaderData; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; PVOID SubSystemData; PVOID ProcessHeap; PVOID FastPebLock; PPEBLOCKROUTINE FastPebLockRoutine; PPEBLOCKROUTINE FastPebUnlockRoutine; ... } PEB, *PPEB; ------[ END CODE Para realizar PEB HOOKING es necesario usar el campo LoaderData [T.1]. ------[ 2.1.1 - LoaderData Es una estructura [R.1] en la que se encuentran algunos datos de los módulos de un proceso. Se trata de una lista doblemente enlazada y que se puede recorrer segun tres criterios [R.2]: 1.- Orden de carga. 2.- Orden en memoria. 3.- Orden de inicialización. ------[ CODE typedef struct _PEB_LDR_DATA { ULONG Length; BOOLEAN Initialized; PVOID SsHandle; LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA; ------[ END CODE Cada campo flink y blink de LIST_ENTRY son en realidad punteros a LDR_MODULE. ------[ CODE typedef struct _LIST_ENTRY { struct _LIST_ENTRY * Flink; struct _LIST_ENTRY * Blink; } LIST_ENTRY,*PLIST_ENTRY; ------[ END CODE Los datos que vamos a manipular de LDR_MODULE para realizar PEB HOOKING son [T.1]: - BaseAddress: La base del módulo en memoria. - EntryPoint : Dirección donde se encuentra la primera instrucción a ejecutar del módulo. - SizeOfImage: Tamaño del módulo en memoria. ------[ CODE typedef struct _LDR_MODULE { LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; PVOID BaseAddress; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; ULONG Flags; SHORT LoadCount; SHORT TlsIndex; LIST_ENTRY HashTableEntry; ULONG TimeDateStamp; } LDR_MODULE, *PLDR_MODULE; ------[ END CODE ------[ 2.2 - Import Address Table La Import Address Table (IAT) es una tabla, que tienen los PE32 [R.3], la cual rellena el cargador de win32 en la carga de un módulo [R.4]. Los símbolos externos que necesita un módulo se llaman importaciones, los símbolos que un módulo proporciona a otros módulos se llaman exportaciones. En la IAT [R.3] de un módulo están las direcciones de sus importaciones, o dicho de otra manera, en la IAT [R.3] de un módulo están las direcciones de las exportaciones que usa de otros módulos. ------[ 2.2.1 - Carga de la Import Address Table Para que el cargador de win32 pueda obtener la exportación necesita conocer: el módulo en el que se encuentra, el nombre de la exportación y/o el ordinal [R.3]. Los PE32 tienen una estructura llamada IMAGE_IMPORT_DESCRIPTOR [R.5] en la que destacan los campos: - Name : Nombre del módulo donde se encuentran las exportaciones. - OriginalFirstThunk: Dirección de tabla donde se encuentran los nombres y/o los ordinales de las exportaciones que importa el módulo. - FirstThunk : Dirección de una tabla, idéntica a OriginalFirstThunk, en la que el cargador de win32 pone las direcciones de las importaciones. ------[ CODE typedef struct _IMAGE_IMPORT_DESCRIPTOR { DWORD OriginalFirstThunk; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; DWORD FirstThunk; } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; ------[ END CODE Cada entrada de la tabla de FirstThunk y OriginalFirstThunk tiene dos campos [R.3]: - Hint: si los primeros 31/63 bits son 0x80000000 se importa teniendo en cuenta solo el ordinal, en caso contrario se usará el nombre. Los bits 15-0 representan el ordinal. - Name: Dirección donde se se encuentra el nombre de la exportación. ------[ CODE typedef struct _IMAGE_IMPORT_BY_NAME { WORD Hint; BYTE Name[1]; } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; ------[ END CODE ------[ 2.3 - Inicio de un proceso en estado suspendido Cuando se quiere crear un proceso en estado suspendido hay que saber de que tipo es [R.6]: - Console - GUI Los procesos de tipo Console se pueden crear con la API CreateProcess y el flag CREATE_SUSPENDED. Los procesos de tipo GUI si se abren con el flag CREATE_SUSPENDED pueden no funcionar bien, así que hay que crearlos usando las APIs: 1.- CreateProcess : Se crea el proceso sin flag CREATE_SUSPENDED. 2.- WaitForInputIdle: Se espera a la correcta carga del proceso [R.6]. 3.- SuspendThread : Se suspende el hilo principal. ------[ 2.4 - Inyección de una DLL en un proceso Para inyectar una DLL en un proceso hay varios métodos [R.7], el método más simple es usando las APIs: 1.- VirtualAllocEx : Reservar memoria en el proceso. 2.- WriteProcessMemory: Escribir en el espacio reservado un código que cargue una DLL. 3.- CreateRemoteThread: Se crea un hilo en el proceso que ejecute el código escrito. 4.- VirtualFreeEx : Una vez cargada la DLL se libera la memoria reservada. ------[ 2.5 - Hooks en ring3 Siempre han existido varias formas de realizar "hooks" en win32, tanto en ring3 como en ring0. El problema de trabajar en ring0 es que si algo falla el SO puede volverse inestable. El método más estable para el SO es realizar el "hook" desde ring3. Los métodos más cónocidos son: - IAT HOOKING: Se modifican las entradas en la IAT [R.3], que pone el cargador de win32, para que apunten a otra zona [R.8]. - PUSH + RET: Se introduce en un area de código las instrucciones PUSH DIRECCION y RET para saltar a la dirección deseada. Generalmente es necesario pasar el control al area original, teniendo que restaurarla en un momento determinado [R.9]. - SetWindowHook...: Con estas APIs, se puede registrar una callback para diferentes eventos del sistema [R.10]. ------[ 2.5.1 - Problemas Algunos problemas en los métodos para realizar hooks en ring3: +-------------------------------------------------------------------------+ | Algunos Métodos | Algunos problemas | +------------------------+------------------------------------------------+ | IAT HOOKING [R.8] | 1.- Hay que cambiar la IAT [R.3] de todos los | | | los módulos cargados. | | | 2.- Un módulo no necesita IAT [R.3] para usar | | | símbolos exportados por otro. | | | 3.- Es muy conocido. | | | 4.- Fácil de reparar. | | | 5.- Puede ser detectable. | | | 6.- No permite control total desde el inicio. | |------------------------+------------------------------------------------| | PUSH + RET [R.9] | 1.- El método no es genérico para todas las | | | áreas de código. | | | 2.- Es complicado de implementar. | | | 3.- Fácil de reparar. | | | 4.- Puede ser detectable. | | | 5.- No permite control total desde el inicio. | |------------------------+------------------------------------------------| | Otros "hooks": | 1.- No permite control total. | | SetWindowHook... [R.10]| 2.- Fácil de reparar. | | | 3.- Puede ser detectable. | |------------------------+------------------------------------------------| | PEB HOOKING [T.1] | 1.- Es complicado de implementar. | | | 2.- La DLL original y la inyectada tienen que | | | exportar los mismos símbolos en el mismo | | | orden (como mínimo). | | | 3.- Puede ser detectable. | | | 4.- No permite control total desde el inicio. | +------------------------+------------------------------------------------+ Nota: Esta tabla solo representa la opinión de los autores. Las llamadas desde ring3 a ring0 usando SYSENTER no se pueden controlar mediante solo los métodos anteriores. Una llamada al sistema desde ring3 se puede realizar con SYSENTER [R.11] sin pasar por ninguna DLL, de tal forma que los métodos anteriores quedan inutilizados en esta situación poco común. Debido a los problemas anteriores, hemos decidido usar PEB HOOKING [T.1] para crear un motor que realiza más que "hooks": phook - The PEB Hooker. Nota: Las ventajas y posibilidades de PEB HOOKING [T.1] se explican en el apartado 7. ------[ 3.- Diseño En este apartado se hablará del diseño base para realizar PEB HOOKING [T.1] con éxito. La implementación no es complicada cuando se comprende por que se hace cada cosa. Los pasos: 1.- Cargar DLL_FAKE y DLL_REAL. 2.- En la lista que usa el cargador de win32, en la que se encuentran todos los módulos cargados en ese momento, hay que intercambiar varios campos entre DLL_FAKE y DLL_REAL. 3.- Es necesario que las IATs [R.3] de todos los módulos cargados, excepto DLL_REAL y quizás DLL_FAKE, apunten a las funciones que exporta la DLL_FAKE. ------[ 3.1 - Pasos previos a PEB HOOKING Es necesario antes de nada cargar en la memoria del proceso, al que se quiere realizar PEB HOOKING [T.1], una DLL_FAKE. La DLL_FAKE debe tener como mínimo las mismas exportaciones y en el mismo orden que DLL_REAL. ------[ 3.2 - Intercambio de datos en LoaderData Es necesario buscar DLL_FAKE y DLL_REAL por algun campo identificativo de LDR_MODULE, una vez encontrados se intercambiarán los siguientes datos: - EntryPoint - BaseAddress - SizeOfImage (casi siempre) La búsqueda usando el campo BaseDllName obtendrá los datos del LDR_MODULE perteneciente a DLL_FAKE. Algunos virus, packers y APIs usan esta forma de búsqueda para encontrar la BaseAddress o EntryPoint de un módulo. El campo SizeOfImage es necesario cambiarlo en caso de que DLL_FAKE y DLL_REAL no tengan el mismo tamaño en memoria. Flujo de búsqueda de BaseAddress de kernel32.dll en un proceso sin PEB HOOKING [T.1]: 0 +---------------------------------+ [ process ] ---------+ | Process Environment Block (PEB) | | |---------------------------------| | | InheritedAddressSpace | | | ReadImageFileExecOptions | | | BeingDebugged | | | Spare | | | Mutant | | | ImageBaseAddress | +->| LoaderData |--+ | ... | | +---------------------------------+ | 1 | | +--------------------------------------------------------------+ | +----------------------------+ +----------------------------+ | | LoaderData | | LDR_MODULE | | +----------------------------+ |----------------------------| flink | | Length | | InLoadOrderModList |-----+ | | Initialized | | InMemoryOrderModList | | | | SsHandle | | InInitOrderModList | | +->| InLoadOrderModList | 2 | ... | | | InMemoryOrderModList |---->| BaseDllName "ntdll.dll" |---+ | | InInitOrderModList - Flink | +----------------------------+ | | +----------------------------+ +------------------------------------+ | | +----------------------------+ | | | LDR_MODULE (DLL_REAL) | | | |----------------------------| | | | InLoadOrderModList | 6 | +---------------------+ 3 | | InMemoryOrderModList | | | ¿Es "kernel32.dll"? |<-------+ | InInitOrderModList | | +---------------------+ | BaseAddress 7C801000 | | 8 | |4 ^ 7 | ... | | Si <-+ +-> No +-------------| BaseDllName "kernel32.dll" |<----+ | | 5 | ... | 9 | v +----------------------------+ | NextLdrModule(); v kernel32.dll = 7C801000 Flujo de búsqueda de BaseAddress de kernel32.dll en el proceso anterior con PEB HOOKING [T.1]: 0 +---------------------------------+ [ process ] ---------+ | Process Environment Block (PEB) | | |---------------------------------| | | InheritedAddressSpace | | | ReadImageFileExecOptions | | | BeingDebugged | | | Spare | | | Mutant | | | ImageBaseAddress | +->| LoaderData |--+ | ... | | +---------------------------------+ | 1 | | +--------------------------------------------------------------+ | +----------------------------+ +----------------------------+ | | LoaderData | | LDR_MODULE | | +----------------------------+ |----------------------------| flink | | Length | | InLoadOrderModList |-----+ | | Initialized | | InMemoryOrderModList | | | | SsHandle | | InInitOrderModList | | +->| InLoadOrderModList | 2 | ... | | | InMemoryOrderModList |---->| BaseDllName "ntdll.dll" |---+ | | InInitOrderModList - Flink | +----------------------------+ | | +----------------------------+ +------------------------------------+ | | +----------------------------+ | | | LDR_MODULE (DLL_REAL) | | | |----------------------------| 6 | | | InLoadOrderModList | | +---------------------+ 3 | | InMemoryOrderModList |flink| | ¿Es "kernel32.dll"? |<-------+ | InInitOrderModList |--+ | +---------------------+ | BaseAddress 7C801000 | | | 12 | |4-8 ^ ^ 7 | ... | | | Si <-+ +-> No | +-------------| BaseDllName "old_k32.dll" |<-|--+ | 5-9 | +------------+ | ... | | 13 | v | +----------------------------+ | | NextLdrModule(); +-+ | v | +----------------------------+ | kernel32.dll = 005C5000 | | LDR_MODULE (DLL_FAKE) | | 10 | |----------------------------| | 11 | | InLoadOrderModList | | | | InMemoryOrderModList | | | | InInitOrderModList | | | | BaseAddress 005C5000 | | | | ... | | +-| BaseDllName "kernel32.dll" |<+ | ... | +----------------------------+ Resultados de la búsqueda en el proceso: 1.- BaseAddress sin PEB HOOKING [T.1]: 7C801000 (DLL_REAL) 2.- BaseAddress con PEB HOOKING [T.1]: 005C5000 (DLL_FAKE) PD: Generalmente buscando por InLoadOrderModList, el primer campo que aparece es el LDR_MODULE correspondiente al módulo principal. En el ejemplo se ha omitido por motivos de claridad. ------[ 3.3 - Carga de módulos dinámicamente Cuando un proceso, en el que se ha hecho PEB HOOKING [T.1], carga un módulo dinámicamente [R.12] que tenga importaciones de DLL_REAL, automáticamente se cargará su IAT [R.3] con las exportaciones necesarias de DLL_FAKE. ------[ 3.4 - Reparación de la IAT Excepto en los módulos DLL_FAKE y DLL_REAL, se deben reemplazar todas las IATs [R.3] que tengan exportaciones de DLL_REAL por las correspondientes de DLL_FAKE. La IAT [R.3] de DLL_FAKE no se debe cambiar en caso de necesitar usar las exportaciones de DLL_REAL. Si se ha modificado la IAT [R.3] de DLL_FAKE para que las exportaciones de DLL_REAL sean las de DLL_FAKE, una llamada a una exportación de DLL_REAL desde la misma exportación de DLL_FAKE, entrará en un bucle recursivo infinito, causando un desbordamiento de la pila. +--------------------------+ +--------------------------------+ | .text DLL_FAKE | | IAT | |--------------------------| |--------------------------------| | ... | | LocalAlloc 1 (Nr_LocalAlloc) | | PUSH EBP | +->| LoadLibrary 2 (Nr_LoadLibrary) |--+ | MOV EBP, ESP | | | .... | | | ... | | +--------------------------------+ | | LoadLibrary_FAKE: | | | +->| PUSH original_lib_name | | 0 | | | CALL IAT[Nr_LoadLibrary] |--+ | | | ... | | | | POP EBP | | | | RET | | | | ... | | | +--------------------------+ | | 1 | +-----------------------------------------------------------------------+ El problema real es que nos estamos llamando a nosotros mismos ya sea directa o indirectamente por una o varias DLLs. No se debe reparar la IAT [R.3] de un módulo cualquiera (DLL_ANY), cuando DLL_FAKE llama a una exportación de DLL_ANY que a su vez llama a una exportación de DLL_FAKE que implique volver a llamar a la misma exportación directa o indirectamente de DLL_ANY. Flujo de una llamada a RtlHeapAlloc, cuando se ha hecho PEB HOOKING [T.1] sobre NTDLL.DLL y se ha cambiado la IAT de kernel32.dll: Ejemplo: [ proceso ] | | CALL RtlHeapAlloc CALL LoadLibrary +-------------------> [DLL_FAKE ntdll.dll] ------------------+ 0 ^ 1 | | CALL RtlInitUnicodeString v +--------------------------- [DLL_ANY kernel32.dll] 2 Flujo de una llamada a RtlHeapAlloc, cuando se ha hecho PEB HOOKING [T.1] sobre NTDLL.DLL y NO se ha cambiado la IAT [R.3] de kernel32.dll: [ proceso ]<----------------+ | 4 | | CALL RtlHeapAlloc | CALL LoadLibrary +-------------------> [ DLL_FAKE ntdll.dll] ------------------+ 0 ^ 1 | +------------------+ | | 3 | | CALL RtlInitUnicodeString v [DLL_REAL old_nt.dll] <--------------------------- [DLL_ANY kernel32.dll] 2 Nota: El esquema se ha simplificado, omitiendo el resto de llamas de DLL_FAKE. Flujo de una llamada normal a LoadLibrary en un proceso (sin PEB HOOKING [T.1]): CALL IAT[Nr_LoadLibrary] +--------------------------------+ [process] -------------------------+ | IAT | ^ 0 | |--------------------------------| | | | LocalAlloc 1 (Nr_LocalAlloc) | | +-----------------------+ +->| LoadLibrary 2 (Nr_LoadLibrary) |-+ | | DLL_REAL kernel32.dll | | .... | | | |-----------------------| +--------------------------------+ | | | ... | 1 | | | LoadLibrary: | <--------------------------------------+ | 2 | PUSH EBP | | | MOV EBP, ESP | | | ... | | | POP EBP | +----| RET | | ... | +-----------------------+ El flujo es normal y pasa directamente por DLL_REAL. Flujo de una llamada a LoadLibrary en un proceso con PEB HOOKING [T.1]: CALL IAT[Nr_LoadLibrary] +--------------------------------+ [process] -------------------------+ | IAT | ^ 0 | |--------------------------------| | | | LocalAlloc 1 (Nr_LocalAlloc) | | +-------------------------+ +->| LoadLibrary 2 (Nr_LoadLibrary) |-+ | | DLL_FAKE kernel32.dll | | .... | | | |-------------------------| +--------------------------------+ | 4 | | ... | 1 | | | Own_LoadLibrary: | <--------------------------------------+ | | PUSH EBP | | | MOV EBP, ESP | +-----------------------------+ | | // Own functions... | 2 | DLL_REAL old_k32.dll | | | CALL IAT[Nr_LoadLibrary]|----+ |-----------------------------| | | POP EBP |<-+ | | ... | +--| RET | | +->| LoadLibrary: | | ... | | | PUSH EBP | +-------------------------+ | | MOV EBP, ESP | | | ... | 3 | | POP EBP | | | RET |--+ | | ... | | | +-----------------------------+ | +-------------------------------------+ Como se puede observar el flujo pasa antes por DLL_FAKE. Después DLL_FAKE llama a LoadLibrary original (DLL_REAL). ------[ 3.5 - Comienza la ejecución Una vez realizado todos los pasos anteriores es el momento de empezar a ejecutar el proceso y ver si todo funciona. ------[ 3.6 - Las APIs que trabajan con módulos Las APIs LoadLibrary, GetModuleHandle, EnumProcessModules [R.12] ... usan el campo LoaderData del PEB [T.1]. Esto quiere decir que siempre que intenten algo contra la DLL_REAL estarán tratando con DLL_FAKE, por ejemplo: Se ha realizado PEB HOOKING [T.1] a USER32.DLL: - DLL_FAKE - Nombre en memoria: USER32.DLL - BaseAddress: 00435622 - DLL_REAL - Nombre en memoria: OLD_U32.DLL - BaseAddress: 77D10000 El proceso intenta obtener la base de USER32.DLL: - HMODULE user32 = GetModuleHandle( "user32.dll" ); Después de ejecutar GetModuleHandle [R.12] la variable user32 valdrá: 00435622 (BaseAddress de DLL_FAKE). Si el proceso después hace un GetProcAddress [R.12] sobre alguna función exportada por USER32.DLL, obtendrá la función de DLL_FAKE. Gracias a PEB HOOKING [T.1] ya no es necesario cambiar el comportamiento de las APIs que trabajan con módulos para que usen DLL_FAKE. ------[ 3.7 - Un nuevo concepto: DLL MINIFILTER DLL MINIFILTER es el nombre que hemos dado a la capacidad por la cual una llamada a una exportación pueda pasar por varias DLL_FAKE. Una de las ventajas más importantes del método es la de extender o limitar funcionalidades de forma modular a la llamada de una exportación. Cuando se hace PEB HOOKING [T.1] sobre una DLL_FAKE, el término DLL_REAL para la nueva DLL_FAKE, pasa a ser la DLL_FAKE anterior, creando así una pila de DLL_FAKEs. El flujo pasará desde la última DLL_FAKE, con la que se ha hecho PEB HOOKING [T.1], hasta la DLL_REAL, en caso de que todas las DLL_FAKEs llamen a la exportación original. Flujo de una llamada de un proceso, con PEB HOOKING [T.1], con una sola DLL_FAKE: 0 1 [proceso] --> [DLL_FAKE] --> [DLL_REAL] ^ | | 2 | +----------------------------+ Flujo de una llamada de un proceso, con PEB HOOKING [T.1], con tres DLL_FAKEs: 0 1 2 3 [proceso] --> [DLL_FAKE 3] --> [DLL_FAKE 2] --> [DLL_FAKE 1] --> [DLL_REAL] ^ | | 4 | +---------------------------------------------------------------+ En los ejemplos anteriores, todas las DLL_FAKEs pasan el control a la DLL_REAL correspondiente. ------[ 3.8 - Problemas frecuentes A la hora de realizar PEB HOOKING [T.1] pueden ocurrir ciertos problemas, a continuación se muestra una tabla con los problemas y las posibles soluciones: +-------------------------------------------------------------------------+ | Problema | Posible/s Solución/es | |-------------------------------+-----------------------------------------| | - Falla el PEB HOOKING [T.1] | - Comprobar que se pueden intercambiar | | | los campos necesario en el PEB [T.1]. | | | - Comprobar si se tienen los permisos | | | correctos para cambiar las IATs [R.3] | | | necesarias. | |-------------------------------+-----------------------------------------| | - Falla la ejecución del | - Comprobar que se recorre bien el PEB | | proceso | [R.1]. | | | - Comprobar si se recorren bien las | | | IATs [R.3] de todos los módulos del | | | del proceso. | | | - Comprobar si se han restaurado los | | | permisos en memoria modificados en el | | | PEB HOOKING [T.1]. | +-------------------------------------------------------------------------+ ------[ 4.- phook phook es capaz de realizar PEB HOOKING [T.1] (y otras cosas) de una manera sencilla. phook es un proyecto de varios módulos: - InjectorDLL: Programa que crea un proceso suspendido de forma y le inyecta una DLL. - Console Control: DLL que se inyecta en el proceso en el que deseemos hacer PEB HOOKING [T.1]. Permite hacer PEB HOOKING [T.1] y otras tareas de forma interactiva mediante una consola de comandos por sockets. - CreateExp: Programa que genera a partir de una DLL_REAL el código fuente necesario para realizar una DLL_FAKE. - ph_ker32.dll: DLL_FAKE de kernel32.dll. ph_ker32.dll monotoriza el acceso a las APIs: CreateFileA y CreateFileW [R.14]. ------[ 4.1 - InjectorDLL Programa que crea un proceso suspendido y le inyecta una DLL. Para inyectar la DLL C:\console.dll en el proceso correspondiente a C:\poc.exe: - Especificar el tipo de proceso: - CONSOLE: - InjectorDLL.exe C:\console.dll -c C:\poc.exe - GUI: - InjectorDLL.exe C:\console.dll -g C:\poc.exe - No especificar el tipo de proceso - InjectorDLL.exe C:\console.dll -u C:\poc.exe InjectorDLL, con el parámetro -u, suele detectar si un proceso es GUI o Console para saber como crearlo suspendido (ver apartado 2.3). El método que hemos creado consiste en crear el proceso con la API CreateProcess y el flag CREATE_SUSPENDED [R.6]. Después se llama a WaitForInputIdle, si la espera falla se trata de un proceso Console, en caso contrario será GUI. ------[ CODE CreateProcess ( program_name , NULL , NULL , NULL , FALSE , CREATE_SUSPENDED | CREATE_NEW_CONSOLE , NULL , NULL , pstart_inf , ppro_inf ) // Hay que comprobar la creación correcta del proceso... if ( WaitForInputIdle( ppro_inf->hProcess, 0 ) == WAIT_FAILED ) // "Console process" else // "GUI process" ------[ END CODE Una vez que se sabe el tipo de proceso, ya se sabemos como crearlo suspendido correctamente (ver apartado 2.3). Nota: el método puede no funcionar siempre, en alguna ocasión un "Console process" lo detecta como "GUI process". El código que carga la DLL se mete en una estructura llamada LOADER_DLL_s (ver apartado 2.3). LOADER_DLL_s se carga con las instrucciones en ensamblador y los datos necesarios. Hay que escribir en el proceso creado la estructura LOADER_DLL_s y llamar a CreateRemoteThread, pasándole como entrypoint el inicio de la estructura, para que se ejecute el código de LOADER_DLL_s. Una vez cargada la DLL se suspende el hilo desde el cual se está ejecutando LOADER_DLL_s y incrementa un flag para indicarlo. ------[ CODE typedef struct LOADER_DLL_s { /* - CODE ------------------------------------------------------ */ PUSH_ASM_t push_name_dll; /* PUSH "DLL_INJECT.DLL"*/ CALL_ASM_t call_load_library; /* CALL LoadLibraryA */ CALL_ASM_t call_get_current_thread; /* CALL GetCurrentThread*/ INC_BYTE_MEM_t inc_flag; /* INC [FLAG] */ char PUSH_EAX; /* PUSH EAX */ CALL_ASM_t call_suspendthread; /* CALL SuspendThread */ /* - DATA ------------------------------------------------------ */ char name_dll[MAX_PATH]; /* DLL_INJECT.DLL'\0' */ char flag; /* [FLAG] */ } LOADER_DLL_t; ------[ END CODE ------[ 4.2 - Console Control Console Control es la DLL que se inyecta en el proceso en el que se quiera hacer PEB HOOKING [T.1]. Permite hacer PEB HOOKING [T.1] y otras tareas de forma interactiva mediante una consola de comandos por sockets. El puerto que escucha lo escribe en el fichero C:\ph_listen_ports.log, con la nomenclatura PID - PORT. Ejemplo de un proceso con PID 2456, escuchando en el puerto 1234: 2456 - 1234. Actualmente tiene la siguiente lista de comandos: help - Muestra esta pantalla exit - Cierra y descarga la consola suspend - Pausa la ejecución del programa resume - Resume la ejecución del programa showmodules - Muestra la lista de modulos load [param1] - Carga en memoria la biblioteca especificada en [param1] unload [param1] - Descarga una biblioteca en memoria especificada en [param1] pebhook [param1] [param2] - Realiza PEB HOOKING [T.1] sobre una dll [param1]: Nombre de la dll original [param2]: Ruta a la DLL_FAKE Es facil entender cada uno de los comandos que admite nuestra consola, asi que explicaremos el funcionamiento de "showmodules", "pebhook" y "suspend". El comando "showmodules" realiza una búsqueda en el PEB [R.1] de los módulos cargados sin usar APIs. pebhook es el comando que realiza todo el proceso de PEB HOOKING (ver apartado 3). Si se quiere hacer PEB HOOKING [T.1] sobre kernel32.dll, usando como DLL_FAKE "C:\phook\bin\windows_xp_sp2\ph_ker32.dll", para el SO Windows XP SP2, solo es necesario enviar el comando: - pebhook kernel32.dll c:\phook\bin\windows_xp_sp2\ph_ker32.dll El comando suspend es capaz de suspender la ejecución del hilo principal del proceso. El TID del hilo principal se obtiene recorriendo los THREADENTRY32 [R.13] del sistema hasta llegar al primero del proceso: ------[ CODE BOOL GetMainThreadId( DWORD * thread_id ) { HANDLE hThreadSnap; THREADENTRY32 th32; BOOL return_function; DWORD process_id; process_id = GetCurrentProcessId(); hThreadSnap = INVALID_HANDLE_VALUE; return_function = FALSE; hThreadSnap = \ CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, process_id ); if( hThreadSnap == INVALID_HANDLE_VALUE ) { ShowGetLastErrorString ( " GetMainThreadId() - CreateToolhelp32Snapshot()" ); return FALSE; } th32.dwSize = sizeof( THREADENTRY32 ); if( !Thread32First( hThreadSnap, & th32 ) ) ShowGetLastErrorString( "GetMainThreadId() - Thread32First()"); do { if ( th32.th32OwnerProcessID == process_id ) { * thread_id = th32.th32ThreadID; return_function = TRUE; } } while ( Thread32Next( hThreadSnap, & th32 ) && return_function != TRUE ); CloseHandle( hThreadSnap ); return return_function; } ------[ END CODE ------[ 4.3 - CreateExp CreateExp es un programa que genera a partir de una DLL_REAL el código fuente necesario para realizar una DLL_FAKE. Actualmente crea los ficheros .c y .def, para usar con mingw. Para crear una DLL_FAKE de kernel32.dll es necesario ejecutar: - CreateExp C:\WINDOWS\SYSTEM32\KERNEL32.DLL C:\ph_ker32 Si ha funcionado bien se crearán los ficheros C:\ph_ker32.c y C:\ph_ker32.def ph_ker32.c contiene las definiciones de las exportaciones de kernel32.dll y salta automáticamente a las originales. ph_ker32.def contiene los alias y los nombres de las exportaciones de kernel32.dll. Por defecto las exportaciones de DLL_FAKE saltarán a la exportación correspondiente de DLL_REAL. ------[ 4.3.1 - Forwarder DLL CreateExp tranforma las Forwarder DLL [R.3] en exportaciones, así que se puede hacer PEB HOOKING de una función Forwarder. Ejemplo: kernel32.dll tiene como Forwarder HeapAlloc que va a la exportación RtlAllocateHeap de NTDL.DLL. Cuando un módulo importa HeapAlloc de kernel32.dll, automáticamente el Loader de win32 pone la dirección de la exportación de NTDLL.DLL y nunca pasa por kernel32.dll: CALL HeapAlloc [proceso] ------------------> [NTDLL.DLL] ^ 0 | +-------------------------------+ 1 Si se crea una DLL_FAKE de kernel32.dll con CreateExp, el flujo será: CALL HeapAlloc (DLL_FAKE) [proceso] ------------------> [KERNEL32.DLL] --------> [NTDLL.DLL] ^ 0 1 | +-----------------------------------------------------+ 2 De tal forma que podemos implementar un hook de HeapAlloc (kernel32.dll). ------[ 4.4 - ph_ker32.dll ph_ker32.dll fue creado para hacer PEB HOOKING [T.1] a kernel32.dll; monotoriza el acceso a las APIs "CreateFileA" y "CreateFileW" [R.14], y cuando se llama a cualquier otra API automáticamente se salta la original. Para facilitar el salto a una API se ha creado la macro JMP, hay que pasarle el nombre de la DLL y el ordinal de la exportación (para ver la macro JMP ver apartado 4.4.2). ph_ker32.c creado con CreateExp (se ha omitido la macro JMP): ------[ CODE #define FAKE_LIB "ph_ker32.dll" DLLEXPORT void _ActivateActCtx ( void ) { JMP( FAKE_LIB, 1 ); } DLLEXPORT void _AddAtomA ( void ) { JMP( FAKE_LIB, 2 ); } DLLEXPORT void _AddAtomW ( void ) { JMP( FAKE_LIB, 3 ); } DLLEXPORT void _AddConsoleAliasA ( void ) { JMP( FAKE_LIB, 4 ); } .... ------[ END CODE Hay que recordar que una vez se ha realizado PEB HOOKING [T.1], kernel32.dll tendrá de nombre ph_ker32.dll, por eso se indica ph_ker32.dll en la constante simbólica FAKE_LIB. ph_ker32.def creado con CreateExp: ------[ CODE LIBRARY default EXPORTS ActivateActCtx=_ActivateActCtx @ 1 AddAtomA=_AddAtomA @ 2 AddAtomW=_AddAtomW @ 3 ... ------[ END CODE Por motivos de claridad la implementación de las APIs CreateFileA y CreateFileW [R.14] se ha puesto en el fichero owns.c. Cuando se llama a CreateFileA y a CreateFileW [R.14] se escribe el parámetro lpFileName en el fichero C:\CreateFile.log owns.c: ------[ CODE #define FILE_LOG C:\CreateFile.log DLLEXPORT HANDLE _stdcall _CreateFileW ( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { char asc_str[MAX_PATH]; if ( UnicodeToANSI( (WCHAR *) lpFileName, asc_str ) == 0 ) CreateFileLogger( asc_str ); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDistribution, dwFlagsAndAttributes, hTemplateFile ); } DLLEXPORT HANDLE _stdcall _CreateFileA ( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { char asc_str[MAX_PATH]; CreateFileLogger( lpFileName ); return CreateFileA( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDistribution, dwFlagsAndAttributes, hTemplateFile ); } static void CreateFileLogger( const char * file_to_log ) { HANDLE file; DWORD chars; file = \ CreateFileA ( FILE_LOG , GENERIC_WRITE | GENERIC_READ , 0 , NULL , OPEN_ALWAYS , 0 , NULL ); if ( file != INVALID_HANDLE_VALUE ) { if ( SetFilePointer( file, 0, NULL, FILE_END ) != -1 ) { WriteFile ( file, file_to_log, strlen( file_to_log ), &chars, NULL ); WriteFile( file, "\x0D\x0A", 2, &chars, NULL ); } CloseHandle( file ); } } ------[ END CODE ------[ 4.4.1 - Los problemas en la pila Cuando se quiere pasar el control directamente a una API a la que no se conoce el prototipo de forma genérica, hay que pasarle la pila intacta a la API original. Esto se consigue en mingw con la opción del compilador -fomit-frame-pointer [R.15] y un JMP (ASM) a la API original. Las funciones que se implementan hay que ponerlas prototipo y deben ser de tipo _stdcall. Las funciones de tipo _stdcall tienen una sintaxis diferente en el fichero .def: - Nombre_exportacion=Alias@argumentos * 4 @ Ordinal Ejemplo de fichero .def con las APIs de tipo _stdcall CreateFileA y CreateFileW [R.14] (las dos tienen siete argumentos): ------[ CODE LIBRARY ph_ker32 EXPORTS ; Name Exp | Alias | Nº Args * 4 | Ordinal Windows XP SP2 CreateFileW=_CreateFileW@28 @ 83 CreateFileA=_CreateFileA@28 @ 80 ------[ END CODE Las funciones de tipo _stdcall no se deben compilar con la opción -fomit-frame-pointer [R.15]. ------[ 4.4.2 - Los problemas con los registros No solo es necesario pasar la pila intacta a una exportación, en ocasiones las exportaciones usan directamente valores de los registros directamente. Antes de pasar el control a la exportación original es necesario dejar los registros intactos, esto se consigue metiendo entre el código las instrucciones PUSHAD y POPAD: [PUSHAD] [ CÓDIGO NECESARIO PARA SALTAR A LA EXPORTACIÓN ] [POPAD] Un ejemplo de exportación que usa directamente los registros es _chkstk de NTDLL.DLL: _chkstk en NTDLL.DLL (WINDOWS XP SP2): ------[ CODE 7C911A09 >/$ 3D 00100000 CMP EAX,1000 7C911A0E |. 73 0E JNB SHORT ntdll.7C911A1E 7C911A10 |. F7D8 NEG EAX 7C911A12 |. 03C4 ADD EAX,ESP 7C911A14 |. 83C0 04 ADD EAX,4 7C911A17 |. 8500 TEST DWORD PTR DS:[EAX],EAX 7C911A19 |. 94 XCHG EAX,ESP 7C911A1A |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 7C911A1C |. 50 PUSH EAX 7C911A1D |. C3 RETN 7C911A1E |> 51 PUSH ECX 7C911A1F |. 8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8] 7C911A23 |> 81E9 00100000 /SUB ECX,1000 7C911A29 |. 2D 00100000 |SUB EAX,1000 7C911A2E |. 8501 |TEST DWORD PTR DS:[ECX],EAX 7C911A30 |. 3D 00100000 |CMP EAX,1000 7C911A35 |.^73 EC \JNB SHORT ntdll.7C911A23 7C911A37 |. 2BC8 SUB ECX,EAX 7C911A39 |. 8BC4 MOV EAX,ESP 7C911A3B |. 8501 TEST DWORD PTR DS:[ECX],EAX 7C911A3D |. 8BE1 MOV ESP,ECX 7C911A3F |. 8B08 MOV ECX,DWORD PTR DS:[EAX] 7C911A41 |. 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4] 7C911A44 |. 50 PUSH EAX 7C911A45 \. C3 RETN ------[ END CODE ------[ 4.4.3 - La macro JMP La macro JMP es necesaria ya que no siempre se tienen en la cabecera de una DLL (fichero .h) todas sus declaraciones. Con la macro JMP se obtiene la dirección de la exportación con GetProcAddress [R.12] en tiempo de ejecución. ------[ CODE unsigned long tmp; #define JMP( lib, func ) \ asm ( "pushad" ); \ asm \ ( \ " push edx \n" \ " push %1 \n" \ " call eax \n" \ " pop edx \n" \ " push %2 \n" \ " push eax \n" \ " call edx \n" \ " mov %4, eax \n" \ " popad \n" \ \ : : \ "a" (GetModuleHandle) , \ "g" (lib) , \ "g" (func) , \ "d" (GetProcAddress) , \ "g" (tmp) \ ); \ asm ( "jmp %0" : : "g" (tmp) ); ------[ END CODE El código es para mingw [R.16] con la opción del compilador -masm=intel. ------[ 4.4.4 - Versiones Hemos incluidos en phook varias versiones de ph_ker32 para los sistemas: - Windows XP SP2 v5.1.2600 - Windows Server 2003 R2 v5.2.3790 - Windows Vista v6.0.6000 Código fuente en ph_ker32/SO y binarios en bin/SO. ------[ 4.5 - Usando phook Imaginemos que queremos hacer PEB HOOKING [T.1] a kernel32.dll con ph_ker32.dll, se ha elegido el programa poc.exe para el ejemplo (viene el carpeta bin\ de phook). Pasos a seguir: 1.- Ejecutar InjectorDLL indicando un programa a ejecutar y la DLL de la consola que se inyectará en el proceso: - InjectorDLL.exe console.dll -u poc.exe El proceso se quedará en estado suspendido y habrá un socket escuchando en el puerto indicado en el fichero C:\ph_listen_ports.log C:\phook\bin>InjectorDll.exe console.dll -u poc.exe ________________________________________________________________ | InjectorDLL v1.0 | | | | Juan Carlos Montes eunimedes@hotmail.com | | David Reguera Garcia Dreg@fr33project.org / Dreg@7a69ezine.org | | -------------------------------------------------------------- | | http://www.fr33project.org | |________________________________________________________________| Showing injection data ..... Program to inject : poc.exe Library to inject: console.dll [OK] - CONSOLE. [OK] - Create process: [INFO] PID: 0x0960 [INFO] P. HANDLE: 0x000007B8 [INFO] TID: 0x0AE0 [INFO] T. HANDLE: 0x000007B0 [INFO] - Injecting DLL... [OK] - Allocate memory in the extern process. [INFO] - Address reserved on the other process: 0x00240000 [INFO] - Space requested: 306 [OK] - Creating structure for the dll load. [OK] - Writing structure for the dll load. [OK] - Creating remote thread. [INFO] - Thread created with TID: 0x0B28 [INFO] - Attempt: 1 [INFO] - Thread has entered suspension mode. [OK] - Injection thread ended. [OK] - Memory in remote thread freed. [OK] - DLL injected. [OK] - Injection ended. 2.- Es necesario conectarse con un cliente de tipo netcat al puerto abierto, en este caso: 1234. C:\>nc 127.0.0.1 1234 ________________________________________________________________ | Phook Prompt v1.0 | | Juan Carlos Montes eunimedes@hotmail.com | | David Reguera Garcia Dreg@fr33project.org / Dreg@7a69ezine.org | | -------------------------------------------------------------- | | http://www.fr33project.org | |________________________________________________________________| ph > help _________________________________________________________________ | Phook Prompt v1.0 | | | | Command list: | | --------------------------------------------------------------- | | help - Shows this screen | | exit - Closes and unloads the console | | suspend - Pauses the programs execution | | resume - Resumes the programs execution | | showmodules - Shows the modules list | | load [param1] - Loads in memory the library | | especified in [param1] | | unload [param1] - Unloads a librery in memory | | especified in [param1] | | pebhook [param1] [param2] - Performs PEB Hook over a dll | | [param1]: Name of the original dll | | [param2]: Path to the DLL hook | |_________________________________________________________________| 3.- Se realiza PEB HOOKING [T.1] a kernel32.dll con la ph_ker32.dll: ph > pebhook kernel32.dll C:\phook\bin\windows_xp_sp2\ph_ker32.dll 4.- Se envía el comando resume para que empiece la ejecución del proceso. ph > resume ph > C:\phook\bin> 5.- poc.exe crea los ficheros en C:\ - file - file2 - file3 6.- ph_ker32.dll registra las llamadas con éxito a las APIs CreateFileA y CreateFileW [R.14] en el fichero C:\CreateFile.log 7.- C:\>more CreateFile.log C:\file1 C:\file2 C:\file3 ------[ 4.5.1 - DLL MINIFILTER phook permite realizar DLL MINIFILTER (ver apartado 3.7) de una manera sencilla. Solo hay que realizar PEB HOOKING [T.1], con el comando pebhook, sobre el nombre de DLL_FAKE, que es el que tenía la primera DLL_REAL. Suponiendo que tenemos dos DLL_FAKEs: - ph_ker32_1.dll: Monotoriza acceso a las APIs CreateFile [R.14]. - ph_ker32_2.dll: Monotoriza el acceso de las API ReadFile [R.17]. Realizar DLL MINIFILTER es tan sencillo como: C:\>nc 127.0.0.1 1234 ________________________________________________________________ | Phook Prompt v1.0 | | Juan Carlos Montes eunimedes@hotmail.com | | David Reguera Garcia Dreg@fr33project.org / Dreg@7a69ezine.org | | -------------------------------------------------------------- | | http://www.fr33project.org | |________________________________________________________________| ph > pebhook kernel32.dll C:\phook\bin\windows_xp_sp2\ph_ker32_1.dll ph > pebhook kernel32.dll C:\phook\bin\windows_xp_sp2\ph_ker32_2.dll Flujo de una llamada del proceso a kernel32.dll: 0 1 2 [proceso] --> [ph_ker32_2.dll] --> [ph_ker32_2.dll] -> [kernel32.dll] ^ | | 3 | +------------------------------------------------------+ ------[ 4.6 - Problemas frecuentes Además de los problemas del apartado 3.8, existen otros: +-------------------------------------------------------------------------+ | Problema | Posible/s Solución/es | |-------------------------------+-----------------------------------------| | - Falla la compilación de | - Comprobar que no se repiten las | | DLL_FAKE | funciones que van directamente a | | | DLL_REAL y las que se implementan. | | | - Comprobar que las funciones | | | implementadas (que deben ser de tipo | | | _stdcall) están bien definidas en el | | | fichero .def (ver apartado 4.4.1). | |-------------------------------+-----------------------------------------| | - Falla la ejecución del | - Comprobar que las funciones que van | | proceso | directamente a DLL_REAL han sido | | | compiladas con la opcion | | | -fomit-frame-pointer (ver apartado | | | 4.4.1). | | | - Comprobar que las funciones | | | implementadas son de tipo _stdcall. | | | - Comprobar que DLL_FAKE se ha creado | | | a partir de la DLL_REAL y no de otra. | | | - Comprobar si InjectorDLL ha detectado | | | correctamente el tipo real de proceso | | | (GUI o CONSOLE). | |-------------------------------+-----------------------------------------| | - No se puede conectar a | - Comprobar que el puerto 1234 está | | la consola | abierto antes de hacer PEB HOOKING | | | [T.1]. | | | - Comprobar bloqueos de firewall... | | | - Comprobar que se ha indicado la ruta | | | completa de console.dll en | | | InjectorDLL. | |-------------------------------+-----------------------------------------| | - No funciona InjectorDLL | - Comprobar que se tienen privilegios | | | para inyectar una DLL | | | (CreateRemoteThread..) | | | - Comprobar bloqueo de anti-virus... | |-------------------------------+-----------------------------------------| | - No funciona CreateExp | - Comprobar que la ruta de DLL_REAL es | | | un PE32 correcto y que el EXPORT | | | DIRECTORY no está corrupto [R.3]. | +-------------------------------------------------------------------------+ Pueden existir otros problemas debidos a fallos de programación y/o de diseño. ------[ 5.- TODO Actualmente estamos intentando: - Realizar PEB HOOKING [T.1] antes de la ejecución de: - TLS Table y DLLMain [R.3]. - Crear ficheros de debug y configuración para la consola. - Reglas para reparación de IATs [R.4]. - Lista personalizada de puertos de escucha. - ... - Mejorar InjectorDLL: - Detección automática de "GUI process" y "Console process". ------[ 6.- Testing Se han realizado pruebas con phook en diferentes versiones de Windows y programas. Windows: - Windows XP SP2 v5.1.2600 - Windows Server 2003 R2 v5.2.3790 - Windows Vista v6.0.6000 Y teóricamente debería funcionar en Windows 2000, pero no lo hemos comprobado. Programas: - Microsoft Word 10.0.2627.0 - Regedit 5.1.2600.2180 - Notepad 5.1.2600.2180 - Calc 5.1.2600.0 - CMD 5.1.2600.2180 - piathook 1.4 - pebtry Beta 5 - pe32analyzer Beta 2 ------[ 7.- Ventajas y posibilidades La mayor ventaja de PEB HOOKING [T.1] frente a los otros métodos de hooking es que solo se tiene que aplicar una vez. En el momento que se ha hecho un hook a una DLL, cualquier módulo que se cargue tendrá automáticamente en su IAT [R.3] las exportaciones que use de DLL_FAKE. El resto de los métodos tienen que aplicar el hook cada vez que se cargue un módulo. Otras de las ventajas de usar PEB HOOKING [T.1]: - Una búsqueda en el PEB (usando el campo BaseDllName) para llegar a DLL_REAL, llegará a DLL_FAKE. - PEB HOOKING es un método más estable para el SO que otros en ring0. - Algunos packers no detectan PEB HOOKING [T.1] al ser un método poco documentado. - No es necesario cambiar el comportamiento de las APIs que trabajan con módulos. Cuando un módulo intenta obtener el manejador de DLL_REAL, obtendrá automáticamente el manejador DLL_FAKE. - Posibilidad de crear DLL MINIFILTER (ver apartado 3.7). - Se puede hacer PEB HOOKING de una exportación Forwarder[R.3] sin hacer PEB HOOKING a la Forwarder DLL. El espectro de posibilidades que permite el método PEB HOOKING [T.1] y phook es bastante amplio, a continuación planteamos algunos ejemplos: - Monotorizar/virtualizar el acceso a registro de un proceso. - POC [R.18]: 1.- Usar la herramienta CreateExp (ver apartado 4.3) sobre "advapi32.dll". 2.- En funcion de lo que se desee hacer es necesario implementar la monitorizacion/virtualizacion en las siguientes APIs: - RegCloseKey - RegCreateKeyA/RegCreateKeyW - RegCreateKeyExA/RegCreateKeyExW - RegDeleteKeyA/RegDeleteKeyW - RegLoadKeyA/RegLoadKeyW - RegOpenKeyA/RegOpenKeyW - RegOpenKeyExA/RegOpenKeyExW - RegQueryValueA/RegQueryValueW - RegQueryValueExA/RegQueryValueExW - RegReplaceKeyA/RegReplaceKeyW - RegRestoreKeyA/RegRestoreKeyW - RegSaveKeyA/RegSaveKeyW - RegSaveKeyExA/RegSaveKeyExW - RegSetValueA/RegSetValueW - RegSetValueExA/RegSetValueExW - RegUnLoadKeyA/RegUnLoadKeyW ... - Monotorizar/virtualizar conexiones. - POC [R.20]: 1.- Usar la herramienta CreateExp (ver apartado 4.3) sobre "ws2_32.dll". 2.- En funcion de lo que se desee hacer es necesario implementar la monitorizacion/virtualizacion en las siguientes APIs: - accept - bind - closesocket - connect - listen - recv - recvfrom - send - sendto - socket - WSAAccept - WSAConnect - WSARecv - WSARecvFrom - WSASend - WSASendTo - WSASocketA/W ... - Syscall Proxy de ficheros: - POC [R.19]: 1.- Usar la herramienta CreateExp (ver apartado 4.3) sobre "kernel32.dll". 2.- En funcion de lo que se desee hacer es necesario implementar la redireccion de las siguientes APIs: - CreateFileA/CreateFileW - CreateFileExA/CreateFileExW - ReadFile - ReadFileEx - WriteFile - WriteFileEx ... - ... and free your mind ;-) ------[ 8.- Conclusión Si es necesario hacer un hook a una API/exportación, se puede usar cualquier método actual. Pero si se necesita monotorizar o virtualizar el acceso a varias APIs/exportaciones con phook se hace mucho más sencilla la implementación, puesto que solo es necesario programar la funcionalidad de las APIs/exportaciones. Además, es un método orientado a la ingenieria inversa de sistemas de protección de software y malware, ya que dificulta métodos alternativos de búsqueda de exportaciones y eliminación de hooks. ------[ 9.- Agradecimientos Recomendaciones para el paper: - phrack staff - Miguel Tarascó Acuña (aka Tarako) Traduccion a inglés de las cadenas de phook: - Javier Núñez (aka Southern) - LogicMan - XENMAX Traducciones del paper a inglés: - BETA : Ana Hijosa - BETA 2: delcoyote - ACTUAL: LogicMan Virii scene: - GriYo, zert, Slow, pluf, xezaw, sha0 ... Reversing scene: - pOpE, JKD, ilo, Ripe, int27h, at4r, uri, numitor, vikt0ry, kania, remains, S-P-A-R-K ... Other scene: - sync, ryden, xenmax, ozone/membrive, \^snake^\, topo, fixgrain, ia64, overdrive, success, scorpionn, oyzzo, simkin, !dSR ... ALL vx.7a69ezine.org and 7a69ezine.org people ;-) Y especialmente gracias a YJesus - http://www.security-projects.com ------[ 10.- Trabajos relacionados [T.1] .- No conocemos ningún trabajo parecido a phook, pero existe un artículo que habla sobre PEB HOOKING escrito por Deroko: "PEB DLL Hooking Novel method to Hook DLLs". El artículo fue publicado en la ARTeam-Ezine número 2. - http://www.arteam.accessroot.com/ezine/file_info/download1.php? file=ARTeam.eZine.Number2.rar ------[ 11.- Referencias [R.1] .- Estructuras del PEB: - http://undocumented.ntinternals.net/ [R.2] .- Gaining important datas from PEB under NT boxes: - http://vx.netlux.org/29a/29a-6/29a-6.224 [R.3] .- Visual Studio, Microsoft Portable Executable and Common Object File Format Specification. Revision 8.0 - May 16, 2006: - http://www.microsoft.com/whdc/system/platform/firmware/ PECOFF.mspx [R.4] .- What Goes On Inside Windows 2000: Solving the Mysteries of the Loader: - http://msdn.microsoft.com/msdnmag/issues/02/03/Loader/ [R.5] .- winnt.h (DEV-CPP): - http://www.bloodshed.net/devcpp.html [R.6] - CreateProcess: - http://msdn2.microsoft.com/en-us/library/ms682425(vs.80).aspx [R.7] - Three Ways to Inject Your Code into Another Process: - http://www.codeproject.com/threads/winspy.asp [R.8] - Import address table hooks: - http://www.securityfocus.com/infocus/1850 [R.9] - Code overwriting: - http://www.codeproject.com/system/hooksys.asp [R.10] - Hooks: - http://msdn2.microsoft.com/en-us/library/ms632589.aspx [R.11] - System Call Optimization with the SYSENTER Instruction: - http://blog.donews.com/zwell/archive/2005/03/13/300440.aspx [R.12] - Run-Time Dynamic Linking - http://msdn2.microsoft.com/en-us/library/ms685090.aspx [R.13] - Thread Walking - http://msdn2.microsoft.com/en-us/library/ms686780.aspx [R.14] - CreateFile - http://msdn2.microsoft.com/en-us/library/aa363858.aspx [R.15] - MAN GCC (-fomit-frame-pointer): - http://www.astro.uni-bonn.de/~webstw/cm/gnu/gcc/gcc.1.html [R.16] - MINGW: - http://www.mingw.org/ [R.17] - ReadFile: - http://msdn2.microsoft.com/en-us/library/aa365467.aspx [R.18] - Registry Functions: - http://msdn2.microsoft.com/en-us/library/ms724875.aspx [R.19] - File Management Functions: - http://msdn2.microsoft.com/en-us/library/aa364232.aspx [R.20] - Winsock Functions: - http://msdn2.microsoft.com/en-us/library/ms741394.aspx [R.20] - MSDN LIBRARY: - http://msdn2.microsoft.com/en-us/library/ [R.21] - Iczelion's Win32 Assembly Homepage: - http://win32assembly.online.fr/ ------[ 12.- Código fuente Message-ID: MIME-Version: 1.0 Content-Description: "UU encode of phookt~1.gz by Wincode 2.7.3" Content-Type: application/X-gzip; name="phookt~1.gz" Content-Transfer-Encoding: X-uuencode Content-Disposition: attachment; filename="phookt~1.gz" begin 644 phookt~1.gz M'XL("-%*$T<``'!H;V]K+G1A<@#LW7M`5.6^-_#%@(J*@HJ&BCJ:%[PA=Q$0 M4!CO%^2BE5>$05`$9&8434M%2D+*KIIEBEI969IIW@OO6EIF:II66JDHE&9D M9"KO\_L^:WA^CK7//N_9^[SO'WN=/>WGG5_UEH#='+2L[.G]-#^K8/1 M:.S9LZ=1O(O!S^%='_'WZ^D7%!(4&!+24XP'^X>$&+5@[3_#OWN0^W]B1M:_ M\1CX;^S_8+\0/]K_/0,"_[/__S<&M?]3LK,LV9EFW]3,3.U?._RC_>\?'.`? M$!1BW_]!`7[^1C$2$!ADU/RT_PS_[F'H(XLU9_'N(E[5U9JV5<^CM?]ZF"M> M#=ML;ZAMJGNT[5:G(4?;)J9G6(PYN=F3>[V-.).F#7%RU>8-:-)?&U9;NR(6YKQ6NVU])T.HUEY? M$(-X>=#+OF!YF;!!+K<3EE\?-M3&R*41=31G>?1A.O&/_B[?U`F@:0OJ_..5 M3#=H__+!UVK.LXKW5Q_4%ZB]?274,$'\SSEOKFRT*,! M;53:,>+5Y;ZZ:-^)%@NY%#/XFU6F]C*H/7W;Y(B7JWB%_M5\S9G9*?HVFJNO M0_1]=7U]+=;DB=24B]A;BP5JB_?8>^L,KGJ=Q9J[PU!+TU:*&A?Q/LCIOCKM M/\._9$@JO#AJ9$)^A5O1'+?\:B?W!>^(L'!V>Y>BL1Y%0UT+Q[1W+71K7W:Q MD4@/B#*J>6&/?VG!3?<72@OV6$<7-=4FY&46'+>:BEIY")4W6,R'_'*77E_F M-B]R+BBU_EI]3%8CM)076SMJA9[MRY:*@]O_>"$^.NB"GJ',*K*":IN'O7E; M/_^;J+]>;*X1"KMIH6IVR*M_CT9DM-N]*Q MNKIZL5S(XNE:\_/E.R&2*]FBQ;*K0@97`L3Q38=TMZET*5]V1PQ\>'\*J?FI7OE M9$G;:NJWRWJJ%=/(^J%4OY=M7['_QEZ9)-;1/DZ3AAXTW:;&#IJJY%NE?+LN MWRKD6QF]%9GZG3_GMCZ544WU2S,UU1>T24R5A;'M/<3$XLU-S%F\N1:;RL2; MBS[)0M&XV!-H*5JU]"9KZ4D-\Z=IJ0DU;8$!TWK3M.EJVBEJVO)A17^U"$7W M+,(69]5,H6JF/6NFCH#<>#\>WHLM[DK5%.G5U*OK'WG11T[J(^I(Q18K,MVV M%^@?#!0?V#=E77W7E0>(92SVW(^FQ6<1!O99,_K,37Z6=%NTXNS22.S!(E,5 M:SD_+P*3E&&2CB(I2G(MBHYP.J;/2WU8E^90FE=H*A-;!$U0SV#4=_:>5OK. MKB@R>5+PO@Q07D'!C;O5U86F2C$QC?V(L>M%(DBZ7A3M&=[7T]J$ML5*M5$_ M]Z35JLS/\]1L;@=-Y[&#/Z#U&>M&I;2MJ(%HS+#46VP@Y_PY;JSX"5%AWQM) M8M8_BME8)A8EN0D6>\MM$R`_<>[K0;M97UAG++U8BL#[BJ^K8GU=3GG+XMA` MEV)Q#&CESQ>9O*C5>,]"#[$H<+S97C1XW5F[[4/W,*O*VGR/Z=IQE#ZK4 M27-.;9*=36B%3F/E.HG#AIV/(VJ*EK`B@R@J.^DI-HW8D',J]>+VJG@R*SYI MWZ!NV#77@0K:)*;SXM^B:*]PTVU;;01E]J!*#WZD0)/UX:;S5D/YD?PY99HU M(W_.CYHUI4A,$>U=:#I7E"0F_9'M5\2N[K9?_4"Y\::SXE M]S7:/S6*I<?% M\6K_I%(>*=CNQXK$_PBGQ=(7FDX<-!UQ4AVTR+#U*VUUQ`<\N7Y/HH6;3N@! M+=D1S3I#%N)@^Y-.PD/YB6(-+H5-YG6)3E3B3 M]Q2+QC27\G?TI9)7"%>'A;KH95\H=&%+U4*Y>5!O=;NFN_36\T=O55?;ST@W MO8NXTM()5\%\G[GWYLXBOZ=GOB[[9'4L7'??$ET[W%3A_O1&K%Q%X;'=YPU. MQ^S=EJU2935;H+(H-M`U/+:1Q_3@^S\=RZ:HV3AB"H.K/P1DZ$' M.I^_SYNZ4'Y_,VKK`E%1MJ>IV!P%/UZKKL9)O6NMT.WMY*VUZ(C<77CLUW=P M3OII=%M(>Z^LN!GZQ;+;SN*]X+28)'\7_5MMK8T]T$U,X.8A#T+74K%7J8$# M(]1]WLYFV/%7"@UB9+T'M;(5K="_FJUG$49IAZ_R0!]2).8B@PON,C!5TM@' M344#OM0%1!KDW9>H+RXHHV)3A9IJM!NMYGEJ75\L4:CW99A`KUO=5/_43WVJ MSVHAMM01>Q,%:U1C+F?%NJF9#6^`U$LV35M4'/N>Q9B"[I-HZ]@7@[:G?K.F M&MB%=?0N+#B'C4+_5MN:E=T43Y^]+XIM;JUWL&"EFKV'DWQWJQ8#&JV9<7XI M+KCV'6=%PY[W-LP:NW\9B_$9G;NRP7L7-.C^]C3>GMJ/+>1NR]^%CZQ]1#?A MC++NC<2..("M3&VK79$K-_V],[34HF/E/.9&_SK9&JD/#S2X9QX-10D6J-:5 M^N*N22W+L(;\$,II(C9,^6U1,,=^[^CSC^[T]9YH&ZY#UT6EWI5$BVN\^].7 M986SZ?;<4*.UOIV:S0]G1A=Q,R@O!JZT8OK=S-@FN`^-%GP9;UW_0GE&VMUU< MAZDA\<]ML8!TJ.D;:\!!TPG:!&D'3<>/N]#A5[OF\H,NPT!'WB`WVN9NN#FH M+"B=&E'P=?U]>4[D3_G1+7-FR:,%N7' M[2V\I5I`A:'\0_M'I]CZZLV]@FI7L:*1?[6B-]F*;FB$%=4G-,C9Z*M=/A.= MD79?9S38OKC7Q5U3M>TO9W*'S63P/3-97N^>F7CJ\1,R%L=RH>E(D>D(=O"\ MBH?D952L^/>T]U*T M_/;E=%BM4K&<'J*1LE\]])[OQ%TZQ>G?:O<%'^A3&ARFE%W,"7V^!S&M1WY5 MM=6JEJ:1!RTQS5]V9\=$;E]VO4JTI%IY%JUXWC\!S=B@S[B36%8UR3@YB0K& MRHN6^DH!V_$0'<(%J:)&OV42WU"(V[E"VC^CZXAO5B9,H,V8+@KL?3;=\.;4 MU0\E:V>^]?SBY5X.B5=[V>R.+5#>JUC,!JW4K`>?=&4+.2F-VR?=CDF]MM(Q M?%A\"[3XGD$^]][;*U(+<6+F>A_V1P.Z8;6UOOIU2L53G*B)#71 MOK^`9FN*YWDU>;58YG*/$OJ01MO(RY>]P1?U!C]6#4Z5#?;\NP;?N[?! M;QOP!LO[XVY-M=9&MN9'\1'52(8+CIY4.GK6V5NHHA;TAO`@CDWQNYHJ4$QU MSU4M/)I^+9ZK-9SOJ1_P^7_U4UP4#5V)6Y#LN_Z"^6XXB: MM"%;C@'BPHS-+2EE^,<>_4)%?P>'^ MH8J>SBNMX\1SD#SSJO)+VU,3K<6T8@,%%,D/](9+]=,\2LWK71'IWUA-$]VK M/&%CU>?%XG/,1\Z5YF8H?T)_>L37>'_9/ZI['MK196EUL;;4Y>:(MO'<+=[U M'?I07:PC6]`'Q,3ZAV==[=]TWM^L>UW[1M3/[,21-0M^@D[@4#['Q2-KYGC) MU7&.KVLU<\Q0<_0I<1F(MMM7%E5Y\Y3=`ZAY4;%_] M2F]S$Q,=HXDRZ<'%="+<5&ISI^\Q3,<*#6*V3O=-^[9]6JMK_IQ]3N)P/:1_ MWK]"TL\BT\_!>?7NDTZX8(V9R5U;(FTF<^ONPE#A^ZHD*<0922QWK ML#5C=;%E$;1=]O![#2]]"=5VI1_ZB$6J/B;Z'[&8-5/7%G>:A:9]8OG4'JON M4#DM+W/Q8DT?JCO\Z##NFGOO^&V'SZL?_U5[%#7`AR-%-'??H$L4=+%@;F9=+]<.>"TL*]UB:%-_6?GU5[+J>/!MMNBF,@ MNILX!MX6/X,9+3KJH@:+Q`?B)Y&'R^M%%WD6B#%JNK)\E_X#N(]Y^T;\:-`6 M@AGM<**=W$IDF&<'S--],?V\[_[YA?U7\]M]3_^ZS6,L_?RNW%,NA5CO(J?\ MW:Y.\^FW%N;]09_F7AVK[K=+YN+G?6.+!KA47RB\F;2=?K0M%MI]2VE^12KN M_9/6^I_5?P!8W31([-[M;43--B<-3U9BK>J4]W,Z/"BOX=S97=;VL576_52, MS;R1'QYAJU-X&E].;DL<(R:[2DT/D4\48O7FB6SK2O$/G9UESXG.:.L1,;;C M1]E9N=$/?\N_TG>4V!_JY\7S*H[0NC6@91<[W57_F>S>@Z:E?<10XB>:*;8M M/6AZE48/FE;26Z%I:TF0^$!\(RS3M3+=61**=)U,-\BTM"0"Z28YNJ\DFA;4 M=*@D%N]'2@;@_5C)$+R?<-]2*TXHK5`\+`>)[>0CMA.VH8O8NP6Q]'16$.Z$ M/C.".K\8L;JTW]T7/"S2VX4'BU"TS5U\*+Y'C'$I]<_+Q#8^&.,ZMWM>9DDT M_?C7F28N:AI+CO%!9Q'C6>(1+98AP:NHJ2>_[8U.AUWZ+%S098"88-#,R]B&A07I8JPD M",PDAH(YQ`C02HP&\XBQX&Q!?0O-U;?0`K6%%A87T%QP/'EB.U71=JJV]?4_ M+@[IUH7>[PE:TVXMC7%;GX-UU]6+Q;C\$"JO* M0D59K].%MVSOE[]?1H\NB]4PHO"".!MZT^U!KL>\*_2>7U?K3N_E5SKO%BX\ M7WBD2'P/[E)]ON9Z*'Y,<_^/;?5K?LEB6L#2:.KW[XK-RL=]:4^?$?\L5OWU M;(?^<:'#^*L.XVL MBAL>GVA,[--WB$D4RCHQI<6<:Z5*^KUC8_9TT5Z/4-? M;RW=G)FCY9@GTFZ_Y[@;9DX1FU!L:6.._0BC5;/8+#GFK%15%Y,]=6IR5JJ1 M?J4X.3,S>X:9CC^Q=6Q3S9HY+\/*VHP5.]"^/VF:E,QLB[!]T]!AE90UA?9R MBFQ5;DOC$+G/C=9L.ASDO,QB.5(RTC+$L>:#)?3OC./>7BP6)M>G[ M),0,'(B%]/?U$VV-_Q\.QGK&V<:_&>+0L\2)/BC':IS>P?(W9;.IB4&VY"QC M3'*N.#Z,0[.SK&:J-MNR,J::4\V6Z/1LZ]3DC$Q?<93\?1NQR=,S4HWQYDDV M*7X2>;4ZR^V;F3C#UDW#,YI)=Y5D:6F4+9 M1O?_T2#;N'](MUISPGKTF#%CAJ_#HOS-NHS_'PZSZ]7C_5N8,=F2,2DKF8X( M_2@TBN,N>6I&2C(=7FGB8*1^P3C1EI9FSJ7CXU]P;.#@^)\=&_J>_9\.U(B] MW\*5*\SXWQ_^!<>'/$#DIO[+H;LQ0735%J.5_GS#DI)K-F?]W9)03_MWC<2( MTTB<06)M]9Z#6C3;>UW6B-ZY_V4C<V(?W;Q-YK1@MN^*Q#HT,HF%^#?CG#S;5 MXXN6[IN3:D3?[#45]RQ)DKY+DC%_LYB_OE3_EB71+_4U)3H"QM(N-N>*4W^J MA:XAQ@'V^T"Q8.)/S_[I);$W'&;$128[C39MS1T>-?5/-Q*`VUMKNKA2H1%Q MX<+MZ;^N8Z2>4=T"TTQJ;ES#C!TLXK/^9NN09(L5)2)*%5$'\8K36?NK\M$=FC+")HV)@%NV;9%HTT4_2O=D]]=V'#.S;/R9F5&!`=].`[@'= M$P8-&=2]?^*`^.Y#Q4VZB$7-C,"`\9;TY%QS:HXUMWND)6.6V=B[MY'>L]-\ M1HE/30/&)PSH$V^*[:QUL(1UL(49T\1U5AQ4R1;Q?(!S=$('2R=Q0?#U[2'^ M-RDE!2_1E:1E3.J1$1@:TD/,I;N<2W?71*UVSQ6BA>B\5KI7BM%:]-XE4J7H=8_0GA\^)UG3+QW.`A7MW$*U2\ MAHC7&/'*%*^YXK54O-:*UT[Q.B9>Y\6K0KQNTW0V3?,2+Q_Q"A6O`>(U1KSL M0SJS57B!>"T6KZ7BM5*\UHG75O':)UY'Q.NT>/TH7M?%Z[9XN=)V%B_[8&3V MF_Z?[?//;!]W>E;%C8EINCG+JC6BB"&EI2)SF.XN`IE)N?DF%/I_B$3 MG_G19_'F%&HN2-IBMLI)8VA\5'*&M5]V[E!1GY&3*1L5VZT%?<8[=3%]&X?G MY@?M#^#X\T_Q-]CB-U0Z:"FTL/)Y'?-,MXK[)_&W\.*!P3H^67SCH/6R/[^+ M(4:SF&FZ`?9'?/P]K/AB@GK"/IK64^G^AN^XCQ1_1Q M7"-$.V.UO[FXB);7:_TRLO2&CVG]<)D82@_OD]"4=E+K)VX=]0=),7Z.]%VILL,DRD?P]#RU#/ M0'=<^C*(&D\Q+IXV:,&T.0;<%]:LZPY#@ME*&R(N.T,\^Z$'*C/%_?*V2E8T_!=#&9V2+/Y1M:DB>*+Y] MT=H:Z%DI.P7'HB$M+=-F22?W,J3EY(JE3A..,J31ZFFYAJDUM3,,XM9.S(Z< M!^?,),\B6^1Q\KBAI@GM>8.E9F2%02QJICR^WG/2]W#?[+P^:&NXV"KZ1J$A MYZ]?HQ("Q@<&X,9"\\SYYUZC$H;'#-8G\LG1_JVOP:;X8:8A8F;Z?^X@0F13 M+=-3%*"*=X^ISS'>3OOU_Z?#AZB3Z?SS6^HWS2_17ZK M_([ZG?.[X=?(OYO_1/],_^?\7_5O&3`BX)6`KP):!UJ"G@A^)_AT\,:0%CVC M>I:$AO1R"_<,OQ[>(ZIGU*PH^F5#^D45+S^CWQR_`K]K?D'^Y_U#`E("I@2\ M%E`6T"HP/G!NX'N!+D$/!H4&Q00E!5F#"H->"'HC:$_0F2#WX%[!UN!UP8>" M_P@."ID8\EA(YYXO]MSWE'A8;]E;8IV%]P^/# M)X;GAL\/?RY\5?C&\#WAQ\._#[\1;HAH'-$N(B"B?T1J1';$PHC5$>]&[(SX M)*(LXI>(VQ%->K?JW:UW6._XWI-[Y_2>W_O]WF6];_=VBG2/C(P<&9D=61#Y M2N3;D1LCMT?NB3P2>2:R153'J*YB[?I%#8\:%34Y*CMJ6=3K41NB=D0=B/HB MZES4CU$_1]&?8-!!Y.37SB_8K[>?R6^OWY=B&QK\&_NW\P_P[^L?+[9EKO]\ ML357^6_TW^-_W/][_QO^AH#&`>T"`@+Z!L0'3`S(#9@?\%S`JH"-`7L"C@=\ M'W`CP!#8.+!=8$!@7['=)@;.#UP4*/^8W@V=@7@MEO84VUN+<](\Z3XL_'R$ M3^^5O1,C/:.T"4Z:E\A6^GD$G@BN#!D3FAYJ#:7STPF_"%@5Y!)\I-?I7MI< M.>X3%!3T0MC*,&VQ$]H-\HOV$YT.VJT(.M$SHE=5V+GPVU%:M$'SIOL.OS$A MBT.7]GHA+#%\0T1LU(DH$<89,,^%?@/\U_J/"3X1[-73NU=E+^T_P_^7@Q/^ M/=%4_/<6L,]3Q>M8H[Q,)^:1U#_:O_\7K[FZGV%^B_DTLX>3\E#FUYBO,;

Q;R7^6OA^>+]4W'P7X3E8'!1;LV< MHCNK@5AF%VJG&_)M\.2:?;!*O/Z1/]/;N>WJK%W%M-\BOP-_!S>NI=R#N1_\ M@WP.@"_#4^`K<`'S,O@J_"Y<#N^!*^3S!OP3?)NY<6WRSW`'YE[P-7@DN0*^$VS.',(^K(;7BW?7XCO(-JY4CLGD?>$34[_[+[C'HII_>'Q<`"<"P?""^`@>`GS1C@8/L#\/1P" M_\[S,/AB?!T6#X`4< M!*^$!\$E\+B&\ES;+_ZC1(\*V\^+QW,GPO;C_F+S'>$[<=\$W?E MKL+VXS^:^2%WM2^RF9]T5_ME!?,V.$4>`\SEL'PT?Q[J.O%Q\P7X"FR/V1NU8B<*>?%G`A/A2J\6].GHE\-/,SS55-=`N<^W*;,[_:0M4, M;4DN1#Z=^:V6JJ:5-_H'Y`',([Q5S3/P\\BWL;Q]*_)2N2ZM5#ZN-?E]Y/-; MJWR)D7P$^0;XO3KD+YE_-JKZ;]N2/ZR#D7;*#S+W;Z?J2^#MR/U! MN!)Y)7/7+N3?X(%=6#W\)_)KS&V[JIHL^"[RIT`7[([\C3FIWU53=,>Y*;(@YC']F#' M/.R%?`?S%5;CYT?V1CZ,>3KS2WZJ?B_S*/"U0=F1.B5S9'[,S\T M1-6X#B/7JHOG,N;X8:JF^W!R`^1#F6;$7^&O-GK*9D//E%Y(>8_QC/^M)DG#O(-S-?358U^U+(.Y!?8FZP;D(YF?F*QJ7I]" MKET/VYFY?(JJ,661.R&?Q/Q\EJK9D4WV1WZ)N66.JED']T+^&?,M5A,WC1R% M?`;SVFFLC\TE#T`^E'EFKJJQ6,@)R%ULY`G(!S'/MJF:/7`J\C)F MK^FJ9BV>N9RB-FJIIO MX*>0N\U2-LU2-=OA9Y!?9&[Q*'DQ'/>HJN\\F[Q4YLSS9K-[W3GDE:KF M._B0W#[SE6/FL^<4^#/D5YG;Y+-K=P'Y6^1^S),*5,T#3Y`ORNW//.<)59/S M)/D:\B7,AYY4-5L7XGX>^7'FFPM537$AV5`?UQWFLX6J9MA3Y#K(KIK<#7G$T^RY]1ER*/+IS,\\ MHVH^?Y8Q&H2 M7B(O1S[C)95_N(3\)O*?F?V6LN?3E\D;D;_+?/5E=O^YC+P%^7YF[17V/0.\ M'?ECS-M8S>Q7R;N1;V2^\:JJB5V.:EKZD:EQ7D M(\ACF!>M4#7S5^)9'OE6YJJ5JB:LA/P5\G3FE26JYAOX(O(_F1]IW=;[]!]D`>PYS[ M!JMYDQR(O"]SSINJYN3;Y'CDMY@[OZ-JYKU'GH9\'?.%]U2-SP;RX\B',3^V M0=5W MD._*;1#7`;V!D.AEW@$7`M.!.N#>=O8_==UE^"79%7FN[RCO!=9&; M6)X)UT/^#,O?@^LC/\SRJ[`;\CH[V'$"-Y#MLWPJW!#YLRS?"+LC_YSEUV$/ MY`UVLN<1N!'R@2R?"GLB+V;Y1K@9\B]9?AM^`'G;7>3F<.0N53,>;H%\-LM+ MX);(][#\,NPM]^]'Y%:P\2-V#PRW1I[.\D*X#?*U+#\,&Y&7L;S>Q^2VR+M\ MK/+!<#ODDUF^"'X0^3J6'X7;(Z]@N4?`G>`"V`=>#G>& M-\-=X&_AKG`5W`UNN%NUGP$'('^<>07S%C@0_IY-&[F'W`MY$O-TYF?@,'C' M'C5M!1R)W'FO#/0\H]SS`OCN"!\F^ MB/D$JW$^2!X&MV`./ZAJ"N!X^1S$?)+5+#B$>S-X`_,E^!%YKWB8S?<3\F2X MPRVRN?!(RJ_#C\&-SPJ[;B/ M0H[*?71M;@,MX:B:=CG M5S4MOR2/E#GSN"]53_(H\!_E[S,?A MQ^!ZIU5]KS/DIY"G,B\[HVH:?XUG4N01S-.^5C6?P<\CKV3N<)8]D\(O(5_( MO(/5_`Z_C-QX3CGQ'.M+OR&7(`]F-G_#KBGP&N2'F&^Q&MNWY+>0KV`^\2W[ M/O\[\KO(NS+'?:=JWCY/WH7\(/.U\VQ>%W`_C_Q9YBW,)R^P[R5^()]&OH[Y MY`^LYB*Y0M8PG[RH:D9<(M]`/IWY=>8CEU3]IY?Q/(O\5^8.9:KF:]C9&==] MYC97E&.OL'O1J^0&R#LRQUU5-0^6DYO*G+FPG)W[%>2VR#U_4HYASOA)U1__ MF=P=^4WF#M>4!U]CURPX"+G[=>7(Z^RY'@Y%_@'+8WXA1R)/_X5=L^"^R']@ M^1,WR/V1O\W\]0UV+?B5/`3Y&N83O[+O@BK)<<@3*MEQ>Y,\$;D?\^B;K%_Z MG3P9>5]FV^_L9Y159`OR)QRBWT/_R=Y%?+WF$\Q__8G M.U_ND#9=]A5I/W(K1SV-^C_F+6JJ^0VWRE\BCF=-JJYJ;\#GD7G6434(^`]X%+,-O@4_P[P.ED,M-W(U\E;,T6ZJYBW8I1:N4\S7X19P4W?E M:.9D=]8.W!KY(>8;\(/P<`_E&1YJVB\:D?UE/7/KQJIF7#-R*O(\YN7,6YNI M^I]:D)<@K]-2N1MS_Y:J_C3\&O)*EL_Q)K^.?`GS+F]5T[\5>1WR%.:B5JIF M+[P!^=?,MUE-<6OR%N3KF$^U5C6F-C@'D8]G7L"\DGD7\QGFF\P>1N6NL!S6 MP?N1[V>^PNS25M6GM".?0CZ7>6T[5>/T(/DL\E;,L!G\@SQ.VJMISW0@7T/^)W/GCJIF4"?RG\@SF9=U4C5_2-?& M/:J/S9?<392O MJGD5]D.^G?D'9N<>RNU[J&F7PB'(-S)_Q6HZ^)'#D`]FGLV\AOFHGYIVMS^Y M'_*S_BH?$T@>B3R/>07SKD!5WR68G";W%_-4YJ)@5?]5"#D7^4UF8T_E/CU5 M_6.AY,>0+V<^R%P6JNKC>I'SD<]AWMQ+U3P>1EZ$_%7F?JN:!I'DMY#[,`^+5#6WX/>1>TPOQT%-O^\&:Y_9F-T\"99#9!_R3N1CF`OZJ)I?X3W(/?JJ M?!/\"?(OF>^PFL08\N?(;_JJFTP#R[[(O95XX0-695S`>8+S/7'U@.!2/(01WSL40U;;8&XU4-=/@!.3/,N]D-=&CR(\@SV!>SKR/N6*4FC;X(?(X M>7PR/\V\F?F;A]2T'1\F3T0^D'D&\S+FCQYFSQ2/D-.0=V9^Z!%5\Q8\&?GG M=F-GL'LJ.`OY%.8ES-N9OV73]AQ#SI7G"_,+8U3-;V/)^7(0\F7GQ>%5CG$!^#OD`YDQWR9N6Z& MPOP5J_>=YE3S-Q'#F6=/4S6'8"?Y?1ISXUS6YUO)#R`?S&QC?LFJZK=.)W=' M_A6STPSE=C-4_1HX"/E^EC?/(X?*[_28'V&>D M/8?=E\Y#'XA\%O,[S%_.4_7O%)"W(?^"V?"$"E?!!<5JVMJ+R4WD[Z(S)S'/7*SJ#<^3NR-OSSR" MV29<>H+*K\`]T9^A[G]B\I]7V1]"-P7^7'FNZQFVDOD M_LB?9=[U$KOW6$(>BCR3>=D25=-U*3D!^5#F1Y>JFLWP*.3'F']G-2DOD\<@ MG\_\[LOL>Z%EY&3D79D?6:9JGH7-R-0W MD9N9BYG7E;#OE%:1UR'W9TYF7KA*U7\);T!>R6Q?7R:6RAGD6\PIX#WP4W@O?AO?!OF^0]\,I\`%X*7P0W@8?@K^&#\/U MWR1_`D?`G\)9\!&Y#/!1>0S#G\':6O(K]8G-X%=A/^:1\')X&O,2YDWP:_!Q MYC^96[Y%+H&#F1]AG@&_";_(_!'SM_!:^`ZSS]ODM^"AS'.8U\!OPZ7,EYEK MO4-^!^[(G`"O@ZW,*YGWPN_"E^#W9)OKE/W@]?`(YL?@#;)-YJ.Z'7_>]\LZ M^?.^E,JF6L-WJ:8;]FF0L+W?'@O[PD_!/>#-L!_\(^P/-WE/6._;8^%`V?_# M0?!;<##\C;"]SZ^SGMP3#H%#Y?$,]X(7P&%R&>!PN0QPA%R&#<+Z=2$8CH1' MP5%P'AP-OPSW@0_#,_4#5IF\@3D!7?F1[:KFCOP2\B]=RCWWZ%J/H&7([_*\J2=>+9%GLN\;"?[ MSF07^@'9)K.%^:5=JK[=1^3WD?=CMC&_`N^0_?/'RE,^5OU_O5+E8.91S#-+ MU35B/2R'YW:3OT"^B?E[YEI[R*?AU^<]Y/OB;[)>;1^U7->K@2^2'FGUC-[P?@>GA>/JCL?83_7.$H.11[.G`[W M@E<>9=OD,_)`Y,>8[\"#X.#/5?U7<`+RWYC;'",GPHG'6%_T!7D,\F[,HYD? MAR?`9V$SW.S_P8\W+FCYB_8ZZ&Y;#F2W*6W)[,97`V['V"_"@<=E(Y MC;D0?A)^\Y3RE\PW3[%[XZ_(BY#/_$KEWJ?)+\AYG5;Y2OAEY+N9?V8UB6?( MKR&W,:\ZP[[7_9K\!O(DYGE?JYJF9W$O(?3;[#LRWR[LSCOE,U#UX@7T`^@'GF!?:=[??D=]KVJB M?L`Y+MMG+OQ!U=2Y**S_W5PGYH2+JN:+2V0/Y+\PM[JL:L;#GO(^D/E-5G,% M]D)>ITSEC\.MD:]B_H+Y-U8_]0JY/?+%S!]?8>MUE>R#O#WST*NJYC#<`_E% M9O=R93_FHS.U^4C67X?[(Z_^L'`[K MPS5RO%Q'YL1KJN:6<,W?"5Y7[L.;^*O`SY MY\Q5S%Y_J/JOX=7(;S%WN*7<_Y:JWWI+/:.=8JYF;O.GJM\%OX_\''/MVZIF M&[P=^4GF._`.>1[=4?4-[N+^"KDO\R/,<^ZJ^@OPI\B=JI6[,0^K9OV#9JCY M.\HBYDW,)V`Y-'QISFI&K.PA?D=F;N8%`U6^!?D9]AKN.L:I;!MY#O M9+[*:K)=R`8WW!\R[V:^""^`I]52?@W^S9V\G?E[YFKX)MRJMG)_YC3X=_@) MYHUP%7P2_@/^C=E81[DO?`N>R/PT_">\COD4?%NVR6QT)=^!HY@GPW?AIY@_ MA*OA,\RN=;&=/?!LR)S`;(.=X)>8]\(+X>^9&]0C%\+^NAV_0T@6^7PZ9D!F\'_X(/B"7 M`3X(.SN7B3\/Z=)" MU5?#;\$M6RKW::EJFGF3/X`#F!_R5C5E\':X7BOEGJU4S2%X-US.W+RUJGD/ M/@1_QOP'JWFZ#?ES6<]\IHVJ\3*2C\&1S-E&-B_X"_@$`?9@'^*B:77"PW'?,E?`"N'YG:<=EZ-99 M+D/G(;6T`9U5F]V[D(?!@YDM753-BUW)#\N^A;F\JZIITXT\1AY[W52>#8^' MBUENZ$Y.E>O+_'!W5?,9G"'7D;F#KZIY"\Z"OV+VZ,&.#=@"[V'^D]5X^9,? MD\^\S-/\V3D80"Z$-S-?#E`UCP22GY9]-?.N0%7C%T1^7EX7F)^'7Y#K#K\( MUPU6TTZ$7X87,F]C-8U#R,OA4.:,$%7S#/P:_`&\0O8G\$KX%[A$]H<]A?6C M*1Q>#>?"#W?LQ=:]E^J'YS"O9C5# MPU0_/(-Y71BK"5?]\`SF=7!C>;_$[!1!;B+[#=@3'@LWA?.9-\/-X`O,S7N3 M'X"CF*?!7O`K<'-X-]P"O@*WA)M$DKWOZV>B(N4YWF:/N$ZAIKE\)H5;R?,] MBMP./@YW@N.BR;ZRCX6#[NM#,OO(]L=L-&A/]E';8UF3HI1-2ZQZEAMRSP@5M4< M,9$WPY>8Z_53-8O@'?+YFN4C^N-^5?9US$OZJYHM`]1U]A1S]0!5 M9O88I&J2!I,KY'G'_/)@MKY#U+6O'?.@(:QF*)Z)9(WT??MZT%"YKQ.]Q.^' M#%73[H`WWU?_N5X_)LF@E:'F=]G'PE6P^S`\T\GC$);#L_!=>`/S:>8_6/VT MX<+Z?RMF,?,VYJ^'L_X_CMP`^0?,YYCOQ*EZTPAR(^2IS,7,[XU0]3>%[>=^ MTWCE2.;Q\:K^G7AUCA]@+F=V35#UB7`K^?S"_`+S^ZS^M42RCWRN8:Y@]DA2 M]=5P(/*V(Y6',D^#@^0S)AP,?P?WEMN0N<,H91,<*;<#W!22ZW;0U2S4/Z-.5P(CX.?@I^$B^"5\")X*RR'2P_C>H?\#G/K M1Y1#'V'7>G@5\EDLKX#?1%Y_M'(0<])H57\.?E?.E]EGC/)@^#TX#UX/+XB+S#6)4/A#]`/H7EB^%-R#^`-\-?P1_"M^$M<(MQY*UR M^X]C_?-X/-PCQIO*H/GX#G<>0/,\]C+A%6OYN-9Q/DSS/O8#Z;K.J7 M3"1_AWP3\UGF6Q-5_8!Y!_B7S+>;FJ:I^$WP-^3'FF\R>9G8_`_\JUY'Y M;>9/6?V2-/2'R#.%[7\OG\OREV`#\NTL/P\[(Z^=SIX7 M8!?DB7`M.`^N#:^`Z\`'85?X.EP7=L\@UX/#X?IP-NP&%\,-X+?@AO!^6`X; M)Y.;(S_.?(>YS115[Y9);H^\&_,HYIF9[-R92NZ*O#WS,.;LJ:K^3S@`>8LL MY=C_P]Y]@%=1K0L?GTD`$14!!4$14$&*E)2=9"_`P\@VJ MK!.$\[&.2W$1^0=Q,7Y+U/R(0^1/KE8>CI.PCL]Q&?F#PNW&6??!.G;C<>1/ M&&\=+SQ064%YHO(-Y*N$[Q-^!>M8.%EY'ODWA7\1/NE26[_W,N67R#>YW+J' M<`CKZ'NE\@;RHX5G"2_%.F9>Q;Q'?HGPU\(-IMCZK_"WNG^F6I\K/!SKZ'ZU M\E[R(X3O%EZ)=<1,4_Z#?)'P'.'WL8Z>UR@?)%\M_(SP3JSCC&N5(VHK9PO/ M$'X)Z]B':Y-O,]WZ(N&;L'_NX+KD]PL'K[,>A8_%M^)Z>!G647>&#\:1M]KMG(V'D$_'%^`Q>"B^0]1WOEVYC'Q?X4N$;\;E M>"76T>L.Y7'DAPE?)[P`C\*3PS5A'S"SEJ\CG"T\5?@3K MZ'>7\G3R9<+W"J_`.IK?K7PC^7.%1PO?C'5LQ#/)_R;W4[A'T7-H'N5'R`_2?A1K*/^?OH>+_R$^1S MA*<*/XYU])RCO(C\*.'9PJNP/S[G*K](OK=PI?"=6,>?>!GY%@]89PA?@G4L MQRO)[Q!N.,\Z'NN8AM>0?T1XH_"?HK[O@\IODA\C/%MX.=9QXGSEM\G'"%\L M/`WKV(X_(%_G(>MXK.,1_!'Y]<+[A5L_+.86O)7\+.'7A7\0]3T7*'].OE1X MCO`;6$?+1Y2_T,=4>)+P?*RCY%'E[\G/%%XM_`/6\=QCRGO)?R)<_W'K(-9Q M#_Z#_"KA?<)G+K3U+SZA?%P=Y<^$&SQI'<0ZZCZE_!+Y3L(7"E^-=5SPM/)J M\E.%GQ?>AG4L>49YO6Z/<*-GK;MB'4_C#\AO$C[V.>L8K&,*WD3^4>%/A&LM MLO53\5;R3PAO%ZZ_V-;?B'>07R*\2[CI\[9^.-Y%_D;A5X6_%O5]ERC_1+Y2 M>('P^UC'HR]PW,F_)USK1>O.6$?MI%UPE_ MAX?A>BNM`\+YN`A7"M\K_#(NQIN$]PN?NDHYA!.$"X0OQ\/Q;.%5PMOQ"!RQ MVKJ3B:N$YPNOPR7X3^'XUZQ'XE%XJO"CPFOP:/RU<.,UUHFX%%\@?!T> M@Y\4_E2X]NO*9;BM<)[P!%R.[Q%^7?@[/!8W6FO=4W@,O@3?+KQ&>#>NP$W> ML.XC?`FNQ/<(ORW\.Z["K=ZTSA&>C*OQ?.'-PI'KE,?A#L)#A>5[W6E>?HHZ MM[QK^!QJ=$2\I5R$6PJG81V=WU'6?\H0KL0ZSGU7>3J^6/@&K.,'?"-N\)YU M5ZSC%CP3/R[\KJ@Y]WWE._$%PE.PCI,W*"_`[87[8!U[\5.X\8?6YV$=R_%B MO$U8]FV]C;IOKSO.<<[:J&K:Z.W@L_'Y?DUE;(13Y;M%G/>L2LTX:A[&$_"+ M>")^&T_"W^/)N-XFY4MQ*WP9#N++<2:^`E^"K\0WXRE'[,M#Y"_`K^.A^#.L M(VFS\L5X*-:Q"!?C=W`(?R]J>GVD/`H78ATOXW*\6?@`'HO;?ZQ\"<['U?@Y M/!&?]HGMJYYX,@YA';OP5;C^%NLDK.,`GH';;[6^".MH^:GR;;BO\!7X;ESG M,^M$?`\NQK/Q'*SC3_P`;K7-YB_##^%Y^'W\J6=U%-<<'^'\*>K3/E=NAB_& M.E[`I^.MPL=MMS5]=BAWP$7"T_$Y>#'NB+_'T;ALI_6]6,L8 M_*7R>?@*X:>PCL5?*:?C3X2/^UJY+VZ+=W]>E^_;/><1CQC3WOIN(K=2W6D?BM\G4X5W@V)YK*_8JX_URGVNMH];OR&-Q= MN`3K6/"'G=/>%8[\T]:\B:_">X3;_65K"O#5>*KP,W@:WHBOP0?PM5CN;^O] M>G^??[:.D[)?U6PF/P9_A*_#'^.'\"=X!=Z"/\5;\7[\*6Y^0/DSW!5OPT.Q MC@L/VG$U67@^UG&O$^GY5[Q4>`?6,35"68^3N<)KL8Z1M91/)3]-^`FLHV-M MY5;D>PF/QIWPPW6LW\%)N%Y=ZUBLHV\]Y6SR)<*W81V/':\\G/P;PK]@?PX_ M07DT^2+AZ[".3_%8\K\+MZQO:QX_4?E*\F\*[\$ZKFRH?`OY.<)O8!TOG*3\ M$/D/A'_'.KYNK+R4?&03Z_:X\#5\F/%]XM:B/;*:\$Y\A MW$>X!.N8C;_`RX2_$VYPJJWO@;_$(>%;A9>(>K>Y\E[<0CA-N!CK>/)TY5JN M\CKAGX4;MK#U^:V43R=?(7RW\`M8QU]G*L>3;W:6=7?A`JSC59Q,?HMP9&OK M,[&.*;@[^3G":X2_$/6CVRCW)C]=^"GAM[&.O+.5,\E?(GR7\!*LXTN<1;Y. M6^LHX1RLXRJ<3?X!X77"WXOZ6>V4S]>?*_RY<&1[6_\$OIC\>N%]PLTZV/K8 M<*7R8\!^MXL:/R!/(?"4=VLFZ#=>3CB>3'"3\@O%K4[\&3R#?N;-U= MN!CKN!5/)O^L\%;A@Z*^4Q?E2\GW%YX@?`_VQS.^BGS+*.O^PA58QP9\C>YS MX3;1UGVQCJWX1O+[A=O%6/?%?CV^7=<+MXNU[HMU/(KO)O^&\![A)@%;7XWO M)W^'\'+A[:)^8)SR?/(3A1<(OX5U=(]7?HQ\D?!,X>>QCH^#RBOT_@J?DVB= MC754)2MO)C]+^#7A;[&.]EV5/R'?3WB"\+U81^UNRMO(MQ,>*#P9Z]B)OR!_ MS+G6<<)#L([CSU/>1;Z+\(7"4[".0'?E7\@/$IXF_!C6L07_2OZ`\#DIUEE8 MQ[5X'_EGA+\4;M1#W"_AW\A7"3\J_*&H?RY5N7:$\F?"37I:]\0ZUN'CR/\L MW#K-NG^:N+[@AGK[PO5Z67?$.N['IY!?)OR-\'&];?TXW)S\;.%UPC^+^@O[ M*)]!?HKPL\(?X??QK\(MTJW/Q1_@"X2G"C^(-^"5PKN$3^RK_"&.$;Y8^!J\ M$2\0_D!X']Z$F_6S[B4\"F_&UPH_)?P._@CO$CXYPSJ`/\:YPI<)WX\_P:\( M?R5(!P!=Z*;Q5^17@;_A1'9%IW$<[%G^%JX7G":_`V_+5PXRSK M1/PYOD!XNO!"O!U_*'QLMG4`[\"YPI<)WX]WXI7"/PG+>^Q3!NA[[/N>K>_$ M#5`U+`9NC>=B'?MP$)^08_.]A3<(-\JUGBR\73@AS[I> MOO5,X1L'*M?1SXSX&/PFUG'F(.NUPO7/5SXM0KDK;HY'X-/QW;@%7H);XF]P M*WS:8/H'=\-GXC)\%IZ-6^.UN`W^#9^-VPU1;HOS<3M\"6Z/;\0=\`OX'/P5 M[HA/OD"Y$SX/=\:EN`N^#T?AEW$T_A;'X/9#E6-Q`0[@VW$!BY13\%#<%]^&^^$5.`,?Q/UQIP+E07@,/A\_@0?C M'_`0''VQ\@7X$CP4/XTOQ%_C7X-ZX`H\2O@M7XN=Q%?X,5V-G MF/(XW`R/Q]WP!#P83\25>)+>/IZ,%^-+\7I\&?X17XZ/+U*^`I^-K\0I^"I\ M(9Z"Q^.I^#9\-7X:3\/K\#7X:WPMKE.L/!VWQ-?A5#P#7XP?QU.PCB7X5?+O M">\3-94AY;7D;\$;\$*LX_;A=JY^6GB3\%ZL8^((Y2_U-H6?PS_@-[".F)'* M>\D/%+X&Z_@*NY'*QY58)PE?C'4\@>N0?TOX5^%31MGZ;'P\^0KA.<*K1/TQ MHY4;D6\CG"E2_$FY<99V$=:S'5^KM"[>HMD[%U^(0GHZGX^OP0JRC^SCE6\F/ M%)XM_!K6,7B\\CWDKQ)>)/PI?@#7GJ`\#W?"#^*!6,=>O)#\:1.M,X2KL(Z3 M)BDO(I\H/$KX5OP27H)?QEOQ*[C69+O-$KR*_(W"KXB:,R]7WD*^M_`$K./3 M*Y5_(1]YE74`[\4C\:_X:;P?;\`'\!]8Q^0IRG5K*<\5?E=X']9QQ=7*+72] M\%O"N_$L?-8TY;MP(;X;S\'WX(UX-JYWC?*].!7?AZ_$]^-7\!P<<:WR7-P; M/X"GX7EX.7X0_XGGX]CIR@_A2OPP7H@7X!_P(SCJ.N5'\63\&%Z#'\>_X86X MPPSE)W`I?A(_B9_"V_#3N,GURL_@0?A9?!=^#F_&BW#3&Y07XX'X>7P]7H(7 MXA?P>OPB/H"7XL0;E5_"9?AE_"1^!6_`RW#MFY1?Q5WP@IK]]\KSO[&*?2 M]_KVWO7T%K6=^OJY8*:UW&;23%W?OR3"&4C-\>2GXA/PDV+=3_")^-A;E1O@ M;K@AGH@;X4?Q2?@+?#(^YS;EQO@"X4MP$[P`GX(_PTUQX]N5F^%!^%1\,SX- MK\/-<>T[E$_'W7`+7(5;XL=P*[P=GX$;W:E\)L[&9^&K<6N\$K?!=6X`VYWE_(Y>#CNB.?A3O@+W!EWOENY"QZ/H_`+.!K_CF-P MTCW*L7@B#N"E.$Z.#;TN^1A\PFSEBW![/`S?C(OPXUA'G7N51^`VPIEX-!Z) M2_$4/`8_BL8XWGE(^G?RWN`4^XVGEEK@'UG$O/HO\2MP: M?X;;X$;/V/J]N"/Y9L]:]\$ZWL31Y'_%,;C3<[:F&L>3GRWR:W`"^1TB7[1( MN1OY6X2781W[%ROW(]_Z>>L,K&,A?IG\FR(?LT1Y%?D!^$,\'F_$]^!-6)[7 M+R_1<_Z[4=ZUE9H)U#1\07DB[H=OP)7X@R.V\Y3*^W9?5.Z*3\$Z[L0]\-,B M7WNI1WWX+/QLR*_%W?`]5^R^;ZX,QXF\IMQ//Y!Y(M> MYKC@2=B?NUY13L$ML(X)N">^3>3=9`1^1]347ZX\&K?#I;@_UK$` M7X)7B'Q@A7(U[HMUW($GX"=%/F^U]?WX&OR*R!_$,W"+UVR^`-^$KQ#YE?A6 MO!W?AG\7-=^N47X(1[ZN_/`1U[LS7M?C<(ZWJ!LU.B[#S?`=PL^(FBYKE5OB M'*QC#FZ#EPE_+FI6O:'B&>*?+WW[;G6 M&NMX%1?CST2^_0?*);@']H\A+L,OB_S4#_!-XO\E(^4%^#[A%=A'<=^K+P0GX6? MP-VQCM,^47X>)PD781T_X66X[A9QC/!J?+O(1VQ5?@.?BG4LQNOQ.I$?]*GR M>[@,ZUB/-^!O1+[U9\J;<1+6,0YOP=>+_%J\#7\J\LVVV7NYSEA')?X:SQ#Y M]_$N_)W(QWZN_"/.P#INQWOP0I'_%?^&&VRW^6S\%QXE\B]HN\H;1;[5#N5: MY).PCFG8_RZBR&_%QY/?(_)==RHW()^'_?D?GTS^19&O]85R4_*ML(XQN#GY MZT7^(]R*_#Z13_A2N37Y'-P&WXS]TP6W)_^;R#O?*1>1;XG]>0^/(C]?Y)U= MRN6Z'NNX%5>2?T;DH[]7GJC;AG5\C*\@?^P/-E^]6WDF^4>QCJ8_3?Y]D3_K)^4'=+WP**QCUL_6._`\:B)^L6Z#=63M$<<4/ZCO=85WB)H3 M?[4>C>=36\7[\)#5G MNM;]L(Z.$=9E>"DUUPH_+&JVU[(^N[;R.]1T%[X8ZSCC&.LJ_!DU=PJ_(FJF MU+5^#7^KG]&$#V"_OI[U.OP'-5\+USO.UHP]P7H%;A#!?@G7K6]K3C_1>A@^ MG9K+A.\3-;D-K.?C=M2\)OR=J,EH9+T`)U"S7O@W4?/VR=8G-5;N0TUGX4RL M8^DIU@?P4&J:-K4.8AT-FUL7XTG47"/\A*@)MK">AJ^G9K[P6E$SJ)7U/#R; MFN7".T1-XIG6U^#'J'E(^`U1T[VU]?5X*36/"K\E:G:<;9W45GD]-1<)7XMU MK&]GW:B]\B?4=!+NCW5%S^BL?)":-.$R[)^/7:SC MHI3KZ]^C"5^.=82BK9_'IU&S27B_J'DCUKIE0+DC-:G"H[%_?..4`^2OP3K> MP8GD=PG7C[$O M1,V\KM8_XK'4-.AF'<`ZOCC7.OD\Y2NI*1"^%NOHUL/Z;GPG-HR1"NQ#H>[&V]#[]*S:E]K%.PCHATZSS\)C7C MA.\5-9_TM>[23WDS-3G"$[&.^`SKZ7@'-8\)ORMJZF5:C\(_47.;\')1(Y^7 MC\D6UQ1<@.\2^?=Q$=Z-[\:M!RC?<\0V!WGY*>J>VGL,J?+]P-6-G)NI[T;- MR_A<_!T^#Y^=H]P=#\MNX!]Z&4W&C7.6>N"=.PQ-P+[P0]\:?XCZX29YR M.AZ(^^*[<#_\-O;[*M_V3RNLXWI6,?M M^$Z\6.1/ND!Y-@Y@'45#E1_#4[&.[AA&/P>NSW\TCE>/+3L8Y. M)Y`/"!5C'D[@?^77">T1-\FCE+/(#A2_#.G[` M`\G7*[6.P3J:E"F/TGGA(5C'+CQ6;Z?0[8AVS M\-7DGQ/Y%A7*T\EWQ3JF5C(.R<\1?AWK:%;%W$4^4"7.ZVKE^>3/%$['.A:- M4UY(_CVL(WH"8Y5\)M9QUT3E%\DOPCJ:3E)>1KX;]N=YO)+\(\(;1$V+R@7^@9IMPK6N M$->[*ZW'X3_U+&INO-'Z M/3R&?1$WSVZU#>"8U4X3GBYJ?[K#N=:?RX]24 M",_$.G;.LDZ^R][;%PA/QSH&W6T]#[]&S7+A':+FE/NL0W@O-=.$'\5'WDM\ M?+_-MYZC/!\G8QT3\2/X5N'%HN:RN?9:,$OX%:RCP0/*S^,NPH/Q2W@N7GU$ M.[O.T_U/<,[W'/YNQBS<`+^-&^)C'E1NA)/Q2?@2?#)>@!OC;W`3?,9\ MY5-P/FZ*9^-FNAZ?BML_I'P:+L'-\1Q\.MZ$6^!C'U9NB;OA5O@RK&,S;HM_ M$?G^"Y0[XA+LZ!H<@QL]8O,5.`'/%/F&CRKWP)VPC@DX#=\KO`[WPCM%??)C MROUP/M:Q&@_`6X7=QY5S<$N?ABK.-S?`&NL]`Z'NNX"E^(YPBO$#6? M/J%\$=Z/=>0^J5R$QPG/P3J*G[)^%E?C]X1_%36-G[$>@Z?@6X5?$C6CGK-> MBN_''PL[BVS-=8NMW\=+\6[AAL_;FM.76@_'>_!4X8=$S6TO6?^`]3OPDU^V M/@_K^/H5Z^[+E)M2$Q*^">MHN]QZ!FZGK[G".T3-DRNM(UNN5%U#3 M3K@?]MOPMO++Y&=B'5OPMT[^P+Z' M'"0\`>O8N,&ZY8?*)T MGXGK?&3='NN8AL^6VSS"#WZDKRDYL=[U]QC'6>GGYPM_XUG5[*SE.,O8YC#W M\.U\(#[WJH^5;\=WX+[4/^99;:?GT'_]6A_OA%W`.?@?GXZ_P4'^`*A?`4W$( MQ^"1N!\NPT6X\F^/T:0MNM^^7.O54A\@?S^.P^MQ/-Z)=9RVU>YC,M8Q%??# M\X17B9HS/[77IA["I5C'EW@H/O$SZQ[8/Q^WVV?Y3<+U=]B:+_!T'+G3^ARL MXZ4OE._1VQ'>CW6<]+WRA[B=<&^LH\X/RI_A:+S[B#X?H_*^G\*9>(VPK/_" MR[?VCLN[#2>4[O,\UXEUZJI]V:U]O.>6OAN$YU".8]CQ3AWC!.<$XZ!SLG$B MHUX[B3->.YF1KGVN$V5\'B,:>^IMW,,98ISF##?NY8PW[L-1TDYW;C'N[]QK MG.>\;CS8^=CX0N=+XP*^":A]L=/$N,II:3R.&0)[+;C0>+(SW/A29XSGCKOU M./_KX,C!^US>6.C6WJ/M'5 M;NW[WMVU/-_@]#AI0NDBCMWU'%/=GALT\(WBV-WL-$-LA^/U-MN9XUQHMG._ MV,X<#3Q/;.+L39[R#V7$P[?R0=E;@ MC8R?&7B3LZN&]J?:]N-YM/^@<]K)X7G@=]J_E#[_@S[_`/_)/+`-_T4__X`/ MB/8?U,!U7=L/Q[K-C(]W.QB?X`:-&[B]C!NZ><9-W1'&S=RQQLW=2XU;N+., M6[KW&9_I/FK[RW)I\+?=KS[&XMKNSAF.1:,]?G/Q3+<\I;E[C\+'H[M:E_[6/5^OY M-G.R5P]PIFO'6)9[BO$`MYUQKMO9.,^U\^T@M[_Q8#?7>(AKY]N+W`KC`G>2 M<:%[I?$P]S;CX>X-1[C/&8]TEQI>X*XVKW+7&U>X'QA/KJ_>>Z+TQA7`W$OQM5PW)MQ-1'W85S- MP.F,JWMQ7W>;YR=P/W=+#>-MHAUO^"7&V[/N^B;A\;:0\?;>3\I/N/;MU/SC&O/_6?%.%PEQN$Z]PSCM]P8X[?=5.-WW73C]]RAQAOY5QI^X-QIO<>\PWNK.-M[F+C#>X3YMO--]T?A;]U7C[]PUQC^XZXUW MNYN-?W(_,_[9_=9XK_N3\9_NG\8'W`@W;#>BKG%D1#/C8R):&M>-L/-/O8C. MQ@TC$HU/BAALW#BBP+A-Q!7&;2.N->X0<;OQ.1&SS9AMR^R-AK1WXI8V\X^9?LYA?QR]Y$:QO!<.X;Q\)]K>4Z-&-,T/(;/C;!C^+R(XSU/^%FY M>T0#,VY[1-C[A-0(@-,CCC$>&!%E/"C"CM6A$7V,+XK(-KXXHL!X6,0XX^*( M&T3]3<8C(^Q8+8VPUZR)$:\97QJAQENLGA\BU%PQC?[I%;&GAO[9ZKNU[SOI MGT!DWV832A^C'V(CS779RP.<)/+=(IL8GQO9W+A[9#O;5Y&=C?M&!HPS(KL; MYT9F&N=%YMN^C2RU_1EYOW%AI)WGAT?6<<,>$5D?Z^V<;#PJTL[;HR//-BZ- M/,=X3&3`N#RRF_'8R%3/R^C/N$C5G_J>*C[R1W/M3HC$?Q8^)U)L4[A$^";A><*KA.O^HM\;C/)NUK^( MM.]8(FI9MQ`N\EUV@O?,XONONI'.@&.T#[3NY)1BXN_>X>`&]1SGHOK:KWD' M=N-J[=&U(YSX]=J[KSS!61SAXA!.XX(-+)::K]5@7_ M^_[X'N]T&]56>UFQ5]<>\[]U?MZYVBV]_RI-P?SO%_?MC_G?MWT'Z__MVOKG M8_YW1:>MP_Q;]/4V8O[M]/.5[;^1CEO$J7_C&O-O7#?X!O-O,J?[?M9;?L5> MS+_'VWH_YM^JC6@:JN\S"_;WKP(\__ MQGM"Y9VU]+N^E?_&NS[/O.MKQ%C5T=SW@IP()\FS^?MQN"U>(_R-<.T]MGX7 MCL''[+4^1S@=ZQCUJ_*Y^'KAYX4_PCI^WZ?<%S?[S3I5.(1UM/U=.1?W$BX7 MO@7[^_N'<@%^2_A7X:9_VOHA?RF/QA.%YPGSYS"$5ZD:WW'[E3-P7V%9/\++ M3T'Z_>1*__VDK!F_7UTK8YF3N49X)G#0J6^OC^*9-\7I8JS>2(6=Y@RPUT?G MXK"][+7&^Z`PSGN0L%.^^5H2M_F:S\52G M=D38TYSZQMT3V,$YRO=X?O M'X+.3L_/D4]TMGE^S?<6SV_C)&>SYX]PLK/!\[>^W_7\%^[JO.7YV`/*W9Q' M/+?"YSKS/7?R/7?WT>])3HW4;NT[^4`MSRN:ZSG'<^YVN+]VPK M-/!*\?YJE7C?NUJ\*\>-N9:/P.Y[;V!\X, MXP^=AXTW.F\9;_*JPMXBWNM^[OQJO-UI[MKVG&'\E7..9WV\5O(^K8C^7,5[ MVK%X-<=Z$G[-^;&&>[].]MX/7TT_[W&^:N'/)YX)O%_TYP'1GZY[DG&DV]6X MMEMD?*Q;;ES/M?USG'N+\?'N/.-&[F+CD]P/C1N[GQ@W<7<:-Q7O3TYS[?S0 MPCW.#;N5VR9LKS?MG'"6>`?2UBTR;N=>;=S!G1&VU_O/A.WUVJO&T>Y:XX"[ MT3C.W>)Y%L?B5X[+PW@?QV4Q_LW9[/EU_+NSP?-[^`_G_1J.W>?VV.&M'+M$ M=VVK":7?X%YOG"O>.>2Y?Q@/=!D_^'SW M7,^_T^8D=_.!@P?K'53N[F[PW`2GN.]Z9K^\MOU:PWYUM_N%S_36]>Z@=-)_ M'JE[IGTV:>`YSJO1_N?91#Z;K/SGV>2?9Y/_)<\FX7QSK)]-NAY4#?YG3@N; M9Z*5_\QO_\QO_Y_,;_*Y?AYS72SGN_Z]0`QSW?,'L7C&D<_X<>*>/%[8^_/!SI1QH.<5.,A3I;Q4&*3SH?%HYPOC,N<'X['B/<`EXMF_PFEK7.ET-A[GQ!E/<)*-)SN9 MQI^:V&>^/<".W6OGUYB;/#],/S?C]@T0]+-/!2T0\O MBWY8)OIAA>B'E:(?5HM^>$WTPUK1#V\ZDXW7.3<9ORW>F[WK/&;\GO.,V?<7 M:MSWY^V^X]/8]^W.W6=/*(WR/-?YG'WOKRWV?;L&_L(YQOA+\=[C*W$O](T3 M:_RMDR;RA<:[G)'&WSOE3OB]Q(X:Q_`$VWY<0/OW.PW;AH_=7^+[2/LU^*=!#? M%>GDVCDPQGW..""^MY/@OF8<=-7[GPJGMOI[ZQS?R['#=RIF8OU=G7E8?U?G M61SIUO3]J/=L?^*57OWA]Y;;V]I[RQ\]?^C5:/]S;QGV=J]/IJ!_[BW_N;?\ MWW]OR5@/GX/,L=&<[WJ.C1)S;+0&#ASR'>G3C?LX0>-^3E_C#"=?M<-5L07:.PDUX2;;Y;`]\OVCQ7_`[N`><, MXP>=@/%S3K7Q(F>Z\?/\[?DQM/,>VGD9GNUPO<#W.C5]K^8NVW[\(.U?[0QH M'^[S5;1_B9=7MO<)JS7P:V)?UCBQ8IMQ-5QKKFEOKS6W>%[M;5_[GVN-MCQG M_[F^_'-]^:]=7\2<___\6O,V/]GT#,5Y-L?,,WL/G9CKO>9][7(2:K_J+N3=3`P\4;1@DYM[S17LN$'_O8ZCX>PH7 M.+]\"CG4N-2YVKC,?;[$EZU?7:H%,^\U?2O]CC^ MM?73(U3_9#.W1^$!SEK/W7".L]IS+LYUEM?0A^M]MQ8N5O-E!_&]/L_%WG:T M_YF??01S+W/+'!S/]Q">Q@G.VG_S?C(\GP3/\?;K MG_B?%6-#PPI&EI>/[ESDI"9UZ5E>5#TF5%95V:JPK+A5;JBJJJ1L1&67E.(Q M)64EE545A<7E%5W2*HLJ2JK**TK*NXQ5JW9)+2^K+"\-%7@_JRK*2[LX(XJ* M8@J*RL>,+2D-%7=V2LJJDJK:176,;M^M@A_)G6*B`PF!8&Q\()ALF)#L%(TL MK*`TQBOE1W)4!F5X M?XI-"$?X8XY8.4ZO'/?OK'Q(0^/;=^M>&1](KE#VUHX6:\OM)(@X?(-';U)" M>,OX\'9%U[#!RI'E%55F&T&UC>AXMA'T^C(V)B$^F*S^.UQZY.+GWZ:I`#N<=D563!E>F5DI>3IG-_<&&^S(DMSU9!GRRP--X1QKG[$ZX4)ZF/MP@1_ MH;=&>J:_M6!X]S)L+C&BG9C*S,WCH;J[-^S\9Z MV^MI5XG3"_V6LJ98FJ"7JJ:F#LQ*][-!G?4[-=9KTVC_!,H09;'1X3)'[1(I M<^3S32I6I=A+F_.:JG[$T6)Z12R,]Q?6-`3+JFHZTRJ\FF_:R!G%7)$MD@&]`D-!+\P=HI?$Z\9Z&88VR1.MDH8E6V2#K6 MI&4V8+/L+LDXG8S7'\/>AC>>$%[DF%30I#+959*))IEADH$HD[2Y:%NH1J1. MZET(^/T=".C]9#?-BG%^C5K19N---L\.>=5H5B\0R6`XF<<434ZUFGHGVZLD M%Z<;'&&?/')GV M3\$$_U/C5*/D\J"_W,NGIO?4.:YJ'$*32_"O:FK]E,S>X6RTKHS6\YCZC\XS MO:D3GPN5S<>25[M\:+WN\`0UA;"Z5W#8FO&Z@OU@0TQ+8A/L"`NR#UN2Z*^J M)K],4L$HG8K1]RII*7Z:W:%YAZ1CS-U`+SNQQNI:+V>/7C#@]X>7Y?-)QI$\ M^OW8L,+*4%5E<>>1=&!LC+=&=(Q7&[[[DEG=C`#7ZG`NUE2*9"!=\Y2N8#K%C^92*G0IZDH"82;F)L^)*T@CRS7+QK#1"(7Q/M; MY)SQ*W(/J0CZJZJ]/G1)(DOTY8N2\/BPS8F-%A]\^+(8\]D;0O+]/`?:)`EJMEI./-NL=FH\Q MZS$P3=Y.9H>D`[8\)34U+3>WH']*;C\]%<2;F?6(1?8^OJ!WOC>_YJFDMRO> MVX6>A56%T4D<>OTXKA(Q*I'(\WAT/)E8/Q,(AC.!)+41;[\+*SPD>CNN?_[] MBQOOT3LA6=\N>A<;[_^]IWV:5*565KU$RYR-U&="D==GJ"7<]^JZPI24M,* M^J2E]$S+T7OA=71E(*4HE#=Q;"A)71Q4^X/)7J97:>&(2C\5U*G;*K=L6Z&NAOQ4LT4-);%^"7>$K",:FI&2TU\T-.Z_KZ%L MV;8B7K>"JT@-)0E^"6?=-29==R.@7_O1;K$TPV-VO8J%!1%:7,D&PSF$GW9'=D?`_KCMD>X_< MQ:"_BVKN^?M*?P;B]DNO<7UBD%)7FA,:55):4EXDK;^ZP2='BJNL5'7'5]9*AU/+JLJIPEOLI MM69,.,/]%&,]PV]1O-\B->/9;(*?99)CL6YG04[:P/3<]*S,@O3,7EDY_5/R M//N-9XX[K/'\TH4>K'%E/I!W-&S$_QSNX(_XC("^1-G]M)_@?7"/B56ARO2R M_$JZA?V72WI5A$*'707$)QW>(/^8!M0!XCU\NO<@E9LR,*T@)255Q3+)GDCJ:JZDJQL3U[A"'*R*6D5%>456<.'5X;8*<:LR>>&2KWA M6EZAEZAQ&KYQMFLP!J+"^U&N.."X9X[LDO\?HOS^TU->:E9F7EIY^?YG17O=59" M=+SJK-"$*GG>ZG971-ENXL_1MHOXMOJ$-ADK-Y\Y5B3B0_ZJ^96VH[5'S"A*E16'"H.CZA*W:$)APRG MN.AHQI-:+58]1":JF<0LB8NVM0X!6GG MIZ9EJ_/7FV52U6^4\E@4HV;4J+0)1:&Q5=Z')*#SBP0?>'E#UF4$RI2 MIRN;XYF0[3(L95E*<7%%J%+W1$)XD&96CQD6JL@NK"@<$Z*?[(B5ZZ:7#2^O M&%.HJ#_GT!,S.I!L!W8@&.5UX^&[Z_<(9Q_-<[)K*(GW2WB#74--@JT1'9N= ME>[U?DZNW[5!U;5'[:7PPZY_JHM%@43[6_OC0!\5.'%ZDWCGSDQ?D M?G5&S>4QIMPI\"[-O=,*U.+>ZG&7O'=@JX/523B@=BRC?+QWV`ZYQ/0I&3&2 M'&^LP_OA+?->*^@UX_Z#-0=4%Q:S3+_%U$>- MG]Q.^949O*DA'>>OKV87D?:[D1?PX>4%:GE!2J;WG[R\G/0>^7EI_CA/"'+/ MD5%=HH8P6]6-3JFJJB@95NW=61QV5W&T3>E/3O0_68WL&JO4&WU^,K3]\J-4 M>U?=G)3!_CHQ_CJQO[.SDD?F)Z1YO5[;IIW M&2>O+N,Q4=D5)>-*2D,CCKP1\V^&#CGVICI)-Y*^XG)PZ"?HIH1_K:H.V]&6 M!_WE_/K)+_06I^;GI.<-/N+X)49Q_,HR0F4CJD;*EI:.S0T557M/!!-[AM07 MW\:J.R96";=[F/_(T*>PK+B4"T>\/-7<4WQRS/^ MICX0KI=[F]X_VYODLC)3F/0RT@:F^<\2ZCUD*+Q_*67E91/'E%=7)D5U#.?2 MBT-E527#2XKT92?:+A@SUKM2E9?I?$Q'VTG>$=3)V([)SM\V0;?8/]%X$?EO ME"?XY4Q?>CW[*?Z5OR`O)R6UG[KQ[)_5,\U?49]60?7X]6_4QZA7D?SD!&-% MT:,#\E,RU,^L7EXN9V"Z>BJE.H9Q=.0PDOWEC;)QH5(]B'A$%9?!O(K"HM'> M-S+Z2TX<.]V_62<:&LLM*)2;I%WK7`6Y+L_%V[]-[$^GNCKOG_ MNCK@5W.>LYI]GY&7U2\MTZ\+3Y)TS6$'+3@?UN8J`MY#4J"_?)FQ'3O M'4Y>>J_TM!SO_45>GRS5>7K/>!T:/["PM#J4Q)]C#KV[30X_FP+,2V_>S"?88JJ3>+7TY.]H;ANIA*=55(\O5 MN+4(4I2=([QKN'@%W;+DH\[%)TZ$72M)(WC31,_5+,IJ-UFI>* M>CF[<>1%FJI8=2N2RR6:'6<,'GZ)MO>>1V['_U2_]WG+5V-1G"[B_5ZX.K?& MRRL5"?XJP<,[A0_EP_YV?7\`\Q;-WZ##^>J-\ZS\G/`D%/9MYW'65QP%_,"*8NW%9F MY9RL#+^QZE8B$,7?Q7B]D9V0K=7/_0\/V@HRT/^LNYW:#0[$[/M%XI^1EY!3W#K_!B`E%JGWJ& MAA=6EU;U+"S2$UIL>$#2@L-7K&)%QCL;<+)K+(KQB[AGH-JTI7=.5GYVKM^* M`"=Y[XKRZK%'W*"1K4SRAZ.7T<=9;L7_-,8Y6Z-)AR^.]Q=S'^W791RM,.@7 MVC&;-2A3/8N0Y;UAUOBR4(4X>>DK6S_ M8>_LNA/)F03-3]G+/7MJ=R!)DL2^PAA7,8T-8W!7U7OC@R%=9AJ#AX]R5?_Z MD1Y%2@&9:5?/SL>[9^>BNW!$2(H(A4*AT$=>=V^_.KYWY\7#L19MH,W.JPVF-V$D/3<\30A1I=ZVB= MFFOC"A+Q*@E>16B'%<1)PQ/7]K-OCFCZ=2R>QZZP,P:?:-1$E/QY&DZ>UU11 M5S/^A"J$4XV,!8DW@2I7(C/\8#(=]";"@W4HK>3?XE#Z/UZ66U#3)5Z39>&1 M4V&_P/&+2WDS]B.U2!+RYWKVO)SWGLS)]TR2OM8D%*[[?;9C$:W4'WO6%W(L,W;>8N M!"L2_R'35>3^4FZPZ2!./[%'!V_>9/>4_WV<+$WD:<$,H31K8^9A&I&7HKA>*_4934YNZ'K-MMC9< M-6)!F*3#Q>;'P(BW/VN(,-W#8KD?;U;+N7&PB6A@N_RV-"OX-KZU7,&N*_"E M*-J%TC?=Z[X=>Z)_4@;+A=6'](#\Y?09Y7]>;IYGIL%F_G=WM9SMSN+\S\_9 M:O7;>O.ZEF[(X3:!8'35G<]Q7$D.'ZR_SU8F=&_G@+OU'[;X69H#>IOGE\/> M<-0Q(FK&1:Y$Y&+Y4T2W!4UB0>C,"GDT[=X/!]>#:6Y_-A)I1N.9<=3CS68U M7#XO]V?N8*+,PC>;=06ZZ?SOS9IH6&J@6;VHYI&1JYM MY-$8BF[##V$[0X$(TU1'@C@ME!.^DP]7&S*5H,47=XB9A.Y^,#)^[DZ2_:#= M<0U[G,VLZ-U$Z:8?G<;E5%LYWLVR(S,';\L(_$QK6S")DO7.C`:%1T3?1`D! MF<$A@72%D;%[$MP1+&"=G]E8F-[F]&9CU^/.$X=;EH[L9D M??K&I__T^[1JNYIP2*]*KY8KEFPJPX3>%.J,RLO6D`TLA[W]*LZ<,/AX.*R- MWZ)LVBP9_S9RL0G?N^/^??^V:WT&6#;8\*!'*;'G;+%DVUBE?LYKJK1KH^G: M(`E50,:")/*#*F?@8]^LBDQ\VK\?=V_-6'>&"DW"&.[W>M(T$ZWU'UOG9QV8 M"9>M\O%LL3##T(&9FY[5J;;HNP'.BU=KX/=I4:(D2*:2[Z[I_.>@6NJM1I[MZLY?9 MG,21.+2Z\P5VFJ%S`.=>1*E0*^A4>5I'N(WQ=K//[&SM.[OCS+*:223CD#_, MHH6W:2.A)7RED-;">#09.#1';_X!1AP?3^\## MX>!BLX['EO#(NKZ")A$:%O<0YW*,;_M&:AG_I!-3[])_V0E()=(83HG*8.@$ M;3.$_(LG@B[G95+I""(YLV%5H&/H4\=P63;]H!'\77F4D5Z\-2VN8! M:I,_'O\%P\(!I%ZH@BW;I"C_,GXK:"*AL>.6'W[[\-A$97';M M=-([7JJ7C`#X]WSJ:AT++6&!85E.D@B)'97\\*.R=]OO3C&=J59W"JM!W=7, MZ@E+S0ZZ8JVOCG#"D*VFL_E0_F7L2@%C2-/H"=K(VDAZ,=ME MZE!-2.JOC$WC;2R%H!!"X\39*XDX`&@9A=K%79FV=\T5S3D&99AS5NM-0C$-CFZY$F627`Q'O=^<)*T&5FIF MML'B]!R)AVB',-W8L'I9.'E1T0ALM1CA-`;_U81-(8SAGQ(E_%]VIUUAO\4T M[LYZC1YQN3LMAT"@34[U#VLAF5O>CF,,ITQ[2%!)EPH=#ED*F%7?9*K-)R%? M=[5:KO^`,TY2\:/NV0ZX,*^I>O;@T"O%:N,"TNJ2"L@XW'P<]HN,6'<:W^06 M2J+7P?ULI4OJVG&'4-;&530HC6H-!V#S>TZ`4WL2RB0POJV?LY/EK&.G8]44 MN$ORXZK9"\-.'[3._N5`!N?XL'6>!M6-.][:.$>8J(U+T#)OM5F;"]W][71H M?*UQL;WNT"8=2?)<]B_N/CJ)VDU":IR5]@J]K5DG;+87YA""/8E@LBZ+[(?R M$I`L;8)\-,VY\=9#:^W#Y4XT%N7S-DOADI4- MYR/6%9'[Y&6VS1PGQT.G<0Y=R'U4*T;4*9;`O>IWB5,A9@Q1JD+WHO46<1'"M,HBP`VJU69GJM,"'6_Q MN.9\_D=M[]@,JTEO*I61HE(H7RIL\+!4.2Z2QJ6W`>*&+`)/NLOU)VZ9;JN- M2PEB(<`9"^7]:/*[B?J-5=CH128_S@,VXG3Q:K`9YFSM7P59B+1XO9[]\V8K M%,H:0"W7'A7L`=3%8;G2BL4>P(Q7L[T]-4V`H`QB]V=ORG&=C,R_#D7=9C13WHPG@RQ-$];HC.)CD%C?C/*:1@#$3\N(P M]YZ074!"_5?EEP%;?^8[4.O4J3VW]%1WH2:))5TT7=H-Z*N&1K%`5VS(JDX&.G\Y`*-[\VHW?JI.?5/?3SH;IAZ9UGU7 M>_C+C+,V*JP`OK/70SEV1S_^`7$<%D.\\>>I;I5&]K>#; M7`&EH@*-.CR'N,!7N=BJ(G&<*H0JD'H>C!S[V8/`6XU( MP>?$[<#C6,%-H)K#V[YA8^?;@$CJON'M;CL/+21Q72-"$TD[\HAL%PJTZ[YI M$\XI>-,WO5AN%3Q)%3S4G];K7GM6YZ%$V@PJWV9SA4AB+]WSRS/)-N!8FH*' M5CI1JE`O9NWDC;.N[2%T12<8V\+$>Q;I,$PEOLPV6VUF"X\))K<.V@(3[&[^ MH''N#J0N!0^""58W.^PWEA&/"E:WL`NA)0LA<$Q)&K=2@7P<%+'>[37_#,FZ MQB[,VF?MDX8V.SR3["XI3SJ)UJ*T@:CH1W#1VM M][]LZ6H'W&`>K5_/YD_+]7%&($]8R7+_.&7(BLNL*C*3'7U^.;[-LUFNS0B> M;B8_GQ\VJZDZNL8H"!6#WVF?2YIY]#CBSN!LQ1U_%=$P5=JS)<=230[B\'MV;A:_*THKVVS?[\;IS&8;;R MR>@0?A2V@.&N6)EKG`4%E<)@%5G'D44L*Z#W/(ZXW-@=^BZ&L&&[.(JO"_,K MD98PI`S+?.LZB@NS6D`''JQ-IFBV,K\7=N7I>S]0W*V7)S3: M"D25HT=R0AC4\11L4_NJ=:;@`/?UJ8.8QAE:Y/$4+*8=\GMZ&N98A4+IR1C- MN6U->TCGYVZ?/>M($GV@8Z/%=REQ!JY.&#W%XQ*HJ1R?I+[\Y/"P*VTCC7T= M%30V2-<)C48("4*_T7X("0+"#=7=<530>\I,.HK)0<4$OGW`%NZ&[N5J53&V M6PF4(XH;W9 M[?=9=[VPE4`0X@IKC9=+&P[8Y!$C,CJ>9UKG;OP3H MIHN%CC0-!;RKN!U=5[@+=TKZ_V=OX>`7^'+E+3Z^;-WZ2SN)G@!1W7$JJ7GN M?8;EQ)3GNMAI!L[W1T4GRK3`7OM[M#(W-)D;*!3FK]'$]S,T7&"+L[)UEPGX M5B]ZO@?F('2>0+8K7S!.06B5EM( M15%K9!X13`C$=JZW.RR(9;@R$@C]"D/;"AC"?6TN0-UR6QN,M+>S-D.#SC-` MN]MY(&[!46;?CO/_0%G0Z,&M[,&_8<(9?+$(@$WPER=+2`AFW\6HN`[*KD7W^Z?#^H]0&48`SBAIFST^_-RKIG`G:/!U9G?^ M9L%VZIZ)%VQ2X/FQ5V7<>B#@7#'RVKB"1'QJC$^%UH^5FRFD'*J"AE`[3B=& M:9RZ5(L!PDE9T,AZQ$`9WZ?+':9X<4KMCA_INCE8BR-AC9%>3M(4DACNH54A MP`G[=I>RG90P6J_D,V7,V'[34]D)$XDPT8+/GIA>OM M[#6$$S@>O2#66-1VC,WRPTD[%8YH"A->96O"31V9Z!A45Z&=CJ?056CW4UQ6 MZ_4.7:M[0@\03L[0(_1N)9E88@M+A#YT\-?KB]'0=:P[+I/>N`Y+[/F+B?TB MD>YIUZT!PC(<*MUKP\WZ6\D;,\!#V;3DV$#+M9`7T&%;HA>.3JLP;1S^T(AD_T,1V_`S7DS_=G[:KXF!2 M1[%!R:N_KK;I9E\VPN26PWS=E5520M]?'=:HVH'HZ)+QH*OR:'LJ)Q0OVD%W MNYU)4QQ3OER:A?X.8A?L:2/`!]A_I]^]?D)P`9$)*'#RKLH.ZO1VUJX?VYEW M4!23XKE=N1(<>RL>FJ@>[@WK-`?CGIR[A84%EW'-M.Z=035B4],LW!)71R`R@N[H:1[ M2?O/1&=T-3_PSJDC^$+.4A*QQ+29B^?G''O0MBAC&K^?T)4CG"5Y75VIYH+5 M%I7#:"5=(G0"T0=G MHM2O.8!;;@[""5*5DD@/<7O0T8;9Z+;WR5YFN.Y;>C_.(6]:V4)HUXE/TF7! M=4;ER4:+N!&VX5-3A4BW@I-[M$DEHU&Z:EJPD@(\4"4\)TTN*;$ MQ5II_N;GYC M_ZD9"6>IY>S0..,/_,W59OLZLP4X[):0LL`/S M;(3"%C)6$$DWL17JJ$LD3&(G(7NAJ4C8B(D^CR74Y[^]B!KH952P8R$U)AS^ M+K(D`DA/LFE9290($?THU*?$0IH**79;3M(1DL:IH>J7*RQ%5&?O^(S?K*S? M\"R\0F`T0_`SM3F?DNZN=C^^(TP3RZ/36D4O<]*$>MNB2AP$M[LR_(MNWJ1L M"B71*T5"6#&ZN[FLU!@OP)9)60^W5\Q\='#WNH?W"KG-'G5TSTRC6*F4 M`:.!I=KX5^C;0D^D2,$3F:]&MY^[MV9Z,H'-ET\)5MPFCS;HP M2ECX#JWXAZ;X!UUH:D+E7G&?@DT%>'S:5/IK=\7@U*HE25,],1M*@8ND[)2]@JM'Z[*;@DU^J:K(U_K80,_"3* MY2H?A5+H_L[)E#1_2::HD_I,:^VM2ATON`LJKXW?IVX)-1O&%"MP3@RI1T+2 MQH%HAD'89=2_M MFVY7@X_:/4+NSD_\I[G'CZO-PVS%`:3>*IMMM4(T\5P][19+<+:6].1RK?$@4ZOP;F-.-YFYHPY22EW&9\9 M5+UJ$R[E8Q%^'E59J^OLV3@BWT@X_JZNE=J#6RA`'W_7]L,!'5(W/GM=W<58 M!HELU]6U\?O434=-3IL?:JOU[F8ZN#8G3N]NV!G3PZ3=8AEUD9GU44C/%8/" MBN^/\/B\RT"%U_X$R)`#@:$X9:TVWT*=IRND:G:]F.*<22__`KG,N628^>'7 M#5RH+8ZK#C=[_M/&%3G48JQ\LHVK0^RWMW$55K\$42XQ*DIE(B&1_1:=3!]I M/GV0S;X:C^2Q`7!-?.YA9;PNX;-6W/S!CI6"WYTO7LU`]1DP3`@H'Z8YCL%L M'9B0#KU2`[W-OGE*;@>3GFBM[;\^>_ILBY]V@[[N MULLY.>/P:DMP,U1WO*<XF()388$:/KO/5;GBP[O+QW\$KTC)"5)'%0L91 M5>C5\0_[IM!4I/=;!5#9-8HZ;_/>0R3U!OX!8 MK7;I+9PZZJ^-WZ=.A9JUE!2[[UWGGYZXOQE=]L-;T8G=IL@NM\OOV9;1V/A@ M=]7=T7D`T8?/RW4SDBN3H]>UA`#VR5.-F9B.S7*ON8O:RETKC#_96_K?U M\D\!I!_.:T6&]C"$XX4QS3?!@.8[,GQ?;#9[>U;\K/[!<4^*/YX7*YLZ$1?\6P$.K6+#",:`,6^K>WX;5AS4-L>!A\,Y-=QL1I$?TSLX\"L+[KZRV+.^W!VO_AN$V#>--5A#C<)Q"R6#\=Q#AS(+L7R MX3@2HB4="PCHW,_TVX?E?CO;_K3[B#*Q2V'&+4-K]4@;#58-Z$'-]J*@/12Y M]=C!S+-#P[,.OI%#A MF_V-1MUM&2_G]N2^5'9Q>'S,MHZHQ9:_4;/QC/O#/E,)#.UICPD\)\KQCK=& MB[JT9A.D+JFY'<_V3X$E%KF$=.0BTOKYM3UE0">5\)_\_?/O/P5?8)Z@Q':M M!Q(TV&*NL#N3Q`?_RLS'&1G.%S.JC:NI.HXJPIHA#S;)5_J+AADU&/C_CH8I MA3[*M]0Z3+4LUBJ5%$5O*))_^-UWY3I#_OV M7R=`TQ[W2945UZ6;RU_&.J^55K6G*KPA5=;&;Y!%0D;N6^CO_W%TX;Z9;"62 MI^%!VEGO'S)\Y7F46/342HJ=M0 M*\'7B\&F7/HTD.:?:"WPUPDTYL'P.[<7RJ82D&\`S64=!S/Q!?[+*[39T:?(D2N=2SM MN/<,D;&E4P+=@\#".HXN>_\A?1.CO?^2ONW3TVZAN9-C1(^/]N[A3\J%Y*6= M\_F8&?9_W-.3^5.V.*Q,FR!53].'[RMRCR+%4;)+^*ME(BF#UZ1P2<^-;T=\ MSV]PR7.(TF\QF0%_)'VW,YY=66+9`63O''<#%_;K=,&QYZ2)UNF>"RH-683W M&'4RDG^$X=KXUTK(0.!J"3_*'-'=P$SC=M>#W(1,+.Z6R;&;UYWJN_3MNF"C M1:Z&.FOC7RLA)M`BX4=1S;C_IDS56&RYI8.>BXH?5K<3$)]GI$2XF;O833>R M.&7*C]V@U%\8LA1\M`."5B=??)U\^,255DGF7Y+`:2`6#=CH]2\4:TDQ80_#P6_;S:!5\'%8H$T"^7VD&+A/\ M#LW5QK]>JBFEV#"A>%F`8,\DC=Z,$[B'TDD(?WA=DTG+R9C&YX.-`/F4AP4! M/J_]M:87R05:W;SQMMRY M8W9[:OH+,CP_("ZAB/7O'HVSV1^J#K(DBT"$\4!$-46"W-O_DM`HK8WG1/C: M^"\4$_?9QGU27NO:_IKT2W3<9K_].K.3'-]XJAKU5%#6,%Z+BFKC7R!O"3G> MBG)\AMY(U_N*7Q"^C.UD]H./([-:ZMGO']0_F#^'H\]FYLCISVPDKLM*&_@? MZJB-2]#B9E+/.:;5WV[6Z]>\GF?%G. ML*00$GJ=-31PLLJR%P-MG$5EX.BL609NGL4:_,DF]6RL?-8ZHGXZ[!?VVU") MADH@>-8VJBF1"0VDN#!DJXTKB9I"A,<2ZO\A2FGE2G%3Q^7<&A$B=FMQ%G]CIU4V+%^I)JJ`U6[7L^9+K@3^18]5"023;1% MK*F^Q^(>]X8D.ME1M4`SE]@-U8O9WN3G?XJGUN)A&_(U/,<\$G8X#B`.@X\[ M.`>@#KV6L+J'#_H9EFOC2J)8B,@10GTBO>ZRMMM`::IO;CL9ZEZ$B\-^#QP1 MY%L`^(TCC+_^-%PN[,O3F_G"%"]?7J'2NA2 M.<6!V)Y[7I-DI7\";\M"9'&8FR27Z>/U_*;;9JU&AW\1"KZ: M'MA&)9>;/[-)?*0`_Q;4Q78S6\QGNWT^U(U:-ZO#WO=J>!1JN9OSS5((R^Q_YC34(MN4]/-ZO,^,.YZW)+ MP>5V4]#TC!`%7!R[MZ0*B)8UHI'=$A;,(EA].X'EXV&K'5*[@=MGK-7&U50- M1]7`[T-^.G![W7'W8C`<3`?VT\P0-WDT0PW4L3W0LMYK3X;IE6*-MNRXU-#\ M'*IXJ$;XLE0`1@"910*PF0/C>@#&'I@&8"L'\DXP\8;=8_=V4V%LN]V7`MBV?/>R.P%S^&7ZE-GM:?5Q6^2OVZ9EE;'Q?>[1C4BC M2^P%OQ((9C]."3#377`\C;@P^*#SP_4/.R(NS8@(?>2K:+HJCO-;;:K`/(TF M1?-NLEIFI[J(Z#*/[6XSGK.P*>%`DGJ2GY/Y3&1I)(6!3#SB7O[HV`SG:&TO M]RJW'][NVSSNC?4IE'?FM_NY!N/&7>:5:(OJ_.RIG;$<,!UN7L7O4HWVS$RQ MU+C+9.VRWUIQ28J)RSR'Y4VCXM80VS]-03,##/!G:RRK&;]<%:CG/SK9F6`^1,$ MX41H)3>.<1P>7-7&[Y!V'"E/0N9E\GV2T>U1%$1I)V^3-5G=LLXYQR`F'N-Y MLU?[=4VUY^,Q0=!09)QMY[A5+RI%"ABF?[W\:_L[7JB=VE10S2,\#D5]Q[B. MP>G8%VC32&(/SKREB3V:$#?'%&F]'L4IUBZ9;Q(]EJ[^*11,AGUX; M$_!%L1)2J]Z-"MFMUG.(6GHTBT$$DJ/9.*U6E$C-9(TLZ*B:,!5"9FHI<=^] MO![LG:3WUJ72^7M$HHHY%:+92L6/PPT5*Z@L#G#]Z0 M"#W$LM)@<_==8K%`=G6EU/$G/(0NAJ[)BRQE^);40RI)"(>EE&U/>?JM$"&@ M'_GRBVY*4XC?:>%WA'183MMJ>-K:9[X?:^#)!ZS*COJF+1G`J8!;!GS;G]P- MIP[>"?!/"AZ[M9^IQ.C758'Z.5U5^_1Q.+KH#@'GV^>V@N&HET.;'NIH/YE] MGF'?X6*/HX!&M4)E'R\'9@_`@1/`C=2`N[U>?WA_?S:U<'8W3H#>Z MR4O'):4A<*5;KC1>`.K:I]_Z7_/")78(WI5-75FL$.+:IVLSF*WC(ZC5T`2M@NOS'+K)N>KZ6DYP*1JR5UM72D%M=]EW?22,/FZR$S M\'%WV)].J1Q4B92>2$H;2?D742ECZ^G?^#I*Y(1`RK>D/$)";SWYQU"^1$(( MI'PJY1$/>EM^XMP#_K[,.*%P-31D7B`!R`]KG&9F]A64&"8$4CZ6\E@E]-:X MN\[%`"BS1RBDAK;4@"52P!KVS:6OH,0]0N#*V]0&_^(AH;?EL8*\BJC42SH: MJ:4IM>`I*6*=Q-#74.(I+5Y*)U(:3PFY*8TI@V?U8DK:^>/NU@2*`A:?:(B9 M+^PK+2":R&3IK[JW-KH4L'06C[?PPW#]Z"J^Z1]1QIZRIJ"M`-W/OMFKEF=3 M``EKO57V2&"7!^/[#3&F7^QLE]^>(/!AY8.)TC?/@,)-=>IU#4K?`#57^<$UYF89.J#C^]Q9J*$R(&CF/I^&)P+$" M"!!+4:2>`KD4IN,P!(_\:%C!:`W!.-?N!.-EC?2'%NIG$`EN'?4>:BR;4@X\ M%'BLX)J^)7!\$@2664W1]A24#%6F'D$)A>GD&(29#/[6=[*XCV[/CX29GTH# M^1YR^I]B0(<"C@)XK*A%=,*?'#_4!"U/0#E?7^+AT`=$VR-\ITQ$$L(@!(GD MAL-/_@CW&1RYU(1&*%8;:X2-D/@7?P8%VM0DD2>I]<[^P62G_W?OY>4?ENOY MZK#(_N'5_-BL_\]3[;[WJ7N;ISA,)HP)S69US^Q?II)#)#=[`?)*I+#>W^5P M,C*1B_/<6IW8[N+U]&7GA]]-7N-A!2P)5EQ6#VTR!U.?8:B:*A(J8@W(88Y/ M3O,WL<87K:^O)P8(M537DNJLZ6MX(G"<&`1*!T3L2@.\(KV^VAR_>KMXM1#4 M`I4Z8*DKTL)UI%4[&BIH[$3/OPP,B!5G$^--^S=RE[D+HY.Q-X\8O<:AD9,W!= M&[]+'`LQXR@OQ8+XU]OL)9OYZR#JEMNK/%]B"G'(QE]VT\C)?+9V6*W5@W=,S?I? M]TPI.-.C[*K:]DG9G[RA4Y`4Y1!6.8EK]]>CNTF_J`Y3'G687MX<=IDV&6U0 M;L-;-XTM53"&Z&`YEN0/JBN.8:>,9PP%MFKW)I"]''W.#<1.5\>LXQ@*(X#Z M*XKZ9L1+<)&)%6")9@CPK83/]I8WCW49_GP3NIBN6KPPL6$532HT^&,A-GZA M=S^'X^Y@84C=HP M]-!(3.\&6-.2<9<3DU&(9HYPKL+=,K2]HVCR+KK.U@<%;@L8"57[^JL"5'U> M\\($66.1U?J)$K1T-ME21U<57SS,=ID-,.P21X[K-LPH=O/A<&/?@V&_[7A6 M^&2F:X711P)]17M;$5-=3.1PC&@Z1`R#$`Q/*%HY1N<(6SJC2+8)<1H MF9G!;CH&7Z]9?MSWMAE;C+`,:_"KPW,VR;;+V4I]==MO0Z\M4]8DK,[4E3N-,GH.U[#`J`?__U"WL'PIGH14 M-7+F3>-"EJ?E[5?C^P\7L ML+@]]:F/%\OU;/LS>-+&^>-8'T%-6A8T.NQ_]/:[JQ6B`4]R^.5NJ^%M"[_< M;\57Y^#T@VG,D*J#?OZ#B+;$](LML%P?LM'Z2_A.;KLAS7S)`9$%#-;^;YX' MXB$*YC.!(LC-8;7*`8AQN]\%M@`GEJWNPV:['ZVI)$>DB'%X?OX9Y:".B>?T MQ]'U^T9?[`L6SRW$`!%&0]/80C>!DI,<%O9]KV!1W3;CI6SHK]H1_AK; MP@Z)N/F7]6``1X!=B,T/%V)?7\L#:&*I,8ZC&/B_AB,UYA>21K-\IR- M__B_BJ-T[^H(RAYX^_%/A^P08CZ/N%4(;-ECK&/)P8E2H]8_QA90^@#-D<^& M[?W>'NEVSXAIMZVQKE'=LQ[END=_VR[@[*`*8PV*IJA+#H!X!:B^#UBM!?I> MB?N2S=7';X\14?CX;;`EAIVS(\[/!3O"!K`3%G78`E:D<2SF^)?%'$1B0W8J M']W9K`KX2-Z"F2T&Z[WI^=G*[T"'@6?1T\W>XZX/J_WR9;7,MLIZBF3&H>[V M,]8PP928LZLKP[(\765MZNZG%@KA6>7Q+YFU$GP,/E_808AR["$ST0L9V^C1 MS&R?\OW&,6D?QK#8P?$2M>DDT]4VK:]W>G>