From 11ee2adf2f0b1222b80cce389b2464bbde26ff38 Mon Sep 17 00:00:00 2001 From: Cassius Pacheco Date: Tue, 19 Sep 2023 16:58:58 +1000 Subject: [PATCH] wippppp --- Plugins/Mac/.gitignore | 3 + .../Mac/Resources/Info-WebViewSeparated.plist | 28 ++ Plugins/Mac/Resources/Info.plist | 28 ++ Plugins/Mac/Resources/InfoPlist.strings | 2 + Plugins/Mac/Resources/Prefix.pch | 3 + .../Mac => Plugins/Mac/Sources}/WebView.mm | 76 ++-- Plugins/Mac/WebView.xcodeproj/project.pbxproj | 347 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Plugins/Mac/install.sh | 10 + sample/.vscode/settings.json | 108 +++--- sample/Assets/Scenes/AuthenticatedScene.unity | 4 +- sample/Packages/manifest.json | 2 +- sample/Packages/packages-lock.json | 2 +- sample/ProjectSettings/ProjectSettings.asset | 6 +- .../Runtime/Scripts/Public/Passport.cs | 12 +- .../Gree/Assets/Plugins/GreeBrowserClient.cs | 3 + .../ThirdParty/Gree/Assets/Plugins/Mac.meta | 8 - .../WebView.mm.meta => WebView.bundle.meta} | 14 +- .../WebView.bundle/Contents/Info.plist | 48 +++ .../WebView.bundle/Contents/MacOS/WebView | Bin 0 -> 220048 bytes .../Contents/Resources/InfoPlist.strings | Bin 0 -> 92 bytes .../Contents/_CodeSignature/CodeResources | 128 +++++++ .../Gree/Assets/Plugins/WebViewObject.cs | 47 ++- .../Gree/Assets/Plugins/iOS/WebView.mm | 24 +- 25 files changed, 763 insertions(+), 155 deletions(-) create mode 100644 Plugins/Mac/.gitignore create mode 100644 Plugins/Mac/Resources/Info-WebViewSeparated.plist create mode 100644 Plugins/Mac/Resources/Info.plist create mode 100644 Plugins/Mac/Resources/InfoPlist.strings create mode 100644 Plugins/Mac/Resources/Prefix.pch rename {src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac => Plugins/Mac/Sources}/WebView.mm (86%) create mode 100644 Plugins/Mac/WebView.xcodeproj/project.pbxproj create mode 100644 Plugins/Mac/WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Plugins/Mac/WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100755 Plugins/Mac/install.sh delete mode 100644 src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac.meta rename src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/{Mac/WebView.mm.meta => WebView.bundle.meta} (77%) create mode 100644 src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/Info.plist create mode 100755 src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/MacOS/WebView create mode 100644 src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/Resources/InfoPlist.strings create mode 100644 src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/_CodeSignature/CodeResources diff --git a/Plugins/Mac/.gitignore b/Plugins/Mac/.gitignore new file mode 100644 index 00000000..04d6d043 --- /dev/null +++ b/Plugins/Mac/.gitignore @@ -0,0 +1,3 @@ +DerivedData +WebView.xcodeproj/project.xcworkspace/xcuserdata/ +WebView.xcodeproj/xcuserdata/ diff --git a/Plugins/Mac/Resources/Info-WebViewSeparated.plist b/Plugins/Mac/Resources/Info-WebViewSeparated.plist new file mode 100644 index 00000000..e89822fe --- /dev/null +++ b/Plugins/Mac/Resources/Info-WebViewSeparated.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Plugins/Mac/Resources/Info.plist b/Plugins/Mac/Resources/Info.plist new file mode 100644 index 00000000..e89822fe --- /dev/null +++ b/Plugins/Mac/Resources/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Plugins/Mac/Resources/InfoPlist.strings b/Plugins/Mac/Resources/InfoPlist.strings new file mode 100644 index 00000000..477b28ff --- /dev/null +++ b/Plugins/Mac/Resources/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Plugins/Mac/Resources/Prefix.pch b/Plugins/Mac/Resources/Prefix.pch new file mode 100644 index 00000000..aabef477 --- /dev/null +++ b/Plugins/Mac/Resources/Prefix.pch @@ -0,0 +1,3 @@ +#ifdef __OBJC__ + #import +#endif diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac/WebView.mm b/Plugins/Mac/Sources/WebView.mm similarity index 86% rename from src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac/WebView.mm rename to Plugins/Mac/Sources/WebView.mm index 1d7f4503..2f5950f7 100644 --- a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac/WebView.mm +++ b/Plugins/Mac/Sources/WebView.mm @@ -19,20 +19,9 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#if canImport(UIKit) -#import -#else #import -#endif - #import -#if canImport(UIKit) -// NOTE: we need extern without "C" before unity 4.5 -//extern UIViewController *UnityGetGLViewController(); -extern "C" UIViewController *UnityGetGLViewController(); -extern "C" void UnitySendMessage(const char *, const char *, const char *); -#endif extern "C" typedef void (*DelegateCallbackFunction)(const char * key, const char * message); DelegateCallbackFunction delegateCallback = NULL; @@ -84,10 +73,10 @@ - (void)load:(NSURLRequest *)request NSURL *url = [request URL]; if ([url.absoluteString hasPrefix:@"file:"]) { // LoadFileURL is not loading the JS content due to thinking it's out of the sandbox - // NSURL *top = [NSURL URLWithString:[[url absoluteString] stringByDeletingLastPathComponent]]; - // [webView loadFileURL:url allowingReadAccessToURL:top]; - NSString *htmlContent = [NSString stringWithContentsOfFile:url.path encoding:NSUTF8StringEncoding error:nil]; - [webView loadHTMLString:htmlContent baseURL:url]; + NSURL *top = [NSURL URLWithString:[[url absoluteString] stringByDeletingLastPathComponent]]; + [webView loadFileURL:url allowingReadAccessToURL:top]; + // NSString *htmlContent = [NSString stringWithContentsOfFile:url.path encoding:NSUTF8StringEncoding error:nil]; + // [webView loadHTMLString:htmlContent baseURL:url]; } else { [webView loadRequest:request]; } @@ -97,7 +86,8 @@ - (void)load:(NSURLRequest *)request @interface CWebViewPlugin : NSObject { WKWebView *webView; -} + NSWindow *window; + NSWindowController *windowController;} @end @implementation CWebViewPlugin @@ -110,7 +100,7 @@ - (id)initWithUa:(const char *)ua { self = [super init]; - // UIView *view = UnityGetGLViewController().view; + CGRect frame = CGRectMake(0, 0, 500, 400); if (_sharedProcessPool == NULL) { _sharedProcessPool = [[WKProcessPool alloc] init]; @@ -132,15 +122,14 @@ - (id)initWithUa:(const char *)ua "; WKUserScript *script - = [[WKUserScript alloc] initWithSource:str injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; + = [[WKUserScript alloc] initWithSource:str injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; [controller addUserScript:script]; configuration.userContentController = controller; - configuration.allowsInlineMediaPlayback = true; configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone; configuration.websiteDataStore = [WKWebsiteDataStore defaultDataStore]; configuration.processPool = _sharedProcessPool; - WKWebView *wkwebView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; + WKWebView *wkwebView = [[WKWebView alloc] initWithFrame:frame configuration:configuration]; #if UNITYWEBVIEW_DEVELOPMENT // enable Safari debugging if exists if ([wkwebView respondsToSelector:@selector(setInspectable:)]) { @@ -155,23 +144,17 @@ - (id)initWithUa:(const char *)ua ((WKWebView *)webView).customUserAgent = [[NSString alloc] initWithUTF8String:ua]; } - webView.opaque = NO; - webView.hidden = YES; + // webView.hidden = YES; -#if canImport(UIKit) - // cf. https://rick38yip.medium.com/wkwebview-weird-spacing-issue-in-ios-13-54a4fc686f72 - // cf. https://stackoverflow.com/questions/44390971/automaticallyadjustsscrollviewinsets-was-deprecated-in-ios-11-0 - ((WKWebView *)webView).scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; - - webView.backgroundColor = [UIColor clearColor]; - webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - - UIView *view = UnityGetGLViewController().view; - [view addSubview:webView]; -#else [webView setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)]; -#endif - + window = [[NSWindow alloc] initWithContentRect:frame + styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable + backing:NSBackingStoreBuffered + defer:NO]; + [window setContentView:webView]; + [window orderFront:NSApp]; +// [window setDelegate:self]; + windowController = [[NSWindowController alloc] initWithWindow:window]; return self; } @@ -292,11 +275,7 @@ - (void)webView:(WKWebView *)wkWebView decidePolicyForNavigationAction:(WKNaviga NSString *url = [nsurl absoluteString]; if ([url rangeOfString:@"//itunes.apple.com/"].location != NSNotFound) { -#if canImport(UIKit) - [[UIApplication sharedApplication] openURL:nsurl]; -#else [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; -#endif decisionHandler(WKNavigationActionPolicyCancel); return; } else if ([url hasPrefix:@"unity:"]) { @@ -307,13 +286,8 @@ - (void)webView:(WKWebView *)wkWebView decidePolicyForNavigationAction:(WKNaviga && ![url hasPrefix:@"file:"] && ![url hasPrefix:@"http:"] && ![url hasPrefix:@"https:"]) { -#if canImport(UIKit) - if([[UIApplication sharedApplication] canOpenURL:nsurl]) { - [[UIApplication sharedApplication] openURL:nsurl]; - } -#else + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; -#endif decisionHandler(WKNavigationActionPolicyCancel); return; } else if (navigationAction.navigationType == WKNavigationTypeLinkActivated @@ -352,7 +326,7 @@ - (void)loadURL:(const char *)url { if (webView == nil) return; - + WKWebView *_webView = (WKWebView *)webView; NSString *urlStr = [NSString stringWithUTF8String:url]; NSURL *nsurl = [NSURL URLWithString:urlStr]; @@ -370,11 +344,11 @@ - (void)evaluateJS:(const char *)js @end extern "C" { - void *_CWebViewPlugin_Init(const char *ua); - void _CWebViewPlugin_Destroy(void *instance); - void _CWebViewPlugin_LoadURL(void *instance, const char *url); - void _CWebViewPlugin_EvaluateJS(void *instance, const char *url); - void _CWebViewPlugin_SetDelegate(DelegateCallbackFunction callback); +void *_CWebViewPlugin_Init(const char *ua); +void _CWebViewPlugin_Destroy(void *instance); +void _CWebViewPlugin_LoadURL(void *instance, const char *url); +void _CWebViewPlugin_EvaluateJS(void *instance, const char *url); +void _CWebViewPlugin_SetDelegate(DelegateCallbackFunction callback); } void _CWebViewPlugin_SetDelegate(DelegateCallbackFunction callback) { diff --git a/Plugins/Mac/WebView.xcodeproj/project.pbxproj b/Plugins/Mac/WebView.xcodeproj/project.pbxproj new file mode 100644 index 00000000..6a1393d3 --- /dev/null +++ b/Plugins/Mac/WebView.xcodeproj/project.pbxproj @@ -0,0 +1,347 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 8102525814C569D80022296D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8102525514C569D80022296D /* InfoPlist.strings */; }; + 81B8C535151078DB000C56DC /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81B8C534151078DB000C56DC /* WebKit.framework */; }; + 81B8C53815108B89000C56DC /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81B8C53715108B89000C56DC /* Carbon.framework */; }; + 81E2C20C14C5684A004CE5C2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81E2C20B14C5684A004CE5C2 /* Cocoa.framework */; }; + 81F4B4D914C6888B001B4465 /* WebView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 81F4B4D814C6888B001B4465 /* WebView.mm */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 18E976051EA4873F00083D49 /* Info-WebViewSeparated.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = "Info-WebViewSeparated.plist"; path = "Resources/Info-WebViewSeparated.plist"; sourceTree = ""; }; + 8102525414C569D80022296D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Resources/Info.plist; sourceTree = SOURCE_ROOT; }; + 8102525514C569D80022296D /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = InfoPlist.strings; path = Resources/InfoPlist.strings; sourceTree = SOURCE_ROOT; }; + 8102525614C569D80022296D /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Prefix.pch; path = Resources/Prefix.pch; sourceTree = SOURCE_ROOT; }; + 81B8C534151078DB000C56DC /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 81B8C53715108B89000C56DC /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + 81E2C20814C5684A004CE5C2 /* WebView.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebView.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 81E2C20B14C5684A004CE5C2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 81E2C20E14C5684A004CE5C2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 81E2C21014C5684A004CE5C2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 81F4B4D814C6888B001B4465 /* WebView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebView.mm; path = Sources/WebView.mm; sourceTree = ""; }; + 81F81AEC14D76D2400845D4C /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 81E2C20514C5684A004CE5C2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 81B8C53815108B89000C56DC /* Carbon.framework in Frameworks */, + 81B8C535151078DB000C56DC /* WebKit.framework in Frameworks */, + 81E2C20C14C5684A004CE5C2 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8102525914C573EB0022296D /* Sources */ = { + isa = PBXGroup; + children = ( + 81F4B4D814C6888B001B4465 /* WebView.mm */, + ); + name = Sources; + sourceTree = ""; + }; + 81E2C1FD14C5684A004CE5C2 = { + isa = PBXGroup; + children = ( + 8102525914C573EB0022296D /* Sources */, + 81E2C21114C5684A004CE5C2 /* Resources */, + 81E2C20A14C5684A004CE5C2 /* Frameworks */, + 81E2C20914C5684A004CE5C2 /* Products */, + ); + sourceTree = ""; + }; + 81E2C20914C5684A004CE5C2 /* Products */ = { + isa = PBXGroup; + children = ( + 81E2C20814C5684A004CE5C2 /* WebView.bundle */, + ); + name = Products; + sourceTree = ""; + }; + 81E2C20A14C5684A004CE5C2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 81B8C53715108B89000C56DC /* Carbon.framework */, + 81F81AEC14D76D2400845D4C /* OpenGL.framework */, + 81E2C20E14C5684A004CE5C2 /* AppKit.framework */, + 81E2C21014C5684A004CE5C2 /* Foundation.framework */, + 81E2C20B14C5684A004CE5C2 /* Cocoa.framework */, + 81B8C534151078DB000C56DC /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 81E2C21114C5684A004CE5C2 /* Resources */ = { + isa = PBXGroup; + children = ( + 8102525414C569D80022296D /* Info.plist */, + 18E976051EA4873F00083D49 /* Info-WebViewSeparated.plist */, + 8102525514C569D80022296D /* InfoPlist.strings */, + 8102525614C569D80022296D /* Prefix.pch */, + ); + name = Resources; + path = WebView; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 81E2C20714C5684A004CE5C2 /* WebView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 81E2C21A14C5684A004CE5C2 /* Build configuration list for PBXNativeTarget "WebView" */; + buildPhases = ( + 81E2C20414C5684A004CE5C2 /* Sources */, + 81E2C20514C5684A004CE5C2 /* Frameworks */, + 81E2C20614C5684A004CE5C2 /* Resources */, + 81F4B4F514C696C4001B4465 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WebView; + productName = WebView; + productReference = 81E2C20814C5684A004CE5C2 /* WebView.bundle */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 81E2C1FF14C5684A004CE5C2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1200; + }; + buildConfigurationList = 81E2C20214C5684A004CE5C2 /* Build configuration list for PBXProject "WebView" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 81E2C1FD14C5684A004CE5C2; + productRefGroup = 81E2C20914C5684A004CE5C2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 81E2C20714C5684A004CE5C2 /* WebView */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 81E2C20614C5684A004CE5C2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8102525814C569D80022296D /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 81F4B4F514C696C4001B4465 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = ""; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 81E2C20414C5684A004CE5C2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81F4B4D914C6888B001B4465 /* WebView.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 81E2C21814C5684A004CE5C2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = 10.13; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ""; + SDKROOT = macosx; + USE_HEADERMAP = YES; + }; + name = Debug; + }; + 81E2C21914C5684A004CE5C2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = 10.13; + OTHER_LDFLAGS = ""; + SDKROOT = macosx; + USE_HEADERMAP = YES; + }; + name = Release; + }; + 81E2C21B14C5684A004CE5C2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_WEAK = YES; + GCC_C_LANGUAGE_STANDARD = "compiler-default"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Resources/Prefix.pch; + INFOPLIST_FILE = Resources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + LD_RUNPATH_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.13; + PRODUCT_BUNDLE_IDENTIFIER = "net.gree.unitywebview.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + USE_HEADERMAP = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 81E2C21C14C5684A004CE5C2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_WEAK = YES; + GCC_C_LANGUAGE_STANDARD = "compiler-default"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Resources/Prefix.pch; + INFOPLIST_FILE = Resources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + LD_RUNPATH_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.13; + PRODUCT_BUNDLE_IDENTIFIER = "net.gree.unitywebview.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + USE_HEADERMAP = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 81E2C20214C5684A004CE5C2 /* Build configuration list for PBXProject "WebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 81E2C21814C5684A004CE5C2 /* Debug */, + 81E2C21914C5684A004CE5C2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 81E2C21A14C5684A004CE5C2 /* Build configuration list for PBXNativeTarget "WebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 81E2C21B14C5684A004CE5C2 /* Debug */, + 81E2C21C14C5684A004CE5C2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 81E2C1FF14C5684A004CE5C2 /* Project object */; +} diff --git a/Plugins/Mac/WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Plugins/Mac/WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/Plugins/Mac/WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Plugins/Mac/WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Plugins/Mac/WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Plugins/Mac/WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Plugins/Mac/install.sh b/Plugins/Mac/install.sh new file mode 100755 index 00000000..50a08342 --- /dev/null +++ b/Plugins/Mac/install.sh @@ -0,0 +1,10 @@ +#!/bin/bash +DSTDIR="./" +rm -rf DerivedData +# xcodebuild -target WebView -configuration Release -arch x86_64 -arch arm64 build CONFIGURATION_BUILD_DIR='DerivedData' | xcbeautify +xcodebuild -target WebView -configuration Debug -arch x86_64 -arch arm64 build CONFIGURATION_BUILD_DIR='DerivedData' | xcbeautify +mkdir -p $DSTDIR + +cp -r DerivedData/WebView.bundle $DSTDIR +rm -rf DerivedData +cp *.bundle.meta $DSTDIR diff --git a/sample/.vscode/settings.json b/sample/.vscode/settings.json index e232cd65..3c1ea9e8 100644 --- a/sample/.vscode/settings.json +++ b/sample/.vscode/settings.json @@ -1,55 +1,55 @@ -{ - "files.exclude": - { - "**/.DS_Store":true, - "**/.git":true, - "**/.gitmodules":true, - "**/*.booproj":true, - "**/*.pidb":true, - "**/*.suo":true, - "**/*.user":true, - "**/*.userprefs":true, - "**/*.unityproj":true, - "**/*.dll":true, - "**/*.exe":true, - "**/*.pdf":true, - "**/*.mid":true, - "**/*.midi":true, - "**/*.wav":true, - "**/*.gif":true, - "**/*.ico":true, - "**/*.jpg":true, - "**/*.jpeg":true, - "**/*.png":true, - "**/*.psd":true, - "**/*.tga":true, - "**/*.tif":true, - "**/*.tiff":true, - "**/*.3ds":true, - "**/*.3DS":true, - "**/*.fbx":true, - "**/*.FBX":true, - "**/*.lxo":true, - "**/*.LXO":true, - "**/*.ma":true, - "**/*.MA":true, - "**/*.obj":true, - "**/*.OBJ":true, - "**/*.asset":true, - "**/*.cubemap":true, - "**/*.flare":true, - "**/*.mat":true, - "**/*.meta":true, - "**/*.prefab":true, - "**/*.unity":true, - "build/":true, - "Build/":true, - "Library/":true, - "library/":true, - "obj/":true, - "Obj/":true, - "ProjectSettings/":true, - "temp/":true, - "Temp/":true - } +{ + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.gitmodules": true, + "**/*.booproj": true, + "**/*.pidb": true, + "**/*.suo": true, + "**/*.user": true, + "**/*.userprefs": true, + "**/*.unityproj": true, + "**/*.dll": true, + "**/*.exe": true, + "**/*.pdf": true, + "**/*.mid": true, + "**/*.midi": true, + "**/*.wav": true, + "**/*.gif": true, + "**/*.ico": true, + "**/*.jpg": true, + "**/*.jpeg": true, + "**/*.png": true, + "**/*.psd": true, + "**/*.tga": true, + "**/*.tif": true, + "**/*.tiff": true, + "**/*.3ds": true, + "**/*.3DS": true, + "**/*.fbx": true, + "**/*.FBX": true, + "**/*.lxo": true, + "**/*.LXO": true, + "**/*.ma": true, + "**/*.MA": true, + "**/*.obj": true, + "**/*.OBJ": true, + "**/*.asset": true, + "**/*.cubemap": true, + "**/*.flare": true, + "**/*.mat": true, + "**/*.meta": true, + "**/*.prefab": true, + "**/*.unity": true, + "build/": true, + "Build/": true, + "Library/": true, + "library/": true, + "obj/": true, + "Obj/": true, + "ProjectSettings/": true, + "temp/": true, + "Temp/": true + }, + "dotnet.defaultSolution": "sample.sln" } \ No newline at end of file diff --git a/sample/Assets/Scenes/AuthenticatedScene.unity b/sample/Assets/Scenes/AuthenticatedScene.unity index 7eb9a91f..0ede739b 100644 --- a/sample/Assets/Scenes/AuthenticatedScene.unity +++ b/sample/Assets/Scenes/AuthenticatedScene.unity @@ -8691,8 +8691,8 @@ MonoBehaviour: m_TargetGraphic: {fileID: 1335469792} m_HandleRect: {fileID: 1335469791} m_Direction: 2 - m_Value: 1 - m_Size: 0.99999994 + m_Value: 0 + m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: m_PersistentCalls: diff --git a/sample/Packages/manifest.json b/sample/Packages/manifest.json index 29b6ef9a..c1cb3f71 100644 --- a/sample/Packages/manifest.json +++ b/sample/Packages/manifest.json @@ -1,7 +1,7 @@ { "dependencies": { "com.immutable.passport": "file:../../src/Packages/Passport", - "com.unity.ide.visualstudio": "2.0.18", + "com.unity.ide.visualstudio": "2.0.21", "com.unity.ide.vscode": "1.2.5", "com.unity.test-framework": "2.0.1-exp.1", "com.unity.visualscripting": "1.8.0", diff --git a/sample/Packages/packages-lock.json b/sample/Packages/packages-lock.json index c663e869..e2322c1e 100644 --- a/sample/Packages/packages-lock.json +++ b/sample/Packages/packages-lock.json @@ -14,7 +14,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.18", + "version": "2.0.21", "depth": 0, "source": "registry", "dependencies": { diff --git a/sample/ProjectSettings/ProjectSettings.asset b/sample/ProjectSettings/ProjectSettings.asset index 92bfb447..dd564465 100644 --- a/sample/ProjectSettings/ProjectSettings.asset +++ b/sample/ProjectSettings/ProjectSettings.asset @@ -75,7 +75,7 @@ PlayerSettings: androidMinimumWindowHeight: 300 androidFullscreenMode: 1 defaultIsNativeResolution: 1 - macRetinaSupport: 1 + macRetinaSupport: 0 runInBackground: 0 captureSingleScreen: 0 muteOtherAudioSources: 0 @@ -88,7 +88,7 @@ PlayerSettings: bakeCollisionMeshes: 0 forceSingleInstance: 0 useFlipModelSwapchain: 1 - resizableWindow: 0 + resizableWindow: 1 useMacAppStoreValidation: 0 macAppStoreCategory: public.app-category.games gpuSkinning: 0 @@ -99,7 +99,7 @@ PlayerSettings: xboxEnableFitness: 0 visibleInBackground: 1 allowFullscreenSwitch: 1 - fullscreenMode: 3 + fullscreenMode: 2 xboxSpeechDB: 0 xboxEnableHeadOrientation: 0 xboxEnableGuest: 0 diff --git a/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs b/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs index dc2d65af..88a9188a 100644 --- a/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs +++ b/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs @@ -34,14 +34,16 @@ private Passport() { #if UNITY_EDITOR_WIN Application.quitting += OnQuit; -#elif UNITY_IPHONE || UNITY_ANDROID || UNITY_STANDALONE_OSX +#elif UNITY_IPHONE || UNITY_ANDROID || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX Application.deepLinkActivated += onDeepLinkActivated; if (!string.IsNullOrEmpty(Application.absoluteURL)) { // Cold start and Application.absoluteURL not null so process Deep Link. onDeepLinkActivated(Application.absoluteURL); } + Debug.Log($"{TAG} Deeplink setup"); #endif + Debug.Log($"{TAG} init done"); } /// @@ -76,11 +78,14 @@ public static UniTask Init( { if (readySignalReceived == true) { + Debug.Log($"{TAG} Triggering init"); await Instance.GetPassportImpl().Init(clientId, environment, redirectUri, deeplink); + Debug.Log($"{TAG} finished init"); return Instance; } else { + Debug.Log($"{TAG} Failed to initialise Passport"); throw new PassportException("Failed to initiliase Passport", PassportErrorType.INITALISATION_ERROR); } }); @@ -107,11 +112,12 @@ int engineStartupTimeoutMs #endif passportImpl = new PassportImpl(communicationsManager); } - catch (Exception) + catch (Exception ex) { // Reset values readySignalReceived = false; Instance = null; + throw ex; } } @@ -148,7 +154,7 @@ public async UniTask Connect(long? timeoutMs = null) await GetPassportImpl().Connect(timeoutMs); } -#if UNITY_ANDROID || UNITY_IPHONE || UNITY_STANDALONE_OSX +#if UNITY_ANDROID || UNITY_IPHONE || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX /// /// Connects the user into Passport via PKCE auth and sets up the IMX provider. /// diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/GreeBrowserClient.cs b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/GreeBrowserClient.cs index 15a95bcc..031e9486 100644 --- a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/GreeBrowserClient.cs +++ b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/GreeBrowserClient.cs @@ -8,6 +8,7 @@ public class GreeBrowserClient : IWebBrowserClient { private const string TAG = "[GreeBrowserClient]"; private const string ANDROID_DATA_DIRECTORY = "android_asset"; + private const string MAC_DATA_DIRECTORY = "/Resources/Data"; private readonly WebViewObject webViewObject; public event OnUnityPostMessageDelegate OnUnityPostMessage; @@ -27,6 +28,8 @@ public GreeBrowserClient() ); #if UNITY_ANDROID string filePath = Constants.SCHEME_FILE + ANDROID_DATA_DIRECTORY + Constants.PASSPORT_DATA_DIRECTORY_NAME + Constants.PASSPORT_HTML_FILE_NAME; +#elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX + string filePath = Constants.SCHEME_FILE + Path.GetFullPath(Application.dataPath) + MAC_DATA_DIRECTORY + Constants.PASSPORT_DATA_DIRECTORY_NAME + Constants.PASSPORT_HTML_FILE_NAME; #else string filePath = Constants.SCHEME_FILE + Path.GetFullPath(Application.dataPath) + Constants.PASSPORT_DATA_DIRECTORY_NAME + Constants.PASSPORT_HTML_FILE_NAME; #endif diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac.meta b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac.meta deleted file mode 100644 index 33307131..00000000 --- a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 539832580c6c84e639c556d779b4b84b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac/WebView.mm.meta b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle.meta similarity index 77% rename from src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac/WebView.mm.meta rename to src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle.meta index fac23d4c..1165b4f0 100644 --- a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/Mac/WebView.mm.meta +++ b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 096af82eb4f3a4f6f92cfee1a45b463b +guid: 5390f3f89134c467fb0bf687e714c2d6 PluginImporter: externalObjects: {} serializedVersion: 2 @@ -19,19 +19,15 @@ PluginImporter: - first: Editor: Editor second: - enabled: 0 + enabled: 1 settings: DefaultValueInitialized: true - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS + Standalone: OSXUniversal second: enabled: 1 - settings: {} + settings: + CPU: AnyCPU userData: assetBundleName: assetBundleVariant: diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/Info.plist b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/Info.plist new file mode 100644 index 00000000..82e68462 --- /dev/null +++ b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/Info.plist @@ -0,0 +1,48 @@ + + + + + BuildMachineOSBuild + 22G90 + CFBundleDevelopmentRegion + English + CFBundleExecutable + WebView + CFBundleIdentifier + net.gree.unitywebview.WebView + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + WebView + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + + DTPlatformName + macosx + DTPlatformVersion + 13.3 + DTSDKBuild + 22E245 + DTSDKName + macosx13.3 + DTXcode + 1431 + DTXcodeBuild + 14E300c + LSMinimumSystemVersion + 10.13 + + diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/MacOS/WebView b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/MacOS/WebView new file mode 100755 index 0000000000000000000000000000000000000000..3a263eaa65f153afda8a89795d2916a1f0aa9e32 GIT binary patch literal 220048 zcmeFa33!y%^#^<>lR(0jAdGAxVG|T2VToWAoe%;+wn*4qaIy^~5;8H9u!zyo7$pqR zpn}-i8eF5bHnlFOMPs2t^uNQuFxLlR)jg=~{=x}{GV^v<&1u7&uHpEVZ&q%sl-pZ;1Z!pPh z-z#}4ivvM4-e(Xz;#pr0PEqvih_G)>VWG>tvCv&! z>8i{xFzY+Q`mT#pN{9~AXVi_j%T?$p^M(L4>sz@-2_&%`(bT409WIxr;OauxI(KDp zS^heAM16}{-#^tGAcUs1KC`W?udp=V>m`L|`?A>dU93RUC(%dtRc8|xvm2D^~D{_^Tt@eP)T;Ip9SCZK_6%uX6 zOzWnQ`q>OPqsuirV`+vV$H#FehbEfZn0^B|+vO@Nb$K_fEAW)M$}20n)JJ_?9=>ot zq5hzKi1J;oHJ*^yMcNk+c{);6Ac!{l9qH@Oc@(%@rTN|2H^ZlxIS@n}^-*&VQY`YX z%eBr!jZjkQT3uCE7*XFnkf%e}muRED1eqK96WPzg+oJ{Ybok_7A&55WpR5b z9?_>@pVwVl;a-jD$gJ;3gR-xfjUw8p55s@d_MmZ;G@A7}?^OC&tsvT{54q9wd8;t3 zMbmeP^=ToZPeEVF`h1!tBkSAB`jTa?5Ja2wagGYOJ&N)x^JRj$zTz&$*Qf$Pbocs# zs-o&^WPPnR)_YQYg`RcmJY~9gvwgmuDktcFAdU8MFL~ zypfHc%e7$MqWM{~=PhNymM+5ER65yZv~3iIv{cG!5h8#ffUv<(@W%Z@9D+dhD?*eb zBzGnoj~x)A2=t+Mux=bHL~o?!;77+qq|*<}NpU{H2{JYMpH#??i;^`AX;e;PX;yi! zr>1}NVD7?%**(6xU<}fv&-TR%)81E{qiKY6Q1@MlAIYk&_o$4e>B?a`O8EaC;q@qoTBU2uPBl%m$Ms zaS{BgX(!DxmSk?PjZ?lyS3S48_R1(P@1ngjQ&b*oA-%;$`vu{;vpc<+o(gveyJ*LAESeJDq+aEU*7aGCan(a?}cdcYS5?Ds8by+QK zlFwh&l3iET4khh@g_KiM-7XSu&LGA9szA0Mh1DF04@^g18(neBu6w!ePmI zLq$(+se2_bfFz+p5jOK6dbWB46>6aCDkhF#(o(NSLM(Rji)}Px>CxiUe z%^E&R>~ws#(xB$`^9^cVCcUq@9lw5yBcYW63u+GpgC)IUJ+C9T@G8b`Q2H-6eowX0i(+L4PQh|)Y?;ChoZ z*B|%83T^^GTn&5DeuisbXqvZl`W_ASp1_kNCcU{D9-Zb_oR4eHCe7It*djT(5qE+2 zBjT-hG!e-DxJ^=IOV%S=VppeQ9n!XDJ#ryDemAZtgKP8EvbZgTJye{bikqp6YtX_C zfgy(CYBzRvc7px05~-x0X7_1!U*O~ElvTYYyY6?{)PZV?mB?djq{!RL6(qIgNM@B;j!w9%zN?WWYr+rBa<{6#tQE+bc`BN=71J#Xe6B6->T(9qH8_;MLlTpHi$cppR? z-Q#9d88qvu^N^b-70Jqx%iN)GdjNven`?6n6{C2-4N+NFD zPacf%NAu4z@~0X3#}h%r)O%^Tr9qBQH-0K_WspvfE-AZM#8CV^HG~?9SFBc+1zv>; zm_8$9`qLE8)&ufyDZjqDDRIRg{+*cQ_!a{z!r>Gqj(<7uMo+*3yU~GX_QK#M5^FJB z!Md5h2RMOjr9CyIeJ{m<-CJ(rid%!5J0y1FLoBrvhlUqqKZtt@L8oI57~AN!J7ep# zormJVnNMZ?V;W`FCWjR5r8vsET9x&EE|)bp#8OLfVA2RJqe;t7r6noEvX|n}GDc~6 zT5E|9vD8u=TF~S1tE+AQfh1=B9Uup?ltK~W-b-=xk9H{isE8^Mm#38;gCuvo9Td;@ z@0H4AcMZsdv|%Ju-?tKoKy<7W)!kLG#0^&Zlr=|`H4Dg^XQx7_uC_H)%wCGKHJ2%C z-dw^!9SX7Spg63N%A_?1WkOngp|qxlvgU3ns;yBhaa)zX`k6MxbQ9~(Y5+)k0c#*x znbi_1Z!g7R7Fg2Wq$2!r7eH+CA2Rk}lvF;mC&XS$akKypnrMY(2-CjDtr-xDHJY>x znbnQR+^MSi(WRt|?Ufm;RL1MbnEZ#jSA&@|&yek(_D7}l2`LCDn?pwIrFh`xDFiW( zuuWu^DsiGxTxBeAugZ@rR@(fI1MorSe_z!)%g8_TJ}3$Ndoq0gp`Y@m3 z$Fuw|sBr1L*TzHd9A)KwQl4=n&z6}(ROU^F%$n)|X1euqro+5jpZ2?js8KPL*45sn z%l6A?4XpwfNY0tRf~LTCsj}W%G#lKJ;;@EB@+^9q3W zwiJnWIf~Z(nc@a7%TZqDlwOuLFi(0IQSdOz3-hpQDyBDzc@9R4tjR5M*e?!gucx@& zK=?N%W!GgVp)qqHMC%K(IS1{941d}$P!RGa$~-nrR*EEgAT`@hY-1E#oRMwj2Glw5 z_(R?;t%jmY39lhYdyu;%)u~oaHr!juu=c$bTm;63jt!OulC7# z|5_@ozIux!)+wSv5_yW)C5c=`G)iKQBGhK)d?Nfx>5cnoo|mfxrTq-WskA35LTQgt zgwp<>bEOeVdq5FN``bj&VqzyEi6fk9zf;%#@5KID^k?BQ{8<*jpH;1x`DI#9ictF8 zc#2Wx+$4&DqyOB&a)EAMpEsb@v-SFf8nk9(Jo@)P>OZD!Z4ZVp^(IoX4rJL#3=3g%Sa;bH`#% zN-a&iao1}lEg%k4*N_X1YLID{t8(UR7K2-kQ%3uA&(f~>tSWi16p_VZPA328bo4swoWDItH*sT(PkhS;fy z=>1xfoyy!1ps9jRSv;*`^~YoanxHQ05Zdb?Oe6CT2Bt_YPs{uRSuLF25*Vtq6L9?% zaHqjYIc>E=mj;94fxtK_R1HeCN2nx!+Ff*RqTVq!8v)LL%put=wI3NoiLukMA30lP zIyEQVF^}einYAraPh1~rg1Xv+l9KIs(+a7wMyf>CA%jke2QDLX{ClNH-OJf^2f@@V z<`#fb4>}wv^(57_NRD#+%wLq}-qO1OZX+ zZ~+Lk@-d8z)XH}oM2WG}@eXpf%5-YwYx@wpEcNMSQt}xo3B5jpD8&QY#)3inRxwgg zYO^YJo+|ZPmfcZKxplQ04JwpCt<3S)Q;r(6vM>o;0=euxu#S!!vd_D9hSMWhJRAK(?26w;+khLkK%#H#!wAw zv&lGrRwH_6K=wj;N<}VC(2sGZyN;GK7(jU;NQ)huDw9%sl`vEFIh0tp&8El0n8@qAhWPO}8+`1If}7?#HQ8bK3jLe1{gAVGyEt;FHl3CdrPq0}A+ZmaI@R za#3TyHcrzLmA$zn755@oB`V_$YAGJLi`43NPeKYNmB#GO-=RJ?DxbMY%MLckQarFy znIxs)4=@8oU7^_ZNyW6aRIz%;81e#tTpBCeA*iUj+W3&pTAAdpr=;w<`eIU7C(mYL z`K+j{Mnq|MoL!gIgbNLgaPln%S9&d;Dii9tZQMl_Xrc5@$I}^Pj)V;Beh_W9B$#B+ zp#=Y4RXd~XCSvbnX8(lB_A3W};SV#aWfL5AXiSChej{!OO)XD$UKfm>Bl zvw@Z3(5tx8PRHpPD7_C#C;ve~tKRiGDfF%s#-J@NX)?zgO16P*A61H_87Qxov+|=nR$(m$rKm3B+BC zY}t0jhPqKakaH%P$c>(dlps3lWVkx54NsV>G^IilPKDMTe2#o+L4AF)M2$y;r-{n0 z-#Z>b;QQgySW?>Q5Rl8Rkr{vx8;~GsH`#-1M({cvf4mUY5mYB|Q?wtl2u!2s2arsRaAbRI?wLkJD4m}XLT=B&FJr2+u%D5aG0`O7( z;|+-s!Y@teY^jqWR!Epl(>ANNxl8Inl~WChC?2?4+Mq5LD3L9y=zJ|Q-XKEpz;q=d zBy4=)AT35oP0&)wA*ou5XVaO}+JmyWW>!h7>IwJ-ep&Wxe?0*Riw~2cddJo9iUoeh z+v#eN{U$Y6NabFN2c8&40ISAV145_cNeHwZqGAlaplv@~k~ql_Lwcv9hS(pbTtjl( z(M!Ux1o`h z`sevbGuZF~@zn2)*EanEbXyHo&XBm15?_;s?sZCR_2BlfI)!rsw93A!Hx>1=E67@2 z24M_dkfwsD)5_#os$g<|Nl#HUsh9L9MbkVa>C+UQr|B5bl#yNcbi6WmBeDXYU`2!7 zrb?=A2)qs2pLK6-OJeOVSRi|O+fB+AavG`o84@zs_OPOZw(V4O(6(C?9kgw|qJy@r zRx}wT^)HunwK{P*4@BGf+7?EJYa(P#s#^kMNW%X#(+2|siN0|^?W*P3QMKLwVKCWU zeNYziB@zDWJ%Ps&N$hR9pCJ|JKQOOi1z&}LPSu$1Z+TLQV`-l@8xjJ&np91PhxM(5aYc zc9ATMZVJ2SBu*tZBk>53BoK}SjtwGC+Kpt<8Ji=hNn$o7#kHQNhVS4lIY9Wg#LXjS zRzu(sCjDtO*pox%aV?|IFfQCh=tAjtq_p0#aGK=1S@QAhQQgq#*o*|SM>fipq*mX> zvRDxcoLNNF>@N>tC+`F}ooYj)Cj+X^%ZxMXj5q519s)tYKPQ6D#5{^f;s_r>!}s@` zGTx6#9VWbYsKju*eKIi&@B7qFxEwA+)1?vb1;ib~dpeW;v;j)yLM;=4_f~3hv3RUQYz!eLf;ayl?!p z5zwo1lhoyQ(QY3u4mV#I-OZ;;RaLa>ZiOh7-WoVlC6e!l+&n=gQd`jEM4X2LUk{X) zkk5aw@ceWtw}C#5iIL$Tap^Xo9XXx10j4dISD(>Djkc(>nmbyib#BSJwbStk7`A5J z+GI6`%XKV@%wS!t`_lI2#98%mz63}j0yy#D zM2OmPZW8Vcc%8?3oT7y#qHP)N-VI|?+fOOMPd5vt{Xy;Cubr$sPM(VhYr7mOiv5l^ z(`kLw7B@=^QNwB>iU)>C`}VG+%BZ`tMk-!)!tVVHDnBkx%hTpu%Tqk?c7G~VP6ae- z$C8otj-O4HVy~mRG(zogO7(J6%+hi@o9(Zs*_~!4=x7c*J=c_Y^HORZ|IFms6r`Qc z^=F;NyN%?EGLR!p(Kr5FE7|F)LRzA#gi}kV8Y)5Y!09CEm#d~=k4YxO{At4!fU#0m z*IebreVYO?wJSj_S>7*qDMWYO$~|Op3Uk$o)CBY}6t*={uF(g!niERR30Ss}{n9Lh zWT#^pS*Q%_bYzqER9Uv1VH=#ttatRELOgM!kV`w4K^mN`GD@43_oaGy0#Zm+qAD9v#h-SA+V(X;19^$OGrDAWhvM1#~f_6!u@Ov~-R7zp(v;M#&xqQYs|d24loUlaae@B(v%rL*Vn!+e_-* zQu_spkwtEmQQ%VBEd5i;%vLgS01+~8ovX0?JS0O=lDRG5C*kkZ#oi0EFU!f&IXzF0P=* zT_mMs-}w`^b+9g0OCB*uQateYzQnNi5aPkUbC3vs+P}zHf84=|gobV|l^6E{5>a3a zIA!0F^8O&*W#1WMC%I6k(dSmBT0=Un|56FcuujJU5N*>)Rt=`pVA?BL_u+RtnK)LO z2z&Ox9_@k@$J|rXA-2>$i+Ez~^Kf%k@V% zZ{RbRf`+Xso)>%5v4E)P9{{Q2UW0)C%tJicl-KKPp14;97{F z)%#{dXv6FyOZk4|7DP{Vi@HH7GHsa(RATs+X`w2z6?i|W@Xi{q@DAQ>fJPZfT=Eju z%vT6&f7%F~FM#(A*35d3B=7fZ0K+qi;aju`rpm0_+o&q29Qw{DNZXoqJBHqyf2W3P zDt@dg{uL>J!hBl77r0+8_2@o$d4;S{ao)?E##Oz#m@~5hY7@6*=zga!zQoBVPxNj0 zQr94*D@W@p*HbzZ4g>%0306Ik)2c1- zcTNE=(&T3&SY?Bm-^i z-<^*2#Cx}y7jq*TWv^OUhIDi~<`O&ByP>Wz8dV5S=}#$Ga8k1#p;fxEn^D)1{p*t+ zQi*c+cNC%A{V)+X?r(tx*>M#A3r7AYjQqQapzd)cA`$odB&!Vw-;7W9)zr*vg|ouT zu(O9?+@GZD(oJSntr!e2jiYum{|Ogv7J=imsF4rF@cD_nFnz%r=+t(zLu#ZUUEW+X zaxC|mR;&mrXHaSK7TGq{*#AZo(h!!_tbMvU@H&+zpK+P_z2u_DH_{r?NH*?eEns-m zotfAl+6`>0LwIWo(4-!F*??NQn z{a()Q+AEJr_s{&BtiNoUMGA@)qsh*!gVa0+0_Rg9xG~0$yB^7d{0q^-o8o~U;%VM# z$gS@?aSXMlMo(GSg9K~#J43M0!(OPP%Kk{Lrj7*eM}++=74{xc=Ri$2iajT}aaL5{ z?|{>nfd^Ryq*|d@^`P4+QQ!3>uPDiLpHc6JOAg{gH+t5g8`K;aEL&inQcVd-GGRt2 zAzmhoqXgMG5=Zd;s?Z_NY{pf?8R?$5@bd*VpHlt6GxH(1bf7r~3TRfB4`JM-w!CkT zq{OTvggs#nG#28-!psYldn1~*3mYztwZHmUr{h^Ab0}ErZKT zPrIn{l|p4hSEt5jD;rt^ohTw&|2mmH!=u?VLv0Md91%iJ`|h7mPI#k*ovMF|vN3W6 zJcu+H57~eGGwD28U?p+M)#5jF*1@p_1!dR8b-?H7=|&&2b$?3=s4*$4J@7mxPeL&O zZn6RQbc)WgrDWt-x^CV%wp{+Lkbf)X-}UnEM)~(z`S&{c_j>u)C;#3g|K2SB-Xi~! zJ)L8>;xAn_9)9>tAu@71$95oWD5k`=4`E9&_JyMD9~4_eu{SA}N3nwxyMbaaQtUp8 zJw>tKQS32_{heZs6#JH9J1KS=8nbO1#U@kiCW>82F**@fTt%@mifyA<5yjBuMBC*Q z`z@u>s-&~i)=$8mMG1G<#0q*=5_Rdc4W^g#<|KgaGHi8jwk7=0ChBdQWZq?Bz7X>h zj@ZT0kwR1@wAsb=qlMUQOZv_(er-cHdf!HgpV`h5;?9_a9kJrx7%Zq>iAi`kR=g3j zT!@G435R3F6Lz}o{)bp%zBO(m6-{N|VLLzJ3!9jgEJQ&*BKvH!g}60lJfeS$8Gp2w z__=-Jzk7-Q*pq5{i`v+6LOdQz2{my^yL*c}riiTyay5<@0oD4 zw|KfInE%n!gVfjJ;V3sH+-d9VEne=G(9lP`+UqM=v$sz*Ql9UNKKP%$rHCHw_X&Xl zyOxNngt*FY>$HnD8!EglCZQo#?1({hPfXJ8SaC20SbY_f0EXj~dY?Vvl~~ba2Mn*< zll~ej-myOpU0dTuf#dPGIb7edQtvqr$A~SqivW`?0guDHVFO|vwuFN*;-;9Nkp_35q z-^UWi>#>mgE;i|{9xwzQ_k}o0-5-b4V{u7e_Yl4wRNT*cQu4z+Z$$i&_yhpk91oU% z#3wx2TYL}?kNHhP!asY9-zK2IFA@?y?=9LBu+e?GSJJjV;`hBigWQvS(h>i(4^EZb z)AuvmZT-Y8iNNCV#L4fUCcaG^_@C2+KM6{oP3n8g0I@#_;y3nBdT@Z)-alK2zx7Xe zdVqMhKlJZ7E$Nj3;-S;tgwk&ZP_l1eh7d0g9QqT7cza;E5U)9skovX*720-s!k>nS z9jC)-{wAaEo=z$TCA>dG{Cv>G_yoitV)$?n0B#tZaMMt6&tO>i%HS*S94hV~LOtW1 zp+gY=cIak2mN~2+n0;q#u}l2>2)NDkL94|gY!u)VL&P;gT$6A|jJOtU|B!9+12N() z+nvy%+UsQbQ$#IzYi$Xi$B5g=seWxs=#0V5Oj%GbQ@6yx`WIpneu74dIVKgO+%IkD zl+-aV{HaZ}*Z|_EwuBqw#D8qC@9~&~`{KmYG34wqMa^-d#SUD)v?shAC%&^o-7jMk z-i#B^#KJ*7j_m=4W3juSZA*`Zi2tPrlIwb=f7?^+>p2{6X75QHANE9r8{_|BL;QFG z)cvwo!rtEEnO;!W)+^!l-s0cAAop-@Vt%}L9@?SLEJR=L;}qhyz6nPX#oc{@_{)70 z+7iX9eRrU|fAvcMN1z{6{4_D)*Gb~RM3nb(BB?l#_%t|g^E8~5HQwV25zL=-{C5)B|=#TRTaM7{JxzssoQSP!O z3r0;`GBFbmV=Wy$afxtw3oA;>D`&e)-D~nI-2zM(u9%-I6BoL@UVQT)JHM=`)Ln7W zsEI2kE}FR9EI}W>SW!}0yaJyh@oY#Z4U2Mf<%dpWNumO}^Sy4dY+kUG3imZtZm$%B zLFr=I(m6Afi14~Ab1FQAC_2aEDNPsoMMaAXu67qzri%^kg5@Rd4PsK^#*MBb$X8Sq zRthL!s~6?3FF_^n)^J^rvRM?Bc*{MoKvgbe2WOXfQR2o;V(Fy-giRy0R4ZjwI+>N} zDXVmsRgwuXtHA3it*UfutBdn1+(j$sCGO?JGs8iwigT^d=ZWnOoM;s9AyiFa-* zkP19Sn}qzdhQQZ$R+p@)s*p93l&4~ycc}-)R^q+uz^1UmjW(NIQUQ286`L|DbMh;T z(>K8Ec`&tNox7;SkYD2Vrsr3pVG3ZkHys~i@KmIWB6mU6n%QpU27nF;tMjW$D`(?# z2)SgJPFR><24|=M8RB)9RjqTwK(}fl?=mkwZ!@dZQ@A!=xYy^GRw3(>Tths6eLmM3 z-!v#MbyH)pf2E7nC8h4HjrazLmunK4QsNEPHeD3wqv71EOE$`Au^>;Bf2iSR!R5}I zmQ_~hDRLKaD|*VQJa2lCiJNo@xtF(cQ>lAlzISbUL4M&{)FT~8xPg#%aP3r~lsWXC z{`9bR3T5VcswxWI=_O_4yeM{Q33yj~Di-FKlu5zGWuP-4j2jvGfQ{26-z+Dl{1dDWzOrY*5gBOcZciEcCVo~bJFG`nx z=Ky``jQORd9(-14%@TKhQAQzk#HAkDNr`od>bOcmrpiw@l|}SC5lUK0A5X#y_yI#k z<-D>Y_eL}bKAa`Tm~`POcb7>`o{A!O#heQCvUE`nN6y-a?nYlf5cqHifLoV~K0=O; zY*PZcydEXG$uqK5~+FJ7&|tZ=XMtaqdIb-DDNlJzvss5GrtQObM6N5(mxibb+t zSGX}utlh{CiU- z+J_u8eVrPe<Y7*(Lj^21}!cb7t)YG4dSJiETOMaNe1bm zs7Fp|{wArN6hw}vQip;-n+2ck5%iyE*i^DEZ4D`npnRnZ`bo|;}%f__!#E?Msm^RD28 zmyQXd7%f;*D5rwVVz>Z$uRGma?5Qd(%AgKA+g*-X0K;w3(ghfBd8$lTGXzklS&OVj zdxRzx8jeDZoFSb6(+ADtb1<`1!AV1^irj@IMeZDYQmJs0^msklvK-}8Zw(IT+J=(} z!f=eU?lKHD7;=BCk|nZpdEMQJmK0&wTUTQ6XG5(@iss~(l!j1{(`S~N8-q1aOz6|= zWfk*Jfgj_#x7eUI*d(FWMz4+9tWl;$gC*KkFi5#8mY_eQ-7Bf7FSU! z5o9Y1j^w&oONwT>VUc^bXG58qEwnKq-cTcS&CLs|+3xivh3>@_C2(lz&KYGz3q3SJ z=3vEA;w2YCZNRXmqztoXNhPgeie_z6lWms{!s_J!mziHq&U;D<>C=8)`%Xnw*(Jd> zO9n)?`kf9|V<^Nc7 z7i0JhT9}hh3m&X2y+20HZ1lfUEWd-DZiTymX9w6v3k+~9rN%EqOM^=eKpceT53!*F zGsjX7ty8d$^{m5iSV}9XYq6jaE8O{O!$wa%KZ)qO8L=o=P3-vK5A31g5yr@MHMI+- z26vG;Lu6{s(keJ7G>7Ir5TVW%yw;wn^G>Bw?UokB^7 zI;Tt%&S|M33R$9%C0H30X}u)8d_8Ah%HdU;U5j!r2P!kG!v&qAbR9=gp`m>mv#nQV zkby8mQ=?GNXtNn~IFT2I`Y19#ROR)CD3{UA{xVo1ST806SXymcdFe@(2Q3S3G)dyZ z_0Ef(R4F-nkGhCVq0MY$yIe%3Q&R*>=#ovT2(@!m(eP{uELOC-5a+ZRRG31QT6$Wl zSZ_|dm=e>ZRYpeV#nWJ=Dg7Gw2c;AG?2)5bpCJWR3{i5d(R)cW5@m&OQA7PGm_`y| z^ZzKaOSeO)IBJCGMFyKh6(UFNdFW82T{h80hU$k5l+JWg*+MDIaC9de)THVZvVx$K zjuLYIiwqE(bi%vcg;f}LHmUiDkqfDtIz=`HX}m`2i4Mvs=uu`tNys@Oj0q0Lp@BGx zMWG62R8-_|8l_aqA%$J*VvH&4)gTjewqQa;sS$pHmX#P@bCJ}ey!({I6jM3QBhbd3 z7kxp`xP~3poNuf^H^t~h2ti`74<10huNy%KoJ#E_)OvI=AZXGo&#`r}vB=FyTP=eW!0fXA?MJGQ=Oy2*EFMMU=eW@ z))|7%Gtk!el3X#?DG~%JP8S#8x*45UnIjwK z{DFZ(cX>EA7K=ihfgf%J5V%SpX`I%VG=fVhDanWHn>fLL1cVd6SMu-&2hlP;A0aMQ zeTwiHE~La4AjI{HVuTI2U?B?e!?l)`2pe%-^=5>r+4%fCt}e779EdO#m*u7*Y{d1_ zr3hOW;;IP3ycOVIjc=h|jvqqbm5^J5?=#~1;$Vc$2*)GL!KJ=w2wM@(MrcQoeeeZv zT<=l`Dw-4{Y>lXBV;t=3D{Rhws84@kYwi#E0gxSq@34+W2q36F4FDnu7u8eKgw2Nw z=&7hf>vUmjK^^Gr!UESR8t_ZLK*FX=`me(oz>khu9Pa0E0f);u%;WHC4*4^`;(DgH zaCirY_j33!hs_*5&*AGFHs;CVgMX4aw!S);WRB#>1mHqPi%$l@Kgk^1c6~6(9Fg*= zt2p__@a%&<6+Qeq6{6X~4xK-m^ZSJ53Ze5;Ilp%o`4@8j3|lyZmfy|whwFqLI{!h= zH;D(!f0*;Tvj6du$UnjP3`fugUH&ti-z%7-B0B%&ljz^a`3YUf|B>^%!nZfKFS=0J zq01k^`8~pNL+x`G=XcdUQ#ijX{AQd)|0>R>F~N9f`|>#-LzX)3Qb7)fhqfwOf9G24 zP;?%LEgUBARO$5BiQi!S2$M6{;t!60R;p0{J*`B=0;cq2TsNiTm??b}uIJLxZc3lZ z>Gmp>um3LQ^!}#w8;cdkC{y|jw(}fQdTtl#XR-a}dL89*(@c7P;B<4nS}|VJ;WY8v zSihM+j`5ji;&(DGmzvUNU#;|;`Clwk>1OUPxaro%$ULAQg}qjA=>#zo_%XP&~m=M%wc-EnV{L%1GOIJ|h!xRRP1XL|9f4e zPh&j^8?*)$Uc~$(P3ix-Cc6GRSdY2f^I3j3htG2O6^E%CmA;!f{2vbc;~r8vy2A%s z7;zutgBxwajw76Iwr6;`Vl(q!#q~0e+he*&{|W0^Zz^{sr+C_R*7kWP8bhDiw zchT-cyTGBA?Kj)`>n_r7<@&tH;n-^xURRmIS`)4Fb^0F8*X`aL_ej#QfWs{u>UC+v zI&z2N*MGa3A0OlXndDcTskdo~=ppsTzWANS0ALFV|ko^lk4TXT%|wF^?jGq z>6`)`f8}{cr_(tGI?VHX<0_S&jDXrKaHpcrX1qQ(v}ZiBj&Xhxx6k*c{C3VC#Q8mW zA8K45{9mjm^?D##nJeDr^0ePHvcG7*X}z5pImm8M5k1fC~*)@#A^EsTy;UW&b9P0JplT5$C;SU_@ z{_qmdcc`fd`3 zIUJU8=;LrFhmUdi2M+(jp&nPpvtP2?ojkbfuT#lyWS*Z?_n5J=+j`1h4 z%eO`Go$T+7TNTH~ljv*U{&_NeD{l+uSYH`V$KM=IAE^ze+nLVeWalm6`DV(+`dgW= z{UrQaK93`Vx&Auc9R7s$2Q;2_W{ztKbj-R6 zX<#UiUy>OmJ7Z;}NSF~W1UYM3wVeNn=9h-Er$Q6<7&=_!1J8wQ#xvM86{ z+NR$i>>F>^vM4uu>Czm$6-B>bCQ2RjD>;OZK58J32y5iKclbqN!k60Mh_HiS`sQ;! zr)^l6wKPLFN${m`#xnLafYs$GxVq5g#@qBZxeD_Oi`~MvC1^&AJsB*L1234##S2T3 z`&WaJGE2YWS+nw+UmH$`cGnub(i$%k^?J(kOYyoX*ZNd6Rj`1DLEu@Gi&nu4JuBUF zOFaeorSd(?K*RQIgR^K;X_3oYSykXF!0Ws4mS!J){!JdXhQUtA;zg?6wd0~(^&TGK z^NrKUgiuj=q4)BLC@jHuU;C08hD6{_Z+sQLK&VC$91E)|^9xGd@|{(}*Vqjwz4*s> z%*fz!WzK~+U7SkJJ@eWG;s%gA9dtTXW&pN!P*GsI~)Edjm=*2-UI4oX)O{qC>HrdX2%Z#Ux zQdS02LNEBHzMkVLr|i70va7tslwTYre~B9}wk%tYH*3o>%QcI98@gu`y#hl|ZE;gDxvI>YzuJxVD_LhK-mJgbhDN{(dJESPmg=y%@KXI)ai|Gz9*GHm zuaW4{^$Q~L(Iy{>*tNflKJ%7mEWrpJu4B>$vB@}Ch{sS^0Ppx0G5lhBy#2h$vqAWg ze(aGLo1wq_97*k9#ouVwJ!tFNyuU%TN!ll84{@={ESI<|#{7mO@qSFKXx@t_VdL;> zcVNFs+!m7+d?CB|pO|^{uJku!=yl7~osPuhxYUw(^|hMq8t; z0sm5!+)g~i-w&qg_Y3@9)B3#vJygDapTJC}^?L-?F|FSpu#0K^oc-@LeU2*cJ*J)f zTxL7d@?A?{IjyHEPd{IM0n=i-l3&lXetz>=ruB21Uofqo*PM(8ov42LIn83G_4Ap( zXIej(nUuiw<>xV1F|D7&+{(0m{_-K6&(B@%V_Lr#=qsl6^Opm9DgEVnsy_5RO0ut! z=`5o0;N+2fmA`^%dOsB%B}~(Ms_59vG`+8ij(Vo$d#ga-$27gaijF6lruSIU@q4D} zeO7cFVVd4+MaL&h)BCOH_HSx9T*5TH2aAqX zOw;?Y=qP8J-it*CKK&!{p!Z|Zv6E?fPZk}If<80R7kq!y2b7*vvSGOeFSdy#4V+}Wp^{}yH6S^boL{e0P#OzZby+|IOq{_Z8FeYYz4ub3A6+}YW{ zitN?z%~;N~e$MYEruBOhUS(Q8xArB|qE6`_lcef>B2K{O7eO=amFCkewwCy^4|uGb94|*^2U6U z*Xxf}EU)RHyp#^f8}mtCuUB@kyr#8$IYn?#K;;|rW%-xLZ1GoJKGR*v>-7-jle}IJ z^}~bU)PFUt<(<6HB$~=M=99c$KdohXO>21{)-S$g!}6Ne^2zpad1F4w z>-Cu(V=LLOX)T|l#DnD<^GRN>=Tcc-(^|fnA~+~mWZ)-Sme1?I`MP|jDWCkO89zF- zynauIme=dW5|-DrmN)yqF`vrU>&tssUej9MTz_Le$sgnQgFMIbn%45k()y77#(a{e zcbd}i7Rzf|%Qwp0ki0RU+W}?3`(SxxzGwRO*eHPXndcSZD(|W(Kn`ymY z*vquuFMPnX-Y*O|Q|Z(1t60di-Y?WJt@jJhFs=6sA2O}?3qwaJeR{u;!?fNnR5Pvj z3y(6b_Y3r~V5*^}`+I2qk%|uLn`WY&Ci*fH?KRQ(k~HZL>bu`WKWCy3nCQ1nbeoC(#zgl+ zNyhS~nCRIidZ~%7R&)@*S`(cP)}`9g)h6oIRCe3>~%en`t@xH1uuCofb)r0VMy5gEqI82CnT z_=g_^UkBx@eh5x}y-z`s$=B=`<;n}0=0xMwZF8Ra%Cx@9SHjKQ zbR{QBn!X@z&f+V+(UT**A_PI`Gsoeg;Wspx^P=C%5RHp(V=!mwTNt`XhryvQTbf{y zAFc|&OF?NddUEjMe^-~<%@=)f+5RM#ougmak8(4C@yapBBd-}p&!DTt5jn=Iu`1Je zg;=FTTpL!&`VNLLiZ2nXG<_q3rsM}~jfCO4Et?i`IXUclu97ugC^n?f0K-~N;nJ|a zCLD1?#JN{=IZ`FlS0?F`j{3WO>8nI{>`}k%+T~YVyVvCn`~3Pzc=2)JF!qz!8TOrY zsak(7ZoD3U&7V9xJDI#f>J1;GgBUH#N3P3t`GU!*nRD?i(#nPTYu!aS0GUaIKfAt4 zOfctEMEy`Q>2*y@JymX30exuPRZ_Ozv(_D1`j2lVlldF?tGV5Mu_zi+EJqGOpO(c< zUQs@{x&iK{zA{S<6TM`uA@l(@!^dg65&PeN^tT)3C;OVO`2(&0jVgT?Sj2Z(qbTe8 z!`M-n$+&PB}lKS&S?vaXwSmgI^co2Cp^pzAe}K{0ew2?!R!k<}O$~ zD`SDng)d9H=DE06PFlB4%+1Vnxi=QN%PU>-wy4yIl*th(X%Q*YBT~+fNSPd|X!4Xu zuBnkp(;|~1O~6;P%ypR@Y1ZT!5nNLut2`yr)G3iAPKhjWN@R&sX3%J(h7in+a$NOP zxTa2Vxu;Hc;R~a-i&Jf*!aHX0>u9ARS=_DXuE;Otwhg75b*8%T8BM8EFW*MZuo=EB z)}_ixQ>IUbT6y!&f{a;N3tTx%7B5|#xp)EYP%^ApqBEGj&&uDm>r$U-Ug(<7`03lO zj5B_9P*1H|!6r@lQZmyFutD2u`6*4oHX3br^H4R?^}Mg(gd<{Uq^vf88{B^N9@_?h5S!dA7Ys#~t< z%s>V)hWXpzw8)bNl@B+gJlz+_VrfdnV>AI0M+0?a67ND|{=ZtE~G$l*!VN z)%|d5WQ^YJj2uyXCoDT^Gh#nA!{sf`$M=AZPlc$B7FLUNYkQ&Fi(1jn%N0DeB~s|T ziZ`XOoE}Oj^rVzmc&^5-%$p*=TzhWGx^?Ql`g6TSYg5$uHgC$p{KAx6PgMmprs%KS z)2j2oR#s3|Qd*Rv*RP72?JlTVV@gx!v%Ke)c`DZBm!@o-ah~hEX+a)Ox7%)OmyR=B zz|CD`?b1u!8=f!eM|Eb7hYJ`4-=2wv+n z!QuthX#%&`o4>{#x#0@#TqFGE$8BYU%Y5rJf%(Fc-j3m+N_|e|$6;%oCQ$b>gn$fs zn{}FCO-UJF@&ECs35;hK!qzdl(~6meS*ofP@+PM_dru} zzbyN0<#n&6efH|tcP)8+_*r90`h5HR#BVAF-*Vh}QQQ~z{AvHr^mE@TKKFjdFK>AK z$(5d0+E%y3{`K(TwK0oV#&urz)OFX^{(Y}MyKdqmo<3Pa=WO`JE!BYo``+61$>eA6 zYPx3qFO$z7xNX6_gIC=A(*YHSbN4QrzaZ@$EN?}cwY{>8-wn}^@@jXibLW4&hn^6LZR_dV2q zP*gFCMxDZTUdhmPDm`irHHJsCHt<(DtdzUmtzz1H6OTKw-EKQDa!zK=ijH6NU_`xa;2frvU7q}#Z^|40dFjg zUGU0B@6|nf*XiHd$9~b{j4zh_>Dq@zfBxEik3I7EWsC3o%SGw-;oJA``EDM(p8Q{W z^>^>|rg-o!+n@_u5eoqe0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O z0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O z0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O z0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O z0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^Of&Ui}c;maze!wS& z<(IbU^TMa&x3ZrQwOrN^gz@<7w#&6NYvoc-GzLB+fjHA~h|*7gl-uR1bZ@Lg0v~35 zv7=SSv?(ei8Xx@*9kE)oN^-fpl~o1aV7^)3jAbh82y+l^)Q39xC@W+i>2npkOUvCA zNH^BFoq zb&bkNVg{nSw@>0n^)1U^=Z>hall66Q0}{8|xvm2D^~D{_^T zt@eP)T;Im)mE=n8FQCnsY26gkIB*aQF4ydgr5Ucw#fx&6%6y;vD}<9n6HRSQKN?%8 z?csNxke76=FB!b@@P+$H4Cm4}C)((Dy8B5c z{E77A@cNF2JRLsyR|ukw`ZzflK;LR(!eFX$gh;cN(6p0Sf9p^=u^;FUg4?qM6=Jy`o=3W1<@vboTCD^uVh{R8aKJJ zxxU4$PuoZI$^5t&1u8v;qFOlaF* zPts`C7yr7_r|V0!Q6F-n>GM`$x{ao97wgkPM4y7blJ)sCdq>u{$)u0y?)-%DE6T4_ z6QQ}jdsttiEKLZaP4;n)3S6$BDw$x`xAG0e7vS-j=1h+c06l)RO=M3JqBqiV@T0?v zbo%v0+=p<2OpX3$%P5=BW0jF(7zirorxPls7Pu~aq2ZGkwtSs==p$ObCgTUSI8ds+ zuZ&BRZI{{4L8|s?;^>3lO8iKd^2bMIEG2i7x6-{XWkE?nMSjJmlsOexv~2KHto5d3 z=2sMW$|kMWDJjd{72XmI94Q%`2MuPuLv3rI-X^-yyTV;Czoas{UX>R`uMmTf+O6J9 zPoXD2x>}h9d1Y@N!VnI>!4Nso){VV$JXK}rRH%70<(Vm=eAYiBO#l0!V0V?bBBivX zfPOTyPRf{6vlV#IGO$6hopf?qZ5q*=z2%GDf$BKZ=TWc{%aun@2iun@2iun@2iun@2iun@2iun@2iun@2iun@2i zun@2i_Gwb*f(Vk--8q61KaH4G15Wlk8=8S z$dK-!PP^#1h;#x2(s@BJe^vWH#5+;;iOsf0Ph^VittkH}_yZ`P+T%>*pV*x7D0sFz z`iOy@`-nFNz9P00E=N(PcS#2Px(&~gGP8iMkob0|-)_)PZPA%&hyFf~p0L}y^u^wg zA*^w7|E}HkE7}{;293aVp-dmvuIhe8J7IsKH}e3S#+p^_)E133Lz(At$@4Yyw5EuT zQSj+mjWOH*PJEd|_sBL%adx~5o~F#p_XK*0^C*qVmHr<$w<9o)d}LL77Gzo{aNAE% zZU0ZLdxYqiNxm_f^GB=vzi|G$)Q;m&4t!@c>4ERdvf-OlkJrE#ARhQsll_eL7eTj< zaCZEb{qr==!-n=gRSsOlHU)$M!QY=*b9iKpbpZP?C_<1XY9GqL{9@P zeG7G$zQufvkUiJL8}viiX5`%gURej&c?aSnOmfToCPqwz=f75Ls3q#cF-ldsq6c%e9a6XGW}FL)IGBz;iJT&Hz_U-!2SB**=&Qs>)O zwJ$`xb6?NH$34RzJ+b*r_qZ&J*u#aGrReX2|jT?L(0^^mwCv*m3yevG|9a9deBA zdEZdnvn0n@q#qJ}=XMN3nXO)h>(RB&j#jU;V;uRLN2LWk&W?G|kqjN<9}*p7z>f=f z>?>!$SBCAm+9n1{ef{Tl^dx<24EokMI|h)xLe^JE{yIcrBOG%(zVC%Rmx15q?C44S zS1|t-G>!}gwkz8MxuQdsGh}YZXC$}6Ah*IP$I>K{U98gIU5qiF>Xhs37>)WCCfm1{ z6UMN=6?tDmhtxYar1!6+cfLXIe5Ln0s#hlK&1AiES#P6#`{i0M^4^AyWWqN&c00uz z?SoZ)htKVJiS%D=(0?)X+gG;RF`tbWz9qPPf7%yR)&(J+zy*ZCAdFWl;b$w_=WK!|`qmJr@@lxB+nnHc>Zx=S&cU;(5^LK<;NeWS$_O+vWLgWzy$J*LFi8_WM88B<}NOq=1J;bBF@?Itf5}U^xd4^gmF)= zDaQ9w{!ZiZNFka>KA5(B3)#9@JV&+$7CWByq`X@qqQ{GhMF45YDp855i{K1Q0HGe*Z8{z%8|F^AvR@%L

ar0G=9`~%mI;p3cqgel+kWck!gl?Ln-q1Ak6aAW|Q3lZm zG>vkI-lu8QiRhO!jkUop#5?V_!>IcStldsv?RMflyExIB=sW?ePQb1cXqOYMJrNE= zXh%2#;Q;4}ql26$-W`T{XN2Fwvgp4()m5P9L#3}bvanC%p{%g zqYDs@1P;`fX)WBeZ}=YEe-cK=gO=kC>{ESS@lAv*VMz9#jX3V>iY|xpjB;mcIg~#P zaokIW^_#-pYr>f3SSo|oKGfF4PiqQI4+4$*n&tR1Vz)rQn1}sFjOr8itJ*(_r*&B5 zz60Y?Gp%VpL_YP!|3D9|k+FU`q}MNBbDkW#9(AhrO15o(9=s^Z?M1)E668K)VTRheRflk8uiuPmRZMAb5c2!0(mm&9KoxtcT(E+@+kGJXZ zAa?tkWZSpgM&GJ7x}0=`@;EE!zuqlkLUnY2dxj#2ai|=rr=4177J*C}SMr+aafM{uSZ( z5!dA-RTtus_Wn!P*}i=h@g1-!od4zQaDXRpAmh3CMIoFC)1M-}^=;Pow$e91>wAOs zCC6=lne_chbR7LF^S%L_|LW{$`xEAC>?xXRhO{5=i8VdenF-?99r3n=PXgHU6!V^k z*4It@2Jgw$_`oJ(oj-%@3Y|x~4(V6Fp4OKH*07ghABaAJ zd5YGebUv&Ja~19JnlOF^_JId;K;VFqm$>S>CSZz_{%+-?iR{_Ig0c1|C5D?nC`* z9KhjpjFErAy6~P039sPVAXcpnbX#FUS7Q$kMgCz0>{mWe_)b(1GMZD zu-7P84&H+%-WJe=Z4>GexLb5!FV`#@G>YZVWbEB$#5`P*sjF)Y)Fb12f^l6!8?C;JOou29L@SdREe?rW4!cE429 zU)AaSxg8IHN1uaebt$>8n2*je+z;6Y*4PgpCcbCY9NoGC?GK*7vzV)6d9L;@nNe)= z-*5C>%Kkgj)NVsSOTR?DjDGnlbf0G8?Pa2Yr;>#&M%fo2`#s9Vz4g+MW!s^iC1igt zqvz?7KNfh6F!XlGpGnMRmE`!d!P@69#o*THmFK~9a zN%sxT=bHM3=C7vAoIU7g{hLrmBWyZEHce-})0N<#<_0GvMh-JX4uxs^VFpd4}1r zmdxmQg33-&Jb{$Z`MdZYY8(jG1#6RE0FRGHWOO_VTLSik$AI_t2{zGjPMnbYXVpLA zx6Ad#1TJ@iD))S9NmA%BG3kHhXyU^ij-u|58=0P0P)PlW9gVEZ`P0GE4owCJ#d=jdpxgWrqaE)c)||7q`Q;G?RpefJ~*1_%%p1(oW6sHn(iRE#K- zFFqtBAqgK^HJQvDl7Y!goSB3~Y)uPRdW+uBq8F96QE81WwzSeKc(IL&7AsZop|uum zR9f+)N-NifUTNNc?Y;KQnKLsP^xoflzxRG;V6yjrueH}+d+oKq&e`WofBzVYlU~F> znf1ao3S3{SiuwI_Q6Bkc*E`vAJ^NSi{_2^r(wC?YQ2w{h6~{k7x?G!kvkze1uHwbn z2mYkv=Vc#w8*wS?8MSABQ)92fZ=EfU|DO2IrZs-nfmadlerEYj^sAd`4YQZWmGLHh zeye4$F3)QWJxI4_HHI#PpVAom5Pni))@hfb0duxn1 z{s`!}CV+cyInY3RzGD_^yJh!k8w12K99g1oH=fr)dte6h(K<~q-XVU#Y(uL}>mhb-& zCObSt_e#Ii=Ov7GrRy6<;4gG7awPoFdYxe@_(-qC%>O81)Rk=W&M3?`kU`fRvTz-i z>U*`WCv?6By!xKTTSLV0xg=wV(y3U-z2bly@e^z2<35PmPs_ea>(pn)CEq{fbUd-6 z+6VQK?UyZ%Pa&Do{^9`os)|GYB+ZNUt^@JUW5+W|j>(Rv6E@lL6v7re?nau`jyaSD zJND-&{x1_Az>XiFEy%{y_8%gT*^b9Z2HWwkI*xjNg!t#R<15G`{oG{7LnM>!_&< zeD+IyPXNn%r|`{r@T)HDwN;-~_f1I$qSLjnzmq-Z@w^Cs{61($=DBw@4pMUy@yY#- z>?=3+Mab7NzDXOS{b=02pXI%cxreTiy^Z#vvD|u1>^|_(^{;OrJPmE6<`!HNC?2;H z>vFZWfDV-Y2wf{c`Wo=!c}qn@UNbEU8lIOQP4$+(3_l@$dCw5GY18qw;y{azd&Pk; z;^ZGE)-1$0!uJrh4D`2^#7lkx84WrP89p6{3=iVUrZ@BzAl_e0_Y%*>wU2QaXNJVa znTN2S+KN4(ye68BYe|qvZMGPB9>AVNx7i}X*dx;Y#$TcC3xLV)v1_d~Z}57Iu8}&O zZnQzi%fd0|Rnmjjcin5x-nm_`D{-BL?om7qjC(ZLi`>|kgEr~HUQOzqy;R;GpDgtN z9s3osXBYN3ioQhBCn8O)DQd9KJG*a;=7(Q&NdD2xUnBX)YC6^sU6=#pc;;1 z>>(b&{)6OqW1sN|=IBST&+pF0dSk6=pO5=D-F*LsbjLccQ(QgocnRr`b-&aPb36Io zXW3-OC4ICHk$kvk{~*dG`|14)-3KM!zcR1%(-8c0l{kI}^dfn^tK_vc>}TA^-vr-4 zHm=~cde_>TKIxBa>;1^L!ealMEO@B}J5jb=Q=@#dtS2E$>IHqCKzu&($#&E>?HanV zo9g%yUuS$t_E~j)0rrr6wpL)wxW4ac_{n9|A1(W-M3%g3EW$xp5BhNrK!XwM7Uf?y?>ki~Q-C7sdu#MC|dmrYyJnY_u`+9tS zh8sTcbNU|$4IyCW2%`~`du;nZjLzq9?F&NI|tYQC=b%z2nVw1 z&!{f6K4*W6`3_{5Z9D~Xq-@B%1o2(SCw&KFz(p7*ocLn@dFr+J{^*mjv#>5b71!5> zb$>Eu)?;K3?3tw9u8Qwfh9b{Zt`Qp@WDod#I zVWh`-ZCCS ze4*IY{mHUf-9qjAXb<;xma!<5A-ZVeq zdjC$6-R0$d1J($gkSEXDVJ~qf;*yT}kLESpzdXL4=$NNzj=WvRF@Js?@e^xqz+U9b zSo`w*RhGL(%YjUivsz;<7xR0VWYPQ%xgi~g+<@lAeV9_j``6MsZ3OOr#?Pxggt=;~ zoZAx5P~Hgs2eM(SwX_Dq`5(e$JIJN^eu<>hdA6JSX24F?HQBXHr@kb|lfrq&_ajYT ze|Y-}*qhdDGu_9(j{bmaT+*ir&j8;M`1$dZ`{0jb0`~FD|x!3P3 z>KeY0)_dA-Xnjb1dL-42)`_f-K^Xoeh^M+& z`Zn^vlP%k4yYm4av$2N4xGUQb?IzQ4-yi2carP5yMye;)+?~ReyKxb+5>AkneW7!dDt%`@3rZCBl!`XWuUz`-W8F6ofeGs zi!8sA|)(dp2Gd~6b~IS6i(hhaOi z*Ts-WG-@B+j&wg9?{+!rb!Bb*PcFN6tSk~(Z@>B$M_7(Gs$NQotIx>( zOlS5@eVNV-ke)=N=LBS5WBt6`hgAQr?OVqBQhBNms=51K(ogE^K7J4DVD%NNt~etX z)72ndv&mP~wL|ie*!d%izH~l?t{p~@NA_j-3i$`w^JCUeUmGMIvPY(Ch<@fH8y9^6 zT`E)Pg7;U-vb8S6b27TjHR*zL)(L0&rEd+LcYGX`2YcgQ!6wyS0@pXx*?xKUer^0Y z0L-0oy!@!Y|KF&M@_@~}=en|AnYJ{0xyU;ARf^}C;zyUn)AyU=+fDIKQ@q&}uQbJ{ znc{h-_|Y1Zd{cb8Dc)&{H=E*>ruZ~dJdfjxf0La@^*K84SC3G*zrrEwh;|rz9QP3f zJ{12Harl&se}Z^9$B!aj$ML@)ejCT%NBsL7e;4tmIer-N*E#+c;(zD(n~0x+hNrUr zfcW_we+}_j9DfCITq}?~FC*T;@s|+a%<+AQ|AgbuBTnxoBAL%2{wC7LW9%Nky_DMb zXx=c4YiLiGa2?cNN#BuyzB2=TcLsV-2Kt^1^t~DA`!dk?XP_UXP`$j(AzT5J2KGMWuULmK;Mvo-kE{EDFc0T2Ktr^^sWr_?hN#88R*+H(062@ z@615ooq^tyfxagLeQyT(z6|vJ8R!QGr0*a9nxyYfv;NsX{!j*bZwC6|40JJ%=D(EX z<2n>A>qKQhh$+~d_wDcR2c-8}cF_8>W0eq}o`rX){<^>aeu!P@o%84ZCD6vJxTvO@OzQ&+7nO5 z^(D~-emBx@eX75IHp==47th+B?(c5~|9r%K&-C|iMf^hWtV6sTo30B;KH~lTj*+4a z`a7{js@Xxs2&9b>B|?-qw>m_b3&zL+p?N(KLAzeyLD$*N53@uGc0+YeT&`|J?K&KJ z8?r^GW3mvt9hA7ofz(3|CvJNkc0kIyEa%Q_u_0@g5PPzmIAFgoYd1u$&mrc{9N9!9 z|2q!16PKjtBX`{f2Vx&O@=?jGaft5E8n?qK)@Qr+IK{T?u?L-EPd1e3l?m%|#^R{? zmYj(~^yEz5FjTA?RI+8L*gFV?9~qRhZK(Kg5SZ5wu0-lvcG{WQ!vd?a0dAMm2-*?kp!5 zwr3%AZj9q%79dfiZQcnCFV*U(9b?;Q#?4iDYtz_XH_ z!x7&$d}8kiacKD1qa(zz;SjnZH@9P?*qn>(J-K;XMvDEpkl!)FxoxCaKLRz3T zQfwcw6GD%Sq~xO`!Mu4?9{4f{_MM^D{?GB%8!i1_x=5ZrlsE||BRehgQ} z@qztw=_S6?Kr3-ee5UjV=Mjf!gqU@XiG2>y?Vu)B{F&%eMF3rkTs=y*a5y*9H6K(D z-3N(#94?s8;oLzDib71F%WK(AF!W|ajQB8THsamXGxiLch=+)d3>u9wX%KO& z8w_La9K6ke_~9WCx86w&-syz6?arJ&r`X{{zWq*Oe$Ckoryn{C(T-vB5gq0{m@D>E zPx@?_^Kh0ekNO&-sP-X@L)o3k-jzcf-8nEcK9Dt4)Cf`I?8*{1 zpf(*2=XUe}2cqb9J+V%dvp-9`=Ge#Oj}ShLp}COPT%zUVirE+gbJ~Ra1}S%_do+f} zn&ojiSW9vm#e9U)cT89^iFUUP-M6`G+!M;HmsFKam|QivcyhU@Id5{6sEv5T{^n?j z5ilA&QA2=f_OgZ5GI5a+iQu;k=6iy^fDyiC!sKO>%O@|j<`DFY7R&t6#%1^okI?D@ z5>Z}VEq@_I7A3+E?ui&;$%0rhVdLf&BOF`|deuilftIKd)4S0VHhjzI#plf) zuR(gJvSR`Lri-lAl86yj9DprRyr){(Nz{jY?Lz+k3ufX_aD~62B`j+tQ7GILsR=>h zDBe~M`*_0!TCT(&hKWMq_QGhTC)!xB8mcdVw&5nj=Qq*)Mx?+KMeEc<^+*AJ(jXKr z5I&>6rJ=-7&H(el6O9#~mO!)wzba5os>MWeMTEv2EUOdhn)fuYBqwZgizRLgy)9Q?FvLQ+`6<4{f~Y@ zK;XwXV85nn^ciw{kSz(+0ra>r0L{!6_5>S@iWSYO<5f^;7^cET6pq0`F@8KCDwJ)s<6)2t ztiYe3ZwW@<_F}XVxoSa^8nV%XD6~+HDG~oIXgul7Y7A?ML_qM_z8I3%>9bkeS<9X}g@+9MikElnX6q9Bwd`M8yX2FkccDJl*5 zsBx2rEF;UJ6mx%!z)>ZE978%UICUB^SCJc08hnOF@u(-!!UD`2jc7%`SI!T`jc^2XWTPO`7-|Xl3aRUs7|oa(FaY~%$}j};99p2J z4OpILGg2FE5}#>kaEdo{p>zbyDKx{+#dOmGSB;DE8D787sKl=*dE2Gm>sgrd5uG}1 zY=GA~WXcG|G42{c3_2KsKd+D~*~KEp09pM$jDSsklTVv!<@e3?_ych($T_uCO_;G7 zC?@pmR#`>QN$_J9i8PwT#+oGF+UU9|n>EE`Y0^Zy3Wh2pT!lW3c8^l`O{tx^*lIW^ zt-4ZFBE}Ys4e7dB{k|dt8W|;_)j>6JXl3HO@kU6`%`2`Fqt)*pg^;I*+; zOd&=xOsGL4Ks||Pf@Bp3Xubq-vMYw0{^tbN;1?|y1e;spI-;?gnxnL^p=BP?Kd-tK z7=U9MR(fdtgXL!A^N1-y{|jJU9_w_=jC!6SpdT$Yz)?euA4E%oOAbIB#ODwpR);Zt z)P!isg4J!P3FBda7F4%jaU+%)o>d9Mr=Fxl>Ya`#uU7NBa3HT7AEAw0ZBxTwaxi>W zf+*IUffjftB*!N|fOv0@m7Oh$X5_o470hx^zg(O*{c?&5#8s$B1t7U+&Y&bj-81rq zJAYanfh3AJ2MdEBEtfJcZDsOe4sTjhTV8!Vta9~N5;M9d=sHfILgQOFW@}Yykb+P{ zqY0>Is_6_e+@K{`eFCW;uX3v?%4H0&_l%VY);XjA=T=)?%Qd7rHASq1v}{U5yq!~KO(aXhVri=jap%vX!jx61rSqqWR%_ZE zO1w;JWoC5G$%mGf^qb)ylup)XkDS2rOev^h9Ld2(?=aCwM2g!*jr9|t8s$h>08Ajg zbUVb0qee(wWUNV4A#&JWfDT2{WfNUvs(xHS=}Z~(7Rk(Pj)5}AB&j;ZwII_;M~OTC zH6{~VWWu`*Zwtnqb~Pcf<>KOI&XA2k5^t7rQXAzYtZ%EU(F_(+^Wqj&`i z!(mVR1SL`qDePKvFs8JsK_=#Gv4o^jll%lND{Xl5HByf9?vu)Wg{C z&FrvNy14=a6r)!mWD=8p@Br$417t*olc~KlwH{qe7PLr~*Wc2t?c%EOb-H3)O`@f} zCon-7Q#I2U5m_{VfE1lwbx*yjLmQlo3Ct#jj^^Av>W43mkIxhjUmPFECC%Ira->w_ z%>+|CKIu=87ljH$i`)RK{iKL^TIDVhL#%M|M=ctr$c?h=YS$W_?xHn9fs1~Nm)4k* znj#GsnW)6ZSyvnNtMGG!yt(FGOk|3=b-L6UJ`!0&drXUx|s0hmGSnn_} zUs3bI=Tj{H#MG(&XiLzDOz|}1df^l-rKhU4rz^3cmS{nJz!O|08l%x>Tn5BnY*1Ap za&vN}#aZ^I5J3DkoK;-1nZGjF%&ci)RB+!-qE0^F8K7=Wqe!o0- zB5rpe>^vWL8W6f5u&iDPH(myO7@-qC-Z|TgTQoCqT^8ZGIY{>*-Hkgm2rCP5C>Gb) zHW%TZFv0)|YDDNR6XJ#y$XkJXhzNTtQ7*!^D%`9>IJz22;3`WG!aRg!(AtGC8_Bui zEZh}RwQ)L-kR==&0LKjySx1M9oY}d!*D_K#a_}O8<~)(r0b}Ig#}v!X!QHQOQT}+5 zHTxpe>k{FZ1;ZS=6!n`T9LuMQ>?rD$hx=Z;@tu#CTpXMZ^FfAibAc!>(Y%^zkBg%n{QKi^N-QSxZ(6KyV@E7qM)nR-SpWX{phU9J^f9+8 z0?e22(e#N-AD%$PjW3ozjp?(fO-vt6znkl?S}x9@>6@8u$sUt`AJfz6-<2W%gG^_2 zV+!cFMm-&vYDNNciaTPviCHuq|L)z_x&G0oww$1#Ao07O*W~Tfnw}Z2{W?wgqep*cPxYU|YbpfNcTW z0=5Ng3)mL0Enr)~wt#H`+X5*qFlnhu&gbw5hi(qbI9$%5kHcmTZ{=`3hnqO;;&2;> zJ2~9L;eHMead?bF{k*(>jyezO(KGIk;vM+(`BI|_pK4HH3F9+4baVRoc&|Qvyqvxr zZ{MX)CDZ>E@6o4EH{%;D81Ls6^z1tQrT~2oL{+H&e#~+YS<*+~_XX&4*pfanpwd6I zq@T;_f48Jx#p#1uR6hOp%Utdmmh^L3&vPv41!>ZAxW3kUy~yQWWRdd$r(5f_i|vvy&*%D=TGDkpTKRQ*TJ5jf)mkpKC;66cXDgljEC*j*-WT;7ZBMP2 zE=RY!ZfD)Dx*c`9>2Mj_LAQgJqwTD*wu`o##=86f%h93kU;4cTsIvTM`@G5he(yC43^ z{$w!Uf4BYUCl|DQh>v}AJ=#1fN!O#3>l5L6?qp1Lpie40llybwadJaVm!#@>HPa5DrU9k9buJz#KQk- zn)C}<&It?ubml*OwJuSGFW;P6{_QNsTJEKs|85R{%;CEnPHa>1+Bodta8SESAILr< z!SZdk&vNEhxrBIu)2;gCH7gD)|6;C}b(|TKCjCy9v(i%TLQc2Jc`{9UV;VWHbGlW} zH`28Gh%|O+WBsjqZcUTEhU@cl4$r(r*{jMDwp*~K>-23**X`cV*u6%{yOl%zz8mZN zX-;-L{~q_ht~w?6=<_N}_tymimAQ?_^Xx{&`L;4h|1<*vH{! zuE$88zw~-^3ga>kZ{kqTa{iP8u%iF@~dLI2HU;Q4e%$#40L%&~3 zm!q*0;^<5LoYtznFXGPtpS))WAeuq6N{Y{EQB(1dAdF)e( zd`F&6#Lj0FuH)oN#)({URL$~_GM|&{73WADtK;NJ8TjvF`ODd^%^B=FOTQnDH zuq|L)z_x&G0oww$1#Ao07O*W~Tfnw}Z2{W?wgqep*cPxYU|YbpfNcTW0=5Ng3)mL0 zEnr)~wt#H`+XA))Yzx>Huq|L)z_x&G0oww$1#AoapR~X!<6X^p&10*I=-YAH*kuc)f1Zd_q=UKO%5yXae8bbawsnUWx&sBRQks)~s<@!#@f<^+zL z3ad--uMq!=mKQB4tXo#vyu2D3H@hGX`gi0wo5xm{;#&*_WM$Of#o||MkG=h3I)XC@aA!yNgPWeMz}Z>j2gix1>sO2V1z}7Gc{+mH|%eY zrX(*j>X-VB)uN;CXutY6y4H_M7Q=ifY=ys}CG3g%LqXB8pY!xPQs#*Gqeh7*>Zy)~ z!iMM=+d0}&k@D)f{(!N_6ZABY`jf0u%B$zs)Ko61DyuRg&7oifLXxUjUR@mx`-2Ul zV{ck*%B!V}n_CP#1l=*M^YkP=D(Y7nUZU;NIxH%!Db!6;Uaje-GIn-?wKi10(pzgZ zHAmZPy&i8PG+ZB3qbJ)17Rk{RX{a`WK5=ti=NZUV+tAil+iZj*p`a(=N8Z+HqC>X; ztT_fe<<+pZH*7?Wd4W*9Cr}g!c~^;!S&w(ReeD5XZ6w-KUt8}F`p9(gLOaL0k+rb7 zS#*$4Zes6kZi+_IOd>yv{R|%t@^-I*trb{-Tzs zr#@g5hQpqA(a|*kCz>w7He|lyxzH{W^#r4;@rwhVNTkYGVT6q!bh^3Q(R13^PBlt} z1>CN@x-8TnIz`wiLAButdmAe~(Z;!m6t& zSjF2!)~1i6R{YVCBi4TpPxWRM^T<^hXlX#T22(L=JY0k!7UNC{8mz$+HN=%UV&`{} zC0lnAk-K1NVHHN?L>W_7i+1ziAby0xwo%S39!w*uZ+#2t+rOLbFml=-`O5BRO>+W_6BT=h&OIH|t>b!BLwAHEzw`;b>kyZi{1^V*~!>t9iee#(@%r^M)#ZcbURB zGCo+Y@V_vgU7_#~8245x{0!qwixvKaaZZ)Orwvo`U#n60V#c{k6fOlmCkOFm3NK^q zVjN}cW_%~(I>tX@+`;%6#$Aj*X57O#cepCAm+`rb#d1~tOvWz86^z}CA7EU^xQB5E z<2M+0G5$N_9>ybbxqQY~Fc#OT@)t99F}|I#oAD1A*D*f8xP$TgjJp`0VBEua+6XS6 z@hZmRdR6|n7`qt%J7YKFPZ-xRK7FK;*THxy<1WUF822y^Fz#jiO~&HOs{Dr-yBI&i z*v{~BW#<3|{~8TT-*WBfYf4#uA{ z?qYmep3@nwvA882omZdB!eow1AYX2x#D|IWCM@oyP-Fn*tL7vs}T;qn<@&bXIx z4P$YWD!-Mni}BAGyBWXAxQ_8L#vP1LIhF0t_)5k-jBjAv%lHM zKFGL^an5O~ybi|G7`>wrfN z5~7RoZH#v^?q;mt&+})-`u#~~osRsNBX)a){7h!NpYb(}KV)3VxU63B*E2rMILdgo zSJCfa>|=bN=JzT3ql}L+?qNLIQ1t)BIG^#K8DkG3KgSv0utMS7GgN)L8K2Ae5aSt) zk1{T0EE-h)<&5(fuVU)3a}7C5<=5}$%4e+K6H&)lzu({v z#`--6PcYW+HF!hQpHuqfo~`6>XI#wqDB}jk`aK5sGuH1d_%&nweu7UJ>-Q2&9jD~$ z_Yim)>-W%ni?M$H#CFE|{WO1Itlv*_g0X(D#W`O>d!kOU_pSkt1kdu9RQ-HJAJ-9k zpV@7U^?QT58SD2p{)VxB&(M2}d-p4OdFMbrzVi<#d=cYH#s!R*Gj@Q@M}PRU5OnUk zGUZMS-VD4#zDZ7HpsZ8yN3Vy+o-4#e6DImZe4P}*hk|koo$~AT^E}S4G4WIWK78q; z^PB0i{PPw4JGy+vI{#!vj^)oW(J8-PpZ|*UYpnC-^U8&2-AI z*Z*g^l>Ic;`8%_e0))#={DdjL-Y?AK{2CLT?00Z5{@_EH@|)?DU+*srmnvUloxhAS zJN>6BmZM{aSc{2J^0jTZgQbjq*yFPk{O#yWo;%BBxt(%(#{{CdChq)U~rvCbc$ z2tE{0elwl&>-|xmOXb&?_{n~Gx%h*R&Tpnue!ZW%a=gl~vCh9vWsl`I)204y#c(s{ zcQV%b=Tih93Z(vSLJCuUy6HJ5D#dU&=hs;0$CM>Mgh_uho$|MF{-1MxjdlJl zmi%Tq-_@8dcD7h zv0m@jG1lw-2xGn8{{~~d-oKZzUhi)McCjrfI6`#OdS6_SNWTi0=<7RFrezj-n*~2? z!7o|xF$*4lA>^CZ_lp?o_5D{E>-GJ;jP?5dDaLwz|FP!Zqx8LKl9E4(aV=xLzW+Ak z`AmPBv0mTzG1lw*^Dk2J^!k1=W4*p_W31QrKW41g_b+Ptb4tGxjP?3H|6(OyukV*L z*6aHXjP?3{Cu6<7Kg?LK?_HNDd3t?c!&tBHZ)L34_YW}E>-&9-_4@uJ#(I4}3LVp> zsv`f+wcwQ&e5VCJVZm=(@W@LO4x(^ZVOzlaDvci~HP{hreQAPjl>y@H1r z>-QGYK4TQVdVUzsSdZ6NGuHD@HDf&=&^nRw>-p`Qgt5nR^M2`mVElKYSowKS;T(-0 zvEUaK9;)f@Sm^y0d@c-zq!|Bfg$L>U)e6VTTWR6{s)c^9!ZCffTkru3{y<^;Ri7c* zQlA*U)Pm<*aGeF;ZoxlPI98vh6dt0>`@IFfr*O<3!%=hCXRziUuW(FWz6HB2_&N)Y zSa7EWKWM?bEcn+J{09qu&w@X-V7k_a`o#2~VZkL9Tw}psQ8;G5+b#HO5dL+1@4@#z ze93>e;QL*CzlZPl@qGYa^5ci_rFHHP@TJ>txN#=B@g<+`z;`pgUHJY8-~TDOE|GYS zB=N4Lg_!<6qY{$l&L`jC9FRxd{LIW^x-F`h%{Nt3DsN^OpaRw#qx#k-jtwN-46ZfZ z2~DEO8>307`aWqA!F=1aHt9AjAIRWS2naHtKTswq<}*R%)$&AzHPL)}#!9oEoUzgq z4q#Y`eB8yFtPWdPTuC0TNtIS*r~@}vDSY%Kb#jtd#7(d)cIG58YvO?^D=qa=sZ?Bi zOv*~qN2JoELt)dAs1!_zr=S#r*^^_3i_#tWu^vLneEuc%0izU$mCPquI37Rcq0g|S zCeZ1XB#Qauha#F!tf-WvvnncCpO8vGd}c+Z>C-A2$#W`ZU^*qjs)glw7*l$}=@FIJ zd@9A1LIVs-If;WP`UFbS$*fDioOYyg`EmGSnLpa74_p-7CUJo zyU0aeA>}5H(J>n>@qk)edwtpTX~pwU;pigID#M2lOlHaA^W(5!#JEvhVx@!)s!O9M zZ1_xPEJ9s4C5!s2)g%j3(O8HRo~&w#-&bRVoBTnX z-AQFB&PNV0*W(W$SF1mQW15~oxu?~SBTk4HtcJUlhQp!oNl5s-*>F}7s&NyOUndNW z1!(EG#6mBtL#GhuB3}#IW6z6+Rpa`eK-sIg+%F7rUfS< zEP~UVOVEGY^;xTeCUu@HRmtSsI9`>CWW-KmfeJsIab=P}n^`hApQYCsY4 zt)T=&gEiTk-1XC0j3gcY=TpX2-S~E0b_HS9^vK|KTUX&UG`&`sxshdr{N?;*7%}ES2YEbY2liJx@5rsSxFDB9tG;D zp%g-}9!S`WBvHsrMeTTM1m1P(}to$@*r|UV2m)sI<)Z|HSSy{Gp+qANKh4Z zRx3x;6K*h~a*VeasU=nGoeWRfEutm!>M)+ystM6Ziq%V~$?wHrO0$f*W`XA*{5Qf;}I7Ux<}UR_gIUR+xHxfz#b-X{)FOxk_6m{(j}YqWWd=4h>a=xAC}%Jig^ z%aT&ANJ_afDP?-Hpy@M`xn?FO^nvq=P8Of^7NG@?ka)~pN zOPnza?ZR6VZ2aZ5g;2P5=8Rfn=JeXunKK-7ra2}g?sF&1T0H&on~G-S2jY40C>)ll z0p760)2%Y6)wa&amooL!e-maoCX`ppo$Z9_m!}muWqN+TcA>JuqSCV3%BqT*isFhg zJmzD%5GNn8Nn%*GFxB*zRvvGwFks7z9qIWN#z*Y|n387)&8+&Ru8DevlnYOP#YJbH z7&k#u&$U`)Al{0~nj{NK{>s|21=VS2%JgcWsI9rKva~w248>PfI=32+#}3p818I2D zITQ35I9CeOr+vVT$5BY<2TQ9e=yBgn{1a4ZMa8BlP3trS_oS!Y~fRM z33j>U4mwc%s4FZ>(Wy;&615+gmvuGLEzed5rr?FfNp zPfyL1(!JBM#(g?9hslwx401^4+nQ-R#FSd=R-;y4(Qgj>TXFeBS1i^8k|zxlY2cB= z%$VAH%^WE_B!Qf=v2d|`R&B(3xf_+BtLV5CNDokBhpZD~_btU#+9^b)dhvjFqu~ur zZ4QTMGaH%OLRUO5^*1%Cr?)SS_*P9-Pu51JF7kM%s_Pb!se(HjT~hqQ!s=W60pCzNNvEruM6mOM|p<4@~uhn=a3fv4jS^rJ^sH#5PR>-w8>%1W&uX9#~eQqh;W= z@4#Rt(C@^!F~ddh&)-UkV})zA>W}a|-Ys+C_8l1e4ooKJOS%J-=v%c32SqG<=-LJ9 z?u;c%2|v1@bm)XGrr;tP#&1iGgo7=g_ZE=7Tef%0>W<<6pS$IOR?GH=H`4|?dF`Ke zF|Ak2mTf>r{**g{lgNbyacuXP?j#*_g@+ds1yX zlhnlRSvn=`4X@mMr`!+8Enr%UE=->%+36D}T-{n0PfyL1(!JBM#(g?9hslwx3}0}= zYtEJ^atg1D`K)J}Bf_{7jQ5JETLuHM#P2{^&W;YyA*F6{BM*4-O!6x8Sl{5p1)2pV z)>OBrX^U;08BC=A+xvW<^{r2Gga5^L{&*PRA8+RN;4N76)Cis!ke`Y8i{}=ypP&Qw z2%iHF;d=z$5T$71RfP0tB;`3nI2Jd%vP3T8C-Lcs@dSyV`NL)hC$bM zZLca{+3~AipY_nCeJ@|}!!gCjzwxut4GZgge!c1a`#!zxy~#ITcGLU+b?LChKYcW~ zJ9_I2m;L28`>M{nZbaAOk4~v_hqrz+I%MLcHCq>7^XcQm^8eKL_?TDEdGxkzKVKet z?!6T~Ilnt_U{zMd@YH-2KKC1^550d1BMohV8%N)~DaQ$i4T|Yu~^7e%E#X z@!{&%AKm}c7uPPl{wHsJFk|>*J3i@nciO$n{`~B!#gi8N?zw+l?4K~w>-*)m?<@V~ zrWJRd_3*f^-F@#Yo811Bwzm9*6}SB2?AjOo-+k(ZsgM16&+W6{&JLV;Yx%opchu!= zU!J{X%{{yR<=&EGk5>f#x~e{y_sX&N&)6}0(4Eu!&;8r7yB_(s;dL`ckNL`PSIr%L zL-}vVedGBbY+3QUQ`h=G$$Ng&CG+nszN2CH?PHwxXR7~ym;Q&!T?->2L+c=J6!bL4;T{F#nV_C2)Zjg_T!_r9>L^^Z-9{~X;M ztgLK_Y<}sdxfh=L`t9{AqQ?5W?)}>vJzHnCzW>~l7rcARpIQ@k=XWn^n z#RYSR74CTbl@lBPTKLPmF1)(orM#+tbU(Ls!kq3;YtDRZ^Wo`#|I+T6)qlKd>+_?2 z@RuVmoL92r&@KOTP5E0#%gZC)t$pmOyMOrD@7{RW)%4W!4}CVLy6we=5g)xe^OhcQS?gcpR(8etc4qwt#H`+XA)) zYzx>Huq|L)z_x&G0oww$1#Ao07O*W~Tfnw}Z2{W?wgqep*cPxYU|YbpfNcTW0=5Ng z3)mL0Enr)~wt#H`+XA))Yzx>Huq|L)z_x&G0oww$1#Ao07O*W~Tfnw}Z2{W?wgqep p*cPxYU|YbpfNcTW0=5Ng3)mL0Enr)~wt#H`+XA)){vWl#{|1OIUHt$6 literal 0 HcmV?d00001 diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/Resources/InfoPlist.strings b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/Resources/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..5e45963c382ba690b781b953a00585212b898ac5 GIT binary patch literal 92 zcmW-XQ3`+{5C!MkQ~2$No+IcIkqMDxWCV8j>LCj|yTg2Mz+o9F%uHlf9u}h9EuK`F a!Y*1dX%G66ZqL#C$|bw0ZoP5@jOGW1ArT7z literal 0 HcmV?d00001 diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/_CodeSignature/CodeResources b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/_CodeSignature/CodeResources new file mode 100644 index 00000000..f4d2e431 --- /dev/null +++ b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebView.bundle/Contents/_CodeSignature/CodeResources @@ -0,0 +1,128 @@ + + + + + files + + Resources/InfoPlist.strings + + MiLKDDnrUKr4EmuvhS5VQwxHGK8= + + + files2 + + Resources/InfoPlist.strings + + hash2 + + Oc8u4Ht7Mz58F50L9NeYpbcq9qTlhPUeZCcDu/pPyCg= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebViewObject.cs b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebViewObject.cs index 2f3b43bd..10d3abc3 100644 --- a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebViewObject.cs +++ b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/WebViewObject.cs @@ -27,7 +27,7 @@ #if UNITY_2018_4_OR_NEWER using UnityEngine.Networking; #endif -#if UNITY_STANDALONE_OSX +#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX using System.IO; using System.Text.RegularExpressions; using UnityEngine.Rendering; @@ -35,13 +35,13 @@ #if UNITY_ANDROID using UnityEngine.Android; #endif -#if UNITY_IPHONE || UNITY_STANDALONE_OSX +#if UNITY_IPHONE || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX using AOT; #endif using Callback = System.Action; -#if UNITY_IPHONE || UNITY_STANDALONE_OSX +#if UNITY_IPHONE || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX public class Singleton { private static Singleton _instance; @@ -89,7 +89,7 @@ public void call(String message) { IntPtr webView; #endif -#if UNITY_IPHONE || UNITY_STANDALONE_OSX +#if UNITY_IPHONE [DllImport("__Internal")] private static extern IntPtr _CWebViewPlugin_Init(string ua); [DllImport("__Internal")] @@ -102,7 +102,31 @@ private static extern void _CWebViewPlugin_EvaluateJS( IntPtr instance, string url); [DllImport("__Internal")] private static extern void _CWebViewPlugin_SetDelegate(DelegateMessage callback); +#elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX + [DllImport("WebView")] + private static extern IntPtr _CWebViewPlugin_Init(string ua); + [DllImport("WebView")] + private static extern int _CWebViewPlugin_Destroy(IntPtr instance); + [DllImport("WebView")] + private static extern void _CWebViewPlugin_LoadURL( + IntPtr instance, string url); + [DllImport("WebView")] + private static extern void _CWebViewPlugin_EvaluateJS( + IntPtr instance, string url); + [DllImport("WebView")] + private static extern void _CWebViewPlugin_SetDelegate(DelegateMessage callback); +#elif UNITY_WEBGL + [DllImport("__Internal")] + private static extern void _gree_unity_webview_init(); + [DllImport("__Internal")] + private static extern void _gree_unity_webview_loadURL(string url); + [DllImport("__Internal")] + private static extern void _gree_unity_webview_evaluateJS(string js); + [DllImport("__Internal")] + private static extern void _gree_unity_webview_destroy(); +#endif +#if UNITY_IPHONE || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX private delegate void DelegateMessage(string key, string message); [MonoPInvokeCallback(typeof(DelegateMessage))] @@ -133,15 +157,6 @@ private static void delegateMessageReceived(string key, string message) { Debug.Log($"{TAG} delegateMessageReceived unsupported key " + key); } -#elif UNITY_WEBGL - [DllImport("__Internal")] - private static extern void _gree_unity_webview_init(); - [DllImport("__Internal")] - private static extern void _gree_unity_webview_loadURL(string url); - [DllImport("__Internal")] - private static extern void _gree_unity_webview_evaluateJS(string js); - [DllImport("__Internal")] - private static extern void _gree_unity_webview_destroy(); #endif public void handleMessage(string message) @@ -184,7 +199,7 @@ public void Init( #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX //TODO: UNSUPPORTED Debug.LogError("Webview is not supported on this platform."); -#elif UNITY_IPHONE || UNITY_STANDALONE_OSX +#elif UNITY_IPHONE || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX webView = _CWebViewPlugin_Init(ua); Singleton.Instance.onJS = ((message) => CallFromJS(message)); Singleton.Instance.onError = ((message) => CallOnError(message)); @@ -211,7 +226,7 @@ public void LoadURL(string url) Application.ExternalCall("unityWebView.loadURL", url); #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX //TODO: UNSUPPORTED -#elif UNITY_STANDALONE_OSX || UNITY_IPHONE +#elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX || UNITY_IPHONE if (webView == IntPtr.Zero) return; _CWebViewPlugin_LoadURL(webView, url); @@ -232,7 +247,7 @@ public void EvaluateJS(string js) Application.ExternalCall("unityWebView.evaluateJS", js); #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX //TODO: UNSUPPORTED -#elif UNITY_STANDALONE_OSX || UNITY_IPHONE +#elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX || UNITY_IPHONE if (webView == IntPtr.Zero) return; _CWebViewPlugin_EvaluateJS(webView, js); diff --git a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/iOS/WebView.mm b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/iOS/WebView.mm index 1d7f4503..4a2d394f 100644 --- a/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/iOS/WebView.mm +++ b/src/Packages/Passport/Runtime/ThirdParty/Gree/Assets/Plugins/iOS/WebView.mm @@ -19,7 +19,7 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#if canImport(UIKit) +#if TARGET_OS_IOS #import #else #import @@ -27,7 +27,7 @@ #import -#if canImport(UIKit) +#if TARGET_OS_IOS // NOTE: we need extern without "C" before unity 4.5 //extern UIViewController *UnityGetGLViewController(); extern "C" UIViewController *UnityGetGLViewController(); @@ -97,6 +97,10 @@ - (void)load:(NSURLRequest *)request @interface CWebViewPlugin : NSObject { WKWebView *webView; +#if !TARGET_OS_IOS + NSWindow *window; + NSWindowController *windowController; +#endif } @end @@ -135,7 +139,6 @@ - (id)initWithUa:(const char *)ua = [[WKUserScript alloc] initWithSource:str injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; [controller addUserScript:script]; configuration.userContentController = controller; - configuration.allowsInlineMediaPlayback = true; configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone; configuration.websiteDataStore = [WKWebsiteDataStore defaultDataStore]; configuration.processPool = _sharedProcessPool; @@ -155,10 +158,9 @@ - (id)initWithUa:(const char *)ua ((WKWebView *)webView).customUserAgent = [[NSString alloc] initWithUTF8String:ua]; } - webView.opaque = NO; webView.hidden = YES; -#if canImport(UIKit) +#if TARGET_OS_IOS // cf. https://rick38yip.medium.com/wkwebview-weird-spacing-issue-in-ios-13-54a4fc686f72 // cf. https://stackoverflow.com/questions/44390971/automaticallyadjustsscrollviewinsets-was-deprecated-in-ios-11-0 ((WKWebView *)webView).scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; @@ -170,6 +172,14 @@ - (id)initWithUa:(const char *)ua [view addSubview:webView]; #else [webView setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)]; + window = [[NSWindow alloc] initWithContentRect:frame + styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable + backing:NSBackingStoreBuffered + defer:NO]; + [window setContentView:webView]; + [window orderFront:NSApp]; + // [window setDelegate:self]; + windowController = [[NSWindowController alloc] initWithWindow:window]; #endif return self; @@ -292,7 +302,7 @@ - (void)webView:(WKWebView *)wkWebView decidePolicyForNavigationAction:(WKNaviga NSString *url = [nsurl absoluteString]; if ([url rangeOfString:@"//itunes.apple.com/"].location != NSNotFound) { -#if canImport(UIKit) +#if TARGET_OS_IOS [[UIApplication sharedApplication] openURL:nsurl]; #else [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; @@ -307,7 +317,7 @@ - (void)webView:(WKWebView *)wkWebView decidePolicyForNavigationAction:(WKNaviga && ![url hasPrefix:@"file:"] && ![url hasPrefix:@"http:"] && ![url hasPrefix:@"https:"]) { -#if canImport(UIKit) +#if TARGET_OS_IOS if([[UIApplication sharedApplication] canOpenURL:nsurl]) { [[UIApplication sharedApplication] openURL:nsurl]; }