From 42a8924c6e0214bef33cbea43a5eb5d21f707002 Mon Sep 17 00:00:00 2001 From: TwinFan Date: Sun, 18 Jun 2023 23:02:08 +0200 Subject: [PATCH 1/5] Updated XPMP2, referred to its updated SDK --- CMakeLists.txt | 23 +- XPMP2-Sample.xcodeproj/project.pbxproj | 14 +- lib/SDK/CHeaders/XPLM/XPLMCamera.h | 167 --- lib/SDK/CHeaders/XPLM/XPLMDataAccess.h | 716 --------- lib/SDK/CHeaders/XPLM/XPLMDefs.h | 514 ------- lib/SDK/CHeaders/XPLM/XPLMDisplay.h | 1658 --------------------- lib/SDK/CHeaders/XPLM/XPLMGraphics.h | 437 ------ lib/SDK/CHeaders/XPLM/XPLMInstance.h | 136 -- lib/SDK/CHeaders/XPLM/XPLMMap.h | 628 -------- lib/SDK/CHeaders/XPLM/XPLMMenus.h | 290 ---- lib/SDK/CHeaders/XPLM/XPLMNavigation.h | 362 ----- lib/SDK/CHeaders/XPLM/XPLMPlanes.h | 287 ---- lib/SDK/CHeaders/XPLM/XPLMPlugin.h | 422 ------ lib/SDK/CHeaders/XPLM/XPLMProcessing.h | 264 ---- lib/SDK/CHeaders/XPLM/XPLMScenery.h | 450 ------ lib/SDK/CHeaders/XPLM/XPLMUtilities.h | 970 ------------ lib/SDK/Libraries/Mac/XPLM.framework/XPLM | Bin 566176 -> 0 bytes lib/SDK/Libraries/Win/XPLM_64.lib | Bin 51320 -> 0 bytes lib/SDK/README.txt | 222 --- lib/SDK/license.txt | 27 - 20 files changed, 16 insertions(+), 7571 deletions(-) delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMCamera.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMDataAccess.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMDefs.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMDisplay.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMGraphics.h delete mode 100644 lib/SDK/CHeaders/XPLM/XPLMInstance.h delete mode 100644 lib/SDK/CHeaders/XPLM/XPLMMap.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMMenus.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMNavigation.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMPlanes.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMPlugin.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMProcessing.h delete mode 100644 lib/SDK/CHeaders/XPLM/XPLMScenery.h delete mode 100755 lib/SDK/CHeaders/XPLM/XPLMUtilities.h delete mode 100755 lib/SDK/Libraries/Mac/XPLM.framework/XPLM delete mode 100644 lib/SDK/Libraries/Win/XPLM_64.lib delete mode 100644 lib/SDK/README.txt delete mode 100644 lib/SDK/license.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d3d6b4..86a4041 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,16 +26,9 @@ else() endif() project(XPMP2-Sample - VERSION 3.1.0 + VERSION 3.2.0 DESCRIPTION "XPMP2-Sample X-Plane plugin") -# Provide compile macros from the above project version definition -add_compile_definitions( - XPMP2_VERSION="${PROJECT_VERSION}" - XPMP2_VER_MAJOR=${PROJECT_VERSION_MAJOR} - XPMP2_VER_MINOR=${PROJECT_VERSION_MINOR} -) - message ("== Building: ${PROJECT_NAME} ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} ==") message ("Compiler Info:") message ("CMAKE_CXX_COMPILER_ID = ${CMAKE_CXX_COMPILER_ID}") @@ -59,9 +52,9 @@ if (WIN32) set(ENV{platform} "win") endif() elseif(APPLE) - set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) - add_compile_options(-mmacosx-version-min=11.0) - add_link_options(-mmacosx-version-min=11.0) + set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15) + add_compile_options(-mmacosx-version-min=10.15) + add_link_options(-mmacosx-version-min=10.15) endif() ################################################################################ @@ -77,7 +70,7 @@ set_property(GLOBAL PROPERTY CXX_STANDARD 17) ################################################################################ # Enable all X-Plane SDK APIs up to the newest version. -add_compile_definitions(XPLM200=1 XPLM210=1 XPLM300=1 XPLM301=1 XPLM303=1) +add_compile_definitions(XPLM200=1 XPLM210=1 XPLM300=1 XPLM301=1 XPLM303=1 XPLM400=1) # Define platform macros. add_compile_definitions(APL=$ IBM=$ LIN=$,$>>) @@ -136,7 +129,7 @@ add_library(XPMP2-Sample MODULE # Header include directories target_include_directories(XPMP2-Sample PRIVATE ${ADDITIONAL_INCLUDES} - ${CMAKE_CURRENT_SOURCE_DIR}/lib/SDK/CHeaders/XPLM + ${CMAKE_CURRENT_SOURCE_DIR}/lib/XPMP2/lib/SDK/CHeaders/XPLM ${CMAKE_CURRENT_SOURCE_DIR}/lib/XPMP2/inc ) @@ -149,10 +142,10 @@ target_include_directories(XPMP2-Sample PRIVATE # XPMP2 path is hard-coded. Couldn't convince find_library to distinguish libXPMP2.a from XPMP2.lib in Mingw vs MSVC build. if (APPLE) list(APPEND CMAKE_FRAMEWORK_PATH - "${CMAKE_CURRENT_SOURCE_DIR}/lib/SDK/Libraries/Mac") + "${CMAKE_CURRENT_SOURCE_DIR}/lib/XPMP2/lib/SDK/Libraries/Mac") else () list(APPEND CMAKE_LIBRARY_PATH - "${CMAKE_CURRENT_SOURCE_DIR}/lib/SDK/Libraries/Win") + "${CMAKE_CURRENT_SOURCE_DIR}/lib/XPMP2/lib/SDK/Libraries/Win") endif () # FMOD Library only if requested diff --git a/XPMP2-Sample.xcodeproj/project.pbxproj b/XPMP2-Sample.xcodeproj/project.pbxproj index 8cae733..920793d 100644 --- a/XPMP2-Sample.xcodeproj/project.pbxproj +++ b/XPMP2-Sample.xcodeproj/project.pbxproj @@ -7,10 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - 254A0B7A2918533F004CA228 /* XPLM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 254A0B792918533F004CA228 /* XPLM.framework */; }; 254A0B7C29185357004CA228 /* libfmod.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 254A0B7B29185357004CA228 /* libfmod.dylib */; }; 254A0B89291853EF004CA228 /* XPMP2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 254A0B84291853CD004CA228 /* XPMP2.framework */; }; 2572C40623D88802006A7726 /* XPMP2-Sample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2572C40523D88802006A7726 /* XPMP2-Sample.cpp */; }; + 25F4A2E72A3F9CF8002509C3 /* XPLM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25F4A2E62A3F9CF8002509C3 /* XPLM.framework */; }; D6A7BDC116A1DEC000D1426A /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6A7BDC016A1DEC000D1426A /* CoreFoundation.framework */; }; /* End PBXBuildFile section */ @@ -59,6 +59,7 @@ 254A0B7D291853CD004CA228 /* XPMP2.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = XPMP2.xcodeproj; path = lib/XPMP2/XPMP2.xcodeproj; sourceTree = ""; }; 2572C40523D88802006A7726 /* XPMP2-Sample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "XPMP2-Sample.cpp"; sourceTree = ""; }; 25A0F27323E8B906007D6B6E /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; + 25F4A2E62A3F9CF8002509C3 /* XPLM.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XPLM.framework; path = lib/XPMP2/lib/SDK/Libraries/Mac/XPLM.framework; sourceTree = ""; }; D607B19909A556E400699BC3 /* XPMP2-Sample.xpl */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = "XPMP2-Sample.xpl"; sourceTree = BUILT_PRODUCTS_DIR; }; D6A7BDA916A1DEA200D1426A /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; D6A7BDC016A1DEC000D1426A /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; @@ -71,7 +72,7 @@ files = ( D6A7BDC116A1DEC000D1426A /* CoreFoundation.framework in Frameworks */, 254A0B7C29185357004CA228 /* libfmod.dylib in Frameworks */, - 254A0B7A2918533F004CA228 /* XPLM.framework in Frameworks */, + 25F4A2E72A3F9CF8002509C3 /* XPLM.framework in Frameworks */, 254A0B89291853EF004CA228 /* XPMP2.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -116,6 +117,7 @@ D6A7BDAD16A1DEA700D1426A /* Frameworks */ = { isa = PBXGroup; children = ( + 25F4A2E62A3F9CF8002509C3 /* XPLM.framework */, 254A0B7D291853CD004CA228 /* XPMP2.xcodeproj */, 254A0B7B29185357004CA228 /* libfmod.dylib */, 254A0B792918533F004CA228 /* XPLM.framework */, @@ -251,7 +253,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; EXECUTABLE_EXTENSION = xpl; - FRAMEWORK_SEARCH_PATHS = lib/SDK/Libraries/Mac; + FRAMEWORK_SEARCH_PATHS = lib/XPMP2/lib/SDK/Libraries/Mac; GCC_C_LANGUAGE_STANDARD = c11; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -286,7 +288,7 @@ GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( - lib/SDK/CHeaders/XPLM, + lib/XPMP2/lib/SDK/CHeaders/XPLM, lib/XPMP2/inc, "$(HEADER_SEARCH_PATHS)", ); @@ -356,7 +358,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; EXECUTABLE_EXTENSION = xpl; - FRAMEWORK_SEARCH_PATHS = lib/SDK/Libraries/Mac; + FRAMEWORK_SEARCH_PATHS = lib/XPMP2/lib/SDK/Libraries/Mac; GCC_C_LANGUAGE_STANDARD = c11; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -390,7 +392,7 @@ GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( - lib/SDK/CHeaders/XPLM, + lib/XPMP2/lib/SDK/CHeaders/XPLM, lib/XPMP2/inc, "$(HEADER_SEARCH_PATHS)", ); diff --git a/lib/SDK/CHeaders/XPLM/XPLMCamera.h b/lib/SDK/CHeaders/XPLM/XPLMCamera.h deleted file mode 100755 index db930ef..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMCamera.h +++ /dev/null @@ -1,167 +0,0 @@ -#ifndef _XPLMCamera_h_ -#define _XPLMCamera_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMCamera - ***************************************************************************/ -/* - * The XPLMCamera APIs allow plug-ins to control the camera angle in X-Plane. - * This has a number of applications, including but not limited to: - * - * - Creating new views (including dynamic/user-controllable views) for the - * user. - * - Creating applications that use X-Plane as a renderer of scenery, - * aircrafts, or both. - * - * The camera is controlled via six parameters: a location in OpenGL - * coordinates and pitch, roll and yaw, similar to an airplane's position. - * OpenGL coordinate info is described in detail in the XPLMGraphics - * documentation; generally you should use the XPLMGraphics routines to - * convert from world to local coordinates. The camera's orientation starts - * facing level with the ground directly up the negative-Z axis (approximately - * north) with the horizon horizontal. It is then rotated clockwise for yaw, - * pitched up for positive pitch, and rolled clockwise around the vector it is - * looking along for roll. - * - * You control the camera either either until the user selects a new view or - * permanently (the later being similar to how UDP camera control works). You - * control the camera by registering a callback per frame from which you - * calculate the new camera positions. This guarantees smooth camera motion. - * - * Use the XPLMDataAccess APIs to get information like the position of the - * aircraft, etc. for complex camera positioning. - * - * Note: if your goal is to move the virtual pilot in the cockpit, this API is - * not needed; simply update the datarefs for the pilot's head position. - * - * For custom exterior cameras, set the camera's mode to an external view - * first to get correct sound and 2-d panel behavior. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * CAMERA CONTROL - ***************************************************************************/ - -/* - * XPLMCameraControlDuration - * - * This enumeration states how long you want to retain control of the camera. - * You can retain it indefinitely or until the user selects a new view. - * - */ -enum { - /* Control the camera until the user picks a new view. */ - xplm_ControlCameraUntilViewChanges = 1, - - /* Control the camera until your plugin is disabled or another plugin forcably* - * takes control. */ - xplm_ControlCameraForever = 2, - - -}; -typedef int XPLMCameraControlDuration; - -/* - * XPLMCameraPosition_t - * - * This structure contains a full specification of the camera. X, Y, and Z are - * the camera's position in OpenGL coordiantes; pitch, roll, and yaw are - * rotations from a camera facing flat north in degrees. Positive pitch means - * nose up, positive roll means roll right, and positive yaw means yaw right, - * all in degrees. Zoom is a zoom factor, with 1.0 meaning normal zoom and 2.0 - * magnifying by 2x (objects appear larger). - * - */ -typedef struct { - float x; - float y; - float z; - float pitch; - float heading; - float roll; - float zoom; -} XPLMCameraPosition_t; - -/* - * XPLMCameraControl_f - * - * You use an XPLMCameraControl function to provide continuous control over - * the camera. You are passed in a structure in which to put the new camera - * position; modify it and return 1 to reposition the camera. Return 0 to - * surrender control of the camera; camera control will be handled by X-Plane - * on this draw loop. The contents of the structure as you are called are - * undefined. - * - * If X-Plane is taking camera control away from you, this function will be - * called with inIsLosingControl set to 1 and ioCameraPosition NULL. - * - */ -typedef int (* XPLMCameraControl_f)( - XPLMCameraPosition_t * outCameraPosition, /* Can be NULL */ - int inIsLosingControl, - void * inRefcon); - -/* - * XPLMControlCamera - * - * This function repositions the camera on the next drawing cycle. You must - * pass a non-null control function. Specify in inHowLong how long you'd like - * control (indefinitely or until a new view mode is set by the user). - * - */ -XPLM_API void XPLMControlCamera( - XPLMCameraControlDuration inHowLong, - XPLMCameraControl_f inControlFunc, - void * inRefcon); - -/* - * XPLMDontControlCamera - * - * This function stops you from controlling the camera. If you have a camera - * control function, it will not be called with an inIsLosingControl flag. - * X-Plane will control the camera on the next cycle. - * - * For maximum compatibility you should not use this routine unless you are in - * posession of the camera. - * - */ -XPLM_API void XPLMDontControlCamera(void); - -/* - * XPLMIsCameraBeingControlled - * - * This routine returns 1 if the camera is being controlled, zero if it is - * not. If it is and you pass in a pointer to a camera control duration, the - * current control duration will be returned. - * - */ -XPLM_API int XPLMIsCameraBeingControlled( - XPLMCameraControlDuration * outCameraControlDuration); /* Can be NULL */ - -/* - * XPLMReadCameraPosition - * - * This function reads the current camera position. - * - */ -XPLM_API void XPLMReadCameraPosition( - XPLMCameraPosition_t * outCameraPosition); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMDataAccess.h b/lib/SDK/CHeaders/XPLM/XPLMDataAccess.h deleted file mode 100755 index d8d1418..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMDataAccess.h +++ /dev/null @@ -1,716 +0,0 @@ -#ifndef _XPLMDataAccess_h_ -#define _XPLMDataAccess_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMDataAccess - ***************************************************************************/ -/* - * The data access API gives you a generic, flexible, high performance way to - * read and write data to and from X-Plane and other plug-ins. For example, - * this API allows you to read and set the nav radios, get the plane location, - * determine the current effective graphics frame rate, etc. - * - * The data access APIs are the way that you read and write data from the sim - * as well as other plugins. - * - * The API works using opaque data references. A data reference is a source of - * data; you do not know where it comes from, but once you have it you can - * read the data quickly and possibly write it. - * - * Dataref Lookup - * -------------- - * - * Data references are identified by verbose, permanent string names; by - * convention these names use path separates to form a hierarchy of datarefs, - * e.g. (sim/cockpit/radios/nav1_freq_hz). The actual opaque numeric value of - * the data reference, as returned by the XPLM API, is implementation defined - * and changes each time X-Plane is launched; therefore you need to look up - * the dataref by path every time your plugin runs. - * - * The task of looking up a data reference is relatively expensive; look up - * your data references once based on the verbose path strings, and save the - * opaque data reference value for the duration of your plugin's operation. - * Reading and writing data references is relatively fast (the cost is - * equivalent to two function calls through function pointers). - * - * X-Plane publishes over 4000 datarefs; a complete list may be found in the - * reference section of the SDK online documentation (from the SDK home page, - * choose Documentation). - * - * Dataref Types - * ------------- - * - * A note on typing: you must know the correct data type to read and write. - * APIs are provided for reading and writing data in a number of ways. You can - * also double check the data type for a data ref. Automatic type conversion - * is not done for you. - * - * Dataref types are a set, e.g. a dataref can be more than one type. When - * this happens, you can choose which API you want to use to read. For - * example, it is not uncommon for a dataref to be of type float and double. - * This means you can use either XPLMGetDatad or XPLMGetDataf to read it. - * - * Creating New Datarefs - * --------------------- - * - * X-Plane provides datarefs that come with the sim, but plugins can also - * create their own datarefs. A plugin creates a dataref by registering - * function callbacks to read and write the dataref. The XPLM will call your - * plugin each time some other plugin (or X-Plane) tries to read or write the - * dataref. You must provide a read (and optional write) callback for each - * data type you support. - * - * A note for plugins sharing data with other plugins: the load order of - * plugins is not guaranteed. To make sure that every plugin publishing data - * has published their data references before other plugins try to subscribe, - * publish your data references in your start routine but resolve them the - * first time your 'enable' routine is called, or the first time they are - * needed in code. - * - * When a plugin that created a dataref is unloaded, it becomes "orphaned". - * The dataref handle continues to be usable, but the dataref is not writable, - * and reading it will always return 0 (or 0 items for arrays). If the plugin - * is reloaded and re-registers the dataref, the handle becomes un-orphaned - * and works again. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * READING AND WRITING DATA - ***************************************************************************/ -/* - * These routines allow you to access data from within X-Plane and sometimes - * modify it. - * - */ - - -/* - * XPLMDataRef - * - * A data ref is an opaque handle to data provided by the simulator or another - * plugin. It uniquely identifies one variable (or array of variables) over - * the lifetime of your plugin. You never hard code these values; you always - * get them from XPLMFindDataRef. - * - */ -typedef void * XPLMDataRef; - -/* - * XPLMDataTypeID - * - * This is an enumeration that defines the type of the data behind a data - * reference. This allows you to sanity check that the data type matches what - * you expect. But for the most part, you will know the type of data you are - * expecting from the online documentation. - * - * Data types each take a bit field; it is legal to have a single dataref be - * more than one type of data. Whe this happens, you can pick any matching - * get/set API. - * - */ -enum { - /* Data of a type the current XPLM doesn't do. */ - xplmType_Unknown = 0, - - /* A single 4-byte integer, native endian. */ - xplmType_Int = 1, - - /* A single 4-byte float, native endian. */ - xplmType_Float = 2, - - /* A single 8-byte double, native endian. */ - xplmType_Double = 4, - - /* An array of 4-byte floats, native endian. */ - xplmType_FloatArray = 8, - - /* An array of 4-byte integers, native endian. */ - xplmType_IntArray = 16, - - /* A variable block of data. */ - xplmType_Data = 32, - - -}; -typedef int XPLMDataTypeID; - -/* - * XPLMFindDataRef - * - * Given a c-style string that names the data ref, this routine looks up the - * actual opaque XPLMDataRef that you use to read and write the data. The - * string names for datarefs are published on the X-Plane SDK web site. - * - * This function returns NULL if the data ref cannot be found. - * - * NOTE: this function is relatively expensive; save the XPLMDataRef this - * function returns for future use. Do not look up your data ref by string - * every time you need to read or write it. - * - */ -XPLM_API XPLMDataRef XPLMFindDataRef( - const char * inDataRefName); - -/* - * XPLMCanWriteDataRef - * - * Given a data ref, this routine returns true if you can successfully set the - * data, false otherwise. Some datarefs are read-only. - * - * NOTE: even if a dataref is marked writable, it may not act writable. This - * can happen for datarefs that X-Plane writes to on every frame of - * simulation. In some cases, the dataref is writable but you have to set a - * separate "override" dataref to 1 to stop X-Plane from writing it. - * - */ -XPLM_API int XPLMCanWriteDataRef( - XPLMDataRef inDataRef); - -/* - * XPLMIsDataRefGood - * - * This function returns true if the passed in handle is a valid dataref that - * is not orphaned. - * - * Note: there is normally no need to call this function; datarefs returned by - * XPLMFindDataRef remain valid (but possibly orphaned) unless there is a - * complete plugin reload (in which case your plugin is reloaded anyway). - * Orphaned datarefs can be safely read and return 0. Therefore you never need - * to call XPLMIsDataRefGood to 'check' the safety of a dataref. - * (XPLMIsDatarefGood performs some slow checking of the handle validity, so - * it has a perormance cost.) - * - */ -XPLM_API int XPLMIsDataRefGood( - XPLMDataRef inDataRef); - -/* - * XPLMGetDataRefTypes - * - * This routine returns the types of the data ref for accessor use. If a data - * ref is available in multiple data types, the bit-wise OR of these types - * will be returned. - * - */ -XPLM_API XPLMDataTypeID XPLMGetDataRefTypes( - XPLMDataRef inDataRef); - -/*************************************************************************** - * DATA ACCESSORS - ***************************************************************************/ -/* - * These routines read and write the data references. For each supported data - * type there is a reader and a writer. - * - * If the data ref is orphaned or the plugin that provides it is disabled or - * there is a type mismatch, the functions that read data will return 0 as a - * default value or not modify the passed in memory. The plugins that write - * data will not write under these circumstances or if the data ref is - * read-only. - * - * NOTE: to keep the overhead of reading datarefs low, these routines do not - * do full validation of a dataref; passing a junk value for a dataref can - * result in crashing the sim. The get/set APIs do check for NULL. - * - * For array-style datarefs, you specify the number of items to read/write and - * the offset into the array; the actual number of items read or written is - * returned. This may be less to prevent an array-out-of-bounds error. - * - */ - - -/* - * XPLMGetDatai - * - * Read an integer data ref and return its value. The return value is the - * dataref value or 0 if the dataref is NULL or the plugin is disabled. - * - */ -XPLM_API int XPLMGetDatai( - XPLMDataRef inDataRef); - -/* - * XPLMSetDatai - * - * Write a new value to an integer data ref. This routine is a no-op if the - * plugin publishing the dataref is disabled, the dataref is NULL, or the - * dataref is not writable. - * - */ -XPLM_API void XPLMSetDatai( - XPLMDataRef inDataRef, - int inValue); - -/* - * XPLMGetDataf - * - * Read a single precision floating point dataref and return its value. The - * return value is the dataref value or 0.0 if the dataref is NULL or the - * plugin is disabled. - * - */ -XPLM_API float XPLMGetDataf( - XPLMDataRef inDataRef); - -/* - * XPLMSetDataf - * - * Write a new value to a single precision floating point data ref. This - * routine is a no-op if the plugin publishing the dataref is disabled, the - * dataref is NULL, or the dataref is not writable. - * - */ -XPLM_API void XPLMSetDataf( - XPLMDataRef inDataRef, - float inValue); - -/* - * XPLMGetDatad - * - * Read a double precision floating point dataref and return its value. The - * return value is the dataref value or 0.0 if the dataref is NULL or the - * plugin is disabled. - * - */ -XPLM_API double XPLMGetDatad( - XPLMDataRef inDataRef); - -/* - * XPLMSetDatad - * - * Write a new value to a double precision floating point data ref. This - * routine is a no-op if the plugin publishing the dataref is disabled, the - * dataref is NULL, or the dataref is not writable. - * - */ -XPLM_API void XPLMSetDatad( - XPLMDataRef inDataRef, - double inValue); - -/* - * XPLMGetDatavi - * - * Read a part of an integer array dataref. If you pass NULL for outValues, - * the routine will return the size of the array, ignoring inOffset and inMax. - * - * If outValues is not NULL, then up to inMax values are copied from the - * dataref into outValues, starting at inOffset in the dataref. If inMax + - * inOffset is larger than the size of the dataref, less than inMax values - * will be copied. The number of values copied is returned. - * - * Note: the semantics of array datarefs are entirely implemented by the - * plugin (or X-Plane) that provides the dataref, not the SDK itself; the - * above description is how these datarefs are intended to work, but a rogue - * plugin may have different behavior. - * - */ -XPLM_API int XPLMGetDatavi( - XPLMDataRef inDataRef, - int * outValues, /* Can be NULL */ - int inOffset, - int inMax); - -/* - * XPLMSetDatavi - * - * Write part or all of an integer array dataref. The values passed by - * inValues are written into the dataref starting at inOffset. Up to inCount - * values are written; however if the values would write "off the end" of the - * dataref array, then fewer values are written. - * - * Note: the semantics of array datarefs are entirely implemented by the - * plugin (or X-Plane) that provides the dataref, not the SDK itself; the - * above description is how these datarefs are intended to work, but a rogue - * plugin may have different behavior. - * - */ -XPLM_API void XPLMSetDatavi( - XPLMDataRef inDataRef, - int * inValues, - int inoffset, - int inCount); - -/* - * XPLMGetDatavf - * - * Read a part of a single precision floating point array dataref. If you pass - * NULL for outVaules, the routine will return the size of the array, ignoring - * inOffset and inMax. - * - * If outValues is not NULL, then up to inMax values are copied from the - * dataref into outValues, starting at inOffset in the dataref. If inMax + - * inOffset is larger than the size of the dataref, less than inMax values - * will be copied. The number of values copied is returned. - * - * Note: the semantics of array datarefs are entirely implemented by the - * plugin (or X-Plane) that provides the dataref, not the SDK itself; the - * above description is how these datarefs are intended to work, but a rogue - * plugin may have different behavior. - * - */ -XPLM_API int XPLMGetDatavf( - XPLMDataRef inDataRef, - float * outValues, /* Can be NULL */ - int inOffset, - int inMax); - -/* - * XPLMSetDatavf - * - * Write part or all of a single precision floating point array dataref. The - * values passed by inValues are written into the dataref starting at - * inOffset. Up to inCount values are written; however if the values would - * write "off the end" of the dataref array, then fewer values are written. - * - * Note: the semantics of array datarefs are entirely implemented by the - * plugin (or X-Plane) that provides the dataref, not the SDK itself; the - * above description is how these datarefs are intended to work, but a rogue - * plugin may have different behavior. - * - */ -XPLM_API void XPLMSetDatavf( - XPLMDataRef inDataRef, - float * inValues, - int inoffset, - int inCount); - -/* - * XPLMGetDatab - * - * Read a part of a byte array dataref. If you pass NULL for outVaules, the - * routine will return the size of the array, ignoring inOffset and inMax. - * - * If outValues is not NULL, then up to inMax values are copied from the - * dataref into outValues, starting at inOffset in the dataref. If inMax + - * inOffset is larger than the size of the dataref, less than inMax values - * will be copied. The number of values copied is returned. - * - * Note: the semantics of array datarefs are entirely implemented by the - * plugin (or X-Plane) that provides the dataref, not the SDK itself; the - * above description is how these datarefs are intended to work, but a rogue - * plugin may have different behavior. - * - */ -XPLM_API int XPLMGetDatab( - XPLMDataRef inDataRef, - void * outValue, /* Can be NULL */ - int inOffset, - int inMaxBytes); - -/* - * XPLMSetDatab - * - * Write part or all of a byte array dataref. The values passed by inValues - * are written into the dataref starting at inOffset. Up to inCount values are - * written; however if the values would write "off the end" of the dataref - * array, then fewer values are written. - * - * Note: the semantics of array datarefs are entirely implemented by the - * plugin (or X-Plane) that provides the dataref, not the SDK itself; the - * above description is how these datarefs are intended to work, but a rogue - * plugin may have different behavior. - * - */ -XPLM_API void XPLMSetDatab( - XPLMDataRef inDataRef, - void * inValue, - int inOffset, - int inLength); - -/*************************************************************************** - * PUBLISHING YOUR PLUGIN'S DATA - ***************************************************************************/ -/* - * These functions allow you to create data references that other plug-ins and - * X-Plane can access via the above data access APIs. Data references - * published by other plugins operate the same as ones published by X-Plane in - * all manners except that your data reference will not be available to other - * plugins if/when your plugin is disabled. - * - * You share data by registering data provider callback functions. When a - * plug-in requests your data, these callbacks are then called. You provide - * one callback to return the value when a plugin 'reads' it and another to - * change the value when a plugin 'writes' it. - * - * Important: you must pick a prefix for your datarefs other than "sim/" - - * this prefix is reserved for X-Plane. The X-Plane SDK website contains a - * registry where authors can select a unique first word for dataref names, to - * prevent dataref collisions between plugins. - * - */ - - -/* - * XPLMGetDatai_f - * - * Data provider function pointers. - * - * These define the function pointers you provide to get or set data. Note - * that you are passed a generic pointer for each one. This is the same - * pointer you pass in your register routine; you can use it to locate plugin - * variables, etc. - * - * The semantics of your callbacks are the same as the dataref accessor above - * - basically routines like XPLMGetDatai are just pass-throughs from a caller - * to your plugin. Be particularly mindful in implementing array dataref - * read-write accessors; you are responsible for avoiding overruns, supporting - * offset read/writes, and handling a read with a NULL buffer. - * - */ -typedef int (* XPLMGetDatai_f)( - void * inRefcon); - -/* - * XPLMSetDatai_f - * - */ -typedef void (* XPLMSetDatai_f)( - void * inRefcon, - int inValue); - -/* - * XPLMGetDataf_f - * - */ -typedef float (* XPLMGetDataf_f)( - void * inRefcon); - -/* - * XPLMSetDataf_f - * - */ -typedef void (* XPLMSetDataf_f)( - void * inRefcon, - float inValue); - -/* - * XPLMGetDatad_f - * - */ -typedef double (* XPLMGetDatad_f)( - void * inRefcon); - -/* - * XPLMSetDatad_f - * - */ -typedef void (* XPLMSetDatad_f)( - void * inRefcon, - double inValue); - -/* - * XPLMGetDatavi_f - * - */ -typedef int (* XPLMGetDatavi_f)( - void * inRefcon, - int * outValues, /* Can be NULL */ - int inOffset, - int inMax); - -/* - * XPLMSetDatavi_f - * - */ -typedef void (* XPLMSetDatavi_f)( - void * inRefcon, - int * inValues, - int inOffset, - int inCount); - -/* - * XPLMGetDatavf_f - * - */ -typedef int (* XPLMGetDatavf_f)( - void * inRefcon, - float * outValues, /* Can be NULL */ - int inOffset, - int inMax); - -/* - * XPLMSetDatavf_f - * - */ -typedef void (* XPLMSetDatavf_f)( - void * inRefcon, - float * inValues, - int inOffset, - int inCount); - -/* - * XPLMGetDatab_f - * - */ -typedef int (* XPLMGetDatab_f)( - void * inRefcon, - void * outValue, /* Can be NULL */ - int inOffset, - int inMaxLength); - -/* - * XPLMSetDatab_f - * - */ -typedef void (* XPLMSetDatab_f)( - void * inRefcon, - void * inValue, - int inOffset, - int inLength); - -/* - * XPLMRegisterDataAccessor - * - * This routine creates a new item of data that can be read and written. Pass - * in the data's full name for searching, the type(s) of the data for - * accessing, and whether the data can be written to. For each data type you - * support, pass in a read accessor function and a write accessor function if - * necessary. Pass NULL for data types you do not support or write accessors - * if you are read-only. - * - * You are returned a data ref for the new item of data created. You can use - * this data ref to unregister your data later or read or write from it. - * - */ -XPLM_API XPLMDataRef XPLMRegisterDataAccessor( - const char * inDataName, - XPLMDataTypeID inDataType, - int inIsWritable, - XPLMGetDatai_f inReadInt, - XPLMSetDatai_f inWriteInt, - XPLMGetDataf_f inReadFloat, - XPLMSetDataf_f inWriteFloat, - XPLMGetDatad_f inReadDouble, - XPLMSetDatad_f inWriteDouble, - XPLMGetDatavi_f inReadIntArray, - XPLMSetDatavi_f inWriteIntArray, - XPLMGetDatavf_f inReadFloatArray, - XPLMSetDatavf_f inWriteFloatArray, - XPLMGetDatab_f inReadData, - XPLMSetDatab_f inWriteData, - void * inReadRefcon, - void * inWriteRefcon); - -/* - * XPLMUnregisterDataAccessor - * - * Use this routine to unregister any data accessors you may have registered. - * You unregister a data ref by the XPLMDataRef you get back from - * registration. Once you unregister a data ref, your function pointer will - * not be called anymore. - * - */ -XPLM_API void XPLMUnregisterDataAccessor( - XPLMDataRef inDataRef); - -/*************************************************************************** - * SHARING DATA BETWEEN MULTIPLE PLUGINS - ***************************************************************************/ -/* - * The data reference registration APIs from the previous section allow a - * plugin to publish data in a one-owner manner; the plugin that publishes the - * data reference owns the real memory that the data ref uses. This is - * satisfactory for most cases, but there are also cases where plugnis need to - * share actual data. - * - * With a shared data reference, no one plugin owns the actual memory for the - * data reference; the plugin SDK allocates that for you. When the first - * plugin asks to 'share' the data, the memory is allocated. When the data is - * changed, every plugin that is sharing the data is notified. - * - * Shared data references differ from the 'owned' data references from the - * previous section in a few ways: - * - * * With shared data references, any plugin can create the data reference; - * with owned plugins one plugin must create the data reference and others - * subscribe. (This can be a problem if you don't know which set of plugins - * will be present). - * - * * With shared data references, every plugin that is sharing the data is - * notified when the data is changed. With owned data references, only the - * one owner is notified when the data is changed. - * - * * With shared data references, you cannot access the physical memory of the - * data reference; you must use the XPLMGet... and XPLMSet... APIs. With an - * owned data reference, the one owning data reference can manipulate the - * data reference's memory in any way it sees fit. - * - * Shared data references solve two problems: if you need to have a data - * reference used by several plugins but do not know which plugins will be - * installed, or if all plugins sharing data need to be notified when that - * data is changed, use shared data references. - * - */ - - -/* - * XPLMDataChanged_f - * - * An XPLMDataChanged_f is a callback that the XPLM calls whenever any other - * plug-in modifies shared data. A refcon you provide is passed back to help - * identify which data is being changed. In response, you may want to call one - * of the XPLMGetDataxxx routines to find the new value of the data. - * - */ -typedef void (* XPLMDataChanged_f)( - void * inRefcon); - -/* - * XPLMShareData - * - * This routine connects a plug-in to shared data, creating the shared data if - * necessary. inDataName is a standard path for the data ref, and inDataType - * specifies the type. This function will create the data if it does not - * exist. If the data already exists but the type does not match, an error is - * returned, so it is important that plug-in authors collaborate to establish - * public standards for shared data. - * - * If a notificationFunc is passed in and is not NULL, that notification - * function will be called whenever the data is modified. The notification - * refcon will be passed to it. This allows your plug-in to know which shared - * data was changed if multiple shared data are handled by one callback, or if - * the plug-in does not use global variables. - * - * A one is returned for successfully creating or finding the shared data; a - * zero if the data already exists but is of the wrong type. - * - */ -XPLM_API int XPLMShareData( - const char * inDataName, - XPLMDataTypeID inDataType, - XPLMDataChanged_f inNotificationFunc, - void * inNotificationRefcon); - -/* - * XPLMUnshareData - * - * This routine removes your notification function for shared data. Call it - * when done with the data to stop receiving change notifications. Arguments - * must match XPLMShareData. The actual memory will not necessarily be freed, - * since other plug-ins could be using it. - * - */ -XPLM_API int XPLMUnshareData( - const char * inDataName, - XPLMDataTypeID inDataType, - XPLMDataChanged_f inNotificationFunc, - void * inNotificationRefcon); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMDefs.h b/lib/SDK/CHeaders/XPLM/XPLMDefs.h deleted file mode 100755 index 2e95b81..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMDefs.h +++ /dev/null @@ -1,514 +0,0 @@ -#ifndef _XPLMDefs_h_ -#define _XPLMDefs_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMDefs - ***************************************************************************/ -/* - * This file is contains the cross-platform and basic definitions for the - * X-Plane SDK. - * - * The preprocessor macros APL and IBM must be defined to specify the - * compilation target; define APL to 1 and IBM 0 to compile on Macintosh and - * APL to 0 and IBM to 1 for Windows. You must specify these macro definitions - * before including XPLMDefs.h or any other XPLM headers. You can do this - * using the -D command line option or a preprocessor header. - * - */ - - -#ifdef __cplusplus -extern "C" { -#endif - -#if IBM -#include -#else -#include -#endif -/*************************************************************************** - * DLL Definitions - ***************************************************************************/ -/* - * These definitions control the importing and exporting of functions within - * the DLL. - * - * You can prefix your five required callbacks with the PLUGIN_API macro to - * declare them as exported C functions. The XPLM_API macro identifies - * functions that are provided to you via the plugin SDK. (Link against - * XPLM.lib to use these functions.) - * - */ - - -#ifdef __cplusplus - #if APL - #if __GNUC__ >= 4 - #define PLUGIN_API extern "C" __attribute__((visibility("default"))) - #elif __MACH__ - #define PLUGIN_API extern "C" - #else - #define PLUGIN_API extern "C" __declspec(dllexport) - #endif - #elif IBM - #define PLUGIN_API extern "C" __declspec(dllexport) - #elif LIN - #if __GNUC__ >= 4 - #define PLUGIN_API extern "C" __attribute__((visibility("default"))) - #else - #define PLUGIN_API extern "C" - #endif - #else - #error "Platform not defined!" - #endif -#else - #if APL - #if __GNUC__ >= 4 - #define PLUGIN_API __attribute__((visibility("default"))) - #elif __MACH__ - #define PLUGIN_API - #else - #define PLUGIN_API __declspec(dllexport) - #endif - #elif IBM - #define PLUGIN_API __declspec(dllexport) - #elif LIN - #if __GNUC__ >= 4 - #define PLUGIN_API __attribute__((visibility("default"))) - #else - #define PLUGIN_API - #endif - #else - #error "Platform not defined!" - #endif -#endif - -#if APL - #if XPLM - #if __GNUC__ >= 4 - #define XPLM_API __attribute__((visibility("default"))) - #elif __MACH__ - #define XPLM_API - #else - #define XPLM_API __declspec(dllexport) - #endif - #else - #define XPLM_API - #endif -#elif IBM - #if XPLM - #define XPLM_API __declspec(dllexport) - #else - #define XPLM_API __declspec(dllimport) - #endif -#elif LIN - #if XPLM - #if __GNUC__ >= 4 - #define XPLM_API __attribute__((visibility("default"))) - #else - #define XPLM_API - #endif - #else - #define XPLM_API - #endif -#else - #error "Platform not defined!" -#endif - -/*************************************************************************** - * GLOBAL DEFINITIONS - ***************************************************************************/ -/* - * These definitions are used in all parts of the SDK. - * - */ - - -/* - * XPLMPluginID - * - * Each plug-in is identified by a unique integer ID. This ID can be used to - * disable or enable a plug-in, or discover what plug-in is 'running' at the - * time. A plug-in ID is unique within the currently running instance of - * X-Plane unless plug-ins are reloaded. Plug-ins may receive a different - * unique ID each time they are loaded. This includes the unloading and - * reloading of plugins that are part of the user's aircraft. - * - * For persistent identification of plug-ins, use XPLMFindPluginBySignature in - * XPLMUtiltiies.h - * - * -1 indicates no plug-in. - * - */ -typedef int XPLMPluginID; - -/* No plugin. */ -#define XPLM_NO_PLUGIN_ID (-1) - -/* X-Plane itself */ -#define XPLM_PLUGIN_XPLANE (0) - -/* The current XPLM revision is 4.00 (400). */ -#define kXPLM_Version (400) - -/* - * XPLMKeyFlags - * - * These bitfields define modifier keys in a platform independent way. When a - * key is pressed, a series of messages are sent to your plugin. The down - * flag is set in the first of these messages, and the up flag in the last. - * While the key is held down, messages are sent with neither to indicate that - * the key is being held down as a repeated character. - * - * The control flag is mapped to the control flag on Macintosh and PC. - * Generally X-Plane uses the control key and not the command key on - * Macintosh, providing a consistent interface across platforms that does not - * necessarily match the Macintosh user interface guidelines. There is not - * yet a way for plugins to access the Macintosh control keys without using - * #ifdefed code. - * - */ -enum { - /* The shift key is down */ - xplm_ShiftFlag = 1, - - /* The option or alt key is down */ - xplm_OptionAltFlag = 2, - - /* The control key is down* */ - xplm_ControlFlag = 4, - - /* The key is being pressed down */ - xplm_DownFlag = 8, - - /* The key is being released */ - xplm_UpFlag = 16, - - -}; -typedef int XPLMKeyFlags; - -/*************************************************************************** - * ASCII CONTROL KEY CODES - ***************************************************************************/ -/* - * These definitions define how various control keys are mapped to ASCII key - * codes. Not all key presses generate an ASCII value, so plugin code should - * be prepared to see null characters come from the keyboard...this usually - * represents a key stroke that has no equivalent ASCII, like a page-down - * press. Use virtual key codes to find these key strokes. - * - * ASCII key codes take into account modifier keys; shift keys will affect - * capitals and punctuation; control key combinations may have no vaild ASCII - * and produce NULL. To detect control-key combinations, use virtual key - * codes, not ASCII keys. - * - */ - - -#define XPLM_KEY_RETURN 13 - -#define XPLM_KEY_ESCAPE 27 - -#define XPLM_KEY_TAB 9 - -#define XPLM_KEY_DELETE 8 - -#define XPLM_KEY_LEFT 28 - -#define XPLM_KEY_RIGHT 29 - -#define XPLM_KEY_UP 30 - -#define XPLM_KEY_DOWN 31 - -#define XPLM_KEY_0 48 - -#define XPLM_KEY_1 49 - -#define XPLM_KEY_2 50 - -#define XPLM_KEY_3 51 - -#define XPLM_KEY_4 52 - -#define XPLM_KEY_5 53 - -#define XPLM_KEY_6 54 - -#define XPLM_KEY_7 55 - -#define XPLM_KEY_8 56 - -#define XPLM_KEY_9 57 - -#define XPLM_KEY_DECIMAL 46 - -/*************************************************************************** - * VIRTUAL KEY CODES - ***************************************************************************/ -/* - * These are cross-platform defines for every distinct keyboard press on the - * computer. Every physical key on the keyboard has a virtual key code. So - * the "two" key on the top row of the main keyboard has a different code from - * the "two" key on the numeric key pad. But the 'w' and 'W' character are - * indistinguishable by virtual key code because they are the same physical - * key (one with and one without the shift key). - * - * Use virtual key codes to detect keystrokes that do not have ASCII - * equivalents, allow the user to map the numeric keypad separately from the - * main keyboard, and detect control key and other modifier-key combinations - * that generate ASCII control key sequences (many of which are not available - * directly via character keys in the SDK). - * - * To assign virtual key codes we started with the Microsoft set but made some - * additions and changes. A few differences: - * - * 1. Modifier keys are not available as virtual key codes. You cannot get - * distinct modifier press and release messages. Please do not try to use - * modifier keys as regular keys; doing so will almost certainly interfere - * with users' abilities to use the native X-Plane key bindings. - * 2. Some keys that do not exist on both Mac and PC keyboards are removed. - * 3. Do not assume that the values of these keystrokes are interchangeable - * with MS v-keys. - * - */ - - -#define XPLM_VK_BACK 0x08 - -#define XPLM_VK_TAB 0x09 - -#define XPLM_VK_CLEAR 0x0C - -#define XPLM_VK_RETURN 0x0D - -#define XPLM_VK_ESCAPE 0x1B - -#define XPLM_VK_SPACE 0x20 - -#define XPLM_VK_PRIOR 0x21 - -#define XPLM_VK_NEXT 0x22 - -#define XPLM_VK_END 0x23 - -#define XPLM_VK_HOME 0x24 - -#define XPLM_VK_LEFT 0x25 - -#define XPLM_VK_UP 0x26 - -#define XPLM_VK_RIGHT 0x27 - -#define XPLM_VK_DOWN 0x28 - -#define XPLM_VK_SELECT 0x29 - -#define XPLM_VK_PRINT 0x2A - -#define XPLM_VK_EXECUTE 0x2B - -#define XPLM_VK_SNAPSHOT 0x2C - -#define XPLM_VK_INSERT 0x2D - -#define XPLM_VK_DELETE 0x2E - -#define XPLM_VK_HELP 0x2F - -/* XPLM_VK_0 thru XPLM_VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */ -#define XPLM_VK_0 0x30 - -#define XPLM_VK_1 0x31 - -#define XPLM_VK_2 0x32 - -#define XPLM_VK_3 0x33 - -#define XPLM_VK_4 0x34 - -#define XPLM_VK_5 0x35 - -#define XPLM_VK_6 0x36 - -#define XPLM_VK_7 0x37 - -#define XPLM_VK_8 0x38 - -#define XPLM_VK_9 0x39 - -/* XPLM_VK_A thru XPLM_VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */ -#define XPLM_VK_A 0x41 - -#define XPLM_VK_B 0x42 - -#define XPLM_VK_C 0x43 - -#define XPLM_VK_D 0x44 - -#define XPLM_VK_E 0x45 - -#define XPLM_VK_F 0x46 - -#define XPLM_VK_G 0x47 - -#define XPLM_VK_H 0x48 - -#define XPLM_VK_I 0x49 - -#define XPLM_VK_J 0x4A - -#define XPLM_VK_K 0x4B - -#define XPLM_VK_L 0x4C - -#define XPLM_VK_M 0x4D - -#define XPLM_VK_N 0x4E - -#define XPLM_VK_O 0x4F - -#define XPLM_VK_P 0x50 - -#define XPLM_VK_Q 0x51 - -#define XPLM_VK_R 0x52 - -#define XPLM_VK_S 0x53 - -#define XPLM_VK_T 0x54 - -#define XPLM_VK_U 0x55 - -#define XPLM_VK_V 0x56 - -#define XPLM_VK_W 0x57 - -#define XPLM_VK_X 0x58 - -#define XPLM_VK_Y 0x59 - -#define XPLM_VK_Z 0x5A - -#define XPLM_VK_NUMPAD0 0x60 - -#define XPLM_VK_NUMPAD1 0x61 - -#define XPLM_VK_NUMPAD2 0x62 - -#define XPLM_VK_NUMPAD3 0x63 - -#define XPLM_VK_NUMPAD4 0x64 - -#define XPLM_VK_NUMPAD5 0x65 - -#define XPLM_VK_NUMPAD6 0x66 - -#define XPLM_VK_NUMPAD7 0x67 - -#define XPLM_VK_NUMPAD8 0x68 - -#define XPLM_VK_NUMPAD9 0x69 - -#define XPLM_VK_MULTIPLY 0x6A - -#define XPLM_VK_ADD 0x6B - -#define XPLM_VK_SEPARATOR 0x6C - -#define XPLM_VK_SUBTRACT 0x6D - -#define XPLM_VK_DECIMAL 0x6E - -#define XPLM_VK_DIVIDE 0x6F - -#define XPLM_VK_F1 0x70 - -#define XPLM_VK_F2 0x71 - -#define XPLM_VK_F3 0x72 - -#define XPLM_VK_F4 0x73 - -#define XPLM_VK_F5 0x74 - -#define XPLM_VK_F6 0x75 - -#define XPLM_VK_F7 0x76 - -#define XPLM_VK_F8 0x77 - -#define XPLM_VK_F9 0x78 - -#define XPLM_VK_F10 0x79 - -#define XPLM_VK_F11 0x7A - -#define XPLM_VK_F12 0x7B - -#define XPLM_VK_F13 0x7C - -#define XPLM_VK_F14 0x7D - -#define XPLM_VK_F15 0x7E - -#define XPLM_VK_F16 0x7F - -#define XPLM_VK_F17 0x80 - -#define XPLM_VK_F18 0x81 - -#define XPLM_VK_F19 0x82 - -#define XPLM_VK_F20 0x83 - -#define XPLM_VK_F21 0x84 - -#define XPLM_VK_F22 0x85 - -#define XPLM_VK_F23 0x86 - -#define XPLM_VK_F24 0x87 - -/* The following definitions are extended and are not based on the Microsoft * - * key set. */ -#define XPLM_VK_EQUAL 0xB0 - -#define XPLM_VK_MINUS 0xB1 - -#define XPLM_VK_RBRACE 0xB2 - -#define XPLM_VK_LBRACE 0xB3 - -#define XPLM_VK_QUOTE 0xB4 - -#define XPLM_VK_SEMICOLON 0xB5 - -#define XPLM_VK_BACKSLASH 0xB6 - -#define XPLM_VK_COMMA 0xB7 - -#define XPLM_VK_SLASH 0xB8 - -#define XPLM_VK_PERIOD 0xB9 - -#define XPLM_VK_BACKQUOTE 0xBA - -#define XPLM_VK_ENTER 0xBB - -#define XPLM_VK_NUMPAD_ENT 0xBC - -#define XPLM_VK_NUMPAD_EQ 0xBD - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMDisplay.h b/lib/SDK/CHeaders/XPLM/XPLMDisplay.h deleted file mode 100755 index db5006d..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMDisplay.h +++ /dev/null @@ -1,1658 +0,0 @@ -#ifndef _XPLMDisplay_h_ -#define _XPLMDisplay_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMDisplay - ***************************************************************************/ -/* - * This API provides the basic hooks to draw in X-Plane and create user - * interface. All X-Plane drawing is done in OpenGL. The X-Plane plug-in - * manager takes care of properly setting up the OpenGL context and matrices. - * You do not decide when in your code's execution to draw; X-Plane tells you - * (via callbacks) when it is ready to have your plugin draw. - * - * X-Plane's drawing strategy is straightforward: every "frame" the screen is - * rendered by drawing the 3-D scene (dome, ground, objects, airplanes, etc.) - * and then drawing the cockpit on top of it. Alpha blending is used to - * overlay the cockpit over the world (and the gauges over the panel, etc.). - * X-Plane user interface elements (including windows like the map, the main - * menu, etc.) are then drawn on top of the cockpit. - * - * There are two ways you can draw: directly and in a window. - * - * Direct drawing (deprecated!---more on that below) involves drawing to the - * screen before or after X-Plane finishes a phase of drawing. When you draw - * directly, you can specify whether X-Plane is to complete this phase or not. - * This allows you to do three things: draw before X-Plane does (under it), - * draw after X-Plane does (over it), or draw instead of X-Plane. - * - * To draw directly, you register a callback and specify which phase you want - * to intercept. The plug-in manager will call you over and over to draw that - * phase. - * - * Direct drawing allows you to override scenery, panels, or anything. Note - * that you cannot assume that you are the only plug-in drawing at this phase. - * - * Direct drawing is deprecated; at some point in the X-Plane 11 run, it will - * likely become unsupported entirely as X-Plane transitions from OpenGL to - * modern graphics API backends (e.g., Vulkan, Metal, etc.). In the long term, - * plugins should use the XPLMInstance API for drawing 3-D objects---this will - * be much more efficient than general 3-D OpenGL drawing, and it will - * actually be supported by the new graphics backends. We do not yet know what - * the post-transition API for generic 3-D drawing will look like (if it - * exists at all). - * - * In contrast to direct drawing, window drawing provides a higher level - * functionality. With window drawing, you create a 2-D window that takes up a - * portion of the screen. Window drawing is always two dimensional. Window - * drawing is front-to-back controlled; you can specify that you want your - * window to be brought on top, and other plug-ins may put their window on top - * of you. Window drawing also allows you to sign up for key presses and - * receive mouse clicks. - * - * Drawing into the screen of an avionics device, like a GPS or a Primary - * Flight Display, is a way to extend or replace X-Plane's avionics. Most - * screens can be displayed both in a 3d cockpit or - * 2d panel, and also in separate popup windows. By installing drawing - * callbacks for a certain avionics device, you can change or extend the - * appearance of that device regardless whether it's installed in a 3d - * cockpit or used in a separate display for home cockpits because you leave - * the window managing to X-Plane. - * - * There are three ways to get keystrokes: - * - * 1. If you create a window, the window can take keyboard focus. It will - * then receive all keystrokes. If no window has focus, X-Plane receives - * keystrokes. Use this to implement typing in dialog boxes, etc. Only - * one window may have focus at a time; your window will be notified if it - * loses focus. - * 2. If you need low level access to the keystroke stream, install a key - * sniffer. Key sniffers can be installed above everything or right in - * front of the sim. - * 3. If you would like to associate key strokes with commands/functions in - * your plug-in, you should simply register a command (via - * XPLMCreateCommand()) and allow users to bind whatever key they choose to - * that command. Another (now deprecated) method of doing so is to use a - * hot key---a key-specific callback. Hotkeys are sent based on virtual - * key strokes, so any key may be distinctly mapped with any modifiers. - * Hot keys can be remapped by other plug-ins. As a plug-in, you don't - * have to worry about what your hot key ends up mapped to; other plug-ins - * may provide a UI for remapping keystrokes. So hotkeys allow a user to - * resolve conflicts and customize keystrokes. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * DRAWING CALLBACKS - ***************************************************************************/ -/* - * Basic drawing callbacks, for low level intercepting of X-Plane's render - * loop. The purpose of drawing callbacks is to provide targeted additions or - * replacements to X-Plane's graphics environment (for example, to add extra - * custom objects, or replace drawing of the AI aircraft). Do not assume that - * the drawing callbacks will be called in the order implied by the - * enumerations. Also do not assume that each drawing phase ends before - * another begins; they may be nested. - * - * Note that all APIs in this section are deprecated, and will likely be - * removed during the X-Plane 11 run as part of the transition to - * Vulkan/Metal/etc. See the XPLMInstance API for future-proof drawing of 3-D - * objects. - * - */ - - -/* - * XPLMDrawingPhase - * - * This constant indicates which part of drawing we are in. Drawing is done - * from the back to the front. We get a callback before or after each item. - * Metaphases provide access to the beginning and end of the 3d (scene) and - * 2d (cockpit) drawing in a manner that is independent of new phases added - * via X-Plane implementation. - * - * **NOTE**: As of XPLM302 the legacy 3D drawing phases (xplm_Phase_FirstScene - * to xplm_Phase_LastScene) are deprecated. When running under X-Plane 11.50 - * with the modern Vulkan or Metal backend, X-Plane will no longer call - * these drawing phases. There is a new drawing phase, xplm_Phase_Modern3D, - * which is supported under OpenGL and Vulkan which is called out roughly - * where the old before xplm_Phase_Airplanes phase was for blending. This - * phase is *NOT* supported under Metal and comes with potentially - * substantial performance overhead. Please do *NOT* opt into this phase if - * you don't do any actual drawing that requires the depth buffer in some - * way! - * - * **WARNING**: As X-Plane's scenery evolves, some drawing phases may cease to - * exist and new ones may be invented. If you need a particularly specific - * use of these codes, consult Austin and/or be prepared to revise your code - * as X-Plane evolves. - * - */ -enum { -#if defined(XPLM_DEPRECATED) - /* Deprecated as of XPLM302. This is the earliest point at which you can draw * - * in 3-d. */ - xplm_Phase_FirstScene = 0, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated as of XPLM302. Drawing of land and water. */ - xplm_Phase_Terrain = 5, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated as of XPLM302. Drawing runways and other airport detail. */ - xplm_Phase_Airports = 10, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated as of XPLM302. Drawing roads, trails, trains, etc. */ - xplm_Phase_Vectors = 15, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated as of XPLM302. 3-d objects (houses, smokestacks, etc. */ - xplm_Phase_Objects = 20, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated as of XPLM302. External views of airplanes, both yours and the * - * AI aircraft. */ - xplm_Phase_Airplanes = 25, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated as of XPLM302. This is the last point at which you can draw in * - * 3-d. */ - xplm_Phase_LastScene = 30, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM302) - /* A chance to do modern 3D drawing. */ - xplm_Phase_Modern3D = 31, - -#endif /* XPLM302 */ - /* This is the first phase where you can draw in 2-d. */ - xplm_Phase_FirstCockpit = 35, - - /* The non-moving parts of the aircraft panel. */ - xplm_Phase_Panel = 40, - - /* The moving parts of the aircraft panel. */ - xplm_Phase_Gauges = 45, - - /* Floating windows from plugins. */ - xplm_Phase_Window = 50, - - /* The last chance to draw in 2d. */ - xplm_Phase_LastCockpit = 55, - -#if defined(XPLM200) - /* Removed as of XPLM300; Use the full-blown XPLMMap API instead. */ - xplm_Phase_LocalMap3D = 100, - -#endif /* XPLM200 */ -#if defined(XPLM200) - /* Removed as of XPLM300; Use the full-blown XPLMMap API instead. */ - xplm_Phase_LocalMap2D = 101, - -#endif /* XPLM200 */ -#if defined(XPLM200) - /* Removed as of XPLM300; Use the full-blown XPLMMap API instead. */ - xplm_Phase_LocalMapProfile = 102, - -#endif /* XPLM200 */ - -}; -typedef int XPLMDrawingPhase; - -/* - * XPLMDrawCallback_f - * - * This is the prototype for a low level drawing callback. You are passed in - * the phase and whether it is before or after. If you are before the phase, - * return 1 to let X-Plane draw or 0 to suppress X-Plane drawing. If you are - * after the phase the return value is ignored. - * - * Refcon is a unique value that you specify when registering the callback, - * allowing you to slip a pointer to your own data to the callback. - * - * Upon entry the OpenGL context will be correctly set up for you and OpenGL - * will be in 'local' coordinates for 3d drawing and panel coordinates for 2d - * drawing. The OpenGL state (texturing, etc.) will be unknown. - * - */ -typedef int (* XPLMDrawCallback_f)( - XPLMDrawingPhase inPhase, - int inIsBefore, - void * inRefcon); - -/* - * XPLMRegisterDrawCallback - * - * This routine registers a low level drawing callback. Pass in the phase you - * want to be called for and whether you want to be called before or after. - * This routine returns 1 if the registration was successful, or 0 if the - * phase does not exist in this version of X-Plane. You may register a - * callback multiple times for the same or different phases as long as the - * refcon is unique each time. - * - * Note that this function will likely be removed during the X-Plane 11 run as - * part of the transition to Vulkan/Metal/etc. See the XPLMInstance API for - * future-proof drawing of 3-D objects. - * - */ -XPLM_API int XPLMRegisterDrawCallback( - XPLMDrawCallback_f inCallback, - XPLMDrawingPhase inPhase, - int inWantsBefore, - void * inRefcon); - -/* - * XPLMUnregisterDrawCallback - * - * This routine unregisters a draw callback. You must unregister a callback - * for each time you register a callback if you have registered it multiple - * times with different refcons. The routine returns 1 if it can find the - * callback to unregister, 0 otherwise. - * - * Note that this function will likely be removed during the X-Plane 11 run as - * part of the transition to Vulkan/Metal/etc. See the XPLMInstance API for - * future-proof drawing of 3-D objects. - * - */ -XPLM_API int XPLMUnregisterDrawCallback( - XPLMDrawCallback_f inCallback, - XPLMDrawingPhase inPhase, - int inWantsBefore, - void * inRefcon); - -#if defined(XPLM400) -/*************************************************************************** - * AVIONICS API - ***************************************************************************/ -/* - * Drawing callbacks for before and after X-Plane draws the instrument screen - * can be registered for every cockpit device. If the user plane does not - * have the device installed, your callback will not be called! Use the - * return value to enable or disable X-Plane's drawing. By drawing into the - * framebuffer of the avionics device, your modifications will be visible - * regardless whether the device's screen is in a 3d cockpit or a popup - * window. - * - */ - - -/* - * XPLMDeviceID - * - * This constant indicates the device we want to override or enhance. We can - * get a callback before or after each item. - * - */ -enum { - /* GNS430, pilot side. */ - xplm_device_GNS430_1 = 0, - - /* GNS430, copilot side. */ - xplm_device_GNS430_2 = 1, - - /* GNS530, pilot side. */ - xplm_device_GNS530_1 = 2, - - /* GNS530, copilot side. */ - xplm_device_GNS530_2 = 3, - - /* generic airliner CDU, pilot side. */ - xplm_device_CDU739_1 = 4, - - /* generic airliner CDU, copilot side. */ - xplm_device_CDU739_2 = 5, - - /* G1000 Primary Flight Display, pilot side. */ - xplm_device_G1000_PFD_1 = 6, - - /* G1000 Multifunction Display. */ - xplm_device_G1000_MFD = 7, - - /* G1000 Primary Flight Display, copilot side. */ - xplm_device_G1000_PFD_2 = 8, - - /* Primus CDU, pilot side. */ - xplm_device_CDU815_1 = 9, - - /* Primus CDU, copilot side. */ - xplm_device_CDU815_2 = 10, - - /* Primus Primary Flight Display, pilot side. */ - xplm_device_Primus_PFD_1 = 11, - - /* Primus Primary Flight Display, copilot side. */ - xplm_device_Primus_PFD_2 = 12, - - /* Primus Multifunction Display, pilot side. */ - xplm_device_Primus_MFD_1 = 13, - - /* Primus Multifunction Display, copilot side. */ - xplm_device_Primus_MFD_2 = 14, - - /* Primus Multifunction Display, central. */ - xplm_device_Primus_MFD_3 = 15, - - /* Primus Radio Management Unit, pilot side. */ - xplm_device_Primus_RMU_1 = 16, - - /* Primus Radio Management Unit, copilot side. */ - xplm_device_Primus_RMU_2 = 17, - - -}; -typedef int XPLMDeviceID; - -/* - * XPLMAvionicsCallback_f - * - * This is the prototype for your drawing callback. You are passed in the - * device you are enhancing/replacing, and whether it is before or after - * X-Plane drawing. If you are before X-Plane, return 1 to let X-Plane draw or - * 0 to suppress X-Plane drawing. If you are after the phase the return value - * is ignored. - * - * Refcon is a unique value that you specify when registering the callback, - * allowing you to slip a pointer to your own data to the callback. - * - * Upon entry the OpenGL context will be correctly set up for you and OpenGL - * will be in panel coordinates for 2d drawing. The OpenGL state (texturing, - * etc.) will be unknown. - * - */ -typedef int (* XPLMAvionicsCallback_f)( - XPLMDeviceID inDeviceID, - int inIsBefore, - void * inRefcon); - -/* - * XPLMAvionicsID - * - * This is an opaque identifier for an avionics display that you enhance or - * replace. When you register your callbacks (via - * XPLMRegisterAvionicsCallbacksEx()), you will specify callbacks to handle - * drawing, and get back such a handle. - * - */ -typedef void * XPLMAvionicsID; - -/* - * XPLMCustomizeAvionics_t - * - * The XPLMCustomizeAvionics_t structure defines all of the parameters used to - * replace or enhance avionics for using XPLMRegisterAvionicsCallbacksEx(). - * The structure will be expanded in future SDK APIs to include more features. - * Always set the structSize member to the size of your struct in bytes! - * - */ -typedef struct { - /* Used to inform XPLMRegisterAvionicsCallbacksEx() of the SDK version you * - * compiled against; should always be set to sizeof(XPLMCustomizeAvionics_t) */ - int structSize; - /* Which avionics device you want your drawing applied to. */ - XPLMDeviceID deviceId; - /* The draw callback to be called before X-Plane draws. */ - XPLMAvionicsCallback_f drawCallbackBefore; - /* The draw callback to be called after X-Plane has drawn. */ - XPLMAvionicsCallback_f drawCallbackAfter; - /* A reference which will be passed into each of your draw callbacks. Use this* - * to pass information to yourself as needed. */ - void * refcon; -} XPLMCustomizeAvionics_t; - -/* - * XPLMRegisterAvionicsCallbacksEx - * - * This routine registers your callbacks for a device. This returns a handle. - * If the returned handle is NULL, there was a problem interpreting your - * input, most likely the struct size was wrong for your SDK version. If the - * returned handle is not NULL, your callbacks will be called according to - * schedule as long as your plugin is not deactivated, or unloaded, or your - * call XPLMUnregisterAvionicsCallbacks(). - * - */ -XPLM_API XPLMAvionicsID XPLMRegisterAvionicsCallbacksEx( - XPLMCustomizeAvionics_t * inParams); - -/* - * XPLMUnregisterAvionicsCallbacks - * - * This routine unregisters your callbacks for a device. They will no longer - * be called. - * - */ -XPLM_API void XPLMUnregisterAvionicsCallbacks( - XPLMAvionicsID inAvionicsId); - -#endif /* XPLM400 */ -/*************************************************************************** - * WINDOW API - ***************************************************************************/ -/* - * The window API provides a high-level abstraction for drawing with UI - * interaction. - * - * Windows may operate in one of two modes: legacy (for plugins compiled - * against old versions of the XPLM, as well as windows created via the - * deprecated XPLMCreateWindow() function, rather than XPLMCreateWindowEx()), - * or modern (for windows compiled against the XPLM300 or newer API, and - * created via XPLMCreateWindowEx()). - * - * Modern windows have access to new X-Plane 11 windowing features, like - * support for new positioning modes (including being "popped out" into their - * own first-class window in the operating system). They can also optionally - * be decorated in the style of X-Plane 11 windows (like the map). - * - * Modern windows operate in "boxel" units. A boxel ("box of pixels") is a - * unit of virtual pixels which, depending on X-Plane's scaling, may - * correspond to an arbitrary NxN "box" of real pixels on screen. Because - * X-Plane handles this scaling automatically, you can effectively treat the - * units as though you were simply drawing in pixels, and know that when - * X-Plane is running with 150% or 200% scaling, your drawing will be - * automatically scaled (and likewise all mouse coordinates, screen bounds, - * etc. will also be auto-scaled). - * - * In contrast, legacy windows draw in true screen pixels, and thus tend to - * look quite small when X-Plane is operating in a scaled mode. - * - * Legacy windows have their origin in the lower left of the main X-Plane - * window. In contrast, since modern windows are not constrained to the main - * window, they have their origin in the lower left of the entire global - * desktop space, and the lower left of the main X-Plane window is not - * guaranteed to be (0, 0). In both cases, x increases as you move left, and y - * increases as you move up. - * - */ - - -/* - * XPLMWindowID - * - * This is an opaque identifier for a window. You use it to control your - * window. When you create a window (via either XPLMCreateWindow() or - * XPLMCreateWindowEx()), you will specify callbacks to handle drawing, mouse - * interaction, etc. - * - */ -typedef void * XPLMWindowID; - -/* - * XPLMDrawWindow_f - * - * A callback to handle 2-D drawing of your window. You are passed in your - * window and its refcon. Draw the window. You can use other XPLM functions - * from this header to find the current dimensions of your window, etc. When - * this callback is called, the OpenGL context will be set properly for 2-D - * window drawing. - * - * **Note**: Because you are drawing your window over a background, you can - * make a translucent window easily by simply not filling in your entire - * window's bounds. - * - */ -typedef void (* XPLMDrawWindow_f)( - XPLMWindowID inWindowID, - void * inRefcon); - -/* - * XPLMHandleKey_f - * - * This function is called when a key is pressed or keyboard focus is taken - * away from your window. If losingFocus is 1, you are losing the keyboard - * focus, otherwise a key was pressed and inKey contains its character. - * - * The window ID passed in will be your window for key presses, or the other - * window taking focus when losing focus. Note that in the modern plugin - * system, often focus is taken by the window manager itself; for this resaon, - * the window ID may be zero when losing focus, and you should not write code - * that depends onit. - * - * The refcon passed in will be the one from registration, for both key - * presses and losing focus. - * - * Warning: this API declares virtual keys as a signed character; however the - * VKEY #define macros in XPLMDefs.h define the vkeys using unsigned values - * (that is 0x80 instead of -0x80). So you may need to cast the incoming vkey - * to an unsigned char to get correct comparisons in C. - * - */ -typedef void (* XPLMHandleKey_f)( - XPLMWindowID inWindowID, - char inKey, - XPLMKeyFlags inFlags, - char inVirtualKey, - void * inRefcon, - int losingFocus); - -/* - * XPLMMouseStatus - * - * When the mouse is clicked, your mouse click routine is called repeatedly. - * It is first called with the mouse down message. It is then called zero or - * more times with the mouse-drag message, and finally it is called once with - * the mouse up message. All of these messages will be directed to the same - * window; you are guaranteed to not receive a drag or mouse-up event without - * first receiving the corresponding mouse-down. - * - */ -enum { - xplm_MouseDown = 1, - - xplm_MouseDrag = 2, - - xplm_MouseUp = 3, - - -}; -typedef int XPLMMouseStatus; - -/* - * XPLMHandleMouseClick_f - * - * You receive this call for one of three events: - * - * - when the user clicks the mouse button down - * - (optionally) when the user drags the mouse after a down-click, but before - * the up-click - * - when the user releases the down-clicked mouse button. - * - * You receive the x and y of the click, your window, and a refcon. Return 1 - * to consume the click, or 0 to pass it through. - * - * WARNING: passing clicks through windows (as of this writing) causes mouse - * tracking problems in X-Plane; do not use this feature! - * - * The units for x and y values match the units used in your window. Thus, for - * "modern" windows (those created via XPLMCreateWindowEx() and compiled - * against the XPLM300 library), the units are boxels, while legacy windows - * will get pixels. Legacy windows have their origin in the lower left of the - * main X-Plane window, while modern windows have their origin in the lower - * left of the global desktop space. In both cases, x increases as you move - * right, and y increases as you move up. - * - */ -typedef int (* XPLMHandleMouseClick_f)( - XPLMWindowID inWindowID, - int x, - int y, - XPLMMouseStatus inMouse, - void * inRefcon); - -#if defined(XPLM200) -/* - * XPLMCursorStatus - * - * XPLMCursorStatus describes how you would like X-Plane to manage the cursor. - * See XPLMHandleCursor_f for more info. - * - */ -enum { - /* X-Plane manages the cursor normally, plugin does not affect the cusrsor. */ - xplm_CursorDefault = 0, - - /* X-Plane hides the cursor. */ - xplm_CursorHidden = 1, - - /* X-Plane shows the cursor as the default arrow. */ - xplm_CursorArrow = 2, - - /* X-Plane shows the cursor but lets you select an OS cursor. */ - xplm_CursorCustom = 3, - - -}; -typedef int XPLMCursorStatus; -#endif /* XPLM200 */ - -#if defined(XPLM200) -/* - * XPLMHandleCursor_f - * - * The SDK calls your cursor status callback when the mouse is over your - * plugin window. Return a cursor status code to indicate how you would like - * X-Plane to manage the cursor. If you return xplm_CursorDefault, the SDK - * will try lower-Z-order plugin windows, then let the sim manage the cursor. - * - * Note: you should never show or hide the cursor yourself---these APIs are - * typically reference-counted and thus cannot safely and predictably be used - * by the SDK. Instead return one of xplm_CursorHidden to hide the cursor or - * xplm_CursorArrow/xplm_CursorCustom to show the cursor. - * - * If you want to implement a custom cursor by drawing a cursor in OpenGL, use - * xplm_CursorHidden to hide the OS cursor and draw the cursor using a 2-d - * drawing callback (after xplm_Phase_Window is probably a good choice, but - * see deprecation warnings on the drawing APIs!). If you want to use a - * custom OS-based cursor, use xplm_CursorCustom to ask X-Plane to show the - * cursor but not affect its image. You can then use an OS specific call like - * SetThemeCursor (Mac) or SetCursor/LoadCursor (Windows). - * - * The units for x and y values match the units used in your window. Thus, for - * "modern" windows (those created via XPLMCreateWindowEx() and compiled - * against the XPLM300 library), the units are boxels, while legacy windows - * will get pixels. Legacy windows have their origin in the lower left of the - * main X-Plane window, while modern windows have their origin in the lower - * left of the global desktop space. In both cases, x increases as you move - * right, and y increases as you move up. - * - */ -typedef XPLMCursorStatus (* XPLMHandleCursor_f)( - XPLMWindowID inWindowID, - int x, - int y, - void * inRefcon); -#endif /* XPLM200 */ - -#if defined(XPLM200) -/* - * XPLMHandleMouseWheel_f - * - * The SDK calls your mouse wheel callback when one of the mouse wheels is - * scrolled within your window. Return 1 to consume the mouse wheel movement - * or 0 to pass them on to a lower window. (If your window appears opaque to - * the user, you should consume mouse wheel scrolling even if it does - * nothing.) The number of "clicks" indicates how far the wheel was turned - * since the last callback. The wheel is 0 for the vertical axis or 1 for the - * horizontal axis (for OS/mouse combinations that support this). - * - * The units for x and y values match the units used in your window. Thus, for - * "modern" windows (those created via XPLMCreateWindowEx() and compiled - * against the XPLM300 library), the units are boxels, while legacy windows - * will get pixels. Legacy windows have their origin in the lower left of the - * main X-Plane window, while modern windows have their origin in the lower - * left of the global desktop space. In both cases, x increases as you move - * right, and y increases as you move up. - * - */ -typedef int (* XPLMHandleMouseWheel_f)( - XPLMWindowID inWindowID, - int x, - int y, - int wheel, - int clicks, - void * inRefcon); -#endif /* XPLM200 */ - -#if defined(XPLM300) -/* - * XPLMWindowLayer - * - * XPLMWindowLayer describes where in the ordering of windows X-Plane should - * place a particular window. Windows in higher layers cover windows in lower - * layers. So, a given window might be at the top of its particular layer, but - * it might still be obscured by a window in a higher layer. (This happens - * frequently when floating windows, like X-Plane's map, are covered by a - * modal alert.) - * - * Your window's layer can only be specified when you create the window (in - * the XPLMCreateWindow_t you pass to XPLMCreateWindowEx()). For this reason, - * layering only applies to windows created with new X-Plane 11 GUI features. - * (Windows created using the older XPLMCreateWindow(), or windows compiled - * against a pre-XPLM300 version of the SDK will simply be placed in the - * flight overlay window layer.) - * - */ -enum { - /* The lowest layer, used for HUD-like displays while flying. */ - xplm_WindowLayerFlightOverlay = 0, - - /* Windows that "float" over the sim, like the X-Plane 11 map does. If you are* - * not sure which layer to create your window in, choose floating. */ - xplm_WindowLayerFloatingWindows = 1, - - /* An interruptive modal that covers the sim with a transparent black overlay * - * to draw the user's focus to the alert */ - xplm_WindowLayerModal = 2, - - /* "Growl"-style notifications that are visible in a corner of the screen, * - * even over modals */ - xplm_WindowLayerGrowlNotifications = 3, - - -}; -typedef int XPLMWindowLayer; -#endif /* XPLM300 */ - -#if defined(XPLM301) -/* - * XPLMWindowDecoration - * - * XPLMWindowDecoration describes how "modern" windows will be displayed. This - * impacts both how X-Plane draws your window as well as certain mouse - * handlers. - * - * Your window's decoration can only be specified when you create the window - * (in the XPLMCreateWindow_t you pass to XPLMCreateWindowEx()). - * - */ -enum { - /* X-Plane will draw no decoration for your window, and apply no automatic * - * click handlers. The window will not stop click from passing through its * - * bounds. This is suitable for "windows" which request, say, the full screen * - * bounds, then only draw in a small portion of the available area. */ - xplm_WindowDecorationNone = 0, - - /* The default decoration for "native" windows, like the map. Provides a solid* - * background, as well as click handlers for resizing and dragging the window.*/ - xplm_WindowDecorationRoundRectangle = 1, - - /* X-Plane will draw no decoration for your window, nor will it provide resize* - * handlers for your window edges, but it will stop clicks from passing * - * through your windows bounds. */ - xplm_WindowDecorationSelfDecorated = 2, - - /* Like self-decorated, but with resizing; X-Plane will draw no decoration for* - * your window, but it will stop clicks from passing through your windows * - * bounds, and provide automatic mouse handlers for resizing. */ - xplm_WindowDecorationSelfDecoratedResizable = 3, - - -}; -typedef int XPLMWindowDecoration; -#endif /* XPLM301 */ - -#if defined(XPLM200) -/* - * XPLMCreateWindow_t - * - * The XPMCreateWindow_t structure defines all of the parameters used to - * create a modern window using XPLMCreateWindowEx(). The structure will be - * expanded in future SDK APIs to include more features. Always set the - * structSize member to the size of your struct in bytes! - * - * All windows created by this function in the XPLM300 version of the API are - * created with the new X-Plane 11 GUI features. This means your plugin will - * get to "know" about the existence of X-Plane windows other than the main - * window. All drawing and mouse callbacks for your window will occur in - * "boxels," giving your windows automatic support for high-DPI scaling in - * X-Plane. In addition, your windows can opt-in to decoration with the - * X-Plane 11 window styling, and you can use the - * XPLMSetWindowPositioningMode() API to make your window "popped out" into a - * first-class operating system window. - * - * Note that this requires dealing with your window's bounds in "global - * desktop" positioning units, rather than the traditional panel coordinate - * system. In global desktop coordinates, the main X-Plane window may not have - * its origin at coordinate (0, 0), and your own window may have negative - * coordinates. Assuming you don't implicitly assume (0, 0) as your origin, - * the only API change you should need is to start using - * XPLMGetMouseLocationGlobal() rather than XPLMGetMouseLocation(), and - * XPLMGetScreenBoundsGlobal() instead of XPLMGetScreenSize(). - * - * If you ask to be decorated as a floating window, you'll get the blue window - * control bar and blue backing that you see in X-Plane 11's normal "floating" - * windows (like the map). - * - */ -typedef struct { - /* Used to inform XPLMCreateWindowEx() of the SDK version you compiled * - * against; should always be set to sizeof(XPLMCreateWindow_t) */ - int structSize; - /* Left bound, in global desktop boxels */ - int left; - /* Top bound, in global desktop boxels */ - int top; - /* Right bound, in global desktop boxels */ - int right; - /* Bottom bound, in global desktop boxels */ - int bottom; - int visible; - XPLMDrawWindow_f drawWindowFunc; - /* A callback to handle the user left-clicking within your window (or NULL to * - * ignore left clicks) */ - XPLMHandleMouseClick_f handleMouseClickFunc; - XPLMHandleKey_f handleKeyFunc; - XPLMHandleCursor_f handleCursorFunc; - XPLMHandleMouseWheel_f handleMouseWheelFunc; - /* A reference which will be passed into each of your window callbacks. Use * - * this to pass information to yourself as needed. */ - void * refcon; -#if defined(XPLM301) - /* Specifies the type of X-Plane 11-style "wrapper" you want around your * - * window, if any */ - XPLMWindowDecoration decorateAsFloatingWindow; -#endif /* XPLM301 */ -#if defined(XPLM300) - XPLMWindowLayer layer; -#endif /* XPLM300 */ -#if defined(XPLM300) - /* A callback to handle the user right-clicking within your window (or NULL to* - * ignore right clicks) */ - XPLMHandleMouseClick_f handleRightClickFunc; -#endif /* XPLM300 */ -} XPLMCreateWindow_t; -#endif /* XPLM200 */ - -#if defined(XPLM200) -/* - * XPLMCreateWindowEx - * - * This routine creates a new "modern" window. You pass in an - * XPLMCreateWindow_t structure with all of the fields set in. You must set - * the structSize of the structure to the size of the actual structure you - * used. Also, you must provide functions for every callback---you may not - * leave them null! (If you do not support the cursor or mouse wheel, use - * functions that return the default values.) - * - */ -XPLM_API XPLMWindowID XPLMCreateWindowEx( - XPLMCreateWindow_t * inParams); -#endif /* XPLM200 */ - -/* - * XPLMCreateWindow - * - * Deprecated as of XPLM300. - * - * This routine creates a new legacy window. Unlike modern windows (created - * via XPLMCreateWindowEx()), legacy windows do not have access to X-Plane 11 - * features like automatic scaling for high-DPI screens, native window styles, - * or support for being "popped out" into first-class operating system - * windows. - * - * Pass in the dimensions and offsets to the window's bottom left corner from - * the bottom left of the screen. You can specify whether the window is - * initially visible or not. Also, you pass in three callbacks to run the - * window and a refcon. This function returns a window ID you can use to - * refer to the new window. - * - * NOTE: Legacy windows do not have "frames"; you are responsible for drawing - * the background and frame of the window. Higher level libraries have - * routines which make this easy. - * - */ -XPLM_API XPLMWindowID XPLMCreateWindow( - int inLeft, - int inTop, - int inRight, - int inBottom, - int inIsVisible, - XPLMDrawWindow_f inDrawCallback, - XPLMHandleKey_f inKeyCallback, - XPLMHandleMouseClick_f inMouseCallback, - void * inRefcon); - -/* - * XPLMDestroyWindow - * - * This routine destroys a window. The window's callbacks are not called - * after this call. Keyboard focus is removed from the window before - * destroying it. - * - */ -XPLM_API void XPLMDestroyWindow( - XPLMWindowID inWindowID); - -/* - * XPLMGetScreenSize - * - * This routine returns the size of the main X-Plane OpenGL window in pixels. - * This number can be used to get a rough idea of the amount of detail the - * user will be able to see when drawing in 3-d. - * - */ -XPLM_API void XPLMGetScreenSize( - int * outWidth, /* Can be NULL */ - int * outHeight); /* Can be NULL */ - -#if defined(XPLM300) -/* - * XPLMGetScreenBoundsGlobal - * - * This routine returns the bounds of the "global" X-Plane desktop, in boxels. - * Unlike the non-global version XPLMGetScreenSize(), this is multi-monitor - * aware. There are three primary consequences of multimonitor awareness. - * - * First, if the user is running X-Plane in full-screen on two or more - * monitors (typically configured using one full-screen window per monitor), - * the global desktop will be sized to include all X-Plane windows. - * - * Second, the origin of the screen coordinates is not guaranteed to be (0, - * 0). Suppose the user has two displays side-by-side, both running at 1080p. - * Suppose further that they've configured their OS to make the left display - * their "primary" monitor, and that X-Plane is running in full-screen on - * their right monitor only. In this case, the global desktop bounds would be - * the rectangle from (1920, 0) to (3840, 1080). If the user later asked - * X-Plane to draw on their primary monitor as well, the bounds would change - * to (0, 0) to (3840, 1080). - * - * Finally, if the usable area of the virtual desktop is not a perfect - * rectangle (for instance, because the monitors have different resolutions or - * because one monitor is configured in the operating system to be above and - * to the right of the other), the global desktop will include any wasted - * space. Thus, if you have two 1080p monitors, and monitor 2 is configured to - * have its bottom left touch monitor 1's upper right, your global desktop - * area would be the rectangle from (0, 0) to (3840, 2160). - * - * Note that popped-out windows (windows drawn in their own operating system - * windows, rather than "floating" within X-Plane) are not included in these - * bounds. - * - */ -XPLM_API void XPLMGetScreenBoundsGlobal( - int * outLeft, /* Can be NULL */ - int * outTop, /* Can be NULL */ - int * outRight, /* Can be NULL */ - int * outBottom); /* Can be NULL */ -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMReceiveMonitorBoundsGlobal_f - * - * This function is informed of the global bounds (in boxels) of a particular - * monitor within the X-Plane global desktop space. Note that X-Plane must be - * running in full screen on a monitor in order for that monitor to be passed - * to you in this callback. - * - */ -typedef void (* XPLMReceiveMonitorBoundsGlobal_f)( - int inMonitorIndex, - int inLeftBx, - int inTopBx, - int inRightBx, - int inBottomBx, - void * inRefcon); -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMGetAllMonitorBoundsGlobal - * - * This routine immediately calls you back with the bounds (in boxels) of each - * full-screen X-Plane window within the X-Plane global desktop space. Note - * that if a monitor is *not* covered by an X-Plane window, you cannot get its - * bounds this way. Likewise, monitors with only an X-Plane window (not in - * full-screen mode) will not be included. - * - * If X-Plane is running in full-screen and your monitors are of the same size - * and configured contiguously in the OS, then the combined global bounds of - * all full-screen monitors will match the total global desktop bounds, as - * returned by XPLMGetScreenBoundsGlobal(). (Of course, if X-Plane is running - * in windowed mode, this will not be the case. Likewise, if you have - * differently sized monitors, the global desktop space will include wasted - * space.) - * - * Note that this function's monitor indices match those provided by - * XPLMGetAllMonitorBoundsOS(), but the coordinates are different (since the - * X-Plane global desktop may not match the operating system's global desktop, - * and one X-Plane boxel may be larger than one pixel due to 150% or 200% - * scaling). - * - */ -XPLM_API void XPLMGetAllMonitorBoundsGlobal( - XPLMReceiveMonitorBoundsGlobal_f inMonitorBoundsCallback, - void * inRefcon); -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMReceiveMonitorBoundsOS_f - * - * This function is informed of the global bounds (in pixels) of a particular - * monitor within the operating system's global desktop space. Note that a - * monitor index being passed to you here does not indicate that X-Plane is - * running in full screen on this monitor, or even that any X-Plane windows - * exist on this monitor. - * - */ -typedef void (* XPLMReceiveMonitorBoundsOS_f)( - int inMonitorIndex, - int inLeftPx, - int inTopPx, - int inRightPx, - int inBottomPx, - void * inRefcon); -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMGetAllMonitorBoundsOS - * - * This routine immediately calls you back with the bounds (in pixels) of each - * monitor within the operating system's global desktop space. Note that - * unlike XPLMGetAllMonitorBoundsGlobal(), this may include monitors that have - * no X-Plane window on them. - * - * Note that this function's monitor indices match those provided by - * XPLMGetAllMonitorBoundsGlobal(), but the coordinates are different (since - * the X-Plane global desktop may not match the operating system's global - * desktop, and one X-Plane boxel may be larger than one pixel). - * - */ -XPLM_API void XPLMGetAllMonitorBoundsOS( - XPLMReceiveMonitorBoundsOS_f inMonitorBoundsCallback, - void * inRefcon); -#endif /* XPLM300 */ - -/* - * XPLMGetMouseLocation - * - * Deprecated in XPLM300. Modern windows should use - * XPLMGetMouseLocationGlobal() instead. - * - * This routine returns the current mouse location in pixels relative to the - * main X-Plane window. The bottom left corner of the main window is (0, 0). - * Pass NULL to not receive info about either parameter. - * - * Because this function gives the mouse position relative to the main X-Plane - * window (rather than in global bounds), this function should only be used by - * legacy windows. Modern windows should instead get the mouse position in - * global desktop coordinates using XPLMGetMouseLocationGlobal(). - * - * Note that unlike XPLMGetMouseLocationGlobal(), if the mouse goes outside - * the user's main monitor (for instance, to a pop out window or a secondary - * monitor), this function will not reflect it. - * - */ -XPLM_API void XPLMGetMouseLocation( - int * outX, /* Can be NULL */ - int * outY); /* Can be NULL */ - -#if defined(XPLM300) -/* - * XPLMGetMouseLocationGlobal - * - * Returns the current mouse location in global desktop boxels. Unlike - * XPLMGetMouseLocation(), the bottom left of the main X-Plane window is not - * guaranteed to be (0, 0)---instead, the origin is the lower left of the - * entire global desktop space. In addition, this routine gives the real mouse - * location when the mouse goes to X-Plane windows other than the primary - * display. Thus, it can be used with both pop-out windows and secondary - * monitors. - * - * This is the mouse location function to use with modern windows (i.e., those - * created by XPLMCreateWindowEx()). - * - * Pass NULL to not receive info about either parameter. - * - */ -XPLM_API void XPLMGetMouseLocationGlobal( - int * outX, /* Can be NULL */ - int * outY); /* Can be NULL */ -#endif /* XPLM300 */ - -/* - * XPLMGetWindowGeometry - * - * This routine returns the position and size of a window. The units and - * coordinate system vary depending on the type of window you have. - * - * If this is a legacy window (one compiled against a pre-XPLM300 version of - * the SDK, or an XPLM300 window that was not created using - * XPLMCreateWindowEx()), the units are pixels relative to the main X-Plane - * display. - * - * If, on the other hand, this is a new X-Plane 11-style window (compiled - * against the XPLM300 SDK and created using XPLMCreateWindowEx()), the units - * are global desktop boxels. - * - * Pass NULL to not receive any paramter. - * - */ -XPLM_API void XPLMGetWindowGeometry( - XPLMWindowID inWindowID, - int * outLeft, /* Can be NULL */ - int * outTop, /* Can be NULL */ - int * outRight, /* Can be NULL */ - int * outBottom); /* Can be NULL */ - -/* - * XPLMSetWindowGeometry - * - * This routine allows you to set the position and size of a window. - * - * The units and coordinate system match those of XPLMGetWindowGeometry(). - * That is, modern windows use global desktop boxel coordinates, while legacy - * windows use pixels relative to the main X-Plane display. - * - * Note that this only applies to "floating" windows (that is, windows that - * are drawn within the X-Plane simulation windows, rather than being "popped - * out" into their own first-class operating system windows). To set the - * position of windows whose positioning mode is xplm_WindowPopOut, you'll - * need to instead use XPLMSetWindowGeometryOS(). - * - */ -XPLM_API void XPLMSetWindowGeometry( - XPLMWindowID inWindowID, - int inLeft, - int inTop, - int inRight, - int inBottom); - -#if defined(XPLM300) -/* - * XPLMGetWindowGeometryOS - * - * This routine returns the position and size of a "popped out" window (i.e., - * a window whose positioning mode is xplm_WindowPopOut), in operating system - * pixels. Pass NULL to not receive any parameter. - * - */ -XPLM_API void XPLMGetWindowGeometryOS( - XPLMWindowID inWindowID, - int * outLeft, /* Can be NULL */ - int * outTop, /* Can be NULL */ - int * outRight, /* Can be NULL */ - int * outBottom); /* Can be NULL */ -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMSetWindowGeometryOS - * - * This routine allows you to set the position and size, in operating system - * pixel coordinates, of a popped out window (that is, a window whose - * positioning mode is xplm_WindowPopOut, which exists outside the X-Plane - * simulation window, in its own first-class operating system window). - * - * Note that you are responsible for ensuring both that your window is popped - * out (using XPLMWindowIsPoppedOut()) and that a monitor really exists at the - * OS coordinates you provide (using XPLMGetAllMonitorBoundsOS()). - * - */ -XPLM_API void XPLMSetWindowGeometryOS( - XPLMWindowID inWindowID, - int inLeft, - int inTop, - int inRight, - int inBottom); -#endif /* XPLM300 */ - -#if defined(XPLM301) -/* - * XPLMGetWindowGeometryVR - * - * Returns the width and height, in boxels, of a window in VR. Note that you - * are responsible for ensuring your window is in VR (using - * XPLMWindowIsInVR()). - * - */ -XPLM_API void XPLMGetWindowGeometryVR( - XPLMWindowID inWindowID, - int * outWidthBoxels, /* Can be NULL */ - int * outHeightBoxels); /* Can be NULL */ -#endif /* XPLM301 */ - -#if defined(XPLM301) -/* - * XPLMSetWindowGeometryVR - * - * This routine allows you to set the size, in boxels, of a window in VR (that - * is, a window whose positioning mode is xplm_WindowVR). - * - * Note that you are responsible for ensuring your window is in VR (using - * XPLMWindowIsInVR()). - * - */ -XPLM_API void XPLMSetWindowGeometryVR( - XPLMWindowID inWindowID, - int widthBoxels, - int heightBoxels); -#endif /* XPLM301 */ - -/* - * XPLMGetWindowIsVisible - * - * Returns true (1) if the specified window is visible. - * - */ -XPLM_API int XPLMGetWindowIsVisible( - XPLMWindowID inWindowID); - -/* - * XPLMSetWindowIsVisible - * - * This routine shows or hides a window. - * - */ -XPLM_API void XPLMSetWindowIsVisible( - XPLMWindowID inWindowID, - int inIsVisible); - -#if defined(XPLM300) -/* - * XPLMWindowIsPoppedOut - * - * True if this window has been popped out (making it a first-class window in - * the operating system), which in turn is true if and only if you have set - * the window's positioning mode to xplm_WindowPopOut. - * - * Only applies to modern windows. (Windows created using the deprecated - * XPLMCreateWindow(), or windows compiled against a pre-XPLM300 version of - * the SDK cannot be popped out.) - * - */ -XPLM_API int XPLMWindowIsPoppedOut( - XPLMWindowID inWindowID); -#endif /* XPLM300 */ - -#if defined(XPLM301) -/* - * XPLMWindowIsInVR - * - * True if this window has been moved to the virtual reality (VR) headset, - * which in turn is true if and only if you have set the window's positioning - * mode to xplm_WindowVR. - * - * Only applies to modern windows. (Windows created using the deprecated - * XPLMCreateWindow(), or windows compiled against a pre-XPLM301 version of - * the SDK cannot be moved to VR.) - * - */ -XPLM_API int XPLMWindowIsInVR( - XPLMWindowID inWindowID); -#endif /* XPLM301 */ - -#if defined(XPLM300) -/* - * XPLMSetWindowGravity - * - * A window's "gravity" controls how the window shifts as the whole X-Plane - * window resizes. A gravity of 1 means the window maintains its positioning - * relative to the right or top edges, 0 the left/bottom, and 0.5 keeps it - * centered. - * - * Default gravity is (0, 1, 0, 1), meaning your window will maintain its - * position relative to the top left and will not change size as its - * containing window grows. - * - * If you wanted, say, a window that sticks to the top of the screen (with a - * constant height), but which grows to take the full width of the window, you - * would pass (0, 1, 1, 1). Because your left and right edges would maintain - * their positioning relative to their respective edges of the screen, the - * whole width of your window would change with the X-Plane window. - * - * Only applies to modern windows. (Windows created using the deprecated - * XPLMCreateWindow(), or windows compiled against a pre-XPLM300 version of - * the SDK will simply get the default gravity.) - * - */ -XPLM_API void XPLMSetWindowGravity( - XPLMWindowID inWindowID, - float inLeftGravity, - float inTopGravity, - float inRightGravity, - float inBottomGravity); -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMSetWindowResizingLimits - * - * Sets the minimum and maximum size of the client rectangle of the given - * window. (That is, it does not include any window styling that you might - * have asked X-Plane to apply on your behalf.) All resizing operations are - * constrained to these sizes. - * - * Only applies to modern windows. (Windows created using the deprecated - * XPLMCreateWindow(), or windows compiled against a pre-XPLM300 version of - * the SDK will have no minimum or maximum size.) - * - */ -XPLM_API void XPLMSetWindowResizingLimits( - XPLMWindowID inWindowID, - int inMinWidthBoxels, - int inMinHeightBoxels, - int inMaxWidthBoxels, - int inMaxHeightBoxels); -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMWindowPositioningMode - * - * XPLMWindowPositionMode describes how X-Plane will position your window on - * the user's screen. X-Plane will maintain this positioning mode even as the - * user resizes their window or adds/removes full-screen monitors. - * - * Positioning mode can only be set for "modern" windows (that is, windows - * created using XPLMCreateWindowEx() and compiled against the XPLM300 SDK). - * Windows created using the deprecated XPLMCreateWindow(), or windows - * compiled against a pre-XPLM300 version of the SDK will simply get the - * "free" positioning mode. - * - */ -enum { - /* The default positioning mode. Set the window geometry and its future * - * position will be determined by its window gravity, resizing limits, and * - * user interactions. */ - xplm_WindowPositionFree = 0, - - /* Keep the window centered on the monitor you specify */ - xplm_WindowCenterOnMonitor = 1, - - /* Keep the window full screen on the monitor you specify */ - xplm_WindowFullScreenOnMonitor = 2, - - /* Like gui_window_full_screen_on_monitor, but stretches over *all* monitors * - * and popout windows. This is an obscure one... unless you have a very good * - * reason to need it, you probably don't! */ - xplm_WindowFullScreenOnAllMonitors = 3, - - /* A first-class window in the operating system, completely separate from the * - * X-Plane window(s) */ - xplm_WindowPopOut = 4, - -#if defined(XPLM301) - /* A floating window visible on the VR headset */ - xplm_WindowVR = 5, - -#endif /* XPLM301 */ - -}; -typedef int XPLMWindowPositioningMode; -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMSetWindowPositioningMode - * - * Sets the policy for how X-Plane will position your window. - * - * Some positioning modes apply to a particular monitor. For those modes, you - * can pass a negative monitor index to position the window on the main - * X-Plane monitor (the screen with the X-Plane menu bar at the top). Or, if - * you have a specific monitor you want to position your window on, you can - * pass a real monitor index as received from, e.g., - * XPLMGetAllMonitorBoundsOS(). - * - * Only applies to modern windows. (Windows created using the deprecated - * XPLMCreateWindow(), or windows compiled against a pre-XPLM300 version of - * the SDK will always use xplm_WindowPositionFree.) - * - */ -XPLM_API void XPLMSetWindowPositioningMode( - XPLMWindowID inWindowID, - XPLMWindowPositioningMode inPositioningMode, - int inMonitorIndex); -#endif /* XPLM300 */ - -#if defined(XPLM300) -/* - * XPLMSetWindowTitle - * - * Sets the name for a window. This only applies to windows that opted-in to - * styling as an X-Plane 11 floating window (i.e., with styling mode - * xplm_WindowDecorationRoundRectangle) when they were created using - * XPLMCreateWindowEx(). - * - */ -XPLM_API void XPLMSetWindowTitle( - XPLMWindowID inWindowID, - const char * inWindowTitle); -#endif /* XPLM300 */ - -/* - * XPLMGetWindowRefCon - * - * Returns a window's reference constant, the unique value you can use for - * your own purposes. - * - */ -XPLM_API void * XPLMGetWindowRefCon( - XPLMWindowID inWindowID); - -/* - * XPLMSetWindowRefCon - * - * Sets a window's reference constant. Use this to pass data to yourself in - * the callbacks. - * - */ -XPLM_API void XPLMSetWindowRefCon( - XPLMWindowID inWindowID, - void * inRefcon); - -/* - * XPLMTakeKeyboardFocus - * - * This routine gives a specific window keyboard focus. Keystrokes will be - * sent to that window. Pass a window ID of 0 to remove keyboard focus from - * any plugin-created windows and instead pass keyboard strokes directly to - * X-Plane. - * - */ -XPLM_API void XPLMTakeKeyboardFocus( - XPLMWindowID inWindow); - -/* - * XPLMHasKeyboardFocus - * - * Returns true (1) if the indicated window has keyboard focus. Pass a window - * ID of 0 to see if no plugin window has focus, and all keystrokes will go - * directly to X-Plane. - * - */ -XPLM_API int XPLMHasKeyboardFocus( - XPLMWindowID inWindow); - -/* - * XPLMBringWindowToFront - * - * This routine brings the window to the front of the Z-order for its layer. - * Windows are brought to the front automatically when they are created. - * Beyond that, you should make sure you are front before handling mouse - * clicks. - * - * Note that this only brings your window to the front of its layer - * (XPLMWindowLayer). Thus, if you have a window in the floating window layer - * (xplm_WindowLayerFloatingWindows), but there is a modal window (in layer - * xplm_WindowLayerModal) above you, you would still not be the true frontmost - * window after calling this. (After all, the window layers are strictly - * ordered, and no window in a lower layer can ever be above any window in a - * higher one.) - * - */ -XPLM_API void XPLMBringWindowToFront( - XPLMWindowID inWindow); - -/* - * XPLMIsWindowInFront - * - * This routine returns true if the window you passed in is the frontmost - * visible window in its layer (XPLMWindowLayer). - * - * Thus, if you have a window at the front of the floating window layer - * (xplm_WindowLayerFloatingWindows), this will return true even if there is a - * modal window (in layer xplm_WindowLayerModal) above you. (Not to worry, - * though: in such a case, X-Plane will not pass clicks or keyboard input down - * to your layer until the window above stops "eating" the input.) - * - * Note that legacy windows are always placed in layer - * xplm_WindowLayerFlightOverlay, while modern-style windows default to - * xplm_WindowLayerFloatingWindows. This means it's perfectly consistent to - * have two different plugin-created windows (one legacy, one modern) *both* - * be in the front (of their different layers!) at the same time. - * - */ -XPLM_API int XPLMIsWindowInFront( - XPLMWindowID inWindow); - -/*************************************************************************** - * KEY SNIFFERS - ***************************************************************************/ -/* - * Low-level keyboard handlers. Allows for intercepting keystrokes outside the - * normal rules of the user interface. - * - */ - - -/* - * XPLMKeySniffer_f - * - * This is the prototype for a low level key-sniffing function. Window-based - * UI _should not use this_! The windowing system provides high-level - * mediated keyboard access, via the callbacks you attach to your - * XPLMCreateWindow_t. By comparison, the key sniffer provides low level - * keyboard access. - * - * Key sniffers are provided to allow libraries to provide non-windowed user - * interaction. For example, the MUI library uses a key sniffer to do pop-up - * text entry. - * - * Return 1 to pass the key on to the next sniffer, the window manager, - * X-Plane, or whomever is down stream. Return 0 to consume the key. - * - * Warning: this API declares virtual keys as a signed character; however the - * VKEY #define macros in XPLMDefs.h define the vkeys using unsigned values - * (that is 0x80 instead of -0x80). So you may need to cast the incoming vkey - * to an unsigned char to get correct comparisons in C. - * - */ -typedef int (* XPLMKeySniffer_f)( - char inChar, - XPLMKeyFlags inFlags, - char inVirtualKey, - void * inRefcon); - -/* - * XPLMRegisterKeySniffer - * - * This routine registers a key sniffing callback. You specify whether you - * want to sniff before the window system, or only sniff keys the window - * system does not consume. You should ALMOST ALWAYS sniff non-control keys - * after the window system. When the window system consumes a key, it is - * because the user has "focused" a window. Consuming the key or taking - * action based on the key will produce very weird results. Returns - * 1 if successful. - * - */ -XPLM_API int XPLMRegisterKeySniffer( - XPLMKeySniffer_f inCallback, - int inBeforeWindows, - void * inRefcon); - -/* - * XPLMUnregisterKeySniffer - * - * This routine unregisters a key sniffer. You must unregister a key sniffer - * for every time you register one with the exact same signature. Returns 1 - * if successful. - * - */ -XPLM_API int XPLMUnregisterKeySniffer( - XPLMKeySniffer_f inCallback, - int inBeforeWindows, - void * inRefcon); - -/*************************************************************************** - * HOT KEYS - ***************************************************************************/ -/* - * Keystrokes that can be managed by others. These are lower-level than window - * keyboard handlers (i.e., callbacks you attach to your XPLMCreateWindow_t), - * but higher level than key sniffers. - * - */ - - -/* - * XPLMHotKey_f - * - * Your hot key callback simply takes a pointer of your choosing. - * - */ -typedef void (* XPLMHotKey_f)( - void * inRefcon); - -/* - * XPLMHotKeyID - * - * An opaque ID used to identify a hot key. - * - */ -typedef void * XPLMHotKeyID; - -/* - * XPLMRegisterHotKey - * - * This routine registers a hot key. You specify your preferred key stroke - * virtual key/flag combination, a description of what your callback does (so - * other plug-ins can describe the plug-in to the user for remapping) and a - * callback function and opaque pointer to pass in). A new hot key ID is - * returned. During execution, the actual key associated with your hot key - * may change, but you are insulated from this. - * - */ -XPLM_API XPLMHotKeyID XPLMRegisterHotKey( - char inVirtualKey, - XPLMKeyFlags inFlags, - const char * inDescription, - XPLMHotKey_f inCallback, - void * inRefcon); - -/* - * XPLMUnregisterHotKey - * - * Unregisters a hot key. You can only unregister your own hot keys. - * - */ -XPLM_API void XPLMUnregisterHotKey( - XPLMHotKeyID inHotKey); - -/* - * XPLMCountHotKeys - * - * Returns the number of current hot keys. - * - */ -XPLM_API int XPLMCountHotKeys(void); - -/* - * XPLMGetNthHotKey - * - * Returns a hot key by index, for iteration on all hot keys. - * - */ -XPLM_API XPLMHotKeyID XPLMGetNthHotKey( - int inIndex); - -/* - * XPLMGetHotKeyInfo - * - * Returns information about the hot key. Return NULL for any parameter you - * don't want info about. The description should be at least 512 chars long. - * - */ -XPLM_API void XPLMGetHotKeyInfo( - XPLMHotKeyID inHotKey, - char * outVirtualKey, /* Can be NULL */ - XPLMKeyFlags * outFlags, /* Can be NULL */ - char * outDescription, /* Can be NULL */ - XPLMPluginID * outPlugin); /* Can be NULL */ - -/* - * XPLMSetHotKeyCombination - * - * Remaps a hot key's keystrokes. You may remap another plugin's keystrokes. - * - */ -XPLM_API void XPLMSetHotKeyCombination( - XPLMHotKeyID inHotKey, - char inVirtualKey, - XPLMKeyFlags inFlags); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMGraphics.h b/lib/SDK/CHeaders/XPLM/XPLMGraphics.h deleted file mode 100755 index d7aef52..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMGraphics.h +++ /dev/null @@ -1,437 +0,0 @@ -#ifndef _XPLMGraphics_h_ -#define _XPLMGraphics_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMGraphics - ***************************************************************************/ -/* - * A few notes on coordinate systems: - * - * X-Plane uses three kinds of coordinates. Global coordinates are specified - * as latitude, longitude and elevation. This coordinate system never changes - * but is not very precise. - * - * OpenGL (or 'local') coordinates are cartesian and shift with the plane. - * They offer more precision and are used for 3-d OpenGL drawing. The X axis - * is aligned east-west with positive X meaning east. The Y axis is aligned - * straight up and down at the point 0,0,0 (but since the earth is round it is - * not truly straight up and down at other points). The Z axis is aligned - * north-south at 0, 0, 0 with positive Z pointing south (but since the earth - * is round it isn't exactly north-south as you move east or west of 0, 0, 0). - * One unit is one meter and the point 0,0,0 is on the surface of the earth at - * sea level for some latitude and longitude picked by the sim such that the - * user's aircraft is reasonably nearby. - * - * 2-d Panel coordinates are 2d, with the X axis horizontal and the Y axis - * vertical. The point 0,0 is the bottom left and 1024,768 is the upper - * right of the screen. This is true no matter what resolution the user's - * monitor is in; when running in higher resolution, graphics will be - * scaled. - * - * Use X-Plane's routines to convert between global and local coordinates. Do - * not attempt to do this conversion yourself; the precise 'roundness' of - * X-Plane's physics model may not match your own, and (to make things - * weirder) the user can potentially customize the physics of the current - * planet. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * X-PLANE GRAPHICS - ***************************************************************************/ -/* - * These routines allow you to use OpenGL with X-Plane. - * - */ - - -/* - * XPLMTextureID - * - * XPLM Texture IDs name well-known textures in the sim for you to use. This - * allows you to recycle textures from X-Plane, saving VRAM. - * - * *Warning*: do not use these enums. The only remaining use they have is to - * access the legacy compatibility v10 UI texture; if you need this, get it - * via the Widgets library. - * - */ -enum { - /* The bitmap that contains window outlines, button outlines, fonts, etc. */ - xplm_Tex_GeneralInterface = 0, - -#if defined(XPLM_DEPRECATED) - /* The exterior paint for the user's aircraft (daytime). */ - xplm_Tex_AircraftPaint = 1, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* The exterior light map for the user's aircraft. */ - xplm_Tex_AircraftLiteMap = 2, - -#endif /* XPLM_DEPRECATED */ - -}; -typedef int XPLMTextureID; - -/* - * XPLMSetGraphicsState - * - * XPLMSetGraphicsState changes OpenGL's fixed function pipeline state. You - * are not responsible for restoring any state that is accessed via - * XPLMSetGraphicsState, but you are responsible for not accessing this state - * directly. - * - * - inEnableFog - enables or disables fog, equivalent to: glEnable(GL_FOG); - * - inNumberTexUnits - enables or disables a number of multitexturing units. - * If the number is 0, 2d texturing is disabled entirely, as in - * glDisable(GL_TEXTURE_2D); Otherwise, 2d texturing is enabled, and a - * number of multitexturing units are enabled sequentially, starting with - * unit 0, e.g. glActiveTextureARB(GL_TEXTURE0_ARB); glEnable - * (GL_TEXTURE_2D); - * - inEnableLighting - enables or disables OpenGL lighting, e.g. - * glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); - * - inEnableAlphaTesting - enables or disables the alpha test per pixel, e.g. - * glEnable(GL_ALPHA_TEST); - * - inEnableAlphaBlending - enables or disables alpha blending per pixel, - * e.g. glEnable(GL_BLEND); - * - inEnableDepthTesting - enables per pixel depth testing, as in - * glEnable(GL_DEPTH_TEST); - * - inEnableDepthWriting - enables writing back of depth information to the - * depth bufffer, as in glDepthMask(GL_TRUE); - * - * The purpose of this function is to change OpenGL state while keeping - * X-Plane aware of the state changes; this keeps X-Plane from getting - * surprised by OGL state changes, and prevents X-Plane and plug-ins from - * having to set all state before all draws; XPLMSetGraphicsState internally - * skips calls to change state that is already properly enabled. - * - * X-Plane does not have a 'default' OGL state for plug-ins with respect to - * the above state vector; plug-ins should totally set OGL state using this - * API before drawing. Use XPLMSetGraphicsState instead of any of the above - * OpenGL calls. - * - * WARNING: Any routine that performs drawing (e.g. XPLMDrawString or widget - * code) may change X-Plane's state. Always set state before drawing after - * unknown code has executed. - * - * *Deprecation Warnings*: X-Plane's lighting and fog environemnt is - * significantly more complex than the fixed function pipeline can express; - * do not assume that lighting and fog state is a good approximation for 3-d - * drawing. Prefer to use XPLMInstancing to draw objects. All calls to - * XPLMSetGraphicsState should have no fog or lighting. - * - */ -XPLM_API void XPLMSetGraphicsState( - int inEnableFog, - int inNumberTexUnits, - int inEnableLighting, - int inEnableAlphaTesting, - int inEnableAlphaBlending, - int inEnableDepthTesting, - int inEnableDepthWriting); - -/* - * XPLMBindTexture2d - * - * XPLMBindTexture2d changes what texture is bound to the 2d texturing - * target. This routine caches the current 2d texture across all texturing - * units in the sim and plug-ins, preventing extraneous binding. For - * example, consider several plug-ins running in series; if they all use the - * 'general interface' bitmap to do UI, calling this function will skip the - * rebinding of the general interface texture on all but the first plug-in, - * which can provide better frame rate son some graphics cards. - * - * inTextureID is the ID of the texture object to bind; inTextureUnit is a - * zero-based texture unit (e.g. 0 for the first one), up to a maximum of 4 - * units. (This number may increase in future versions of X-Plane.) - * - * Use this routine instead of glBindTexture(GL_TEXTURE_2D, ....); - * - */ -XPLM_API void XPLMBindTexture2d( - int inTextureNum, - int inTextureUnit); - -/* - * XPLMGenerateTextureNumbers - * - * Use this routine instead of glGenTextures to generate new texture object - * IDs. This routine historically ensured that plugins don't use texure IDs - * that X-Plane is reserving for its own use. - * - */ -XPLM_API void XPLMGenerateTextureNumbers( - int * outTextureIDs, - int inCount); - -#if defined(XPLM_DEPRECATED) -/* - * XPLMGetTexture - * - * XPLMGetTexture returns the OpenGL texture ID of an X-Plane texture based on - * a generic identifying code. For example, you can get the texture for - * X-Plane's UI bitmaps. - * - */ -XPLM_API int XPLMGetTexture( - XPLMTextureID inTexture); -#endif /* XPLM_DEPRECATED */ - -/* - * XPLMWorldToLocal - * - * This routine translates coordinates from latitude, longitude, and altitude - * to local scene coordinates. Latitude and longitude are in decimal degrees, - * and altitude is in meters MSL (mean sea level). The XYZ coordinates are in - * meters in the local OpenGL coordinate system. - * - */ -XPLM_API void XPLMWorldToLocal( - double inLatitude, - double inLongitude, - double inAltitude, - double * outX, - double * outY, - double * outZ); - -/* - * XPLMLocalToWorld - * - * This routine translates a local coordinate triplet back into latitude, - * longitude, and altitude. Latitude and longitude are in decimal degrees, - * and altitude is in meters MSL (mean sea level). The XYZ coordinates are in - * meters in the local OpenGL coordinate system. - * - * NOTE: world coordinates are less precise than local coordinates; you should - * try to avoid round tripping from local to world and back. - * - */ -XPLM_API void XPLMLocalToWorld( - double inX, - double inY, - double inZ, - double * outLatitude, - double * outLongitude, - double * outAltitude); - -/* - * XPLMDrawTranslucentDarkBox - * - * This routine draws a translucent dark box, partially obscuring parts of the - * screen but making text easy to read. This is the same graphics primitive - * used by X-Plane to show text files and ATC info. - * - */ -XPLM_API void XPLMDrawTranslucentDarkBox( - int inLeft, - int inTop, - int inRight, - int inBottom); - -/*************************************************************************** - * X-PLANE TEXT - ***************************************************************************/ - -/* - * XPLMFontID - * - * X-Plane features some fixed-character fonts. Each font may have its own - * metrics. - * - * WARNING: Some of these fonts are no longer supported or may have changed - * geometries. For maximum copmatibility, see the comments below. - * - * Note: X-Plane 7 supports proportional-spaced fonts. Since no measuring - * routine is available yet, the SDK will normally draw using a fixed-width - * font. You can use a dataref to enable proportional font drawing on XP7 if - * you want to. - * - */ -enum { - /* Mono-spaced font for user interface. Available in all versions of the SDK.*/ - xplmFont_Basic = 0, - -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_Menus = 1, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_Metal = 2, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_Led = 3, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_LedWide = 4, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_PanelHUD = 5, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_PanelEFIS = 6, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_PanelGPS = 7, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_RadiosGA = 8, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_RadiosBC = 9, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_RadiosHM = 10, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_RadiosGANarrow = 11, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_RadiosBCNarrow = 12, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_RadiosHMNarrow = 13, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_Timer = 14, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_FullRound = 15, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_SmallRound = 16, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - /* Deprecated, do not use. */ - xplmFont_Menus_Localized = 17, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM200) - /* Proportional UI font. */ - xplmFont_Proportional = 18, - -#endif /* XPLM200 */ - -}; -typedef int XPLMFontID; - -/* - * XPLMDrawString - * - * This routine draws a NULL termianted string in a given font. Pass in the - * lower left pixel that the character is to be drawn onto. Also pass the - * character and font ID. This function returns the x offset plus the width of - * all drawn characters. The color to draw in is specified as a pointer to an - * array of three floating point colors, representing RGB intensities from 0.0 - * to 1.0. - * - */ -XPLM_API void XPLMDrawString( - float * inColorRGB, - int inXOffset, - int inYOffset, - char * inChar, - int * inWordWrapWidth, /* Can be NULL */ - XPLMFontID inFontID); - -/* - * XPLMDrawNumber - * - * This routine draws a number similar to the digit editing fields in - * PlaneMaker and data output display in X-Plane. Pass in a color, a - * position, a floating point value, and formatting info. Specify how many - * integer and how many decimal digits to show and whether to show a sign, as - * well as a character set. This routine returns the xOffset plus width of the - * string drawn. - * - */ -XPLM_API void XPLMDrawNumber( - float * inColorRGB, - int inXOffset, - int inYOffset, - double inValue, - int inDigits, - int inDecimals, - int inShowSign, - XPLMFontID inFontID); - -/* - * XPLMGetFontDimensions - * - * This routine returns the width and height of a character in a given font. - * It also tells you if the font only supports numeric digits. Pass NULL if - * you don't need a given field. Note that for a proportional font the width - * will be an arbitrary, hopefully average width. - * - */ -XPLM_API void XPLMGetFontDimensions( - XPLMFontID inFontID, - int * outCharWidth, /* Can be NULL */ - int * outCharHeight, /* Can be NULL */ - int * outDigitsOnly); /* Can be NULL */ - -#if defined(XPLM200) -/* - * XPLMMeasureString - * - * This routine returns the width in pixels of a string using a given font. - * The string is passed as a pointer plus length (and does not need to be null - * terminated); this is used to allow for measuring substrings. The return - * value is floating point; it is possible that future font drawing may allow - * for fractional pixels. - * - */ -XPLM_API float XPLMMeasureString( - XPLMFontID inFontID, - const char * inChar, - int inNumChars); -#endif /* XPLM200 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMInstance.h b/lib/SDK/CHeaders/XPLM/XPLMInstance.h deleted file mode 100644 index d2a8f2c..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMInstance.h +++ /dev/null @@ -1,136 +0,0 @@ -#ifndef _XPLMInstance_h_ -#define _XPLMInstance_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMInstance - ***************************************************************************/ -/* - * This API provides instanced drawing of X-Plane objects (.obj files). In - * contrast to old drawing APIs, which required you to draw your own objects - * per-frame, the instancing API allows you to simply register an OBJ for - * drawing, then move or manipulate it later (as needed). - * - * This provides one tremendous benefit: it keeps all dataref operations for - * your object in one place. Because datarefs are main thread only, allowing - * dataref access anywhere is a serious performance bottleneck for the - * simulator---the whole simulator has to pause and wait for each dataref - * access. This performance penalty will only grow worse as X-Plane moves - * toward an ever more heavily multithreaded engine. - * - * The instancing API allows X-Plane to isolate all dataref manipulations for - * all plugin object drawing to one place, potentially providing huge - * performance gains. - * - * Here's how it works: - * - * When an instance is created, it provides a list of all datarefs you want to - * manipulate in for the OBJ in the future. This list of datarefs replaces the - * ad-hoc collections of dataref objects previously used by art assets. Then, - * per-frame, you can manipulate the instance by passing in a "block" of - * packed floats representing the current values of the datarefs for your - * instance. (Note that the ordering of this set of packed floats must exactly - * match the ordering of the datarefs when you created your instance.) - * - */ - -#include "XPLMDefs.h" -#include "XPLMScenery.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * Instance Creation and Destruction - ***************************************************************************/ -/* - * Registers and unregisters instances. - * - */ - - -/* - * XPLMInstanceRef - * - * An opaque handle to an instance. - * - */ -typedef void * XPLMInstanceRef; - -/* - * XPLMCreateInstance - * - * XPLMCreateInstance creates a new instance, managed by your plug-in, and - * returns a handle to the instance. A few important requirements: - * - * * The object passed in must be fully loaded and returned from the XPLM - * before you can create your instance; you cannot pass a null obj ref, nor - * can you change the ref later. - * - * * If you use any custom datarefs in your object, they must be registered - * before the object is loaded. This is true even if their data will be - * provided via the instance dataref list. - * - * * The instance dataref array must be a valid ptr to an array of at least - * one item that is null terminated. That is, if you do not want any - * datarefs, you must passa ptr to an array with a null item. You cannot - * pass null for this. - * - */ -XPLM_API XPLMInstanceRef XPLMCreateInstance( - XPLMObjectRef obj, - const char ** datarefs); - -/* - * XPLMDestroyInstance - * - * XPLMDestroyInstance destroys and deallocates your instance; once called, - * you are still responsible for releasing the OBJ ref. - * - * Tip: you can release your OBJ ref after you call XPLMCreateInstance as long - * as you never use it again; the instance will maintain its own reference to - * the OBJ and the object OBJ be deallocated when the instance is destroyed. - * - */ -XPLM_API void XPLMDestroyInstance( - XPLMInstanceRef instance); - -/*************************************************************************** - * Instance Manipulation - ***************************************************************************/ - -/* - * XPLMInstanceSetPosition - * - * Updates both the position of the instance and all datarefs you registered - * for it. Call this from a flight loop callback or UI callback. - * - * __DO NOT__ call XPLMInstanceSetPosition from a drawing callback; the whole - * point of instancing is that you do not need any drawing callbacks. Setting - * instance data from a drawing callback may have undefined consequences, and - * the drawing callback hurts FPS unnecessarily. - * - * The memory pointed to by the data pointer must be large enough to hold one - * float for every data ref you have registered, and must contain valid - * floating point data. - * - * BUG: before X-Plane 11.50, if you have no dataref registered, you must - * still pass a valid pointer for data and not null. - * - */ -XPLM_API void XPLMInstanceSetPosition( - XPLMInstanceRef instance, - const XPLMDrawInfo_t * new_position, - const float * data); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMMap.h b/lib/SDK/CHeaders/XPLM/XPLMMap.h deleted file mode 100644 index 8297471..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMMap.h +++ /dev/null @@ -1,628 +0,0 @@ -#ifndef _XPLMMap_h_ -#define _XPLMMap_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMMap - ***************************************************************************/ -/* - * This API allows you to create new layers within X-Plane maps. Your layers - * can draw arbitrary OpenGL, but they conveniently also have access to - * X-Plane's built-in icon and label drawing functions. - * - * As of X-Plane 11, map drawing happens in three stages: - * - * 1. backgrounds and "fill," - * 2. icons, and - * 3. labels. - * - * Thus, all background drawing gets layered beneath all icons, which likewise - * get layered beneath all labels. Within each stage, the map obeys a - * consistent layer ordering, such that "fill" layers (layers that cover a - * large amount of map area, like the terrain and clouds) appear beneath - * "markings" layers (like airport icons). This ensures that layers with fine - * details don't get obscured by layers with larger details. - * - * The XPLM map API reflects both aspects of this draw layering: you can - * register a layer as providing either markings or fill, and X-Plane will - * draw your fill layers beneath your markings layers (regardless of - * registration order). Likewise, you are guaranteed that your layer's icons - * (added from within an icon callback) will go above your layer's OpenGL - * drawing, and your labels will go above your icons. - * - * The XPLM guarantees that all plugin-created fill layers go on top of all - * native X-Plane fill layers, and all plugin-created markings layers go on - * top of all X-Plane markings layers (with the exception of the aircraft - * icons). It also guarantees that the draw order of your own plugin's layers - * will be consistent. But, for layers created by different plugins, the only - * guarantee is that we will draw all of one plugin's layers of each type - * (fill, then markings), then all of the others'; we don't guarantee which - * plugin's fill and markings layers go on top of the other's. - * - * As of X-Plane 11, maps use true cartographic projections for their drawing, - * and different maps may use different projections. For that reason, all - * drawing calls include an opaque handle for the projection you should use to - * do the drawing. Any time you would draw at a particular latitude/longitude, - * you'll need to ask the projection to translate that position into "map - * coordinates." (Note that the projection is guaranteed not to change between - * calls to your prepare-cache hook, so if you cache your map coordinates - * ahead of time, there's no need to re-project them when you actually draw.) - * - * In addition to mapping normal latitude/longitude locations into map - * coordinates, the projection APIs also let you know the current heading for - * north. (Since X-Plane 11 maps can rotate to match the heading of the user's - * aircraft, it's not safe to assume that north is at zero degrees rotation.) - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(XPLM300) -/*************************************************************************** - * DRAWING CALLBACKS - ***************************************************************************/ -/* - * When you create a new map layer (using XPLMCreateMapLayer), you can provide - * any or all of these callbacks. They allow you to insert your own OpenGL - * drawing, text labels, and icons into the X-Plane map at the appropriate - * places, allowing your layer to behave as similarly to X-Plane's built-in - * layers as possible. - * - */ - - -/* - * XPLMMapLayerID - * - * This is an opaque handle for a plugin-created map layer. Pass it to the map - * drawing APIs from an appropriate callback to draw in the layer you created. - * - */ -typedef void * XPLMMapLayerID; - -/* - * XPLMMapProjectionID - * - * This is an opaque handle for a map projection. Pass it to the projection - * APIs to translate between map coordinates and latitude/longitudes. - * - */ -typedef void * XPLMMapProjectionID; - -/* - * XPLMMapStyle - * - * Indicates the visual style being drawn by the map. In X-Plane, the user can - * choose between a number of map types, and different map types may have use - * a different visual representation for the same elements (for instance, the - * visual style of the terrain layer changes drastically between the VFR and - * IFR layers), or certain layers may be disabled entirely in some map types - * (e.g., localizers are only visible in the IFR low-enroute style). - * - */ -enum { - xplm_MapStyle_VFR_Sectional = 0, - - xplm_MapStyle_IFR_LowEnroute = 1, - - xplm_MapStyle_IFR_HighEnroute = 2, - - -}; -typedef int XPLMMapStyle; - -/* - * XPLMMapDrawingCallback_f - * - * This is the OpenGL map drawing callback for plugin-created map layers. You - * can perform arbitrary OpenGL drawing from this callback, with one - * exception: changes to the Z-buffer are not permitted, and will result in - * map drawing errors. - * - * All drawing done from within this callback appears beneath all built-in - * X-Plane icons and labels, but above the built-in "fill" layers (layers - * providing major details, like terrain and water). Note, however, that the - * relative ordering between the drawing callbacks of different plugins is not - * guaranteed. - * - */ -typedef void (* XPLMMapDrawingCallback_f)( - XPLMMapLayerID inLayer, - const float * inMapBoundsLeftTopRightBottom, - float zoomRatio, - float mapUnitsPerUserInterfaceUnit, - XPLMMapStyle mapStyle, - XPLMMapProjectionID projection, - void * inRefcon); - -/* - * XPLMMapIconDrawingCallback_f - * - * This is the icon drawing callback that enables plugin-created map layers to - * draw icons using X-Plane's built-in icon drawing functionality. You can - * request an arbitrary number of PNG icons to be drawn via - * XPLMDrawMapIconFromSheet() from within this callback, but you may not - * perform any OpenGL drawing here. - * - * Icons enqueued by this function will appear above all OpenGL drawing - * (performed by your optional XPLMMapDrawingCallback_f), and above all - * built-in X-Plane map icons of the same layer type ("fill" or "markings," as - * determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note, - * however, that the relative ordering between the drawing callbacks of - * different plugins is not guaranteed. - * - */ -typedef void (* XPLMMapIconDrawingCallback_f)( - XPLMMapLayerID inLayer, - const float * inMapBoundsLeftTopRightBottom, - float zoomRatio, - float mapUnitsPerUserInterfaceUnit, - XPLMMapStyle mapStyle, - XPLMMapProjectionID projection, - void * inRefcon); - -/* - * XPLMMapLabelDrawingCallback_f - * - * This is the label drawing callback that enables plugin-created map layers - * to draw text labels using X-Plane's built-in labeling functionality. You - * can request an arbitrary number of text labels to be drawn via - * XPLMDrawMapLabel() from within this callback, but you may not perform any - * OpenGL drawing here. - * - * Labels enqueued by this function will appear above all OpenGL drawing - * (performed by your optional XPLMMapDrawingCallback_f), and above all - * built-in map icons and labels of the same layer type ("fill" or "markings," - * as determined by the XPLMMapLayerType in your XPLMCreateMapLayer_t). Note, - * however, that the relative ordering between the drawing callbacks of - * different plugins is not guaranteed. - * - */ -typedef void (* XPLMMapLabelDrawingCallback_f)( - XPLMMapLayerID inLayer, - const float * inMapBoundsLeftTopRightBottom, - float zoomRatio, - float mapUnitsPerUserInterfaceUnit, - XPLMMapStyle mapStyle, - XPLMMapProjectionID projection, - void * inRefcon); - -#endif /* XPLM300 */ -#if defined(XPLM300) -/*************************************************************************** - * LAYER MANAGEMENT CALLBACKS - ***************************************************************************/ -/* - * These are various "bookkeeping" callbacks that your map layer can receive - * (if you provide the callback in your XPLMCreateMapLayer_t). They allow you - * to manage the lifecycle of your layer, as well as cache any - * computationally-intensive preparation you might need for drawing. - * - */ - - -/* - * XPLMMapPrepareCacheCallback_f - * - * A callback used to allow you to cache whatever information your layer needs - * to draw in the current map area. - * - * This is called each time the map's total bounds change. This is typically - * triggered by new DSFs being loaded, such that X-Plane discards old, - * now-distant DSFs and pulls in new ones. At that point, the available bounds - * of the map also change to match the new DSF area. - * - * By caching just the information you need to draw in this area, your future - * draw calls can be made faster, since you'll be able to simply "splat" your - * precomputed information each frame. - * - * We guarantee that the map projection will not change between successive - * prepare cache calls, nor will any draw call give you bounds outside these - * total map bounds. So, if you cache the projected map coordinates of all the - * items you might want to draw in the total map area, you can be guaranteed - * that no draw call will be asked to do any new work. - * - */ -typedef void (* XPLMMapPrepareCacheCallback_f)( - XPLMMapLayerID inLayer, - const float * inTotalMapBoundsLeftTopRightBottom, - XPLMMapProjectionID projection, - void * inRefcon); - -/* - * XPLMMapWillBeDeletedCallback_f - * - * Called just before your map layer gets deleted. Because SDK-created map - * layers have the same lifetime as the X-Plane map that contains them, if the - * map gets unloaded from memory, your layer will too. - * - */ -typedef void (* XPLMMapWillBeDeletedCallback_f)( - XPLMMapLayerID inLayer, - void * inRefcon); - -#endif /* XPLM300 */ -#if defined(XPLM300) -/*************************************************************************** - * MAP LAYER CREATION AND DESTRUCTION - ***************************************************************************/ -/* - * Enables the creation of new map layers. Layers are created for a particular - * instance of the X-Plane map. For instance, if you want your layer to appear - * in both the normal map interface and the Instructor Operator Station (IOS), - * you would need two separate calls to XPLMCreateMapLayer(), with two - * different values for your XPLMCreateMapLayer_t::layer_name. - * - * Your layer's lifetime will be determined by the lifetime of the map it is - * created in. If the map is destroyed (on the X-Plane side), your layer will - * be too, and you'll receive a callback to your - * XPLMMapWillBeDeletedCallback_f. - * - */ - - -/* - * XPLMMapLayerType - * - * Indicates the type of map layer you are creating. Fill layers will always - * be drawn beneath markings layers. - * - */ -enum { - /* A layer that draws "fill" graphics, like weather patterns, terrain, etc. * - * Fill layers frequently cover a large portion of the visible map area. */ - xplm_MapLayer_Fill = 0, - - /* A layer that provides markings for particular map features, like NAVAIDs, * - * airports, etc. Even dense markings layers cover a small portion of the * - * total map area. */ - xplm_MapLayer_Markings = 1, - - -}; -typedef int XPLMMapLayerType; - -/* Globally unique identifier for X-Plane's Map window, used as the * - * mapToCreateLayerIn parameter in XPLMCreateMapLayer_t */ -#define XPLM_MAP_USER_INTERFACE "XPLM_MAP_USER_INTERFACE" - -/* Globally unique identifier for X-Plane's Instructor Operator Station * - * window, used as the mapToCreateLayerIn parameter in XPLMCreateMapLayer_t */ -#define XPLM_MAP_IOS "XPLM_MAP_IOS" - -/* - * XPLMCreateMapLayer_t - * - * This structure defines all of the parameters used to create a map layer - * using XPLMCreateMapLayer. The structure will be expanded in future SDK APIs - * to include more features. Always set the structSize member to the size of - * your struct in bytes! - * - * Each layer must be associated with exactly one map instance in X-Plane. - * That map, and that map alone, will call your callbacks. Likewise, when that - * map is deleted, your layer will be as well. - * - */ -typedef struct { - /* Used to inform XPLMCreateMapLayer() of the SDK version you compiled * - * against; should always be set to sizeof(XPLMCreateMapLayer_t) */ - int structSize; - /* Globally unique string identifying the map you want this layer to appear * - * in. As of XPLM300, this is limited to one of XPLM_MAP_USER_INTERFACE or * - * XPLM_MAP_IOS */ - const char * mapToCreateLayerIn; - /* The type of layer you are creating, used to determine draw order (all * - * plugin-created markings layers are drawn above all plugin-created fill * - * layers) */ - XPLMMapLayerType layerType; - /* Optional callback to inform you this layer is being deleted (due to its * - * owning map being destroyed) */ - XPLMMapWillBeDeletedCallback_f willBeDeletedCallback; - /* Optional callback you want to use to prepare your draw cache when the map * - * bounds change (set to NULL if you don't want this callback) */ - XPLMMapPrepareCacheCallback_f prepCacheCallback; - /* Optional callback you want to use for arbitrary OpenGL drawing, which goes * - * beneath all icons in the map's layering system (set to NULL if you don't * - * want this callback) */ - XPLMMapDrawingCallback_f drawCallback; - /* Optional callback you want to use for drawing icons, which go above all * - * built-in X-Plane icons (except the aircraft) in the map's layering system * - * (set to NULL if you don't want this callback) */ - XPLMMapIconDrawingCallback_f iconCallback; - /* Optional callback you want to use for drawing map labels, which go above * - * all built-in X-Plane icons and labels (except those of aircraft) in the * - * map's layering system (set to NULL if you don't want this callback) */ - XPLMMapLabelDrawingCallback_f labelCallback; - /* True if you want a checkbox to be created in the map UI to toggle this * - * layer on and off; false if the layer should simply always be enabled */ - int showUiToggle; - /* Short label to use for this layer in the user interface */ - const char * layerName; - /* A reference to arbitrary data that will be passed to your callbacks */ - void * refcon; -} XPLMCreateMapLayer_t; - -/* - * XPLMCreateMapLayer - * - * This routine creates a new map layer. You pass in an XPLMCreateMapLayer_t - * structure with all of the fields set in. You must set the structSize of - * the structure to the size of the actual structure you used. - * - * Returns NULL if the layer creation failed. This happens most frequently - * because the map you specified in your - * XPLMCreateMapLayer_t::mapToCreateLayerIn field doesn't exist (that is, if - * XPLMMapExists() returns 0 for the specified map). You can use - * XPLMRegisterMapCreationHook() to get a notification each time a new map is - * opened in X-Plane, at which time you can create layers in it. - * - */ -XPLM_API XPLMMapLayerID XPLMCreateMapLayer( - XPLMCreateMapLayer_t * inParams); - -/* - * XPLMDestroyMapLayer - * - * Destroys a map layer you created (calling your - * XPLMMapWillBeDeletedCallback_f if applicable). Returns true if a deletion - * took place. - * - */ -XPLM_API int XPLMDestroyMapLayer( - XPLMMapLayerID inLayer); - -/* - * XPLMMapCreatedCallback_f - * - * A callback to notify your plugin that a new map has been created in - * X-Plane. This is the best time to add a custom map layer using - * XPLMCreateMapLayer(). - * - * No OpenGL drawing is permitted within this callback. - * - */ -typedef void (* XPLMMapCreatedCallback_f)( - const char * mapIdentifier, - void * refcon); - -/* - * XPLMRegisterMapCreationHook - * - * Registers your callback to receive a notification each time a new map is - * constructed in X-Plane. This callback is the best time to add your custom - * map layer using XPLMCreateMapLayer(). - * - * Note that you will not be notified about any maps that already exist---you - * can use XPLMMapExists() to check for maps that were created previously. - * - */ -XPLM_API void XPLMRegisterMapCreationHook( - XPLMMapCreatedCallback_f callback, - void * refcon); - -/* - * XPLMMapExists - * - * Returns 1 if the map with the specified identifier already exists in - * X-Plane. In that case, you can safely call XPLMCreateMapLayer() specifying - * that your layer should be added to that map. - * - */ -XPLM_API int XPLMMapExists( - const char * mapIdentifier); - -#endif /* XPLM300 */ -#if defined(XPLM300) -/*************************************************************************** - * MAP DRAWING - ***************************************************************************/ -/* - * These APIs are only valid from within a map drawing callback (one of - * XPLMIconDrawingCallback_t or XPLMMapLabelDrawingCallback_f). Your drawing - * callbacks are registered when you create a new map layer as part of your - * XPLMCreateMapLayer_t. The functions here hook into X-Plane's built-in map - * drawing functionality for icons and labels, so that you get a consistent - * style with the rest of the X-Plane map. - * - * Note that the X-Plane 11 map introduces a strict ordering: layers of type - * xplm_MapLayer_Fill get drawn beneath all xplm_MapLayer_Markings layers. - * Likewise, all OpenGL drawing (performed in your layer's - * XPLMMapDrawingCallback_f) will appear beneath any icons and labels you - * draw. - * - */ - - -/* - * XPLMMapOrientation - * - * Indicates whether a map element should be match its rotation to the map - * itself, or to the user interface. For instance, the map itself may be - * rotated such that "up" matches the user's aircraft, but you may want to - * draw a text label such that it is always rotated zero degrees relative to - * the user's perspective. In that case, you would have it draw with UI - * orientation. - * - */ -enum { - /* Orient such that a 0 degree rotation matches the map's north */ - xplm_MapOrientation_Map = 0, - - /* Orient such that a 0 degree rotation is "up" relative to the user interface*/ - xplm_MapOrientation_UI = 1, - - -}; -typedef int XPLMMapOrientation; - -/* - * XPLMDrawMapIconFromSheet - * - * Enables plugin-created map layers to draw PNG icons using X-Plane's - * built-in icon drawing functionality. Only valid from within an - * XPLMIconDrawingCallback_t (but you can request an arbitrary number of icons - * to be drawn from within your callback). - * - * X-Plane will automatically manage the memory for your texture so that it - * only has to be loaded from disk once as long as you continue drawing it - * per-frame. (When you stop drawing it, the memory may purged in a "garbage - * collection" pass, require a load from disk in the future.) - * - * Instead of having X-Plane draw a full PNG, this method allows you to use UV - * coordinates to request a portion of the image to be drawn. This allows you - * to use a single texture load (of an icon sheet, for example) to draw many - * icons. Doing so is much more efficient than drawing a dozen different small - * PNGs. - * - * The UV coordinates used here treat the texture you load as being comprised - * of a number of identically sized "cells." You specify the width and height - * in cells (ds and dt, respectively), as well as the coordinates within the - * cell grid for the sub-image you'd like to draw. - * - * Note that you can use different ds and dt values in subsequent calls with - * the same texture sheet. This enables you to use icons of different sizes in - * the same sheet if you arrange them properly in the PNG. - * - * This function is only valid from within an XPLMIconDrawingCallback_t (but - * you can request an arbitrary number of icons to be drawn from within your - * callback). - * - */ -XPLM_API void XPLMDrawMapIconFromSheet( - XPLMMapLayerID layer, - const char * inPngPath, - int s, - int t, - int ds, - int dt, - float mapX, - float mapY, - XPLMMapOrientation orientation, - float rotationDegrees, - float mapWidth); - -/* - * XPLMDrawMapLabel - * - * Enables plugin-created map layers to draw text labels using X-Plane's - * built-in labeling functionality. Only valid from within an - * XPLMMapLabelDrawingCallback_f (but you can request an arbitrary number of - * text labels to be drawn from within your callback). - * - */ -XPLM_API void XPLMDrawMapLabel( - XPLMMapLayerID layer, - const char * inText, - float mapX, - float mapY, - XPLMMapOrientation orientation, - float rotationDegrees); - -#endif /* XPLM300 */ -#if defined(XPLM300) -/*************************************************************************** - * MAP PROJECTIONS - ***************************************************************************/ -/* - * As of X-Plane 11, the map draws using true cartographic projections, and - * different maps may use different projections. Thus, to draw at a particular - * latitude and longitude, you must first transform your real-world - * coordinates into map coordinates. - * - * The map projection is also responsible for giving you the current scale of - * the map. That is, the projection can tell you how many map units correspond - * to 1 meter at a given point. - * - * Finally, the map projection can give you the current rotation of the map. - * Since X-Plane 11 maps can rotate to match the heading of the aircraft, the - * map's rotation can potentially change every frame. - * - */ - - -/* - * XPLMMapProject - * - * Projects a latitude/longitude into map coordinates. This is the inverse of - * XPLMMapUnproject(). - * - * Only valid from within a map layer callback (one of - * XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f, - * XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.) - * - */ -XPLM_API void XPLMMapProject( - XPLMMapProjectionID projection, - double latitude, - double longitude, - float * outX, - float * outY); - -/* - * XPLMMapUnproject - * - * Transforms map coordinates back into a latitude and longitude. This is the - * inverse of XPLMMapProject(). - * - * Only valid from within a map layer callback (one of - * XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f, - * XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.) - * - */ -XPLM_API void XPLMMapUnproject( - XPLMMapProjectionID projection, - float mapX, - float mapY, - double * outLatitude, - double * outLongitude); - -/* - * XPLMMapScaleMeter - * - * Returns the number of map units that correspond to a distance of one meter - * at a given set of map coordinates. - * - * Only valid from within a map layer callback (one of - * XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f, - * XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.) - * - */ -XPLM_API float XPLMMapScaleMeter( - XPLMMapProjectionID projection, - float mapX, - float mapY); - -/* - * XPLMMapGetNorthHeading - * - * Returns the heading (in degrees clockwise) from the positive Y axis in the - * cartesian mapping coordinate system to true north at the point passed in. - * You can use it as a clockwise rotational offset to align icons and other - * 2-d drawing with true north on the map, compensating for rotations in the - * map due to projection. - * - * Only valid from within a map layer callback (one of - * XPLMMapPrepareCacheCallback_f, XPLMMapDrawingCallback_f, - * XPLMMapIconDrawingCallback_f, or XPLMMapLabelDrawingCallback_f.) - * - */ -XPLM_API float XPLMMapGetNorthHeading( - XPLMMapProjectionID projection, - float mapX, - float mapY); - -#endif /* XPLM300 */ -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMMenus.h b/lib/SDK/CHeaders/XPLM/XPLMMenus.h deleted file mode 100755 index f5802ab..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMMenus.h +++ /dev/null @@ -1,290 +0,0 @@ -#ifndef _XPLMMenus_h_ -#define _XPLMMenus_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMMenus - ***************************************************************************/ -/* - * Plug-ins can create menus in the menu bar of X-Plane. This is done by - * creating a menu and then creating items. Menus are referred to by an - * opaque ID. Items are referred to by (zero-based) index number. - * - * Menus are "sandboxed" between plugins---no plugin can access the menus of - * any other plugin. Furthermore, all menu indices are relative to your - * plugin's menus only; if your plugin creates two sub-menus in the Plugins - * menu at different times, it doesn't matter how many other plugins also - * create sub-menus of Plugins in the intervening time: your sub-menus will be - * given menu indices 0 and 1. (The SDK does some work in the back-end to - * filter out menus that are irrelevant to your plugin in order to deliver - * this consistency for each plugin.) - * - * When you create a menu item, you specify how we should handle clicks on - * that menu item. You can either have the XPLM trigger a callback (the - * XPLMMenuHandler_f associated with the menu that contains the item), or you - * can simply have a command be triggered (with no associated call to your - * menu handler). The advantage of the latter method is that X-Plane will - * display any keyboard shortcuts associated with the command. (In contrast, - * there are no keyboard shortcuts associated with menu handler callbacks with - * specific parameters.) - * - * Menu text in X-Plane is UTF8; X-Plane's character set covers latin, greek - * and cyrillic characters, Katakana, as well as some Japanese symbols. Some - * APIs have a inDeprecatedAndIgnored parameter that used to select a - * character set; since X-Plane 9 all localization is done via UTF-8 only. - * - */ - -#include "XPLMDefs.h" -#include "XPLMUtilities.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * XPLM MENUS - ***************************************************************************/ - -/* - * XPLMMenuCheck - * - * These enumerations define the various 'check' states for an X-Plane menu. - * 'checking' in X-Plane actually appears as a light which may or may not be - * lit. So there are three possible states. - * - */ -enum { - /* there is no symbol to the left of the menu item. */ - xplm_Menu_NoCheck = 0, - - /* the menu has a mark next to it that is unmarked (not lit). */ - xplm_Menu_Unchecked = 1, - - /* the menu has a mark next to it that is checked (lit). */ - xplm_Menu_Checked = 2, - - -}; -typedef int XPLMMenuCheck; - -/* - * XPLMMenuID - * - * This is a unique ID for each menu you create. - * - */ -typedef void * XPLMMenuID; - -/* - * XPLMMenuHandler_f - * - * A menu handler function takes two reference pointers, one for the menu - * (specified when the menu was created) and one for the item (specified when - * the item was created). - * - */ -typedef void (* XPLMMenuHandler_f)( - void * inMenuRef, - void * inItemRef); - -/* - * XPLMFindPluginsMenu - * - * This function returns the ID of the plug-ins menu, which is created for you - * at startup. - * - */ -XPLM_API XPLMMenuID XPLMFindPluginsMenu(void); - -#if defined(XPLM300) -/* - * XPLMFindAircraftMenu - * - * This function returns the ID of the menu for the currently-loaded aircraft, - * used for showing aircraft-specific commands. - * - * The aircraft menu is created by X-Plane at startup, but it remains hidden - * until it is populated via XPLMAppendMenuItem() or - * XPLMAppendMenuItemWithCommand(). - * - * Only plugins loaded with the user's current aircraft are allowed to access - * the aircraft menu. For all other plugins, this will return NULL, and any - * attempts to add menu items to it will fail. - * - */ -XPLM_API XPLMMenuID XPLMFindAircraftMenu(void); -#endif /* XPLM300 */ - -/* - * XPLMCreateMenu - * - * This function creates a new menu and returns its ID. It returns NULL if - * the menu cannot be created. Pass in a parent menu ID and an item index to - * create a submenu, or NULL for the parent menu to put the menu in the menu - * bar. The menu's name is only used if the menu is in the menubar. You also - * pass a handler function and a menu reference value. Pass NULL for the - * handler if you do not need callbacks from the menu (for example, if it only - * contains submenus). - * - * Important: you must pass a valid, non-empty menu title even if the menu is - * a submenu where the title is not visible. - * - */ -XPLM_API XPLMMenuID XPLMCreateMenu( - const char * inName, - XPLMMenuID inParentMenu, - int inParentItem, - XPLMMenuHandler_f inHandler, - void * inMenuRef); - -/* - * XPLMDestroyMenu - * - * This function destroys a menu that you have created. Use this to remove a - * submenu if necessary. (Normally this function will not be necessary.) - * - */ -XPLM_API void XPLMDestroyMenu( - XPLMMenuID inMenuID); - -/* - * XPLMClearAllMenuItems - * - * This function removes all menu items from a menu, allowing you to rebuild - * it. Use this function if you need to change the number of items on a menu. - * - */ -XPLM_API void XPLMClearAllMenuItems( - XPLMMenuID inMenuID); - -/* - * XPLMAppendMenuItem - * - * This routine appends a new menu item to the bottom of a menu and returns - * its index. Pass in the menu to add the item to, the items name, and a void - * * ref for this item. - * - * Returns a negative index if the append failed (due to an invalid parent - * menu argument). - * - * Note that all menu indices returned are relative to your plugin's menus - * only; if your plugin creates two sub-menus in the Plugins menu at different - * times, it doesn't matter how many other plugins also create sub-menus of - * Plugins in the intervening time: your sub-menus will be given menu indices - * 0 and 1. (The SDK does some work in the back-end to filter out menus that - * are irrelevant to your plugin in order to deliver this consistency for each - * plugin.) - * - */ -XPLM_API int XPLMAppendMenuItem( - XPLMMenuID inMenu, - const char * inItemName, - void * inItemRef, - int inDeprecatedAndIgnored); - -#if defined(XPLM300) -/* - * XPLMAppendMenuItemWithCommand - * - * Like XPLMAppendMenuItem(), but instead of the new menu item triggering the - * XPLMMenuHandler_f of the containiner menu, it will simply execute the - * command you pass in. Using a command for your menu item allows the user to - * bind a keyboard shortcut to the command and see that shortcut represented - * in the menu. - * - * Returns a negative index if the append failed (due to an invalid parent - * menu argument). - * - * Like XPLMAppendMenuItem(), all menu indices are relative to your plugin's - * menus only. - * - */ -XPLM_API int XPLMAppendMenuItemWithCommand( - XPLMMenuID inMenu, - const char * inItemName, - XPLMCommandRef inCommandToExecute); -#endif /* XPLM300 */ - -/* - * XPLMAppendMenuSeparator - * - * This routine adds a separator to the end of a menu. - * - * Returns a negative index if the append failed (due to an invalid parent - * menu argument). - * - */ -XPLM_API void XPLMAppendMenuSeparator( - XPLMMenuID inMenu); - -/* - * XPLMSetMenuItemName - * - * This routine changes the name of an existing menu item. Pass in the menu - * ID and the index of the menu item. - * - */ -XPLM_API void XPLMSetMenuItemName( - XPLMMenuID inMenu, - int inIndex, - const char * inItemName, - int inDeprecatedAndIgnored); - -/* - * XPLMCheckMenuItem - * - * Set whether a menu item is checked. Pass in the menu ID and item index. - * - */ -XPLM_API void XPLMCheckMenuItem( - XPLMMenuID inMenu, - int index, - XPLMMenuCheck inCheck); - -/* - * XPLMCheckMenuItemState - * - * This routine returns whether a menu item is checked or not. A menu item's - * check mark may be on or off, or a menu may not have an icon at all. - * - */ -XPLM_API void XPLMCheckMenuItemState( - XPLMMenuID inMenu, - int index, - XPLMMenuCheck * outCheck); - -/* - * XPLMEnableMenuItem - * - * Sets whether this menu item is enabled. Items start out enabled. - * - */ -XPLM_API void XPLMEnableMenuItem( - XPLMMenuID inMenu, - int index, - int enabled); - -#if defined(XPLM210) -/* - * XPLMRemoveMenuItem - * - * Removes one item from a menu. Note that all menu items below are moved up - * one; your plugin must track the change in index numbers. - * - */ -XPLM_API void XPLMRemoveMenuItem( - XPLMMenuID inMenu, - int inIndex); -#endif /* XPLM210 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMNavigation.h b/lib/SDK/CHeaders/XPLM/XPLMNavigation.h deleted file mode 100755 index 716caf0..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMNavigation.h +++ /dev/null @@ -1,362 +0,0 @@ -#ifndef _XPLMNavigation_h_ -#define _XPLMNavigation_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMNavigation - ***************************************************************************/ -/* - * The XPLM Navigation APIs give you some access to the navigation databases - * inside X-Plane. X-Plane stores all navigation information in RAM, so by - * using these APIs you can gain access to most information without having to - * go to disk or parse the files yourself. - * - * You can also use this API to program the FMS. You must use the navigation - * APIs to find the nav-aids you want to program into the FMS, since the FMS - * is powered internally by X-Plane's navigation database. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * NAVIGATION DATABASE ACCESS - ***************************************************************************/ - -/* - * XPLMNavType - * - * These enumerations define the different types of navaids. They are each - * defined with a separate bit so that they may be bit-wise added together to - * form sets of nav-aid types. - * - * NOTE: xplm_Nav_LatLon is a specific lat-lon coordinate entered into the - * FMS. It will not exist in the database, and cannot be programmed into the - * FMS. Querying the FMS for navaids will return it. Use - * XPLMSetFMSEntryLatLon to set a lat/lon waypoint. - * - */ -enum { - xplm_Nav_Unknown = 0, - - xplm_Nav_Airport = 1, - - xplm_Nav_NDB = 2, - - xplm_Nav_VOR = 4, - - xplm_Nav_ILS = 8, - - xplm_Nav_Localizer = 16, - - xplm_Nav_GlideSlope = 32, - - xplm_Nav_OuterMarker = 64, - - xplm_Nav_MiddleMarker = 128, - - xplm_Nav_InnerMarker = 256, - - xplm_Nav_Fix = 512, - - xplm_Nav_DME = 1024, - - xplm_Nav_LatLon = 2048, - - -}; -typedef int XPLMNavType; - -/* - * XPLMNavRef - * - * XPLMNavRef is an iterator into the navigation database. The navigation - * database is essentially an array, but it is not necessarily densely - * populated. The only assumption you can safely make is that like-typed - * nav-aids are grouped together. - * - * Use XPLMNavRef to refer to a nav-aid. - * - * XPLM_NAV_NOT_FOUND is returned by functions that return an XPLMNavRef when - * the iterator must be invalid. - * - */ -typedef int XPLMNavRef; - -#define XPLM_NAV_NOT_FOUND -1 - -/* - * XPLMGetFirstNavAid - * - * This returns the very first navaid in the database. Use this to traverse - * the entire database. Returns XPLM_NAV_NOT_FOUND if the nav database is - * empty. - * - */ -XPLM_API XPLMNavRef XPLMGetFirstNavAid(void); - -/* - * XPLMGetNextNavAid - * - * Given a valid nav aid ref, this routine returns the next navaid. It - * returns XPLM_NAV_NOT_FOUND if the nav aid passed in was invalid or if the - * navaid passed in was the last one in the database. Use this routine to - * iterate across all like-typed navaids or the entire database. - * - */ -XPLM_API XPLMNavRef XPLMGetNextNavAid( - XPLMNavRef inNavAidRef); - -/* - * XPLMFindFirstNavAidOfType - * - * This routine returns the ref of the first navaid of the given type in the - * database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the - * database. You must pass exactly one nav aid type to this routine. - * - */ -XPLM_API XPLMNavRef XPLMFindFirstNavAidOfType( - XPLMNavType inType); - -/* - * XPLMFindLastNavAidOfType - * - * This routine returns the ref of the last navaid of the given type in the - * database or XPLM_NAV_NOT_FOUND if there are no navaids of that type in the - * database. You must pass exactly one nav aid type to this routine. - * - */ -XPLM_API XPLMNavRef XPLMFindLastNavAidOfType( - XPLMNavType inType); - -/* - * XPLMFindNavAid - * - * This routine provides a number of searching capabilities for the nav - * database. XPLMFindNavAid will search through every nav aid whose type is - * within inType (multiple types may be added together) and return any - * nav-aids found based on the following rules: - * - * * If inLat and inLon are not NULL, the navaid nearest to that lat/lon will - * be returned, otherwise the last navaid found will be returned. - * - * * If inFrequency is not NULL, then any navaids considered must match this - * frequency. Note that this will screen out radio beacons that do not have - * frequency data published (like inner markers) but not fixes and airports. - * - * * If inNameFragment is not NULL, only navaids that contain the fragment in - * their name will be returned. - * - * * If inIDFragment is not NULL, only navaids that contain the fragment in - * their IDs will be returned. - * - * This routine provides a simple way to do a number of useful searches: - * * Find the nearest navaid on this frequency. - * * Find the nearest airport. - * * Find the VOR whose ID is "KBOS". - * * Find the nearest airport whose name contains "Chicago". - * - */ -XPLM_API XPLMNavRef XPLMFindNavAid( - const char * inNameFragment, /* Can be NULL */ - const char * inIDFragment, /* Can be NULL */ - float * inLat, /* Can be NULL */ - float * inLon, /* Can be NULL */ - int * inFrequency, /* Can be NULL */ - XPLMNavType inType); - -/* - * XPLMGetNavAidInfo - * - * This routine returns information about a navaid. Any non-null field is - * filled out with information if it is available. - * - * Frequencies are in the nav.dat convention as described in the X-Plane nav - * database FAQ: NDB frequencies are exact, all others are multiplied by 100. - * - * The buffer for IDs should be at least 6 chars and the buffer for names - * should be at least 41 chars, but since these values are likely to go up, I - * recommend passing at least 32 chars for IDs and 256 chars for names when - * possible. - * - * The outReg parameter tells if the navaid is within the local "region" of - * loaded DSFs. (This information may not be particularly useful to plugins.) - * The parameter is a single byte value 1 for true or 0 for false, not a C - * string. - * - */ -XPLM_API void XPLMGetNavAidInfo( - XPLMNavRef inRef, - XPLMNavType * outType, /* Can be NULL */ - float * outLatitude, /* Can be NULL */ - float * outLongitude, /* Can be NULL */ - float * outHeight, /* Can be NULL */ - int * outFrequency, /* Can be NULL */ - float * outHeading, /* Can be NULL */ - char * outID, /* Can be NULL */ - char * outName, /* Can be NULL */ - char * outReg); /* Can be NULL */ - -/*************************************************************************** - * FLIGHT MANAGEMENT COMPUTER - ***************************************************************************/ -/* - * Note: the FMS works based on an array of entries. Indices into the array - * are zero-based. Each entry is a nav-aid plus an altitude. The FMS tracks - * the currently displayed entry and the entry that it is flying to. - * - * The FMS must be programmed with contiguous entries, so clearing an entry at - * the end shortens the effective flight plan. There is a max of 100 - * waypoints in the flight plan. - * - */ - - -/* - * XPLMCountFMSEntries - * - * This routine returns the number of entries in the FMS. - * - */ -XPLM_API int XPLMCountFMSEntries(void); - -/* - * XPLMGetDisplayedFMSEntry - * - * This routine returns the index of the entry the pilot is viewing. - * - */ -XPLM_API int XPLMGetDisplayedFMSEntry(void); - -/* - * XPLMGetDestinationFMSEntry - * - * This routine returns the index of the entry the FMS is flying to. - * - */ -XPLM_API int XPLMGetDestinationFMSEntry(void); - -/* - * XPLMSetDisplayedFMSEntry - * - * This routine changes which entry the FMS is showing to the index specified. - * - */ -XPLM_API void XPLMSetDisplayedFMSEntry( - int inIndex); - -/* - * XPLMSetDestinationFMSEntry - * - * This routine changes which entry the FMS is flying the aircraft toward. - * - */ -XPLM_API void XPLMSetDestinationFMSEntry( - int inIndex); - -/* - * XPLMGetFMSEntryInfo - * - * This routine returns information about a given FMS entry. If the entry is - * an airport or navaid, a reference to a nav entry can be returned allowing - * you to find additional information (such as a frequency, ILS heading, name, - * etc.). Note that this reference can be XPLM_NAV_NOT_FOUND until the - * information has been looked up asynchronously, so after flightplan changes, - * it might take up to a second for this field to become populated. The other - * information is available immediately. For a lat/lon entry, the lat/lon is - * returned by this routine but the navaid cannot be looked up (and the - * reference will be XPLM_NAV_NOT_FOUND). FMS name entry buffers should be at - * least 256 chars in length. - * - * WARNING: Due to a bug in X-Plane prior to 11.31, the navaid reference will - * not be set to XPLM_NAV_NOT_FOUND while no data is available, and instead - * just remain the value of the variable that you passed the pointer to. - * Therefore, always initialize the variable to XPLM_NAV_NOT_FOUND before - * passing the pointer to this function. - * - */ -XPLM_API void XPLMGetFMSEntryInfo( - int inIndex, - XPLMNavType * outType, /* Can be NULL */ - char * outID, /* Can be NULL */ - XPLMNavRef * outRef, /* Can be NULL */ - int * outAltitude, /* Can be NULL */ - float * outLat, /* Can be NULL */ - float * outLon); /* Can be NULL */ - -/* - * XPLMSetFMSEntryInfo - * - * This routine changes an entry in the FMS to have the destination navaid - * passed in and the altitude specified. Use this only for airports, fixes, - * and radio-beacon navaids. Currently of radio beacons, the FMS can only - * support VORs and NDBs. Use the routines below to clear or fly to a lat/lon. - * - */ -XPLM_API void XPLMSetFMSEntryInfo( - int inIndex, - XPLMNavRef inRef, - int inAltitude); - -/* - * XPLMSetFMSEntryLatLon - * - * This routine changes the entry in the FMS to a lat/lon entry with the given - * coordinates. - * - */ -XPLM_API void XPLMSetFMSEntryLatLon( - int inIndex, - float inLat, - float inLon, - int inAltitude); - -/* - * XPLMClearFMSEntry - * - * This routine clears the given entry, potentially shortening the flight - * plan. - * - */ -XPLM_API void XPLMClearFMSEntry( - int inIndex); - -/*************************************************************************** - * GPS RECEIVER - ***************************************************************************/ -/* - * These APIs let you read data from the GPS unit. - * - */ - -/* - * XPLMGetGPSDestinationType - * - * This routine returns the type of the currently selected GPS destination, - * one of fix, airport, VOR or NDB. - * - */ -XPLM_API XPLMNavType XPLMGetGPSDestinationType(void); - -/* - * XPLMGetGPSDestination - * - * This routine returns the current GPS destination. - * - */ -XPLM_API XPLMNavRef XPLMGetGPSDestination(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMPlanes.h b/lib/SDK/CHeaders/XPLM/XPLMPlanes.h deleted file mode 100755 index 486302d..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMPlanes.h +++ /dev/null @@ -1,287 +0,0 @@ -#ifndef _XPLMPlanes_h_ -#define _XPLMPlanes_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMPlanes - ***************************************************************************/ -/* - * The XPLMPlanes APIs allow you to control the various aircraft in X-Plane, - * both the user's and the sim's. - * - * *Note*: unlike almost all other APIs in the SDK, aircraft paths are _full_ - * file system paths for historical reasons. You'll need to prefix all - * relative paths with the X-Plane path as accessed via XPLMGetSystemPath. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * USER AIRCRAFT ACCESS - ***************************************************************************/ - -/* - * XPLMSetUsersAircraft - * - * This routine changes the user's aircraft. Note that this will reinitialize - * the user to be on the nearest airport's first runway. Pass in a full path - * (hard drive and everything including the .acf extension) to the .acf file. - * - */ -XPLM_API void XPLMSetUsersAircraft( - const char * inAircraftPath); -/* - * XPLMPlaceUserAtAirport - * - * This routine places the user at a given airport. Specify the airport by - * its X-Plane airport ID (e.g. 'KBOS'). - * - */ -XPLM_API void XPLMPlaceUserAtAirport( - const char * inAirportCode); -#if defined(XPLM300) -/* - * XPLMPlaceUserAtLocation - * - * Places the user at a specific location after performing any necessary - * scenery loads. - * - * As with in-air starts initiated from the X-Plane user interface, the - * aircraft will always start with its engines running, regardless of the - * user's preferences (i.e., regardless of what the dataref - * `sim/operation/prefs/startup_running` says). - * - */ -XPLM_API void XPLMPlaceUserAtLocation( - double latitudeDegrees, - double longitudeDegrees, - float elevationMetersMSL, - float headingDegreesTrue, - float speedMetersPerSecond); -#endif /* XPLM300 */ -/*************************************************************************** - * GLOBAL AIRCRAFT ACCESS - ***************************************************************************/ - -/* The user's aircraft is always index 0. */ -#define XPLM_USER_AIRCRAFT 0 -#if defined(XPLM_DEPRECATED) -/* - * XPLMPlaneDrawState_t - * - * This structure contains additional plane parameter info to be passed to - * draw plane. Make sure to fill in the size of the structure field with - * sizeof(XPLMDrawPlaneState_t) so that the XPLM can tell how many fields you - * knew about when compiling your plugin (since more fields may be added - * later). - * - * Most of these fields are ratios from 0 to 1 for control input. X-Plane - * calculates what the actual controls look like based on the .acf file for - * that airplane. Note for the yoke inputs, this is what the pilot of the - * plane has commanded (post artificial stability system if there were one) - * and affects aelerons, rudder, etc. It is not necessarily related to the - * actual position of the plane! - * - */ -typedef struct { - /* The size of the draw state struct. */ - int structSize; - /* A ratio from [0..1] describing how far the landing gear is extended. */ - float gearPosition; - /* Ratio of flap deployment, 0 = up, 1 = full deploy. */ - float flapRatio; - /* Ratio of spoiler deployment, 0 = none, 1 = full deploy. */ - float spoilerRatio; - /* Ratio of speed brake deployment, 0 = none, 1 = full deploy. */ - float speedBrakeRatio; - /* Ratio of slat deployment, 0 = none, 1 = full deploy. */ - float slatRatio; - /* Wing sweep ratio, 0 = forward, 1 = swept. */ - float wingSweep; - /* Thrust power, 0 = none, 1 = full fwd, -1 = full reverse. */ - float thrust; - /* Total pitch input for this plane. */ - float yokePitch; - /* Total Heading input for this plane. */ - float yokeHeading; - /* Total Roll input for this plane. */ - float yokeRoll; -} XPLMPlaneDrawState_t; -#endif /* XPLM_DEPRECATED */ -/* - * XPLMCountAircraft - * - * This function returns the number of aircraft X-Plane is capable of having, - * as well as the number of aircraft that are currently active. These numbers - * count the user's aircraft. It can also return the plugin that is currently - * controlling aircraft. In X-Plane 7, this routine reflects the number of - * aircraft the user has enabled in the rendering options window. - * - */ -XPLM_API void XPLMCountAircraft( - int * outTotalAircraft, - int * outActiveAircraft, - XPLMPluginID * outController); -/* - * XPLMGetNthAircraftModel - * - * This function returns the aircraft model for the Nth aircraft. Indices are - * zero based, with zero being the user's aircraft. The file name should be - * at least 256 chars in length; the path should be at least 512 chars in - * length. - * - */ -XPLM_API void XPLMGetNthAircraftModel( - int inIndex, - char * outFileName, - char * outPath); -/*************************************************************************** - * EXCLUSIVE AIRCRAFT ACCESS - ***************************************************************************/ -/* - * The following routines require exclusive access to the airplane APIs. Only - * one plugin may have this access at a time. - * - */ - - -/* - * XPLMPlanesAvailable_f - * - * Your airplanes available callback is called when another plugin gives up - * access to the multiplayer planes. Use this to wait for access to - * multiplayer. - * - */ -typedef void (* XPLMPlanesAvailable_f)( - void * inRefcon); - -/* - * XPLMAcquirePlanes - * - * XPLMAcquirePlanes grants your plugin exclusive access to the aircraft. It - * returns 1 if you gain access, 0 if you do not. - * - * inAircraft - pass in an array of pointers to strings specifying the planes - * you want loaded. For any plane index you do not want loaded, pass a - * 0-length string. Other strings should be full paths with the .acf - * extension. NULL terminates this array, or pass NULL if there are no planes - * you want loaded. - * - * If you pass in a callback and do not receive access to the planes your - * callback will be called when the airplanes are available. If you do receive - * airplane access, your callback will not be called. - * - */ -XPLM_API int XPLMAcquirePlanes( - char ** inAircraft, /* Can be NULL */ - XPLMPlanesAvailable_f inCallback, - void * inRefcon); - -/* - * XPLMReleasePlanes - * - * Call this function to release access to the planes. Note that if you are - * disabled, access to planes is released for you and you must reacquire it. - * - */ -XPLM_API void XPLMReleasePlanes(void); - -/* - * XPLMSetActiveAircraftCount - * - * This routine sets the number of active planes. If you pass in a number - * higher than the total number of planes availables, only the total number of - * planes available is actually used. - * - */ -XPLM_API void XPLMSetActiveAircraftCount( - int inCount); - -/* - * XPLMSetAircraftModel - * - * This routine loads an aircraft model. It may only be called if you have - * exclusive access to the airplane APIs. Pass in the path of the model with - * the .acf extension. The index is zero based, but you may not pass in 0 - * (use XPLMSetUsersAircraft to load the user's aircracft). - * - */ -XPLM_API void XPLMSetAircraftModel( - int inIndex, - const char * inAircraftPath); - -/* - * XPLMDisableAIForPlane - * - * This routine turns off X-Plane's AI for a given plane. The plane will - * continue to draw and be a real plane in X-Plane, but will not move itself. - * - */ -XPLM_API void XPLMDisableAIForPlane( - int inPlaneIndex); - -#if defined(XPLM_DEPRECATED) -/* - * XPLMDrawAircraft - * - * WARNING: Aircraft drawing via this API is deprecated and will not work in - * future versions of X-Plane. Use XPLMInstance for 3-d drawing of custom - * aircraft models. - * - * This routine draws an aircraft. It can only be called from a 3-d drawing - * callback. Pass in the position of the plane in OpenGL local coordinates - * and the orientation of the plane. A 1 for full drawing indicates that the - * whole plane must be drawn; a 0 indicates you only need the nav lights - * drawn. (This saves rendering time when planes are far away.) - * - */ -XPLM_API void XPLMDrawAircraft( - int inPlaneIndex, - float inX, - float inY, - float inZ, - float inPitch, - float inRoll, - float inYaw, - int inFullDraw, - XPLMPlaneDrawState_t * inDrawStateInfo); -#endif /* XPLM_DEPRECATED */ - -#if defined(XPLM_DEPRECATED) -/* - * XPLMReinitUsersPlane - * - * WARNING: DO NOT USE. Use XPLMPlaceUserAtAirport or - * XPLMPlaceUserAtLocation. - * - * This function recomputes the derived flight model data from the aircraft - * structure in memory. If you have used the data access layer to modify the - * aircraft structure, use this routine to resynchronize X-Plane; since - * X-Plane works at least partly from derived values, the sim will not behave - * properly until this is called. - * - * WARNING: this routine does not necessarily place the airplane at the - * airport; use XPLMSetUsersAircraft to be compatible. This routine is - * provided to do special experimentation with flight models without resetting - * flight. - * - */ -XPLM_API void XPLMReinitUsersPlane(void); -#endif /* XPLM_DEPRECATED */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMPlugin.h b/lib/SDK/CHeaders/XPLM/XPLMPlugin.h deleted file mode 100755 index be5d06c..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMPlugin.h +++ /dev/null @@ -1,422 +0,0 @@ -#ifndef _XPLMPlugin_h_ -#define _XPLMPlugin_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMPlugin - ***************************************************************************/ -/* - * These APIs provide facilities to find and work with other plugins and - * manage other plugins. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * FINDING PLUGINS - ***************************************************************************/ -/* - * These APIs allow you to find another plugin or yourself, or iterate across - * all plugins. For example, if you wrote an FMS plugin that needed to talk - * to an autopilot plugin, you could use these APIs to locate the autopilot - * plugin. - * - */ - - -/* - * XPLMGetMyID - * - * This routine returns the plugin ID of the calling plug-in. Call this to - * get your own ID. - * - */ -XPLM_API XPLMPluginID XPLMGetMyID(void); - -/* - * XPLMCountPlugins - * - * This routine returns the total number of plug-ins that are loaded, both - * disabled and enabled. - * - */ -XPLM_API int XPLMCountPlugins(void); - -/* - * XPLMGetNthPlugin - * - * This routine returns the ID of a plug-in by index. Index is 0 based from 0 - * to XPLMCountPlugins-1, inclusive. Plugins may be returned in any arbitrary - * order. - * - */ -XPLM_API XPLMPluginID XPLMGetNthPlugin( - int inIndex); - -/* - * XPLMFindPluginByPath - * - * This routine returns the plug-in ID of the plug-in whose file exists at the - * passed in absolute file system path. XPLM_NO_PLUGIN_ID is returned if the - * path does not point to a currently loaded plug-in. - * - */ -XPLM_API XPLMPluginID XPLMFindPluginByPath( - const char * inPath); - -/* - * XPLMFindPluginBySignature - * - * This routine returns the plug-in ID of the plug-in whose signature matches - * what is passed in or XPLM_NO_PLUGIN_ID if no running plug-in has this - * signature. Signatures are the best way to identify another plug-in as they - * are independent of the file system path of a plug-in or the human-readable - * plug-in name, and should be unique for all plug-ins. Use this routine to - * locate another plugin that your plugin interoperates with - * - */ -XPLM_API XPLMPluginID XPLMFindPluginBySignature( - const char * inSignature); - -/* - * XPLMGetPluginInfo - * - * This routine returns information about a plug-in. Each parameter should be - * a pointer to a buffer of at least - * 256 characters, or NULL to not receive the information. - * - * outName - the human-readable name of the plug-in. outFilePath - the - * absolute file path to the file that contains this plug-in. outSignature - a - * unique string that identifies this plug-in. outDescription - a - * human-readable description of this plug-in. - * - */ -XPLM_API void XPLMGetPluginInfo( - XPLMPluginID inPlugin, - char * outName, /* Can be NULL */ - char * outFilePath, /* Can be NULL */ - char * outSignature, /* Can be NULL */ - char * outDescription); /* Can be NULL */ - -/*************************************************************************** - * ENABLING/DISABLING PLUG-INS - ***************************************************************************/ -/* - * These routines are used to work with plug-ins and manage them. Most - * plugins will not need to use these APIs. - * - */ - - -/* - * XPLMIsPluginEnabled - * - * Returns whether the specified plug-in is enabled for running. - * - */ -XPLM_API int XPLMIsPluginEnabled( - XPLMPluginID inPluginID); - -/* - * XPLMEnablePlugin - * - * This routine enables a plug-in if it is not already enabled. It returns 1 - * if the plugin was enabled or successfully enables itself, 0 if it does not. - * Plugins may fail to enable (for example, if resources cannot be acquired) - * by returning 0 from their XPluginEnable callback. - * - */ -XPLM_API int XPLMEnablePlugin( - XPLMPluginID inPluginID); - -/* - * XPLMDisablePlugin - * - * This routine disableds an enabled plug-in. - * - */ -XPLM_API void XPLMDisablePlugin( - XPLMPluginID inPluginID); - -/* - * XPLMReloadPlugins - * - * This routine reloads all plug-ins. Once this routine is called and you - * return from the callback you were within (e.g. a menu select callback) you - * will receive your XPluginDisable and XPluginStop callbacks and your DLL - * will be unloaded, then the start process happens as if the sim was starting - * up. - * - */ -XPLM_API void XPLMReloadPlugins(void); - -/*************************************************************************** - * INTERPLUGIN MESSAGING - ***************************************************************************/ -/* - * Plugin messages are defined as 32-bit integers. Messages below 0x00FFFFFF - * are reserved for X-Plane and the plugin SDK. - * - * Messages come with a pointer parameter; the meaning of this pointer depends - * on the message itself. In some messages, the pointer parameter contains an - * actual typed pointer to data that can be inspected in the plugin; in these - * cases the documentation will state that the parameter "points to" - * information. - * - * in other cases, the value of the pointer is actually an integral number - * stuffed into the pointer's storage. In these second cases, the pointer - * parameter needs to be cast, not dereferenced. In these caess, the - * documentation will state that the parameter "contains" a value, which will - * always be an integral type. - * - * Some messages don't use the pointer parameter - in this case your plugin - * should ignore it. - * - * Messages have two conceptual uses: notifications and commands. Commands - * are sent from one plugin to another to induce behavior; notifications are - * sent from one plugin to all others for informational purposes. It is - * important that commands and notifications not have the same values because - * this could cause a notification sent by one plugin to accidentally induce a - * command in another. - * - * By convention, plugin-defined notifications should have the high bit set - * (e.g. be greater or equal to unsigned 0x8000000) while commands should have - * this bit be cleared. - * - * The following messages are sent to your plugin by X-Plane. - * - */ - - -/* This message is sent to your plugin whenever the user's plane crashes. The * - * parameter is ignored. */ -#define XPLM_MSG_PLANE_CRASHED 101 - -/* This message is sent to your plugin whenever a new plane is loaded. The * - * parameter contains the index number of the plane being loaded; 0 indicates * - * the user's plane. */ -#define XPLM_MSG_PLANE_LOADED 102 - -/* This messages is sent whenever the user's plane is positioned at a new * - * airport. The parameter is ignored. */ -#define XPLM_MSG_AIRPORT_LOADED 103 - -/* This message is sent whenever new scenery is loaded. Use datarefs to * - * determine the new scenery files that were loaded. The parameter is ignored.*/ -#define XPLM_MSG_SCENERY_LOADED 104 - -/* This message is sent whenever the user adjusts the number of X-Plane * - * aircraft models. You must use XPLMCountPlanes to find out how many planes * - * are now available. This message will only be sent in XP7 and higher * - * because in XP6 the number of aircraft is not user-adjustable. The parameter* - * is ignored. */ -#define XPLM_MSG_AIRPLANE_COUNT_CHANGED 105 - -#if defined(XPLM200) -/* This message is sent to your plugin whenever a plane is unloaded. The * - * parameter contains the index number of the plane being unloaded; 0 * - * indicates the user's plane. The parameter is of type int, passed as the * - * value of the pointer. (That is: the parameter is an int, not a pointer to * - * an int.) */ -#define XPLM_MSG_PLANE_UNLOADED 106 -#endif /* XPLM200 */ - -#if defined(XPLM210) -/* This message is sent to your plugin right before X-Plane writes its * - * preferences file. You can use this for two purposes: to write your own * - * preferences, and to modify any datarefs to influence preferences output. * - * For example, if your plugin temporarily modifies saved preferences, you can* - * put them back to their default values here to avoid having the tweaks be * - * persisted if your plugin is not loaded on the next invocation of X-Plane. * - * The parameter is ignored. */ -#define XPLM_MSG_WILL_WRITE_PREFS 107 -#endif /* XPLM210 */ - -#if defined(XPLM210) -/* This message is sent to your plugin right after a livery is loaded for an * - * airplane. You can use this to check the new livery (via datarefs) and * - * react accordingly. The parameter contains the index number of the aircraft* - * whose livery is changing. */ -#define XPLM_MSG_LIVERY_LOADED 108 -#endif /* XPLM210 */ - -#if defined(XPLM301) -/* Sent to your plugin right before X-Plane enters virtual reality mode (at * - * which time any windows that are not positioned in VR mode will no longer be* - * visible to the user). The parameter is unused and should be ignored. */ -#define XPLM_MSG_ENTERED_VR 109 -#endif /* XPLM301 */ - -#if defined(XPLM301) -/* Sent to your plugin right before X-Plane leaves virtual reality mode (at * - * which time you may want to clean up windows that are positioned in VR * - * mode). The parameter is unused and should be ignored. */ -#define XPLM_MSG_EXITING_VR 110 -#endif /* XPLM301 */ - -#if defined(XPLM303) -/* Sent to your plugin if another plugin wants to take over AI planes. If you * - * are a synthetic traffic provider, that probably means a plugin for an * - * online network has connected and wants to supply aircraft flown by real * - * humans and you should cease to provide synthetic traffic. If however you * - * are providing online traffic from real humans, you probably don't want to * - * disconnect, in which case you just ignore this message. The sender is the * - * plugin ID of the plugin asking for control of the planes now. You can use * - * it to find out who is requesting and whether you should yield to them. * - * Synthetic traffic providers should always yield to online networks. The * - * parameter is unused and should be ignored. */ -#define XPLM_MSG_RELEASE_PLANES 111 -#endif /* XPLM303 */ - -/* - * XPLMSendMessageToPlugin - * - * This function sends a message to another plug-in or X-Plane. Pass - * XPLM_NO_PLUGIN_ID to broadcast to all plug-ins. Only enabled plug-ins with - * a message receive function receive the message. - * - */ -XPLM_API void XPLMSendMessageToPlugin( - XPLMPluginID inPlugin, - int inMessage, - void * inParam); - -#if defined(XPLM200) -/*************************************************************************** - * Plugin Features API - ***************************************************************************/ -/* - * The plugin features API allows your plugin to "sign up" for additional - * capabilities and plugin system features that are normally disabled for - * backward compatibility. This allows advanced plugins to "opt-in" to new - * behavior. - * - * Each feature is defined by a permanent string name. The feature string - * names will vary with the particular installation of X-Plane, so plugins - * should not expect a feature to be guaranteed present. - * - * XPLM_WANTS_REFLECTIONS - * ---------------------- - * - * Available in the SDK 2.0 and later for X-Plane 9, enabling this capability - * causes your plugin to receive drawing hook callbacks when X-Plane builds - * its off-screen reflection and shadow rendering passes. Plugins should - * enable this and examine the dataref sim/graphics/view/plane_render_type to - * determine whether the drawing callback is for a reflection, shadow - * calculation, or the main screen. Rendering can be simlified or omitted for - * reflections, and non-solid drawing should be skipped for shadow - * calculations. - * - * **Note**: direct drawing via draw callbacks is not recommended; use the - * XPLMInstance API to create object models instead. - * - * XPLM_USE_NATIVE_PATHS - * --------------------- - * - * available in the SDK 2.1 and later for X-Plane 10, this modifies the plugin - * system to use Unix-style paths on all operating systems. With this enabled: - * - * * OS X paths will match the native OS X Unix. - * * Windows will use forward slashes but preserve C:\ or another drive letter - * when using complete file paths. - * * Linux uses its native file system path scheme. - * - * Without this enabled: - * - * * OS X will use CFM file paths separated by a colon. - * * Windows will use back-slashes and conventional DOS paths. - * * Linux uses its native file system path scheme. - * - * All plugins should enable this feature on OS X to access the native file - * system. - * - * XPLM_USE_NATIVE_WIDGET_WINDOWS - * ------------------------------ - * - * Available in the SDK 3.0.2 SDK, this capability tells the widgets library - * to use new, modern X-Plane backed XPLMDisplay windows to anchor all widget - * trees. Without it, widgets will always use legacy windows. - * - * Plugins should enable this to allow their widget hierarchies to respond to - * the user's UI size settings and to map widget-based windwos to a VR HMD. - * - * Before enabling this, make sure any custom widget code in your plugin is - * prepared to cope with the UI coordinate system not being th same as the - * OpenGL window coordinate system. - * - */ - - -/* - * XPLMFeatureEnumerator_f - * - * You pass an XPLMFeatureEnumerator_f to get a list of all features supported - * by a given version running version of X-Plane. This routine is called once - * for each feature. - * - */ -typedef void (* XPLMFeatureEnumerator_f)( - const char * inFeature, - void * inRef); - -/* - * XPLMHasFeature - * - * This returns 1 if the given installation of X-Plane supports a feature, or - * 0 if it does not. - * - */ -XPLM_API int XPLMHasFeature( - const char * inFeature); - -/* - * XPLMIsFeatureEnabled - * - * This returns 1 if a feature is currently enabled for your plugin, or 0 if - * it is not enabled. It is an error to call this routine with an unsupported - * feature. - * - */ -XPLM_API int XPLMIsFeatureEnabled( - const char * inFeature); - -/* - * XPLMEnableFeature - * - * This routine enables or disables a feature for your plugin. This will - * change the running behavior of X-Plane and your plugin in some way, - * depending on the feature. - * - */ -XPLM_API void XPLMEnableFeature( - const char * inFeature, - int inEnable); - -/* - * XPLMEnumerateFeatures - * - * This routine calls your enumerator callback once for each feature that this - * running version of X-Plane supports. Use this routine to determine all of - * the features that X-Plane can support. - * - */ -XPLM_API void XPLMEnumerateFeatures( - XPLMFeatureEnumerator_f inEnumerator, - void * inRef); - -#endif /* XPLM200 */ -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMProcessing.h b/lib/SDK/CHeaders/XPLM/XPLMProcessing.h deleted file mode 100755 index 94ef0c4..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMProcessing.h +++ /dev/null @@ -1,264 +0,0 @@ -#ifndef _XPLMProcessing_h_ -#define _XPLMProcessing_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMProcessing - ***************************************************************************/ -/* - * This API allows you to get regular callbacks during the flight loop, the - * part of X-Plane where the plane's position calculates the physics of - * flight, etc. Use these APIs to accomplish periodic tasks like logging data - * and performing I/O. - * - * You can receive a callback either just before or just after the per-frame - * physics calculations happen - you can use post-FM callbacks to "patch" the - * flight model after it has run. - * - * If the user has set the number of flight model iterations per frame greater - * than one your plugin will _not_ see this; these integrations run on the - * sub-section of the flight model where iterations improve responsiveness - * (e.g. physical integration, not simple systems tracking) and are thus - * opaque to plugins. - * - * Flight loop scheduling, when scheduled by time, is scheduled by a "first - * callback after the deadline" schedule, e.g. your callbacks will always be - * slightly late to ensure that we don't run faster than your deadline. - * - * WARNING: Do NOT use these callbacks to draw! You cannot draw during flight - * loop callbacks. Use the drawing callbacks (see XPLMDisplay for more info) - * for graphics. (One exception: you can use a post-flight loop callback to - * update your own off-screen FBOs.) - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * FLIGHT LOOP CALLBACKS - ***************************************************************************/ - -#if defined(XPLM210) -/* - * XPLMFlightLoopPhaseType - * - * You can register a flight loop callback to run either before or after the - * flight model is integrated by X-Plane. - * - */ -enum { - /* Your callback runs before X-Plane integrates the flight model. */ - xplm_FlightLoop_Phase_BeforeFlightModel = 0, - - /* Your callback runs after X-Plane integrates the flight model. */ - xplm_FlightLoop_Phase_AfterFlightModel = 1, - - -}; -typedef int XPLMFlightLoopPhaseType; -#endif /* XPLM210 */ - -#if defined(XPLM210) -/* - * XPLMFlightLoopID - * - * This is an opaque identifier for a flight loop callback. You can use this - * identifier to easily track and remove your callbacks, or to use the new - * flight loop APIs. - * - */ -typedef void * XPLMFlightLoopID; -#endif /* XPLM210 */ - -/* - * XPLMFlightLoop_f - * - * This is your flight loop callback. Each time the flight loop is iterated - * through, you receive this call at the end. - * - * Flight loop callbacks receive a number of input timing parameters. These - * input timing parameters are not particularly useful; you may need to track - * your own timing data (e.g. by reading datarefs). The input parameters are: - * - * - inElapsedSinceLastCall: the wall time since your last callback. - * - inElapsedTimeSinceLastFlightLoop: the wall time since any flight loop was - * dispatched. - * - inCounter: a monotonically increasing counter, bumped once per flight - * loop dispatch from the sim. - * - inRefcon: your own ptr constant from when you regitered yor callback. - * - * Your return value controls when you will next be called. - * - * - Return 0 to stop receiving callbacks. - * - Pass a positive number to specify how many seconds until the next - * callback. (You will be called at or after this time, not before.) - * - Pass a negative number to specify how many loops must go by until you - * are called. For example, -1.0 means call me the very next loop. - * - * Try to run your flight loop as infrequently as is practical, and suspend it - * (using return value 0) when you do not need it; lots of flight loop - * callbacks that do nothing lowers X-Plane's frame rate. - * - * Your callback will NOT be unregistered if you return 0; it will merely be - * inactive. - * - */ -typedef float (* XPLMFlightLoop_f)( - float inElapsedSinceLastCall, - float inElapsedTimeSinceLastFlightLoop, - int inCounter, - void * inRefcon); - -#if defined(XPLM210) -/* - * XPLMCreateFlightLoop_t - * - * XPLMCreateFlightLoop_t contains the parameters to create a new flight loop - * callback. The strsucture can be expanded in future SDKs - always set - * structSize to the size of your structure in bytes. - * - */ -typedef struct { - int structSize; - XPLMFlightLoopPhaseType phase; - XPLMFlightLoop_f callbackFunc; - void * refcon; -} XPLMCreateFlightLoop_t; -#endif /* XPLM210 */ - -/* - * XPLMGetElapsedTime - * - * This routine returns the elapsed time since the sim started up in decimal - * seconds. This is a wall timer; it keeps counting upward even if the sim is - * pasued. - * - * __WARNING__: XPLMGetElapsedTime is not a very good timer! It lacks - * precision in both its data type and its source. Do not attempt to use it - * for timing critical applications like network multiplayer. - * - */ -XPLM_API float XPLMGetElapsedTime(void); - -/* - * XPLMGetCycleNumber - * - * This routine returns a counter starting at zero for each sim cycle - * computed/video frame rendered. - * - */ -XPLM_API int XPLMGetCycleNumber(void); - -/* - * XPLMRegisterFlightLoopCallback - * - * This routine registers your flight loop callback. Pass in a pointer to a - * flight loop function and a refcon. inInterval defines when you will be - * called. Pass in a positive number to specify seconds from registration time - * to the next callback. Pass in a negative number to indicate when you will - * be called (e.g. pass -1 to be called at the next cylcle). Pass 0 to not be - * called; your callback will be inactive. - * - * (This legacy function only installs pre-flight-loop callbacks; use - * XPLMCreateFlightLoop for more control.) - * - */ -XPLM_API void XPLMRegisterFlightLoopCallback( - XPLMFlightLoop_f inFlightLoop, - float inInterval, - void * inRefcon); - -/* - * XPLMUnregisterFlightLoopCallback - * - * This routine unregisters your flight loop callback. Do NOT call it from - * your flight loop callback. Once your flight loop callback is unregistered, - * it will not be called again. - * - * Only use this on flight loops registered via - * XPLMRegisterFlightLoopCallback. - * - */ -XPLM_API void XPLMUnregisterFlightLoopCallback( - XPLMFlightLoop_f inFlightLoop, - void * inRefcon); - -/* - * XPLMSetFlightLoopCallbackInterval - * - * This routine sets when a callback will be called. Do NOT call it from your - * callback; use the return value of the callback to change your callback - * interval from inside your callback. - * - * inInterval is formatted the same way as in XPLMRegisterFlightLoopCallback; - * positive for seconds, negative for cycles, and 0 for deactivating the - * callback. If inRelativeToNow is 1, times are from the time of this call; - * otherwise they are from the time the callback was last called (or the time - * it was registered if it has never been called. - * - */ -XPLM_API void XPLMSetFlightLoopCallbackInterval( - XPLMFlightLoop_f inFlightLoop, - float inInterval, - int inRelativeToNow, - void * inRefcon); - -#if defined(XPLM210) -/* - * XPLMCreateFlightLoop - * - * This routine creates a flight loop callback and returns its ID. The flight - * loop callback is created using the input param struct, and is inited to be - * unscheduled. - * - */ -XPLM_API XPLMFlightLoopID XPLMCreateFlightLoop( - XPLMCreateFlightLoop_t * inParams); -#endif /* XPLM210 */ - -#if defined(XPLM210) -/* - * XPLMDestroyFlightLoop - * - * This routine destroys a flight loop callback by ID. Only call it on flight - * loops created with the newer XPLMCreateFlightLoop API. - * - */ -XPLM_API void XPLMDestroyFlightLoop( - XPLMFlightLoopID inFlightLoopID); -#endif /* XPLM210 */ - -#if defined(XPLM210) -/* - * XPLMScheduleFlightLoop - * - * This routine schedules a flight loop callback for future execution. If - * inInterval is negative, it is run in a certain number of frames based on - * the absolute value of the input. If the interval is positive, it is a - * duration in seconds. - * - * If inRelativeToNow is true, ties are interpretted relative to the time this - * routine is called; otherwise they are relative to the last call time or the - * time the flight loop was registered (if never called). - * - */ -XPLM_API void XPLMScheduleFlightLoop( - XPLMFlightLoopID inFlightLoopID, - float inInterval, - int inRelativeToNow); -#endif /* XPLM210 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMScenery.h b/lib/SDK/CHeaders/XPLM/XPLMScenery.h deleted file mode 100644 index 452bac9..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMScenery.h +++ /dev/null @@ -1,450 +0,0 @@ -#ifndef _XPLMScenery_h_ -#define _XPLMScenery_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMScenery - ***************************************************************************/ -/* - * This package contains APIs to interact with X-Plane's scenery system. - * - */ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(XPLM200) -/*************************************************************************** - * Terrain Y-Testing - ***************************************************************************/ -/* - * The Y-testing API allows you to locate the physical scenery mesh. This - * would be used to place dynamic graphics on top of the ground in a plausible - * way or do physics interactions. - * - * The Y-test API works via probe objects, which are allocated by your plugin - * and used to query terrain. Probe objects exist both to capture which - * algorithm you have requested (see probe types) and also to cache query - * information. - * - * Performance Guidelines - * ---------------------- - * - * It is generally faster to use the same probe for nearby points and - * different probes for different points. Try not to allocate more than - * "hundreds" of probes at most. Share probes if you need more. Generally, - * probing operations are expensive, and should be avoided via caching when - * possible. - * - * Y testing returns a location on the terrain, a normal vectory, and a - * velocity vector. The normal vector tells you the slope of the terrain at - * that point. The velocity vector tells you if that terrain is moving (and is - * in meters/second). For example, if your Y test hits the aircraft carrier - * deck, this tells you the velocity of that point on the deck. - * - * Note: the Y-testing API is limited to probing the loaded scenery area, - * which is approximately 300x300 km in X-Plane 9. Probes outside this area - * will return the height of a 0 MSL sphere. - * - */ - - -/* - * XPLMProbeType - * - * XPLMProbeType defines the type of terrain probe - each probe has a - * different algorithm. (Only one type of probe is provided right now, but - * future APIs will expose more flexible or poewrful or useful probes. - * - */ -enum { - /* The Y probe gives you the location of the tallest physical scenery along * - * the Y axis going through the queried point. */ - xplm_ProbeY = 0, - - -}; -typedef int XPLMProbeType; - -/* - * XPLMProbeResult - * - * Probe results - possible results from a probe query. - * - */ -enum { - /* The probe hit terrain and returned valid values. */ - xplm_ProbeHitTerrain = 0, - - /* An error in the API call. Either the probe struct size is bad, or the * - * probe is invalid or the type is mismatched for the specific query call. */ - xplm_ProbeError = 1, - - /* The probe call succeeded but there is no terrain under this point (perhaps * - * it is off the side of the planet?) */ - xplm_ProbeMissed = 2, - - -}; -typedef int XPLMProbeResult; - -/* - * XPLMProbeRef - * - * An XPLMProbeRef is an opaque handle to a probe, used for querying the - * terrain. - * - */ -typedef void * XPLMProbeRef; - -/* - * XPLMProbeInfo_t - * - * XPLMProbeInfo_t contains the results of a probe call. Make sure to set - * structSize to the size of the struct before using it. - * - */ -typedef struct { - /* Size of structure in bytes - always set this before calling the XPLM. */ - int structSize; - /* Resulting X location of the terrain point we hit, in local OpenGL * - * coordinates. */ - float locationX; - /* Resulting Y location of the terrain point we hit, in local OpenGL * - * coordinates. */ - float locationY; - /* Resulting Z location of the terrain point we hit, in local OpenGL * - * coordinates. */ - float locationZ; - /* X component of the normal vector to the terrain we found. */ - float normalX; - /* Y component of the normal vector to the terrain we found. */ - float normalY; - /* Z component of the normal vector to the terrain we found. */ - float normalZ; - /* X component of the velocity vector of the terrain we found. */ - float velocityX; - /* Y component of the velocity vector of the terrain we found. */ - float velocityY; - /* Z component of the velocity vector of the terrain we found. */ - float velocityZ; - /* Tells if the surface we hit is water (otherwise it is land). */ - int is_wet; -} XPLMProbeInfo_t; - -/* - * XPLMCreateProbe - * - * Creates a new probe object of a given type and returns. - * - */ -XPLM_API XPLMProbeRef XPLMCreateProbe( - XPLMProbeType inProbeType); - -/* - * XPLMDestroyProbe - * - * Deallocates an existing probe object. - * - */ -XPLM_API void XPLMDestroyProbe( - XPLMProbeRef inProbe); - -/* - * XPLMProbeTerrainXYZ - * - * Probes the terrain. Pass in the XYZ coordinate of the probe point, a probe - * object, and an XPLMProbeInfo_t struct that has its structSize member set - * properly. Other fields are filled in if we hit terrain, and a probe result - * is returned. - * - */ -XPLM_API XPLMProbeResult XPLMProbeTerrainXYZ( - XPLMProbeRef inProbe, - float inX, - float inY, - float inZ, - XPLMProbeInfo_t * outInfo); - -#endif /* XPLM200 */ -#if defined(XPLM300) -/*************************************************************************** - * Magnetic Variation - ***************************************************************************/ -/* - * Use the magnetic variation (more properly, the "magnetic declination") API - * to find the offset of magnetic north from true north at a given latitude - * and longitude within the simulator. - * - * In the real world, the Earth's magnetic field is irregular, such that true - * north (the direction along a meridian toward the north pole) does not - * necessarily match what a magnetic compass shows as north. - * - * Using this API ensures that you present the same offsets to users as - * X-Plane's built-in instruments. - * - */ - - -/* - * XPLMGetMagneticVariation - * - * Returns X-Plane's simulated magnetic variation (declination) at the - * indication latitude and longitude. - * - */ -XPLM_API float XPLMGetMagneticVariation( - double latitude, - double longitude); - -/* - * XPLMDegTrueToDegMagnetic - * - * Converts a heading in degrees relative to true north into a value relative - * to magnetic north at the user's current location. - * - */ -XPLM_API float XPLMDegTrueToDegMagnetic( - float headingDegreesTrue); - -/* - * XPLMDegMagneticToDegTrue - * - * Converts a heading in degrees relative to magnetic north at the user's - * current location into a value relative to true north. - * - */ -XPLM_API float XPLMDegMagneticToDegTrue( - float headingDegreesMagnetic); - -#endif /* XPLM300 */ -/*************************************************************************** - * Object Drawing - ***************************************************************************/ -/* - * The object drawing routines let you load and draw X-Plane OBJ files. - * Objects are loaded by file path and managed via an opaque handle. X-Plane - * naturally reference counts objects, so it is important that you balance - * every successful call to XPLMLoadObject with a call to XPLMUnloadObject! - * - */ - - -#if defined(XPLM200) -/* - * XPLMObjectRef - * - * An XPLMObjectRef is a opaque handle to an .obj file that has been loaded - * into memory. - * - */ -typedef void * XPLMObjectRef; -#endif /* XPLM200 */ - -#if defined(XPLM200) -/* - * XPLMDrawInfo_t - * - * The XPLMDrawInfo_t structure contains positioning info for one object that - * is to be drawn. Be sure to set structSize to the size of the structure for - * future expansion. - * - */ -typedef struct { - /* Set this to the size of this structure! */ - int structSize; - /* X location of the object in local coordinates. */ - float x; - /* Y location of the object in local coordinates. */ - float y; - /* Z location of the object in local coordinates. */ - float z; - /* Pitch in degres to rotate the object, positive is up. */ - float pitch; - /* Heading in local coordinates to rotate the object, clockwise. */ - float heading; - /* Roll to rotate the object. */ - float roll; -} XPLMDrawInfo_t; -#endif /* XPLM200 */ - -#if defined(XPLM210) -/* - * XPLMObjectLoaded_f - * - * You provide this callback when loading an object asynchronously; it will be - * called once the object is loaded. Your refcon is passed back. The object - * ref passed in is the newly loaded object (ready for use) or NULL if an - * error occured. - * - * If your plugin is disabled, this callback will be delivered as soon as the - * plugin is re-enabled. If your plugin is unloaded before this callback is - * ever called, the SDK will release the object handle for you. - * - */ -typedef void (* XPLMObjectLoaded_f)( - XPLMObjectRef inObject, - void * inRefcon); -#endif /* XPLM210 */ - -#if defined(XPLM200) -/* - * XPLMLoadObject - * - * This routine loads an OBJ file and returns a handle to it. If X-Plane has - * already loaded the object, the handle to the existing object is returned. - * Do not assume you will get the same handle back twice, but do make sure to - * call unload once for every load to avoid "leaking" objects. The object will - * be purged from memory when no plugins and no scenery are using it. - * - * The path for the object must be relative to the X-System base folder. If - * the path is in the root of the X-System folder you may need to prepend ./ - * to it; loading objects in the root of the X-System folder is STRONGLY - * discouraged - your plugin should not dump art resources in the root folder! - * - * XPLMLoadObject will return NULL if the object cannot be loaded (either - * because it is not found or the file is misformatted). This routine will - * load any object that can be used in the X-Plane scenery system. - * - * It is important that the datarefs an object uses for animation already be - * loaded before you load the object. For this reason it may be necessary to - * defer object loading until the sim has fully started. - * - */ -XPLM_API XPLMObjectRef XPLMLoadObject( - const char * inPath); -#endif /* XPLM200 */ - -#if defined(XPLM210) -/* - * XPLMLoadObjectAsync - * - * This routine loads an object asynchronously; control is returned to you - * immediately while X-Plane loads the object. The sim will not stop flying - * while the object loads. For large objects, it may be several seconds before - * the load finishes. - * - * You provide a callback function that is called once the load has completed. - * Note that if the object cannot be loaded, you will not find out until the - * callback function is called with a NULL object handle. - * - * There is no way to cancel an asynchronous object load; you must wait for - * the load to complete and then release the object if it is no longer - * desired. - * - */ -XPLM_API void XPLMLoadObjectAsync( - const char * inPath, - XPLMObjectLoaded_f inCallback, - void * inRefcon); -#endif /* XPLM210 */ - -#if defined(XPLM_DEPRECATED) -/* - * XPLMDrawObjects - * - * __Deprecation Warning__: use XPLMInstancing to draw 3-d objects by creating - * instances, rather than these APIs from draw callbacks. - * - * XPLMDrawObjects draws an object from an OBJ file one or more times. You - * pass in the object and an array of XPLMDrawInfo_t structs, one for each - * place you would like the object to be drawn. - * - * X-Plane will attempt to cull the objects based on LOD and visibility, and - * will pick the appropriate LOD. - * - * Lighting is a boolean; pass 1 to show the night version of object with - * night-only lights lit up. Pass 0 to show the daytime version of the object. - * - * earth_relative controls the coordinate system. If this is 1, the rotations - * you specify are applied to the object after its coordinate system is - * transformed from local to earth-relative coordinates -- that is, an object - * with no rotations will point toward true north and the Y axis will be up - * against gravity. If this is 0, the object is drawn with your rotations from - * local coordanates -- that is, an object with no rotations is drawn pointing - * down the -Z axis and the Y axis of the object matches the local coordinate - * Y axis. - * - */ -XPLM_API void XPLMDrawObjects( - XPLMObjectRef inObject, - int inCount, - XPLMDrawInfo_t * inLocations, - int lighting, - int earth_relative); -#endif /* XPLM_DEPRECATED */ - -#if defined(XPLM200) -/* - * XPLMUnloadObject - * - * This routine marks an object as no longer being used by your plugin. - * Objects are reference counted: once no plugins are using an object, it is - * purged from memory. Make sure to call XPLMUnloadObject once for each - * successful call to XPLMLoadObject. - * - */ -XPLM_API void XPLMUnloadObject( - XPLMObjectRef inObject); -#endif /* XPLM200 */ - -#if defined(XPLM200) -/*************************************************************************** - * Library Access - ***************************************************************************/ -/* - * The library access routines allow you to locate scenery objects via the - * X-Plane library system. Right now library access is only provided for - * objects, allowing plugin-drawn objects to be extended using the library - * system. - * - */ - - -/* - * XPLMLibraryEnumerator_f - * - * An XPLMLibraryEnumerator_f is a callback you provide that is called once - * for each library element that is located. The returned paths will be - * relative to the X-System folder. - * - */ -typedef void (* XPLMLibraryEnumerator_f)( - const char * inFilePath, - void * inRef); - -/* - * XPLMLookupObjects - * - * This routine looks up a virtual path in the library system and returns all - * matching elements. You provide a callback - one virtual path may match many - * objects in the library. XPLMLookupObjects returns the number of objects - * found. - * - * The latitude and longitude parameters specify the location the object will - * be used. The library system allows for scenery packages to only provide - * objects to certain local locations. Only objects that are allowed at the - * latitude/longitude you provide will be returned. - * - */ -XPLM_API int XPLMLookupObjects( - const char * inPath, - float inLatitude, - float inLongitude, - XPLMLibraryEnumerator_f enumerator, - void * ref); - -#endif /* XPLM200 */ -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/CHeaders/XPLM/XPLMUtilities.h b/lib/SDK/CHeaders/XPLM/XPLMUtilities.h deleted file mode 100755 index bec319e..0000000 --- a/lib/SDK/CHeaders/XPLM/XPLMUtilities.h +++ /dev/null @@ -1,970 +0,0 @@ -#ifndef _XPLMUtilities_h_ -#define _XPLMUtilities_h_ - -/* - * Copyright 2005-2012 Sandy Barbour and Ben Supnik All rights reserved. See - * license.txt for usage. X-Plane SDK Version: 2.1.1 - * - */ - -/*************************************************************************** - * XPLMUtilities - ***************************************************************************/ - -#include "XPLMDefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * FILE UTILITIES - ***************************************************************************/ -/* - * The XPLMUtilities file APIs provide some basic file and path functions for - * use with X-Plane. - * - * Directory Separators - * -------------------- - * - * The XPLM has two modes it can work in: - * - * * X-Plane native paths: all paths are UTF8 strings, using the unix forward - * slash (/) as the directory separating character. In native path mode, - * you use the same path format for all three operating systems. - * - * * Legacy OS paths: the directroy separator is \ for Windows, : for OS X, - * and / for Linux; OS paths are encoded in MacRoman for OS X using legacy - * HFS conventions, use the application code page for multi-byte encoding - * on Unix using DOS path conventions, and use UTF-8 for Linux. - * - * While legacy OS paths are the default, we strongly encourage you to opt in - * to native paths using the XPLMEnableFeature API. - * - * * All OS X plugins should enable native paths all of the time; if you do - * not do this, you will have to convert all paths back from HFS to Unix - * (and deal with MacRoman) - code written using native paths and the C - * file APIs "just works" on OS X. - * - * * For Linux plugins, there is no difference between the two encodings. - * - * * Windows plugins will need to convert the UTF8 file paths to UTF16 for - * use with the "wide" APIs. While it might seem tempting to stick with - * legacy OS paths (and just use the "ANSI" Windows APIs), X-Plane is fully - * unicode-capable, and will often be installed in paths where the user's - * directories have no ACP encoding. - * - * Full and Relative Paths - * ----------------------- - * - * Some of these APIs use full paths, but others use paths relative to the - * user's X-Plane installation. This is documented on a per-API basis. - * - */ - - -#if defined(XPLM200) -/* - * XPLMDataFileType - * - * These enums define types of data files you can load or unload using the - * SDK. - * - */ -enum { - /* A situation (.sit) file, which starts off a flight in a given * - * configuration. */ - xplm_DataFile_Situation = 1, - - /* A situation movie (.smo) file, which replays a past flight. */ - xplm_DataFile_ReplayMovie = 2, - - -}; -typedef int XPLMDataFileType; -#endif /* XPLM200 */ - -/* - * XPLMGetSystemPath - * - * This function returns the full path to the X-System folder. Note that this - * is a directory path, so it ends in a trailing : or /. - * - * The buffer you pass should be at least 512 characters long. The path is - * returned using the current native or OS path conventions. - * - */ -XPLM_API void XPLMGetSystemPath( - char * outSystemPath); - -/* - * XPLMGetPrefsPath - * - * This routine returns a full path to a file that is within X-Plane's - * preferences directory. (You should remove the file name back to the last - * directory separator to get the preferences directory using - * XPLMExtractFileAndPath.) - * - * The buffer you pass should be at least 512 characters long. The path is - * returned using the current native or OS path conventions. - * - */ -XPLM_API void XPLMGetPrefsPath( - char * outPrefsPath); - -/* - * XPLMGetDirectorySeparator - * - * This routine returns a string with one char and a null terminator that is - * the directory separator for the current platform. This allows you to write - * code that concatinates directory paths without having to #ifdef for - * platform. The character returned will reflect the current file path mode. - * - */ -XPLM_API const char * XPLMGetDirectorySeparator(void); - -/* - * XPLMExtractFileAndPath - * - * Given a full path to a file, this routine separates the path from the file. - * If the path is a partial directory (e.g. ends in : or \) the trailing - * directory separator is removed. This routine works in-place; a pointer to - * the file part of the buffer is returned; the original buffer still starts - * with the path and is null terminated with no trailing separator. - * - */ -XPLM_API char * XPLMExtractFileAndPath( - char * inFullPath); - -/* - * XPLMGetDirectoryContents - * - * This routine returns a list of files in a directory (specified by a full - * path, no trailing : or \). The output is returned as a list of NULL - * terminated strings. An index array (if specified) is filled with pointers - * into the strings. The last file is indicated by a zero-length string (and - * NULL in the indices). This routine will return 1 if you had capacity for - * all files or 0 if you did not. You can also skip a given number of files. - * - * * inDirectoryPath - a null terminated C string containing the full path to - * the directory with no trailing directory char. - * - * * inFirstReturn - the zero-based index of the first file in the directory - * to return. (Usually zero to fetch all in one pass.) - * - * * outFileNames - a buffer to receive a series of sequential null - * terminated C-string file names. A zero-length C string will be appended - * to the very end. - * - * * inFileNameBufSize - the size of the file name buffer in bytes. - * - * * outIndices - a pointer to an array of character pointers that will - * become an index into the directory. The last file will be followed by a - * NULL value. Pass NULL if you do not want indexing information. - * - * * inIndexCount - the max size of the index in entries. - * - * * outTotalFiles - if not NULL, this is filled in with the number of files - * in the directory. - * - * * outReturnedFiles - if not NULL, the number of files returned by this - * iteration. - * - * Return value: 1 if all info could be returned, 0 if there was a buffer - * overrun. - * - * WARNING: Before X-Plane 7 this routine did not properly iterate through - * directories. If X-Plane - * 6 compatibility is needed, use your own code to iterate directories. - * - */ -XPLM_API int XPLMGetDirectoryContents( - const char * inDirectoryPath, - int inFirstReturn, - char * outFileNames, - int inFileNameBufSize, - char ** outIndices, /* Can be NULL */ - int inIndexCount, - int * outTotalFiles, /* Can be NULL */ - int * outReturnedFiles); /* Can be NULL */ - -#if defined(XPLM200) -/* - * XPLMLoadDataFile - * - * Loads a data file of a given type. Paths must be relative to the X-System - * folder. To clear the replay, pass a NULL file name (this is only valid with - * replay movies, not sit files). - * - */ -XPLM_API int XPLMLoadDataFile( - XPLMDataFileType inFileType, - const char * inFilePath); /* Can be NULL */ -#endif /* XPLM200 */ - -#if defined(XPLM200) -/* - * XPLMSaveDataFile - * - * Saves the current situation or replay; paths are relative to the X-System - * folder. - * - */ -XPLM_API int XPLMSaveDataFile( - XPLMDataFileType inFileType, - const char * inFilePath); -#endif /* XPLM200 */ - -/*************************************************************************** - * X-PLANE MISC - ***************************************************************************/ - -/* - * XPLMHostApplicationID - * - * While the plug-in SDK is only accessible to plugins running inside X-Plane, - * the original authors considered extending the API to other applications - * that shared basic infrastructure with X-Plane. These enumerations are - * hold-overs from that original roadmap; all values other than X-Plane are - * deprecated. Your plugin should never need this enumeration. - * - */ -enum { - xplm_Host_Unknown = 0, - - xplm_Host_XPlane = 1, - -#if defined(XPLM_DEPRECATED) - xplm_Host_PlaneMaker = 2, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - xplm_Host_WorldMaker = 3, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - xplm_Host_Briefer = 4, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - xplm_Host_PartMaker = 5, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - xplm_Host_YoungsMod = 6, - -#endif /* XPLM_DEPRECATED */ -#if defined(XPLM_DEPRECATED) - xplm_Host_XAuto = 7, - -#endif /* XPLM_DEPRECATED */ - -}; -typedef int XPLMHostApplicationID; - -/* - * XPLMLanguageCode - * - * These enums define what language the sim is running in. These enumerations - * do not imply that the sim can or does run in all of these languages; they - * simply provide a known encoding in the event that a given sim version is - * localized to a certain language. - * - */ -enum { - xplm_Language_Unknown = 0, - - xplm_Language_English = 1, - - xplm_Language_French = 2, - - xplm_Language_German = 3, - - xplm_Language_Italian = 4, - - xplm_Language_Spanish = 5, - - xplm_Language_Korean = 6, - -#if defined(XPLM200) - xplm_Language_Russian = 7, - -#endif /* XPLM200 */ -#if defined(XPLM200) - xplm_Language_Greek = 8, - -#endif /* XPLM200 */ -#if defined(XPLM200) - xplm_Language_Japanese = 9, - -#endif /* XPLM200 */ -#if defined(XPLM300) - xplm_Language_Chinese = 10, - -#endif /* XPLM300 */ - -}; -typedef int XPLMLanguageCode; - -#if defined(XPLM200) -/* - * XPLMError_f - * - * An XPLM error callback is a function that you provide to receive debugging - * information from the plugin SDK. See XPLMSetErrorCallback for more - * information. NOTE: for the sake of debugging, your error callback will be - * called even if your plugin is not enabled, allowing you to receive debug - * info in your XPluginStart and XPluginStop callbacks. To avoid causing logic - * errors in the management code, do not call any other plugin routines from - * your error callback - it is only meant for catching errors in the - * debugging. - * - */ -typedef void (* XPLMError_f)( - const char * inMessage); -#endif /* XPLM200 */ - -#if defined(XPLM_DEPRECATED) -/* - * XPLMInitialized - * - * Deprecated: This function returns 1 if X-Plane has properly initialized the - * plug-in system. If this routine returns 0, many XPLM functions will not - * work. - * - * NOTE: because plugins are always called from within the XPLM, there is no - * need to check for initialization; it will always return 1. This routine is - * deprecated - you do not need to check it before continuing within your - * plugin. - * - */ -XPLM_API int XPLMInitialized(void); -#endif /* XPLM_DEPRECATED */ - -/* - * XPLMGetVersions - * - * This routine returns the revision of both X-Plane and the XPLM DLL. All - * versions are three-digit decimal numbers (e.g. 606 for version 6.06 of - * X-Plane); the current revision of the XPLM is 200 (2.00). This routine also - * returns the host ID of the app running us. - * - * The most common use of this routine is to special-case around X-Plane - * version-specific behavior. - * - */ -XPLM_API void XPLMGetVersions( - int * outXPlaneVersion, - int * outXPLMVersion, - XPLMHostApplicationID * outHostID); - -/* - * XPLMGetLanguage - * - * This routine returns the langauge the sim is running in. - * - */ -XPLM_API XPLMLanguageCode XPLMGetLanguage(void); - -#if defined(XPLM200) -/* - * XPLMFindSymbol - * - * This routine will attempt to find the symbol passed in the inString - * parameter. If the symbol is found a pointer the function is returned, - * othewise the function will return NULL. - * - * You can use XPLMFindSymbol to utilize newer SDK API features without - * requiring newer versions of the SDK (and X-Plane) as your minimum X-Plane - * version as follows: - * - * * Define the XPLMnnn macro to the minimum required XPLM version you will - * ship with (e.g. XPLM210 for X-Plane 10 compatibility). - * - * * Use XPLMGetVersions and XPLMFindSymbol to detect that the host sim is - * new enough to use new functions and resolve function pointers. - * - * * Conditionally use the new functions if and only if XPLMFindSymbol only - * returns a non- NULL pointer. - * - * Warning: you should always check the XPLM API version as well as the - * results of XPLMFindSymbol to determine if funtionality is safe to use. - * - * To use functionality via XPLMFindSymbol you will need to copy your own - * definitions of the X-Plane API prototypes and cast the returned pointer to - * the correct type. - * - */ -XPLM_API void * XPLMFindSymbol( - const char * inString); -#endif /* XPLM200 */ - -#if defined(XPLM200) -/* - * XPLMSetErrorCallback - * - * XPLMSetErrorCallback installs an error-reporting callback for your plugin. - * Normally the plugin system performs minimum diagnostics to maximize - * performance. When you install an error callback, you will receive calls due - * to certain plugin errors, such as passing bad parameters or incorrect data. - * - * Important: the error callback determines *programming* errors, e.g. bad API - * parameters. Every error that is returned by the error callback represents a - * mistake in your plugin that you should fix. Error callbacks are not used to - * report expected run-time problems (e.g. disk I/O errors). - * - * The intention is for you to install the error callback during debug - * sections and put a break-point inside your callback. This will cause you to - * break into the debugger from within the SDK at the point in your plugin - * where you made an illegal call. - * - * Installing an error callback may activate error checking code that would - * not normally run, and this may adversely affect performance, so do not - * leave error callbacks installed in shipping plugins. Since the only useful - * response to an error is to change code, error callbacks are not useful "in - * the field". - * - */ -XPLM_API void XPLMSetErrorCallback( - XPLMError_f inCallback); -#endif /* XPLM200 */ - -/* - * XPLMDebugString - * - * This routine outputs a C-style string to the Log.txt file. The file is - * immediately flushed so you will not lose data. (This does cause a - * performance penalty.) - * - * Please do *not* leave routine diagnostic logging enabled in your shipping - * plugin. The X-Plane Log file is shared by X-Plane and every plugin in the - * system, and plugins that (when functioning normally) print verbose log - * output make it difficult for developers to find error conditions from other - * parts of the system. - * - */ -XPLM_API void XPLMDebugString( - const char * inString); - -/* - * XPLMSpeakString - * - * This function displays the string in a translucent overlay over the current - * display and also speaks the string if text-to-speech is enabled. The string - * is spoken asynchronously, this function returns immediately. This function - * may not speak or print depending on user preferences. - * - */ -XPLM_API void XPLMSpeakString( - const char * inString); - -/* - * XPLMGetVirtualKeyDescription - * - * Given a virtual key code (as defined in XPLMDefs.h) this routine returns a - * human-readable string describing the character. This routine is provided - * for showing users what keyboard mappings they have set up. The string may - * read 'unknown' or be a blank or NULL string if the virtual key is unknown. - * - */ -XPLM_API const char * XPLMGetVirtualKeyDescription( - char inVirtualKey); - -/* - * XPLMReloadScenery - * - * XPLMReloadScenery reloads the current set of scenery. You can use this - * function in two typical ways: simply call it to reload the scenery, picking - * up any new installed scenery, .env files, etc. from disk. Or, change the - * lat/ref and lon/ref data refs and then call this function to shift the - * scenery environment. This routine is equivalent to picking "reload - * scenery" from the developer menu. - * - */ -XPLM_API void XPLMReloadScenery(void); - -#if defined(XPLM200) -/*************************************************************************** - * X-PLANE COMMAND MANAGEMENT - ***************************************************************************/ -/* - * The command management APIs let plugins interact with the command-system in - * X-Plane, the abstraction behind keyboard presses and joystick buttons. This - * API lets you create new commands and modify the behavior (or get - * notification) of existing ones. - * - * X-Plane Command Phases - * ---------------------- - * - * X-Plane commands are not instantaneous; they operate over a duration. - * (Think of a joystick button press - you can press, hold down, and then - * release the joystick button; X-Plane commands model this entire process.) - * - * An X-Plane command consists of three phases: a beginning, continuous - * repetition, and an ending. The command may be repeated zero times in its - * duration, followed by one command ending. Command begin and end messges are - * balanced, but a command may be bound to more than one event source (e.g. a - * keyboard key and a joystick button), in which case you may receive a second - * begin during before any end). - * - * When you issue commands in the plugin system, you *must* balance every call - * to XPLMCommandBegin with a call to XPLMCommandEnd with the same command - * reference. - * - * Command Behavior Modification - * ----------------------------- - * - * You can register a callback to handle a command either before or after - * X-Plane does; if you receive the command before X-Plane you have the option - * to either let X-Plane handle the command or hide the command from X-Plane. - * This lets plugins both augment commands and replace them. - * - * If you register for an existing command, be sure that you are *consistent* - * in letting X-Plane handle or not handle the command; you are responsible - * for passing a *balanced* number of begin and end messages to X-Plane. (E.g. - * it is not legal to pass all the begin messages to X-Plane but hide all the - * end messages). - * - */ - - -/* - * XPLMCommandPhase - * - * The phases of a command. - * - */ -enum { - /* The command is being started. */ - xplm_CommandBegin = 0, - - /* The command is continuing to execute. */ - xplm_CommandContinue = 1, - - /* The command has ended. */ - xplm_CommandEnd = 2, - - -}; -typedef int XPLMCommandPhase; - -/* - * XPLMCommandRef - * - * A command ref is an opaque identifier for an X-Plane command. Command - * references stay the same for the life of your plugin but not between - * executions of X-Plane. Command refs are used to execute commands, create - * commands, and create callbacks for particular commands. - * - * Note that a command is not "owned" by a particular plugin. Since many - * plugins may participate in a command's execution, the command does not go - * away if the plugin that created it is unloaded. - * - */ -typedef void * XPLMCommandRef; - -/* - * XPLMCommandCallback_f - * - * A command callback is a function in your plugin that is called when a - * command is pressed. Your callback receives the command reference for the - * particular command, the phase of the command that is executing, and a - * reference pointer that you specify when registering the callback. - * - * Your command handler should return 1 to let processing of the command - * continue to other plugins and X-Plane, or 0 to halt processing, potentially - * bypassing X-Plane code. - * - */ -typedef int (* XPLMCommandCallback_f)( - XPLMCommandRef inCommand, - XPLMCommandPhase inPhase, - void * inRefcon); - -/* - * XPLMFindCommand - * - * XPLMFindCommand looks up a command by name, and returns its command - * reference or NULL if the command does not exist. - * - */ -XPLM_API XPLMCommandRef XPLMFindCommand( - const char * inName); - -/* - * XPLMCommandBegin - * - * XPLMCommandBegin starts the execution of a command, specified by its - * command reference. The command is "held down" until XPLMCommandEnd is - * called. You must balance each XPLMCommandBegin call with an XPLMCommandEnd - * call. - * - */ -XPLM_API void XPLMCommandBegin( - XPLMCommandRef inCommand); - -/* - * XPLMCommandEnd - * - * XPLMCommandEnd ends the execution of a given command that was started with - * XPLMCommandBegin. You must not issue XPLMCommandEnd for a command you did - * not begin. - * - */ -XPLM_API void XPLMCommandEnd( - XPLMCommandRef inCommand); - -/* - * XPLMCommandOnce - * - * This executes a given command momentarily, that is, the command begins and - * ends immediately. This is the equivalent of calling XPLMCommandBegin() and - * XPLMCommandEnd() back ot back. - * - */ -XPLM_API void XPLMCommandOnce( - XPLMCommandRef inCommand); - -/* - * XPLMCreateCommand - * - * XPLMCreateCommand creates a new command for a given string. If the command - * already exists, the existing command reference is returned. The description - * may appear in user interface contexts, such as the joystick configuration - * screen. - * - */ -XPLM_API XPLMCommandRef XPLMCreateCommand( - const char * inName, - const char * inDescription); - -/* - * XPLMRegisterCommandHandler - * - * XPLMRegisterCommandHandler registers a callback to be called when a command - * is executed. You provide a callback with a reference pointer. - * - * If inBefore is true, your command handler callback will be executed before - * X-Plane executes the command, and returning 0 from your callback will - * disable X-Plane's processing of the command. If inBefore is false, your - * callback will run after X-Plane. (You can register a single callback both - * before and after a command.) - * - */ -XPLM_API void XPLMRegisterCommandHandler( - XPLMCommandRef inComand, - XPLMCommandCallback_f inHandler, - int inBefore, - void * inRefcon); - -/* - * XPLMUnregisterCommandHandler - * - * XPLMUnregisterCommandHandler removes a command callback registered with - * XPLMRegisterCommandHandler. - * - */ -XPLM_API void XPLMUnregisterCommandHandler( - XPLMCommandRef inComand, - XPLMCommandCallback_f inHandler, - int inBefore, - void * inRefcon); - -#endif /* XPLM200 */ -#if defined(XPLM_DEPRECATED) -/*************************************************************************** - * X-PLANE USER INTERACTION - ***************************************************************************/ -/* - * WARNING: The legacy user interaction API is deprecated; while it was the - * only way to run commands in X-Plane 6,7 and 8, it is obsolete, and was - * replaced by the command system API in X-Plane 9. You should not use this - * API; replace any of the calls below with XPLMCommand invocations based on - * persistent command strings. The documentation that follows is for historic - * reference only. - * - * The legacy user interaction APIs let you simulate commands the user can do - * with a joystick, keyboard etc. Note that it is generally safer for future - * compatibility to use one of these commands than to manipulate the - * underlying sim data. - * - */ - - -/* - * XPLMCommandKeyID - * - * These enums represent all the keystrokes available within X-Plane. They can - * be sent to X-Plane directly. For example, you can reverse thrust using - * these enumerations. - * - */ -enum { - xplm_key_pause=0, - xplm_key_revthrust, - xplm_key_jettison, - xplm_key_brakesreg, - xplm_key_brakesmax, - xplm_key_gear, - xplm_key_timedn, - xplm_key_timeup, - xplm_key_fadec, - xplm_key_otto_dis, - xplm_key_otto_atr, - xplm_key_otto_asi, - xplm_key_otto_hdg, - xplm_key_otto_gps, - xplm_key_otto_lev, - xplm_key_otto_hnav, - xplm_key_otto_alt, - xplm_key_otto_vvi, - xplm_key_otto_vnav, - xplm_key_otto_nav1, - xplm_key_otto_nav2, - xplm_key_targ_dn, - xplm_key_targ_up, - xplm_key_hdgdn, - xplm_key_hdgup, - xplm_key_barodn, - xplm_key_baroup, - xplm_key_obs1dn, - xplm_key_obs1up, - xplm_key_obs2dn, - xplm_key_obs2up, - xplm_key_com1_1, - xplm_key_com1_2, - xplm_key_com1_3, - xplm_key_com1_4, - xplm_key_nav1_1, - xplm_key_nav1_2, - xplm_key_nav1_3, - xplm_key_nav1_4, - xplm_key_com2_1, - xplm_key_com2_2, - xplm_key_com2_3, - xplm_key_com2_4, - xplm_key_nav2_1, - xplm_key_nav2_2, - xplm_key_nav2_3, - xplm_key_nav2_4, - xplm_key_adf_1, - xplm_key_adf_2, - xplm_key_adf_3, - xplm_key_adf_4, - xplm_key_adf_5, - xplm_key_adf_6, - xplm_key_transpon_1, - xplm_key_transpon_2, - xplm_key_transpon_3, - xplm_key_transpon_4, - xplm_key_transpon_5, - xplm_key_transpon_6, - xplm_key_transpon_7, - xplm_key_transpon_8, - xplm_key_flapsup, - xplm_key_flapsdn, - xplm_key_cheatoff, - xplm_key_cheaton, - xplm_key_sbrkoff, - xplm_key_sbrkon, - xplm_key_ailtrimL, - xplm_key_ailtrimR, - xplm_key_rudtrimL, - xplm_key_rudtrimR, - xplm_key_elvtrimD, - xplm_key_elvtrimU, - xplm_key_forward, - xplm_key_down, - xplm_key_left, - xplm_key_right, - xplm_key_back, - xplm_key_tower, - xplm_key_runway, - xplm_key_chase, - xplm_key_free1, - xplm_key_free2, - xplm_key_spot, - xplm_key_fullscrn1, - xplm_key_fullscrn2, - xplm_key_tanspan, - xplm_key_smoke, - xplm_key_map, - xplm_key_zoomin, - xplm_key_zoomout, - xplm_key_cycledump, - xplm_key_replay, - xplm_key_tranID, - xplm_key_max -}; -typedef int XPLMCommandKeyID; - -/* - * XPLMCommandButtonID - * - * These are enumerations for all of the things you can do with a joystick - * button in X-Plane. They currently match the buttons menu in the equipment - * setup dialog, but these enums will be stable even if they change in - * X-Plane. - * - */ -enum { - xplm_joy_nothing=0, - xplm_joy_start_all, - xplm_joy_start_0, - xplm_joy_start_1, - xplm_joy_start_2, - xplm_joy_start_3, - xplm_joy_start_4, - xplm_joy_start_5, - xplm_joy_start_6, - xplm_joy_start_7, - xplm_joy_throt_up, - xplm_joy_throt_dn, - xplm_joy_prop_up, - xplm_joy_prop_dn, - xplm_joy_mixt_up, - xplm_joy_mixt_dn, - xplm_joy_carb_tog, - xplm_joy_carb_on, - xplm_joy_carb_off, - xplm_joy_trev, - xplm_joy_trm_up, - xplm_joy_trm_dn, - xplm_joy_rot_trm_up, - xplm_joy_rot_trm_dn, - xplm_joy_rud_lft, - xplm_joy_rud_cntr, - xplm_joy_rud_rgt, - xplm_joy_ail_lft, - xplm_joy_ail_cntr, - xplm_joy_ail_rgt, - xplm_joy_B_rud_lft, - xplm_joy_B_rud_rgt, - xplm_joy_look_up, - xplm_joy_look_dn, - xplm_joy_look_lft, - xplm_joy_look_rgt, - xplm_joy_glance_l, - xplm_joy_glance_r, - xplm_joy_v_fnh, - xplm_joy_v_fwh, - xplm_joy_v_tra, - xplm_joy_v_twr, - xplm_joy_v_run, - xplm_joy_v_cha, - xplm_joy_v_fr1, - xplm_joy_v_fr2, - xplm_joy_v_spo, - xplm_joy_flapsup, - xplm_joy_flapsdn, - xplm_joy_vctswpfwd, - xplm_joy_vctswpaft, - xplm_joy_gear_tog, - xplm_joy_gear_up, - xplm_joy_gear_down, - xplm_joy_lft_brake, - xplm_joy_rgt_brake, - xplm_joy_brakesREG, - xplm_joy_brakesMAX, - xplm_joy_speedbrake, - xplm_joy_ott_dis, - xplm_joy_ott_atr, - xplm_joy_ott_asi, - xplm_joy_ott_hdg, - xplm_joy_ott_alt, - xplm_joy_ott_vvi, - xplm_joy_tim_start, - xplm_joy_tim_reset, - xplm_joy_ecam_up, - xplm_joy_ecam_dn, - xplm_joy_fadec, - xplm_joy_yaw_damp, - xplm_joy_art_stab, - xplm_joy_chute, - xplm_joy_JATO, - xplm_joy_arrest, - xplm_joy_jettison, - xplm_joy_fuel_dump, - xplm_joy_puffsmoke, - xplm_joy_prerotate, - xplm_joy_UL_prerot, - xplm_joy_UL_collec, - xplm_joy_TOGA, - xplm_joy_shutdown, - xplm_joy_con_atc, - xplm_joy_fail_now, - xplm_joy_pause, - xplm_joy_rock_up, - xplm_joy_rock_dn, - xplm_joy_rock_lft, - xplm_joy_rock_rgt, - xplm_joy_rock_for, - xplm_joy_rock_aft, - xplm_joy_idle_hilo, - xplm_joy_lanlights, - xplm_joy_max -}; -typedef int XPLMCommandButtonID; - -/* - * XPLMSimulateKeyPress - * - * This function simulates a key being pressed for X-Plane. The keystroke goes - * directly to X-Plane; it is never sent to any plug-ins. However, since this - * is a raw key stroke it may be mapped by the keys file or enter text into a - * field. - * - * Deprecated: use XPLMCommandOnce - * - */ -XPLM_API void XPLMSimulateKeyPress( - int inKeyType, - int inKey); - -/* - * XPLMCommandKeyStroke - * - * This routine simulates a command-key stroke. However, the keys are done by - * function, not by actual letter, so this function works even if the user has - * remapped their keyboard. Examples of things you might do with this include - * pausing the simulator. - * - * Deprecated: use XPLMCommandOnce - * - */ -XPLM_API void XPLMCommandKeyStroke( - XPLMCommandKeyID inKey); - -/* - * XPLMCommandButtonPress - * - * This function simulates any of the actions that might be taken by pressing - * a joystick button. However, this lets you call the command directly rather - * than have to know which button is mapped where. Important: you must release - * each button you press. The APIs are separate so that you can 'hold down' a - * button for a fixed amount of time. - * - * Deprecated: use XPLMCommandBegin. - * - */ -XPLM_API void XPLMCommandButtonPress( - XPLMCommandButtonID inButton); - -/* - * XPLMCommandButtonRelease - * - * This function simulates any of the actions that might be taken by pressing - * a joystick button. See XPLMCommandButtonPress. - * - * Deprecated: use XPLMCommandEnd. - * - */ -XPLM_API void XPLMCommandButtonRelease( - XPLMCommandButtonID inButton); - -#endif /* XPLM_DEPRECATED */ -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/SDK/Libraries/Mac/XPLM.framework/XPLM b/lib/SDK/Libraries/Mac/XPLM.framework/XPLM deleted file mode 100755 index 99a7a721c0b977b5969e82367b7ef6299fccbdc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566176 zcmeEvdwf*I`S%905P`7a5)DcqO4LLU5+#}#7P2G@XJsP@qO_U@MG%xrgk6cnNH9b> z9=D=ZpAwq9c7vJqs1QVbU%fDSh~XPY_a6w_b|Mco`~x~k0mw_&$KG|dgAH$ z>!3gf1v)6uL4ghmbWos!0v#0Spg;!&Iw;UVfes3EP@sbX9Te!GKnDdnD9}NH4hnQo zpo0P(6zHHp2L(DP&_RI?3UpAQg905C=%7Fc1v)6uL4ghmbWos!0v#0Spg;!&Iw;UV zfes3EP@sbX9Te!GKnDdnD9}NH4hnQopo0P(6zHHp2L(DP&_RI?3UpB5|1kwV{Nbxp zIQSofga4K;czWY0jk8!PExlw({TS|Ku@o2I;GA-UjB5Q;j#~nv|IDxzaeR2G0RM`M zJ=04)%CEw$;Ux?*-wjpp7>;d8&Omu|u()`E$9vm?NK{+=60TQpR+{KB9F1w536FK= zpMqCBbNcL(>GNf{HGZoms@#7DE%?W<=~WS@;djThX~ok^r%f;M6nk#Htu21;$qHU+ zyvojSD|jk8@>^UyZQk4kEd*=}ul_a#ufoj1a4Y&nASn;vE%3~rHTMoPzAd~-(-geX zeN=*QI1HvOuEoXPxeI5_y}fwW+!^zbs4cve_b7O`oTDHx+!jU{HeK>v9TF557dUQk zM7;^~Tb>!$CQLr&0~VHl#l>@H7caPX&TaE%7ngYEpAlX-y#?@?Km14jC=!a9eoJR`6!udN%y>On50Ku^5hq$NuGR1#iwgHo`1V@eJ?WX{Xh9 z>I14B^2|I8N5eClCj#+wzH8kcRVKW0v!gS7cD}p)R?n>w@TcLI^030MznO&Lv+)V> zn=@zL+%Uwp{E}zFTcyCtWYPFVMay@^#kVbJkt(OR?-4`gSbkx+#MW}EEj;qEhNrmL z?YeH9v%nRWp?))Eo>{wac$f?F9Q z0KL36M&jK7HxHd7>HQdsz~Dgam@cj{#&RcahY_nfS^VEvEZq?|0T2I1A;9NT`1>Qx zbuza7pH+Y9WLe(Ms|ygvaytD`GOzR%`#*oTa8&Wc**%O@#3e9&w{9R%56flYFyrvY z3u|WLk$D+0D-WFclx5hYdlz`7&l%>Pb=&+~=ifVQOqdJ{hUL$jKYh$R?_4nEta)>z z2z2B0`3n%UV3?y#8h~XvQ}9H}k*yVTwsOXoOrJZ}-9CKv&V*ai3T`$+XNBu1DVaTM znnZrm^!fM9LX)>&NIMB-Ju;%p>%1D>1Lb)a%pW#;)@^*I4IVr+bLj2&!Yk7gqn3IP z#4z7Fy(0C{(PkE;wpcE~BirrM7)v9VDBTPRDRahh*@ z54Ue@g4;K~ujU(@r0KD#j?m)`fQ;f2R944LjvF159XCt@46VX`H;c9{{WsFM^ery^ zBTYZ%(oboIGvSymq3bbQFK0D8UFcZ@PbYf(@Wjxw(XBgIA9L6eEDY7T^}a zp}jiO<7bo;5EGmm>5WaLw@xz(S0f3EOmJ>NU{yF!j{xe>E9M;%H+@5Ji1Y-92CVm@ zB>n}gKVM4S1>P`$g&y zHflg%x!YnJxKsk3ARa-iD8dh0I5Sk##CXXjpnFn<{rlU2f~UAL$w)$+a_r-f!P|X3^A|NSS}{wG{fg)pBjk(a%a=2gW-N>=YC4q| zRV@vS<11<;&Qk$N^Vv6mrkcJ_^gEZt+R*H5jPabK8D&SrSmNNb{+$VOHh2;=V_bHo zzvAAMkY;n%20LZ?Tab^+mLO5zFJ8G!kyf(v4U=5@adNGGTzt+16(^1?xY?y|gy*~k zz4CqN2g|y+LYoRJ4|*>RUg_2kXcZe0w2A{qi0iw6<{6UOMA5f^zh;!+i-1>31 ze#)(XCPo5e{-)SVEaU>o19&G!B3HP*L6Yzv`|UZTk1@7?(S}UF?Be1)l7qcj(`!{N zZBP1HNwYsAQ?_QrzXWP)m76_7PH^nAv~XgS+7+vq@WTNH{( z5fn*C%7i3mW-}9HY5Ga6VsV>O=vaE;=1#IxcS6N7^%&5A1wSp4X4 zwR2GIJd5WFSxOWp*M%{$0TWhS795(CCrh5l651APH;dITRrH?Is@Rm)71vr#PY|gcAsML*d6*-hrZLL ze}~cmyiV+S48VQPx^i&Exh4a+^{)%`&kFQ!LX)OA^ngsa6X^=j^(61L86oP#n}h-) zbTYB|;`@KJWqY`^rp(OtDB}kQo`o_q!<4B(x-(PeSwaD2M5@AO z%ZdL9WlGLKnIV97M#_{($_!?K?NcVf#N`$fm%R3HX-%2Z_9*k0N6$)`(lBMJknYTs zd4NzrnXQ8qW&Uye43xP(%rlx+@lH9!g2gkkJ+`p{pdt<#8FjU^u+49oPtvD5i*27i zM}DI)8ew9T(hf!%G{4o*1*@S$I`oem`f;TS_*s?7AShIU>LS)?pXiCN!D+tu*BH#H z^Q5?ql59uC{V5^a(gPA5`!~a(J2j%%CJcub%}9QZX)E`7E;I6bl1# z4U8~QuVaA2N*9FPI!5{b%105} zO82ZI9B)H@J--LU+h|*_f-4iQ4HR6-6qb;+F9G<a+(s@5UkeBh+ncuL z+89q4moYvr*jd}w1a93-o#k@J#x0JIu}yKk24uut$cJjrupRavvn{qj71Q%EAz7TC0Z$$%<<^_U zxkyxC%-LC>-<1@|Pva)z_55*E{FJgVyPDnty{V>43}D&*^#1&dw2JRzJ-zXp;_WB( z^=c~Z!EWp0;8gQR&rcJJW!d@YT=vydQ2AW@Yj8BZsM^!Vr4Mvf1mfJf{Yk_%ZATVN zESA9UO5Y8YSF1hMS@T^Nqv=o~h22(}in?jlqzL{77V1B`YJcqH%Gu(!jsCaxwu%nf zw4AMOTYe*mfF`K(T&n5bWv-l!wuim}MXvRY_#EX}#Ek+5mA z?Mpr8!ju?13C=G_JyBR0y1yT2ghUwqesJj@inox}t$#1G>dD(~V(8-Sa5O!B2c638 zo;Xe4Ee;Jp0KGGFZ)UTwJuHbC1CjF-5W(c)1Gmrm2YB5!=LV3uliL^H4K+j%ZxYW{ z-W_-o>-HsAsNi0=&;F?Lp2QnWu`m8n1rJ~nb2XX?fC&wg@WjI^xI^=0U50J0cykPI zQo!7wso+Vs@ABR_BY+}HKQl+2Qv4#;oVuo<`;KC(P5RvXdTs+e4!ad-r4x`sIF=$_f6ryykecnv zy&*M^UGjX8+pp=P;|laUG5dKJ!UeCJKxd1~cOQ^h_jmQzO&ffkR{KL|t@=eX1`~{W z%{Lm8iX*m%`pOJ$)WbKTx0VyYG~3H(-yq%fM_)Pr?ix z#cL>jW`fJOKTbwh_<_b4gh36L;U-<)*V2z_>ClJnk3%Ehf3A2b8O$0NetQAq0;1tCnhfqtq@lRPv~Y1!jJJzsj7>431e~0d$ybo+A->fyFcfEK zxy9L@%R$u!V*yy?xVRVvl$SMFJOHsMF4Tu{SF+HG4M{E}_U=|Ae3TWVLG(7U`jv^* zXkbNbFzTVqPG0oLu_>5ww1ZG5?`RVtOj#g8+Ck~@2Tw<-3UOyeX)zOkP#>JH2=(gM z(I~|#lrR@)2c_5uN|;Qvk5Z`ebd=(M4y8lLM3k~kl=_<}O`4Fo7i3EC4l|0=YEO0| zkEEvW$oarl_^~$aU9GmUlh%1`iZ*SBR{L2eFps8h5{CgqT9v{Ez-W_P62aLjmw>Yz z`iIb^Tza!h|1sa!e^~8-PHc?a;U?YD#WFYVWQyD1`fwlf)R@PqmNjE7d+G zG2;F!VtfW5XC+45|Ckv60;sbQV_w= z1!s^g`bV*a$r6ek8j&L^E`4S3kJ)g<+L#OckM_i35v$*J|YHRJm1f}Hs&-mZbsQWw^YyD`2sd*U_ysAgORulKuP zGLpgK*A3R+idv}OnNZE(+=#du%#>|8;Qi) zO13L!zh|`DH#6JiTbSg`S(xBW*3yr8xK)Ol)efGt8+>ZD#du z2HaVM3k@y!Jm?x1J?a7D5vIN$UOc!;d;zskGZsK?IWG3V-<+Q!XBdkzL}4QNWxrJN z9q>yFsbm`3aY3o#ILxI$iM^g{fJmYKt>#+0j!1+X@b7M*j^+|IwPA~Z;V)MO$2Rkc3B0T-)-Cz7wm$$qifsO;dubd4R+D= z543GTSI$1r#bq14i(H#(GUVa}%o9QZ0?>?mWMGrH05t#`_Q~9gOt!~s-8sjks%*=z ztrY|1^u{cEeF9JucR*R9N&rUTDKyQrA~VO_?275)TG?<`xU?bN8^5ax)x!BV8H&s#5wWU(+j?e)ZFZV!%x zo!sr41I6+%LC7Eex>Dj|BQE8xUS+7J#47g+uum?dz5BrS>|B&HD| zfQcsuFt;%et-3L;u<|RwHl#3E>sTgCLF$Q#Os+8tR4MC%#@wLn)uMUK6mLFJ1R zEFN1_*XfOdP@u}w6w8pxj@5^7Z6|@^P?ej>DS@#`5|}I?JjZVV-|bJ%qneSBHZz^TD($Rg~&#H2cpzJ>(0`Fol^B}EKd zNEOSO=G3PTaq49mg}OHzr9Otj#S|n~W{aFDDc;@%Ia7ytdlcl9W_Y`}b4s#3SD{UV z`;dAXQo}GT?m`B0-OxUs5S~YbIjXlT9cJzg?r-4}arZBzsOoCuCsg|Hy#V0O<2r#a zD+Nx?YS2T>KoY#BAqql2+`(1-v4$YmYDLnOz&4Oi@dBPDpYazg7mJD}Y|4-0TgeDm z-9m?!lJ~$BIIc^ckupVmjw+)QDqI#5m)|K|o`40vhNGL*;v9J|p%dFu*r-iGdB|)opx)SCuRQ4E*F*U1zx_A-=pkSK@`t3r$cV>RY zT3n&E-w4)lBkUUsKv1kx0mQMEYy>Eq5h?m(Csq|<$T8g*7F(D&&QmhwCz7x{4 z+(`*u2#yKa@FjVWovERp`|N#?o#Kl8hhQwB{T2RTXDs8vj3>t*4j~Qkur+2j2lqs^ z`8PL4wYlWK6fqlqhm%M97^MA$PXtf+%wT8QD#Fs`(xziCL4uYuWV0_8_lqlrrt+ z`Q)>LR0y^EQil{ugObm_s{oZAhqSEpd9pWAm<^G_EJN~B@E{6#1?jLjAZ|y}urPa? zd7nXq-Vo8HAjUqA5LLW*Lt8GoUJ2k|QUFUSR)r)#%SGM(H&X1Q)?73&8W+h$I}|Qk zA!`&D^;Nk1EEiom9Q0}<#ag$?3ot^VO|FDf0|nY5KAI#u;T`!P*(Xwd9VEqvoJMge zxk&L5NJ{1z00KMKn3C&K=1-H7>oon<WR|HH`0OzX`Fmh|s=+Q5 zi%62lTPG4D$QL6IBR?(Flpvu-De}T>xm79{=4ksqOk4uuO+UuDqtE^YV6y+io>OxNLC*r{_2ocC#Ky7z z2MY9(6n#o6OsQ!F`qUv@nb5~(Xw^t!A<9r>hdTmeM=%VtZymyUwlrq~c2bSipo!6) z;tGtN$poVJTndu0B}kcql%+typGWC%O7zBi_i1b1;W1HZBu|q+|67e@y2+;IB*)%a z)p-ZZHZ>Kjvv-1pt0>TnyH+e3j-lG$rh`gTshsB6KLMpcu&0>WVCHOOE`$zT<}^ma zdRx(WxZ;H7ou_E%?}F6&28S`GubvO9^BC}KejZ%#Ouhyetd~Cl?gY3~;DQp z=Fb!dXLHr11mQe{OC1%VDc*j8{Nbd#!?@91@k8u_!TO}^U^+x+39Qod#>8?VD5a%& zkZ*V(U$#zglrbsWVcetX3r1ks!9NP^YjicnkpV-?s{m9%m|-jN&*qG7hHWucv9OMb z*Y$Xf#_EGioLf!jP$%`!@a7mPxV0sRmH{`VFK+~mK&rc7e5s-KB;v;t#v7#&L4Yal zVM@rcJ2-94wWfd%yj?Rx;yK3WCMPl69U6Rhc=(6nH3c$>AZ63lTt{VUIQK62tY42r zf#}i1ca_3-8l!+O^cM>Z>qO4n9f?&$)uMSwBGz`td!PYy;xW^PLEgB4Mu1}|bRZKn z$^;mzunQ;5lh`b&K$Iw^SOT+6&8MAE(?LKB+7XtC9+Q>bfcbPDNtd(1w)83114S);|1=r$asvW(2_ znVTJNlSUydogmLs%%dlN$h!Ni4R&V5e_kF-?VY(fGenZ**`C0HO2Nm$*vwGoUJwbn z+iv)AOGx|0%FciR%ffxTO;cQ0I*GWUD61VU_t|0XX}NnYH?`a-$&^;e$?_JM@~W{@ zh6FXN{jX3s>rT|j?xP{lmvs>a!M<%uK6bCgrqVFj#mFB5K&aH%OjUHQv)*e1siSQhVtc1H z#y!Yv2wdkHX`+S9{f?c=uy!(mD9Y#{2`CfCy2g<4{tk5v{13)U!W^31QcRnV&)!p| z+y~2#qDnbZVtWL-&Sl&;P@oSroNM$ku?1KRE6`_P|C#moxeDQM{}1-Tj)D}YJ|h*o z3(}ArbB-avX>P_@D)xO$I~6O`H)7@0Y;skxbQ6fG*e28n6&pr$lUcEC*M=)L3cKxC zu_k)@iG{!kT(pXqOrj$xH<7YwaxG)P5L0$vf}jb+Ip zE!?7W%#yFd>i1;;Ok1&Rz9Xth2gnGcJPp|pFL%!#ZBh8bzG!=|YzVXDcU4Uez|d23 zJxi{Plza@k)mUeiygK{LC1Ufoov#YT6ROnu1Z43r%Y0-}_%(7@6-aUm@yoS73=F)zomeu6 zm%C>vs&1^R*vl>HV81^N#WkVHQ{jDCNhUvzaCeE{&-q;^~7M?EA`Dp-x6IiRY+ zR9CnSC&*`r+paNT7A-JwGgqndvb^l}CI{VdfaMtNKqG9t!H&% zkuz9jzn$4@nY|0LXYN(%(fnq`ZLwGqDuqHB&8?9c+)rp=Fxf?f@F5{=EC_S!72*7D zy`)rTo-s7MdEPd##jvZ)*x?z#E(LHKY*#hBYgR0X0Q~oNA($b-_>ZA>wkK+_k)vg@ zKB<*{`+|aE5DGW?h|3A3MZbLtpxBcpq9=(@^Hr~9C-QP1-~B3gA#?X;?j1-WnU|{U zAn5qvj(-A-iwrBTL=;rnZq#(zsUnk%+i^>{~^In?Qt$QfM3fP&+59 zVk+vq!?D2j=8<3)>iGH#$*_MZzhI z^McWB?MD3+2VMk6*^Oo*$rT?nXYD=zCXriMsKsin zCg8sZQv>dp?tp72^@KyV_TMv6L1^D{Hh|gT2F%#51&J|GosYEG=w$&33UU^dc+;`o z1v`k6zkfq^#YIwF$8+%uQYy5ZVplV620!fe)`5a96rg&2SY2rP5y~{1R?%QEAVnp-q##KP9l>ICb7#uNOk_=M|mPeH*bpx0iS>^BY zh?;dEDnxGWku#-4P6VGg3f?iSHZwkh@q>AI3ENE$p;9zZUkDNzxenthBmTfJ00cZR zk6(C6y6|*H@+(vlE@5HO5I~b_Sbd-UIFJA?fpd^mj$gBg3#LiuN+KqJSyyHtiJU)W z2YVvCEE3L;gm2E=uIR|Ms}^w_*@$1Lzo!>MfyY8pvqS$8g|1Wtn8-p`#DW0dj-oCe zim_GxmT3FzFQF=oAcdgQ1~zwegs3B|EkE202|VB8sAUDp0|xvMZu6v5%8PD+mxF3B{A-HpZ4_?o~A^ z(7zAW2dxS|4@&F+5KyGEHxUMaZph5Pfc3}A)%mlqq>G zNkdK+2=D;_gpp(unvm)(VoDH$({=N4W$*fj;^^;Sd8*k<1XrL0w{LpAG?t3*Ku1VYN5zO# zi*4C%giykFu+)k*2b8292jt5a#aX=9VCKrX>J>(QMy_+GryJIWE~(%~z!Wm8x2Lfv z4HL~}cgh({4}`=UzoOqe&E%$P!2TU!9|G)(vid8$vt<5hh~Lck-1fa8}YUl^I_;q?QKB99Lnqlfi6~h z596nmmqT*X$1*m`Yh&yN85`y8%h;D?Y?QYjV^_%7h*zto`JRObom%z4us=t8dywhZ z^q#?A2fCy&Ns;MJ4RnE##S$zu-3eOt)sf^~f{s9!EBJb->1GDHOlNq2>0TJ-il`qp8N1D#q$WBC-6Lr=S4jK#PbfG4R}7lvjfjwJly>g7Up3An~lT85UrB= zx1p<{cb@1B=I=_$`t&tq{xZLuHHs6Es19S4+Q%$~4VGG$VM=VNDBFm0uqNXi6=M*k zZ!pUIrc9~`U16*I2(_-j&PLnP58%^_c5<`I<(*^?I++gU^Q-Ae#2AHMx0*c(r!&og z_nW3ABpr?n45IK9U|TO35-2-~vK)cF%uy1-`@ZZ88>NK*QvBg&O8C_{#^}_)#oVq$ ze0hZJ;;bsry{iJwm)Iy64k+o>A-*bc_Z#T!SRnx(+*WcwKs4PA5~A2^iEwwEqA-ef z5|uuznI|4q&TPgIBMM|?w?H*3IH^t*Ww*#5^WbllNI(JDyCh}kYB2!tDMRl>2cZnT z4$arLwO|+HB*mfs1SHDRfJDK5DR*p3pI`-GEMLQ#pi(=f6k1S_bJq~>oPwN18Qwb_ z6{jL{Cjoqkp=gq^AWh2i`>`8CZamEfb<)IUiG;HnfcydHMt}r$CS@1shcSx}O@ieP zdSqF(D103>x)2og?v!AD0WeB@*(w)-R>3Zj1+=Y~0^JLNZh_nq6m7p#B&Zglf3^^$ zPQ()y2=a@s=>~)y$3MaZ3C~4du&VZlQK{xrvh0`Wt~9MfPovea7aEE~?hq(FjbP=2 zm^g8{Bn@rnFh)9ztBv?3ENRz(5wRH4AQtgxj2tfHW*S+Z(!SIg>V2XNDJyajocK0|~bbl4-0*%iSoNBt)1-isDJi&BF2Do|o~g!4tr<9nYtD z1fFAfPT@HR9i=axfp{*%lZ7V_&p13c;-S2sjb|aA#dsdV^C+Gbc>aLruXtX?^A?`< zcmjAn#IqaEemq~|iF6#UW@7TBj*g!auR^FxS?;J9Wgbx}9a>TL3D~qiKQ2YO$Uqfw zP7-~2J(?L(91AGj@D}Pzq6{CzxvhfzVYRZQ<3z7hU?Z5Evw5pUE>&}%{i{LX^w>{L z`Bec(lwYz4?0l?~@@t0dN7de6Ik}V|JCnBu{N6&p2-k+i@E$XO!xUuDS6&(FE z4O`+VKmv8rux;9#i=wVp*mR9x^EV_QHeHB~G_-sdk_aC>32YuDHg_V49G1J&9B8VC za;!bf-Pk!;!SQ|$*n0sK)p(H^<;Yx!j1nvs#X(fqQul=OH*G>MSRE65HG;T#6-pX! zGEwKiBg5VY3Zsbxe3Te{3zLUrVJGhG=!emzAWnFDNp6g8H5gHCl?TCP1^OHc+8ZxK z1Al-9rr^dp&wCK?b+&cRja)Xet%Kvo30-RPj*7A&7SELq!^_PIV$vjYsO*QWxEV&- z8VrfXWWOUcIfZMHx1x_Q*>y-(Xw2dInDK(*Z_9pY3IXLvQiK;+bC9*+vJS>hP#^l+}0JnpnrvjWL0}d{3ltXtiYUpNN`Ds7efKyb`DdGZ7!q9_MEd9T6%&9HxjQaHT?5x&E-h11L*oSB7gB6R0SiF}*v0!0+%DNeesomiL~m9p%<7?4>@N)j=$8RnRm=W#+@GyJ;6|9Zu=lYY|rhV(+!9>akjE8 zpJLzOZm3+!KrveNs@G0{K?^Vrib=ze(`Qd4ijU(Y3Mq7(+30`_A!SU4I{dvT_)+e; z9tr)lQ2&|@{pAFc*9O8GIh7f4UVNNsk3gbucxSoL?R+o?KMBXOEUpUhQO zIgOa2dj4z2QUBSp{zH)+^=Da+<2VYd!G%>$Er7JXuR#BgTmQFko|M%efn65TEc2i7 zti0dixd?kWW-?d5LgP9v+siCQ;m!iXSs$uL{b@`RpCEmqaTWHHcvqo3?gSGvP@Yt8 zAj8|#y^`<85Fg+n{(#JouMOea`-KlNto_FaRPEPdd~MtC*|1M(xL?VoqxvvVu_r8m zWP;>-tr_*-C+m+X<$7p(7V)(NwLxyN&dbmOd3lJnh-4zLxI71|Ze_KOWn)9EZ$@y0Tc1-6F2He{1Xso9N60;k zQ5-fQAzQtx;$PS+KgaJjc&328o>oupsBK0f+@o_faK^f?QMOuSASUVr`ISW4;L*%{ z&8^=x0ad(>d#YefzY4gijV!I^H>BqqpYc`nN%WwM*)Mds;T@T#<^2{L692b5lP*Oj zwnum_(DMfX@nz+F2f807-S-Y=1drqF7yXGTI0*Z-5#h5}U4X{FnUPUu)@UOq=2uLz zN!BpDwdG{1tu41O0mgoa_+}4Q3%El>x!+f*a44&Irdt=6;}0nqKTzzk$B8@z<7aLB3)%Qlt-zI5 z?ykEXkWlMc#{jS!1~<_i01^LrKh$j~bXu?%S4PjJ#?s3X+6uwvsQ5Z&z7-MPqe%G< zQ))70L(AG&SSy`Sh?7S8hv>T4Iipr~JE5G1W>!2u*YPdQhIFlfQU@Hrz&0St0hh~P2F#3Qa?St+DNNtyz9y3!4kt0|D4O#&JE!TLk|F?K-PxOfDp3bSetlmK0$ z#QO^f9UPfZs@n6giAjAlpIxVj^IKG4pw#mELD~+1A%8u9hF78dXzt*70M5m?zeK$t zADF|@@6aB7_^P!nb`uVuv=XX7n~h(EeMsVttqSKs5@-7(h=aPD=2a);_KD4y<(S~V zM4s8qvz~ci&!qpW?XB|P-ZsB|XRG`L%;SW$4Ebl$|M@|c|9(||9Eb(dH5`$o8>66= zc&A{y-5*gix#}|DV`Rxq{vE^Ie)kAG{EN0)=U-})m*iRqFkw2bLR!deO4gl(qpSi? z1D%ht0ZBYfbin`g4~440<}^vO4RIh%N`y4!7)zr_^BUf_p?n4)gpcmX7PxVeItzF6 zr{wt!9PrWMfLzu;X|^{K|4auAF$D?Cvv6bKrQY$zC(-9tz`8dc2G_oYSm>blG2fZb z!eORVRxf_Im_o_6l$Hzel?-@r6@jzfZKR-&*_H-@i>m?`FIYSEDsKBfoDZtkd?(F)ZMu)6GaPextzKcqA7~deAG}IVn&_efAZEs_(1$ln@sq znYb;ImV4Ozp7Y%~Qxjy`KbdLwG3_KIbL+xwWEAFn;W@|U8ZY#N&A`4Z=vOd-V_u_!AFH1*h=&;YoetYpU zRwIxq<#-o4QwB6xw!W?rg!UfZxQ(*x6H4Kj8Eidw%g}1iJ z^vR)bK+7u>_;z?Jm#Mew0xJ!X)fwvwyBzeojYWx#;T>i<6)VT+{x&}M{f**hi2#D_5>j__8Q z44jp>ZifB^xpe^?#ap)`&slhDtxTUB{0|ysfCAqRZ(Yh%VcxPKnK*huSjM&Gtt-v6 zlD7^ZS-ZUT50(GtcF752b;(1_OVLiAe~Fn-u7Fcxy7TIZbX|$}-yHtxNFY zth~iJ_6{)E1yZ%^iNoSbCBi{}SQ*q@S<4wHcPdJ~=!`oRoAWc&4Ig>pu5F}sSY0bZ zD9R>4-a0eqt@)pF-l(>m7oK6zHF*~sl|%2#D?hyFYuki2ZI2e(gw2Ty`$I*fLfG^g zF-0`*Bg^>}dc&rBxNyrG3N*ZOY>FMAHbE1jew4Rb8rGp)7cjD$yF_0EQq=U*hvtsU zuu6ypu$kCThKt6kFzFXfc(3l-SjJ1=c>geOF$bZz=loslt-^*lSieOL62g+U(q(wT z5#CimNZfc1G8;JNRfxVZc{#6%OVD(8Do{2-;F^vW5DN(+$GOs0`HF?eI+tm=&gHhs zS{W)@1r}P(i~Q0*aaH^X)8G4uhwt2l@lMM@-0xajuxx55cwr%KRe_D~iz7tg8HE-M zd|P4Q;}w?E>)bgfJ+_CtFN@P)5eoS+1@L~e2?Z(xUzHe-JW&R|i3DMkt>U@tb08d6 zi#*0uY@8XrX#uxE3c|>`QabUY;M9x;hGGCx2QS0ysk=(hTP3)R3G$iXr>#hEjx@9W z9$p*vIx53pZxmZEw)1t@U?*jIZH35Nctv428E#uv;-1J-H2md15q-AJk&4hc@1RL6 zHurwt0$eVLTQN5i!ZaAh?t8Ba1Sl695rKJJ3W_dY2iqGqL^BDZaKn$B^{zsgS0DoR zwjUMjT;~xSK9|O{QW(?3tw=)VBMz92dK<)?7O)NLdJ`;TqQPDt25T-&siSbF^)f5& zOJs4IS;lhmox^~>e;w>U*et5vc!!Au84Uxyz2OVIuszRG_QEg;GIe6WXRqUn=0DP) zZ3+wGTGaI6zamCOG_^zDAsB9Nrg#G((g3zkLU z+~xaKA}Yo$8&45c!1xW)BMOZ8`RBl8u^GKkMi;FnM}^-_lkafW$(U2m+jcL*4MlTS z(lS07Z+JYP=581K1?i3V-J-2@#caYQM~S#Y)S2_6CnevuZp28jXba4!8{ogsZgGVI z;x2@7H~y!%4aZkhO;il;YB8!4&?4``crzZjG&`%+<*jw%=m+u@(aIvqTL7Ta52Ti( zrUMXz8zfiTD&GLvAXs3YKMsgh;wwO*-yx$XfJx4AzaTW@$Jz%)d$95DLZ*qCl$ zm#gm$?ko_~WD%t!ZEsZ`Lil0}W)XHv9xm3+2T109l=K3=+y?vyl-yid3fUdQi?_;_ ziBW(YOcEYA{E~&e;vjMP0$YPWHp`SB45$<5B1nQZ!lg}!J7dS9M8@5KIPA42J46c- z^nJ4|cK>B!2gF>Y`$v)O9mJEVe*ssG9pEw9;llfni{o(JVuD9;NVAyF47?~$$DL8X zZn-AYHF%&_d$M!XRg$(>cbL~?E-Z5S#-oO3z9AEh46fWSzK$iq7Qt}REaF%arD?^O zgd~`8#ALqYvPYhkIB>gww8-+^3!5crBvw7-N)FN`Asxl{eR#?4F!i}8J1B272!A=@ zMOmr;>dOhsWPunv&+z4hSb#kJ%L%c_B}Li<)c6Q$jO`sKh+X7@8zn^cndyp}zKHmC znZAgQ39*P~*vadyezLvUbrpstXT4sy#oK2@%t9)cmkdF$Z1VPK*4*Wkxia4P3Rd5Xb^w@VQHR>gSxFmbRKz@|sQ z5*C~7rvM6qa4(VzVf&#=U`WPr9*)0834QdqdU3!^+h5+?f!!fr8z3qWDz!(~i%U2i^EX0d>;TL~W zFGkze^+k4regkA4eBA6GQ?Me~^*)k&8OoIN9^P%@#E#`=Je3urpsRm*}cIX&Dpzt5=c-UzH z?(ri!%};|6jk(6tJBX`_u`|MxgaQ)Ev#;^m!r8zxb(@f}^ouDCRdV>M91LWH@ZHiBVX+;yFA#MSJT&!S|v zj*GnH5`*l2>~2P`sn{%v6L-iY$AuMcls*cmrC7bg?VZQPwRnYVfZ})pD5e2E?1IMb zJ9gH+@0q$}*i@c@w5HOKE|JNiVHT$Hd!=o7zqnii+e9|$4=;f{Yyt@n{6k<^5!eCruD}!c-oOya_Fl2O^PES|Ycq$fD5HsV2ZRkz_MllKnLjS<({u zcqFp4C9*6WSzZp_X^Ed6iC@+#zAzHMyj6TwBz|R7eB1lk=WO7YtR!tuySx4RmUogX z#he~;5`H0Aas@Tu!PaF`5sv?(48=cA2cHSxeznD)z>nekO2@u{Fm-j0 zp41hZnrcm%bXxnohBs|4kmOk`bddE)q|geym&03r_LO~cs@;DJpUF` zU?-6LgDl?Xsy&5^=W);c=xqus+fmi;|i{s&jpfh z{qhmSRkzydgm0U_AHdapIM|NSa?lC;)R0Q_##=GCb3~fUdoz*`{Qv-l^(#93_?0{7 zN_pQbE`MwA9u5AAk(li9GPqiPfvA@|=O{L%>U|{rDrym5hf@iL^+gi`*U49KTZ93z ze18J&RYAQu1~jfmWNvZ=(h)%Nui=S^Dyc->fDL=eHzOL~3b=(1ru3J|eY+PsCB)7J zIVEvkT+i7f6{0X9^cboHzTN<#zu((G;YPvE}yz~(?>LdL1A`TdH;DRunO~$Ds@4E*pD=rlUCt72;w^5 z@J4z0E%sj#NmRp6!yYgWiM~i^plbNYo#ca@k8PDn=o?VhR`W8PL<~ye3FtJcarSu+ z^9@xiY%!GcN3m@!%BpDnX%8P}rgtGeXcZ3tXIu9c`v@{CLrt|P9{9PrFMg)+#a&U? zibf8$t33i&%W|Xl2s|1jy%Njm0HNVXK;;YGLGY64A6sL}x3K1O1?)!Rw}?fTnZkUh zX+BEC-hf(QE5$G1@DFl%G-G`B4|(;4FEREmd>OCl?*!lKFG3I;Jm;w^XfcX1DDT97 z06`j!8b$Uoiel?e5KEBcU&BF{+z)3)z`7M0*)_1EROI%yRhFalC5vKLL2!5%ibFR@ zT&~zfCoxkx@mEP_Z6l;RCd<26IUEx~q?o-NrC=h0RdH;@zT7Kz(2KO8s6qkNhE z%I&r%{Jy@H(7Q!VBQ}QNWMc1)g7_hJ*(jg?BjuA^ibmmwRZ!R2O>{tXXQMjfQW3J* z9-7e!vHCISF~0bbptv?Ic8L~K7iz>k6O~)Ay+u5U;RI|d1DT;F9wrlmeiI5c4Q5u~ z+Il3ygyc^bWAezsYTb0u4&fwT`-1>|@l zlIBi{?H(}@iNaM~iMO($2Kr8TDq$KJX#O;>_;br<-!BkhkaL04EqjG3;S-lJ?z^BZc$JwA%5vY zGu(*|q*YWWbp{==TT1D?h@Z%KTpELTiqOuOEVa>xDdN$l>Vtt&owFu>&P<>HH&P`J z1PE~*K8gV?4#)BgYx6<%8i%xPl?`k-NK$}^QWw_~53wBQryP>4ST@!!0^+yHEDB#6 z%$ie=jK1e6YNQC~^#V@45wd^Jn|Q%8hP#1W!fS`Q#_z3K56Lzx> z+~0cxKd2NLsS7JAM@wZtGy& zhhcU(?L!lZAn(&ZCB}xmUx)$l!hClwmKtK3-;MEfbKxrjF5^aic3|6o&|b8s@notN z`T$ko9y^c$R~O(nY{=%vbC-#3fE4vnxs%Kz&C&a`TpTT`^Z+esB%TJ|msMiEYO!4= zY`xm1ZwTfDt?1P9SW1vb{970H95O`}_8Y>W0lI5z*!M6Vjnh}U0deBNmLXUk4-4Cw z^MU+-`GwvTz@&ZbOm^mH@&0r>^Rxd@{HK%vxfmO{=M0O1FXJ^BMI%%B%9e42{ELbj zrJ}0D2t`NmlXn@Ir%KGZ9DMoal zVuB1VQ^A$OAqy<4SBJT~#dH0q;zY<>L{Ma(o-#q!Kfuir`kvR6M`idJwhxs76F`;W zQ<)&k7tZjvRvA{w49(7Zg+Qb5)8BUP{LVwoYVOuUdw~y%}!K-ajS)| zB@Xq#EFWLWzL#;~F9Jq@PeUwOA_nf+?t7B+P&vz6a%d$xBsXRkp+)wK8jKi95L7`B ztj0^W+2#)v;4O%NAgH49+D(qYMS8R#Sc$Yl-e+GtD*U*B0=QP8)mEV`{h~iIw3RVD ze3I*|vMv1xeGWZ;ED93mR zLGg`gnc2Vqjc?h+Vz>lug>|&q@N5I7 zAYY0MBy6rE`C>3@HP*rq77`c8ND?!~q^*26h3`VIfHoEHVQnnv&YiQ$R#^!h0`1|a zB=jU=M!b)7sMrw82stJ8ho{6SdcRl)0O&kb;%cAS%#@WY#a|e|WFz@8YM@3+zp&#~ z&?>x_q3O88AXtn&2XMv*dj`S08-m06bH4PSR+;ONxw%qSrll4+ER3U+Ip3}mmokQE zRXx%QEgR#3_RBBR4T#543C?{9sb8Vf$YPW8&Lu0cAj;=ZI3i)VZo z)7vq3#j8K!)g}cYCUiqm31+juK@?VvpIq9H#Tm|nMxoHHb%@pDZzLj>J;70#%}w*+ zg!4A>YXLz^811K-Ix!8YN&K{zT1FUk&&iTQJX!&JX{KMd&Ou@gmYlEv)3F679i2e0 zOhE~@^vVP{ns043)!trXC*aA$lYu7%PlByiR~!Kih4e?OfUvFCL#yDx0^t0Va95Bu z^+)~cRUKdHE2^dQ5O~I-KlFrrHFhdsmEgHo)5l_toAq0)4~geqB&f9$*js#A%NX^r ziYix82BQ|rsLGW@kVa?=?%b1&oS04$7+6<-e5S1M1Z)`7Qa0tKVUNJt45SyiR+a#P zi}j*m5>D0xz?4kgM~3azWHGe9rlNF&I#^h4%WiFg0ba8?t5nbG1g6?H&Hp-*2Al^Ce`HQyV| z1}R&Mn5ex=Pcei397Pl4Z8_xaGTTzzf(mhe@pFIzZE&V6k4H^UiSbDOFr*NUPL>~# zLkGv_FGLY*&b%Bw7*-S)LQ%XaJSae2KP+}3 z5h^2x7+=<~S~EJDFNPiiNHhM5Q7wuN>g6H+(*z07Bwh4L|HsmPAKFWD4FNaR8d zU?(=#QnrScCtzBFveu!NoaEk#iRx*h>wds%u4L7f#HRcgvk-~eqvlKZ%KaPl;zmSa zY)X=ZtNchZ8NN^oQ8wWc)x4PT;Dg8L9cuK5Bz-vq zJDLKg!qEmGzVG6m8;LdzC87>prr_Z@I1cl9jQ2{m1{`1vZ{I|qXn>7z7&Dlr^5sRExs z8KNtK&;U%8(j5KqDP(Lb+lJH1$Hk$)0$a`pIQ9?5ob5Dn|9}+XS~{10Wm5bg^I=*b z=~Ed5#hWY1+p3-N*iN-b(ph}nC3*Hp$9-KrU z$JDF&Q^X&L8_ZM4{i^JSJG}TQBl($Xs;c#3D}rHFwJkaRA@jE($8!p3q>`nq z=u9*2g(~9nBczN}wFNB5M`?;-m7=;-6S2>-cd z1jLUqyJCoPeE0ou2FL#h-Bhb>vd-GfrqSa^AR6N=*rg6;9t_#pc+&7B;lZb*#-6|< zOr3xY4V{3x3|9rvVKDxeBcwkHiNaT_`AT0=1&8DIcu!#Leehd0jV(b{?`YJFCuI%w zn>4q+aDrQ(Hw7xfRHU4#8E;7X{pL?dUYQN_fp#UMnk}I6Nm6-A0`8BrEqxmhv2>la zjs*U+rYnLbcNViXv5JW;h_-^J@AN|``$?0IG>&!XyCKr#Ei04Rm-)dUe_sfH zq##c$zF?U^TlM3N_t{S|&4chaJ)km8Vube$nTk}V`_&LG21uFxp=%!Hs0gOTI z)u1-!T4LGrEM@Hp+Sp72_*B#?M2T6be#KgHAV96Hf@@ofd%1wH^%|;VgRO(<)Cz0C ztP^ZeN9aQs1aD+yZt_iVJm(k4MQ~`w$)gZ<8xl;@zb%B4n97vtJ1}rTPw&+75%!U` z$~EBr$fRr(SIf8kBv-yiH$|^j@*C`ei;<9&Z!8Cfnl9TI>z1~Mc&!eWCNXmWLALx+ zbw!g044GP91%~DER|znvO-DZw zu%-eU|J>L@owVexqWM^o>ZbN;md;=oToqc@y7X60(1XkIbA0mFZU-w}P z;+6y?wxK}N0}T4?GnjmtOdb|REfS(cfgHy)x6>ckkRnk{{yiXb_i_0Wm$yN_ouQN+)!SX}{vD+`cIG=7Z*TGQb^I6uD^WkqL6iXl! zkBc(K`|K8`xm)_zlK;hY_*FIV_HYf}PC`s`CFPppu{bv9#^)Hx5Taioq?>%?9dbPl|&5uL958=hY_kf z)VnK!U2sQIC!Fe_KBxE?yTR7VUT_f;_kmS~iXh}jKwLvmOxdO`C!TGmE(c^}o4Rb3 zk!|YoHX=#u)t~C(>0Gn7Ma!o)}Bk5Ht>7{UR z90p%sbf=%7#BkYO-N;i%^#st@wPX|dlI?dgi9nBg55X`8DcX$12$D_OVI>yIro($G zrUl%F^X_6LjBmjmb;D`ezkU`dGmKWYXhb+@Wkm zNAFhdrE8Q;Xv<#ZUR$ii&v@ec1^icag!}=NUv4O!b)XfBP6+c2)i;sO=Dyr z7VQH!Y=8>efS$rjJuww%kRwx{HdzLZWyIepp(Wl-2iw?kws|h+N1N)65i3PH2S47N z6JH=xS+iuS_qFtQwb~y#X*qiqHozL|@jz$z&rSl^qYX}MfX}rq!g94gke_yGq4%-D zT$?sh%lUy@$2P@k*p_-Ym<`8sB}OGF`@owk&LyDarwI@H38WLhF#`S9^kFmEUomdK z0>9MO$$Pr}RRq;4oo>H+d)SYCnvrmi{H6(_rS|AY>SrfjuIuT`+AjQMI$ zrD(G@5rm_;z!Hb;=!L%FFkEbkbA>hq-zhXamZae8q!17+koAnuf>SMfQu_P&E)THO zS{lsu>QQX^meUH&=G;YOb3DCx5HXDDQSYH(C;f<`wPC#)(4>k_UWmtWsotQd@lQy? z8SpHir>N3jIvV9~1o^>EZ_r79zny|}Hr+Ewo8@P9nhRo3n*rF^g56Izujdb*2XGp} z@w)s;^jOjBVv@|IS^4cSQI0)4Y>%0mUJC}Ah@#LW`E=6x%?xTp(G$yhG|oG0OH_7` zc6@K9-}N>^vU%P5yQ;PDHG6l=R@qwbHZpC_Nwij1wpLg3+b`VC*+o0P-=U8@y-j+! zWBlP-Y{T6uXp;9$foUWgA3~4YYg_hP0yg5Sw$ZUZMkl>itNp$;zT434?zxM5Tp=zm z(`J1@e3}d5*z%fhI1~hYiXJTw(s<&MYFH29TLHNZ{DuQ=4&g>}Ww+$Yj^xs0E(-h` zkTLq>DLl%??e_fGfq1q6FE>CFUiK7FaOj@^`2+P5`JHsyL*AY9**$l0gW%<^SzCS{ zbIzpd0X>ZTeSq7N@n?`6gy|jHWd)r0Xb(R{!M{;`hO3~u)d7U!0c*(`=tUm?rh*d zX(?$meT~E{N{*Z|lBY7O&)(%#_RiAV(RI2oX0Y`*NPF7E3Pb0|_l!dN`d855p11=^ zp#Lysq_3$SIs!d3fF2rP54|rgNz7zgeAI#YZh>F+I~8|6mTNe`H5DLi$_s$KpI~#X z^Wb@+K_9dNY#@wz}zH1XoI(JW9SdGGg+`pkd8az%FVJ*dR8SVeP4a zg{U~64H&)_!NokR4OsM(JY|u%Q|j9B@6kCEf86h$b)*qlMwhS2B)?lcvr&(MPs3~m z{T6#A;dGrLYgGm~qc<(hkjbvCxG$sB;z_42h8brvW(dIbmrN46A)_>`gZ&N>di$P}EzM+x#OBRF8QM}a$|B{lGuNbXwoF!p=^MQoHldoYIya8Lm_=GRPH+0&EfwAl@nJ94; z99Me1C(~7XqLWlqT{h5JL#MAHflY&YoX0K#|A=J3vI7%Dy;OY@0KFAuFyCCLdRP%w6^HZDtxVY zm8MT#Z4M%^xZKh$g{RkX+k(ESc|(lH>M}gt(zKji-Wy%M5&wt0HxG}h$Qros?Ik23 z&|x(yXi(5Z5d((lbzyAxf*q4xAuAGU)2uxy}oF*$fRF2ULfDjS5^@3nor*jMhtv4j9VMP z1U?WhTm$RthH|FJyF1TwPc18}-887k`-W#ZhT7uS-q^#IQhj3*ZWTCggJ~E3y0Mio zUN>uRlhQuSJ5Z}D(JjwYSPgBp@Gfeb!pN3Io%wq*$P)1!-fG@xcN;XVjubK#3}z}g zS7C~M z`-@Irqp0<0kDqxJOOXx)pyX6}1-eCfaWw+LtT(@mNK?ku(T(d_lsBBLpfPq7YVx^2;+isi@M z2XJuM^2-TWa=%C)L_6`T9BwzWRyxvswY)5;%l~3bT4A)k8Sw7$+#D6;BLtpgV=X3F zvoC1WSaM?MU-X=4xR*-Wu)7@v#!_3NWhNuE$~+b5!|n_C$~fmBTbI3Poq*$Gd0Bj( zYTsj1W=;otkXOE-TVvdEcG3M+YKo}aRIRGN-_T<7`opjYeNj1c@4kgnTS74qxzNhC zk!&Iyjv(E{qtdZMaL`J3AL$xTk>)#Vl0d@_-cD76E3c-Fk}nDHrRDKl(cH*RoQ$Y? zvjCukz&}}Oji?%T<0cjg_Gn->UAi|tNg?hTmJrrPk6GicArYIdhfqN+YvK|38vYg; zASX2OkWx9&xv&TG|KA=aOJu+Y>eX(ryo}ePtCF26mCv@RH+Dr=$?X#YM*p2`?8v3G ze-xFNnAs8T5mS3&;M51rbaoxg zl?T;8{&GFpmBP#nrLhSrZB#;p8L|VNRa(8i}BWg~!;o3gj?gL6NiZ&S^21@qq29^HGy%i%X z2WM(5u-Uj{?(gwkG+H6|%-}cOJ)Y#@MVqiL#)@uOv~wm`D>D)e_w7Bq7vgT$P>9H_s5OWwk}`E zEBgZuZno62za3zD>+G9S<1eX`!hQN{;bk}7MW~r`%AIjXM8%LBg;++0&lx0mf8CHV zh2f%{JFNU6BZOm##$*oJ{BQ`XZxDn!pjq9fjxzqS@NDkRYTpNjDMOHmb8QRrGY z`4+7WnOxye8T~OdKI~o&+#EZTr5lrjwB$_HpmyCqPkqE(4-? zZ5$qMH=aUlfx&GRd!R~M*`nB!V#S7+Ip_<;Zc;(nlFeeEUBoX7tUn#KGJeBOwroyPeRA#qJAb(?f)Hvyc%tl3 zcBM4@%C%zB^5wHi*&AW5%sWu1F0#5_YtIiwZVnyq?bz^s1| z6Ye6G=aQq70$UxBbf`KHnzQXfV&@|}qS`UbiG+y{lx#4oh8GFouZP1+c_B>ZrQuX-X zG_9IT&07|rQnUTdw*4M+DwP|BazUQh%54WM95!DW2!~b`dH>^C#ul$gFY@grzA+X| zJYIe#zF25=RUTJrYjPsHD6$xr9>cR_WDq$#BaaKZp{2qq4sB$4vbb5t(_wf8!9!evp8{wM>8ra(3h3~+U^Ax=?fSy@3n8p!@ek)`LU*H~kF zA}_0sh*gqIZn^}#eA{q_gu_@2TPPl3S}4Yo3ueS%I0@iKn07D6Fq{PHJj?c2=mBLv zhykKaUpE3H^z&69vVe}Q5rhhwrl{!9R~%vYR6eWJPD~zD3Vvc$3Vx(Y@YA}&#^3uP zzZgD7ke@;uF16l*l4TH((2jBgXaXG5hhl|wJgbDc@W^t;&+C zm{l2{wED1`!OUIiB}lIFKa2nK_`jO}FYw=!B|Z zyfRxzyDgTQe&bDaAy(I*Uo;D;l~c=5n=s&i!4Jfb??x#{L5H<2N?ahvWQN#;pH(C`8olnv^9L3f#yBoLsx#$kMb2K?lhPxw7QqRZIUkJ^ z0a4+kO&lePdkB%@i)9z`!g?XF$#x;@jzL)#UdX1|zkK?qDu%tGU8 zVy0hYLTt&y=$K|G6eBrciWUPVm~YQiQh>}j$#hqo_FiwXa&8p^o*~ z%Z>-pazQ@!&2H?M@HG9dnC5t}=qy2g%;T&;^h z-p(7ZkHGIxgOOjzt*V8TdH_@(ko@!rmS1!P3_xwQJnRe4!f*`I^9#vneQjj;5_~3YG#mECCA_#d!zK6?JIJMFOKUA-um$O+ zfx<^la5Q4QWI3x8`K)0>xvhd$1bFFKrCxDg{iITB28;ny3873cQm@>TUQ)WzgFSe` zweKTyty{i9!PYTB_b8Rpeg9vjd)#O73kP^^O7etd{q|v6ek9D61Ks_$amcX@&c&Bdh@Ig zWh$>lak77p;$R#&?tb|194@#}I9_~CKqDMPLSd__foQGP@hewhb@mG;z3pXg*>XR3LDUtefV(fOqlPPI z&1__2(yG%BFAoH#=9ARUbgu@&&~)z4%p?}r+Y}S=Qxj4a^Ib9e zQCW)=W|{RI{K+#4bEtpL<764sUCz=90iCH7&qnu&{BGDRrG~qVk|g2;@gvIzU4WBY zia>Hb%N3thD=Lux3tkZ4INA%MLFsWXh&xIJOb}vuL5xBh2S-PGe#zvE7sMGoV{Q;R z-NYe}*g20p5TWP;M=-g6rSVY8LxKat{jj`P9VW{GkGYh7v^tZ{oJ}gTEnm%=wC2vV zy=zko%4>H(N(#3tk{3pg+{KWghFCIo4GghG5;+g#Kf_EUBorPLT{RD^%X!Z{qfL=9 zH`yO^+bif&)`rNr8Kz&3`xqlKeUSyCl+N&-$-<@DbQY8}z4^u)Z-@YLC7o~fARQBl zki&ksd6u;;)F2Mn6zZGflwJ^ES3gGm?1#w9Tg`4XW}P@Fsm3j0U1-0`)OewK$>#!f zKAtJdm;JUFvPPZ$^#XwWu`^#w#!P&{_ucI68%oZ@T#jodt66FjpXK)+nrmVqnqV}d z)S8f1Cu#?Oo#k~5N0M_S@`l3j;v946RuJK>4NVaVVwzB0#9hoR4?365Q;z1!m{Nyu zQJ+vVJ|tx*rTC4-8Rq>nrE3qGckxE1NQN{1g^uuNAE1*&+TL&Wm_-sD{?^@)E^5~N zwv=eZ%<(z7_AuP#a@CdXu8^1aHO2)dHmHnWq06^~_BT8y5PDzpEQ8Opzc?Z%*e>AB z9ZYJ^^81Kl%1$o|m*R5qC(p8#L~y|Er5HkCe4^EioMR00797kBT|!&uBc{++fA|8q zs(saJ)ygHDs-Bo}VWjs#bg2iCud;mE-v&Kuow3~v&|ay>uYX)*l(LPnwYiE$Cu<)6 z6bR_wzU=Q|>P~zqybr`218OPS#4&(h%*wqvKKrJ+%kU_FS$gnvh%ys537Ow|N}c>4 zg*(J0Bjw=$8E8~5O>SrptiG3~S$|3XGrLN4{ug4c#WVo1dl*KRO`co!32q`6rnm4j z-{1Pf@vWTdJjke7FMRpo6lou;)bJ=k@MW^bj6vYT_kgq=FV1|gtO5}6;(V?@d?BM9 zi}n5N(~7*r_+Q+~>^4J6QeP>du&S~BG@oZytvu?cd1fHLgsQ&H^DIGnzry#@q6D=3Sm=)Ca^P1tTty{kDuZ-}5nq(Nk(i`J7Raw2C}$aC2rTn`WHquiot( z73o}ojdB&1EZ(3u({oofTU?d37%+VwYHT+3QrjVPCwQ@0nDLO%SG$$+f?IVG76v_I zX)P?Qp@M#q_yv&S*ME_u{9}uHe{@wvGb4kEC6kbuWNx~zB_pd~-SuA>*_|jy%<-f< z1|!?W#C$A9rbMJm#tKpXXm%qn!hunPRM(Z|4%R3^VP{f}Z;KCWTpOJt@Wju{$ zwcUxTNidMXJ&l^^9WuJ;xcek4!&H`+k-^oNQ?s(I$x@8Nk`hd_gx2Z@i;RUml`6*a zLBv7NTbg%s8@9r`V#7!{pV%=lahNmkC26?DAM`pPg83iB;|SzoOc%Qf;`P zIwO8Va17<%mK9HIQE_v756TIdSbLie{r2{DYep*Pu5(|xxdoa{+nc8_%M5e`CXOUW z5rWe!BO9tKk9|6fdM0z!nyP?Imm#lBreKm_rvxk%=hB0g&%DHc% z+DjCR$SbCipVh#S^P|y3cU41M`y*s2G(jqPXF@}7YFNA8gpt)kW!QAWma)`n^_yksR z(JEv|cv1D-eah_djnHe27h~Ayt6ZF=1@VM)LN_hQrS>^&@FVLUG&^vFQEl*x;nx>y z#QY&`H)p}J#3TV*$oUAYergOJpBxp9Ouea-qktt<+*8AKbN8_x~%#Mn*GD!zY>!AwY%B z^o1`696t#7&~E11yWkSfqKuns>-5g>0 zJ?G5ujX9iG$T0I@Rv`U&I%0xa3Awh3tq4;1I)-C6nOkHLeAKpc78#zo6NEEkFk2#g zousmNKbaS6QuL+48!&EJ{YRODlf3hCLYG^d3bX&^tqCsZyIGc!gOSY^9!XLJye=F)TTa%+MKj|- z;R`yxGw?DK2+w%6%GweE+}gqygiab{?}_FVV%#L?mLsiVMaOC&?%3U|pKPyUVg?v@ z6Coo6&T$5XU@r6(i(#m0r@TP%og`3BFLs$r3Cg(KH_6sl#VjyZq4qJqA(rabNxq-4 z!1!5x(kZ_6*Ty77^hpI~ppkyuUH zb(O~BA8iqTS-g<7&4mn$M+&jnC7czHtZI(Th)32nM>^w?_05rA|3Nhtz_tgAgkcQ)$s26jsd zrbY6iFlVEB$=7{1*SK?mhMf)f7pr4 z#@&WoRwA(;Hq9i!g<#pvglXC?>s1-n=P$1oD0Z34dB^p!E&P!FOBL{&?z>t|VX`0g zbACuWQ{>TpNIR43zsM8r?e{2L(3hgSu<7hoD-uGHEf||n)Y3zQU=-Yx53@mt89|%6HI1EzgaJ7y+aS40M>>A>?}ZbDwt@By8pLOYZWSYRy4C8EOE7YZ z_ZS>A;geTB(OVx}Ws{v43)uHQj8{DGI}!L7Y~*N6?vr-|xe_X5cj{_t!tgm*1ao=` zHIq0hdk%??jV8~sJOQJST=3^`mp{^E-=Hpk;^kR(grouElz?$#vT+4H`U+c+T^8`E zA&pG%w}lJkg|nuYWL_GS$u+7ccpwCut$&*Zubcrr%v)IdUiA^ z-zB+ir)SsvP6m?Y^z25dHi8+i+{OqITtzx_g$5!ebiM4zbo4@1BQ7&p92d1NZ>-}B; zW&gvLjl&gV03qg35C;F^P>RLMIr1X&H8VEoxr_SDoivOFvW!pZW9y&{_rBXPJavE0 zlVn{f(tOsf8nj)95 z&c@SbKowp&C0_MyXOUv#pzaIEzVJPqE-B0m`r{a)gSl*MNeQ-ZqK~UN{i2H0#LR6$ za+FOQ#um|vSSpJd>I=HF2S_&b;_G&>420A|w!Q*GXR4?1&z6`d^M& z!l3)8^-tL;u5)~W2p8A3y#Gnq$=hft#W2J+3fX^&l;(a@zzny0NnUoLvc=-vHs=Kx z{FN+;&_#yo%%@2nc3&HTunt9ogA2S(i_fcZ|A}lOo{mtZP*8;>p4KVxblf%(PseS> zgN$5sgkU<0bjJrN6C=Jj$gjvBXVZ=3fY?8>^UlHGla5z%k@=@H6m}QdS*=T@mu`|W>VK$R-R{j|KYYb+&A zjKV}oga7L}IjE-nE7O`Va}BkxIP54pnTRHF;DNc%!X_>tWo{2Pv0d@OgoZ_Ql2xs7 z2=91C?rGGGh;>>;?i5vV_sZN<1y1L1yCedYhuKN8PhUh^7~^;MvgQm_R~x7YlK&Sk_8+n2i_Ff* z^Ug~TorBXAIkuk3PNEqQzm=C}h>1SNd|2$uT814Aw%oA2@3Ke=F}5_m=r@`g*L!md z1-hgO4Pv5Yfz7#e;#eg%|HbKuHOY}*IB9XI0{Z7qTEx^T!&N$^PRXVl>A^oOkyn@7 zfMIBd%)b!H@R=^zT4+-Q_C%=J$T}eTYDZ*HA$5$- z6!{O0icKe}Vxg0$Q5kC9M&ZpGl_jk-DszsdQR&K%O{kZRz?QNc7S+kVGy4ZG60rwe zVhcui&}0!wbNaKdfE;~wvM>7^JaR40M5^^4w$X2p zwpp(O8)BC?wzr#XR*jYh?=r9Et#ATA02T3;`)K*8zUnWW?555URNt*Ka1hLJ2J|Me zMO6!MDdV)}G8C(J_cCHCqcaJ?ygI8_?xKA{jpD=!%DS-whj*$*#|=WQOm(4q}?`dO!E%H}HXEKJ_AFh?7n zL&QKLhVq77hx^RzXJuP$_!#PWit0qR93=(f8A)mv=2o5@9-AH>H8c>;_kn@vs(~!Q zFnI4y6BbA!OC)6>rZ9OIZ>1+|Qi!p7T(HU(+Y$4XWKz}Ur;|vuwO~=6EZ*d#TzXA@ zvV2u!=r>NHHYuYaLZ(F1C@RFFIt0uoQHYB@L z0Rd7=?<#GhImFH@eb$@wq!h>%l}u>JwA046I6)-rDfbR`hs=9b+mt`3E1@L0bdUpX zC$c06ecR{{mycn!idGMtQmV7|BJ3#xt{_`B+srFTE8ss85Tw_d;Y@pMSuH#cO#~LHZLm^bUNxUH zU%4-$%Z31Jcx_nABx0tKgwN3`DA*U~OqDuM<~g~7IurMM6yB{;tM5)Ib%~T3l8una zfZ0;2=)TQ$B%##Em}uY4oRS^=8ison3p#@byyvxVMsg`C6T8YpP9z6%E&HQBs$m;V z;~!`S^0T;XIx}FDGf(Aa3hr$Q_w!zsM+*R z48oW~CPSoyO(GrCiFELWNC(XBMOzDv+C1ZpJmWo^*wv7r?|l?`*cN@m6+^p7m4k166%MpLE2EyBzg%CMDs#BYnok8crQ6_3BBMf{`j`035@5Nag%3%;29 zI1?aXpJF*odk@XFFcj9k=BRiRIDP#DR5S~8`BJ`D4$u@LKaTR?;f z3`o0Y(wwTILYGm_QYohlij>Ob%6nl6;c_TAYF0iYeg(F*;tDy! z2H35{qbT3)4ttZL&XuCBm!g{G#25p(LXyG&9`;E;)S4^1S)!0V{#lZ@8voajj`7dS z9{(gcdi*Dh_IK|{C_|0*TPCS8Zjv(8Xs;v5uNm!+$wD>(sY>QfH*xu?V$GDO@~9KKa=aPNi_7oCqn6I&ZT;*=i>w3>isJ7D)~ffA02MB_SO>;T5IjX zTM9GtLl%fqoha!P*$2;7I4*|ZzBKngEiD|}Qxo0kD63)O<{~;a3#`_g-|^i-b*r85 z9r6JHPPYMQ+Y$ir*c!>bx&r#WR^)jAI1d1DPBD@=HftLZN(;Q@W8}yn1?@CXIwWT3 zuAUT%X(I#L9tYbgr>m3`QtN`;QzYEUCLB>KQf7PNC@d?)#;q!>yB5#?CHcRmve;gJ z!-?c=B}<3~{aCWZC9Y%15;>%fu?9t1V|)gv`YY>sIgYYOronsE5AKT!%Z7EPQpGm{ zl)n;fA7l0g(Z2UKYKKB2OZHwW60t zRQm4kp`JFAt>TYCFC8RRj9w0hp_h+%(BGtOO)uT;w2EHdB-t_P<$f#wf1{TO$$pVu zoYV%rbOCRFkUEYvMS8Jj(cvO1vBnTa*OAfKa-ERH zS6cx4Wol@r268KE_+Oz&XPzyp3mk}0ci%{FDzUYmIwcZ)#lo1j#@^bLnQyNz!sx8k zWT7R8MtsI>XuQ_!r+#lN2+tm9dLChJ@YaOnrt-qQJ znZ)8XF$2Q)uAzeFWywjjCypAWV2R`|pg8kfz!pZ6>GO`y2_*%*vxf$8-l;WmO;zsY zQlU{}qJ(C==Z@s3TEem-vDUyAZ4OwWhH1hIZwFd(7{q71ED7%nlKhN>2PxR==(pNP zuA|q{lT(g0_ldU!X_5uQ)3+qRpd`d%HXeZC8i7Gch!2zG*GPzYRHsm9so9iOu55p! zr1-$@A*8h*L5O!A82nB~CKw#71c0;tD7zruDLJ8@0q=sLp_6RU42qR*gq0O)2^3^Y z7H?75UNTxe789`=y2HCwuO;ljX9giMGxhYB? zhvf|8L38}0vQ${hKK(8t3&PhAH2<6{2>+84j|lYmz*Dws~$|NjaX&Hh=3mV^mMiW$*Cr@)PZ%$U0A- zEoHN8fNEg}0#NW`1x&~P3e0-J?au&nKi_O%LLfvMY*0RUvpUDKe3Rn6xufQQ;gurp zMci+PxSVmI7Id2*tz{#PeA0J`wrPrIAUXHoo7yl!h+S)*P08wRUw&1Y?iSxV@lDwK z#6g1FS~DLjE__HdYj-VCQ5|KpgxcqU!VKDrOIrYah&Tk$fpGzJwS2c$-Xef5=X(NU z*uYntFPhyYV1_ZL$13ZYCp56`dtZ^ zYfa?nxqkF*fcoX{WTxI|x$K>Xl8Xj~(t};{!Ua8(v6sOD(uKuga>M)JUq%)rS?ABL z;rOz@I?COuqtUwANBhK9qxonbhtAdgs;_ef<3qpq18!B_hQ!9n>iS?W@sfYbqmn*$ zvuf}2MU}a!86PMQAe7NaplDwGurOFi>uN?>8u zTmlEwC~`uw-zZ8)Fu-3;eXyg9hz(vUPHg*$s_lzt`y#vTX`Hj-G&F5rl-#hsMcbS2 zmA$aJ?O#D>iEX#;mbKgdeq!5CRBeAk(#P7K13a|7Rg2ST@iXxj1AeG(v3;146W)H~ zZSyYjspH&COAC z;*YV`ct}c(tu-PfGiS%swq9#IZKqXhjY%Xs=2|1i%KzWi8a+t%i))R0s11hqSdqMX z{a%{!-eQHNW2`ma<;&4)jfaRm=33*geE7w+#{bGn;P5$#G-4i7Gv?2&T(%#iujEQ^bcKWv*ffK>6 zzG=RPPF+lw-z5C%MD|WCe{Ha;XUVLY7x$MjZgF=`e>^if())>o1L_c0)nY8nWG0jC z!Iw$Sq2uwu#qspZ)oZ{NyoBCh>rwLu)@@+uwn_35>l({!zXiKGo>E{@9m!`dBE9(` z3@OGdl#1Izv)?YnDBKO2wq|t9FOT9kZU;XpSIdtO1rHj>`I} zOx^qQq887xAEmnnbw88e!Q*S4f`5SkySa3t5L(n+9>_+GBS+8a>-f=gd=tDW$=PaC ze?NEWpx-Me&()=abT&>2{z9&}Q-b2Y(%I^0eUy%ViWBFLaN^vRS6k3ifMX@NLwXwy z#~N|FxrOurBlkM={&f2F>UGu(UP4TA`onA|DZ;rv;uvTTT*ph!<8uvABKj-ceMs=5 zC3ePEH!P`h(}^}00uM4J{R}6d|_7yd)21&`kBfE!JT52Xt|d*Uq>)yy_RS-9iV(^&SadmVU4tn z{G5_vkA!Y?{=}dE!RSoAA+;TsNm?^rCL)Q}TI8ol5)|@CmmT3Qo*s+FN zsV?G+`lf8*OheaDYGu_C>|VQSKY!A}H>FyRKZM$HVFXF>hCZd*uXEDWvJ7Z3cEQj1 zLgVcKE^mxCaWpEflw=cO(F*g_BZvws{~WiSTVZy+*7CC=z9ef4s~{wd$yO-yv_-4M zJZ+JI_!0ngEY;SUHP=vp-zp#jsd;T+P-wlf;Wa;>CTggfjK;lv51_g(@DzNFlSnp0 z#7pJ4^|A9)ag#g@roI=gu*2|@F2grv+*Y6W1JBKG073!V0DerajG_whPRbFlIxf31 z#8cF`NAp&;c~lQ2d)DEYw}EqH;n9egI~n_)yI$e+-k?y0=l+ca-Ug3yE0nz5vuv#@ za^}_|<3BR=aZxe#KN`ibWTd1dKX;=`Ider5ZZ@1H9ljHbEv}%Dn%wyRmCty6H5vhR z4b6GfuW#bmls5wYMlL#(m&){5%S;($lA*rtOnKLu_ePH>8HU5me?|nBn}xj1mkKG{ z4P@VU(Q={KgV=9WVm9=!XgAE}v*@a!A`oD@>JDSsr_P2Xg$s9!GY#6+Ca*S0jt*Mf zQ|b4FS}CWWRSt~O$9FrjdpuHXf>q?wz4ai)Z+wp~{WMRuGHLZ>N5pK=lRd7&lRaUT zC%br!Cwt~vPj;xvlMUu0>N;+8v8*}9ppW&jIW{yiVED4IYfH-8eJuTGPz!W6;?!q>7Cly85 z%TkM0p@ZWP02<#eGJb4KB^{S-lJXo%d3h*6nSTZ}D6_zrp2=z}M_FsJBW#Fe3fop+ zu>STLADS0~1H_9g7Lyj~#3x?CQ)27smoF`WmWhB?nQLxOz{U&9h&d5jfz-id}bDi>XM&;qZb?t1_{nlM#xcbe+%? zwmJW4?9TSJay-+S7Qg}9`XX`^nawY6a;S;M<6jO(6_MPNsY$9e>yRG;;ao!7}522+KcC|KEaz-oij3 z@h;PtK6wmBhd;VWq3mN`%Fp9t&=`BX?_DGN8H+N_E*NJZE{*etCu9{xib3S3L7yMw zsV>ZM0_Fd(3wMXs`@=;?ae;Bn)3&YYhWg67%-4GkICKD z(;r2L#PP3mb0Zs$^3lkHrQZMx`B~y<&Bp?YkI4YYWNlI2ijM`nX8Et+V_r(J_}B+M zRqF#5AIlO3Cc9?no>758gNe-S0mXEFj+t3gtc_=`Q}7u>mgBI--GH$L_c5Q0)&VTYCk|abEm8)q6i7X7-H+yd{}K zJ$Kfki~Z0SPCG1YupuB0qXORRGv{891>*ty-*9Er%MP+38y@ER?i}IoEG>hhIFeC^ zuL*keOYm`?4K9C6zj{N`u;fIi?DB&mGA2coJRO7w`$$V2N7Oc z=oT#*sLl-WQG}lAQ>52w&4&(HLXW+ZYy1$&k5(RXlranBo?Hk$OErCWG!C;5r*aBX zjh#hTkzb9S)eOVD1GtZ5Hi#WGHg-kpTP&-dpgJ{y9c#^XyMkqxc@}SbK&!P4Qd6fm zK&JrEmj%{3Bln*K%nk~&gi>Q57Fr-~XKTU&am_D-_yRJdX{JznbImVgXknf$ z@NSoIWI>kM4pOB}YMbZNOihb>`KVli<HF2)waEi7Z}IG-_+*HDI9y1#aKI=NBS z9OQytrfu^<3ZO6)HKBcK{jDH5|5rf*WH~LM87I(4OV0Z5`RxXrB3YEAr}{yOUGU`_ z5PPu-q!~)86)SSF))DT)whwHJdnJ)&gi+WENv>SDi!&d~M(fZ&_pydAOs|-q!OrXu zB9xF5M$UN+iHP~4f5nX%TChVS&RE7UQ@#`IEfJy9ClZUdO>@zweUtx1} z5%I&)8*ji14lU_mZ$F5G6){2LsEXuzhg_b!U-22|)cXwaMg}&xV4-GshF&u?gIc9q zJFtRKprh%M+GIH)rH@gyI;>jL_WKOIaS$gaYKFx!lNYEBwe|7e^5&7ymu{;N;^K`m zJcKSMQvZ(NIXLR2OxO)R*1UD)?GP-Hw1wApZe-`Hy8QU~w2MT_3BA`F-}Of(GJ$?n z6z+{Z*;heV-**~Mw;?TLIYOM_t3usxOYkN4Z1M1+=UaK zRI?2rDQ2IbX2D|)mMWBn@XgsoAz%@{Int6I@b(XO#`2DSO7=zQa`6S^Z5wI|c+U$t zea6YYsPgE>fInc$NR@#f?FOYK7<3D+DV-TqXoxd1?*uzD!5CY7;g0;EF1P&rh8AG; zde>lal|2bye*;%2mlGdxjC4sn8UJ{C_lynQiTV2mOVq1HO%meDh{`A zBBH?tWJEI{j6Q1st0r4OU}Gh~c-w|ZUR2zn~!2{Wr_`6qS{hXjrWF*=DspQKpY5W%Vi{cjxP9HN$jaV>X4`pV%MFu}F@ z3f|Z~ibq6g1iftaFye^1@I^>zxazwc#jn!fSA8396`YdLf+)8cqF>LlgzNkgK%7;S z<|zwJ(Em&D+(5buVPUpb!y4yVGS2N`E~ET@MtMWmnFiT|+|o%{ zE1dtGQGN!78~(^*meX@`%qnc8Wyq%;4+;~8{BPiH`zWFncSD%84xb%F#gCV{A9=|i zLeJ+CgMGDfaooKPS3ihe=J5=B(d7QBTqWD7UhZA;GTimNSP8!Ol>$~WFmUYiZCkAj zuUZ*utPIad1~Hx8ZjOnke8o!nPb=j!R?3IeuiO0LoJ0;0Cyv^U{PH-_W7+*G z+NzgQ?37Ad^_l%ksZx}sneoHRX*An>hK%S?jPWirZ87FF7zS77UPsMZup7t_AKh%* zkK`2|-VKkG$>vVVYQ*~5-Q^|A3rB4VjEB=$IT;JZZ~2c@#fLKk5`a2ZXL0!t6H_91g=*`C7h1@ zj@_ueVi5 z(^d)puuFh@ws4v3m1428hYusxoh)(~Yc{k`tl#iSTKNj`TS6u<%(hG5n|rE+ky;W? zs{OeOQ3;ZyI0p*5Pi0LblebZLNR9o9mUIkRIg3SBr4~748^+ZEJJP7AISw%$aSX7r&QscR+doyyGzF4|<<}>jn%njNiZ*u(6(W6! zHdnE}p;p55=^()#eOPD64(Oz%gV>y0jO{AfbYAMFkky@42Fi|C=YoJ*~N| z@2J04@LjPf_WuGZ6OpUz$T$z8Pf>xn-?CDmq$h!NgB(wCGMk$V=F@GF&?coa-$gH( zVke0@N}aSAG(J7pAz<`ZU84-I-jaR{E5j>Ms*8ihNX$kJ?o!R?MDDUnS@3z^#+c!7 z+?c_`>3O)zA*>D9$g0O;i}5`?M9()8LrZ!FGX^LawUWvKmP16C2Xba0_j zlV`9?_->xutMsG!=t8CIz25xOT-CX6sLplFq(xtf*(MUHEYIQiTsn`dc{|@zZIYJwYmET~A@=#ZpD2_8$Vu#^bCLZquP_WZh8rSr_YFr>ZFF7!1o*dTV^r2swpE6l5 zPHuRcuJebx`m;X}6QS0lT1gdgnSmWGW!EA`D#P})9@V?qEK3~Kn>@FyqHsp_=e#uY zk@m+L)oJQuKyMJh0+F8f$mX`Af}X-B7RQFRZI=2IrC^q74edTf#xw>tE3=sVFqqGb zvzBzwaGJ_=(5y$JW$p%;RliMl^ac4gsyr7cl9DY7tb9<*9Yb>#UXW$aT?=x|C&&pr zO1@m9O0f%&GZX(ia{a|kmMEX6s@kS>Yj!1;&T^>wkf^gfY!r6;ztGs6xEJowQe$InPSD?KdXL|eETV1p&fwX~ zp`sc%rVkk9>=4_J!A`R2$@Yy%=m?2&C+=5%7V6gIZ=LdKZ`5Pqpj4dt<(x>6B-tiM-g^{eh{OWAJ~HkwVRe#D=s7RYLc|Z4sv2^n(!{v&>|_Y z;j-@3yaStXk{1Ze#@v;1gLQPHf6HE&mglw;;hKK^qoT+x2M2Aode*fy>XvPuf4xyx zxqElt1G!ZcG1PNc&3Y+o14BXc6ue@*R`E$w#rL~6P%XdrZ}2q7AFBAiX@jWjNVfs* zF5i39p}Ea4_V+zdy*tUXZef4D^2-ZS4q<2G-5=Upv8Srya7C#7%25#D>(;N}{*|M2 zz>NLMjYc(XZrf>G$YJgKoDo?;(OPvw>V_z_^w_d=v$hT6G5kmLfY*H_!NT{~3xL@2 zw3nMl@e+6`d$Jdb%4kaib1L4MMlxM$rKgKR?tPc=F z2Kw=vgVP-5YR|gU1w+al{vW3&mw1dk@;ka?X=~&ovwY z{SzNH`>Z+EDlBlVZ6Wfb$xSlmZZ}1T`M`M*fuq5stRnAT>r55vJkN@ki2;%GfS*$% zpLm`NjyW>TIOif?^fkZtz0kgfXGsuAlGz;xB^$lPb-#u5dl~%Cd{W z=>~2@Zft`E7nVL70B@MEh(AFQYQt;29-J);Dbqzkjl}{!B;k4PoG}*UulT)NLrs4D zN7?8LrQ}D_dgiTY-{_KgciOO8*ENEK+F%CK`E;)N@I2SqGtKA>m#aqU`+DeWl}*n1 zKn(0z;-S6UENclgFk#!D-OKgn`AN+%iE&q*Ia|f-GTZZRG45r(%9gx!pW7z) z`#lBq=zhfU+Bq+wDbd!;Bapqjh$}g~X4!dAr7wGX@G^hooRc8HDnzqB=07aTu4)|W z51-dOG<@0B$`+=fe6uhKH97*Ur5NQ*yj*zhH@3;ZcmxDMQUV%;n0KI!A`=&6(niPx zGpcZ5ow9Mo61#8J%7A<8iZt#zuEGQ%^o?)OqV=AeDl8t8c>Jz)fB*l1$H?uY|93nl z3rhMQ@tCk={OvsEeCbr#RFCtRHBkKjw>;*3!LSXJ#bcCzYUJL(@ufA*W%ysfU7DI+ z!~t)1lh0f4x#<%bQ;2TH+t9j01S34HRnA z@{F|Ma&HNT%D+P6R_D)t8^KZ-fACcJJiNg*92Q0B806m2bcRSwFVWgqV+0hRksmR$>kXMfwDR31`lVFy&?`F+^VAaX$$J zZi0IV%49Q|w~}XLYl$XwFXly367~<0ufnXCL(xi}+}-e(HISdY-GE z1J(0<^&G680!OshQ1u+9o(1YTTs?j2IZ{0X>Up7hj#1Bx)$&4C^<1o;73z7DdM;DX zo7HoLdahK@Th;S6^<1T%cdF-I>iK*1T&s^|Uc`6u;Uqn;0{=U>(HVfB1eJ^!Yj zPpIdU>baI@AkzJ!vzUv7XpH(Qq2UrrV~%PVETO9;)K5Y$ODIc1KT7B%3H4(tZ0IbZfP_*d zbe)7W3Ed(gtfr#V9}(#HO6UX0`-z11N@$yex=XsZBy^vIM5{XeaS3gZ&?X73mC*YV zdRRiAN$7qF9gxtS5^96c)38E9T_vC3KC1#!Bc?2~CzzKtduy zH4KwbSV99O^st1)ciZ%5CDcHFH7h_35oNFhSd`KSVFf+Xs?8p zN$5uj-6)~7WJ0qg)J;OuBy^^Pt|An@ub19U`#nVSdp+${hxVZUFyT5!%7+epivxWf zzvM4^Uk|;jHbT=zw40}0a=NB1NV!$lm+8$ZNE6l5#HmS!=W6YAxK;GN?s{hp)yE*` zcx^~`PQRzj(5E)%u)gOpLXxi3MzGy=bxNszZR_tGj`k)`)AF)3tt90}y{z?j$)9|s z=I`=o>LTlhd@m90NG_7MFJIAL-3yj&{pk+8T%F8>jY?<9MP!aJ)vm z^w(K>kIRmGHASDbov~Tx9{E^`c4yMPaD^vQQeI4PKAS@CE{TzZWU>4B0!_QXakZA0 zscDl^%Jl2vD6qdvA33hk^7%d`C8*E%E#G_TCu+9<-z~c1aa}X?UYho#p7OG;KbP20 zq2phlu7dI^bjM$H?ItPj5j|zSuCHxbUI#sO{Bacyz4Q+xUP4pVpQ3Sg&N?Ue)4FBb zG(S+&1}0yj4TZ^DaI7TDO1;A;x^|xqTmM{7IiTxbw=6$b@2A~Ex_k8Wr<{PWg78z0 zwhuV94Gw7PW@p-;o!XsFX8ylAkK5?f|K)7Pn$*)*KV4e^J73{&-|3`3la@KPhaD+| zpK^=`UC!ekcItmh%q0EWOPi-@^W6W@wN-k`m%4VpoG=AL-g(^ue08OHXOib+ct#F4sqE|0LZ%^>(+qwJQBh!VzbuCg{vL7H=lbv?DGp z>O4c!9&@FA?b4oerNR9-yPO}nv^QMr2kvsE{M)5}>*}?}t*>?`G*sGo8hs`G)pnPz zg?0Ezjh=>!wRZ%DPxO>;b-ghW9EF?H=vj^b(g(lO*;J_2({}6HyE^zhMt2DBO4n#3 z|Jyz3&>HlKcHg$_>(jKUnl?4-A*Z%YPkzLy-Qs9>hf~|+82Xr#9!nwScISCQD3sSn zGw2?}kyh){?sg2lGYn_b$I&bF_*wC9~^Pr9@Zoo-@wI+s(i^l7$!a`(14q0O2s z^mBZj;2gg9x}Nfpu5V3jB;_Zc>K>tGfsSL)WVemF`>;c+(`Rbhvkv!94(&@v`VS86 zpySkIq`z+kY)zY^X>&SkOJbnWA@}MXYm>Am^gDp;MMsBqN!nWuqW3sDJd~vEm*8?| z$GeiWdz=U`o1GmhleF#5OilaV*>S&HyVXV4-0$kR$E`gn!IxYe-*jvB65Q?T@Vs05 z#x+XQUT{CI?@Q9ZOd?t#K;dA3ewK#tboMfxWz@TR8U(#dZyRw!pZWI?cBI_w)c)m6 z+2PbTIZuw|1P7;T{5rYQR}QUT`iBl}SO=!FnJG^@z~StD4()di8VHWZ>7z7Y?iZ+Y zGdj>?J0LU4Y@xl z<%J~up`>{23a4Ek)?J@Ew7==pv&P}t3dSON1dHM zO{Ed(yHd5+ogF_;)oypCt#7Nn;7V&q)#_a5e4DEM=<4)ks`ik3)L96N$#{GRa=*w`+2H%cWTh>rbb2GSanoQquN$w56$@uRPkHQqvke+RLe(8a&$W)U+>&Z`~Ov`;e>}D*Qk75SLn!h}@zOSD`@Q{uWqrRnSE%`!c?RrhSzU`;N zP}BD4+N1h7mF_t0CcwDK(e{8-`==xAJE!)tV~bP(tQm?7lm7y#Cg0}JE_NT*wadQX zqa_y!G55Vz8*_rDU6-;zFK-?s7GI{-FhU2F)gi%Yp9v$^ziQE^B9FC%^LUNoPU!fQ zuJv~RUDsCVF6Pu*^;~I|#YbTAgO8u7jbn%a9$y?pp(~jf+?bcp%D6Kttx-3qHa&8tv`=@>e!H;$9hNXPrZzr{V7kVt!wAFfd zzCA0+j={vE_Z87E!!&K!iGOry6Hcgf!38t^;nFG`ot83bI6Bt5w40pC@3>$=j^|w3 zA5{1Or_9zHTxoSKy~b4#;|{7VCn$V(eB8mbki6ERy{!8QuW-n^+QvC}?B?#P^?<#d zlTxVXCgA*NT&8&4%u7SAmh9y3L5DK$j?Vys*}Y+ZddlB*{h@>ovC@W~A~TCXku*jdf=oL$WvYHv0vyzHysBsNJG!<3nFq>F`9jxsHWy;i4^*9> zR;-Q2Tyc8JeEo*RGW_}wyJOv-IGL}VTbfbc&Vokf)Ri<4^{m@}M zO;GKkk7hz+(nm-4;qe-Sd${{~#(ny8I&w}Dr>hO5nV(6Yd=@TX`>_n7tPa{sPNp_z zGQx6=^GQJD?-$}*j763BXCAD|qAfq=(3v@iXo-IkCx3SQ(A$UhJ$L+=Kv6;QjFLIU zW%GT-lcs8Y`z1zc{nXFVldmhD63j21IeSKNu%vX>#GqC%DLARDcv@yjdFG@UW#pWn zSyp^)NqMlitaxhX z7iWfMHD_;;T)vmion;j|zciG2R;E1doGM#+3AOgoCe4^pI%QI@v~2JtL(V_n{#Be+ zUUFmc#9-#E?99_=ot{}dZ%T3T)bh-kljfDo49(0e56zxkS{9^uNvBEUFSgrJP&R39 zKE+I)H065j>~ZDAW#wm2CjG3E>(8E2I<@%hd9!CsnpIpr_4>2NmQ6WZvc>}iCFOja z-)D*{aa_D{Ey_%+Y*g|5v9n61O)D;Im7~>%5yio=Q_6~qXN`@48;==Q8k#k=e8h~> z$&+TNLimz5V@6TwtP+s&Yrc*i8_QQz8Y(Xi2s-KRV@4*_lTZH#i!UpgHMMlEN^1rE z&ACw zhk~lsSge26QDBr!no|;N)$)srA<&Xp*9J;vmITXN!ab&xAwWm*xd_5+`SFsHAb<-T z@%CI?JT2eu);P!sahFWGz8JEbTso<2>hRJjA*(jur1GO9hm}#M)sjm}hnJPk3Ti)t z8-Kao;8|8O)&15eDV#M4-1d*WIV3kT=eP3D zF=Zul$lGVS)?+%8i=bEDXAQZwI5=^3S@E2#Y#E0ajtc~|>BovyITAlu;aSD=f>ze) zv3$)@Qd&Yj>qBB0Ql-jQQa*7i;8-PPO%*DT%-I?c#=mLPWAV^TGd4g*{_wFu890}e zj=dyc(MBLJE?6?7ywA)@Q$3Fj-?izPVK#He1eWuKw{hO+sSpun+7f&f=-m(GHdX>`-t!PqNW@i7)emVX6 zY5n@1pEKb6{$8!TWailjD&=rGnR{nWoE$2dF?AwS2$gG>OcybPQ0APH(iw^hkrHOi zkQfTh>Q#Pzuc_IoRG?iNPk^9eeM7A1RnFJ5ErgY8!;6Dcrb}KsB6C`4S*Dhns>KqF zKWmIk|Jsa6w0%-pA4?jrUz+_jbJ~oOYo`YhE@p;+skBUkkC%qZrWBXQYdS;nXlIX6 zJ(V|=(zL{Ipww!W6?cB7qL)6?%INX`hrRcXucFxh|7XuRDIisfbV5-P5di@a6$2yz z1VTwDVhJG$1PMtWsYZKQiAucCx;(yG`mW7v@=4z?-%JI2la^+4;U-!?+N-xY3 zIXxpwZ^sJaaXm?LW?caAyCCh52@94R*w z;|sFl{9QUfy|7U3&5H8kbPeojIQlPhFPxm45jSpp)_AErE7#u@ zM#%O0#KP!m$_?x2+zIJ9qcdBZ^W|tuo77Rh?zEdgUg`1YZw|f~YTG?UZg=&%?Qf)% zqCENh-oCcWM8ZXiI4~>KHsdNGbmkTayVsick_ zU0A5aX!E*d_y?WdGoQLJXszP(#y;IIP!6n&yzx1i{w#SfU{^FQQ?{dQ_;ksbEmv69 zCyU^h?C;V;x+bTlqzz0=>XX<#wO7Andjp#`C?zp1xoc{#!HH@8yQcR1&$&Z-CG<#4 zO&iiHIicT>6qD$mQsa{Ia?eX2U64_bKC*}#Ku!-M{nquDB|{F}LVuM@^Nr2Q9pAd5 zY;k?(Fg8!OcJBCIMOkCxCZ@|~v^#KmZk*ma%Em27&mASLs_Ak=ku|BcZ^|{4TC$$X z{~y%u*;yH5DF6Q!W&f5-bs4L@q$?V!3(i!9<~%w7@|c(XQg_>oapOnpnOQb&uH5D4 z=-PMf6~~5?Hq&f!Dv)!@KW5YOeqO%bOz4?kTDYKKw7mV|i?r14T~qvvL%zLhI6qfz z5;E=WW8wMfqtoPl;gx4*UhTJZTHmhyb^jQc)+;$RabQx{?ujSn_mX!CJP*lbWqgL7 zxv$Ie&;7cA?OT{6|D4_@Pfh~NoS&`dL%oFl-+7bA%jr(9NP2Mm-`Tnr$-a>#6` z8{MDeD8W@EN2)wgLg~9=9wGLW(b_mA6lP>+Wsa8v_y4twLH1ZY?>3>zntS z6YutQ%caXE9y?aw&`%s)lxT#`sXJt%P+xdyddal z$Zy({uLgP+)Q=&OB)zrqTh~8h<)_OsoSZc!eL~iWtlVgR?o$+ea&CPGTbM5wI+L0{ z!gQCtRWIUt5;cj18R_|1CdE(fFK76;LHWjy6J+C<#N15NQ{KgzK3OA+j3f=zdjaF8 zrO0ldQDo#kSKcxuPRhy{UnB+Prso%C=M~ANO+IaqoRUdq_sq)4H*Mrg*>>gv(_S9L z>1ZyLPy8-2UFGx6?k2$`%7;=t>RqmbQ|otz>E|x!Ov$wvw-% z>mrG(oF$)(O1w>elCezU?(%iv7KztNyhq|o=3EHwR~hN@zgf* z5x2yd9gLYR@vjn>NIXM6bKNTO>vooPk+`*d)o_Ev zk9HAXV`-qp62Cgkm`xHlA8t(K3i)z3T|NSrc=kwHPKh^W%U3-TYtOuUCC2y@69FNd8;uWOT2ZKlq{t_oHmal*%UcN+@|0>V)UMkBk@f{BtGhgCLj~Mfe#FdtNQ<}#&XFMm% zCGj<{NIlnhCSim84o2eVH%YrmeC6x%NQJ~x-je(hU%OS>L*kp>mT$HtZu_yUpTw;{ zk?kPy(9fhjBu@KLzA}|q`sOqyO}4`?Qm@3{9gy~s_`^f8JtV&Ru&lqt>Ay>RN_^E3 z`7yJ^L;jGjh9nLjldm*}%hwh1$#Sa1{fuXdBG$RGkYbzzO`p+ zj_^#(`Lb;#en8?*5?^E)5nA0N0lOL?bUJzwsmq(fCR?#N< zA^ATu#zZfUF_D(BCbC-o<$3nVcKN@iqKWL6|LT=ZXlP~Q6;?Kp_|uJ-db){yN8)cK zPOo9SNi|IDVflKfb4?SGAODyhwM?W+ZTSUfZ4;?*hWK@)sq2_fm%1kA!MY~YsGf<= zl<(Z;)HC4)^-aZyoFJw(Fi}S(&TnYKt>mk*{6;3UM&de+P57zCCR7q<%>FnN>eR%T zicL-E@}?%{U{m={rI`ucD98U7%}mUQ<|g!2a}(44OcUySmI;T>Hlbc}4!G%T6ZM1~ z`$Nt#p#|rd==m*8=>3)^oY2~YR<$-U@_WV55cxgOD{W1v|zMTp6zQCBK?M%~u)Uy|w$c-17aD&b!ruW6ht9hx3Z0uqp?_Fl1y2qQ)NAbq1 z)ZIkg(A`9e5=_(|2_|M`qKORaX(EGqnMlgzCbGD<34POBj)OiXs<@8{t(RkdWnU9I zJ=ugGPBu{oByKstMCZ#larX@{;iME}3Q|mHS&H#~OEKXG2gz~`GNH&|;|&~a!pDag z({iW@4IgT}r-qvFuwlkqCg+d$hnY~tD@}OyRmLP=Z9-pPZM+KCn8;^oa!yV+UafRF zM$%1WYlew^Cey@dZ?gTfj3@8~RMjjZ-F;S~>jJGYvgq!7>(6hNFW>B7q{E}~?lE+DVkCU&2#u?8Pn5ZKK#=E=F z#9lekcwbI5;cAnO*I}}W)Vbco+;_c+z4%`ya#OL1K6bN-q|PwWgJzn@+jp9nlzArF z%r~KJ^NsiSd=ox!xAC?wFrf?XH8F?pHC~-XCX~F`M7O@*nAP_iul*9)cmHj?u1ih$ zu?I|~+e60d_mFJYhfSo-BgVV_5fioiQ4_P}G2<01GtsG!8*kX-CX%<@M6X&d`_pn0 z)$s{q<~?DeK6pa5$ulMtx5C7%UTMNjo->g~t4*Zm8WXwo1zCr+ChAt{DZKxS#=Gl9 z*>10xsGnak-strvs@?|KPd1vETV6HZ&##)O)tgLA#%m_3-|MErPp`|d`MRlibc@V? z!-V?0X~O&8GSMC7JUD!-iTY@(?8k2#@56UY^wMo6=Hl(f%ieCHHg7l4ecv^a0q>hg zpASrQj}J}kyK=5P^s%Yf=Tl==eQKh*eP+DYJ57b_cN*{5P7`(6=O%jE=dzD|ZlYR# zVPZFbVL}h@GG_ZO6MO4daz6jsM9GiRLvMU-yf3~s;fddv(CTkY)S0`Dcgt@1LUp&~ z`&Ra`?@aW9?@VOc_oiah9uxD-9uwNX$AlOEXuKbPls5XwgtzWB=EzCTY&lPtNW53#KKo60+kV*(51OcUhvYasB<=LOi5?;6>e;`WaHl_vcdMMI zSN>>n(&&VCTj9A6JGn5@j}OCeU6)$`hUy0>u=+|__qmlFkWOr$n$20yr^#^ zZXS{IdBh7hmGk46C@-dQj2Au@Yf){%L`psORftN-&ou8R@e5z zXV#HxP#w>^wyqc3t)3U&U(fS8*Z0CR8+b7l8+u;-hF-W&BQNIbMxOU)BQHEM&I=_r z@uFunk@I;IFPz*|t{+Xk*yv_nC`qmvjhcJm2ha2(wOe@M=$2mOx>jCz?s>9|avhO7 zD7}UHpM^C8wM=6+BHoJlL&Uof|A=^Hip_r*d>nBs=AVwZ0pha|w?W()aRTCG#6uB} zK%9ek0^;BbufzP!h>H<#M?4Ghe8fu-FGKt(;@yb%AwGgQlxo+r65`s3;}Ew*+#Yck z#61xYM0^$Ek%;pVUx#=a;yH-#Mf@P*62z+!uSfhQ;`b4Mfp`z%gNTnIj+Xmh4b>3W zL);v3Ys8%pcSC$yysw$Ici8wHxkuFSiJVh3d@skehI%1e{+3QQo}Xmn5Atlh7jY=x zvbE%XZi?khIrnLhUuO8>+zdOPTnD@z`H{^8ITi_*7FoXnxCgirxHq^mcmTLQcqljy zoCa@|ML9w}9og#Sb&Ua{JfqQ}XfG-FC2$owtKkNnf0q+C%1@8wZgAaoHfe(ZGgMS0dZK5BJ zfaPaDe)tnCw~u}}22KSZ2g~iG4dd~mFfG2~W z0$&GS3BDe@8hitIE%;yHm%%rJH-c{hZw42G-vr+beg`}SyaPNH{2_Q6_*3vL;4i@P z5r!YW22Tfn2Yv?pBX|WkW1QW;SAzE<{aNs3V{Q5>@IItJ2i^}}4L%5d9()+Q2E6N9 zTiy%ckHBlezajsN;3MF5;N#$zz^6^HNdPn*MVL0W97eEajrxI zP4)P+G2N58vfuE8tdZ&CbBfG>ac$<-j897&mYh=5ww-jmI;to;&F^F~p>5&>Q@ou| zhk0`~S8A_dHe=@xPHx*KEiGfxr1TM^C$w#Qp}fwK?f}!Y%dxc4(tU2CDP9vbyxOU9 zw-d8)^eKecrAwXFfXUN#ve(;9dWys9wFAKcITYBW=WzL;A)&%Csf~KeCOOKRk z6Gj&ljZe=p#d9NCQ`)FWlhUO7y}~@{Y*YHBPMgq1l4Q_(ThrWHnn(I?%NUcEkv%4D z)OhJOT58Xn?Dx$&engsd3M@T|Br$58?uFL+$i?X}h8JeNLlR>&N?l!q7t5D|;J$Zf~f1_){a6e(tz&_pc@+WIo zb19Rhll!s#rIR^L&Mr+xC+J1l|CuRYn`lt3_8^@m{lAWvF5yI-WcRV&DMc5grL}F_ zZiIA$n1SAGdu1f2$h?f~^n$daf^_NeyH`eHqRhKUI^VOs-0O_Q3#H?|eCdckaqQUs zy`^g_DYn=SfJ>4SAtE*Epn|Dec=;D%8=Z`PUmVGE= zOrpQtxBL&v?A|tUVDFR;X}XNt{|DuzOTVBj@8gro%g-t6A*n}c;9yQoOKp>u+BPjw zHdIQ-G^yeuf01|DDpHCrl70%c7wMub|JXa?`R7#aI<}xFt)M7Z*RMF_&m3`GRzaTf zjF2AZ{#hI6gse0j-6G!~vOzM;wSu13rQk`Ui`2UJgf&9OxyVh+&`u0BW$B5O3@I>e zy!3ybFDDKey+Kl!ok$%i!%v)C(=#U${nLpGYi#ZQ!LGdC@`>w&_NuE1TWms6o{YpH zR|%Q3UFW2akYPELK33A*M$UuM38&22rE@ZJr04L=(Y~-pXJqE2XJ-1i-=d#G^B=KX zx+ukAKf81(>o@ESi-nW@U45?7$Wr%SADMNjlJpFnEsIx}mm__4`aP>_CCf^aw6Asl zRI8VGO?t*A>4{r$jgMJlGsfmCt|#VCR@?&Ao?n%>D{K9-uFZQT_e)6Z*k0#s~vj`l0u+xW@Wk@n>$7w+?5@L7JF@^Sv5aV2;u)Y^n{-jv0CU-HrHqCH7i47H zy$CG*`1)CO=_9j>Cd&NwXgxv8lzNy_+df3k$ongnL_@#E=^!z^Q zljYbwT03mskdi}%GVWil*EvOtZT_x_q~Nt!J8P4a4RWsV6Eu)0WQxP|VE{+q1BFt3r->y@A^uw^`q4 zw2Xw~kK=z_wc490t8`&IYTH}<-V@KrWmAkIvRT$VZ01P6Hlf@h1=9I9YrG>$H;_L} z$6s~AW|4GkXiB7en^2Ki9hECdvKPvb6>?WDJ?D;)dvLS1hN+rho{mm2UsjTLE+>ud zV-{BKYo4oYThrWLHQBs+x-(eEgEdmk`Wi{*mzw>};kw<;>iRwUrzB(*7IDyyC2@&4 z(gSf;W~!XR%!;Oi&GKe_q`&g<+Ijtg<|Zr~&1{bzZ5A{>VI}oVk*;-Rpq{mjO|)!M zZJk1MKyv*SJ<{A#A=BJZVS-s$VT9RGK?acRCu_J(I_!zgGOJ^<&E1tU%wu)z=mAl(PlYT6V%=VbvO!TUsnum>cq=BiBVAjTB^V}7j9j?}dmcC)!rlG)MN-($ExnALGz%{@(Q zQ~Vff2e8S?ENz7Kr)rtajZM^OQ(R%BnI+9JUz%f?G{@y zuQbm|_d}u4<{`=cyksen-iHKN3a%4eEB#rT%|m4JzVu{ic3mNpebS*&OoDl?A`eWi zP@#;o^m-*}R*o(8UM1ToX6os3)cWs`K5bO*!~~tC+9nQ2$8N#_XD#>Az=MS6BKA#Ryww@o9zf z4#z(l%<4)`=g2$HG|>s>;A#J{LgsCEbw1(h%sl-R3%@P6@LK~5Kev**@Ec^|9~dqR z&m~$>X?&3k`IBq+uR`;HoZhCUOM5RYGBOI?&7Mq`P1EV|Tm08Eb^57vIukMbZkH}+ zLUN&%i`TD}PP}D&Pr79Fhwi$)@<}6d-BmeaR^FlJ0hvlys&*K!$16*Z^iNCLCK8}IZyl(bI@xpkiC(KtSy ztRlUP7p3RQJ=MpxYxm^Zo^SBeKll<`MJeJkOIIYE6}hx#MnK5V^GG zO*T8Kj2J)49H=+S%s$iLRBmprT3Y%SQhISCr}WR7+A{x?GGDw$*Xz-RT3qRnUr$#( zF@V8{pJ7T0bXgTzVS( zJ1%0jf2odq4szsl|Kj8y>xHR#_FQ2$)|D$4u80R4`PWW=%&1w?YcbA3i)-NAeP08X zteY&y+|opL-mi4Q9{gITtG?0cz4wJ=`lLVIC{x*<{J9M^o&sWMJSVb1uBtlXl6^nx+n z@+O(jYvO|RO-*|-Hb2zlQk!i}Fl2##ge;OSPorhtJTX{=~3hcT1Pi>4kD%fMwcIOYT#q){U6` zesy2|TdRKdL2V;@kjn@oJTS~HwPmi z(8&X;ZIv5t9aO_PrM)2qEz+#v39`rd*VEtYpLdkUxZxnORRp=qU6r$)CtIiC28N^OJ@tG!NJF_rncx zURmMS^Na85AVB7=dh!XT-kRdfs)PxW|Cn$?guQ)ZVe`W>%p<+252)Vcy` zB%9yA&$_EV_Tt5|kaz5teBq?Lf?oa2GxfVoHcJ~6`gh?A8b-{nLt2PifWMd@*Pkqd zrQxW2Ube;jU$uo^{Y|HT9MS1lN7cka&S=oJm(*b22D~BXnlGdq_=uS|B`nh={&by8 zCBJ^m`&@(4(VEPQ(jc4s4DZUQ;xaJ(OwA^vI+&debWALJ4m5YlFbzDQ4mL=U(})bP zY95wNzhky)pUu(fZ88+R%<-pdWw2^FSnk&8(RDg~=p`*$-+!!X$ah$u$+G^uUg!It zPx|fhQA2;E9aeptRINLc+1oHhk12oDvF~I9tlbp$hRFCVd`q%cdXd-C=QU#KUrFhI z$l$#ur0*;+j8UOk)u{CL_TIRNS-wS=?yt9Xx_O&U4{g`!k$1zMy{-OKYWrn}&fD{z zPLF<|(>HhN^hp(xJ2I6sR=$j#>fBVXYFyxdf<4)MDJ}SopYw=6 zz5Qz~;X!};yi84q??(P?Tsle*_icZ`Fd6#Gd?0<~`}@u8xIXDcedOk1UYuNc{ZhX7 zr+@op`ET@=$C+m&b^bS6)8qd1JDJLHBp*lVdxNe;W@ntax=y#w(&;C+MWpOr8F~6Xdu)mf z5LskyZ`vn)gj{g%l7nWSq{}9~U8m2@(dpa%^jm-Wmp`5RfX;u!pRVwya~{+=8y?c> z;}7d}=c78E`J_%4t<~wX{&b5><=`zUk_MmFOh0`zPsts*eam-mGk%S;M7HtgR(MI} zH#ewezmt*^oV;PpC>U)&<$SxD9S%^=Kyv2zQZmXxyiuo5Y*OjO0dS<5-W$kir_fB3 ztR=5$rnmg*Yn%1;t#9dcu|GZJPiJh^Ip4jl(|h01=_-G^a=X5s{h>}*`_p+J>Fd8g z(JJ+wy`JvPp5_?nWux2*9NnoorhlQ+&4+aQ+;2Ml?RT9PA5$~6V0>0;UP9KWzPOh+ ztIy<1f4*ig>!h@$l3z;jr*9sMcwKemJF{I<7XGa%PZUSVbmtVE9-JB_pY~i-t=Yvt zgifn8->ci8%A~u!>Tw0tizZI-^ly$g+q3`kyaysZ>c3r~=5=S>aK;TuuY2-$@p^AY z=qImR<_$?Li@h0MZkKKo$FK7edJbRU#lNg^LHsg}rg`y~rCfGdLc$iWN5_&-iFes? zFaEyJC*BV42`~S;>y~=|_VTl{26Ve@Q2agK_`AG>;SYN$Q@otF!b`lTLvMti3f~#Z zpYJ^v$v@)V;=SN4i#qBZ_udHg=#?6uoG^U&Jg@Kb-jr}s%aU-bj>+yMxmCxKa89dk z1JB+Op5}GCwqnZe$Zl_n*QjE}ii;w3>t%LGY8K`; zh0DFKz396`i7kg-)qPuq8y1A;hCU1ZlA9Gc}#=sw-6U%CF9;kU!DdN-`_ri6Y7 zWxwG)DXlVb^2EhnjlaAXy#?OG(i9UjWQAmnbgC;>tJWC}D!%D0@@mz&X1X^m`lxr* zn-$gclTh{?uk*x<`(ArS_r%td7JCUJOT3=(tyX)3hbQ%@wa~jPPg|w`3fU+*`@EZF zi^Z3OlciN#bsSi$($&v;+5HmYhfnopM~3vccu%x$gXC6S>Pvk;g*JE_LbWcK;@u-& zkY4Vl`0MTKjrmW75?07dDU9)S=o0E%bs?hm)LUnCCTyayL=s5;&thn z^ik)oz~AA3)EakXk~3*GEhUlCg1)!7?rpOlr@@;8Dneb9mVtOhnc zyN%7i72Lmr-zonRe1Qa$lc|O{GgL*Ke%p#U>eCG0yrc z!6U#r=97jQaW=gO{E)EvOTb&3SZ>rsbIUkXO)cwKQ5t@e?X3B0US|21=C-_n;D=?q zY5IKd@4~u1r^Va+b!59~`Xya0UjZ%#-v!$TbIyziW^jWqS_49hPg z|M%eEk=|gWO+P~h2GII+j4=(JgtfkDqb%ouD`Z<<4%V^AG`tPgG08OS1?$*k8cuI* z+p7c}s9!Fu^<9Dv)c=L_x!^V6M)}tN9XtXo1Kaw`=b=OOQQ$S;5plMB9Scpvj5y21 z;AwvTVzV5)9y}Nwtp5R?0#20knC`D@z;}V8C;G*k_rNPBS*|7nC20OHz{9~cC)@Ou z;1S@T!Bwue>1VdHerIq#I3N5H_+{`>@U{Q4zK&z%FE993@NV$?;CeUO{8if9{F`sG zJPh2f*z%p=YrvoRY|K)y3}WbSkAvV_z;$o7{vPm8Q!Ix%+WdJ_EjIFBYr#{&Mc^gi8^OPV7tXTf z_2^{FUkP65bFn|xp5}NJ+~zi$pZlkd!KZ=y=W_57^ zyZ*6rZ2B$W=HRD=b^YVPdyvj?U1Bb_{-!&upCGLHU%k_EI=JRM%Qt~_>_81%pKIn@ z=K4Ggz8~dt{Frs{U%b!e{|NjZ_*dkQTWr(0el5YR<+`fNr(+aq;P!5@#BzU0*Zo1q zF4V9L`Fk(*(YyoJF$^{QjQl#5p@w#sT3^RB)G$L>>-&6_<)uj1u?{snkMwHKTYeY( zCHNQcPv8n&Y1 z?efHLv3wTz<2Nn$0qdBO8pg$I{$j&%g%*LY-Kwc4_E#NqQUmwbP2gYSt-lZ4v8&x5 zlHT#Nn_1uo!3Tx4zHh;4a-XF8->Ua){&m8d-sXMF=XJNd`2))jfIs}ua-9U5u47?p zmM zHE??+fuHm97n^+WabaDb(($Q!T3&y^`sv`EV4gpoIcU>gLb{G2s)5%R9ZOV0-ClP6 zW*@hl01p3cc`R7R7}YQXd>i;7@ULL*PnBf2L=9YD9h+3cj5xdeG7O^6uls(n*$8fM zx!oUh3{wrGz#oEN5Z3nKI9(qiy;a!eui4xBMc_f;Rp5Ex1v0jthL6B|!S(uBe;&pp zy;4}~n;vcRPxRA`xm(6m)vySxW2|a;0sewm%U)kw-lyOmKFj++8G}_rE?CE8)o>43 z$7a>A5nSsu%b)pNY}SJtC)@Ikj{7Ge4O~*$@(S>uV6UIe-$qwTLIQYaRm;=BvDGYp z1nvTE)!+J)PPge}!0W(|f{%f}@!9xe%xZm61JpO>r&`uO)8}H-t+wT>!JEL`e{^hG z4cvbUz!Q;wF?a>IX9Ju6FYp3z`+;`(H-dS7Fb!?~8~t=+W;V9W<7s{q%l9F@;aQfS z5!R+W25y*Qx#HP2{U%{OUrqz>_F3NNw6N)3s%?++TUu`DbFt~u%JS_<*Rgjsusw9l zT@7rH@4!#Puhzz<*BE5$&j)V>mw>Aew&{O@UjcV+YyG-IYXE>IbPq-;5ipr z|E#NR`f~6U;5Fb?!n!}|*u@&&^|{y#ywvjf*Vy{&#akW*=6FT3z!SRL^qt`4;HhcW z-w)>Y(=n1YaQoc{K8XCAz;lLM|C&UbzjC@|9a~w$PvF`~md_ty(+7jS47>gu$FPa8 zu5areHvc@Ii~TX0wY*uGHvO#LHvOp2#s1jMntmwDmOrbXP3QXPn9drwKHq^8M@sz> zgLT|<4Yz}J{BsTe2J1NJ8did12U~s(+yeYDxF`50a5nfj zcm}xoD7(DNz|Fy1z!!q|fG-F8 zqrf_jyN2t)I-a|R+rc`nyN0D;9p7EUvtS+PUBhOuj`yzN6R?i^u3;}&$A8zr{Xxfp z*TDTj$Aj0v?V;nsYd8*H$A{NYeY9;49VcD`_eUKsUIX_B9XDPB>(}w)HE@5{apW~L zLwP!$yatx1lN^UG{7*LN|P>r(>e{5guOy#Og6DuaKJJ5Hj<>rOd<6O55!UjmO||8Hjr9HU!%shqvE_5z z!A8oJjftCO(>n-P5pE7nLwXBvF49|pry#uzcow)l_#SX4@I%T~Ayazl6Y;Lpdb1%3Kcq_OK_i0;G^LF;P6c`Sd873OSj%%+%j5Uw zH=sN+{nM;ox;`$e&+psk!za_P6!2YEpWn}yz$eq6AMjmPpWo+ig-@nmH{iRhKEMCp z1E2ig{Kz=@setqTr8b!FUs?#qp>B;X3vhCPhX;6kfOUB?b%GE)er8C1_jp<;e5&Jz zzi+5iVD~@r9m1#Df2yE9tvXpIE^GT$Im>3KRA|d1HxzcuyC=Xki%w40@|(;5BwJkR z{^qjQ$KPYj5nqpg^0)s-d9woLxvb^YKig)=9B<1bb9t%b^{1NcU^rcx(s^4YxySK3E`S8i~ zCkA|%)n5z$M)+jR)n>%`h82nZ8?JvdnZ@{b%9d2cJyetxtWI)$h>K*1rrs znZ8@!sp>C*zZyQ7{+z)2yR7whKG$Y=4L+Iv?11mG`kUdu51&lmtxuQVW%W~A*$Tda zPp0qIr@qVT?}C32KAFB-->K@)Jr64=4Xx(`GW~gh^>{yl>%?>E96WT~?pJ=ku<&>tD*^>H53%>GHd* zK7aq$06w{__4D_Fo#2z{Ck2+@Wv!pTFB}S=O#k(O@3Q**J>n$zWcqG>y8bS!&)+ZJ z3!hBitxtWI)#vXW*T5&!zc{e`F00SqM}7pKOn-gAcUk?qoo$BS;FDuyM>*B;jIRSr z&krtZdHj9mbn*3gB6E3u3M`My>ht%UkH9C>?-uY~R-eEBEc}F-5v zv_5&Q@TuCvJ)V-qcUjBh?@hbiWXmIG3!kbycmLAzT-NgVd(}NCk1R?4@ruiJ>GpA1 zeg3{RTx^$zOkZaEL0RiBw&<6qK7S9}>SpVcHGgyYpW)yzns3HUCn&)?_vlg8Kj$@DJ^_%5r@-}6Rpu|App#DMRz`lrR)3`5|P z>E{G|@+8Tx@8|e^(=0H*Z(0oI_f1cM`F+y{a4f$6c^}*Y{5`lQ_)l;)xbm&G{u$sn z@G|fP;4R=J@E-6LV1D0}18#-yhi(G%`=)u|*+_o`TmoJL-U@yTychfhnBO-Y0Q38% z$aK3t{J!Z7Fu!kV3Fh}rmkP&W+h}yTrdK`jdE6CXejax%n4iZ@2J`bc-QJlxK?uHI zo+bG+nJDqS!uo#saNzT%;&_`WRt_}XpUGOZ9*^s6a_RZNW!)by>1s1Hg-@oR5b#}A zzZiZ7>j%^C8Sq_Je+%;851&kbc))jA{T8?Y?1WFIzaZedtUiBFe*`|6etf`pS^eXv zzr#%1{$%+=kNCi!za^s+dElix~x8DEP_v_@3y!4F00Sy13rOIrawHe{4T4% z3=7m?mR)}`efRSKt>0z!`8>j<@X7S!1NFPC{;))w;YRpm`pW{o%j)y_hXwG-^xgK> z<#$bhd@_Bvz14SFeLi1N^)}mnWctGc%kQ%K`;u&izVONPrv-eM)#vjZqu`V2 z#|M0u)nD1eW_SobnZA4dOqQ80tA7CgYWQUO^0Om9D68+X`Uz;zcj1%iyY-!_{;BZy z!zY*3-w6LS`QSj$zhwIE{-X7}tjizW%dTG&_~f$sm&3mlKAHX&TYTyH-({_z&+qhu zPo|H}Q|h~{KA-ow4L+HE$3XoqtAEGkHp2$^Wcsc2g#?X~W#Y2>FZTA6%?I$wn!maH zm)PV|-(~gre9|8HWcvSY|9P~Jt)SuUcKeg*9}m>;vewV%q1wYI(~l4ME~~%0ugy>h zpG?1=zL20%vP@i7|9G;WY-YhHYkqCNPi%6j@3Q*(J4+1@z$eq+VUtUJm(_o~zs;}~ zKAHX#0pDfyQwP`#@4+Y2m#btCdmw~qY@Ep7S$z}D| zz;6JbOn<2@zO?;Z*7}FygxDTFnf|{6zRT+W4!;k4GJUtbbp2gce^jci;2QX3`q_c{ zT~>b^{37^d`dIC4wfeo#)9iOcFgHpHe6hfk(|mrX8RewWqf^P=P7lj*zHTdm(^^-G^Gg-@nGJW#*O z>hpQjKj4$;KOFE~R-ezW)|zYEpG+TzXX*O8tUjN2O@mLSKP6DV%j)y_*xB&O^m78f z%j)xa+O6=(^xx7K5;RJdiOcHq`P&2V$(p~p{4bGz4fI`BpU>+yzSFiJnLd7AUh2E7 zKA-RH2A@p-4SnI%@3Q*Mhx^H9GJNtP;b}I>pR&BC0_C}^vM*BKTFp9x;^Fxe3#Yd^UW8+C)4i`vIQt>{VuD|=b`iA zlj*z5tG>(X^ZDty@X7R#1eV`r_4&N@3ixFD^0Am7l(l}B)#vls-@+%;e<9$ztUjOT zZYC!>|NR6mnDmzg+RtV6`TTbhd@}u`f%;umpU;bD!6(yq?_ZN;rpxNfKmmTZ4L+HE zFMT0FBlTTYpU;C7y|4`p$^$+DrCJ7(GC)3B^`f{=iz^bPo|IC zl~Uhj_4)jKoE#Xs{mAs=o%(e7T~>d4p3QJ2d@}vyfbX*Ud|rPnd@}unfbX*Ue7?T~ zKAHaTfbX*U8*xDX0H0h|zv(zz!BO~R`f^zLK{;6_E^Ga(;8(fZwm+GE-+=G3`s~l3 z1$;97=L5dW>a+iYE8&yrU#Bl5Xr#;Uvij^VVG?|@=GXlnANQ2{F00S}6_&s!({Cwd zXi(PrT~?p{F}whuOdmhDEcIPhpZz!d3ZG2Bm0$ab`dwC^{XMi^V7DKce#e0Cvij^F z;yUbtBy``Z`>pG@Cf zU-ey9pZ#+@0-sFZU0?NGR-gTO9E4A%@2;=rbZd)_1D<*U0zQ8j9hQ z>AUTvzROxa`xki;KAFDTUh2E7KKmo7aGza%GJSV_)puEa_FvK+KAC=wUA@xths)}> zE4CT#fKR6HuCLbbvijG+-wdBj-(6qz$<-Fw?*sWfSu-%7C+i62^JKlie4gwoFrO#O z1M_*ZDPTTNb~l*MlPv@Dd9oM5e4gwb<;t>6@O;A&;W*n={xo*+$$UnD&kb;g0AD7o z-)F|n)|Qg*#ld_&K<8%KBtJd)ePyQP&-7F5WTNn?e&4&a*rxB5biF?!Ytedr8)%bD z_YaqK`yMQ|8M@tXeKP&C1HQ}Z*S*zy=`gM&B%DVn8tIz(P&VInQKUwoPm;ZWJFFl@IR)6a(n_)71 zGX2be@3Q*rPwFA~WcnQfzRT*f|EZ7Rlj$c0e3#W{e^tlflj*k%_%5r@{;ldhXxooW z|Av6?vij@~s{}ro{-l8Kvij^ltM)^-elq?30iS$>djz2U#<21)Aj8W$aRj{p^pgJA5+zc>$k1Lh{EU zO{3cbyf(mE-aobXKFRO4_g})NYH#)znERMrUow}sK9)&2Stc&)`hF?jTWNR#KAC>1 zzL21i`Yx+~!JU4xc?CXM^Ea3Oxi-1fcUk>c;lB@`On*SYcUgV*hj;)!xvW0>PprDk zwjY`PefmOzM!NnkYyE%A=foP$gHP7{y8daJD1pAq>a)MbB=}_dNmeiQT~?p{JLbSA z(|51;y8JGy&;B5%!za^kAE=-FsN~n{FZ&}|17?3DZz{|CNj^`m<^9wCzEkqM`}_C8 zr`q4E-E9{r^>Mqs$Xwndf#r2s*Ee>7%`gT&nZ7KtAC$GdTvq=K_{H$a^eYB@m(_0q ze*t`QS^ab2KMtQxQ zR(}-yi{O*X>W_ne1$;97+JXJYW!-A;ok(GTvmS({5#;2%j!P@ z|6%y#XN9L>*)?K$FNW<*1S-- zKAAqc_bK&VR-gTc4}edmzb#O|%j&bg@iFkp^eY8?m(^$ghb_1XXZO88{@?)_J?%ye0O_Lsj6KAFCI{Z`*)_1VAvUijp) z`s|Ot!V0_pkm>getiQ`zKl|@*0H0h|pZ)!}gHNX4J5ayNTK`us*$lnmlj-*e_%5r@ z@deW1lj$!G_%5r@@d$2&Pp02D;Jd6o$1hk2pIlb|npbQE&%r0t-xa9eWv#!)=Inok~M#G`FF23>btCd zBlu0>lj*zPU#jo2`j^0O51&jQm;ci9m&@uWz)yltroT>KNYF^@cUgUoUvU+DvL@;J z50HNi^j%hez^gWW0(>(4k@`XceV5gLev?hV6F!;#qJZzR`U5vx|6%xK`ju^RY5gv% z&+$5*hfk(|Ea1DW{*|xW3?IQK)BiT$yR3fv7Mo!|d@_Cae3dLST~_}#_*I^@`!AWk zd%jZNW%YN!Zv>xAe@|ffT~>eX8#Y6G_++f8b4M7Q!R-J3dNBLH zp95z9_YVliVcTi+LV(}a{Bm>1{>{G%r2i4%%Ii)p@5}&SB&@$*W&h)S1L@ajdR6Hk z1HV7b2M-6|2rdRM0kgkp-5)Y_f)MT1cK$wY}a3ZLrxMUKDK<|Vtok+o<&Uh1O^ zW!>Lg*8TPRFKmV!_+HKAHXvRxkBkR)6w0 zHbbqK?e-(nm$y}ZP}b#lS^bu~ZTea8$@D||LV`x>yR1IPW4jbSS@Y}qkJc9wG*aJX z^*MgqH27rAuYR`tYoPD4`hR_A(^tVK)5q;?sqeD-n{h+?9(*$WCvEYizRT(t;)eQr z_+e^_5g&`9fdS$&RAxC=g6ll1sWl79{KT~?pt z8Ah+S`wy9ZOO++icUgUof7oQb^~v+KnmKU4BBv=Bbk_4e}p zHpe1K*W;BeFa7OR3k4|a`ns&`l?MOm4b~@Xe%;<~{!{ry@HfIIm(`yM|8w}{vieKl z{|=u_zfNHNUDowq4L@e1U4L>}{deHkgHNXa-`ejR_~*kXm(@Q4zZZORS^dffYy)M% zCzsW43jZefW_l|8hmnD{hQ$Lgiogb-?smJ z_`kp>m(_n9enq(v)Z?FA7XP2lKTV`O_x#gZ_*Cbg^{D@T)K6yp4FboX%ewtIe(i4f zWcn2YzRT)=hx+3;+4U#We>32_tUkxf9SomLe{R5cS^eIJY=$S{lj;Ar?LQp;Yw*eR z-TggTX1c8PPlEpid@}uO0?Y5R`X9nS0G~{Mdcb#C{i_e#3>9Cq?N6p33EOmKU4EC< z=lH}8;gjhf4b<`$8Cmw z@X7Q$2Yi>+=lIiE@X7Su`#W8Jm(}NZ)pOyK>0cbE-(~eVzV!?6$@KdMe3#Ydc-Zg5 zC)2++;Jd6o$It!+KAC>yfbX*U9B;eE>vsPk)9)VeT~?ptb6*diOg}N;yR1IP^L_w6 znSRTF@3Q(F|9c&LGW|&b-(~eVUU>B_cKylp7YBTo)#v!)SHUOKPYC!ftIzSspMp=O zpAqoMZ%Kar{F38geh%h%n7@EI9;PQBG-!T~hglQM@i5N@b3Dw>V2+2`7tHZ6hl4pD zW+9m4Vcsenhh^7jPJkB$_^|*#9pDWC*7o_Q`;T`ef2LFaXTqnt|0u=>NIl-P+n>z# zFF_f~$ue4Uqg-@p6%1=G+-wS^nd@}vv0pDfy`$TC@X$SaZ`bmE3 ziS>6`{dw@;g-@p6BjCHN{wMHH-)h^BO#i>#zwLwH1U{Mm!a)5lYyH!sHK&XN2%k*< zvViZh`kUboflsEN7w}zHze9}Xl+RJ&lj*zno5?cMW%c{QpA4T|RzC~=ZScuu_5THb z34C%{{k!3>hEJy7KhS-v8S|5Ny6`YQsy%jz${05C`3lj*zH8*P7=)&CTJ{M&Z_ zCDR`ssNZGvJ6F)0GR_`+GW{Gs^~CY#vigt0e-b{K{=R_kvikEYYEHQh!za_fIpDjj zey!6qr!3z)cKu6P<~5i9Cp1xl=1P`{%j&O(Uk^T6^Q#{({~GAW`(#;tQ%NWC93p%& z{Sup8>btCdNoAX134AjBWWV$i^}DS8pYZp?C)4j3@Lg8FO%=^4>$%OgADO{ScVreXj;{yze)J<4~7I9|TyJ=b!F(_DcRt$Nx+CRQEe`vA+55+Vv%K zegE6_>Jj+U;FIZB!ZIjpd%LXdy#oHd@X7SA4)`vsUj-emu7OXc|7^f_S^W+0-+@o2 zpB?aBR{xySHK%-T1fNX5U%+=+{Ymg+ci8qP(@zNaE~~!|eh>I$`tbqZW%ZB2p8}su ze|W%mS^cYOXij5ZflsDC)lWTfzHwRoFX4X;pG@Bid|u+R`aj_ZYmxVC`;qAn3Dobh z`rT@4PI2Lr>AUxL$uiSr^=HDr3O<>>`}u(SE~~!@ej$7^{p_$^0cG`FR=-s}O_BZ$ z;FEQ3bNP4gZ`F5M{Q~&U!Y9*jsf9~WR^Mgy7sG!CKAFCIeplaR^?NqZoO0fN-)=uL zefRpLzRT(_fS(GVOy9jesPD4+8{yvupG@DqKB!OrK=SMPK0aM@%Ji2|y7(ThI{?+g+erVU9On;2Nkf4z+zsp+x zmPR&1Q}|?^tL?Wz{xvA8@3Q(c8*7UE&K^El=c?b;CYSmytN&)4%`g-`nZDazTEENc ze+hpKd@}tDbm1f@tM9V&ktAB1& z%_;pv!za_fIpDjjehK`jkL>m*({CK`T~_}s_;K*b^sfu}E~}r|OmoWTZt%(Uy9Tab zE~|g*nbsc&pG?1YpnjLtUkpD3KAHZIfbX*Uhu{~%C)0QLw`7^=vih-SX-?^P9X`3N zena>R;FIag$8>&B*7{x6`oDu;0-sFZZ7=m*R{t3Mb@0jbs|4zIS^bJ>*KPPcRk9xALWtP{vYM7(t;$gJeRe+^IO^s9X_?oN7lJ|e*0Wy z3G`i7ztXwZ9{`_B-@PBw^>JDKj_^moC)2;mR$p4b%j(aAKOR1r{@Q@=vif~mX-?^9 z1U{MmvjN{__5X(NeP-LQl*QBbn-TC`R)6|=w*JQO$*liyz;{{w>vbZbD||A2_j-~n zGhJ3S1_O+wz$eqcFHpbB>OTNK3qF~?`~8*H@3Q*e!M_bYnZCQfsPD4+)!JxI`CJS> znf`D;^~C<`vikY(EAF)0k4*oPfbX*UCGcN`Po|$7@Lg8_Px!HNVCnrSnSOl0cUk?; zZ8fL-t_nVxetSRl#QM9eelGlKU)cJ|^t%Lnm;LpJ{{#FIF#QqwLV`xgGI3e`Di_!c z9lo^nlXb2hKTG6agR=TA`}M>B5`GDozPr5YyR80?$e+2()=#G2Q!AICtiH?Yw`;E{ z(*C=wPu97*{8{p^L0Ns5)xQV+`CnO|tohZyIPm_~W%YMls5#|#@bJm>-S@Lvzsu^^ z>7+U3Ip(iz{bc$De(H(kcUk>e@V|ghrth}5*6*_VTi|c}#@0`!zd2ApdAH>Ezn@Ll zoW}eHE&*5AZPV9*8-VwM&j;7U4%rRd96Siz37oB5NzOM@ZGATg$N4qe$*r0$?_c-h z{p*9|5}SVoIQB`)8^Lj4o%>Jkci)%%nNEGXg-`W)<(!Lb`KjO9_9W}v=JMYFWhm?R za9Ov|9HU4AnCJbfWSBVB%%wf+tl+YGJXlXb4H z{|5Qjpsc>j>i-763w*NXSAUxPYfx6-W%aMSL{nrOD)?lbtG?Vu`axNJm(?G5siw$v z2|iips{fQGN>EncW%c<$-8=Bf^y4Ip2KsS6Syn#|59IBEPp0p_ztQ?#R=)%M(D$;u z4wu!x9DW1%WcvN|g#?YXewVfWg_qe3t>BY&uD0LJ@~=TzeV5g*7q2ODKLwwxbJee| zi4v66cUk>&;pf07)5qnp)OT6^tGa4V=_d(3nf?Ml^+f$HtA7yw9q`HY>jZq4)vwr1 zbINnO@X7RZY;x)HyR80%?l!{?_+-(~d&C1_5$ulm8(Po|$3sNZGv?}I-aKAFCI|El%7to|nW*TW~%ckjQ|cUk>w z5;dpv`}w0?elmUc`m4Un>Mw@B06v-ib%FJFS^e5cnp1wK^OLQgOh4XFJ+c3~to~s5 zYv7aVyUTm3<)06K)?QmbnZDaz>XVmCe!ZXQiR=A3a5i`wcoO();W(^|AN_nXHwy42 z!g_zu3D^5x;Qrt%!P#ZJ9~dq9GoAV;3!mzKpmh&jb7Ovx^yc!CJZ#^IYnP^LE&w!DzALjJWp_BXl-%;zQL<3&H6&p*oM^_kDJMvLqFvYs01g86x# zehj4P{C-0(1Iqlq;%YEIe;W&C|DQL4`Tfd#Fh9?F1YE6|t$z)ezyE&=%;%AIfjJ)H zL2#oD){n>r(dFakU1xy#{rq`g_HVAAi)()V-f|Fl>@Hhg7MSVd;29|_LsGSK5mF!1GB&CkHPG}`4E`>A=i*&OWU_sGh1IvFn^za37Ee(91P~~ z|FXdxKVcG>_kT0N9G_t!nBzS>2WJ00TflstcPE(rYwiQHzn-WlyZr2*xF(q2*R%rj z`TA~Pex9BJu5y-L|4cBSFT4rN=LHvn`TXDG-~{a7uYlPf)u&+gPxuR%{S8E-?eg>c ziJD-J2hs+dfDd5$fv1A61+)LcX<+`|=3em2I3GO;-qp&k?~CAP^+YJ)4e;6)mOlb- zga0jf^SL(tFt`LK>~M@-A3h)07|id#E&}uWxKuEoN6ZED_eN8|d|vM!FrPnt0?hF@ zHiG$l+9zN>?{*l>@k(Q2?eg;btvX=7e{2Wd*we0WPjEEOFPY%evHiz^`F!UzFrRn5 z2h8W6o&j_G)s0~G$M!y${XHK5v;XC)73}h}|FWiFeqY)ie4vM2{(j(<;1OVczdIhx z@nmiRvwzD+!Tdh)c`(0U{s6qYudQz{_@jQ7qbl0v-88^*Bk-DmmOFx9A7r^VnEi`g z3BGc$O&O&c{7u2^ z-@QGU-$x{Y`F?&dnD5WWfH{87zrcL|Iv33T^Ou78`|+p2{5|sPVD^{)HMm2Joa7}O z1ZRPxD%thn@2SrKb3B@s;PH6F&$3~op{3=0;7iW2d<@*Zh2@G>?fRs)vRoJ3`CQ8_zB z`&&*1cft8+6nIpsP5&2oXo}^#!R>LrdKMgw^V1gaHu&FyZ$bV)z*F1U@?xvo<>h!M z4Z-~V)dgVwo+<(SXdmle3FhZ#W5LT3Z2BB9zppI;H$nYdz%6h*?FRGrtI?<1<>Pqm z4Z!=7Z229*bvs+`0lo|8j|}kdXut8`)B!gCY%s?oTLNZ({jUkjk!lZCQML#8rvU#I z;A%Ba_Rk4$Ps?(bX2Vd+a@T3Y;{pC5z%6U~<(KA92=LVbek{O;0vs=ISY>5P%bOkG zF9LjS?UVBt1^A@^*FEF^WA8lxn>d!oVY$*<=-rgiu_d`v-DF$1DV8x{ijd{AEi6k$ z#RUj0Kxm-^2rZ!|^xh%#7D@`egc4dv=)ESuH@kZ$o$e&r7y|G2|HOM2dHe3{?Ck99 z?2L8(7C1cE++GMLJ%baT$O$jxlwZjSZy@>2@ZHM^|3bp%_W$CfKjEa81VJtvKJ__a ze@CC!E6x59frZbHWQb;jNtTFP!ixPWTT_ z_zoxhgcE+n347GChF5t`xH>27#R)g#gvFe29pG>3!dDNz`tW(d*8skT@HK+3F?^rG zhwfyX!Pgu<#G|!@uN8c);q!*i2R z96kwrk?=*q7Y&~jzE1GPz!wW2;`!p?OMve)_!8lh!jGa__`1QD0$+Fd zdcfBczFzPt;Oh+^;ulllQ^A)89|d1Jd>Qa%!Uz9Cn!>LbK7aVa;ERAy2A>)}C%mlT zux)>a;RFWnc=^IdOa<1yvcC)<}wk0TK-{R?kU>7^*;S)a$aWizR4P<_PGQ zPD9|sbjGALhN|@{y)vBvpAMqvL8zIj3`ddCIwLe;?k>d0G$t4q6Qid9KvvTkj-w(q z>WoZdtWK9hH;QAWT7yw(=^KuVQ|81f3n+TdNofRQb~%||m&yzX7a}OY&O%}&`E;B~ zZ_w#2(2Af^O&L*?G2EorQ_L9R0cl8foD6UTvH)8sSh3v?5jM zw6Kb^<(U*kqavLWt4yUdbhjaIyeT`CK@pTAA+-;sGSWzhBCIA4!by6i)}S$|V6r2W z`m8V=jTjOw0#+noEl?FwKZ#a>LPq=Fo}+bAhkX)lH3w=_{Z{B_>v`&d{FXsXBVDq9`o}5>2+rw9%k~<%h^8ARtiq zFd!~zhA53LRcS8DOHPoJrnw7Os!i8fQVLWWij5zTn}#6*mZfnNnQAVELiDCW7oc|u zI;6JBnQNVx%Swgitp?!1!m{24P(83Ys$j4MXiWf~u=>KJaJD>L$dID}f|$muPNGrf z7^t))HAA)_He(j1BbxIc4$7{m}y>Y zx-^E4kOb0wONGWv_9{ntFsUItO_DAe*c6RrU?gw2Qlm*#sFl{uv zG!#?HKvRt!idf$qfC3p3 zE8dzaVWumI((9FKZP#uoBzGbJj-Ze=VkH8r59?IVbe16y28JJHGB9jBrYbZDnKXoc zp(+&|4wwUwIRysGRLOLNG-zQqZKt!T9a9@%rCh5{PiLl(i3i|e{DI|SnS(@FDrzGF zoB@+Wrg?l+Aw<#~1(z!vDzI!btjJg; zoVjSCilWT`WU7$@Bcjh`crM5irB~);!jXV=(uG)pH-N3FR-6H(Fmq=)JV7MJ4+hNU zky&pHcA}Y$1ZuI)&uk=?1idm>ZKTiG=2*`5Vvc7PC=dxW!<^RHn~%9jB4tqbgZ#0u ztus{9oS39GG9+7`2`3+fD0HQnCL_orv{tw;S7)0va9Uut06J?9rOaYe#w2AH%EI00 zI&0C&VQ&kawR(FrhE#3IV2j3BQu$PdmBynpmNY&paoc6n8cR7Ywdt%iSc9)~P8z@o zlM;keR>vlKPc=xj3^p(^G93t-(h^KG8OJ+gk`9q@I8G>1!~qH{p-KjJ0ac%r31WjZ zxiXzH7RX{$a-jkiXLzJpv9SZ5o7agB!QM$7&E!aiq6_RIBY2Z_277kdLADmH~K0RB9S;%X;7;a1}v43s^aAk zrvlI^;Dib2DOE`%5El%rDB`B!oCXn+K$R{Voy#TJ*)U9yzga323l)l7d>m0g&6EOi zX6v-l*i?~3g3^qcdR?AEg9oI5eNU&C0t_!wJ-YAV4=!d}szJu{4v_-S<-0`{RDK`eg77GVMAUk*gB}utxj>eLd94~@Zr^?S)rmAyAqCogtqcj*4Mi5#k z)F9!I*vN(!szGfhr>$nvG&0-?Z62Ce1vEhEjS9UHcm!C^{U|*MQcy3H3Yw5m3MyYk z(I-MW#Yp9=fzXmrDiUiefaIuv?vW@Ux*CN^OXcSPeL;r@5}ghQU4Csja5zxpk`pMC z6Vo0Pzyt#Qk&&OT$N{EPrv(abEKuYMQ7lN0RapvEW|ksdsYZmJ6$26oJ#N~lGr_V2 z=31GG*?feENGb>9Ri)8^07VUHX&Pl(8vey`D1vS~O{0S=3>0A~0GOrI>FFdkD?Bok zp|}xLy3(Wpz+{6I6k0RrG$tdZFk<-(jzfQ9VvFVzFy~fh`ga}E1pFoiVB55P=oH+m?*uWGSl+ge{R>OJU5}8F6C_tzH_-2VSP#RV- z1G^Zi$f^;DApJ5h%>kT^mQKJHgu9D=QFq}Nh&KM!G6`BHMX$;PutFC2zd(`8RGC(w zNrPBZsscF5G&DPk6j1=aL`v&pG8pMoRk~bZ`5&5JSQFX|z&1cI^QyvS15sIe|0abo zo{Rl?@tEaBXoSj%MJSyVpe5(%D8WlZ*E(8LjyWx!>`1=ZAhhPwf+FtD5}8PdnnygC z!U)y)Y2dUc1?qwJaz6#C*)K<_)=LpZkq1FE{Ch8(Vz>xZ9;`KKG&x4#A)sD*6OI*$ zP=A1rM!b?NS4Iz2w#O<0w*t(hXamCBpL)8G^KQZ0|;{?m5DKoF_TUU(^Wcs8X7%D zbIdEr#R#?xWMf4^Xj&{qfY(zKy2(p|0|6vqeBq@*v2^>zAPJVFBE?oQfV<5kXbqAO zS%YH1yiVpqS7d56-5X9ily#U6z0HL_$I#od03wd63%ECP-PAvVESnqij80~PX61zLb)O$GvjVBQ#3roTc8 zX@D?+Y2-2wp(UWR6;_5SWVzM|`M*9IzjPqQXy61ayrm6ewmVK(eTgwige#*@ECg_P z?%3yqBC}W$l?HKWK==qFMX&2vJBJf{X9!>zElG&){GZ1vF+iTm1|g7&0xnA37w9P3 z(v|uQ*c$>Bof2aZTGIOhplL8dMKotpykqcbav>9!O6D#iCjmHEHU<4(M_5D@5Y8&7 zzHog(FgFpSC_Tptv_atGtrRUrlE&aQuvR!-Dvt#Knz5H`?Emvfg3wq6H+M$8No6GC zu#XrDk&s3t*z7SmwMDA{tHc0N^UkWk)D5Z!VFDp~pAk%xAXNFkg((0nP*Oo>9gGr6 zBO%#5TyTIrfFpn@@PF14aST^X`#7x7d)l`UIy;`P0NA7=$b2z;4U3Zl8ME4`NHrm` zzf|mJ%}K~jspuLIG%OOK4K|yEj<*sJ*koq|dkS!ficJU$jfGDa8yN+z<`fjAO|ik1niVA zeDHP(7IEBmN*8I!c!3dFHD}aTy(XtoMy4HQQip-8f=ZK-1!}82!t+=WKKwGpm~)%s zLh-g1hy8B8<0wUWLiTyqlnL0SAg15>E$mvTras_QU@(^&ef2=}5$$jGXPKIsxfr>nr@g*;e+k({E%Y~bV0 zGxzf5nT{0)z-6LY7n0k1v5;NDs{3qMN9fqu$SK^?In;TpbeusHi04^qNC2!MOBe?3 zc=ftG9zP-kAs7B~(Cz_>Pf!5gzN2eLLLo4olC@1(CsKqbHnByo?D1Mb41kNl zX8GfmnSyu)GYp=>5qpOhA}-5hH^89`*fqH?&9N1|E{uaQprpi9Wv&T?d7#$`f3%Hhy1uQY^4Yw5ExJT5VmFuutVk(L>S)Q9O|^Q(ck{YL~^J zD`h4M&hmD;Ew8>XjA`Z+q;-pAQ@~Xbrb2|*C)Rk4 zg|1=gfC%q^M7;?rq%-1*(4zzLlmPbr7!_#(<6|U+*g!^O9_j5OU3$m^8woQ==JqEZ zm}1UFJ=_#P9RKb~#2aut2%n|&wHw}0XxSirvxLPv#S(4f%RPL}Ct)c^U|~0&M!aW- zqD$DMSUKj%$VDLl7b37m28n=66%;{pZ5Y2H5B;i%C^?bhegG!m6pab;u1I;D0TUlI zwjjd;Odm}jtX4&)FF^yWe&?jfpm(g5U@#I5p~{kUQ15%Fk;ZxkAu_EcTA8#w%f|HD z$ce6a;F<_)Sb;{7jY97QCy=(9ArG#kbS9%h1$wEVI;f|GbrJxH0^P-0N$>!d67j_i zt4q90#qS%m3AfP%VTtrF$Vv*z?aupYDMCzhnAXcq4Yjjml4_Vij)0SyYtAKa8at=R zUk*wJ=64&EUKEr8hwdEwni1)2fa0e?B8$ug{XlfGmc^u@+huEkXXm6?I;*!T2NXE? zm(L>q{2Wa-l0D;xj`)_J)p_fCXCfD6o-1&K5#-p$B*NhfJzO&%V69U*2LtO)qXouP zLu9n%h8!MQgkp6d^2S9^2nRm+M}l?@Nki0}(U;_nRwO3J6>_Sxo+bbx3;aYxfk-^) zccLvJRFzK3B07!$87uNd@sUbeBJr;KBdiXxh2Z^*)iSM*ZrwVW305xaWDZR!eB9Pl zUW6A9J;DSnEe3km5fU*Bkp+?+mF_g2$XJm-twqeVN4O9S4w7P?16+V$6l^f)oR4G| zAcw?@gH;Yv;f)6DzN{2d4zU58as;0k_JLiFg=wTB^aj+-4v5A0IWF(1E-n=>3X+>! zV%9T|DBMZgi6RGyW|Cv8T87Gq@b(PLMS`?qN#`*igPtDXI2wmVSU6;kh35ziAA@)5 zSX~AgZWpCq3*?3_MOGtO{lEi|EC$?+Sy+i*_;S*4opiDANc+XC(?}ns2J_^zrWeV| z5Vt_{4x|fsOynsC-3FsjMba7I&`+h9L^gJQW}-|KyevYps{$DTClf?#pBxGh+?ZG! znds9!lLNhB68Y01=HZ8g$N|Xy@t(9hv0|q@%xeDwwE~tZwX|@0V8%0=B@dvP3J~fF}U)4E0=q>Sc?6m}4}3d~Ie35v|>PFBR}RPpy@*5>c8Lgo#uw`E{OK(A7Y_!8h- zu(nL`+rmtY4F5M5v=IQ#)=DMsp#{*cv#nVIDz|7PzVCl1eaKKOqao8yH|Y0YHfX0! z|Npp6ZnL5w<^mo#2n=S$e*kA|lp#PC1C)XNg0qjgWwjP*d7+1m?;i@OR#n z>cOTQ45w&Z!t@0uh`Ee1Yp?@uj>ofpx=Z4YRpZ?sY$-TUnfHXp+b0MG>1v z>1k~NGG`1}WFjmIz;Ddpw!ks>980s$=zTP1RFZV$={T9gPa_lS9CdK+wwbWzDVaw{2>fiVy`~%texk1P0oc2&^Q9y5FoET9pugc$6Ez)-JBB7z}qWrZ<@FPNJ=_D8hLH0R7 zc9TvxF}y4-u|--*wwt$7iHYY)tIYxgTRIN5Yvdst4_R!Nd#5W}3#{k~Ed*cfbfK`t zM+?S4p9m}}z?0K3Y(bHbe;yrK=u2v4n+6?pDY)#BpRfeOvGW~#F%1u81EQ> z&Qq9ArJn_%V*zF;%}h-Uu(jl-gvYz$#?bYJuYoeciv-*%e({H%pFxOy_QEgHAktSM z#hfubI(GJY61p!Y&V3|71s zFc?zk35-+$|7Q&h$=C3cA+X$tY`H4HiY%z4lD4D{-_ztKDXc9yFhD8__#M8I6QNgf zL~v#%nh5gDdmlCPh#B(Oc+*HvA3SO->}_08diu_w$LNNsFinUV(bZdED>~6*LnsRJ z5=@GrlWphOTTzBZ+f@Ouika7B_(7WGEqGzTWnmGzt-x5M#}>hgi8mi@adCkQl*k@v zKUN=$FkQj6)&fl=VJ)zxi&?1r!O)mf6kh86>}l`3x(K6XA#8k!P-mkWUdw?YY`a<> z_|%R~1oAjWE6W1(!o~a_qWgr4m=d6$@!8Aj__~)t z(L%uNU>AqS5Jg0K)P~)8DFXizXkpw~JPcB~LXYvym%X;wHhBMShleR-;DyrzHGgNs zAhAsf3Te*KcCCiZ8lk)yRpAf*R_&lWh3(RX^zB_q2*MM@8igX05o{{Sm>?mluMX%# zxLAtD4Etyv*k8mus8mLj!z4)vIf5x{s9d2=mv&Vu4SIa5X;6UH8CZ&f_hETp?1;7T zBI^|Xps8r040=(38Zt6Z#gXM*q%?p*%&(gAc|60E1-O)v$V9E^$7AwlteMzG~# zwFeY=bbP5hbMwS3Qq&u33m<68{=+5pu2XJihocqpXf)^iU4y2p%$^|%0)1$Z6e&!` zbVZQDr~^wB@2c_zH!nhk6f6h9O&XZ+!NLM$%7;BooLe$vX2@Fk85d+9Z%_>Z4F682 zD!|6CGE5228jFB_Ni6L1g^PcUIu#HV8G%CM2Q^CroI!|LF&56E;~I@`5?}|(4W=|* z3VQ>8anSOQcrgAWmBm0O;j{<;M~lx2&@j&c=^%T6E+RCL(k%cQYmO5`i?Fd`wR_fT ze@8&0LBQMue*j2ZsDq?%NXrm9K+hs*Rd^niE8e*IW(K3e!)fbq3NXyCq5K5gm_S~P zh!+#YiwWk%h=lwoeoZ1VKbJ2*ir-C8nBNI8zeO>> zdS5;yeEHS;@~ijdkI|1`m!FM-`~ms%`xU_N1X#r5qDTP0U?6`U1Nn6Y^6LuZcQuG# zJ->D_f7JY%YygYjDL)&z_&xCF=kn)cQXn77f&7k&`Ct(9N9fDPBwv1uzKA#`$;tfz zTThdY$BGe5Jc+Z%>Z4T9m(HSz{$%s*^{*a6>|YN^DvL7>~xL z?~xjG7&6V70k54{o4x%&NmLR$ss-t054l%qQv$@HconAnjup2aLai z2osoEfs+?xuXv;C<@2;iVScPLU#`aaB>5dy@6rWDwL{p8YAew`DQSUnoElOGmsY~ z1XIQdkRm08e+MY>1>;A!t>6q$ia?h`X2622c;&(NHY3Pb8Q^jZ)%S%*tR|89Xy$N_MThugU#v&6#W#-Y6Pg3&&4^DagHKnq?7V@B z_#jk9PlbIVz(fx+>#X+yT5SaJNwxtkCwLs|4XYDJu=2 zjR{t?s%1-`T#*mCz#t0;y&R*-wcz9QCL3tg$7z`y^FLDKS}Ko)ft;gh5pBfUv5ow3 zpb2kMu-Js)Rk+fIA5*Edrz*79|DQJDjHnoTKS_@4==E+$+ zt0VjNAE&nlV;Z@vqkC!XqswVuA31~It4g3q&B{{5lzIy}cnR1QAMb-49~ zn)xQDcsD(WB}exy8fC!;yGCHzqwf*Sk`LC+Am$v%9RTx`kUWqix3sLBZ~N}gUIm=@ zb2c6v+AGO@_(x7TjJsX-edk+`%KAAXs+a*5@17KS3NMBU<08LI#sJ~AN&~-e*f}cg z7=GL)@gQtFw*xld#0UY+QDHh0+!&>oDY%lp z)4opZ5^?*}Y|B>)LLsSvhKd&Sg0#s0u5AnV4r(qcg>z5^&%B4(CL!WEh|(@nrof`q zw_L?e2P*I1fr?`d04u!;mNi?XR*~X#yh6+alRXAO6+|i+u9E22*`*ZN*aFv| ziiE|-pt>vC2R2du?rr7UQJpSL}lA~VExigV~4>J97?@y1LB8gz^WjOJZ~ zM1k%YxVWa-AVtc1_xVDe={b@bqm6>=3!WvleVbz$&xVMNd9Zh`D#Y@Ky<){NQDe6* z+}%RV0@)Z6j^dtNXx6hRAaPW_5U@BZS{%?gtPdx?J$US#Yl;FHJ4Fitik(u$frq`S ziU|t)oD&ZkI4dI!L57v=mnBQ|?I*^5jfDW%e!(KZ7=w-(7!mW>Ca#5p#CEyjg2Q%g zg@D3#A;)0g%4L1|Z!i9bU$`LFugDJ*SfV=+U0Q19zPPFL)ac1@I?QAa|rZ-FXI&|q~3%T-WdgJMpdu)I@T;(xYo9f1K97_ z->VueP#5wV17wR%|3F1s{AZF5Cy*F)*9W$; zwFZqz1@A^8l=`eN9dj`NX>yikKFZ5HIHN@ZkszgwP-jzG16+a7-H4-<2Iw(ek|l9N z{-geT@Uj|Yztmwi5@d9PWm3q786qa<$8fF1d-nN}UWlUUmC}zSKiHx$H)w0#WN+bS z4E3JebTL)Z$WCs$ERi7Y#BvlSh9lc2nzl?L=l~Si9~m2du(p}o8P*n6?A?ZMg@x%L zOca+=@*m~H3qAaLhW!W@^)?zFgnqD@#*NXW54nj@D>ZOiOP&hSR79R>GJ-dFtyLtp zfR4xz+(Drm7I4j|iQOG|~tp5GY^ zGQ@A|ErUXjm@Ogf%>#$8@=^U} zH!}bIF3M`o7B#l^sbjsRVyl~G1AH|1&upp=w%@`XCce{2!p@UNObtJtA4UXcg6hme zX=YDydS=AWA325<@SQvH_5=GW+dc?RDV}FWGzr)NBTxtW^*WgiWE=%i2I6s++X zBdQe5AzezRm&(ip%c>FNi^-f~({ByVfK(yuI)X%vfes7y31z07_DXzo?~tgsFnidK zBtwTS1o(aWjKnib_%;F@OEUyaq1LV<&6*zA`=oW6EjN;=en6VI0%-)Z;g}d#p_Wq_ zT%|ItqXHJJ2rEFoCozU$5hLP7ti4fk^UKv4aM23KD>KHBnk`6V<+l)dJ}!%}^IH3q7QHven;(atR4B-+Umq}cgLEy;{zI+g#9T1F z7a5#wTmMd1pxB6`c{<2N3AR>AyqY>)fjV7*>hx*Erycu}g*gNiPQ!{J{r+z!-Fylq$k%RY~3|0%b!Fh zPsDgkB_GgL@Vm3@;3@^4C#sDKu)hd~=B3=p=6aLG&Tkw(iA7*QYnZ!fi1_s1mhEIe zjM@K%JxVl<@yc9v2G;)lU>69iCM~j)NVVQzgp^RV`Lfg)57(#cC`46Q`4ZBR?Ja`! zC<)osB-yzs>`IWx88>4&bz}AI$T+zK%-@0+6;dPQqaTh^X>=O>d^ z5j&+&ioH@$BU6o~S5UxVWUSH{%e(=?REx=N?thd_&T7&EENIR;3E!g=5&Q?k0=hX{ zn+@zO|6?w=(Mo~&z~)k!jfu6X6;D0Jo=_V#2GCJasJT!hw3nmP!+R=DJkkfSJYK{& zZ0Q=x3)2k3D<%%TETc6ELREcDYCT-p5j()L4+Rlo~ESF-G7P5jyBKRl2;+`S-#yM_%(3Lkl9^0+3Jw}CX~@w%h94;vt4w9KSI7v~*85N@de4S% zXKfBAMh<#?6gVwHJ`reaM*B5v^qJ9Mp&T3JhudUkKv>ZQ8|P~RuAWKB5aWOITQ3XLWc)qrEP;|7C{w;jc>gy*;r$i<;r5x z)6>;*ESvPjuU{+~xe7WsH_1v~#6VV_BSBm1r;w4o^BOGtX_3RFf)fjQZ^e7R<*>%W zJeb?0GKD~iH%QzA>z7xBRAHf2XvOn}R7h#Zub_}n>g}s61oYhfnZIA!a+$>6#cjDv z0!cvOJ~|LF0rI1QD`6laA8dzYHEB82OTamXfl324Ez6a6c!5eou{Dty8gFqe!jL0E z8OergNhPt243-;jc@Az#vD9a0+rU)BlAqqDi%bS>7cUZxuwB&FR*1v_8g)h{9Qt)R z%!sfq0QgbFL=$6XgwB%7GAHRo!3L96OKg!Sq3s@Wc2b&&ury7!9)CG@bdsu6Wg#5U zb3D(#!->Ea&9>cB9ueXZ5!>ZR3x&{F8wAaEZH3S=+l3sHFD|9AWhO5GD28QHuq->4 z?|}x93~L|4A4W&f(xxpbkX>y<)Lpqc+XS94C`QkgCJH%}GK>A{ftHpd8&%-hDvPE< zbS&{+gw=FuN<$P*Njxo0z$*)LEfKmz3hD<3O0?S}ngJxrIkY!TQW0=+$!fjPq|`vm zur^eBb&f?;1F7-?aKx0&=nwrTs*wmv&=L$U-9Q?mW58Dzu%=*&oh7$NNs@e{Ua2xh zsx?$7Xue_HCTX# zV+aMYFKo8Id34nU@vL_!v?E;X-W1-X#DgDesih4y?F*FFszo40!?U``VK9=)P=i$` z*rmv$G_!N-_ty#R;~IGZM*X0hm1xsGl0|$2Ibo4YBf2+MyVA!|ThhRx(6aF9ev#FW z4k`4)r{fdA6)_D?n*qe&FQ+|ZHahz3VK>nZ-vklJdtEvym0H?&=PT49$-#|JXC z8kh%!El7hMS*}MEg2c#`xs)ZwJf?Tp*9qSLCkkO4=EJ^g=eL**KcEHZAFOsecC5t; zc@WDwF(MwZsUlnis05_JpALMyLk3J;SQsM`B9F!3dQP34BPDvR^n8VfDUicpHf6%M zlQx90_D64%<{?tbshLn$2SZnbzhg{pSuW!PV93aivcn;Rr({$)YsgG**<=`vjMF7N zSVzDFYLD{Rs2NQl-@!MJ?7nw6ysKeqv!8FNLM~;iYas{hMlhub=KJBAM@1>%nuF3K z=ZTcwD8=UBX{dth!Zef(d}k9g*SSdw*uiW7sVLwV`zsU_xWtC*D}_m`2A7kHEUG}E z)MwxwxKkq9bIFQf?)VfUD1-Z|hAtu{QM6avuvkw|UlB~!7p14~40=2cNg~hT^xI&o z2-FQ=%mxNngiFazj7ci)1o-3X(9#f#Xt07n6OoIe0+%)Oh!EqM(PK@MV&ct5TU=b= z0wuBs+K<)8B1~7Xt+hZCNmvW4>0&UCKbQ}`r@iy)!Ww0;x){R7e>!V9KBC9z+~Y9c zUVyFZEE^Y9Hlp~do3=en16#-U%*^(Z`yL&=B94qcbb5c7$NB6QZ5`NUB79B;`BEyl zxdI$yGa@VnK{KC-w^zh(kOLY%IPAwev9u4t5^cOSp!SvA$PS$bC z3@x|?Qza|)YL+HQ1eKAbH^E~d_=Cy9jLIB=Q&BbxYft>}a>Jp90xh{nBE#kT4-dpy z!owu8TzD)?w*;4BjFVw}cId3t!0Exd30;;c$D9d}!d?R+f7%H<^S(&}J`BxB#L&D# z@W=sM2#(c?NJSk^WDywRK+8#h#T5GiQyhp;(m@}QmlHcoaUlaQe1lQ*SuG3_>%HZj z4|PSHC`SyW8rVlf6wvCYi+k;@u( z^TbW0v~UU93NeH`wDJ^>bs8FX%yDF6iJvs-d4GP#HM1czM zB%G(zr?FVUP{2EXxIh5U@On`I%7}PHy$O`2pcX0Aj6uxsj`}Um}gn?16s5~9*yRl&&RNLaV{6b z=RCwV?h3J8kR-W10*Wv#DcNDF)KO||ksZn-`#o^#!yc_a3{%2x5i=!VbO)O~QkabC ziXeqirw|1s#=Mh=T>{EvLWLAq8WH>#ksn|v;1_lc#}_3$^W_X|@UvmteL{?rNTdQ^ zvCLw_EwcF{)N}xIlBZJ@pi80*Lx=bxEc+zZs`m{-;-plVE!vZ_B7-s-Kqx?b>al1A z65P=1TmlC}@=!pUE``%RpD58n?|6B*LMn@aPJ-MA{*O@6YKCBa!4w7Ao1r2?gPtL9 zpbaymqGt$xt@d?}mTnQNHUkSp+RkcjYIwmHGcu?-^+_-cM1feb`a%GN4J7sSAoDIRv@Sde|lCF zxS*8s0?3Qvy#%fv0um>f1_{04gLpw3f!mB#Ra^vR;cw<2#r(nhbs21lDvKMyD)WL^ zS+rk#q$F4zAy~M$W!KX`m1>^!nP}be(v8;rR3o~!rI6*XH&^~Rd)AbmhAoYR-=c*zi8PrymHgUZz}o@@eX*IJgrl& zsSP3u4s09q{fO#KQd))Fo}ak&af6NW-lxtU5=M8F`ea{kUE;xo$fc_T6RzDWy)3n7 zZm9d4TNgiB+~!*E?KKyStbTdYC#t6x&M!UoEb-;*WqsopOZ5lVlsbRw_s`B5LX5tV zCmwt6pWos^PP?qZzphzRw(2hox3I z>e{X{>7|5QWc6fw8oxH|QGVNEozi#Y<_cHJt=PD1K<(g&%aWOG7EYMydrhZ{NFUd_ z|Cw_0+)Moa#Z14wD=salr`l6Z-s;$|nTv+$ZiLh-`Nua)OrOk}bFYDMX1zvV=Ra@W zu++4p=z_0y8;_L_)glmMy&?pULWm0GGpOCJ-bi% zS=%~w@~?T1WWwZ%wY!!pH)h8AR&y5Y^X(t{z$NoW%VpI~FAi%D{`pKf!c;zfYv*t3 zf74&EvSs(B%|l*K-}@#!ez$$JaM#j%=(h}vDHpH#3A{a%LDL=k%{lI4Gikhy&OG^HH zRwJd$gL!vmUJTp*WS{HoJ0;3|y0mSF)fsmyZs>RJ+f`#LcY9u|%Za$HUp#K4Iui8r z=dOzmO&a4p_0AVpK95*{LE>G)h9o235jHllWIJG0-LC8042mD!O zQAWpaMy$^}u&nvzC(689s?f_J2uUgJ2`>e<9YNw-rJ}Hsq zw3VHhxc{4p_YQsbN9XmAA1;~RYW(ad8RiO zN>eKK$ez~n%ihi7zY}(TadxN6rD?i|AHGkGA6MyVyQ9DCuD5#Y^O?6cMXTB#Un86v zIXP;0xc|e`r3dE^2%TOgbjzCM-^TvBD|q{?otN}=)`YFODXexOd+@W9F{eJC8C0?N zmvx#{>-39X{4C|4*=~|HwQq+;U0=W8!pw0`zG<~w_@w!ZHOW55hmGpip-(&YP1pNw z;kRzI(%uPM+R#vcvhVh84gVNGR$9X9eftUOM>C(@S6V8MM5Mm+`^T zJvCbugnl-z#k^O4Kdtk_r`cNhFV|C-4_daSt8V{|^quafj~>l(P3Y?JX27}u{f7U( zZA|p2RtuLd8r8HQbaK5XXLe5>KQZgR%k8lVSqq=tP2bl0#i9Oly1h8my@O!g=_B>8 zHYg*lb9i=}yY+oduYN7p@!5sR*|QcNE4MVGZ|v5j1%CZ6U2PkDeYomp!_WSoe7+>% zpWWx&SFDkYzAK1*L|q9`#*FxKoaT;Lu*)O$7}{rM^JR}KHxIbO4BeuwNq7Y^K;<*Bb58&bsEm1zS5;)}_wa*ucB`y!(4L{y4&Ydc^i_1AhJ^^rzc1 z_C=OZU7cOfeAxL*DSK5}BU9!`4>#Mf;(q0}BlrFCqRjB|$HsZ?OFGib#kg$lt^DnZ ze$C?i4;@{2IAf|$_7&ff_d33;bz@qOh_CPdb-m%LYg?xqyC0ajX~dn)=_%7s)*d)v z>EMHP*YDZcFK0!{`a`0~z%x@?$Ll`r*6e!YAF6w5W(;sWx?tw@=7Zvs-WYn1ocXxT zCjg%00Y!>Q?}KB~dR{)5@UrX|L*`GsezW`8?xPLQC;5c_wdG;E zh4Z4GG*Lut5(^^o-Rmvg_37azHCq3?u(6k^S5~d$D*Id}mq}V>45*nOS7QH(1>*eYfF`H!Tw(A>AIySrX z5&y^uzDr{6#hh;WY@SZ|?Tg{-eZ(y?;;(2!vg`d-dD1sgqq35!KX26U_O1qXUFEWn>E}Jy`^NZwxA~~sj6xDzH|Bhf~FJfIsM(1 z*nj`Jd3S7dR=eT1c5S-(U5(Z1>zz;fl{wU~PF%Y^Z&v$7{X5l5-mr(qrB{jCjx}Gc z+Hm%Ea)@`Ddfkuf+U~vDGrsS()sMGb8nkz;|59Do7t3!av_14ZXZYx_LGFG1XSDxn z*Y1b;OMZH^AfbAfVOe!=z5M1$KkDG|17VLldv?zpe&Si*@!xMbQ@TgZyqx3<5$A&% zwV3MdelO2!>$D2~{@Y#+5hn&LJKjw;b$YTV|6Y5GjcKd#1^V1uqABkxo`QrKX^@mR!zvVqDWzLWz4N_93 zFInliJlSi?)V>1-HEOS1_A+5s$`^GWpZlWOB-5JAt0mTdzcS?W#}SPNYdpXHNiySy zAZhZ9pL1g>WeHx-37#C$!o73Ui86PEfA}o>yM0IZ(Z3HIcx%}9;64!J1duZCY0sEe2oziz2Ug_KJGY&@XJTIvg=Wm#)P8xG3MET;U z(?ehG8kO~^RnvtHC-!Kz(D&Cx1HKV7j@ehb=dfeCqoG}g4Zm>h+$Ze@Q&n#b`Ke$; zt239hhi0_CT>eJYUDv;_?74q(smAl?zG(LQtMa>QOX^jc^I}cq?I-#)=<;L7mOn0d z)?h)uS^?)nI^Wy4>dn==<#PS^j(1m!%6{8>+MIr`E|s16soyJuPyfrO+BY*^xqJWD znMV$G{ITsS^R<+}1m4s`f4yT;o3e~*gVak^B=Yj2XLHLv>Dt+Q%(d?j_0F^5kbsWkLpe1!+e#v^A-#-!)ZTe@uFm1D7Ac01_m<|1&JKV*S$ z$b4a4n4-Gn-K)7*=~Dg9yx-0bm^QcKrGK}7*}B!ktJRZ)6;N_z7ne8g9zr+x5!Oc$ zjofPps|~Kw@`yTWa&D>DkF&n=4q5OlDsE88UP5n_p}u=l;itkza~jO4Kca4?(U{Z5 z$48~tcq5UK6*eSZ-^3>NBJwD7Tf`;M+hr=vbb$`kbSVH5|A6F(nSy!Y|NT_ ze*gF516zz;Teoz?)+wz9ZSA&cnev|!6TTL2KCz?iE?ID&2;;ol-RtN4x#U8OrcR^2 ztrbW2P1=5U=I9)1=y%nw)~Z;2RO>~*yegaDRa&;$Am6)!ezn)-F59sF$Amu?)&A~4 z&8eNrBxm^S?yzC)-Y?qR&&xLM^=|ap-5Ec)>3To@A$p>zJo2lJ~aqXdziy=4{Mj*9v~iM*gJi zJSyT~Q$vZnL;s9_k^^+$N8wPn`GgL*xUym7@!<%7FhJ-h_7{u%guVel0DS#{00h&) z4?=_rTj|#(E-qDn;<iD40Mblm!J(T`!##HTAckSe7Prse@n{3OjuCk2rCD(a9JG`uwmo8^R zM;GDPjp4sl_^$nIT)kjVIfcJC|B* z>HNN5N69QETQW9E(t;$6}?@X#R4;SH(hr$+~C0lyBczBd>b*WYlQ3eB$hP=Ey7HPmlLZ$Q( z4%uVQ>?$0xq1KSK@KiyKlmWeTS}$X!+Tf)!?^={sYJrzhTi}(W)EnV1g8|HZ8oZP$ z6_sNoWzwMxg+8qpY6JESvC~Vrg^~~Vj9?mhnqw%UAh+-M{i}- zP>v4DqQ)SnxqZm(m4n_NsG)mMCp?b;Q|Jb7&eFu>t4F}}*w*0_~*WpF}o2&yRZhs#9 z#TdEQ@u0n{cg#pAo%N>Wzugvklp0VyB)L*Oc~)-dZx?UP_jw`j(>-mc$~W&>n-Z;(Z~b1OLHXae7-}Z0KN~P;*O#5o zE}Xtu9QMzdlYM6moSV3@_O?l3jX!DeQ-!)4;=b*rIuJ9sx@^hllfPg4_eiM{fvZfW z2Ew5pfRXO0G#gVXZQ~ysF8MrVg9@=RACZMX+)bb`NE9p-`Um(2BJM^k3=#|Jpm4}c zQ7vH&&(fv7ZZc}p!&Yf7E@eww1UsS-VFy?U?rvoRtymw#LD3vm8?RVpHdx@%d%<&3 zu-K)_^lE0QpgF^{m9eU}rm#AywshHw+`?82A1ph^4A9Zp6;$dClQ*eupVj_7ukMgh z;qsO9Gw)Q}x@*Ix>&8Fibvm{lt6e*P|1Y|ulTWXhwQ7Hfr4vRkC^$B7OXzP8Ry{30 ze&WN=C$w3gvFzHLhnRZGOH}_m$*Llx8o9x%u2<$tqa=A6eW;0wKPCn3X zYM)uXwk5ypm#ey5#^ukut6a}l8NJSb#0GWjxhnC?y!IcNGQ~aV)qocJMi_H%UR&6_ z{ki0hxjqwK?d`bk+>&4J9?kgXLG&c8@4g?`y8P6%WZ1#R!=#d#&HOTZo%zMkuOK^| zA&Zv*QWs#VXp-dO;*Mt6n+XeDMl__E7oEzG!y-{A*gB2MRi_C>EEej*&)4QY@)S|W zdv@8`G^vVW)>I~W5{@%%D{L0@wv-@z+lU$#Ki8obgea>$PuNp4cbn=tlHy8Dt zvMX_Fxfc~PfBht@<-|^-p46PXM9?&>{9jiVR9s^0+WMb{a@`ogsjR)~Z~8~C2u#Tv zy6C4SscVnj2n~ro`E#|@tMgNiJi4}i&hnNgR_KB}Z}j;@w=lC@?G0-$hnSl7c-Sd0 zEAeF9^43pZl@blDvRpW{%3@c9T*E&im31x2ru?jv@0_8op8|Dd&a|c6L}ko@5-!3z z=0GVAQ3XtzeT9C&d;0qcQ-nU2RCiHBcdxFKzPqzz_ul4N^~Y@5-(~B{)4kh;k9~6O z2e+-u!(4ktM+m#q1ypIJTt)G)oIP5WcXO@fUZq-%^`l2D*uP-W@qDE)=jFp+*L^!t z*qU`lclVlcVD+aj zynXtfNbgVm2T%Sac)+ylgO06SI7mC(Fx~xL`)c>A%)D6fR8^P8`%1*DyWb)9s~v50 z>yLJ5_uG_5rSg6sK465*d;Q!NC+@6ToVi+jIP3FMxBsa5MQE=}p9Rz%UM2S5^UY^3 zc-T5SHY;V)jEOE?Pd=C({Ibe{6U(o+dHF)R*(0y?@S&mu64&(V<4+x`RHvCX#jA0^ zIp0BFt-37TI^?{#<&qt5MtJP%-z|6G;0;Sp?NC+Uw&?Dif3_a%*{O$n-L%R5$GNoM zT((`cft!9!ZxgV|APlT~aB!3^YVYHX3$}&lmDrv)VfE=(BkorUEAzMKk7u84>oa#~ z#ovTOD<1YNLra88Rdg*c8d`A+L~bxI4Ujqwt+)`P=DWJU>H=vIL3-f2`msv7xX;OQ zR|_+MRCs!{aC7(Yg#FH1O6BgQkKU2Cz-5lA`iTRsV~-B6+M?a=+}b@(?rqsg_+#BR zck^6Jru%L^w`$IhJ8M(`iIG^yTC8y7cX2IQ;n(0vE&moym@~B85#SA7;b?o4<_&dU z&HiNXqX`2!Gc6n-LK`*av6>>bit<7a^nvfr&iMcmCSVU?9AdGb*cT4HzJxvW69(d- zI7JvLsw=EbdRN8LFXTP}WMFZjB8I&yU3?+dfwj$LzQGTrOExEep})JoN%bp!wY=N9 zli7nGH2rLLCC@E8Rz~>UIHZrdc=g=g)#VJ|Uyqygyw{7ZM?z|KRID$()A%|?c3|}y z<3Hl$Qva+omaE(#e$m}E>oj6Xbj87b%7;BVRQfb0`|E#p2h{dBRpr|uk$qB^E!;9E zYG20W-%mF3P<9%<>brf_x10@GpCp)|>%74*r`EFvEqC9pHL3DnW!BG3`Pz8Z%lGWP z$}eVY@7etCCY@q#?{C=dtFgP9)EpgLW0AWqt4V(P996wZ{hww~(X*7nYZ)GH7m(O( z4wx*zUp|fh_^?dRB1brrHl?Mq)^DRa=9k(R*UEG0sBTk^Sj!=Rp|h4=;}ddP`%Tw^ z26oHsTI0rIzXJzG)#~;9nIOEvCkel`zZ2dn==GR$$_-`ilx}ycE3&$k5kCt^iBQLf7$cuxodw2fC@LjK&4=4Cf{>A^{ zHP=Y>i(1O+9($gb`d)k^a7%~37>`pkIa zYKaZ4^k1u{oV{52t5+NSlf!~^)9>6%mBtQ}w(y$i@!i-z+vk_6d9BORh9x}ubu^5f zx=6KZ#UD4bdN#jzHTBV;{R7{$_}lbdT58<#nl&q42tRpb*SF`djUOK9@o2}|CmW8R zRkzuxRqv&yeINYL8&1b1K+u1Wrh=cxc2UiKbbliUR3AjfMg;wSLVqOg_wyryeoOEp zQ{uvoy2tZs%zZY!Vn&Z+-m^B1Z@sCJ}*6bQ;mNOAwJvoo{{Zqdf@dYznnSc zD!1EKGJeJ+U2x#9{t)$o#rt;^3w1Ad#M`r_E($# ziE^Fyll!B}jXmG~spoIH5ue7E+FkoV`TUVz?P|DbOM}WY58WL->q7tTZ|2`PI)BK( z*Ke+mm0oLG`bEVBdfy*g?d_DJFC8p1UTCH*Pz+qSsLF52Ym+rU+_=AY#fzI><7)f_ z_ev$>Ml}g5==HSsRY}*m|9mFx^>wGX&G$|i*8lF_|7zmw!}DwQT$VLWGwaH2W9x_x zmy{h!NCx_unoJ9sX_|FFcqe8@-grVLxw3wnMDgRw`b*h6t_2)>aFj{EwUY0RFU-#$4! z_I#f{Z7$qO`ut9ntVgFhOgfO=FG=w*d|bsNxjkkI%GQlP)b5v;*Prd~px?OZ;@^Ht zs?J%_BV$q7Wi#thYp+%ihWXuCaopwj!V6&r(}2&yhtKF;@%)OW$FedG`bu;Mr`4M? zV^CbBNte}cZpTO-#UE-|zRT%`CH`!8;EvQF*!^M!cG0r9-(%i}!f*Sxm&aNC$aF8y47 z&B|#$%SKKE8QvUN4I)TS-(@(|34+`7Y%jo2%Jn?ENvS3ak&N8lIG*2<-j{< z$XH=5^T8NoP35c(z=cSg8d*xZi{KW0=*r1I+~_(x_OFbh1{jkUC8oj6XXo z?dYIpPjiH6(G3p-mg;BN+c)LlkT2c8`E+!Jqg%R^tegHkXWzgfPy2g#{;}#xr7L0j zq5X4)`B$6TDk-^n-_~mH&I9VD%q~^&^r4}*z8b&jWYUEPvo7vDKBGyk1^I)v&9AcJ z?wJ;?E|>p%>Z2*9TAUkncM89VTwEAub~YroDgtAzzG2-1e_3XLcj?DCj^`ja6-Td0Vf2U z5O6}k2>~YroDgtAzzG2-1e_3XLcj?DCj^`ja6-Td0Vf2U5O6}k2>~YroDgtAzzG2- z1e_3XLcj?DCj^`ja6-Td0Vf3hXCd(0%R8^Z;y<#hkB#MW$4PIf`3f>{wEd5P3C#e<;kZuOwX`% zX4ePaXa=Kpn1A3pN2OBG4wQ__RBnCCz9#kUq{Ojbkz>@;^T3ovzofjE87W+?`h~h1!^*BuAY)jT2r{phu$L>Ts4*Rd z!j8s?;Fg`O(=s)1>x-uATSU+fXJgmLipFUQMXJF02!~+qo(bP?_^SS^#evv^u`qv1&z@YB}3P7HC^lRte znZ|B{@ix+s11{7~$Je7u-~6X-vlZKyy(yh=_mCLkyx>El$E~`Q#eb7I_{p^e#G>`i z{6qUhCVZ$a3|VyupyW3KA9;ZR4AuI?s#En!eSuFTB3TG52A^=9o{H3&z%(v0gv$b0 zGO=1`@CoJQfx1yUUD@s6Ub#4GCn1N@M#b8$pQO?C=2+Dm1R;m@vTUu&DSa+j~YroDgtAzzG2-1e_3XLcj?DCj^`ja6-Td0Vf2U5O6}k z2>~YroDgtAzzG2-1e_3XLcj?DCj^`ja6-Td0Vf2U5O6}k2>~YroDgtAzzG2-1e_3X zLcj?DCj^`ja6-Td0Vf3hS0V5?Vf*4&{aqHn3KvX#7f)!r1oXe;;#Y326JJ7m(J^70qdf(F zkK8<$Ja+R~^2E)3$x}DCCC^}N&)r;>ynueW2tu}b!FSoswRI@`_Qrp^wH^Y$bMW8p zt#`ujrIvzi|3IC}mSLMOxd|o?Xb$6d3ke?SM#d6-pj=nf_b~Xq1n_eK*a=)Zo&uvI zewQjk8*YMam#T+sgYdRXwV^&&_^ltZZ72F|1Z|<;rXkw~qu-X$5BNp!uk0d-0UIw> zeBp2OtB7&kTv9OjlgyT`o58{X4x=>GCk6EBl3V2^ulh#=ETRA=kpLSBz$jwzzq;_n z0JDh*&W~W+D8HP}|Gi8w8SG$8e${`+;tTNiA^5kdE@4C^l29tsLvH(>$dpS z9>5KNLuMy{EsPE3(jU*+&T=)tVng4#u7ac|kiMuz=!?hjd%#7oZb%CPGanjefE#`& z9hKX?ysSM555Wudt2N{s)QOC9WDD2Lulk2W`(ZGi(8bUnt1&dB$6$ayA9?d; zDynnQ7U+wMAWJC_BzZx-zrA@=ox!gIo2}Ch&}r7V4|w4o^5Urn15XQHBY3c3aT&p~ zkzitdfS=dCauregmm&NQltpm^H!_mVt=Tua{C3H{5g7xJQ1 zgOJS~Jp`glZX;))IYsbb#>^fsyRI~-3(d7Z{61G~1=v{6(G$RLGS4ncPC%aeA%fMZ zZi1x8(5L!61P|sx+s0mk;HOYWl8azH*oCPwGE6YB`ket^UvjIyBmv4iMg4aTU1OXl zSPc01;*wjnC70c*F1g}XWyuss|D%sz5WzRg{5)6e#p@r%SBE?yu-*lALh$-V`1K0r z7YwIN9t`m%y+Sqv&WJ9Rm|g2t|6RD8z*Vpg!Eoe{<+_dp+$mLgaAN6Dz-<@7EubAq zWy%fSoYkPz%q)l-1aXTXuB1!Ii@#sLS&!g`=DDPx^kH@Q^keFBKRmqQf8yb&)At{i z{Jhl6lI0Fex*?l&Od7uVp}O2YNW1i~zDucF0^#f#s2uKV4bs;)djv4gKnwc=-v58x zy?cC=)wTcs%uGU_NdSc;BwREXyd%MN)4uhXl;Sda>p$$%fV^sB!P`m+nc0=#Q zE=*UrFo7ELRfeks4V{x5U;ucQA1U(i4NzJ0jw#$=wiKeBFWbNY1Ph*u}! zV@y)t;%yHf_OSZPgahSUCp28<@%Q%OWj7}CxXPU2!f+2Tyx$89!h>+^;i0P7;6eR( zw8>6}h5RshP~RRNlz${RvRpW>1CFL%;OK^nlS18avHMiR8=^ziDTm`i`A5UW4$6oh zz6uOK?gfU!a53U=T)dqO3;C(IQ2vo{(dxo67&vZo;YgJ^R=`>#nPHz!{|j z0%tR@IdC$Es{FulPAFc|3%pBQcw^8|<(i$jWMrTRuXr{>IS+q5tyAB3;o1OPr}P5X zA^eT%9e>|+;c@Uc=E(TFma-oHX7K-5@OPODXB}`JIB4d7DxD9*-?_cx?;ICi2Y;07 z4S#1*?nwA6apAfHxZdpru0!~n&^!M6yYM*pJO9Y|%c87@Kb!x@g1;|LG4u87!1+us za2|%gNxkE5EA7QtUmW~Vt~dO(QSM0i`;!Y-DRBKja4nVooQ7_gj*i#|{UL+(2;KRv zAo{V3|R5c149~lLorAB-zDvHH-9SsS7rI*t+W?RpA?^BS!;);`{Q<6q@pUz zYN|Re)FfSE$c?3|>~w2D)p1tS%;S8WGZR+SsWbS3rc%;_gVUO%&$Tn2#HI9~ZNLqgQMRM5nD!i+=sp^ysB8_K9BdbVhW_Q+70#aP`H!P`rb-)aJpvra+r=Xml~O zx(J$Gh(3Qo6dE4V9RyFSt7ra=dc0$oBmG^nG`Y=poi?)@e@2+B^F9eJ!|s}%gI>1p zB&)X0Z_O)$hR%MY*g_BQ(u1vOnctJ1rhW>iXMRKfz5HuWv2v2z77UifnuE?4?qkK* zx-fX~1pCS%QF%zfdIYi!DOVUgl$;!jN|y!x>ACk= zo%UE?yp(!-P6IY*^QUS3W(@Y_Z=8^ryrMe8stF!kxFwitt=+?#Tbh`(VxrIPu+Lt$ zGH8AANTzk*k-9*zBm3+JR_<8yL~T|U(voRllfBW%iLIcaPo>Bq|LqJ(Otz0GgnPXvue~vLxwf| zDZj5~YUiRYGogDawA!)TdZDqgZP!dIv!m$j>Xm}w8Of@#p?D7c4Whpt!!L>k>2r1Q zY!Lr}T#3o^N=23H83?XKoTYx*_8_3EWCAzLm7i zpC=xBfzW2}CL6?J#$g|?eVEzHsXa%=r0nUu@|Da@wW~Tl>`^)Sp}6)gb?nh2jB)Wm zv)4;NN3F$G+E@8QQEwmN6P;(VM+D~H_EnwK6}(e`^QXY8zAg4q1wm^*`0?OXtp?LYMd+u2w z-fTyvh8eTuT9=;JwcaHr`!;pX^ue=!co#d^U1``dd^KKQWog*GSflo#BkiF*@l%!M z&&s>?#A$-TqQ8XSp7$)YZoenALVbk?TJhVF=T8EI)jDQ*JMwWN>9??_?}`6r_JXg< zZuq(Y_$CAAB<2?Og~{FRWmmd*`x$sk>j`f~UmkA*|6RP%*O$ec`sxX9I~h-JcpK0Q z-m!)iAC_S6yZwtjfe^6pL2yX44``R$jKmE6mspDOV7*>_%r zFAtwbOVX@04gHP0&o4rk3D_NN=yRUlCmVv+&_DBef;>mZ8`Ss&ZN^+3Z%2xb2Mt^u zFE2^Q8`SvmRP-in)@mc>=ykdC>M5I#zE^_Yr+$406ViDdee2*|-N*OYciwdDlzEB7 znlp;g0Z*A6UFQ#Ww9!U`KNK(U<#b4IYXF`CUv`Jqq6XFv*`u}YtKGG%6%&2A9gDw6 zO#dfqhU!NSB&M$>eI)CubU5jzTfy7;jIqI=y*!4FAYJf%%I{|kJ=uJnHEe*vVdi}y z(2TAD4(W5?vg1wqB`1X9H(+nB^JQZ~#r|AmHC>V(ileu!*%8QUoQExSVlvq^H7h?l*6%hIVc?fGRZGfA65S{7;A2i@}g11lH#b2?_7Q@gU5by2#e(nHTjR+jQ#^@^Tfyz+5( zuBdG6)Vd*cz-ATIU1Qx{FwMh(#-H53<&RWcL_P5$Z<*I>?@{!(Oy_Lu$-idK5dJPD zU-;JliyfTiGzJL0^MSH$L1%B7Nt)_cy`MS5#@=sR7H5p+oIvYw>RP;)wRfva%l6q; z%@F#}W;_evZ6A9T-U-i<3_)Laa4WkbdUtL6aiRD&N2Z9^1~pzz+HT?rcnuj;GmChU zBM(ITE_vXstv%D<@YG}Qz@BKkr;2gxXWo2@47lBI#d#n-=N3Zk!4+3I@k~!VvhS+b&{;cKkuqDj_xD`NQcb<(T*vj=wNPZfEdj=S%w^^Pp`XqgY5)c?cON#+Uh z!lJvaXr*n%CqqLUn&`|%tci$DOci-il`@T2@CauWm?5n6V-wM?l|F8#`PjXS#lCbV)E2 z&jQ9p$TQ8yEa-E?LuKQBOCSBfcNQ}9P@2ygJ)+VYFCCJ()3Kd)*<+2L>$ApJB9qkL z2-=#7OvCm!y*&_QD`n+)X?%ER`Uu*)gfge4Tk(0|Wlj)z4-DmQ=)uy#Sy|@Qr*%&8 zS@99%l~bljZ85h;kT#dPQ`|Zw;9G5EI(-K_c2L)M^@z^WG%H@DGK|-;M}UI@;0*$U zV9ErBskEcMGpVnB6bimYtSN$F3NVz=-$44_!Fbfp6xwjwp`6B(N&YdlLw`Z~5S~)` zRP)BurwbnRMa!VI_Q+N2hqX`E9*s|POt0>fv)tOba7z)i*4n_HZ?nxFH0rlkg-@}f z)r513eNiL7&DopBzi+c&Pv))mcl$bah>74YhCC^F$m%SC&)WJYob&}R9dJUe&;9AI zz11y`EeO7f7gm{a%J=v;ZHkrCvz+KUBav*1yk=xy(d$8{kKzH5ioSz6Ct{B7D7R{5 z`xFV6 ze==vPSl?|Q=iqH-Tt)3B^pA;D{GKvSzU;CCt){R))a$(Wc%iL7_DSSJ6=j*PPFN1l z=D+x+a;s)9dY5)y4M$c6@C=_hSnY5UtJi-Mk@Z>g)x|J zU9NH^Epzs(t|{9FO)r@pY{ISf%jzK4TB%@<3aEv8`)~c9t0;3PzO7! zW6KWagyIjdz7X$N%^V1Vrw3?Daq#QR0}EV5o-ys}+uruiN=b5 zaj|nwv^f=T8b^QVnLHOFt%lYuZm7AC80|@cklu8FBfXKH{ZGv@C^|bI<9bWhu0ri_e8e z%Tj1L7rUL}g)ZOwpk?6`rfqLNz5!2*Ug7^V>Cm%Q_QqtGJU+kS2zHk9$78gV+YQU|P5vjNdKGJ%Si>zO9B66T2y>!bED{ehzU>*j{ z%xzcB=Q?{%Bj;V&jtx_?-Q($I;o(tJS9WT224{XpYE9Z%#0@`pUmGPeQgI_*xfVE+ zdAaZfGlohx6fe(k`Q*#+GJN@^<$AOSULHx`sd7EM*6?!Kvt7J=rVHb-^729Y^7yD{ zx!y(J&{DIOw=6RKy-^&g7)*a{)duHJ!|V0XuuG;JIvSa7=vd;?(UapXt{iXvfoTI? z?op06-)HiVCdaQi0)Mw3g}*O34DV*o6TaJw*Y|xBE;$*y#UQhn(;8RugT6ET=#$dT zC0{*!hVbh=e7o7jwc zYxBTOzvTSJhfU9q%{jmx6TA3b>73d6j_5<6GsItIh2r%tZdU&v)Bo1fBNgAEf9rVG z|BKA|{*Z5_mF8cUUOMP3%ke*M+aJ8n3Iz@nOt6}AzmXQrzB@fyaCe_5Hjdix0;}on ziRcA48UAk%40UWMZG;E!x)As-0M5z4I|;bUICuJu*~2FJK6|o%{J$ZKPCsl;aP~dN z;CS&&mu_c8D)JcPi|DIWV~qYJA4qrKa)@S=j^}o@6+xm`?E$!F2ZJy0JF>U6s zwm#|)H8tEhbYMY|Z~kKTw!-E67aCovdJuXzcwC0g!~b}&FfF=_b+&qh{-;NmarRKn z8X7F@6Wu!ueBNv|RTracoo~h0&GOCHe!|h|##l{DF2iPbyfuFbX|v9?nzCHIh&_2u zWK#2laAxGZ0_J;oNASAvq`-ki=X173-mG)6kxvaZRT6*a+lEdJ=<)WZP<%G)yVfC{ zt*H&muD{GGw7%OGh@9t?*)BVQ>^G*2753$za=r1&E2m}R6FkmVaD&n^YciSG2(&38K(S= zobhT+2Jbu5j-UQnJ#Z`lpNss~&TkEz{@H5mv&~nUvbR&#tn*!VmEL$PRB7OEnd0K- z+DOG5#vxfCd)i;Y_dATgVc;a}Fm?wY{GBd1=zmT4W^Bxwk7?|U$j8pJ#y8)bqdrS| zlr(%6;yVJN@$4UVUNAUxrv)FKbe@qlw2$9Iq$0rYWPaiY+2Vdm-4_S?9iIl_uyqz>1ZueXyJS*dv=&KiMwk@rB@3yARW@@X~&PReS!P?)Csr z9*pkS`<~}N$vcuRcuGHf>6hvZu_rm1hE5njC-ig1Vf9%mZfH<> zo(YS;8mZ{x(88Q=+yN~@?4vpvPvko5AZ+Gq&M8{!8gr2cij)}oO!_5 z%13nJE;7-~^Ti`w+=U_)FM|)!Tf8v>+%+>M;jaFx26sj0bm8t97k5?otnQ!YE8Tmo zztqEF>qKxUndIQm%wzFg-nD6^xzo~1y|HdM`Pjz#;1R~E`zzuT?IDu+Bv#xt*0ym5 z?xNF8_~hhB#of+W4WE39t*a0}-TZTnJg@`E-MyM~hW;V=!%6$Z8`I%@AsUM>8dCVe z;TQNq{Njx}c;c~*`?4d9TmFZlv3!Y>X!mSrYD$Y-$@$-yZy0&O8 zJ9S93ycSwc>!M}V+0b&QH*P~qZyX!)j%^&n7)P?47C%N@*cKNU*k)bM`kw^b1HcB} z9l!qiQ(gW$(Jjl|?MvBeWLpU^dwge~-gk!2p<9>!T!@Y*dFSbTN86uRrKXRTAui6! zBNaQdH7|@`+_%Il!1Ypz;gwdc(Q)xgt|KdiL!||B%bYZwYZ;qo*B&wqOv$?U(O@b( z*}zgX$b`jHBNe|*f@z`))1Z@%0@L6x2U9A|>WfVO?E_5sMYaNlFK3$-*?7g*6P;rU^jC6SAyN0H*Nh4OqFR}FrDwhlss?B z2QqIQ9zOEC={W6IH>TcusT%gwWmASddD)0zt1rvqo{4DRoNZ{e+A{raogS$uq+f5I zw)UsLe&WUK#_$PGUsiTP<7LGsL@x`Z+=1yh?bkO52R)w=9IhWUyS&zZz;@0Fp1cCS zNb1+l>N_JnsD6!KqR!B_!7m>HN3tFy`+YtA9=`8RvSYY>xHxY5nssHQ;-3S%#@LX- z9x?sM^Q}8=T{}TvL$j8BrrqMJA{CpG+Kr`YzpZu;w-a=4k99lK;JCe(zz4_qm{gxiSXK70}{8sddX>(F#q~c!M^!6nS#c*;85y0fq|QYLj@QWDRaVIS<0Q*C>)93GRchBN1*>`ROeHaC-YSsUaJ zqy17f|IrKL)!5#vpu;laLCyyiP9a{xxs7Ob9reEKxz5)!4?owjzObG1l=f|AtWVC4 zRGgcH`)9$E=C5R*#-A)BN_H}SpP93k&)nrZ9+_MJvBARta8M7-l9vtO)#7}m9^Vbw zN~QZ1SlJ!Bp=Du*DX%kajV+nBsr;Ma(Q2SMC#%meJlO7rvZtnrR?0tyb25!>*MP%q zprL+-2Z~&o>SxdUzm!wE$7%z;6MQF+rDvIi-m}ZlpyfT62H%NP{F%POTMb@{z)PXK z_U!%8l)dWjCU4BUrcU+EvX5lX(^-!64%x1?zWxvGce0g*bpUWp-d~L%E4e&xT zep2snI()ao{+{N3`|nNrZ_JHUJVLultNJKwMyuLlzpSxq{>a`i2%c4b!?vs$4YK{a z`LfBhjl^GrJqR`!WC8bRD7SQTR{kt_GL5>YknZVWz~k(z4wv~xF01aNZCNuyTU`2W zFfa=5bAU0Iz8j?5B-t{m-^+6Bgz`yIef?tZl9ptT)PCNBL1*t_)*bEZdb1yTdcW@L zd$Kw7PlLCjHw{c%ABj|4089z)47B4H8To^ub&2+L@RrWY^RuwKXUd;XYoXCmx4}mz zVG9YPpS8ndZ2_z1e$Lrr*dwaZYuEWX;|=_HWemS8oAG{hzG&Q4e>h_ik69Ty_vQW{ zb@#&u$ltZ$jRpqY-yKQ0Q^5&$R35hTCh30C8lB5GLsRz6YlEXhO>@Ab%H>hc=h{fV z<-!sJ7K?g<$7UQs#!=#{UTIeuxYAh9y2fPoYLY|J5!I$(yPCEV{qaww&w@OE+{Pbp z1Mrlb;b+{EONZM@B&JkNnzSBDC@HwjfN~mc&<+#T)uSh;E$hGYm zCLYlmil32eGv)BaBKTeOjEo31$yRn8wpz-JQoMyTRQP1o< z&A!i*FKy46cAuhO@k0FzCVnO53xQc@#T@GFGd3C|*|#!qns;WEP02}|%5LPqA45|$7OuKLlz>*U|0{}%s`bN`1&1+Oc# ztb@hG?es_m_Jo`uA?tij17QwflyDHC)6O}jd^Yj&KJ4cSrx41=wxMsN!X}IoW)fBt z3RlYrb9+GuONq~N-dIQk{K(S)=NoC9bEI?L(TDRG z-bGpOtC9Uga@09{ZZbUEzS5m%kx0cZ{5IN`$`+X0xKi_Mc&Mq+*Eu$ZJ&*QB6@gpr z@2`TN)rRr~>uA!?cf*2Kcng2F7qipX&XU z9C$T0nY%i`{TI^yHc|4&inG>~(nq|-k>`UPJwfsc+jXt#$w#9dz6|}Rf%j>2^gWif zR^w>^E{$39O?b%FyvC*}|Cjnc(%mlx-xq=R3&H;doGVG31EuE4Fa<69X^u z{i@`@Co|eync*KwpIZNjYwZ66EW%kUIO`{mxivLW(QPjoJXXjhBR|!Wc z_qbFq{4>KxmG>GxdU6#!34dt*m8{H~p|cR%w_;^E^3BtgnxU%be%@_m7I>7^8*Hnof$aTq3Pp+?qkI^mTMy^{sPvYD| za=ePOxK?xn$z<_=7{2~G$J_2VeGH@z;a2OeS--o>U9J0jUD;|KAN?I#WuHHCj?zjho{gy|NtN1WBeU0`NvUcT2)|3(I z+>bFgP3Hd;{!bt*Cp?dE4x!|372$ZoWrUKu)r4%29JwsH+dv#Y!ki6+lDn;hXAo{D zr0tv-VJTq{IeikLO^9z-PAMTWH>ZTKh;RxaJ}{1)m;9eYTynUIa4_LALdoH3Lgr~s zlu&!P21534IU5Kihg%8z5pE~631fso!XWE{WSdPWy{429xSAxBOZYE5ln7>IaLo08 z4SF)T2mTbl`~;aA3po3Vu`$+ln|UVsNv^WaI6m>}Q*(wla-7iP2bGiD0mfR{-X(J) zj?C#!`=0#bJ>9vT`FR&G)Zc3OXof34BvT~ATV44fS-PFG9_b;gksAx($5x#YBL_zY ztkJFTY7G8vfk!p}n>cr7T;qAGYE;ZE`-UScjNL}E0=RR?AMNB*-^7E>Z}xQe%X?p2J~#k&3tIZ#q0w<{-EX}{!; zK4)KfsJ~WVwO8nzd!%!}NoS(+!S=Bh_|PZRW{k7k7;~s3X!esI6IUPk;J*H9)9!1u zt9`DIIr$229@yEFoOgC^bN7^s_a~-%`^P`J?UkoPW6Ielh2m+>Ua{-#nso4|ajE~e zDKB1lMs(tiebL^;^!jP0Ums(OfIrCz-s}55}l;y zflJ5U@Ga^Hmt&+CTx|NZ=ra!*N=NQ(UPLZ3W%qIyQ#faFtkpiumxPZ?U3@$NK0fa_ z5@mF%aT+TF%y{`?v)R<17o-=pAjWyBq+eE)dk{8YAnR35y@zR$z zG#^rNV|*^y1A&`0!p(Zwul(ry0rdVf^nZNc?qbh{@4{~Pyk2+0z4s;yudtnUr07h8 zpEq8ORMdhW3){}kw5ffS=$z;u=+v7c7*}fRi>;=nN38L$a93Qs)JC}i-t#NQ-$r=! z-t&tO=RV{jYy1rNJwJOgci^1&{Dw4MOPx4n%L8REbPnepOojy>2ZR4X;6J}{HTe_g zjT_fa8{(hI#Pz0(_jX}9@io6si-txUJc%!*vuLg#yz3&yeIet&06a`)-!qAK?Tqh6 z8|~#%S92}7y-}oT&ZQG3+rm9x8|}xw>^Z>hG<*VuQ0b2HZL zM)uu~J-?kd8be<(<3raxCVQ!~mp%LC?MJ|2MH|^_817}31-QY3a*VzYtl5O_MxDriy;nBfU zb-q1YHY4nF874O1V==f{U{~h0*RNJTcF;zG1wicdkJG`{mHZU#uO{8L`1C#M1 zIR}{FgEcu1TjR4!^o~?_UhjGAM(4E#7@UoYBfs%&)qML=e}jY0Y?Jq1n(4RUW}{cF zMrSo^Zk}T&ngA>f(o zN!5$=p2I&K+rD|{wD+~#Y8?B8X(RSi^VSx8GJQ@a=cX50uf+OTaoH*Mh);Yu8(;Zi z(hA#oXX~CV+j%oA`bAmN8(Rk+$+S8jDd3H*!MxiPXKs`v?%7g(ytTG)|2?hi@%FZbI zQ{_FA_*r)4iCVW>zHeVw#(z7%^2C>SbssD1#B}>U>wsu;Qa9R6c4@P4%Z7A~^YHi2 zy3=OimWBZ1+|8S5f|yWYcfbtma1 zksW4CEvn=Gf1UrK4wL>W|C84$y}$4e(j;@RZ#nkQqD{7Wf8lN0d4J&()gfPN&_DSv zUU`b}(EAJTWjOL21HDtf>JRo|?=Kul*8MTa`BPtO)Mi4-((gmd&J510x$jYe?6X|? z;`6y{DZb3VqpZrk(#KkJ2RhCzeQXDYy$K_O#-y3}SicEhrF^sGG;P|nDL?4~U%qo! z-<%QTHa|~M!!lU%!SrhQ{p}h7WfBG!3_IB>1zRaFyjb&iJ zB5ua?l4ZtUP1!JGiD8pLF0zL)?fB2*ok8+Cp_AGw2;_C70gwFo?;?E$^PGOidi%>I zlvnzG?snYHTGf-ROVusKCl9ecORp3^uy?LqlyYD9KK6&nJXVY@I14;_cE$3(#<$17 zo!uy(eYGwpcoXH1g)iq(?pt2jqwr;za=r28H1fWTyu6h1 zseC!gU5DQJgBjBpcl;A5+Z$hgmAsz#@=Vfu;!CCfzs{F`9{ca{<<<B%uX|;W!k53KTyK2&EO}ps zFMme)RKC3B4Fh}bt7c5Mx#Ry4WqaexN6G7nFPD+t6JIL*Xngtq$68u(1l~wq^Q9-; zdK5k3#(zUk;M**Z^`s{pX&s*cZX_?yC9LmZ9k-q{eChjn7hjI1Y%*Wo@}i;P-e*ji zG0&U$*k71%IOUIpFAFG_@0C3YU*=G*H@?gu@5}I|PyNzgH~sQi1N#*}HDh||Srh)N zPw#yBDS18dN^D5rwk=|Ct8$Bb@+miJ|qYq{~ z`k?lJ(g)f1I{M%o;?f5dPSKtjpYf^_TgJ;q9p>DrZj86DGIv{7jp=Ul6c5im3J=fv zH+cBhz3^~%JYajr|DyD|=J8Rhb8P7ep+_dRlypR~U&`iGbW$j)cq#Fmg(2PvHD{@> zGNwg*XD1m)$+pA4Fh;$3C%rW`i+vhc7 zO}1+G*IDD?i=5ab{Jfm=jhx2ez){V&iuOOn*+v$3)j1P%>bJDKZ)inU7#XvAg_(1K+Kg|A z29tQVC_p{=mV_U1^|nV$naL|mnOT(4*mYMx{tQx`Z^oJZPqrVvOd)}Jx!3RA-A zdrkX)N^1WdwZGJ~zu9eHbWQFfF*%*@ARNaT+VPyF4d6^|AZKgYoGIq;-gG)=isoKc z8+XEir`GCkZ2cSfAMR(Z`JA!sj~Kbn8AMHt?^k?3V*0%MD)Id==gie9@Axw)p5OQ; z_1iLKAJ1uQS!BvLt9`!lR_(`kA&TD^ei4IxwaAmfjqAwM8y;%!SNylFA@e%02Uo2x zS)O}^RdWsaxF*B8ynaygxNFE4T!neflcgmY~6QfL9Mz$~p$`$e* zi1yjOn)@hc`SEXkHFSsFFK1xEfYAIhogFYQ1k?8fljaF9;iFco?`V|k4Lf8+8g=EP zbpj!4R?~suRy2I8ndcf~GW>C1kQ@z@E<7~vmLKb&#zNu;@0t#Mr$Ofm=zTeK{|0Z8 ze4Tf@)15mS;wAO#$OQWR2W_RwgygqER-%$+l5&Kf_L z_0(yY#hY%}ON$tr_bmdgw^4tv*KZM2;g2#KS$xEA5g=c##($*^ddX(pKwr9BZSySx zy>H;1#h$J*l)Zs4`CfwOBPv?lLtU*ow*sed;n*^%GgEbG`+Ma7Zd=cH43fW#*B|`r z9DNq>s}1iQ{Yc-%TSnVjCwu!Y-XF+6+IR6Tr%Yn0waNR|rpBwYJJpr!l{_HdynQgr z${{^xBfs8s;^a3Fqzi~=qyv%eb)uJ3^%GqGvLxx*$IUs`C-7>i!fYKsR>I*9Qn%Wd3@KdyW}V&rwA zhv@&``LDHTAO9WuC-ExY0_Xf{REdAw*cg6K+ktBUWvT+>##Rvz`m&v|>O4Mmtd-my zn&Y>Z$EY(@b-+<8FpKwXUvRk%j#O_7INAY@%6!YP`}*e9J7Nu!TYd|eD)-=-ZF{54hIY{n11b8Lfj zXXLMZPz6&7xKZ1-51G8(+yPNt@sH{^Q@=O6FJ&rJCQzt*imPwdy|8)m{UPon?k6tW z?MeK;P5R+yzRVHc@hz~C55OT=qP`h-Z5Y^ctsLhY2LA*G%}wQ{p7m;;g@Io>R+us` zP*!txDPih*Ugqn3+4SLSe46~Q--_DwQN@CJ2Whv>Imj$R z)lr*{?BM@@^IvdO5_;z#zT=EMuOdzSUXpS6ImqESGUwKVriY>>X}p_`9vVicxA;y9 z@4j!+`M@076D^T_n>3X9`_}8yICv!#y?*_G5=Khb;8nQEI_)Ar{E6rBg8Qs&W z24>FiogIo7CY5U)kU1kTTKw2mw?t{G$+v2YS(6%GsIE03EPmJ z(c(}PdAIR_Q$kUFe@Oc=(x->cG&*6+S!Pa5Vn5MF8-M1vuaBvZ+#a>ssqfop9h|gc zz4Je?v7m3Y^BtY$vy6VW`YWc5S+wy7>Z^|E_*9zSb1`+7NJjW4zS}_9p!uM=LD)*z zN|?&`$vA1Z3_KH&RTGg_*?Y}<%xhxt%QIW<^7nvqLjSQ9@CEM zdh+Lo=XBo_2)D`fyR!#+^uCUpyIB@@&~Boh+RC+f|1*f}%e0)g?*xCzf#3}La;>fA zoY3-3e3$(AoPZg3iTf?EdgzwTx4@#h>v@7dek$`?_4oKPXUIq4~k z#|}`-`KI$00diJ%%GQDt#p{tz!6IvuWL1d&%P2Pj`81PyA@KLW53J78BGtt%LEVNE zjc<$U377gcdlD+OYuFyDgoo|Y094~!r z(lrNyLA`OteR$g3K)ke)J~_`Wq+gA39e3q;BXoM|{7CJqb!X3gUAg@TeSQ1b`qCZ5 z12_4hU(fdt6MSA#Pk@TR>( zm^Nkqx{h*cmv7k}HebAR`@MfQ_?L{euZOm_ba}sXCsJv?t68()>F^IiXUuw}?2Oqz znsi1oUlp?MCCgpuTo==yVDWUWvez;k-;+0fmEq`Imyz%3T;&doIgM$Ap3YUdzR&kG zr?N;>Sp90oVZJBr?;E%!-wXd}WU}P^lTAjxm!2(KXF7Y|?zWR|x)5!bG|@J5yk&9n8a~f+^b@1=#njLoN9NlCbWTX(H~u{qG9Rvjy-PK3mM()amn_DLpFu8y70Z5 zcJxh^!VK=x{VS38FMeK( zvUVr(*6`cUZ~O3H-FV<8ANCBsnSK}FNL!Chaq01!H1^hKJzNj#ETKMcx6ZFRUi00@ zH@xdF+a9n+WL|3Yg5}&t{Mwv3J)yqaO}+aW@1H+pE)lx>=8D0L zfxLmMxf`uLOa{K)bCUAqYoYuW@^x=FA>Y*DR!uhPBk^-{_^bsPeh2(N+pgIC7DqwT3lF#L;iX2Ia= zXJGsQ7+4n$jUndd7rFWGl0Pmfzs=1rBVS|qy*mc^Xk;VncGBO)oC#s4I@IPCw@#(o zW(##BFC`b+u$3S~4wY?n%Pw}?e~GgBN%_rg{%SY>=j7`?rALET-24_dU%t_HQvP#p ze!EMfC&*Xb7f2UBM6v&i4iEe!W5!fx{pCAStg$+~fQM>4f7=5$l|{D?|Md;>^=UlW zs@=&xRlE^GmwdPon-a3;6VlFw#~qnSACJ?=NxIUdT?W(;Fx4lo0GcWLeW8Wj|^!KSe?R$Fw;aoaT@>>h-jPb>%tWEX&xEorV zSQLmRhFkH~zc;d9=`+;MdaLGBlgdU^zd&@xz~X`xs3+em!10+(%UwgwP-E>cT;x}I&uUZdC$78bxF9M z?2Lf4}} zKj@@;!AFdrvyPGWEOI$kQ0CBj$C>(Gv1t9MLunz}#^wNVCqaL}yZ-cah;j8O9AEk`Bw^j}gFXrs!BF7Q z&tL7{yiMPA|zaJR^nbL_=FSNuaa&U&|B@iV*R zUdulAflnEEY{AoE_7&)awF?F^Cpq^Nek-+CWL(Z(k#Pzqf2SSMeVR*m@pT)t|B&>f zeOtS28*eO7PUGCe+NeFGczXzOoiXTtE}_mgJs##Rpp%}QmORcDjVo!KuL(Y24ht{9 z+@v`0o+^0Z1yAk@<`xT z>7mVY-+yUW7AW?#)+o79{y6 z9^Jyd$wA~doH8lCta#9>!a3MdIDfI_(+>PW_QXMKRqRh1NAS&4bow>r{jB)Jg*uCH z&SBz`ZQ3j7yNu}g6}pGM{pnCC`tc|5IY8R3Z0{w5C&A8=^Qleo{Ne!X;ybWhLS zcNJ%V0rw6qWq-z9W7S!JZsyfl#+XX6Q%~WX${SA|H@W&@-_<13S=Q>_9^}+a8LX9frI;fi>$y?nh^^W?7ButAKiY;EQ#M@zHflhjgx6 zG%mU>Ft~GFVhr)T&IooBeJee(G3SkBMyyjF)UakNs8s zQ$E(V?8c9%+rHSyNTvOSc>O&l{*5B(ZGS=cyV}wH8pxNtol1J)Jx1PM+)J63MJE5r zfPd4?+-a=O_UL6R?~P^*x_5q?o9?v5n4hEGXS5?dk2^E-t>=Hd zQtSMAn&-@+&-#oTEB&uw>5NXvxiV~)qv0j39fG@_`eq%;ZTunsdtEOmzf5I;L3i07 z0sdagQsy4Yie^C{c2vGq-+?XBURD<0zNmTp4rI3UozU}-uXOhQv|R*FgcpQiH`#u# z+WD|cwnvD6HnD8{o$-ldB>V0r-pc%_5BN9jXK&sUjaz0L{E2>kkAB!U(7kR;stK}tD*P+;`Ourn-)PQ(QBbgFRiQf%*!D82k-hOvg>+e z*mcOVYmsT!;HPsn?;KaRiD(hs{p$|=^4Qp%lz^`I()4!X04x+X7N3B zyQ7u$KG_Fp>Ld4V9x>>@ReJVb|1wZM$Y#nH@!ESFap?nt@3&<7HqlK1t~1{C9kk z76%-kq_F#a1nHv7RF3d1LeK8OJ24LJ3rkFUGr)s0X2!#VVUBN-;;Q#6)dyEoDDzWr zb)@fRB_I(<00oP6w7}9Cu+Y?0hFuHzZbF;*zby*&AJvVU6ky_d|Gl zqBPggC;41>2>T}H-Pnt8W3!<;WamK~gt@5|dbEYY=x+I|A>6ekY9zh1|AS}te9 zds)vLzPM)#-<@Auzwe$c&A=vp(H;Yzu+0Rz5(I>)~GvX!*lHE>fo;e z!g}mlx%8=f^QnA@@V$ILdxhKCE4<8J;XU>W=LT}|y|QbvfT5iAMK-Rf?7gH1l%t2~ zUH&3u)<=vdw9Ts7Mp^XX&8$(6Tn$Y1{R|B6a*hrh8|ia}y)bXpTI8DEdA9lfx6w`d z*33h9=MdoS>JgLTR%Kw5i$w_z0TEJumkK?e5MbU#;x842z+uHAoj-#A;kllDbZ}cjD4|^JgCl4`nuK$yX zNBf(2Teb-=#on%RD>~P|Hz4aoI>17I&2(&inuGc;csxE0!KYi~0|z{Bq06Wr!BENC;;rGyei=HC5-(ei zr!^h=4~_I+Fc-dK=X?L_Tg?BS=AX*yH*$kLBaG}^#F=0{b~xr>#fmS|&6!=wc*j`H zn_vEe!L8=xU$Akp|6CIT_S3*~1b^vF@Eqhf51h;cCyUapo%8OiTiFrF+W0ZJc?e!# z=d(K6z)h)d(DJF^>_K#L{H8mKpo3)4%yho@0FIdJ1L{WL2dy(Cc&Mkjo0?Wc{nCTs z6|#So6lJc;#=py6*gW3;A~9wG_|>-zmbu@&C@l>|r;6Udt+Qq9dz(ee4#qtXIzJ7a zH$vyB3$s=M)6S`k<22x3#8@S3EcPa)z&?}llmR>S2YR@Vwc7aw>DJleff(<8g!dSn zDnGJ2{d>Z_{#S8FCFp+d!i8sJuQ1T>6!4<4*(YbNvb?cj6Hr@iJGHwlF^fz>}Raful>T{d->U+ z=xTUeGOrSTKMfg@%{(lEw;%LnZG4b9^$9$5BRuphJoGzw=)r~kR@Idib>MR~{o{ad zL_cV-{EU99=3$p!gnr(E9a}P)HCFE~k1s;rmAi5-M7vc_A0w?fE7$-`+vS7g$^_Zs zH6P%=3WXcsDLXABTmIW6^kdujeL?RMx4$Fhsa$o`&euHN@KXcRvCQM`z~s$i`$A_A zd&u|0gG+5U{M61br|s=e9edjvuh+JZw#%4Xg_iLjsidvy)yImvq7K2y8}o;7m)f2) z{?&HAt?@r`>@b4sLoiwwn)iK@=e1`WS@VRQU&|Z(u~l6#m#}VYFNPgrGj@nwQFv+t zJcT`CmGnXG=uB^WE8Vd%+{AYf1Y_)R!~50Dl|wSc-Ov0V%7ix<`KJ4i1Jp4YShp4Q4 z^3C2d7x=R~ut`i$UGr1>x@CpI$FcN<-ckEy`s(eR?lgQ-M3?IS=%U3Db|}+vp#P+wUeGL)U)J(+5SX0-bMhH=`9<=jpG1xQ#mvF^C#mA5#9 zclIUZ2_JQt%N(838%PB7%W}+{vqwTRSAGG=gv;-e~0XV z7Ir|5QNN@4hquE&vVjz^f6%;)F0%8p7n-)WqsQFFe8}_-I)V-q?1;Luqx9;`Ri%$R za(lGeoQOW7`g<4g1{wC5Le8{gql%trWlv;H+3~YbbR_;R+bKK!`DH76k|9HoAv3XK zU3Gum%J+Z3K7lz3zsARbw_&UwrPmHyRr0sc_)Kg`r{(G{fi-_FwxpTN+cMVW5sUdw z8+lV4JyHG|53G#&#*LkZp7j8C{bu?~=lPINHhS-Nd`)%)hBk87Yt1FOp>e14Q#$MD zJn2N*$FG3zb+#t|n$zJ)i+ecZ@qd_!J**Qt-L*7OGf{r&oX=>z+>br+9r`N>SU0x~ zth>hZu}c1KO|sv)-W10tqTFoa(x%LXu*O9I{`Y@p*Pv@I8uk6#5cIZg6{J3NTvJq=WCBh z^DCkGSO3{X^RX_?gWrMX=am_n7xh4MbgBPaH2($o7R~b=n&)@ycWGV_7<7o{x+g1| zC;ZmU&Bs7<>yUheC&r~!ylgHV^6#tAN!HuH7vXm zKjdRCI`C7S67n4%d*UZ?P7(!P@7}|P5ncAt7Gyu;#5QX7CkJj?@AxIJ1wXv4icgA< z^V^=^?3a((X~^Dccl=3vtu6Q&Rp4iIGyX+GSu5s!LO-S0uT^KPFEV6rATnf~KX2X{ z;Hjs#UFEy(z3uAxYyKGA4_bAB;~NycC%WofpTA}mX^-=>=iJ#D10P1G$!*jfl^Ew& zF>Ksbr}9k?@}0ZyuI%^p8ylN;=~#bL!k;^@8JVxL*RTex#a7axvvd4)yfP<)lQ4R@ zJ;|M~$KY4BopC4cmFx{g%dJO4O_I@`4w0&hif3iJy`r#>qjRsGdke7R*F^u=Nk-}J zTHP#br)wi|zN1@LY@ID%caM&}eJ96j`_>cOw(m4;KTO-$Rz^uzs_Sps&ST!y^}*%> zjkQL#PGDb>j=VV6jQ?2HsAa6--rmU$<~U>5`M%mKKiAH$2A|8u9(#M*-yUj@y;wE# zzi^J3Q=+MGdUPC^d*?d)8k1}A&~oRk;5eu8G8Yffzh+$$9=P9j2oKexSgXOqhO>_y zZg`*z?qKfn>_@F8`8x;?_BqI5@G#}fV{dOx5+1aNYzGf*VS|U{@fWgBO^%E24(GQn ze7w}x;G=o&t(`hoi*RYQ)MjG6#r=b>eWvDwcP5~B1dI=3_F+DZmAolF5&4DOoh~`^AIN@3 z#+Y{}^v*BF(D>?3W({+yE(E=E1Lcmj%8F6eQb9f)bsqytxW*>gY%Iobu^=@V5bQkj@(!>Ya+l%Mg z|CK&N;VeS6*`Ye*>;K=~c2*O5cQJkY(;OaaAWij3K21ODF6QC$PX5E8_&cmyx9~=V z?lGgAPOo*&+;TX|(wSS1a|c%NYd<1AOYepJ!hxZOH$%SuI`$KId$Q&D6xly9XQts1 zq4<;3sXE_{^Ub*@6#u}*58tC&srWtSEtTZGb{N>acun!)_kDCu*5J@NyOHxx*2qx& z{zLHfZnqV_a|&hK$#M4Fxx9T5UcQZ=cuc&iJ_s#y?DMRFbFO%_V#*b3@%4$WvJZZHOOST*E)T9! z9WzIAo$p=^r;d2sOHT-|mNn)x+SIxnXAfED$A_bDmw(7U%8Z}QeI&j|7x6crSB>1z zn`Uhpk@L=-ZPgSmZJAJ#$C}Ce2N8edyta(y^K`eYB+rT$E?qoG+h6{_&?7V@tRv zZ^I8Z{IJ14*m=`SydhiU2z*TqZA^RL#LlF)z6<=qp~=f_#DShr-Xj{1Sg9#-|XLfqDt7m)-8sE}_&cdZnOz`N|!1(GJ zpW2Ra*4PPe0K=yJhx*TJobS>mPFlX(uiliJ=cH$_$Ib63j&UC7;?V2U0>`#+?BdYt z(+0;DIQ|FYECg;3ZznSTec*Nk=?e4zo-szg5am^7?PaXTXK_z?YA|bg$S0ko>poHE z%nO;n7vLkxH-IO*_xBl#>@@8AYU}w{aVkH1I7#JY4<|9;SnT3KYm2^_cBDQp23D0{ z@`jfm%HmI>Zic=Yt>)ds)C;5Uz+=YgYoeD%WcrSzZFdR6dcSTZc7p4MmGJ>nZukM-2A z*IsJBUVA5~Uw6KFeIBijp=EaCkLa@v`Q(-N>PKi#ve@e*73L6nq1N_7M?dVkC+zuY z^kzre&o@u?y*%&ya~t2#dlVS7t{Ry+sBu2=5Z@MW28PxoJhl;!5pM;L%}IESdGj54 zsQHJ^{}{S%*Zgzo=e1W&`AAazuJ+7(JC{?xkT><}Q*at_aneBj`lR|^dkgwo1LQ-+ zIm-ayWAXQo<0hsH$Hs`PewOAm3YMF9L2?pM>{K34!ZniyK>OO zbDr=7pL=-m>U-^V;l=QIECtUQ!c*G6kLUfI;h+b9c{~ra2FNZhJUjRX&knx9|G$H8 z*|oekQwBBjR%6)02X#>6r@;3pGEzQd&FB``OE*iG)%wvY*mZ_AThbv04-_C1_6tj6}!8*lk&Pjf1{oj=fy@KaCN8}I$yotvs#Vp)zZu^k;09dK8W za}nv7<=6#ehn#w5`dQjH;Ah$GJ&#((=E;|P7;A)gXT$L5mywBD+iqoDt7N=_*{p}@ zjStXX6*O`5Z}bQG0n3gp8VE1=X*O0;rr9}PG_<*o@peM9Du4bV+AJllV7;M@(jD3a z_+Bb?rE`cjUU@?s$!M$QR_Z0+hrW|IK9>U$#jI8Eh-d_D&0AE^M|dh^EE>lW2QS&I z>*#BkJn11`-fYHuubaP{Jhf^0tbx7J-X=dvyA#=?Z0Br+ zv*i(c&@B$}#LQ-McZRd4slYG%4khf#M@;(=`Kjppgt0!8I<+UM?&I&wE<`8fr@Ci2 zZJ52l2>!pk)v9UXCpmKp@%l-=nihV;`QNB?&Pu_p~Nmtuj@O?adFWk#p zkoXznAHGREDVbfxUeqS7ioM{6>AWXYtDZL?}Zs}i2e4@T_4h9T`jq-mIpH&`?2@7U;WmD{~vqr0$x>dHT=&$=Ooz) zL4yQ{2<8N^CV<=#uwG8MnJ7{WLGjWihveu9ge2sGL7^NJYY=Qf(W2NI)P8S>v@f=( z#9|GVwz1k)3$L}Ut)aCw5ZgjUO}yp*TYJw=b}lHi{l4e@KhHVOlgwq$b^k1rhYzQg@(+`*RqtYwxn*bb`I^Bgi~5u72hj@sDQjpS|d1wX%PK?Wtu;3eJgL zi`c@Zu^%U8?YuK?v3!$s1352JB-omv2F}r+${UAu+*KrR98RPEayChD zOL(;N#^J(~yl=Ql()V~rZzORiM*6lK=1=gDGZ}J!?XTtDm)C#^yr_Nuk9`ZIFES5* zO<<18`TDJb&vkd$w)ICA$8_4(rvammS#h6fS1bkzNEAF z(>dPU8)=RAqON-*_f*9F+xJE`&{p@jf8M>3ACbPL)NWtTdm|s?o6Uc^))(%3BmE_I zzH-t<7$dRa@4enr^+$@k_n)~lHvt+Gdkw*TGfn17`!0qNz+GUZn9ChF*X04{=im#B zm%x|%_Zm*DWh@wj$e(;SV(0$Jqhh}_Mm2=F!&llIpP1QZ+jPx3xbwjWb2dEKP@as9 z%wh2JNyhjA(szx!+&60XQPxkq7b^Ui`MoPn_|49nPSy|XwtMtL^ljEy!|N0Lneaqx z&hcA(9{C^x9Z~Dsp6@^L;Dg+!&~N({>(rJjEt?_3dZ(5*`<69JnY`N!EVf*+Ltvz= za~9GzX;07j(2@;;b{hwB9#qbK3#^NPo5&*4#)=Wbk9hwDek8EA(g5rGd8_woVDh|2 zEnA0tDe@y{^0qo-P_r;@aeNGW8QjHphqUWO?k?2h5n+zWht4A0n>^UUndJIp+#q#T zL5FqM%xq6K4C`J=85_CZHJ|TcPx8jPYkJ??c`{lT8ce5+($DPcPc|04acaCX7Rak% z`YC;izfO2>^0H9_7Jhh`{)fMiX`NGu;1_<$K3`4>d*;8r(yr%2#_Czd>gOX;wqKDZ z{5^SDCgYio3}^nr#!Zno1V5#$*GRYjQMF|n{T8^(KCm&HAEm+Ureg`d)hE0HGxr_egBuyEW+O(+8mAj8WfB z2Zuxk`XY6TO98|4QuF!7&ODzw&blS{_rnBF0y~?}&)g|; z&*72APT5a8ijH|HGRzTl(TCBu#{ChK1K1d8P5NmvK1HK5cW(WH zxqTh_V%);B@Qb;qwi(bv8F9@b#?TEpz@hh6?{^drJP zv-D%bXY@n%ubn=mXT&Y`{>0{=wmjTr=bx`qUsJ1nWj)*VmCtF{pRl{M$I5QkBHHDr zT{Z9`+djC9zMcDfGH8=!XQF9m;Mu+3j*qOe(mCeao-FYsAy$?nk> z^K9(JIEUh{S7@klWpCIF`JDD_@6nz!{uS5^@7}?xnGTGo zxAU$H`St_83BU7UJ0JXc$2ZrN+U1EXd_VVI_H1Wes?CQ?+eWF?j~pPj^D;MxU2_I@ z%?|JFx2mG8cxvX(?_t9nVeG{As6T(dB<(NZq2DN~+}nW-m+J6_h~duoj2jppz`1ABr~f)fJ`(vMa2Lu@9p(31;Ygoh%F zP=7jkWDnW@9kGE--k27n+h?uEWnQmKu=|&+?>h0*zt=vEwP@rPXl4WBFq*c>+WRo`MiXI? zQ~mT+=8F3XzX!h5YI(JmIbo@Fc6LyG7+xx#VRwC zrD&>U&n9uK<3~m)OOzS7)LRNqy}I_sBT){QRxh z#aAriey)*fXTa#H%OqZ1*Q5SF6ZhrraZP_BF4#RToj4=ZqyEFh6?KnmX^veSw>-1G z+0~yc;=C&|SxvU^fT@uN>+gxQr0givxW4j zoUd(#&lX(~o(`W~7QxRtVZ|o+t?U&DpRW}DHR6mJ&bY+Cj=gmi>mbg5v|_iD$Nu|K z>Ikw=AO3OrMh|lac$?!lE_>|}^11h!rc$q?i+9df37&WEKe*16jMn}BD5dZH2lsn! z50UnC@8lgs9??gg>`vYr`2Kl!^8SIgIdIAP7301Rp6&X)wJ8;== zaLP#k1-AKX>^VW=nhwOKa1YHgnO}W7vTrq2&Co?MPauEh;v$zc+=nY^vtEehoM~@a zus5D~;LY~Cv68RmMd}pWeDFdsW=Y^pBXg&NOFQ5z;(zZg)2koe9Ls)89CmId_89Tl`Xz8y(z8YEF`V)J^*=<$QuVij zhk-B7lygDLSV!mj!7=bVS#0q0;hl%|UH7r*VWx5?)&cTK{Y@{}{4Jij+0s8SzX^U$ zy;|*@JU}(@M%5Pdov)-nX|&IyytH$C3j{9G=Oy$#`IxQO=~(O8*>R3)m;R)4&Sem9 z?0sOtBf0)V`XjiMMSkb)L@A^Gc{!V)br|fGE@iLOt;5I~)cxMFqwlKk*Vi|9>Mx#t z&Tjh)GlBb`)s|)GGF#5)9y{7TkhUKkIeTY3?cd)`hvDngVbs$u`PR(6xsB*BUKIVs z818mKf6?+^zMY5f@}mFK`U~t8kLosd>MsVMzrd!?(qEk4rN5X(xdOvaZo7hU%Vzwt z7{|-8d*VLj7i^oS_ppDFx$_4aHXpz%9Q)cIW9KKfwM~pg+a2K6n`*{W;Bl9}dQkms zS0PD*B^$CG6sL{~)aX z+aBvi^i}ZQvn-sv#M5vVcpUhmr{O-Q;xNV%Dsfo@m=`26;FR9{=`Vek3K)Gze!m3S2?R?ohd{Pv+hiE z=aKXnhIW-j9b)$^_iH{*yzr1J+@5+XDZ~7Z-Bw2yXFZbZ*c@yiPt6id@6Q?Sqo~_W zuSXt@)%Ojeljwt9Yrt3cJ%c^zwP1%`xA2Z(@Jr`@!DZBI-7g5O%6g&p5j&mm)4ww& zl71ZNd+Mz6zip=rkYD;1X3Udmx2(M+EcyIW5Ac{sny>#z5#zxSzM>VB5GWgZjTn-dn@53GMm$Gs2T%Nj-K@%DjTbpOGhZF;n6$gx>Xu3tmG z4ru5E-|c%#Z5xj>B;Mh{`o6Z-C+vIb7ee=y*xrXV-9O6vG7jAf|9BVv;?RAHMb9bq zgD6k-+)U`+q31)I?!(aiU@P6=`hL0}P0;Q{?0Yqm)z;Au^2f9@Z{_5iqdm9XQkxcHSZ>TGqAxGpO&A+ZKS| zUjonPgYQ={|IEYYmOBE`KkOx+)X9FQ&Cl*oTUOu~el|$cPbUwfKH*iucQ%oxlZR>E zCOk`c&z<_4goTH3-pk@)19W-9%PhL2-VdQ0q0^l|k@3>;^c9)KdZ(+LvfTYFAuP0X z8E((@z?Q$+=i$>UZFx}SA7HzCAmi>{7l`fF$=-dA=rYW5yNpb+`7V(4LUMgNdb@j( zb7vK z?VzU9A9op&_cCKpYY}4~k8DxPJr45j)p?||=wLbRle>|?OZEeoEyoqzmW8vfbx2bM z^ujvi$n($(`T>hxC?^wo5jcvBD|pvJoUB7+OvUfqV=KIQ0Cl=;rGQ_jo>F+3jHSCT zF{F3DabXaay4aM%ZqD=SC$}NP&hl7%*1X2yv#FfLLw0&u^M;Ygm68v48Mu)~-(sMv zI&9>n|Jk`+IKGZ?{^Yi7-h{SgDlhr|Hu>4*tz(SkM@D*<_Z(|yO;I=OJM%XTdwl-V zVUNwfa@eEu#}3;uzdvtn36K8t9UGULf;JxP5IAcdlwKrjT#?%b)z=RH?)-JbcgVJF8|x)pBCpUv4`*bo6x0m#^?>*j+!sq z?N|pMIqhgEjP2aheE}GFo@7llG?J5cw#c0O>jG9Cwys6;gm2I|!~7hG?A?B!5*Jo;3Tb<^0Z8_hktOPS-2a-P8i4;&d--eRkP ze$%i8YG#en&YMk^&TtlXjc2mQPrWMB)3BfO8RCzp4br})*U&!PEL_3U+3}ed`OeO~ z2-z(6$eHL~S<|Q|Hw^8VW$Vd%>c6eLxs*Y=!{j;4I0~)(7Mk{n{D=RK_)n%&{te#* zPt(EEI}dbx^N7ByHXWUEs_g#*H{{LT{RRXY5|L5XQV()wZYwsEqW_HmpDU0b<&HLq zTYgVw+t&vK+V7d6cHWZ_Xt;;9$UEMC^?61=>ul2))>20aTQtXgB2q^hx?|~wIp6L_ zCjIyybo~N9i4R;An*UWqSLLTqpLedx%}+%KIE*|(+l~(K@HC&L16+bDa2m;X zM+Z0@zsQfjP43bG8kgESz-Hp4?dcc(i#kB?FbqGu`%+`H3xT+o^}3CGqLY?z;EeM-u_uO-8=fv=0dIiOz+Zvev3Sr zPC7^b8S1V7ypK29+-)@#G#fNl>_E>i{ZsuSIqN7(`mg~zAF*wS_j`6mZvXMcDlu}& z2F@qejFvdx&TsRcM}CfKhy?8RiENhQvS%?bVO|@a*}e|=-;O+W$IL*(`Y#B-vGp^4 zc*~wk?Yz#qM#fD1<8WnP%pQlXvx@Gv%eYHB*R#%i1U*2Qu|bbyxmk=6n>p>Azn{Um z`SwcU-DTb4=?({{tQC|MWK9~Tz3`|Nf9CAIuhXvQ!bpxm8tXguSK+f%Lq7d- z%Yg2&mNNgr`ZA)+l(9*Krkdy3YrOrl?eaa-xc7;4Qf|E5YeBm7{f`Wl@{4i;GhQTr zo!pT^+nu`ZLto(d`{vuWU4p_+@mcySvd5c8d8=f!YS?p@YX8AdY=1Hw8W0=pE?WbG z@p1RV!Lu@O;dF7f09WBPv z0vmj>>wI6^b+$oE?et5=U2%t#Q%}pe>>s2FuAGf-C-6qx*hLy2M@3J+9^~#(ZM;{g{>k#7(v1+;D3iXv1Ns^npD(GX)zpY^x|7XyXFbuH`kFy_+BOYzQ+E#eU#Oin$zJ=KO=oF{&c?PPpMt}=>=Wxsq&{ooHcdxr=DXlMaGFS z7TPeA;QRQ4dQR|a*uwLK7qGS|wvU|I7v zA#a>gx)G)+TrLY@awW;fDkF%%fwC6$Ho}=9HcscFqOEwOi zu+N7Kr#%5pV^6(n$31<_c57&t=psbt|aEV@fscYm0+FqQ?_F3;1kamg%wSb>s)jTfDaW6VeMGlrl}qG_j3IHBv0u%|4epsQyvP-A}q_ zowQ<)B5ASh=}K$U#g9q*H0fHHgNIU9R)OMP#FW{yr4PsYSP_q*icNX}!VPocioKkRtwme@f1GtBoV47=_3f9SDvv+wJ^ z-Ameh`qDBYfL>ALCc7NZC6Syhe3QFmq^wl#gz(WGnS<{nelfBq^-il5JNX${hcEc~WY?O7(eU&_xW9B-(0akB}h zBkzkYWBve@EVz;7S2NQ2#+yj;wq|=z*0-Tx?b%<$9zH>Epn9>;-e)0N0l= z_9MVyHxK?S9GgQw1;=LL0)t*S=0EPSbn9vVuwgAYb}4DyIJWhKr%dF7L4UW?T=P#m zeC;vY9ZUMgQ^2uw(xo|RKL^K#lkQ|Vmc+Ny!LbC=_r$S7f4AFS^|sxo*L2_7n@^5o zZG7ts$KD~nFC3Hj&%-e{&k_E54`VF+M&>$nrM=c@yrs~MPn`>3@*ajl-j=xLU&N#c{@Zi7XSw?fk;$AbX#&~a8=K?QC(Uu3i5#i6@V1Jj z2S}bCXn5@Hj&DA~xfP+q@M!g%><2_f+59i*NY{KS`cr2v?Fr|9v{>`flrV3^rUuoD z2xSF^c^63C9efMN63;#kFv@KnX7eK+rL@kL)+pX(8g9p(AWp?ca;{CXbz72O{%RUx z7Ms#%=G4dt^_;|||1>70=2KsWlwC6py(avwhV@!0{fS&e7(0TR5zzb(?YT{K!n2uU zga^3k{m96D$UO$@7Vf~ljr%rUV9!tVPQXrZXb>>Eo-*ZZ4?5G_6VRs9uBJU*?aHTJ z0zb#TM9%RZ8F`>s#zqab;o0-s-j?q8=kTk*({`Ja8K*}0nCMc|k@Goo(<<|Dx?lVQ zTLsQ(@VYd3m^E&D?0lkY@oT@+*D*cTtJ1dtnm#RASoXS`Z2C=m(RM{vK7%x;Dl0ql zJa6*EEw2n!+96{MdUG&g>QM>juZJemA#`(aHVO4Jx+%irzUV?54h99 zoa5kfBRKOK;guqf{U1Aj&-wGn$e$GNgHOrbpt7IRmgl8?KJYaLe2v8x$=G7iIq$)p zKrX0KYIEJ6W;e*$x4J*^w$x*GxyTdHmc5p^hWRhdyq{&V2QW_LyX0k@6Uybzvgb^{ z|J-}fwFgH8o>S>*=PG~txhCI&7a{A8DaXK zFZpKp&#k2ml+iA7ztC+y{SVV$X(is_p^XkBr9~ z8EVQR!|~=_~Hv)dvemRt&}ZmZoyrtqn0{MC(QRvJ-%<_yUbD8A8(!eqrTSw zwfEcYk@c4&qYu(?HNZk-f8h;|j4t|tt@KM|^v3(_ylxqt`&YWneGctj3hy{w{nf-i zc#F&}iGQ`{7Qz48Z`f@R`OD!+$3Nv9)IV%GcH%1D?%poh3;8W@5m-8VA?r%L)?SDQ zSK!vnchNhD|995=P095S;5z$wJF0B?H=ak~wRzHO&@;88pL&05?29_bq?`}5Wo^`v{uN&7i+ z-y@_uncR0T-%dyF+eG@Fa$oWzcH5u&rroE(y8pM4HeYxhJf^P4+TvEe^(FU}5Z{;F zC-I*r_x&eiuW4tTT=wcI?^HospCwl=??GFqB3J&3GW(J%d)BR(?}4qgPnBTddKW#3 ztl`KeEu}GwJsafS3R_N;_$=a#dwSUamJqkajuYFA4{tWm-Flc~yv#AYm3tfW4ClIq z{-lg>F0{j1RqkzqwOe+iN^WzChS6vkLzUKI}1G=zi8sc$k!%mE9f2_XX{IVHb?WCc}Yo&v*yM zO@(&89_QH`#Eu?5mdjleo#)xbE=cU10`wzDe9trI0z)}-?u?HEgCn!LV6cNSojJzQ z+pZ7I9fKBBM*t5Y07E625!G|pHM(+2xj5diJCv&viN&PIius7lCjd|b$ z_irD6f;#Pa)ZQOlC+YS59zUQgnPj8@f2Gt7M^`*RbJQ9&TTEHaRx+at8e>fpI`Rxda)| zqKzBX@kbe(O71%5{jmC6_C4gD*P5AKHqcF!EAsfs&P<#^nV)xNVl!okUif6NGUouR zZ`rW=8#0a?RxiQFWsUu7-jh6xE4bnbL~=&;fYo;DaMpt-gVnvHk^BW#+UK#4Ra;)A zzNYCmuDp1YEq5S8ukaf+4>@PMdd?XK$df+J&XW=9%9Bo>WaL|^ zh%6buCUBo=s;k#7&6xgq=Wrx#n7p!T=X>HeI`W-`hqFHK4&k`^Huf~% zV=wardztO}-bJ~`%d#sfz)li4f1Q4boFVprWx(69@e}(uY?fGusTE>R=g0Qe_=+uO z{>iJh{F1R)OI|-X{vk4y@UlFwsr9%+>kBCBdh&h9JpLwoknP?FhqiRS71CvQeGzAM zMP?c5RSkJBOl!^Nz6ZJY<^${wf5@NM4t|X7U`?K7D>^M6dt~7`8>kPR%kiV!Z6L$5IUjlRq{d)e&Y25$AUCaR?D2X39-R+AT)ao9VIvm4VdTt|CF_j(88 z<&?{rU#r|2%H{6eE%Cfdc_C+<+?sdD4ey4f|Ez5+irl2F1 zbChzI?Lnn5owe@n$vK;M#U*|rZK&qVj?C*{K_BF{Ej-%K(WiX&-LmlVJ-~5BF76}O zPj8z-xfSS&<-G@k`h*Y38@`TT>Y62W(Qdabyu$iE{38fm8jhC)*vci8qDPWp5|b$!>at0x~Ye1Y~KW1k@O?xx4S(*3EA zbWR=S@R-HkEt&1ialaNBBp(@*c69a&U1R$_?1kbs)Q-0IbPo?yTjYLqf%BjE^Keec zDX(Uz%$w}LgTK-@cfb0YBLrV$K6v2kfwl|Lzf_{*ou&c}??D$$BLciFVlJzP2R)6v zv=aT<32?g|TuU{EEE_F4Ji?Oq0rW0%R{TA5f}%f@crPw@=sqRoDKnBY1zeN)WQboi zqz>au68_Zw-ZnFtF$0dyxf-#Z*bB@WA64AX)wSQ}+~wC3K2G23&XT!=`JH|TG|W_5 z7t9*ra{{wZDBBH}zHnUZJN>CTFF5@qc?DKgoTrg{KqEr$XWBSq$>r2r%iginU5EZu z@J#NZ6#2dhy}=p4LhKgf`)9U|CN2-XmI8k9BLDN&@F3!u+=%DBU-pNDx4lQa)Ma2x z**LVTEq`acn^Np>@|}UUN09d-+$mI{=~2wf`(Z@Op5)+)CfFg z`g4N*h<%m;->lKL7w+~?)^Y!C`@i}Bp#5&Vbof?Z^kr&0j6sak^I9(dfqtiC$|t@g z!QEQu?3dtcEqngYu>bw^kJXkA4{z3iV-{{b2t8}uYSClyfom+@gC1M3IqJf#A>GDe z2xD>7H5Nxm{{dt1Htv5KS9i3_T~WPhwkKcAeb4T@)j#-^(2e*F=*Z1e{VKJat&=nF zq}^!C>$k%*AC&P%H&T0pEss3~ECXM*zyBS7Cx1BZvv{qucPVQMhj-^wPhWh%w%ai3 zg%6KFSE@d-XuPK5qd2qwNjyB5d-(<_)m{fbG<}Lb;b**{t1Y!7)Xo9WbmK=| z`MGbTGymV5{N$?x4kqPrZkd&jkN^0yczhpn zhup6yYZ@7gCT%N`t!*pvwA?P^vS0J+=h<(OIVPVmNLAe3Ec}*zaXF82SY&c|B4>mx z89N@EAlCAh+^XP-l70uguODM3e!t|!o;sZ|G5Icg>S23aUJWxYx6B+O+}dkr%>{j4iOv05_NGkM-L2;%(_Xi%Z7Fk!tmPxpe!gGE_apfI z7B2V3gUcve?*6@k?*gMK#@#~)?cluI*}TsUe-F^d{X^N0@B%k$ZyVbq)&WiQ?Z@DR zJuln#F6cR?NV?}q_Zl#j_qQedL&73MH4_#blQ^-(ki2ogrEsrp8{}RCLLXPlKIRLw zJ(6kbK7U3Y$6nXM)sd|E_{--0Scisd4q|)%3+{J50QNCH8S?i zT1K;BS}x4 zFKGL#r{4Cz&=#8)esk6=~!<6Z;z$#e@pUMV>Yn< zk5)O!^$+1X`u?=14a>%22XQh6S>N;Y()Xu{9aXotdu&@^*-u4Q{ALhb5uW=#{(NK; z+4r~mW!tPjVcO?v++~>1X*%Uf+l3y(@VodJ-rAzfY@tE%LxXFfJ&U%%qh!);(|r&* zgMB*YqAt7m%+qXV5E-gxTO+!yheZ}X#Xh_HTGmHjrH^Ylvk`>1&w}rZY$kGJ7#T7Q z|DQ!zc-Ue1-^)K@U)JV3TZHep``4HJVZU{u;G3%cX)WVdjZjTX>1^{1<`m z2Kpp(fvj8Q?gZia65dI^7ir7;@T7O4@%NEqZTWO?{WIj_&Z9lDei6N=%!L;*26EQ6 zhHqw)BiqZplk%3ykb0BxPZNHD-_0`}`Mx_`PaQUQeggl((bt9BmXa<#9(yqC#Kz!;NiR5( zPaBpB-O-1o&>ei&iVH)B0uL##nexX3#jeh1&1c;)78)K)ITzr5mvWvb{%`E7Z@BJ) zwz0HrEahzA`&imHma^wjw-wG0%orO~Gg6hoyc>B49r6^$Vb9&tHt;5kZ=(Ckz@I=H z=TUY)>U{*9%}3Ys1h&-iq{-v&O4?V<_j$VfyQyy;d5X1rkJYXOt6dvum-OvQz9kT! zsuGZ+BM)U+yoP%~ssBpq>BrkH{fJvexR~(E?B8RnGsCt^RITf1!x&)llB*q({z@sE zJWF-mi9OmNFs`AU0?!&rOB)gh%UC#VY2ln*KjNkCrPN)|n+ge(Ep3}ecoS`Nw6 zX}6S}P1&+$9Zi`6hd$d$S@G0=O6{bqQ*I~aj;5^%Db={nNVevSF0`7XP^2JKEChMjqWYLNDb z{!h}$U)D-w-5vJ2o;M&GUcA%JlkVQ5=I(ju^H}<~y6&FOUGMBs&(eF;YYrY^?|CPC zlp>Ru6E{2*uRgsuL4AC0_dV)02a(U8Qtz%gIF$Cw+EaLr+@bw>chBEQ`kIK{zMgy3 zzRvOJI-lgW#ctGZk{pbYJ>Bl|x4`hw8oS&Y?p2U^R0%(ZhvYG@*Fwu?8hecNOLTr2 z0zc9;iwzetTJ35(uiR}=LfK9k0rWyAD?`>E@TFr?W-WD%NmH*1zn6KSA9cxG_y~0e zs5=q(FSF|JXWhA({jHhI>!jsd7Gv@QaMF!q`(t{avH9dSY(4K_@0&4ixr(&`<=64n zA8TaM`%gs%X-IvNH5&3j^IgUTe;Q)joJ#ui5IFK3aD;bwM6kXxzv>8}On`OVe;{{uXzlZSEf>C<8fcI^I9b;W zQQ8LMa0UH9CbQ@VeSwu0*#FO$ZQfKTGVzm{op;tt{xGt=q)P(_D*0}ot+siB=sF7M zi+iuzu^kq882m|H&EBr`*OFewEgiS7HG!o6zp3-rdLT>ZKaDnY>ip3GrS_rgp9t(v zrt5e3Nz+2#VznP!2`o7`jX#CH&iU4o!?&OC%@vm=aWC3&pJj{Vl+m;RT--@|twZp0 zj%EBC%w@6v(u(R?ohJtT}5`@ z`b}&qwy_?pvS^m~3@O8=-LAVidfL&*9QGa3U4$KR@3T@}Z}Tb6^!|i&mOhWW%1o2_ zV70L`z1Y@)uqJ4K>-X&4!{-mp_w0NV+i}@HkaHEC@STJ1wSj#uLs@gN*o4UaZjOzM zoOQ}){QN1B*QlR+7&~3)w{II_`>hpuKT!6uWo?_rJXMSS{KvFI#w@bXrf(Uu%NR3r zR8Rgps2BhB18*7AM)+$7_aa{jA4ab}`UverHf_jT0UzUA#tQaQxrbSJwxsJv+y|t4 zZIaru?NXc0P3Y15F87?quDt*~+66BR&b+{}Cl%R3@a(m6-f?3*Mb9X6XJDT(LEt6w zf8;sa@1b9A+LyVFzYtKb7#!%0~h3OKf(FV@s&F<;A?_&(l^-ytleuYkngWTNA7jL zql0tuwoCyxp0dyJo=i58et|nvoIF{R?fUYOIifkV5s^r?t+@tS_c9_l|qzaO$c*BAXto3c(q!(RlZJ!$walw;FyZ`tFIUX?8L z`xI%I@3;P|`ly#FM`Xv~>FCDTqskX~6*}M7*+yH>wpW+eT^9X+rw@67H^~HM4_NK$ zt`BjyNpz!(GuCtEI>~HHvuP09MG91%e zH`>?y`x!d9h8NF8USb_s4{p8)efH4FS$poMt&`(!x<#~6>*N~DVPb0 zCtthuo^!AV(0A8lq5ElsM>%)H8r)qYZ63r}iM%9l%M1PPWItZ$SKe9Q0q+XKlO&yc zUa{6jjAK6VwD6WRXXx?7mZqD|T<{_N<247f*vk?-e*dvG2V+Ug8t9~V(H!cdj8oO; zF8&Poxbbz}IW`Y-*0#;}*lWv$$KUN-+x~@i7*4t#Yg;G1%ssy+-MXQ=yw6DI=$3zF z-M?b+R=t58t_Pdu-sfgyUpAe4v}(9VYpqAET8mww%mHCwj(%~~T3~MS)^j{>JtvG6 zIa}^;jXV^_o(y}q;~Tl3?tYKC@qOm&YmxEWu=i?bE&3t;+xXkyku&k}^%>sj7pBLb zb5^S1U154387g*PWBLy}YwbGkild&pho*aLhK?C9{H(S6y(_Zt_cP)XmU{0VioRyb zCTyN-1_h>vLqjKvPU;HozFr5;NIONZCi2#XPxGc{#0)*_GQ+c?mT%nU(=8moCTZaY z_L^JHQL9838Bd=0{j&xnsO>qUuS%GFl=%3__MG_h)Z`3#ioOz{4`}O%4Im2|av3O74 zHPFtO2tJ#POPFyvLLJh_BE}@c8~@UUpJd+mEOg{Q16w=n-mdM)yl<~(I^&nzS_5r` zV^cO_gV@@F9F)meq^p#du={Bh9X7U4xh)>!C6AG^QQH1z?mc-6eiDPc`d9S&o8)X7 z^`O&D4lfDpjE}L)@^8ugkacoyQ37pf58RuEK0AYQFQeQ$SKX+`|u=*759kOvLcTLKDbVbmRHC`fTt;(pDb~e&K zGiLC{4POXUgJadg2Q9uwo-FRPtN`W}v4gF4^o2tX{>Z-SPTC{*;odK8B2LEhL0rMH z&!TyG6V{=5u}OSW(|nUn^D|hh^rHD2Tr__r_d*Xzg4V(R-!dQH8fR{7@t#v3e_o(^ z^qPc)dB0UFb}%mCxWKC01|oCwer@V`s@yuif9}0GN1(M2zKGu4ID1mdWopL#&>H78 zlP~+kSRr_DWU`v^5p*v1oicAECs5buL2B}4pQNrZDK}$H>_TXLlB7F2%}%?BvCTHj@C_tPKQ zCl-B-d^_|gcd>!*2KbxK)_|nrTzzhxMMKGq*I;NU85&B~G&HDwA!Be5SjyT!+}j!J z2>l9jcEGO&ZG4jNb@*ST9Yx?vlg5`O;J$Wg`t(%qFl&FQ1^5<`E&<+0|EE8K?W*9+ zTJO--J5K!npVzDqnE?3wZ{szbojEODBkOQkSDh}e*~a?Tp<{>Fyhh#sn|RIFUHp)_ z$ht@OyTl2v`6}*by@@M*JI52b_oI$~{4?w|pdC-^pP3`tv1@-HyY@Eh+CQ-7Jfl7g zEy!Fa=Uaq#R)H7k-pIWz9dBEAE{37GES0=*!-s1Rrp6?~v32J^#G=D5@g z)bSh8F@G_p?U{V$i@RtW>$&~W!`7SCYXmC~9o z<;SILG-J-*SkL_VBDUfg#*mk;fM>h%Joy-T9$~&h9?g|?^-}7&)q_nD^OC)<-&=3< zap_O3_htlU7m*&_UpLuR)->oTyRB)~)f)EsPF%?smOS)F{7dl58dC0?a@I6E{*Nk? zwG3-vYfaPiZKIdHhkW1sE$?FGv2}1|F8>0Te}c=OfJZxypC>cf0(XUH&qce}T(C!R1eK z`Hwy5D&OVb?ecGS`O94X1up*tmp{qnKeo+PzRSPc<=^b`m%024T>c3zf0E08?3=Fg zUH;uJ|7MrJ%;jI;@=tL2lU)8|54g&A`FFegn_d1gmw$oFKf&csa`}(l?<(Kr-|g~m zcKOR({sk`o1nr-Azt>u$9lQK_>%F51cN!M$EKn*%Z0Qw0@yk8}Hlmha>})1!zu4Jb zq5XfuU!eU*@!zifV$1uS_P>Q+HU^~3!}zb)e(vfUf;?r#{~rH-?SCEr0GOqu{~!F^ zp=kMkjsI!w=S=Mo6UC&Yc^QAc_P>aKkM{o*zmLU~qvAZ8qs{P-?|6jU~PvHNRE~gHEj85|%{C8;oqxkRB{zvfd z(*B3>|492E#Q(DPKY;&_+AsHAzN7t{@qeQI+=DYD5d$e{^WFG|Y5!gL$7=t2{9n}m zb@(~UWTpQq{>9pV8~&TLzZ(BK?dLr75ca68^yT=U(Ed{V&uV`${ui~s2>)-j|0euL zw7&p!wf{o=*fyz-?dKW8)Wcxs!$#shkE%1a z;cxVquXv0m5866H^6S{1W~8V>r3w>CP&QW5o4X9-al@6Sg8+}13`?q3W10LqwhuQ3 zsf(4m*jJ_kQ-5n^c~wTFh*1+H=0I` z@i;tSSInq7Q@s-N2E1yQY3?(}8+tkWantGvD$VCw%FT#~2UC^z7#sR1Ia-7)jK>P3nKcNIYSv z7MM$4O|f9}1>kRu0md|S20ZF5BQfGp#~^rB1FSs8W_R;t9Fx>5WC07XwRpo2{?>b} zzo5!sQ={0KdEGGCuVGBtDSg>9n|;o$UWs|w8xTw(?>HJK4NTnSBOU!lAGq5GOcLvS zYO^)TCLRTq}o^pJ4v{I(&kujvr?&A zPf{dS?e-AcNFgyW5WLNvq~;iP%rlA#yh*RbsK>o<_(pG1BMH2cz?-z21mcbOl4@hr zW*^>KpJ2ysA06Bpv(4BOYwU{cKHgJ}3lxn^j~KLfA1La9J`?G|A>-op5Q@iaVMx8^ z%U)x**YA)7eLBy|mi)L^U7WPZtL7z>r`m*(?S?l&7P~#dM)-AX7hIjL)b!cgXqGWy zYmA^&T?{CdNSjX>WB0|-?aI9v19*ilxA}aJgVR296DVwT=2(omHP&d0>1=?M+hGjZ zW0;6=`wU^OZ+LvWy#T7%s z-h3xsHTFw-r=RgkzphpZPWjUlp@JzwMEi_UTRp1Tp!3_{6&|D3MFky#2e%ubisH{a z(4V$9k*Ur%3jZ51zCFamXLK`HztxWEIdP(FYVZB)RWr4#b+9O!acCx!F{2#U>*`Y>hKXUK=OL z>*5}!FzKVk-{|)gAosX23jWw6sMzQHxZEhTWsEwmFMtg-8HFfgU-p>0W0@goz{j3s z@p@B`&1-zgkH@N4d`TEiMq$0{|}m!&4a>E@X?8o6DZs}GpRUu=R;v#spb z_@1rumCE<;;(UiOK_*JG(J=NhR=N>34$#zMv(`|RBmuGZ7{;!yB$OlV2q+aW^Hmn@ zC^RdL;?5#;J&ToET>O@Spae#>7-pMc9P27X>KUx&iQHSQZuG18b=BPR9(m*)4YTg^!6AtWyvl zZG7t%3yiuCVx?dKUiEI3Kp*NmxpdHs;CT= zhYI~mR{1MRmxoGALjF*3MQEIIB`+#24&59q_6JJ}{RP32lF~~5l90cuq$_*3Ur|+7R$5+3@sdt0UNG;f9NmxE<-uEKQOuHH!7?>|QAMb{ zV*C=)mlQ184P5j~qQdTpp@iSWq4cl`M3c+Zi*nw5p`A;_~9sCBb5=5WZv<7hhFcQUp*= z6vs%IACUm3c#sHCv;7Avjo&91n-s%R#_3l&)Ls4RUiLLPeV4A|JIl|mxTdJ0 zXi0HMl~z^yFS*2D8P?ss;L?@)iwtIG#a$UB+5yLc(z3Ep;g_l^ty-Pf?2=y1C=aeI zs_fD8oDc|FRC4pYqUA-E72VstpcE2dp!j?hh}r#PZc!x-mv(gaCnt2%EIq89O?JiQ z2A73EyCtQ;^1`{L1yy!!S;30lku%Gw)9y)b>D=a zXQ-l*xkc5XLc2Hqv`hTLef+Ce`}@u&Uo+hOvPf%IaZ$mtp3Shn(2`#51MYyKqM~Pp zSykl~rR6!=F9}sw+F8R+zOE=K&6Uso;4VX|wDJ{I}Hx+i`!I>^-0E}647gh@4P!!-7s}t1^rN01Z$^JP3@hsEVTH<5w~Z!|7!1U7ok3 zs;Iayk12%8F(DB#1fPFpQE9P-g-8j-#S%lI>E~5kbY5Xb0u`uhIujtM*xwK<&a2?- zcpG39YHp~qAS`)xg#V_}a=%JQP)>ry7c7wJUlj-Gd$4?*Ee&W#>978qii>UzS0Y?2 zucA$*Us_3j~wB%9a7g!^eSx9Nh?Vnd__sWjD$Zz4xxSPru@mosEg=Jn_ zR0vsAxZ>0e^S_k0VBVt3v*+h!&;GKyL3ooBfj@Kp93p2zSaxsx*|Yt{rML8o3)6Ta z)t9OEhN_ZfB}ii8Ur-zhR)okLEC`7>R_-qe-Qtv0R3h`E4pjiR;zAM6vi-Lp`pKsf zM8#ryh2&W5B;&i53vWW0s45TnEtD<`R#YIHRhIgt2lhlU*G{0aOJFc1NRl=|_=6Rz zN(%fdszOy%9xAa=VF~kfS7W4`2&_dVD}%*Fh2zwCs4cJh!YSjGJp}lK{;c6}Jd16( zFGSpxdD|MKg_Wgcj^A#R6Vj8E6U+$}go;*%u7Y<5Zw{$zgXJ@6qMPBA^pn6i ze|n~0BeuWvCK^m5^}x8~YXMoPa2!Y~C=n`@V$xN{IB;@qu&CIIps3tV*aPO95aTTH zRY?0qE-w#JtF*#D!GBYE>2iN(pGZLAuob@)Ld7>xs3qWo8^J=EjQz9WkOEV_E-$L6 zkYWV9?lLT*6Pda1!gRK=ei7`0R)G*!L1|TSp%uki!0xEOka1+-gCqYra)azU`Dyr4XIQ>8Niu!oy0=vr+lfN(3UE_bF|9xACCm%xb2%3*n_ zjCM&?c4cU}|CS)bXd`g2#4n;FgIgXfxf!U+cLa)1^*AdhbEuPTzOeGs$T}+=Dp=-Z z{+Ba?-%Qn~Snb7`8c3IFPF0~Ufd4u)4_*q|7Obc$63)!vmLTO9OYbwY{SM%OnIwZ1 zz)L}s~A31s1^K<9q%*~uNrz<|2m4d^Em{zI^gmd2-vUtA?u)TztYw`4Xr7!^} zaamaSp-iDCPdmQ~b|*8E5XZ@rWmbY4Ww5PMU?cbhmFQWdm@2zU=v);$6k@ZCamrOf zML{@JSOwvpZW)VgW^aL253-CF99$Of#a*j?8Mz=synMMV=x-^i4BHGB-cwX9^WJ!s zZSf18)$W(ADR5=9_>+`nm0)LcCIn$a7HGTA2EqkJuP~SIw(kqG6d-fj%T9dndEpTJDw?yXR715(D6)jJkuS|497Ft@r-di z7dRdnC9C%FYVJfecaoYrS^lY$E90mTqQ0!oS6@^&sg*P{q?2+>mn>x<#`>9r zY_By7b<&n=E*__l+B;bS)6w!EB4Q^Y%M$WSR$&!NQ;$=kh>pTO7L~}O|bk+E2mwl~fUhcJdH!EeHecq(&u2XZa z%$azhv={tCdMRI(goN;ap%LesO&Uc9$uQhDyv*>P8Zwkycl2vh|h{-b?(h zdky8skm?Zbge%#Gz)iV|uHA=r6gM5$KVPXV+{balxMRP>Ru1lN+&Wy*k2c{puH!g+;aolCb$>hNPW2JU#88t z`CmazE#LFl_`)sAXB!xIb|ISwxGf>25+5*>uNs>c+(-?3Ah@sG!_GDC=5Nqf3ExNi zaEl+n2=<#i&hsGU%?yw(GF7C^? zn{ji0N`Blx6Pjz>c|T|S88_=!z@0+_dtRmexYY;wj=LE{2Cw)?ZEY)N=0xhPmmvXLL2bLJ@z5x;5Kzo5AFdlqZ#*Q2K)qWVt-)4R!zzo zv=w)35@q3@;LuSn?!$iS!fhGF7~?jc&sa)00~p~(MpGW{fpO&f7W-4<*~!8^G?_o# zho?~%?mN?g;kWrd0~q2qUd)aVZgHle7ULe9X{gn>;aTLtEu2jn+{7;#>Mh*1tLf7t zhFWkPu)|$_J$~HRZ(z)Et8WHYxREe8ggdr~KH|3EHshXHNgcSpwH%8;?*LLIw#SijAW0BJ%B6QWTU*wi*Q+^1Lw)JRh%O6DN{?qVi=;g$|}t z-i5$xh8ntlhVp$pLwRnzh&EiRd?zlI%QTdyGN2NQXDXk67A9S@m2qH>N?3onGV9Pu8hF#Dy8~PWi;KXhM0GOJ9lATcbD=eZcx6u4dBW~6~F%LDt5tU6(4v2 zyx{e$)!zmVk0|qvTIG3p2Y9$c`4S&fhVOA;^d031{2ygJUdNd3RGzW*Dt5{f@Xsfd z5#FWZ=Y3BZb>CC{M(tMSfhU!5=t(vBt?#S&wjU^C-X7&KpHarXXOwr(US;gvs}dR; z=;yQa^I7HD_AL1DL*=RYq3T!M2tG9`Pw|hLTYjR<#GfkD-=xgIi^?N>ZT3sbSnv{j z=_S?g;$Hx}UjnmV5%-Gnq`#`-=KY#6IH+J0@aRLz)AAc|_H|`!eqDJV{;e`{e+N$e zUiEw94dos62Nkp656aW@2k7mO%80=KcE72NJ#Q*+ZL{)Sd{`NUhn44z!^&IvCzY`G zugd%K+bUsmEAvgOik1M`2V{(KKS##8hGFXrG~Ysvv#!scld06yYi-dNFP2_ z-Wxws0~UX*Vp~2|p531?v3{!J8atHXr<-AA#EtU6M?Hq&_Zk?i!25j0nXfZL7seWA zs5qnlJEq~ujfY>x8{R1iMofN!5jQMREG*&m{SBkAzY%u`UcK*3Bkov|Vay(2cn=LQ zd}U`DUNz8&89NZZH_(Vr=F)+&gAGqDZqr~R#y`X`rVKIEdfeI}MoilfOzTpNn544} z&*F0oU*$07fZ>Mct>K{1xrV1W)rhV18(x2!;eCU@Q6r3)1tZ{(BMo0IbHRyGMojK` z@YnOO-pnv!Ue7>Q7;D7c$b)-X>_Ti7an{je<}&NCrT~<+gEvg zq<rONM)u)+0%}I~@Fa69SJ6qF_ zZFf(T?LK}MkmPp=8nWDrZ1?qY+ugIycK?p$i2P!{YrE%Y*NWud-bOpV5&j}S2M@op zr+fHH9j?>qt;GE688-EYYo4_8bN<)*M){*^;@CCejTpX;WQoo zstzN5Sii67@JJortiy;U)^Dp0pQpnQ>hKqI_}e;sz7Fru;dCATFC9j#v3|RBc(e}x zK!?ZZaDxsb_E^9DI(&f+|6GR=hpgYLIy_#7U)SLYI{XJ6Mr^WvZ|d+Q9X_nXlXdvd zIy^;(|DwZ)Th{Mw9Y*Z3en)h8nhv+>@N^yin-0&=;eY6GrVbz1;h8%8t_~xvS-hMQ8e7O#PqQhA_+@ZtSI&6I3#Trw>&(q;J9llD3 z<8_#2r}gWn!(YaYpu;(KPz}`Kg*rS)hY>}s-w+)}B(;8L>+m%? ze2xxZtHZ-}c(D$r>hN_soTkIq>+nb&&e!4dbU3KP<8*k54o}nJ0v!(MaG?%o>o8)l z^~=%Wn{@aF9llwI3w1cG!^?G8vop0)hnMQ_Yjt>;4%g@~BDM9~qQfOR{E!YKYFod@ zbhu21cj@p79sX|}F4y7j>u`k*Kc&N!I=okht91B>I*izE{eGmwx9ISG9j?~l13HX2 zZ~cCz!?)`2OFDd;4*yDrSL^UW9bTiuztQ2Z>hSM%c&!ecj<744)4}s?+kDXz}9cr z=LBoDyGy%!wR=FjuV}ZC=LY2Wh7PxA_k?z>r;7NVsMDorca(M~X!m06W@$H9yZPEJ z)^4?Stx8@0Ue@vJwfnkuH*5D{?bc~`k9ObE?lJ9ttX*@9-LGWr`n5Y&yVJEhTe}Oi zd!u&4+O5=XM7x``yG^@~Yj?MH_i49DyN9&ftlf9C+ooOLz4~0Ic86&*p`5oH(gCRC04=I4@LQPKt?hR;tJ=&e?Edv!u$+ z?wL&4@z>0sI3X{upt?G^q-f>DiPP{G2P-P_Dp!?-@`_4sDxISu+l>6AzEV#jXGKvT z8O+++GjxVt)kf-$>82U^b{h(d7pzp}bw+Jl_coW@vRw6uqoKjPva0e>-pZo#%Bob$a0c|~bSu(+slRo==8Dzf`ir>4z=0770xWw2mbUO{+S-py6P@h>5H|wE13DmA$VOl*q)kdpw#R$%tn-eMy1uH^ovnn^Oh=rBq zMI|@SDh~xKL)R8nhG*Fkk|4>I;PO!A%vF`43W-nY9zV|-bot=7J}kfDl4)J=FA~(M$o}liI_93pmcdzusk$p`SJx<7A%(* z1-cb0c(gK90Cwk5ekhOh%S%hL=Pj8yXO4WU440SQlIO;8Fq~4dx|cFBPqKG5@05#K z&`C!Vi%V}NzePr~Ce5L>Qq5xL`@ar?siAT@1^}eI{C~f^3xj24p^`$Uh2j5biB==a z{u4!3R21D@;xw}Q-!E}SUf#`u3QJZ2O8E&mBgTKA;IgWUFxXSDY>qYLHUEJ!XHA@w zbLGORdD6zs|AF#?3%knO)~&p<;!`C>q0SyeoSTGTDyw> zkG=N+kE5#h|0jQ1iUcT7pg@5DRSVQ>QVJABP1~eRY?_89g^HDAlifB;x4U6?Q&I#C zSfN0?My(R1V$doT3KXqaG)Ta5iBh0q(IALbtMo#ZBE3?z>i6?GpZ9xnGEGZF?(^K= z^ZcgW$-d^C*PJtF&YU^(ck8kjWMk=N@uW0UZll|j=h{-)N5s`EHi9qOUBw;rGFWA1sc<6B^Kw?-nkbYLo3Nty5O%lt@!5 z?Q-0uq}4>)yJpuwcDpH8#nLH_-J{f;NM&NtxYO6^glHlXjXK<5=wfL6O~$#5^%y-Qis$Fg=Sx5}O&yI7<5IFxk|i$oii#IhM# zf$_z0m(V&tY-wyoL$lj6skXrn%ES_GUYmwa95Syy4bw!Bjeal}YO8W)Fkb_Xvk|vK zw;QCf#5;+$#JhpA>(Q+31twWOg*xYKI>`b8r<+^c+U^2N6xF*Gmk;Iy9gVz(U{sL5 zu(o<`aBjn;Q_gE>(C-&ZHzq2ZO1&$;y2#>Kc7^PZ>Pi~o!6PRI$IJ}w%qtK6kyjNw zn?FAmJW?=AcHF^Dg|lNpa!Ox(d{P`2A%rmr@~ZlOMWc)*%9f;mBD@E;+aTOA{MNg5ELe}GgJNy zewtq{airhj68zh7)0a!z5^uJg-f;ZfNNaUug>1B+JH9Y*FQdxO1i#Hs2K$Z;Mp+(a z#I(m{GfhZS(pyj-$wubK7SB$lqQRF&T_Q!8y0R)cD=l$?&mUczXp>f{BB@!52K!E$ zC4DvNdvd~>lM4g)HmgyQs3lOF%EVoZx3X|aTzX*X;8%wxf?rM0Ek?_xN;+l1z$x)$ zJi9=e&rEG1l8gm^I8Dkz-!3%<*$G}Pw4{UkPMRK1H>V?uv#w}2o;)j_&SYyM%csYq z^A^`jA3f+gwK@`-^o3I`MzH48x)sZsQinLTI~v_*++SRgh_p&OTCc6xk50chc;t-gNK!iPOJc!26N3U-bHUF? z$Af!L9kgc6t*ekKvm$u<)L^u%S1q7SuvcRJWAx(S(}zZbTMu0x+;M1A@Y6%3%)g|| z*e&B=bS!x2ke1-CqUPYC@$qGC30YWf3Bg}ZZ;eHkqI>?&(<94Wp=l2~xc=>0JkK7I zjLwy9MzU6)!kX(kIXJXD_~957z|W7gg_qSJM;f+>eaFmBM_OB?3fD<%6bt_Amf#@hQ;9rvu&@usiqc>6ab-XZ0|kKV>@mCKf?Xb*l>Bqdyzj4xg++sVsC zRzAV4N6Uunj*6rfxa#=N(`F^&OIotksZ=Zd;F;4=p(~|QCu9aMObqg+N=$EVmKBjo z2QR)&8jD=?pB72}?$BH(gPRX))rQq=ds?v5lTmk|wC#kTAT8Yxx82@%SVj(O+=>pK zC`zOv(RodmO9v#_^Y&nLd2mC~eoGYm&R?EaxjeTYJxuOj4Cj7FDED74@^k;J zntNvHv7)xDG*wBfY?v;PMI_~?8&P#T= zvRnJq;e&^YFP{9_^l_IBCuUd+qGoUT7Yvizdx zqp`U>dPG%HdS^-LW9>dxc26e{7Gm%m3ojU$Ses5Y#ezu&0=W2KRi9ZJx9lq|rX^75rX?jC#b{NRscgHf}CRbvOEb{r*p z>CYa;J%sFt=BA>tV8c=M@vO}0{-c6?rtsyl>Bw?9hY@tjT-W`No9nlAu6xE72CHA! zJazs>@|178t4#3Iv8i+-TA$K#PXwPB7v$Hbr2iV7*Om=-j;%_HdcDkQ+h0}P{x==( z*{9=G|IqQ4f9kmN+I$&zUzaa4&cv^h3|7aN$uWI!=TUAEACWn9eL~}`TB+lmZoKJ} z`n}_NwPbVldKx>9!tOHog6t=^xEOlYz}9em%677!K3Wz6yOk-?V9POu!I~R%mi;&C zxbJ=)Z+$>!UuX?PCU^$>2{XE-;a^~xAc3_@vxb?#QuDebRe9tSA_yud-bVHbX^8_jf+HsmnNo` zwzXQrlL`JRHL~+Mi8s1F9Z6;qZOyS{wmgzvIwRE{{LeV-pZ+$^_Rhhz$1>N!i>FDO z8r*z3=k!OJQ;*E4FxcqE{W{kI>GPD!zBZYWEjJTvJa(|B5v)8FJ64zN9j6us&pRa+ zJaeqfx%YV8>Sre6%}ZU2efM~2sWQ@0K%QPYR=S0^O0QzKOK#8gF6kS!jBF#Xi)FcC z1YbT*x=_;jm1gK`(yHzFv_@k)_wD1N!B?dRGw>Om#oo_pzWrX|{|xOFUYqL`dXX~0 zr=*A2xmxGY<;JVsxZ91_$T%3%)4cz9=@9GrtC@0i6>|%C$9O3~jd+OLQ%UFW*72_M zc}YBxm=PxYHEF+= z8TD(_g5^?UT&z!@kPP}yY}cdMtafC$5B!3Z?G`uhmAC4=UF2__p#4_%dY_c_xN0!4 z-vtIcPLU#&sZykFyxNVsHQp#Ulj~2^y}h)_OJl(&&zKS1d`5-zMz>6yr)~VxlI$9d zo9}wu!R;reV~aCxul%a)leim~uAmf5Cg?rU)x&2e$XameY;&$Va`^3ua^_O|s%U+r zVK_M`z?S?8cHx7sp3J^guvfC)b+;xiYhY$uIxU4{@m;s;u9HxUH%cZ~ZIgHfvr_4* z+MxfW87qQK6Ed!6evh*u0B5eGFM&7Vn zqel?iS-xlWpqnC#bj&ya@pHPv?ikB$fS>UiT{biCxeVr`wcX z(Fpz_D`3~%g?a8QI1W>uKE>vK=P8`~Uu5pjZ_v5xp#~17GQpNpa=qOR#ggA|x!i5i z@$Lt7yz%=w-qKr`XT9t{NooTR>a?9d&~fL(I^M8F$D7@Fz>RmgamN!neYG2Jkg>E_ ztwa0RTTV^8Q`akk*QEqEyO;xRyvvO{o^*4Nagfi$lg}3K*Q2dUN-MBjcHe(EU5ZE# zk=7PhN2Jr64DKwJeTTCAO< zdO61wi6<9+=+dBD4q9a2(5mOOZayv7S^JExzNa;_&%5z%H{SVEozn4)jt73Fvu@7D zm&dqonJEW*+2EPec$DgPkk84S*1V|3HaFh-l78RxvX1xe((#5r>$vYPI^McZ$GiTn z^R8-6>CyMHI%&_c!Pif(jx@;*_b%CJI{u-t)^&`M@uq8ayv2>TyYU`3?)-vI?{VYx zZrpu~PTA4z#$VL&?ln4I|1}+Nyi>>hZv4EAW#i3erNGymp=Tq5|B_C*I~NjcID?mO z?w57E+X>t6R(aojs@b(DY2f4twmBWQv!1^@LynQ%zI2_m99`ei=v&=*-$s=NH-IiV zI+xX-ls&~7iQ0L;M&0Db1K-u}J-u#<8?S#*zxTQE`XA``u7`BI-i^0Btlv9+q~l&U zUi)MHzTpW?QV;gsacjrhaX9k}=?ZlG#Q9I_xO1nDcfO?KZM$^5=~XrB(`|BWTOM07 z7k&BQ$+z>Xo30UpZ8EoQ5?|)v#`|6!l{Y=JBH0}5)Go&!4cYiVZr-o!c=caK=~8%BX4EiD)(8J*PX}D%ECn@o5vJ)=1p+_8wc{_ z|Dxyf`ty79Ydb`$oZOkWHm|k5y1Sq~x+AZ?y1h5A-u>;)tM6A{pI2YoQd?UuR9)Sl zzd3K=>iqiN{9So_^ZN5T^H$5h&3S$Dt-Zamwz9f*on&G|UcJmG+AUxA7HrJhmcKQ> zuV8I{c4OY&{Hwe2*XM1|TQ{mJe@*`8{OU!C`o{Y9)}FjY{dv6wy`w58_ZCd8Z1hKs zQ!9H5I`gJhwoH1ypeL`swXktZVMqR&yh(+Hg?)wN$G4VMPVUNUZyYx`l$7kqySk(= zzdtXL=qgxLIeB7F{y2$l!&v#VX*6m4_`dwYlC1@6@-`QAkKR(S`>^%-T}Slf^%d;S zE0Uorzp+~uc7rTvXI^dLgb9o4YpXZNj92AXSGN>REZkABXkUI$!Pu^RDVs$r^Skn^ zWl{4ASLIhujz*`|?>JP-S_)uyerNvb!k+xDysN9PE-5PMEm&J1mt^w>^48|}t+r@_H$Rf*pmc3U?H4%C8K9GfxbHQ{*UalYG}FgpUVb11<)C8N3zz0C*Sp8Q~*j{$u9Y{1%>Mycv8ixU1U2TPIlf!i$Z+1>SP0 z@e|-(;Qt1yxDlSu$I?maAmP^dDOy_;7;(3!s>4Vf9o{N zFJ|%YIo)_C`1v!87cRE&XC~VG*Mo0*yM^xs{|wyKV)4&>hs7TgH~yforeAxx@y+11 z;77r`!G-U%_!AQre>!;4GUMyP8^D{v`@n}xGQTKg@hicTT8&qMuLeI1?g#%9yz2^! z|K2lgeq-8j)NcyzD8Kn-v@pW;T@|i{%^qTHyMwetn&+k$u}FHBdmT$r}5_a{`257-(~65f6l_Igf+db;L8!deYJ((2JZa4@$=xs z7mWW29`{A#Q~tx|Kk-Y(<&Haom1~Tz7S{A8f7$q6gm;5q0$1N=;b+PZS7?3h0WWqO z1S@+i{EOh~+l}u>{4rlMt}M3nHh7E@m9p21}-YG^!D6g;T7OX>x@4GZUz4e zycK+Esrj9ETKq-eKJa?*n7b_eAK(`71yjtQc(;XL0bU611^0jtJ;&k)_gMVd;NE+U zZvju(VEi<=7F;~l{BH22;QDV_{BMA_gMSGg_iYP*=egCBs%F_&i*_`fm#jo>jC+Wgl(Ve!uZ_kyPj>++0y%EGyP_r|*rKIui{ zg7@3}cJ4Gj89eac#_t91051UV24}$gz@Gw-f7$$RfZM@81Xusj!ncDby<+@#@MQ3b zAF%vYg3kv>!5;+ofg8c&cH8_`fH#1@0B(HM!tVob0Y3pQd(Fakf;+*5WtN`-@QL7s zf42Bj!Q200Tn{eXXPgF)`=@a?xF7tW}*6J>bM3=1yef?L4@;O~Q1 zzQ^JpJ_pMWK1*2Z->&yscnf&ig~s0mcY=QpUim%?KfBue0dNxB^L`7zS6It?>j#V< zcj0n;Io8m{Po}taP3@+{}6aB_^;r- z;PWrC{1?r$_#XoAtu77;}5s{vqRS2;X*@@k_#5AIchxFR3$b0Y4zD^|7$g!cVEU<)08S zelIxM4Bv4_usde_7{c3^7_&Tf#*JAXC6^ojH~dB5uP(6k*MeUJ7cRBM@ecCU#^Wxt{A|C*crm#6 zW5$O!Sa>U#>!n#3+X7jgx!gyTN!lzzu{7J_h!G)`guZdawo|}xhJOeiyb9v;;6@yC45;vWy51U?g73BC~A0-gt61#SYb1Gj&^6T5BxtPcypTpugJtKfHmZw2>&Ss(itAM0x?nCUP2qNT_B zyc&Er=GO=2{KkLD;$3y=5Yk%>ej2&gcq){^h?1Lz+Au6z}!CS!L0vsCBfyt9KPNzsRPS%1DNHr70mM4 z4rcjGlN&8{;PxH`bNk)~=K9|QX8Pl9GoST+BADxQDwzI4@FmFq)nIPVYrvd;ADH>w z0cLwr@)b*;%U1^G`mP1DJ!%AV`|bj>K5PPCj{I!_UjyC_X8qg^=JJf~vHY<8DF(AW zmJ2Jaxk}_Mc}VW_$i}1f;k&4{`bI_fu97ogLmot4wLgyeHK5sT>Qg2f-dlQ z@H+5h@Fs9Mcq@3Ju+DEMIDzo~$87#LfwzO#Y5c>3pg2F@E#G%FTzC@rNrX=Z??reC z_>iUMPX(VOto}6c8Q=@SCEzmfg~~?+K_z$&xElNsa4k3uUI_jqxDotWa69;`;4bie z;C0|f!F}MTzysiC!MnkQ3Cr)80xPdla4}f!J8;W04ZI9o2F`*j!Jh!vf>(nVg4cjs z!S{eyfqww*0{t(@|^%43!VfX5553g46X)G z0$&C$0k?uH!PkKs!Cl}EuwGZv{B?u-!9Cz@;7#D)gZscmN%IH5#o+DW^T0d7^T`u! z`6J-q?Z#>Fc<@Sa3HUSMO7Pdfjo|x)r3;xGei`DIgck>S!Jf=%O&UqJT0PZJRB6h> zR1oN?4zh+%luxwcKx{&n!l^e2UUpVjY#{}uRT`jbPx z&+7Af_jlow>DTKQ8T3z$jC@v~*T6p8gtqGW{_!4;_@%_gQ^j ze?P3%)*qSv24@fYKC92`^=HE;)1MIXeO8~>_h-W=zmeZ8@!#Pcue5=AymEtZG1AsQ zw}trb5I+>+Z6VhDM0JEAyuG|A@%`;*ukdi&3-4dJ{0b{?GMCq{pSr$$*77QuV;T4Z zd@}vj$e*(MKC93BCH?`QOn*(t_gVeMYKyQSZTTnD_v@#o@3Z;|_?N>c)7Lt$gR=TQ ztIzv8u7OXcf3>p*eV^4Ynrji>pRxRt>HGQB^nF%;Jp4NNWcsT@>HDmH4}5uK(Y2Rk z`W+$PXZ4F~EJ6xCnf}U<@3Z=A;a>xvOyAFMjZE}e{mJtzft%rz>HF!a@3ZvwERA6`rF~(51&lGJLLPUe!HBP)ZtP1Wcq%3ntz|wFP8I+ zI&6barthbxzR&9Gc}*RD3!hBiPj9&N8|%z}6+W51pWblk?}h(Q_+0KR-gB$JqVvne?rLjS$*EmHUOVY-%qbbCi<*C?|<6^ zpG@CRPko=&=lya=w%Ph8)A!RGE`8o#cQ$-7{l?Jp`>g5ne!MyG$@B+8zR&9O{=KE} z$@Km7H2*%U-zevub+{QmnZBQ%`aY}A`vdQSPo}@fW}mBnKC93B34aWqO#k_i@3Z=? zjTYg*;gjj(@>4E-pVi+KG5@dd$@DMOFEZ$#8X5VlKJRxNzuf8%S>sQX51RL!@3Z>6 zKl1nR$@Dv99y%y%`W*@~D67x=DWAF0(kE-Urr#kS9h8UjdH?0R+RZ1^uXOgH@3W@Q z`!(y}lj%^x==1Po`fV@_kmH_osgEYV*nTt3$re>hpfq)HUXl>Em>CZuxyypZC9hA3mAB ztQI#Y*T~3c^?ASS5g)Vk$@HTkpZso#ug6Qgels0B2G>*Sz>~l+a3#1M+ycHCyb639 zcpdmYa6fo6nAdN94(9cnm%zM!^LH?>-;DjZ<)7DY&H(fJ&3Ry6zo`QA`pqIRuivD= zynb^XnAdMU59alobzok<`97G}Z=MA6`pvJwyneGsxESk3|KxSZ@*FvMerqh4=eJG+ z^ZZr`nCG{2eIM+2bh^anx|gWIJmKMvM-y_MSBD>TSbZY1KJ9R!gYA*eS|548_5ge` zeSiDY`s}m%yubT|Yb|{;eSiB?-)HrCKX@H{GJSvhQQv3vTjV^d4xfcjrr&G9x$W6! z^?CpKJ@Co&{pHp4eOA9cVF|nppG@B`Z}ojvpZB{LU1#M-rthaWT>88}{v!Bf`hIz< z@3W@Q`{_RopG@B`Z}ojvUtYN7hNt0^>34_9-)HrC|Nd+6$@Jf7`5WcDnGRDwVdY1r z-*3UW_3yK$&*ufI;gjjVQTlwopc6iszF*#2em-mZd>-LZ_+n%99{64GC=O0dnPp1Dy%U>qvadh|)(+AV{`)`_mpEdn1#81E{({Hia=ko8f z`g`Hu0G~|XPj9&NE9E#?hi||qkJRsm|1f+q{WmJVUGRSnpFC2(ENl6H4L+H^U*C24 zeb(~h^Dd)4Y4wLp->Z~nkC_giJW{_$jw5uq5g5jl;Z#$ZiY{$ zzuAIw^~Y!R`8>~U@X7QShJ2sZFT@7g)>Yt0`A zpG+T{N3Q&RR=*4WS@6jt^~XrRL5JD!$@Cjt=-~4Etm(JFkHII?f1~}!CipAhlj&E6 z()U@@4`jcu!+*jj)33JRT>1H|zV=&m_!@jN{Wr@08u$;uC(~bNv(KgPv!>7I9e)C! zOn+s__gVdZOgL_p)ju-*4I$rW_4$0|+3?Bq->CiM^O#BaWcq%6tF?DqGUy-meO8~(tKI>htnnwxXQO;{pzpK#e7^M=_+7Po}T;Wcc~_S$#gAn}$!O zpEW&~f1lOo^SqyhPp0peca5g!%};$k|N9;IWcuy;MF#z&zR&9OdEr08Cu@9N|L7j% ze4o|l^TkKpjPn1SNHWmJ<4QT-XZ86!^1I=a>94oh<$Ryj@BF+)XogRwzdhvptUjN2 zz8yZ9{&M{kBtrtdGW`aY}A=c#`SpG<#(evv`{sPD7-Ww*NE;859a zv~H3$zOKJ={UU?@QQv3v`TX|D@W~oq{c8E>K;LKex30191@OuA7g=!5_gQ^DFTNB$ znSLVV`>Z~nFTV{wnSOo9_gVd2U$zL(!Y9*j4Ea8*&*#}+hEJyNr&l8reO8~(zn}Ff zTYqHw{{BvVpVc4#70cif_+Oo)%RI_z8~OO_+x`h35^Mexb={pHp4eO90EL--VYGX1Hc z^nF&J?@#zI_+ieud-!JiT_+`u_5&@3Z=RKgLb)$@Kl@Ro`dz z`96()_+9KHnemPU-h)|AVaYwf*#$SACz==le!3gHNXKFR%LKbrN5% z$MSiu?}Pa~*OOpA&-H6CpXb^G=JQ;KthV{_d9D+|e4guFU_Q@P2IlizbznZvwOILZ z>EGb_f-d1=DGv@kA-*@nKMe5`A^y3rUjHn{4Pq~Wd4Il^UsOjJ!uQ+mllV~v%HJcU zA3falO}_u-6B4fLm#nka_1l7ZDC_$1S=TS$7xOH9GW|&*-)HstewlZD!O|zwe_p@H zpno)dpVjC4Xu9B&HNNJ*M?N~x?{Q?TKHpz+CwwyfdN01F@3Z=R-_4KVlj*mHe4o|l z`*B`?Po^)MfE$!GeV^6m`*dD|Pp02!dT#lBR-fH_2;wZpYK1~1D{NPe5m|=R-f-nn)O91 zfAUCuzF(;uKAFD1y=eLStm*T8Opm}P(=Q9<-)Hst{-)RAlj&E6e4o|l`<_nzk}W@( zzTcnM{QImv-w!nnKAC=3D1D#R=li4{hfk*89`b!wzp~FFoGa%Ubo(LGZw&e5TP41` zUkcAN-wo#T%nyP2JoD3FKF|C+FrR1E^bWQ^+bi*-$cz3tL>dC!pS>1(-fCT+MY>YL zb$Q5Ko^ckOYfpUE^5}*CDfr}(`di`mz$cH?-vPfDK6#}6Uie$!lSk?oJsh~<1^DEV z`o-{f!zYi_p9;T7&fDnvBahUtgg*g3d8Ga#_w~N9yl@|IXX2{K)iogwpp})93r_8sU@a zUmfzvAD8&W2-81zhWO_p*7+T*ybqJ}W`22}C_G$w^L=|aNx0S*GV|+~Z;ed!S(i8a zL(BAI@X7Sc^otDoM}42w-?-TY2hYJLYy64w>9^pV@3Z=RKj3coWcrDa@3Z=RpWxv= zw*2Ig`h5T3+3?BqyY!0;`bU@FXH9>{V=g$T>Op-2YkXb)MHZa%eOA8=1=0kcOusVZ z`>g&d_^aTP>HGV8&A-p;^L>h6gHNWf%bib@aAC)*93T_{M|2lx>O-Z=cce2i3^H!{1WY9mFU!Qe(_x{KQ2iMbO0Lq$wpEdt0pRn*J;gjk6%RAiiuY&&q zeDX;BPWZdvlSk@z!T%?G@<{#F@W*}4wjc6H{ciXr@W~_f*TA0(pFC2(2mWR7$s_gG z!oM0mnZAF1K-a&|T7P=s-vXaJQhyu#@4zS1FVinF=pRj={Jg~1<5j*7>lNW*jfmkN zAs)SUX!zkF*7+Z7e>y?pM>%u(d#3Pk{YSnZ`4$P+{V7@JKT$q~n1}Lk+Y{fXycIr~ zzTe+e-)CJPl}}j$e}zw`zg54;pnuf&S$)2*dBWE%|74A?`ClU+9q9Y4KHu-0flsEt zS-*I`&+7Ai(2v6>(;r_j)c0BauAf=>tMJM6x9Arc^iPe9d{&?DpDy@@Ek9Y~>+a0SSA9BsGX2T=#q)hupYOL`0-sEO>>)#apVjC4upfj^rr%?FF8@BO&-Z6P z1D{O4Prt~Ze`;jpv-*7B_AdBjjql1&Wf|!2Hgv2$-_Jez4l92${UR^Erth=*e4qD3 z_~eoLeE;|R;gd(|^L^oq;FCw{k9o-!a5;Q3{jvH*2K}SU@3SsH-%tK|_+*W*<=-eD z9q2bYGFG4OGrtEunSQqyU(@$l{js|&!sGDC^l`Y6OW$Yp2jFjqPo}>il)lgEulj>U z_$z!e{mmiYXZ891_LJ6G{Ug)w4Ea90{QuD+OoKlFre7QKeO90Ei=PXhOusPX`>a0S zFMm0FGW`i5-)HqJU$F=`z$cH?=lko|!Y9*T6iVM`O`q?(|1Nwo{rZsav-*5L{uA)Y z^!@U#k%>O5AKh&U{GRy-)2|Mt@3Z=RAOAl1WcnLIzR&9O{rx9=)9N3Yej?=itUllO zKNUWCr2e!&Spv22$@ItQ7a81Vt_4#`QAA?UGsn6dp z_!4|F{T9iC4$7Lo&o2LaTyU^~`3KW4vf!NWv-;JD{~&xaeJukWlr?>y)o+FW6nrv$ ze|uNoXZ5r2e+{2Ze}{gNLI0@lv-t9@O@B#Q_jj#S#3(omItIyxJm=B+v z^Yx1i`bX0b?|*my)ddG>_+5G zeO7-X{0HEZ=@;r38T60(KC8d!?=Coa3O-rmyYkmBGUy-m!{yii4;LK#20od--(INi zv!>7AANdP>GX0G<`&{}ytKa`mi*V{)R)5L#Q9X0M&+7NN5IHXdpG?0nl)lgE^Y>7a z@X7T3_O?bQ`m8>GKcyc&nSNy`eV^6m@2&h1KAHaHkngkl{C$=~*IW6K=|@Ap&+7B{ zTs{b&JW`*(|8g6AGW}_x^nG^uFVL9slc{$j|6uz5_EsYkeO8~pFLOD3GW{J`;mYd! ztUiB_=I8Lq^gA?jGSKgEWUM}azh>$^mVa{2*Do^Ue2-oFZ?g$shtJ=?(Ww*lZ~HALoR7EsRXRHRSuOK7UWA3qF~CQONgMeg6K=+oWTqc_Y&wm#<4dxcok=&)@6$ z6nrxMV*TRzKC92)_qhW;nSPh)x$^f}ef}QM@%LH&$@H%d`97=9-w(PBKAC=X$oE(ccK}!~5mefcZZ9d%=7k{Ucz$kNz1j-$%a_%=gj% z4b1n^AMx!VD0U@lqj!Y(J;LueOt$|%EB~5M_~H;>72?l^_#47{KP%q{{=HE6;~IXX z9PiQseXe&zj4qWz{WE_KAFC49e>JtUiA~>kshB^!@aPOTQE8AO9W8 zKbd~7evv`{sPD6;UwN!Wco%%KPSyOcwcwoZv--P^vk32lPo}?J=AnbKroUZ524(g6 zdtn#BCu_K-@3&9t`>g(=@ftG-u7yvgKj1l7S|@bSKbpSJ>gRsn z3_e-oYyQjhiwycleV^6m@1gC6PuBSAXXT>SQk3D{(M%Szn8ZS zKAFDXKhgAkR-eDG_bPlc{Y|0teO8~p$9MF1ZT*o)>ht&eroboD->P3^&_9}gpEZ5{ z-d{C*vc{h%AOHA5eV^6m?*pdclj%>EdFY_5zR&9O_XIx$pG?2q*@M2%>ht#pe+HjS ze^JOM|4HI&e}}&>GfGyBGJjuYJea>PbGEYVKYOr0Js-^9OQ-_(Av^`9~ZwY+`S@+yaaB7E{l{e|$~1)n@p zKLNiIK6#{m2mB`Z-ousuX82!%Padg10DmKV z@<{z%@VCMzkJJy|sWF4#CHUl#`s3h_{+`ue@<{zj@K1tI9;tsJ{1W)&k@~gpXTv9t z)Q`fy6h3*Remnd&_~eoJ2Wx*iWqyA9^F`s|`uqHS*F(N<>yOOzOG4X^&$|8a_h4(_ zlj%zn>;`4setcHH56gcid@}uAA>U{9`TMhd@X7SognXaXuRK#@2Ep;Yw)|xJZ?yd{ zg8y##9>dS@3ZEAC;Sh?C)4i^`97=PahArEel>hDegFOQH8Rm>_4#|h zH^3*;_s^%R@3Z;?@79<>@Ctk~{mr5KOMF&;%{k`hKWOWZOn;i2`(S^=XZ5$iKLtLS z{?#`7Tz|)B^=r?y2vgyc>9>T^_gVc-@aMoM)9(xUKC9n;p2iGuXUk=%kQ)L z{C(yOd@}u&A>U{9`FqZ{!6(!A)2oq*KC92)e|`);nSNs^eV^6m??wLxKAC=3$oE-& z{=W3z;gjhXg?yjY=kHOU_5-VbWcu|X-)Hst`_(tXC)4-)=QT3XXZ87e*Z0CF)1Mql z-)Hst``AB*Pp01<@_kmHzo&ibL$>^6`s+i!&+7B{w=aiJrtjC68ky*``rF>4F=aml zpG<#ID1Gv?5?_xG`1_JCgZcZCe+TpTC6Da0`22mz)4}|G$#cQ{eaT8Ne_!&$VE(>j z63pM1yjHk47#wa4@fSk;)ezqq;@%Kzc^s_2utnlWB@Tz5^&Q}N<-Jzk(;v3=T>{pr z6Xhe#xEqvpefg~Gi@&G7;9>L08ejctXAiblKC92)U;i9@GJSvh()4{+pTF0>4L+Iv z)KL09tKWB_#+2*nk68Z6^f!lmpVjB@!@mPQnZBRj;quSllV1v-OyA!=)%RJ`uYJG9 zl-GX1C)4-0FZF#^pTA%KID9gFe|@R%v--P`e$fxH{=xLeh04!o^@9)SCN9woC)R;kV2YfR9eWCPy*7T$0=5K{h zrtjC+8ky*``g`F24L+HEe<*#Q)$gs)m{PAFwelm=_sd(;_gVe1v&>%zpG?2kf&=}d zzR&7!nQale;gfahMENwzM+ar~8x>?wR)2D(ev|Vh@X0z=eZPOEzR&7s;lJmRL1DL;`{X^kmq@{nJ3bE$rVEvunOZ=$kzb-u7`Prg5 zI;S9r_uKN4xxC{r4`nScpS8S-;a>xvOus1P`>g(C_@9AKrk@D;KC9mi|33I+`ddQ2 z&+133HD(Yz2A@p7!-WpkH=ott0smL<$@KmF*2qMk)vukaF=hTgvhvTdOw;YHUIS&& zSnB(%{#y8D@W~o~B>rCbAB9h*@3-%ozR#L|t4@?*6MQoLH7;~8|30fg)nT8r>^<{wPIC6vC;>Nj3w{>eYK@+Z@;4*5Q-zaIVq_~eoLd*LVGlj&E6 z()U@@FPpD1<@a^qlj%bZ1mwzh!yWo@Qj|=%e zt6vHKVff^c`itN{4WB$xzZL#Y_+QA-cobR*x`xaV+^Wc-|`{k|a`>g)h51C&DpG?0@@}PsV`eh0- zD63x!e+hiDhHL)){;m2xtG^xoRq)C5{q|aYpVhzmQjHk|KY>rC@259h`b8f$|F`hT z^e4Ny4=%sYn*KES|A0@X-xKnER(}BgaZg(PA=9tSw;3pF{(V-z_%aQV?G!#)r)v3+ z*FYJR)%RKbY4E4RC)3Y5d(ih;{q^wY!za`C>zk(Uv-*ATo8gm3>TiReg-@oxFqD6v zHT}sA8Z!uPf={OJ=XbdLm%;xMd@}t>q4a&$^jqK`@|3NA@<{zI_;L7T`V&Iw`>g4& zhkq4(GJU_iboqT&zpznb%6UKdWcvM~^nF%;3;b8%lj+xne4o{y5Yd=YKet->UUr#{2usZ`WMPPbWqmxeOA90{v7yZ`Yp~L z^nF%;VoYPo&lbZc)0f?v8<|nrP$n^c^J=FJE{f-v%&w@{;zux6;u>5>he{$UX3*nRL_lA6*)!zxf20od7 zWytqg{gTTyrkuBcPo_UPHDmH;Zltm z1fPOWreEzs2g~1Q^=sk3_otRVnSNQw_gVce_@9SQre7cOeO7-5{Ny%EpG?0$=m{pvI3lj-~E)yPDj)en}L|7G}O`i(ks8I;v;RFFYg{YLn&z$a_CwqL8|ql2>g zKC8b6e#_4+|77}I1y0ZTKC8d-3XLhhj|iVkztM#brth=*JK%rt=O}+L{hpBTvr9j1 z=^sB}{z@=?zr1T?qR;9NApYOrlj&~^rB6QjSv!6!`-;Yt`~AVS;2GdX@B(lbxCOik z{88{0@PC50gKt+pOxl}1OYb|v#V%zVJ*44BN;r-WpCeDS4&+PV;O)kL1CIymTn~0U zdH64e9#5VuJly%b&Wz=+Q^NIllB`p;K9*Q^bM?t*T_3&hAB9h*KPlwKA1-rrcltoaLWPe~|^}^6#^z-_m9gqVUP|cZKrrv-g&R_&38R z(=W8y=ko8f`g^am2Gy@w_gVc-_yMQU&s+JC=}!pxKC8bCeldJ9{c$1RXZ3f& ze-C`}Nd0~A>*15>Yn|3X|J2CHXHCEODvJ<>Pu8hg|5wRJ2W9nrR(~D*74XUQi<~{^ z`>g&(_-o;l=@;u48T5~)@3Z>bK57xZ1D~u@HUE9`(Lq`LJ_Q++)n9$Jev|WA@X0z= zeSdwa@3Z>r;QxZl52im&zsR6})c0Ba?bld@xBb%A4OypZ`epLbL0SDW1sRmpFaDT* zlYSL^vQAaMRs&^FR^Mm!Tj3YHVCj?TuXgsJ@3Z=aAJ>>ckcLmDUm5a!R=*m4H+(Yv z$sylo_1ocp8$OwSf5`V){jv^?DZfYmD_edt{rZsav-+#yKM9{qe^to$S^WvuYE0>u zZMXEv^vhl7VEOy3ek1(d@X7T3{MN`spVi+8|B+u?`egc@q4deWk@$K(csKU6cVSnIui68aSzfX9$`=86M zv-}tT7WDzFQzy!&%Yp;_qvh$dmgm+_ScK2OC+k%8qxmwDL0NsD)t`F3hRE;#?y&U9 zI#vBKA>U{9FI;8*U*VJK`{@mre$P$j|LJ#@KAFDXeyQ)Xray4A`Q^VipG?0}7fuFc z^?g>qxKl%d;Bxq6ovO?4Z~y9(KPmCGK2Gj2{}ymL_?zHGV2u^EsPawTCm^3Ag?Yd8 zv0y&0c_x_84{E+OKA%U6fP4Goiws%$X!x2>ICRg&Df9iEYY^U8ZQ=KU`F_pKU_S3B zhZ}Bwe17j0FrUX9E%Vm-^LYh*Y*U%%$Ib@xdV$_HqTxLM{}C|HXX#;ku z^@`PCo0sV} zxB$%Obz@-mkC%h_`|_*6{Jr)yV7@PQJ(%x%dmPO3zt4l&fBQ3-{lT$vT&l~%>z(fe z^Znr$f_eYoMPNR!+XQC+JPYRU!`}er{pPoU`F^PTzv7!6Tb$YEY~S@ zI7YTD&HqBI-?PBHKm9^5@4vek%=_V5z?Bc%{My0n@7)NVitsOji^1Ok^L;h_U_Ouf zJecp3{3Dp}rx`WM^3V70jsx@h$7C>{51#?%`RO`v$sEgn6wK%2J`U#dZeIlR`L%C? z`M#%zz=JS(xffu1ZJp$(QRnLO?yw)Btf4}pPF_vFmFB%W#@!}M4 zH_E#bybBx!m+i6gxB|@Q6IX)yyyh)nKEJa8%-EHIDXF9!2?d?~mH_4gVuk5{|E6Mt;^ z?E&-t>U+VwKld>(-v|F2Fz-M96PWh{k1Dd|;r+$OgIkfGv%q}6_%txz_dOTP_rFKL ze4l?ixCr_GPcYxNe>a%V<2?%I^K~zPdH(4&a3|K^VTW7(+Y?qklfk_HR0-Z&XW>oY zMBMmlFz>fp1Lp5TZvZ!@EPg+j_tXCl%;&NG2Ili^M;u}Kjm?9x2M64D39&n4QT)W2wq!b^Vy)YJ;twr`96*@ zV=cdY-t-jkx~nYyx!}&LjcdT!j~OokkH6OV8t@jhSDy!uL3{OWaPSF>-w*DB|2uFC z;{OG_>SBvO<|xZAf6wD&Fz;tN2h97E%E5*0=6@K>^JUAx*`$U4Cz#hq*Ms*hKz_k3 zOO1Dcc|YgqqfwvrKu3lN;Ib=>&jYtM8qWsv{r=71&JGK21J`4J&sJ_YhA zl#lk&M$6|A`HYdzq4If~e2V0AxO|R~&yn&OE1#p}bF_Spk1d$miYiDUna9e5T0f9Qm9p zpY!B%zI?QAc!7N0BcJ!m=R*0sPd@LL&j;jFCZFl@nIWH<@+p^3g?whoXSRGQLix#SX=p1QI=H7lJ;W-aQ>$g)^EQkhCEB_}UQ$Fs5WNH#J*wipvzV$Dl6YhFA~ z8qDoXe^OmGl8wPm#3JeGi3FDo3p`UN&zf6Tk<6x7Af_$djM$QRa_E${Y&MmwO~*2n z5z|edACp;Sn3{!Du#iwInzy=m548C$yTRQtw_{Otx9IH zk-@yVX>%j3)sYo3taG!qjD4>*ooeC&ImxPkAH}9rv}0OZI+IEdmR5PJscp&ZSaxPx zIvwLO)JUbV=q^~wQ7RWFESVcwl8j~J&Go7B*pm8mTP~^tH5Q3-Xzkd-G~pN=FmiMD20+2xV+(itgKjEbZd)-0*D z(yG|}Z4x(Yf0|!-70EVjVzP9RcExf@VXy!y+Oz3Mb9Po-R!A~h8_BlV{ANj$#S$2- z+&Xp0wxbh`_)<;0AW{Fel;!BcV ziRi2?Na|EoZFnx3p-WJ=Vp&rP>uPo^=?V$Wwyic4m27_6d`bnB7Jh~_F44^FM5-y0 zQ}+v=S7%9wH{7b^;?!WsisnSjuOAW{WvGQUn7B@C%4tg2sX)M90u&z-bNSG~S>oRn!zNP`&NZ*~=lNNXk*t&g+WlGuzi zq)5CPlUs^el7(_HlNrhBU`A%w)@hr9CCJ4dI(e|tNs6{d7?NIfB)Oz5vIG@V;;>=7 zIFgRLqRGv8ZmKO4t4=i^WNN5V%w17cp3|*b4@ta6dI)}Pm*i`*ExC;?6=geO0hay2 z8D?Ajtz6@{rpEd-^{GnfrX&Uz%;L_BBoa-L=B2VGq~#neObZ>7J835uX9hPqnSWh# zIu=U~TmLPnE`HTuf^{o0(vKQ418iHlMUbX$@#1(h+TCIDaB(a>bfsS$PiNaA3E8pB zx^GU$TebG)=4U&X*|F5JSguPW`5rpi+cbv;Ts%KCqpHls@l0GA-OzODmPwXvVr3*V zq)8T*%r&JV>FBIfa~n#yN?MM1Bq7CP3%TE9Y|q@)*2S{5sf;*GrYd9opcye)Z78oq zj8+D%#_UuoHwn42T|{oGB_En-#ZaaDGxkbl8C+*?aQ{%9ins<|cM!JdI>q*8VV<5@ zk!9hvU> zUzfxai5anS>4aukBoZWj58cyRHiYXWBeA&>1^qRdv>@3!B$9MuW#8)Wkad4CSO!Yk z-5yeYu3ea!h&L}Cj93$kMKk+%S=?mZ=MU+%xT#zgFBFwTw&&*9f=nzuUAw-mQVO<6 z-t?iZlIwKU$I|IYJh|{gms;%kQgBv;+;D84}xe!@c&XO6i1P42t!-xB=9p@&svMw24yqK$y)1~lS{gKUOa2?E-O(mYy zg3Gujk;%J56>B7OlcXjO*)ZjRMkdusA1ua0qxrFAspV3C{KLb#$Z~g_Hn>gHNvAT} zCf&5qL4>rAsYK!u=`1D&b6Dq&H!~U8|J0`}ean$-{?nVY@#Qh@3)}(CU>J^o<__*5 z#PB)^AZ$$_^aDWX27uT}AbO#LyIAh9bNP_|d+RX!dznc^I-N=nU9U2gGZ@^>coVB5 za?FKBRVU{Pkh7_hj!1er`&<%bb~@79B8LRtk*-X&dLy;9X-LmNLb&b*51wSAs~;@p z+>#C5F&tnrcO){Gq4BvR84O5AmdCR=#?DO*?Ot-zxq(U}p=&sly1(2^;^dJ$Wo0G z-qS5e>Xzg078WGa2Wn$%)`Jm-YhwmO_itsqu>IPZ!La?SQaD||tr_&ft<8dDW@zy( zXpKraxu!(x)R4m_>{ByUN!A8VsZGg=rs%vjG~;g1SfA1+Tn;B1E}e2-gF8cYv2+)7 z_Vq1t+8|mNSscr*sGZYXSJEIG=ge8TQ!X=S*;=t3s5?c))x;p#dCpjo)#C|oN_8x` zM33=i&RQ_PdSvU;icxhW=>u9oQ8(d(kV@m zOuV@vRHuXQ6bYVkgllqrsX(ICRCi?oLZ*Gsg4Gl|l%{Q%(BGcjDF18C=+cGUuSDKera5caAa+_INF@H|oxefnz zt|E2&&8Rgo((Ot&wa^w>-%wxDP+!_mA#0)TyavhS1um0y*$ZSBD+h+s?6?i6zA9YJ zby?~!t|^tRuDQKE(iC4_T6(^GPed}AhOC^lXo$-hj*4NT>4ut#A0Xy%$wU*iE)&Ts zb-gx70;rF}JO(zDqO($X|bb7zyJtxYtv zC1dTa(yZt)gH2v6$G7{>tyPW*8kXCECu6!MN5QoV`ejLbdqb=AHB(7xxU(x7mY3*M zIceOyw4u3WX~W`3T-$eVikx^zyQH(JHrZOGPaSD;y?d>HdNNL0)uyXrX*prkoJh&( zlek2QCL+MP)RhC zO0;ET4Ow?~#!b_&uBp|vsqs{mzp-V_%jC4U{%w`+jQrJ3anPV?xa_sciRi5KG+U*B zWVh9@B$mxc8OP-)e{kZ`*op=@l_0fja9Spo@U)Dt>5SaW<%{Jb!(^m*Wiez&bNvf7ID8$ipcx-QcA+zl%Yi=nRKa22g9YB zl>T~E-At(?6%`3B8(pQy?|IgRsj8jg%Gh~{>e@?yiy>MJ&1?SeCe>5=S zj#Nc+Li=IT@L6{W+jaE;4nYodq#)hG!65Bj{-3W^Q>5f$%j8r~b4)r-@hhYq)m?Zb zy+rm6=Qn(C{v55A*e^&my+Es?uCpq)$JoD3euEX)Wb3ZHb)NK7{TB59dWF?SLF;To z>|Jv@Tw5izYKoL-ZqM4_S~r=!oHDRR?;@*d6y66X+$r~^J!R!$h!NF!RqGE7|Z*u1N&6dCc{5M|s z1BfGB?gQ8(T4c9@+1c&TQV+?s9oh0M`0Td$3^~mai`Lo(I-IZdyt>pKNK@l6;K8Mu z;Wmx~XY=1&%F@!gauNhLbsl^pIdC3E+&Ua&7W-}GR^+%$XBVvpPZ<1bWmI~BYrW>j zmdiP=*pRm59Cu)aRB+BhZXU3UO5t-D)l;U*IiZGSdNWN!Ybw*QIF)X=Qu<7(D-Ti= zYU6dKdfh|LkGS(ENNnh(cR9|)LGd~6NHdh9R0cPIhO;!q)iA^kU!upsRMAPIj4fD~tK??^k3_t8v^ZS5o!-q&FWNHCsi;EZp)+9Cyp3 z9g$D*3xB`c4(z~t%6W46F?aW5IQLUZc7#*pm$WnG@~qhZFm<Rd+8$f2Kfn-(4CNkCIo&v1!+x-S%}9#mVE!8v%fVDTulcVP%|Ykq0{`{m zIY9SkBqehI^$iN;0M?r+j|0u>O%{c#ingJ0YePe}Uuo=DYY*&No&48V%z@|l1_gXz zaRg=TijEtY9n}rr?7eZ34DY?!;uwBzZ%`D&OK(^VrKNH%N3NR537uqfZL^-_JHYK7 zBfN5AU4nD!>Z_&mgu7M_GS}fQ$N0zVdecb7<=Wzvp2OMIr)2K6bM*2wC&^L%0kS=1 zxD=)wAPLu_lq(YD)z$K3fo>VGwC%K9P0NMo9lUx5O!`~a-6(b2r@MQ$TC(QO83@jdYho7yadW zgiPE23RmfV3tS_oxT|n+&+Slf1`^k=+)1Q2bpqX8LUb1sE4&*m+$nXp8r|-Hx?bX~ zudZ`_HM<-sg)0->-5oYTF5Tz^^yggtmNK5va=q#rFi)Ofz z*{@(OPh9S9(X!PyFChm33+iW0`#0xmHCRs?>CEa=GT*mgj;Qsl5G_N`b+zD3*D$Mh zn3#GYNiIgYyS3!*q+z7Dq)zCaZ<#CQ!dI#-+t4icxXNvaX`IHZkRoZ&E51X{?MYpl z?=BB{S=ukso6no1Dc8KM!rFPkX+zGnhO_h5q?GH{4&ChHGI#H6Wn9)^=rk(Vb?8!Z z)Q`DeC%San5;+`ibx%g>9UyWOX{Mrf)^fSmP>;E5=S1}y_Rv$I3+k&8^*@?h<#v$$ zFL9Ti+uoX3re|>7LzC`a0x$DJuWs8JQ$G3-I!$2*bPSZkGJOaxcM@Z0Xy}k(Xr^@o z<818gtzCzg2R5d=TZ`;@nY1+=?v%hRxn;+~v^D3wm-{Vk=@dJVv2N1P)g(pe6~CRl z&?a8)71dqB^ybCpYCEn4SzUULPM;OQxr%>x|0r9B?LyrC%S##ewhv9+)`S;pXmF@a zdE@0C+RB%@jR#9OFNqUG|Lzjn2^u>~XnRy-+O5dy(sOY~GSjnOh${{Y$*lt?SdEe$ zjGh6|vl?=S(rp}`C!zAZhwOd55c9Mf5b~@(vHReAUQM$Z>GPzy?!c5O?$O@;9{Y7x zP3g3{TuSVwOB3ZXIecL0K>~A4&TzA3D^u!r&$78x=pD9}dDoB8#~9o+)ZtQh+9)?w z9&KPh#_g%AQ%h`dFNvg+(%itZtu4lj7uhW8q+;3913&ugf?^5fwiGwmdC10 zZsmKcSI?qpZvlM=%Ys`bdn^QL@U|@rXW`(nD+cLzSKj;zJ}Ab{@d?A8*l}qV6Wqx*0?Ee{%DJcUyMV8@C6!dWJ6f zdFWKgDPY_hKD6~5I!9?pd4Efl>_Oy$Q3 zbGyz^eaaqnuMN+|_IKfqqDxAy87|YyBKsxfielKV;$X6t9CvUBNY;+a^;v6OEc6|) zW7cQk`2b+8Jge*W_tt5%jz0t4OLP+PT8rRvJ~V>$HSBI}yX95Y(6PsXS7)d!-l$&e zzf#?@4ZBXIirHOwda9>N4&vmd9CxTC2aBQVr+0K8==f2hzR43L{w@>GL!IN5|M1Vt z#cP{w!#&6KCatigBR$;P46J%tSJ6Fpx8DJw>kj_E_PztGsibR|-kXYILn2sEDG41F zkSdX?6a`BN5HPf05)doJirB@qBZ@9IY=8xIZHRrX*gIHIQ2`s)f996tCN}{@*M0Z< z>2qf0%$ZY>Eb$ew!f9}cUI#o7G7jezN_g2zg{=4rBA`Xt1tNN)I70f-RYFnQ zFKLR*$RTep1a`b8^qUZ7B(S(fOz-ixha_32bU~Dq+AR`aHr2f-BU}O(zp2VCmVh?d z2uThq5empw1W>@O)|&z&rdN-{Okf8A?;dndgDgbykE{qmg@E{a0%g#Xg?EWPyIM26 z7DK9;X_9r5tPy587^?>dnT&{M2gvooSiZ<>OjwLCXUH{=0Zv6Ql!BlGVL_k{AmaN8 zDUB9Ii6>BUJ<^sUZ3)Tseo7!Kgb225&Fo4k zLul@ZVQesx1qP-+*HET9zoG%IKjD!ST4`!vK@6zAVbvQKkh zAa51IzJ+3ZxM3OW#N=i-E%J(#%tVu7vnO$r!o4rHNzvob#MIfq;t4q)U=QO{h9Y#t z4yvgsJ3rF>KJHL4bEK;*x}cT5Hh}=p;%pO>0Sun1>SpRx8}%3o#lK+G{rlT*Asj zUO!?t#6^5_{h+1LzkVRZfeWyQG|>KAhqeXFc1oGBJob{0?FcIs2?BF8w6vWjiRYv0Jfdp}mo`6!q zc~1zSB@tl6MgcJfdqM4a*}%LGQiFn~QThl|A0ScqD3keD_KQ$F821b98+9%Q2p%YB zfRYEkJ>qcE-OUr2`(x&D(uy`MEXB8IGhlAw<^@IuE!_0552@?Y0-D2KNNf@44ydpM z4dw-+Qc0v1u+f%6cQiBc=J5fWd@~{-k&FtO>8`2knhh>%xa9>~75qWIs+$;2bGLLe zWBXYY0{00dXI!CM2O^df2xywa5AIfUIA?H=jt8C)ksFjAh^kh32E)za$UV*R?**|!ses;+P zB&;_h$Q!OX`PRVjDt>3s9Dp`4;IA-J_%RFz2A>1GMf|M76p&X?8Fb*?2grzkn;qow z4c+Y!mq|?i16=`$stzL+iBA&Pf*nfV(*v5H&u;S&qnZ=Qf0L}hdI7&^Ec$cF>tC-?&gJ@h~yFi7x11OLIp zCjw}&&H&O5(g58;Xh4-!0BA(-8g+RHE>=Woop9QJ63}oGU~L?K1Ehu6!LxZt!yN!e z=7A}aldxRt=1q3^H`v`BbJ)fJF7gvtHge)A_M{XVDaC=5;z&xNQOQZsI7hlUtGiEb^diB$OhLz?NLf zmb{bf$xyZ@57deb1}pLmt;svdn%tu`M2^8hC_kR4<%p#t>I8T?nkJ3Zhq*x8I382U zgf4o43tZ^GQcCMUgAwuFfvIRBW$9ANhLX#|zJSRw>?auFBDAljMi-2E3n9N~KwZQm zA>ikyB7PEMF-2gYlnP_iplUd<2VZO3SZETCn(P4q1PkbwMtcCS&WKNXs8j3)eP+f2 z(;-604g@r@M0I3PBw#%7cMg6dIsk|-Y4G94Oha`7z~3MY0op$jdjJna;E@76nt+EG zC?GmYFJL(a69GiHOspnwuLhEYuI#`E6yM?!aIiwL1os*66SpfT7C~nVb5WCNWMTa! zSU2zpwhb&EgB{I7=^Ro~E2>ygNV-ZbY%f+gkqsQY^MIol5E=$_fEeh*(FGxHEir{> z)G`UCVqW4=ePWP+s0M@I!+_%`;K2>*oTGus0K{PvP>~CeL7)T>P$QCY*fCk=J^w%tn90DJ=v8G-txl9$`#k50Dmm>y+lD7Cm?p0yok{L-Rl!`k(e@ z3nvPVoX~3|7+#U+ImZ%#9tbP~?WaHy>ckhBoiKa^+z5!ihma5gBgQ<` zkg~w=K^CH8L&^iyWIlaC+z8~113(FU`a+0{gzNz7lBmiAMgvI^UPxyz{vs5Huxz9# zQOKP9Vj^9f%M2YGlSK+J5%AAtPJZDgho}lVOo!XE^{%6vlC=QFsdQhiGAF-4jMIdZ zQkj!q5Dh}+jWN98mBitIp?-6-I5 zwT=&l+_-=nmB5_vyO=DH`31YfxGaL_3xRElylhbp32v-_nqZ(DZ9>T(wJeahH+q#n8+}`DR|aNf*E3-AztA};nq|m&BLy#+D*ex zeB20!@rS1=9gu)IFNnb^1%8O)3W16Lqo9*gzj>%hsn|5YT0bE&kicUcxQqosvPC0d zBS{kDW&^%>E5phozJPsO9F80j6tIMhdx<*&F_uBg-~t6~?L=UYT0x-Y=)9JB@`h)T zI0ihtFbv_&DX*Mm!U6O$ziN*rh-k(1fhXx!UND+1{!2W0w5ReN) zwll(iqyKo+XyGT~xJi0MNPGQ|ER-dzkhHqZ*cD5w)*3T+scj*{ZN{~Lgef6O;%^g- zxNHeXnyTLnSemNZ8qhS^9+LUv;F0ojX$fScRBZ+*QfjpZ9@3g>B`BoRMkHt;MR9%y zbj~2XE_y_Nd|{-w*bIQBS8M@{5zyfiLm4@e(Qfk~kzB8};E>!}GoX-MscA5XGhVI9 znyCN7`o2(^uElzp1m+xI*0fstv3c!0cmo6fvd}V-X941T|2F<5u}?%XNETZFwFE)K z7a%TW0BIzPEzo)m3xex8QCEU?MB}<&tMvtR5)m>9F!5v|3ot9?)n#iBQ93%rxfigAV^)iWZ^uq7mg1BtdlsJB%28W^8!TCoM?vwN9zr2 zQhwJ$BYk0b4|-%~GZWYov5+4a3JDsU!UthrlTh0SED>>J3h@;X^guBOwyMO~sb~^X z5N9Y6OOn%&qPXD{p>3>74~~R9v=iLI3K}Xw2;v1r{F35B#52X6jAB(`#9PE9PdHd0 zdKLsIMN0vz5G)=k`YjfK6ixI@1xQ@j3Ti4N{DyW+!Y{<1wP+Ijg5J2%qkv6KvU6s% zL&(TYNdzI&0};EUU=Hd^78^3^M^M-!D2*;DE<+AR!wSJ&+3J`(kWhjvfQRoyZRvuT zF)Tg^RRm+8u}LQb*i?&~JvM2W2iq68O#jF4FhXyVkfEsic+m?Dal<9>$b(Vd_?6bg z<=1@tp`W7SrCG;7Wc2TaHG*(PcRFrlgKu3t7j+kjBA{9g(+kl3MN<4$V&os z1|*o1Xr82~Ot5{hY5XS8J@ES`1&_RiUEuI~!lOx}WrVxJZ2}DCgzPYc%?4=!(cn(7 z17i6gc5D(8zQzPQ2A!916N!X@LZ*v2J{C#F13&@Su;^MOMf(9SxXf4<9>fBvh>)g0 z*F{3uC|FIHgEm9Q3kr51EQNkxO`rumlTx6~J)ec80!ZO!?EhLAs#a6kxIZcJkWnqT zdGW~OC`X7Ui(@4WlquN-uPlxg;-?9C6o49=;HE+xK_L#Q(2!iRI99SaRvd0L8tjEA zvcSpu=CM*Mc**~@I9B4k4>F6G>}-MT=!ooysI^8sNsEAPEGsHrw48t)2TKy9 zKqw6_EDNZ0jQ1>zW+yr{5ocZ~j~ivn;f?&pFn2#sgNsL86JKocC~Js&dngZ11f(a} zgk+XE1Oq(6;&%p(jQ%BgN3=n9_CMib3NE8RGnE~Sc<%aL40%G2LSBd$o6F;a99K5B zwc%45$RdeJ5UCK#1;jwFFX*O+SYm z!>k=y(OBLDVGfY(u)*6LNFhb@0H;GrEtn&%7U&CaMmQ=^p~*yFCf^q~TtSc)URp59 z!GS@9E``7X-HB!)GHH~f{<}5-)|;fO2HY%CLmZ0TI=?A+Bs?czIS~J6__aj1(psl! zB8^84I|I;(V!`fQ`JlgK5U?0sR6;tGt)s3EVFhFh3x@`i;6~?<#nYfQ6eg8-jT)E2 z<^l;A>e!ETGXog6Zbsl?37x(pi$Yd?f@8uQy5U{JBmh^}C_eBMiH{U>@`vZKxlvqZ z44*K5Of>3B_u`;pAQU!GoQAi7rVL}TfxHh{HKa$lWdF@5puZ{1_piS^n>x$l7wP|% zaHZncJo#zX+D9JQ=L3!WqLbuvnfw+7TFfo*vf5H_pzyE)q4V#$JYZKC>43cnFkhqy zQkG-`gQ&6NVsTsyA<3dxq8(#XwM9*Jp%_Mj%6wA|2vyc06!G`S&rGPr22@QAOOhEC z?!o{75`jA)e^6n&lxa5;p;F9j4YcZ+2E3$V1Q^8UAc+n<*+MZ~&{!4=+=B3>jW>(9 zpCv@0Mc{|l@?}Qi*BxjBxHFAoMPYX+_zp=*7E1{NI%^;*H;Ai+ULBwiyg$LkJJuWc z07X3B0%0xQGor_VbWc>`K!Wd~QYBDd7UY&Iu74s6a?9dzQn*npS&&-{5Io?p3~0=N zcqAz5CfQNpCl1FqVz|3G>ml*Gn0ygRx-Q8#wxkdR;9cIl6Ksf+0Q$kA)BdgtlF*~@ ziR}rTPxDyOKnF@FPBzXM{-FLD(X=mH(|6#RM8cI6&lV zp%UVsAn_#;Hj*LMLR&!L0P!_O2$CN+jg&kJAz=kK8VR#VuJmKJfRfy)*#Wd5oEgGC z_9gpqhwCI7nD4i!`3bv}#Cegbum?vQ#7;~}0D2s_swj5yK?LY{qSijfpN77SfIFRd z4Ao$%Xb1pA(-cD|C^s8T$G8K?@j*;^JtRb!hC@O1Td)XKXhVQn3uSZpDa-`WGa#a) zxa?#hdj#YLO#smh5^)ure?+?w4h{4KrWeCQJHk>xzzaZra<~%+oN}1una1ZbqxfFz z1ePmM9z)cF#H&D;^+3rMBZ`Fz%tAJ4D2q!lhX4ccWhTX@0R0{mGKjJpzCyU6m}q=% z*eB$m22Dte%3LfV7oNs3nux8Sdi*Nsn4M0A4hNLDNxc>e(y0>zJlfRVp$ z5Q0eAa2!~-o=}2=Yky*CqDuWB6FCD|rbviyLPG%{(j9h`U;qvlRvb;jFLNvreUX3{ zj_7QEAm%9=3=%SR5|BXZQ1&4`9=piIg`@y^G?+JRO#Ktj2Riq_)i@jIdcyfab!g~c z7#zPQQqE%05iT%;fka_s@PVL(F7ar>9RZ3GY@D#zf=zgV zmPIK~Oa^}9=}p4nmxXwgMJb2Aeu1I@675}DXl~SyK~fY{3>&m0rZ`PJkT%k)v{2eD zX|ee*x1b9NUg?D);0f4X7NwlUrxT(6%aK6+#N~XE2M)WwMh-goO(!aSS5jl(_iY0M~>?a0!w0K>!2k zA(TD_=H5t9W0)Wo#9k0g9u672+5DKXNg%dPR49|nCdl5&UTS}aKM`1NpfP{e`9fI~>}kfa1ajEi=`iBCxu6at$!7JnE^H9U1(p#U4)6!fRy^nqn@rq*08~i8ok$Sv z#3z{HksJ_A712}2D7I$C_Ok>w90eEwDWJ3fIW&tw-K~&U7L5U-Lo$<*SmN|R5ZoTN z8w^9-JF=3XZ5o3e(~`L5U?g}5avqmv$L2AB=#JS!HL1(*q-Z!C;COt*nAKTiS;+49**cYGr~t`%G|K@X`A0zx~Lmb@$N z;S2@)(KnI?W`imv*+Z!Q?2=@9L)QP75S$o-*Dd+$NPk?O;VEBFwUn1oX$T^lMp*ZXcFL#1n~#MNa4pY92k5KgJw6( z=cjnLosT290q=*qpEhJ9ZM#*aI&N zESCZF37Bq79;+pXH<)mCtsNMQ1a>5VIRl%2EQ`+r&sSDj6br;J!4EJ!$Wc%WY;N$H zLC^&~hMt(5Kt?TyjTfA;JA)qR0|p7Iga6>XMF0&>34pYNG(fiy8W^BKI70kk0f^oEG>S|Hs1rApMpTH$9g>6{r3I6(1pBq^L9TA3$anH(453L zGk#s^l;Xd(e?Hnlh*G)boNg1A0k{OU;J% zA-QSO?pS($n(}PE{*$2}lH5F|tW;Zju-N06|_~>vUgVKIww}!i=#X~HEK51yYKU~NQT=~bh z`YXPlCUfR2DmK-+b#R8x-QFIVkLur#m^nOU|Gvq+8gGZGeR)GEO&s=g!0pm}zd^=h zzYQOs<#z0r!oCZ&m3?2n{nY-$v747wLl@6t?22Axms^(nKBwsTm#zC5x~Df!x1N%$ zy}9q}DE<_KM|wuS4{u(4?q)5OyFPmB3Et*lxyDaPXTIe1ZU5*}W!7bbvnx6e{HVLo zVDV=DSK~AN1`ip2)??A*%5m|plRKp;#u;}E(9+pZ_qC;aLsB_6>;7| zs9SAacHqHZlFGF-t>XeauX#H4jm*?MYMahQx3=X)eU&@1k5 zD!BaD;XyHvIxe^{IjlzQ!)4cZwuescD1P@eeqtk@C zpyL+?ZTmE_mcR9?bI_{t^!omp&r)qC#aq{y?YEl!cE65I&msf4c*@@AYf1}?hJRkb z@wujw*Sr1DP=AfEr*E$wj#_n~CVZKb7W?L!#2tP5AMmYyWtp#?UiEnaJ^qB!%geWd zH>jyLcxY-r)v&x0vHpF<#7Ae-BmDZjtv6(}RnggOQJ;Ly?&`py2cC@_{f@o+K*fR5 zDwggckG>4McQ3P1ptGnOUdArep>s>A8rBuD&kUNC2yWn{C(WQA_yI#+$JUt+_r{U&?Az@|JZ{C?I zGdpFoVt2{Ux#rNRcZK_EYDP)!>x26kch%cpJRH}^rYck29^VpA0HdZ~Iuhm@H)(FYDU&igXOQLXA^x3xv?=`~-! zElsEcxEdnWa_|FxD}o<=kOqFq?F2tCO$GbW1-~KwR)XvT@LLu9=zt&iPowWl@0lN> zqE+P8(FE{+ydEqA+YyvefH~+ta(!()OHLE}OM{mZ2^Bjn0z!}!q%8vamqYIxwTp!N z297-f{0QzFio&nEZ(h`;4l7N6v(ba)7@s_0*j&+`9JLu7d zH4huKPBa$xbieOVYn#`lBJofC&su|$R8$v?ub5X8{yyipN!mDf&%mOi1>2NeY?cqd zbttx%U5lY>hq*U)>9Ef9 z8TY7qt=3Yj)VU89TBa4$4R{k)JvqMLhodk5^7|U(qhww*>cDCPH^Z@ur%K0bA+O#T zT`HOE=lOEkgXAwu)G2wD@77V*d{ut$a?)kq<1Ft(3!bDY?Wq5D+%`V$6Gd%Oz{>-* zkBUELoOGHQ+^~PW^|7um7DavbswtxzRrP$n@yw9N4tCv3m9D>U@4Rb{OK#~D<2%)} z)_zl@ZD%EK_o_1)N;_2hwRFJuw&x5xPI)qL-s?Zy=109KX?xUVMWNDhP4*O*%WV&T zRr>PqsY{>D_0MNIM2yM426U;pEs#eUwKzZD}+x;xouSLyxnfl8rOH<(%< zpW1Hz&N#JsWramCduz%bmbhPOH!$#9)|HvwYV|4_T8dBge6^-o@~Z|K>hw7u`MELF zC%n(C+O7B8Oy~F9r+A1G9>RFwTIizNF?Un--k!CTq`l^cV(eHG%DQp(&g(7bkhA4r z(6;1?{(t1ri(b@CHqSj+RdAf8r3ywBe&#l( zD3jb{r^DBj-)`LTdF_?O42@Ouz0T!6kL}v7r-%O0H;ebLD#=|L)@YERSMENWbJnJT zsn=n2-TXj#@w!2ea1@tTa-rav+XxmAXc|Uu;nydd}wN|m>=a+}qa&tEX zhFImY&KZyDb|qqYc2antR_C3oo2&n``36VpCT4$`5;iJhW{rAuz{Fz_-IG(bRXg_Z zGtjMw-~_%%PFff-;`ImHqA?ns`|pTysFC~9r+h+j$f+@RXNIp`X0#-v*JJ+|^U{^m zcYdnu^(An3@=JQ?!SwazHP=7H@b29FtKG6Wi@aV8kBqG7>(Jl0sBn4lle(TOqEv&| zn3v5n^Y?jFHhk2ZCf#`5ld&si_h{Yy8LTTGjD-lMdt z=eHMIM@&pI^wde{f7Q%E_vzOzxiik%^ecY+GIM|4XMEyS;xI6Xc`NwF?4s#Qu4}Jbeq`9={VMX^ z`vmxWOOG0Iy8Hg*9F4iU8j9~~w~gET?JuppCjHi%RmS9hw6B7m$JCyoem!Ddr&s# z*E=xs9~hq;ZSmK}Ma#F^J`3~Q)??5~XSda}QXW}9o^oqzN*jw8FQdKZ*&gzdAH-Hq zx&|IR#m2*@taw6osM<7MNBexl;5Xdq)IK`zT0mt4Lwt#?&kV5Gf?;WxuS>pvadw>(KFzAR(A*ORkDl%BSu zKULZheR$Hq6w}%>Hb!#YzQ`@g8M;Ab#b>1*%wtPF-+iWGG&J+9uK&7+pH6;}n;NvH zwBMTx4be)y6YJylYzYf8Ur~E~)*HPUg_I1Vp|zd!eC_U5y$rm0>`}r4?V(HJ_7B#K zeX#YC1N-XvC;jh^kjr$_-rDtAhdaI7ym6cQxbBKV>bBDhBMMGVIsf@mU9tOz19SB1 z2b{ehUAul;&i#|zO(%kb659OnI{bsjLW4A?wkkzo^D7ow)=w>Z^=ZX1E#9ZToYyJ$ z>ZT+l)|{HQZm5^3X;t27RtMu%pYCY_8pmWHHA6)mp{umzRTc6xs2K|K@-$tlwu*Yh zOmBIXqLPBVvK+AxsFk0k<4Mg@Qle%lyv$crkXKMp>o{@qrel9}*Mb$X=HxX&#Ymba zRb53fL`kKcLP!v;9kmVo&}gRtJT4@#DD2dpo43>!5{rMRZ> z$8xxA{sdYFsy-~I*iIWQH;lvKQ`}vt-3+v8R#Yo0&B}^qMY9bz(6+KCd{QUS%&Gm5 znp!CUSkXPhyL^XQu3 zT)wlHk>SfpJI3V4ISt-CqAksZl4_c0*mdVI|2FJiIcKk3Y?F1`U$-ulfAOZ8PfXhS zt=kG8UG|+7c3MGEUQWIs^G|AK0o4#Jk)e)K2POUC2DR%i+?l+5o!)~lf6X#CtFJN$ zrs~4%cJlJym6WN9;1|^hCYUI7q;|;A?{|?sI5$=O+uQhg7K8r$FxW3$Z4A`{7BEuk zP3=iF$?u+TG}CY_pP$^{(lUyhV8Mj@&mxMGXvqcJ$O0r$bzpg2*n<+-)HA7iDumaB z65ultmlAAlu$1z0ZjSu;b$2Q@EU@o8x7bj_ zJoxKhjxLRXV<=8Q`xmi+Z<)tqEj)|w7go%IZ|%{QI@s+Bf^u4S5T{Yq|P zmy*SyS{`%WQ(Qi+|C{lN{BjGEp|4hMROCdw-RNDYa_m6( zBO@a(&#BeR-u2eoOEKnhxVI_-Q%*SbTrj#ou4b*>TyMt(#RHx%%&=IxGU9F8-*0s^ zf}GcX3b@g2`}C#rtPY0yW!I#2e6Ve$TiHafF4Na%|E>RQ_N5Uy@3)7Rn<@A8+@X2X zXS0H?&9>PmnIYL8r+f2MUu8Y^f0qpKzyWHOVgZT=#c^}~HbUgmVlzSroJ@J@BB zF;(GNN9T`$>Q~ZTH!W|xbS7qXkN7qh3l3Cw>3iI0Y2HMw4TEz=UhQCSeYRZJ?{9tf zrPH0b??&rXrZZO6_f#wkS>QKXyDr++q`go3FvH^95ARp!T?i~YIwCN3fm#XW!`W?S z6i)IU7kTR3z3vxu*Eluwqnma<_3iJ{{W>?tbiH=gskDF5TU{Nw#hSaicd+1B4%EIK z*fq%GWm-8bv^`^PbvYwNOBFk6D&)g0LS?&+La3=9X@Od#Z>aFQtev1}eCN^onjD3KE=%%lkvpqj}CfAM(0ZzYey zjDjK;v`!4D!-79a6xav2>ws95!UMU{Ol~v>HO5wy%fVXWk zk&co%pf2nTloa$2N>h@dH2@n753~u46`adN9IbnHLV(SU_0ElH-{ViIzMSGX zEhmU_#i4xH;gtaz@!$J>2`f}qpKLHFv`shumAyG80|pmVa(X;^acOVzeO=Foz0cGo zrqw$mkTeb1H9Df4QixYQHljr8_lC8SF@< zNQ{hW6TSETo(GoiiJ*dH%)dxNKOga(Qf=*Q?ICqzMRl;EVxQE^RkY63jw%}J zi+g1+sW*$3m)Ft|GOlQYsLtRZC@E^$i;zB$g2E`Q{uEzkB5*;&rGVgUz++X^Sc<8z zfj&6RrYX{FC#nH#Rzpiqys`+v2aa9S1kk0mx>4*sx%;AC-b{M7-Y_%UJ!nV4*xC*U zkM7y`gnvJ%tBd*Eq~d~#^PEe$*SF{GtWe#$aL%6-E>A6Uy->IFz0QI~^-~u1FOA(+ zeNH}&*@bV=cW&j4Yj?UCuG=F2r)kcvl=a!}GYsy`&#PPD>l&8B(NgZDHS^oXoDB&_ zx9(bzwr0B)ToD= z@{eEbRJfx*r^I&V9=7joegAEgii=B^Dg}R?-1o#xe(Lk;!ah#7LtRoW7k({wDY?Dn z{Hsf`f7E#|NwPk1pjiH7Z#B2mJ*Lw=SDD(39dqM6Z{mbRcN{G~1dzH5mI^~j^72Y> zg)Q)Js{Bl2jCkQh@sbHB3VxbLvr^g7R2qSVx_hpAU4sgZb!GJMBfW$58G8@uS5UPe zN<>H~1*)6~{Unj%%92MYB8Wqk!SDdm{3e1z-%w5Q@c|Ut6&s&K3@VO5wf>t3RD?oQ z&7gLG0PP7WMlGra4huy^YC9q2D6b8(r4Wy1F`KmJ=ik0?1PGJscmA)X-S^$J(l}?iF=Mj-Prmb6vsN z^v+Mz^fLOSFRNIinNw|75dK+lSJ`dG+lmG8_*ja~nsg?nYo<~K;-Pz;b-d%2AW!s47o5n3YI&7JCqu$uR+s5}>G$i|7r*&K8 zdb{a7ee|c^7XAqH&&ENV9Jy=pUNHUN=;l_PT^SXE_;d}4oc}gs(y%l{IE*DBJ=lO)oEG!Mbs?)%?faH&G;9w ztb!U5^Alda`B@4*0d~dTwCaj9O~Hq%JhiLfLtUAsi=bv}stuq$ZEdLGR7+v563tkN za$)AHv0G|8hpg2*(k--Z%VP6Rbra78wOOvveT3<;XWO%>Be4om(dr5`e{h_Y`{^hu zbXL+ImOp99gX!wi=yxYt&o_6z*5`|_E!CXxMpvS+DKuZU-{$eIN7@zMXqV2~*f%JB z_Yl`7PUm(MQ5}5z!3icbFHg&o_XP*rd!S2NVge-?DU^j}RwV z&Jr&usKE?!O$#2J;6H9ewA*;MfFvt7f6H)Y$hZ(|2ay^BEwSD}8_1XjS|THM))1o@ z0BGfsDdC%Ev9qm?zvFeZDhWKeZo~<9?}}+_^{rhR-c`?A)7^DjBXp7VJ!{r;=>W}4^EUwvS8uG>cc@#9i? z2Ta|MeF=z9H?n=uS9{2kj`vJHrj1P9o62?S;C}1jgV8D_OQv5`e5+yL85F&3@2I-h zH+xXe=B%hG8dqpT@4U;kSN4mbE#3BZ`?NgNN1<}P(aypo?|l26Yi{Ml-8;Nuqv_hZ zJqI7&r&4;~zp`(-oj!eCmfi(wmfl$vO^hR?uBV_w%hD?YiF*V`18|+P^a?>zfr30Z zU4UDJZhAmH<=1*sT0Bu*4--7=%@=gMpjh9VFgcqc?Gq;M`&Yd*W23U zXK7yqw4nlc+CIlSP+cs1X{gH*yvz&@Td@yAzXt1BVHahhQF7 zRyJ1F;L&T1l7}`_d*st9oa#z5q;^3^r!O2Aj0XUCV1BMNoV?R$JrnCxai2hI$9npf z{h`yiuPW4bbZFCV#`=Wg7uMWiYP}ETMLYkQ(XVhs{8QuCJ#(3h8d+`1A5V`+V11f0 z!2WWv$r2;Ic|~C*m5CX3y@#%Cqf&Nwhlfqg8SdbFRkzD`Y4bKb@mun7Oyj|egF3q~ zN;Qt~zl8^$+O?bi*(y~1a|vI&U3dRYuXdLtSb2KuW!Nz5M>)6YnVh)z^D(k!5qfr~mnT_A?yTjp+5U@ll_9^<9^MDl#HV^pz@^s8XX^Lt@KF$&A{U zYMS3GzlVS#7G>x0@xzDk^n`qb8_`SqF*{$#c1cq|;b*3@H9KtSMNvKkAm~K7*T@Sw z+G$_4!_=_U5gltb+nhR;-FeK%4|49hZ38Yi)w-KGe9O7b+@o2mG4O@j@w*OwiIdyf zT#wq^C;0uI9dgddch2P<%Yw>@Ah1|$?kt7 ziCxZGzQM8H0=$k@0i*vlh6Shi4v$*f@Mf0+U$hFK&<2r)bRC*YOK)kmaHB8-XW!pZd1XCOKcb-M~X? z{wtSo9PMxAvEG$LyUo;aFv#qq0p+1vgNe-B|tE3fc+aLcxw)v;Sehk~}u5{q|l zvbE>laeA+EfittGullhrr*zV0&pT?oudI8!RcBt!$-6sgwOKDQou(f9kI*r~IzdRxD(M!I$hw}rbv#RG*o0MM5 z2dzrUJ4LPaIXr#=iYCQ*{SuMlzsu`am-bwf>DZYff%Mmz5P6&R={vCFl6))$h*Ey%QJL|L%+6DYg3X z4cDBPoJyP+%&2#tuXizZ)G9eGL;o`a&wqOI;g~ab@4kD_Y__z|-##jKlh(FX-B`s{ zx>Prtn(bHQuN2;OONy-gx;O)y)Vbdp0@VnoL=57e`UH~nf*BleC|Iur?Y#<@=McXyna;R*xX5%@%o`u zPsZz)@%sO#c>T021s6cc3_!R|v;SRcK|xLMoD@EI^E2mCI}0AhfY+og@&Imz+hiiF zsYC-(bfsdgJ(o7}b*=Y|Sa7cE`Oc4hWBveo5QN9L7Og84$PTEWa6|uziXZy!^YXk` z+jV?R@62mM|6ETb@qp$6WN9qFy4bt;m|V)q?{TXepRCiLpIzv=NTtoz&#tA);e)() z|245}c>lk3J~M`-nCw=XX%O=~+(HwpUE%Vmb4OZe427LPiq*xJ`e9eAlS z#QM0Z(U`o_@%kz?S;yO%HBQQA7Qe7OxY^=$ps(wUoPNF;B`!x*qF6?6rY+zuJ$iU3 zqr_ougx2_~O^nZ{mqb4eb}x+ZSpPC2&TM%10oOy9&vicW$;JP0&4OuXwlwCr)-Tze zzBcsC=kj?M5AEia<(BrdRdVOOnah9RoVoP&-z7DtyUeM4bD_(Cw2~{Ed{XSZc5Zq; z*E%+?uBO0T~2j5RgGY1_2oaWDt-+Kn4LB1Y{79K|lrp83beykU>BO0T~2j5RgGY M1_2oa{^Jn%e@Hx9#Q*>R diff --git a/lib/SDK/Libraries/Win/XPLM_64.lib b/lib/SDK/Libraries/Win/XPLM_64.lib deleted file mode 100644 index cf5b4fb988a111a41cd034163cf8e4b5d07d58a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51320 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//.xpl - -where ABI is one of mac_x64, win_x64 or lin_x64. The new schema is preferred, -so you can pack a version of your plugin that requires 3.0 with this scheme -and include a legacy 2.x plugin using hte old scheme for X-Plane 10 -compatibility. - -Please use the new scheme where possible - having a unique file name for each -DLL makes crash reports easier to read and triage. - -The 3.0 SDK drops support for 32-bit plugins; if you need to ship a 32-bit -plugin for 32-bit X-Plane 10, shipping using two schemes and two binaries may -be the best option. - -X-Plane SDK Release 2.1.3 11/14/13 - -Fixed XPC Wrappers to use int and intptr_t instead of long. This fixes -crashes for plugins on 64-bit Windows. - -X-Plane SDK Release 2.1.2 RC2 1/15/13 - -Removed headers from frameworks, as they don't work; updated README. - -X-Plane SDK Release 2.1.2 RC1 1/12/13 - -The 2.1.2 SDK adds frameworks for the XPLM and XPWidgets; Mac developers -can link directly against these frameworks and avoid unresolved symbols -and flat namespace problems. The frameworks produce plugins that will -work on X-Plane 8, 9, and 10 depending on the plugin CPU architecture, -minimum system SDK, and XPLM API revision number. - -X-Plane SDK Release 2.1.1 RC1 10/29/12 - -The 2.1.1 update to the SDK provides 64-bit build materials. - -X-Plane SDK Release 2.1.0 RC1 3/31/12 - -This is the first release of the version 2.1 X-Plane SDK. This version of the -SDK exposes new APIs. - -This API also replaces all references to "long" with int or intptr_t, -depending on whether the integer needs to be wide enough to hold coerced -pointers. Most of the time, int is used; the notable exception is the widgets -library where params and properties can contain pointers to user data. - -This change is not an ABI change - compiled plugins will work unmodified. -However for some compilers, you may need to replace long with int or intptr_t -in your code. - -X-Plane SDK Release 2.0.1 RC1 7/21/10 - -This release adds symbol visibility macros for GCC 4 on Linux and corrects a few -function documentation comments. - -X-Plane SDK Release 2.0 RC1 7/11/08 - -This release includes a corrected XPLM.lib for windows with exports for some of -the new 2.0 APIs. - -X-Plane SDK Release 2.0 Beta 2 4/23/08 - -This release includes new APIs for reading and writing data files and drawing -hooks for the local map screen, as well as some minor tweaks: - -- Sim version is 2.0 in the headers. -- unload plane msg marked as 2.0 only. -- New enumerations for additional languages. -- Function level docs improved. - -X-Plane SDK Release 2.0 Beta 1 1/19/08 - -This is the first release of the version 2.0 X-Plane SDK. CFM support has -been removed, and the license has been simplified, reflecting that it only has -to cover the SDK include/import lib files and not the sample code or examples. - -X-Plane SDK Release 1.0.2 1/5/05 - -The headers of the SDK are modified to support Kylix. No changes for Mac, -Windows, or C users. Headers now have SDK version numbers. - -X-Plane SDK Release 1.0.1 12/29/04 - -The headers of this SDK are modified to support Linux complication. No changes -for Mac and Windows users. - -X-Plane SDK Release Candidate 1 - -Only one slight change in the enums: the enum xpProperty_SubWindowHasCloseBoxes -in XPStandardWidgets.h has been changed to xpProperty_MainWindowHasCloseBoxes. -Its value has not been changed, so you will need to search-and-replace your code -when using this version of the SDK, but already-compiled plugins will experience -no different operation. - -The documentation has been revised for all headers to revise changes made to the -SDK over the course of beta. - -X-Plane SDK Beta 5 - -This version of the SDK features a number of enumeration changes to reflect the -X-Plane interface more correctly. This became crucial when X-Plane 7's new user -interface was released. With X-Plane in release candidates hopefully beta 5 of -the SDK could be the last one. Please see: - -www.xsquawkbox.net/xpsdk/newui.html - -For a comprehensive description of all the enumeration changes. For most -plugins (no developers reported using the deprecated enumerations), a simple -search and replace should suffice. Plugins compiled against the beta 4 SDK that -do not use now-unsupported graphics will continue to work correctly. - -X-Plane SDK Beta 4 - -This release corrects two problems with the Pascal headers: function pointer -types are now declared cdecl (since this is how the SDK calls them), and the -import library for the widget callbacks is now XPWIDGETS.DLL as it should be. - -X-Plane SDK Beta 3 - -This release finally features full documentation and a stable widgets API, as -well as a few other minor bug fixes. - -Starting with beta 3, the DLLs necessary to run plugins ship with X-Plane 660. -The SDK will work with X-Plane 660 RC3 and later. The XPWidgets DLL now lives -in the Resources/plugins folder. - -Starting with beta 3, extra plugins, documentation, sample code, and sample -projects are now featured directly on the web in the new X-Plane SDK library. -They are not included in the SDK zip file; the zip file only contains headers -and lib files for the SDK. - -X-Plane SDK Beta 2 - -You must recompile your plugin for the beta 2 plugin SDK! Plugins compiled -against the beta 1 SDK will not work with X-Plane 660 or the new XPLM.DLL. - -A huge number of data refs have been added. Unfortunately the documentation -is thin. Use the data ref tester plugin to view the data refs in real time -and find what you need. - -The data ref APIs have also changed to allow for arrays of integers as well -as floats. Some sim variables are now arrays that were previously many -individual items. - -A new drawing phase is available for replacing aircraft graphics. The -texturing APIs in XPLMGraphics have been revised. The most notable change is -that you cannot use the SDK to load your textures. (This functionality was -broken and never worked in beta 1.) See the x-plane-dev list for sample code -on how to load your own bitmaps. - -X-Plane can reload plugins on the fly. Use the Plugin Enabler plugin to reload -your plugin. On the Mac you can throw the old DLL in the trash and put a new -one in its place to reload a new version of the plugin. On the PC, an alert -comes up; while this alert is up you can swap your plugins' DLL. This allows -you to recompile your plugin without rebooting the sim. - -Delphi Pascal interfaces and sample code are in the SDK. Thanks to Billy -Verreynne for his hard work on this. - diff --git a/lib/SDK/license.txt b/lib/SDK/license.txt deleted file mode 100644 index 8b9cbfc..0000000 --- a/lib/SDK/license.txt +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2008, Sandy Barbour and Ben Supnik -All rights reserved. - -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: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Neither the names of the authors nor that of X-Plane or Laminar Research - may be used to endorse or promote products derived from this software - without specific prior written permission from the authors or - Laminar Research, respectively. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 890549f50ceb04cd7d37eb9025346871f6eab6d1 Mon Sep 17 00:00:00 2001 From: TwinFan Date: Mon, 19 Jun 2023 21:16:48 +0200 Subject: [PATCH 2/5] Updated XPMP2 --- lib/XPMP2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/XPMP2 b/lib/XPMP2 index 3e9c22d..fc6292b 160000 --- a/lib/XPMP2 +++ b/lib/XPMP2 @@ -1 +1 @@ -Subproject commit 3e9c22d82f254c545df8bca92a31cac0ceb21b73 +Subproject commit fc6292bd57d595cacc174d3fd6ac94bc222b1be7 From eed1beaba3569110b0e366816c24622b8216518a Mon Sep 17 00:00:00 2001 From: TwinFan Date: Fri, 30 Jun 2023 23:05:46 +0200 Subject: [PATCH 3/5] Implemented XP12 Sound System (FMOD system not yet re-integrated) --- CMakeLists.txt | 2 +- XPMP2-Sample.cpp | 4 ++-- XPMP2-Sample.xcodeproj/project.pbxproj | 6 ++---- lib/XPMP2 | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 86a4041..4867bc3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ else() endif() project(XPMP2-Sample - VERSION 3.2.0 + VERSION 3.3.0 DESCRIPTION "XPMP2-Sample X-Plane plugin") message ("== Building: ${PROJECT_NAME} ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} ==") diff --git a/XPMP2-Sample.cpp b/XPMP2-Sample.cpp index 8271c63..87f96a5 100644 --- a/XPMP2-Sample.cpp +++ b/XPMP2-Sample.cpp @@ -141,7 +141,7 @@ void CBPlaneNotifier(XPMPPlaneID inPlaneID, } } -#if defined(DEBUG) && defined(INCLUDE_FMOD_SOUND) +#if defined(DEBUG) && (INCLUDE_FMOD_SOUND + 0 >= 1) /// Just for purposes of testing this functionality, we list all loaded sounds void DebugListLoadedSoundNames() { @@ -1014,7 +1014,7 @@ PLUGIN_API int XPluginEnable(void) LogMsg("XPMP2-Sample: Error while loading CSL packages: %s", res); } -#if defined(DEBUG) && defined(INCLUDE_FMOD_SOUND) +#if defined(DEBUG) && (INCLUDE_FMOD_SOUND + 0 >= 1) // Just for purposes of testing this functionality, we list all loaded sounds // (This is likely not required in your plugin) DebugListLoadedSoundNames(); diff --git a/XPMP2-Sample.xcodeproj/project.pbxproj b/XPMP2-Sample.xcodeproj/project.pbxproj index 920793d..6e77179 100644 --- a/XPMP2-Sample.xcodeproj/project.pbxproj +++ b/XPMP2-Sample.xcodeproj/project.pbxproj @@ -54,7 +54,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 254A0B792918533F004CA228 /* XPLM.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XPLM.framework; path = lib/SDK/Libraries/Mac/XPLM.framework; sourceTree = ""; }; 254A0B7B29185357004CA228 /* libfmod.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libfmod.dylib; path = lib/fmod/libfmod.dylib; sourceTree = ""; }; 254A0B7D291853CD004CA228 /* XPMP2.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = XPMP2.xcodeproj; path = lib/XPMP2/XPMP2.xcodeproj; sourceTree = ""; }; 2572C40523D88802006A7726 /* XPMP2-Sample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "XPMP2-Sample.cpp"; sourceTree = ""; }; @@ -120,7 +119,6 @@ 25F4A2E62A3F9CF8002509C3 /* XPLM.framework */, 254A0B7D291853CD004CA228 /* XPMP2.xcodeproj */, 254A0B7B29185357004CA228 /* libfmod.dylib */, - 254A0B792918533F004CA228 /* XPLM.framework */, D6A7BDC016A1DEC000D1426A /* CoreFoundation.framework */, D6A7BDA916A1DEA200D1426A /* OpenGL.framework */, ); @@ -259,7 +257,7 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", - "INCLUDE_FMOD_SOUND=1", + "INCLUDE_FMOD_SOUND=0", "APL=1", "IBM=0", "LIN=0", @@ -363,7 +361,7 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "NDEBUG=1", - "INCLUDE_FMOD_SOUND=1", + "INCLUDE_FMOD_SOUND=0", "APL=1", "IBM=0", "LIN=0", diff --git a/lib/XPMP2 b/lib/XPMP2 index fc6292b..62a3a6f 160000 --- a/lib/XPMP2 +++ b/lib/XPMP2 @@ -1 +1 @@ -Subproject commit fc6292bd57d595cacc174d3fd6ac94bc222b1be7 +Subproject commit 62a3a6fd5025ea218ff1a9bc22377071153fc447 From ccd9c6ee301bfd43afcc4f15bab751c5eff2af54 Mon Sep 17 00:00:00 2001 From: TwinFan Date: Sun, 2 Jul 2023 17:25:32 +0200 Subject: [PATCH 4/5] Re-integrated FMOD instance sound system --- CMakeLists.txt | 2 +- XPMP2-Sample.xcodeproj/project.pbxproj | 4 ++-- lib/XPMP2 | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4867bc3..f8ff810 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,7 +151,7 @@ endif () # FMOD Library only if requested if(INCLUDE_FMOD_SOUND) # Compile options - add_compile_definitions(INCLUDE_FMOD_SOUND) + add_compile_definitions(INCLUDE_FMOD_SOUND=1) # Link Options (only for Win/Mac) if(WIN32 OR APPLE) diff --git a/XPMP2-Sample.xcodeproj/project.pbxproj b/XPMP2-Sample.xcodeproj/project.pbxproj index 6e77179..b420222 100644 --- a/XPMP2-Sample.xcodeproj/project.pbxproj +++ b/XPMP2-Sample.xcodeproj/project.pbxproj @@ -257,7 +257,7 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", - "INCLUDE_FMOD_SOUND=0", + "INCLUDE_FMOD_SOUND=1", "APL=1", "IBM=0", "LIN=0", @@ -361,7 +361,7 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "NDEBUG=1", - "INCLUDE_FMOD_SOUND=0", + "INCLUDE_FMOD_SOUND=1", "APL=1", "IBM=0", "LIN=0", diff --git a/lib/XPMP2 b/lib/XPMP2 index 62a3a6f..887d1fc 160000 --- a/lib/XPMP2 +++ b/lib/XPMP2 @@ -1 +1 @@ -Subproject commit 62a3a6fd5025ea218ff1a9bc22377071153fc447 +Subproject commit 887d1fc767d68f5c725642954afabc631a6b936c From febb69931ce1b5049d243c022c39b28b3017a18e Mon Sep 17 00:00:00 2001 From: TwinFan Date: Wed, 5 Jul 2023 23:26:50 +0200 Subject: [PATCH 5/5] XPMP2 update --- lib/XPMP2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/XPMP2 b/lib/XPMP2 index 887d1fc..f6c4090 160000 --- a/lib/XPMP2 +++ b/lib/XPMP2 @@ -1 +1 @@ -Subproject commit 887d1fc767d68f5c725642954afabc631a6b936c +Subproject commit f6c40908ac3e66a3b1b75c5e1740efce8277323a