From 64aa5f2353846c3f55a6333390fd5111b3f419c0 Mon Sep 17 00:00:00 2001 From: fluo10 Date: Wed, 27 Aug 2025 08:19:28 +0900 Subject: [PATCH] Enable to build ios --- Cargo.toml | 2 +- core/src/config/storage.rs | 2 +- examples/desktop/Cargo.toml | 2 - examples/desktop/Dioxus.toml | 21 -- examples/desktop/README.md | 25 -- examples/desktop/clippy.toml | 8 - examples/desktop/src/ipc.rs | 0 examples/desktop/src/main.rs | 3 - examples/desktop/src/message.rs | 0 examples/mobile/.gitignore | 7 + examples/mobile/Cargo.toml | 10 + examples/mobile/ios/Makefile | 25 ++ examples/mobile/ios/build_rust_deps.sh | 68 ++++ .../project.pbxproj | 307 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 65637 bytes .../xcschemes/xcschememanagement.plist | 14 + examples/mobile/src/lib.rs | 70 ++++ examples/mobile/src/main.rs | 4 +- 19 files changed, 511 insertions(+), 64 deletions(-) delete mode 100644 examples/desktop/Dioxus.toml delete mode 100644 examples/desktop/README.md delete mode 100644 examples/desktop/clippy.toml delete mode 100644 examples/desktop/src/ipc.rs delete mode 100644 examples/desktop/src/message.rs create mode 100644 examples/mobile/.gitignore create mode 100644 examples/mobile/ios/Makefile create mode 100755 examples/mobile/ios/build_rust_deps.sh create mode 100644 examples/mobile/ios/caretta_sync_example.xcodeproj/project.pbxproj create mode 100644 examples/mobile/ios/caretta_sync_example.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/mobile/ios/caretta_sync_example.xcodeproj/project.xcworkspace/xcuserdata/fluo10.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 examples/mobile/ios/caretta_sync_example.xcodeproj/xcuserdata/fluo10.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 examples/mobile/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index f4df5ae..a250f00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ license = "MIT OR Apache-2.0" repository = "https://forgejo.fireturlte.net/lazy-supplements" [workspace.dependencies] -bevy = "0.16.1" +bevy = { git = "https://github.com/bevyengine/bevy.git", rev="16ffdaea0daec11e4347d965f56c9c8e1122a488" } chrono = "0.4.41" ciborium = "0.2.2" clap = { version = "4.5.38", features = ["derive"] } diff --git a/core/src/config/storage.rs b/core/src/config/storage.rs index a6f2ead..8cd8607 100644 --- a/core/src/config/storage.rs +++ b/core/src/config/storage.rs @@ -66,7 +66,7 @@ impl PartialStorageConfig { Ok(cache_dir.to_string()) } - #[cfg(target_os="ios")] + #[cfg(false)] fn default_ios(){ unsafe { let file_manager: *mut Object = msg_send![Class::get("NSFileManager").unwrap(), defaultManager]; diff --git a/examples/desktop/Cargo.toml b/examples/desktop/Cargo.toml index a5943e1..42b4277 100644 --- a/examples/desktop/Cargo.toml +++ b/examples/desktop/Cargo.toml @@ -6,8 +6,6 @@ description.workspace = true license.workspace = true repository.workspace = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] clap.workspace = true caretta-sync = { path = "../..", features = ["cli", "bevy", "test"] } diff --git a/examples/desktop/Dioxus.toml b/examples/desktop/Dioxus.toml deleted file mode 100644 index 659b7b6..0000000 --- a/examples/desktop/Dioxus.toml +++ /dev/null @@ -1,21 +0,0 @@ -[application] - -[web.app] - -# HTML title tag content -title = "desktop" - -# include `assets` in web platform -[web.resource] - -# Additional CSS style files -style = [] - -# Additional JavaScript files -script = [] - -[web.resource.dev] - -# Javascript code file -# serve: [dev-server] only -script = [] diff --git a/examples/desktop/README.md b/examples/desktop/README.md deleted file mode 100644 index 1e629b6..0000000 --- a/examples/desktop/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Development - -Your new bare-bones project includes minimal organization with a single `main.rs` file and a few assets. - -``` -project/ -├─ assets/ # Any assets that are used by the app should be placed here -├─ src/ -│ ├─ main.rs # main.rs is the entry point to your application and currently contains all components for the app -├─ Cargo.toml # The Cargo.toml file defines the dependencies and feature flags for your project -``` - -### Serving Your App - -Run the following command in the root of your project to start developing with the default platform: - -```bash -dx serve -``` - -To run for a different platform, use the `--platform platform` flag. E.g. -```bash -dx serve --platform desktop -``` - diff --git a/examples/desktop/clippy.toml b/examples/desktop/clippy.toml deleted file mode 100644 index 40456af..0000000 --- a/examples/desktop/clippy.toml +++ /dev/null @@ -1,8 +0,0 @@ -await-holding-invalid-types = [ - "generational_box::GenerationalRef", - { path = "generational_box::GenerationalRef", reason = "Reads should not be held over an await point. This will cause any writes to fail while the await is pending since the read borrow is still active." }, - "generational_box::GenerationalRefMut", - { path = "generational_box::GenerationalRefMut", reason = "Write should not be held over an await point. This will cause any reads or writes to fail while the await is pending since the write borrow is still active." }, - "dioxus_signals::Write", - { path = "dioxus_signals::Write", reason = "Write should not be held over an await point. This will cause any reads or writes to fail while the await is pending since the write borrow is still active." }, -] diff --git a/examples/desktop/src/ipc.rs b/examples/desktop/src/ipc.rs deleted file mode 100644 index e69de29..0000000 diff --git a/examples/desktop/src/main.rs b/examples/desktop/src/main.rs index 9132165..bf2420b 100644 --- a/examples/desktop/src/main.rs +++ b/examples/desktop/src/main.rs @@ -4,9 +4,6 @@ use clap::Parser; use crate::cli::Cli; -mod cli; -mod ipc; - fn main() { let args = Cli::parse(); args.run(APP_NAME); diff --git a/examples/desktop/src/message.rs b/examples/desktop/src/message.rs deleted file mode 100644 index e69de29..0000000 diff --git a/examples/mobile/.gitignore b/examples/mobile/.gitignore new file mode 100644 index 0000000..0f1f32c --- /dev/null +++ b/examples/mobile/.gitignore @@ -0,0 +1,7 @@ +/build +.gradle +.idea +.DS_Store +build +.cxx +local.properties diff --git a/examples/mobile/Cargo.toml b/examples/mobile/Cargo.toml index a5f75a3..939a63b 100644 --- a/examples/mobile/Cargo.toml +++ b/examples/mobile/Cargo.toml @@ -6,5 +6,15 @@ description.workspace = true license.workspace = true repository.workspace = true +[[bin]] +name = "caretta_sync_example" +path = "src/main.rs" + +[lib] +name = "caretta_sync_example" +crate-type = ["lib", "cdylib"] + [dependencies] +bevy.workspace = true caretta-sync-example-core.path = "../core" +caretta-sync.path = "../.." diff --git a/examples/mobile/ios/Makefile b/examples/mobile/ios/Makefile new file mode 100644 index 0000000..30f0654 --- /dev/null +++ b/examples/mobile/ios/Makefile @@ -0,0 +1,25 @@ +.PHONY: xcodebuild run install boot-sim generate clean + +DEVICE = ${DEVICE_ID} +ifndef DEVICE_ID + DEVICE=$(shell xcrun simctl list devices 'iOS' | grep -v 'unavailable' | grep -v '^--' | grep -v '==' | head -n 1 | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})") +endif + +run: install + xcrun simctl launch --console $(DEVICE) net.fireturtle.caretta-sync-example + +boot-sim: + xcrun simctl boot $(DEVICE) || true + +install: xcodebuild-simulator boot-sim + xcrun simctl install $(DEVICE) build/Build/Products/Debug-iphonesimulator/caretta_sync_example.app + +xcodebuild-simulator: + IOS_TARGETS=x86_64-apple-ios xcodebuild -scheme caretta_sync_example -configuration Debug -derivedDataPath build -destination "id=$(DEVICE)" + +xcodebuild-iphone: + IOS_TARGETS=aarch64-apple-ios xcodebuild -scheme caretta_sync_example -configuration Debug -derivedDataPath build -arch arm64 + +clean: + rm -r build + cargo clean diff --git a/examples/mobile/ios/build_rust_deps.sh b/examples/mobile/ios/build_rust_deps.sh new file mode 100755 index 0000000..3764f3a --- /dev/null +++ b/examples/mobile/ios/build_rust_deps.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# based on https://github.com/mozilla/glean/blob/main/build-scripts/xc-universal-binary.sh + +set -eux + +PATH=$PATH:$HOME/.cargo/bin + +PROFILE=debug +RELFLAG= +if [[ "$CONFIGURATION" != "Debug" ]]; then + PROFILE=release + RELFLAG=--release +fi + +set -euvx + +# add homebrew bin path, as it's the most commonly used package manager on macOS +# this is needed for cmake on apple arm processors as it's not available by default +export PATH="$PATH:/opt/homebrew/bin" + +# Make Cargo output cache files in Xcode's directories +export CARGO_TARGET_DIR="$DERIVED_FILE_DIR/cargo" + +# Xcode places `/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin` +# at the front of the path, with makes the build fail with `ld: library 'System' not found`, upstream issue: +# . +# +# Work around it by resetting the path, so that we use the system `cc`. +export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH" + +IS_SIMULATOR=0 +if [ "${LLVM_TARGET_TRIPLE_SUFFIX-}" = "-simulator" ]; then + IS_SIMULATOR=1 +fi + +EXECUTABLES= +for arch in $ARCHS; do + case "$arch" in + x86_64) + if [ $IS_SIMULATOR -eq 0 ]; then + echo "Building for x86_64, but not a simulator build. What's going on?" >&2 + exit 2 + fi + + # Intel iOS simulator + export CFLAGS_x86_64_apple_ios="-target x86_64-apple-ios" + TARGET=x86_64-apple-ios + ;; + + arm64) + if [ $IS_SIMULATOR -eq 0 ]; then + # Hardware iOS targets + TARGET=aarch64-apple-ios + else + # M1 iOS simulator + TARGET=aarch64-apple-ios-sim + fi + esac + cd .. + cargo build $RELFLAG --target $TARGET --bin caretta_sync_example + cd - + # Collect the executables + EXECUTABLES="$EXECUTABLES $DERIVED_FILE_DIR/cargo/$TARGET/$PROFILE/caretta_sync_example" +done + +# Combine executables, and place them at the output path excepted by Xcode +lipo -create -output "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" $EXECUTABLES diff --git a/examples/mobile/ios/caretta_sync_example.xcodeproj/project.pbxproj b/examples/mobile/ios/caretta_sync_example.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c18418f --- /dev/null +++ b/examples/mobile/ios/caretta_sync_example.xcodeproj/project.pbxproj @@ -0,0 +1,307 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXFileReference section */ + B617AE7C2E5D5E5A0013202E /* caretta_sync_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = caretta_sync_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B698F93D2E5E743A00C7EE06 /* caretta_sync_example.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; name = caretta_sync_example.app; path = "build/Build/Products/Debug-iphonesimulator/caretta_sync_example.app"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + B617AE732E5D5E5A0013202E = { + isa = PBXGroup; + children = ( + B617AE7D2E5D5E5A0013202E /* Products */, + B698F93D2E5E743A00C7EE06 /* caretta_sync_example.app */, + ); + sourceTree = ""; + }; + B617AE7D2E5D5E5A0013202E /* Products */ = { + isa = PBXGroup; + children = ( + B617AE7C2E5D5E5A0013202E /* caretta_sync_example.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B617AE7B2E5D5E5A0013202E /* caretta_sync_example */ = { + isa = PBXNativeTarget; + buildConfigurationList = B617AE872E5D5E5B0013202E /* Build configuration list for PBXNativeTarget "caretta_sync_example" */; + buildPhases = ( + B698F8CE2E5D609900C7EE06 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = caretta_sync_example; + packageProductDependencies = ( + ); + productName = caretta_sync_example; + productReference = B617AE7C2E5D5E5A0013202E /* caretta_sync_example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + B617AE742E5D5E5A0013202E /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = NO; + LastSwiftUpdateCheck = 1640; + LastUpgradeCheck = 1640; + TargetAttributes = { + B617AE7B2E5D5E5A0013202E = { + CreatedOnToolsVersion = 16.4; + }; + }; + }; + buildConfigurationList = B617AE772E5D5E5A0013202E /* Build configuration list for PBXProject "caretta_sync_example" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = B617AE732E5D5E5A0013202E; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = B617AE7D2E5D5E5A0013202E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B617AE7B2E5D5E5A0013202E /* caretta_sync_example */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + B698F8CE2E5D609900C7EE06 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRCROOT)/build_rust_deps.sh", + ); + outputFileListPaths = ( + ); + outputPaths = ( + $TARGET_BUILD_DIR/$EXECUTABLE_PATH, + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "./build_rust_deps.sh\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + B617AE852E5D5E5B0013202E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = 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_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + B617AE862E5D5E5B0013202E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = 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_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + B617AE882E5D5E5B0013202E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "net.fireturtle.caretta-sync-example"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B617AE892E5D5E5B0013202E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "net.fireturtle.caretta-sync-example"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + B617AE772E5D5E5A0013202E /* Build configuration list for PBXProject "caretta_sync_example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B617AE852E5D5E5B0013202E /* Debug */, + B617AE862E5D5E5B0013202E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + B617AE872E5D5E5B0013202E /* Build configuration list for PBXNativeTarget "caretta_sync_example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B617AE882E5D5E5B0013202E /* Debug */, + B617AE892E5D5E5B0013202E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = B617AE742E5D5E5A0013202E /* Project object */; +} diff --git a/examples/mobile/ios/caretta_sync_example.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/mobile/ios/caretta_sync_example.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/examples/mobile/ios/caretta_sync_example.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/mobile/ios/caretta_sync_example.xcodeproj/project.xcworkspace/xcuserdata/fluo10.xcuserdatad/UserInterfaceState.xcuserstate b/examples/mobile/ios/caretta_sync_example.xcodeproj/project.xcworkspace/xcuserdata/fluo10.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b3211a6196345e04a3ad49bd2a2fdbd34ae643b3 GIT binary patch literal 65637 zcmdpf2YeI968G(%+TBUU)KCH#FdY{<7!r^r85C^ESdt3?gs=rD7|XF_zzIoi(|hj~ z4C#gR-d=hyr1#!?@5wiFr#nlsWD8!t_xpa|;{|MK=D)MMv$M0av%9NXns}Be_#$)|Ba`e_m z1-FP>%(=P!I6t?H+n)<@VQvj~0Jolta;;pPYv($+gSbPv!??q_$$_Me#7La9lMZqyIgH5UcyaU%-CApT|KyD$olRNlx`3v}q`EC3T{&M~*{#yQe{wDrb{to_b{yzQz{$c(x z{z?8B{(1gI{uTap{w@Ap{saDF{xkkd{u};#{wMxd{ty0d12Gs3W`k(38S)MN4TB6r z40{_!8b%w&8YUPf8;T864Kob04P}OX3=0hoLxsU@s5E#DHHLtp-mt%6r6FW!GORTm zVAx=2HN*@X4IPFphQkbp8;&v@YdFDhvf(ttnTB%==Nm3EY&C2*TxPh^aE)Q7;YPzP zhT9Ey8SXXw$MBHhQNt64rwz{;UNF3Dc+K#p;T^;KhK~%N8on@mZTQacqv03B?}opO zoRK%0jDpc>>|^X_9B3SD9A+G09AzvtjyFy+78y&8(~Yx?bB*(j3ykGPmvOOiiP2+R zYV;fHjLVEGjH`@|#x=%>vDp|kwi(-vn~et>4>dC5k;Y?;#~V*Fo@zY9c((C8VPR{L}c4iJFWii%Bx&nfjUrnD#OaH4Qfvn8ujKnI@X1m`Y63OfyY$ zO!G|pn(QX0X_09^Q&ZMx6&fazh=W2Prf&zPP! zy=Z#H^t$OS)4Qe*Odp#*Gkt0L#`L}EC)2N{KTLm{iP>N_n?d9C>X^9FOP zIcDBy?l5mLA7(z>e3bcE^9kmY&8L~qG@oNW-+YmIt9iTmGV_(@Ys@>%H=1uT-)_Fk ze6RUG=7-FWnx8N~ZGO)Dg860hYvwo2@0i~=e`NmD{Dt{z^LOSS&A*s`H~(efEWE{J z5iC|qA4@;WK+9muFv|$bC`+Mbyk(N5$Wm&VZkc77Yng9ZU@5n_EQ>8mEFQ~Ji{Dab zS!P*bS!HRotg%Ea&6cR8&C+h!Y&qC+sD)XMv>anO-g1)VRLdEbvn}UYF0@=?>9kyG zxx#X_H%n!tKJ{!h^y?!o$MT!ZX6N!fV3o!W+Vy!n?u;!Y9I~!so*G z!Vkia!cW4l!f&D=ilQW1MVpu>_7U^N!Qv2cs5ngATPzSqiQ~ly;zV((I8B@`E)grm zD$yf)#cFY>SR?vGzZei3#8u)tF(Muy#>IAVqqs>tSUgNTMm$zLPCQXONjytDTRd01 zK-?yFirdA@#cRbI#Jj}1#e2ki#fQX)#mB{`#9iVG;>+Tj;#=ao;;-Uw;_u=g;-BJQ z;@{#w5+@OfO1xx{jFL$*OBP9xtkPg2&D~=}hS? z>1^p7X}h#Tx>UMMx?H+Rx>>qKx>dSOx=XrSdO&(mdQ^H$dRlr$dRcl!dR2N&`bhd% z`b7Fv`b_#p`d0c*`d<1~`c3*v`dj+PYPMReg4JrZS;t!^SSMO1StnbkSc|O1))H%} zb*gombzkcO>q4vDT5k1Nz1C{$QfrO1-r8VYXDchST|WWTRW^LSx>f} zVm;M*n)P(+8P+qcXIam-o?|`NdZG0i>$TSFtUImOTW_%5XuZjLkM&;beb)P}4_RNd zzH5EY`jPbu>zCGVt>0OHvi@fM%lfyCx0!7gn_wGm8(|x1E3l2Sjkb-k723wyCferO z%53v&^KJXs_O&grIc!ebVq2xH+UB^9*^GJZqjUZ$RGQyuI^==Z(l4oi`zG zVqS6HoV>YtWqHm#S6)TlqP!(}-auhXdvo&(oQ=!l`f&MNe{N8n$5*^Q+!0#_|0X<* z+QP=>P%PHT_2v4>ROUOm0o*{@!1ytYUK-3F;C8y|qHXJAt)a%SGuqg`A>0xV<`+6< zxaK(LR!lFNJ$*)L(TocFoFeYKhzms6KZcxe5d$Yv5IJ$`sHwYV;sD->b5Al zX})mW-2^a^HIZ-|IBLt)Z+(sH!W+WSNHy&(&TuRqX$i%_*HfIhIIy+1g=-_R$m&RQ zB;FCsAG;>n))+2tk2E(yIriq}WWtzxjVBy#3O9i>sL5FuX=#dX0#W}Ske0YJyt;j@yJbx@nBNy@n*Dt4;0 z!Ti0_>*@(@2tzGF5?{C(>Je_zB`K{8#o~_WhSugVd|ZvrZ7dEYt4&cJih&P{Ee92@ z3AaYuK!paBgVgI=qmh<)O!*F++NNEKt}fwxmvfa|73bl+Ts60ptC0uFgXN*}-tq{! zKprg@zQ6@Qr)#-7uAXZ^tzHd9><|C8g`1(VH-=?S-b)@7%wMx6(i|=;DJcoWK&X;6 z&F#^tr6pQR#!8&wjp62KYe{3MEgX-BieeotjV0mDA*@NPWJ44>DO?hX#x#N;5(E&w0G*6ChntFHn<8uC$z?^9vW5loSN|JjC0Z>@qa>HxqLe%Q-|rBm$BMdjNOIXR zrRNrTe@W4L4G35*_tHhOkFj;>EQJiYHQ)znpr&7$6 z|M>vETq(Es{|)WFMiHj;e`rlqCu%2mJ6CoEcRhClcO!QbcQbbjcPn?BJWZZ1&yZ)z zv*g+G9C_{)+#TGV++Ez=+&$dA+_i7|wZfJUv36m4{=pH{bpH%6lEu>`sLp#z=7VE&X0 zvS{@FP}|yY!fi^BXM#^uQV|^-DDaNf>cVG&*L)3a&aR9$D()0WGcJQP3HW4Tv;qDk z_Y_yQb*ns2wMox%&w&f&@m00Q(Tj3Mz(I+&gxWf`bI)?mbE}qnd|jVu7%y4?BxZ=q|+pf<- z<7;e-HaAzJ-v+X(4%=tk7u&ecWvA>~23}+VkVIPJYAb)ueFF`dXk+N_?cCSgx7;f5 ziQpHlRlnzcPi~H2@Pas{l&XiOBi35lOC=3tuF8qz}pG z`jEb)AL&m9G{h7)8NvE>8Arx*t9m1Y!kxALbY`sv6A7#>aZGC;6p`sLi<4qfLQ2V0GELrJUM{bYSIWUl z$qX`+%p$YN9C?)-l2^-(ax)IhOjb%WYX5=}?7@C#u*m;+OkhvS-cRkN3>K4=6GyVH zSD>yhlADrseLu20{Vt~U@lxVPwXGpOd7T{TBmq(@ zA0V%n=hY<|G@-se@YS=|TtizyR;H>@h^$2wT1^^B6A6d&TjWFJ zL%|$sc5rmo>LRJ85JtiP|+BQexd1W~+5OSoyv z7DuJsvnc4OuMbwb%WLd44eA7SBe_Z0U)4Mlg?&4@k=(3AX?)7>D(S7{ww1aIqpV@K zlUs2Wn-ANd*mHN1Yj*Y}Z<4#n-Q*r}FS(E0PyRz5APgpuah?b<1O+wd5649-Xrgm56Fk)Bl0o%gnUXq zBcGEm$d}|R@-_K}d`rF~-;*E6kK`xvGx>%5N`521lRwCx>uAnPvkglR3x|%l9 zCK{$|=vumtM(6=_J#D5NXbX+fR(c?9qcIw%?Q|pEL^sn8dJsLBZlQm= zkDy1=qv+A}7peNFk=*jdHdMZ7Qo=(r8XVSCi+4LNGE236OdI!Ce z-bL@G_t1Okee{0%ANl}&kUm5orjO7^>0|V9`UHKFK1H9V&(LS-bM$$-i@rc#q%YBz z=_~YA`Wk(mzCqulZ_&5uJM>-p9(|vFKtH4((U0jT^i%p7{hWS5zocK$ujx1RTlyXS zp8i08q(9N0=`ZwG`WyY7{z3nwf6>3`KRm}1p7K0z;ElYAH}e)=;6+~It-OuTtkZ+W4l5du8k#Ci6lW&*rknfc5lJA!9k?)o7lkb=RBR?QNC_f}WEI%SY zDnBMaE8cy zli!y=kUx|^l0TL|kw29`lRuZgkiV3_lE0R}k-wF{lfRdLkbjhal7E(ek$;tclYf{0 zkpGnblK+aXnGp*k0wW?L5+hbdY>ebF(ua|JM*1?+kCFb2 z3}9p+BZC;(i;=;M3}Iv_Bf}Wkn~~v+j9_FWBL$3%Vq`QUV;Cu9WGo}&7#YvV1V$z@ zGKrDNj7(vqh>>DON*F0+WGW-m7@5w<3`S-$GK-PfjLczVE+b`(%wuFeBl|G2FCz;W zS;&Z;k#a^Hj5rx_F;cK+ZgF&WIH1}7`c>@%NV(wkt-Ovl98(zxtft{7`c{_ z>loR|$n}iez{rh^+{DPujNHP=t&H5p$nA{W!N{GA+{MVy^P$)$o-7`hmi*u zd61EZ7?nBo{?RQyuiqdjJ(9i%Z$9j z$g7OJ#>nf8yurwujJ(Cj+l;)!$h(ZZ$H@DPe89+ujC{n%$BcZ!$ft~a#>nT4e8I?< zjC{q&*Nl9_$hVAq$H@1L{J_YMjQqsN&y4)S$ghn2#>nrC{K3edjQqvO-;DgjD90#a z6lMmVQ3In!Moo;uj-Z86fl-lBiBT(~Hb(Op?Zaq3qkS3e$7p{>2QWI2(Ls#v#pqy0 zhcG&n(P514&FFAOM=&~)(E>(CF*=%2*g7p_bS$Ie7#+_j1hgkII*HNAj80*+h|yw3 zOBgL>bSk6M7@f}O3`S=%I*ZZSjLuUC5}N(Q-x|j5-;0 zFSlC5Mwc*J$!Ha$9!9;4Rx`Sk(Hcg5jQSZ3Fj~uK9i#P(HZZ!3(ft`+ z&gcq8S27x8bQPl^MprZ1$Y>LzVMf<5x|Y#(x~s*XuQ*sFWruRh7Q55w_Pf0vdu7n) zT;fakW&A}*Jg^&ajbpJ+vK2}8N+$u38n4%{;cQ2u5$Qy(dPilz>2e0`$$*z3?U;00 zU!c0$TjK}f>Pox6!dp|NOK>GJj3@S3EF6zPReU~|KUi&dED2WGJ?;vZ&mV+PO|ZJg zRpGAJB)SHfrszzrs&bS=XY~c$9^mjg0}g+%Jm7Iwx-`z63HcJmxjgprN>|Y92|8U+ zo-jO2^mb$%LezzUzPQ=4#n(`k+&6b+A@i2+mrQmql8w!Pw%A^Sy;9?Hc&n;?L8n_6 z;6KPRBf;Wr#n>$NPi3XI4r*Al2)ilKnL%H*%Kx%)T;0hBFyZLP-k!O1=T+D z)wwJDL1;FQ(_Z6DtPtE?t^X)O6sJR!2i%n!aYGQ)3FP+qYux35(|-VvF3Ywa~| zyT`A0)6+;hES+|d!x5}?)%cR?^c)gSOeb`@$^(m_|53A*CP-&{0ojJ9v$^bxTs2T> z&l0z1k=AN2BWYnbQdLnMUZ*SQ@Pbgls&TxA9HX;vsG>O=VDY8Vzlrpd)9FzG+?61Y z+v9ZAL!WqSTtRhwXpHYk#Uw4OT!6f*yNSmj-=`eB;yk7P&mognk!V3E)Awv1zr6 zevz>-cU3}6UA~5((_3YC>l*)c#(KIv2}_wvJ-^Fbv<8v2o?b@C{_(+%HaP6(YlR0do?zIs^G4AzsrLoBWSO7g8{9Cb-fY};D1Nn z3F(ql1bi-~KxfeBsBu?Axr^<-u73Ipxu&Ia`5bmA0BmYfy+L>w@rep)BiO(p|NL}* ze~ruT4_3K-K1DT?3J!V${_23=2h&E-Ra4`w(UEvWDoRI6XgSoPMyr4itX8?VzH96n zOvt(yafVx)qaB#}1NIv1QguaT*OXuokZA7|B73FZRpUW@TvX!?R3}=}VC{+0TL&tv zQT9Q~VOcP%x-{F+4+$q^A*^=QC{5+{KpVqI(wk%;at%r0snq;%}0 z>~tyJT7+~XGU8#U22roHvP+S6KnkrBl&{N=GfYQ{)Lzu2Lu;)8%|f!G6d>IzN?2%c z8Jw%;VC6Jywwe=MSz(HMvO+f07+AOPWfJg zRGb&Z(bG7}kz;TQxXR)4H|Tz#!G%<*I+vhQJ(7m1a&M)s|BI1&ObVvj@!1+;2{MdN zVQ^P3_Ig}iFtc5{ovJ+^WEz{oRAqN~ef8N{mSzyFwx=@u-5Kg@dSa+UhScF!X9sV! zC!S@)N~Fi$enf*GN$t(pjpIRd)< zK37X)TZiHgyEbDol#+HC3AL!%Od8-C1YFR&ga8O)K*&7iiMF^lhc~pwy9&_2A_!L0 zJ6PS4x=_4vowubK5(AXk*wBouvwCNR0DCCX;)8VDj@8jnTN9)rgf)yPV$ACuqY|sq z98vQ_5<3SS{*G21s11P@^$rwpCjt2&Q#f1&9kvFx@Pmusmo_BQ$HuAj1>CM? zB_UU1-Hfc$dY7ltR~~9yzqT#f-qMuZxCbNu%-;DO73IK*IWEfX4{ii$A{>ekIp~R_ za*3*FYU@_RZcAgNHPr0D#2^ifAy`@O@_2lU+c$(-YG8n3>Ww4X+R+wSyAD!DRHZo* zadPNz@E=3%Esg6S;UpYx$!0 z;W)Hrs1?)0)x2)VhE|*7RD{SuO+3EL-Es!Ip_^!eZrUwyEcOHi)8~l55aOUrygH9Y%Rv4(fB%h^QKToR=^7pFo%Jj z1PDp%k=AuEwwtp_dCBgB)~$mEbweYDvw?OZ=svmhjU&_yb4aKyYo#wmsGLTh0}Mc0 zD4R%EAkO@pM1qq9Avms@4e4q`vgd*X8nzw|z*aLVeoSZtK0*;S3;qZo%1ep!) z9)w$*OMfOC63C^Bg~2_^hI&7u=447LAbBo^M{?S;s@#JJwlEhF7cHrPyn>ddN;s;L zO|(Z4&7TVzIGfG!b&lpp3-}++>ThtuCfe2%^R0u!CD}@NJm<=*m_33$m2>4)us~}Q zsb9NcXRG&b2$|F9OAO=MXfqr?&1(7oM7*55gX(qBc(gLI8V85HsVSR){~%ya zQ%N#l7BnM8w45Bhn(ziV;R%t8Y*0poa^^B304ll>msmZwozarBaK3O$EZPRf9+ny# zLyaBPQCM(yz!qu30vM&;hssvZJcP<&^#*4NB5jduD18wnC)M?}hQp2PaMp$cI6Vwm z;{b%r$q({%z&Y3r_9p02a5L1vK{i46Le!iTSVeVhh9kCki%d4ap$NENE_zZ63%;nY zeKjugR)^c{jg1g$$TpuFha+xI0|Qer{a|C(LvCg^DGLxSr(Uj&x~sFHj6swfW{H5i zCVXIfq%GV8M}H#_GYhqbl#|$yVyda|IK;{!W~F1rD&VBO8idd=CL+f4-rGLlR{h!X zP}|~26NCsgfGG%&!=gV4z!&e(gJ#AOk3&-T>h^dTL&AD9Rv~guZd?ZBB%@J{I5}AF zO1+o8uqOZmPSYCLCa7+Paidk)hk!X*p{$W}V{OhDx<=s8O)(@5h>?S}uTuiV+Qx<& z-{`s?L#x$tM9aZW*DcYfHzypUTMO${CDfc0mo)|vYZzG)ZfglQ7l0bJH;1=uft|@f zA`3$+bTtz0orMsxe`>T`Gh?_XNXSXiHU^FBkZ?p6$ke1A<9ehWMJgjLI1d&S6{wpC z&0Dsp$zia^j9C$yv@J+JIuki$9XTr9xGRl0CK~;LNMDkPUP-%w%#teDUv-y5o{7I9 zEi=d%N9Kt=Fb8UCu)wq`Z9=y38QCDiLrG>)H&Uy+w!w`DA=A`MOqhcNi4BlO1v~nX zodvmYiz;DrGdY#UcnGo=XJm){V9YSWR1I&Pl2WI(lTT|SIcqhcO;uiPFFLttk3hD` znTqVr6D)^(60N+Wkuh5zx;(Y+8m|ZU{x$mJkbZ2YfZ^;RaQ$QZXF zPsRc3Re78#Yh5uE$p)^@L2d zS>ke4LoSuO7SnhzJF3Q`b6tyE_Do!$T}uOA;7E)>NURK?UaCn>dQP62d!nh(^$3@7 zAlA5a-K(ep6IJJ}S&}-4Z$jQFnM6tAO`Oz9<-B!wIFr-=jCUYs#!(E_hkO7e&XhN3 zyc-!awzkhzZC4Wb)FBphK?bzeJoh12M(xphG(~$JK=Lt}TEqvsl2GWR1TN#lS*sK9 z=*^#L=s%XVI?xVDs#=|*pid%Kvem8%!$l7mR47nmDBuLatm}f5T*dMxI!|kjXOMkb zQuVU4JA>tJ51i0T8SBp@f3jJr3$>x!1Z9HMb@m#_oerpZfvClJ#IGxD)A%BCPf9Ai zJ9oeXNp*=yKp!!$ARnkHMv)^2DT^2=4^qLjBxBtuYpLa0eP2h;={<3R7F1vkBqsb| z;-?+5w!M1Fw(%_l0By}wG}?5P3#?*|H+6u#i;Q4~dS+Boo&)Y+A}3xG`vYW#2`GhG zO^6wepy#M+W&DcN!?RGMTIfd%jDH~M z(gLc|RoPQ)tZ4|+rKnL?ExLr#Q1?daamgKl zLk4XL&_aT6EhzWm3dr;W%cAj&M4s`4oY*IpnA7nT8n}bT;y&7#Y=^CrqZA6Aq^y;4nbf zy2(_ATq$Owt_B(wIxF46nD#-^@x%ukJdNuLszdR0Fi+Yml_M`c^<;#SLZ0j&nHD0` z*fgdtGmzj*VR0bK=rk6!V>5YDrV6AVlSZ$(d6^1uBg4ovh8owhjOdj}JU@+CKbrxE zivngsp< zD_zR6K`SDZ5JtVqESXvz&He_BvI!}noib2*l*JM*t236d7CDDx;!IApHXVRuL%YZz zb6n57_q*&>njjmHZd4at;=~1hWc>iD$}?i@&#M;1-?*A z)9UEvEn5;TtY!BH?G8LQ5wr)KZZ9};a6Cp6^(e%dvzs{Ol>rwl?e&udrepU61zdhO z3})BQ=a^1Fl$pCJivtFHjXoKlj1aST7XsW-yF))SXgUo+CiMaW(?l?FPDpFZGm&pz zFMLXOCi=q(XF^bgFeZR5f(CRB0`=A@$v{=0GT@q|qMV;gTcn@_d@#wTf?R|kb9bXo z)ozDB00#_HVYVX7v|eBoLkVLQrVg+QD4A}#wgq)Y zx-6GQNgp?9CzVWB<{}Na9E-fYNOR4eNCW;M*h~EklxZh|^wzfNRSNjDQ(C4Qk-rG~ zrY!;<4XX8G2#Uf|3(n7}hf^ymUG-=VA$kl4M3RcW1zGzOzj7BhEK~8QXb?`2=;q~i zRkkjIlw*510YP{SG#Ae5DZCYScO__#-d%Sg|7<8=bG)b=FS{;)Ly23q=nF4s2{_sY zF(O>E`oU>aV#TLQzcc8&aUCgnGgd_p(!L}&+z zL9P+qxDmMLQ;!2%ttW{2(D#fhe{h9X;F)>Rbi4j5)?}GNHO4=FyA5V*c9{>S~a=~ z$Kf1Wx|8Y0?(kL0(NwglX`=jsv<2DW)ewRv%j)JJ`js&uq zL)uZ<Qva+@+Sn2m_Oohl)+6xmFU*p1+cp})NagRst={ayiUx3e81>x;-aPssU zcFdCyVBcN<)N$#phQ({*f)wZ&b-jkpt0qhlVom7<3#(EATbbx$X$Q8=rN}um2TuQD z@T;6YdxbJ(_}yLII2|G8<^Z8>Yh_lgSqM{-15ChEwN-VmQr*-p!Os&x)dv#?1GA9DQ6qs^^ zNmsATFu09|7RZqT;L1>qO0fU!aKAWsx1b9Sh>ir^J~&W~ksw$O;RjkPEJpU?)ZR#C zPYg=CuL@5~!(zy(@h(B$w4O}mbp$n6BHjNmdysizPX#-`ia?>h2AG<(Tb;~Hk!?~> zY)VW*v8zeh2xdR>&F+a$*~V8AAT;ZmzENqeLy)xLms;UOW5Kiorm$MS+{U~NIn$5Dwg#)cq54BO>(JlNs68^jdJDG11e3CJ9zR>@LL(h#*4R2+r83)pj2= zV7g^*M)tJHB$ZuRy~3;%(61shN0BM3&UaZJ@UJlP2f>RZ^WBEbWj(dEIsqkax=Mt! z6A|&GK5IvuG)t^W4)Ht3eMGmb~ z64F2xmIJ-W3_5ZKVlK=LGfCkT#O@k*Hln4u6iI_AgM`XVp`fL1H<-^usCl^wrfOhX zWwlnj5P{M>=ALCr2C8$}_4dC6k~BD!a^Fgi5o6JwR2voN!g4TVD#^ zfb3}sl$qVHgi#a52$qCtH=UVpMx?a9*YdN#F2SM1g64#~soPbhcFHOU9G7Y(hL3gu zQYFDDNt(xQL+r(={gNG9Z#Tzc7hL@bc~5vDCeBAG+nVM(5w$W`RCOFG5~HV7=|Yta zE`})>?>U64&OmXs{=Em0(}FBH$ZIc$06q)|bfiF7*pEo}WbQ{`rhfb)%*5v{fT*@n!FDpY-W9o_1Jf=s%pqWFZVjN9boe#yCtFCRTXeisoVKpkt6=A_5yn9fD4|2U7-bxHKyC7{Aw$fex#a{4(yQXW4gy1>P z{JO3sOc)$RtI<@9hCOX;_MB5YB3wB9daQIF=PuaBzZzPeZibwWHn3$TLghToB=v+M7@p_?d#A7MEpz@W$!hJ8f2dV*-hb6( z%5wo-iJq2y5iM=UElEF;g0zZW)IweqhW#OlQ5VSGvq0$(PFP=qyNJ#%oL%(?z}a=e zs#~j`6VcKlj6Dbhfj5XvU^Z=rV6SBnf@N0-MKrzdQY6v?$C_OG1Okcfz znx5+8s0zU{2R?Ago8DwK5F3XRX|Tl@w8PUV4L-MyREYe3OG09t$=-8I7X(mRxJW%H#_NK+5M2m=;)g0e6FQIhn`et zX+X5JorE5A0=5%M>$?s#=xwzeVY0in8Dgl4&a1ioc;FT!^w}Xs*!5zCC5V{WgG1Rc zlMWgt{30dOP;0)`h?;%rlnqrCQJW$YjS8L(obT{=olLNV_e^F5U0a`acSY9y7cwU; zM^M%VWjhrXQ(bz#em7*+hoN$YAH7^PWQH4!u-pN!RBPuJM9seH?YW&X6SD#y4G6+P zX+5Xgav(xxpE$BXYAxXLx?mTuS|6G5J!{pZFrKayO8ilEl(hP9LiFtZMvAa{t0p{V zHE$UL+9{fQ5F%z@mS;x9C^>p@;Jj$4nuLcSUUoy0f|ulGDV4?-1K^emSVU@QGNNT) zFeRZCz{!FF*x1qbdlXBcphD)J`oxR!zJYHsJPMGsg>N|mi>S%!apqKn?(jpL0`lFk zQFPDq=zjqpc0lmVs}r|7z<|RG7W!6<3Cn@$Jus_6Gin`h zBBG~E$m*710VGvM)shdFsU*7corMLYtVRB-0(9JS5w{AiJ%-aakT1Rl_MswhjbKZ- zU>y7qYJw(BdB#OOX6_5tj3}QwIG}20)+PLJ~a3Oy<%UC*o&${ zjrcNes2OgzOA{2%hu}#&z*5e&!+AHf-$^f_bwAE&*@mDcJ%H*7%}KDDa_&Ip`FM$1 zq_M!>f-*&v9SH45^@hSNTkzor)z~ER3>2>nGE_CB%Mr<&15!p5B~2M$a!bI%X(n9W zYT#EP_&)y?xCV7CLfN}RDYptiBe-L+cD#~76;rFF8k~mi!OI8WgsDDRU5{`Jb{o#= zu7#s~!SaS6G@6>F{orjr*m|yt3P?rPQ13(3CEZcg z4uyfHPEe4_-@SLeKA7hKD~OrN@X(B6$2H&w5ZJkg!017Hd=AhWc%@21d>9dz?ir$X zjYi@^Dwt~$pXmDpmd6mj=3jwV_Zz|U#lsMq_)j8!#h&3S{sg$AcmNFJR~qIsh&gx9 zFc&#=>-{{!xb_$(2(Gwt;X%>}e-R-)dj<(xgyopJpHQy!4Nc1{h`ryQVM7KY=3~Pq zl;SWsyl}!+Yt7gHi)N^D<8ykj^$KYVNgebSLRR%4YSIEXb;#nX8)sYaC-Gc92%Kg^ z-$m#Q)?FXDNzl4YK|ju3fqU1q(Cer=THr~g{eOylTRMD0oGec{ITwn)6An=ZkPI)NIzF;Llo$2n9P zpk4mb9|)~nUz_TA=`GtkG-Q24d>Ix?UB}Zbed#2;S3Fw0q#SV3f73Fd-kYdzy*@E$w(V7mt{A z({?a&PUY$Y{6TqqR-4#`{)k)ILr-SFRpt)}58=rlCqzmxa|dD&cr>nSQ6LOL-lU6rgwcpJG8IW( z`6vnM>LCZMI%AP|cq(xsU;%vtw-eOq5>7zUVX355{>pC0pM=R72-P-79e!;gKAC`xUQpQ!d}mOb$u5kp0>o^M~Lz zzXXJG!!BHElmR`cewIwVOQ}^k=i4U0i}bB>;fo}X^db3B)e2#eu$T;BG{$HfqX)|M z!Te2Y;M`MLNl6K|X{=;Tb9;1ZX^AFntOV|34>w0!OB&&|oOnD`6zgbdED3K8ZGh*) zVkH}*a7%kw`!a}M1`}Uq{IGa4wh-hZA27!LXz@<_hWA5SvsVe#Tv;dakt5`Yd{C#b zRH$Jz&S*QfY`^aHglA0?GNlxokyb0CUT8?|+T}usE88Kg5LOC7VHKktj2^`3!HjO% zA*>b}g(e})=pl?A%IIN?9*v?DW#|U2*HU^u(QTQOLZeUaw;srQ(4ica0^T1^5gT8E zQS~!pd#O6qf;t51EhpNJfv^J(bbmju4Ja)sAC?;{jhdmaAg)Sb1=#aDs3mqsKG)AG8($ zt`Aqs)p7O0X)-78#VA;&!~Tty$fVX<)1>Hn30@r!Hl;Qa-c%gh6j>A3s&b~Vl`Fei zI7>KNI7c{FI8QiVxInm2xJbBIxP;LY7=?PA#OTS4p2Fy5QJi=$VY3b+xdK zo6D7QrNX7cWy0lL3H)>wHQMkBXdzJ%e#&k!4XNBOc2=F_@#nCluV&OR4-~gc@wGzs34R3-FbJ*U#Ino?~ z7itpL9XT=;3Quof%7EMJS5gz9TbqbFPk1=`yqZf7xPY6#kdJ&_S zF?uQ7hyd5#cc_n>)`Vm2&GA@eYD0oha0h%mq_#xbms%;$2`_SkwhPY-yMz}Qy_iu@ zzpdMamxPyvR~X&K=ypbTDCLdo)+w!N0^l>W(2ylP5c;DXiPu!SUR8iwHM()c;ANH7 zp|;{pk*4^%UBX+?fNu-$Ecf_|+uI{et2^T1m^VLv#90kTKh(P9>IDE@wjG;ZNZ&;cwv|kz@2)Mz3RZC!^Oh zdIO_3UM5nmR5XZ2(IlD~y-69`H#2$%qo7%Lby?NKfQS_@i$*tq?kaPO{-F;>HJYSy zd>9v0d#L_R!X`LEEgM5I98PdkT>6(@80&4&J-|3D6}LLl0-G`kdawoQoUpeNkF+S> z6=IKB@NvnO(^l_%DA5FBUvU7mt=LcO&*&|T-r6Y+6bCVS8>6>F+t$Vvmuq=b1fSc1 zmw`g?wnuXmZW{JC!*MkYWVkqj8?<#RFjQ+FjTQ^JLEFSJjNZLX9LwlE@MQ{2L#Q1N znd6#PW0@otp(vBZDU9C7=>46-x576{A45-H8dw9vK9<(m8tV*k0atdFI8&S@&KBp0 zbHy@oo;Y9JN8Fdu2N->j(T5m)n9)ZVeUwoc+>bN*1fx%0B`#F0y66;LXw${TXw#oc zvgyw-`bNT_zxn^6LC-M3{Ew})SPNEKtYh@)gq0STWwg>-Ux&mdRFlZ zmiAvV;=9DnTpzKcyNP{x(z2uXws}53tM%{IzMEbHd)B#2+ybYmB}QHBTFg`C-M>ipQ&__P%dbW2<4E zES{zgZg8w%aKF_l9wi>B00CS&*7G3hIgGxeOb6n5;`uPKc;MZtPVqc_RuC@~FGdRk zbMt%KM3_O}2b>jnWhcDz{x1%ug8ol+n+&i?@lli!d#G&gj>SLPLTwjsSsb+FKN# zbaNcuYXi?T=4)IBZ>z_aggYQLG7~{%2;X@PHvwmo{VwlN85O>9nfOxau>eit`^5i1 z-NgGD{bHL47V%4*w=%bm_z1NAqvB(AF!9GD8^W+CEtz}v%LhTVzEV5n3Gqqj5GQzf zo#GQ+9rCpJES3QV^P6qrbBunQy$nuyEnHNNZZJ0GftKBQ&YgjVq==a-1(9IvP zgRTBdE}_NX*q7S&NQ5beK9FtIxrKD;kGf3~)6DC4cOWfwI9P^XP)7eNhKbR>67z zoQQmt!{=O53oog`q@ISY1!Q0$tWw(Hj^+qHxeQOfH|Wgz*Q!Jnp$(B{(CLB6@}Sqz zj0=`vexLMC%<##+O&jA)%5!%`Y1BFOXF$;lxI!_FdFq_vnYC)x$};tzsk5g{RmQg@ zl54ig+SrzCQa^}(NO@8pDPQW#cnjkN#*2)Xc1ZoD0n$Ke5aX?kw=q7C@qJL!2EkZN zyn)tH6NZ;;Ba>ROl!D=1%_#22z>S4H6PClf3%+n`2p*M$p_@OkXKJ;K z+E8wj7e-fO z_%hayBS&uqP4@V}xQ3gQVF5(XTLgbwG#Z!5&io;gwf}&Dctmj3EnOs4W+nXiX6K_iUVrWXbd z%G+zmFcf`#xFfa<{!PfUZLnNlvLOpY|j7OdISnZveEn?6GpWKov3&ze0) zw#qhnpxhsZu?m5e(3xQs4mlov6r>^y@2j_keGr6&hKwbV4Aw{jZsi$H{i|Jr^7dW0 zZGoI855Tg^UBfyZPPvbq-&wIp?ko4hQilP$hKzygXj|9ga8P0WTYQ|a>zjNo-?Yo) ztzNoJ?a&rz(R%gAF!pZOTh^V`HP9vMwkvS>11sU-<@PwfQ)6#y3w3Pw*VaH^D?fv- zsddFhSE>RW4a>lUr?+nB{xums1?m+m6S~p4q6U6l6#}!Jq-;&98g{M*_6(nM7OpQh zlq=*Wa?`lkoSUoUmU2EW%C&P_xTClex%0RSxQn<;xGT7w+-=+g+(X37We6)yL z1x<**X;#QBL16weutH0uN@=3xk-Ul_-J9{l!Im<91mj0uCM_iwNIuCARl0!j1@h61 zAI135^3m`Itn28W%^+%5uS6gd5RLB{35k?<5__fegTJRxj#+3?+eUGPq?M{GR5t#o z*B~7B)e3*KDb!IAiWkf&E1jyf$!cjmS9XQeC^bo8X^pg2S|>%M0~j{$SjLZI{CLJs zU_4AYlNdkw3a(VzfbNjgDy_wTF|fkJ(jOcm_@M}Cm7lSx20{hv;HBy4CU?>Uwk!2d zE81YN!8QbZ05+{EvKD5VaFa5Hz?-De4IUqa>tGz?5K{u0*q7@3ro#F|tII=eb)i_T z8Z@no#Mk-2rZk7)8#n=pB}LoT$6DdZN%$lwkT%=yuuq@vbQL*g%$-#{Z!&zYRhv=2@N2ARUhjVMPsLn#NoJn65Or1MpR>Abr zxdl^aluj#{3;&hEpXoDZl)@)dXX^9jVbU>N+2xWfG3jvW2umry)6t)+!sCy#34K!hg)Bi$wnn}x5Qc%)7nL*b0(2t0XjRb?$l@*GHGgeu5=MP zZ0AYmOBYBNGJY20XES~dE|xBlwo2O=U&iR z=P@1}mVFq%?+)oYX{U6(bRFXtFn%H9?eGK2IiMoa3=iKc8e86hp0u*|>x=6{9bXL@ z4hpouHcJNL!74_$2_FB&z`Ty5$#uJQM zr284~P*%C<=VoMs&1~r*>0#*+2zWy19*18wx?JET!=1d~yDEW6#=98r^!BAkra5G@ z=7O?-a}Gj{yMDaEDJX6&*EqSfCDkIpoJSqX1m9BGMflYFq>me1`X;GnGx zZ*C1KPnIi1A==#Y>s)8$6JYI^zrFu}fms&NsyAK_+n!DB;4uQ)URH(uo;)a z?B5?g9j1N?pcliZ!>!x!!;#8|Wy3eEdJjGvWrcD^qxpj^t+ox}rU=wOR@@R*WCrp= zxHJ<4yYIT=Z9qN_kO#o06IA58FW6ZIpH6~LCqvg}+CeK0wYCC7kqYzOdxochp#&HP z!lzR;S?*g6pH9yQ82EIiLR&Vf_=GpM&4$nCfZ&~F`*eb@t4*q7?k`k-?A&+3n1u(b zKaW{>+#K~MbSMhBVs1XSg!6L|u7!(nhj52+M}RwVJh&5`+z#$a?pkmpo&Xo(Rqj3R zW9~EVYwj2BPwsER6D#RU29hE&4cv%@#6cF5rKFZLkT^ILhm&K-@!(9H3r@sVaw)lv zTo10qZRAdJ4|#+T!V1--Oc6p=09ITvX0iKn1!IrM{ob){77c<`730Ct(#bEA-R%only7DD; zT?vM1khY|Zw!#)M%*?7QIWQhwA8x6LgqxexwTI##!BhtinS&`-=LyA>LfkUkf(qVL z-X4!ffd^-nF6D~JmV6G@s0P`zYp`v|(4+N+$ggX2q;{)5IpBZ1acM zJ>TDU$JVW#g0)kWGE6hJyzbMCrEg*J{3ZTCZNu_#%Yg?annqgyCKiNx!yPeZVe3NW zw?qS3IV%rF(Mqfkj$Ow1{b4uK3IW-x7{441&G>dm4TH_rHLx)Y4v6N>Dn?OHt8hEP zM;w(x31`v5Yom}Vp`~5`jS{l6s$odIBAOg|)}fHKV(nwixAwL6v-YoXGe;n1L{Z$P5xQ*sy~A!KZ^P%n&3wIK!*k*Q$Q{r1CJtoFVyS z14Q#8v1p6pePWtiV&SCv=c-TIC*cz+qpzbmysYcXl~tk5u%CQT7@`l*BH-ev-(e{} zh|0y4kI}ad2y14=`T?lR3HM;Q{@|oSR$C3mjNW2 zlb=?&l0JYh5&}u04XQCN7{kP()Usn*KTWsJfyv4`!#dMC%L)sS^^9+3{07Fi?6A(Y zmXQmr;O$2lAIC6&EYGX246jK@imO{)aJ{jYsZwH7Hq=Dcu2YD$(j3;sSen!7vQ}7O zS<}k+0~z1O_}C6eQYsO?#ck~KaNinIB$OhZuKP#1Fb@Pzs5Hj+2fiuFo2P4H~PT@$K8JwT$108rB!Av|epx z-cbj_GIC9)b${z}#&2T$A$r)_8niaTuA6n0HDm>C-^}<9#vioZ+QiMZg2qFBA}mz5 zfEil>xLtGAa{R4pDV-0$VhyT7YvDPN_NK7j4`UV{x;4cDv{>6Rl^28Z+8Ga7bx_`6 zP+nK>j9GYu8g*0)NjEBFEVEmDcKZ^075yvq8 zSO|$If0R5k{0SG^iT^865$#uOJq)?)&Q}uzBw|qvABIEfOV=GPbplTeFN}<2q{fI( zEDo8gsq~Yw(O0{jkT9M~JS7`(RX84Mf=Ej$Ip&aMmIX8>l{Bl^zV_8IIMEy4kV;>Y z4H{NsxPrtecPd9#*>yvm)Q-!%t>G4T3j}~*nFtF-Ofs{c2iwEe^BI3qm!@81-2u@- z>&4bftXr+yteyX-z3+f(D*N_Ef+Hn2)KCP}+!A{4AOZ?Vk=~1d^dcQaMT9F#6T2cP ziu4{J5WoTgDu@9hRZ66UaqPX1j=md^8U5bOfBn~b-}}C`-g>ZB0_WbGbM8L({Py0z zy>~9Y1jQXeaYs?yF%)+k#hpNLC(H3=_;P#&_F9E4H0~6NJB{K77yrP*hWV)mKcFSH zSC$ZJiKhC#rou~Y78opH3I%Hnh=||%9rQ5JP}5NGV(%(z%voHd4WzMcxnp}Edvn@j zaR|qtSgiIo0fX|zAd&!PkSr#Dl#O7NH1X>%wJ0~PES zy8(sRVlavSKKysPQD7NSv4e{!im@i9yD=&}EMU21NorkK_#NMk;?AbR6Zo6>9(*tU z7ADL-{B1lP-;W=_58@g4JNSN%E%*`4+*;1@TGA*Oim}IIuO_BngRyLDHlN1^9Od}M zn99!>jm-hO#S?=5V&E~3KWdS-`rgz3dA{IJN7>_eEziKkaSQh8<^TRtyCRlp_{p!c5zsrFQI-k=w$e{yH5K)uPz#f|vXJ>llhFMsep+Tq%mH zKyesTR)pmZ{^_&*B-y2I|Kh{`+^$QD$6_xY=6hYhk|*%L;U8cZ^$@c&9((>Zn9Jfc zP+TF~(7+;Qf1hi>P8`HP!#~H;<*=Rmmt&2M$M$B~%#8iEu()FU3$}axFV7K9`L^^k zvI0x%$Knmb_%|GGsSYTvBy}mT5dR+k0kdl`1+Xled3n)GfE55Ihu@D)*!|6Z zL_L-Uh)vNfDj{z7;wJ$vVC7QA?oVs`mz00L>x+S3*g{~V^S^aI76}W8j$|`P+k=+o ztjw-qz(`%}yNs7^tHsyl(hsK{G3?N|@)ANVFM;w;=X{4CfEN(P^d`Uu-~j+20Q`Ue zAP8Vl>KYVRi{k1~97dJaqqqhX*NEb%m4FC91VjNb0CPrx)qo_5YeI3&C=MeiyHFg4 zGS^Yu4HQRb!9 zcin%#$i=BIM@*L||9ABm%SgVwQp=kKv-bYY0*mF6n=5Y*aVXGSxEE zGEr4k(@r}cErbvK!@2hmp5(^FO5 zq+@2Ls=bJ?fHB9DB96zYrm1GwV`-9r;-V(6-xxogo{kg#ba9nEmR|PV{OPBc5mRTOt4RBxTVCh=CFl_-~*8I&M zN@f6Gzz^7lmCWF7p}1ZY*Yn>|GV>3x%1-Li--I(yU7l|+5XLTjlUL4lP+P0A|vTqqyN8jEb?P*&SyuI%emN{AnTpr`aX~iW~h`7Qw&N;>)rv1S;9u z;UZ836aytdDNqKK1DHuOf#N1n+!TtNMsZ9OcMrv3r15MePz6*2H9##;2T*`|08<)s zC~h9bVa)Aw6!!wfy+m=ZP~6A=)eb=#{~xr&72xX6_;U^DVQYs@pbO{*t^+rKn<$Qj z;xK#jR}^<2#r=lj9+U&Uz%8H;xQ%HC%-nv6;vS(m?B>F9Ffr}0nBDqaeg99?4rBkf zw8IoI{j=<604(J4L*XyL0v3L5_zifl)bP(3h*{GALOVPKo-K8-1QajXK!I()*FS29 zx4=8#JzG1xLve3W+?)T$+5w9jC+%8Bo6o>kwsu&q!3Dk%I8fYs6!(FR7k_u5|DZFz z_eWSs_+|O}G4F@KL*QM?Z}~|DEPC_B1U|M7VAF&D`5XnClE2w6GTzmAAe#rL1GD`zy4P-ng9_HjPWDDC>LiDfsAtD*wXq3 z#*ZM6F@6LEf+EVrg>tR>lSd(_5H$XVfg@;g=n=G0E{u)OL%DuoGjM-O2r>@y`;o*W z7!Zv9t_x!hRl-J;i8f5IkD#AmpWwLQ1HngvPXwO{ zz7TvR_(t%Z;0GaYAzmT85J5;lNJvOTNK{B%Xtj{3P@K?3p*up~gjIxngfoOs37;0u z70web5^fdl5T*-H2;UceApA)9iSRSw7s9WEzlv~(aEfq={360F!YhIo(HC(M*(-8J z(bsh?aeZ_)SMOR~xq4{zGf5svAxWa7n52ZHyriO}vZSh{y5t$ji;{Jc z&5|vWZIYKIyCknm-jwW>?327B`A$kuN>)luN>fT(N>|EE%2CQ$%2mo;%2Uc)%10_f zDpD$1Dpo39YKK&!)NZK@QkSLXrB_MINZUx;NxMsXNpF?*l@67TlTMJ%l`fQSlx~ym zlD;iHDLp66l72#}AXSlSNOh!oQX{E}L?gA5E|IQ~+DX?)U8L)zo1|V+ABj#HATdZo zq!H2>=`LxKG)=lknkCJX7D)F=4@i$lPe{*5FG#OQZ%FS*A4s1_pGkj^zJV)19Jmr( z1@eG=AOP}%f}k)+1jRrJP!f~|*McMv0ufLKlmit&B~S%a12sS`PzTfl4M0QC2s8mV zfo9-l&=Rx;Z9qHF0dxXgKsV3>^a8hnzTh@601N^{z%VcZj0B^>STG*k0VaaG!6Yyl zOaW0a4Lk^DfLY)n@Gy7`JPGE4`CtK92o{57U?o@sQou&A8EgeFgY94^cpdBk`@nvX z0S<#>-~>1g&VcjauiyjlG58F83BCc}gP*`J;5Ud9S_yGOd=LQ=ghU`QXf-4at%D$l z49P)?kP4&@X+gS>0ki=!flQ&zkQHPD*+Wi{E93!rL%xtd6akom zN`=y(bSMkTfsR5apwmzubPl=z6+xv?1yl{yK@Ct7)B;_Cu0q$KZs;a-3!+1V&=52V z-G!#0d(a%T0R09%f}TPzpx4kl=p*zQ`Ukl6V`$CVMEv$-UOS&mhcwX4t9iHV0YLH_JOy-fp7>M4oAW8ag@LBjgd=V~z%i$`x7Osb>Fb!^lufQE}7kmTmg>S_U=|eF%yiKr)bQ z*V`A7j$h!i7bNF`E(P>@EX8EHi>Bkf2havkYG`jCEvfea&K$OJNt%pmi~ zugC-BG4c#~iM&DHBcG5j$Tu=4c_o>f%tt1W1<4|0G4g7%G>u$QQ^(@NCuHHlChAnl8KN>kl86yAX6q&Au}X1CBu~ElNFH_m0d4uCc9ZSN%nwjx@@y- zyX-aDY1v<8f0N^syDWEI?xx&(xo`3-T(f(hFr}WgTTb zqZl%FU+Q{ht)Q4v)!QL$3lq7teSs}iqLs8Xp?tuml8 zt}>yzLX}q)ud1QCUUh?Nm};DAg6eVAv#JHEmsGn|Z>Zi^eXjaaZIzmUnvj~ZnvR;D zT9{g#T7ud!wS2X6YFE^5sP(8lQ+u!WQC(PFN_~yGiMo~g7WFvwB=uzV3iSqcs``}r zg8F?8J`E8KQH}K)W*VC{Vl;MZBxzjKsM4s>7}l89xTgteDrzcgCTJ#Wrf7C)-q!5b z{Gzo|Yn7I+OW2Vw!e0uc7b-8c7^sM?bq6Gb<}k9 zb=K?b(Mi)esMD#_r$g8IL-!Y5Ze3$tOI>T-RNXAyL%O57_jG6VNP6;mih6N+NqWh8 zy?S@_hV`ZN5q%l`5d9eaIQ@G4HvP-`pA0w+xC|@|91NTc@(qd&N(~+xyfJvUUVXj6 zdc*a5)~BsMxV~@w@cL21wT7~W@`l?DcNiubUN*dLcyoi)24sWGhOiBB8xl6OZs^?5 zZNy>3W5j1sgjo31n^ zmkImmKv@AAQ7+dVH*k_SyaoOU!#Z60I zOJPf*rLSeEWw>RF zlev?flY>*LQqr%O)VPB)xhIDK^b-Fc0(jI$i}Br|tsPv=bM4~xt6-txz@Yhb)9o% zxe?sN+$7vg+^pQTxFx%#yJfnSxl!C2+@{@rb^Fbo$6d%>#9ht zwD&l{ePJYRdh^;+X4<0a?i;N|J%?X}M`-fP@z z)@$CI*IU?|=xyw6>22*D;ho^U)BB=#m3NKzh&R)FW-D$hek)!a@z>=W%1>vPN}-{+jqO`k!ZJ3eoGzW99gmG&k3%KEzb z`uY0%?(@y?&GIext@my89rK;>o%37iNAMHy)9_pGx4|#eFV-*K?~LC?zhb`|egl3C zzu&jvwyoT@ahvrvn{Aofj&D1;ZE)M&ZIk|j{;U0^{9XNh{kQoa@jv6A?|;{S&Yu+^ z9Y79{4e$?$2#5@*3ZMow2RsUR9q=|#JoQnP>)dm(7@26p?RTaL$8G12<-`d8Tu*o zbC^^Z5+)O79p)V78kQWE9+nwa6-Etf4r7Mh4|@>K9WEFy9IhR16mAk87#5)LII=8~64?+r6}b?3KT14`6a__jMEOSrMwLZTq8g%RqaH>*js~L@ zqLretg3joK=~l2Lo7!uXRJo-`q&Mz zF|oU2lVU4k8)B)kv#}3jAIHIQN^vT2K5-#&VR1Ea&2cSpALCcVH^rO9$Hwo8 z-y7c)e>J`%{&oE4_&*Y45>yk^69N+=6QUDp6KDyo32zd+#FI!#P*Orta#Bjt?WB>UvAytKrM)V9llP|Y&D=Y>_uk&w zQd^lZ^Gh9wdodBKt-6`|pp~AGyC}|F!*HX`E?%X+WAo znrE7KT4h>eTGIi-0kH!T2VxKGIk5M@;DNgbCJ#y+1P{UoBMv4U+&p4SeoAEH?ai&_Pe&+hjl+4V`?94lvlbO?5 zYqDgrLaE@Tk>Kv&Yw;aD5|D4L4#+;^{_c`AVuQ+UY*!-}?;p2zT9xgci;PA`C zuaB4=u{~mcMYTF#kmUx%~6_zvaKke|1*rtoB*mv#DpZ&K^3;JbVA_gL9ha49^*z%Q$!J z+=+9nb5G7aD^M!XF3>GVE=VuPEEp`fTQGTE;k@Q~?eod!)6Zv~A34uFKXZY6LFIzl zg}oOJUdXs`_rlx-R-tmCPN81mslxMxg@x}5zh30H=ycKhqR&Oj#ny|Liuj5|ibRV- zieif5imnyiD!N@PQ4AKt#mU9##hJxdifb*S`u6mT9RFIvgC9Lt)!!* zvt*{^LCK@iRiz@O#8S~x@lvFeTq;v4SE^lVSZZ9lsnopGrqsUFsnoU9y)>h=rF6FR zVd<07=cO;pR+Mp-tt#U!!J^$5W)&6{))lrD z_7#^Zx+@qJqZQ*76BYL=<|-B{?pOR?DOkCta&6_hO0ZI;QnOO0Qm=ADrAeh}rFo@O zrAwt-rDr9x@=+B>6|U-+DxNBQ6@Qgb6|qXZO0sHA6{$+M%AjgPl}VLp)#fUzDw`_1 zD#t39D)%bSs>G_?s>@Z(YL04hwL|re>QmKC)px2VtC`ia)$`SltKU?=tNu{^srqyE zAJt#0zt!Mt1ZzZU#A>8!*4BVENR35JP)%IT?wY+dDK-0RvTAZ_j@F#0IbG9H^Ria3 zc6F^xt$wXxt$D3Ytz)fMZD?&$?Y`QK+GDk+Yl~|uYO8DOYN@rf+P2y&wYO`>YbR@2 zwF|ZPYoFJCuH&xbt0UA2)``@K)vd0Rsgti$s#C4gsMD^~t23yxuZynBsjIB(se4%W zs_rWVNBM=qLm^NEDIydx${LCSMUA3O*+em=m{BY!mK0Zt2gRG>OYx@!QQ|0jDOr>w zl;f0Blzd77rI1ogsid@0ZcrvEOv)^UMY&ITNO?kePI*OnOZiZbujj89swdWq*Gtx~ zsb5zQ)sySx>J{oO>O<-e)z{Sz)qiM^Y|wA;XxQ11(y+hbU_(a3v4;GHa}DPk3LAQW2^=Rf(!f)u3*qno@13wp4qn2Q`=)L5-ruQg>2!Q}F}kc$)A{geJizktWfmwM}3X z+(d5DXwq*oY%*@z)MV9U(`4V|)a2Tf*i_#%(R9D*VbhbQ=S{Dg-Zb+z3pYzP!_6|y zs?9ph>zgf`w=~-|J2tyCyER8OCpPbHZfU;W+|%6G+~3S-9-gOcF~e(`)DZb04;--O*>3GMmtH%rRCE~X;)~Yv}Y|GEn+Q- zE!r*CEdeb%S~6O0wG6iW+VZ63eap92j#kcA{#Nl;$<{Tkq*l09sa3UAqgA_AuhpQ{ zxiz{qyS2Ubdh4y$+pQz5Q?2(}=UNw9@3+2g{nYxU^;;Wf8&4a)jlWH(O{C4REu!sA z+r_rxw)(b~wo7eS+pe|swDq<1w=vp=+NRp(+a9;QZs%ynwd31Yx0Bjs+qK#^wwtwE zv|G2^wmY;tw{L3?Y!7Y^Yv0};)gIFx*M6q`YWr^;0v!?^V2477a>x1(%MQ zJNr8OI~kqBonxIdo%5Z)c0TBQ-1)SNzYFTp>hkIe?TYP6=t}I`)0Nzn-j&sr({;4# zMAxaVnyzbI6J2k*Il5PLb9S%nUe~SEt=g^8t=+BHy}sM6+pjyhJGDFQCf`kwn}#<{ zZ${o6zWJ_)vu9NgZx7HT)I;nM?^)fmu_vVGaL?JElAiLOs-D`O`kuC)D?J@OT|GB? zdV22lyz1rcMS9hHwR&}X4SF~9n)G`24fZ|id*An|?@Qme+nl#o-d=ZG?zZ`D%iCM% zE9ks*F}f6eEghuG(BJ(-?P&!A_~PtXhLE%ZzDtMqI1Zu(97Ejpb(NFSn) z((lrr(_hiw(BIQP(ZA5Y^>g;G?C0+1>nHRJ^ppFY`h)so`cwMP^tbm9^}ihu8_*xv zJYYZIG~hbmG2lHAG!QxvF%UTrGY~hBG;ng@!a(H!ZJ=YIYv9H}@4)SWk%94niGk^X znSr^1uY;0<8wTA50|!F}!v`Y=V+P{}(+7_Zo*Fzecy_R0uxhYjuxYSm@X}!C;Pt_t z!M?%%!KuLqgTFIy3_L@Ev5o;T$P77#Dno;z&Cp}4XP7hW7~YIXMhqjKv6Hczv6qp; z*v~k~$Yta+3K)fqVn!LGl2OB;Fd7&$cL;Y3?u6etedp$#4@2Z3wIPimt)UG=CPSt} z=0i?HenSC6!9!s~+lQiu;)YU&_75E#${ad0bY$rG(8-|-L)4*LL*qlNVa{Q$VZmYX zVaee&!=z!^VTEC(VU=OEVe?^+;fUdc;l$xR!+VF%4__L-H~eA*7$J=)jaZM^jyQ}s zkGPF^j%*$A9q}JY8aXm@euOr1Yvk9F2P2P1o{hX5c{B2URCZKtRC82kRBzOL)M3_5qhH5xV-jQFn9`W)n8w)Yu?u6>V~u0& zV~nwhaojlfxW>56c*gjt@v`yC@tSeUc;k5UcL4&41?LUF=n!ha%QB5)#jB7P!uB5fjlB5NXN;^@SQiNcBEiL!~x ziJA$@MB_x$#QY@hq}t?`$>_=K$&-`0lX;V8Cx<3yCTAz-CRvj&CSOjzntU_GF|}ff zbBb$9a7t)Oc#1fsGG#X9IOR0uJmos&JLNwWG!-(nYbt4K-xNBPHuZGs-8AR)s%f5S zzG;DJ;c3xn@oAN5%W2nXw`uoj&*|9dJ=4dhbEoU3Tc$5fU!Crl?ww{$-=BWSi;VekOGWo!LKgVCMMDg_)w6(wT~x>Y2KkhMD%6&Y9~oJu`hX{WFZ2p_y;9va@!x z;j@QlD`y*Ln`c{Q+h$+PewqDa_UjzS956?ir!uEHr#7cCXEPTt z7c&<-7dMwMmpqp`mo|5BE_W_}u3)Zku4tZjUU+`pJTfmcFE_6|uQsnauRXtIK43m( zK6XBCK4Ct2{`CCWdFuR)`Frzo^9%F8%|DudI{#w+#SSUIdCtaGelRvD|3Rl}mPXskBY6;=o97Hfz# z!@AFU$a=zh&U(lC$okCsy0BtFctL7GZDGTL<3i9v=tAs5^1}XwBMavi3Kq^UMoT$3 QIhWoEPD}60uM36$0dvRFtpET3 literal 0 HcmV?d00001 diff --git a/examples/mobile/ios/caretta_sync_example.xcodeproj/xcuserdata/fluo10.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/mobile/ios/caretta_sync_example.xcodeproj/xcuserdata/fluo10.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..a26e37f --- /dev/null +++ b/examples/mobile/ios/caretta_sync_example.xcodeproj/xcuserdata/fluo10.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + caretta_sync_example.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/examples/mobile/src/lib.rs b/examples/mobile/src/lib.rs new file mode 100644 index 0000000..4681831 --- /dev/null +++ b/examples/mobile/src/lib.rs @@ -0,0 +1,70 @@ +use bevy::{ + color::palettes::basic::*, + input::{gestures::RotationGesture, touch::TouchPhase}, + log::{Level, LogPlugin}, + prelude::*, + window::{AppLifecycle, ScreenEdge, WindowMode}, + winit::WinitSettings, +}; + +#[bevy_main] +pub fn main() { + let mut app = App::new(); + app.add_plugins( + DefaultPlugins.set(LogPlugin { + level: Level::DEBUG, + filter: "wgpu=error,bevy_render=info,bevy_ecs_trace".to_string(), + ..Default::default() + }) + .set(WindowPlugin { + primary_window: Some(Window { + resizable: false, + mode: WindowMode::BorderlessFullscreen(MonitorSelection::Primary), + recognize_rotation_gesture: true, + prefers_home_indicator_hidden: true, + prefers_status_bar_hidden: true, + preferred_screen_edges_deferring_system_gestures: ScreenEdge::Bottom, + ..default() + }), + ..default() + }), + ) + .insert_resource(WinitSettings::mobile()) + .add_systems(Startup, setup_scene) + .run(); +} + +fn setup_scene( + mut commands: Commands, +) { + commands.spawn(( + Camera3d::default(), + Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), + // MSAA makes some Android devices panic, this is under investigation + // https://github.com/bevyengine/bevy/issues/8229 + #[cfg(target_os = "android")] + Msaa::Off, + )); + commands + .spawn(( + Button, + Node { + justify_content: JustifyContent::Center, + align_items: AlignItems::Center, + position_type: PositionType::Absolute, + left: Val::Px(50.0), + right: Val::Px(50.0), + bottom: Val::Px(50.0), + ..default() + } + )) + .with_child(( + Text::new(format!( "{:?}", std::fs::read_dir(std::env::current_dir().unwrap()).unwrap().map(|x| x.unwrap().path()).collect::>())), + TextFont { + font_size: 16.0, + ..default() + }, + TextColor::BLACK, + TextLayout::new_with_justify(Justify::Center), + )); +} \ No newline at end of file diff --git a/examples/mobile/src/main.rs b/examples/mobile/src/main.rs index e830a8c..7171f42 100644 --- a/examples/mobile/src/main.rs +++ b/examples/mobile/src/main.rs @@ -1,3 +1 @@ -fn main() { - dioxus::launch(caretta_sync_example_core::ui::plain::App); -} \ No newline at end of file +use caretta_sync_example::main; \ No newline at end of file