diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index 25973b4d..41524726 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -13,7 +13,7 @@ on: release: types: [ prereleased, published ] env: - base_version: '3.6.0' + base_version: '3.7.0' feedz_feed_source: 'https://f.feedz.io/elsa-workflows/elsa-3/nuget/index.json' nuget_feed_source: 'https://api.nuget.org/v3/index.json' diff --git a/Directory.Build.props b/Directory.Build.props index 720ea1eb..1136600f 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -37,7 +37,7 @@ - 3.6.0-rc1 + 3.7.0-preview.4150 3.6.0-rc1 diff --git a/Directory.Packages.props b/Directory.Packages.props index 8efbcf46..19703236 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -28,6 +28,7 @@ + diff --git a/Elsa.Extensions.sln b/Elsa.Extensions.sln index ce3cf7f9..4c355b3a 100644 --- a/Elsa.Extensions.sln +++ b/Elsa.Extensions.sln @@ -286,379 +286,1180 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{A33667E6-6A5 doc\release-notes\3.6.0-rc1.md = doc\release-notes\3.6.0-rc1.md EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scheduling", "scheduling", "{6E46B8AD-FA47-474F-B959-0B530771C28C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Scheduling.Quartz.UnitTests", "test\modules\scheduling\Elsa.Scheduling.Quartz.UnitTests\Elsa.Scheduling.Quartz.UnitTests.csproj", "{65B9F528-568B-4E0E-894E-F22E0B7C64BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Scheduling.Quartz.ComponentTests", "test\modules\scheduling\Elsa.Scheduling.Quartz.ComponentTests\Elsa.Scheduling.Quartz.ComponentTests.csproj", "{50798373-8A89-4159-BFD9-830D259538D6}" +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 {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Debug|x64.Build.0 = Debug|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Debug|x86.Build.0 = Debug|Any CPU {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Release|Any CPU.Build.0 = Release|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Release|x64.ActiveCfg = Release|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Release|x64.Build.0 = Release|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Release|x86.ActiveCfg = Release|Any CPU + {4D16DD17-0BC9-476D-9B38-0A8644DD92FE}.Release|x86.Build.0 = Release|Any CPU {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Debug|x64.ActiveCfg = Debug|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Debug|x64.Build.0 = Debug|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Debug|x86.ActiveCfg = Debug|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Debug|x86.Build.0 = Debug|Any CPU {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Release|Any CPU.ActiveCfg = Release|Any CPU {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Release|Any CPU.Build.0 = Release|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Release|x64.ActiveCfg = Release|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Release|x64.Build.0 = Release|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Release|x86.ActiveCfg = Release|Any CPU + {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2}.Release|x86.Build.0 = Release|Any CPU {78CBE43C-0EF2-048E-987B-A603A38099E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {78CBE43C-0EF2-048E-987B-A603A38099E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Debug|x64.ActiveCfg = Debug|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Debug|x64.Build.0 = Debug|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Debug|x86.ActiveCfg = Debug|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Debug|x86.Build.0 = Debug|Any CPU {78CBE43C-0EF2-048E-987B-A603A38099E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {78CBE43C-0EF2-048E-987B-A603A38099E6}.Release|Any CPU.Build.0 = Release|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Release|x64.ActiveCfg = Release|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Release|x64.Build.0 = Release|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Release|x86.ActiveCfg = Release|Any CPU + {78CBE43C-0EF2-048E-987B-A603A38099E6}.Release|x86.Build.0 = Release|Any CPU {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Debug|x64.ActiveCfg = Debug|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Debug|x64.Build.0 = Debug|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Debug|x86.ActiveCfg = Debug|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Debug|x86.Build.0 = Debug|Any CPU {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Release|Any CPU.Build.0 = Release|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Release|x64.ActiveCfg = Release|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Release|x64.Build.0 = Release|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Release|x86.ActiveCfg = Release|Any CPU + {AA90183E-F009-F88A-9081-BAB6E5ED6B22}.Release|x86.Build.0 = Release|Any CPU {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Debug|x64.ActiveCfg = Debug|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Debug|x64.Build.0 = Debug|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Debug|x86.ActiveCfg = Debug|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Debug|x86.Build.0 = Debug|Any CPU {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Release|Any CPU.Build.0 = Release|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Release|x64.ActiveCfg = Release|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Release|x64.Build.0 = Release|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Release|x86.ActiveCfg = Release|Any CPU + {266D14A8-4D8F-795F-169F-A7E7B4F23D1E}.Release|x86.Build.0 = Release|Any CPU {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Debug|x64.ActiveCfg = Debug|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Debug|x64.Build.0 = Debug|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Debug|x86.ActiveCfg = Debug|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Debug|x86.Build.0 = Debug|Any CPU {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Release|Any CPU.ActiveCfg = Release|Any CPU {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Release|Any CPU.Build.0 = Release|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Release|x64.ActiveCfg = Release|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Release|x64.Build.0 = Release|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Release|x86.ActiveCfg = Release|Any CPU + {3E782B62-87D8-F5FD-CA2D-0D524C5BB530}.Release|x86.Build.0 = Release|Any CPU {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Debug|x64.ActiveCfg = Debug|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Debug|x64.Build.0 = Debug|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Debug|x86.ActiveCfg = Debug|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Debug|x86.Build.0 = Debug|Any CPU {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Release|Any CPU.Build.0 = Release|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Release|x64.ActiveCfg = Release|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Release|x64.Build.0 = Release|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Release|x86.ActiveCfg = Release|Any CPU + {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB}.Release|x86.Build.0 = Release|Any CPU {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Debug|x64.ActiveCfg = Debug|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Debug|x64.Build.0 = Debug|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Debug|x86.ActiveCfg = Debug|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Debug|x86.Build.0 = Debug|Any CPU {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Release|Any CPU.ActiveCfg = Release|Any CPU {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Release|Any CPU.Build.0 = Release|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Release|x64.ActiveCfg = Release|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Release|x64.Build.0 = Release|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Release|x86.ActiveCfg = Release|Any CPU + {EC7C3333-59C3-5ACE-C84C-5E135964348C}.Release|x86.Build.0 = Release|Any CPU {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Debug|x64.ActiveCfg = Debug|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Debug|x64.Build.0 = Debug|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Debug|x86.ActiveCfg = Debug|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Debug|x86.Build.0 = Debug|Any CPU {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Release|Any CPU.ActiveCfg = Release|Any CPU {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Release|Any CPU.Build.0 = Release|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Release|x64.ActiveCfg = Release|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Release|x64.Build.0 = Release|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Release|x86.ActiveCfg = Release|Any CPU + {52E6A127-2F77-547F-2917-E6C6AAB1CC64}.Release|x86.Build.0 = Release|Any CPU {BE298025-CAE0-E503-A0D6-996489C1522E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BE298025-CAE0-E503-A0D6-996489C1522E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Debug|x64.ActiveCfg = Debug|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Debug|x64.Build.0 = Debug|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Debug|x86.ActiveCfg = Debug|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Debug|x86.Build.0 = Debug|Any CPU {BE298025-CAE0-E503-A0D6-996489C1522E}.Release|Any CPU.ActiveCfg = Release|Any CPU {BE298025-CAE0-E503-A0D6-996489C1522E}.Release|Any CPU.Build.0 = Release|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Release|x64.ActiveCfg = Release|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Release|x64.Build.0 = Release|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Release|x86.ActiveCfg = Release|Any CPU + {BE298025-CAE0-E503-A0D6-996489C1522E}.Release|x86.Build.0 = Release|Any CPU {71426B21-5511-0F76-C11D-E17EA695A0EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {71426B21-5511-0F76-C11D-E17EA695A0EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Debug|x64.ActiveCfg = Debug|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Debug|x64.Build.0 = Debug|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Debug|x86.ActiveCfg = Debug|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Debug|x86.Build.0 = Debug|Any CPU {71426B21-5511-0F76-C11D-E17EA695A0EF}.Release|Any CPU.ActiveCfg = Release|Any CPU {71426B21-5511-0F76-C11D-E17EA695A0EF}.Release|Any CPU.Build.0 = Release|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Release|x64.ActiveCfg = Release|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Release|x64.Build.0 = Release|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Release|x86.ActiveCfg = Release|Any CPU + {71426B21-5511-0F76-C11D-E17EA695A0EF}.Release|x86.Build.0 = Release|Any CPU {19BADA43-69EB-539F-1104-A0AF4BE89953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19BADA43-69EB-539F-1104-A0AF4BE89953}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Debug|x64.ActiveCfg = Debug|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Debug|x64.Build.0 = Debug|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Debug|x86.ActiveCfg = Debug|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Debug|x86.Build.0 = Debug|Any CPU {19BADA43-69EB-539F-1104-A0AF4BE89953}.Release|Any CPU.ActiveCfg = Release|Any CPU {19BADA43-69EB-539F-1104-A0AF4BE89953}.Release|Any CPU.Build.0 = Release|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Release|x64.ActiveCfg = Release|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Release|x64.Build.0 = Release|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Release|x86.ActiveCfg = Release|Any CPU + {19BADA43-69EB-539F-1104-A0AF4BE89953}.Release|x86.Build.0 = Release|Any CPU {8B3C66D4-7213-58D5-7286-A9C058149216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8B3C66D4-7213-58D5-7286-A9C058149216}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Debug|x64.Build.0 = Debug|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Debug|x86.Build.0 = Debug|Any CPU {8B3C66D4-7213-58D5-7286-A9C058149216}.Release|Any CPU.ActiveCfg = Release|Any CPU {8B3C66D4-7213-58D5-7286-A9C058149216}.Release|Any CPU.Build.0 = Release|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Release|x64.ActiveCfg = Release|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Release|x64.Build.0 = Release|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Release|x86.ActiveCfg = Release|Any CPU + {8B3C66D4-7213-58D5-7286-A9C058149216}.Release|x86.Build.0 = Release|Any CPU {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Debug|x64.ActiveCfg = Debug|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Debug|x64.Build.0 = Debug|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Debug|x86.ActiveCfg = Debug|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Debug|x86.Build.0 = Debug|Any CPU {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Release|Any CPU.Build.0 = Release|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Release|x64.ActiveCfg = Release|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Release|x64.Build.0 = Release|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Release|x86.ActiveCfg = Release|Any CPU + {C4C85705-B63D-BB31-0F83-ECD01887FC4B}.Release|x86.Build.0 = Release|Any CPU {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Debug|x64.ActiveCfg = Debug|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Debug|x64.Build.0 = Debug|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Debug|x86.ActiveCfg = Debug|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Debug|x86.Build.0 = Debug|Any CPU {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Release|Any CPU.ActiveCfg = Release|Any CPU {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Release|Any CPU.Build.0 = Release|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Release|x64.ActiveCfg = Release|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Release|x64.Build.0 = Release|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Release|x86.ActiveCfg = Release|Any CPU + {76FAD6C7-196A-CDAD-BD9E-19AFCDBDB7EB}.Release|x86.Build.0 = Release|Any CPU {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Debug|x64.ActiveCfg = Debug|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Debug|x64.Build.0 = Debug|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Debug|x86.ActiveCfg = Debug|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Debug|x86.Build.0 = Debug|Any CPU {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Release|Any CPU.ActiveCfg = Release|Any CPU {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Release|Any CPU.Build.0 = Release|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Release|x64.ActiveCfg = Release|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Release|x64.Build.0 = Release|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Release|x86.ActiveCfg = Release|Any CPU + {5ADD78CA-3511-46F9-DB1A-C2D7F37F1B5E}.Release|x86.Build.0 = Release|Any CPU {80430D3A-CCEB-AA02-975B-FD91D0615456}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {80430D3A-CCEB-AA02-975B-FD91D0615456}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Debug|x64.ActiveCfg = Debug|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Debug|x64.Build.0 = Debug|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Debug|x86.ActiveCfg = Debug|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Debug|x86.Build.0 = Debug|Any CPU {80430D3A-CCEB-AA02-975B-FD91D0615456}.Release|Any CPU.ActiveCfg = Release|Any CPU {80430D3A-CCEB-AA02-975B-FD91D0615456}.Release|Any CPU.Build.0 = Release|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Release|x64.ActiveCfg = Release|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Release|x64.Build.0 = Release|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Release|x86.ActiveCfg = Release|Any CPU + {80430D3A-CCEB-AA02-975B-FD91D0615456}.Release|x86.Build.0 = Release|Any CPU {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Debug|x64.ActiveCfg = Debug|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Debug|x64.Build.0 = Debug|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Debug|x86.ActiveCfg = Debug|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Debug|x86.Build.0 = Debug|Any CPU {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Release|Any CPU.Build.0 = Release|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Release|x64.ActiveCfg = Release|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Release|x64.Build.0 = Release|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Release|x86.ActiveCfg = Release|Any CPU + {EDE759E1-F970-AE78-722C-6DA7B85D8C9C}.Release|x86.Build.0 = Release|Any CPU {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Debug|x64.ActiveCfg = Debug|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Debug|x64.Build.0 = Debug|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Debug|x86.ActiveCfg = Debug|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Debug|x86.Build.0 = Debug|Any CPU {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Release|Any CPU.Build.0 = Release|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Release|x64.ActiveCfg = Release|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Release|x64.Build.0 = Release|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Release|x86.ActiveCfg = Release|Any CPU + {861E2885-2D62-FF63-7429-2BEFD9C96CE0}.Release|x86.Build.0 = Release|Any CPU {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Debug|x64.ActiveCfg = Debug|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Debug|x64.Build.0 = Debug|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Debug|x86.ActiveCfg = Debug|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Debug|x86.Build.0 = Debug|Any CPU {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Release|Any CPU.ActiveCfg = Release|Any CPU {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Release|Any CPU.Build.0 = Release|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Release|x64.ActiveCfg = Release|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Release|x64.Build.0 = Release|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Release|x86.ActiveCfg = Release|Any CPU + {1FD27C49-8173-249A-80E9-DBA071A56E8D}.Release|x86.Build.0 = Release|Any CPU {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Debug|x64.Build.0 = Debug|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Debug|x86.ActiveCfg = Debug|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Debug|x86.Build.0 = Debug|Any CPU {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Release|Any CPU.Build.0 = Release|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Release|x64.ActiveCfg = Release|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Release|x64.Build.0 = Release|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Release|x86.ActiveCfg = Release|Any CPU + {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F}.Release|x86.Build.0 = Release|Any CPU {BB81E01D-7453-9068-B1E3-90E3072C820B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BB81E01D-7453-9068-B1E3-90E3072C820B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Debug|x64.ActiveCfg = Debug|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Debug|x64.Build.0 = Debug|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Debug|x86.ActiveCfg = Debug|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Debug|x86.Build.0 = Debug|Any CPU {BB81E01D-7453-9068-B1E3-90E3072C820B}.Release|Any CPU.ActiveCfg = Release|Any CPU {BB81E01D-7453-9068-B1E3-90E3072C820B}.Release|Any CPU.Build.0 = Release|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Release|x64.ActiveCfg = Release|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Release|x64.Build.0 = Release|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Release|x86.ActiveCfg = Release|Any CPU + {BB81E01D-7453-9068-B1E3-90E3072C820B}.Release|x86.Build.0 = Release|Any CPU {95C8EFEE-9396-F334-9B76-78322650A0C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95C8EFEE-9396-F334-9B76-78322650A0C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Debug|x64.Build.0 = Debug|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Debug|x86.Build.0 = Debug|Any CPU {95C8EFEE-9396-F334-9B76-78322650A0C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {95C8EFEE-9396-F334-9B76-78322650A0C6}.Release|Any CPU.Build.0 = Release|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Release|x64.ActiveCfg = Release|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Release|x64.Build.0 = Release|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Release|x86.ActiveCfg = Release|Any CPU + {95C8EFEE-9396-F334-9B76-78322650A0C6}.Release|x86.Build.0 = Release|Any CPU {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Debug|x64.ActiveCfg = Debug|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Debug|x64.Build.0 = Debug|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Debug|x86.Build.0 = Debug|Any CPU {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Release|Any CPU.ActiveCfg = Release|Any CPU {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Release|Any CPU.Build.0 = Release|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Release|x64.ActiveCfg = Release|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Release|x64.Build.0 = Release|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Release|x86.ActiveCfg = Release|Any CPU + {C568B847-15AB-C4DB-5675-0D5F400ED14D}.Release|x86.Build.0 = Release|Any CPU {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Debug|x64.ActiveCfg = Debug|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Debug|x64.Build.0 = Debug|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Debug|x86.ActiveCfg = Debug|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Debug|x86.Build.0 = Debug|Any CPU {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Release|Any CPU.Build.0 = Release|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Release|x64.ActiveCfg = Release|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Release|x64.Build.0 = Release|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Release|x86.ActiveCfg = Release|Any CPU + {C4D65789-A62A-DAD5-7246-A0E476F86CDF}.Release|x86.Build.0 = Release|Any CPU {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Debug|x64.ActiveCfg = Debug|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Debug|x64.Build.0 = Debug|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Debug|x86.ActiveCfg = Debug|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Debug|x86.Build.0 = Debug|Any CPU {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Release|Any CPU.ActiveCfg = Release|Any CPU {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Release|Any CPU.Build.0 = Release|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Release|x64.ActiveCfg = Release|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Release|x64.Build.0 = Release|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Release|x86.ActiveCfg = Release|Any CPU + {F5B2629A-E0C9-9B73-4941-DD44DD557A9B}.Release|x86.Build.0 = Release|Any CPU {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Debug|x64.ActiveCfg = Debug|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Debug|x64.Build.0 = Debug|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Debug|x86.ActiveCfg = Debug|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Debug|x86.Build.0 = Debug|Any CPU {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Release|Any CPU.ActiveCfg = Release|Any CPU {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Release|Any CPU.Build.0 = Release|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Release|x64.ActiveCfg = Release|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Release|x64.Build.0 = Release|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Release|x86.ActiveCfg = Release|Any CPU + {43591B08-CC42-9C1D-480E-DFA6C1E1B59A}.Release|x86.Build.0 = Release|Any CPU {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Debug|x64.ActiveCfg = Debug|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Debug|x64.Build.0 = Debug|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Debug|x86.ActiveCfg = Debug|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Debug|x86.Build.0 = Debug|Any CPU {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Release|Any CPU.ActiveCfg = Release|Any CPU {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Release|Any CPU.Build.0 = Release|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Release|x64.ActiveCfg = Release|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Release|x64.Build.0 = Release|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Release|x86.ActiveCfg = Release|Any CPU + {B8311F08-4555-25E2-A8E5-1EE95A8F2A26}.Release|x86.Build.0 = Release|Any CPU {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Debug|x64.Build.0 = Debug|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Debug|x86.Build.0 = Debug|Any CPU {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Release|Any CPU.Build.0 = Release|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Release|x64.ActiveCfg = Release|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Release|x64.Build.0 = Release|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Release|x86.ActiveCfg = Release|Any CPU + {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8}.Release|x86.Build.0 = Release|Any CPU {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Debug|x64.ActiveCfg = Debug|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Debug|x64.Build.0 = Debug|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Debug|x86.ActiveCfg = Debug|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Debug|x86.Build.0 = Debug|Any CPU {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Release|Any CPU.Build.0 = Release|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Release|x64.ActiveCfg = Release|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Release|x64.Build.0 = Release|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Release|x86.ActiveCfg = Release|Any CPU + {70C03970-8EF8-A0A7-83DB-541987BEE4F6}.Release|x86.Build.0 = Release|Any CPU {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Debug|x64.ActiveCfg = Debug|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Debug|x64.Build.0 = Debug|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Debug|x86.ActiveCfg = Debug|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Debug|x86.Build.0 = Debug|Any CPU {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Release|Any CPU.Build.0 = Release|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Release|x64.ActiveCfg = Release|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Release|x64.Build.0 = Release|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Release|x86.ActiveCfg = Release|Any CPU + {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A}.Release|x86.Build.0 = Release|Any CPU {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Debug|x64.Build.0 = Debug|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Debug|x86.Build.0 = Debug|Any CPU {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Release|Any CPU.Build.0 = Release|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Release|x64.ActiveCfg = Release|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Release|x64.Build.0 = Release|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Release|x86.ActiveCfg = Release|Any CPU + {2D72DB60-227D-49F0-44F0-9FAF52244EB6}.Release|x86.Build.0 = Release|Any CPU {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Debug|x64.Build.0 = Debug|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Debug|x86.Build.0 = Debug|Any CPU {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Release|Any CPU.Build.0 = Release|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Release|x64.ActiveCfg = Release|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Release|x64.Build.0 = Release|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Release|x86.ActiveCfg = Release|Any CPU + {47F17474-6841-126A-ADF8-DD2A7631C8C6}.Release|x86.Build.0 = Release|Any CPU {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Debug|x64.ActiveCfg = Debug|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Debug|x64.Build.0 = Debug|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Debug|x86.ActiveCfg = Debug|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Debug|x86.Build.0 = Debug|Any CPU {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Release|Any CPU.ActiveCfg = Release|Any CPU {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Release|Any CPU.Build.0 = Release|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Release|x64.ActiveCfg = Release|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Release|x64.Build.0 = Release|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Release|x86.ActiveCfg = Release|Any CPU + {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4}.Release|x86.Build.0 = Release|Any CPU {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Debug|x64.Build.0 = Debug|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Debug|x86.Build.0 = Debug|Any CPU {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Release|Any CPU.Build.0 = Release|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Release|x64.ActiveCfg = Release|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Release|x64.Build.0 = Release|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Release|x86.ActiveCfg = Release|Any CPU + {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB}.Release|x86.Build.0 = Release|Any CPU {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Debug|x64.ActiveCfg = Debug|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Debug|x64.Build.0 = Debug|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Debug|x86.ActiveCfg = Debug|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Debug|x86.Build.0 = Debug|Any CPU {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Release|Any CPU.ActiveCfg = Release|Any CPU {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Release|Any CPU.Build.0 = Release|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Release|x64.ActiveCfg = Release|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Release|x64.Build.0 = Release|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Release|x86.ActiveCfg = Release|Any CPU + {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5}.Release|x86.Build.0 = Release|Any CPU {9250D8B1-9D69-A957-D378-8173686A0F9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9250D8B1-9D69-A957-D378-8173686A0F9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Debug|x64.ActiveCfg = Debug|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Debug|x64.Build.0 = Debug|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Debug|x86.ActiveCfg = Debug|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Debug|x86.Build.0 = Debug|Any CPU {9250D8B1-9D69-A957-D378-8173686A0F9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {9250D8B1-9D69-A957-D378-8173686A0F9C}.Release|Any CPU.Build.0 = Release|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Release|x64.ActiveCfg = Release|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Release|x64.Build.0 = Release|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Release|x86.ActiveCfg = Release|Any CPU + {9250D8B1-9D69-A957-D378-8173686A0F9C}.Release|x86.Build.0 = Release|Any CPU {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Debug|x64.ActiveCfg = Debug|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Debug|x64.Build.0 = Debug|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Debug|x86.ActiveCfg = Debug|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Debug|x86.Build.0 = Debug|Any CPU {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Release|Any CPU.Build.0 = Release|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Release|x64.ActiveCfg = Release|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Release|x64.Build.0 = Release|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Release|x86.ActiveCfg = Release|Any CPU + {FE487F94-5242-C0C7-884A-3EE8FB8FC24E}.Release|x86.Build.0 = Release|Any CPU {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Debug|x64.ActiveCfg = Debug|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Debug|x64.Build.0 = Debug|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Debug|x86.ActiveCfg = Debug|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Debug|x86.Build.0 = Debug|Any CPU {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Release|Any CPU.Build.0 = Release|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Release|x64.ActiveCfg = Release|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Release|x64.Build.0 = Release|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Release|x86.ActiveCfg = Release|Any CPU + {C2721BCB-2FB1-9227-AABB-ED768EB292FD}.Release|x86.Build.0 = Release|Any CPU {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Debug|x64.Build.0 = Debug|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Debug|x86.ActiveCfg = Debug|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Debug|x86.Build.0 = Debug|Any CPU {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Release|Any CPU.Build.0 = Release|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Release|x64.ActiveCfg = Release|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Release|x64.Build.0 = Release|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Release|x86.ActiveCfg = Release|Any CPU + {4C24646E-B017-9C72-5E5E-27EEE2F23D7B}.Release|x86.Build.0 = Release|Any CPU {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Debug|x64.ActiveCfg = Debug|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Debug|x64.Build.0 = Debug|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Debug|x86.ActiveCfg = Debug|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Debug|x86.Build.0 = Debug|Any CPU {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Release|Any CPU.ActiveCfg = Release|Any CPU {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Release|Any CPU.Build.0 = Release|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Release|x64.ActiveCfg = Release|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Release|x64.Build.0 = Release|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Release|x86.ActiveCfg = Release|Any CPU + {B39D92DE-334C-BFD7-2A0D-6EC2626E445C}.Release|x86.Build.0 = Release|Any CPU {0CA52158-CBB6-74FC-B63F-812E059053A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0CA52158-CBB6-74FC-B63F-812E059053A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Debug|x64.ActiveCfg = Debug|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Debug|x64.Build.0 = Debug|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Debug|x86.ActiveCfg = Debug|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Debug|x86.Build.0 = Debug|Any CPU {0CA52158-CBB6-74FC-B63F-812E059053A4}.Release|Any CPU.ActiveCfg = Release|Any CPU {0CA52158-CBB6-74FC-B63F-812E059053A4}.Release|Any CPU.Build.0 = Release|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Release|x64.ActiveCfg = Release|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Release|x64.Build.0 = Release|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Release|x86.ActiveCfg = Release|Any CPU + {0CA52158-CBB6-74FC-B63F-812E059053A4}.Release|x86.Build.0 = Release|Any CPU {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Debug|x64.ActiveCfg = Debug|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Debug|x64.Build.0 = Debug|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Debug|x86.ActiveCfg = Debug|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Debug|x86.Build.0 = Debug|Any CPU {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Release|Any CPU.ActiveCfg = Release|Any CPU {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Release|Any CPU.Build.0 = Release|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Release|x64.ActiveCfg = Release|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Release|x64.Build.0 = Release|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Release|x86.ActiveCfg = Release|Any CPU + {ABC40471-5A32-0AC0-594B-FF19B66E2493}.Release|x86.Build.0 = Release|Any CPU {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Debug|x64.ActiveCfg = Debug|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Debug|x64.Build.0 = Debug|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Debug|x86.ActiveCfg = Debug|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Debug|x86.Build.0 = Debug|Any CPU {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Release|Any CPU.ActiveCfg = Release|Any CPU {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Release|Any CPU.Build.0 = Release|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Release|x64.ActiveCfg = Release|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Release|x64.Build.0 = Release|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Release|x86.ActiveCfg = Release|Any CPU + {719BCAE9-BF9C-75D9-E551-782D6FD6421C}.Release|x86.Build.0 = Release|Any CPU {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Debug|x64.ActiveCfg = Debug|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Debug|x64.Build.0 = Debug|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Debug|x86.ActiveCfg = Debug|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Debug|x86.Build.0 = Debug|Any CPU {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Release|Any CPU.ActiveCfg = Release|Any CPU {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Release|Any CPU.Build.0 = Release|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Release|x64.ActiveCfg = Release|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Release|x64.Build.0 = Release|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Release|x86.ActiveCfg = Release|Any CPU + {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F}.Release|x86.Build.0 = Release|Any CPU {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Debug|x64.ActiveCfg = Debug|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Debug|x64.Build.0 = Debug|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Debug|x86.ActiveCfg = Debug|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Debug|x86.Build.0 = Debug|Any CPU {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Release|Any CPU.ActiveCfg = Release|Any CPU {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Release|Any CPU.Build.0 = Release|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Release|x64.ActiveCfg = Release|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Release|x64.Build.0 = Release|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Release|x86.ActiveCfg = Release|Any CPU + {D03AF84C-BAAD-50E9-A561-CE5604442A35}.Release|x86.Build.0 = Release|Any CPU {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Debug|x64.ActiveCfg = Debug|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Debug|x64.Build.0 = Debug|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Debug|x86.ActiveCfg = Debug|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Debug|x86.Build.0 = Debug|Any CPU {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Release|Any CPU.ActiveCfg = Release|Any CPU {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Release|Any CPU.Build.0 = Release|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Release|x64.ActiveCfg = Release|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Release|x64.Build.0 = Release|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Release|x86.ActiveCfg = Release|Any CPU + {93F9B20D-47AB-87ED-A9AA-005F631C4CA2}.Release|x86.Build.0 = Release|Any CPU {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Debug|x64.ActiveCfg = Debug|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Debug|x64.Build.0 = Debug|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Debug|x86.ActiveCfg = Debug|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Debug|x86.Build.0 = Debug|Any CPU {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Release|Any CPU.ActiveCfg = Release|Any CPU {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Release|Any CPU.Build.0 = Release|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Release|x64.ActiveCfg = Release|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Release|x64.Build.0 = Release|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Release|x86.ActiveCfg = Release|Any CPU + {A9FA953D-BE0F-1A86-8903-BA0C0879C832}.Release|x86.Build.0 = Release|Any CPU {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Debug|x64.ActiveCfg = Debug|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Debug|x64.Build.0 = Debug|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Debug|x86.ActiveCfg = Debug|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Debug|x86.Build.0 = Debug|Any CPU {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Release|Any CPU.Build.0 = Release|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Release|x64.ActiveCfg = Release|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Release|x64.Build.0 = Release|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Release|x86.ActiveCfg = Release|Any CPU + {ADC6232A-D238-36D4-8D8D-9C81C7842F30}.Release|x86.Build.0 = Release|Any CPU {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Debug|x64.ActiveCfg = Debug|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Debug|x64.Build.0 = Debug|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Debug|x86.ActiveCfg = Debug|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Debug|x86.Build.0 = Debug|Any CPU {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Release|Any CPU.ActiveCfg = Release|Any CPU {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Release|Any CPU.Build.0 = Release|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Release|x64.ActiveCfg = Release|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Release|x64.Build.0 = Release|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Release|x86.ActiveCfg = Release|Any CPU + {6E3EBFC5-B0BC-0A3A-4CA9-E3EA615CED7D}.Release|x86.Build.0 = Release|Any CPU {081E6F32-A418-0F77-3BFE-223903CFBA96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {081E6F32-A418-0F77-3BFE-223903CFBA96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Debug|x64.ActiveCfg = Debug|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Debug|x64.Build.0 = Debug|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Debug|x86.ActiveCfg = Debug|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Debug|x86.Build.0 = Debug|Any CPU {081E6F32-A418-0F77-3BFE-223903CFBA96}.Release|Any CPU.ActiveCfg = Release|Any CPU {081E6F32-A418-0F77-3BFE-223903CFBA96}.Release|Any CPU.Build.0 = Release|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Release|x64.ActiveCfg = Release|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Release|x64.Build.0 = Release|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Release|x86.ActiveCfg = Release|Any CPU + {081E6F32-A418-0F77-3BFE-223903CFBA96}.Release|x86.Build.0 = Release|Any CPU {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Debug|x64.ActiveCfg = Debug|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Debug|x64.Build.0 = Debug|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Debug|x86.ActiveCfg = Debug|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Debug|x86.Build.0 = Debug|Any CPU {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Release|Any CPU.ActiveCfg = Release|Any CPU {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Release|Any CPU.Build.0 = Release|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Release|x64.ActiveCfg = Release|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Release|x64.Build.0 = Release|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Release|x86.ActiveCfg = Release|Any CPU + {B130CDB8-E048-9D95-3FEA-BF71F556C40F}.Release|x86.Build.0 = Release|Any CPU {4E2F05DA-C902-293B-90E9-58583ED0D267}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4E2F05DA-C902-293B-90E9-58583ED0D267}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Debug|x64.ActiveCfg = Debug|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Debug|x64.Build.0 = Debug|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Debug|x86.Build.0 = Debug|Any CPU {4E2F05DA-C902-293B-90E9-58583ED0D267}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E2F05DA-C902-293B-90E9-58583ED0D267}.Release|Any CPU.Build.0 = Release|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Release|x64.ActiveCfg = Release|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Release|x64.Build.0 = Release|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Release|x86.ActiveCfg = Release|Any CPU + {4E2F05DA-C902-293B-90E9-58583ED0D267}.Release|x86.Build.0 = Release|Any CPU {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Debug|x64.ActiveCfg = Debug|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Debug|x64.Build.0 = Debug|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Debug|x86.ActiveCfg = Debug|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Debug|x86.Build.0 = Debug|Any CPU {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Release|Any CPU.ActiveCfg = Release|Any CPU {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Release|Any CPU.Build.0 = Release|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Release|x64.ActiveCfg = Release|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Release|x64.Build.0 = Release|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Release|x86.ActiveCfg = Release|Any CPU + {22EF03B2-6BA9-B8BD-A627-4249397F9299}.Release|x86.Build.0 = Release|Any CPU {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Debug|x64.ActiveCfg = Debug|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Debug|x64.Build.0 = Debug|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Debug|x86.ActiveCfg = Debug|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Debug|x86.Build.0 = Debug|Any CPU {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Release|Any CPU.Build.0 = Release|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Release|x64.ActiveCfg = Release|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Release|x64.Build.0 = Release|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Release|x86.ActiveCfg = Release|Any CPU + {0D391CA4-9C36-BC86-1505-D05F13AE8FFC}.Release|x86.Build.0 = Release|Any CPU {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Debug|x64.ActiveCfg = Debug|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Debug|x64.Build.0 = Debug|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Debug|x86.ActiveCfg = Debug|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Debug|x86.Build.0 = Debug|Any CPU {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Release|Any CPU.ActiveCfg = Release|Any CPU {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Release|Any CPU.Build.0 = Release|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Release|x64.ActiveCfg = Release|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Release|x64.Build.0 = Release|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Release|x86.ActiveCfg = Release|Any CPU + {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7}.Release|x86.Build.0 = Release|Any CPU {AF264239-C968-8A4A-F266-EBE478238D4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF264239-C968-8A4A-F266-EBE478238D4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Debug|x64.ActiveCfg = Debug|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Debug|x64.Build.0 = Debug|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Debug|x86.ActiveCfg = Debug|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Debug|x86.Build.0 = Debug|Any CPU {AF264239-C968-8A4A-F266-EBE478238D4C}.Release|Any CPU.ActiveCfg = Release|Any CPU {AF264239-C968-8A4A-F266-EBE478238D4C}.Release|Any CPU.Build.0 = Release|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Release|x64.ActiveCfg = Release|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Release|x64.Build.0 = Release|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Release|x86.ActiveCfg = Release|Any CPU + {AF264239-C968-8A4A-F266-EBE478238D4C}.Release|x86.Build.0 = Release|Any CPU {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Debug|x64.ActiveCfg = Debug|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Debug|x64.Build.0 = Debug|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Debug|x86.ActiveCfg = Debug|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Debug|x86.Build.0 = Debug|Any CPU {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Release|Any CPU.ActiveCfg = Release|Any CPU {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Release|Any CPU.Build.0 = Release|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Release|x64.ActiveCfg = Release|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Release|x64.Build.0 = Release|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Release|x86.ActiveCfg = Release|Any CPU + {6954C25F-A04A-C4FA-7BC8-FCA5FE86C59D}.Release|x86.Build.0 = Release|Any CPU {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Debug|x64.Build.0 = Debug|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Debug|x86.ActiveCfg = Debug|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Debug|x86.Build.0 = Debug|Any CPU {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Release|Any CPU.Build.0 = Release|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Release|x64.ActiveCfg = Release|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Release|x64.Build.0 = Release|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Release|x86.ActiveCfg = Release|Any CPU + {B0480F01-C15B-D5C4-398D-2C11A36B9C1C}.Release|x86.Build.0 = Release|Any CPU {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Debug|x64.ActiveCfg = Debug|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Debug|x64.Build.0 = Debug|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Debug|x86.ActiveCfg = Debug|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Debug|x86.Build.0 = Debug|Any CPU {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Release|Any CPU.ActiveCfg = Release|Any CPU {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Release|Any CPU.Build.0 = Release|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Release|x64.ActiveCfg = Release|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Release|x64.Build.0 = Release|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Release|x86.ActiveCfg = Release|Any CPU + {38FC815A-BA41-9440-B075-F7AAEB6EB542}.Release|x86.Build.0 = Release|Any CPU {C818B0E4-6019-3E0C-EE4C-17248430319E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C818B0E4-6019-3E0C-EE4C-17248430319E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Debug|x64.ActiveCfg = Debug|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Debug|x64.Build.0 = Debug|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Debug|x86.ActiveCfg = Debug|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Debug|x86.Build.0 = Debug|Any CPU {C818B0E4-6019-3E0C-EE4C-17248430319E}.Release|Any CPU.ActiveCfg = Release|Any CPU {C818B0E4-6019-3E0C-EE4C-17248430319E}.Release|Any CPU.Build.0 = Release|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Release|x64.ActiveCfg = Release|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Release|x64.Build.0 = Release|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Release|x86.ActiveCfg = Release|Any CPU + {C818B0E4-6019-3E0C-EE4C-17248430319E}.Release|x86.Build.0 = Release|Any CPU {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Debug|x64.ActiveCfg = Debug|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Debug|x64.Build.0 = Debug|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Debug|x86.ActiveCfg = Debug|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Debug|x86.Build.0 = Debug|Any CPU {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Release|Any CPU.ActiveCfg = Release|Any CPU {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Release|Any CPU.Build.0 = Release|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Release|x64.ActiveCfg = Release|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Release|x64.Build.0 = Release|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Release|x86.ActiveCfg = Release|Any CPU + {D29C4DFC-A392-7DFA-C85D-01827CD4A360}.Release|x86.Build.0 = Release|Any CPU {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Debug|x64.ActiveCfg = Debug|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Debug|x64.Build.0 = Debug|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Debug|x86.Build.0 = Debug|Any CPU {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Release|Any CPU.Build.0 = Release|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Release|x64.ActiveCfg = Release|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Release|x64.Build.0 = Release|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Release|x86.ActiveCfg = Release|Any CPU + {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8}.Release|x86.Build.0 = Release|Any CPU {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Debug|x64.ActiveCfg = Debug|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Debug|x64.Build.0 = Debug|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Debug|x86.Build.0 = Debug|Any CPU {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Release|Any CPU.ActiveCfg = Release|Any CPU {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Release|Any CPU.Build.0 = Release|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Release|x64.ActiveCfg = Release|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Release|x64.Build.0 = Release|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Release|x86.ActiveCfg = Release|Any CPU + {159E73C1-60F9-0D39-9CA1-79EC99187FDC}.Release|x86.Build.0 = Release|Any CPU {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Debug|x64.ActiveCfg = Debug|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Debug|x64.Build.0 = Debug|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Debug|x86.Build.0 = Debug|Any CPU {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Release|Any CPU.Build.0 = Release|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Release|x64.ActiveCfg = Release|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Release|x64.Build.0 = Release|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Release|x86.ActiveCfg = Release|Any CPU + {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68}.Release|x86.Build.0 = Release|Any CPU {76E6A59C-4F67-40D7-9354-1370893F16A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76E6A59C-4F67-40D7-9354-1370893F16A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Debug|x64.ActiveCfg = Debug|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Debug|x64.Build.0 = Debug|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Debug|x86.ActiveCfg = Debug|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Debug|x86.Build.0 = Debug|Any CPU {76E6A59C-4F67-40D7-9354-1370893F16A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {76E6A59C-4F67-40D7-9354-1370893F16A9}.Release|Any CPU.Build.0 = Release|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Release|x64.ActiveCfg = Release|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Release|x64.Build.0 = Release|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Release|x86.ActiveCfg = Release|Any CPU + {76E6A59C-4F67-40D7-9354-1370893F16A9}.Release|x86.Build.0 = Release|Any CPU {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Debug|x64.Build.0 = Debug|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Debug|x86.Build.0 = Debug|Any CPU {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Release|Any CPU.Build.0 = Release|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Release|x64.ActiveCfg = Release|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Release|x64.Build.0 = Release|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Release|x86.ActiveCfg = Release|Any CPU + {37F3C251-9ADC-4BE8-81A5-C86C563901FF}.Release|x86.Build.0 = Release|Any CPU {35A66308-5507-4540-A602-13AEAD643726}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {35A66308-5507-4540-A602-13AEAD643726}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Debug|x64.ActiveCfg = Debug|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Debug|x64.Build.0 = Debug|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Debug|x86.ActiveCfg = Debug|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Debug|x86.Build.0 = Debug|Any CPU {35A66308-5507-4540-A602-13AEAD643726}.Release|Any CPU.ActiveCfg = Release|Any CPU {35A66308-5507-4540-A602-13AEAD643726}.Release|Any CPU.Build.0 = Release|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Release|x64.ActiveCfg = Release|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Release|x64.Build.0 = Release|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Release|x86.ActiveCfg = Release|Any CPU + {35A66308-5507-4540-A602-13AEAD643726}.Release|x86.Build.0 = Release|Any CPU {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Debug|x64.ActiveCfg = Debug|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Debug|x64.Build.0 = Debug|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Debug|x86.ActiveCfg = Debug|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Debug|x86.Build.0 = Debug|Any CPU {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Release|Any CPU.ActiveCfg = Release|Any CPU {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Release|Any CPU.Build.0 = Release|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Release|x64.ActiveCfg = Release|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Release|x64.Build.0 = Release|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Release|x86.ActiveCfg = Release|Any CPU + {15E2C80B-87B4-4EF1-B297-A476F0E88354}.Release|x86.Build.0 = Release|Any CPU {558C71AF-080C-4795-B7A3-885852CFC0BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {558C71AF-080C-4795-B7A3-885852CFC0BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Debug|x64.ActiveCfg = Debug|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Debug|x64.Build.0 = Debug|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Debug|x86.ActiveCfg = Debug|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Debug|x86.Build.0 = Debug|Any CPU {558C71AF-080C-4795-B7A3-885852CFC0BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {558C71AF-080C-4795-B7A3-885852CFC0BC}.Release|Any CPU.Build.0 = Release|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Release|x64.ActiveCfg = Release|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Release|x64.Build.0 = Release|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Release|x86.ActiveCfg = Release|Any CPU + {558C71AF-080C-4795-B7A3-885852CFC0BC}.Release|x86.Build.0 = Release|Any CPU {64AB629A-BE06-455C-98DF-C961623928BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64AB629A-BE06-455C-98DF-C961623928BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Debug|x64.ActiveCfg = Debug|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Debug|x64.Build.0 = Debug|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Debug|x86.ActiveCfg = Debug|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Debug|x86.Build.0 = Debug|Any CPU {64AB629A-BE06-455C-98DF-C961623928BB}.Release|Any CPU.ActiveCfg = Release|Any CPU {64AB629A-BE06-455C-98DF-C961623928BB}.Release|Any CPU.Build.0 = Release|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Release|x64.ActiveCfg = Release|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Release|x64.Build.0 = Release|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Release|x86.ActiveCfg = Release|Any CPU + {64AB629A-BE06-455C-98DF-C961623928BB}.Release|x86.Build.0 = Release|Any CPU {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Debug|x64.ActiveCfg = Debug|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Debug|x64.Build.0 = Debug|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Debug|x86.Build.0 = Debug|Any CPU {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Release|Any CPU.Build.0 = Release|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Release|x64.ActiveCfg = Release|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Release|x64.Build.0 = Release|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Release|x86.ActiveCfg = Release|Any CPU + {3DD78303-DF05-4FCA-8DC7-B6503B182264}.Release|x86.Build.0 = Release|Any CPU {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Debug|x64.ActiveCfg = Debug|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Debug|x64.Build.0 = Debug|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Debug|x86.ActiveCfg = Debug|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Debug|x86.Build.0 = Debug|Any CPU {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|Any CPU.ActiveCfg = Release|Any CPU {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|Any CPU.Build.0 = Release|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|x64.ActiveCfg = Release|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|x64.Build.0 = Release|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|x86.ActiveCfg = Release|Any CPU + {28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|x86.Build.0 = Release|Any CPU {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|x64.ActiveCfg = Debug|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|x64.Build.0 = Debug|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|x86.ActiveCfg = Debug|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|x86.Build.0 = Debug|Any CPU {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|Any CPU.ActiveCfg = Release|Any CPU {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|Any CPU.Build.0 = Release|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|x64.ActiveCfg = Release|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|x64.Build.0 = Release|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|x86.ActiveCfg = Release|Any CPU + {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|x86.Build.0 = Release|Any CPU {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|x64.ActiveCfg = Debug|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|x64.Build.0 = Debug|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|x86.ActiveCfg = Debug|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|x86.Build.0 = Debug|Any CPU {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|Any CPU.ActiveCfg = Release|Any CPU {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|Any CPU.Build.0 = Release|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|x64.ActiveCfg = Release|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|x64.Build.0 = Release|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|x86.ActiveCfg = Release|Any CPU + {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|x86.Build.0 = Release|Any CPU {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|x64.ActiveCfg = Debug|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|x64.Build.0 = Debug|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|x86.ActiveCfg = Debug|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|x86.Build.0 = Debug|Any CPU {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|Any CPU.ActiveCfg = Release|Any CPU {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|Any CPU.Build.0 = Release|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|x64.ActiveCfg = Release|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|x64.Build.0 = Release|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|x86.ActiveCfg = Release|Any CPU + {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|x86.Build.0 = Release|Any CPU {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Debug|x64.ActiveCfg = Debug|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Debug|x64.Build.0 = Debug|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Debug|x86.Build.0 = Debug|Any CPU {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Release|Any CPU.ActiveCfg = Release|Any CPU {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Release|Any CPU.Build.0 = Release|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Release|x64.ActiveCfg = Release|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Release|x64.Build.0 = Release|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Release|x86.ActiveCfg = Release|Any CPU + {AD00BDF9-33FF-4D5F-9E62-0241ABBB1A5E}.Release|x86.Build.0 = Release|Any CPU {309E068D-35DA-454B-9A81-460507EDE5FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {309E068D-35DA-454B-9A81-460507EDE5FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Debug|x64.ActiveCfg = Debug|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Debug|x64.Build.0 = Debug|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Debug|x86.ActiveCfg = Debug|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Debug|x86.Build.0 = Debug|Any CPU {309E068D-35DA-454B-9A81-460507EDE5FC}.Release|Any CPU.ActiveCfg = Release|Any CPU {309E068D-35DA-454B-9A81-460507EDE5FC}.Release|Any CPU.Build.0 = Release|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Release|x64.ActiveCfg = Release|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Release|x64.Build.0 = Release|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Release|x86.ActiveCfg = Release|Any CPU + {309E068D-35DA-454B-9A81-460507EDE5FC}.Release|x86.Build.0 = Release|Any CPU {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Debug|x64.Build.0 = Debug|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Debug|x86.Build.0 = Debug|Any CPU {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Release|Any CPU.ActiveCfg = Release|Any CPU {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Release|Any CPU.Build.0 = Release|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Release|x64.ActiveCfg = Release|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Release|x64.Build.0 = Release|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Release|x86.ActiveCfg = Release|Any CPU + {9C17B964-9EB5-4B98-A1E6-D036BDE61CA9}.Release|x86.Build.0 = Release|Any CPU {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Debug|x64.Build.0 = Debug|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Debug|x86.ActiveCfg = Debug|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Debug|x86.Build.0 = Debug|Any CPU {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Release|Any CPU.Build.0 = Release|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Release|x64.ActiveCfg = Release|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Release|x64.Build.0 = Release|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Release|x86.ActiveCfg = Release|Any CPU + {BF32CF40-2E0C-4A50-B4C4-44447BFAC94C}.Release|x86.Build.0 = Release|Any CPU {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Debug|x64.ActiveCfg = Debug|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Debug|x64.Build.0 = Debug|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Debug|x86.ActiveCfg = Debug|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Debug|x86.Build.0 = Debug|Any CPU {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Release|Any CPU.Build.0 = Release|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Release|x64.ActiveCfg = Release|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Release|x64.Build.0 = Release|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Release|x86.ActiveCfg = Release|Any CPU + {8F137974-568B-4975-8E2C-BEFB828E2AF9}.Release|x86.Build.0 = Release|Any CPU {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Debug|x64.ActiveCfg = Debug|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Debug|x64.Build.0 = Debug|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Debug|x86.ActiveCfg = Debug|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Debug|x86.Build.0 = Debug|Any CPU {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Release|Any CPU.ActiveCfg = Release|Any CPU {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Release|Any CPU.Build.0 = Release|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Release|x64.ActiveCfg = Release|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Release|x64.Build.0 = Release|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Release|x86.ActiveCfg = Release|Any CPU + {19F7E807-CEF2-4161-90BF-E2D44814C00C}.Release|x86.Build.0 = Release|Any CPU {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Debug|x64.ActiveCfg = Debug|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Debug|x64.Build.0 = Debug|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Debug|x86.ActiveCfg = Debug|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Debug|x86.Build.0 = Debug|Any CPU {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Release|Any CPU.Build.0 = Release|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Release|x64.ActiveCfg = Release|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Release|x64.Build.0 = Release|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Release|x86.ActiveCfg = Release|Any CPU + {DED1FCAB-BC52-46C5-9F59-9E5F22D55AB9}.Release|x86.Build.0 = Release|Any CPU {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Debug|x64.Build.0 = Debug|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Debug|x86.ActiveCfg = Debug|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Debug|x86.Build.0 = Debug|Any CPU {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Release|Any CPU.ActiveCfg = Release|Any CPU {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Release|Any CPU.Build.0 = Release|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Release|x64.ActiveCfg = Release|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Release|x64.Build.0 = Release|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Release|x86.ActiveCfg = Release|Any CPU + {BEAFAA85-F59E-4097-99E0-98C4AD34D841}.Release|x86.Build.0 = Release|Any CPU {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Debug|x64.Build.0 = Debug|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Debug|x86.ActiveCfg = Debug|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Debug|x86.Build.0 = Debug|Any CPU {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Release|Any CPU.ActiveCfg = Release|Any CPU {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Release|Any CPU.Build.0 = Release|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Release|x64.ActiveCfg = Release|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Release|x64.Build.0 = Release|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Release|x86.ActiveCfg = Release|Any CPU + {BEB35A25-5A80-4B56-A1EC-F005288CD11C}.Release|x86.Build.0 = Release|Any CPU {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Debug|x64.ActiveCfg = Debug|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Debug|x64.Build.0 = Debug|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Debug|x86.ActiveCfg = Debug|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Debug|x86.Build.0 = Debug|Any CPU {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Release|Any CPU.ActiveCfg = Release|Any CPU {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Release|Any CPU.Build.0 = Release|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Release|x64.ActiveCfg = Release|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Release|x64.Build.0 = Release|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Release|x86.ActiveCfg = Release|Any CPU + {015646EB-EC33-4ADF-8417-B9D1A6B7CF06}.Release|x86.Build.0 = Release|Any CPU {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Debug|x64.ActiveCfg = Debug|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Debug|x64.Build.0 = Debug|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Debug|x86.ActiveCfg = Debug|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Debug|x86.Build.0 = Debug|Any CPU {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Release|Any CPU.ActiveCfg = Release|Any CPU {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Release|Any CPU.Build.0 = Release|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Release|x64.ActiveCfg = Release|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Release|x64.Build.0 = Release|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Release|x86.ActiveCfg = Release|Any CPU + {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347}.Release|x86.Build.0 = Release|Any CPU {F9C596A4-526A-4B16-9CB8-4D188D810775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F9C596A4-526A-4B16-9CB8-4D188D810775}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Debug|x64.ActiveCfg = Debug|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Debug|x64.Build.0 = Debug|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Debug|x86.ActiveCfg = Debug|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Debug|x86.Build.0 = Debug|Any CPU {F9C596A4-526A-4B16-9CB8-4D188D810775}.Release|Any CPU.ActiveCfg = Release|Any CPU {F9C596A4-526A-4B16-9CB8-4D188D810775}.Release|Any CPU.Build.0 = Release|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Release|x64.ActiveCfg = Release|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Release|x64.Build.0 = Release|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Release|x86.ActiveCfg = Release|Any CPU + {F9C596A4-526A-4B16-9CB8-4D188D810775}.Release|x86.Build.0 = Release|Any CPU {7055576E-1144-4726-BA88-DF89F2A13FA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7055576E-1144-4726-BA88-DF89F2A13FA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Debug|x64.ActiveCfg = Debug|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Debug|x64.Build.0 = Debug|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Debug|x86.ActiveCfg = Debug|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Debug|x86.Build.0 = Debug|Any CPU {7055576E-1144-4726-BA88-DF89F2A13FA8}.Release|Any CPU.ActiveCfg = Release|Any CPU {7055576E-1144-4726-BA88-DF89F2A13FA8}.Release|Any CPU.Build.0 = Release|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Release|x64.ActiveCfg = Release|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Release|x64.Build.0 = Release|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Release|x86.ActiveCfg = Release|Any CPU + {7055576E-1144-4726-BA88-DF89F2A13FA8}.Release|x86.Build.0 = Release|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Debug|x64.ActiveCfg = Debug|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Debug|x64.Build.0 = Debug|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Debug|x86.ActiveCfg = Debug|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Debug|x86.Build.0 = Debug|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Release|Any CPU.Build.0 = Release|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Release|x64.ActiveCfg = Release|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Release|x64.Build.0 = Release|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Release|x86.ActiveCfg = Release|Any CPU + {A904A0FC-9D73-4349-90A3-498053B43CD6}.Release|x86.Build.0 = Release|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Debug|x64.ActiveCfg = Debug|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Debug|x64.Build.0 = Debug|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Debug|x86.ActiveCfg = Debug|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Debug|x86.Build.0 = Debug|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Release|Any CPU.Build.0 = Release|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Release|x64.ActiveCfg = Release|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Release|x64.Build.0 = Release|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Release|x86.ActiveCfg = Release|Any CPU + {E87F26AD-1F6B-4723-A3B8-4EC761B08382}.Release|x86.Build.0 = Release|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Debug|x64.ActiveCfg = Debug|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Debug|x64.Build.0 = Debug|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Debug|x86.ActiveCfg = Debug|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Debug|x86.Build.0 = Debug|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Release|Any CPU.Build.0 = Release|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Release|x64.ActiveCfg = Release|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Release|x64.Build.0 = Release|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Release|x86.ActiveCfg = Release|Any CPU + {C3D4E5F6-7890-1234-5678-90ABCDEF1234}.Release|x86.Build.0 = Release|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Debug|x64.ActiveCfg = Debug|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Debug|x64.Build.0 = Debug|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Debug|x86.ActiveCfg = Debug|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Debug|x86.Build.0 = Debug|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Release|Any CPU.Build.0 = Release|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Release|x64.ActiveCfg = Release|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Release|x64.Build.0 = Release|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Release|x86.ActiveCfg = Release|Any CPU + {AF9D6B51-19A5-451F-8225-2F1348835A3A}.Release|x86.Build.0 = Release|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Debug|x64.ActiveCfg = Debug|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Debug|x64.Build.0 = Debug|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Debug|x86.ActiveCfg = Debug|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Debug|x86.Build.0 = Debug|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Release|Any CPU.Build.0 = Release|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Release|x64.ActiveCfg = Release|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Release|x64.Build.0 = Release|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Release|x86.ActiveCfg = Release|Any CPU + {65B9F528-568B-4E0E-894E-F22E0B7C64BB}.Release|x86.Build.0 = Release|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Debug|x64.ActiveCfg = Debug|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Debug|x64.Build.0 = Debug|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Debug|x86.ActiveCfg = Debug|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Debug|x86.Build.0 = Debug|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Release|Any CPU.Build.0 = Release|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Release|x64.ActiveCfg = Release|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Release|x64.Build.0 = Release|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Release|x86.ActiveCfg = Release|Any CPU + {50798373-8A89-4159-BFD9-830D259538D6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {3948BAF0-023F-4B43-8E77-56C3B00C6EFD} = {D0212324-351E-4CA6-95EE-27754B5367CC} + {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {30CF0330-4B09-4784-B499-46BED303810B} + {45B793EC-7BFF-45C0-BD0E-2D1601C8D01E} = {30CF0330-4B09-4784-B499-46BED303810B} + {AAD61D93-7C78-42C4-9F37-2564D127A668} = {30CF0330-4B09-4784-B499-46BED303810B} + {5220DB25-20E9-4D07-801C-A970E71FB21C} = {30CF0330-4B09-4784-B499-46BED303810B} + {897A92CE-3B9D-43DA-BBDE-085A6AA0BF33} = {30CF0330-4B09-4784-B499-46BED303810B} + {44E2676B-6F07-44F1-9FAB-4A961A1ECEDE} = {30CF0330-4B09-4784-B499-46BED303810B} {4B5DB45A-2716-1FDE-8EC7-1AC75FFA30F2} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {78CBE43C-0EF2-048E-987B-A603A38099E6} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {AA90183E-F009-F88A-9081-BAB6E5ED6B22} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {266D14A8-4D8F-795F-169F-A7E7B4F23D1E} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {3E782B62-87D8-F5FD-CA2D-0D524C5BB530} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {2BF08754-1FB0-405D-9F0C-1BEFF9084E6E} = {30CF0330-4B09-4784-B499-46BED303810B} {6B6CC05A-1C2D-C567-3D0B-C5E87A042EEB} = {2BF08754-1FB0-405D-9F0C-1BEFF9084E6E} {EC7C3333-59C3-5ACE-C84C-5E135964348C} = {5220DB25-20E9-4D07-801C-A970E71FB21C} {52E6A127-2F77-547F-2917-E6C6AAB1CC64} = {5220DB25-20E9-4D07-801C-A970E71FB21C} @@ -675,28 +1476,39 @@ Global {1FD27C49-8173-249A-80E9-DBA071A56E8D} = {2BF08754-1FB0-405D-9F0C-1BEFF9084E6E} {4C4DAF3C-DE71-F6B3-F3A3-15583A8B719F} = {2BF08754-1FB0-405D-9F0C-1BEFF9084E6E} {BB81E01D-7453-9068-B1E3-90E3072C820B} = {2BF08754-1FB0-405D-9F0C-1BEFF9084E6E} + {F670C86F-ACDA-4549-B9E1-E530B1ED5538} = {30CF0330-4B09-4784-B499-46BED303810B} {95C8EFEE-9396-F334-9B76-78322650A0C6} = {F670C86F-ACDA-4549-B9E1-E530B1ED5538} + {9732C4B1-3E94-4705-8CBE-1DC48F55C8EA} = {30CF0330-4B09-4784-B499-46BED303810B} {C568B847-15AB-C4DB-5675-0D5F400ED14D} = {9732C4B1-3E94-4705-8CBE-1DC48F55C8EA} {C4D65789-A62A-DAD5-7246-A0E476F86CDF} = {9732C4B1-3E94-4705-8CBE-1DC48F55C8EA} {F5B2629A-E0C9-9B73-4941-DD44DD557A9B} = {9732C4B1-3E94-4705-8CBE-1DC48F55C8EA} + {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} = {30CF0330-4B09-4784-B499-46BED303810B} {43591B08-CC42-9C1D-480E-DFA6C1E1B59A} = {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} {B8311F08-4555-25E2-A8E5-1EE95A8F2A26} = {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} {5E7A6A10-3533-D6CD-D4CA-6C2741E3D9F8} = {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} {70C03970-8EF8-A0A7-83DB-541987BEE4F6} = {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} {0F20AEFD-EBD8-A0B4-279E-5E41AF73BC1A} = {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} {2D72DB60-227D-49F0-44F0-9FAF52244EB6} = {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} + {91656D55-A0E6-45B6-B48D-24DF192DAD02} = {30CF0330-4B09-4784-B499-46BED303810B} {47F17474-6841-126A-ADF8-DD2A7631C8C6} = {91656D55-A0E6-45B6-B48D-24DF192DAD02} {D0CFE3DE-32FB-ECF3-5B2B-F97661AC0ED4} = {91656D55-A0E6-45B6-B48D-24DF192DAD02} {2D745C3D-A97B-8538-71D4-0DB9ADB13ECB} = {91656D55-A0E6-45B6-B48D-24DF192DAD02} {41A9C3FC-6F99-1EA8-3EB4-3638AF172CB5} = {91656D55-A0E6-45B6-B48D-24DF192DAD02} {9250D8B1-9D69-A957-D378-8173686A0F9C} = {45B793EC-7BFF-45C0-BD0E-2D1601C8D01E} {FE487F94-5242-C0C7-884A-3EE8FB8FC24E} = {45B793EC-7BFF-45C0-BD0E-2D1601C8D01E} + {559A9049-76C1-421C-9295-32ED7438D52E} = {30CF0330-4B09-4784-B499-46BED303810B} {C2721BCB-2FB1-9227-AABB-ED768EB292FD} = {559A9049-76C1-421C-9295-32ED7438D52E} + {0EB9AB19-0C85-4551-8347-F3D330614B47} = {30CF0330-4B09-4784-B499-46BED303810B} {4C24646E-B017-9C72-5E5E-27EEE2F23D7B} = {0EB9AB19-0C85-4551-8347-F3D330614B47} + {A0EEAF46-1B46-4C7D-A7E4-863814F87C4B} = {30CF0330-4B09-4784-B499-46BED303810B} {B39D92DE-334C-BFD7-2A0D-6EC2626E445C} = {A0EEAF46-1B46-4C7D-A7E4-863814F87C4B} {0CA52158-CBB6-74FC-B63F-812E059053A4} = {A0EEAF46-1B46-4C7D-A7E4-863814F87C4B} + {EB873525-AE02-4406-AC78-5996DE781573} = {30CF0330-4B09-4784-B499-46BED303810B} + {A130EEF5-7DF0-40CB-BD71-744716F0BCE7} = {30CF0330-4B09-4784-B499-46BED303810B} {ABC40471-5A32-0AC0-594B-FF19B66E2493} = {A130EEF5-7DF0-40CB-BD71-744716F0BCE7} + {E0C43181-76BA-47C7-93CC-6CE0F577F14B} = {30CF0330-4B09-4784-B499-46BED303810B} {719BCAE9-BF9C-75D9-E551-782D6FD6421C} = {E0C43181-76BA-47C7-93CC-6CE0F577F14B} + {BF696EF4-FEAE-4008-A788-369437420259} = {30CF0330-4B09-4784-B499-46BED303810B} {A5E2E986-8CA8-3F4E-C2B4-C874A0780C0F} = {BF696EF4-FEAE-4008-A788-369437420259} {D03AF84C-BAAD-50E9-A561-CE5604442A35} = {BF696EF4-FEAE-4008-A788-369437420259} {93F9B20D-47AB-87ED-A9AA-005F631C4CA2} = {BF696EF4-FEAE-4008-A788-369437420259} @@ -706,6 +1518,7 @@ Global {081E6F32-A418-0F77-3BFE-223903CFBA96} = {BF696EF4-FEAE-4008-A788-369437420259} {B130CDB8-E048-9D95-3FEA-BF71F556C40F} = {BF696EF4-FEAE-4008-A788-369437420259} {4E2F05DA-C902-293B-90E9-58583ED0D267} = {BF696EF4-FEAE-4008-A788-369437420259} + {04265302-AF6B-4627-807C-DE9E1699D7C9} = {30CF0330-4B09-4784-B499-46BED303810B} {22EF03B2-6BA9-B8BD-A627-4249397F9299} = {04265302-AF6B-4627-807C-DE9E1699D7C9} {0D391CA4-9C36-BC86-1505-D05F13AE8FFC} = {EB873525-AE02-4406-AC78-5996DE781573} {66F9CCE6-A423-B568-1CF5-8CACC6F1FEE7} = {EB873525-AE02-4406-AC78-5996DE781573} @@ -716,33 +1529,15 @@ Global {C818B0E4-6019-3E0C-EE4C-17248430319E} = {BF696EF4-FEAE-4008-A788-369437420259} {D29C4DFC-A392-7DFA-C85D-01827CD4A360} = {A130EEF5-7DF0-40CB-BD71-744716F0BCE7} {E6BD7D7F-3CC5-EE66-577D-19015EFD03D8} = {04265302-AF6B-4627-807C-DE9E1699D7C9} + {7D32914F-1D75-4E01-A0D1-BBF67789A0E5} = {30CF0330-4B09-4784-B499-46BED303810B} {159E73C1-60F9-0D39-9CA1-79EC99187FDC} = {7D32914F-1D75-4E01-A0D1-BBF67789A0E5} + {9B6DFC6C-2514-4784-9952-9B0B913434F9} = {30CF0330-4B09-4784-B499-46BED303810B} {4E8D5DEA-6FB5-8878-0029-584C8F0D2D68} = {9B6DFC6C-2514-4784-9952-9B0B913434F9} {F4CD4668-A0D0-4CD7-91C1-09EE80A03C26} = {527248D6-B851-4C8D-8667-E2FB0A91DABF} {76E6A59C-4F67-40D7-9354-1370893F16A9} = {F4CD4668-A0D0-4CD7-91C1-09EE80A03C26} {37F3C251-9ADC-4BE8-81A5-C86C563901FF} = {F4CD4668-A0D0-4CD7-91C1-09EE80A03C26} {35A66308-5507-4540-A602-13AEAD643726} = {F4CD4668-A0D0-4CD7-91C1-09EE80A03C26} {30CF0330-4B09-4784-B499-46BED303810B} = {527248D6-B851-4C8D-8667-E2FB0A91DABF} - {559A9049-76C1-421C-9295-32ED7438D52E} = {30CF0330-4B09-4784-B499-46BED303810B} - {5220DB25-20E9-4D07-801C-A970E71FB21C} = {30CF0330-4B09-4784-B499-46BED303810B} - {F670C86F-ACDA-4549-B9E1-E530B1ED5538} = {30CF0330-4B09-4784-B499-46BED303810B} - {9732C4B1-3E94-4705-8CBE-1DC48F55C8EA} = {30CF0330-4B09-4784-B499-46BED303810B} - {B5E5264A-5DF3-4A23-8387-D3C10A9B1F9B} = {30CF0330-4B09-4784-B499-46BED303810B} - {9B6DFC6C-2514-4784-9952-9B0B913434F9} = {30CF0330-4B09-4784-B499-46BED303810B} - {A0EEAF46-1B46-4C7D-A7E4-863814F87C4B} = {30CF0330-4B09-4784-B499-46BED303810B} - {E0C43181-76BA-47C7-93CC-6CE0F577F14B} = {30CF0330-4B09-4784-B499-46BED303810B} - {A130EEF5-7DF0-40CB-BD71-744716F0BCE7} = {30CF0330-4B09-4784-B499-46BED303810B} - {AAD61D93-7C78-42C4-9F37-2564D127A668} = {30CF0330-4B09-4784-B499-46BED303810B} - {91656D55-A0E6-45B6-B48D-24DF192DAD02} = {30CF0330-4B09-4784-B499-46BED303810B} - {0EB9AB19-0C85-4551-8347-F3D330614B47} = {30CF0330-4B09-4784-B499-46BED303810B} - {7D32914F-1D75-4E01-A0D1-BBF67789A0E5} = {30CF0330-4B09-4784-B499-46BED303810B} - {EB873525-AE02-4406-AC78-5996DE781573} = {30CF0330-4B09-4784-B499-46BED303810B} - {BF696EF4-FEAE-4008-A788-369437420259} = {30CF0330-4B09-4784-B499-46BED303810B} - {2BF08754-1FB0-405D-9F0C-1BEFF9084E6E} = {30CF0330-4B09-4784-B499-46BED303810B} - {897A92CE-3B9D-43DA-BBDE-085A6AA0BF33} = {30CF0330-4B09-4784-B499-46BED303810B} - {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {30CF0330-4B09-4784-B499-46BED303810B} - {45B793EC-7BFF-45C0-BD0E-2D1601C8D01E} = {30CF0330-4B09-4784-B499-46BED303810B} - {44E2676B-6F07-44F1-9FAB-4A961A1ECEDE} = {30CF0330-4B09-4784-B499-46BED303810B} {3DDE6F89-531C-47F8-9CD7-7A4E6984FA48} = {A99FA26E-2098-403A-BD04-6BBCFBE3AC7D} {26C9B7F3-20A4-4639-B913-7A86679EBB33} = {3DDE6F89-531C-47F8-9CD7-7A4E6984FA48} {15E2C80B-87B4-4EF1-B297-A476F0E88354} = {26C9B7F3-20A4-4639-B913-7A86679EBB33} @@ -754,7 +1549,6 @@ Global {3DD78303-DF05-4FCA-8DC7-B6503B182264} = {04087802-CE19-4700-A4A9-536D7537F927} {8D0EC628-350F-47FC-8B36-DD98B4B7CC93} = {30CF0330-4B09-4784-B499-46BED303810B} {28D04FA3-4DCC-4137-8ED4-9F6F1A815909} = {8D0EC628-350F-47FC-8B36-DD98B4B7CC93} - {04265302-AF6B-4627-807C-DE9E1699D7C9} = {30CF0330-4B09-4784-B499-46BED303810B} {9B363CC3-1F38-409B-8E0D-E2C13019902A} = {30CF0330-4B09-4784-B499-46BED303810B} {D620FC48-5B8E-4010-86DE-20628364AA6E} = {9B363CC3-1F38-409B-8E0D-E2C13019902A} {53F9BF60-127F-4F86-9B33-34445BFA512D} = {9B363CC3-1F38-409B-8E0D-E2C13019902A} @@ -774,6 +1568,9 @@ Global {A639E5C3-1A2D-41F9-A2CE-47DBFCA84347} = {5220DB25-20E9-4D07-801C-A970E71FB21C} {F9C596A4-526A-4B16-9CB8-4D188D810775} = {5220DB25-20E9-4D07-801C-A970E71FB21C} {7055576E-1144-4726-BA88-DF89F2A13FA8} = {5220DB25-20E9-4D07-801C-A970E71FB21C} + {6E46B8AD-FA47-474F-B959-0B530771C28C} = {3DDE6F89-531C-47F8-9CD7-7A4E6984FA48} + {65B9F528-568B-4E0E-894E-F22E0B7C64BB} = {6E46B8AD-FA47-474F-B959-0B530771C28C} + {50798373-8A89-4159-BFD9-830D259538D6} = {6E46B8AD-FA47-474F-B959-0B530771C28C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {11A771DA-B728-445E-8A88-AE1C84C3B3A6} diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz.EFCore.MySql/MySqlQuartzExtensions.cs b/src/modules/scheduling/Elsa.Scheduling.Quartz.EFCore.MySql/MySqlQuartzExtensions.cs index 2f4c17d0..937f788f 100644 --- a/src/modules/scheduling/Elsa.Scheduling.Quartz.EFCore.MySql/MySqlQuartzExtensions.cs +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz.EFCore.MySql/MySqlQuartzExtensions.cs @@ -35,7 +35,7 @@ public static QuartzFeature UseMySql(this QuartzFeature feature, string connecti store.UseClustering(); }); }; - + feature.Module.ConfigureHostedService>(-100); return feature; diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz/Contracts/IQuartzJobRetryScheduler.cs b/src/modules/scheduling/Elsa.Scheduling.Quartz/Contracts/IQuartzJobRetryScheduler.cs new file mode 100644 index 00000000..2d355d88 --- /dev/null +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz/Contracts/IQuartzJobRetryScheduler.cs @@ -0,0 +1,14 @@ +using Quartz; + +namespace Elsa.Scheduling.Quartz.Contracts; + +/// +/// Schedules retries for Quartz jobs. +/// +public interface IQuartzJobRetryScheduler +{ + /// + /// Reschedules the trigger of the current job for a retry using the configured retry delay. + /// + Task ScheduleRetryAsync(IJobExecutionContext context, CancellationToken cancellationToken = default); +} diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz/Elsa.Scheduling.Quartz.csproj b/src/modules/scheduling/Elsa.Scheduling.Quartz/Elsa.Scheduling.Quartz.csproj index b4d74829..859ada8d 100644 --- a/src/modules/scheduling/Elsa.Scheduling.Quartz/Elsa.Scheduling.Quartz.csproj +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz/Elsa.Scheduling.Quartz.csproj @@ -13,10 +13,12 @@ + + \ No newline at end of file diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz/Features/QuartzSchedulerFeature.cs b/src/modules/scheduling/Elsa.Scheduling.Quartz/Features/QuartzSchedulerFeature.cs index b4dd122c..fced1865 100644 --- a/src/modules/scheduling/Elsa.Scheduling.Quartz/Features/QuartzSchedulerFeature.cs +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz/Features/QuartzSchedulerFeature.cs @@ -2,12 +2,14 @@ using Elsa.Features.Abstractions; using Elsa.Features.Attributes; using Elsa.Features.Services; -using Elsa.Scheduling.Quartz.Contracts; using Elsa.Scheduling.Quartz.Handlers; +using Elsa.Scheduling.Quartz.Options; using Elsa.Scheduling.Quartz.Services; using Elsa.Scheduling.Quartz.Tasks; using Elsa.Scheduling.Features; +using Elsa.Scheduling.Quartz.Contracts; using Elsa.Workflows; +using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Quartz; @@ -17,8 +19,18 @@ namespace Elsa.Scheduling.Quartz.Features; /// A feature that installs Quartz.NET implementations for . /// [DependsOn(typeof(SchedulingFeature))] +[UsedImplicitly] public class QuartzSchedulerFeature(IModule module) : FeatureBase(module) { + private Action _configureQuartzJobOptions = _ => { }; + + [PublicAPI] + public QuartzSchedulerFeature ConfigureOptions(Action configure) + { + _configureQuartzJobOptions += configure; + return this; + } + /// public override void Configure() { @@ -40,7 +52,10 @@ public override void Apply() .AddSingleton() .AddScoped() .AddScoped() + .AddSingleton() .AddStartupTask() .AddQuartz(); + + Services.Configure(_configureQuartzJobOptions); } } \ No newline at end of file diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/ResumeWorkflowJob.cs b/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/ResumeWorkflowJob.cs index 9ad115c5..139fabfd 100644 --- a/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/ResumeWorkflowJob.cs +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/ResumeWorkflowJob.cs @@ -1,9 +1,12 @@ using Elsa.Common; using Elsa.Common.Multitenancy; using Elsa.Extensions; +using Elsa.Resilience; +using Elsa.Scheduling.Quartz.Contracts; using Elsa.Workflows.Models; using Elsa.Workflows.Runtime; using Elsa.Workflows.Runtime.Messages; +using Microsoft.Extensions.Logging; using Quartz; namespace Elsa.Scheduling.Quartz.Jobs; @@ -11,7 +14,14 @@ namespace Elsa.Scheduling.Quartz.Jobs; /// /// A job that resumes a workflow. /// -public class ResumeWorkflowJob(IWorkflowRuntime workflowRuntime, IJsonSerializer jsonSerializer, ITenantFinder tenantFinder, ITenantAccessor tenantAccessor) : IJob +public class ResumeWorkflowJob( + IWorkflowRuntime workflowRuntime, + IJsonSerializer jsonSerializer, + ITenantFinder tenantFinder, + ITenantAccessor tenantAccessor, + ITransientExceptionDetector transientExceptionDetector, + IQuartzJobRetryScheduler retryScheduler, + ILogger logger) : IJob { /// public async Task Execute(IJobExecutionContext context) @@ -23,15 +33,32 @@ public async Task Execute(IJobExecutionContext context) var serializedActivityHandle = (string)map.Get(nameof(ScheduleExistingWorkflowInstanceRequest.ActivityHandle)); var activityHandle = serializedActivityHandle != null! ? jsonSerializer.Deserialize(serializedActivityHandle) : null; var workflowInstanceId = (string)map.Get(nameof(ScheduleExistingWorkflowInstanceRequest.WorkflowInstanceId)); - var workflowClient = await workflowRuntime.CreateClientAsync(workflowInstanceId, context.CancellationToken); - var request = new RunWorkflowInstanceRequest + var cancellationToken = context.CancellationToken; + + try + { + var workflowClient = await workflowRuntime.CreateClientAsync(workflowInstanceId, cancellationToken); + var request = new RunWorkflowInstanceRequest + { + BookmarkId = (string)map.Get(nameof(ScheduleExistingWorkflowInstanceRequest.BookmarkId)), + ActivityHandle = activityHandle, + Input = map.GetDictionary(nameof(ScheduleExistingWorkflowInstanceRequest.Input)), + Properties = map.GetDictionary(nameof(ScheduleExistingWorkflowInstanceRequest.Properties)), + }; + await workflowClient.RunInstanceAsync(request, cancellationToken: cancellationToken); + + logger.LogInformation("Resumed workflow instance {WorkflowInstanceId}", workflowInstanceId); + } + catch (Exception e) when (transientExceptionDetector.IsTransient(e)) + { + logger.LogWarning(e, "A transient error occurred while resuming workflow instance {WorkflowInstanceId}. Rescheduling job for retry", workflowInstanceId); + await retryScheduler.ScheduleRetryAsync(context, cancellationToken); + } + catch (Exception e) { - BookmarkId = (string)map.Get(nameof(ScheduleExistingWorkflowInstanceRequest.BookmarkId)), - ActivityHandle = activityHandle, - Input = map.GetDictionary(nameof(ScheduleExistingWorkflowInstanceRequest.Input)), - Properties = map.GetDictionary(nameof(ScheduleExistingWorkflowInstanceRequest.Properties)), - }; - await workflowClient.RunInstanceAsync(request, cancellationToken: context.CancellationToken); + logger.LogError(e, "An error occurred while resuming workflow instance {WorkflowInstanceId}", workflowInstanceId); + await context.Scheduler.DeleteJob(context.JobDetail.Key, cancellationToken); + } } } } \ No newline at end of file diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/RunWorkflowJob.cs b/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/RunWorkflowJob.cs index 7d637dd7..3db56cf2 100644 --- a/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/RunWorkflowJob.cs +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz/Jobs/RunWorkflowJob.cs @@ -1,8 +1,11 @@ using Elsa.Common.Multitenancy; using Elsa.Extensions; +using Elsa.Resilience; +using Elsa.Scheduling.Quartz.Contracts; using Elsa.Workflows.Models; using Elsa.Workflows.Runtime; using Elsa.Workflows.Runtime.Exceptions; +using JetBrains.Annotations; using Microsoft.Extensions.Logging; using Quartz; @@ -11,10 +14,13 @@ namespace Elsa.Scheduling.Quartz.Jobs; /// /// A job that runs a workflow. /// +[UsedImplicitly] public class RunWorkflowJob( ITenantAccessor tenantAccessor, ITenantFinder tenantFinder, IWorkflowStarter workflowStarter, + ITransientExceptionDetector transientExceptionDetector, + IQuartzJobRetryScheduler retryScheduler, ILogger logger) : IJob { /// @@ -54,6 +60,11 @@ public async Task Execute(IJobExecutionContext context) logger.LogWarning(e, "Could not find workflow graph for workflow definition handle {WorkflowDefinitionHandle}", startRequest.WorkflowDefinitionHandle); await context.Scheduler.DeleteJob(context.JobDetail.Key, cancellationToken); } + catch (Exception e) when (transientExceptionDetector.IsTransient(e)) + { + logger.LogWarning(e, "A transient error occurred while starting workflow {WorkflowDefinitionHandle} with correlation ID {CorrelationId}. Rescheduling job for retry", startRequest.WorkflowDefinitionHandle, startRequest.CorrelationId); + await retryScheduler.ScheduleRetryAsync(context, cancellationToken); + } catch (Exception e) { logger.LogError(e, "An error occurred while starting workflow {WorkflowDefinitionHandle} with correlation ID {CorrelationId}", startRequest.WorkflowDefinitionHandle, startRequest.CorrelationId); diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz/Options/QuartzJobOptions.cs b/src/modules/scheduling/Elsa.Scheduling.Quartz/Options/QuartzJobOptions.cs new file mode 100644 index 00000000..62a6c4dc --- /dev/null +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz/Options/QuartzJobOptions.cs @@ -0,0 +1,12 @@ +namespace Elsa.Scheduling.Quartz.Options; + +/// +/// Options for Quartz job execution behavior. +/// +public class QuartzJobOptions +{ + /// + /// The delay in seconds before rescheduling a job after a transient failure. + /// + public TimeSpan TransientExceptionRetryDelay { get; set; } = TimeSpan.FromSeconds(10); +} diff --git a/src/modules/scheduling/Elsa.Scheduling.Quartz/Services/QuartzJobRetryScheduler.cs b/src/modules/scheduling/Elsa.Scheduling.Quartz/Services/QuartzJobRetryScheduler.cs new file mode 100644 index 00000000..28dbaeea --- /dev/null +++ b/src/modules/scheduling/Elsa.Scheduling.Quartz/Services/QuartzJobRetryScheduler.cs @@ -0,0 +1,28 @@ +using Elsa.Common; +using Elsa.Scheduling.Quartz.Contracts; +using Elsa.Scheduling.Quartz.Options; +using Microsoft.Extensions.Options; +using Quartz; + +namespace Elsa.Scheduling.Quartz.Services; + +/// +/// Default implementation of . +/// +public class QuartzJobRetryScheduler(ISystemClock systemClock, IOptions options) : IQuartzJobRetryScheduler +{ + /// + public async Task ScheduleRetryAsync(IJobExecutionContext context, CancellationToken cancellationToken = default) + { + var delay = options.Value.TransientExceptionRetryDelay; + var now = systemClock.UtcNow; + + var trigger = TriggerBuilder.Create() + .ForJob(context.JobDetail.Key) + .StartAt(now.Add(delay)) + .Build(); + + await context.Scheduler.RescheduleJob(context.Trigger.Key, trigger, cancellationToken); + } +} + diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Abstractions/AppComponentTest.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Abstractions/AppComponentTest.cs new file mode 100644 index 00000000..3cf7c4b5 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Abstractions/AppComponentTest.cs @@ -0,0 +1,22 @@ +using Elsa.Scheduling.Quartz.ComponentTests.Fixtures; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Scheduling.Quartz.ComponentTests.Abstractions; + +[Collection(nameof(SchedulingAppCollection))] +public abstract class AppComponentTest(SchedulingApp app) : IDisposable +{ + protected WorkflowServer WorkflowServer { get; } = app.WorkflowServer; + protected IServiceScope Scope { get; private set; } = app.WorkflowServer.Services.CreateScope(); + + public void Dispose() + { + OnDispose(); + Scope?.Dispose(); + GC.SuppressFinalize(this); + } + + protected virtual void OnDispose() + { + } +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Elsa.Scheduling.Quartz.ComponentTests.csproj b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Elsa.Scheduling.Quartz.ComponentTests.csproj new file mode 100644 index 00000000..84e47791 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Elsa.Scheduling.Quartz.ComponentTests.csproj @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/SchedulingApp.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/SchedulingApp.cs new file mode 100644 index 00000000..4638d60d --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/SchedulingApp.cs @@ -0,0 +1,16 @@ +using JetBrains.Annotations; + +namespace Elsa.Scheduling.Quartz.ComponentTests.Fixtures; + +[UsedImplicitly] +public class SchedulingApp : IAsyncLifetime +{ + public WorkflowServer WorkflowServer { get; } = new("http://localhost:5010"); + + public Task InitializeAsync() => Task.CompletedTask; + + public async Task DisposeAsync() + { + await WorkflowServer.DisposeAsync(); + } +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/SchedulingAppCollection.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/SchedulingAppCollection.cs new file mode 100644 index 00000000..7979a244 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/SchedulingAppCollection.cs @@ -0,0 +1,4 @@ +namespace Elsa.Scheduling.Quartz.ComponentTests.Fixtures; + +[CollectionDefinition(nameof(SchedulingAppCollection))] +public class SchedulingAppCollection : ICollectionFixture; diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/WorkflowServer.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/WorkflowServer.cs new file mode 100644 index 00000000..cb93cd25 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Fixtures/WorkflowServer.cs @@ -0,0 +1,38 @@ +using Elsa.Extensions; +using Elsa.Scheduling.Quartz.Options; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.DependencyInjection; +using Quartz; + +namespace Elsa.Scheduling.Quartz.ComponentTests.Fixtures; + +[UsedImplicitly] +public class WorkflowServer(string url) : WebApplicationFactory +{ + public async Task GetSchedulerAsync() + { + var factory = Services.GetRequiredService(); + return await factory.GetScheduler(); + } + + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder.UseUrls(url); + + TestServer.Web.Program.ConfigureForTest ??= elsa => + { + elsa.UseQuartz(); + elsa.UseScheduling(scheduling => scheduling.UseQuartzScheduler()); + elsa.UseWorkflowRuntime(); + }; + + builder.ConfigureTestServices(services => + { + // Configure Quartz job options for fast retries in tests + services.Configure(options => options.TransientExceptionRetryDelay = TimeSpan.FromSeconds(1)); + }); + } +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Helpers/FailingWorkflowStarter.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Helpers/FailingWorkflowStarter.cs new file mode 100644 index 00000000..b03baabb --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/Helpers/FailingWorkflowStarter.cs @@ -0,0 +1,32 @@ +using Elsa.Workflows.Runtime; + +namespace Elsa.Scheduling.Quartz.ComponentTests.Helpers; + +/// +/// A workflow starter that can be configured to fail with transient or non-transient exceptions. +/// +public class FailingWorkflowStarter(IWorkflowStarter innerStarter) : IWorkflowStarter +{ + private int _callCount; + + public int FailuresBeforeSuccess { get; set; } + public Exception? ExceptionToThrow { get; set; } + public int CallCount => _callCount; + + public async Task StartWorkflowAsync(StartWorkflowRequest request, CancellationToken cancellationToken = default) + { + _callCount++; + + if (ExceptionToThrow != null && _callCount <= FailuresBeforeSuccess) + { + throw ExceptionToThrow; + } + + return await innerStarter.StartWorkflowAsync(request, cancellationToken); + } + + public void Reset() + { + _callCount = 0; + } +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/QuartzJobTransientRetryTests.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/QuartzJobTransientRetryTests.cs new file mode 100644 index 00000000..d34e64e4 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.ComponentTests/QuartzJobTransientRetryTests.cs @@ -0,0 +1,188 @@ +using Elsa.Resilience; +using Elsa.Scheduling.Quartz.ComponentTests.Abstractions; +using Elsa.Scheduling.Quartz.ComponentTests.Fixtures; +using Elsa.Scheduling.Quartz.ComponentTests.Helpers; +using Elsa.Scheduling.Quartz.Contracts; +using Elsa.Scheduling.Quartz.Jobs; +using Elsa.Workflows.Runtime; +using Microsoft.Extensions.DependencyInjection; +using Quartz; + +namespace Elsa.Scheduling.Quartz.ComponentTests; + +/// +/// Component tests for Quartz job transient retry behavior. +/// These tests validate that jobs properly retry on transient exceptions and give up on non-transient exceptions. +/// +public class QuartzJobTransientRetryTests(SchedulingApp app) : AppComponentTest(app) +{ + [Theory] + [InlineData(2, typeof(TimeoutException), "Simulated transient timeout")] + [InlineData(1, typeof(HttpRequestException), "Simulated network error")] + public async Task RunWorkflowJob_TransientException_RetriesAndEventuallySucceeds( + int failuresBeforeSuccess, + Type exceptionType, + string exceptionMessage) + { + // Arrange - Create job manually with test double for controlled testing + var (job, failingStarter, context) = await CreateTestJobSetupWithoutScheduling( + failuresBeforeSuccess, + (Exception)Activator.CreateInstance(exceptionType, exceptionMessage)!, + $"test-transient-{failuresBeforeSuccess}" + ); + + // Act - Execute the job multiple times to simulate retries + for (var i = 0; i < failuresBeforeSuccess; i++) + { + await job.Execute(context); + Assert.Equal(i + 1, failingStarter.CallCount); + } + + // Final attempt - should succeed + await job.Execute(context); + + // Assert + Assert.Equal(failuresBeforeSuccess + 1, failingStarter.CallCount); + } + + [Fact] + public async Task RunWorkflowJob_NonTransientException_DoesNotRetry() + { + // Arrange - Schedule job with Quartz so we can verify it gets deleted + var (job, failingStarter, context) = await CreateTestJobSetupWithScheduling( + 10, // Would retry many times if transient + new InvalidOperationException("Non-transient error"), + "test-nontransient" + ); + + var scheduler = await WorkflowServer.GetSchedulerAsync(); + + // Act + await job.Execute(context); + + // Assert - Job should be called once, then deleted (not retried) + Assert.Equal(1, failingStarter.CallCount); + + // Verify job was deleted from scheduler + var jobExists = await scheduler.CheckExists(context.JobDetail.Key); + Assert.False(jobExists); + } + + /// + /// Creates a test setup without scheduling the job with Quartz. + /// Use when testing job execution logic directly without needing scheduler interaction. + /// + private async Task<(RunWorkflowJob job, FailingWorkflowStarter failingStarter, IJobExecutionContext context)> + CreateTestJobSetupWithoutScheduling(int failuresBeforeSuccess, Exception exception, string jobIdentifier) + { + var scheduler = await WorkflowServer.GetSchedulerAsync(); + var workflowStarter = Scope.ServiceProvider.GetRequiredService(); + + var failingStarter = new FailingWorkflowStarter(workflowStarter) + { + FailuresBeforeSuccess = failuresBeforeSuccess, + ExceptionToThrow = exception + }; + + var job = CreateRunWorkflowJob(failingStarter); + var (jobDetail, trigger) = CreateJobDetailAndTrigger(jobIdentifier); + + // Don't schedule with Quartz - we're testing the Execute method directly + var context = CreateTestContext(scheduler, jobDetail, trigger); + + return (job, failingStarter, context); + } + + /// + /// Creates a test setup and schedules the job with Quartz. + /// Use when testing behavior that involves scheduler operations (e.g., job deletion). + /// + private async Task<(RunWorkflowJob job, FailingWorkflowStarter failingStarter, IJobExecutionContext context)> + CreateTestJobSetupWithScheduling(int failuresBeforeSuccess, Exception exception, string jobIdentifier) + { + var scheduler = await WorkflowServer.GetSchedulerAsync(); + var workflowStarter = Scope.ServiceProvider.GetRequiredService(); + + var failingStarter = new FailingWorkflowStarter(workflowStarter) + { + FailuresBeforeSuccess = failuresBeforeSuccess, + ExceptionToThrow = exception + }; + + var job = CreateRunWorkflowJob(failingStarter); + var (jobDetail, trigger) = CreateJobDetailAndTrigger(jobIdentifier); + + // Schedule the job with Quartz so the job can interact with the scheduler + // (e.g., delete itself on non-transient exceptions) + await scheduler.ScheduleJob(jobDetail, trigger); + var context = CreateTestContext(scheduler, jobDetail, trigger); + + return (job, failingStarter, context); + } + + private RunWorkflowJob CreateRunWorkflowJob(IWorkflowStarter workflowStarter) + { + return new RunWorkflowJob( + Scope.ServiceProvider.GetRequiredService(), + Scope.ServiceProvider.GetRequiredService(), + workflowStarter, + Scope.ServiceProvider.GetRequiredService(), + Scope.ServiceProvider.GetRequiredService(), + Scope.ServiceProvider.GetRequiredService>() + ); + } + + private static (IJobDetail jobDetail, ITrigger trigger) CreateJobDetailAndTrigger(string identifier) + { + var jobDataMap = new JobDataMap + { + { "DefinitionVersionId", "test-workflow-def" } + }; + + var jobDetail = JobBuilder.Create() + .WithIdentity($"{identifier}-job", "test-group") + .UsingJobData(jobDataMap) + .StoreDurably() + .Build(); + + var trigger = TriggerBuilder.Create() + .WithIdentity($"{identifier}-trigger", "test-group") + .ForJob(jobDetail) + .StartNow() + .Build(); + + return (jobDetail, trigger); + } + + private static IJobExecutionContext CreateTestContext(global::Quartz.IScheduler scheduler, IJobDetail jobDetail, ITrigger trigger) + { + return new TestJobExecutionContext(scheduler, jobDetail, trigger); + } +} + +/// +/// Test implementation of IJobExecutionContext for component testing. +/// +internal class TestJobExecutionContext(global::Quartz.IScheduler scheduler, IJobDetail jobDetail, ITrigger trigger) : IJobExecutionContext +{ + public global::Quartz.IScheduler Scheduler => scheduler; + public ITrigger Trigger => trigger; + public IJobDetail JobDetail => jobDetail; + public IJob JobInstance => null!; + public bool Recovering => false; + public TriggerKey RecoveringTriggerKey => trigger.Key; + public int RefireCount => 0; + public JobDataMap MergedJobDataMap => jobDetail.JobDataMap; + public ICalendar? Calendar => null; + public DateTimeOffset FireTimeUtc => DateTimeOffset.UtcNow; + public DateTimeOffset? ScheduledFireTimeUtc => DateTimeOffset.UtcNow; + public DateTimeOffset? PreviousFireTimeUtc => null; + public DateTimeOffset? NextFireTimeUtc => DateTimeOffset.UtcNow.AddSeconds(10); + public TimeSpan JobRunTime => TimeSpan.Zero; + public object? Result { get; set; } + public CancellationToken CancellationToken => CancellationToken.None; + public string FireInstanceId => Guid.NewGuid().ToString(); + + public void Put(object key, object objectValue) { } + public object? Get(object key) => null; +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Elsa.Scheduling.Quartz.UnitTests.csproj b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Elsa.Scheduling.Quartz.UnitTests.csproj new file mode 100644 index 00000000..c9bdbb85 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Elsa.Scheduling.Quartz.UnitTests.csproj @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Helpers/QuartzJobTestHelper.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Helpers/QuartzJobTestHelper.cs new file mode 100644 index 00000000..346d42be --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Helpers/QuartzJobTestHelper.cs @@ -0,0 +1,146 @@ +using Elsa.Common.Multitenancy; +using Elsa.Resilience; +using Elsa.Scheduling.Quartz.Contracts; +using Elsa.Scheduling.Quartz.Options; +using Elsa.Workflows.Runtime; +using Elsa.Workflows.Runtime.Messages; +using Microsoft.Extensions.Options; +using Moq; +using Quartz; +using QuartzScheduler = Quartz.IScheduler; + +namespace Elsa.Scheduling.Quartz.UnitTests.Helpers; + +/// +/// Provides common helper methods for testing Quartz jobs. +/// +public static class QuartzJobTestHelper +{ + /// + /// Creates a mock job execution context with the specified job data. + /// + public static (IJobExecutionContext Context, Mock Scheduler) CreateJobExecutionContext( + IDictionary jobData) + { + var jobDataMap = new JobDataMap(jobData); + var jobKey = new JobKey("test-job"); + var triggerKey = new TriggerKey("test-trigger"); + + var jobDetail = new Mock(); + jobDetail.Setup(j => j.Key).Returns(jobKey); + jobDetail.Setup(j => j.JobDataMap).Returns(jobDataMap); + + var trigger = new Mock(); + trigger.Setup(t => t.Key).Returns(triggerKey); + trigger.Setup(t => t.JobKey).Returns(jobKey); + + var scheduler = new Mock(); + scheduler.Setup(s => s.RescheduleJob(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(DateTimeOffset.Now); + scheduler.Setup(s => s.DeleteJob(It.IsAny(), It.IsAny())) + .ReturnsAsync(true); + + var context = new Mock(); + context.Setup(c => c.MergedJobDataMap).Returns(jobDataMap); + context.Setup(c => c.JobDetail).Returns(jobDetail.Object); + context.Setup(c => c.Trigger).Returns(trigger.Object); + context.Setup(c => c.Scheduler).Returns(scheduler.Object); + context.Setup(c => c.CancellationToken).Returns(CancellationToken.None); + + return (context.Object, scheduler); + } + + /// + /// Creates a mock for QuartzJobOptions with the specified retry delay. + /// + public static Mock> CreateQuartzJobOptions(TimeSpan? retryDelay = null) + { + var options = new Mock>(); + options.Setup(o => o.Value).Returns(new QuartzJobOptions { TransientExceptionRetryDelay = retryDelay ?? TimeSpan.FromSeconds(1) }); + return options; + } + + /// + /// Creates a mock tenant accessor that allows context pushing. + /// + public static Mock CreateTenantAccessor() + { + var tenantAccessor = new Mock(); + tenantAccessor.Setup(t => t.PushContext(It.IsAny())).Returns((IDisposable)null!); + return tenantAccessor; + } + + extension(Mock workflowStarter) + { + /// + /// Sets up a workflow starter to return the specified response. + /// + public void SetupStartWorkflow(StartWorkflowResponse response) => + workflowStarter.Setup(w => w.StartWorkflowAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(response); + + /// + /// Sets up a workflow starter to throw the specified exception. + /// + public void SetupStartWorkflowThrows(Exception exception) => + workflowStarter.Setup(w => w.StartWorkflowAsync(It.IsAny(), It.IsAny())) + .ThrowsAsync(exception); + } + + /// + /// Sets up a transient exception detector to return the specified value for any exception. + /// + public static void SetupIsTransient(this Mock detector, bool isTransient) => + detector.Setup(d => d.IsTransient(It.IsAny())).Returns(isTransient); + + extension(Mock workflowRuntime) + { + /// + /// Sets up a workflow runtime to return the specified workflow client. + /// + public void SetupCreateClient(Mock workflowClient) => + workflowRuntime.Setup(r => r.CreateClientAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(workflowClient.Object); + + /// + /// Sets up a workflow runtime to throw the specified exception. + /// + public void SetupCreateClientThrows(Exception exception) => + workflowRuntime.Setup(r => r.CreateClientAsync(It.IsAny(), It.IsAny())) + .ThrowsAsync(exception); + } + + /// + /// Sets up a workflow client to return the specified response. + /// + public static void SetupRunInstance(this Mock workflowClient, RunWorkflowInstanceResponse? response = null) => + workflowClient.Setup(c => c.RunInstanceAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(response ?? new RunWorkflowInstanceResponse()); + + extension(Mock scheduler) + { + /// + /// Verifies that the scheduler rescheduled a job exactly once. + /// + public void VerifyRescheduled() => + scheduler.Verify(s => s.RescheduleJob(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); + + /// + /// Verifies that the scheduler deleted a job exactly once. + /// + public void VerifyDeleted() => + scheduler.Verify(s => s.DeleteJob(It.IsAny(), It.IsAny()), Times.Once); + } + + /// + /// Verifies that the workflow starter was called exactly once. + /// + public static void VerifyStartWorkflowCalled(this Mock workflowStarter) => + workflowStarter.Verify(w => w.StartWorkflowAsync(It.IsAny(), It.IsAny()), Times.Once); + + /// + /// Verifies that the workflow client was called exactly once. + /// + public static void VerifyRunInstanceCalled(this Mock workflowClient) => + workflowClient.Verify(c => c.RunInstanceAsync(It.IsAny(), It.IsAny()), Times.Once); +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Jobs/ResumeWorkflowJobTests.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Jobs/ResumeWorkflowJobTests.cs new file mode 100644 index 00000000..d28d93d1 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Jobs/ResumeWorkflowJobTests.cs @@ -0,0 +1,137 @@ +using Elsa.Common; +using Elsa.Common.Multitenancy; +using Elsa.Resilience; +using Elsa.Scheduling.Quartz.Contracts; +using Elsa.Scheduling.Quartz.Jobs; +using Elsa.Scheduling.Quartz.UnitTests.Helpers; +using Elsa.Workflows.Models; +using Elsa.Workflows.Runtime; +using Elsa.Workflows.Runtime.Messages; +using Microsoft.Extensions.Logging; +using Moq; +using Quartz; +using QuartzScheduler = Quartz.IScheduler; + +namespace Elsa.Scheduling.Quartz.UnitTests.Jobs; + +public class ResumeWorkflowJobTests +{ + private readonly Mock _workflowRuntime = new(); + private readonly Mock _jsonSerializer = new(); + private readonly Mock _tenantFinder = new(); + private readonly Mock _tenantAccessor = QuartzJobTestHelper.CreateTenantAccessor(); + private readonly Mock _transientDetector = new(); + private readonly Mock _retryScheduler = new(); + private readonly Mock> _logger = new(); + private readonly ResumeWorkflowJob _job; + + public ResumeWorkflowJobTests() + { + _job = new( + _workflowRuntime.Object, + _jsonSerializer.Object, + _tenantFinder.Object, + _tenantAccessor.Object, + _transientDetector.Object, + _retryScheduler.Object, + _logger.Object); + } + + [Fact] + public async Task Execute_SuccessfulResume_CallsWorkflowClient() + { + var (context, _) = CreateJobExecutionContext(); + var workflowClient = new Mock(); + workflowClient.SetupRunInstance(); + _workflowRuntime.SetupCreateClient(workflowClient); + + await _job.Execute(context); + + workflowClient.VerifyRunInstanceCalled(); + } + + [Theory] + [InlineData(typeof(HttpRequestException), true)] + [InlineData(typeof(TimeoutException), true)] + public async Task Execute_TransientException_ReschedulesJob(Type exceptionType, bool isTransient) + { + var (context, _) = CreateJobExecutionContext(); + _transientDetector.SetupIsTransient(isTransient); + _workflowRuntime.SetupCreateClientThrows((Exception)Activator.CreateInstance(exceptionType)!); + + await _job.Execute(context); + + _retryScheduler.Verify(x => x.ScheduleRetryAsync(context, It.IsAny()), Times.Once); + } + + [Theory] + [InlineData(typeof(InvalidOperationException))] + [InlineData(typeof(ArgumentException))] + public async Task Execute_NonTransientException_DeletesJob(Type exceptionType) + { + var (context, scheduler) = CreateJobExecutionContext(); + _transientDetector.SetupIsTransient(false); + _workflowRuntime.SetupCreateClientThrows((Exception)Activator.CreateInstance(exceptionType)!); + + await _job.Execute(context); + + scheduler.VerifyDeleted(); + } + + [Fact] + public async Task Execute_UsesCorrectWorkflowInstanceId() + { + var (context, _) = CreateJobExecutionContext(); + var workflowClient = new Mock(); + workflowClient.Setup(c => c.RunInstanceAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new RunWorkflowInstanceResponse()); + + string? capturedInstanceId = null; + _workflowRuntime.Setup(r => r.CreateClientAsync(It.IsAny(), It.IsAny())) + .Callback((id, _) => capturedInstanceId = id) + .ReturnsAsync(workflowClient.Object); + + await _job.Execute(context); + + Assert.Equal("workflow-instance-123", capturedInstanceId); + } + + [Fact] + public async Task Execute_WithActivityHandle_DeserializesCorrectly() + { + var activityHandle = new ActivityHandle { ActivityId = "activity-123" }; + var serializedHandle = "{\"ActivityId\":\"activity-123\"}"; + var (context, _) = CreateJobExecutionContext(serializedHandle); + + _jsonSerializer.Setup(j => j.Deserialize(serializedHandle)) + .Returns(activityHandle); + + var workflowClient = new Mock(); + RunWorkflowInstanceRequest? capturedRequest = null; + workflowClient.Setup(c => c.RunInstanceAsync(It.IsAny(), It.IsAny())) + .Callback((req, _) => capturedRequest = req) + .ReturnsAsync(new RunWorkflowInstanceResponse()); + + _workflowRuntime.Setup(r => r.CreateClientAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(workflowClient.Object); + + await _job.Execute(context); + + Assert.NotNull(capturedRequest); + Assert.Equal("activity-123", capturedRequest.ActivityHandle?.ActivityId); + } + + private static (IJobExecutionContext, Mock) CreateJobExecutionContext(string? activityHandle = null) + { + var jobData = new Dictionary + { + { "WorkflowInstanceId", "workflow-instance-123" }, + { "BookmarkId", "bookmark-123" } + }; + + if (activityHandle != null) + jobData.Add("ActivityHandle", activityHandle); + + return QuartzJobTestHelper.CreateJobExecutionContext(jobData); + } +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Jobs/RunWorkflowJobTests.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Jobs/RunWorkflowJobTests.cs new file mode 100644 index 00000000..6ab6a553 --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Jobs/RunWorkflowJobTests.cs @@ -0,0 +1,121 @@ +using Elsa.Common.Multitenancy; +using Elsa.Resilience; +using Elsa.Scheduling.Quartz.Contracts; +using Elsa.Scheduling.Quartz.Jobs; +using Elsa.Scheduling.Quartz.UnitTests.Helpers; +using Elsa.Workflows.Models; +using Elsa.Workflows.Runtime; +using Elsa.Workflows.Runtime.Exceptions; +using Microsoft.Extensions.Logging; +using Moq; +using Quartz; +using QuartzScheduler = Quartz.IScheduler; + +namespace Elsa.Scheduling.Quartz.UnitTests.Jobs; + +public class RunWorkflowJobTests +{ + private readonly Mock _tenantAccessor = QuartzJobTestHelper.CreateTenantAccessor(); + private readonly Mock _tenantFinder = new(); + private readonly Mock _workflowStarter = new(); + private readonly Mock _transientDetector = new(); + private readonly Mock _retryScheduler = new(); + private readonly Mock> _logger = new(); + private readonly RunWorkflowJob _job; + + public RunWorkflowJobTests() + { + _job = new( + _tenantAccessor.Object, + _tenantFinder.Object, + _workflowStarter.Object, + _transientDetector.Object, + _retryScheduler.Object, + _logger.Object); + } + + [Fact] + public async Task Execute_SuccessfulStart_CallsWorkflowStarter() + { + var (context, _) = CreateJobExecutionContext(); + _workflowStarter.SetupStartWorkflow(new() { WorkflowInstanceId = "workflow-123" }); + + await _job.Execute(context); + + _workflowStarter.VerifyStartWorkflowCalled(); + } + + [Fact] + public async Task Execute_CannotStart_LogsWarningAndReturns() + { + var (context, _) = CreateJobExecutionContext(); + _workflowStarter.SetupStartWorkflow(new() { CannotStart = true }); + + await _job.Execute(context); + + _workflowStarter.VerifyStartWorkflowCalled(); + } + + [Fact] + public async Task Execute_WorkflowGraphNotFound_DeletesJob() + { + var (context, scheduler) = CreateJobExecutionContext(); + var handle = WorkflowDefinitionHandle.ByDefinitionVersionId("workflow-def-123"); + _workflowStarter.SetupStartWorkflowThrows(new WorkflowGraphNotFoundException("Not found", handle)); + + await _job.Execute(context); + + scheduler.VerifyDeleted(); + } + + [Theory] + [InlineData(typeof(TimeoutException), true)] + [InlineData(typeof(HttpRequestException), true)] + public async Task Execute_TransientException_ReschedulesJob(Type exceptionType, bool isTransient) + { + var (context, _) = CreateJobExecutionContext(); + _transientDetector.SetupIsTransient(isTransient); + _workflowStarter.SetupStartWorkflowThrows((Exception)Activator.CreateInstance(exceptionType)!); + + await _job.Execute(context); + + _retryScheduler.Verify(x => x.ScheduleRetryAsync(context, It.IsAny()), Times.Once); + } + + [Theory] + [InlineData(typeof(InvalidOperationException))] + [InlineData(typeof(ArgumentException))] + public async Task Execute_NonTransientException_DeletesJob(Type exceptionType) + { + var (context, scheduler) = CreateJobExecutionContext(); + _transientDetector.SetupIsTransient(false); + _workflowStarter.SetupStartWorkflowThrows((Exception)Activator.CreateInstance(exceptionType)!); + + await _job.Execute(context); + + scheduler.VerifyDeleted(); + } + + [Fact] + public async Task Execute_UsesCorrectWorkflowDefinitionHandle() + { + var (context, _) = CreateJobExecutionContext(); + StartWorkflowRequest? capturedRequest = null; + _workflowStarter.Setup(w => w.StartWorkflowAsync(It.IsAny(), It.IsAny())) + .Callback((req, _) => capturedRequest = req) + .ReturnsAsync(new StartWorkflowResponse { WorkflowInstanceId = "workflow-123" }); + + await _job.Execute(context); + + Assert.NotNull(capturedRequest); + Assert.Equal("workflow-def-123", capturedRequest.WorkflowDefinitionHandle.DefinitionVersionId); + } + + private static (IJobExecutionContext, Mock) CreateJobExecutionContext() => + QuartzJobTestHelper.CreateJobExecutionContext(new Dictionary + { + { "DefinitionVersionId", "workflow-def-123" }, + { "CorrelationId", "corr-123" }, + { "TriggerActivityId", "trigger-123" } + }); +} diff --git a/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Services/QuartzJobRetrySchedulerTests.cs b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Services/QuartzJobRetrySchedulerTests.cs new file mode 100644 index 00000000..7ab6319f --- /dev/null +++ b/test/modules/scheduling/Elsa.Scheduling.Quartz.UnitTests/Services/QuartzJobRetrySchedulerTests.cs @@ -0,0 +1,34 @@ +using Elsa.Common; +using Elsa.Scheduling.Quartz.Services; +using Elsa.Scheduling.Quartz.UnitTests.Helpers; +using Moq; +using Quartz; + +namespace Elsa.Scheduling.Quartz.UnitTests.Services; + +public class QuartzJobRetrySchedulerTests +{ + [Fact] + public async Task ScheduleRetryAsync_UsesSystemClockUtcNowPlusDelay() + { + var now = new DateTimeOffset(2025, 01, 02, 03, 04, 05, TimeSpan.Zero); + var delay = TimeSpan.FromSeconds(10); + var clock = new Mock(); + clock.SetupGet(x => x.UtcNow).Returns(now); + + ITrigger? capturedTrigger = null; + var (context, scheduler) = QuartzJobTestHelper.CreateJobExecutionContext(new Dictionary()); + scheduler + .Setup(s => s.RescheduleJob(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((_, t, _) => capturedTrigger = t) + .ReturnsAsync(now); + + var options = QuartzJobTestHelper.CreateQuartzJobOptions(delay); + var sut = new QuartzJobRetryScheduler(clock.Object, options.Object); + + await sut.ScheduleRetryAsync(context); + + Assert.NotNull(capturedTrigger); + Assert.Equal(now.Add(delay), capturedTrigger!.StartTimeUtc); + } +}