diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000..a7923835b
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @danielgerlag @glucaci
diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 83afb451b..253d321bd 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -15,14 +15,30 @@ jobs:
uses: actions/setup-dotnet@v1
with:
dotnet-version: |
- 3.1.x
6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Unit Tests
- run: dotnet test test/WorkflowCore.UnitTests --no-build --verbosity normal -p:ParallelizeTestCollections=false
+ run: dotnet test test/WorkflowCore.UnitTests --no-build --verbosity detailed --logger "trx;LogFileName=UnitTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: Unit Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: unit-test-results
+ path: test-results/
Integration-Tests:
runs-on: ubuntu-latest
steps:
@@ -30,15 +46,31 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: |
- 3.1.x
+ dotnet-version: |
6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Integration Tests
- run: dotnet test test/WorkflowCore.IntegrationTests --no-build --verbosity normal -p:ParallelizeTestCollections=false
+ run: dotnet test test/WorkflowCore.IntegrationTests --no-build --verbosity detailed --logger "trx;LogFileName=IntegrationTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: Integration Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: integration-test-results
+ path: test-results/
MongoDB-Tests:
runs-on: ubuntu-latest
steps:
@@ -46,15 +78,30 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: |
- 3.1.x
+ dotnet-version: |
6.0.x
- - name: Restore dependencies
+ 8.0.x
+ 9.0.x
+ 10.0.x
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: MongoDB Tests
- run: dotnet test test/WorkflowCore.Tests.MongoDB --no-build --verbosity normal -p:ParallelizeTestCollections=false
+ run: dotnet test test/WorkflowCore.Tests.MongoDB --no-build --verbosity detailed --logger "trx;LogFileName=MongoDBTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: MongoDB Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: mongodb-test-results
+ path: test-results/
MySQL-Tests:
runs-on: ubuntu-latest
steps:
@@ -62,15 +109,31 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: |
- 3.1.x
+ dotnet-version: |
6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: MySQL Tests
- run: dotnet test test/WorkflowCore.Tests.MySQL --no-build --verbosity normal -p:ParallelizeTestCollections=false
+ run: dotnet test test/WorkflowCore.Tests.MySQL --no-build --verbosity detailed --logger "trx;LogFileName=MySQLTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: MySQL Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: mysql-test-results
+ path: test-results/
PostgreSQL-Tests:
runs-on: ubuntu-latest
steps:
@@ -78,15 +141,31 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: |
- 3.1.x
+ dotnet-version: |
6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: PostgreSQL Tests
- run: dotnet test test/WorkflowCore.Tests.PostgreSQL --no-build --verbosity normal -p:ParallelizeTestCollections=false
+ run: dotnet test test/WorkflowCore.Tests.PostgreSQL --no-build --verbosity detailed --logger "trx;LogFileName=PostgreSQLTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: PostgreSQL Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: postgresql-test-results
+ path: test-results/
Redis-Tests:
runs-on: ubuntu-latest
steps:
@@ -94,31 +173,63 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: |
- 3.1.x
+ dotnet-version: |
6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Redis Tests
- run: dotnet test test/WorkflowCore.Tests.Redis --no-build --verbosity normal -p:ParallelizeTestCollections=false
+ run: dotnet test test/WorkflowCore.Tests.Redis --no-build --verbosity detailed --logger "trx;LogFileName=RedisTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: Redis Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: redis-test-results
+ path: test-results/
SQLServer-Tests:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: |
- 3.1.x
+ dotnet-version: |
6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: SQL Server Tests
- run: dotnet test test/WorkflowCore.Tests.SqlServer --no-build --verbosity normal -p:ParallelizeTestCollections=false
+ run: dotnet test test/WorkflowCore.Tests.SqlServer --no-build --verbosity detailed --logger "trx;LogFileName=SQLServerTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: SQL Server Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: sqlserver-test-results
+ path: test-results/
Elasticsearch-Tests:
runs-on: ubuntu-latest
steps:
@@ -126,12 +237,60 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: |
- 3.1.x
+ dotnet-version: |
6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Elasticsearch Tests
- run: dotnet test test/WorkflowCore.Tests.Elasticsearch --no-build --verbosity normal -p:ParallelizeTestCollections=false
\ No newline at end of file
+ run: dotnet test test/WorkflowCore.Tests.Elasticsearch --no-build --verbosity detailed --logger "trx;LogFileName=ElasticsearchTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: Elasticsearch Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: elasticsearch-test-results
+ path: test-results/
+ Oracle-Tests:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v1
+ with:
+ dotnet-version: |
+ 6.0.x
+ 8.0.x
+ 9.0.x
+ 10.0.x
+ - name: Restore dependencies
+ run: dotnet restore
+ - name: Build
+ run: dotnet build --no-restore
+ - name: Oracle Tests
+ run: dotnet test test/WorkflowCore.Tests.Oracle --no-build --verbosity detailed --logger "trx;LogFileName=OracleTests.trx" --logger "console;verbosity=detailed" --results-directory ./test-results -p:ParallelizeTestCollections=false
+ - name: Publish Test Results
+ uses: dorny/test-reporter@v1
+ if: success() || failure()
+ with:
+ name: Oracle Test Results
+ path: test-results/*.trx
+ reporter: dotnet-trx
+ fail-on-error: false
+ - name: Upload Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: oracle-test-results
+ path: test-results/
diff --git a/.gitignore b/.gitignore
index 085776751..3ff0a4429 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,8 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
+plans
+
# User-specific files
*.suo
*.user
@@ -247,3 +249,4 @@ ModelManifest.xml
.idea/.idea.WorkflowCore/.idea
riderModule.iml
.DS_Store
+test-results/
diff --git a/README.md b/README.md
index 53ef98486..c129fa840 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
# Workflow Core
[](https://ci.appveyor.com/project/danielgerlag/workflow-core)
+[
](https://api.gitsponsors.com/api/badge/link?p=xj6mObb7nZAJGyuABfd8nD5XWf3SE4oUfw0vmCgSiJeIfNlzJAej0FWX8oFdYm6D7bvZpCf6qANVBNPWid4dRQ==)
Workflow Core is a light weight embeddable workflow engine targeting .NET Standard. Think: long running processes with multiple tasks that need to track state. It supports pluggable persistence and concurrency providers to allow for multi-node clusters.
@@ -139,6 +140,7 @@ There are several persistence providers available as separate Nuget packages.
* [Sqlite](src/providers/WorkflowCore.Persistence.Sqlite)
* [MySQL](src/providers/WorkflowCore.Persistence.MySQL)
* [Redis](src/providers/WorkflowCore.Providers.Redis)
+* [Oracle](src/providers/WorkflowCore.Persistence.Oracle)
## Search
@@ -148,6 +150,7 @@ These are also available as separate Nuget packages.
## Extensions
+* [Azure AI Foundry](src/extensions/WorkflowCore.AI.AzureFoundry)
* [User (human) workflows](src/extensions/WorkflowCore.Users)
@@ -183,12 +186,12 @@ These are also available as separate Nuget packages.
* [Deferred execution & re-entrant steps](src/samples/WorkflowCore.Sample05)
+* [Human(User) Workflow](src/samples/WorkflowCore.Sample08)
+
* [Looping](src/samples/WorkflowCore.Sample02)
* [Exposing a REST API](src/samples/WebApiSample)
-* [Human(User) Workflow](src/samples/WorkflowCore.Sample08)
-
* [Testing](src/samples/WorkflowCore.TestSample01)
diff --git a/WorkflowCore.sln b/WorkflowCore.sln
index e7fb81a2e..685218c34 100644
--- a/WorkflowCore.sln
+++ b/WorkflowCore.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29509.3
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.33424.131
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EF47161E-E399-451C-BDE8-E92AAD3BD761}"
EndProject
@@ -154,228 +154,734 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowCore.Sample19", "sr
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowCore.Persistence.RavenDB", "src\providers\WorkflowCore.Persistence.RavenDB\WorkflowCore.Persistence.RavenDB.csproj", "{AF205715-C8B7-42EF-BF14-AFC9E7F27242}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowCore.Persistence.Oracle", "src\providers\WorkflowCore.Persistence.Oracle\WorkflowCore.Persistence.Oracle.csproj", "{635629BC-9D5C-40C6-BBD0-060550ECE290}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowCore.Tests.Oracle", "test\WorkflowCore.Tests.Oracle\WorkflowCore.Tests.Oracle.csproj", "{A2837F1C-3740-4375-9069-81AE32C867CA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowCore.AI.AzureFoundry", "src\extensions\WorkflowCore.AI.AzureFoundry\WorkflowCore.AI.AzureFoundry.csproj", "{A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowCore.AI.AzureFoundry.Tests", "test\WorkflowCore.AI.AzureFoundry.Tests\WorkflowCore.AI.AzureFoundry.Tests.csproj", "{AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowCore.Sample.AzureFoundry", "src\samples\WorkflowCore.Sample.AzureFoundry\WorkflowCore.Sample.AzureFoundry.csproj", "{D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Debug|x64.Build.0 = Debug|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Debug|x86.Build.0 = Debug|Any CPU
{B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Release|x64.ActiveCfg = Release|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Release|x64.Build.0 = Release|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Release|x86.ActiveCfg = Release|Any CPU
+ {B7B2EA4D-E7F0-43E2-942A-3A5AA8F57272}.Release|x86.Build.0 = Release|Any CPU
{DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Debug|x64.Build.0 = Debug|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Debug|x86.Build.0 = Debug|Any CPU
{DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Release|x64.ActiveCfg = Release|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Release|x64.Build.0 = Release|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Release|x86.ActiveCfg = Release|Any CPU
+ {DD26E7B4-9D3A-4E1E-8585-862DB6DE21EB}.Release|x86.Build.0 = Release|Any CPU
{660FEDAB-D085-476B-9E16-73E42F66DB4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{660FEDAB-D085-476B-9E16-73E42F66DB4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Debug|x64.Build.0 = Debug|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Debug|x86.Build.0 = Debug|Any CPU
{660FEDAB-D085-476B-9E16-73E42F66DB4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{660FEDAB-D085-476B-9E16-73E42F66DB4F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Release|x64.ActiveCfg = Release|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Release|x64.Build.0 = Release|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Release|x86.ActiveCfg = Release|Any CPU
+ {660FEDAB-D085-476B-9E16-73E42F66DB4F}.Release|x86.Build.0 = Release|Any CPU
{BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Debug|x64.Build.0 = Debug|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Debug|x86.Build.0 = Debug|Any CPU
{BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Release|x64.ActiveCfg = Release|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Release|x64.Build.0 = Release|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Release|x86.ActiveCfg = Release|Any CPU
+ {BC6F28F1-9F47-4FFE-AD06-2B74CB89E76B}.Release|x86.Build.0 = Release|Any CPU
{FB738255-0304-4A25-B256-22E36EDF9507}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FB738255-0304-4A25-B256-22E36EDF9507}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Debug|x64.Build.0 = Debug|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Debug|x86.Build.0 = Debug|Any CPU
{FB738255-0304-4A25-B256-22E36EDF9507}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FB738255-0304-4A25-B256-22E36EDF9507}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Release|x64.ActiveCfg = Release|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Release|x64.Build.0 = Release|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Release|x86.ActiveCfg = Release|Any CPU
+ {FB738255-0304-4A25-B256-22E36EDF9507}.Release|x86.Build.0 = Release|Any CPU
{91301F52-E589-499E-97DE-91FA074B790C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91301F52-E589-499E-97DE-91FA074B790C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Debug|x64.Build.0 = Debug|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Debug|x86.Build.0 = Debug|Any CPU
{91301F52-E589-499E-97DE-91FA074B790C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91301F52-E589-499E-97DE-91FA074B790C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Release|x64.ActiveCfg = Release|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Release|x64.Build.0 = Release|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Release|x86.ActiveCfg = Release|Any CPU
+ {91301F52-E589-499E-97DE-91FA074B790C}.Release|x86.Build.0 = Release|Any CPU
{68883A5C-BD59-404D-A394-18104D6F472C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68883A5C-BD59-404D-A394-18104D6F472C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Debug|x64.Build.0 = Debug|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Debug|x86.Build.0 = Debug|Any CPU
{68883A5C-BD59-404D-A394-18104D6F472C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68883A5C-BD59-404D-A394-18104D6F472C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Release|x64.ActiveCfg = Release|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Release|x64.Build.0 = Release|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Release|x86.ActiveCfg = Release|Any CPU
+ {68883A5C-BD59-404D-A394-18104D6F472C}.Release|x86.Build.0 = Release|Any CPU
{FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Debug|x64.Build.0 = Debug|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Debug|x86.Build.0 = Debug|Any CPU
{FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Release|x64.ActiveCfg = Release|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Release|x64.Build.0 = Release|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Release|x86.ActiveCfg = Release|Any CPU
+ {FE54AD67-817A-4CC6-A9EF-C9F7A5122CA4}.Release|x86.Build.0 = Release|Any CPU
{1DE96D4F-F2CA-4740-8764-BADD1000040A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1DE96D4F-F2CA-4740-8764-BADD1000040A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Debug|x64.Build.0 = Debug|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Debug|x86.Build.0 = Debug|Any CPU
{1DE96D4F-F2CA-4740-8764-BADD1000040A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1DE96D4F-F2CA-4740-8764-BADD1000040A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Release|x64.ActiveCfg = Release|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Release|x64.Build.0 = Release|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Release|x86.ActiveCfg = Release|Any CPU
+ {1DE96D4F-F2CA-4740-8764-BADD1000040A}.Release|x86.Build.0 = Release|Any CPU
{9274B938-3996-4FBA-AE2F-0C82009B1116}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9274B938-3996-4FBA-AE2F-0C82009B1116}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Debug|x64.Build.0 = Debug|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Debug|x86.Build.0 = Debug|Any CPU
{9274B938-3996-4FBA-AE2F-0C82009B1116}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9274B938-3996-4FBA-AE2F-0C82009B1116}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Release|x64.ActiveCfg = Release|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Release|x64.Build.0 = Release|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Release|x86.ActiveCfg = Release|Any CPU
+ {9274B938-3996-4FBA-AE2F-0C82009B1116}.Release|x86.Build.0 = Release|Any CPU
{86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Debug|x64.Build.0 = Debug|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Debug|x86.Build.0 = Debug|Any CPU
{86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Release|Any CPU.Build.0 = Release|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Release|x64.ActiveCfg = Release|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Release|x64.Build.0 = Release|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Release|x86.ActiveCfg = Release|Any CPU
+ {86BC1E05-E9CE-4E53-B324-885A2FDBCE74}.Release|x86.Build.0 = Release|Any CPU
{AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Debug|x64.Build.0 = Debug|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Debug|x86.Build.0 = Debug|Any CPU
{AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Release|x64.ActiveCfg = Release|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Release|x64.Build.0 = Release|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Release|x86.ActiveCfg = Release|Any CPU
+ {AFAD87C7-B2EE-451E-BA7E-3F5A91358C48}.Release|x86.Build.0 = Release|Any CPU
{8FEAFD74-C304-4F75-BA38-4686BE55C891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8FEAFD74-C304-4F75-BA38-4686BE55C891}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Debug|x64.Build.0 = Debug|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Debug|x86.Build.0 = Debug|Any CPU
{8FEAFD74-C304-4F75-BA38-4686BE55C891}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8FEAFD74-C304-4F75-BA38-4686BE55C891}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Release|x64.ActiveCfg = Release|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Release|x64.Build.0 = Release|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Release|x86.ActiveCfg = Release|Any CPU
+ {8FEAFD74-C304-4F75-BA38-4686BE55C891}.Release|x86.Build.0 = Release|Any CPU
{37B598A8-B054-4ABA-884D-96AEF2511600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{37B598A8-B054-4ABA-884D-96AEF2511600}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Debug|x64.Build.0 = Debug|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Debug|x86.Build.0 = Debug|Any CPU
{37B598A8-B054-4ABA-884D-96AEF2511600}.Release|Any CPU.ActiveCfg = Release|Any CPU
{37B598A8-B054-4ABA-884D-96AEF2511600}.Release|Any CPU.Build.0 = Release|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Release|x64.ActiveCfg = Release|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Release|x64.Build.0 = Release|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Release|x86.ActiveCfg = Release|Any CPU
+ {37B598A8-B054-4ABA-884D-96AEF2511600}.Release|x86.Build.0 = Release|Any CPU
{17C270A8-EC88-4883-9318-74BB28EFF508}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{17C270A8-EC88-4883-9318-74BB28EFF508}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Debug|x64.Build.0 = Debug|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Debug|x86.Build.0 = Debug|Any CPU
{17C270A8-EC88-4883-9318-74BB28EFF508}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17C270A8-EC88-4883-9318-74BB28EFF508}.Release|Any CPU.Build.0 = Release|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Release|x64.ActiveCfg = Release|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Release|x64.Build.0 = Release|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Release|x86.ActiveCfg = Release|Any CPU
+ {17C270A8-EC88-4883-9318-74BB28EFF508}.Release|x86.Build.0 = Release|Any CPU
{0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Debug|x64.Build.0 = Debug|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Debug|x86.Build.0 = Debug|Any CPU
{0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Release|x64.ActiveCfg = Release|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Release|x64.Build.0 = Release|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Release|x86.ActiveCfg = Release|Any CPU
+ {0631B4BA-D5DD-4C9E-8842-0D370A3D714A}.Release|x86.Build.0 = Release|Any CPU
{9162B6AD-AD06-4C64-9032-0E727643B1B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9162B6AD-AD06-4C64-9032-0E727643B1B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Debug|x64.Build.0 = Debug|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Debug|x86.Build.0 = Debug|Any CPU
{9162B6AD-AD06-4C64-9032-0E727643B1B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9162B6AD-AD06-4C64-9032-0E727643B1B9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Release|x64.ActiveCfg = Release|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Release|x64.Build.0 = Release|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Release|x86.ActiveCfg = Release|Any CPU
+ {9162B6AD-AD06-4C64-9032-0E727643B1B9}.Release|x86.Build.0 = Release|Any CPU
{58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Debug|x64.Build.0 = Debug|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Debug|x86.Build.0 = Debug|Any CPU
{58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Release|Any CPU.ActiveCfg = Release|Any CPU
{58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Release|Any CPU.Build.0 = Release|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Release|x64.ActiveCfg = Release|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Release|x64.Build.0 = Release|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Release|x86.ActiveCfg = Release|Any CPU
+ {58EC09C7-EC0A-4708-9B6F-FBE6243CEB49}.Release|x86.Build.0 = Release|Any CPU
{8C2BD4D2-43EC-4930-9364-CDA938C01803}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8C2BD4D2-43EC-4930-9364-CDA938C01803}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Debug|x64.Build.0 = Debug|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Debug|x86.Build.0 = Debug|Any CPU
{8C2BD4D2-43EC-4930-9364-CDA938C01803}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8C2BD4D2-43EC-4930-9364-CDA938C01803}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Release|x64.ActiveCfg = Release|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Release|x64.Build.0 = Release|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Release|x86.ActiveCfg = Release|Any CPU
+ {8C2BD4D2-43EC-4930-9364-CDA938C01803}.Release|x86.Build.0 = Release|Any CPU
{4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Debug|x64.Build.0 = Debug|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Debug|x86.Build.0 = Debug|Any CPU
{4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Release|x64.ActiveCfg = Release|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Release|x64.Build.0 = Release|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Release|x86.ActiveCfg = Release|Any CPU
+ {4C4DE624-9D91-484F-8BF7-2D71264EAB8B}.Release|x86.Build.0 = Release|Any CPU
{ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Debug|x64.Build.0 = Debug|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Debug|x86.Build.0 = Debug|Any CPU
{ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Release|x64.ActiveCfg = Release|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Release|x64.Build.0 = Release|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Release|x86.ActiveCfg = Release|Any CPU
+ {ED5074AF-A09E-4357-A419-FE3476C0FAE7}.Release|x86.Build.0 = Release|Any CPU
{FBF8D151-A3BF-4EB3-8F80-D71618696362}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FBF8D151-A3BF-4EB3-8F80-D71618696362}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Debug|x64.Build.0 = Debug|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Debug|x86.Build.0 = Debug|Any CPU
{FBF8D151-A3BF-4EB3-8F80-D71618696362}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FBF8D151-A3BF-4EB3-8F80-D71618696362}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Release|x64.ActiveCfg = Release|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Release|x64.Build.0 = Release|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Release|x86.ActiveCfg = Release|Any CPU
+ {FBF8D151-A3BF-4EB3-8F80-D71618696362}.Release|x86.Build.0 = Release|Any CPU
{50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Debug|x64.Build.0 = Debug|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Debug|x86.Build.0 = Debug|Any CPU
{50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Release|x64.ActiveCfg = Release|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Release|x64.Build.0 = Release|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Release|x86.ActiveCfg = Release|Any CPU
+ {50E1AFAC-0B58-43A8-8F03-3A63AAC681FA}.Release|x86.Build.0 = Release|Any CPU
{5E792455-4C4C-460F-849E-50A5DCED454D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5E792455-4C4C-460F-849E-50A5DCED454D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Debug|x64.Build.0 = Debug|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Debug|x86.Build.0 = Debug|Any CPU
{5E792455-4C4C-460F-849E-50A5DCED454D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5E792455-4C4C-460F-849E-50A5DCED454D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Release|x64.ActiveCfg = Release|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Release|x64.Build.0 = Release|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Release|x86.ActiveCfg = Release|Any CPU
+ {5E792455-4C4C-460F-849E-50A5DCED454D}.Release|x86.Build.0 = Release|Any CPU
{58D0480F-D05D-4348-86D9-B0A7255700E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{58D0480F-D05D-4348-86D9-B0A7255700E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Debug|x64.Build.0 = Debug|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Debug|x86.Build.0 = Debug|Any CPU
{58D0480F-D05D-4348-86D9-B0A7255700E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{58D0480F-D05D-4348-86D9-B0A7255700E6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Release|x64.ActiveCfg = Release|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Release|x64.Build.0 = Release|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Release|x86.ActiveCfg = Release|Any CPU
+ {58D0480F-D05D-4348-86D9-B0A7255700E6}.Release|x86.Build.0 = Release|Any CPU
{BB776411-D279-419F-8697-5C6F52BCD5CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB776411-D279-419F-8697-5C6F52BCD5CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Debug|x64.Build.0 = Debug|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Debug|x86.Build.0 = Debug|Any CPU
{BB776411-D279-419F-8697-5C6F52BCD5CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB776411-D279-419F-8697-5C6F52BCD5CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Release|x64.ActiveCfg = Release|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Release|x64.Build.0 = Release|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Release|x86.ActiveCfg = Release|Any CPU
+ {BB776411-D279-419F-8697-5C6F52BCD5CD}.Release|x86.Build.0 = Release|Any CPU
{F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Debug|x64.Build.0 = Debug|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Debug|x86.Build.0 = Debug|Any CPU
{F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Release|x64.ActiveCfg = Release|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Release|x64.Build.0 = Release|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Release|x86.ActiveCfg = Release|Any CPU
+ {F9F8F9CD-01D9-468B-856D-6A87F0762A01}.Release|x86.Build.0 = Release|Any CPU
{A4B8E54D-F8FE-4358-AE14-A5354E828938}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A4B8E54D-F8FE-4358-AE14-A5354E828938}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Debug|x64.Build.0 = Debug|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Debug|x86.Build.0 = Debug|Any CPU
{A4B8E54D-F8FE-4358-AE14-A5354E828938}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A4B8E54D-F8FE-4358-AE14-A5354E828938}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Release|x64.ActiveCfg = Release|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Release|x64.Build.0 = Release|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Release|x86.ActiveCfg = Release|Any CPU
+ {A4B8E54D-F8FE-4358-AE14-A5354E828938}.Release|x86.Build.0 = Release|Any CPU
{AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Debug|x64.Build.0 = Debug|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Debug|x86.Build.0 = Debug|Any CPU
{AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Release|x64.ActiveCfg = Release|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Release|x64.Build.0 = Release|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Release|x86.ActiveCfg = Release|Any CPU
+ {AAE2E9F9-37EF-4AE1-A200-D37417C9040C}.Release|x86.Build.0 = Release|Any CPU
{77C49ACA-203E-428C-A4DB-114DFE454988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{77C49ACA-203E-428C-A4DB-114DFE454988}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Debug|x64.Build.0 = Debug|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Debug|x86.Build.0 = Debug|Any CPU
{77C49ACA-203E-428C-A4DB-114DFE454988}.Release|Any CPU.ActiveCfg = Release|Any CPU
{77C49ACA-203E-428C-A4DB-114DFE454988}.Release|Any CPU.Build.0 = Release|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Release|x64.ActiveCfg = Release|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Release|x64.Build.0 = Release|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Release|x86.ActiveCfg = Release|Any CPU
+ {77C49ACA-203E-428C-A4DB-114DFE454988}.Release|x86.Build.0 = Release|Any CPU
{A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Debug|x64.Build.0 = Debug|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Debug|x86.Build.0 = Debug|Any CPU
{A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Release|x64.ActiveCfg = Release|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Release|x64.Build.0 = Release|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Release|x86.ActiveCfg = Release|Any CPU
+ {A2374B7C-4198-40B3-B8FE-FAC3DB3F2539}.Release|x86.Build.0 = Release|Any CPU
{6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Debug|x64.Build.0 = Debug|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Debug|x86.Build.0 = Debug|Any CPU
{6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Release|x64.ActiveCfg = Release|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Release|x64.Build.0 = Release|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Release|x86.ActiveCfg = Release|Any CPU
+ {6BC66637-B42A-4334-ADFB-DBEC9F29D293}.Release|x86.Build.0 = Release|Any CPU
{62A9709E-27DA-42EE-B94F-5AF431D86354}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62A9709E-27DA-42EE-B94F-5AF431D86354}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Debug|x64.Build.0 = Debug|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Debug|x86.Build.0 = Debug|Any CPU
{62A9709E-27DA-42EE-B94F-5AF431D86354}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62A9709E-27DA-42EE-B94F-5AF431D86354}.Release|Any CPU.Build.0 = Release|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Release|x64.ActiveCfg = Release|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Release|x64.Build.0 = Release|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Release|x86.ActiveCfg = Release|Any CPU
+ {62A9709E-27DA-42EE-B94F-5AF431D86354}.Release|x86.Build.0 = Release|Any CPU
{0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Debug|x64.Build.0 = Debug|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Debug|x86.Build.0 = Debug|Any CPU
{0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Release|x64.ActiveCfg = Release|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Release|x64.Build.0 = Release|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Release|x86.ActiveCfg = Release|Any CPU
+ {0E3C1496-8E7C-411A-A536-C7C9CE4EED4E}.Release|x86.Build.0 = Release|Any CPU
{EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Debug|x64.Build.0 = Debug|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Debug|x86.Build.0 = Debug|Any CPU
{EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Release|x64.ActiveCfg = Release|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Release|x64.Build.0 = Release|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Release|x86.ActiveCfg = Release|Any CPU
+ {EC497168-5347-4E70-9D9E-9C2F826C1CDF}.Release|x86.Build.0 = Release|Any CPU
{9B7811AC-68D6-4D19-B1E9-65423393ED83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9B7811AC-68D6-4D19-B1E9-65423393ED83}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Debug|x64.Build.0 = Debug|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Debug|x86.Build.0 = Debug|Any CPU
{9B7811AC-68D6-4D19-B1E9-65423393ED83}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9B7811AC-68D6-4D19-B1E9-65423393ED83}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Release|x64.ActiveCfg = Release|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Release|x64.Build.0 = Release|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Release|x86.ActiveCfg = Release|Any CPU
+ {9B7811AC-68D6-4D19-B1E9-65423393ED83}.Release|x86.Build.0 = Release|Any CPU
{0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Debug|x64.Build.0 = Debug|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Debug|x86.Build.0 = Debug|Any CPU
{0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Release|x64.ActiveCfg = Release|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Release|x64.Build.0 = Release|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Release|x86.ActiveCfg = Release|Any CPU
+ {0C9617A9-C8B7-45F6-A54A-261A23AC881B}.Release|x86.Build.0 = Release|Any CPU
{42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Debug|x64.Build.0 = Debug|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Debug|x86.Build.0 = Debug|Any CPU
{42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Release|Any CPU.ActiveCfg = Release|Any CPU
{42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Release|x64.ActiveCfg = Release|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Release|x64.Build.0 = Release|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Release|x86.ActiveCfg = Release|Any CPU
+ {42F475BC-95F4-42E1-8CCD-7B9C27487E33}.Release|x86.Build.0 = Release|Any CPU
{7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Debug|x64.Build.0 = Debug|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Debug|x86.Build.0 = Debug|Any CPU
{7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Release|x64.ActiveCfg = Release|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Release|x64.Build.0 = Release|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Release|x86.ActiveCfg = Release|Any CPU
+ {7EDD9353-F5C2-414C-AE51-4B0F1C5E105A}.Release|x86.Build.0 = Release|Any CPU
{5E82A137-0954-46A1-8C46-13C00F0E4842}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5E82A137-0954-46A1-8C46-13C00F0E4842}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Debug|x64.Build.0 = Debug|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Debug|x86.Build.0 = Debug|Any CPU
{5E82A137-0954-46A1-8C46-13C00F0E4842}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5E82A137-0954-46A1-8C46-13C00F0E4842}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Release|x64.ActiveCfg = Release|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Release|x64.Build.0 = Release|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Release|x86.ActiveCfg = Release|Any CPU
+ {5E82A137-0954-46A1-8C46-13C00F0E4842}.Release|x86.Build.0 = Release|Any CPU
{453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Debug|x64.Build.0 = Debug|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Debug|x86.Build.0 = Debug|Any CPU
{453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Release|Any CPU.ActiveCfg = Release|Any CPU
{453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Release|Any CPU.Build.0 = Release|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Release|x64.ActiveCfg = Release|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Release|x64.Build.0 = Release|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Release|x86.ActiveCfg = Release|Any CPU
+ {453E260D-DBDC-4DDC-BC9C-CA500CED7897}.Release|x86.Build.0 = Release|Any CPU
{DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Debug|x64.Build.0 = Debug|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Debug|x86.Build.0 = Debug|Any CPU
{DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Release|x64.ActiveCfg = Release|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Release|x64.Build.0 = Release|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Release|x86.ActiveCfg = Release|Any CPU
+ {DF7F7ECA-1771-40C9-9CD0-AFEFC44E60DE}.Release|x86.Build.0 = Release|Any CPU
{3ECEC028-7E2C-4983-B928-26C073B51BB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3ECEC028-7E2C-4983-B928-26C073B51BB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Debug|x64.Build.0 = Debug|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Debug|x86.Build.0 = Debug|Any CPU
{3ECEC028-7E2C-4983-B928-26C073B51BB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3ECEC028-7E2C-4983-B928-26C073B51BB7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Release|x64.ActiveCfg = Release|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Release|x64.Build.0 = Release|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Release|x86.ActiveCfg = Release|Any CPU
+ {3ECEC028-7E2C-4983-B928-26C073B51BB7}.Release|x86.Build.0 = Release|Any CPU
{435C6263-C6F8-4E93-B417-D861E9C22E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{435C6263-C6F8-4E93-B417-D861E9C22E18}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Debug|x64.Build.0 = Debug|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Debug|x86.Build.0 = Debug|Any CPU
{435C6263-C6F8-4E93-B417-D861E9C22E18}.Release|Any CPU.ActiveCfg = Release|Any CPU
{435C6263-C6F8-4E93-B417-D861E9C22E18}.Release|Any CPU.Build.0 = Release|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Release|x64.ActiveCfg = Release|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Release|x64.Build.0 = Release|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Release|x86.ActiveCfg = Release|Any CPU
+ {435C6263-C6F8-4E93-B417-D861E9C22E18}.Release|x86.Build.0 = Release|Any CPU
{F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Debug|x64.Build.0 = Debug|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Debug|x86.Build.0 = Debug|Any CPU
{F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Release|x64.ActiveCfg = Release|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Release|x64.Build.0 = Release|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Release|x86.ActiveCfg = Release|Any CPU
+ {F6348170-B695-4D97-BAE6-4F0F643F3BEF}.Release|x86.Build.0 = Release|Any CPU
{44644716-0CE8-4837-B189-AB65AE2106AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{44644716-0CE8-4837-B189-AB65AE2106AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Debug|x64.Build.0 = Debug|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Debug|x86.Build.0 = Debug|Any CPU
{44644716-0CE8-4837-B189-AB65AE2106AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{44644716-0CE8-4837-B189-AB65AE2106AA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Release|x64.ActiveCfg = Release|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Release|x64.Build.0 = Release|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Release|x86.ActiveCfg = Release|Any CPU
+ {44644716-0CE8-4837-B189-AB65AE2106AA}.Release|x86.Build.0 = Release|Any CPU
{78217204-B873-40B9-8875-E3925B2FBCEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{78217204-B873-40B9-8875-E3925B2FBCEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Debug|x64.Build.0 = Debug|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Debug|x86.Build.0 = Debug|Any CPU
{78217204-B873-40B9-8875-E3925B2FBCEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{78217204-B873-40B9-8875-E3925B2FBCEC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Release|x64.ActiveCfg = Release|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Release|x64.Build.0 = Release|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Release|x86.ActiveCfg = Release|Any CPU
+ {78217204-B873-40B9-8875-E3925B2FBCEC}.Release|x86.Build.0 = Release|Any CPU
{20B98905-08CB-4854-8E2C-A31A078383E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20B98905-08CB-4854-8E2C-A31A078383E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Debug|x64.Build.0 = Debug|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Debug|x86.Build.0 = Debug|Any CPU
{20B98905-08CB-4854-8E2C-A31A078383E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20B98905-08CB-4854-8E2C-A31A078383E9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Release|x64.ActiveCfg = Release|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Release|x64.Build.0 = Release|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Release|x86.ActiveCfg = Release|Any CPU
+ {20B98905-08CB-4854-8E2C-A31A078383E9}.Release|x86.Build.0 = Release|Any CPU
{5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Debug|x64.Build.0 = Debug|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Debug|x86.Build.0 = Debug|Any CPU
{5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Release|x64.ActiveCfg = Release|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Release|x64.Build.0 = Release|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Release|x86.ActiveCfg = Release|Any CPU
+ {5BE6D628-B9DB-4C76-AAEB-8F3800509A84}.Release|x86.Build.0 = Release|Any CPU
{E32CF21A-29CC-46D1-8044-FCC327F2B281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E32CF21A-29CC-46D1-8044-FCC327F2B281}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Debug|x64.Build.0 = Debug|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Debug|x86.Build.0 = Debug|Any CPU
{E32CF21A-29CC-46D1-8044-FCC327F2B281}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E32CF21A-29CC-46D1-8044-FCC327F2B281}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Release|x64.ActiveCfg = Release|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Release|x64.Build.0 = Release|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Release|x86.ActiveCfg = Release|Any CPU
+ {E32CF21A-29CC-46D1-8044-FCC327F2B281}.Release|x86.Build.0 = Release|Any CPU
{51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Debug|x64.Build.0 = Debug|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Debug|x86.Build.0 = Debug|Any CPU
{51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Release|x64.ActiveCfg = Release|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Release|x64.Build.0 = Release|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Release|x86.ActiveCfg = Release|Any CPU
+ {51BB7DCD-01DD-453D-A1E7-17E5E3DBB14C}.Release|x86.Build.0 = Release|Any CPU
{54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Debug|x64.Build.0 = Debug|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Debug|x86.Build.0 = Debug|Any CPU
{54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Release|Any CPU.ActiveCfg = Release|Any CPU
{54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Release|Any CPU.Build.0 = Release|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Release|x64.ActiveCfg = Release|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Release|x64.Build.0 = Release|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Release|x86.ActiveCfg = Release|Any CPU
+ {54DE20BA-EBA7-4BF0-9BD9-F03766849716}.Release|x86.Build.0 = Release|Any CPU
{1223ED47-3E5E-4960-B70D-DFAF550F6666}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1223ED47-3E5E-4960-B70D-DFAF550F6666}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Debug|x64.Build.0 = Debug|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Debug|x86.Build.0 = Debug|Any CPU
{1223ED47-3E5E-4960-B70D-DFAF550F6666}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1223ED47-3E5E-4960-B70D-DFAF550F6666}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Release|x64.ActiveCfg = Release|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Release|x64.Build.0 = Release|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Release|x86.ActiveCfg = Release|Any CPU
+ {1223ED47-3E5E-4960-B70D-DFAF550F6666}.Release|x86.Build.0 = Release|Any CPU
{AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Debug|x64.Build.0 = Debug|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Debug|x86.Build.0 = Debug|Any CPU
{AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Release|x64.ActiveCfg = Release|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Release|x64.Build.0 = Release|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Release|x86.ActiveCfg = Release|Any CPU
+ {AF205715-C8B7-42EF-BF14-AFC9E7F27242}.Release|x86.Build.0 = Release|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Debug|x64.Build.0 = Debug|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Debug|x86.Build.0 = Debug|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Release|Any CPU.Build.0 = Release|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Release|x64.ActiveCfg = Release|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Release|x64.Build.0 = Release|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Release|x86.ActiveCfg = Release|Any CPU
+ {635629BC-9D5C-40C6-BBD0-060550ECE290}.Release|x86.Build.0 = Release|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Debug|x64.Build.0 = Debug|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Debug|x86.Build.0 = Debug|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Release|x64.ActiveCfg = Release|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Release|x64.Build.0 = Release|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Release|x86.ActiveCfg = Release|Any CPU
+ {A2837F1C-3740-4375-9069-81AE32C867CA}.Release|x86.Build.0 = Release|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Debug|x64.Build.0 = Debug|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Debug|x86.Build.0 = Debug|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Release|x64.ActiveCfg = Release|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Release|x64.Build.0 = Release|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Release|x86.ActiveCfg = Release|Any CPU
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1}.Release|x86.Build.0 = Release|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Debug|x64.Build.0 = Debug|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Debug|x86.Build.0 = Debug|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Release|x64.ActiveCfg = Release|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Release|x64.Build.0 = Release|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Release|x86.ActiveCfg = Release|Any CPU
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8}.Release|x86.Build.0 = Release|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Debug|x64.Build.0 = Debug|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Debug|x86.Build.0 = Debug|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Release|x64.ActiveCfg = Release|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Release|x64.Build.0 = Release|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Release|x86.ActiveCfg = Release|Any CPU
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -438,6 +944,11 @@ Global
{54DE20BA-EBA7-4BF0-9BD9-F03766849716} = {E6CEAD8D-F565-471E-A0DC-676F54EAEDEB}
{1223ED47-3E5E-4960-B70D-DFAF550F6666} = {5080DB09-CBE8-4C45-9957-C3BB7651755E}
{AF205715-C8B7-42EF-BF14-AFC9E7F27242} = {2EEE6ABD-EE9B-473F-AF2D-6DABB85D7BA2}
+ {635629BC-9D5C-40C6-BBD0-060550ECE290} = {2EEE6ABD-EE9B-473F-AF2D-6DABB85D7BA2}
+ {A2837F1C-3740-4375-9069-81AE32C867CA} = {E6CEAD8D-F565-471E-A0DC-676F54EAEDEB}
+ {A74FFAE5-9788-4C0D-9F77-AF6F6468A1A1} = {6803696C-B19A-4B27-9193-082A02B6F205}
+ {AAB9DDFF-0A0A-43BE-BF00-2BA13ED526C8} = {E6CEAD8D-F565-471E-A0DC-676F54EAEDEB}
+ {D75C8112-6A4D-4A13-BB79-2D23DF66E4CB} = {5080DB09-CBE8-4C45-9957-C3BB7651755E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DC0FA8D3-6449-4FDA-BB46-ECF58FAD23B4}
diff --git a/docs/azure-ai-foundry.md b/docs/azure-ai-foundry.md
new file mode 100644
index 000000000..29e3ed799
--- /dev/null
+++ b/docs/azure-ai-foundry.md
@@ -0,0 +1,452 @@
+# Azure AI Foundry Extension
+
+The Azure AI Foundry extension enables building AI-powered, agentic workflows with WorkflowCore. It provides workflow steps for LLM invocation, automatic tool execution, embeddings, vector search, and human-in-the-loop review patterns.
+
+## Installation
+
+```bash
+dotnet add package WorkflowCore.AI.AzureFoundry
+```
+
+## Overview
+
+This extension adds six new workflow step types:
+
+| Step | Description |
+|------|-------------|
+| `ChatCompletion` | Invoke LLMs with conversation history |
+| `AgentLoop` | Agentic workflows with automatic tool calling |
+| `ExecuteTool` | Manual tool execution |
+| `GenerateEmbedding` | Create vector embeddings |
+| `VectorSearch` | Semantic search with Azure AI Search |
+| `HumanReview` | Pause for human approval |
+
+## Configuration
+
+### Basic Setup
+
+```csharp
+services.AddWorkflow();
+
+services.AddAzureFoundry(options =>
+{
+ options.Endpoint = "https://myresource.services.ai.azure.com";
+ options.ApiKey = "your-api-key";
+ options.DefaultModel = "gpt-4o";
+});
+```
+
+### Configuration Options
+
+| Option | Type | Description |
+|--------|------|-------------|
+| `Endpoint` | string | Azure AI Foundry endpoint URL |
+| `ApiKey` | string | API key for authentication |
+| `Credential` | TokenCredential | Azure AD credential (alternative to ApiKey) |
+| `DefaultModel` | string | Default LLM model name |
+| `DefaultEmbeddingModel` | string | Default embedding model |
+| `DefaultTemperature` | float | Default creativity level (0-1) |
+| `DefaultMaxTokens` | int | Default response token limit |
+| `SearchEndpoint` | string | Azure AI Search endpoint (optional) |
+| `SearchApiKey` | string | Azure AI Search API key (optional) |
+
+## Chat Completion
+
+The simplest way to invoke an LLM in your workflow:
+
+```csharp
+public class SimpleChatWorkflow : IWorkflow
+{
+ public void Build(IWorkflowBuilder builder)
+ {
+ builder
+ .StartWith(context => ExecutionResult.Next())
+ .ChatCompletion(cfg => cfg
+ .SystemPrompt("You are a helpful assistant")
+ .UserMessage(data => data.Question)
+ .OutputTo(data => data.Answer));
+ }
+}
+```
+
+### With Conversation History
+
+Enable multi-turn conversations:
+
+```csharp
+.ChatCompletion(cfg => cfg
+ .SystemPrompt("You are a helpful assistant")
+ .UserMessage(data => data.Question)
+ .WithHistory() // Maintains conversation context
+ .OutputTo(data => data.Answer));
+```
+
+## Agentic Workflows
+
+The `AgentLoop` step enables autonomous AI agents that can use tools to accomplish tasks:
+
+```csharp
+public class SupportAgentWorkflow : IWorkflow
+{
+ public void Build(IWorkflowBuilder builder)
+ {
+ builder
+ .StartWith(context => ExecutionResult.Next())
+ .AgentLoop(cfg => cfg
+ .SystemPrompt(@"You are a customer support agent.
+ Use the available tools to help customers.
+ Always search the knowledge base before answering.")
+ .Message(data => data.CustomerQuery)
+ .WithTool()
+ .WithTool()
+ .WithTool()
+ .MaxIterations(10)
+ .OutputTo(data => data.Response));
+ }
+}
+```
+
+### How Agent Loop Works
+
+1. The LLM receives the user message and tool definitions
+2. If the LLM decides to use a tool, it returns a tool call request
+3. The step executes the tool and feeds the result back to the LLM
+4. This continues until the LLM provides a final response (or max iterations)
+
+```
+User Message → LLM → Tool Call → Tool Execution → Result → LLM → ... → Final Response
+```
+
+## Creating Tools
+
+Tools extend the LLM's capabilities by allowing it to take actions:
+
+```csharp
+public class SearchKnowledgeBase : IAgentTool
+{
+ private readonly IKnowledgeBaseService _kb;
+
+ public SearchKnowledgeBase(IKnowledgeBaseService kb)
+ {
+ _kb = kb;
+ }
+
+ public string Name => "search_knowledge_base";
+
+ public string Description =>
+ "Search the knowledge base for articles matching the query";
+
+ public string ParametersSchema => @"{
+ ""type"": ""object"",
+ ""properties"": {
+ ""query"": {
+ ""type"": ""string"",
+ ""description"": ""Search query""
+ },
+ ""category"": {
+ ""type"": ""string"",
+ ""description"": ""Optional category filter""
+ }
+ },
+ ""required"": [""query""]
+ }";
+
+ public async Task ExecuteAsync(
+ string toolCallId,
+ string arguments,
+ CancellationToken ct)
+ {
+ var args = JsonSerializer.Deserialize(arguments);
+ var results = await _kb.SearchAsync(args.Query, args.Category, ct);
+
+ if (results.Any())
+ {
+ return ToolResult.Succeeded(
+ toolCallId,
+ Name,
+ JsonSerializer.Serialize(results));
+ }
+
+ return ToolResult.Succeeded(
+ toolCallId,
+ Name,
+ "No articles found matching the query.");
+ }
+}
+```
+
+### Registering Tools
+
+```csharp
+// In your DI setup
+services.AddSingleton();
+services.AddSingleton();
+
+// After building service provider
+var toolRegistry = serviceProvider.GetRequiredService();
+toolRegistry.Register(serviceProvider.GetRequiredService());
+toolRegistry.Register(serviceProvider.GetRequiredService());
+```
+
+## Human-in-the-Loop
+
+For workflows requiring human oversight of AI outputs:
+
+```csharp
+public class ContentReviewWorkflow : IWorkflow
+{
+ public void Build(IWorkflowBuilder builder)
+ {
+ builder
+ .StartWith(context => ExecutionResult.Next())
+
+ // Generate content with AI
+ .ChatCompletion(cfg => cfg
+ .SystemPrompt("Generate marketing copy for the product")
+ .UserMessage(data => data.ProductDescription)
+ .OutputTo(data => data.DraftContent))
+
+ // Human reviews before publishing
+ .HumanReview(cfg => cfg
+ .Content(data => data.DraftContent)
+ .Reviewer(data => data.AssignedEditor)
+ .Prompt("Review this AI-generated marketing copy")
+ .OnApproved(data => data.ApprovedContent)
+ .OnDecision(data => data.ReviewDecision))
+
+ // Continue based on decision
+ .If(data => data.ReviewDecision == ReviewDecision.Approved)
+ .Do(then => then
+ .Then()
+ .Input(step => step.Content, data => data.ApprovedContent));
+ }
+}
+```
+
+### Getting the Event Key
+
+There are two ways to get the event key for completing a review:
+
+**Option 1: Use the workflow ID (simplest)**
+
+By default, if you don't provide a `CorrelationId`, the event key equals the workflow ID:
+
+```csharp
+// Start workflow
+var workflowId = await host.StartWorkflow("ContentReview", data);
+
+// Later, complete the review using workflowId as the event key
+await host.PublishEvent("HumanReview", workflowId, reviewAction);
+```
+
+**Option 2: Use a custom correlation ID**
+
+Provide your own correlation ID (e.g., a ticket ID, request ID) for easier integration:
+
+```csharp
+// In your workflow
+.HumanReview(cfg => cfg
+ .Content(data => data.DraftContent)
+ .CorrelationId(data => data.TicketId) // Use your own ID
+ .OnApproved(data => data.ApprovedContent))
+
+// Complete the review using your known ID
+await host.PublishEvent("HumanReview", "TICKET-12345", reviewAction);
+```
+
+**Option 3: Capture the event key in workflow data**
+
+Output the event key to your workflow data for later use:
+
+```csharp
+.HumanReview(cfg => cfg
+ .Content(data => data.DraftContent)
+ .OnEventKey(data => data.ReviewEventKey) // Capture the key
+ .OnApproved(data => data.ApprovedContent))
+```
+
+### Completing Reviews
+
+From your UI or API, publish an event to complete the review:
+
+```csharp
+await workflowHost.PublishEvent(
+ "HumanReview",
+ eventKey, // The workflow ID, custom correlation ID, or captured event key
+ new ReviewAction
+ {
+ Decision = ReviewDecision.Approved,
+ Reviewer = "editor@example.com",
+ Comments = "Approved with minor edits",
+ ModifiedContent = "Updated content..." // Optional, for modifications
+ });
+```
+
+## RAG (Retrieval-Augmented Generation)
+
+Combine vector search with LLM generation for knowledge-grounded responses:
+
+```csharp
+public class RAGWorkflow : IWorkflow
+{
+ public void Build(IWorkflowBuilder builder)
+ {
+ builder
+ .StartWith(context => ExecutionResult.Next())
+
+ // Search for relevant documents
+ .VectorSearch(cfg => cfg
+ .Input(s => s.Query, data => data.UserQuestion)
+ .Input(s => s.IndexName, data => "company-docs")
+ .Input(s => s.TopK, data => 5)
+ .Output(s => s.Results, data => data.RelevantDocs))
+
+ // Generate answer grounded in documents
+ .ChatCompletion(cfg => cfg
+ .SystemPrompt(data => $@"Answer based on these documents:
+ {string.Join("\n", data.RelevantDocs.Select(d => d.Content))}
+ If the answer isn't in the documents, say so.")
+ .UserMessage(data => data.UserQuestion)
+ .OutputTo(data => data.Answer));
+ }
+}
+```
+
+## Embeddings
+
+Generate embeddings for semantic search or similarity:
+
+```csharp
+.GenerateEmbedding(cfg => cfg
+ .Input(s => s.Text, data => data.Document)
+ .Output(s => s.Embedding, data => data.DocumentVector));
+```
+
+## Authentication
+
+### API Key (Simplest)
+
+```csharp
+options.ApiKey = Environment.GetEnvironmentVariable("AZURE_AI_API_KEY");
+```
+
+### Managed Identity (Production)
+
+```csharp
+options.Credential = new ManagedIdentityCredential();
+```
+
+### Service Principal
+
+```csharp
+options.Credential = new ClientSecretCredential(
+ tenantId: "your-tenant-id",
+ clientId: "your-client-id",
+ clientSecret: "your-client-secret"
+);
+```
+
+## Best Practices
+
+### 1. Set Iteration Limits
+
+Always set `MaxIterations` on `AgentLoop` to prevent runaway costs:
+
+```csharp
+.AgentLoop(cfg => cfg
+ .MaxIterations(10) // Stop after 10 LLM calls
+ ...);
+```
+
+### 2. Write Clear Tool Descriptions
+
+The LLM uses descriptions to decide when to use tools:
+
+```csharp
+// ❌ Bad
+public string Description => "Gets weather";
+
+// ✅ Good
+public string Description =>
+ "Get the current weather conditions for a specific city. " +
+ "Returns temperature, humidity, and conditions.";
+```
+
+### 3. Use System Prompts Effectively
+
+Guide the agent's behavior with clear instructions:
+
+```csharp
+.AgentLoop(cfg => cfg
+ .SystemPrompt(@"You are a customer support agent.
+
+ Guidelines:
+ 1. Always be polite and professional
+ 2. Search the knowledge base before answering
+ 3. If you can't help, create a support ticket
+ 4. Never share sensitive customer data")
+ ...);
+```
+
+### 4. Track Token Usage
+
+Monitor costs by tracking token consumption:
+
+```csharp
+.ChatCompletion(cfg => cfg
+ ...
+ .OutputTokensTo(data => data.TokensUsed));
+
+// In your application
+logger.LogInformation("Request used {Tokens} tokens", data.TokensUsed);
+```
+
+### 5. Handle Tool Errors Gracefully
+
+Return meaningful error messages from tools:
+
+```csharp
+public async Task ExecuteAsync(...)
+{
+ try
+ {
+ var result = await DoWork();
+ return ToolResult.Succeeded(id, Name, result);
+ }
+ catch (NotFoundException)
+ {
+ return ToolResult.Succeeded(id, Name,
+ "No results found. Try a different search query.");
+ }
+ catch (Exception ex)
+ {
+ logger.LogError(ex, "Tool execution failed");
+ return ToolResult.Failed(id, Name,
+ "An error occurred. Please try again.");
+ }
+}
+```
+
+## Samples
+
+See the [sample project](https://github.com/danielgerlag/workflow-core/tree/master/src/samples/WorkflowCore.Sample.AzureFoundry) for complete working examples.
+
+## Troubleshooting
+
+### 404 Resource Not Found
+
+Ensure your endpoint ends correctly:
+- Azure AI Foundry: `https://resource.services.ai.azure.com`
+- The extension automatically appends `/models` to the endpoint
+
+### Authentication Errors
+
+1. Verify your API key or credentials
+2. Check that your Azure AD app has the required permissions
+3. For managed identity, ensure the identity has access to the AI resource
+
+### Tool Not Being Called
+
+1. Check the tool description is clear about when to use it
+2. Verify the tool is registered in the `IToolRegistry`
+3. Check the tool's `ParametersSchema` is valid JSON Schema
diff --git a/docs/enhanced-test-reporting.md b/docs/enhanced-test-reporting.md
new file mode 100644
index 000000000..50675658d
--- /dev/null
+++ b/docs/enhanced-test-reporting.md
@@ -0,0 +1,111 @@
+# Enhanced Test Reporting for GitHub Actions
+
+This document explains the enhanced test reporting capabilities that have been added to the GitHub Actions workflow.
+
+## Overview
+
+The GitHub Actions workflow has been enhanced to provide detailed, individual test results for all test suites in the Workflow Core project. This addresses the requirement to see detailed, individual test results from tests run by GitHub workflows.
+
+## Key Enhancements
+
+### 1. Detailed Test Output
+- **Enhanced Verbosity**: Changed from `--verbosity normal` to `--verbosity detailed`
+- **Detailed Console Logging**: Added `--logger "console;verbosity=detailed"` for comprehensive console output
+- **Individual Test Results**: Each test case now shows its execution status, duration, and any error details
+
+### 2. TRX Test Result Files
+- **TRX Format**: Added `--logger "trx;LogFileName={TestSuite}.trx"` to generate XML test result files
+- **Structured Data**: TRX files contain structured test data including:
+ - Test names and fully qualified names
+ - Test outcomes (Passed, Failed, Skipped)
+ - Execution times and durations
+ - Error messages and stack traces for failed tests
+ - Test categories and traits
+
+### 3. GitHub Actions Test Reporting
+- **Test Reporter Integration**: Added `dorny/test-reporter@v1` action to display test results in the GitHub UI
+- **PR Integration**: Test results are automatically displayed in pull request checks
+- **Visual Test Summary**: Failed tests are highlighted with detailed error information
+- **Test Status Annotations**: Test results appear as GitHub Actions annotations
+
+### 4. Test Result Artifacts
+- **Downloadable Results**: Test result files are uploaded as artifacts for each job
+- **Persistent Storage**: Test results are available for download even after workflow completion
+- **Individual Job Results**: Each test suite (Unit, Integration, MongoDB, etc.) has separate artifacts
+
+## What You'll See
+
+### In GitHub Actions Logs
+Before (old format):
+```
+Starting test execution, please wait...
+A total of 1 test files matched the specified pattern.
+Passed! - Failed: 0, Passed: 25, Skipped: 0, Total: 25
+```
+
+After (enhanced format):
+```
+Starting test execution, please wait...
+A total of 1 test files matched the specified pattern.
+
+ Passed WorkflowCore.UnitTests.Services.ExecutionResultProcessorFixture.should_advance_workflow [< 1 ms]
+ Passed WorkflowCore.UnitTests.Services.ExecutionResultProcessorFixture.should_branch_children [2 ms]
+ Failed WorkflowCore.UnitTests.Services.SomeTest.example_failing_test [15 ms]
+ Error Message:
+ Assert.Equal() Failure
+ Expected: True
+ Actual: False
+ Stack Trace:
+ at WorkflowCore.UnitTests.Services.SomeTest.example_failing_test() in /path/to/test.cs:line 42
+
+Test Run Summary:
+ Total tests: 25
+ Passed: 24
+ Failed: 1
+ Skipped: 0
+```
+
+### In GitHub Pull Requests
+- ✅ **Test Status Checks**: Clear pass/fail status for each test suite
+- 📊 **Test Summary**: Number of passed, failed, and skipped tests
+- 🔍 **Detailed Failure Information**: Click-through to see specific test failures
+- 📁 **Downloadable Artifacts**: Access to complete test result files
+
+### Available Artifacts
+Each test job now produces downloadable artifacts:
+- `unit-test-results`: Unit test TRX files and logs
+- `integration-test-results`: Integration test TRX files and logs
+- `mongodb-test-results`: MongoDB-specific test results
+- `mysql-test-results`: MySQL-specific test results
+- `postgresql-test-results`: PostgreSQL-specific test results
+- `redis-test-results`: Redis-specific test results
+- `sqlserver-test-results`: SQL Server-specific test results
+- `elasticsearch-test-results`: Elasticsearch-specific test results
+- `oracle-test-results`: Oracle-specific test results
+
+## Benefits
+
+1. **Individual Test Visibility**: See exactly which tests pass or fail
+2. **Debugging Support**: Detailed error messages and stack traces
+3. **Performance Monitoring**: Test execution times for performance analysis
+4. **Historical Data**: Downloadable test results for trend analysis
+5. **CI/CD Integration**: Better integration with GitHub's native test reporting features
+6. **Developer Experience**: Faster identification of test issues in pull requests
+
+## File Structure
+
+After test execution, the following files are generated:
+```
+test-results/
+├── UnitTests.trx
+├── IntegrationTests.trx
+├── MongoDBTests.trx
+├── MySQLTests.trx
+├── PostgreSQLTests.trx
+├── RedisTests.trx
+├── SQLServerTests.trx
+├── ElasticsearchTests.trx
+└── OracleTests.trx
+```
+
+Each TRX file contains detailed XML data about the test execution results that can be consumed by various reporting tools and integrated development environments.
\ No newline at end of file
diff --git a/docs/extensions.md b/docs/extensions.md
index e370f2b81..ceae2a382 100644
--- a/docs/extensions.md
+++ b/docs/extensions.md
@@ -1,3 +1,4 @@
## Extensions
-* [User (human) workflows](https://github.com/danielgerlag/workflow-core/tree/master/src/extensions/WorkflowCore.Users)
\ No newline at end of file
+* [User (human) workflows](https://github.com/danielgerlag/workflow-core/tree/master/src/extensions/WorkflowCore.Users)
+* [Azure AI Foundry](azure-ai-foundry.md) - AI-powered agentic workflows with LLM invocation, tool execution, and human-in-the-loop patterns
\ No newline at end of file
diff --git a/docs/images/performance-test-workflows-latency.png b/docs/images/performance-test-workflows-latency.png
new file mode 100644
index 000000000..621fc2760
Binary files /dev/null and b/docs/images/performance-test-workflows-latency.png differ
diff --git a/docs/images/performance-test-workflows-per-second.png b/docs/images/performance-test-workflows-per-second.png
new file mode 100644
index 000000000..8c4b61754
Binary files /dev/null and b/docs/images/performance-test-workflows-per-second.png differ
diff --git a/docs/performance.md b/docs/performance.md
new file mode 100644
index 000000000..77fa625a6
--- /dev/null
+++ b/docs/performance.md
@@ -0,0 +1,87 @@
+# Performance Test
+
+Workflow-core version 3.7.0 was put under test to evaluate its performance. The setup used was single node with the default MemoryPersistenceProvider persistence provider.
+
+## Methodology
+
+- Test Environment - Test were run on following two environments one after the other to see how workflow-core performance with a lower vs higher hardware configuration.
+ - Lower configuration
+ - Cores: 8 vCPU ([Standard_D8s_v3](https://learn.microsoft.com/azure/virtual-machines/dv3-dsv3-series))
+ - RAM: 32 GB
+ - OS: Linux Ubuntu 20.04
+ - dotNet 6
+ - Higher configuration
+ - Cores: 32 vCPU ([Standard_D32as_v4](https://learn.microsoft.com/azure/virtual-machines/dav4-dasv4-series))
+ - RAM: 128 GB
+ - OS: Linux Ubuntu 20.04
+ - dotNet 6
+- Test Workflow: Workflow consist of 3 basic steps. These 3 simple steps were chosen to test the performance of the workflow engine with minimal yet sufficient complexity and to avoid any external dependencies.
+ - Step1 : Generate a [random number](https://learn.microsoft.com/dotnet/api/system.random?view=net-6.0) between 1 to 10 and print it on standard output.
+ - Step2 : [Conditional step](https://github.com/danielgerlag/workflow-core/blob/master/docs/control-structures.md)
+ - Step 2.1: If value generate in step1 is > 5 then print it on standard output.
+ - Step 2.2: If value generate in step1 is <= 5 then print it on standard output.
+ - Step3: Prints a good bye message on standard output.
+- Test tools:
+ - [NBomber](https://nbomber.com/docs/getting-started/overview/) was used as performance testing framework with C# console app as base.
+
+- Test scenarios:
+ - Each type of test run executed for 20 minutes.
+ - NBomber Load Simulation of type [KeepConstant](https://nbomber.com/docs/using-nbomber/basic-api/load-simulation#keep-constant) copies was used. This type of simulation keep a constant amount of Scenario copies(instances) for a specific period.
+ - Concurrent copies [1,2,3,4,5,6,7,8,10,12,14,16,32,64,128,256,512,1024] were tested.
+ - For example if we take Concurrent copies=4 and Duration=20 minutes this means that NBomber will ensure that we have 4 instance of Test Workflow running in parallel for 20 minutes.
+
+## Results
+
+- Workflow per seconds - Below tables shows how many workflows we are able to execute per second on two different environment with increasing number of concurrent copies.
+
+| **Concurrent Copies** | **8 vCPU** | **32 vCPU** |
+| :-------------------: | :--------: | :---------: |
+| **1** | 300.6 | 504.7 |
+| **2** | 310.3 | 513.1 |
+| **3** | 309.6 | 519.3 |
+| **4** | 314.7 | 521.3 |
+| **5** | 312.4 | 519.0 |
+| **6** | 314.7 | 517.7 |
+| **7** | 318.9 | 516.7 |
+| **8** | 318.4 | 517.5 |
+| **10** | 322.6 | 517.1 |
+| **12** | 319.7 | 517.6 |
+| **14** | 322.4 | 518.1 |
+| **16** | 327.0 | 515.5 |
+| **32** | 327.7 | 515.8 |
+| **64** | 330.7 | 523.7 |
+| **128** | 332.8 | 526.9 |
+| **256** | 332.8 | 529.1 |
+| **512** | 332.8 | 529.1 |
+| **1024** | 341.3 | 529.1 |
+
+
+
+- Latency - Shows Mean, P99 and P50 latency in milliseconds on two different environment with increasing number of concurrent copies.
+
+| **Concurrent Copies** | **Mean 8 vCPU** | **Mean 32 vCPU** | **P.99 8 vCPU** | **P.99 32 vCPU** | **P.50 8 vCPU** | **P.50 32 vCPU** |
+| :-------------------: | :-------------: | :--------------: | :-------------: | :--------------: | :-------------: | :--------------: |
+| **1** | 3.32 | 1.98 | 12.67 | 2.49 | 3.13 | 1.85 |
+| **2** | 6.43 | 3.89 | 19.96 | 5.67 | 6.17 | 3.65 |
+| **3** | 9.67 | 5.77 | 24.96 | 8.2 | 9.14 | 5.46 |
+| **4** | 12.7 | 7.76 | 27.44 | 13.57 | 12.02 | 7.22 |
+| **5** | 15.99 | 9.63 | 34.59 | 41.89 | 15.14 | 9.08 |
+| **6** | 19.05 | 11.58 | 38.69 | 45.92 | 18.02 | 10.93 |
+| **7** | 21.94 | 13.54 | 42.18 | 48.9 | 20.72 | 12.66 |
+| **8** | 25.11 | 15.45 | 44.35 | 51.04 | 23.92 | 14.54 |
+| **10** | 30.98 | 19.33 | 52.29 | 56.64 | 29.31 | 18.21 |
+| **12** | 37.52 | 23.18 | 59.2 | 63.33 | 35.42 | 21.82 |
+| **14** | 43.44 | 27.01 | 67.33 | 67.58 | 41.28 | 25.55 |
+| **16** | 48.93 | 31.03 | 72.06 | 72.77 | 46.11 | 28.93 |
+| **32** | 97.65 | 62.03 | 130.05 | 104.96 | 94.91 | 58.02 |
+| **64** | 193.53 | 122.24 | 235.14 | 168.45 | 191.49 | 115.26 |
+| **128** | 384.63 | 243.74 | 449.79 | 294.65 | 379.65 | 236.67 |
+| **256** | 769.13 | 486.82 | 834.07 | 561.66 | 766.46 | 498.22 |
+| **512** | 1538.29 | 968.02 | 1725.44 | 1052.67 | 1542.14 | 962.05 |
+| **1024** | 2999.36 | 1935.32 | 3219.46 | 2072.57 | 3086.34 | 1935.36 |
+
+
+
+## References
+
+- [NBomber](https://nbomber.com/docs/getting-started/overview/)
diff --git a/docs/persistence.md b/docs/persistence.md
index 8a7fe55fd..00799090a 100644
--- a/docs/persistence.md
+++ b/docs/persistence.md
@@ -11,3 +11,4 @@ There are several persistence providers available as separate Nuget packages.
* [Amazon DynamoDB](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Providers.AWS)
* [Cosmos DB](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Providers.Azure)
* [Redis](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Providers.Redis)
+* [Oracle](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Persistence.Oracle)
\ No newline at end of file
diff --git a/docs/samples.md b/docs/samples.md
index f69290c57..39f1e360e 100644
--- a/docs/samples.md
+++ b/docs/samples.md
@@ -35,3 +35,10 @@
[Human(User) Workflow](https://github.com/danielgerlag/workflow-core/tree/master/src/samples/WorkflowCore.Sample08)
[Workflow Middleware](https://github.com/danielgerlag/workflow-core/tree/master/src/samples/WorkflowCore.Sample19)
+
+## AI & Agentic Workflow Samples
+
+[Azure AI Foundry - Chat, Agents & Tools](https://github.com/danielgerlag/workflow-core/tree/master/src/samples/WorkflowCore.Sample.AzureFoundry) - Interactive sample demonstrating:
+ - Simple LLM chat completion
+ - Agentic workflows with automatic tool execution (weather, calculator)
+ - Human-in-the-loop approval workflows
diff --git a/mkdocs.yml b/mkdocs.yml
index 57ed12c94..5c2da328d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -15,5 +15,6 @@ nav:
- Elasticsearch plugin: elastic-search.md
- Test helpers: test-helpers.md
- Extensions: extensions.md
+ - Azure AI Foundry: azure-ai-foundry.md
- Samples: samples.md
theme: readthedocs
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index a617157cb..d2c9ba606 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -4,10 +4,10 @@
https://github.com/danielgerlag/workflow-core/blob/master/LICENSE.md
git
https://github.com/danielgerlag/workflow-core.git
- 3.8.2
- 3.8.2.0
- 3.8.2.0
+ 3.17.0
+ 3.17.0.0
+ 3.17.0.0
https://github.com/danielgerlag/workflow-core/raw/master/src/logo.png
- 3.8.2
+ 3.17.0
diff --git a/src/WorkflowCore.DSL/Interface/ITypeResolver.cs b/src/WorkflowCore.DSL/Interface/ITypeResolver.cs
new file mode 100644
index 000000000..e9e54e49b
--- /dev/null
+++ b/src/WorkflowCore.DSL/Interface/ITypeResolver.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Linq;
+
+namespace WorkflowCore.Interface
+{
+ public interface ITypeResolver
+ {
+ Type FindType(string name);
+ }
+}
\ No newline at end of file
diff --git a/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs b/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs
index 5c4944f4f..a4958e6b4 100644
--- a/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs
+++ b/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs
@@ -9,6 +9,7 @@ public static class ServiceCollectionExtensions
{
public static IServiceCollection AddWorkflowDSL(this IServiceCollection services)
{
+ services.AddTransient();
services.AddTransient();
return services;
}
diff --git a/src/WorkflowCore.DSL/Services/DefinitionLoader.cs b/src/WorkflowCore.DSL/Services/DefinitionLoader.cs
index ef7fadc9a..aa22988eb 100644
--- a/src/WorkflowCore.DSL/Services/DefinitionLoader.cs
+++ b/src/WorkflowCore.DSL/Services/DefinitionLoader.cs
@@ -5,6 +5,7 @@
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using System.Reflection;
+using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;
using WorkflowCore.Interface;
using WorkflowCore.Models;
@@ -17,10 +18,46 @@ namespace WorkflowCore.Services.DefinitionStorage
public class DefinitionLoader : IDefinitionLoader
{
private readonly IWorkflowRegistry _registry;
+ private readonly ITypeResolver _typeResolver;
+
+ // ParsingConfig to allow access to commonly used .NET methods like object.Equals
+ private static readonly ParsingConfig ParsingConfig = new ParsingConfig
+ {
+ AllowNewToEvaluateAnyType = true,
+ AreContextKeywordsEnabled = true
+ };
+
+ // Transform expressions to be compatible with System.Linq.Dynamic.Core 1.6.0+
+ private static string TransformExpression(string expression)
+ {
+ if (string.IsNullOrEmpty(expression))
+ return expression;
+
+ // Transform object.Equals(a, b) to Convert.ToBoolean(a) == Convert.ToBoolean(b)
+ // This is a simple regex replacement for the common pattern
+ var objectEqualsPattern = @"object\.Equals\s*\(\s*([^,]+)\s*,\s*([^)]+)\s*\)";
+ var transformed = Regex.Replace(expression, objectEqualsPattern,
+ match =>
+ {
+ var arg1 = match.Groups[1].Value.Trim();
+ var arg2 = match.Groups[2].Value.Trim();
+
+ // If arg2 is a boolean literal, convert arg1 to boolean and compare
+ if (arg2 == "true" || arg2 == "false")
+ {
+ return $"Convert.ToBoolean({arg1}) == {arg2}";
+ }
+ // Otherwise, convert both to strings for comparison
+ return $"Convert.ToString({arg1}) == Convert.ToString({arg2})";
+ });
+
+ return transformed;
+ }
- public DefinitionLoader(IWorkflowRegistry registry)
+ public DefinitionLoader(IWorkflowRegistry registry, ITypeResolver typeResolver)
{
_registry = registry;
+ _typeResolver = typeResolver;
}
public WorkflowDefinition LoadDefinition(string source, Func deserializer)
@@ -92,7 +129,7 @@ private WorkflowStepCollection ConvertSteps(ICollection source, Ty
{
var cancelExprType = typeof(Expression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(dataType, typeof(bool)));
var dataParameter = Expression.Parameter(dataType, "data");
- var cancelExpr = DynamicExpressionParser.ParseLambda(new[] { dataParameter }, typeof(bool), nextStep.CancelCondition);
+ var cancelExpr = DynamicExpressionParser.ParseLambda(ParsingConfig, false, new[] { dataParameter }, typeof(bool), TransformExpression(nextStep.CancelCondition));
targetStep.CancelCondition = cancelExpr;
}
@@ -215,15 +252,16 @@ private void AttachOutputs(StepSourceV1 source, Type dataType, Type stepType, Wo
foreach (var output in source.Outputs)
{
var stepParameter = Expression.Parameter(stepType, "step");
- var sourceExpr = DynamicExpressionParser.ParseLambda(new[] { stepParameter }, typeof(object), output.Value);
+ var sourceExpr = DynamicExpressionParser.ParseLambda(ParsingConfig, false, new[] { stepParameter }, typeof(object), TransformExpression(output.Value));
var dataParameter = Expression.Parameter(dataType, "data");
- if(output.Key.Contains(".") || output.Key.Contains("["))
+ if (output.Key.Contains(".") || output.Key.Contains("["))
{
AttachNestedOutput(output, step, source, sourceExpr, dataParameter);
- }else
+ }
+ else
{
AttachDirectlyOutput(output, step, dataType, sourceExpr, dataParameter);
}
@@ -259,11 +297,11 @@ private void AttachDirectlyOutput(KeyValuePair output, WorkflowS
}
- private void AttachNestedOutput( KeyValuePair output, WorkflowStep step, StepSourceV1 source, LambdaExpression sourceExpr, ParameterExpression dataParameter)
+ private void AttachNestedOutput(KeyValuePair output, WorkflowStep step, StepSourceV1 source, LambdaExpression sourceExpr, ParameterExpression dataParameter)
{
PropertyInfo propertyInfo = null;
String[] paths = output.Key.Split('.');
-
+
Expression targetProperty = dataParameter;
bool hasAddOutput = false;
@@ -341,7 +379,7 @@ private void AttachOutcomes(StepSourceV1 source, Type dataType, WorkflowStep ste
foreach (var nextStep in source.SelectNextStep)
{
- var sourceDelegate = DynamicExpressionParser.ParseLambda(new[] { dataParameter, outcomeParameter }, typeof(object), nextStep.Value).Compile();
+ var sourceDelegate = DynamicExpressionParser.ParseLambda(ParsingConfig, false, new[] { dataParameter, outcomeParameter }, typeof(object), TransformExpression(nextStep.Value)).Compile();
Expression> sourceExpr = (data, outcome) => System.Convert.ToBoolean(sourceDelegate.DynamicInvoke(data, outcome));
step.Outcomes.Add(new ExpressionOutcome