From e53455e52b8360b1a024e71bec197658dd07094d Mon Sep 17 00:00:00 2001 From: b5 Date: Mon, 25 Mar 2024 20:56:00 -0400 Subject: [PATCH 1/7] chore: upgrade iroh to v0.13.0 --- Cargo.lock | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index b41028c..0569bc9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -454,6 +454,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.8" @@ -1038,6 +1047,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de8419e65098e54c06f5ae8a130a79e8ba2e391ff995d260ca5d77ea72ab2fe3" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", +] + [[package]] name = "futures-channel" version = "0.3.30" From c86746e07bff0c58d6508b3bda20566d9f5a9a5a Mon Sep 17 00:00:00 2001 From: b5 Date: Mon, 25 Mar 2024 21:05:16 -0400 Subject: [PATCH 2/7] chore(deps): update deps, bump dev deps --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0569bc9..06687ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -456,7 +456,7 @@ dependencies = [ [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ @@ -1049,7 +1049,7 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de8419e65098e54c06f5ae8a130a79e8ba2e391ff995d260ca5d77ea72ab2fe3" dependencies = [ From 723772d48d423817c12c3cf2616d707b1e2ad73a Mon Sep 17 00:00:00 2001 From: b5 Date: Wed, 27 Mar 2024 00:17:42 -0400 Subject: [PATCH 3/7] feat: ios sendme POC --- .../sendme/sendme.xcodeproj/project.pbxproj | 674 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 15 + .../UserInterfaceState.xcuserstate | Bin 0 -> 41051 bytes .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../sendme/Assets.xcassets/Contents.json | 6 + ui/ios/sendme/sendme/ContentView.swift | 31 + ui/ios/sendme/sendme/DocumentPicker.swift | 41 ++ ui/ios/sendme/sendme/Node.swift | 174 +++++ .../Preview Assets.xcassets/Contents.json | 6 + ui/ios/sendme/sendme/Receive.swift | 118 +++ ui/ios/sendme/sendme/Send.swift | 73 ++ ui/ios/sendme/sendme/ShareSheet.swift | 28 + ui/ios/sendme/sendme/sendmeApp.swift | 22 + ui/ios/sendme/sendmeTests/sendmeTests.swift | 36 + .../sendme/sendmeUITests/sendmeUITests.swift | 41 ++ .../sendmeUITestsLaunchTests.swift | 32 + 20 files changed, 1350 insertions(+) create mode 100644 ui/ios/sendme/sendme.xcodeproj/project.pbxproj create mode 100644 ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ui/ios/sendme/sendme.xcodeproj/xcuserdata/b5.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ui/ios/sendme/sendme/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ui/ios/sendme/sendme/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ui/ios/sendme/sendme/Assets.xcassets/Contents.json create mode 100644 ui/ios/sendme/sendme/ContentView.swift create mode 100644 ui/ios/sendme/sendme/DocumentPicker.swift create mode 100644 ui/ios/sendme/sendme/Node.swift create mode 100644 ui/ios/sendme/sendme/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 ui/ios/sendme/sendme/Receive.swift create mode 100644 ui/ios/sendme/sendme/Send.swift create mode 100644 ui/ios/sendme/sendme/ShareSheet.swift create mode 100644 ui/ios/sendme/sendme/sendmeApp.swift create mode 100644 ui/ios/sendme/sendmeTests/sendmeTests.swift create mode 100644 ui/ios/sendme/sendmeUITests/sendmeUITests.swift create mode 100644 ui/ios/sendme/sendmeUITests/sendmeUITestsLaunchTests.swift diff --git a/ui/ios/sendme/sendme.xcodeproj/project.pbxproj b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj new file mode 100644 index 0000000..fce3465 --- /dev/null +++ b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj @@ -0,0 +1,674 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 60; + objects = { + +/* Begin PBXBuildFile section */ + 4235A9C32BB306190013D818 /* sendmeApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4235A9C22BB306190013D818 /* sendmeApp.swift */; }; + 4235A9C52BB306190013D818 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4235A9C42BB306190013D818 /* ContentView.swift */; }; + 4235A9C72BB3061A0013D818 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4235A9C62BB3061A0013D818 /* Assets.xcassets */; }; + 4235A9CA2BB3061A0013D818 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4235A9C92BB3061A0013D818 /* Preview Assets.xcassets */; }; + 4235A9D42BB3061A0013D818 /* sendmeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4235A9D32BB3061A0013D818 /* sendmeTests.swift */; }; + 4235A9DE2BB3061A0013D818 /* sendmeUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4235A9DD2BB3061A0013D818 /* sendmeUITests.swift */; }; + 4235A9E02BB3061A0013D818 /* sendmeUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4235A9DF2BB3061A0013D818 /* sendmeUITestsLaunchTests.swift */; }; + 4235A9EF2BB307250013D818 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4235A9EE2BB307250013D818 /* SystemConfiguration.framework */; }; + 42C61F5F2BB307EC00762786 /* IrohLib in Frameworks */ = {isa = PBXBuildFile; productRef = 42C61F5E2BB307EC00762786 /* IrohLib */; }; + 42C61F612BB3084300762786 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F602BB3084300762786 /* Node.swift */; }; + 42C61F662BB3A82A00762786 /* Receive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F652BB3A82A00762786 /* Receive.swift */; }; + 42C61F682BB3A8A400762786 /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = 42C61F672BB3A8A400762786 /* CodeScanner */; }; + 42C61F6A2BB3BB2400762786 /* Send.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F692BB3BB2400762786 /* Send.swift */; }; + 42C61F6C2BB3BEC200762786 /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */; }; + 42C61F6E2BB3CEC500762786 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 4235A9D02BB3061A0013D818 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4235A9B72BB306190013D818 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4235A9BE2BB306190013D818; + remoteInfo = sendme; + }; + 4235A9DA2BB3061A0013D818 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4235A9B72BB306190013D818 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4235A9BE2BB306190013D818; + remoteInfo = sendme; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 4235A9BF2BB306190013D818 /* sendme.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = sendme.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4235A9C22BB306190013D818 /* sendmeApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sendmeApp.swift; sourceTree = ""; }; + 4235A9C42BB306190013D818 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 4235A9C62BB3061A0013D818 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4235A9C92BB3061A0013D818 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 4235A9CF2BB3061A0013D818 /* sendmeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = sendmeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4235A9D32BB3061A0013D818 /* sendmeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sendmeTests.swift; sourceTree = ""; }; + 4235A9D92BB3061A0013D818 /* sendmeUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = sendmeUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4235A9DD2BB3061A0013D818 /* sendmeUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sendmeUITests.swift; sourceTree = ""; }; + 4235A9DF2BB3061A0013D818 /* sendmeUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sendmeUITestsLaunchTests.swift; sourceTree = ""; }; + 4235A9EE2BB307250013D818 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 42C61F602BB3084300762786 /* Node.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; + 42C61F652BB3A82A00762786 /* Receive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Receive.swift; sourceTree = ""; }; + 42C61F692BB3BB2400762786 /* Send.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Send.swift; sourceTree = ""; }; + 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = ""; }; + 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4235A9BC2BB306190013D818 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 42C61F5F2BB307EC00762786 /* IrohLib in Frameworks */, + 4235A9EF2BB307250013D818 /* SystemConfiguration.framework in Frameworks */, + 42C61F682BB3A8A400762786 /* CodeScanner in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4235A9CC2BB3061A0013D818 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4235A9D62BB3061A0013D818 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4235A9B62BB306190013D818 = { + isa = PBXGroup; + children = ( + 4235A9C12BB306190013D818 /* sendme */, + 4235A9D22BB3061A0013D818 /* sendmeTests */, + 4235A9DC2BB3061A0013D818 /* sendmeUITests */, + 4235A9C02BB306190013D818 /* Products */, + 4235A9ED2BB307250013D818 /* Frameworks */, + ); + sourceTree = ""; + }; + 4235A9C02BB306190013D818 /* Products */ = { + isa = PBXGroup; + children = ( + 4235A9BF2BB306190013D818 /* sendme.app */, + 4235A9CF2BB3061A0013D818 /* sendmeTests.xctest */, + 4235A9D92BB3061A0013D818 /* sendmeUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 4235A9C12BB306190013D818 /* sendme */ = { + isa = PBXGroup; + children = ( + 4235A9C22BB306190013D818 /* sendmeApp.swift */, + 4235A9C42BB306190013D818 /* ContentView.swift */, + 42C61F692BB3BB2400762786 /* Send.swift */, + 4235A9C62BB3061A0013D818 /* Assets.xcassets */, + 4235A9C82BB3061A0013D818 /* Preview Content */, + 42C61F602BB3084300762786 /* Node.swift */, + 42C61F652BB3A82A00762786 /* Receive.swift */, + 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */, + 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */, + ); + path = sendme; + sourceTree = ""; + }; + 4235A9C82BB3061A0013D818 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 4235A9C92BB3061A0013D818 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 4235A9D22BB3061A0013D818 /* sendmeTests */ = { + isa = PBXGroup; + children = ( + 4235A9D32BB3061A0013D818 /* sendmeTests.swift */, + ); + path = sendmeTests; + sourceTree = ""; + }; + 4235A9DC2BB3061A0013D818 /* sendmeUITests */ = { + isa = PBXGroup; + children = ( + 4235A9DD2BB3061A0013D818 /* sendmeUITests.swift */, + 4235A9DF2BB3061A0013D818 /* sendmeUITestsLaunchTests.swift */, + ); + path = sendmeUITests; + sourceTree = ""; + }; + 4235A9ED2BB307250013D818 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4235A9EE2BB307250013D818 /* SystemConfiguration.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4235A9BE2BB306190013D818 /* sendme */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4235A9E32BB3061A0013D818 /* Build configuration list for PBXNativeTarget "sendme" */; + buildPhases = ( + 4235A9BB2BB306190013D818 /* Sources */, + 4235A9BC2BB306190013D818 /* Frameworks */, + 4235A9BD2BB306190013D818 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = sendme; + packageProductDependencies = ( + 42C61F5E2BB307EC00762786 /* IrohLib */, + 42C61F672BB3A8A400762786 /* CodeScanner */, + ); + productName = sendme; + productReference = 4235A9BF2BB306190013D818 /* sendme.app */; + productType = "com.apple.product-type.application"; + }; + 4235A9CE2BB3061A0013D818 /* sendmeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4235A9E62BB3061A0013D818 /* Build configuration list for PBXNativeTarget "sendmeTests" */; + buildPhases = ( + 4235A9CB2BB3061A0013D818 /* Sources */, + 4235A9CC2BB3061A0013D818 /* Frameworks */, + 4235A9CD2BB3061A0013D818 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4235A9D12BB3061A0013D818 /* PBXTargetDependency */, + ); + name = sendmeTests; + productName = sendmeTests; + productReference = 4235A9CF2BB3061A0013D818 /* sendmeTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4235A9D82BB3061A0013D818 /* sendmeUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4235A9E92BB3061A0013D818 /* Build configuration list for PBXNativeTarget "sendmeUITests" */; + buildPhases = ( + 4235A9D52BB3061A0013D818 /* Sources */, + 4235A9D62BB3061A0013D818 /* Frameworks */, + 4235A9D72BB3061A0013D818 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4235A9DB2BB3061A0013D818 /* PBXTargetDependency */, + ); + name = sendmeUITests; + productName = sendmeUITests; + productReference = 4235A9D92BB3061A0013D818 /* sendmeUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4235A9B72BB306190013D818 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1530; + LastUpgradeCheck = 1530; + TargetAttributes = { + 4235A9BE2BB306190013D818 = { + CreatedOnToolsVersion = 15.3; + }; + 4235A9CE2BB3061A0013D818 = { + CreatedOnToolsVersion = 15.3; + TestTargetID = 4235A9BE2BB306190013D818; + }; + 4235A9D82BB3061A0013D818 = { + CreatedOnToolsVersion = 15.3; + TestTargetID = 4235A9BE2BB306190013D818; + }; + }; + }; + buildConfigurationList = 4235A9BA2BB306190013D818 /* Build configuration list for PBXProject "sendme" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4235A9B62BB306190013D818; + packageReferences = ( + 4235A9EC2BB307170013D818 /* XCLocalSwiftPackageReference "../../../../iroh-ffi/IrohLib" */, + 42C61F642BB3A7AA00762786 /* XCRemoteSwiftPackageReference "CodeScanner" */, + ); + productRefGroup = 4235A9C02BB306190013D818 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4235A9BE2BB306190013D818 /* sendme */, + 4235A9CE2BB3061A0013D818 /* sendmeTests */, + 4235A9D82BB3061A0013D818 /* sendmeUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4235A9BD2BB306190013D818 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4235A9CA2BB3061A0013D818 /* Preview Assets.xcassets in Resources */, + 4235A9C72BB3061A0013D818 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4235A9CD2BB3061A0013D818 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4235A9D72BB3061A0013D818 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4235A9BB2BB306190013D818 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 42C61F612BB3084300762786 /* Node.swift in Sources */, + 42C61F6A2BB3BB2400762786 /* Send.swift in Sources */, + 4235A9C52BB306190013D818 /* ContentView.swift in Sources */, + 42C61F662BB3A82A00762786 /* Receive.swift in Sources */, + 4235A9C32BB306190013D818 /* sendmeApp.swift in Sources */, + 42C61F6C2BB3BEC200762786 /* DocumentPicker.swift in Sources */, + 42C61F6E2BB3CEC500762786 /* ShareSheet.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4235A9CB2BB3061A0013D818 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4235A9D42BB3061A0013D818 /* sendmeTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4235A9D52BB3061A0013D818 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4235A9E02BB3061A0013D818 /* sendmeUITestsLaunchTests.swift in Sources */, + 4235A9DE2BB3061A0013D818 /* sendmeUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4235A9D12BB3061A0013D818 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4235A9BE2BB306190013D818 /* sendme */; + targetProxy = 4235A9D02BB3061A0013D818 /* PBXContainerItemProxy */; + }; + 4235A9DB2BB3061A0013D818 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4235A9BE2BB306190013D818 /* sendme */; + targetProxy = 4235A9DA2BB3061A0013D818 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4235A9E12BB3061A0013D818 /* 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_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 = 17.4; + 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; + }; + 4235A9E22BB3061A0013D818 /* 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_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 = 17.4; + 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; + }; + 4235A9E42BB3061A0013D818 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"sendme/Preview Content\""; + DEVELOPMENT_TEAM = 7K8LD2955M; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSCameraUsageDescription = "Used to scan QR codes!"; + INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "for sending files"; + INFOPLIST_KEY_NSFileProviderDomainUsageDescription = wat; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "computer.iroh.sendme-ui.sendme"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4235A9E52BB3061A0013D818 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"sendme/Preview Content\""; + DEVELOPMENT_TEAM = 7K8LD2955M; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSCameraUsageDescription = "Used to scan QR codes!"; + INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "for sending files"; + INFOPLIST_KEY_NSFileProviderDomainUsageDescription = wat; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "computer.iroh.sendme-ui.sendme"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 4235A9E72BB3061A0013D818 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 7K8LD2955M; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "computer.iroh.sendme-ui.sendmeTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sendme.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sendme"; + }; + name = Debug; + }; + 4235A9E82BB3061A0013D818 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 7K8LD2955M; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "computer.iroh.sendme-ui.sendmeTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sendme.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sendme"; + }; + name = Release; + }; + 4235A9EA2BB3061A0013D818 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 7K8LD2955M; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "computer.iroh.sendme-ui.sendmeUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = sendme; + }; + name = Debug; + }; + 4235A9EB2BB3061A0013D818 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 7K8LD2955M; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "computer.iroh.sendme-ui.sendmeUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = sendme; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4235A9BA2BB306190013D818 /* Build configuration list for PBXProject "sendme" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4235A9E12BB3061A0013D818 /* Debug */, + 4235A9E22BB3061A0013D818 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4235A9E32BB3061A0013D818 /* Build configuration list for PBXNativeTarget "sendme" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4235A9E42BB3061A0013D818 /* Debug */, + 4235A9E52BB3061A0013D818 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4235A9E62BB3061A0013D818 /* Build configuration list for PBXNativeTarget "sendmeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4235A9E72BB3061A0013D818 /* Debug */, + 4235A9E82BB3061A0013D818 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4235A9E92BB3061A0013D818 /* Build configuration list for PBXNativeTarget "sendmeUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4235A9EA2BB3061A0013D818 /* Debug */, + 4235A9EB2BB3061A0013D818 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 4235A9EC2BB307170013D818 /* XCLocalSwiftPackageReference "../../../../iroh-ffi/IrohLib" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = "../../../../iroh-ffi/IrohLib"; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 42C61F642BB3A7AA00762786 /* XCRemoteSwiftPackageReference "CodeScanner" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/twostraws/CodeScanner"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.4.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 42C61F5E2BB307EC00762786 /* IrohLib */ = { + isa = XCSwiftPackageProductDependency; + package = 4235A9EC2BB307170013D818 /* XCLocalSwiftPackageReference "../../../../iroh-ffi/IrohLib" */; + productName = IrohLib; + }; + 42C61F672BB3A8A400762786 /* CodeScanner */ = { + isa = XCSwiftPackageProductDependency; + package = 42C61F642BB3A7AA00762786 /* XCRemoteSwiftPackageReference "CodeScanner" */; + productName = CodeScanner; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 4235A9B72BB306190013D818 /* Project object */; +} diff --git a/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..d6a1552 --- /dev/null +++ b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "19143d4db0ea9e94de64cd39414304eb87f8b90781d40db6519be71a4bdf0418", + "pins" : [ + { + "identity" : "codescanner", + "kind" : "remoteSourceControl", + "location" : "https://github.com/twostraws/CodeScanner", + "state" : { + "revision" : "303bd5adbb61d068c3bcbb839857340c3e6ff8b0", + "version" : "2.4.0" + } + } + ], + "version" : 3 +} diff --git a/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b2723066a7a2649342c39df48caddd3498628c44 GIT binary patch literal 41051 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

A}k%U9<#~N=);%rS)oKRz zaugNce6?dyNde5Y>0U=5HgjKItoHo z?QWnpIDAIYusTLV_FFuslpAXMg7FkUg;UXR)piawoGPT6s5ZEB`EF`H^%z`>`XsfS zT0=ccZG&5CU#H%n-lPstZ&OF8&)|N?@2KCAfHcSj?(=g;9;iQD-xrTk(Fk-0+*J$b zgrWQ3QmqHkLbMp}vU(gnftJDTwJ)F#(f8;I`W0P8*D#9(Ea6^ov5Otc9efbZ=)Zu!#h3BVbT3+Crt7XdZ)+{MV);b_ z4nAtqWYo#(lo4He3@A`Fo$x4?l3@syZ&nx@qRxSZJiyQlb*9=^Jye}-Lej?xy%fNd z!1>MelTWF0u|Yjdoey_>7zn*ghIOpvgkAv$t?yLe)$7l3P@%5BOayI$ME-wXl9H&f z6>hHl%aqDFL#CA8N#+BnD3d0mt}rVt7x9Bm0w^s_8e6IeNT80Yfg89z;j8nlyQIa^YH7Fhu~}b}zLI`aBTyln)ct@klGM5Ce071kSY4_vSGTI~Qa`SK zLcPo;)+W`a-o|M21YD>oYCJXmnxUFfO_gS(W|T&+8LKg9CTJFEwrO71yrX$fb4YVU zb4+tW^O@$f=8Wc?=7KF{+s9UGn`v8X+iYvJZL^(Xdxz~b+ed6y*uG@@vh8lWNp>^r z=G!f>d&q9F-NSZ|+U>M^-EOblKD&c`q7wvo5+t}OMhuX*6C)=mm z53wI=pJShApKm|T{yzIh>^ImyYyX`6^Y$;;Z?k{Vey9B|`&aB=wclfZ-2M~$6ZW6k zpSC|^f6o4*{a5zi+F!Q+(f;Q?u6;85RP@pJxwp@XK70Fo)aOEFd(Z#oHy!CEO*#CCVkiCEX?4rOc(yrO~C?rNyPyWt+=xm-k&h zcDdy8YhSi6-&gFL+;?c-lD;GQ8v5SZcXr>6eV^}pqVJb|zjvivu`A=sy4tupxb}4o za~w~TfT^GAP?7Gf%z3WETO|F|=x43R~-R`=>^(EJr zU3a^F>Uy>-LR%fAy9e?R zJ)AuHd4N9R;p^e=5#SNzq4P-c80t~zG2WxeV~)qu9&0?-d93%?=&{LTv&R;Xtsd`r z9P&8gam?cbkB>Y)_BiA5rN`GE-+El~_}&wF(w-_$&eOru$U>>%BI5ZSvaewZ&_z*LJVHUI)D1_IlUrh}SW%54=9|y6WB6+uu9HJIp)W zJHk88JHdOfcd~b?cfI#A@0Y#zc^~yY?|sqxGAu&c`#AV``S|+;_yqZc`GosK_(b^( z@yYZV?laP7f=`1_lg~sSqfeX9WS`kSbA0agxzA_5&jUUW`YiN$+GnrNX_fg-+eV_DQ?%VFW!FQYQcHh0eZ}{%> z-S7LB?}xsh`kwSX<$KQeg6|i;U-|y#=jP|(*Wb_E5A;R90KXtVtzWudrr%J%9KSrj ze7^#}O25&5b$(;~#`%r+o9s8$?@qtF{2uaK=C{JH!*8YECcn*oTl}{A?eaU|_qN}= zeh2-X{C)gE_4E()kM_^=&-X9zFY+((FY~YPuks)1Kgxf!f1UrG{&)G$@F)JW{O|U^ z$NxV6`Th_1Kjgp2e~JHd{s;Yk7~nJ@Za~d|`2(IE@a}-G1EhdH0Zsuf0j>c)0os7j z0A0YqfXIO8fV6F9z%kcsXEqz-s|t z2D%3h4$KTJ4jdOaKF}B_2QCU+64(*=bl{r6X970`ZVr4Qa9iLTf%^mB5BxmvT;RpP zuL8dfyd3yr5FNw@@j+5h?;uT(T~ME(fS}AEeb7BYtAch1?GJiC=;NSIgFXv78+1PC zV$hdCSAyAKAy^%36Kor7AM6>d4Gs^E2#yYp4^9kD4o(d&2sQ>!3Z4>tXYll3Ie1p^ zoZx$d+k;mIKOMX#cwO-N;EloCf?p1PHTd=5eZl*K-w*yM_>hYktN49yPB z4J`?+4jmn;4;>deA+#a1DRg4!^w3$Mb3*5aJ`nm)=;F|aLpO&W3q2irKJ<&wuRsi78({F78w>D785o)Y;o9@uw7vX!afZ<8FnG;N1dRP zbbWM=I&a+oU7${@3)e;HqIEI4Or1ejuWQsz)V1m+>89$Y>89%*(LJtvQny^!uItpT z(rwUf(QVW1(CyN_qI+BSp6;;jsP4S(2i;G)E4p99`EV(`SGY~MW4L#?U-*FV!0@K< zY2nku@Dt&mg?}D?F8pHn zm*L-pe;0mvpk`p`z`}uT10Ngs^1#y(IHG?Qb%kh-97QTwCbj(RWZP}I?=528Mbx*YXm)Rm}T zqpn6>i$>96v~6^sXs77D(fy(WqJyJDqjk}V(Mi!M(P`1cql=FBl5>!Y8I-WeCG3_yXVh+X}i}^6-c+AO|(=lga&c*x~OUH__y<#=7_OX3q-C{jsy<&Z0 zb7N=3u83U|`$FuSu?J$0#C{h0ee92MbQ~Wi#`TJ`i|Z5T6z38*AWj#T6_*z`CT>dH zLvf4a9*KJ_ZfV?;am(XY$8C&zE^bTQwzwDL-iX^D_jcU7aUaKh8h0}8RNOalm*T#U z`!Vinycpjr-X`8Q-aWp5yidG;d|-TVd{TT?d|v$U_@eld_}cjK@eT3K@y7T&;_r%| z5kE72cKpKl5{D%gBo-%@B~~VmOsq+4No-A=lsF~vj>Kt+(-Y;ynTfL#pG!P7 z*k*9zV8h_Y1|JywOA?nPCiP0vB-tl9Bn2deCq*a4CM6^dPRdCtOe#q#PpV3)O&XIl zE@?tiL(-(A8A0~xpNLDA? zB-FQYPJL`HSS=!`WPFJ!!& z@oL8F8T&F0WE{zOKjWi}PclwsoXYH#nUOg=^ZCr(nR_$e%zP{JVCIp`_cK4tJezqw z^J3;#S-PymtRy%~X-L+ptmm>`%i5duX4YF-?`9p!I-2!C*72+_v%bl?l=VZ_&so1_ z{XP^9W*^E9^&A>JbnwuMq2q?$IrRRaONXu;x@zd^p__*88v6Rs14EAtJv#J*p+9G% z?B3Zn*_v#-Y>#ZOY~Snw*+JRb?7`WY*;&~+*~Qrv*;BIb&YqKfPxjpGhqIr~UYor> z``PTx*)L>o&)%8+a`t=KhqI4mf0+Go_KECM*=MrPXJ5>|oc(?FPdQW$%3*SRa&$T2 zIRkSdb5e4Kg^JdP^xgNQBxuv-kxg&C`bDMMT$h|99&YhJzCwD>a6S?iVD|4UDeI|Ef z?xx($xi9AK&OMU*N$%A=CeJ4?HZLPDGcPMIJ8xv(guKSQiFvJglk=wL&BzXC*@DgpO#PZXXoFO zKR5rW{5SKD;l9HM3=bWy8y+z{ zdU(w6is7?{ZyCO8_<`Y{4nH~k!tfspgaWC+xxlT!qrj`czaX$cTM$~1Sdd*Xs-U)D zOo5?bLP0}8bAhp-tzb&QodpjTEGl@o;IV=y3YHgi6s#&(U9hfTL&38JFBQC8u)APS zAzi2`v@7gW=u|kmu&Ho%;XQ@-72aR?VBw;|hYKGoe4=o9VMpQC!WRp77Vav1rSP@F zy@mS<_ZPlh_-^6B!mo>Z73qo!izXL6S+u+8WYM+ae#O4U1B!!+wZ&1zgNsv&(~2`- z6)U?qx45FXx_ET4zIc3bLveF)OYwr@=Zar0-c!7{_|4*XiVqeaDLz(wrucmE55>O~ zUn{{SsuFdHO^IzupAyHC%o0P%!jh#Wt4ns2yi~Hcn6$S@A)|nTlU3 zu2xc&bR}CURH`d&D(xyADxE8}m0^|Pl@XOul`)lZm5G%}m8q3ODl;nUDrZ$bUHN9^ zS5@{^(N!f?ZB+}amR2pRYOm_7dZubi)wZe~RlBNoSG`uXw`yP2(W;NCKB+ocb*Ack z)fZJ?jnItHj))zRJR)sG#)zT+r=>f8tD@fH08W~sxZSH>aZAGxLs4=`L`f8P((97f zuGh|-Idf*_duE22IkTMEzB6;qkPa@HJ(!n}a_J$6h}0yFlrFjDnuHgZG;ufAOtwVP z%kx}+djAif*XMb^JqtaHJxe@GJqzlp)8G(#MCL-y`RAf3b z2bqh^M;0O|LLdPogcyj4gpuV)4ze0~4=F%CM=FsjWIu8UIf5KVP9il(Epiq)k32x? zkw&B$d4xPco_eFa?Ytel(caG91n&$lIpmtOuWiQt%bn0m{K{@ExcGRbW3j1kQtt;1ak3 zu7R82Hn<0V2M<95XbSWSj0r3WXn~Id`vNzp4pclfmCB^%Q46R=)G`WhBRsloWHm^M zRG3;$K1i}x=+?l7=e)) zl`$BL$z?V$c}zZ2z-(f+GKEYLQ^J%oWz13LR#vyHW`jdTueUXi3 zJF`960qh_)j*VxBv5D*mb|gEIO=mOM8Ehsyk6pknVtF=~-OLuU#cT=t6}y8iXLqp& z*~4rtdx5QEudvtIyX<}T54M4A;$pceoXA0LC0D?G!WD5lxkKDx?q}{4cZs{s-Q;d_ zzjF_{My{Ff$oJxh^CS7!__6$WK9x`7)Af`TZhf-abXEvywb3R{Ijp;-7r*dde)yM+p2k8n-wBc_N`#Cakr zVj?4I;u>+SxKS(?zYxpB?cz>xmslYl5|4<-#Gk}!u|}*F&xm)WF4C*gObL^gOKYW# z(q`#XsZc7BN~JPso3vLtA|01bN;T4drPI4DTJHA^khGr67oqTEsbn><8LktfP; z$W!EL@=SS-JXfACFOvTu(=sdbvLH*cBI~j#+p;6SE3c40m4A@0hoVCxLJLEo(1)R& zq3Y1N(1lQ4=yK?Gs6NybdK7vRdZxUfbXR&QeUyI6ASF(TR}z$I3aLnnrWlH)WGgF_ zmC9-*Unx?`l-~sikU}x?TN7 z{Z`$hR;tIhTB09&?y;LvLx9L0doqCmiP(Q36)2sDU`f2^F z{@Cbi3^kIBWMho+x{+q28yUuQW2V6yTaA6jG2^Up$GB%S!S=8Z>Yn!#ps<8H2 z|FM3sp4y3az!q%7wrtm4XXn}lcA;Htm)k$uN9_}KwSCGyZJ)C**md?5yU}j8TkI$H zvv9j`hj6EGmvFamk8uC+=x}D(6PClP!t2AO;RE3lZIIciP4ZrjBu0iuk|L>*jL3}0 z?8uvuzenDV{43&#pb>wBh}dmkN9B>5Z3DxNk!B~#iFRU~Zq8qvp3Yz=!AW$IoMdOb zlj@{7>CRM#c0O_rI47Kw&IRYHbHlmi+;!@mCg+j!#Ce(>o!vb`d=jOT}x_RzK_hWaHyTv`|-p=WrGdX8g&Vrn!Iqy8jqIUn! NuAb*g^gME${{g{PPeK3y literal 0 HcmV?d00001 diff --git a/ui/ios/sendme/sendme.xcodeproj/xcuserdata/b5.xcuserdatad/xcschemes/xcschememanagement.plist b/ui/ios/sendme/sendme.xcodeproj/xcuserdata/b5.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..201aeb1 --- /dev/null +++ b/ui/ios/sendme/sendme.xcodeproj/xcuserdata/b5.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + sendme.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/ui/ios/sendme/sendme/Assets.xcassets/AccentColor.colorset/Contents.json b/ui/ios/sendme/sendme/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ui/ios/sendme/sendme/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ui/ios/sendme/sendme/Assets.xcassets/AppIcon.appiconset/Contents.json b/ui/ios/sendme/sendme/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/ui/ios/sendme/sendme/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ui/ios/sendme/sendme/Assets.xcassets/Contents.json b/ui/ios/sendme/sendme/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ui/ios/sendme/sendme/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ui/ios/sendme/sendme/ContentView.swift b/ui/ios/sendme/sendme/ContentView.swift new file mode 100644 index 0000000..a544a1d --- /dev/null +++ b/ui/ios/sendme/sendme/ContentView.swift @@ -0,0 +1,31 @@ +// +// ContentView.swift +// sendme +// +// Created by Brendan O'Brien on 3/26/24. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + TabView { + Send() + .tabItem { + Label("Send", systemImage: "terminal") + } + Receive() + .tabItem { + Label("Receive", systemImage: "macpro.gen2.fill") + } + } + } +} + +#Preview { + ContentView() + .environmentObject(IrohNodeManager.shared) + .onAppear() { + IrohNodeManager.shared.start() + } +} diff --git a/ui/ios/sendme/sendme/DocumentPicker.swift b/ui/ios/sendme/sendme/DocumentPicker.swift new file mode 100644 index 0000000..da26698 --- /dev/null +++ b/ui/ios/sendme/sendme/DocumentPicker.swift @@ -0,0 +1,41 @@ +// +// DocumentPicker.swift +// sendme +// +// Created by Brendan O'Brien on 3/26/24. +// + +import UniformTypeIdentifiers +import SwiftUI +import UIKit + +struct DocumentPicker: UIViewControllerRepresentable { + var onPick: ([URL]) -> Void + + func makeUIViewController(context: Context) -> UIDocumentPickerViewController { + let picker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.text, UTType.image, UTType.pdf, UTType.zip], asCopy: true) + picker.allowsMultipleSelection = false + picker.delegate = context.coordinator + return picker + } + + func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) { + // Update logic if needed + } + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + class Coordinator: NSObject, UIDocumentPickerDelegate { + var parent: DocumentPicker + + init(_ documentPicker: DocumentPicker) { + self.parent = documentPicker + } + + func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { + parent.onPick(urls) + } + } +} diff --git a/ui/ios/sendme/sendme/Node.swift b/ui/ios/sendme/sendme/Node.swift new file mode 100644 index 0000000..7eaecc4 --- /dev/null +++ b/ui/ios/sendme/sendme/Node.swift @@ -0,0 +1,174 @@ +// +// IrohNodeManager.swift +// iroh +// +// Created by Brendan O'Brien on 8/8/23. +// + +import SwiftUI +import IrohLib +import Foundation + +class IrohNodeManager: ObservableObject { + static let shared = IrohNodeManager() + + @Published var node: IrohNode? + @Published var nodeID: String = "" + @Published var author: AuthorId? + @Published var nodeStats: [String : CounterStats]? + @Published var connections: [ConnectionInfoIdentifiable]? + @Published var connectionHistories: [String: [ConnHistory]] = [:] + + + private var timer: Timer? + + func start() { +// IrohLib.setLogLevel(level: .debug) + do { + try IrohLib.startMetricsCollection() + let path = self.irohPath() + print(path.absoluteString) + self.node = try IrohNode(path: path.path) + nodeID = node?.nodeId() ?? "" + startConnectionMonitoring() + startStatsMonitoring() + initAuthor() + print("created iroh node with node Id \(nodeID)") + } catch { + print("error creating iroh node \(error)") + } + } + + // TODO: using a single author for now. At some point we should add support for author selection + private func initAuthor() { + do { + self.author = try self.node?.authorCreate() + } catch { + print("couldn't create author \(error)") + return + } + } + + + private func startConnectionMonitoring() { + updateConnections() + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + self.startConnectionMonitoring() + } + } + + private func updateConnections() { + guard let node = node else { + print("Error: no node") + return + } + + do { + let connections = try node.connections() + + DispatchQueue.global(qos: .userInteractive).async { + let mapped = connections.map { (conn) -> ConnectionInfoIdentifiable in + let nodeId = conn.nodeId.toString() + let item = ConnHistory( + id: .now, + latency: conn.latency != nil ? conn.latency! * 1000 : 0, + connType: conn.connType) + + DispatchQueue.main.async { + if self.connectionHistories[nodeId] != nil { + self.connectionHistories[nodeId]?.append(item) + } else { + self.connectionHistories[nodeId] = [item] + } + + if self.connectionHistories[nodeId]?.count ?? 0 >= 300 { + let _ = self.connectionHistories[nodeId]!.popLast() + } + } + + return ConnectionInfoIdentifiable( + id: nodeId, + latency: conn.latency != nil ? conn.latency! * 1000 : nil, + connType: conn.connType) + } + + DispatchQueue.main.async { + self.connections = mapped + } + } + } catch { + print("error fetching connections") + } + } + + private func startStatsMonitoring() { + timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { _ in + do { + if let latest = try self.node?.stats() { + + DispatchQueue.main.async { + self.nodeStats = latest + } + + } + } catch (let error) { + print("error \(error)") + self.timer?.invalidate() + self.timer = nil + } + } + } + + private func irohPath() -> URL { + let paths = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask) + let irohPath = paths[0].appendingPathComponent("iroh") + mkdirP(path: irohPath.path) + return irohPath + } +} + +struct IrohNodeManagerEnvironmentKey: EnvironmentKey { + static var defaultValue: IrohNodeManager = IrohNodeManager.shared +} + +extension EnvironmentValues { + var irohNodeManager: IrohNodeManager { + get { self[IrohNodeManagerEnvironmentKey.self] } + set { self[IrohNodeManagerEnvironmentKey.self] = newValue } + } +} + +struct ConnectionInfoIdentifiable: Identifiable, Equatable { + var id: String + var latency: Double? + var connType: ConnectionType + + static func == (lhs: ConnectionInfoIdentifiable, rhs: ConnectionInfoIdentifiable) -> Bool { + lhs.id == rhs.id + } + + func latencyString() -> String { + if let latency = latency { + return String(format:"%.1f", latency) + } + return "?" + } +} + +struct ConnHistory: Identifiable { + var id: Date + var latency: Double + var connType: ConnectionType +} + +func mkdirP(path: String) { + let fileManager = FileManager.default + + do { + try fileManager.createDirectory(atPath: path, + withIntermediateDirectories: true, + attributes: nil) + } catch { + print("Error creating directory: \(error)") + } +} diff --git a/ui/ios/sendme/sendme/Preview Content/Preview Assets.xcassets/Contents.json b/ui/ios/sendme/sendme/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ui/ios/sendme/sendme/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ui/ios/sendme/sendme/Receive.swift b/ui/ios/sendme/sendme/Receive.swift new file mode 100644 index 0000000..d26df81 --- /dev/null +++ b/ui/ios/sendme/sendme/Receive.swift @@ -0,0 +1,118 @@ +// +// Receive.swift +// sendme +// +// Created by Brendan O'Brien on 3/26/24. +// + +import Foundation +import SwiftUI +import IrohLib +import CodeScanner + +struct Receive: View { + @EnvironmentObject var nodeManager: IrohNodeManager + @State private var ticketString: String = "" + @State private var showingQRScanner: Bool = false + + var scannerSheet: some View { + CodeScannerView( + codeTypes: [.qr], + completion: { result in + if case let .success(code) = result { + self.ticketString = code.string + self.showingQRScanner = false + } + }) + } + + var body: some View { + VStack(spacing: 5) { + VStack { + Text("Receive") + .font(Font.custom("Space Mono", size: 32)) + .foregroundColor(.primary) + .frame(maxWidth: .infinity, alignment: .leading) + Text("choose a document to get started") + .font(Font.custom("Space Mono", size: 14)) + .foregroundColor(.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + }.padding(EdgeInsets(top: 0, leading: 20, bottom: 10, trailing: 20)) + + + HStack{ + TextField("Paste Ticket", text: $ticketString, axis: .vertical) + .textFieldStyle(.roundedBorder) + .padding() + + Button("Download") { + do { + let node = self.nodeManager.node! + let cb = DownloadProgressManager() + try node.blobsDownloadTicket(ticket: ticketString, cb: cb) + } catch { + print("unknown error occurred") + } + } + + Button { + showingQRScanner = true + } label: { + Image(systemName: "qrcode.viewfinder") + } + .sheet(isPresented: $showingQRScanner) { + self.scannerSheet + } + } + } + } +} + +class DownloadProgressManager: DownloadCallback { + func progress(progress: DownloadProgress) throws { + print("progress: \(progress)") +// switch p.type() { +// case .foundLocal: +// <#code#> +// case .connected: +// <#code#> +// case .found: +// <#code#> +// case .foundHashSeq: +// <#code#> +// case .progress: +// <#code#> +// case .done: +// <#code#> +// case .allDone: +// <#code#> +// case .abort: +// <#code#> +// } + } +} + +func saveFileToDocumentsDirectory(fileName: String, data: Data) { + // Get the URL for the document directory + let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + + // Create the full file URL + let fileURL = documentsDirectoryURL.appendingPathComponent(fileName) + + do { + // Write the data to the file + try data.write(to: fileURL) + print("File saved: \(fileURL.absoluteString)") + } catch { + // Handle any errors + print("Error saving file: \(error)") + } +} + +#Preview { + Receive() + .environmentObject(IrohNodeManager.shared) + .onAppear() { + IrohNodeManager.shared.start() + } +} diff --git a/ui/ios/sendme/sendme/Send.swift b/ui/ios/sendme/sendme/Send.swift new file mode 100644 index 0000000..36f6e0c --- /dev/null +++ b/ui/ios/sendme/sendme/Send.swift @@ -0,0 +1,73 @@ +// +// Send.swift +// sendme +// +// Created by Brendan O'Brien on 3/26/24. +// + +import Foundation +import SwiftUI + +struct Send: View { + @EnvironmentObject var nodeManager: IrohNodeManager + @State private var documentURLs: [URL] = [] + @State private var ticket: String = "" + @State private var showingDocumentPicker: Bool = false + @State private var showingShareSheet: Bool = false + + var body: some View { + VStack { + Button("Pick a Document") { + showingDocumentPicker = true + } + } + .sheet(isPresented: $showingDocumentPicker) { + DocumentPicker { urls in + self.documentURLs = urls + + do { + let node = self.nodeManager.node! + let bytes = readFileContents(at: documentURLs.first!) + + node.blobs + let res = try node.blobsAddBytes(bytes: bytes!) + ticket = try node.blobsShare(hash: res.hash, blobFormat: res.format) + print("generated blob ticket: \(ticket)") + self.showingDocumentPicker = false + + // Delay the presentation of the share sheet to let self.ticket change propagate + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.showingShareSheet = true + } + } catch { + print("sharing blob failed") + } + } + } + .sheet(isPresented: $showingShareSheet) { + ShareSheet(items: [self.ticket]) + } + .padding() + } +} + +func readFileContents(at url: URL) -> Data? { + do { + // Attempt to read the file contents into a Data object + let data = try Data(contentsOf: url) + return data + } catch { + // If an error occurs, print it and return nil + print("Error reading file: \(error)") + return nil + } +} + + +#Preview { + Send() + .environmentObject(IrohNodeManager.shared) + .onAppear() { + IrohNodeManager.shared.start() + } +} diff --git a/ui/ios/sendme/sendme/ShareSheet.swift b/ui/ios/sendme/sendme/ShareSheet.swift new file mode 100644 index 0000000..6b2de5d --- /dev/null +++ b/ui/ios/sendme/sendme/ShareSheet.swift @@ -0,0 +1,28 @@ +// +// ShareSheet.swift +// sendme +// +// Created by Brendan O'Brien on 3/26/24. +// + +import SwiftUI +import UIKit + +struct ShareSheet: UIViewControllerRepresentable { + var items: [Any] + + func makeUIViewController(context: Context) -> UIActivityViewController { + print("sharing items \(items)") + let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil) + return activityViewController + } + + func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) { + // No need to update the view controller in this case. + } +} + +#Preview { + ShareSheet(items: ["Hello, World!"]) +} + diff --git a/ui/ios/sendme/sendme/sendmeApp.swift b/ui/ios/sendme/sendme/sendmeApp.swift new file mode 100644 index 0000000..f27d285 --- /dev/null +++ b/ui/ios/sendme/sendme/sendmeApp.swift @@ -0,0 +1,22 @@ +// +// sendmeApp.swift +// sendme +// +// Created by Brendan O'Brien on 3/26/24. +// + +import SwiftUI + +@main +struct sendmeApp: App { + @StateObject private var irohNodeManager = IrohNodeManager.shared + var body: some Scene { + WindowGroup { + ContentView() + .environmentObject(irohNodeManager) + .onAppear() { + irohNodeManager.start() + } + } + } +} diff --git a/ui/ios/sendme/sendmeTests/sendmeTests.swift b/ui/ios/sendme/sendmeTests/sendmeTests.swift new file mode 100644 index 0000000..fd964e0 --- /dev/null +++ b/ui/ios/sendme/sendmeTests/sendmeTests.swift @@ -0,0 +1,36 @@ +// +// sendmeTests.swift +// sendmeTests +// +// Created by Brendan O'Brien on 3/26/24. +// + +import XCTest +@testable import sendme + +final class sendmeTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/ui/ios/sendme/sendmeUITests/sendmeUITests.swift b/ui/ios/sendme/sendmeUITests/sendmeUITests.swift new file mode 100644 index 0000000..8f4853d --- /dev/null +++ b/ui/ios/sendme/sendmeUITests/sendmeUITests.swift @@ -0,0 +1,41 @@ +// +// sendmeUITests.swift +// sendmeUITests +// +// Created by Brendan O'Brien on 3/26/24. +// + +import XCTest + +final class sendmeUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/ui/ios/sendme/sendmeUITests/sendmeUITestsLaunchTests.swift b/ui/ios/sendme/sendmeUITests/sendmeUITestsLaunchTests.swift new file mode 100644 index 0000000..60dba41 --- /dev/null +++ b/ui/ios/sendme/sendmeUITests/sendmeUITestsLaunchTests.swift @@ -0,0 +1,32 @@ +// +// sendmeUITestsLaunchTests.swift +// sendmeUITests +// +// Created by Brendan O'Brien on 3/26/24. +// + +import XCTest + +final class sendmeUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} From a25b6c7fb27879b49de426db85be638c56e5a0ba Mon Sep 17 00:00:00 2001 From: b5 Date: Wed, 27 Mar 2024 16:44:43 -0400 Subject: [PATCH 4/7] feat: basic send and receive working on iOS --- .gitignore | 90 ++++++++++++ .../sendme/sendme.xcodeproj/project.pbxproj | 6 + .../UserInterfaceState.xcuserstate | Bin 41051 -> 51271 bytes ui/ios/sendme/sendme/AppError.swift | 38 +++++ ui/ios/sendme/sendme/ContentView.swift | 8 +- ui/ios/sendme/sendme/DocumentPicker.swift | 2 +- ui/ios/sendme/sendme/Node.swift | 41 ++++-- ui/ios/sendme/sendme/Receive.swift | 139 ++++++++++++------ ui/ios/sendme/sendme/Send.swift | 35 ++++- ui/ios/sendme/sendme/sendmeApp.swift | 2 +- 10 files changed, 294 insertions(+), 67 deletions(-) create mode 100644 ui/ios/sendme/sendme/AppError.swift diff --git a/.gitignore b/.gitignore index 2bc7d63..a859c04 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,93 @@ /target tmp/* .sendme-* + + +# Xcode + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ +*.xccheckout +*.moved-aside +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline +playground.xcworkspace + +# Swift Package Manager +.build/ + +# CocoaPods +## Reference: https://www.gitignore.io/api/cocoapods +# CocoaPods - Objective-C/Swift dependency manager +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ + +# Carthage +Carthage/Build + +# fastlane +## It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +## screenshots whenever they are needed. +## For more information about the recommended setup visit: +## https://docs.fastlane.tools/best-practices/source-control/ +# +# fastlane/report.xml +# fastlane/Preview.html +# fastlane/screenshots +# fastlane/test_output + +# Code Injection +injectionforxcode/ + +# User Interface State +*.userstate + +# Apple Watch +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/ui/ios/sendme/sendme.xcodeproj/project.pbxproj b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj index fce3465..7dedeb6 100644 --- a/ui/ios/sendme/sendme.xcodeproj/project.pbxproj +++ b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ 42C61F6A2BB3BB2400762786 /* Send.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F692BB3BB2400762786 /* Send.swift */; }; 42C61F6C2BB3BEC200762786 /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */; }; 42C61F6E2BB3CEC500762786 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */; }; + 42C808FA2BB4948300114DC5 /* AppError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C808F92BB4948300114DC5 /* AppError.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -58,6 +59,7 @@ 42C61F692BB3BB2400762786 /* Send.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Send.swift; sourceTree = ""; }; 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = ""; }; 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = ""; }; + 42C808F92BB4948300114DC5 /* AppError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppError.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -121,6 +123,7 @@ 42C61F652BB3A82A00762786 /* Receive.swift */, 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */, 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */, + 42C808F92BB4948300114DC5 /* AppError.swift */, ); path = sendme; sourceTree = ""; @@ -300,6 +303,7 @@ 42C61F6A2BB3BB2400762786 /* Send.swift in Sources */, 4235A9C52BB306190013D818 /* ContentView.swift in Sources */, 42C61F662BB3A82A00762786 /* Receive.swift in Sources */, + 42C808FA2BB4948300114DC5 /* AppError.swift in Sources */, 4235A9C32BB306190013D818 /* sendmeApp.swift in Sources */, 42C61F6C2BB3BEC200762786 /* DocumentPicker.swift in Sources */, 42C61F6E2BB3CEC500762786 /* ShareSheet.swift in Sources */, @@ -477,6 +481,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportsDocumentBrowser = YES; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -509,6 +514,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportsDocumentBrowser = YES; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate index b2723066a7a2649342c39df48caddd3498628c44..22375300b13334d10fc7b8443f8e751dca712237 100644 GIT binary patch literal 51271 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�Bv{e2@a925CTAkP);Av>D_8xj?^zZh>xt z?t&hGUV%q|M}fzJ$Ac$y7rh;kUOmG%B2dn|t zgLi?ifZsyqLU52Gh#eAvd3_xc>!B7H}2F-+KLs?KBQ~)i4ilN2Odgu}8J?K;D0Bj5_4VDgD0Ly@ZVFVZz zMuTO-m@qah50(!rfvI46*m_tktPbXad0{?SGb{j0!hV8Xgk6Dk!LGw@!EVFu!XCgL z!c*X>@Zs>0@KNwF@HBWjd^UU@d;$D3_~-C7a4;MShr>y5CY%lDz`1ZKyacX9iTnw)A_BBSW2OjI_Ci4viTQRS#Alo@41tw+_N zTqqC9i}Ilkp17-+j6lMZuGA11}12YrzIp#~uSC|zT9EO0& z#xOB#3!>q?_#MEFqG2NIOm|K`Tm}l5j>~QSI*fH2~*ooLF*lE~L zu(PrAuxqejEEEgJBC!}O4okq2uv9D!%fKqIb=V)UzhnQ#eS$;c3UJl904|RE7MH|r z#qGi!#QlOhg6qH?$DPET#&zLt;%?*a;r_%u!9Byhz>mc*$HVa$JPuF919&=qEj}AB z#EbD|cmv*qx8UvgTD$}A#(VHy`~mzk!Z^Y-!a@Rw03l!rnS>(3zdtSnJ;6XQ5p0BY zgpGt6f}hYvND#IYb`W+Fb`uT}t`Tk!dWb2+RN^q=NaASXSmJo%B;pj}GU5v2YT_Cq zhzKFVhSBaG>$ZpG=-E-nn9XLnoWX|@av51it|S}D>&OnWo7_P5k(<1LS}bPy-sk4A_A6z$Rcb-~ggP z68IkY5!eOn0e%Bc0cU`-z#LMw>yKMVmug zL4(kUG!l(WqtbF|3Yvvxr`6H?v>@#}T08A$+6CHWS{Lm)?H270?LO@x?J=#F_JZ~o z?KN$HKAE0QpFy8RpG%)lUr1j}UqW9-UqN3@&!B_pP&$jQrF-d7`f>U-`fJ80#ykd; zL1S1MenynBo3WR%pK*xs3*!i*gK>g!nsJu#JL4kbHsdbiKI36lZ`Rwa_gVjB56MPm z1KITK%h?b$zM|CIeAdoX8Y&gh)9oC!ITbJBC>=Pb-woU3-Ou|4cYwx1nfhuBeeoc%33$==5Pm3@?bjD3QA zirvXR&%VIE#J2F^>TgOW^RBRk6! zAUrq^$;;=xb>-WJ{yz7f6?4hlaM4JrC}h@@y# z(U_ufMH7l96)i7f6lsfmMf-|+M5&_rBDAPLR4kHPit0p8QN1W6 zY7>1U`cAZ6v_rI0v|DsR^tX7Zc!c<4@fh(0@nmtjc)ED8c&Qj7M*pjBh+>L(?Z3G# zOUw~-#U}AL;;Z7@;$BILWT<4cWSV4&WT|A01S}y)s1lkaQ^J(wO1Ki9L?JOqToR9@ zQR0^bBq2#u5|?}{NlLa!ew7@R9Fv@ooRV}(&PjfkT$EgqbV<4;{l!y@A;tN{*5YrA zPZd9sj+8ExE|ad1u9mKmBBdlLMG8pi(oAWVlrI%Yi=}d@T3RO6N%hi3>Ce)m(v#BD z(zDWw(ks#~X}9!|^tE(QmLf})4VR6Tjh9W7O_8O`$TGRiD+|h!vIDY1vg5K#vWK!q zve&YAvO#%@e3*Qse3X2Q{1f?NIb4pCW90-nSq{h<@+>)1o-60dOXXU*POg_5D`qR^DHbReDaZly%L*Z65C>j;J6}Ob*mD81rlwc)P ziBqmsij)$iR#~a6QdTSN$_>gI}Ir<#y!`Qb%hO0hSjZw{0El@2|EmnP@TB=&ETBZ701yVs&Fcn8tsS2tNsqU&rs=riI z)pGSFb-miFZc;a^W9oMGcJ&VRPW2x3UUi51l)6)WUVT~JrM|AdseW5JtMrS~uS!>z zt}X?a!b*{)=+ewmUa6?GxKv)MEG;k9ml{egB2BSIp;2qfH07FgntIJQn(s7QHQ#G~)a=sytoe`Tpyn6NZ<;R6b=kX{lP8mZjxu3$;aBv9?$% z(^hD!v}UbMyHQ)Kb!c7MAGK$-*R^-G543-3pJ-oc|JL?v-)i6g`%=azuPnEfyUJtb z@$zlu`^wLhpDn*$e!Ki``GfMu<-O(4%U|kJbYpcBb(3}Jx|zB;x_P=!bt`p9U5<{e z%hU060$q_#qLb+qx_?_Wx=p&xI)~1stJisTO}Z9ct1hgI>e_UNb+;;pRxGF>Rj4W& zDt@duU(s9fx?-T>eZ@ce5&H4^N&2b!>H3-a+4?2=<@#0nHF~HXp-1bndVzkOzFzOs zH|qoXh`vq#jed)MkN!9PDSfB@y#AuTTYp2}qra=aUpcIDS*4&-R#{P5TUl4xSQ)F_ zRk^3~x5^Whrz$%uFH~Nx?5gapd{p_`Fxrr2m|&P}NH@$d%reY1d}>%^_}qXnpbc09 z-as@^3^W77u-1@cU>R}^Izyvjuc6!Uk8y#KWGpsrG{%kFj6WEEGVU@SG#)daG@db@ zGhQ%WGTt%%VSHqKYJ6$zGxi$?s%BP!s|Z!Js?4hFDpnP*ieDwH5?2*h)l~hb>R#2; zssYm&Q<^E=w7`^M0-FdXs)=sOG%-!NCa#HRQkV=Tv&m{&XR0yPnOvrNQ^d5*^sDKp z>A2~Xsnc}cbkTIhbj@_b)MM&1^_vDv?@WW$Db+)(KdK&H{c-i^>ao>dRFkWf)$Zz@ z)z_*A%`?qVbFR72EHW3HW#%$-mDy~zn%9{(m^Yal%`N7jIbu$jx0u__+sr4;Pt617 ze=I4MRLe-qXiJ)9yk(B%OUo+D8VlG0vtTWF3&}#Y&@3v8-*VD&!O~-SW$CjF{;SJo zS?5^4w63tOvaYd0tq3dHinV50`BtG-Y?WF|tV*lVYO}7lZnAE+daR9BzcpYDT2EVF z+2+~4ur0MMx2?2cZ8Te^E!)Pjacn}H+E#AU+l)4g&2C$7+h}vz8f{x_J8b7|S8e_F zvGy7EPwX@8v+XPF2s_bEvD56C_H28;oo^S~#dfJ(Zr9rl_A0x1gKmR;!}<*yH`Lbb zt2tJ4qUKahXWiktGj(_B?$zo^%waz+cqch};I@_GzIKOkYJGVQ3 za2{~}>OAT^?mXi>=e*#&n#c>H-MJ|a;<|=iS zxpb~dm(kVg>U6z!eQ=L)&vDOlf8ow>Q`~@?>CSbF-Ez0Wt#+5Y^=_lv&Vr^C&!OPnk#O(R+*@lc(0>@_0Oro)%Bg6Y<16M?H5u z&pdy7-gw@5{%IK2FtTA(!`Oy#4d@18LtR5-L#$y}!=8r24QCp98tybaYxt|-b;Fy6 zL2rsT)jP~P**o1k-@DMe(wpH0dtqL*7w08<$=+PA*lYAwd#&De-i_W`ufyy1Hh6vB zX76_I4)0IiUEV$3ect`vgWkj5Bi^IlW8Qm>LmL-0k{T6_4UKymFE{r2CirIfX8Gp& z=KGfTR{Ju15Fgx!@?m^9AHkRH%k^=61->Gm#3%EW_-cGxeS3WeeZTmQ_>TKd`Of&x z`fmDe`+9wSzJA|Z-(b^6O(U8{HH~RXYszSnHEnM4Hbt9uHtlXY)O5P(R@3dK-lkVg zeNFvM@0M_ecDP{CAr_YF^w-Z!T;0H1BBcY`)Tbt@%dtt>%Z#FPi^qe%(CK{H}ShC8cF- z%fyx`Ez??Nwajh#v}IunsYTpU)?#QewOCs0EwwF<7FUa>#oKbA)$PsD@wTHHcc7%3@_JsC@ z4ulSej)X3Tu7s|IZiIS5cS8?Ce}6{h@*I&~R#aSa@N0Wq4J1b$Cq}8zzLw zVIa&1uMMlirf_xG9JYoxgloc{aC0~mZVzt{?+EV9}9PeuY|9KuZM4jABTIx z&%>|6e~0@cDUsC3u*itW~UN8Us}L_dm7h)#}9jZTlwjLwdJ7F`it9py)*QDf8=-5m8t!_inY5#18~ zKKf&HSM=xTzUZ6Sr!hfH7AuSCV&>SU*yflw7K}w=+hT`fM`9hZ6S32=v$5Y}mtt3A z-Lc--^Vq9cU#vg&Ha6In(w5pbtZhWw#J11dFm22>MVqayt}Whnpsl0rZ9FADHa;yr zFFrrMAig3FiNoWlI5tj*GvZlsW;{2}jq~CaaZh|(yeIx3-Wz`&e-rbth$KFlmE=8nxr{tORi6DN^VX%ll94l=Uv^s^Bme*a literal 41051 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

A}k%U9<#~N=);%rS)oKRz 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 NuAb*g^gME${{g{PPeK3y diff --git a/ui/ios/sendme/sendme/AppError.swift b/ui/ios/sendme/sendme/AppError.swift new file mode 100644 index 0000000..2fa0168 --- /dev/null +++ b/ui/ios/sendme/sendme/AppError.swift @@ -0,0 +1,38 @@ +// +// AppError.swift +// sendme +// +// Created by Brendan O'Brien on 3/27/24. +// + +import Foundation + + +enum AppError: Error, Identifiable { + var id: String { localizedDescription } + + case invalidTicket(String) + case downloadFailed(String) +} + +extension AppError: LocalizedError { + var errorDescription: String? { + switch self { + case .invalidTicket(let error): + return NSLocalizedString(error, comment: "") + case .downloadFailed(let error): + return NSLocalizedString(error, comment: "") + } + } +} + +extension AppError { + var title: String { + switch self { + case .invalidTicket(_): + return NSLocalizedString("Invalid Ticket", comment: "") + case .downloadFailed(_): + return NSLocalizedString("Download Failed", comment: "") + } + } +} diff --git a/ui/ios/sendme/sendme/ContentView.swift b/ui/ios/sendme/sendme/ContentView.swift index a544a1d..de6844f 100644 --- a/ui/ios/sendme/sendme/ContentView.swift +++ b/ui/ios/sendme/sendme/ContentView.swift @@ -10,14 +10,14 @@ import SwiftUI struct ContentView: View { var body: some View { TabView { - Send() - .tabItem { - Label("Send", systemImage: "terminal") - } Receive() .tabItem { Label("Receive", systemImage: "macpro.gen2.fill") } + Send() + .tabItem { + Label("Send", systemImage: "terminal") + } } } } diff --git a/ui/ios/sendme/sendme/DocumentPicker.swift b/ui/ios/sendme/sendme/DocumentPicker.swift index da26698..a70300a 100644 --- a/ui/ios/sendme/sendme/DocumentPicker.swift +++ b/ui/ios/sendme/sendme/DocumentPicker.swift @@ -14,7 +14,7 @@ struct DocumentPicker: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> UIDocumentPickerViewController { let picker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.text, UTType.image, UTType.pdf, UTType.zip], asCopy: true) - picker.allowsMultipleSelection = false + picker.allowsMultipleSelection = true picker.delegate = context.coordinator return picker } diff --git a/ui/ios/sendme/sendme/Node.swift b/ui/ios/sendme/sendme/Node.swift index 7eaecc4..ffdb20d 100644 --- a/ui/ios/sendme/sendme/Node.swift +++ b/ui/ios/sendme/sendme/Node.swift @@ -13,7 +13,6 @@ class IrohNodeManager: ObservableObject { static let shared = IrohNodeManager() @Published var node: IrohNode? - @Published var nodeID: String = "" @Published var author: AuthorId? @Published var nodeStats: [String : CounterStats]? @Published var connections: [ConnectionInfoIdentifiable]? @@ -23,19 +22,33 @@ class IrohNodeManager: ObservableObject { private var timer: Timer? func start() { -// IrohLib.setLogLevel(level: .debug) - do { - try IrohLib.startMetricsCollection() - let path = self.irohPath() - print(path.absoluteString) - self.node = try IrohNode(path: path.path) - nodeID = node?.nodeId() ?? "" - startConnectionMonitoring() - startStatsMonitoring() - initAuthor() - print("created iroh node with node Id \(nodeID)") - } catch { - print("error creating iroh node \(error)") + Task { + let newNode = await self.startInner() + await MainActor.run { + self.node = newNode + startConnectionMonitoring() + startStatsMonitoring() + initAuthor() + } + } + } + + func startInner() async -> IrohNode? { + await withCheckedContinuation { continuation in + DispatchQueue.global(qos: .background).async { + // IrohLib.setLogLevel(level: .debug) + var node: IrohNode? + do { + try IrohLib.startMetricsCollection() + let path = self.irohPath() + print(path.absoluteString) + node = try IrohNode(path: path.path) + print("created iroh node with node Id \(node!.nodeId())") + } catch { + print("error creating iroh node \(error)") + } + continuation.resume(returning: node) + } } } diff --git a/ui/ios/sendme/sendme/Receive.swift b/ui/ios/sendme/sendme/Receive.swift index d26df81..37135a8 100644 --- a/ui/ios/sendme/sendme/Receive.swift +++ b/ui/ios/sendme/sendme/Receive.swift @@ -10,85 +10,142 @@ import SwiftUI import IrohLib import CodeScanner +enum ReceiveStep { + case configuring + case downloading + case finished +} + struct Receive: View { @EnvironmentObject var nodeManager: IrohNodeManager + @State private var step: ReceiveStep = .configuring + @State private var currentError: AppError? @State private var ticketString: String = "" @State private var showingQRScanner: Bool = false + private var progressManager: DownloadProgressManager = DownloadProgressManager() - var scannerSheet: some View { - CodeScannerView( - codeTypes: [.qr], - completion: { result in - if case let .success(code) = result { - self.ticketString = code.string - self.showingQRScanner = false - } - }) + var body: some View { + stepView } - var body: some View { - VStack(spacing: 5) { + private var stepView: some View { + switch step { + case .configuring: + return AnyView(self.configure()) + case .downloading: + return AnyView(self.downloading()) + case .finished: + return AnyView(self.finished()) + } + } + + private func configure() -> any View { + return AnyView(VStack(spacing: 5) { VStack { Text("Receive") .font(Font.custom("Space Mono", size: 32)) .foregroundColor(.primary) .frame(maxWidth: .infinity, alignment: .leading) - Text("choose a document to get started") + Text("download to your device") .font(Font.custom("Space Mono", size: 14)) .foregroundColor(.secondary) .frame(maxWidth: .infinity, alignment: .leading) }.padding(EdgeInsets(top: 0, leading: 20, bottom: 10, trailing: 20)) - - HStack{ + + VStack{ TextField("Paste Ticket", text: $ticketString, axis: .vertical) .textFieldStyle(.roundedBorder) .padding() - + Button("Download") { - do { - let node = self.nodeManager.node! - let cb = DownloadProgressManager() - try node.blobsDownloadTicket(ticket: ticketString, cb: cb) - } catch { - print("unknown error occurred") + step = .downloading + DispatchQueue.global(qos: .userInteractive).async { + defer { + step = .finished + } + + do { + let node = self.nodeManager.node! + + let ticket = try BlobTicket(ticket: ticketString) + if ticket.format() == BlobFormat.raw { + currentError = .invalidTicket("this is a 'raw' file ticket that links to data without a filename. sendme needs 'collection'-type tickets") + return + } + + try node.blobsDownload(req: ticket.asDownloadRequest(), cb: progressManager) + let blobs = try node.blobsGetCollection(hash: ticket.hash()).blobs() + for blob in blobs { + let data = try node.blobsReadToBytes(hash: blob.link) + saveFileToDocumentsDirectory(fileName: blob.name, data: data) + } + } catch let error { + currentError = .downloadFailed(error.localizedDescription) + } } } - + Button { showingQRScanner = true } label: { Image(systemName: "qrcode.viewfinder") } .sheet(isPresented: $showingQRScanner) { - self.scannerSheet + CodeScannerView( + codeTypes: [.qr], + completion: { result in + if case let .success(code) = result { + self.ticketString = code.string + self.showingQRScanner = false + } + }) + } + .alert(item: $currentError) { error in + Alert(title: Text(error.title), message: Text(error.localizedDescription), dismissButton: .default(Text("OK"))) } } - } + }) + } + + private func downloading() -> any View { + return AnyView(VStack { + Text("Downloading") + }.padding()) + } + + private func finished() -> any View { + return AnyView(VStack{ + Text("Done!") + Button("ok") { + self.ticketString = "" + step = .configuring + } + }.padding()) } } class DownloadProgressManager: DownloadCallback { + func progress(progress: DownloadProgress) throws { - print("progress: \(progress)") -// switch p.type() { + switch progress.type() { // case .foundLocal: -// <#code#> -// case .connected: -// <#code#> -// case .found: -// <#code#> +// debugPrint("found local: \(progress.asFound())") + case .found: + debugPrint("found: \(progress.asFound())") // case .foundHashSeq: -// <#code#> -// case .progress: -// <#code#> -// case .done: -// <#code#> -// case .allDone: -// <#code#> -// case .abort: -// <#code#> -// } +// debugPrint("found HashSeq: \(progress.asFound())") + case .progress: + debugPrint("progress: \(progress.asProgress())") + case .done: + debugPrint("found done: \(progress.asDone())") + case .allDone: + debugPrint("allDone: \(progress)") + case .abort: + debugPrint("abort: \(progress.asAbort())") + default: + debugPrint("unknown progress event: \(progress)") + } } } diff --git a/ui/ios/sendme/sendme/Send.swift b/ui/ios/sendme/sendme/Send.swift index 36f6e0c..6e91a86 100644 --- a/ui/ios/sendme/sendme/Send.swift +++ b/ui/ios/sendme/sendme/Send.swift @@ -7,6 +7,7 @@ import Foundation import SwiftUI +import IrohLib struct Send: View { @EnvironmentObject var nodeManager: IrohNodeManager @@ -16,7 +17,17 @@ struct Send: View { @State private var showingShareSheet: Bool = false var body: some View { - VStack { + VStack(spacing: 5) { + VStack { + Text("Send") + .font(Font.custom("Space Mono", size: 32)) + .foregroundColor(.primary) + .frame(maxWidth: .infinity, alignment: .leading) + Text("share file(s)") + .font(Font.custom("Space Mono", size: 14)) + .foregroundColor(.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + }.padding(EdgeInsets(top: 0, leading: 20, bottom: 10, trailing: 20)) Button("Pick a Document") { showingDocumentPicker = true } @@ -27,12 +38,24 @@ struct Send: View { do { let node = self.nodeManager.node! - let bytes = readFileContents(at: documentURLs.first!) - node.blobs - let res = try node.blobsAddBytes(bytes: bytes!) - ticket = try node.blobsShare(hash: res.hash, blobFormat: res.format) - print("generated blob ticket: \(ticket)") + let collection = Collection() + var tagsToDelete: [String] = [] + for url in urls { + let bytes = readFileContents(at: documentURLs.first!) + let res = try node.blobsAddBytes(bytes: bytes!) + + try collection.push(name: url.lastPathComponent, hash: res.hash) + + if let tag = String(data: res.tag, encoding: .utf8) { + tagsToDelete.append(tag) + } + } + print("created collection \(collection)") + + let res = try node.blobsCreateCollection(collection: collection, tag: SetTagOption.auto(), tagsToDelete: tagsToDelete) + ticket = try node.blobsShare(hash: res.hash, blobFormat: BlobFormat.hashSeq) + print("generated collection ticket: \(ticket)") self.showingDocumentPicker = false // Delay the presentation of the share sheet to let self.ticket change propagate diff --git a/ui/ios/sendme/sendme/sendmeApp.swift b/ui/ios/sendme/sendme/sendmeApp.swift index f27d285..0160011 100644 --- a/ui/ios/sendme/sendme/sendmeApp.swift +++ b/ui/ios/sendme/sendme/sendmeApp.swift @@ -15,7 +15,7 @@ struct sendmeApp: App { ContentView() .environmentObject(irohNodeManager) .onAppear() { - irohNodeManager.start() + irohNodeManager.start() } } } From b6d4d0cb7436ea9ddddaad4655f2e9e08605eb18 Mon Sep 17 00:00:00 2001 From: b5 Date: Wed, 27 Mar 2024 21:25:54 -0400 Subject: [PATCH 5/7] feat(ios): 'take me to files' after successful downlaod --- .../sendme/sendme.xcodeproj/project.pbxproj | 2 + .../UserInterfaceState.xcuserstate | Bin 51271 -> 39185 bytes ui/ios/sendme/sendme/Receive.swift | 50 ++++++++++++------ 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/ui/ios/sendme/sendme.xcodeproj/project.pbxproj b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj index 7dedeb6..7c78237 100644 --- a/ui/ios/sendme/sendme.xcodeproj/project.pbxproj +++ b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj @@ -473,6 +473,7 @@ DEVELOPMENT_TEAM = 7K8LD2955M; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_NSCameraUsageDescription = "Used to scan QR codes!"; INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "for sending files"; INFOPLIST_KEY_NSFileProviderDomainUsageDescription = wat; @@ -506,6 +507,7 @@ DEVELOPMENT_TEAM = 7K8LD2955M; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; INFOPLIST_KEY_NSCameraUsageDescription = "Used to scan QR codes!"; INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "for sending files"; INFOPLIST_KEY_NSFileProviderDomainUsageDescription = wat; diff --git a/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate index 22375300b13334d10fc7b8443f8e751dca712237..b83356feb4f5d2b5081d345a8eb79f83b79f797e 100644 GIT binary patch delta 18243 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

f*ZMhT(-# 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�Bv{e2@a925CTAkP);Av>D_8xj?^zZh>xt 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 diff --git a/ui/ios/sendme/sendme/Receive.swift b/ui/ios/sendme/sendme/Receive.swift index 37135a8..070b697 100644 --- a/ui/ios/sendme/sendme/Receive.swift +++ b/ui/ios/sendme/sendme/Receive.swift @@ -7,6 +7,7 @@ import Foundation import SwiftUI +import UIKit import IrohLib import CodeScanner @@ -25,7 +26,12 @@ struct Receive: View { private var progressManager: DownloadProgressManager = DownloadProgressManager() var body: some View { - stepView + VStack { + stepView + } + .alert(item: $currentError) { error in + Alert(title: Text(error.title), message: Text(error.localizedDescription), dismissButton: .default(Text("OK"))) + } } private var stepView: some View { @@ -74,12 +80,18 @@ struct Receive: View { return } - try node.blobsDownload(req: ticket.asDownloadRequest(), cb: progressManager) - let blobs = try node.blobsGetCollection(hash: ticket.hash()).blobs() - for blob in blobs { - let data = try node.blobsReadToBytes(hash: blob.link) - saveFileToDocumentsDirectory(fileName: blob.name, data: data) - } + try node.blobsDownload( + req: ticket.asDownloadRequest(), + cb: progressManager + ) + let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + print("exporting to: \(documentsDirectoryURL.relativePath)") + try node.blobsExport( + hash: ticket.hash(), + destination: documentsDirectoryURL.relativePath, + format: BlobExportFormat.collection, + mode: BlobExportMode.tryReference + ) } catch let error { currentError = .downloadFailed(error.localizedDescription) } @@ -101,15 +113,15 @@ struct Receive: View { } }) } - .alert(item: $currentError) { error in - Alert(title: Text(error.title), message: Text(error.localizedDescription), dismissButton: .default(Text("OK"))) - } } }) } private func downloading() -> any View { - return AnyView(VStack { + return AnyView(VStack(spacing: 5) { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .scaleEffect(1.5) Text("Downloading") }.padding()) } @@ -121,6 +133,14 @@ struct Receive: View { self.ticketString = "" step = .configuring } + Button("Show in Files App") { + if let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { + // Switch URL scheme to this psudo-documents "shareddocuments": + let url = URL(string: "shareddocuments://" + url.path())! + print("opening \(url)") + UIApplication.shared.open(url) + } + } }.padding()) } } @@ -129,12 +149,12 @@ class DownloadProgressManager: DownloadCallback { func progress(progress: DownloadProgress) throws { switch progress.type() { -// case .foundLocal: -// debugPrint("found local: \(progress.asFound())") + case .foundLocal: + debugPrint("found local: \(progress.asFoundLocal())") case .found: debugPrint("found: \(progress.asFound())") -// case .foundHashSeq: -// debugPrint("found HashSeq: \(progress.asFound())") + case .foundHashSeq: + debugPrint("found HashSeq: \(progress.asFoundHashSeq())") case .progress: debugPrint("progress: \(progress.asProgress())") case .done: From ab33a7c08d58c248fe1debb15f6290409092b160 Mon Sep 17 00:00:00 2001 From: b5 Date: Wed, 27 Mar 2024 23:03:49 -0400 Subject: [PATCH 6/7] feat(desktop): tauri desktop ui POC --- ui/desktop/.gitignore | 24 + ui/desktop/README.md | 7 + ui/desktop/index.html | 14 + ui/desktop/package-lock.json | 3170 ++++++++ ui/desktop/package.json | 31 + ui/desktop/postcss.config.js | 6 + ui/desktop/src-tauri/.gitignore | 7 + ui/desktop/src-tauri/Cargo.lock | 7038 +++++++++++++++++ ui/desktop/src-tauri/Cargo.toml | 24 + ui/desktop/src-tauri/build.rs | 3 + ui/desktop/src-tauri/icons/128x128.png | Bin 0 -> 3512 bytes ui/desktop/src-tauri/icons/128x128@2x.png | Bin 0 -> 7012 bytes ui/desktop/src-tauri/icons/32x32.png | Bin 0 -> 974 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2863 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 3858 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 3966 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 7737 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 903 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 8591 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1299 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2011 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2468 bytes ui/desktop/src-tauri/icons/StoreLogo.png | Bin 0 -> 1523 bytes ui/desktop/src-tauri/icons/icon.icns | Bin 0 -> 98451 bytes ui/desktop/src-tauri/icons/icon.ico | Bin 0 -> 86642 bytes ui/desktop/src-tauri/icons/icon.png | Bin 0 -> 14183 bytes ui/desktop/src-tauri/src/main.rs | 114 + ui/desktop/src-tauri/tauri.conf.json | 43 + ui/desktop/src/App.css | 7 + ui/desktop/src/App.tsx | 61 + ui/desktop/src/FileUpload.tsx | 107 + ui/desktop/src/main.tsx | 10 + ui/desktop/src/styles.css | 113 + ui/desktop/src/vite-env.d.ts | 1 + ui/desktop/tailwind.config.js | 12 + ui/desktop/tsconfig.json | 25 + ui/desktop/tsconfig.node.json | 10 + ui/desktop/vite.config.ts | 21 + 38 files changed, 10848 insertions(+) create mode 100644 ui/desktop/.gitignore create mode 100644 ui/desktop/README.md create mode 100644 ui/desktop/index.html create mode 100644 ui/desktop/package-lock.json create mode 100644 ui/desktop/package.json create mode 100644 ui/desktop/postcss.config.js create mode 100644 ui/desktop/src-tauri/.gitignore create mode 100644 ui/desktop/src-tauri/Cargo.lock create mode 100644 ui/desktop/src-tauri/Cargo.toml create mode 100644 ui/desktop/src-tauri/build.rs create mode 100644 ui/desktop/src-tauri/icons/128x128.png create mode 100644 ui/desktop/src-tauri/icons/128x128@2x.png create mode 100644 ui/desktop/src-tauri/icons/32x32.png create mode 100644 ui/desktop/src-tauri/icons/Square107x107Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square142x142Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square150x150Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square284x284Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square30x30Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square310x310Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square44x44Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square71x71Logo.png create mode 100644 ui/desktop/src-tauri/icons/Square89x89Logo.png create mode 100644 ui/desktop/src-tauri/icons/StoreLogo.png create mode 100644 ui/desktop/src-tauri/icons/icon.icns create mode 100644 ui/desktop/src-tauri/icons/icon.ico create mode 100644 ui/desktop/src-tauri/icons/icon.png create mode 100644 ui/desktop/src-tauri/src/main.rs create mode 100644 ui/desktop/src-tauri/tauri.conf.json create mode 100644 ui/desktop/src/App.css create mode 100644 ui/desktop/src/App.tsx create mode 100644 ui/desktop/src/FileUpload.tsx create mode 100644 ui/desktop/src/main.tsx create mode 100644 ui/desktop/src/styles.css create mode 100644 ui/desktop/src/vite-env.d.ts create mode 100644 ui/desktop/tailwind.config.js create mode 100644 ui/desktop/tsconfig.json create mode 100644 ui/desktop/tsconfig.node.json create mode 100644 ui/desktop/vite.config.ts diff --git a/ui/desktop/.gitignore b/ui/desktop/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/ui/desktop/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/ui/desktop/README.md b/ui/desktop/README.md new file mode 100644 index 0000000..102e366 --- /dev/null +++ b/ui/desktop/README.md @@ -0,0 +1,7 @@ +# Tauri + React + Typescript + +This template should help get you started developing with Tauri, React and Typescript in Vite. + +## Recommended IDE Setup + +- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) diff --git a/ui/desktop/index.html b/ui/desktop/index.html new file mode 100644 index 0000000..03abf55 --- /dev/null +++ b/ui/desktop/index.html @@ -0,0 +1,14 @@ + + + + + + + Tauri + React + TS + + + +

+ + + diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json new file mode 100644 index 0000000..9bc695e --- /dev/null +++ b/ui/desktop/package-lock.json @@ -0,0 +1,3170 @@ +{ + "name": "desktop", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "desktop", + "version": "0.0.0", + "dependencies": { + "@heroicons/react": "^2.1.3", + "@tauri-apps/api": "^1", + "classnames": "^2.5.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-qr-code": "^2.0.12" + }, + "devDependencies": { + "@tauri-apps/cli": "^1", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", + "typescript": "^5.0.2", + "vite": "^5.0.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@heroicons/react": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.3.tgz", + "integrity": "sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==", + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz", + "integrity": "sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.1.tgz", + "integrity": "sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.1.tgz", + "integrity": "sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.1.tgz", + "integrity": "sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.1.tgz", + "integrity": "sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.1.tgz", + "integrity": "sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.1.tgz", + "integrity": "sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.1.tgz", + "integrity": "sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.1.tgz", + "integrity": "sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.1.tgz", + "integrity": "sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.1.tgz", + "integrity": "sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.1.tgz", + "integrity": "sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.1.tgz", + "integrity": "sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.1.tgz", + "integrity": "sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tauri-apps/api": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.3.tgz", + "integrity": "sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==", + "engines": { + "node": ">= 14.6.0", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.11.tgz", + "integrity": "sha512-B475D7phZrq5sZ3kDABH4g2mEoUIHtnIO+r4ZGAAfsjMbZCwXxR/jlMGTEL+VO3YzjpF7gQe38IzB4vLBbVppw==", + "dev": true, + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "1.5.11", + "@tauri-apps/cli-darwin-x64": "1.5.11", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.5.11", + "@tauri-apps/cli-linux-arm64-gnu": "1.5.11", + "@tauri-apps/cli-linux-arm64-musl": "1.5.11", + "@tauri-apps/cli-linux-x64-gnu": "1.5.11", + "@tauri-apps/cli-linux-x64-musl": "1.5.11", + "@tauri-apps/cli-win32-arm64-msvc": "1.5.11", + "@tauri-apps/cli-win32-ia32-msvc": "1.5.11", + "@tauri-apps/cli-win32-x64-msvc": "1.5.11" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.11.tgz", + "integrity": "sha512-2NLSglDb5VfvTbMtmOKWyD+oaL/e8Z/ZZGovHtUFyUSFRabdXc6cZOlcD1BhFvYkHqm+TqGaz5qtPR5UbqDs8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.11.tgz", + "integrity": "sha512-/RQllHiJRH2fJOCudtZlaUIjofkHzP3zZgxi71ZUm7Fy80smU5TDfwpwOvB0wSVh0g/ciDjMArCSTo0MRvL+ag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.11.tgz", + "integrity": "sha512-IlBuBPKmMm+a5LLUEK6a21UGr9ZYd6zKuKLq6IGM4tVweQa8Sf2kP2Nqs74dMGIUrLmMs0vuqdURpykQg+z4NQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.11.tgz", + "integrity": "sha512-w+k1bNHCU/GbmXshtAhyTwqosThUDmCEFLU4Zkin1vl2fuAtQry2RN7thfcJFepblUGL/J7yh3Q/0+BCjtspKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.11.tgz", + "integrity": "sha512-PN6/dl+OfYQ/qrAy4HRAfksJ2AyWQYn2IA/2Wwpaa7SDRz2+hzwTQkvajuvy0sQ5L2WCG7ymFYRYMbpC6Hk9Pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.11.tgz", + "integrity": "sha512-MTVXLi89Nj7Apcvjezw92m7ZqIDKT5SFKZtVPCg6RoLUBTzko/BQoXYIRWmdoz2pgkHDUHgO2OMJ8oKzzddXbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.11.tgz", + "integrity": "sha512-kwzAjqFpz7rvTs7WGZLy/a5nS5t15QKr3E9FG95MNF0exTl3d29YoAUAe1Mn0mOSrTJ9Z+vYYAcI/QdcsGBP+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.11.tgz", + "integrity": "sha512-L+5NZ/rHrSUrMxjj6YpFYCXp6wHnq8c8SfDTBOX8dO8x+5283/vftb4vvuGIsLS4UwUFXFnLt3XQr44n84E67Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.11.tgz", + "integrity": "sha512-oVlD9IVewrY0lZzTdb71kNXkjdgMqFq+ohb67YsJb4Rf7o8A9DTlFds1XLCe3joqLMm4M+gvBKD7YnGIdxQ9vA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.11.tgz", + "integrity": "sha512-1CexcqUFCis5ypUIMOKllxUBrna09McbftWENgvVXMfA+SP+yPDPAVb8fIvUcdTIwR/yHJwcIucmTB4anww4vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.73", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", + "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", + "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.719", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.719.tgz", + "integrity": "sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/qr.js": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", + "integrity": "sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-qr-code": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/react-qr-code/-/react-qr-code-2.0.12.tgz", + "integrity": "sha512-k+pzP5CKLEGBRwZsDPp98/CAJeXlsYRHM2iZn1Sd5Th/HnKhIZCSg27PXO58zk8z02RaEryg+60xa4vyywMJwg==", + "dependencies": { + "prop-types": "^15.8.1", + "qr.js": "0.0.0" + }, + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x", + "react-native-svg": "*" + }, + "peerDependenciesMeta": { + "react-native-svg": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.1.tgz", + "integrity": "sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.1", + "@rollup/rollup-android-arm64": "4.13.1", + "@rollup/rollup-darwin-arm64": "4.13.1", + "@rollup/rollup-darwin-x64": "4.13.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.1", + "@rollup/rollup-linux-arm64-gnu": "4.13.1", + "@rollup/rollup-linux-arm64-musl": "4.13.1", + "@rollup/rollup-linux-riscv64-gnu": "4.13.1", + "@rollup/rollup-linux-s390x-gnu": "4.13.1", + "@rollup/rollup-linux-x64-gnu": "4.13.1", + "@rollup/rollup-linux-x64-musl": "4.13.1", + "@rollup/rollup-win32-arm64-msvc": "4.13.1", + "@rollup/rollup-win32-ia32-msvc": "4.13.1", + "@rollup/rollup-win32-x64-msvc": "4.13.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", + "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.36", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/ui/desktop/package.json b/ui/desktop/package.json new file mode 100644 index 0000000..fe4c615 --- /dev/null +++ b/ui/desktop/package.json @@ -0,0 +1,31 @@ +{ + "name": "desktop", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@heroicons/react": "^2.1.3", + "@tauri-apps/api": "^1", + "classnames": "^2.5.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-qr-code": "^2.0.12" + }, + "devDependencies": { + "@tauri-apps/cli": "^1", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", + "typescript": "^5.0.2", + "vite": "^5.0.0" + } +} diff --git a/ui/desktop/postcss.config.js b/ui/desktop/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/ui/desktop/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/ui/desktop/src-tauri/.gitignore b/ui/desktop/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/ui/desktop/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/ui/desktop/src-tauri/Cargo.lock b/ui/desktop/src-tauri/Cargo.lock new file mode 100644 index 0000000..172c64c --- /dev/null +++ b/ui/desktop/src-tauri/Cargo.lock @@ -0,0 +1,7038 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "bytes", + "crypto-common", + "generic-array", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-trait" +version = "0.1.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "attohttpc" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb8867f378f33f78a811a8eb9bf108ad99430d7aad43315dd9319c827ef6247" +dependencies = [ + "http 0.2.12", + "log", + "url", + "wildmatch", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.12", + "instant", + "rand 0.8.5", +] + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bao-tree" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdae307defb220bd2698a42495e226ff89e3173f024abfc2182129603e74b5c7" +dependencies = [ + "bytes", + "futures", + "genawaiter", + "iroh-blake3", + "iroh-io", + "positioned-io", + "range-collections", + "self_cell", + "smallvec", + "tokio", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "binary-merge" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bounded-integer" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78a6932c88f1d2c29533a3b8a5f5a2f84cc19c3339b431677c3160c5c2e6ca85" + +[[package]] +name = "brotli" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.8", +] + +[[package]] +name = "cc" +version = "1.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa50868b64a9a6fda9d593ce778849ea8715cd2a3d2cc17ffdb4a2f2f2f1961d" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chrono" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.4", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto_box" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009" +dependencies = [ + "aead", + "chacha20", + "crypto_secretbox", + "curve25519-dalek", + "salsa20", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto_secretbox" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" +dependencies = [ + "aead", + "chacha20", + "cipher", + "generic-array", + "poly1305", + "salsa20", + "subtle", + "zeroize", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.55", +] + +[[package]] +name = "ctor" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" +dependencies = [ + "quote", + "syn 2.0.55", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.55", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "data-encoding-macro" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "default-net" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba429d84a27fa854c66fd2e29eb1cdf6d38bbfd4495bd9f522f12a7f21e05bf" +dependencies = [ + "dlopen2", + "libc", + "memalloc", + "netlink-packet-core", + "netlink-packet-route", + "netlink-sys", + "once_cell", + "system-configuration", + "windows 0.48.0", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "der_derive", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0-beta.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7abbfc297053be59290e3152f8cbcd52c8642e0728b69ee187d991d4c1af08d" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0-beta.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bba3e9872d7c58ce7ef0fcf1844fcc3e23ef2a58377b50df35dd98e42a5726e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", + "unicode-xid", +] + +[[package]] +name = "desktop" +version = "0.0.0" +dependencies = [ + "anyhow", + "futures", + "iroh", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tokio", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +dependencies = [ + "dtoa", +] + +[[package]] +name = "duct" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ab5718d1224b63252cd0c6f74f6480f9ffeb117438a2e0f5cf6d9a4798929c" +dependencies = [ + "libc", + "once_cell", + "os_pipe", + "shared_child", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "embed-resource" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6985554d0688b687c5cb73898a34fbe3ad6c24c58c238a4d91d5e840670ee9d" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.8.12", + "vswhom", + "winreg 0.52.0", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "enumflags2" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "erased-serde" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +dependencies = [ + "serde", +] + +[[package]] +name = "erased_set" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5aa24577083f8190ad401e376b55887c7cd9083ae95d83ceec5d28ea78125" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin 0.9.8", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-buffered" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de8419e65098e54c06f5ae8a130a79e8ba2e391ff995d260ca5d77ea72ab2fe3" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags 1.3.2", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.2.2", + "x11", +] + +[[package]] +name = "genawaiter" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86bd0361bcbde39b13475e6e36cb24c329964aa2611be285289d1e4b751c1a0" +dependencies = [ + "futures-core", + "genawaiter-macro", + "genawaiter-proc-macro", + "proc-macro-hack", +] + +[[package]] +name = "genawaiter-macro" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" + +[[package]] +name = "genawaiter-proc-macro" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784f84eebc366e15251c4a8c3acee82a6a6f427949776ecb88377362a9621738" +dependencies = [ + "proc-macro-error 0.4.12", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate 1.3.1", + "proc-macro-error 1.0.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "governor" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +dependencies = [ + "cfg-if", + "dashmap", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot", + "portable-atomic", + "quanta", + "rand 0.8.5", + "smallvec", + "spinning_top", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags 1.3.2", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate 1.3.1", + "proc-macro-error 1.0.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "h2" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.3", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hickory-proto" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091a6fbccf4860009355e3efc52ff4acf37a63489aad7435372d44ceeb6fbbcf" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b8f021164e6a984c9030023544c57789c51760065cd510572fedcfb04164e8" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hmac-sha1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b05da5b9e5d4720bfb691eebb2b9d42da3570745da71eac8a1f5bb7e59aab88" +dependencies = [ + "hmac", + "sha1", +] + +[[package]] +name = "hmac-sha256" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3688e69b38018fec1557254f64c8dc2cc8ec502890182f395dbb0aa997aa5735" + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "hostname-validator" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2" + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.11", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.11", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa 1.0.11", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa 1.0.11", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.28", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.2.0", + "pin-project-lite", + "socket2", + "tokio", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "igd" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556b5a75cd4adb7c4ea21c64af1c48cefb2ce7d43dc4352c720a1fe47c21f355" +dependencies = [ + "attohttpc", + "bytes", + "futures", + "http 0.2.12", + "hyper 0.14.28", + "log", + "rand 0.8.5", + "tokio", + "url", + "xmltree", +] + +[[package]] +name = "ignore" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.6", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "infer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +dependencies = [ + "cfb", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "inplace-vec-builder" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf64c2edc8226891a71f127587a2861b132d2b942310843814d5001d99a1d307" +dependencies = [ + "smallvec", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2", + "widestring", + "windows-sys 0.48.0", + "winreg 0.50.0", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "iroh" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c46992b13a213db99405399d93ca741a0d25f9aadcf1b9fd27f7ab03c383ce1d" +dependencies = [ + "anyhow", + "bao-tree", + "bytes", + "data-encoding", + "derive_more 1.0.0-beta.6", + "flume", + "futures", + "genawaiter", + "hashlink", + "hex", + "iroh-base", + "iroh-bytes", + "iroh-gossip", + "iroh-io", + "iroh-metrics", + "iroh-net", + "iroh-sync", + "num_cpus", + "once_cell", + "parking_lot", + "portable-atomic", + "postcard", + "quic-rpc", + "quinn", + "rand 0.8.5", + "range-collections", + "serde", + "strum", + "tempfile", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "walkdir", +] + +[[package]] +name = "iroh-base" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5892623f5c5b2cf00c29c248338e0dd228c76bbe8d64bfa9f30630377e4c4c06" +dependencies = [ + "aead", + "anyhow", + "bao-tree", + "crypto_box", + "data-encoding", + "derive_more 1.0.0-beta.6", + "ed25519-dalek", + "hex", + "multibase", + "once_cell", + "postcard", + "rand 0.8.5", + "rand_core 0.6.4", + "redb", + "serde", + "serde-error", + "ssh-key", + "thiserror", + "ttl_cache", + "url", + "zeroize", +] + +[[package]] +name = "iroh-blake3" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eb52cd11b3de4407f29579ebcd10fd746b0bd8ab758a2afac69baf88e96bede" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "iroh-bytes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8fb3c7d9b7ccedd459ea3425c4bdc75961d95e009eec817f0126e1658f07f08" +dependencies = [ + "anyhow", + "bao-tree", + "bytes", + "chrono", + "data-encoding", + "derive_more 1.0.0-beta.6", + "flume", + "futures", + "futures-buffered", + "genawaiter", + "hex", + "iroh-base", + "iroh-io", + "iroh-metrics", + "iroh-net", + "num_cpus", + "once_cell", + "parking_lot", + "postcard", + "quinn", + "rand 0.8.5", + "range-collections", + "redb", + "reflink-copy", + "self_cell", + "serde", + "serde-error", + "smallvec", + "thiserror", + "tokio", + "tokio-util", + "tracing", + "tracing-futures", +] + +[[package]] +name = "iroh-gossip" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb4feb48b6127ed6077eca0abeea0119d6777723f041ad95de70273733767dd" +dependencies = [ + "anyhow", + "bytes", + "data-encoding", + "derive_more 1.0.0-beta.6", + "ed25519-dalek", + "futures", + "genawaiter", + "indexmap 2.2.6", + "iroh-base", + "iroh-blake3", + "iroh-metrics", + "iroh-net", + "once_cell", + "postcard", + "quinn", + "rand 0.8.5", + "rand_core 0.6.4", + "serde", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "iroh-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd67e386f948a6f09e71057b48fff51b6414f0080997495b5bdf2d1bdcdbe46" +dependencies = [ + "bytes", + "futures", + "pin-project", + "smallvec", + "tokio", +] + +[[package]] +name = "iroh-metrics" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b29ecbd3a1581e5b73c59cdff20225690f5eed32f293728563a0d06c2c91fe" +dependencies = [ + "anyhow", + "erased_set", + "http-body-util", + "hyper 1.2.0", + "hyper-util", + "once_cell", + "prometheus-client", + "reqwest", + "serde", + "struct_iterable", + "time", + "tokio", + "tracing", +] + +[[package]] +name = "iroh-net" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d4ef2660b04e61525a140fe9f12cdfdcfc483d0b28cb81022df4f203947d4b" +dependencies = [ + "aead", + "anyhow", + "backoff", + "bytes", + "curve25519-dalek", + "data-encoding", + "default-net", + "der", + "derive_more 1.0.0-beta.6", + "duct", + "flume", + "futures", + "governor", + "hex", + "hickory-resolver", + "hostname", + "http 1.1.0", + "http-body-util", + "hyper 1.2.0", + "hyper-util", + "igd", + "iroh-base", + "iroh-metrics", + "libc", + "netlink-packet-core", + "netlink-packet-route", + "netlink-sys", + "num_enum 0.7.2", + "once_cell", + "parking_lot", + "postcard", + "quinn", + "quinn-proto", + "quinn-udp", + "rand 0.8.5", + "rand_core 0.6.4", + "rcgen", + "reqwest", + "ring 0.17.8", + "rtnetlink", + "rustls", + "rustls-webpki", + "serde", + "serde_bytes", + "serdect", + "smallvec", + "socket2", + "strum", + "stun-rs", + "surge-ping", + "thiserror", + "time", + "tokio", + "tokio-rustls", + "tokio-rustls-acme", + "tokio-util", + "tracing", + "url", + "watchable", + "webpki-roots", + "windows 0.51.1", + "wmi", + "x509-parser", +] + +[[package]] +name = "iroh-sync" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faed96a7006f52890b13cf579669dc157b5bac4e65dfdc9e80ff1cbcddfb1e78" +dependencies = [ + "anyhow", + "bytes", + "data-encoding", + "derive_more 1.0.0-beta.6", + "ed25519-dalek", + "flume", + "futures", + "hex", + "iroh-base", + "iroh-blake3", + "iroh-metrics", + "iroh-net", + "lru", + "num_enum 0.7.2", + "once_cell", + "ouroboros", + "parking_lot", + "postcard", + "quinn", + "rand 0.8.5", + "rand_core 0.6.4", + "redb", + "serde", + "strum", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +dependencies = [ + "serde", + "serde_json", + "thiserror", + "treediff", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 1.9.3", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.5.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "line-wrap" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1bc4d24ad230d21fb898d1116b1801d7adfc449d42026475862ab48b11e70e" + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.3", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + +[[package]] +name = "memalloc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df39d232f5c40b0891c10216992c2f250c054105cb1e56f0fc9032db6203ecc1" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.12", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum 0.5.11", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "netlink-packet-core" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +dependencies = [ + "anyhow", + "byteorder", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b33524dc0968bfad349684447bfce6db937a9ac3332a1fe60c0c5a5ce63f21" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + +[[package]] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "open" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" +dependencies = [ + "pathdiff", + "windows-sys 0.42.0", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "os_pipe" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "ouroboros" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b7be5a8a3462b752f4be3ff2b2bf2f7f1d00834902e46be2a4d68b87b0573c" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b645dcde5f119c2c454a92d0dfa271a2a3b205da92e4292a68ead4bdbfde1f33" +dependencies = [ + "heck 0.4.1", + "itertools", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core 0.6.4", + "sha2", +] + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags 1.3.2", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "pem" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b13fe415cdf3c8e44518e18a7c95a13431d9bdf6d15367d82b23c377fdd441a" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pem" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "pest_meta" +version = "2.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros 0.11.2", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "platforms" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" + +[[package]] +name = "plist" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9d34169e64b3c7a80c8621a48adaf44e0cf62c78a9b25dd9dd35f1881a17cf9" +dependencies = [ + "base64 0.21.7", + "indexmap 2.2.6", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "pnet_base" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cf6fb3ab38b68d01ab2aea03ed3d1132b4868fa4e06285f29f16da01c5f4c" +dependencies = [ + "no-std-net", +] + +[[package]] +name = "pnet_macros" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688b17499eee04a0408aca0aa5cba5fc86401d7216de8a63fdf7a4c227871804" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.55", +] + +[[package]] +name = "pnet_macros_support" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea925b72f4bd37f8eab0f221bbe4c78b63498350c983ffa9dd4bcde7e030f56" +dependencies = [ + "pnet_base", +] + +[[package]] +name = "pnet_packet" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a005825396b7fe7a38a8e288dbc342d5034dac80c15212436424fef8ea90ba" +dependencies = [ + "glob", + "pnet_base", + "pnet_macros", + "pnet_macros_support", +] + +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "positioned-io" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccabfeeb89c73adf4081f0dca7f8e28dbda90981a222ceea37f619e93ea6afe9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "postcard" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" +dependencies = [ + "cobs", + "const_format", + "embedded-io", + "postcard-derive", + "serde", +] + +[[package]] +name = "postcard-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4b01218787dd4420daf63875163a787a78294ad48a24e9f6fa8c6507759a79" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precis-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d73e9dd26361c32e7cd13d1032bb01c4e26a23287274e8a4e2f228cf2c9ff77b" +dependencies = [ + "precis-tools", + "ucd-parse", + "unicode-normalization", +] + +[[package]] +name = "precis-profiles" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde4bd6624c60cb0abe2bea1dbdbb9085f629a853861e64df4abb099f8076ad4" +dependencies = [ + "lazy_static", + "precis-core", + "precis-tools", + "unicode-normalization", +] + +[[package]] +name = "precis-tools" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07ecadec70b0f560f09abf815ae0ee1a940d38d2354c938ba7229ac7c9f5f52" +dependencies = [ + "lazy_static", + "regex", + "ucd-parse", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro-error" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f33027081eba0a6d8aba6d1b1c3a3be58cbb12106341c2d5759fcd9b5277e7" +dependencies = [ + "proc-macro-error-attr 0.4.12", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr 1.0.4", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a5b4b77fdb63c1eca72173d68d24501c54ab1269409f6b672c85deb18af69de" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "syn-mid", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", + "version_check", + "yansi", +] + +[[package]] +name = "prometheus-client" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ca959da22a332509f2a73ae9e5f23f9dcfc31fd3a54d71f159495bd5909baa" +dependencies = [ + "dtoa", + "itoa 1.0.11", + "parking_lot", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "quanta" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca0b7bac0b97248c40bb77288fc52029cf1459c0461ea1b05ee32ccf011de2c" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + +[[package]] +name = "quic-rpc" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d960d0b328db80274cbcbaf4bf53728eff1f43df4fc36c34eb79a97753c7d9" +dependencies = [ + "bincode", + "educe", + "flume", + "futures", + "pin-project", + "quinn", + "serde", + "tokio", + "tokio-serde", + "tokio-util", + "tracing", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quoted-string-parser" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc75379cdb451d001f1cb667a9f74e8b355e9df84cc5193513cbe62b96fc5e9" +dependencies = [ + "pest", + "pest_derive", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.12", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "range-collections" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca9edd21e2db51000ac63eccddabba622f826e631a60be7bade9bd6a76b69537" +dependencies = [ + "binary-merge", + "inplace-vec-builder", + "ref-cast", + "smallvec", +] + +[[package]] +name = "raw-cpuid" +version = "11.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "rcgen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c4f3084aa3bc7dfbba4eff4fab2a54db4324965d8872ab933565e6fbd83bc6" +dependencies = [ + "pem 3.0.3", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redb" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7f82ecd6ba647a39dd1a7172b8a1cd9453c0adee6da20cb553d83a9a460fa5" +dependencies = [ + "libc", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom 0.2.12", + "libredox", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "reflink-copy" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b1349400e2ffd64a9fb5ed9008e33c0b8ef86bd5bae8f73080839c7082f1d5" +dependencies = [ + "cfg-if", + "rustix", + "windows 0.54.0", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.3", +] + +[[package]] +name = "regex-lite" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg 0.50.0", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.12", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rtnetlink" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" +dependencies = [ + "futures", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-packet-utils", + "netlink-proto", + "netlink-sys", + "nix", + "thiserror", + "tokio", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more 0.99.17", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "self_cell" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-error" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e988182713aeed6a619a88bca186f6d6407483485ffe44c869ee264f8eabd13f" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "serde_json" +version = "1.0.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +dependencies = [ + "indexmap 2.2.6", + "itoa 1.0.11", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.11", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +dependencies = [ + "base64 0.21.7", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_child" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags 1.3.2", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ssh-cipher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" +dependencies = [ + "cipher", + "ssh-encoding", +] + +[[package]] +name = "ssh-encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" +dependencies = [ + "base64ct", + "pem-rfc7468", + "sha2", +] + +[[package]] +name = "ssh-key" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b71299a724c8d84956caaf8fc3b3ea57c3587fe2d0b800cd0dc1f3599905d7e" +dependencies = [ + "ed25519-dalek", + "p256", + "p384", + "p521", + "rand_core 0.6.4", + "rsa", + "sec1", + "sha2", + "signature", + "ssh-cipher", + "ssh-encoding", + "subtle", + "zeroize", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "struct_iterable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "849a064c6470a650b72e41fa6c057879b68f804d113af92900f27574828e7712" +dependencies = [ + "struct_iterable_derive", + "struct_iterable_internal", +] + +[[package]] +name = "struct_iterable_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb939ce88a43ea4e9d012f2f6b4cc789deb2db9d47bad697952a85d6978662c" +dependencies = [ + "erased-serde", + "proc-macro2", + "quote", + "struct_iterable_internal", + "syn 2.0.55", +] + +[[package]] +name = "struct_iterable_internal" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9426b2a0c03e6cc2ea8dbc0168dbbf943f88755e409fb91bcb8f6a268305f4a" + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.55", +] + +[[package]] +name = "stun-rs" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0adebf9fb8fba5c39ee34092b0383f247e4d1255b98fcffec94b4b797b85b677" +dependencies = [ + "base64 0.22.0", + "bounded-integer", + "byteorder", + "crc", + "enumflags2", + "fallible-iterator", + "hmac-sha1", + "hmac-sha256", + "hostname-validator", + "lazy_static", + "md5", + "paste", + "precis-core", + "precis-profiles", + "quoted-string-parser", + "rand 0.8.5", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "surge-ping" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbf95ce4c7c5b311d2ce3f088af2b93edef0f09727fa50fbe03c7a979afce77" +dependencies = [ + "hex", + "parking_lot", + "pnet_packet", + "rand 0.8.5", + "socket2", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-mid" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea305d57546cc8cd04feb14b62ec84bf17f50e3f7b12560d7bfa9265f39d9ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr 0.15.7", + "heck 0.5.0", + "pkg-config", + "toml 0.8.12", + "version-compare 0.2.0", +] + +[[package]] +name = "tao" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26a794e476ce829420b58059f4ac23c2b991dab2ee552be740f931aea95ae9c8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement 0.39.0", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tar" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + +[[package]] +name = "tauri" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f078117725e36d55d29fafcbb4b1e909073807ca328ae8deb8c0b3843aac0fed" +dependencies = [ + "anyhow", + "cocoa", + "dirs-next", + "dunce", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.4.1", + "http 0.2.12", + "ignore", + "objc", + "once_cell", + "open", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "regex", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs-next", + "heck 0.4.1", + "json-patch", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" +dependencies = [ + "base64 0.21.7", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "regex", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76" +dependencies = [ + "gtk", + "http 0.2.12", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "067c56fc153b3caf406d7cd6de4486c80d1d66c0f414f39e94cb2f5543f6445f" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ad0bbb31fccd1f4c56275d0a5c3abdf1f59999f72cb4ef8b79b4ed42082a21" +dependencies = [ + "brotli", + "ctor", + "dunce", + "glob", + "heck 0.4.1", + "html5ever", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.2", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows-version", +] + +[[package]] +name = "tauri-winres" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +dependencies = [ + "embed-resource", + "toml 0.7.8", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "itoa 1.0.11", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-rustls-acme" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfb6f50b5523d014ba161512c37457acb16fd8218c883c7152e0a67ab763f2d4" +dependencies = [ + "async-trait", + "base64 0.21.7", + "chrono", + "futures", + "log", + "pem 2.0.1", + "rcgen", + "reqwest", + "ring 0.16.20", + "rustls", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-rustls", + "url", + "webpki-roots", + "x509-parser", +] + +[[package]] +name = "tokio-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +dependencies = [ + "bincode", + "bytes", + "educe", + "futures-core", + "futures-sink", + "pin-project", + "serde", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "hashbrown 0.14.3", + "pin-project-lite", + "slab", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.9", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.5", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" +dependencies = [ + "serde_json", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttl_cache" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4189890526f0168710b6ee65ceaedf1460c48a14318ceec933cb26baa492096a" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-parse" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06ff81122fcbf4df4c1660b15f7e3336058e7aec14437c9f85c6b31a0f279b9" +dependencies = [ + "regex-lite", +] + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna 0.5.0", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +dependencies = [ + "getrandom 0.2.12", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.55", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "watchable" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45b42a2f611916b5965120a9cde2b60f2db4454826dd9ad5e6f47c24a5b3b259" +dependencies = [ + "event-listener", + "futures-util", + "parking_lot", + "thiserror", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement 0.39.0", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + +[[package]] +name = "wildmatch" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement 0.39.0", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core 0.51.1", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-implement 0.52.0", + "windows-interface", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-implement" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "windows-interface" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-result" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd19df78e5168dfb0aedc343d1d1b8d422ab2db6756d2dc3fef75035402a3f64" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[package]] +name = "windows-version" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wmi" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f0a4062ca522aad4705a2948fd4061b3857537990202a8ddd5af21607f79a" +dependencies = [ + "chrono", + "futures", + "log", + "serde", + "thiserror", + "windows 0.52.0", +] + +[[package]] +name = "wry" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http 0.2.12", + "kuchikiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement 0.39.0", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x509-parser" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "xml-rs" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/ui/desktop/src-tauri/Cargo.toml b/ui/desktop/src-tauri/Cargo.toml new file mode 100644 index 0000000..45a30c3 --- /dev/null +++ b/ui/desktop/src-tauri/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "desktop" +version = "0.0.0" +description = "A Tauri App" +authors = ["you"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1", features = [] } + +[dependencies] +tauri = { version = "1", features = ["shell-open"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +iroh = "0.13.0" +anyhow = "1.0.81" +futures = "0.3.30" +tokio = "1.36.0" + +[features] +# This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! +custom-protocol = ["tauri/custom-protocol"] diff --git a/ui/desktop/src-tauri/build.rs b/ui/desktop/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/ui/desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/ui/desktop/src-tauri/icons/128x128.png b/ui/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b GIT binary patch literal 3512 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 literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/128x128@2x.png b/ui/desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e81becee571e96f76aa5667f9324c05e5e7a4479 GIT binary patch literal 7012 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 Sh@|Ye~|0>}wMPLT8jm@Y!H33Sz}5aFI6 zM9Lzqz|;A*0sGs=2A1uU!1nk2dGF7knQwr99SAFen)x(eCO;F8y2C~0FD1YxRTPcy zPWVxkUYmeuz}Tv?7&Fe-!UE{)ZW)Mb;H)^#eHDv$`dkZGguJz@^MA!ZNGAUqt{|0H zpZ7Ch9S`q5!>R%}>}62!+(T^evyO+ImSo2wpu)su4^3nw5(%)KD%gbSev^*HZZ&3( z#&c@Z0gH|}Ck)w6fh0&NBJ62ib%R}(3@$VFl*_#l2W$wQ-~4RmZZAt5O*^2Q5}Xr8Hy@c`#pM?kc?hFWxRXr*mUfUCXf4ka5DD~ zat6d85COB05l#(P9*cQZ3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI` z{$e^Nw1y*VbO8wv`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M> zkD~88ry`eSo`tEBN4>w7OWZwUzlh{WM1m8R6zepqGcGMaV7vWY9b?K4b6~|HVG)ec wi>I@ws#sZo7or4_*4M>7;p5{nr2pZ?Uu4>Krr0kU)&Kwi07*qoM6N<$f)&@lf&c&j literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/Square107x107Logo.png b/ui/desktop/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca4f27198838968bd60ed7d371bfa23496b7fe5 GIT binary patch literal 2863 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 Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/Square284x284Logo.png b/ui/desktop/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c021d2ba76619c08969ab688db3b27f29257aa6f GIT binary patch literal 7737 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 literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/Square30x30Logo.png b/ui/desktop/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..621970023096ed9f494ba18ace15421a45cd65fa GIT binary patch literal 903 zcmV;219<$2P)2 z+CUKPMqaqGiH;zb!R4$B-WXS^YzQr=@UH>k4?*L)&R=zYjBrZenKdc9|JlS$SO*RJ zKt8FSTDAdk1g_WPAO!p^V!AuL;Lm;uQyV;zKq)J3i(;q*;k+pD%f3eltU`PYdy9(k0&%` zuWAPcV6|-y?|?7O1W!KSK}pbk8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2ZVS- zKn8ENRkZ*sb!@QugOrQNK3(sy1v%J#m|rpB+h|Nkqa3FRT>74xSs{#&saU2Lf!_Iq zKmuKAESh`gs!fneGWn+nf}l?7jE$HW!Af&vE5=G!QU)U2v&HLIBGXKk4nQx{hsHjL zLPMAo5=*uInFbq7(aa`Y2VX5wCmaeqvECOFv)a>0t>ZaEb*cJccER=BB?KFZhV$c^ znL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto* z93wr)%3m%|#OZ~srm>zF(JvDuTq*@;d&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@

jU?lMi@tgxr7CqX_r3uw^y4tVU3Pm0sw;|1WSUO%?=bG`*Kmz6u4{#ti;T7AWIBAEh!(Y zz>O01&#X?Ds@L)Sb{CkG#Yz4$3o d@96)?#cz^xWoA}>B$xmI002ovPDHLkV1l3&k#zt7 literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/Square310x310Logo.png b/ui/desktop/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc04839491e66c07b16ab03743c0c53b4109cc GIT binary patch literal 8591 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 JPDHLkV1lm|RXG3v literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/Square71x71Logo.png b/ui/desktop/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63440d7984936a9caa89275928d8dce97e4d033b GIT binary patch literal 2011 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∓t$dRJGIadE?vc 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 Kx8Vjl{{H|h@<;Lj literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/icon.ico b/ui/desktop/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/ui/desktop/src-tauri/icons/icon.png b/ui/desktop/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6 GIT binary patch literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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 + +// setup an iroh node +async fn setup(handle: tauri::AppHandle) -> Result<()> { + // get the application data root, join with "iroh_data" to get the data root for the iroh node + let data_root = handle + .path_resolver() + .app_data_dir() + .ok_or_else(|| anyhow!("can't get application data directory"))? + .join("iroh_data"); + + // create the iroh node + let node = iroh::node::Node::persistent(data_root) + .await? + .spawn() + .await?; + handle.manage(AppState::new(node)); + + Ok(()) +} + +struct AppState { + iroh: IrohNode, +} + +impl AppState { + fn new(iroh: IrohNode) -> Self { + AppState { iroh } + } + + fn iroh(&self) -> iroh::client::mem::Iroh { + self.iroh.client().clone() + } +} + +fn main() { + tauri::Builder::default() + .setup(|app| { + let handle = app.handle(); + #[cfg(debug_assertions)] // only include this code on debug builds + { + let window = app.get_window("main").unwrap(); + window.open_devtools(); + } + + tauri::async_runtime::spawn(async move { + println!("starting backend..."); + if let Err(err) = setup(handle).await { + eprintln!("failed: {:?}", err); + } + }); + + Ok(()) + }) + .invoke_handler(tauri::generate_handler![send]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} + +#[tauri::command] +async fn send(files: Vec, state: tauri::State<'_, AppState>) -> Result { + let client = state.iroh(); + let mut collection = BTreeMap::new(); + let mut tags_to_delete = Vec::new(); + for file in files { + let path: PathBuf = file.clone().into(); + let res = client + .blobs + .add_from_path( + path, + false, + iroh::rpc_protocol::SetTagOption::Auto, + iroh::rpc_protocol::WrapOption::NoWrap, + ) + .await + .map_err(|e| e.to_string())? + .finish() + .await + .map_err(|e| e.to_string())?; + tags_to_delete.push(res.tag); + collection.insert(file, res.hash); + } + let collection = iroh::bytes::format::collection::Collection::from_iter(collection.into_iter()); + let (hash, _) = client + .blobs + .create_collection( + collection, + iroh::rpc_protocol::SetTagOption::Auto, + tags_to_delete, + ) + .await + .map_err(|e| e.to_string())?; + let ticket = client + .blobs + .share( + hash, + iroh::bytes::BlobFormat::HashSeq, + iroh::client::ShareTicketOptions::RelayAndAddresses, + ) + .await + .map_err(|e| e.to_string())?; + + Ok(ticket.to_string()) +} diff --git a/ui/desktop/src-tauri/tauri.conf.json b/ui/desktop/src-tauri/tauri.conf.json new file mode 100644 index 0000000..d96c7b5 --- /dev/null +++ b/ui/desktop/src-tauri/tauri.conf.json @@ -0,0 +1,43 @@ +{ + "build": { + "beforeDevCommand": "npm run dev", + "beforeBuildCommand": "npm run build", + "devPath": "http://localhost:1420", + "distDir": "../dist" + }, + "package": { + "productName": "desktop", + "version": "0.0.0" + }, + "tauri": { + "allowlist": { + "all": false, + "shell": { + "all": false, + "open": true + } + }, + "windows": [ + { + "title": "desktop", + "width": 800, + "height": 600 + } + ], + "security": { + "csp": null + }, + "bundle": { + "active": true, + "targets": "all", + "identifier": "com.tauri.dev", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } + } +} diff --git a/ui/desktop/src/App.css b/ui/desktop/src/App.css new file mode 100644 index 0000000..a89ebd1 --- /dev/null +++ b/ui/desktop/src/App.css @@ -0,0 +1,7 @@ +.logo.vite:hover { + filter: drop-shadow(0 0 2em #747bff); +} + +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafb); +} diff --git a/ui/desktop/src/App.tsx b/ui/desktop/src/App.tsx new file mode 100644 index 0000000..4e3fbad --- /dev/null +++ b/ui/desktop/src/App.tsx @@ -0,0 +1,61 @@ +import { useEffect, useState } from "react"; +import { invoke } from "@tauri-apps/api/tauri"; +import { listen } from '@tauri-apps/api/event' +import QRCode from "react-qr-code"; + +import "./App.css"; +import FileUpload from "./FileUpload"; + +function App() { + const [ticket, setTicket] = useState(""); + const [files, setFiles] = useState(null) + + useEffect(() => { + listen("tauri://file-drop", (event) => { + setFiles(event.payload as FileList) + }); + }, [listen]); + + async function get_ticket() { + // Learn more about Tauri commands at https://tauri.app/v1/guides/features/command + const result: string = await invoke("send", { files }); + console.log(result); + setTicket(result); + } + + if (ticket === "") { + return ( +

+ ); + } + + return ( +
+ +
+ ); +} + +export default App; diff --git a/ui/desktop/src/FileUpload.tsx b/ui/desktop/src/FileUpload.tsx new file mode 100644 index 0000000..fb7201e --- /dev/null +++ b/ui/desktop/src/FileUpload.tsx @@ -0,0 +1,107 @@ +import { XMarkIcon, PhotoIcon } from "@heroicons/react/24/outline" +import classNames from "classnames" +import React from "react" + +export interface FileUploadProps { + onChange: (files: FileList | null) => void + files: FileList | null + validation?: (v: FileList | null) => string | undefined + showValidation?: boolean +} + +export default function FileUpload(props: FileUploadProps) { + const { onChange, files, validation, showValidation } = props + const validationMessage = validation ? validation(files) : undefined + const valid = validationMessage === undefined + + // drag state + const [dragActive, setDragActive] = React.useState(false) + + // handle drag events + const handleDrag = (e: React.DragEvent) => { + e.preventDefault() + e.stopPropagation() + if (e.type === "dragenter" || e.type === "dragover") { + setDragActive(true) + } else if (e.type === "dragleave") { + setDragActive(false) + } + } + + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault() + e.stopPropagation() + } + + // triggers when file is dropped + const handleDrop = (e: React.DragEvent) => { + e.preventDefault() + e.stopPropagation() + setDragActive(false) + onChange(e.dataTransfer.files) + } + + return ( +
+ {files?.length && ( +
+ ) +} diff --git a/ui/desktop/src/main.tsx b/ui/desktop/src/main.tsx new file mode 100644 index 0000000..81da346 --- /dev/null +++ b/ui/desktop/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; +import "./styles.css"; + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + , +); diff --git a/ui/desktop/src/styles.css b/ui/desktop/src/styles.css new file mode 100644 index 0000000..c3ffcdd --- /dev/null +++ b/ui/desktop/src/styles.css @@ -0,0 +1,113 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color: #0f0f0f; + background-color: #f6f6f6; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +.container { + margin: 0; + padding-top: 10vh; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: 0.75s; +} + +.logo.tauri:hover { + filter: drop-shadow(0 0 2em #24c8db); +} + +.row { + display: flex; + justify-content: center; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +h1 { + text-align: center; +} + +input, +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + color: #0f0f0f; + background-color: #ffffff; + transition: border-color 0.25s; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); +} + +button { + cursor: pointer; +} + +button:hover { + border-color: #396cd8; +} +button:active { + border-color: #396cd8; + background-color: #e8e8e8; +} + +input, +button { + outline: none; +} + +#greet-input { + margin-right: 5px; +} + +@media (prefers-color-scheme: dark) { + :root { + color: #f6f6f6; + background-color: #2f2f2f; + } + + a:hover { + color: #24c8db; + } + + input, + button { + color: #ffffff; + background-color: #0f0f0f98; + } + button:active { + background-color: #0f0f0f69; + } +} diff --git a/ui/desktop/src/vite-env.d.ts b/ui/desktop/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/ui/desktop/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/ui/desktop/tailwind.config.js b/ui/desktop/tailwind.config.js new file mode 100644 index 0000000..d37737f --- /dev/null +++ b/ui/desktop/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +} + diff --git a/ui/desktop/tsconfig.json b/ui/desktop/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/ui/desktop/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/ui/desktop/tsconfig.node.json b/ui/desktop/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/ui/desktop/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/ui/desktop/vite.config.ts b/ui/desktop/vite.config.ts new file mode 100644 index 0000000..0c9adff --- /dev/null +++ b/ui/desktop/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig(async () => ({ + plugins: [react()], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + watch: { + // 3. tell vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +})); From 4964ddc90a2d81740a7f4c4ed85dc1876edb8c54 Mon Sep 17 00:00:00 2001 From: b5 Date: Fri, 29 Mar 2024 09:53:47 -0400 Subject: [PATCH 7/7] WIP: alright, just working on both at the same time now --- ui/desktop/package-lock.json | 88 +++++++++++ ui/desktop/package.json | 2 + ui/desktop/src-tauri/Cargo.lock | 2 + ui/desktop/src-tauri/Cargo.toml | 2 + ui/desktop/src-tauri/src/main.rs | 144 +++++++++++++++++- ui/desktop/src/App.tsx | 104 +++++++------ ui/desktop/src/Receive.tsx | 20 +++ ui/desktop/src/Send.tsx | 74 +++++++++ .../sendme/sendme.xcodeproj/project.pbxproj | 12 ++ .../UserInterfaceState.xcuserstate | Bin 39185 -> 74399 bytes ui/ios/sendme/sendme/AppError.swift | 5 + ui/ios/sendme/sendme/DocumentPicker.swift | 3 +- ui/ios/sendme/sendme/ImageView.swift | 18 +++ ui/ios/sendme/sendme/ProgressBarView.swift | 28 ++++ ui/ios/sendme/sendme/Receive.swift | 142 ++++++++++------- ui/ios/sendme/sendme/Send.swift | 97 +++++++++++- ui/ios/sendme/sendme/util.swift | 19 +++ 17 files changed, 644 insertions(+), 116 deletions(-) create mode 100644 ui/desktop/src/Receive.tsx create mode 100644 ui/desktop/src/Send.tsx create mode 100644 ui/ios/sendme/sendme/ImageView.swift create mode 100644 ui/ios/sendme/sendme/ProgressBarView.swift create mode 100644 ui/ios/sendme/sendme/util.swift diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json index 9bc695e..02cef0c 100644 --- a/ui/desktop/package-lock.json +++ b/ui/desktop/package-lock.json @@ -8,8 +8,10 @@ "name": "desktop", "version": "0.0.0", "dependencies": { + "@headlessui/react": "^1.7.18", "@heroicons/react": "^2.1.3", "@tauri-apps/api": "^1", + "@yudiel/react-qr-scanner": "^2.0.0-beta.3", "classnames": "^2.5.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -748,6 +750,22 @@ "node": ">=12" } }, + "node_modules/@headlessui/react": { + "version": "1.7.18", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.18.tgz", + "integrity": "sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==", + "dependencies": { + "@tanstack/react-virtual": "^3.0.0-beta.60", + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, "node_modules/@heroicons/react": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.3.tgz", @@ -1048,6 +1066,31 @@ "win32" ] }, + "node_modules/@tanstack/react-virtual": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.2.0.tgz", + "integrity": "sha512-OEdMByf2hEfDa6XDbGlZN8qO6bTjlNKqjM3im9JG+u3mCL8jALy0T/67oDI001raUUPh1Bdmfn4ZvPOV5knpcg==", + "dependencies": { + "@tanstack/virtual-core": "3.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.2.0.tgz", + "integrity": "sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tauri-apps/api": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.3.tgz", @@ -1341,6 +1384,38 @@ "vite": "^4.2.0 || ^5.0.0" } }, + "node_modules/@yudiel/react-qr-scanner": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@yudiel/react-qr-scanner/-/react-qr-scanner-2.0.0-beta.3.tgz", + "integrity": "sha512-3zGssNoBXpSUdVmNPGhlyQS1V9snzKPlGk5JGOjNXPNUqVYjf/m8TTrU6cskPbL3dRUOGFctAs5rLeVB1UEhXw==", + "dependencies": { + "@zxing/library": "^0.20.0" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@zxing/library": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.20.0.tgz", + "integrity": "sha512-6Ev6rcqVjMakZFIDvbUf0dtpPGeZMTfyxYg4HkVWioWeN7cRcnUWT3bU6sdohc82O1nPXcjq6WiGfXX2Pnit6A==", + "dependencies": { + "ts-custom-error": "^3.2.1" + }, + "engines": { + "node": ">= 10.4.0" + }, + "optionalDependencies": { + "@zxing/text-encoding": "~0.9.0" + } + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "optional": true + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -1582,6 +1657,11 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2902,6 +2982,14 @@ "node": ">=8.0" } }, + "node_modules/ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", diff --git a/ui/desktop/package.json b/ui/desktop/package.json index fe4c615..bc0353a 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -10,8 +10,10 @@ "tauri": "tauri" }, "dependencies": { + "@headlessui/react": "^1.7.18", "@heroicons/react": "^2.1.3", "@tauri-apps/api": "^1", + "@yudiel/react-qr-scanner": "^2.0.0-beta.3", "classnames": "^2.5.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/ui/desktop/src-tauri/Cargo.lock b/ui/desktop/src-tauri/Cargo.lock index 172c64c..246c08c 100644 --- a/ui/desktop/src-tauri/Cargo.lock +++ b/ui/desktop/src-tauri/Cargo.lock @@ -1010,11 +1010,13 @@ dependencies = [ "anyhow", "futures", "iroh", + "num_cpus", "serde", "serde_json", "tauri", "tauri-build", "tokio", + "walkdir", ] [[package]] diff --git a/ui/desktop/src-tauri/Cargo.toml b/ui/desktop/src-tauri/Cargo.toml index 45a30c3..c377b9c 100644 --- a/ui/desktop/src-tauri/Cargo.toml +++ b/ui/desktop/src-tauri/Cargo.toml @@ -18,6 +18,8 @@ iroh = "0.13.0" anyhow = "1.0.81" futures = "0.3.30" tokio = "1.36.0" +walkdir = "2.5.0" +num_cpus = "1.16.0" [features] # This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! diff --git a/ui/desktop/src-tauri/src/main.rs b/ui/desktop/src-tauri/src/main.rs index e730390..b3c97d1 100644 --- a/ui/desktop/src-tauri/src/main.rs +++ b/ui/desktop/src-tauri/src/main.rs @@ -3,9 +3,12 @@ use std::collections::BTreeMap; use std::path::PathBuf; +use std::str::FromStr; +use iroh::bytes::format::collection::Collection; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Context, Result}; use tauri::Manager; +use walkdir::WalkDir; // this example uses a persistend iroh node stored in the application data directory type IrohNode = iroh::node::Node; @@ -74,6 +77,7 @@ async fn send(files: Vec, state: tauri::State<'_, AppState>) -> Result, state: tauri::State<'_, AppState>) -> Result, state: tauri::State<'_, AppState>) -> Result) -> Result, String> { +// let client = state.iroh(); +// let ticket = iroh::base::ticket::BlobTicket::from_str(&ticket).map_err(|e| e.to_string())?; + +// if !ticket.recursive() { +// return Err("ticket is not for a collection".to_string()); +// } + +// let collection = client +// .blobs +// .get_collection(ticket) +// .await +// .map_err(|e| e.to_string())?; +// let mut files = Vec::new(); +// for (path, hash) in collection.iter() { +// let file = client +// .blobs +// .get_to_path(hash, path.clone().into()) +// .await +// .map_err(|e| e.to_string())?; +// files.push(file.to_string_lossy().to_string()); +// } +// Ok(files) +// } + + +/// Import from a file or directory into the database. +/// +/// The returned tag always refers to a collection. If the input is a file, this +/// is a collection with a single blob, named like the file. +/// +/// If the input is a directory, the collection contains all the files in the +/// directory. +async fn import( + path: PathBuf, + db: impl iroh::bytes::store::Store, +) -> anyhow::Result<(iroh::bytes::TempTag, u64, iroh::bytes::format::collection::Collection)> { + let path = path.canonicalize()?; + anyhow::ensure!(path.exists(), "path {} does not exist", path.display()); + let root = path.parent().context("context get parent")?; + // walkdir also works for files, so we don't need to special case them + let files = WalkDir::new(path.clone()).into_iter(); + // flatten the directory structure into a list of (name, path) pairs. + // ignore symlinks. + let data_sources: Vec<(String, PathBuf)> = files + .map(|entry| { + let entry = entry?; + if !entry.file_type().is_file() { + // Skip symlinks. Directories are handled by WalkDir. + return Ok(None); + } + let path = entry.into_path(); + let relative = path.strip_prefix(root)?; + let name = canonicalized_path_to_string(relative, true)?; + anyhow::Ok(Some((name, path))) + }) + .filter_map(Result::transpose) + .collect::>>()?; + + // import all the files, using num_cpus workers, return names and temp tags + let names_and_tags = futures::stream::iter(data_sources) + .map(|(name, path)| { + let db = db.clone(); + // let progress = progress.clone(); + async move { + let (temp_tag, file_size) = db + .import_file(path, iroh::bytes::store::ImportMode::TryReference, iroh::bytes::BlobFormat::Raw, progress) + .await?; + anyhow::Ok((name, temp_tag, file_size)) + } + }) + .buffer_unordered(num_cpus::get()) + .collect::>() + .await + .into_iter() + .collect::>>()?; + + // total size of all files + let size = names_and_tags.iter().map(|(_, _, size)| *size).sum::(); + // collect the (name, hash) tuples into a collection + // we must also keep the tags around so the data does not get gced. + let (collection, tags) = names_and_tags + .into_iter() + .map(|(name, tag, _)| ((name, *tag.hash()), tag)) + .unzip::<_, _, Collection, Vec<_>>(); + let temp_tag = collection.clone().store(&db).await?; + // now that the collection is stored, we can drop the tags + // data is protected by the collection + drop(tags); + Ok((temp_tag, size, collection)) +} + +/// This function converts an already canonicalized path to a string. +/// +/// If `must_be_relative` is true, the function will fail if any component of the path is +/// `Component::RootDir` +/// +/// This function will also fail if the path is non canonical, i.e. contains +/// `..` or `.`, or if the path components contain any windows or unix path +/// separators. +pub fn canonicalized_path_to_string( + path: impl AsRef, + must_be_relative: bool, +) -> anyhow::Result { + let mut path_str = String::new(); + let parts = path + .as_ref() + .components() + .filter_map(|c| match c { + Component::Normal(x) => { + let c = match x.to_str() { + Some(c) => c, + None => return Some(Err(anyhow::anyhow!("invalid character in path"))), + }; + + if !c.contains('/') && !c.contains('\\') { + Some(Ok(c)) + } else { + Some(Err(anyhow::anyhow!("invalid path component {:?}", c))) + } + } + Component::RootDir => { + if must_be_relative { + Some(Err(anyhow::anyhow!("invalid path component {:?}", c))) + } else { + path_str.push('/'); + None + } + } + _ => Some(Err(anyhow::anyhow!("invalid path component {:?}", c))), + }) + .collect::>>()?; + let parts = parts.join("/"); + path_str.push_str(&parts); + Ok(path_str) +} \ No newline at end of file diff --git a/ui/desktop/src/App.tsx b/ui/desktop/src/App.tsx index 4e3fbad..f2effa3 100644 --- a/ui/desktop/src/App.tsx +++ b/ui/desktop/src/App.tsx @@ -1,59 +1,63 @@ -import { useEffect, useState } from "react"; -import { invoke } from "@tauri-apps/api/tauri"; -import { listen } from '@tauri-apps/api/event' -import QRCode from "react-qr-code"; +import { useState } from "react"; +import { Tab } from "@headlessui/react" +import classNames from "classnames"; +import Send from './Send' +import Receive from './Receive' import "./App.css"; -import FileUpload from "./FileUpload"; -function App() { - const [ticket, setTicket] = useState(""); - const [files, setFiles] = useState(null) - - useEffect(() => { - listen("tauri://file-drop", (event) => { - setFiles(event.payload as FileList) - }); - }, [listen]); - - async function get_ticket() { - // Learn more about Tauri commands at https://tauri.app/v1/guides/features/command - const result: string = await invoke("send", { files }); - console.log(result); - setTicket(result); - } - - if (ticket === "") { - return ( -
- { - console.log("chose files", files); - setFiles(files); - }} - /> - -
- ); - } +enum Mode { + Send, + Receive, +} +function App() { + const [mode, setMode] = useState(Mode.Send); + return ( -
- + { + setMode(i === 0 ? Mode.Send : Mode.Receive) }} - /> + > + + + classNames( + "w-full rounded-lg py-2.5 text-sm font-medium leading-5 text-irohPurple-500", + "ring-white/60 ring-offset-2 ring-offset-irohPurple-400 focus:outline-none focus:ring-2", + selected + ? "bg-white dark:bg-zinc-800 shadow" + : "text-irohPurple-100 hover:bg-white/[0.12] hover:text-irohPurple-200", + ) + } + > + Send + + + classNames( + "w-full rounded-lg py-2.5 text-sm font-medium leading-5 text-irohPurple-500", + "ring-white/60 ring-offset-2 ring-offset-irohPurple-400 focus:outline-none focus:ring-2", + selected + ? "bg-white dark:bg-zinc-800 shadow" + : "text-irohPurple-100 hover:bg-white/[0.12] hover:text-irohPurple-200", + ) + } + > + Receive + + + + + {mode === Mode.Send ? : null} + + + {mode === Mode.Receive ? : null} + + +
); } diff --git a/ui/desktop/src/Receive.tsx b/ui/desktop/src/Receive.tsx new file mode 100644 index 0000000..232197d --- /dev/null +++ b/ui/desktop/src/Receive.tsx @@ -0,0 +1,20 @@ +import { useState } from 'react'; +import {Scanner} from '@yudiel/react-qr-scanner'; + +export default function Receive() { + const [ticket, setTicket] = useState(null); + return ( +
+

Receive

+ { + alert(result); + setTicket(result); + console.log(result) + }} + onError={(error) => console.log(error?.message)} + /> +

{ticket}

+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/Send.tsx b/ui/desktop/src/Send.tsx new file mode 100644 index 0000000..3aa5028 --- /dev/null +++ b/ui/desktop/src/Send.tsx @@ -0,0 +1,74 @@ +import { useEffect, useState } from 'react'; +import { invoke } from "@tauri-apps/api/tauri"; +import { listen } from '@tauri-apps/api/event' +import QRCode from "react-qr-code"; + +import FileUpload from "./FileUpload"; + +enum Mode { + Choosing, + Sending, +} + +export default function Send() { + const [mode, setMode] = useState(Mode.Choosing); + const [ticket, setTicket] = useState(""); + + switch (mode) { + case Mode.Choosing: + return { + setTicket(ticket); + setMode(Mode.Sending); + }} />; + case Mode.Sending: + return ; + } +} + +function Choose({ onChosen }: { onChosen: (ticket: string) => void }) { + const [files, setFiles] = useState(null) + + useEffect(() => { + listen("tauri://file-drop", (event) => { + setFiles(event.payload as FileList) + }); + }, [listen]); + + async function get_ticket() { + const ticket: string = await invoke("send", { files }); + onChosen(ticket); + } + + return ( +
+ { + setFiles(files); + }} + /> + +
+ ); +} + +function Share({ ticket }: { ticket: string }) { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/ui/ios/sendme/sendme.xcodeproj/project.pbxproj b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj index 7c78237..5edf0cc 100644 --- a/ui/ios/sendme/sendme.xcodeproj/project.pbxproj +++ b/ui/ios/sendme/sendme.xcodeproj/project.pbxproj @@ -23,6 +23,9 @@ 42C61F6C2BB3BEC200762786 /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */; }; 42C61F6E2BB3CEC500762786 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */; }; 42C808FA2BB4948300114DC5 /* AppError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C808F92BB4948300114DC5 /* AppError.swift */; }; + 42D5507D2BB5A3A2004F89FC /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D5507C2BB5A3A2004F89FC /* ImageView.swift */; }; + 42D5507F2BB5E908004F89FC /* ProgressBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D5507E2BB5E908004F89FC /* ProgressBarView.swift */; }; + 42D550812BB5F1F6004F89FC /* util.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D550802BB5F1F6004F89FC /* util.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,6 +63,9 @@ 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = ""; }; 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = ""; }; 42C808F92BB4948300114DC5 /* AppError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppError.swift; sourceTree = ""; }; + 42D5507C2BB5A3A2004F89FC /* ImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageView.swift; sourceTree = ""; }; + 42D5507E2BB5E908004F89FC /* ProgressBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBarView.swift; sourceTree = ""; }; + 42D550802BB5F1F6004F89FC /* util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = util.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -124,6 +130,9 @@ 42C61F6B2BB3BEC200762786 /* DocumentPicker.swift */, 42C61F6D2BB3CEC500762786 /* ShareSheet.swift */, 42C808F92BB4948300114DC5 /* AppError.swift */, + 42D5507C2BB5A3A2004F89FC /* ImageView.swift */, + 42D5507E2BB5E908004F89FC /* ProgressBarView.swift */, + 42D550802BB5F1F6004F89FC /* util.swift */, ); path = sendme; sourceTree = ""; @@ -304,9 +313,12 @@ 4235A9C52BB306190013D818 /* ContentView.swift in Sources */, 42C61F662BB3A82A00762786 /* Receive.swift in Sources */, 42C808FA2BB4948300114DC5 /* AppError.swift in Sources */, + 42D550812BB5F1F6004F89FC /* util.swift in Sources */, 4235A9C32BB306190013D818 /* sendmeApp.swift in Sources */, + 42D5507D2BB5A3A2004F89FC /* ImageView.swift in Sources */, 42C61F6C2BB3BEC200762786 /* DocumentPicker.swift in Sources */, 42C61F6E2BB3CEC500762786 /* ShareSheet.swift in Sources */, + 42D5507F2BB5E908004F89FC /* ProgressBarView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate b/ui/ios/sendme/sendme.xcodeproj/project.xcworkspace/xcuserdata/b5.xcuserdatad/UserInterfaceState.xcuserstate index b83356feb4f5d2b5081d345a8eb79f83b79f797e..716b0098049098b391e668aefaf8c87c2a1fdac5 100644 GIT binary patch literal 74399 zcmeEv2YeMp*Z$6I@4NS2dKaW9NeI1{5CTY*&=F!tE+i0=n43_nJEDkypn^0-Awi^A zu_48R1r?-;ir9NW6h#zl{Lk#(O$axjz8`+P{y+4WOR{%%c6MgY^PF?$%$c$IIoXlI zX3h37h`|iYa174~jL0a%8%z!tM6&a8M>I$;$jHiuzXmrb%*!9%AaCr1a7JMyz@Qn+ z(=4-pYM=15aAvn?p*@Vm$U{;K(+k56ddL>qGb*DoRhX(wH71UUXA+oZOd`{qX~DE) zS~0DeHcVTlKQn+C$Xv<{Vp5sG%n)WMGmII}WHH&y1ZE;;1VjgBTGh3LanP-@1ndg{o%*)IU<~8PR z<^b~!^Dgrq^FH$_^BMCM^ELAe^DFZk^E>kga{@64AsrdWL>979B~%$zM>S9#bTMj* znxnR;9cqs{qa>7qdZJ5EA9N`igodF}Xbeh2m!olLJeq(eqAO4Vx)NQ5u0{*dBD5GS zK}*q{=q|Jj-Hq-+%h3vSA6ktbKu@9#=qa=jZ9<#TOK2N<8NGsDMLW@6^fCGbeTqIq zpQA6(m*^{W1pSDPqMtCrHm-`R;X1fJZh#x(rZ^5K;^w$DZjU?Qt~dqv#+TqeIE=^P z@i+@-;|X{o&cTy#F3!XGxDa23ug2Hl8}ST$6TS`Kj_2bAcrm^c--DOq)p!kFi`U@? z@k96-{49PBZ^h5!7x0VtCA<^w!n^Svych4sZ{q{_9sB|Q0)L6W!e8TW@z3}VmSZJW zW);?818k73!d7K#vaQ)RY+JS++n(*fc4RxTo!KsISGF75gYC=qV~4Oq*}+-pdkcF9yO6z$UB=$c-oxIM+#}q2?osYB?s4u3?n!PFx0QRIdx6`*y~ge2 z_H%D@2e@~*54cabgWNaVA?|nX5AFod@QBAe%d5P`2lyZ#;%oA?_=bEO--2($x8*zX zUHNW&4?cyzgwN!|{5XC*pT%eM6ZnaI4nK*{<@5LmeHytem@zn!1Y zFXHdyOZb)iz5FWv3I0ib1OF7ik>A8`=3n4nmQY)$Bh(e@2^RE943J!c<|JaGl@?M7Um=)h^4hZiE?+Wh;?+YIYp9o(I2ZbZTkHS&m zgvf|U#G)W7Vn7UvA+dpYq1aGtBsLbCh!=^?#TH^avAx(q>@FsYJ;eUv5OI{4CSES4 zi(xTaoFL|kd16GoMVu?n6K@r76K@yiiwnd%#D(G_aj|%pSR$?z?-w5s9~3u;Pl+4F zP2w}+^Wt`KhxnTKp7_4_f%u{Lk@&IriFi=_M*KlMBK|1;CjKt|A)b&}Nt7(9id0Lg zCtWBtkuH+rrCw5R=@O}r)K}^!^_K=n1Eou)K~kzTOd2DNlg3L~QoeMBbd_|qbd7Ya zbiFh~S|}}&7E4Q{rP7_!UD8VFUTK|lzx0^&xb%dyQQ9PJm0p&1NV}zd(i_s-(r41= z(ihT~(pS<^=_l!D>6mm}Iw3PMFPpL@+j0%Lrd&%-l$*;f_m$ zBCnM1l~>6R%IoDv= zA^CfSR|G{=Bt=#fMO8FKS1cu{gp{gEZKaM!(n0B{bX8K6o=Pue zpmM1)NJ&+OE0-ywl}XAKN`W$2nW9{!T&*|?QEpUbD9e=tCcm% zT4kN`kn)7`q_RPIR(Vd@s=TUfS9U79l(&@w$~(%t%7@CQ%4f<^J)XVdaHVydb>JbU7+5fE>st(i`6CSQuS{2UUijvpZbvcu=@0dPMzEJ*xhs{;VETkE_3^zpB5fziUX7G+9%$ zfELt3T1~B%R$FVVHPJ58F4hvX7Fq|bqc&I@q7BuCX~VS<+DL7bc9}L>8>5ZYvb71? zL@lBfYDL<0nxhfzdToX_OS@g0uPxB-&=zWUYxihRX&bdo+GcHw_O$kl_N?}twpDvx z+otW*-qhaG_G=$&pJ<5hxAH%Wxb|eOTSQWs5jGF z>aFy4dV9UI-bL@O_tg97m+C|G5&AU!8vR=RdVRWnlRi_Qqu-+6rr)kF)EDUw=@09V z=SQQ4?sR5fZE^^J>-rbe96#%OD_Guj)SjU?j|qmR+o7;FqNCKPc+7a**k$ZC_85DO z*NuI~8^)W)TgHClZR0)TQ{x-sknyc?%s6iRV*F~HFj-SIHM6E!%dBnIG3%Q3%nQtm z%!|!Lv$@&c>|hQthnmC8;pPZ)q&dpG%p7fwG1JTpbAnl5M$AI?zGuE~eqerReq?@Zeqw%VerA4U z9yX7e$IV|X&f+b>5-rs-ttwVktFhI@y2!fNYHGz<@m6cAjn&EOY^7K|t#oUwm0@LC zVQZW<-paDFtqImdE6ow~$>vQW1>r3k^>uc+v^^JAN`qui+I%54|{c5u|XY;mh8@6dzv#Z-R z?3#96yMf)*j^tm*_9A<+y~JK>7uzNF8hfq1-hR}6&E9G6vUl5i?7jBu_CEU!`%U{T`yKmZ z`)m84{f+&jebhb?U;-$B142LvR1ee$)C|-L)DF}M)D1KaGzlaGng!Yh+668R3<{(M z1_y=&h6aWOh6hFjMg~R&(gNcG;{$nt{J<4~X@M&PR|Rei%m~~Rm>HN8xHWKFU`b$U z;IY8tfhPh_1~vqq3TzB)3TzH+2|OLx8h9nJC$Km0df>gl`+*Mv9|k@Rd>J?#_&)GM z5C_>H7vzINPz*{zD`*F+1gi$?2I~bo1Um*h1v>}31iJ>i1(Sl^gUP`j!QR1v!QsIX z!I8ntU^qA~I6gQrm=~N9oEn@Nyg4{4I6F8ecuR0@aA9y!a9Qx~;Huz#!RLZogU<(F z2)-D6DYz~8a`2VltHJHTUBNel?*~5!ei-~Zcrf@)@KEsk;L+gk!9Rj0LT1Pc*`Yuv z7z%|dg=&RrhZ=+~48?`wLoGvXL+wJHLfu0>L%lC4m}fkHuPL* zYv}pV3!!bH*F*b4Z-m|qy%pLYdOLI=^kL}h(816*p+li>L&rkLL%&x-mF!A^O2JB@ zN|h>Au2gMEgWRH=oYxthF&LAvm>^SmSpU@ciQ#FHk??QSf*IN%BPTr)DQ0XY;9!R> zWP&s6>1w71Q?n@vXsek9%!N!t_-w#j0RLX>=#Jr-@Tof*{A)S!X;vlrob24pyeYjSDe!Ws83o~R z?wHc6DFx}1!f936bme04%V~q3JnA;YdnB-lYDigTj%*yn^(xIbqj2OHMCL zPqV6)RxmhyY*Knb@5s>XNH&y7vl^cA)v$E`yJ6XdS*h8%<8#7rQ<_x=3U?_A*&Iz`SD7?vyPkXX?2)U3QI{nICBk57lb^)8kE*{vW9J#0g%A%)pF*@fBR z$gu3p!Yr>?@7zc}*wJ|fWyMPGbcdKTmr<)?;o;C;Yj5J|Hx zIL%FiVGhRkgZc_`)2#ZXh5F|eW@m&W?gQLkOCOVF)hsPl{`qbnK=*o&4QH0#;=gk) z6JeUJWb&AN<_f03xxlIKG;l6l$rLh0%w(p}Y3MX|n!qQ#V<;s%r!ZXL%0<#N+CK1U zK;3=QBZZ~)(#vU9lAu05%FFt4DX|BRcN*-YgX%q-`k z70evxVv1u_!YjOIFF@n1%x%o=X;yU@VhRicsWWI$IKLnq0TfH8gXzRMO$XTcp0U28 z2w|4v;}cqs$Sw>|a^Do@GvH`pw+tAJo&>inwwCs-1_TpwOiW8gHXQKbrf3|`5TXD-)^}Al-{a(N8 ztPSpOE80LK+O~&Av>QDroDl|WkB>~r9#?1y;NP=>(c%F_`+%oz6kx{$@X!@94ovHt zn5E#2ThBbkJjHAR|J&=#$IL6+Tg;T-G?T&P98eA>=}Sc&0ClKdD0^X zPs zFCc<1?aP>Aig0%`_b|(u6;3lJ(P{3qSjm(yE158}%4zAe0t|0M5$-gA>;iXu???o+ zgfy#O#Zc=NisJ2sXDX9gSWuKvSX2Nwc^caA>Y@U5mhk^H&pDZ%PV?^ZCy|lgqmM98 z&>mgSJPK3zai^Wr-s#|Uq@1wz_jX zD**M|{|xH84Y1aiM|wdt{&S>X?t<~H)dx2$megWdsQ`U6{Ur36`?4$6%O$%;e5XEr zhYTN;IVpeI^`5LFU-->(vd=Kn{Vv%Fcmt!ii`mWWVfH%Ron)tnlR`)D4dzXE^m;nI z{yRqR1Lh+-dLKHyS1=ztm;CAIeGa4d<)4jSpMPNVcE!h6O8#r37v+xsbo34~KTsX@ z8|D!6E%P0a#`jJ?r@u468R%T<3|hq;VSZ$ef^PmZ)4)k}20Iy`mFIyj4(LX8901ge ziQV%iQRRgy1Fq?lW>tZ&T<98HK$QeQS{Hc%?W!av^( zHy1EEDJL&uVuYGoQTqs35g@Dm7Z(wM6b|IAZ*&0V@Cc;RBnF$ogAsz|N5ND_} z%o)BC7*S>#BGnn;Tn2A5n!XD)^xOsmSEPeZESL?>z^F z$H8NBGdz_w5lZz+pB(O;3yN2IPR=yHmhJe^mvM56!-tw2F%q%$h2oViqms-UW%u||n1HC$K%SE?~HhV)N`KSnffo6&Y$vzD37 zygF*4+AB~kXN;5kCaR0-p$nki`ltcA5H&=NP-D~tT?CqqZ$$Ua%WyT&F=hNX5EMn| zp;FUhP+ndksNG@jI@~!aJv+CoI5j+}RykmtUuW5O&IIRjhjAu3X-;;Ul~~GZ-i(O8 zdwh?n;fx}x!S=|VoL!KYOO1Q)Dc&2!p~Mmtj}lNbC*27<rQz8y^i|A%k@M3(E!wFRA$uQF=SBR5rx^4VDhI=%6BF@IS!L%wVWC^m70!m z`Qd_baT)nV?Gq9T+?Vc>bIJtnbkanjy^)FrdqUkay=Z)?SH+(YC1?m5O8bJ!X@w;~ zdjcKJA9Vjd@70E*5ouOqxU<|ymvwu2^QRb%q)+Z)c<>&7KEyQXQ~tD3iI-n4GJwymzYrheD_t}d?ymn5HYxSf^kG%5)+W8R`{9 z!UbRufV>xkGrNPCH69!SJ*I+TKmo6Ja>SdIS*Z4MC%2SV{Tg#nF0FBrGkFEm5YPr{ ztU<9WLSZh7YE)D9jLnFDTLevJnihkWUgS)5z#;`NmFt6;1C)< zsPvmC6jB#dso45eUxRLDnyy3FqU(@@2)Z6kM>n7w!5p{=&2+AEu6C|*u63?+9EUj9 zJJX#ToEz7nSul_1fVD6e%|o}M+tBT3K3d?+fO&npGv8U@+(GcY1m92a%LKnd@OJu| zwugM-f>bbK3+X$iSr;XRVb+H!VWbyiNAhxA=pO<-9PJ9viQ*B08RZGr#+;TD9(nSY zb(6#6(u;Bm2hw-ymB*A-589~H$9iko$#t%kN{=YtoJcE&)j0e#b_&*1JaOmLD-aCmF)}Y$OXf0aj-0aMAa{YmQ5Upn_mw-L@FnYw9 z<;-^Gl%Pj}=pJ`&fr&TQX*3$dvkV(Aqks9%Malp}2h&07mp&d?tSB=)0y@BJd;PB0 zOXb953wkc*Nn7DbFF3ctlWwDWmFae$=SHJlSHJ6&fo>fm2jquyd*_1BF=Bz{=sJth zcC>?O3SOFcPnLF3%G&KLEPJ=t(E(6X&_47AdK0~c_M^9*Mb2VpiL=zX)46LEdIt>G z_u%sbkdtN3-2@jn%Lrac6_s++#`fL_o(^u;=pY8YYrS9^fn>u)&^bm&M-7lPvBkxs zXy5nA&dqckRJB0NigGfkunh#C@SyM&V8<20oTfY#u~`45zDD0NO-s;0^bI=X+~X{F zR+OOcz_k9}DJD3d;4A152WUrhi$ovpjxmgdKds`kDghn8hSx66G? zpK~&~!QFm)%HX!tYIjyUk2y~`E1g5mH_m$J@p8%y4&WdTp~ko}bJV%tS>-$gI>)_E zMw*pSvCiSC7iIQqsZH(nGp-IA2d;r@;#$sq&KhTJsm6h2@UpalwxoiBkqTt)Ic$9X zk5vh96IUfzM^%ETP8Vf&9FG%FBj*9T?6J3ujWDvIi_-OnV)7gL#^S8sTIdPnVI#rboh~ z;NOC94k)OT!=Oe!>O9~*peODHx-aNM#ki;YX8A>9bFwqMv51T06%}OARhrVFr#@{@ zzXz*eT^*HT+!qfAy2Sl(e>?yW#FyehI28}ZL-0^M%z4t;;5_AQ zbT&Dgoh{DO&NI%l&U5SV2+G$?13Vg!!D(PVHNazm{I|Lct~)O|Z#r+m`0LJBo;yuqT5FeLh3?1 z-P?C7D$L3&fHuW;4waIWyqru>;z8q%Y4Q|U$mt6;drBL=0wt~hs(9YX^5nb-C9cGi z@f7;wyx_d({$yEotQ3DbT#E@)xfoxE9cP>KaxuOhPj_B%_E5^JI}kc;JS@uOf-(^S zzK?hWU)qV#pyY5)VY=5pr+n!@U?!de+=_3;v+!)^RcE`iqXgfA=i+(JYtAlbH+@jU znAgfb<;khQWYBvFXDB#0Z(4G8gx*M%MSsn(cFY}-Y_M9=3*x8HMYO&64v@-)coCSN z@kK@1nPaCFh9d(k>jFERvHjEJ;dk~YDAW&s;_UP!a|vEL6eM#<@8n{Uy%%rYv%l~6(}zBvw6*Bvrq0g#T{D-TtaRWNcqQ%mVqD_vbzU#V_u^H~KIaXm z(HNg4`i67I7iNv3Gsk7kaKsL6_XhTUl(^i5 zKjG|m-gXW+?>O%|@2$ccKy)|aO?Wfj;=B(6`+@VR^M&)JOWZD+L??M9eq>(WB$$uo zFH#kO>QqT|PQY}nURpdV=iSqDC&Rii%vq4qQ@>1h-5Rbn?v}0QoO~(TmjYa>{FO!>`h=d>OyueCT{sjJLz$`^U~FPNSi)tTjGdcv)sPh$3jZ zx#_uuL%<1>o-;THFxQ`>uj4nskB0X-pRK@eI-fg@%H1#`y{Hg;0e1t!CzIF~4<5l=x7|MN4qaou!cq69_>EN+>nbW)pbr65!E&qExc#_^! zj1N)lr=bBc-^J=a-+}J)J^lf7pYQNdY&k!GHt~z|9cU9jILA-bCXV6brP{>L&S77h z@TS%Y&<$9IMJ#r{cYbt^mgxrHu>$A@KR8FI^&j%7W?(iDT|snVM?Afzz?!b6@Kda& zz=m8+;h3i>r2KtNp`xaoM7V6oCD&uo!D4H%O@IQ~+H4)RE?bYifUVCqU@v4FvW?ir z&acjI&hO42&Iy7Tg214}1hE8h1o7+Gi##G^by;6t`2bCmuNBsm%Ghm&PV{@m!# zUJ8QD4qyioq!6SQvxC@Ff;56mN>yhdyuU!0{zHbdqbORGup^z<3DN;B*wM}#1Q{{l zZ*x!hH;rY-0gcL~8#-i_8-I=PYMST;^koov#UMaE7@YLt5+_tg!3Y z`?1bG$UcN&N;h#HBPfxehRz{^MiX#|m$!r2_3WcQa}g9zz`l%H!Y+5QPf_mL$Zldc z6V#ZXiwSC4N?+_6_F2>hoPUe_y`T0Ex3i5p7lFvX~uTbJ5D6RtL+DVy=(pHUC~NI!-)0Z6@38N(@3HT*AFv;?AF&@3)SRFe1hpin z6+x{DZEjnF+7Z;Apbi9eT*rPIrLHg8uh_5IgFsz}D0Ox6sjC}7{RjeecO<2*QRk`a z+)~$Xl)8Q=sB@IMI0mSTLmZ|*1a%>(tM>`y)zE4Xog|#hX&{Z9!l?u$5!Ahy(>a5n zWP;q);j?1WaY3#MFcBBxDsiCd^dKmOpq?dMRjwLkqFw~`KIcrt)n!bsUM#(|y!VIc zpVv%Uf7_auKJ1{33j-5z4WQ_Su|=g${r9K7lRS>(?23PIl9A}_^gFpRcQNhcCb)#4 zK47|WP4Oy%`c`1O*<8K)T^p98FRlgG9_Wi}$+hBIb8Wb`97yQ^f%mG6fWg3F3ep`v3)E-?h>rodlGoWs7W5R zzm(I{7^DK5wS&Z8NEXF-W&=jA=Hd7Yc!aYrY2!a_t&HDrv)2$l* z6nT+*nF8!f+%|%)BIxR3?iKD;g03NG`dM>Ka=We=bpvh1!{UPmYUdi`Q3;6rrdB#m8>JLez1KuWw8&T=tr?dU+Rpyeb+Skf+fqY z8MVFbABW0V>{IRwihL#9=hO(jfg;~m6!~t9K|braKQP~NM=5uG#~tRr=YHUha6b}s z6G1Zxx|yI^1kEOBj>lccxZ~U}K6l+h5OnEn|5oneIbL+Rix((&&HWSZ;&t8x?&3l3 zy7eF6uIO0smH4VIbMaLubIm`)_{DG*UmGiYUA`XH`TBeV%2|skXWc{49n|o8g`m4n zAuYZU-?)sl?jmSmInv_efwcGpz8Me3+aiLN5VW+EwD{U=A|)*_MK5qN%SVErp04;# z9$noTOILi7M_0={y6W=x>8e~b`blKPCwXMG%{5i~Tur z4ex*;^4Ib}AP*DtNHI_N>j_#<(1x?dR{Tvo?8zzNXYx1mfU}Ph1oHZL2|tIwg|gKX z1U-4q*@|DlnEV~F6f_7M1(loj>pNro(Ud{of6)fmieC&xm&6wRc5nCP7q1>Lbj9X+ zZ+`UCvTdbo#oxu>b)5Ip{5ZKmRs=066Gf{yqMEf_4!E1Ns(0+ku2IM-UA3o8`h__z(GyC=2nQ z@}Cj3hoILe3lX$~pxtR!yxVCf?J=a$N6|nSSa2-L2}2lA*)`W=$bU&?{wsoZmeJK) z9`Wp=#4{|F?pGSp`_#}?{s)hO_PP{gLm9;5a<%U5u#Lc#}|Q-*2!yK*?M%} z=oj&B$%gL6sJL--1MU>q$QnoERU)0rf>iouk1c?RgM{Spn7(XsMJF6(1msL3N%A9El?n-ieZXQH`g{LMY6+sYp z!oUJ(HDqIg${@lmE;~OfFE-IK3qoa)I+({WE}+Lv}-4*t(d=KobWfQVN=IL{5Wi=zQsX;%AkT;#2P`%wyh zY+nDo+!P3kOq~Yd-jm9B!ROgO1cjO&Cj>@70v1?-6L>)oL_rc{g7y>iHbDmndWWEQ z33`tpV9*Z;0;2zjppVxHs%Lr#reF!S5MUYzA!>Sj;+q~{5(LKkQGyX@IvAg~Jdxox=NC?v-L9Th*{T_xCqkmo67(^lxzK_j zP-MO?7Fr3d2|7q1F#Bvp@d+J-E?|BL9feLpXM(`1eTblMON6dMH)?)-N6_JOZhi>8 z7*psSYf~KQw=iAVm9k`UC8kr?<2Bz0^Fx5`M?$~YqEFYJH|?&Q`?kIQ=VLYB>M&|Y zsrexc6jEs?UrLvJet;z(VK80tIa0xrPk`w-?z{S3YnC%Wgi*p+FhGRMgwetnAx*ek zNGIqgf_^6G7(vGg`h}ohT?0f23*&_GzT@mSg8m?w`L{aGge!zX*8&kD)B^eaPb?7O zO5tj-Km>64o~XzI`5(qC*zFWwW~K`>TpLEX5o{RDf(;`Krq<+<7;ADU1SS_&V7>^q zU`3cG+=_MKc40oa(69_HG;9+rQ0t{Vff&5gOGH{^@cMJCj z%L$eURteThZ4%)YVI{cGuuQN5f%&kRFekd;qn+M^COqI8GFXrGpb6_;^97rp2kk!y z&M#}iNt&Rr-qi%L>G$&{VH*CJz%i5=NatW zGT4Wd!9F6mw$EUnQU+Tod`^F0-V$8L`vmXVP=A7aBYa13^^ou_!Sx8fpjbF8d{1zF zf}5N@^7={mg_76L!ZG1E!3_w$kl=X2}OaW8jzPLLQyHU=!V%v%kE3;_30xgs!qMB>l@um$xBp4gQ8uDsDtkeUj%3; zT7Y&KGW(nom~3M!Ix=D)kP4=ID+E|P9V4$!HEPncNt5pBi0q` zMHvgXAh;F5ZT_u{C0;DXyNo5q0b}8of5KQ|OR+UDmI$xh`X68{e=ItRpnXAfx!9S~ zRl73`AZ%03Dw>p@3wt_~=vIctY3*ZOZ(<5o#9m@=tcxjPU&>uwD0lTFxFhARE(E8X z!d>D3abOvDB@^7K9CwLBfxEU!JP^2MsQLocfm78Q|^LlyVAh%O5kl8Ptz;F zj>VHA7u3@enK;fPvhJ}&CQkH-tcOQrJ^%hvP=&2IiPOZ19;fy22cuAQfYZbxak4l? zoGMNeuN1EmuNJQnuNAK&xEH~_3BH8jJ_PqAxF5m&2_8W3K!PtNc+fhLc$_BQh{uRG zQBD(QQBF(sIc+HAG`hhbI4$=)r=3$y6PEy|iAxC{9OX0-l(d!H)8ak!hXya;A>Jo& z8uBN|z2a(+R&kYhAHl;29$qZ25!Vt7qLFsiI8A&=d=xlMd{}%$Tu<;wf=3a2S&8_V z_&DXX(FBh<_nfvFh-ynLQO#eoXOGdp-+-s@+uv{2zPG{3+ABT_MW2f;YF^*8-sqH+ z_y>kPx_kXs&u%Z{v=_u}9;dxTIqh-^iLX#jOONF=w!c3zJHn!`oSx*Qh91dX8B22I;vJ%MSxS&P01Zjaq(rH?)Iw@0wUSy(ZKSqR zI|+=>YY4uUVBjN%U_$Wq1WzaU27+%Scm}~Yt&=)>G$eK9M@vaGGC}G=X=tWTL$Jua ziQqfj$OOFnJP(~y9+CzF4@pA^zB$T6((uzpCiwFsO&SaGC0#D16Fi&XImJ?j1VDES zft|N!Ya^4CE#=UMOaQkSo(pa32H5&_@+?~Fu{mPyMg*uN~@Lm6nWLN&*dP zg#`N3JryyKKbIbm9(E~2dWcfU3ZRhF#e|$3iQw+Lm7bI~fGKk7-dfnnpE0pmdWvqm zt@ult2_~96CCww8auEvBW@$?qQ>-Jfr~Bj$O49R`DPE9XlwKkjUT-zQYyLh{?D3dl z?O$Yy1JVbOHcom+dRKZ+dY|A22!4>@hX{UnrSzfn5pzWPgy2UA>=jQX_!%dDc;E22 zXnrHw2c-#n+~5G3`(~uK)t_$S9x*6;e3o0-AC#}9@95JGO5aF_B+wy1JAIU3FfSip z36ygbuY$}G)Fb(Z$0;?2LgFNvpA<6pgr~R(p9ZB*@iLCXcFXeLM)UusWZ+g1I{lbOmnGo+%zBtX)QE^*f#LE{wZL?F0 z#zx%b*z)BQPFFQJ4`{k-n(3$f9j9%3X~MOWUKR32$sOd5U;>q(c5)|}g8ft7Fddpb z#!CVLIh0Pi=86Zwuewkscagh7BAL<~isf#QjOL^Zute<%Y#J5p!FjI8`V%l&9>g?# zK<*)@$UWs=a&P$(xsTje?kD$`2gn0u@L9Y@@J@nv5xkq=Jp}J17z{2joWR%uPsLjV z?JXu>2L)AWRBmoz`NeWbfmj^^hi0#7+IDR4DwrD z=6#!*krk##8#I7aoF^rsa5MH5!fg zNCSa-=Z?#R0fSoI9CcG6Z5w?FxFO^{xcu`VVd$x?rIW|a!)5wevPz%XjHZsK$>nmw za129PYB=v@k|2Xnrdt~{8B$RJ_`y??KvpN_LwHwV#QlyQ;NSsR9!gvb_KqnR$PsQL zY`8rt%$KK%eW|?zDE$t>5JiwpH{BkG)hmKOpnkxtlU!l)wVo^N-SdGy|93<1{;vl5 zoGb^^Jvn$k&FcR59nLOJ{~X{Z#OjpT zHolq99kb;HRQ;GE-y+YI=gGIqx5>B5V8VS&FldyY68ss#pA-BA!Cw;m)oS?;d7->W zUMw$>m&$j_cM<$GVMBy%NMNHgClXE}{P%=EN|mt2XNsTd1_wkG0+FWYMmYY09_@S$RPoea5CzauQ`#GgF7AMs{4WIXy0wwSu39)VnZaN1J1FmiIe zPk8lyn`Vvv`|=n~GX z?!yFsPw)=}A0hZhf{zmX6Tv^PmYk0V8_jcFO+Hvm6NJM?32Lm-B%OovCWdqSXXm)8aliBeNJ-^CTg@{jUS`6u~j`IvlM{)Mm{VR^y|gcS)Z5mqLwLRfXR{G0r{{D=IK z!YD|Aj3tEC2&)s;pu@+SgtZ78AZ+lzdH58gZ1@!WFAZO`x0Fgs<#OGpR8wles43M6 zYoC79{?gDW^^^ZvlmieY&J}dFa+=lQZwq=^7Ek}pnkg+I zp{wklz(5w?1X(n@Kqv>|K_!Zsl6g>+OsRP@OuYJ^0c5k46D`N2W+Z%~eB zyy9uzHEJ$IFH~5o3q5&7k-=`>Ikzg!VQUe#{{O6}>ccTe*R=@8Kkau}Z>29ly>f}thp=@CTd!E@2dSsn z3m{E={7|pCL%p^G(46|puDPlVR)zp_l;eAstlvzedb~nr+oFBIzk!g&8-Sr z;+GktguxrDq$!sx>B?9oLoOg}Bf>Tz?8StQBWwbgMXQu?%6KJ9$yO#P6A7D0*wKW& zny_~gb^~GGDnCKKB2i;}}tQ_w>b6tDpbP}uA=qt6`Au%7XC^iivKd{$cw~?MKp(km&D`jC0X$N&B{&6e2Dc_W-2!; zvy|D&9OV{et};)#Rk=;Mov_Ub3+}6ygl$FG)`SJuRa?TgBW!!Zb|7rWb;<%S)>B!m zEK!yUO_&DCGFX;p{nWo~H^TNO>;Twe4Dl-L`P9E~x(;3H@Z4GP|JzyX6*${th4KJl z{nWq8!w~GLJR&qv9#I}6Y!|u}96s5uu<4+Y)zbH6J*8}hXgFn~vWc)sgza9eY*C&j zY%*bcowa~Z<$2{L8gf^nya-|UY>#4PoANSYQwZBLChp!{Do}Q~2bI|79KV^nm325^*g*u29AF0%c8D7ZsvK6nX9|@gZX_r>l(54cklqp0F&%K-sL}PR zvvFw4nG;W)DP`4POiHEvrktSD^mjN~ksaoISd4ez?Qm4f$EO^+@;}_`9i45eph^%) zs=|WK$TLKes=8{qk))~#k)-TpXPVZ2&6U-9Ow+Y$6}75bO|7ohP;08S)Y@tt72M)u z2%ARO%L$uK*s+AoAZ#XK!-O42*zs%C3p_Yh8}g&o#!LhCA_~S?(ZG8a(piB3PoqeD zr56_!d+JlEr@x{Tqay#!$7#hL%=NzwuWDO>R~6_nI~q%`b_94;JE@)Frz>G65Ei`r z@Rk{=+b&v`m za0OvuNg`6B4pE0vd@Lkv(K*LQbu?qDV`4!sa((?!n{Fu=-`1q<{Xeg5c@N;Dnhr(B z#ul}YHXOUCc9QkfbA#?WvFWbqr5n4{u$o0Xc^qshV5h*A0yP`96tGh(*isN+xX-S% z4ci}{d^O?;aRC+Ls~{X)&4w*uaPO(xoc%kdsW(s=zEZtPy;{9Sy;i+WbyT8WuTCfI zH3ZHTVXq^sLs&xC>j?`NZy@ZAgq^Wgy)i1oH>}--A7%oK2GOhiTW7Tk>=5P_#~Z&x5muF08@3V zA5EohRv}wsiMmC7T78DFpx4hQ?1B>YIdv-){5uG{@Z1ajDoV)?-G6-SOsW{gdy0`gu(Ll-ud8o*qWlIG z<)vrnLjR6;)i0Lwz1j*H^QSf^x2K@XU>!kGp$<;b*U9_%RH!Vr)t|e zSESD-32SK}yV~W1eZiOA3@W>sYG*A|8&B95T}2u`Ujh=YD_Pb30ngF$s9a6bK!*k+ z@RedMUjse&Rl>Tb!Jd^finPhvl~fL=Xj8RmgxyZq9fW<-Hl1db{O|*5yz+ya|fVjFrRo{J3X+-;r|Ty!QDs2iLv=*wpXj z+1gy%$#W=p?V;c`kAm0U3cxGCG@E=|{jMGdGj^RP{VEn|OFdCuLPhyaD$4VyDDOS3 zC@__Xg2cq))h+t`t(v+3j6I7x<_9gmLnzEApj<_i+*M|@jMMC&p~H5VZWhIJL^Y8|K;PU_iCSmkbV&>q_J5g_iA55(Sxx?V{=vdo&2r# zJr%|h?JzYez6B4JFqk@CD@a-B-}1Be2RInDW7=`;7wuQ=H|=-A9wzMfg#CfAM+ghD zbkub)>PW{-q0V^@#-9j#%mJ}G{_k`!>bg#SdAdOzj6eU=4o1C-UJV?KIs^~@as~&Z zUR$r{VyRx2V(D*xVfge$`o$2PtT)!1=ob<855h5o!zFrCJx-4&97i~wa6-B0Q@w?^ zQhEY{e*J|~NEAOVF6{0_p_#rRF@1r%QxKL+i*hrvQepRMc3$qF@VHLRGn;3&$!MF| z?4+F)dRwob+d78%GKD(tC9WBYHXX)c3iWT&_-`%Oz*09D;GenC+j`R zU+AUxE`On~-XB8D^?rntR_Fr=CztC()StG`ndm=Ys166foV0mBAE{?EO&`=p>6huF z#lFIPx{p#H%QxUA>R~y8O+Aai;ftJ3IM}|OLN`*n8!9=Qpu6ezN-hZdEMdPTSLs20 zf<95t(I@G-dY+!IU!fQ15xr0^(kJUv2v>!0%?St1gnQ-^?oq<+CmigYtw#9Hgoll^ z4&hf3etWs*>sNc-tEE~0K`yl9yeYXkdFh$`(sLp0fAnb7lcxjmYB&C)4LlLpVKylY zp~^Aa-t-w>y;hpl>u<;P4~ApqBhlS(?(ebH&-SVhq*+OSyZVIGEZ8@bniUQg##Vf* zS8*uKO0Kx#?1H?kxN+mM6MDlh5I7yBr%37F(d)5Q-{DmaTOIy`?5zD^`7&B%R8SV{ zC17RgOZ27so%&t+GW~A-9(}pKLN6vd$j_Dgg9n&`vu6|S<)1L-)4BS-i|KOPN z{`b#T)L+zJrrh_EzKw7f60Tvf{)+x8;TjPx?yRX|`YxRwoTu;B_vm{G*O+ik2zOD5 zzE7tI=W!PkI6%`ikE zUt;^5m)Nr}u|_qJSOc)skKQn9Q3GnFHlF^t>k^QQMRC0%(UCS97>z(`jSCGJrmlqR zR%|pjK&Fxi=SFUv6^DosZ!`y~H4=JxYugMoTKSDTM2J&ZXAqz?eqI zSW!$$dHkVYGJBOcm497z5Ctp`MY(0R?AYUHM$!q zR0A(DdQhqD4FYKNqEZXzVxO7>89m^SOh03wtF{{hsMPj7!%hAjLydHhT4R_o+!$eu zG)5Vh8KaFcMw)Rs;rbH}^v!{UyOeN)2$xE@!Gs$^xS@m_w$>OMmD+K}c)AW@OrTOb z+~?Vmgrf)d0^^Q9FSh@H*iNNlJB@H7qC{(4eI}wcrW^DC0pkYaM#7CE+-1eaO~y>Z zjV4^iStDBG7UMQ5vU81j#;t@KL%1};U0!0`Zp^15n@+f~=U!x&f*jr%D~D?b^1`Ho zo{w+XTWR&EtnaH*k-Zy=-VxZ8i;69#PSUuQgNY%rcOHX56Z&B|Qk zY2z8=S>rjvO(5Jv!sQTd65(m=e!XA144X&3h_IHEAoZ-eGuY`(>42J{+aP5739y2F9-)l_tawJD+8tr zAi;HKPmsSej!;29Y4~r3;1B(&jE6O%V z)eQd27)g$fi>aF-a9)~*X_}U4n*lROxa$cwop3i04nTJX;cjxBmu3|j9cfl~otNB9 zFFFzqo&Q%xN1FA`h7|H%HZO!kncU5Pk|@(`YQkv+E6g~;%|3(o(QIMDDFtwTfZ2*d z;Vs~O6knmv;|j86`~Bb1gjLyfW+$_=*~RQ?b~BTdxn{E2!%Q)I5)SAG80j{`-A=gq zgj?WZ;T?oqNVr9WTfENf?O~zW505biP%JbDQ7l~IW8s|?3s-qq_{e!IJo{K^UJh7j zf{p;^aJ!M%W~OV02o)U1;*a@6Gna~KjtLBR7vYu_n|US>+}(s*PSNSCL`RuL=2ZHS z$rKCjp;%y1EV%egSa7X*J;0}V9VDwHgj+#4@L83VnA7n*6OdpfMbLX`1OKwa;ZJe) z?|LNmnzI2D=fq-S1?RVz^PuRhu|-dNev3KZTuQNUfq93y&|G9LHkT0YKEkag+#15I zCEPl~-S1)HGP;msF88nyqG9Ml4)@T%6bsjw_tTlO78Y{22T#9{rWu;Qny?$9#Qe?t-Gmjs7YO$v;a)1S7(CCygxf};?d5X} zZI;BCmK=*$E${td`sX#1*59_~r4KtOwXE6}tW@kE97y6$!tEj) zblDyk4XyeV4XuVA8t#pv;l6(-8d?b!`0qe7v=XUi`1+q{hE`jvJ)oflZs9l1fQD8V zE6GJes~bhbw*U>frW6fP-_vR4RxfKXprO^Z^|kt0{gt`aK(!ZC`*TPkzy)^;1at=*3B)d^pN@HGiv zi}1AxUx(^2d|krVBm4z~ufNXj;0dqYg&%EqqlahN$y9tB_~P4;?&0MV-NUo^j^{=A z?2E8H2t?RUCH#d^5w_t7(v^G>Kbigz^Z-E*dY`3Aj6K@E9Hxmq#!e%ABf>W>w$tsg zgl|H4h}?kVWFR$Wx#*OLcWOqDsfFQO8YFo}512o*#@iFAEN0o+_5{LTMEHvd-xOT^ z_9QzO)Db?8@bUC%f9itz%g(I7tK00g3qin&Vg;;%^R4WuP;^>s(bJx9WnXPyM?3i% zFzEPZV9@a^s6hvtcus53**DsAK#8$u*f-fT?VIgc_H4p8CwvRSwX?PCoxj)NwkY=4eQ-VKH?zHcwp!Kr740ISC&h*`mcR&_| zPfp2$;1^$MuL2#$zL)SF&S1~k>+A}}N3Z@)^hu(yweeZbSt4|P5LeENAP{0E?LKZU}#34e(Xh3`_|))ww*`a{rEdP1%H zSq6ol*q>7={nY-9@O=s2uh{;={*v(h2|w`c=`x4x!}KBFQYaWeeLG)KD7f)VQ1Fxe z3q{YL?PK&UAgY@c1K$pq9u0H83S1@wRs zFauV=Cj2nM4=4Nx!jB~UD8gUnLSf+lwf7cKZES1*e-fHhu_U+_E$&5&6R1)oxQ76N z0xfQBnd+(F6e|{_Kq*kPxVxmd7YJ6ILWO#NlX7~loco^pm-}1qde?fp8ewM7?Ah{s z=Gi-Yo-YGsJcnf7M3Eo-l{(^-_DWvRA79wRREOemEZGjIBfh@fJU$GFWgan@+c#2d;svu7xRgr2) zb)*JT6RCyN2H=hW91p;q0Jt*%cLCr801n>Z-2nI{0Pg-2iP^^>@(co0+k)^RFHj)p z@e6`iC{M1zuYxmL@N56e!2di0kyaoBk=6j*^LGX!!Jj{~koJ)GlotTMOc5Rf-@qqP z561uMbuLKIRm(sUkYGD{0dVgOXZdvb)e|fCtmcni7TnY%oz@*`SPHJd+^`fY+_Jdnf@=Rs{iQJ(i`h!=0 zRY5fJ(Z2b{Qq1@IU)0>MBOW7jKu-plj7&kMBGZuRNaB%jWF|5TnT>n`zySb$1AyNI z;I{zyZ2*4frzdk4fd2--?*Z`p`N-VgP52qi23bh)WRS%aBYyD9h{GtJOya&Lll8w= z{C~lU8z@%X2*4lyvSLs!6(#~{0reH0V!LG}XhZ~z{Wfg~Yc z0`N!x9!D|Z|HzOIIgA{q*y0Fs6gdXKqX2j`0FTK;P9P^KwipY*AMM-X|9hw8|M3{_ z-;5Rqkz~-o{zVu%mN=u*-D~=-5@luBNs_;K-|ABWro{Wy5Szw+bgVZ6VL@h$Q*#g%!7e2@Hq+(Ujuf(~60 z0Dla?lL2@N08a(rY5T6sH;OBRg6z98>A$-&8UHg~8Ps9aF|e{wN5Dl3pcwIg8Q$*q zT0$XF;M5%v1y0yy{)H=pVnMP0WFd-;!oqCOl|gP&Tp4)6pKc?+&dh@n2VscfMe(8d zQ35DI)QKbEC}ETcN)!doLF54NTmYU2z@Gx}d;tFJCkzV!cp(5U0^rZ{Q4;$wM9IKx zP;wL)q7*1FEdB+_K3|2Zl1@wUi; z@pC&jO?0kaV621xa&ik5hzbQUhzddlqe4(u zQP)tQI|ojyfH%1&0NxD1TL5_LPYj}N!fHVb-r2`sTj=Xh(A+xyhf**C6-}w9ND2kp z|2+j0P++7HA}SGpcm5Rx(@+`v6eLn8*bPz;mQAVq;r|kXxu`M<1oKc&QTeE6r~*_W z2*Ky5VpIvL6o7+HLmvPq0dUY|0B07!@Dq39H&5VaUX)){|mwY3lIdu2NO|XBaQunU_S^!y7vd_DKE-zbl}|9&-cH9a11p` z>3id-2>=fMpUgl_p{4=&6aXjx=RinCEm1%?k6J)20&wv3uK@T=CTbb=ngYUE06zEM z55g^wZrgvR+tF1WQQJ1nghw-y4uD&?IR%8fVA8jLPU>+!LAhjAdnI1!{138H#Ma+H z_yP5aVv3olkCb8UJZOrjFFzd;aQ^zA#_1ONwT zAeRC7YXH6iz*hnI+D{mwk5Cr%qp9~{xW2!rAHMlNlZI$UG#Dc!1I#xdHgrU(gUOfEM~mL-Yv>4d47#6a1=w3A7X#`T{Kpz;}sgX#oE2A7V$K<$s18 zfWHMbb^jrJh&$fh(<|_=LWlfQSPrxjTKONMW}sEk>R`@?13*=AA{zWP;RBfS{yIyv zHv0F79RmpKe_){hjeFlBj{p2mo=ILKIFg|3B%!?@P3M{}gtY z`&S7l((YJLZ}lJb;WY#I5BzzYz`r`~AJbDZ_;taT(OzKDpr}v_BH9~38~}@k_58BoGtqa^_aJx7E*R~%>#tHiKu3UKanKLZ zVd!uGaRfjd1rWzF(UIsVbTojV1`sp=f|de`|6dmdDo{&;{}iNTB*i2pr6gq(6*MF@ zq`*y5T7O)suUs` zjBA^R&Om3Pv(VY-C+Hk>E;s%r@6TsH7r9uXRcj;gD0T(KObuRg*qqIETFJHn_b{qM+yW4vO?wgen-q{`R;p2_f^d($! zG?kLmk(QLTr(4@E))bU86FrT7g`NQrLI6S>KuG_slw|Z0#S-Vy3+P1v0d`yw03n)r z>;n2V8jPEH@>Vs9h_ zdMEuS;6PYY1h)4R4IDab?B(g{6ACS&V>x;Zg=Xgv5|&g_R^dIRar(^JbLWjr&8%#( zd>-H}aEO|QmX03z2MkU4a1>Ess|!XNJ|K!6e0}iV;9ZV6l*-)57l*^+9r2Ds42(2P zENql(cf$vITY#UxUl5Tw^Z=1H6dsBK(T@QN-~xR3MD@bd8s2%Z4984-f;U|vp` zOZLu`OtkS}lzzfxu-3t|=-Gp|4L*%ZxjTb*U0!v8-@`ZmMi+YUP$(jl3GB_{6h&J6 zzF;i&G$jvB@OCgnBO)p$E&-~X@8|os^ZwCsS^s&@-xZJ%84A61AoLKWWKwc$nbI<{ zp@&0{gdWX2DX$QE3-aiGU5PuvD&IMmE(lVx82nKIY0gDmd#|Ly5y#Fo< z^RFb>(^zjX0M;M71{rBo)ro4MG@)op-kLgW8Cu%lc#kdvqZ>*eilpSq2A=)bnJf9(B7wKqBl9b)i;{zU_e{T8L@gqrPt#s92%0>}hU571mQE*gSOqW`l? zfkzl)ZT`4nYIu3s2WA?Z7=ms6^E=qt_RC7C^q)lmk1)3YQT)%fn_+4AFSdfIt!;kq z8yVJy;GcG&a6IzwdYj|Eb!9k!hyRQ1kV6o92rD>x7J^7akL!bckCiFfu92yCYhQ>k@ph?hVXeu-vS^=GazJq>(et~|2{(vE1hhaxy z)G#_25{8B`!en6=U>9MAFjJTV%ncR*3x?f--Ge2-l3`h}3Rn${1RH=Y!d78#U~gd` zsi>*w_WLyq`g>#n+^+}&`=3-Gz@_#bnD6Kx)_=4H=u6pWqQ5ghAa}qjr2O?ed>CL1 zhbhCKd4>ZFaP%U>L54#=u_*%}WI=KQ2sr?8@(II{gJ}%M7^n}X9ZUld@&F7AAQS+E zBIOGVOTj76UvrPr!TxO`@Up-}f`5G`N+KhlK+0X{-=s7KeaoLIdDRc?*UnELhJk6{ zUHR7I%Nzl^E1q<85M!_xI6~|pfe>!+-3NS^fhd8!M2=emauISK>^UqDP!t{_1#VRX zdyNUi3Sx6?^w{*V)nhxyzEV?BAEG`&eTLNh?h&OM8-5fmVt3JgptA5A9vr$F#Y$ z^|S-Dv$PwupTMWMzR~`mgVIsa!Re56XgWqZX7KqWcJSFGZaOVGEL{+|LcalA9X?05 zO1Dn8Nw-b6L-!e6Q2ZTSLJXrnK+guQMAf6m(O;&&LhnWILw^-q2p2`4N}oypjJ|_@ zn0}0Yf_|EQhJKFz3-SQCT7nnJkM2Ydpg%J}8H5=k7!nu?8Oj-&8G0D{7+x|AFbpwF zGt4l|G0Zb8GAuJ5Wt3nvWej3WXKY}cXFAA)X5wJtVmi*m%f!zl&Lqhs%_Pfol1YI{ zp9#kl!W7R`!qmXj%+$)%!PLdn!?et_&3ufRhMA7Jjd_rHiuo1uEHjyTfq8>@i}?-n zF7rF)4=mIy$61tEuq>BZuCj!(++exQa+l>EOBPE3OE*g|3yJk6Yb0w5YZ@z&HIp@) zHHS5iwSu*hwVJh-wVt(+wVAb*b(ZxL8;VVw?G&3en=RWVHeWV>wm`OEwySJ+*nVTX z&-RcloGp?qmyN^@W9MZTWtU)=VwYi8V%K87$ZpDR&F;*8ncbV+m))N|l0B2XguR>n z75gXlFYMpge{euKs5sypiX568r#a4YoafNzFyOG^AaHncT;cHM@Z|{QxWVy&<0(fG z2Z>{f;}yp&2bp7w;|<3y$2(4XPF7AHPC-sd&QqMHIgL26oTi-SoROS~oMoIfoTHo@ zobS1~x%jy*a+!0vaCvh5#udet%0=YL&Na!k!1adfE!TUlk6fR* zzH+m23v!Eci*rkI%W=zdD{?Dy8*%$`-{4N*k9QnjBDr z;^E=p;}PId;?d&K<2l1~j^_f8C65D-Baai03y&wy6&`OMUmky++dR=c**rx&l{{@c zy*wnIex5;|37#pQS3I*kWS+M?UwIGm9_D4_W#VP#W##4N72rL=E6gj;tIdny)#E+G zdye-4??ql~URz#!UPoRhUIMQhuRCu5??c`U-silvywkihyz9KXyzh8F@P6d|!3X6# zz;}@EFdrwM6rUE~IX-JXTRwX}M?PmhS3Y;X%Y5E^zI<_fC48fNEBpw4R(=6~ZGH^D z9{(BsbNmxbZ{Tm@Z{hFfALJkAALS?W zZ}Gq3-{pTN02QDTfD0THpb=mb;1J*vI4)o(KoGbta7!RbAXA`F;JHAFz^cHmz;{8o zAiW^3proLJptc}JP*3oTppl@tppBr9V3uI9V5eZWV6PxauwQUca9D6ua9nUwa9VIi z@V(%k;3vT^g5LyxoPeI7Isrd%@WkO0M^8|n5I%AGg!_qz6Qw66gboOu5YiQL61pk$ zP$)tuN+?DsStwg5M<`DyU#LK+NT^t-RH#v?O{hbtONb=YFEl7LEVL(#7CtU~LReT> zR9IYCPFP-8QCL~{l(3UIU0Yt(@9*d-iq=^tkGDWgQazx5RDnu$pszqu=>O~qw znnlJ$K8T`3A=WQ8CN?29CH6{eR%}CTOYDu}Vkpu`agY6&_ClmvqWvjnRIyM&^InM8<0szkHIiX=)>UeZL; zS29}iv1FsTz5mn8<886dv_9bQvRg* z$*U(bPm)gV%G1kB%Ac1vkvEsOlDCm}mcK0TE$=5EC?6t!O+HlqhJ1v4tbDwDl6;zc zhJ3bsj(oTLYx#HbU*x|lKot%s995uEpjSXCFes=hTvmuuNK(jAs8*;|Xj2$eSWD675NpV71b0q6?GK#6wfMNP&81qQM6NZP{b>`D7q=S zD|#y4Qp{9rRGe3WD6uOEDTymdD#<7*C@CqaD5)x)RWehuRI*XBSHdabmAsUSl}eQw zmD-d#l)9B(Dh((ND~&2GDXl9XQ>Im>S4Jx{DYGcEDRU}wD=R9iD61)JC~GO}DC;U; zR5n$%P_|aKQ+81HRQ6K#RrXiDr~E)UK{-h|SvgfXU%62ExpIkem2$gsmvWDCp9;MS zrwX?Uj|#tvw909fb1M2OhALPUGZjk}8x?yMM-^ukR~10zmdYKK-&F3agsDWRM61NA z#Hl2zJXT3jsaBa#`F4uyl-4Q2sn}DMr^ZfwP(`V-t8%IGsPd_bsh(6-R8>(`Q`J<} zR>i35sbW7;dsuQYHY6sL#s+p?U zsky6#s@+g~pq8MPuU4Q|t=6E{q}Hm|rPiZHQtMZnRU@lyseMuVt`1c{png#Oh&r`8 zt2(@DCG|D+4fSpHcj_P1KdOJ$IH-ZvVA5dK z;LzaGIIbbC;jR&+aa{w@xTSGV>bMvq3HM!&|8#)!t2#*W52 zjSm_hH9l*6)r4yv)1=izYBFdtY4T|bY6@$LYAR{!YM$0St9f42LepB)R?}Y7MblR^ zKr=`)M6+JAN3&1!rRJdKtmX&JPnusfe`vw9;97^Yj%v|p(QBc#n6$*Tq_kwThwt)g9Me(%seF)BU9TRS&91rH9Zvq{pPktEa7}t9M54yxv7ULp`jXnVzMd zkDk9?kY0%1H9bJ@mR`ADycuOFm;RXtFk__q$CJkO2Y#HnryffG{_-+U_JYa}0JY*xp7-pDcSYTLWSZUa1IBqy;_}Xy8aNBUl@Ppwe!!L&4jE))68?hP*8p#^T8z~u` zGEz6vGQt=c8DWh~jVz3;jqHpZj2w*ujS`H?jmC`L8`B$e8uJ?S8=o*1GnO!xGL|t` zH$HEC(b&k?#MsQ(!r0mPiE*BBg>j8>opGaan{kJ6w{frWl<_>43X8xV!XCxaVCk?Z zEF+c~D}|NC%3~F=%Ggs_HLM<1A8UxkV$HA?SZAy&)*b7K4Z?|$9WNaFi zh|R=4#lFB+V{5VX*l#9BOpck*n9!SWn#h?bm?)d5nrN74o9LRHF*$E?(ZtBa#Khg? zvWb_8kBOg2ph>XFHIq=28z#3+?wZ^)d1BILvTAzNRKgT%8fuzl+G09y`orvy*-)9JbuFd}I06^1bDrO`8ukpKQL`{IG@D9=^7g?L_QU?bPi~+nLxA?A+`E?5^5fx4U6?*Y2L( zL%VRh6uWf00=sIvI=e=@7Q1%4F1ud43A-t~S9WuD3wFzPD|TykKkPZ}mF=zVgYDz( zv+VQi^X&`mOYO_;U)WdKx7!cdkJ?YzPutJf&)IJ}h&m`bs5+=SXgTOPoN+kspzmPg zVCUfA;O5}raK*vfA;clxA;}@dq28g%p~a!yq06Dif#fjYFyye|ux&J}kF7l@0*#o*#_ ziMV838ZHBujmyR5;|g)bxK3OTt`GMTH-H<)jo~J7)3_NN8MlC2a)db^chqroc6{Ji z>^O~w;JNUscuR1G)fw*!{=(slzlI0!xA1rI_wf($iTG4J5ub(6!#~3p;fwJk{0{!R z6O|Lf>5vn(6P**%3GKw|1ZpBUDLI{TQg_mII^%TSN#Du9Dah%WQ=ikQ(}L3nr;pB1 zXBy|@&b-c&&ZnH!owb}X&ZnKvIqN%HIomkfIpdu1&d$!R&X=44=XB>f=LzRM7Zw)* z7ZDdR7fBa67kL*&7iAYc7p#k!i=~T=i=B&ui>FJ73*d6o<&Mh(moS$|muMHFOMy#; z3&~~3W!>c)fsw#MU?*@AxCuN2K7trQmLN}1BAg0Mb}Ib6A2 zd0houC0wOkWnAT4bt$n~eFWcNk)*Y0cXo9=Ji-@1Qr|K$GF{f7t4gTsT{ zgV#gAL&!tKL)=5kL)JsyL&@Wmhq{NRhqi~UM~FwVN1jK&$Gpc6Pn4&yr?#hw=RMDK z&pgk1&nC|n&vwr)&tA`$o&%o4o@1Vqp3|PIp6i~Qo^QMsy>`6bdcF7h=&kB~*89A- zzPF+Gw)a;bY9Bfuln6-Z ziuv06M)`L7?)e??JM4GNkJb0HwIlwi*J0Kt+E+8`? zD6bBq?$%axro*@>3KniZ+TTiZ4nmN-0V=>P*!6sEbiXQ6^F5QBF}V zQLa($QJ15``pkM4=?i|&sei5`!hihdQn5&bEKCWbx+9m5pE8p9F89m5+V5F->L8lw@T z9fOI{i#Zc>KIUSKQ4BW5EXE?nDkd-{A*MEFCKeWZBKBOYTkQSVoY?2FrLh&Um9b5+ z-LZYK{jo!_qp{<$Q?ajNXJa>FcVgeg?!|tM{qYF)=)fbvN7|1J9+^F|d}Q;;{*lWg zw?`h2EJ zaS!4mYVnSg;X+lLpRYHA2Q$lM(d%{8@A`z9yoXDEUk;s$CmnfJhl&Fw+D)CIB zL85V@X`)4`aJG?glqE|npbDU~&qEA@CPU#dW=T&iZO zX{tr4b*fz|F4ZZOka{WAGu12AH}!sMSZYLSRBB9WTxw!!a%yTSF*P$aJGD8LoCZ%5 zOgo!)CGAmKS=vzAo3u}9U(qtY4ES<>0lxzdlP^Q8-<%cLu$E2pcbYo%k- zPp6+v_eg(`o{*lFo{^rNo||5jUXos({vy39eV&LW$`MtGXNfjMJ0gMTN4!UTKujQ} z5Yven#2n&N;xl3)v5weG>>-kfQ^YyqJaLJ*M%*B76L&Ho8Ppkk8G;$Y8Dbfd88R6s zGZZsaGSo6OGjuYnGHf&KGjJLB43`YI43CT}8QvLw837qV8Sxnv8Iu`bGr2P{nXZ}l zGIKNAGD(>OnZuc*nX{QInd_NbnLC;9GCyQdWgW^onnja^%3{o7$zsb=&9cmL$@0wd z%JR($$hw|&BkNYy-K=|AHCfZy@NAlFwrufi$!x`JOtyKpWwuMUd$wn`SGIq4Q1;dA z>)GMikF#^L^Ro-Hi?hqJUu0KjcVu^E_hgf@2eOB6z1am}l#B-!_PUa})sN|^ToX@ey zvCnbLan5ngxsv0Pu57MX?)BWz zTp;&mZe(s$Zgg&JE-^PFH#0Xow87jo_U^Co^75(9zM?{&n?d*?@FFe zo_}6Y-qpP8c@Oi#^CI(N@?Pbw>8G(ziBB`1W6rm(eepm4Epx$te_$HLEr--=*G2Z|0B9WG)nVko$fC%z$g9Y=D4-~~=vom_bgSrY(fy*ZqKu;KqMV|eq++Qp}f&lT$z z8yA}vTNGOrUoTEB&MSUiTv}XFTvgmy+)~_L+*#aR{I-O@1XH44VpZZ(m(!L@m+O~XmE+2t z$_eF{%Dv0|$^*-T%deI{DIYKYQ~|4?t>CHPs}QSDsyJVvUtv{YUxBM|s&K1tuee;{ zRRL7ostBt{sz|FKR%BJ=RpeI`Ry?n0sOYU&s93I8t=Op8uGp=3U-7ZxOU3sW&=&_@ zu)W}X!To~g1>Xz77eX&YUx>eud?E8f?uGmd;}_m9;$Kv~cvVSNDOicA#8=*^d{7x) z8C4lmnOvD&nOm7(Sy)+ISz6gx*;d(E*;CnHIaE1XIbQjtin)rvO0-I%O1es}N~KD* zN~21<3RC4=6)l)TIwO+MZ^`V-onz5R>n!j4OTC7^4TDDrgTB%y4`fRmXHNM)V z+O687`bxD=wSV=k>O0lHRX?Z>ua2yaseV-bw7RQ$x#mC(ca3I^evNUBNsW1pO^scR zLycq2m6~fcK+Ub1yEXS}9@He%WY;{cc~(Psim%^s}-yjt`)5nua&Hosg5x30LZtnNi!bzNOuLtSs(K;3ZNSlx8pY~6g_Vm-8;uU@MD zWW8d&a=m)JRz0R(uimuYvEHrTqy9?0PknIxwffNdoAtNr3+rDtKpT!UFf|A_h&ISI zXf|LQOdA{K`j zjo+J~O$V9|HXUiAZlY^KH8D1^G_g0yG@WcxXi{oYX;N#_Y|?4cYdX_(zDd8ypvj{t ztf{zZsA;d6qgkWbuK9X%a&vZbZgYNfL32fOLvwR;TXSb~Pjg@MWb6UXX`Yk3c<}H>jHZ687_gbE|Ot&nx?6$&N54O^^au;?OTEknTT2ouoTQgd-TXS2VwidJ&wYIh{ zv_aZ9+mza@+6ZkPZI|1;+XC8x+Cti{wLNG{XnWk2+D2^4Y|CydX=`X}ZEJ7qY9qA` zv<9s&=03yx3{jiS4xLwC=R)bm+X&d9Cwy=Wm@4I>S33btZHs zb*6Ntbq;jycCmHwbxCz;cVW8pyR5oAyRLLy>w3@?-WAmq+ZErH)RofpwCh<{VOMci zSyx3@RaZ?{f7f>Rv2NjROt(w7Z+B34NcZ*bTitiMf9t;A9p9bRozwlayP&(MySTf) zyQjOqd$4_P+1^-21H$(g*9~>eKAg?=$W*=`-)M>9gy@_2K(``uzKD^*!hd z?~Ce-?R(sp+DGim?91*WkszewBw>;~=?v){2}^Py`I7uew@CL$4@lvp7}6tB0x5}< zN2(z8k@`tPq*2lYX__=knkOxhR!Hllt(WkZhh83edF&<4OZu1SmrO5NUb4O9e98Ti z=cU?9o0m6UX1(luxz&&Cm+HUR@80j%AJ`w#f35#+e`J45e_VfJe{z3ne}4b-{?h)6 z{+j;!{-*wx{^bFx0lERE0oDPI0qz080iglW0f_;r0mFgdfr5dGftG>Mf$;(Iz}6si zkZO=_kYSK{kadu2kY|v8P;l_%pw{5UL8C#FLGwYYLEAxxLC?V}gWiLFg8_rVgI5Qy z55^9b4)zaj4bcsW4k-?)4yg}m4e1S?89Fy~VaRgGWyo#FW9Z6|_mJ<7m)7`Jttum7(>at)ZQvcSCzapNHv((Zh_x%)_k19K&40 zJi~m$0>eVXBEw?CXNC#GVZ%kkL&Kj&I7U=PEJp%HfRS4xcSr7xM2|ckNgW}MWR2vE zx>6bdB_mkVe)=X-3&bxkq_N`A3CE#YQDZrAIYJFN|VG%|JZSvt`1NsM zJbe7|c=~w8c=q_y@q+Q^<0a!wh#9+ z*7Td{x6|*Z_g_^OE_=(quKVCRvB9M?OP7 zM>Z!rk=@AdiwcXb ziw_oK7m15yixrCvi@l4pi{!5|2g)zX!v$fbg%o~75zhnE?b*_Jt%xtIBu1($`EMV1wob(Zy( z&n{nBzPN0-Y`c7E`O32Qvfpy>^0npAJS$ZObZ`0InO55E?8t@E1j`oZg>*CVe#tuU|1uNbdb zuh^~NR`4qxEB-4%D_2)SS8lG{UWs0bUrAa?S;<(*Uddf~y3)6@wz9YKeHFTTVD;cC z%_{vWdX;gNc~xW8do^}7W%cQ5-D<;X=jzDn%Iezc-s;!Y?`zOC#M`~W z%dE?-%dac0W7dt`{8?QIk zHg-1NZR~A)-uSx7v5DQhw)tQ)d^2)0W;1RxVUxI-w^_1TzFEK7w%NTowmG>uy*ax% zzqz=%xw*Ibc}sCibIW+ka?5e+%2vQu@Yc00VC%Q72V3D=QCl%vgInLWmA19E&u!~( zn{C@~J8rvg`)vnq-`P&wPTo%2&e+c0&fU)6F5E8OF5B+d?%M9%CT$OF4{wicPj0{3 zp4}#IZ@i&;!~RC%4d#vI8~mHAZ{pshy%~A4_-5zL*B$r{V&~8f!w%=p@g2S$!5!fp znVpk6iaRPhYC9S`7CXK>kvlCrT{{CiLp#$u3p>j@t2-MzTRUHNVY~3%L%Trh_7ZjNu>rPV?7c=~PcgQb zXza$sXzWo_G`_hDr2KsEkLP~w1<5Ic#z z#6IE#agsPioF>i?UlC`COT;(C72+!KfOts!LOdcK6Hkbz#2ex*@fYz95P$+S;DG@8 z1ASls41p0a2DZQsD1be10FJ;3xB@re3B14vFcJiSKoA77z<7`iazHM~1NlG+RGB179&7|#z#eb_dO)It1+AeCw1xI?1RM!R z!O?IG^nq$$=m-5_2n>Z$Fa@T)=GFh9aB+XTn)a zz^!l_+zxlZop2Z24fnvka39RrqqCf6iHDOO)(TpaTHGpln$jwnNV_S0A)(q zQg)Pra;97;SIUhVL5-wFQKKn8Dv%1HLa8t+oQkIss6?uiDx=D&3aXN-qN=GHs+Ovw z>ZxW*q!86kO`>K}v#8nBVrmJslv+luq&lf?Y9sZDn%YEdrgl?%sIRGW)OqRxb&d-+(Z}f%^hx>@eVRT)e@=fve@TBupQpd0uh6&YJM>-pA^i*e zgnml@LH|j=q2Drqp&5qJW%L*)W*{?&8O%5{E{rSV#<(*cj3+ac8N>K6W0?>pl!;~H zn0O|G$y760%y=e`DPRhjBBqL|W~MVUn3>EhW;Qd2`H-2*%wy&=8fG!Gl3B;BXErd~ znH|hdW*4)MImDb`PBN#MubFeqedcH80rQagg?Yq0W}YxlnP<#%<`wgn`HN*(mgQI( ztIry+7OW*}#agop)`=a+4r0}wtQQ->MzT?CG#kUlvT*;DLk_5yp6 zy~KXQUSY4Z_t+oVpV%ktQ;y?!PT+L7eq4V}m(x>oGESc};7mA6&Wdy7oVbCU2j|Io zabq|i&X@D!g1AsFmW$(xxMHq^E9J_#a;}1_OZUMKD zTf{BnR&wjO_1p&TW3HRq&h6m7;J)O(;?8nkbLY78+y(9;cZvIkyTYk&aksgjxd+@s z?gjTN_mX?Z6FlG{&+r0oz#H<;ybJHjyYcS42k*&y@!tFpekebZ_vZuna6W>MJpUKbSXY+IT5Ba(LJbpf};TP}=`KA17egpq8-_7sjck#RV zJ!<{{|0#cpKh2-v&+`}f@AxbHRsIJ51Am`?&cEP)ZU}3BfB7_QILbwniL<&(tv=Af23JJn^AzR21a)mr0Ur-7v zp;V|B8iYonNoW>KCkY=2lZENRY+;44QdlLd7CJzw&?&6dT<+%s#j_fd{tc#%ggs$P z3?}Tw{-Um^hd=#A9Z@Fs*R1WIp=TN%JT|qsLRs0ER9RV;r_t3-)3odQY5wYO-k-~s znY()0c-VLj_4Lx5)y?XkBj$=qQ6(1QK1wtr^lq{v#b7aA9H+68IcZvDj=)Z%Yht3Q zkm+hVWu6AvGQH56%KEBARhcTkuDG(IcE?58S^!PVG%W_1id;?8Qau@Qf#nR1I|ZYx zT2+OzT$LQ2q^hl}mB9=00j3%cL#KYY-SQ#0mAQV0pm8yDrm^6|3z|$rZ|S$ivo#A0 z!*p{sX{TOz2b{P%(de1Sea!>I>i!3b&xtRI^TZFt3*ya=BBOH9zm8Z#tR?D1M{$Ta zbiRJRX0cqMx0%>Vm~;?Z#9Cw~a4}*X=K2TX9^pv*MBK+5MT#ky?^H2O zbkq2l+h}f@<%A8uj3?IR=9dOlmRHrNYHKkqDY<3!sy;oR5w9fMo@3B{C0>eAVzd|| z#;ze=6Tjh({}AKEMBHhTW{&wsY5>R%0L6GQA*F}B3q(6H2{3@oj7f~HuglFVQzfeE zy0C;JrXP*S5J>NnTyQ?ui;)UHlE%?hPJiIpr%FUIHcDQU;@msAwUiW08?Nl zW{8<$mN8rq~$V<)q>vU8}ajzgpY!@21{hsMK_bSfF`n?W#Kp_z*6gU^Eyb7Kz0g51Z)R zU=T;RYy@LL2nYpXARI)1NDu|0K@5l$OT{v=T&xf)#VWB{tPyL)IZWE?AK03FlxV*SUrNo5S zsWeL4B+Ua`g;BOlKUkGlUs$NBNvtX>u1hIaHEIHE75y)QVo-u9DaEB>nI@*(Ni73n zV-GbIpfV#SF}y;lYKqIPE9wMQ#FT#v#>G~tD#9z0a`S3s1P*E~xAmZ32WSvm#pFIH zn}LWO7_@*1pcS-%i9jv3i4#S&D2hmIUk4Cq2b1u9GEP{NMD_!57XC3$Q>>^P_&3IL z!2-gi3(N!afkvDxP7$YefrZ%Z?}^heA}JcyJ}`O(Sk(bmiqplJ=dnQ@;*1_Ey1<&0 zn8cX+va(LlMNH`t%D}o#$;ow52o7b-jB(_SRTkG()`S(;;(N0;j61<$&G{lX`BCs0 zIEEEF4o-lR;1oCw&VbK}dz!fxB|6K+1>!2PQ`BH^njMD6fwN#$7x)^S1Lwts;!<&$ zIP)U71irzKUk2ZT@5Y5Iv8u%d#j2WQE#u-Mak020D?yd7DsE7@)ixFv)XA70-L8S_ znk|;rWGA?x*<`60(bEsa9{U|m3@PH0zOHd*!lI8PQE#@m2!6&xJ^&BFFJOnp$4btv z5Lb#g#Qij$0bY6k8Lnrrr{Gz(%rH15DYzHUsLK3YX=dpJ&xtAj_pdJCF@6Ov!K-mq z*l`olVF-39&xZ?J>^ON42S!)a5c zl)fKZQCHL4qtajCo#v&L3k3;G*-I;Db+4;K2w9weAPFf*Lq=R9t`*mb>(@XI^2B|p zBW@5k!C3Yu?_`d^H8@T~Bs@%R|44_;Z z#t<4oV`w6NY%F$*8^ur7;JM%)G$S1GJdh%8(hMz`kfU{QXa`oU#)S7wOV9zj5iT2` zBXoiT;UG8|Izt!eDsB9M^{W@Vdj1c#WNB+(XFdD`aCS5QF#=##OTQW`j0$cK>=!9JfKdog_^NXGAZ;zP`=MXNdSBq|aJV_M!LtGP|iPI5$Ev6v&2ZDd!cqAkub+e}xK+fd|2= zZg>bDhM&SC@F@HY9)ri>33yVxF5VLFh(Cz;#Gk~U#fRb}@d z!%0rw6mMvreH`qhjS_ecp2yRFaza!mJV#9Vck6F({<|sO*4R1@wTZ$0-jiMa-QudY z#ocUKkdziQuC<2te-8#8YQJ3Z@Ah}Kq8~NYEq=!TQtQ4}d_P;}ukB{^P?`SU-M~lM zFCSnn{7nAc*K@7>muy)ee#l#Mqg(%9553lY`FO`$kt6>lexnsX)y!Q#EI2Q3=rE6h z;U0aAz9VVEWi3gNfP^GTQsQ&*h4`!ZQhc?RWJs3eNS+kL*Ww!lED>-)U>BaypV#?l z66!iN`Sosn)eUJt8so}>G{l7bCO+vTO-Q-;hxjM^XZQp-kj)!Vg4f@7^V@VE^zCi%z z@hmOUhZ?-n$dP0q&NJjFax^)H^dWsoKhmEJKmZ~@B0wQPBfucQBETWQZyoQO>mNkq1jlMpaLK#srwt!btRm?2<}fQ9JRqsWwh88;nJ zlBL)>8<$>}B4?BT%^Ku9QuDt?YMPoH;>jiC(*J6{oLng-#G~T94ssO&R)1$6vXfkg zYb>&hTtlu!z#0J?1Z=y=_2dTfV+8CF7>t0k=32|FEOHAjwaBdqD8!kU$Q^h(|C!Ju zcapo{U2;!)ZQs%l0S5%^#UBwEq`<2*wYSRcaGwSH$wQLI9Uu=P;D~@zCwW-%i-BUi zhH4#1ktfKL8jn_6hCD@{#*?f^tBt0y)siAVC%@1vX|)+keobD&b0B#Ro**xf7ZGq3 zA0gn5fae%s5Cn!IFbsj= z2#i2rBm$!l7>&Rf1bn*5S3NT-`3LzY`G&A3{~|C3zCF__0zn8QAdo0xuTR?1u`&sy zQ2j9A6#m;!oT>E?N(NS~q4X&Od>J9&j{uGc@r2`pKsE0!^7wmV`+sWlmWj z5RAasPRfeH+=d_!p*epwd=O<%IY|v1D6B##0%4udj2a|vLLgjp$|x(YP-)9SRjp>w zQgcVjo$|&L9pyoJQeFr|A`pc@bQd**8cJbfV-Sc#AYKzUSItpl2tCS&^3^s!l|rRbX;eBjj>@1isVr(d0%-`OBQOqu z3s|$(YI16a!;+FCFt1TLsGY9ZgvN?!a=KhhqEG>7v$2>a3w~%vNJh=%m&|oRwDbLPQ8>GypVvJsRinl1k@~Ca6eg& zBjgQDNVL7B{-WL?Fb9DT5t!RW0~$)SVJ7GI(MI!x9xY(ncCWDMC(%at#{yj}xV^&0 zO$vrjpY~wfs~l}W8%twH(m3XE04$X7eI?;LOTt%0o70XMU)qAUq^)Rc+J?5J?PvvU zPh(vdBd`R4r3frT;3EWGU`WzfTar=JsS5Iv2y0hvD+= z=*3Tk1qE18++l+)?(=QBm@bpXERiVNB2h+{OO$QJlzq}M$egaHn|ffyfsA3@iD9M7 zC0Msgu&U{a^bEXz13#lh8qw{zLjDxj#m8`+e1x7Z{)E781ok4ZAD78@aB=)IE|z~l z;NV7jCOwOuP0yh}r03G}==rpUUO+EI;4lK$5Wr=)F@oL*#voXX*AED;LGTEI*ZwnC z(aS_$TUzbOmW60bE78s5pTdh?)iX8i%a(;|zdil2{GSPpUeojK0S(v~{;!8V?h)e+ zhA{k)r>3oYKuJ%nNPj}_kvwP6`<+vy$jPI?!OZTu90BM2Nt07vUF1dbzc z0)dkVoI>DqH@&ylgAUS%qzI*tNFH>i&x5{1;7U(~Ue!8KJdHObI_R$v_`J`7E=Uo2 zi@qdX+VK3M=Z+)Py3c#A($^&>zo#*PUm5x}Z^gTUo3`V}>d{tba| zvG*bH9iHM`HCqoSsOi73&%Jv;)e?sW9GN{Y+;;P}brmg_YHg+XW+0)*kngvxxxf6Z z@khb_n>Tbg?>c)YNDBR)!2f$gl3^J^>!S>>_0jKp4WlH>w878F7`*w}&FC`*j3Hyh z7&9h}oEgBFGT7CxBX9!&jMOazZXE15%{T( zI-Ce!A@EuX{@;4IW4thT46d&3_j1P!lelYTMo5=7@-gNr1b)Wc^%bp*FB5<*VEh<= z1Rf&rOD7Y^U{fC<@KoY1lL=!YwcIfgTJ9d>Fl3^oFnsbJb^6r$Ub>hBCI!>QBr-`1 zj@@SnJV)R~7n91QN%;aZ__8-&sF`dGf6n{xk2`>7KC1H{*Ws~eYxy80&N`T?eB4&~ ze%t6}=-#lEF~g=cr+U22^T*MQOBTBxvSf6hPQ{FraHvQI&)Qh2-?f&|T2r(WAydP& zNnF)3bxb|ez%(*VOf%EMOknWL_a_2x5O|BgUkJQIkU$V12oWR^q`H}jy^uZC?^Xc0gVpcJo5=pC>4g@&_ z`A(*b!FfqQP^L}K%*V_o3GQxYBl8J@Itcbduzwe`nc0HjhIn5=uP;3_yD@}&a5i4L zxhFj{`?25v798JflYxQjL+dbew1;<`T|yDmm(V(f!GZ?w^R73!@2S%aez_uH{JDfN zH2UW$31V~RJabKg_yTj0xx{?KTxPyyzGJR1SDEiM0V&2q5wt|m3PI~`=6Wxrx0yT4 zUF`n&Z3==meUK^;bVtwwyFc{QVj9Q1kTCrfLEAn|Ut>&}--vtCg`l0Z%Ytus=3^K4 zsr!zFSY4K2F`4!VI&`umOCg9y8YFrDc$R1TX;ENxv?w@Xdstlwg@Ny(fD5n%U-ov) z8nSXs2y4U|vnB`*M$j2Smo9byYbp`qiXg5edge>khR|beG5&AA?;(V>#{vf|7@pKjK#2X;27$CKGm3HH845X4EMr=){XTGV6NWQ;nC zk?mUpvFTFMF`&mvmv#ZPrsw|mPA8kg=1ZXGvUvywAQ;%mDp?hRK?sIxy_qdxDZ}FbBchF7_<@wd9eQihPW#=%n#X7@`?*GhEGH#wdRKey&}) z=bH@ld#qE(tfYk#=B&WQX6yy_DsKDz`)%V_4H^--EbPjH&cu^9eM5%-i;NrW?H)32 zX~|GYSl`u>QJ{@1ub$U5J!>0%sOab{)5Xs^R5CdHFujhJP{~7y6;^;a1g8h|! z$-ZJ=v%j&wvwyIEB3Oc8DS~APVz;V5uoA&41hGriAXwYYzU|?N13esZw8Rl!S4tlQ zaTVIj(IhQL@th&%h%-X4zLz6Tjyd86Fm}>~U<00>d+vC?HSX1)v*zru-JA_)i(nIi z&7GWr!@1-1lxT~*UZ*DlImm9(j8Ml)NsLAFcu32pZ#~#aABNw z{*UDF{Eq?u;9vSkfUCH8E)xUJC2)yc5|_-SaH(7xm(GpjG7y}C;8X;sA&9rRXCOEe z!C45-MsN;-A9izDy@2O(d0akWH9=k@`<0KwG=;?)jJq< z-o!Oa7lQK<)b!jj;zMP_`>+wYNfPFWYe#S)f{Qx254gz)E=F*LHsNqHxH%GdGr3tD zR&EJ`OA%bw#eK-lm15%~1ef<_Yc;nRqqO9GPj@-se}2o46_To-*GLA)9~uO;8- zKT)CcrNZB(x5_c;>tZ9fS@NGq4wq<{uP%wNF0KEp(gp~(lf!2wy18B4Zf*~^m)pnf z=MHcOxkKDx1lJFxrD{)bx8`K9GCG{UNdWn){9W9l?DF?nm%I7xyO) zg|`SE)P};Le?mdclY|~mz0cFT;lkG7w6RNP?e1u8{&C*|iBq1%ZMpZ`&S@Oxa&~d( z?7i$T<<`xvf&XyI>+rf-Liqk#LOzuUd8#F3kCs!7>a?LbZ^T<;R(NCHgqQOJcvIet zH|H&QOWsN|uT(0GP9t~*!Oy#Sn;sT;doGWb@s4fOQCtr6g%6+0 zDw8WcGkhJd zme{H18~8@PiErjx_z8R~-^SxadmX_W2;M~S7J|1Cyo2Cf1hMnpL-5CLUhHM-gPsLA zKTTq*Zxsjef~;o&4qs|xCX!zyk%co;-y)7*hROPWt_=7NevL#^C*OtO0|Xy-@@sh< z!M`B*T$|eXjr^X>3)kH?4*w$H2!E`H0K6H233!3)QvQTgF8`{j+HGXl zhxg|^u068gU7(X>3vnh-vj-6TK1iH;eX~INjN;%s=6uA`&2y zLL@7_5w_CUJTlT4KB`gkulV0^?*N~x>fnDzB*eY*Z?NHS`M>ZvD7U)ea+UN7C0CP> zyb6(|b}wBZ1c3L_gYmhOP63}p=rvg&1^m9Tr!Rp)BrR#GC-8zG=%nMmYPF{!5XofA zMvV>d91=1jP{TeMl1{V}lZ5_)E`B-o_j#SAL9WoBKzZanQtHaXf8Z<)x3G+tCp-1toXkqYufJG|5PMd zqZQir2pfD>`_1@UXx}4rrdo7wVPW6MPJ$O<(k%=W1_^@&XTe2q72E`O!9(ywq#hz= zh}1`<0U`|%i8V7uqzNMBh#b(3w>5QWSBZX1IXkmQ$43XxD zv_PaKBCQZjO0`KplI^5Qal%*XiOLh0~ES&;Sw zhhA}2QDudywz#~$EEgZ$!LYt3@l`g|DYd=1{?B)scaI&^$+m+*N0Q0kcMB92}we-kRqfa(hiXdMA{?LVU3V3j1w}1 zOhh^&(g~3R5q|lL-;A2zV+sNI6jMX7Ci>aTAfW*C>kDooR2sHwJ$+8WRZn%4m`SUpeLW?l*|I$=Y3!;D!>48X0otNmQ z@ax_3&L?afAYpSsn1UT*(MHR;{s`ZI)?S$}&ej)2@QVTLe^n9>sueFtTP zIl@AG^bG4aSC}VM3L0U7R?DG?9EKG|1wiRk_*Hl%ywd?XqzhL-?Izx1#b&7QAbsBUUb((eBb!O`<(&^IKptDWqOPwn^ z*K}^^+}63PbFUxKkMHN$Z(zT{x?kyD)_teP=(+1H&|9ImLvO#{DZO)g7xXUaUDo?f zt#@1RuHHSppY(p#dnki46Pdd#LZ*_{$m(T{vKCpZY@%$btW)->?5OORev|%W{Wm+t zR2$4Om}@ZKFw`)~FxN2OP-R$XSZr8os4h2bF>E!QXeb)C8-8Fo#c-P82E)$`uNl5J zVvKB!+>C}BjWil<`yCzRfUYNWz`OV}HlQ(iR zxs%*Q?k4w;50wv>kCcy=C(7&P?eeAakK`-ltK=Q>F8Nyddilrljq*+ME%KA{)AG;d zU&_zQ&&e;yFUc>WOgl`wOxK#OH~rXjqv>AL{iX*^51Sq_ z{mk^Z=}FV`ruR($G~>;T&4!u{Hw!k4G>bNiHH$Y(GaF}?X*S+0$E@CLn%Oe5F0*xJ z8_c@ZW?Rg*ne8__YIf4>YqLvc*UfI3-7)*Y?2$QVE|~W-w>0-O4>Hd-&o$3CSD6=@ zSD8;WpJm=<{)zc<^E2kR&0kpbv#_>svk0+Bx2U&hv}m@NV9{owwm=p;EDl;6vp8XK z%HoX07Z%@H+_m`G;-SSOizgOuE#6sjmQI!~mXVg~G|O?8nU>=%OD)SSD=n)nn=B_= z&a?c;a)sq8%MQ!CmcLj*E7r==%F)Wx%G+wFRhd=26|$OUwZLkf)fTI(RyVB$Yq_!H@etw&mqwhp$Au}-(Hww`D`)q1-1OzYX!A6hT5US_@AdZqPh z>rU$<*4NcGgpH|riV(jAV66})fQtXs=)pj4)&9+-)*Jamj_lcc)v)xv^J$C!-4%i*C`_%4?-37a! z?0&U-ZTGv~8@s<0gu+N+sjySnD;yOA6+;zc6ut_7MW7;F5vhn)#46$y849JMTG6Cv zQM4*1DkdwYDyA!DDrPHIDK;o}DRwLNDE28%DsC(8D()$MQv9rVsCcA!qIjlwp?Ily zt@vH7_|x9Ret^B1y@kECy{)~yy_5Z5dslmRdoTN;_QUN*+9%mp+t0IKX@A20Tl-%f zI0tKokq(g#6CD;htaRAnu*+eO!#;-t4u>2*bvWv9%;AK?DTgx-mmO|6JaG8M;jzP0 z$03eBjzNxLj>(Rxj_HmWj>{a^JAUlA(Q%XG3n#)!4V@?_#>vph*h%hW>XhoFbSiKv zaw>7!P&UwDVCq2Sz=DBA152E%oZFn$&d7O^^HJxs&R3kj zcfRg?)A_dZUFXNnPo1ATzjXf1`A_G!E+bs>T~@eUbroFYt`@FVt~Ra?u1>ClT%BD< zxQ=oiU9Q>ulF$t{=HBcU|ea(RHiqcGsP*`&2}BMp4)x5 zhi;GDS$9KsNB02tSob{lI`?+>neMaP=eRF+U*f*ZeZTuLcl9~<^X?biFS*}#|H1ty z_XqBe+@E*=55YsnL)Sy@Vc{{#Bh(|zBitj>Bh91Oqs*hyqsF7&qse1}$3ze0G2dgM z#}bc^JXU&ic&zbQ@6qk?iN`LF-5z^Aj(U9Naopnvk7pjwJzjXc^n{+YC+Df-sp~28 zbn_hTImXk+)6X+X?HTJC@0sM8>Y46Y;92fjHF>GM=6ikQb-?R0uRC79 zdDGsEH|x!NTX+xh_VOO;J=}Ygw~u#-cersZjU+Zv`04r?`kDBd`dRte_$mAx{5<{q z{l@ww_@(=0`epm&`4#(>`BnPW_|^HX@cY{Dso(GZjK8VBg};Npi@&G;DF0CZasFBU z1^$)(HU4V<5B#V4&+z}yf1dvW|3&`G{WtpW_5aHMoc~4t%l=pVulcKQ`rq-t=YQY- zVE_?82G9X)03XmVKrg@`z$ic-U>aZ^Fd`r|U_!u(fTICF1?mJ24h#=02&@dO39Jun z3={*W2hIxoFmQh0!obCW%L11Nt_<85xHWJ`;O@W!frkT+1|AFiF^CM31<8ZVf-Hk< zf}DZ|2e}4$1bGEz1kDcGtPa`}bUf(WpsPW5gPsPH!A!7W@PJ_RV5?w7uw(GR;K9Ko zgMEWTgCl}dgEND(gY$w5gNuX9f-8dCf@cJ;3hoSE8@wTSWANtSZNWQ(_XO_`J`{W* z_?zHwgRcaCAABSDcJSTcd%^dE9|Zq0mLEHCY}D9_vGd379eZu;pCM);!$Z{mAweM_ zAz>l$A>%@_LUKa#LkdEQLP|o)LMlQggoq)NLZ*bw44D%$FGLfvHRNK*t&n>m_d_0r zJPmmf@-pOgC=<$unuJ=0+Jq`X9YbA1Jwm-hhlP#^%?;Ir?hHK?`g!Q}&|9HDhrSBq z!}^68huMWWg$)jK4f6^c5;i<+q&h4tEIF(stURnLtTwD6tU0VTOdZx9HaTos*ov^# zVVz-X!q$a-9QH}rmauJMJHvK|?G5`T?AP!C;iJOGhkp>hA^cSMj}c@VDdh>u8#NRP;j7$1QmRz_@$*dDPfVsFHO2=!+X zCn8Qqd=c?g#H+}Gk>QaEk=cWq9JwQMcjUgv!;wcLk42t{ycBsQ z@=oNv$mfx-Bmane8wI1NC^m|Z8W80WH73e8Dj+I2Dl{rQDl#fMDmE%UDlsZ0sywPH zsy3=2syV7PN*&c6H92Zp)XbmRF(ofO*{`)Tay*e_zw#-5A45_>21UhMtYhp~@i z)lXxe$G(fB;@CJLPA|?N&NxmUHzY1KP8nAmR~A*Nc`-z0yR{C)C`$fLCi$-vA_b<(l13X zML)$b#Umv)r8Z?@%D$AFsbs2MYC!7v)WXz~)N*xdWolC@N}ZHCIdy94^wgQDOHx;) zu1@Vr-H^I5b#v<0)QhQ4Q{SdhX>6L1)<4ZCO`c|!W|?N47M9kM_EFlJv~6j}(@v$G zOS_)-H0?z?kxr*`={o7Mbc1x`ba}dC`k?e->7&zq(*x2&(!hJ3OOv6m$OyA6^ z%z2s1GS_GB&pecQGV@~QkC{JbKF@ra1+&;JA*+9uL6%XLJj*m|VAjyAh^*+WxU9si zl&tiu%&hFJyew5#QC3@)nAM*3LDrP4=~=U~=48#y(qt{nTAZ~r>tfdH@uuT_#^;Zp zI)2^w6XWlUS3ey8c>J^RFUG&grn9+hoowA~{cOW*n{0>df!WU49@*a6!?H(YXJj{J zPtKl|{bBa}?1kCOvsYzzX0Od&pM5U-S&kydC1+$#R8DM8T8=8GDQ7~?w4B*Fb8|E~ zOL9KSS(&psXG_lZoKJI(=bXy423pwB9e4F!Q&Wl_wS4W+zo2#E|lq=6Q%eBn4 z$yMY!=8n$w&GpX>%ni;B&5g*7%8kj5&rQt5dnmc{a(Cr^oBL;;ZQj^CW!|K`)p;N1 zeUi5&Z(H8}ykmJM^G@e|k@r>J*Lm0SZs+}w_fy_4c~A15=lz;5&mWQ>kRO&GnIDrM zpP!bWkv~2^H$OjrVZQos{>}XR`7f26Qb%c|v{epK4p#;%!Pb{3p3__YueGKG9$ze4>&qe6M1Y2m;^=fV+%euaUB zV++FyV+#`slMB-d#}&>h+*EkE@MhsJh3|@BkxtQoBIhEvqR~bEML|U&MUh1@Me#+6 zMR`S)MIRKYrxwj9nq4%vNK>?^Xlc>%qE$tmMSF_&7ac4*Ty&)9SkcL%Geut%oh>?7 zbfM@;v2L+faZ+(p@yg=Qif@+?C6*!mkKAD2EW{iF0v8DFMbre9`MW?E)ZW?g1m z=27NTmQa>lmR6QgHoh#kOj%Y~R#H}8R#i5+Y+BijvRP$w%I1|VC|gvvr0k=z6=kc+ z4wiji_O9Hvd~A7Xx%$KM&E;Q}KPZ1u{;K@<@;@u6ivAU{3d0JM3eyVn3d@SY748*Y z6+W7@RYg=qRmD`rS0z=YR;5>ER*kR9scNfQUUj7E zPBl~QQXN-aSv{wEWA)DJJ=OcG4_2S3K3jdh`cn0`)mN*pRo|$7SpBs6MfI!dKdb+$ z0X1ZeV@*&^Tuo}txSFh*oEmjuO-W68O;t@zji%;A&EuNawN$OV)~r@h>roq28&aEC zn^v1qJH9r*wxG7SwzRgTwykzX?T5AVYZulot6fpMy0)`+TkYZ6i?x?)uhd?vy;*yw z_FnD%+K07|YoFCIb$p#pUH>}0I)ggnI(eOGokg8holTujU1ptF*I9Q`UH419tlqso zroObkuD-FprM|U(a{Zk8x%Knw7t}ARUsAuezPo-?{nq+j^?U0N)E}z9RsXg@XwYvk zYLGXWHP|-TH#jv6Zg6QxZkXDzp0(A8;>=9+4yzi`NoTlw;F$He9-u)@oD4h#y=Y0HW5v*Nzs(i^g+|SrUgxl znwB;#Z(7;3zG+L--lhXh$D6)rI@ff)=~mO7rh85In;ta1XnNaBH2XA%G^aIZtDB3O z>ziAf)y?hAlbdHXf7m>~d13S7=1a}*T6|kVTjE+0TQXZzEk!NWEiEl=Ei+nHwRE8-O`KWv@X+TD7h^;VlyuA?FZTqw;ydk-hQ(E;Uw9lQInLD$|p5UQcr5{ Vd2tQ#f7g`$3F~@(_T49~{XZCMi#7lN diff --git a/ui/ios/sendme/sendme/AppError.swift b/ui/ios/sendme/sendme/AppError.swift index 2fa0168..b7b2e4e 100644 --- a/ui/ios/sendme/sendme/AppError.swift +++ b/ui/ios/sendme/sendme/AppError.swift @@ -13,6 +13,7 @@ enum AppError: Error, Identifiable { case invalidTicket(String) case downloadFailed(String) + case createCollectionFailed(String) } extension AppError: LocalizedError { @@ -22,6 +23,8 @@ extension AppError: LocalizedError { return NSLocalizedString(error, comment: "") case .downloadFailed(let error): return NSLocalizedString(error, comment: "") + case .createCollectionFailed(let error): + return NSLocalizedString(error, comment: "") } } } @@ -33,6 +36,8 @@ extension AppError { return NSLocalizedString("Invalid Ticket", comment: "") case .downloadFailed(_): return NSLocalizedString("Download Failed", comment: "") + case .createCollectionFailed(_): + return NSLocalizedString("Import Failed", comment: "") } } } diff --git a/ui/ios/sendme/sendme/DocumentPicker.swift b/ui/ios/sendme/sendme/DocumentPicker.swift index a70300a..316d77d 100644 --- a/ui/ios/sendme/sendme/DocumentPicker.swift +++ b/ui/ios/sendme/sendme/DocumentPicker.swift @@ -13,7 +13,8 @@ struct DocumentPicker: UIViewControllerRepresentable { var onPick: ([URL]) -> Void func makeUIViewController(context: Context) -> UIDocumentPickerViewController { - let picker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.text, UTType.image, UTType.pdf, UTType.zip], asCopy: true) + // UTType.item allows picking *any* file type + let picker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.item], asCopy: false) picker.allowsMultipleSelection = true picker.delegate = context.coordinator return picker diff --git a/ui/ios/sendme/sendme/ImageView.swift b/ui/ios/sendme/sendme/ImageView.swift new file mode 100644 index 0000000..117324c --- /dev/null +++ b/ui/ios/sendme/sendme/ImageView.swift @@ -0,0 +1,18 @@ +// +// ImageView.swift +// sendme +// +// Created by Brendan O'Brien on 3/28/24. +// + +import SwiftUI + +struct ImageView: View { + let uiImage: UIImage + + var body: some View { + Image(uiImage: uiImage) + .resizable() + .scaledToFit() + } +} diff --git a/ui/ios/sendme/sendme/ProgressBarView.swift b/ui/ios/sendme/sendme/ProgressBarView.swift new file mode 100644 index 0000000..78db813 --- /dev/null +++ b/ui/ios/sendme/sendme/ProgressBarView.swift @@ -0,0 +1,28 @@ +// +// ProgressBarView.swift +// sendme +// +// Created by Brendan O'Brien on 3/28/24. +// + +import SwiftUI + +import SwiftUI + +struct ProgressBarView: View { + var progress: Float // Expected to be between 0.0 and 1.0 + + var body: some View { + GeometryReader { geometry in + ZStack(alignment: .leading) { + Rectangle().frame(width: geometry.size.width , height: geometry.size.height) + .opacity(0.3) + .foregroundColor(Color(UIColor.systemTeal)) + + Rectangle().frame(width: min(CGFloat(self.progress)*geometry.size.width, geometry.size.width), height: geometry.size.height) + .foregroundColor(Color(UIColor.systemBlue)) + .animation(.linear, value: progress) + }.cornerRadius(45.0) + } + } +} diff --git a/ui/ios/sendme/sendme/Receive.swift b/ui/ios/sendme/sendme/Receive.swift index 070b697..64e6390 100644 --- a/ui/ios/sendme/sendme/Receive.swift +++ b/ui/ios/sendme/sendme/Receive.swift @@ -29,6 +29,7 @@ struct Receive: View { VStack { stepView } + .padding(EdgeInsets(top: 20, leading: 0, bottom: 20, trailing: 0)) .alert(item: $currentError) { error in Alert(title: Text(error.title), message: Text(error.localizedDescription), dismissButton: .default(Text("OK"))) } @@ -47,22 +48,54 @@ struct Receive: View { private func configure() -> any View { return AnyView(VStack(spacing: 5) { - VStack { - Text("Receive") - .font(Font.custom("Space Mono", size: 32)) - .foregroundColor(.primary) - .frame(maxWidth: .infinity, alignment: .leading) - Text("download to your device") - .font(Font.custom("Space Mono", size: 14)) - .foregroundColor(.secondary) - .frame(maxWidth: .infinity, alignment: .leading) - }.padding(EdgeInsets(top: 0, leading: 20, bottom: 10, trailing: 20)) - - + HStack { + VStack { + Text("Receive") + .font(Font.custom("Space Mono", size: 32)) + .foregroundColor(.primary) + .frame(maxWidth: .infinity, alignment: .leading) + Text("download to your device") + .font(Font.custom("Space Mono", size: 14)) + .foregroundColor(.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + } + Button { + showingQRScanner = true + } label: { + Image(systemName: "qrcode.viewfinder") + .scaleEffect(CGSize(width: 1.5, height: 1.5)) + } + .sheet(isPresented: $showingQRScanner) { + CodeScannerView( + codeTypes: [.qr], + completion: { result in + if case let .success(code) = result { + self.ticketString = code.string + self.showingQRScanner = false + } + }) + } + } + .padding(EdgeInsets(top: 0, leading: 16, bottom: 10, trailing: 20)) VStack{ - TextField("Paste Ticket", text: $ticketString, axis: .vertical) - .textFieldStyle(.roundedBorder) - .padding() + ZStack(alignment: .topLeading) { + TextEditor(text: $ticketString) + .padding() + .overlay( + RoundedRectangle(cornerRadius: 5) // Use RoundedRectangle for rounded corners + .stroke(Color.gray, lineWidth: 1) // Border color and width + ) + .clipShape(RoundedRectangle(cornerRadius: 5)) // Clip the shape with rounded corners + if ticketString.isEmpty { + Text("Paste ticket here, or scan QR code") + .foregroundColor(.gray) + .padding(24) // Match the padding of the TextEditor + } + } + .frame(height: 200) + .padding() + + Spacer() Button("Download") { step = .downloading @@ -97,42 +130,35 @@ struct Receive: View { } } } - - Button { - showingQRScanner = true - } label: { - Image(systemName: "qrcode.viewfinder") - } - .sheet(isPresented: $showingQRScanner) { - CodeScannerView( - codeTypes: [.qr], - completion: { result in - if case let .success(code) = result { - self.ticketString = code.string - self.showingQRScanner = false - } - }) - } } }) } private func downloading() -> any View { return AnyView(VStack(spacing: 5) { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .scaleEffect(1.5) + ProgressBarView(progress: self.progressManager.completion()) + .frame(height: 14) + .padding() Text("Downloading") }.padding()) } private func finished() -> any View { return AnyView(VStack{ - Text("Done!") - Button("ok") { - self.ticketString = "" - step = .configuring + HStack { + VStack { + Text("Done!") + if let res = progressManager.result { + Text("Downloaded \(progressManager.totalChildren) files totalling \(humanizeBytes(Int64(res.bytesRead))) in \(res.elapsed)") + } + } + Button("ok") { + progressManager.reset() + self.ticketString = "" + step = .configuring + } } + Spacer() Button("Show in Files App") { if let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { // Switch URL scheme to this psudo-documents "shareddocuments": @@ -146,21 +172,44 @@ struct Receive: View { } class DownloadProgressManager: DownloadCallback { + var totalChildren: UInt64 = 0 + private var fetchedChildren: UInt64 = 0 + var result: DownloadProgressAllDone? + + // how far along download progress is + func completion() -> Float { + if totalChildren == 0 { + return 0.0 + } + return Float(fetchedChildren) / Float(totalChildren) + } + + + func reset() { + totalChildren = 0 + fetchedChildren = 0 + result = nil + } func progress(progress: DownloadProgress) throws { switch progress.type() { case .foundLocal: debugPrint("found local: \(progress.asFoundLocal())") + fetchedChildren += 1 case .found: debugPrint("found: \(progress.asFound())") case .foundHashSeq: debugPrint("found HashSeq: \(progress.asFoundHashSeq())") + totalChildren = progress.asFoundHashSeq().children case .progress: debugPrint("progress: \(progress.asProgress())") case .done: debugPrint("found done: \(progress.asDone())") + fetchedChildren += 1 case .allDone: debugPrint("allDone: \(progress)") + fetchedChildren = totalChildren + result = progress.asAllDone() case .abort: debugPrint("abort: \(progress.asAbort())") default: @@ -169,23 +218,6 @@ class DownloadProgressManager: DownloadCallback { } } -func saveFileToDocumentsDirectory(fileName: String, data: Data) { - // Get the URL for the document directory - let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! - - // Create the full file URL - let fileURL = documentsDirectoryURL.appendingPathComponent(fileName) - - do { - // Write the data to the file - try data.write(to: fileURL) - print("File saved: \(fileURL.absoluteString)") - } catch { - // Handle any errors - print("Error saving file: \(error)") - } -} - #Preview { Receive() .environmentObject(IrohNodeManager.shared) diff --git a/ui/ios/sendme/sendme/Send.swift b/ui/ios/sendme/sendme/Send.swift index 6e91a86..a19ed53 100644 --- a/ui/ios/sendme/sendme/Send.swift +++ b/ui/ios/sendme/sendme/Send.swift @@ -8,15 +8,43 @@ import Foundation import SwiftUI import IrohLib +import UIKit +import CoreImage + +enum SendStep { + case choosing + case sending +} struct Send: View { @EnvironmentObject var nodeManager: IrohNodeManager + @State private var step: SendStep = .choosing @State private var documentURLs: [URL] = [] @State private var ticket: String = "" @State private var showingDocumentPicker: Bool = false @State private var showingShareSheet: Bool = false + @State private var currentError: AppError? var body: some View { + VStack { + stepView + } + .padding(EdgeInsets(top: 20, leading: 0, bottom: 20, trailing: 0)) + .alert(item: $currentError) { error in + Alert(title: Text(error.title), message: Text(error.localizedDescription), dismissButton: .default(Text("OK"))) + } + } + + private var stepView: some View { + switch step { + case .choosing: + return AnyView(self.choose()) + case .sending: + return AnyView(self.send()) + } + } + + private func choose() -> some View { VStack(spacing: 5) { VStack { Text("Send") @@ -27,8 +55,9 @@ struct Send: View { .font(Font.custom("Space Mono", size: 14)) .foregroundColor(.secondary) .frame(maxWidth: .infinity, alignment: .leading) - }.padding(EdgeInsets(top: 0, leading: 20, bottom: 10, trailing: 20)) - Button("Pick a Document") { + }.padding(EdgeInsets(top: 0, leading: 20, bottom: 20, trailing: 20)) + Spacer() + Button("Choose Files to Send") { showingDocumentPicker = true } } @@ -41,6 +70,7 @@ struct Send: View { let collection = Collection() var tagsToDelete: [String] = [] + for url in urls { let bytes = readFileContents(at: documentURLs.first!) let res = try node.blobsAddBytes(bytes: bytes!) @@ -53,24 +83,52 @@ struct Send: View { } print("created collection \(collection)") - let res = try node.blobsCreateCollection(collection: collection, tag: SetTagOption.auto(), tagsToDelete: tagsToDelete) - ticket = try node.blobsShare(hash: res.hash, blobFormat: BlobFormat.hashSeq) + let res = try node.blobsCreateCollection( + collection: collection, + tag: SetTagOption.auto(), + tagsToDelete: tagsToDelete + ) + ticket = try node.blobsShare( + hash: res.hash, + blobFormat: BlobFormat.hashSeq, + ticketOptions: ShareTicketOptions.relay + ) print("generated collection ticket: \(ticket)") self.showingDocumentPicker = false // Delay the presentation of the share sheet to let self.ticket change propagate DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - self.showingShareSheet = true + self.step = .sending } } catch { - print("sharing blob failed") + self.currentError = .createCollectionFailed(error.localizedDescription) } } } - .sheet(isPresented: $showingShareSheet) { + .padding() + } + + private func send() -> some View { + return AnyView(VStack(spacing: 5){ + if let qrCode = generateQRCode(from: ticket) { + ImageView(uiImage: qrCode) + } else { + Text("Image not found.") + } + HStack{ + Button("share") { + self.showingShareSheet = true + } + Spacer() + Button("done") { + self.step = .choosing + self.ticket = "" + } + } + }.sheet(isPresented: $showingShareSheet) { ShareSheet(items: [self.ticket]) } - .padding() + .padding()) } } @@ -86,6 +144,29 @@ func readFileContents(at url: URL) -> Data? { } } +func generateQRCode(from string: String) -> UIImage? { + let data = string.data(using: String.Encoding.ascii) + + if let filter = CIFilter(name: "CIQRCodeGenerator") { + filter.setValue(data, forKey: "inputMessage") + filter.setValue("H", forKey: "inputCorrectionLevel") // High correction level + + guard let outputCIImage = filter.outputImage else { return nil } + + // Scale the image + let scaleX = 400 / outputCIImage.extent.width // The desired width + let scaleY = 400 / outputCIImage.extent.height // The desired height + let transformedImage = outputCIImage.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY)) + + // Convert to CGImage + let context = CIContext() + if let cgImage = context.createCGImage(transformedImage, from: transformedImage.extent) { + return UIImage(cgImage: cgImage) + } + } + + return nil +} #Preview { Send() diff --git a/ui/ios/sendme/sendme/util.swift b/ui/ios/sendme/sendme/util.swift new file mode 100644 index 0000000..9221bc9 --- /dev/null +++ b/ui/ios/sendme/sendme/util.swift @@ -0,0 +1,19 @@ +// +// util.swift +// sendme +// +// Created by Brendan O'Brien on 3/28/24. +// + +import Foundation + + +func humanizeBytes(_ bytes: Int64) -> String { + let formatter = ByteCountFormatter() + formatter.allowedUnits = [.useKB, .useMB, .useGB, .useTB, .usePB, .useEB, .useZB, .useYBOrHigher, .useBytes] // Customize based on your needs + formatter.countStyle = .file + formatter.includesUnit = true + formatter.isAdaptive = true + formatter.zeroPadsFractionDigits = true + return formatter.string(fromByteCount: bytes) +}