diff --git a/.github/workflows/build-canary.yaml b/.github/workflows/build-canary.yaml index c99f149de..8855ed699 100644 --- a/.github/workflows/build-canary.yaml +++ b/.github/workflows/build-canary.yaml @@ -30,7 +30,7 @@ jobs: - run: echo "MAGICONION_VERSION=ci-$(date '+%Y%m%d-%H%M%S')+${GITHUB_SHA:0:6}" >> $GITHUB_ENV - run: echo "MAGICONION_VERSION=${MAGICONION_VERSION}" # build - - run: dotnet build -c ${{ env.BUILD_CONFIG }} ./MagicOnion.sln + - run: dotnet build -c ${{ env.BUILD_CONFIG }} ./MagicOnion.slnx # pack - run: dotnet pack -c ${{ env.BUILD_CONFIG }} ./MagicOnion.Packaging.slnf --no-build -p:VersionSuffix=${MAGICONION_VERSION} -o ./publish - uses: Cysharp/Actions/.github/actions/upload-artifact@main diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 42048f4ff..996b40934 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -30,8 +30,8 @@ jobs: steps: - uses: Cysharp/Actions/.github/actions/checkout@main - uses: Cysharp/Actions/.github/actions/setup-dotnet@main - - run: dotnet build -c Debug ./MagicOnion.sln - - run: dotnet build -c Release ./MagicOnion.sln + - run: dotnet build -c Debug ./MagicOnion.slnx + - run: dotnet build -c Release ./MagicOnion.slnx - run: dotnet pack -c Release --no-build -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -o $GITHUB_WORKSPACE/artifacts run-tests: @@ -44,8 +44,8 @@ jobs: - uses: Cysharp/Actions/.github/actions/checkout@main - uses: Cysharp/Actions/.github/actions/setup-dotnet@main - run: dotnet tool restore - - run: dotnet retest -- -c Debug MagicOnion.sln - - run: dotnet retest -- -c Release MagicOnion.sln + - run: dotnet retest -- -c Debug MagicOnion.slnx + - run: dotnet retest -- -c Release MagicOnion.slnx run-client-nativeaot-tests: name: "Run Client Native AOT tests" diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f3bb1b03f..17e6bb1ad 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -38,7 +38,7 @@ jobs: with: ref: ${{ needs.update-packagejson.outputs.sha }} - uses: Cysharp/Actions/.github/actions/setup-dotnet@main - - run: dotnet build -c Release ./MagicOnion.sln + - run: dotnet build -c Release ./MagicOnion.slnx # pack nuget - run: dotnet pack -c Release ./MagicOnion.Packaging.slnf --no-build -o ./publish - uses: Cysharp/Actions/.github/actions/upload-artifact@main diff --git a/.gitignore b/.gitignore index 61950e37b..51e0b8b58 100644 --- a/.gitignore +++ b/.gitignore @@ -150,3 +150,6 @@ packages # Node node_modules/ + +# macOS +.DS_Store \ No newline at end of file diff --git a/MagicOnion.Packaging.slnf b/MagicOnion.Packaging.slnf index 9f0399af9..f3736bee3 100644 --- a/MagicOnion.Packaging.slnf +++ b/MagicOnion.Packaging.slnf @@ -1,6 +1,6 @@ { "solution": { - "path": "MagicOnion.sln", + "path": "MagicOnion.slnx", "projects": [ "src\\MagicOnion.Abstractions\\MagicOnion.Abstractions.csproj", "src\\MagicOnion.Client\\MagicOnion.Client.csproj", diff --git a/MagicOnion.sln b/MagicOnion.sln deleted file mode 100644 index b22c63bdc..000000000 --- a/MagicOnion.sln +++ /dev/null @@ -1,358 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31919.166 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{1987061F-8970-4018-8D58-6932961C9EB4}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion", "src\MagicOnion\MagicOnion.csproj", "{C79CE0BF-ED4C-47BE-822E-E82CF83FC68A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{5A3F5158-7B17-4586-9885-9E60C1393185}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatApp.Server", "samples\ChatApp\ChatApp.Server\ChatApp.Server.csproj", "{7B7CFF27-CB38-4661-9CFC-473B4E38F0DE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{15598FE3-201F-4255-9ADA-622B52D2A6ED}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - .gitignore = .gitignore - LICENSE = LICENSE - NuGet.Config = NuGet.Config - README.md = README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Abstractions", "src\MagicOnion.Abstractions\MagicOnion.Abstractions.csproj", "{2AD48C05-ED44-4E4F-B86B-A746E7F968A9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{42EBB7E4-52D7-4E57-80AD-79FDD4900E13}" - ProjectSection(SolutionItems) = preProject - Directory.Build.props = Directory.Build.props - Directory.Packages.props = Directory.Packages.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatApp.Shared", "samples\ChatApp\ChatApp.Shared\ChatApp.Shared.csproj", "{5CDEE44D-8AC2-4E7C-90CC-669E336F2D15}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ChatApp", "ChatApp", "{FEE2B9AB-A1D0-41BA-A172-FC95935542DF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JwtAuthentication", "JwtAuthentication", "{EBF51D3A-A093-4177-865A-D17F816EDEF5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthApp.Shared", "samples\JwtAuthentication\JwtAuthApp.Shared\JwtAuthApp.Shared.csproj", "{93BC9FC7-D157-4541-A05E-C56D31B2F2BC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthApp.Server", "samples\JwtAuthentication\JwtAuthApp.Server\JwtAuthApp.Server.csproj", "{38B41013-6FD3-4E99-A7A9-0DBAC0CAF6F5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthApp.Client", "samples\JwtAuthentication\JwtAuthApp.Client\JwtAuthApp.Client.csproj", "{5948D82F-EA56-4266-8718-7508C26BFFD4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Server", "src\MagicOnion.Server\MagicOnion.Server.csproj", "{72D2C01C-765C-4FE1-89CA-28244DEC7C37}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Client", "src\MagicOnion.Client\MagicOnion.Client.csproj", "{4DE802A2-426D-4074-B9F3-710980B3EDA8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Shared", "src\MagicOnion.Shared\MagicOnion.Shared.csproj", "{45A800CF-C0D0-40A8-B070-9AC2C3E4312F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Server.Redis", "src\MagicOnion.Server.Redis\MagicOnion.Server.Redis.csproj", "{80127E7E-FB71-4F68-B52B-2905AD39029B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Server.Tests", "tests\MagicOnion.Server.Tests\MagicOnion.Server.Tests.csproj", "{E3F88CE3-F892-42AB-9D92-178BC9AD46FD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{A8550C24-2486-49DA-8D1A-DB6BBB2E9905}" - ProjectSection(SolutionItems) = preProject - .github\workflows\build-canary.yml = .github\workflows\build-canary.yml - .github\workflows\build-docs.yml = .github\workflows\build-docs.yml - .github\workflows\prevent-github-change.yml = .github\workflows\prevent-github-change.yml - .github\workflows\build.yml = .github\workflows\build.yml - .github\workflows\stale.yml = .github\workflows\stale.yml - .github\workflows\release.yml = .github\workflows\release.yml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{B5617CC1-55FD-4F77-BA75-9450474C6527}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthSample", "tests\samples\AuthSample\AuthSample.csproj", "{4D5E8486-9A0D-444A-922B-1D94FD8A820A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Client.Tests", "tests\MagicOnion.Client.Tests\MagicOnion.Client.Tests.csproj", "{6DF31417-D091-4E27-963F-75E1D5AC0EA0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Integration.Tests", "tests\MagicOnion.Integration.Tests\MagicOnion.Integration.Tests.csproj", "{EC4E0789-6A32-42FA-ABD7-7ED3A5004CFF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnionTestServer", "tests\samples\MagicOnionTestServer\MagicOnionTestServer.csproj", "{D0555A91-D817-4322-B8D0-16641069D17B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{A0CED9FB-5B18-4EE3-859F-CE3A6F90A82A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BenchmarkApp", "BenchmarkApp", "{2FF12B46-BA5C-4B6C-BD94-3556C3F25722}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerformanceTest.Server", "perf\BenchmarkApp\PerformanceTest.Server\PerformanceTest.Server.csproj", "{D00774F4-6817-4768-8043-4BAAE88B3AE5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerformanceTest.Client", "perf\BenchmarkApp\PerformanceTest.Client\PerformanceTest.Client.csproj", "{3C67CF21-CDAD-4F77-9416-078924700CF8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerformanceTest.Shared", "perf\BenchmarkApp\PerformanceTest.Shared\PerformanceTest.Shared.csproj", "{E7D60CFB-0B20-4582-94C9-5398B2049201}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnionEngineTest", "tests\samples\MagicOnionEngineTest\MagicOnionEngineTest.csproj", "{5EB62B20-75D1-4945-B7D4-F9466FE67BA5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Serialization.MemoryPack", "src\MagicOnion.Serialization.MemoryPack\MagicOnion.Serialization.MemoryPack.csproj", "{56C784C7-3F18-4443-B7B0-03607ED14308}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Serialization.MemoryPack.Tests", "tests\MagicOnion.Serialization.MemoryPack.Tests\MagicOnion.Serialization.MemoryPack.Tests.csproj", "{A5A4ED92-71AD-410E-9310-A8BF48D32126}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Server.Redis.Tests", "tests\MagicOnion.Server.Redis.Tests\MagicOnion.Server.Redis.Tests.csproj", "{95C3B040-BD5A-4A80-B5D4-26CAA21B4829}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Client.SourceGenerator", "src\MagicOnion.Client.SourceGenerator\MagicOnion.Client.SourceGenerator.csproj", "{7130EC5B-C987-487A-B319-E91B6D03F5BF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Client.SourceGenerator.Tests", "tests\MagicOnion.Client.SourceGenerator.Tests\MagicOnion.Client.SourceGenerator.Tests.csproj", "{632C8D1B-3293-4D02-9ED1-0CB191619334}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleServiceDefinitions", "tests\samples\SampleServiceDefinitions\SampleServiceDefinitions.csproj", "{45EA8028-41C1-4DF6-9E0F-EEE8967799DA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SourceGeneratorPerf", "SourceGeneratorPerf", "{E9E11DFE-29C4-4933-A21B-2222646D946E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SourceGeneratorPerf", "perf\SourceGeneratorPerf\SourceGeneratorPerf\SourceGeneratorPerf.csproj", "{7F132098-0C1D-4F3A-B049-ACABF5E35973}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Serialization.MessagePack", "src\MagicOnion.Serialization.MessagePack\MagicOnion.Serialization.MessagePack.csproj", "{6C34E9BF-4E05-4A73-B439-75F3369B88A8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Internal", "src\MagicOnion.Internal\MagicOnion.Internal.csproj", "{2996029B-D329-499F-8525-69614A820135}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Serialization.MessagePack.Tests", "tests\MagicOnion.Serialization.MessagePack.Tests\MagicOnion.Serialization.MessagePack.Tests.csproj", "{701E193F-587D-4C20-8970-6E215B0634F8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Abstractions.Tests", "tests\MagicOnion.Abstractions.Tests\MagicOnion.Abstractions.Tests.csproj", "{D340EFB8-128A-4B49-A47A-F00A905D10AC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatApp.Console", "samples\ChatApp\ChatApp.Console\ChatApp.Console.csproj", "{AF21B7BD-7399-41B7-B0D4-08ACDC952E50}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microbenchmark", "Microbenchmark", "{F1FD52DD-E8A4-4CF0-A857-1A22443A0324}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microbenchmark.Client", "perf\Microbenchmark\Microbenchmark.Client\Microbenchmark.Client.csproj", "{CDBB141A-E0A9-4FD8-8260-1FB1E95C4E80}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagicOnion.Server.JsonTranscoding", "src\MagicOnion.Server.JsonTranscoding\MagicOnion.Server.JsonTranscoding.csproj", "{8A84D0D5-5AD5-4A76-895A-737AEBBDAA27}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagicOnion.Server.JsonTranscoding.Tests", "tests\MagicOnion.Server.JsonTranscoding.Tests\MagicOnion.Server.JsonTranscoding.Tests.csproj", "{3FE94073-95E0-4006-ADD6-BBE1FAFBAE75}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagicOnion.Server.InternalTesting", "tests\MagicOnion.Server.InternalTesting\MagicOnion.Server.InternalTesting.csproj", "{1A958468-D9B8-42B0-99CF-0F9358CD0434}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagicOnion.Server.JsonTranscoding.Swagger", "src\MagicOnion.Server.JsonTranscoding.Swagger\MagicOnion.Server.JsonTranscoding.Swagger.csproj", "{B425F5C5-6411-4461-87C3-07F3048A1724}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JsonTranscoding", "JsonTranscoding", "{57E6F117-1138-4899-81A2-CC87B20525E4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonTranscodingSample.Server", "samples\JsonTranscoding\JsonTranscodingSample.Server\JsonTranscodingSample.Server.csproj", "{24A21CDA-C3A5-49F2-A1B8-1A93E2E64335}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonTranscodingSample.Shared", "samples\JsonTranscoding\JsonTranscodingSample.Shared\JsonTranscodingSample.Shared.csproj", "{50871ADE-4513-4AC1-8964-740AB6505B31}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagicOnion.Client.NativeAot.Tests", "tests\MagicOnion.Client.NativeAot.Tests\MagicOnion.Client.NativeAot.Tests.csproj", "{9A70D36D-ACE2-4E6D-89D2-9AC0DEDE3A85}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C79CE0BF-ED4C-47BE-822E-E82CF83FC68A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C79CE0BF-ED4C-47BE-822E-E82CF83FC68A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C79CE0BF-ED4C-47BE-822E-E82CF83FC68A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C79CE0BF-ED4C-47BE-822E-E82CF83FC68A}.Release|Any CPU.Build.0 = Release|Any CPU - {7B7CFF27-CB38-4661-9CFC-473B4E38F0DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B7CFF27-CB38-4661-9CFC-473B4E38F0DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B7CFF27-CB38-4661-9CFC-473B4E38F0DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B7CFF27-CB38-4661-9CFC-473B4E38F0DE}.Release|Any CPU.Build.0 = Release|Any CPU - {2AD48C05-ED44-4E4F-B86B-A746E7F968A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2AD48C05-ED44-4E4F-B86B-A746E7F968A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2AD48C05-ED44-4E4F-B86B-A746E7F968A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2AD48C05-ED44-4E4F-B86B-A746E7F968A9}.Release|Any CPU.Build.0 = Release|Any CPU - {5CDEE44D-8AC2-4E7C-90CC-669E336F2D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5CDEE44D-8AC2-4E7C-90CC-669E336F2D15}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5CDEE44D-8AC2-4E7C-90CC-669E336F2D15}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5CDEE44D-8AC2-4E7C-90CC-669E336F2D15}.Release|Any CPU.Build.0 = Release|Any CPU - {93BC9FC7-D157-4541-A05E-C56D31B2F2BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93BC9FC7-D157-4541-A05E-C56D31B2F2BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93BC9FC7-D157-4541-A05E-C56D31B2F2BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93BC9FC7-D157-4541-A05E-C56D31B2F2BC}.Release|Any CPU.Build.0 = Release|Any CPU - {38B41013-6FD3-4E99-A7A9-0DBAC0CAF6F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {38B41013-6FD3-4E99-A7A9-0DBAC0CAF6F5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {38B41013-6FD3-4E99-A7A9-0DBAC0CAF6F5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {38B41013-6FD3-4E99-A7A9-0DBAC0CAF6F5}.Release|Any CPU.Build.0 = Release|Any CPU - {5948D82F-EA56-4266-8718-7508C26BFFD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5948D82F-EA56-4266-8718-7508C26BFFD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5948D82F-EA56-4266-8718-7508C26BFFD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5948D82F-EA56-4266-8718-7508C26BFFD4}.Release|Any CPU.Build.0 = Release|Any CPU - {72D2C01C-765C-4FE1-89CA-28244DEC7C37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72D2C01C-765C-4FE1-89CA-28244DEC7C37}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72D2C01C-765C-4FE1-89CA-28244DEC7C37}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72D2C01C-765C-4FE1-89CA-28244DEC7C37}.Release|Any CPU.Build.0 = Release|Any CPU - {4DE802A2-426D-4074-B9F3-710980B3EDA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4DE802A2-426D-4074-B9F3-710980B3EDA8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4DE802A2-426D-4074-B9F3-710980B3EDA8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4DE802A2-426D-4074-B9F3-710980B3EDA8}.Release|Any CPU.Build.0 = Release|Any CPU - {45A800CF-C0D0-40A8-B070-9AC2C3E4312F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45A800CF-C0D0-40A8-B070-9AC2C3E4312F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45A800CF-C0D0-40A8-B070-9AC2C3E4312F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45A800CF-C0D0-40A8-B070-9AC2C3E4312F}.Release|Any CPU.Build.0 = Release|Any CPU - {80127E7E-FB71-4F68-B52B-2905AD39029B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80127E7E-FB71-4F68-B52B-2905AD39029B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80127E7E-FB71-4F68-B52B-2905AD39029B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80127E7E-FB71-4F68-B52B-2905AD39029B}.Release|Any CPU.Build.0 = Release|Any CPU - {E3F88CE3-F892-42AB-9D92-178BC9AD46FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3F88CE3-F892-42AB-9D92-178BC9AD46FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3F88CE3-F892-42AB-9D92-178BC9AD46FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3F88CE3-F892-42AB-9D92-178BC9AD46FD}.Release|Any CPU.Build.0 = Release|Any CPU - {4D5E8486-9A0D-444A-922B-1D94FD8A820A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D5E8486-9A0D-444A-922B-1D94FD8A820A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D5E8486-9A0D-444A-922B-1D94FD8A820A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D5E8486-9A0D-444A-922B-1D94FD8A820A}.Release|Any CPU.Build.0 = Release|Any CPU - {6DF31417-D091-4E27-963F-75E1D5AC0EA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6DF31417-D091-4E27-963F-75E1D5AC0EA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6DF31417-D091-4E27-963F-75E1D5AC0EA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6DF31417-D091-4E27-963F-75E1D5AC0EA0}.Release|Any CPU.Build.0 = Release|Any CPU - {EC4E0789-6A32-42FA-ABD7-7ED3A5004CFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC4E0789-6A32-42FA-ABD7-7ED3A5004CFF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EC4E0789-6A32-42FA-ABD7-7ED3A5004CFF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC4E0789-6A32-42FA-ABD7-7ED3A5004CFF}.Release|Any CPU.Build.0 = Release|Any CPU - {D0555A91-D817-4322-B8D0-16641069D17B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D0555A91-D817-4322-B8D0-16641069D17B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D0555A91-D817-4322-B8D0-16641069D17B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D0555A91-D817-4322-B8D0-16641069D17B}.Release|Any CPU.Build.0 = Release|Any CPU - {D00774F4-6817-4768-8043-4BAAE88B3AE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D00774F4-6817-4768-8043-4BAAE88B3AE5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D00774F4-6817-4768-8043-4BAAE88B3AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D00774F4-6817-4768-8043-4BAAE88B3AE5}.Release|Any CPU.Build.0 = Release|Any CPU - {3C67CF21-CDAD-4F77-9416-078924700CF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3C67CF21-CDAD-4F77-9416-078924700CF8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3C67CF21-CDAD-4F77-9416-078924700CF8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3C67CF21-CDAD-4F77-9416-078924700CF8}.Release|Any CPU.Build.0 = Release|Any CPU - {E7D60CFB-0B20-4582-94C9-5398B2049201}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7D60CFB-0B20-4582-94C9-5398B2049201}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7D60CFB-0B20-4582-94C9-5398B2049201}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7D60CFB-0B20-4582-94C9-5398B2049201}.Release|Any CPU.Build.0 = Release|Any CPU - {5EB62B20-75D1-4945-B7D4-F9466FE67BA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5EB62B20-75D1-4945-B7D4-F9466FE67BA5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5EB62B20-75D1-4945-B7D4-F9466FE67BA5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5EB62B20-75D1-4945-B7D4-F9466FE67BA5}.Release|Any CPU.Build.0 = Release|Any CPU - {56C784C7-3F18-4443-B7B0-03607ED14308}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {56C784C7-3F18-4443-B7B0-03607ED14308}.Debug|Any CPU.Build.0 = Debug|Any CPU - {56C784C7-3F18-4443-B7B0-03607ED14308}.Release|Any CPU.ActiveCfg = Release|Any CPU - {56C784C7-3F18-4443-B7B0-03607ED14308}.Release|Any CPU.Build.0 = Release|Any CPU - {A5A4ED92-71AD-410E-9310-A8BF48D32126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5A4ED92-71AD-410E-9310-A8BF48D32126}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5A4ED92-71AD-410E-9310-A8BF48D32126}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5A4ED92-71AD-410E-9310-A8BF48D32126}.Release|Any CPU.Build.0 = Release|Any CPU - {95C3B040-BD5A-4A80-B5D4-26CAA21B4829}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {95C3B040-BD5A-4A80-B5D4-26CAA21B4829}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95C3B040-BD5A-4A80-B5D4-26CAA21B4829}.Release|Any CPU.ActiveCfg = Release|Any CPU - {95C3B040-BD5A-4A80-B5D4-26CAA21B4829}.Release|Any CPU.Build.0 = Release|Any CPU - {7130EC5B-C987-487A-B319-E91B6D03F5BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7130EC5B-C987-487A-B319-E91B6D03F5BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7130EC5B-C987-487A-B319-E91B6D03F5BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7130EC5B-C987-487A-B319-E91B6D03F5BF}.Release|Any CPU.Build.0 = Release|Any CPU - {632C8D1B-3293-4D02-9ED1-0CB191619334}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {632C8D1B-3293-4D02-9ED1-0CB191619334}.Debug|Any CPU.Build.0 = Debug|Any CPU - {632C8D1B-3293-4D02-9ED1-0CB191619334}.Release|Any CPU.ActiveCfg = Release|Any CPU - {632C8D1B-3293-4D02-9ED1-0CB191619334}.Release|Any CPU.Build.0 = Release|Any CPU - {45EA8028-41C1-4DF6-9E0F-EEE8967799DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45EA8028-41C1-4DF6-9E0F-EEE8967799DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45EA8028-41C1-4DF6-9E0F-EEE8967799DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45EA8028-41C1-4DF6-9E0F-EEE8967799DA}.Release|Any CPU.Build.0 = Release|Any CPU - {7F132098-0C1D-4F3A-B049-ACABF5E35973}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7F132098-0C1D-4F3A-B049-ACABF5E35973}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7F132098-0C1D-4F3A-B049-ACABF5E35973}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7F132098-0C1D-4F3A-B049-ACABF5E35973}.Release|Any CPU.Build.0 = Release|Any CPU - {6C34E9BF-4E05-4A73-B439-75F3369B88A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C34E9BF-4E05-4A73-B439-75F3369B88A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C34E9BF-4E05-4A73-B439-75F3369B88A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C34E9BF-4E05-4A73-B439-75F3369B88A8}.Release|Any CPU.Build.0 = Release|Any CPU - {2996029B-D329-499F-8525-69614A820135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2996029B-D329-499F-8525-69614A820135}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2996029B-D329-499F-8525-69614A820135}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2996029B-D329-499F-8525-69614A820135}.Release|Any CPU.Build.0 = Release|Any CPU - {701E193F-587D-4C20-8970-6E215B0634F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {701E193F-587D-4C20-8970-6E215B0634F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {701E193F-587D-4C20-8970-6E215B0634F8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {701E193F-587D-4C20-8970-6E215B0634F8}.Release|Any CPU.Build.0 = Release|Any CPU - {D340EFB8-128A-4B49-A47A-F00A905D10AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D340EFB8-128A-4B49-A47A-F00A905D10AC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D340EFB8-128A-4B49-A47A-F00A905D10AC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D340EFB8-128A-4B49-A47A-F00A905D10AC}.Release|Any CPU.Build.0 = Release|Any CPU - {AF21B7BD-7399-41B7-B0D4-08ACDC952E50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF21B7BD-7399-41B7-B0D4-08ACDC952E50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF21B7BD-7399-41B7-B0D4-08ACDC952E50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF21B7BD-7399-41B7-B0D4-08ACDC952E50}.Release|Any CPU.Build.0 = Release|Any CPU - {CDBB141A-E0A9-4FD8-8260-1FB1E95C4E80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDBB141A-E0A9-4FD8-8260-1FB1E95C4E80}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDBB141A-E0A9-4FD8-8260-1FB1E95C4E80}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDBB141A-E0A9-4FD8-8260-1FB1E95C4E80}.Release|Any CPU.Build.0 = Release|Any CPU - {8A84D0D5-5AD5-4A76-895A-737AEBBDAA27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A84D0D5-5AD5-4A76-895A-737AEBBDAA27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A84D0D5-5AD5-4A76-895A-737AEBBDAA27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A84D0D5-5AD5-4A76-895A-737AEBBDAA27}.Release|Any CPU.Build.0 = Release|Any CPU - {3FE94073-95E0-4006-ADD6-BBE1FAFBAE75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3FE94073-95E0-4006-ADD6-BBE1FAFBAE75}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3FE94073-95E0-4006-ADD6-BBE1FAFBAE75}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3FE94073-95E0-4006-ADD6-BBE1FAFBAE75}.Release|Any CPU.Build.0 = Release|Any CPU - {1A958468-D9B8-42B0-99CF-0F9358CD0434}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A958468-D9B8-42B0-99CF-0F9358CD0434}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1A958468-D9B8-42B0-99CF-0F9358CD0434}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A958468-D9B8-42B0-99CF-0F9358CD0434}.Release|Any CPU.Build.0 = Release|Any CPU - {B425F5C5-6411-4461-87C3-07F3048A1724}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B425F5C5-6411-4461-87C3-07F3048A1724}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B425F5C5-6411-4461-87C3-07F3048A1724}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B425F5C5-6411-4461-87C3-07F3048A1724}.Release|Any CPU.Build.0 = Release|Any CPU - {24A21CDA-C3A5-49F2-A1B8-1A93E2E64335}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24A21CDA-C3A5-49F2-A1B8-1A93E2E64335}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24A21CDA-C3A5-49F2-A1B8-1A93E2E64335}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24A21CDA-C3A5-49F2-A1B8-1A93E2E64335}.Release|Any CPU.Build.0 = Release|Any CPU - {50871ADE-4513-4AC1-8964-740AB6505B31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50871ADE-4513-4AC1-8964-740AB6505B31}.Debug|Any CPU.Build.0 = Debug|Any CPU - {50871ADE-4513-4AC1-8964-740AB6505B31}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50871ADE-4513-4AC1-8964-740AB6505B31}.Release|Any CPU.Build.0 = Release|Any CPU - {9A70D36D-ACE2-4E6D-89D2-9AC0DEDE3A85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9A70D36D-ACE2-4E6D-89D2-9AC0DEDE3A85}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9A70D36D-ACE2-4E6D-89D2-9AC0DEDE3A85}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9A70D36D-ACE2-4E6D-89D2-9AC0DEDE3A85}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {C79CE0BF-ED4C-47BE-822E-E82CF83FC68A} = {1987061F-8970-4018-8D58-6932961C9EB4} - {7B7CFF27-CB38-4661-9CFC-473B4E38F0DE} = {FEE2B9AB-A1D0-41BA-A172-FC95935542DF} - {2AD48C05-ED44-4E4F-B86B-A746E7F968A9} = {1987061F-8970-4018-8D58-6932961C9EB4} - {5CDEE44D-8AC2-4E7C-90CC-669E336F2D15} = {FEE2B9AB-A1D0-41BA-A172-FC95935542DF} - {FEE2B9AB-A1D0-41BA-A172-FC95935542DF} = {5A3F5158-7B17-4586-9885-9E60C1393185} - {EBF51D3A-A093-4177-865A-D17F816EDEF5} = {5A3F5158-7B17-4586-9885-9E60C1393185} - {93BC9FC7-D157-4541-A05E-C56D31B2F2BC} = {EBF51D3A-A093-4177-865A-D17F816EDEF5} - {38B41013-6FD3-4E99-A7A9-0DBAC0CAF6F5} = {EBF51D3A-A093-4177-865A-D17F816EDEF5} - {5948D82F-EA56-4266-8718-7508C26BFFD4} = {EBF51D3A-A093-4177-865A-D17F816EDEF5} - {72D2C01C-765C-4FE1-89CA-28244DEC7C37} = {1987061F-8970-4018-8D58-6932961C9EB4} - {4DE802A2-426D-4074-B9F3-710980B3EDA8} = {1987061F-8970-4018-8D58-6932961C9EB4} - {45A800CF-C0D0-40A8-B070-9AC2C3E4312F} = {1987061F-8970-4018-8D58-6932961C9EB4} - {80127E7E-FB71-4F68-B52B-2905AD39029B} = {1987061F-8970-4018-8D58-6932961C9EB4} - {E3F88CE3-F892-42AB-9D92-178BC9AD46FD} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {A8550C24-2486-49DA-8D1A-DB6BBB2E9905} = {42EBB7E4-52D7-4E57-80AD-79FDD4900E13} - {B5617CC1-55FD-4F77-BA75-9450474C6527} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {4D5E8486-9A0D-444A-922B-1D94FD8A820A} = {B5617CC1-55FD-4F77-BA75-9450474C6527} - {6DF31417-D091-4E27-963F-75E1D5AC0EA0} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {EC4E0789-6A32-42FA-ABD7-7ED3A5004CFF} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {D0555A91-D817-4322-B8D0-16641069D17B} = {B5617CC1-55FD-4F77-BA75-9450474C6527} - {2FF12B46-BA5C-4B6C-BD94-3556C3F25722} = {A0CED9FB-5B18-4EE3-859F-CE3A6F90A82A} - {D00774F4-6817-4768-8043-4BAAE88B3AE5} = {2FF12B46-BA5C-4B6C-BD94-3556C3F25722} - {3C67CF21-CDAD-4F77-9416-078924700CF8} = {2FF12B46-BA5C-4B6C-BD94-3556C3F25722} - {E7D60CFB-0B20-4582-94C9-5398B2049201} = {2FF12B46-BA5C-4B6C-BD94-3556C3F25722} - {5EB62B20-75D1-4945-B7D4-F9466FE67BA5} = {B5617CC1-55FD-4F77-BA75-9450474C6527} - {56C784C7-3F18-4443-B7B0-03607ED14308} = {1987061F-8970-4018-8D58-6932961C9EB4} - {A5A4ED92-71AD-410E-9310-A8BF48D32126} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {95C3B040-BD5A-4A80-B5D4-26CAA21B4829} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {7130EC5B-C987-487A-B319-E91B6D03F5BF} = {1987061F-8970-4018-8D58-6932961C9EB4} - {632C8D1B-3293-4D02-9ED1-0CB191619334} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {45EA8028-41C1-4DF6-9E0F-EEE8967799DA} = {B5617CC1-55FD-4F77-BA75-9450474C6527} - {E9E11DFE-29C4-4933-A21B-2222646D946E} = {A0CED9FB-5B18-4EE3-859F-CE3A6F90A82A} - {7F132098-0C1D-4F3A-B049-ACABF5E35973} = {E9E11DFE-29C4-4933-A21B-2222646D946E} - {6C34E9BF-4E05-4A73-B439-75F3369B88A8} = {1987061F-8970-4018-8D58-6932961C9EB4} - {2996029B-D329-499F-8525-69614A820135} = {1987061F-8970-4018-8D58-6932961C9EB4} - {701E193F-587D-4C20-8970-6E215B0634F8} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {D340EFB8-128A-4B49-A47A-F00A905D10AC} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {AF21B7BD-7399-41B7-B0D4-08ACDC952E50} = {FEE2B9AB-A1D0-41BA-A172-FC95935542DF} - {F1FD52DD-E8A4-4CF0-A857-1A22443A0324} = {A0CED9FB-5B18-4EE3-859F-CE3A6F90A82A} - {CDBB141A-E0A9-4FD8-8260-1FB1E95C4E80} = {F1FD52DD-E8A4-4CF0-A857-1A22443A0324} - {8A84D0D5-5AD5-4A76-895A-737AEBBDAA27} = {1987061F-8970-4018-8D58-6932961C9EB4} - {3FE94073-95E0-4006-ADD6-BBE1FAFBAE75} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {1A958468-D9B8-42B0-99CF-0F9358CD0434} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - {B425F5C5-6411-4461-87C3-07F3048A1724} = {1987061F-8970-4018-8D58-6932961C9EB4} - {57E6F117-1138-4899-81A2-CC87B20525E4} = {5A3F5158-7B17-4586-9885-9E60C1393185} - {24A21CDA-C3A5-49F2-A1B8-1A93E2E64335} = {57E6F117-1138-4899-81A2-CC87B20525E4} - {50871ADE-4513-4AC1-8964-740AB6505B31} = {57E6F117-1138-4899-81A2-CC87B20525E4} - {9A70D36D-ACE2-4E6D-89D2-9AC0DEDE3A85} = {7ACC27E8-8FBE-4807-B91F-B89AF3CFF7E0} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D5B2E7E3-B727-40A1-BE68-7BAC9B9DE2FE} - EndGlobalSection -EndGlobal diff --git a/MagicOnion.slnx b/MagicOnion.slnx new file mode 100644 index 000000000..2667c5b42 --- /dev/null +++ b/MagicOnion.slnx @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +