diff --git a/README.md b/README.md index f472f93e..135bbb6e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ SQL Build Manager is a multi-faceted tool to allow you to manage the life-cycle - [Leverage Azure Batch for massively parallel updates](/docs/azure_batch.md) - [Change notes](docs/change_notes.md) - For contributors: [Notes on Building and Unit Testing](/docs/setup_azure_environment.md) +- For users of the Windows Form app: [SQL Build Manager Manual](docs/SqlBuildManagerManual.md)\ + (Note: this isn't 100% up to date, so the screen shots may vary from the current app) ---- diff --git a/docs/SqlBuildManagerManual.md b/docs/SqlBuildManagerManual.md index 1879378c..b1e33f21 100644 --- a/docs/SqlBuildManagerManual.md +++ b/docs/SqlBuildManagerManual.md @@ -3,7 +3,7 @@ Michael McKechney ([michael@mckechney.com](mailto:michael@mckechney.com)) \ [www.SqlBuildManager.com](https://mmckechney.github.io/SqlBuildManager/) \ - Copyright 2004-2020 + Copyright 2004-2021 ------ @@ -637,28 +637,27 @@ Basic Command Line Execution ## Command Line Arguments  Sql Build Manager can be run directly via command line or through the -SqlBuildManager.Console.exe helper application. The advantage of using +`sbm` application. The advantage of using the "console" application is that you will be able to record exit code values as well as stream the standard output and error text into any automation or scheduling software that you may be using. +The command line also has the ability to run on Linux and/or run massively parallel updates leveraging Azure Batch + ### For command line details go [here](commandline.md) +## Command Line Examples -## Command Line Examples  +**Run standard unattended Sql build** -**Run standard unattended Sql build****\ -**Runs the specified .sbm build file on the designated server using the +Runs the specified .sbm build file on the designated server using the parameters and target databases defined in the project. The command line execution uses Windows authentication of the executing process to connect to the server and database(s). As with in interactive execution, the results are saved in the .sbm file for review. -- SqlBuildManager.Console.exe /Action=Build /PackageName=".sbm file name" - /server=myserver  - -``` -SqlBuildManager.Console.exe /Action=Build /PackageName="ProjectUpdate.sbm" /server=ProdServer  +``` bash +sbm build --packagename "ProjectUpdate.sbm" --server ProdServer  ``` **Run an unattended Sql build with manual database override @@ -670,11 +669,8 @@ The command line execution uses Windows authentication of the executing process to connect to the server and database(s). As with in interactive execution, the results are saved in the .sbm file for review. -- SqlBuildManager.Console.exe /Action=Build /PackageName=".sbm file name" /server=server - /override=default,override - -``` -SqlBuildManager.Console.exe /Action=Build /PackageName="ProjectUpdate.sbm" /server=ProdServer /override=Main,Copy1 +``` bash +sbm build --packagename "ProjectUpdate.sbm" --server ProdServer  --override "Main,Copy1" ``` Note that multiple overrides may be set if the build file contains more @@ -688,13 +684,10 @@ authentication of the executing process to connect to the server and database(s). As with in interactive execution, the results are saved in the .sbm file for review. -``` - SqlBuildManager.Console.exe /Action=Build /PackageName="ProjectUpdate.sbm" /override="prod release.multiDb" +``` bash + sbm build --packagename "ProjectUpdate.sbm" --override "prod release.multiDb" ``` -See [Advanced Command Line Execution](#Advanced-Command-Line-Execution) for -return codes. - Targeting Multiple Servers and Databases ======================================== @@ -815,9 +808,6 @@ configuration file. You will then be prompted to save the query as a generated configuration setting will be loaded in the Multiple Database Run Configuration window. -  -- - Threaded Multi-Server Database Execution ---------------------------------------- @@ -859,24 +849,6 @@ For each database you want to execute against, add an additional line in the configuration file (i.e. each line equates to an additional thread). Finally, save the file with a .cfg extension -See [Advanced Command Line Execution](#AdvancedCommandLineExecution) for -the command line syntax to execute your threaded builds. - -Remote Service Execution and Deployment -======================================= - -While the tool has the feature for [Targeting Multiple Servers and -Databases](#TargetingMultipleServersandDatabases), you can take that -multi-target, multi-threaded execution one step further and distribute -that load across multiple -->Execution Servers--> as well. It builds on the -multiple server functionality and extends it to send build requests via -a remote service call to remote computers that will handle the actual -processing of the SQL scripts. You can spit the load amongst all of your -execution servers for maximum efficiency and minimum deployment time. - -Overview --------- - Advanced Script Handling ======================== diff --git a/docs/change_notes.md b/docs/change_notes.md index 6d1fc988..fd53813e 100644 --- a/docs/change_notes.md +++ b/docs/change_notes.md @@ -2,6 +2,14 @@ # SQL Build Manager Change Notes +### Version 13.0.2 + +- *FIXED:* Update to ensure all Queue messages are retrieved efficiently +- *ADDED:* New utility method `sbm batch dequeue` to remove all messages from the Service Bus Queue topic (without processing them) +- *UPDATED:* Code clean up and refactoring to accommodate latest version of System.CommandLine +- *FIXED:* Issue with SQL text syntax higlighting formatting in .NET 5.0 +- **NOTE:** Removed "Construct Command Line" menu options from Windows UI. Users should leverage the generated help docs for sbm.exe + ### Version 13.0.1 - *FIXED:* Updated distribution algorithm for `--concurrencytype` of `Server` and `MaxPerServer` when number of Batch nodes is very close to the number of SQL Server targets. Was yielding less than the number of nodes. diff --git a/docs/templates/azuredeploy.bicep b/docs/templates/azuredeploy.bicep new file mode 100644 index 00000000..3d3fde5b --- /dev/null +++ b/docs/templates/azuredeploy.bicep @@ -0,0 +1,202 @@ +@description('Prefix to prepend to account names') +param namePrefix string +@allowed([ + 'Basic' + 'Standard' +]) +@description('The messaging tier for service Bus namespace') +param eventhubSku string = 'Standard' + +@allowed([ + 1 + 2 + 4 +]) +@description('MessagingUnits for premium namespace') +param skuCapacity int = 1 + +@description('Location for all resources.') +param location string = resourceGroup().location + +var batchAccountName_var = '${namePrefix}batchacct' +var storageAccountName_var = '${namePrefix}storage' +var namespaceName_var = '${namePrefix}eventhubnamespace' +var eventHubName = '${namePrefix}eventhub' +var serviceBusName_var = '${namePrefix}servicebus' + + +resource storageAccountName 'Microsoft.Storage/storageAccounts@2018-07-01' = { + name: storageAccountName_var + location: location + sku: { + name: 'Standard_LRS' + } + kind: 'StorageV2' + properties: { + networkAcls: { + bypass: 'AzureServices' + virtualNetworkRules: [] + ipRules: [] + defaultAction: 'Allow' + } + supportsHttpsTrafficOnly: false + encryption: { + services: { + file: { + enabled: true + } + blob: { + enabled: true + } + } + keySource: 'Microsoft.Storage' + } + accessTier: 'Hot' + } +} + +resource batchAccountName 'Microsoft.Batch/batchAccounts@2017-09-01' = { + name: batchAccountName_var + location: location + properties: { + autoStorage: { + storageAccountId: storageAccountName.id + } + poolAllocationMode: 'BatchService' + } + dependsOn:[ + storageAccountName + ] +} + +resource eventHubNamespace 'Microsoft.EventHub/namespaces@2017-04-01' = { + name: namespaceName_var + location: location + sku: { + name: eventhubSku + tier: eventhubSku + capacity: skuCapacity + } +} + +resource eventHubNamespace_eventHubName 'Microsoft.EventHub/namespaces/eventhubs@2017-04-01' = { + name: '${eventHubNamespace.name}/${eventHubName}' + properties: { + messageRetentionInDays: 1 + partitionCount: 5 + status: 'Active' + } + dependsOn: [ + eventHubNamespace + ] +} + +resource namespaceName_eventHubName_batchbuilder 'Microsoft.EventHub/namespaces/eventhubs/authorizationRules@2017-04-01' = { + name: '${eventHubNamespace_eventHubName.name}/batchbuilder' + + properties: { + rights: [ + 'Listen' + 'Send' + ] + } + dependsOn: [ + eventHubNamespace + ] +} + +resource serviceBusName 'Microsoft.ServiceBus/namespaces@2018-01-01-preview' = { + name: serviceBusName_var + location: location + sku: { + name: 'Standard' + tier: 'Standard' + capacity: 1 + } + properties: { + zoneRedundant: false + } +} + +resource serviceBusName_RootManageSharedAccessKey 'Microsoft.ServiceBus/namespaces/AuthorizationRules@2017-04-01' = { + name: '${serviceBusName.name}/RootManageSharedAccessKey' + properties: { + rights: [ + 'Listen' + 'Manage' + 'Send' + ] + } + dependsOn: [ + serviceBusName + ] +} + +resource serviceBusName_sqlbuildmanager 'Microsoft.ServiceBus/namespaces/topics@2018-01-01-preview' = { + name: '${serviceBusName.name}/sqlbuildmanager' + properties: { + defaultMessageTimeToLive: 'P14D' + maxSizeInMegabytes: 4096 + requiresDuplicateDetection: false + duplicateDetectionHistoryTimeWindow: 'PT10M' + enableBatchedOperations: true + status: 'Active' + supportOrdering: true + autoDeleteOnIdle: 'P10675199DT2H48M5.4775807S' + enablePartitioning: true + enableExpress: false + } + dependsOn: [ + serviceBusName + ] +} + +resource serviceBusName_sqlbuildmanager_sbmtopicpolicy 'Microsoft.ServiceBus/namespaces/topics/authorizationRules@2018-01-01-preview' = { + name: '${serviceBusName_sqlbuildmanager.name}/sbmtopicpolicy' + properties: { + rights: [ + 'Manage' + 'Listen' + 'Send' + ] + } + dependsOn: [ + serviceBusName + ] +} + +resource serviceBusName_sqlbuildmanager_sbmsubscription 'Microsoft.ServiceBus/namespaces/topics/subscriptions@2018-01-01-preview' = { + name: '${serviceBusName_sqlbuildmanager.name}/sbmsubscription' + properties: { + lockDuration: 'PT30S' + requiresSession: false + defaultMessageTimeToLive: 'P14D' + deadLetteringOnMessageExpiration: true + deadLetteringOnFilterEvaluationExceptions: true + maxDeliveryCount: 10 + status: 'Active' + enableBatchedOperations: true + autoDeleteOnIdle: 'P14D' + } + dependsOn: [ + serviceBusName + ] +} + +resource serviceBusName_sqlbuildmanager_sbmsubscriptionsession 'Microsoft.ServiceBus/namespaces/topics/subscriptions@2018-01-01-preview' = { + name: '${serviceBusName_sqlbuildmanager.name}/sbmsubscriptionsession' + properties: { + lockDuration: 'PT30S' + requiresSession: true + defaultMessageTimeToLive: 'P14D' + deadLetteringOnMessageExpiration: true + deadLetteringOnFilterEvaluationExceptions: true + maxDeliveryCount: 10 + status: 'Active' + enableBatchedOperations: true + autoDeleteOnIdle: 'P14D' + } + dependsOn: [ + serviceBusName + ] +} diff --git a/src/AssemblyVersioning.cs b/src/AssemblyVersioning.cs index fe57fe4d..8e5ec9d7 100644 --- a/src/AssemblyVersioning.cs +++ b/src/AssemblyVersioning.cs @@ -25,7 +25,7 @@ // These can be found in SqlBuildManager.Setup -> Organize Your Setup -> General Information // ** Also, don't forget to update the change_notes.xml and .html files! -[assembly: AssemblyVersion("13.0.1")] -[assembly: AssemblyFileVersion("13.0.1")] +[assembly: AssemblyVersion("13.0.2")] +[assembly: AssemblyFileVersion("13.0.2")] diff --git a/src/SQLSync.sln b/src/SQLSync.sln index 6d83b13c..20881890 100644 --- a/src/SQLSync.sln +++ b/src/SQLSync.sln @@ -79,1610 +79,480 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlBuildManager.Console.Ext EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - CD_ROM|.NET = CD_ROM|.NET - CD_ROM|Any CPU = CD_ROM|Any CPU - CD_ROM|Mixed Platforms = CD_ROM|Mixed Platforms - CD_ROM|x64 = CD_ROM|x64 - CD_ROM|x86 = CD_ROM|x86 Debug|.NET = Debug|.NET Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - DevOpsBuild|.NET = DevOpsBuild|.NET - DevOpsBuild|Any CPU = DevOpsBuild|Any CPU - DevOpsBuild|Mixed Platforms = DevOpsBuild|Mixed Platforms - DevOpsBuild|x64 = DevOpsBuild|x64 - DevOpsBuild|x86 = DevOpsBuild|x86 - DVD-5|.NET = DVD-5|.NET - DVD-5|Any CPU = DVD-5|Any CPU - DVD-5|Mixed Platforms = DVD-5|Mixed Platforms - DVD-5|x64 = DVD-5|x64 - DVD-5|x86 = DVD-5|x86 Release|.NET = Release|.NET Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms Release|x64 = Release|x64 Release|x86 = Release|x86 - SingleImage|.NET = SingleImage|.NET - SingleImage|Any CPU = SingleImage|Any CPU - SingleImage|Mixed Platforms = SingleImage|Mixed Platforms - SingleImage|x64 = SingleImage|x64 - SingleImage|x86 = SingleImage|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|x64.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.CD_ROM|x86.ActiveCfg = Release|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|.NET.ActiveCfg = Debug|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|.NET.Build.0 = Debug|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|x64.ActiveCfg = Debug|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|x64.Build.0 = Debug|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|x86.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|x64.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Debug|x86.Build.0 = Debug|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|.NET.ActiveCfg = Release|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|.NET.Build.0 = Release|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|Any CPU.ActiveCfg = Release|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|Any CPU.Build.0 = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|x64.ActiveCfg = Release|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|x64.Build.0 = Release|Any CPU {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|x86.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|x64.Build.0 = Debug|Any CPU - {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.SingleImage|x86.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|x64.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {F54DD837-AD98-4A45-A709-1AA9E38E1A24}.Release|x86.Build.0 = Release|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|.NET.ActiveCfg = Debug|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|.NET.Build.0 = Debug|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|x64.ActiveCfg = Debug|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|x64.Build.0 = Debug|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|x86.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|x64.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Debug|x86.Build.0 = Debug|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|.NET.ActiveCfg = Release|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|.NET.Build.0 = Release|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|Any CPU.ActiveCfg = Release|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|Any CPU.Build.0 = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|x64.ActiveCfg = Release|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|x64.Build.0 = Release|Any CPU {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|x86.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|x64.Build.0 = Debug|Any CPU - {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.SingleImage|x86.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|x64.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {9B495B5F-1578-482B-8CF7-615B04D3AE2A}.Release|x86.Build.0 = Release|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|.NET.ActiveCfg = Debug|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|.NET.Build.0 = Debug|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|x64.ActiveCfg = Debug|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|x64.Build.0 = Debug|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|x86.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|x64.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Debug|x86.Build.0 = Debug|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|.NET.ActiveCfg = Release|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|.NET.Build.0 = Release|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|Any CPU.ActiveCfg = Release|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|Any CPU.Build.0 = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|x64.ActiveCfg = Release|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|x64.Build.0 = Release|Any CPU {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|x86.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|x64.Build.0 = Debug|Any CPU - {7902D9B0-FC03-42C7-9615-A2072D546EBD}.SingleImage|x86.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|x64.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {7902D9B0-FC03-42C7-9615-A2072D546EBD}.Release|x86.Build.0 = Release|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|.NET.ActiveCfg = Debug|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|.NET.Build.0 = Debug|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|x64.ActiveCfg = Debug|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|x64.Build.0 = Debug|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|x86.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|x64.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Debug|x86.Build.0 = Debug|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|.NET.ActiveCfg = Release|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|.NET.Build.0 = Release|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|Any CPU.Build.0 = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|x64.ActiveCfg = Release|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|x64.Build.0 = Release|Any CPU {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|x86.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|x64.Build.0 = Debug|Any CPU - {F3F1EFFF-265E-4995-958B-9763F947E5C8}.SingleImage|x86.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|x64.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {F3F1EFFF-265E-4995-958B-9763F947E5C8}.Release|x86.Build.0 = Release|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|.NET.ActiveCfg = Debug|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|.NET.Build.0 = Debug|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|x64.ActiveCfg = Debug|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|x64.Build.0 = Debug|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|x86.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|x64.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Debug|x86.Build.0 = Debug|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|.NET.ActiveCfg = Release|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|.NET.Build.0 = Release|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|Any CPU.ActiveCfg = Release|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|Any CPU.Build.0 = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|Mixed Platforms.Build.0 = Release|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|x64.ActiveCfg = Release|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|x64.Build.0 = Release|Any CPU {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|x86.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|x64.Build.0 = Debug|Any CPU - {93EC5C55-84BB-4FA4-8599-A6C85841E982}.SingleImage|x86.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|x64.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {93EC5C55-84BB-4FA4-8599-A6C85841E982}.Release|x86.Build.0 = Release|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|.NET.ActiveCfg = Debug|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|.NET.Build.0 = Debug|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|x64.ActiveCfg = Debug|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|x64.Build.0 = Debug|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|x86.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|x64.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Debug|x86.Build.0 = Debug|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|.NET.ActiveCfg = Release|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|.NET.Build.0 = Release|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|Any CPU.ActiveCfg = Release|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|Any CPU.Build.0 = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|Mixed Platforms.Build.0 = Release|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|x64.ActiveCfg = Release|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|x64.Build.0 = Release|Any CPU {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|x86.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|x64.Build.0 = Debug|Any CPU - {CD09B7DB-851B-4321-9E21-16948DA7FA07}.SingleImage|x86.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|x64.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {CD09B7DB-851B-4321-9E21-16948DA7FA07}.Release|x86.Build.0 = Release|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|.NET.ActiveCfg = Debug|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|.NET.Build.0 = Debug|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|x64.ActiveCfg = Debug|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|x64.Build.0 = Debug|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|x86.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|x64.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Debug|x86.Build.0 = Debug|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|.NET.ActiveCfg = Release|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|.NET.Build.0 = Release|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|Any CPU.ActiveCfg = Release|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|Any CPU.Build.0 = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|Mixed Platforms.Build.0 = Release|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|x64.ActiveCfg = Release|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|x64.Build.0 = Release|Any CPU {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|x86.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|x64.Build.0 = Debug|Any CPU - {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.SingleImage|x86.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|x64.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {D68699E6-B97C-4BC4-AD52-5F3C63DB24A7}.Release|x86.Build.0 = Release|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|.NET.ActiveCfg = Debug|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|.NET.Build.0 = Debug|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|Any CPU.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|x64.ActiveCfg = Debug|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|x64.Build.0 = Debug|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|x86.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|x64.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Debug|x86.Build.0 = Debug|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|.NET.ActiveCfg = Release|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|.NET.Build.0 = Release|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|Any CPU.ActiveCfg = Release|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|Any CPU.Build.0 = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|Mixed Platforms.Build.0 = Release|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|x64.ActiveCfg = Release|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|x64.Build.0 = Release|Any CPU {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|x86.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|x64.Build.0 = Debug|Any CPU - {053B2B2A-51CF-48CD-BD22-8DED7D292690}.SingleImage|x86.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|x64.Build.0 = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {053B2B2A-51CF-48CD-BD22-8DED7D292690}.Release|x86.Build.0 = Release|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|.NET.ActiveCfg = Debug|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|.NET.Build.0 = Debug|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|x64.ActiveCfg = Debug|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|x64.Build.0 = Debug|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|x86.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|.NET.ActiveCfg = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|.NET.Build.0 = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|Any CPU.ActiveCfg = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|Any CPU.Build.0 = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|Mixed Platforms.ActiveCfg = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|Mixed Platforms.Build.0 = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|x64.ActiveCfg = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|x64.Build.0 = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|x86.ActiveCfg = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DevOpsBuild|x86.Build.0 = DevOpsBuild|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|x64.Build.0 = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Debug|x86.Build.0 = Debug|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|.NET.ActiveCfg = Release|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|.NET.Build.0 = Release|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|Any CPU.ActiveCfg = Release|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|Any CPU.Build.0 = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|Mixed Platforms.Build.0 = Release|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|x64.ActiveCfg = Release|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|x64.Build.0 = Release|Any CPU {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|x86.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|x64.Build.0 = Debug|Any CPU - {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.SingleImage|x86.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|x64.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {14DFBF75-98B1-4FBD-9B48-191D8AA55A6F}.Release|x86.Build.0 = Release|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|.NET.ActiveCfg = Debug|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|.NET.Build.0 = Debug|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|x64.ActiveCfg = Debug|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|x64.Build.0 = Debug|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|x86.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|x64.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {0959BC04-AEFF-42F4-918B-0636D0239830}.Debug|x86.Build.0 = Debug|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|.NET.ActiveCfg = Release|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|.NET.Build.0 = Release|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|Any CPU.ActiveCfg = Release|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|Any CPU.Build.0 = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|Mixed Platforms.Build.0 = Release|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|x64.ActiveCfg = Release|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|x64.Build.0 = Release|Any CPU {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|x86.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|x64.Build.0 = Debug|Any CPU - {0959BC04-AEFF-42F4-918B-0636D0239830}.SingleImage|x86.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|x64.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {0959BC04-AEFF-42F4-918B-0636D0239830}.Release|x86.Build.0 = Release|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|.NET.ActiveCfg = Debug|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|.NET.Build.0 = Debug|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|Any CPU.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|x64.ActiveCfg = Debug|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|x64.Build.0 = Debug|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|x86.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|x64.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Debug|x86.Build.0 = Debug|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|.NET.ActiveCfg = Release|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|.NET.Build.0 = Release|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|Any CPU.ActiveCfg = Release|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|Any CPU.Build.0 = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|Mixed Platforms.Build.0 = Release|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|x64.ActiveCfg = Release|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|x64.Build.0 = Release|Any CPU {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|x86.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|x64.Build.0 = Debug|Any CPU - {37A22666-195A-4CBB-A541-CFFBFB9D7905}.SingleImage|x86.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|x64.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {37A22666-195A-4CBB-A541-CFFBFB9D7905}.Release|x86.Build.0 = Release|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|.NET.ActiveCfg = Debug|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|.NET.Build.0 = Debug|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|x64.ActiveCfg = Debug|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|x64.Build.0 = Debug|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|x86.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|x64.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Debug|x86.Build.0 = Debug|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|.NET.ActiveCfg = Release|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|.NET.Build.0 = Release|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|Any CPU.ActiveCfg = Release|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|Any CPU.Build.0 = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|Mixed Platforms.Build.0 = Release|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|x64.ActiveCfg = Release|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|x64.Build.0 = Release|Any CPU {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|x86.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|x64.Build.0 = Debug|Any CPU - {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.SingleImage|x86.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|x64.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {ABC20CD6-C24A-4B58-8D0F-71FBDB64EBDE}.Release|x86.Build.0 = Release|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|.NET.ActiveCfg = Debug|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|.NET.Build.0 = Debug|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|x64.ActiveCfg = Debug|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|x64.Build.0 = Debug|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|x86.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|x64.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Debug|x86.Build.0 = Debug|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|.NET.ActiveCfg = Release|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|.NET.Build.0 = Release|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|Any CPU.ActiveCfg = Release|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|Any CPU.Build.0 = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|Mixed Platforms.Build.0 = Release|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|x64.ActiveCfg = Release|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|x64.Build.0 = Release|Any CPU {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|x86.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|x64.Build.0 = Debug|Any CPU - {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.SingleImage|x86.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|x64.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {AEBC2C93-C00E-4F48-8C83-0F69417F0C25}.Release|x86.Build.0 = Release|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|.NET.ActiveCfg = Debug|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|.NET.Build.0 = Debug|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|x64.ActiveCfg = Debug|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|x64.Build.0 = Debug|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|x86.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|x64.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Debug|x86.Build.0 = Debug|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|.NET.ActiveCfg = Release|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|.NET.Build.0 = Release|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|Any CPU.ActiveCfg = Release|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|Any CPU.Build.0 = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|x64.ActiveCfg = Release|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|x64.Build.0 = Release|Any CPU {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|x86.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|x64.Build.0 = Debug|Any CPU - {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.SingleImage|x86.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|x64.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {1AA87D2D-5AB3-4DA6-9C88-4DDD27116CB6}.Release|x86.Build.0 = Release|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|.NET.ActiveCfg = Debug|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|.NET.Build.0 = Debug|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|x64.ActiveCfg = Debug|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|x64.Build.0 = Debug|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|x86.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|x64.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Debug|x86.Build.0 = Debug|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|.NET.ActiveCfg = Release|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|.NET.Build.0 = Release|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|Any CPU.Build.0 = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|x64.ActiveCfg = Release|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|x64.Build.0 = Release|Any CPU {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|x86.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|x64.Build.0 = Debug|Any CPU - {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.SingleImage|x86.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|x64.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {F0ECC8B6-3FE6-4628-AFA4-D485D40F982A}.Release|x86.Build.0 = Release|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|.NET.ActiveCfg = Debug|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|.NET.Build.0 = Debug|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|x64.ActiveCfg = Debug|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|x64.Build.0 = Debug|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|x86.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|x64.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {ABA09777-000D-44ED-9D2F-52D112C257F8}.Debug|x86.Build.0 = Debug|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|.NET.ActiveCfg = Release|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|.NET.Build.0 = Release|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|Any CPU.Build.0 = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|Mixed Platforms.Build.0 = Release|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|x64.ActiveCfg = Release|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|x64.Build.0 = Release|Any CPU {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|x86.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|x64.Build.0 = Debug|Any CPU - {ABA09777-000D-44ED-9D2F-52D112C257F8}.SingleImage|x86.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|x64.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {ABA09777-000D-44ED-9D2F-52D112C257F8}.Release|x86.Build.0 = Release|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|.NET.ActiveCfg = Debug|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|.NET.Build.0 = Debug|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|x64.ActiveCfg = Debug|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|x64.Build.0 = Debug|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|x86.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|x64.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Debug|x86.Build.0 = Debug|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|.NET.ActiveCfg = Release|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|.NET.Build.0 = Release|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|Any CPU.ActiveCfg = Release|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|Any CPU.Build.0 = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|x64.ActiveCfg = Release|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|x64.Build.0 = Release|Any CPU {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|x86.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|x64.Build.0 = Debug|Any CPU - {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.SingleImage|x86.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|x64.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {BA445E2B-A9B2-4C8B-BD46-AF49103D899D}.Release|x86.Build.0 = Release|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|.NET.ActiveCfg = Debug|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|.NET.Build.0 = Debug|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|x64.ActiveCfg = Debug|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|x64.Build.0 = Debug|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|x86.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|x64.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Debug|x86.Build.0 = Debug|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|.NET.ActiveCfg = Release|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|.NET.Build.0 = Release|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|Any CPU.ActiveCfg = Release|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|Any CPU.Build.0 = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|x64.ActiveCfg = Release|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|x64.Build.0 = Release|Any CPU {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|x86.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|x64.Build.0 = Debug|Any CPU - {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.SingleImage|x86.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|x64.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {59C6CCE5-78EB-4227-92EE-4E05DAFD679A}.Release|x86.Build.0 = Release|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|.NET.ActiveCfg = Debug|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|.NET.Build.0 = Debug|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|x64.ActiveCfg = Debug|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|x64.Build.0 = Debug|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|x86.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|x64.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Debug|x86.Build.0 = Debug|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|.NET.ActiveCfg = Release|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|.NET.Build.0 = Release|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|Any CPU.ActiveCfg = Release|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|Any CPU.Build.0 = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|Mixed Platforms.Build.0 = Release|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|x64.ActiveCfg = Release|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|x64.Build.0 = Release|Any CPU {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|x86.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|x64.Build.0 = Debug|Any CPU - {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.SingleImage|x86.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|x64.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {FDC576E6-ACC8-41D4-8A56-8E6E00221306}.Release|x86.Build.0 = Release|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|.NET.ActiveCfg = Debug|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|.NET.Build.0 = Debug|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|x64.ActiveCfg = Debug|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|x64.Build.0 = Debug|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|x86.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|x64.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {15497702-FB61-4316-949B-A8ED2EEC694A}.Debug|x86.Build.0 = Debug|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|.NET.ActiveCfg = Release|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|.NET.Build.0 = Release|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|Any CPU.ActiveCfg = Release|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|Any CPU.Build.0 = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|x64.ActiveCfg = Release|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|x64.Build.0 = Release|Any CPU {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|x86.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|x64.Build.0 = Debug|Any CPU - {15497702-FB61-4316-949B-A8ED2EEC694A}.SingleImage|x86.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|x64.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {15497702-FB61-4316-949B-A8ED2EEC694A}.Release|x86.Build.0 = Release|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|.NET.ActiveCfg = Debug|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|.NET.Build.0 = Debug|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|x64.ActiveCfg = Debug|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|x64.Build.0 = Debug|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|x86.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|x64.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Debug|x86.Build.0 = Debug|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|.NET.ActiveCfg = Release|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|.NET.Build.0 = Release|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|Any CPU.ActiveCfg = Release|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|Any CPU.Build.0 = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|Mixed Platforms.Build.0 = Release|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|x64.ActiveCfg = Release|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|x64.Build.0 = Release|Any CPU {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|x86.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|x64.Build.0 = Debug|Any CPU - {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.SingleImage|x86.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|.NET.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|x64.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|x64.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|x86.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.CD_ROM|x86.Build.0 = Release|Any CPU + {4ABDFB46-9ABA-4C3D-BE82-92B481D5826E}.Release|x86.Build.0 = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|.NET.ActiveCfg = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|.NET.Build.0 = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|x64.ActiveCfg = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|x64.Build.0 = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|x86.ActiveCfg = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Debug|x86.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|.NET.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|x64.Build.0 = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.DVD-5|x86.Build.0 = Debug|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|.NET.ActiveCfg = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|.NET.Build.0 = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|Any CPU.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|Mixed Platforms.Build.0 = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|x64.ActiveCfg = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|x64.Build.0 = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|x86.ActiveCfg = Release|Any CPU {C9DE9821-BA13-4528-B149-A3E990530AAD}.Release|x86.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|.NET.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|x64.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|x64.Build.0 = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|x86.ActiveCfg = Release|Any CPU - {C9DE9821-BA13-4528-B149-A3E990530AAD}.SingleImage|x86.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|.NET.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|x64.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|x64.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|x86.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.CD_ROM|x86.Build.0 = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|.NET.ActiveCfg = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|.NET.Build.0 = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|x64.ActiveCfg = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|x64.Build.0 = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|x86.ActiveCfg = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Debug|x86.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|.NET.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|x64.Build.0 = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.DVD-5|x86.Build.0 = Debug|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|.NET.ActiveCfg = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|.NET.Build.0 = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|Any CPU.ActiveCfg = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|Any CPU.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.Release|Mixed Platforms.Build.0 = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|x64.ActiveCfg = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|x64.Build.0 = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|x86.ActiveCfg = Release|Any CPU {0334A575-196C-470F-A2DF-75A599010FDC}.Release|x86.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|.NET.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|x64.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|x64.Build.0 = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|x86.ActiveCfg = Release|Any CPU - {0334A575-196C-470F-A2DF-75A599010FDC}.SingleImage|x86.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|.NET.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|x64.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|x64.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|x86.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.CD_ROM|x86.Build.0 = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|.NET.ActiveCfg = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|.NET.Build.0 = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|x64.ActiveCfg = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|x64.Build.0 = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|x86.ActiveCfg = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Debug|x86.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|.NET.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|x64.Build.0 = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.DVD-5|x86.Build.0 = Debug|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|.NET.ActiveCfg = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|.NET.Build.0 = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|Any CPU.ActiveCfg = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|Any CPU.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|x64.ActiveCfg = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|x64.Build.0 = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|x86.ActiveCfg = Release|Any CPU {BB28836A-AA83-49F0-802F-39D6847E3949}.Release|x86.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|.NET.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|x64.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|x64.Build.0 = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|x86.ActiveCfg = Release|Any CPU - {BB28836A-AA83-49F0-802F-39D6847E3949}.SingleImage|x86.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|.NET.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|x64.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|x64.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|x86.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.CD_ROM|x86.Build.0 = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|.NET.ActiveCfg = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|.NET.Build.0 = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|x64.ActiveCfg = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|x64.Build.0 = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|x86.ActiveCfg = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Debug|x86.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|.NET.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|x64.Build.0 = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.DVD-5|x86.Build.0 = Debug|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|.NET.ActiveCfg = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|.NET.Build.0 = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|Any CPU.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.Release|Mixed Platforms.Build.0 = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|x64.ActiveCfg = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|x64.Build.0 = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|x86.ActiveCfg = Release|Any CPU {517EC058-71E5-473C-AB9A-339623565AFC}.Release|x86.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|.NET.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|x64.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|x64.Build.0 = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|x86.ActiveCfg = Release|Any CPU - {517EC058-71E5-473C-AB9A-339623565AFC}.SingleImage|x86.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|.NET.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|x64.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|x64.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|x86.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.CD_ROM|x86.Build.0 = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|.NET.ActiveCfg = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|.NET.Build.0 = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|Any CPU.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|x64.ActiveCfg = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|x64.Build.0 = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|x86.ActiveCfg = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Debug|x86.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|.NET.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|x64.Build.0 = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.DVD-5|x86.Build.0 = Debug|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|.NET.ActiveCfg = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|.NET.Build.0 = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|Any CPU.ActiveCfg = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|Any CPU.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|Mixed Platforms.Build.0 = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|x64.ActiveCfg = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|x64.Build.0 = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|x86.ActiveCfg = Release|Any CPU {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.Release|x86.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|.NET.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|x64.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|x64.Build.0 = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|x86.ActiveCfg = Release|Any CPU - {08FEF1CB-B382-4C9D-AAFB-B85C790EAD96}.SingleImage|x86.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|.NET.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|.NET.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|x64.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|x64.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|x86.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.CD_ROM|x86.Build.0 = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|.NET.ActiveCfg = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|.NET.Build.0 = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|x64.ActiveCfg = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|x64.Build.0 = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|x86.ActiveCfg = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Debug|x86.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|.NET.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|x64.Build.0 = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.DVD-5|x86.Build.0 = Debug|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|.NET.ActiveCfg = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|.NET.Build.0 = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|Any CPU.ActiveCfg = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|Any CPU.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|Mixed Platforms.Build.0 = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|x64.ActiveCfg = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|x64.Build.0 = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|x86.ActiveCfg = Release|Any CPU {448F2796-2D87-4165-9A11-81ED5D0EC62C}.Release|x86.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|.NET.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|.NET.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|x64.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|x64.Build.0 = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|x86.ActiveCfg = Release|Any CPU - {448F2796-2D87-4165-9A11-81ED5D0EC62C}.SingleImage|x86.Build.0 = Release|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|.NET.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|.NET.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|Any CPU.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|Any CPU.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|Mixed Platforms.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|Mixed Platforms.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|x64.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|x86.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.CD_ROM|x86.Build.0 = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|.NET.ActiveCfg = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|.NET.Build.0 = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|x64.ActiveCfg = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|x64.Build.0 = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|x86.ActiveCfg = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Debug|x86.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|.NET.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|x64.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.DVD-5|x86.Build.0 = Debug|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|.NET.ActiveCfg = Release|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|.NET.Build.0 = Release|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|Any CPU.Build.0 = Release|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|x64.ActiveCfg = Release|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|x64.Build.0 = Release|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|x86.ActiveCfg = Release|Any CPU {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.Release|x86.Build.0 = Release|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|.NET.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|.NET.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|Any CPU.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|Any CPU.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|Mixed Platforms.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|Mixed Platforms.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|x64.Build.0 = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|x86.ActiveCfg = Debug|Any CPU - {85198616-FFA4-4FE2-83B2-C322E2F54FE2}.SingleImage|x86.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|.NET.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|.NET.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|Any CPU.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|Any CPU.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|Mixed Platforms.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|x64.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|x64.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|x86.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.CD_ROM|x86.Build.0 = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|.NET.ActiveCfg = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|.NET.Build.0 = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|x64.ActiveCfg = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|x64.Build.0 = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|x86.ActiveCfg = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Debug|x86.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|.NET.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|.NET.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|Any CPU.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|Any CPU.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|Mixed Platforms.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|x64.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|x64.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|x86.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DevOpsBuild|x86.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|.NET.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|.NET.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|Any CPU.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|x64.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|x64.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|x86.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.DVD-5|x86.Build.0 = Debug|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|.NET.ActiveCfg = Release|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|.NET.Build.0 = Release|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|Any CPU.ActiveCfg = Release|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|Any CPU.Build.0 = Release|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|Mixed Platforms.Build.0 = Release|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|x64.ActiveCfg = Release|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|x64.Build.0 = Release|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|x86.ActiveCfg = Release|Any CPU {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.Release|x86.Build.0 = Release|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|.NET.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|.NET.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|Any CPU.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|Any CPU.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|Mixed Platforms.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|x64.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|x64.Build.0 = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|x86.ActiveCfg = Debug|Any CPU - {DE4B2CCE-FBB9-464E-A307-B55D7DE60093}.SingleImage|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/SqlBuildManager.Console.Dependent.UnitTest/Initialization.cs b/src/SqlBuildManager.Console.Dependent.UnitTest/Initialization.cs index f0182b1c..bb509510 100644 --- a/src/SqlBuildManager.Console.Dependent.UnitTest/Initialization.cs +++ b/src/SqlBuildManager.Console.Dependent.UnitTest/Initialization.cs @@ -37,11 +37,6 @@ public static void CleanUp() } } - public ThreadedExecution GetThreadedExecutionAccessor(string[] args) - { - return new ThreadedExecution(args); - } - public void CopySbmFileToTestPath() { File.WriteAllBytes(Initialization.SqlBuildZipFileName, Properties.Resources.NoTrans_MultiDb1); diff --git a/src/SqlBuildManager.Console.Dependent.UnitTest/ThreadedExecutionTest.cs b/src/SqlBuildManager.Console.Dependent.UnitTest/ThreadedExecutionTest.cs index a7582591..cb04abcf 100644 --- a/src/SqlBuildManager.Console.Dependent.UnitTest/ThreadedExecutionTest.cs +++ b/src/SqlBuildManager.Console.Dependent.UnitTest/ThreadedExecutionTest.cs @@ -12,6 +12,8 @@ using Microsoft.Extensions.Logging; using System.Text; using System.Linq; +using SqlBuildManager.Console.CommandLine; +using SqlSync.Connection; namespace SqlBuildManager.Console.Dependent.UnitTest { @@ -108,16 +110,21 @@ public void ExecuteTest_ConcurrencyByNumber_1() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "--rootloggingpath=\"" + loggingPath + "\""; - args[1] = "--transactional=true"; - args[2] = "--trial=false"; - args[3] = "--override=\"" + multiDbOverrideSettingFileName + "\""; - args[4] = "--packagename=\"" + sbmFileName + "\""; - args[5] = "--timeoutretrycount=0"; - args[6] = "--concurrency=1"; - args[7] = "--concurrencytype=Count"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", "0", + "--concurrency", "1", + "--concurrencytype", "Count" + + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int actual; actual = target.Execute(); @@ -175,16 +182,20 @@ public void ExecuteTest_ConcurrencyByNumber_2() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "--rootloggingpath=\"" + loggingPath + "\""; - args[1] = "--transactional=true"; - args[2] = "--trial=false"; - args[3] = "--override=\"" + multiDbOverrideSettingFileName + "\""; - args[4] = "--packagename=\"" + sbmFileName + "\""; - args[5] = "--timeoutretrycount=0"; - args[6] = "--concurrency=2"; - args[7] = "--concurrencytype=Count"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", "0", + "--concurrency", "2", + "--concurrencytype", "Count" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int actual; actual = target.Execute(); @@ -232,16 +243,20 @@ public void ExecuteTest_ConcurrencyByNumber_4() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "--rootloggingpath=\"" + loggingPath + "\""; - args[1] = "--transactional=true"; - args[2] = "--trial=false"; - args[3] = "--override=\"" + multiDbOverrideSettingFileName + "\""; - args[4] = "--packagename=\"" + sbmFileName + "\""; - args[5] = "--timeoutretrycount=0"; - args[6] = "--concurrency=4"; - args[7] = "--concurrencytype=Count"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", "0", + "--concurrency", "4", + "--concurrencytype", "Count" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int actual; actual = target.Execute(); @@ -296,16 +311,20 @@ public void ExecuteTest_ConcurrencyByServer() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "--rootloggingpath=\"" + loggingPath + "\""; - args[1] = "--transactional=true"; - args[2] = "--trial=false"; - args[3] = "--override=\"" + multiDbOverrideSettingFileName + "\""; - args[4] = "--packagename=\"" + sbmFileName + "\""; - args[5] = "--timeoutretrycount=0"; - args[6] = "--concurrency=1"; - args[7] = "--concurrencytype=Server"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", "0", + "--concurrency", "1", + "--concurrencytype", "Server" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int actual; actual = target.Execute(); @@ -364,16 +383,20 @@ public void ExecuteTest_ConcurrencyByMaxByServer_2() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "--rootloggingpath=\"" + loggingPath + "\""; - args[1] = "--transactional=true"; - args[2] = "--trial=false"; - args[3] = "--override=\"" + multiDbOverrideSettingFileName + "\""; - args[4] = "--packagename=\"" + sbmFileName + "\""; - args[5] = "--timeoutretrycount=0"; - args[6] = "--concurrency=2"; - args[7] = "--concurrencytype=MaxPerServer"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", "0", + "--concurrency", "2", + "--concurrencytype", "MaxPerServer" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.Successful; int actual; actual = target.Execute(); @@ -428,16 +451,19 @@ public void ExecuteTest_CommitWithoutUsingRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=true"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=0"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", "0", + "--authtype", + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.Successful; int actual; actual = target.Execute(); @@ -503,16 +529,19 @@ public void ExecuteTest_CommitWithRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); int retryCount = 20; - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=true"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=" + retryCount.ToString(); - ThreadedExecution target = new ThreadedExecution(args); + + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", retryCount.ToString() + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.Successful; int actual; @@ -587,16 +616,19 @@ public void ExecuteTest_RollbackWithThreeRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); int retryCount = 3; - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=true"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=" + retryCount.ToString(); - ThreadedExecution target = new ThreadedExecution(args); + + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", retryCount.ToString() + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.FinishingWithErrors; int actual; @@ -667,16 +699,19 @@ public void ExecuteTest_RollbackWithFiveRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); int retryCount = 5; - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=true"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=" + retryCount.ToString(); - ThreadedExecution target = new ThreadedExecution(args); + + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", retryCount.ToString() + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.FinishingWithErrors; int actual; @@ -747,16 +782,19 @@ public void ExecuteTest_NegativeTimeoutRetryCount() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=true"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=-1"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount","-1" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); + int expected = (int)ExecutionReturn.NegativeTimeoutRetryCount; int actual; actual = target.Execute(); @@ -801,16 +839,18 @@ public void ExecuteTest_SuccessWithoutTransactionsNoUsingRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=false"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=0"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "false", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount","0" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.Successful; int actual; actual = target.Execute(); @@ -874,16 +914,18 @@ public void ExecuteTest_NonTransactionalWithRetriesArgsFailure() File.WriteAllText(multiDbOverrideSettingFileName, ""); string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=false"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=20"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "false", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount","20" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.BadRetryCountAndTransactionalCombo; int actual; SqlBuildManager.Logging.Configure.CloseAndFlushAllLoggers(); @@ -924,16 +966,18 @@ public void ExecuteTest_ErrorWithoutTransactionsNoUsingRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=false"; - args[3] = "/trial=false"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=0"; - ThreadedExecution target = new ThreadedExecution(args); + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "false", + "--trial", "false", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount","0" + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.FinishingWithErrors; int actual; @@ -1009,16 +1053,19 @@ public void ExecuteTest_TrialSuccessWithRollbackWithRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); int retryCount = 20; - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=true"; - args[3] = "/trial=true"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=" + retryCount.ToString(); - ThreadedExecution target = new ThreadedExecution(args); + + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "true", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", retryCount.ToString() + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.Successful; int actual; @@ -1089,16 +1136,19 @@ public void ExecuteTest_TrialFailureRollbackWithRetries() string loggingPath = Path.GetTempPath() + System.Guid.NewGuid().ToString(); int retryCount = 3; - string[] args = new string[8]; - args[0] = "/Action=threaded"; - args[1] = "/RootLoggingPath=\"" + loggingPath + "\""; - args[2] = "/transactional=true"; - args[3] = "/trial=true"; - args[4] = "/override=\"" + multiDbOverrideSettingFileName + "\""; - args[5] = "/PackageName=\"" + sbmFileName + "\""; - args[6] = "/DistributionType=equal"; - args[7] = "/TimeoutRetryCount=" + retryCount.ToString(); - ThreadedExecution target = new ThreadedExecution(args); + + string[] args = new string[] { + "threaded", "run", + "--authtype", AuthenticationType.Windows.ToString(), + "--rootloggingpath", loggingPath, + "--transactional" , "true", + "--trial", "true", + "--override", multiDbOverrideSettingFileName, + "--packagename", sbmFileName, + "--timeoutretrycount", retryCount.ToString() + }; + var cmdLine = CommandLineBuilder.ParseArguments(args); + ThreadedExecution target = new ThreadedExecution(cmdLine); int expected = (int)ExecutionReturn.FinishingWithErrors; int actual; @@ -1123,7 +1173,7 @@ public void ExecuteTest_TrialFailureRollbackWithRetries() MatchCollection matches = regFindTimeout.Matches(logContents); Assert.IsTrue(matches.Count == retryCount + 1, String.Format("Timeout message count of {0} should be equal to the retrycount +1 value of {1}", matches.Count.ToString(), (retryCount + 1).ToString())); Assert.IsTrue(logContents.IndexOf("ROLLBACK TRANSACTION") > -1, "SqlBuildTest Log does not contain a 'ROLLBACK' message - it should for a trial run"); - Assert.IsTrue(logContents.IndexOf("COMMIT TRANSACTION") == -1, " SqlBuildTest Log contains a 'COMMIT' message - it should for a trial run"); + Assert.IsTrue(logContents.IndexOf("COMMIT TRANSACTION") == -1, " SqlBuildTest Log contains a 'COMMIT' message - it should not for a trial run"); Assert.IsTrue(logContents.IndexOf("use SqlBuildTest") > -1, "SqlBuildTest Log does not contain the proper database name"); //SqlBuildTest1 should have committed diff --git a/src/SqlBuildManager.Console.ExternalTest/CliTests.cs b/src/SqlBuildManager.Console.ExternalTest/CliTests.cs index 99b90ca3..19be8cbf 100644 --- a/src/SqlBuildManager.Console.ExternalTest/CliTests.cs +++ b/src/SqlBuildManager.Console.ExternalTest/CliTests.cs @@ -1,14 +1,12 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Threading; +using SqlBuildManager.Console.CommandLine; using System; -using System.Text; using System.Collections.Generic; -using System.Linq; -using System.IO; -using SqlSync.SqlBuild; using System.CommandLine; +using System.IO; +using System.Linq; +using System.Text; using System.Threading.Tasks; -using SqlBuildManager.Console; namespace SqlBuildManager.Console.ExternalTest { /// @@ -37,7 +35,7 @@ public void ConfigureProcessInfo() this.overrideFilePath = Path.GetFullPath("TestConfig/databasetargets.cfg"); this.cmdLine = new CommandLineArgs(); - this.cmdLine.SettingsFile = this.settingsFilePath; + this.cmdLine.FileInfoSettingsFile = new FileInfo(this.settingsFilePath); this.cmdLine.SettingsFileKey = this.settingsFileKeyPath; bool ds; (ds, this.cmdLine) = Cryptography.DecryptSensitiveFields(cmdLine); @@ -68,7 +66,7 @@ private string CreateDacpac(CommandLineArgs cmdLine, string server, string datab "--database", database, "--server", server }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -147,7 +145,7 @@ public void LocalThreaded_SBMSource_Success() "--rootloggingpath", this.cmdLine.RootLoggingPath }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -181,7 +179,7 @@ public void LocalSingleRun_SBMSource_Success() "--server", this.overrideFileContents[0].Split(":")[0] }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -217,7 +215,7 @@ public void Batch_SBMSource_Success(string batchMethod, string settingsFile) "--override", this.overrideFilePath, "--packagename", sbmFileName}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -261,7 +259,7 @@ public void Batch_SBMSource_ServerConcurrency_Success(string batchMethod, string "--concurrency", "2", "--concurrencytype","Server" }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -305,7 +303,7 @@ public void Batch_SBMSource_MaxServerConcurrency_Success(string batchMethod, str "--concurrency", "2", "--concurrencytype","MaxPerServer" }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -341,7 +339,7 @@ public void Batch_SBMSource_RunWithError_MissingPackage(string batchMethod, stri "--settingsfilekey", this.settingsFileKeyPath, "--override", this.overrideFilePath }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -381,7 +379,7 @@ public void LocalThreadedAndBatch_PlatinumDbSource_Succes(string batchMethod, st "--platinumdbsource", database, "--platinumserversource", server }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -429,7 +427,7 @@ public void Batch_PlatinumDbSource_FirstDbAlreadyInSync(string batchMethod, stri "--platinumdbsource", database, "--platinumserversource", server }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -479,7 +477,7 @@ public void LocalThreadedAndBatch_PlatinumDbSource_ADbAlreadyInSync(string batch "--platinumdbsource", database, "--platinumserversource", server }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -530,7 +528,7 @@ public void LocalThreadedAndBatch_DacpacSource_Success(string batchMethod, strin "--override", minusFirst, "--platinumdacpac", dacpacName }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -582,7 +580,7 @@ public void LocalThreadedAndBatch_DacpacSource_FirstDbAlreadyInSync(string batch "--override", minusFirst, "--platinumdacpac", dacpacName }; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -631,11 +629,10 @@ public void BatchQuery_SelectSuccess(string batchMethod, string settingsFile) "--queryfile", selectquery, "--silent"}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; - ; var logFileContents = ReleventLogFileContents(startingLine); Assert.AreEqual(0, result, StandardExecutionErrorMessage(logFileContents)); @@ -694,7 +691,7 @@ public void BatchQuery_InsertFail(string batchMethod, string settingsFile) "--queryfile", insertquery, "--silent"}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -733,7 +730,7 @@ public void BatchQuery_DeleteFail(string batchMethod, string settingsFile) "--queryfile", deletequery, "--silent"}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -771,7 +768,7 @@ public void BatchQuery_UpdateFail(string batchMethod, string settingsFile) "--queryfile", updatequery, "--silent"}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); var val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -795,7 +792,7 @@ public void Batch_Queue_SBMSource_ByServer_Success(string batchMethod, string se File.WriteAllBytes(sbmFileName, Properties.Resources.SimpleSelect); } string jobName = GetUniqueBatchJobName(); - + var concurType = ConcurrencyType.Server.ToString(); int startingLine = LogFileCurrentLineCount(); var args = new string[]{ @@ -803,10 +800,10 @@ public void Batch_Queue_SBMSource_ByServer_Success(string batchMethod, string se "--settingsfile", settingsFile, "--settingsfilekey", this.settingsFileKeyPath, "--override" , this.overrideFilePath, - "--concurrencytype", ConcurrencyType.Server.ToString(), + "--concurrencytype", concurType, "--jobname", jobName}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); Task val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -820,7 +817,7 @@ public void Batch_Queue_SBMSource_ByServer_Success(string batchMethod, string se "--settingsfilekey", this.settingsFileKeyPath, "--override", this.overrideFilePath, "--packagename", sbmFileName, - "--concurrencytype", ConcurrencyType.Server.ToString(), + "--concurrencytype", concurType, "--concurrency", "2", "--jobname", jobName }; @@ -846,15 +843,16 @@ public void Batch_Queue_SBMSource_MaxPerserver_Success(string batchMethod, strin } string jobName = GetUniqueBatchJobName(); int startingLine = LogFileCurrentLineCount(); + var concurType = ConcurrencyType.MaxPerServer.ToString(); var args = new string[]{ "batch", "enqueue", "--settingsfile", settingsFile, "--settingsfilekey", this.settingsFileKeyPath, "--override" , this.overrideFilePath, - "--concurrencytype", ConcurrencyType.MaxPerServer.ToString(), + "--concurrencytype", concurType, "--jobname", jobName}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); Task val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -868,7 +866,7 @@ public void Batch_Queue_SBMSource_MaxPerserver_Success(string batchMethod, strin "--settingsfilekey", this.settingsFileKeyPath, "--override", this.overrideFilePath, "--packagename", sbmFileName, - "--concurrencytype", ConcurrencyType.Server.ToString(), + "--concurrencytype", concurType, "--concurrency", "5", "--jobname", jobName }; @@ -895,15 +893,16 @@ public void Batch_Queue_SBMSource_Count_Success(string batchMethod, string setti } string jobName = GetUniqueBatchJobName(); int startingLine = LogFileCurrentLineCount(); + var concurType = ConcurrencyType.Count.ToString(); var args = new string[]{ "batch", "enqueue", "--settingsfile", settingsFile, "--settingsfilekey", this.settingsFileKeyPath, "--override" , this.overrideFilePath, - "--concurrencytype", ConcurrencyType.Count.ToString(), + "--concurrencytype", concurType, "--jobname", jobName}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); Task val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -917,7 +916,7 @@ public void Batch_Queue_SBMSource_Count_Success(string batchMethod, string setti "--settingsfilekey", this.settingsFileKeyPath, "--override", this.overrideFilePath, "--packagename", sbmFileName, - "--concurrencytype", ConcurrencyType.Server.ToString(), + "--concurrencytype", concurType, "--concurrency", "5", "--jobname", jobName }; @@ -949,15 +948,16 @@ public void Batch_Queue_PlatinumDbSource_Success(string batchMethod, string sett string jobName = GetUniqueBatchJobName(); int startingLine = LogFileCurrentLineCount(); + var concurType = ConcurrencyType.Count.ToString(); var args = new string[]{ "batch", "enqueue", "--settingsfile", settingsFile, "--settingsfilekey", this.settingsFileKeyPath, "--override" , minusFirst, - "--concurrencytype", ConcurrencyType.Count.ToString(), + "--concurrencytype", concurType, "--jobname", jobName}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); Task val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -972,7 +972,7 @@ public void Batch_Queue_PlatinumDbSource_Success(string batchMethod, string sett "--override", minusFirst, "--platinumdbsource", database, "--platinumserversource", server, - "--concurrencytype", ConcurrencyType.Server.ToString(), + "--concurrencytype", concurType, "--concurrency", "5", "--jobname", jobName }; @@ -1006,16 +1006,16 @@ public void Batch_Queue_DacpacSource_Success(string batchMethod, string settings string jobName = GetUniqueBatchJobName(); int startingLine = LogFileCurrentLineCount(); - + var concurType = ConcurrencyType.Count.ToString(); var args = new string[]{ "batch", "enqueue", "--settingsfile", settingsFile, "--settingsfilekey", this.settingsFileKeyPath, "--override" , minusFirst, - "--concurrencytype", ConcurrencyType.Count.ToString(), + "--concurrencytype", concurType, "--jobname", jobName}; - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); Task val = rootCommand.InvokeAsync(args); val.Wait(); var result = val.Result; @@ -1029,7 +1029,7 @@ public void Batch_Queue_DacpacSource_Success(string batchMethod, string settings "--settingsfilekey", this.settingsFileKeyPath, "--override", minusFirst, "--platinumdacpac", dacpacName, - "--concurrencytype", ConcurrencyType.Server.ToString(), + "--concurrencytype", concurType, "--concurrency", "5", "--jobname", jobName }; diff --git a/src/SqlBuildManager.Console.ExternalTest/DatabaseHelper.cs b/src/SqlBuildManager.Console.ExternalTest/DatabaseHelper.cs index 5d1322eb..a5419f41 100644 --- a/src/SqlBuildManager.Console.ExternalTest/DatabaseHelper.cs +++ b/src/SqlBuildManager.Console.ExternalTest/DatabaseHelper.cs @@ -1,8 +1,7 @@ using Microsoft.Data.SqlClient; -using SqlSync.SqlBuild; +using SqlBuildManager.Console.CommandLine; using System; using System.Collections.Generic; - namespace SqlBuildManager.Console.ExternalTest { class DatabaseHelper diff --git a/src/SqlBuildManager.Console.ExternalTest/SqlBuildManager.Console.ExternalTest.csproj b/src/SqlBuildManager.Console.ExternalTest/SqlBuildManager.Console.ExternalTest.csproj index 8026e6bf..4a418e1d 100644 --- a/src/SqlBuildManager.Console.ExternalTest/SqlBuildManager.Console.ExternalTest.csproj +++ b/src/SqlBuildManager.Console.ExternalTest/SqlBuildManager.Console.ExternalTest.csproj @@ -12,9 +12,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + diff --git a/src/SqlBuildManager.Console.UnitTest/ConcurrencyTest.cs b/src/SqlBuildManager.Console.UnitTest/ConcurrencyTest.cs index df1e8975..94470c4e 100644 --- a/src/SqlBuildManager.Console.UnitTest/ConcurrencyTest.cs +++ b/src/SqlBuildManager.Console.UnitTest/ConcurrencyTest.cs @@ -1,16 +1,14 @@ -using SqlBuildManager.Console; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using SqlSync.SqlBuild.MultiDb; -using SqlSync.SqlBuild; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SqlBuildManager.Console.CommandLine; +using SqlBuildManager.Console.Threaded; using SqlBuildManager.Interfaces.Console; -using System.IO; +using SqlSync.SqlBuild; +using SqlSync.SqlBuild.MultiDb; using System; using System.Collections.Generic; -using System.Collections; +using System.IO; using System.Linq; -using SqlBuildManager.Console.Threaded; using System.Text; - namespace SqlBuildManager.Console.UnitTest { [TestClass()] diff --git a/src/SqlBuildManager.Console.UnitTest/DatabaseHelper.cs b/src/SqlBuildManager.Console.UnitTest/DatabaseHelper.cs index 57c399fb..d923ecc4 100644 --- a/src/SqlBuildManager.Console.UnitTest/DatabaseHelper.cs +++ b/src/SqlBuildManager.Console.UnitTest/DatabaseHelper.cs @@ -1,8 +1,7 @@ using Microsoft.Data.SqlClient; -using SqlSync.SqlBuild; +using SqlBuildManager.Console.CommandLine; using System; using System.Collections.Generic; - namespace SqlBuildManager.Console.Dependent.UnitTest { class DatabaseHelper diff --git a/src/SqlBuildManager.Console.UnitTest/Initialization.cs b/src/SqlBuildManager.Console.UnitTest/Initialization.cs index 05c25552..2c83bc47 100644 --- a/src/SqlBuildManager.Console.UnitTest/Initialization.cs +++ b/src/SqlBuildManager.Console.UnitTest/Initialization.cs @@ -37,11 +37,6 @@ public static void CleanUp() } } - public ThreadedExecution GetThreadedExecutionAccessor(string[] args) - { - return new ThreadedExecution(args); - } - public void CopySbmFileToTestPath() { File.WriteAllBytes(Initialization.SqlBuildZipFileName, Properties.Resources.NoTrans_MultiDb_sbm); diff --git a/src/SqlBuildManager.Console.UnitTest/SynchronizeTest.cs b/src/SqlBuildManager.Console.UnitTest/SynchronizeTest.cs index bdc4e191..2f8ec427 100644 --- a/src/SqlBuildManager.Console.UnitTest/SynchronizeTest.cs +++ b/src/SqlBuildManager.Console.UnitTest/SynchronizeTest.cs @@ -1,13 +1,11 @@ -using SqlBuildManager.Console; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using SqlSync.SqlBuild; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SqlBuildManager.Console.CommandLine; using SqlSync.SqlBuild.Syncronizer; - +using System; namespace SqlBuildManager.Console.UnitTest { - - + + /// ///This is a test class for SynchronizeTest and is intended ///to contain all SynchronizeTest Unit Tests @@ -61,27 +59,30 @@ public void SynchronizeConstructorTest() /// ///A test for GetDatabaseRunHistoryDifference /// - [TestMethod(), Ignore("Don't have the setup scripts ready yet")] + [TestMethod()] public void GetDatabaseRunHistoryDifferenceTest() { string[] args = new string[] { - "/Database=SqlbuildTest_SyncTest2", - "/Server=localhost\\sqlexpress", - "/GoldDatabase=SqlbuildTest_SyncTest1", - "/GoldServer=localhost\\sqlexpress" + "getdifference", + "--database" , "SqlbuildTest_SyncTest2", + "--server" , "localhost\\sqlexpress", + "--golddatabase", "SqlbuildTest_SyncTest1", + "--goldserver" , "localhost\\sqlexpress" }; string expected = string.Empty; string actual; - var cmdLine = CommandLine.ParseCommandLineArg(args); + + var cmdLine = CommandLineBuilder.ParseArguments(args); + actual = Synchronize.GetDatabaseRunHistoryTextDifference(cmdLine); - Assert.AreEqual(3, actual.Split(new string[]{"\r\n"},StringSplitOptions.None).Length); + Assert.AreEqual(1, actual.Split(new string[]{"\r\n"},StringSplitOptions.None).Length); } /// ///A test for GetDatabaseRunHistoryDifference /// - [TestMethod(), Ignore("Don't have the setup scripts ready yet")] + [TestMethod()] public void GetDatabaseRunHistoryDifferenceTest1() { CommandLineArgs cmdLine = null; @@ -89,23 +90,26 @@ public void GetDatabaseRunHistoryDifferenceTest1() DatabaseRunHistory actual; actual = Synchronize.GetDatabaseRunHistoryDifference(cmdLine); Assert.AreEqual(expected, actual); - Assert.Inconclusive("Verify the correctness of this test method."); } /// ///A test for ParseAndValidateFlags /// - [TestMethod(), Ignore("not complete")] + [TestMethod()] [DeploymentItem("sbm.exe")] public void ParseAndValidateFlagsTest() { - string[] args = null; + string[] args = new string[] + { + "getdifference", + "--database" , "SqlbuildTest_SyncTest2" + + }; CommandLineArgs expected = null; - CommandLineArgs actual; - var cmdLine = CommandLine.ParseCommandLineArg(args); - actual = Synchronize.ValidateFlags(cmdLine); + (CommandLineArgs actual, string message) = CommandLineBuilder.ParseArgumentsWithMessage(args); + Assert.AreEqual(expected, actual); - Assert.Inconclusive("Verify the correctness of this test method."); + Assert.IsTrue(message.Contains("--golddatabase")); } } } diff --git a/src/SqlBuildManager.Console.UnitTest/ValidationTest.cs b/src/SqlBuildManager.Console.UnitTest/ValidationTest.cs index 47ff7017..066fcb33 100644 --- a/src/SqlBuildManager.Console.UnitTest/ValidationTest.cs +++ b/src/SqlBuildManager.Console.UnitTest/ValidationTest.cs @@ -1,13 +1,12 @@ -using SqlBuildManager.Console; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using SqlSync.SqlBuild.MultiDb; -using SqlSync.SqlBuild; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SqlBuildManager.Console.CommandLine; using SqlBuildManager.Interfaces.Console; +using SqlSync.SqlBuild.MultiDb; using System.IO; namespace SqlBuildManager.Console.UnitTest { - - + + /// ///This is a test class for ValidationTest and is intended ///to contain all ValidationTest Unit Tests @@ -75,7 +74,6 @@ public TestContext TestContext public void ValidateCommonCommandLineArgsTest_MissingRootLoggingPath() { CommandLineArgs cmdLine = new CommandLineArgs(); - cmdLine.Action = CommandLineArgs.ActionType.Build; cmdLine.AuthenticationArgs.AuthenticationType = SqlSync.Connection.AuthenticationType.AzureADIntegrated; string[] errorMessages = null; int expected = -99; diff --git a/src/SqlBuildManager.Console/BackoutCommandLine.cs b/src/SqlBuildManager.Console/BackoutCommandLine.cs index 83a4735b..b9e43cb6 100644 --- a/src/SqlBuildManager.Console/BackoutCommandLine.cs +++ b/src/SqlBuildManager.Console/BackoutCommandLine.cs @@ -1,11 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using SqlSync.SqlBuild; -using Microsoft.Extensions.Logging; -using SqlSync.ObjectScript; +using Microsoft.Extensions.Logging; +using SqlBuildManager.Console.CommandLine; using SqlSync.Connection; namespace SqlBuildManager.Console { diff --git a/src/SqlBuildManager.Console/Batch/BatchCleaner.cs b/src/SqlBuildManager.Console/Batch/BatchCleaner.cs new file mode 100644 index 00000000..2dd7ce8c --- /dev/null +++ b/src/SqlBuildManager.Console/Batch/BatchCleaner.cs @@ -0,0 +1,65 @@ +using Azure.Storage; +using Azure.Storage.Blobs; +using Azure.Storage.Blobs.Models; +using Azure.Storage.Blobs.Specialized; +using Azure.Storage.Sas; +using Microsoft.Azure.Batch; +using Microsoft.Azure.Batch.Auth; +using Microsoft.Azure.Batch.Common; +using Microsoft.Extensions.Logging; +using SqlBuildManager.Console.CommandLine; +using SqlBuildManager.Console.Threaded; +using SqlBuildManager.Interfaces.Console; +using SqlSync.Connection; +using SqlSync.SqlBuild; +using SqlSync.SqlBuild.MultiDb; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Linq; +using MoreLinq; +namespace SqlBuildManager.Console.Batch +{ + public class BatchCleaner + { + private static ILogger log = SqlBuildManager.Logging.ApplicationLogging.CreateLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + public static int DeleteAllCompletedJobs(CommandLineArgs cmdLine) + { + try + { + List lstTasks = new List(); + BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials(cmdLine.BatchArgs.BatchAccountUrl, cmdLine.BatchArgs.BatchAccountName, cmdLine.BatchArgs.BatchAccountKey); + var batchClient = BatchClient.Open(cred); + var jobs = batchClient.JobOperations.ListJobs(); + var active = jobs.Where(j => j.State == JobState.Completed).ToList(); + + //do in small sets to avoid hitting 429 errors + var activeSets = active.Batch(5); + foreach (var set in activeSets) + { + set.ForEach(a => + { + log.LogDebug($"Deleting Batch Job: '{a.Id}"); + lstTasks.Add(a.DeleteAsync()); + }); + Task.WaitAll(lstTasks.ToArray()); + } + return 0; + } + catch(Exception exe) + { + log.LogError($"Problem deleting Batch jobs: {exe.ToString()}"); + return 6859; + } + } + } + + + +} diff --git a/src/SqlBuildManager.Console/Batch/BatchExecution.cs b/src/SqlBuildManager.Console/Batch/BatchExecution.cs index 6695374a..4aa9ae89 100644 --- a/src/SqlBuildManager.Console/Batch/BatchExecution.cs +++ b/src/SqlBuildManager.Console/Batch/BatchExecution.cs @@ -1,26 +1,25 @@ -using Microsoft.Azure.Batch; +using Azure.Storage; +using Azure.Storage.Blobs; +using Azure.Storage.Blobs.Models; +using Azure.Storage.Blobs.Specialized; +using Azure.Storage.Sas; +using Microsoft.Azure.Batch; using Microsoft.Azure.Batch.Auth; using Microsoft.Azure.Batch.Common; +using Microsoft.Extensions.Logging; +using SqlBuildManager.Console.CommandLine; +using SqlBuildManager.Console.Threaded; +using SqlBuildManager.Interfaces.Console; +using SqlSync.Connection; +using SqlSync.SqlBuild; +using SqlSync.SqlBuild.MultiDb; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; -using SqlSync.SqlBuild; -using SqlSync.SqlBuild.MultiDb; using System.Text; -using SqlBuildManager.Interfaces.Console; using System.Text.RegularExpressions; -using Azure.Storage.Blobs; -using Azure.Storage.Blobs.Specialized; -using Azure.Storage.Blobs.Models; -using Azure.Storage.Sas; -using System.Threading.Tasks; -using Microsoft.Extensions.Azure; -using Azure.Storage; -using SqlBuildManager.Console.Threaded; -using SqlSync.Connection; -using Microsoft.Extensions.Logging; namespace SqlBuildManager.Console.Batch { public class Execution @@ -722,8 +721,6 @@ private IList CompileCommandLines(CommandLineArgs cmdLine, List CompileCommandLines(CommandLineArgs cmdLine, List("settingsfile").ExistingOnly(), - Name = "SettingsFileInfo", - }; - var settingsfileNewOption = new Option(new string[] { "--settingsfile" }, "Saved settings file to load parameters from") - { - Argument = new Argument("settingsfile"), - Name = "SettingsFileInfo", - }; - var settingsfileKeyOption = new Option(new string[] { "--settingsfilekey" }, "Key for the encryption of sensitive informtation in the settings file (must be at least 16 characters). It can be either the key string or a file path to a key file. The key may also provided by setting a 'sbm-settingsfilekey' Environment variable. If not provided a machine value will be used.") - { - Argument = new Argument("settingsfilekey"), - }; - var overrideOption = new Option(new string[] { "--override" }, "File containing the target database settings (usually a formatted .cfg file)") - { - Argument = new Argument("override") - }; - var serverOption = new Option(new string[] { "-s", "--server" }, "1) Name of a server for single database run or 2) source server for scripting or runtime configuration") - { - Argument = new Argument("server") - }; - var databaseOption = new Option(new string[] { "-d", "--database" }, "1) Name of a single database to run against or 2) source database for scripting or runtime configuration") - { - Argument = new Argument("database") - }; - var rootloggingpathOption = new Option(new string[] { "--rootloggingpath" }, "Directory to save execution logs (for threaded and remote executions)") - { - Argument = new Argument("rootloggingpath") - }; - var trialOption = new Option(new string[] { "--trial" }, "Whether or not to run in trial mode (default is false)") - { - Argument = new Argument("trial", () => false) - }; - var scriptsrcdirOption = new Option(new string[] { "--scriptsrcdir" }, " [Not recommended] Alternative ability to run against a directory of scripts (vs .sbm or .sbx file)") - { - Argument = new Argument("scriptsrcdir") - }; - var usernameOption = new Option(new string[] { "-u", "--username" }, "The username to authenticate against the database if not using integrate auth") - { - Argument = new Argument("username") - }; - var passwordOption = new Option(new string[] { "-p", "--password" }, "The password to authenticate against the database if not using integrate auth") - { - Argument = new Argument("password") - }; - var logtodatabasenamedOption = new Option(new string[] { "--logtodatabasename" }, "[Not recommended] Specifies that the SqlBuild_logging logs should go to an alternate database (vs. target).") - { - Argument = new Argument("logtodatabasename") - }; - var descriptionOption = new Option(new string[] { "--description" }, "Description of build (logged with build)") - { - Argument = new Argument("description") - }; - var packagenameOption = new Option(new string[] { "--packagename", "--buildfilename" }, "Name of the .sbm or .sbx file to execute") - { - Argument = new Argument("BuildFileName"), - Required = true - }; - var directoryOption = new Option(new string[] { "--directory" }, "Directory containing 1 or more SBX files to package into SBM zip files") - { - Argument = new Argument("directory"), - Required = true - }; - var transactionalOption = new Option(new string[] { "--transactional" }, "Whether or not to run with a wrapping transaction (default is true)") - { - Argument = new Argument("transactional", () => true) - }; - var timeoutretrycountOption = new Option(new string[] { "--timeoutretrycount" }, "How many retries to attempt if a timeout exception occurs") - { - Argument = new Argument("timeoutretrycount") - }; - var golddatabaseOption = new Option(new string[] { "--golddatabase" }, "The \"gold copy\" database that will serve as the model for what the target database should look like") - { - Argument = new Argument("golddatabase"), - Required = true - }; - var goldserverOption = new Option(new string[] { "--goldserver" }, "The server that the \"gold copy\" database can be found") - { - Argument = new Argument("goldserver"), - Required = true - }; - var continueonfailureOption = new Option(new string[] { "--continueonfailure" }, "Whether or not to continue on the failure of a package (default is false)") - { - Argument = new Argument("continueonfailure") - }; - var platinumdacpacOption = new Option(new string[] { "--platinumdacpac" }, "Name of the dacpac containing the platinum schema") - { - Argument = new Argument("platinumdacpac") - }; - var targetdacpacOption = new Option(new string[] { "--targetdacpac" }, "Name of the dacpac containing the schema of the database to be updated") - { - Argument = new Argument("targetdacpac") - }; - var forcecustomdacpacOption = new Option(new string[] { "--forcecustomdacpac" }, "USE WITH CAUTION! This will force the dacpac extraction and creation of custom scripts for EVERY target database! Your execution will take much longer.") - { - Argument = new Argument("forcecustomdacpac") - }; - var platinumdbsourceOption = new Option(new string[] { "--platinumdbsource" }, "Instead of a formally built Platinum Dacpac, target this database as having the desired state schema") - { - Argument = new Argument("platinumdbsource") - }; - var platinumserversourceOption = new Option(new string[] { "--platinumserversource" }, "Instead of a formally built Platinum Dacpac, target a database on this server as having the desired state schema") - { - Argument = new Argument("platinumserversource") - }; - var buildrevisionOption = new Option(new string[] { "--buildrevision" }, "If provided, the build will include an update to a \"Versions\" table and this will be the value used to add to a \"VersionNumber\" column (varchar(max))") - { - Argument = new Argument("buildrevision") - }; - var outputsbmOption = new Option(new string[] { "--outputsbm" }, "Name (and path) of the SBM package to create") - { - Argument = new Argument("outputsbm") - }; - var deletebatchpoolOption = new Option(new string[] { "--deletebatchpool" }, "Whether or not to delete the batch pool servers after an execution") - { - Argument = new Argument("deletebatchpool", () => false) - }; - var deletebatchjobOption = new Option(new string[] { "--deletebatchjob" }, "Whether or not to delete the batch job after an execution") - { - Argument = new Argument("deletebatchjob", () => false) - }; - var batchnodecountOption = new Option(new string[] { "--nodecount", "--batchnodecount" }, "Number of nodes to provision to run the batch job") - { - Argument = new Argument("batchnodecount") - }; - var batchjobnameOption = new Option(new string[] { "--jobname", "--batchjobname" }, "User friendly name for the job. This will also be the container name for the stored logs. Any disallowed URL characters will be removed") - { - Argument = new Argument("batchjobname") - }; - var batchaccountnameOption = new Option(new string[] { "--batchaccountname" }, "String name of the Azure Batch account") - { - Argument = new Argument("batchaccountname") - }; - var batchaccountkeyOption = new Option(new string[] { "--batchaccountkey" }, "Account Key for the Azure Batch account") - { - Argument = new Argument("batchaccountkey") - }; - var batchaccounturlOption = new Option(new string[] { "--batchaccounturl" }, "URL for the Azure Batch account") - { - Argument = new Argument("batchaccounturl") - }; - var storageaccountnameOption = new Option(new string[] { "--storageaccountname" }, "Name of storage account associated with the Azure Batch account") - { - Argument = new Argument("storageaccountname") - }; - var storageaccountkeyOption = new Option(new string[] { "--storageaccountkey" }, "Account Key for the storage account") - { - Argument = new Argument("storageaccountkey") - }; - var batchvmsizeOption = new Option(new string[] { "--vmsize", "--batchvmsize" }, "Size key for VM size required (see https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sizes-general) ") - { - Argument = new Argument("batchvmsize") - }; - var batchpoolnameOption = new Option(new string[] { "--poolname", "--batchpoolname" }, "Override for the default pool name of \"SqlBuildManagerPool\"") - { - Argument = new Argument("batchpoolname") - }; - var batchpoolOsOption = new Option(new string[] { "--os", "--batchpoolos" }, "Operating system for the Azure Batch nodes. Windows is default") - { - Argument = new Argument("batchpoolos") - }; - var batchApplicationOption = new Option(new string[] { "--apppackage", "--applicationpackage" }, "The Azure Batch application package name. (Default is 'SqlBuildManagerWindows' for Windows and 'SqlBuildManagerLinux' for Linux") - { - Argument = new Argument("applicationpackage") - }; - var eventhubconnectionOption = new Option(new string[] { "--eventhubconnection" }, "Event Hub connection string for Event Hub logging of batch execution") - { - Argument = new Argument("eventhubconnection") - }; - var serviceBusconnectionOption = new Option(new string[] { "--servicebustopicconnection" }, "Service Bus connection string for Service Bus topic distribution of batch execution") - { - Argument = new Argument("servicebustopicconnection") - }; - var pollbatchpoolstatusOption = new Option(new string[] { "--pollbatchpoolstatus" }, "Whether or not you want to get updated status (true) or fire and forget (false)") - { - Argument = new Argument("pollbatchpoolstatus") - }; - var defaultscripttimeoutOption = new Option(new string[] { "--defaultscripttimeout" }, "Override the default script timeouts set when creating a DACPAC") - { - Argument = new Argument("defaultscripttimeout") - }; - var authtypeOption = new Option(new string[] { "--authtype" }, "SQL Authentication type to use.") - { - Argument = new Argument("AuthenticationType"), - Name = "AuthenticationType" - }; - var silentOption = new Option(new string[] { "--silent" }, "Suppresses overwrite prompt if file already exists") - { - Argument = new Argument("silent", () => false) - }; - var outputcontainersasurlOption = new Option(new string[] { "--outputcontainersasurl" }, "[Internal only] Runtime storage SAS url (auto-generated from `sbm batch run` command") - { - Argument = new Argument("outputcontainersasurl") - }; - var dacpacOutputOption = new Option(new string[] { "--dacpacname" }, "Name of the dacpac that you want to create") - { - Argument = new Argument("dacpacname"), - Required = true - }; - var cleartextOption = new Option(new string[] { "--cleartext" }, "Flag to save settings file in clear text (vs. encrypted)") - { - Argument = new Argument("cleartext", () => false) - }; - var queryFileOption = new Option(new string[] { "--queryfile" }, "File containing the SELECT query to run across the databases") - { - Argument = new Argument("queryfile").ExistingOnly() - }; - var outputFileOption = new Option(new string[] { "--outputfile" }, "Results output file to create") - { - Argument = new Argument("outputfile") - }; - var threadedConcurrencyOption = new Option(new string[] { "--concurrency" }, "Maximum concurrency for threaded executions") - { - Argument = new Argument("concurrency") - }; - var threadedConcurrencyTypeOption = new Option(new string[] { "--concurrencytype" }, "Type of concurrency, used in conjunction with --concurrency ") - { - Argument = new Argument("concurrencytype") - }; - var logLevelOption = new Option(new string[] { "--loglevel" }, "Logging level for console and log file") - { - Argument = new Argument("loglevel") - }; + var settingsfileOption = new Option(new string[] { "--settingsfile" }, "Saved settings file to load parameters from") { Name = "FileInfoSettingsFile" }.ExistingOnly(); + var settingsfileNewOption = new Option(new string[] { "--settingsfile" }, "Saved settings file to load parameters from") { Name = "FileInfoSettingsFile" }; + var settingsfileKeyOption = new Option(new string[] { "--settingsfilekey" }, "Key for the encryption of sensitive informtation in the settings file (must be at least 16 characters). It can be either the key string or a file path to a key file. The key may also provided by setting a 'sbm-settingsfilekey' Environment variable. If not provided a machine value will be used."); + var overrideOption = new Option(new string[] { "--override" }, "File containing the target database settings (usually a formatted .cfg file)"); + var serverOption = new Option(new string[] { "-s", "--server" }, "1) Name of a server for single database run or 2) source server for scripting or runtime configuration"); + var databaseOption = new Option(new string[] { "-d", "--database" }, "1) Name of a single database to run against or 2) source database for scripting or runtime configuration"); + var rootloggingpathOption = new Option(new string[] { "--rootloggingpath" }, "Directory to save execution logs (for threaded and remote executions)"); + var trialOption = new Option(new string[] { "--trial" }, () => false, "Whether or not to run in trial mode (default is false)"); + var scriptsrcdirOption = new Option(new string[] { "--scriptsrcdir" }, " [Not recommended] Alternative ability to run against a directory of scripts (vs .sbm or .sbx file)"); + var usernameOption = new Option(new string[] { "-u", "--username" }, "The username to authenticate against the database if not using integrate auth"); + var passwordOption = new Option(new string[] { "-p", "--password" }, "The password to authenticate against the database if not using integrate auth"); + var logtodatabasenamedOption = new Option(new string[] { "--logtodatabasename" }, "[Not recommended] Specifies that the SqlBuild_logging logs should go to an alternate database (vs. target)."); + var descriptionOption = new Option(new string[] { "--description" }, "Description of build (logged with build)"); + var packagenameOption = new Option(new string[] { "--packagename", "--buildfilename" }, "Name of the .sbm or .sbx file to execute") { Name = "BuildFileName", IsRequired = true }; + var directoryOption = new Option(new string[] { "--directory" }, "Directory containing 1 or more SBX files to package into SBM zip files") { IsRequired = true }; + var transactionalOption = new Option(new string[] { "--transactional" }, () => true, "Whether or not to run with a wrapping transaction (default is true)"); + var timeoutretrycountOption = new Option(new string[] { "--timeoutretrycount" }, "How many retries to attempt if a timeout exception occurs"); + var golddatabaseOption = new Option(new string[] { "--golddatabase" }, "The \"gold copy\" database that will serve as the model for what the target database should look like") { IsRequired = true }; + var goldserverOption = new Option(new string[] { "--goldserver" }, "The server that the \"gold copy\" database can be found") { IsRequired = true }; + var continueonfailureOption = new Option(new string[] { "--continueonfailure" }, "Whether or not to continue on the failure of a package (default is false)"); + var platinumdacpacOption = new Option(new string[] { "--platinumdacpac" }, "Name of the dacpac containing the platinum schema"); + var targetdacpacOption = new Option(new string[] { "--targetdacpac" }, "Name of the dacpac containing the schema of the database to be updated"); + var forcecustomdacpacOption = new Option(new string[] { "--forcecustomdacpac" }, "USE WITH CAUTION! This will force the dacpac extraction and creation of custom scripts for EVERY target database! Your execution will take much longer."); + var platinumdbsourceOption = new Option(new string[] { "--platinumdbsource" }, "Instead of a formally built Platinum Dacpac, target this database as having the desired state schema"); + var platinumserversourceOption = new Option(new string[] { "--platinumserversource" }, "Instead of a formally built Platinum Dacpac, target a database on this server as having the desired state schema"); + var buildrevisionOption = new Option(new string[] { "--buildrevision" }, "If provided, the build will include an update to a \"Versions\" table and this will be the value used to add to a \"VersionNumber\" column (varchar(max))"); + var outputsbmOption = new Option(new string[] { "--outputsbm" }, "Name (and path) of the SBM package to create"); + var deletebatchpoolOption = new Option(new string[] { "--deletebatchpool" }, () => false, "Whether or not to delete the batch pool servers after an execution"); + var deletebatchjobOption = new Option(new string[] { "--deletebatchjob" }, () => false, "Whether or not to delete the batch job after an execution"); + var batchnodecountOption = new Option(new string[] { "--nodecount", "--batchnodecount" }, "Number of nodes to provision to run the batch job"); + var batchjobnameOption = new Option(new string[] { "--jobname", "--batchjobname" }, "User friendly name for the job. This will also be the container name for the stored logs. Any disallowed URL characters will be removed"); + var batchaccountnameOption = new Option(new string[] { "--batchaccountname" }, "String name of the Azure Batch account"); + var batchaccountkeyOption = new Option(new string[] { "--batchaccountkey" }, "Account Key for the Azure Batch account"); + var batchaccounturlOption = new Option(new string[] { "--batchaccounturl" }, "URL for the Azure Batch account"); + var storageaccountnameOption = new Option(new string[] { "--storageaccountname" }, "Name of storage account associated with the Azure Batch account"); + var storageaccountkeyOption = new Option(new string[] { "--storageaccountkey" }, "Account Key for the storage account"); + var batchvmsizeOption = new Option(new string[] { "--vmsize", "--batchvmsize" }, "Size key for VM size required (see https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sizes-general) "); + var batchpoolnameOption = new Option(new string[] { "--poolname", "--batchpoolname" }, "Override for the default pool name of \"SqlBuildManagerPool\""); + var batchpoolOsOption = new Option(new string[] { "--os", "--batchpoolos" }, "Operating system for the Azure Batch nodes. Windows is default"); + var batchApplicationOption = new Option(new string[] { "--apppackage", "--applicationpackage" }, "The Azure Batch application package name. (Default is 'SqlBuildManagerWindows' for Windows and 'SqlBuildManagerLinux' for Linux"); + var eventhubconnectionOption = new Option(new string[] { "--eventhubconnection" }, "Event Hub connection string for Event Hub logging of batch execution"); + var serviceBusconnectionOption = new Option(new string[] { "--servicebustopicconnection" }, "Service Bus connection string for Service Bus topic distribution of batch execution"); + var pollbatchpoolstatusOption = new Option(new string[] { "--pollbatchpoolstatus" }, "Whether or not you want to get updated status (true) or fire and forget (false)"); + var defaultscripttimeoutOption = new Option(new string[] { "--defaultscripttimeout" }, "Override the default script timeouts set when creating a DACPAC"); + var authtypeOption = new Option(new string[] { "--authtype" }, "SQL Authentication type to use.") { Name = "AuthenticationType" }; + var silentOption = new Option(new string[] { "--silent" }, () => false, "Suppresses overwrite prompt if file already exists"); + var outputcontainersasurlOption = new Option(new string[] { "--outputcontainersasurl" }, "[Internal only] Runtime storage SAS url (auto-generated from `sbm batch run` command"); + var dacpacOutputOption = new Option(new string[] { "--dacpacname" }, "Name of the dacpac that you want to create") { IsRequired = true }; + var cleartextOption = new Option(new string[] { "--cleartext" }, () => false, "Flag to save settings file in clear text (vs. encrypted)"); + var queryFileOption = new Option(new string[] { "--queryfile" }, "File containing the SELECT query to run across the databases").ExistingOnly(); + var outputFileOption = new Option(new string[] { "--outputfile" }, "Results output file to create"); + var threadedConcurrencyOption = new Option(new string[] { "--concurrency" }, "Maximum concurrency for threaded executions"); + var threadedConcurrencyTypeOption = new Option(new string[] { "--concurrencytype" }, "Type of concurrency, used in conjunction with --concurrency "); + var logLevelOption = new Option(new string[] { "--loglevel" }, "Logging level for console and log file"); //Create DACPAC from target database var dacpacCommand = new Command("dacpac", "Creates a DACPAC file from the target database") @@ -416,6 +244,7 @@ public static RootCommand SetUp() }; batchRunThreadedCommand.Handler = CommandHandler.Create(Program.RunThreadedExecution); + batchRunThreadedCommand.IsHidden = true; //Batch pre-stage @@ -450,6 +279,18 @@ public static RootCommand SetUp() }; batchCleanUpCommand.Handler = CommandHandler.Create(Program.RunBatchCleanUp); + //Batch delete jobs + var batchDeleteJobsCommand = new Command("deletejobs", "Delete Jobs from the Azure batch account") + { + settingsfileKeyOption, + settingsfileOption, + batchaccountnameOption, + batchaccountkeyOption, + batchaccounturlOption + }; + batchDeleteJobsCommand.IsHidden = true; + batchDeleteJobsCommand.Handler = CommandHandler.Create(Program.RunBatchJobDelete); + //Batch Save settings file var saveSettingsCommand = new Command("savesettings", "Save a settings json file for Batch arguments (see Batch documentation)") @@ -488,7 +329,7 @@ public static RootCommand SetUp() }; saveSettingsCommand.Handler = CommandHandler.Create(Program.SaveAndEncryptSettings); - var batchQueueTargetsCommand = new Command("enqueue", "Sends database override targets to Service Bus Topic") + var batchEnqueueTargetsCommand = new Command("enqueue", "Sends database override targets to Service Bus Topic") { batchjobnameOption.Copy(true), threadedConcurrencyTypeOption.Copy(true), @@ -497,20 +338,17 @@ public static RootCommand SetUp() serviceBusconnectionOption, overrideOption.Copy(true) }; - batchQueueTargetsCommand.Handler = CommandHandler.Create(Program.QueueOverrideTargets); + batchEnqueueTargetsCommand.Handler = CommandHandler.Create(Program.QueueOverrideTargets); - var batchDeQueueTargetsCommand = new Command("dequeue", "Pull database override targets to Service Bus Topic") + var batchDequeueTargetsCommand = new Command("dequeue", "Careful! Removes all messages from the Service Bue Topics and Deadletters without processing them") { - batchjobnameOption.Copy(true), - threadedConcurrencyOption.Copy(true), - threadedConcurrencyTypeOption.Copy(true), settingsfileOption, settingsfileKeyOption, - serviceBusconnectionOption, - overrideOption.Copy(true) + serviceBusconnectionOption }; - batchDeQueueTargetsCommand.Handler = CommandHandler.Create(Program.DeQueueOverrideTargets); + batchDequeueTargetsCommand.Handler = CommandHandler.Create(Program.DeQueueOverrideTargets); + //Batch query var batchQueryCommand = new Command("query", "Run a SELECT query across multiple databases using Azure Batch") { @@ -589,18 +427,21 @@ public static RootCommand SetUp() }; batchQueryThreadedCommand.Handler = CommandHandler.Create(Program.QueryDatabases); + batchQueryThreadedCommand.IsHidden = true; //Azure Batch base command var batchCommand = new Command("batch", "Commands for setting and executing a batch run or batch query"); - batchCommand.Add(batchQueueTargetsCommand); batchCommand.Add(saveSettingsCommand); batchCommand.Add(batchPreStageCommand); - batchCommand.Add(batchCleanUpCommand); + batchCommand.Add(batchEnqueueTargetsCommand); batchCommand.Add(batchRunCommand); batchCommand.Add(batchQueryCommand); + batchCommand.Add(batchCleanUpCommand); + batchCommand.Add(batchDequeueTargetsCommand); batchCommand.Add(batchRunThreadedCommand); batchCommand.Add(batchQueryThreadedCommand); - //batchCommand.Add(batchDeQueueTargetsCommand); + batchCommand.Add(batchDeleteJobsCommand); + /**************************************** @@ -693,5 +534,32 @@ public static RootCommand SetUp() return rootCommand; } + + public static (CommandLineArgs, string) ParseArgumentsWithMessage(string[] args) + { + RootCommand rootCommand = CommandLineBuilder.SetUp(); + var res = rootCommand.Parse(args); + if(res.Errors.Count > 0) + { + return (null, string.Join(System.Environment.NewLine, res.Errors.Select(e => e.Message).ToArray())); + } + var binder = new ModelBinder(typeof(CommandLineArgs)); + var bindingContext = new BindingContext(res); + var instance = (CommandLineArgs)binder.CreateInstance(bindingContext); + + return (instance, string.Empty); + } + public static CommandLineArgs ParseArguments(string[] args) + { + (CommandLineArgs cmd, string msg) = ParseArgumentsWithMessage(args); + if(cmd == null) + { + throw new System.Exception($"Unable to parse arguments: {msg}"); + } + else + { + return cmd; + } + } } } diff --git a/src/SqlBuildManager.Console/CommandLine/ConcurrencyType.cs b/src/SqlBuildManager.Console/CommandLine/ConcurrencyType.cs new file mode 100644 index 00000000..2c720549 --- /dev/null +++ b/src/SqlBuildManager.Console/CommandLine/ConcurrencyType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SqlBuildManager.Console.CommandLine +{ + + [Serializable] + public enum ConcurrencyType + { + Count, + Server, + MaxPerServer + } +} diff --git a/src/SqlBuildManager.Console/CommandLine/Cryptography.cs b/src/SqlBuildManager.Console/CommandLine/Cryptography.cs new file mode 100644 index 00000000..02636107 --- /dev/null +++ b/src/SqlBuildManager.Console/CommandLine/Cryptography.cs @@ -0,0 +1,156 @@ +using Microsoft.Extensions.Logging; +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; +using sb = SqlSync.SqlBuild; +namespace SqlBuildManager.Console.CommandLine +{ + + /// + /// http://www.codeproject.com/Articles/769741/Csharp-AES-bits-Encryption-Library-with-Salt + /// + public static class Cryptography + { + private static ILogger log = SqlBuildManager.Logging.ApplicationLogging.CreateLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + public static CommandLineArgs EncryptSensitiveFields(CommandLineArgs cmdLine) + { + //Don't double in encrypt.. + bool tmp; + (tmp,cmdLine) = DecryptSensitiveFields(cmdLine, true); + string key = GetSettingsFileEncryptionKey(cmdLine); + + if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.UserName)) + { + cmdLine.AuthenticationArgs.UserName = sb.Cryptography.EncryptText(cmdLine.AuthenticationArgs.UserName, key); + } + if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.Password)) + { + cmdLine.AuthenticationArgs.Password = sb.Cryptography.EncryptText(cmdLine.AuthenticationArgs.Password, key); + } + + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.BatchAccountKey)) + { + cmdLine.BatchArgs.BatchAccountKey = sb.Cryptography.EncryptText(cmdLine.BatchArgs.BatchAccountKey, key); + } + + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.StorageAccountKey)) + { + cmdLine.BatchArgs.StorageAccountKey = sb.Cryptography.EncryptText(cmdLine.BatchArgs.StorageAccountKey, key); + } + + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.EventHubConnectionString)) + { + cmdLine.BatchArgs.EventHubConnectionString = sb.Cryptography.EncryptText(cmdLine.BatchArgs.EventHubConnectionString, key); + } + + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.ServiceBusTopicConnectionString)) + { + cmdLine.BatchArgs.ServiceBusTopicConnectionString = sb.Cryptography.EncryptText(cmdLine.BatchArgs.ServiceBusTopicConnectionString, key); + } + + return cmdLine; + } + + public static (bool, CommandLineArgs) DecryptSensitiveFields(CommandLineArgs cmdLine, bool suppressLog = false) + { + //Nothing to do if none of the settings came from a settings file! + if(string.IsNullOrWhiteSpace(cmdLine.SettingsFile)) + { + return (true,cmdLine); + } + bool consolidated = true; + bool success; + string key = GetSettingsFileEncryptionKey(cmdLine); + + if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.UserName)) + { + (success, cmdLine.AuthenticationArgs.UserName) = sb.Cryptography.DecryptText(cmdLine.AuthenticationArgs.UserName, key, "--username", suppressLog); + consolidated = consolidated & success; + } + if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.Password)) + { + (success, cmdLine.AuthenticationArgs.Password) = sb.Cryptography.DecryptText(cmdLine.AuthenticationArgs.Password, key, "--password", suppressLog); + consolidated = consolidated & success; + } + + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.BatchAccountKey)) + { + (success, cmdLine.BatchArgs.BatchAccountKey) = sb.Cryptography.DecryptText(cmdLine.BatchArgs.BatchAccountKey, key, "--batchaccountkey", suppressLog); + consolidated = consolidated & success; + } + + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.StorageAccountKey)) + { + (success, cmdLine.BatchArgs.StorageAccountKey) = sb.Cryptography.DecryptText(cmdLine.BatchArgs.StorageAccountKey, key, "--storageaccountkey", suppressLog); + consolidated = consolidated & success; + } + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.EventHubConnectionString)) + { + (success, cmdLine.BatchArgs.EventHubConnectionString) = sb.Cryptography.DecryptText(cmdLine.BatchArgs.EventHubConnectionString, key, "--eventhubconnection", suppressLog); + consolidated = consolidated & success; + } + if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.ServiceBusTopicConnectionString)) + { + (success, cmdLine.BatchArgs.ServiceBusTopicConnectionString) = sb.Cryptography.DecryptText(cmdLine.BatchArgs.ServiceBusTopicConnectionString, key, "--servicebustopicconnection", suppressLog); + consolidated = consolidated & success; + } + + return (consolidated, cmdLine); + } + + + private static string GetSettingsFileEncryptionKey(CommandLineArgs cmdLine) + { + if (!string.IsNullOrWhiteSpace(cmdLine.SettingsFileKey)) + { + if(File.Exists(Path.GetFullPath(cmdLine.SettingsFileKey))) + { + return File.ReadAllText(cmdLine.SettingsFileKey).Trim(); + } + else + { + return cmdLine.SettingsFileKey; + } + } + + var ev = Environment.GetEnvironmentVariable(keyEnvronmentVariableName); + if (!string.IsNullOrWhiteSpace(ev)) + { + return ev; + } + + return GetDerivedKey(); + } + private static readonly string keyEnvronmentVariableName = "sbm-settingsfilekey"; + private static readonly string store = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Sql Build Manager", "sbm-store.txt"); + private static readonly string kek = "x/A?D(G+KbPeShVmYq3t6w9y$B&E)H@McQfTjWnZr4u7x!A%C*F-JaNdRgUkXp2s5v8y/B?E(G+KbPeShVmYq3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D*G-KaPdRgUkXp2s5v8y/B?E(H+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXnZr4u7x!A%D*G-KaPdSgVkYp3s5v8y/B?E(H+MbQeThWmZq4t7w9z$C&F)J@NcRfUjXn2r5u8x/A%D*G-KaP"; + private static string GetDerivedKey() + { + + + if(!File.Exists(store)) + { + SetDerivedKey(); + } + string e = File.ReadAllText(store); + (bool success,string pt) = sb.Cryptography.DecryptText(e, kek,""); + return pt; + } + private static bool SetDerivedKey() + { + string key = GenerateEncryptionKey(); + string wrapped = sb.Cryptography.EncryptText(key, kek); + File.WriteAllText(store,wrapped); + return true; + } + private static string GenerateEncryptionKey() + { + var a = Aes.Create(); + a.GenerateKey(); + var encoded = Convert.ToBase64String(a.Key); + return encoded; + } + } +} diff --git a/src/SqlBuildManager.Console/CommandLine/Extensions.cs b/src/SqlBuildManager.Console/CommandLine/Extensions.cs new file mode 100644 index 00000000..fbf90e75 --- /dev/null +++ b/src/SqlBuildManager.Console/CommandLine/Extensions.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.CommandLine; +using System.Linq; +using System.Globalization; + +namespace SqlBuildManager.Console.CommandLine +{ + public static class Extensions + { + public static string ToStringExtension(this object obj, StringType toStringType) + { + StringBuilder sb = new StringBuilder(); + foreach (System.Reflection.PropertyInfo property in obj.GetType().GetProperties()) + { + if (!property.CanRead || (property.GetValue(obj) == null || string.IsNullOrWhiteSpace(property.GetValue(obj).ToString()))) + { + continue; + } + + if (property.PropertyType == typeof(CommandLineArgs.AutoScripting) || + property.PropertyType == typeof(CommandLineArgs.StoredProcTesting) || + property.PropertyType == typeof(CommandLineArgs.Synchronize)) + { + if (property.GetValue(obj) != null && toStringType == StringType.Basic) + { + sb.Append(property.GetValue(obj).ToStringExtension(toStringType)); + } + } + else if (property.PropertyType == typeof(CommandLineArgs.Authentication) || + property.PropertyType == typeof(CommandLineArgs.DacPac) || + property.PropertyType == typeof(CommandLineArgs.Batch)) + { + if (property.GetValue(obj) != null) + { + sb.Append(property.GetValue(obj).ToStringExtension(toStringType)); + } + } + else + { + switch (property.Name) + { + case "AuthenticationType": + sb.Append("--authtype \"" + property.GetValue(obj).ToString() + "\" "); + break; + + case "SettingsFile": + if (toStringType == StringType.Basic) + { + sb.Append("--settingsfile \"" + property.GetValue(obj).ToString() + "\" "); + } + break; + + case "MultiDbRunConfigFileName": + case "ManualOverRideSets": + if ((toStringType == StringType.Batch) && + (!string.IsNullOrWhiteSpace(((CommandLineArgs)obj).BatchArgs.ServiceBusTopicConnectionString))) + { + break; + } + else + { + sb.Append("--override \"" + property.GetValue(obj).ToString() + "\" "); + } + break; + + case "BuildFileName": + sb.Append("--packagename \"" + property.GetValue(obj).ToString() + "\" "); + break; + + case "EventHubConnectionString": + sb.Append("--eventhubconnection \"" + property.GetValue(obj).ToString() + "\" "); + break; + + case "ServiceBusTopicConnectionString": + sb.Append("--servicebustopicconnection \"" + property.GetValue(obj).ToString() + "\" "); + break; + + case "OverrideDesignated": + case "CliVersion": + case "WhatIf": + case "LogLevel": + case "SettingsFileKey": + //ignore these + break; + + default: + if (property.PropertyType == typeof(bool)) + { + if (property.Name == "PollBatchPoolStatus" && (toStringType == StringType.Batch)) + { + continue; + } + if (bool.Parse(property.GetValue(obj).ToString()) == true) //ignore anything not set + { + sb.Append("--" + property.Name.ToLower() + " true "); + } + } + else if (property.PropertyType == typeof(string)) + { + sb.Append("--" + property.Name.ToLower() + " \"" + property.GetValue(obj).ToString() + "\" "); + } + else + { + double num; + if (double.TryParse(property.GetValue(obj).ToString(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out num)) + { + sb.Append("--" + property.Name.ToLower() + " " + property.GetValue(obj).ToString() + " "); + } + else + { + sb.Append("--" + property.Name.ToLower() + " \"" + property.GetValue(obj).ToString() + "\" "); + } + } + break; + } + + } + + } + return sb.ToString(); + } + + public static Option Copy(this Option opt, bool required) + { + var aliases = opt.Aliases.ToArray(); + Option newOpt = new Option(aliases, opt.Description); + newOpt.Name = opt.Name; + newOpt.IsRequired = required; + + return newOpt; + } + } +} diff --git a/src/SqlBuildManager.Console/CommandLine/OsType.cs b/src/SqlBuildManager.Console/CommandLine/OsType.cs new file mode 100644 index 00000000..bfe431f2 --- /dev/null +++ b/src/SqlBuildManager.Console/CommandLine/OsType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SqlBuildManager.Console.CommandLine +{ + [Serializable] + public enum OsType + { + Windows, + Linux + } +} diff --git a/src/SqlBuildManager.Console/CommandLine/StringType.cs b/src/SqlBuildManager.Console/CommandLine/StringType.cs new file mode 100644 index 00000000..93948b0e --- /dev/null +++ b/src/SqlBuildManager.Console/CommandLine/StringType.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SqlBuildManager.Console.CommandLine +{ + public enum StringType + { + Batch, + Basic + } +} diff --git a/src/SqlBuildManager.Console/CommandLineExtension.cs b/src/SqlBuildManager.Console/CommandLineExtension.cs deleted file mode 100644 index 0d18e504..00000000 --- a/src/SqlBuildManager.Console/CommandLineExtension.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Text; -using System.CommandLine; -using System.Linq; - -namespace SqlBuildManager.Console -{ - public static class CommandLineExtension - { - public static Option Copy(this Option opt, bool required) - { - Option newOpt = new Option(opt.RawAliases.ToArray(), opt.Description); - newOpt.Argument = opt.Argument; - newOpt.Name = opt.Name; - newOpt.Required = required; - - return newOpt; - } - } -} diff --git a/src/SqlBuildManager.Console/Dockerfile b/src/SqlBuildManager.Console/Dockerfile index ee513b0c..b5356e05 100644 --- a/src/SqlBuildManager.Console/Dockerfile +++ b/src/SqlBuildManager.Console/Dockerfile @@ -2,4 +2,4 @@ FROM microsoft/dotnet-framework:4.7.1-windowsservercore-ltsc2016 ARG source WORKDIR /app COPY ${source:-obj/Docker/publish} . -ENTRYPOINT ["C:\\app\\SqlBuildManager.Console.exe"] +ENTRYPOINT ["C:\\app\sbm.exe"] diff --git a/src/SqlBuildManager.Console/Program.cs b/src/SqlBuildManager.Console/Program.cs index 46da1248..8486c6a3 100644 --- a/src/SqlBuildManager.Console/Program.cs +++ b/src/SqlBuildManager.Console/Program.cs @@ -2,11 +2,12 @@ using Azure.Storage.Blobs.Specialized; using Microsoft.Extensions.Logging; using Newtonsoft.Json; +using SqlBuildManager.Console.CommandLine; +using SqlBuildManager.Console.Queue; using SqlBuildManager.Console.Threaded; using SqlBuildManager.Enterprise.Policy; using SqlBuildManager.Interfaces.Console; using SqlSync.Connection; -using SqlSync.SqlBuild; using SqlSync.SqlBuild.AdHocQuery; using SqlSync.SqlBuild.MultiDb; using System; @@ -16,29 +17,27 @@ using System.ComponentModel; using System.IO; using System.Linq; -using System.Reflection; using System.Threading.Tasks; -using SqlBuildManager.Console.Queue; +using sb = SqlSync.SqlBuild; namespace SqlBuildManager.Console { public class Program { - private static Microsoft.Extensions.Logging.ILogger log; - public static readonly string applicationLogFileName = "SqlBuildManager.Console.log"; + public const string applicationLogFileName = "SqlBuildManager.Console.log"; + private static Microsoft.Extensions.Logging.ILogger log = SqlBuildManager.Logging.ApplicationLogging.CreateLogger(typeof(Program), applicationLogFileName); + internal static string[] AppendLogFiles = new string[] { "commits.log", "errors.log", "successdatabases.cfg", "failuredatabases.cfg" }; static int Main(string[] args) { - log = SqlBuildManager.Logging.ApplicationLogging.CreateLogger(typeof(Program), applicationLogFileName); - var fn = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; var currentPath = Path.GetDirectoryName(fn); log.LogDebug("Received Command: " + String.Join(" | ", args)); - RootCommand rootCommand = CommandLineConfig.SetUp(); + RootCommand rootCommand = CommandLineBuilder.SetUp(); try { @@ -156,6 +155,28 @@ internal static int RunBatchCleanUp(CommandLineArgs cmdLine) return retVal; } + internal static int RunBatchJobDelete(CommandLineArgs cmdLine) + { + SqlBuildManager.Logging.ApplicationLogging.SetLogLevel(cmdLine.LogLevel); + + bool decryptSuccess; + (decryptSuccess, cmdLine) = Cryptography.DecryptSensitiveFields(cmdLine); + if (!decryptSuccess) + { + log.LogError("There was an error decrypting one or more value from the --settingsfile. Please check that you are using the correct --settingsfilekey value"); + return -8675; + } + + DateTime start = DateTime.Now; + var retVal = Batch.BatchCleaner.DeleteAllCompletedJobs(cmdLine); + + TimeSpan span = DateTime.Now - start; + string msg = "Total Run time: " + span.ToString(); + log.LogInformation(msg); + + return retVal; + } + internal static int RunBatchPreStage(CommandLineArgs cmdLine) { SqlBuildManager.Logging.ApplicationLogging.SetLogLevel(cmdLine.LogLevel); @@ -397,8 +418,8 @@ internal static void ScriptExtraction(CommandLineArgs cmdLine) string name; cmdLine.RootLoggingPath = Path.GetDirectoryName(cmdLine.OutputSbm); - var status = DacPacHelper.GetSbmFromDacPac(cmdLine, new SqlSync.SqlBuild.MultiDb.MultiDbData(), out name); - if (status == DacpacDeltasStatus.Success) + var status = Program.GetSbmFromDacPac(cmdLine, new SqlSync.SqlBuild.MultiDb.MultiDbData(), out name); + if (status == sb.DacpacDeltasStatus.Success) { File.Move(name, cmdLine.OutputSbm); log.LogInformation($"SBM package successfully created at {cmdLine.OutputSbm}"); @@ -430,7 +451,7 @@ internal static int RunLocalBuildAsync(CommandLineArgs cmdLine) //We need an override setting. if not provided, we need to glean it from the SqlSyncBuildProject.xml file if (string.IsNullOrWhiteSpace(cmdLine.ManualOverRideSets) && !string.IsNullOrWhiteSpace(cmdLine.BuildFileName)) { - cmdLine.ManualOverRideSets = SqlBuildFileHelper.InferOverridesFromPackage(cmdLine.BuildFileName); + cmdLine.ManualOverRideSets = sb.SqlBuildFileHelper.InferOverridesFromPackage(cmdLine.BuildFileName); } var ovrRide = $"{cmdLine.Server}:{cmdLine.ManualOverRideSets}"; @@ -475,8 +496,7 @@ internal static int RunThreadedExecution(CommandLineArgs cmdLine) DateTime start = DateTime.Now; log.LogDebug("Entering Threaded Execution"); log.LogDebug(cmdLine.ToStringExtension(StringType.Basic)); - log.LogDebug(cmdLine.ToStringExtension(StringType.BatchQuery)); - log.LogDebug(cmdLine.ToStringExtension(StringType.BatchThreaded)); + log.LogDebug(cmdLine.ToStringExtension(StringType.Batch)); log.LogInformation("Running Threaded Execution..."); ThreadedExecution runner = new ThreadedExecution(cmdLine); int retVal = runner.Execute(); @@ -601,7 +621,7 @@ internal static int CreateDacpac(CommandLineArgs cmdLine) Directory.CreateDirectory(path); } - if (!DacPacHelper.ExtractDacPac(cmdLine.Database, cmdLine.Server, cmdLine.AuthenticationArgs.UserName, cmdLine.AuthenticationArgs.Password, fullName)) + if (!sb.DacPacHelper.ExtractDacPac(cmdLine.Database, cmdLine.Server, cmdLine.AuthenticationArgs.UserName, cmdLine.AuthenticationArgs.Password, fullName)) { log.LogError($"Error creating the dacpac from {cmdLine.Server} : {cmdLine.Database}"); return (int)ExecutionReturn.BuildFileExtractionError; @@ -693,7 +713,7 @@ internal static void GetPackageHash(CommandLineArgs cmdLine) } string packageName = cmdLine.BuildFileName; - string hash = SqlBuildFileHelper.CalculateSha1HashFromPackage(packageName); + string hash = sb.SqlBuildFileHelper.CalculateSha1HashFromPackage(packageName); if (!String.IsNullOrEmpty(hash)) { log.LogInformation(hash); @@ -767,7 +787,7 @@ internal static void PackageSbxFilesIntoSbmFiles(CommandLineArgs cmdLine) } string directory = cmdLine.Directory; string message; - List sbmFiles = SqlBuildFileHelper.PackageSbxFilesIntoSbmFiles(directory, out message); + List sbmFiles = sb.SqlBuildFileHelper.PackageSbxFilesIntoSbmFiles(directory, out message); if (sbmFiles.Count > 0) { foreach (string sbm in sbmFiles) @@ -791,7 +811,7 @@ internal async static Task QueueOverrideTargets(CommandLineArgs cmdLine) log = SqlBuildManager.Logging.ApplicationLogging.CreateLogger(typeof(Program), applicationLogFileName); log = SqlBuildManager.Logging.ApplicationLogging.CreateLogger(typeof(Program), applicationLogFileName, cmdLine.RootLoggingPath); SqlBuildManager.Logging.ApplicationLogging.SetLogLevel(cmdLine.LogLevel); - + var start = DateTime.Now; bool decryptSuccess; (decryptSuccess, cmdLine) = Cryptography.DecryptSensitiveFields(cmdLine); if (!decryptSuccess) @@ -821,7 +841,13 @@ internal async static Task QueueOverrideTargets(CommandLineArgs cmdLine) log.LogInformation("Sending database targets to Service Bus"); var qManager = new QueueManager(cmdLine.BatchArgs.ServiceBusTopicConnectionString, cmdLine.BatchArgs.BatchJobName); int messages = await qManager.SendTargetsToQueue(multiData, cmdLine.ConcurrencyType); - if(messages > 0) + + + TimeSpan span = DateTime.Now - start; + msg = "Total Run time: " + span.ToString(); + log.LogInformation(msg); + + if (messages > 0) { log.LogInformation($"Successfully sent {messages} targets to Service Bus queue"); return 0; @@ -836,7 +862,7 @@ internal async static Task QueueOverrideTargets(CommandLineArgs cmdLine) internal static async Task DeQueueOverrideTargets(CommandLineArgs cmdLine) { SqlBuildManager.Logging.ApplicationLogging.SetLogLevel(cmdLine.LogLevel); - + var start = DateTime.Now; bool decryptSuccess; (decryptSuccess, cmdLine) = Cryptography.DecryptSensitiveFields(cmdLine); if (!decryptSuccess) @@ -853,10 +879,14 @@ internal static async Task DeQueueOverrideTargets(CommandLineArgs cmdLine) } var qManager = new QueueManager(cmdLine.BatchArgs.ServiceBusTopicConnectionString, cmdLine.BatchArgs.BatchJobName); - bool success = await qManager.RetrieveTargetsFromQueue(); + bool success = await qManager.ClearQueueMessages(); + + TimeSpan span = DateTime.Now - start; + string msg = "Total Run time: " + span.ToString(); + log.LogInformation(msg); if (success) { - log.LogInformation("Successfully received messages to Service Bus queue"); + log.LogInformation("Successfully removed messages from Service Bus queue topics"); return 0; } else @@ -866,6 +896,36 @@ internal static async Task DeQueueOverrideTargets(CommandLineArgs cmdLine) } } + internal static sb.DacpacDeltasStatus GetSbmFromDacPac(CommandLineArgs cmd, MultiDbData multiDb, out string sbmName) + { + if (cmd.MultiDbRunConfigFileName.Trim().ToLower().EndsWith("sql")) + { + //if we are getting the list from a SQL statement, then the database and server settings mean something different! Dont pass them in. + return sb.DacPacHelper.GetSbmFromDacPac(cmd.RootLoggingPath, + cmd.DacPacArgs.PlatinumDacpac, + cmd.DacPacArgs.TargetDacpac, + string.Empty, + string.Empty, + cmd.AuthenticationArgs.UserName, + cmd.AuthenticationArgs.Password, + cmd.BuildRevision, + cmd.DefaultScriptTimeout, + multiDb, out sbmName); + } + else + { + return sb.DacPacHelper.GetSbmFromDacPac(cmd.RootLoggingPath, + cmd.DacPacArgs.PlatinumDacpac, + cmd.DacPacArgs.TargetDacpac, + cmd.Database, + cmd.Server, + cmd.AuthenticationArgs.UserName, + cmd.AuthenticationArgs.Password, + cmd.BuildRevision, + cmd.DefaultScriptTimeout, + multiDb, out sbmName); + } + } #endregion } diff --git a/src/SqlBuildManager.Console/Queue/QueueManager.cs b/src/SqlBuildManager.Console/Queue/QueueManager.cs index f60699db..991a8e27 100644 --- a/src/SqlBuildManager.Console/Queue/QueueManager.cs +++ b/src/SqlBuildManager.Console/Queue/QueueManager.cs @@ -2,19 +2,18 @@ using Azure.Messaging.ServiceBus.Administration; using Microsoft.Extensions.Logging; using MoreLinq; +using Polly; +using SqlBuildManager.Console.CommandLine; using SqlBuildManager.Console.Threaded; using SqlSync.Connection; -using SqlSync.SqlBuild; using SqlSync.SqlBuild.MultiDb; using System; using System.Collections.Generic; -using System.Text.Json; -using System.Threading.Tasks; -using Polly; using System.Linq; using System.Text; +using System.Text.Json; using System.Threading; - +using System.Threading.Tasks; namespace SqlBuildManager.Console.Queue { public class QueueManager : IDisposable @@ -32,6 +31,7 @@ public class QueueManager : IDisposable private ServiceBusAdministrationClient _adminClient = null; private ServiceBusSessionReceiver _sessionReceiver = null; private ServiceBusReceiver _messageReceiver = null; + private CancellationTokenSource tokenSource = null; public QueueManager(string topicConnectionString, string batchJobName) @@ -178,8 +178,6 @@ private async Task> GetCountBasedTargetsFromQueu } return lstMsg; } - - private async Task> GetSessionBasedTargetsFromQueue(int maxMessages, bool resetSession, int retry = 0) { var lstMsg = new List(); @@ -191,14 +189,15 @@ private async Task> GetSessionBasedTargetsFromQu if (_sessionReceiver == null || resetSession) { log.LogInformation("Attempting to get new queue session for next Server..."); - var token = sessionTokenSource.Token; - StartCancellationTimer(); + var token = GetCancellationToken(); try { _sessionReceiver = await this.Client.AcceptNextSessionAsync(this.topicName, this.topicSessionSubscriptionName, new ServiceBusSessionReceiverOptions() { ReceiveMode = ServiceBusReceiveMode.PeekLock }, token); + log.LogInformation($"Obtained new subscription for batch job '{batchJobName}' and subscription Id '{_sessionReceiver.SessionId}' "); } - catch(TaskCanceledException) + catch(TaskCanceledException tce) { + log.LogInformation("No session available by wait time expiration"); return lstMsg ; } } @@ -287,10 +286,14 @@ private async Task> GetSessionBasedTargetsFromQu return lstMsg; } - CancellationTokenSource sessionTokenSource = new CancellationTokenSource(); - private void StartCancellationTimer() + + private CancellationToken GetCancellationToken(int waitMs = 5000) { - sessionTokenSource.CancelAfter(5000); + tokenSource = new CancellationTokenSource(); + tokenSource.CancelAfter(waitMs); + var token = tokenSource.Token; + return token; + } public async Task CompleteMessage(ServiceBusReceivedMessage message) @@ -334,47 +337,97 @@ public async Task DeadletterMessage(ServiceBusReceivedMessage message) } - internal async Task RetrieveTargetsFromQueue() + internal async Task ClearQueueMessages() { - var receiver = this.Client.CreateReceiver(this.topicName, this.topicSubscriptionName, new ServiceBusReceiverOptions() { ReceiveMode = ServiceBusReceiveMode.PeekLock }); - - while (true) + try { - IReadOnlyList messages = await receiver.ReceiveMessagesAsync(maxMessages: 100); - if (messages.Any()) + //Clear regular messages + var subNames = new List() { this.topicSubscriptionName, $"{this.topicSubscriptionName}/$deadletterqueue", $"{this.topicSessionSubscriptionName}/$deadletterqueue" }; + foreach (var subname in subNames) { - foreach (ServiceBusReceivedMessage message in messages) + log.LogInformation($"Clearing all messages from topic '{this.topicName}' subscription '{subname}'"); + var receiver = this.Client.CreateReceiver(this.topicName, subname, new ServiceBusReceiverOptions() { ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete }); + while (true) { - if (message.Subject.ToLower().Trim() != batchJobName.ToLower().Trim()) + try { - await receiver.DeadLetterMessageAsync(message); - log.LogWarning($"Send message '{message.MessageId} to deadletter. Subject of '{message.Subject}' did not match batch job name of '{batchJobName}'"); + var token = GetCancellationToken(); + IReadOnlyList messages = await receiver.ReceiveMessagesAsync(100, new TimeSpan(0, 0, 5), token); + log.LogInformation($"Removing {messages.Count} messages from {subname}"); + if (!messages.Any()) + { + break; + } } - else + catch (TaskCanceledException) { - string msg = $"{Environment.NewLine}JobName: {message.Subject}{Environment.NewLine}{Encoding.UTF8.GetString(message.Body.ToArray())}"; - log.LogInformation(msg); - await receiver.CompleteMessageAsync(message); + log.LogInformation($"No more messages available in {subname} - by wait time expiration"); + break; } } } - else + + + //Clear session messages + log.LogInformation($"Clearing all messages from topic '{this.topicName}' subscription '{this.topicSessionSubscriptionName}'"); + while (true) { - break; + + + try + { + log.LogInformation($"Attempting to aquire topic session..."); + var token = GetCancellationToken(); + _sessionReceiver = await this.Client.AcceptNextSessionAsync(this.topicName, this.topicSessionSubscriptionName, new ServiceBusSessionReceiverOptions() { ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete }, token); + log.LogInformation($"Obtained new subscription for subscription Id '{_sessionReceiver.SessionId}' "); + } + catch (TaskCanceledException tce) + { + log.LogInformation("No more messages available - by wait time expiration"); + break; + } + catch (ServiceBusException sbe) + { + if (sbe.Reason == ServiceBusFailureReason.ServiceTimeout) + { + log.LogInformation("No more session messages available"); + break; + } + else + { + throw; + } + } + + while (true) + { + try + { + var token = GetCancellationToken(); + IReadOnlyList messages = await _sessionReceiver.ReceiveMessagesAsync(100, new TimeSpan(0, 0, 5), token); + log.LogInformation($"Removing {messages.Count} messages from {this.topicSessionSubscriptionName} session {_sessionReceiver.SessionId}"); + if (!messages.Any()) + { + break; + } + } + catch (TaskCanceledException tce) + { + log.LogInformation($"No more messages available in {this.topicSessionSubscriptionName} session {_sessionReceiver.SessionId} - by wait time expiration"); + break; + } + } } + log.LogInformation("Completed Dequeueing all messages"); } - log.LogInformation("Compelted message receive"); + catch(Exception exe) + { + log.LogError($"Problem clearing all messages: {exe.Message}"); + } + return true; } - public ServiceBusReceiver GetQueueReceiver() - { - ServiceBusClient client = new ServiceBusClient(this.topicConnectionString); - var receiver = client.CreateReceiver(this.topicName, this.topicSubscriptionName); - - - return receiver; - } private async Task RemoveDefaultFilters() diff --git a/src/SqlBuildManager.Console/Synchronize.cs b/src/SqlBuildManager.Console/Synchronize.cs index 4ef61728..b13f0449 100644 --- a/src/SqlBuildManager.Console/Synchronize.cs +++ b/src/SqlBuildManager.Console/Synchronize.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using SqlSync.SqlBuild; -using SqlSync.Connection; +using Microsoft.Extensions.Logging; +using SqlBuildManager.Console.CommandLine; using SqlSync.SqlBuild.Syncronizer; -using Microsoft.Extensions.Logging; +using System; +using System.Linq; namespace SqlBuildManager.Console { public class Synchronize @@ -33,6 +30,10 @@ public static string GetDatabaseRunHistoryTextDifference(CommandLineArgs cmdLine } public static DatabaseRunHistory GetDatabaseRunHistoryDifference(CommandLineArgs cmdLine) { + if(cmdLine == null) + { + return null; + } DatabaseDiffer differ = new DatabaseDiffer(); return differ.GetDatabaseHistoryDifference(cmdLine.SynchronizeArgs.GoldServer, cmdLine.SynchronizeArgs.GoldDatabase, cmdLine.Server, cmdLine.Database); @@ -65,25 +66,25 @@ internal static CommandLineArgs ValidateFlags(CommandLineArgs cmdLine) if (string.IsNullOrEmpty(cmdLine.SynchronizeArgs.GoldDatabase)) { - log.LogError("Missing /GoldDatabase=\"\" flag"); + log.LogError("Missing --golddatabase=\"\" flag"); return null; } if (string.IsNullOrEmpty(cmdLine.SynchronizeArgs.GoldServer)) { - log.LogError("Missing /GoldServer=\"\" flag"); + log.LogError("Missing --goldserver=\"\" flag"); return null; } if (string.IsNullOrEmpty(cmdLine.Database)) { - log.LogError("Missing /Database=\"\" flag"); + log.LogError("Missing --database=\"\" flag"); return null; } if (string.IsNullOrEmpty(cmdLine.Server)) { - log.LogError("Missing /Server=\"\" flag"); + log.LogError("Missing --server=\"\" flag"); return null; } return cmdLine; diff --git a/src/SqlBuildManager.Console/Threaded/Concurrency.cs b/src/SqlBuildManager.Console/Threaded/Concurrency.cs index 435ddf35..259eb111 100644 --- a/src/SqlBuildManager.Console/Threaded/Concurrency.cs +++ b/src/SqlBuildManager.Console/Threaded/Concurrency.cs @@ -1,12 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Text; +using MoreLinq; +using SqlBuildManager.Console.CommandLine; +using SqlSync.Connection; using SqlSync.SqlBuild; using SqlSync.SqlBuild.MultiDb; -using MoreLinq; +using System; +using System.Collections.Generic; using System.Linq; -using SqlSync.Connection; - namespace SqlBuildManager.Console.Threaded { public class Concurrency diff --git a/src/SqlBuildManager.Console/Threaded/ThreadedExecution.cs b/src/SqlBuildManager.Console/Threaded/ThreadedExecution.cs index c060179c..cb1199fa 100644 --- a/src/SqlBuildManager.Console/Threaded/ThreadedExecution.cs +++ b/src/SqlBuildManager.Console/Threaded/ThreadedExecution.cs @@ -1,4 +1,7 @@ -using Microsoft.Extensions.Logging; +using Azure.Messaging.ServiceBus; +using Microsoft.Extensions.Logging; +using SqlBuildManager.Console.CommandLine; +using SqlBuildManager.Console.Queue; using SqlBuildManager.Interfaces.Console; using SqlSync.Connection; using SqlSync.SqlBuild; @@ -6,13 +9,8 @@ using System; using System.Collections.Generic; using System.IO; -using System.Text; -using MoreLinq; using System.Linq; using System.Threading.Tasks; -using SqlBuildManager.Console.Queue; -using Azure.Messaging.ServiceBus; - namespace SqlBuildManager.Console.Threaded { public class ThreadedExecution @@ -114,13 +112,6 @@ public ThreadedExecution(CommandLineArgs cmd) { this.cmdLine = cmd; } - public ThreadedExecution(string[] args) - { - this.args = args; - - } - - /// /// Execute method that is used from a straight command-line execution @@ -132,12 +123,6 @@ public int Execute() log.LogDebug("Entering Execute method of ThreadedExecution"); string[] errorMessages; - //Parse out the command line options if needed (should only be coming from unit tests) - if (cmdLine == null) - { - cmdLine = CommandLine.ParseCommandLineArg(args); - } - //Create Threaded Run specific loggers -- these are init'd when the first logs are written var batchWorking = Environment.GetEnvironmentVariable("AZ_BATCH_TASK_WORKING_DIR"); if (!string.IsNullOrWhiteSpace(batchWorking)) //if running in Batch, set the root directory to the node working dir diff --git a/src/SqlBuildManager.Console/Threaded/ThreadedRunner.cs b/src/SqlBuildManager.Console/Threaded/ThreadedRunner.cs index 9d5ac6dd..5a38405f 100644 --- a/src/SqlBuildManager.Console/Threaded/ThreadedRunner.cs +++ b/src/SqlBuildManager.Console/Threaded/ThreadedRunner.cs @@ -1,15 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Text; -using SqlSync.SqlBuild; -using SqlSync.SqlBuild.MultiDb; -using System.IO; +using Microsoft.Extensions.Logging; +using SqlBuildManager.Console.CommandLine; +using SqlBuildManager.Interfaces.Console; using SqlSync.Connection; -using SqlSync.DbInformation; +using SqlSync.SqlBuild; +using System; +using System.Collections.Generic; using System.ComponentModel; -using SqlBuildManager.Interfaces.Console; +using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; namespace SqlBuildManager.Console.Threaded { class ThreadedRunner diff --git a/src/SqlBuildManager.Console/Validation.cs b/src/SqlBuildManager.Console/Validation.cs index 36043fbc..edadb39c 100644 --- a/src/SqlBuildManager.Console/Validation.cs +++ b/src/SqlBuildManager.Console/Validation.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; +using Microsoft.Extensions.Logging; +using SqlBuildManager.Console.CommandLine; using SqlBuildManager.Interfaces.Console; +using SqlSync.Connection; using SqlSync.SqlBuild; using SqlSync.SqlBuild.MultiDb; -using SqlSync.Connection; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; using System.Text.RegularExpressions; -using Microsoft.Extensions.Logging; namespace SqlBuildManager.Console { class Validation @@ -307,7 +307,7 @@ public static (int, CommandLineArgs) ValidateAndLoadPlatinumDacpac(CommandLineAr if (cmdLine.DacPacArgs.ForceCustomDacPac == false) { string sbmName; - var stat = DacPacHelper.GetSbmFromDacPac(cmdLine, multiDb, out sbmName); + var stat = Program.GetSbmFromDacPac(cmdLine, multiDb, out sbmName); if (stat == DacpacDeltasStatus.Success) { cmdLine.BuildFileName = sbmName; diff --git a/src/SqlBuildManager.Console/sbm.csproj b/src/SqlBuildManager.Console/sbm.csproj index 3f03b612..a3a7bb46 100644 --- a/src/SqlBuildManager.Console/sbm.csproj +++ b/src/SqlBuildManager.Console/sbm.csproj @@ -9,19 +9,8 @@ - - + @@ -48,7 +37,7 @@ - + diff --git a/src/SqlBuildManager.Logging/Configure.cs b/src/SqlBuildManager.Logging/Configure.cs index ca4a4e98..ea9f75e0 100644 --- a/src/SqlBuildManager.Logging/Configure.cs +++ b/src/SqlBuildManager.Logging/Configure.cs @@ -18,7 +18,7 @@ public static string AppDataPath public static void CloseAndFlushAllLoggers() { - Threaded.Configure.CloseAndFlushAllLoggers(); + Threaded.Configure.CloseAndFlushAllLoggers(false); ApplicationLogging.CloseAndFlush(); //Needed to make sure all files are saved and flushed diff --git a/src/SqlBuildManager.Logging/Threaded/Configure.cs b/src/SqlBuildManager.Logging/Threaded/Configure.cs index 82d4dcb8..44a2dba3 100644 --- a/src/SqlBuildManager.Logging/Threaded/Configure.cs +++ b/src/SqlBuildManager.Logging/Threaded/Configure.cs @@ -8,7 +8,7 @@ namespace SqlBuildManager.Logging.Threaded { public class Configure { - public static void CloseAndFlushAllLoggers() + public static void CloseAndFlushAllLoggers(bool wait = true) { CommitLogging.CloseAndFlush(); ErrorLogging.CloseAndFlush(); @@ -18,7 +18,10 @@ public static void CloseAndFlushAllLoggers() SuccessDatabaseLogging.CloseAndFlush(); //Needed to make sure all files are saved and flushed - Thread.Sleep(3000); + if (wait) + { + Thread.Sleep(3000); + } } } diff --git a/src/SqlBuildManager.ScriptHandling.UnitTest/CommandLine_ArgumentsTest.cs b/src/SqlBuildManager.ScriptHandling.UnitTest/CommandLine_ArgumentsTest.cs deleted file mode 100644 index ce234344..00000000 --- a/src/SqlBuildManager.ScriptHandling.UnitTest/CommandLine_ArgumentsTest.cs +++ /dev/null @@ -1,96 +0,0 @@ -using SqlSync.SqlBuild; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Specialized; - -namespace SqlBuildManager.ScriptHandling.UnitTest -{ - - - /// - ///This is a test class for CommandLine_ArgumentsTest and is intended - ///to contain all CommandLine_ArgumentsTest Unit Tests - /// - [TestClass()] - public class CommandLine_ArgumentsTest - { - - - private TestContext testContextInstance; - - /// - ///Gets or sets the test context which provides - ///information about and functionality for the current test run. - /// - public TestContext TestContext - { - get - { - return testContextInstance; - } - set - { - testContextInstance = value; - } - } - - #region Additional test attributes - // - //You can use the following additional attributes as you write your tests: - // - //Use ClassInitialize to run code before running the first test in the class - //[ClassInitialize()] - //public static void MyClassInitialize(TestContext testContext) - //{ - //} - // - //Use ClassCleanup to run code after all tests in a class have run - //[ClassCleanup()] - //public static void MyClassCleanup() - //{ - //} - // - //Use TestInitialize to run code before running each test - //[TestInitialize()] - //public void MyTestInitialize() - //{ - //} - // - //Use TestCleanup to run code after each test has run - //[TestCleanup()] - //public void MyTestCleanup() - //{ - //} - // - #endregion - - - /// - ///A test for ParseArguments - /// - [TestMethod()] - public void ParseArgumentsTest() - { - string[] Args = new string[] { "/testNoVal", "/testColon:colonValue", "/testEqual=equalValue", "/testMiddleParam","/testSpace","spaceValue","/testSpaceQuoted","\"Space Value Quoted\"","/testEqualQuoted=\"Equal Quoted\"","/testColonQuoted:\"Colon Quoted\"","/testEndParam" }; - StringDictionary actual = CommandLine.Arguments.ParseArguments(Args); - Assert.AreEqual("colonValue",actual["testColon"]); - Assert.AreEqual("true",actual["testNoVal"]); - Assert.AreEqual("equalValue",actual["testEqual"]); - Assert.AreEqual("spaceValue",actual["testSpace"]); - Assert.AreEqual("Space Value Quoted",actual["testSpaceQuoted"]); - Assert.AreEqual("Equal Quoted",actual["testEqualQuoted"]); - Assert.AreEqual("Colon Quoted",actual["testColonQuoted"]); - Assert.AreEqual("true", actual["testEndParam"]); - Assert.AreEqual("true", actual["testMiddleParam"]); - } - - /// - ///A test for Arguments Constructor - /// - [TestMethod()] - public void CommandLine_ArgumentsConstructorTest() - { - CommandLine.Arguments target = new CommandLine.Arguments(); - Assert.AreEqual(typeof(CommandLine.Arguments), target.GetType()); - } - } -} diff --git a/src/SqlSync.Compare/SqlUnifiedDiff.cs b/src/SqlSync.Compare/SqlUnifiedDiff.cs index 9f827780..c08276c6 100644 --- a/src/SqlSync.Compare/SqlUnifiedDiff.cs +++ b/src/SqlSync.Compare/SqlUnifiedDiff.cs @@ -48,8 +48,8 @@ public List GetFileContents(string basePath, List tmpLst = new List(); for (int i = 0; i < fileList.Count; i++) { - string leftFullPath = Path.Combine(basePath , fileList[i].LeftScriptRow.FileName); - string rightFullPath = Path.Combine(basePath, fileList[i].RightScriptRow.FileName); + string leftFullPath = (fileList[i].LeftScriptRow != null)? Path.Combine(basePath , fileList[i].LeftScriptRow.FileName) : ""; + string rightFullPath = (fileList[i].RightScriptRow != null) ? Path.Combine(basePath, fileList[i].RightScriptRow.FileName) : ""; if (fileList[i].LeftScriptRow != null && File.Exists(leftFullPath)) { diff --git a/src/SqlSync.ObjectScript/ObjectScriptHelper.cs b/src/SqlSync.ObjectScript/ObjectScriptHelper.cs index 363c42a2..4d16b542 100644 --- a/src/SqlSync.ObjectScript/ObjectScriptHelper.cs +++ b/src/SqlSync.ObjectScript/ObjectScriptHelper.cs @@ -58,7 +58,7 @@ public class ObjectScriptHelper public string ScriptHeader(DateTime processedDate, string objectSchemaAndName, string objectTypeDesc, bool includePermissions, bool scriptAsAlter, bool scriptPkWithTable) { string[] split = objectSchemaAndName.Split(new char[]{'.'}); - return ScriptHeader(this.ConnData.SQLServerName, this.ConnData.DatabaseName, processedDate, split[0], split[1], objectTypeDesc, System.Environment.UserName, includePermissions, scriptAsAlter, scriptPkWithTable); + return ScriptHeader(this.ConnData.SQLServerName, this.ConnData.DatabaseName, processedDate, split[0], (split.Length == 1)? "" : split[1], objectTypeDesc, System.Environment.UserName, includePermissions, scriptAsAlter, scriptPkWithTable); } public string ScriptHeader(string objectName, string schemaOwner, string objectTypeDesc, bool includePermissions, bool scriptAsAlter, bool scriptPkWithTable) { @@ -848,7 +848,7 @@ private void DeletePreExistingScriptFiles(string rootPath) System.Reflection.FieldInfo[] pathInfo = typeof(DbObjectFilePath).GetFields(); for(int x=0;x - ///This is a test class for CommandLineTest and is intended - ///to contain all CommandLineTest Unit Tests - /// - [TestClass()] - public class CommandLineTest - { - - - private TestContext testContextInstance; - - /// - ///Gets or sets the test context which provides - ///information about and functionality for the current test run. - /// - public TestContext TestContext - { - get - { - return testContextInstance; - } - set - { - testContextInstance = value; - } - } - - #region Additional test attributes - // - //You can use the following additional attributes as you write your tests: - // - //Use ClassInitialize to run code before running the first test in the class - //[ClassInitialize()] - //public static void MyClassInitialize(TestContext testContext) - //{ - //} - // - //Use ClassCleanup to run code after all tests in a class have run - //[ClassCleanup()] - //public static void MyClassCleanup() - //{ - //} - // - //Use TestInitialize to run code before running each test - //[TestInitialize()] - //public void MyTestInitialize() - //{ - //} - // - //Use TestCleanup to run code after each test has run - //[TestCleanup()] - //public void MyTestCleanup() - //{ - //} - // - #endregion - - - /// - ///A test for ParseCommandLineArg - /// - [TestMethod()] - public void ParseCommandLineArgTest() - { - string[] args = new string[]{@"C:\Program Files\McKechney.com\Sql Build Manager\SqlBuildManager.Console.exe", - "/Action=\"Build\"", - "/trial=\"True\"", - "/threaded=\"true\"", - "/username=\"UserName1\"", - "/password=\"Password1\"", - "/LogToDatabaseName=\"AltLogDb\"", - "/PackageName=\"c:\\Audit.sbm\"", - "/RootLoggingPath=\"C:\\Temp\"", - "/override=\"c:\\test.multiDb\"", - "/description=\"Just Testing\"", - "/transactional=false"}; - CommandLineArgs actual; - actual = CommandLine.ParseCommandLineArg(args); - Assert.AreEqual(true, actual.Trial); - Assert.AreEqual("UserName1", actual.AuthenticationArgs.UserName); - Assert.AreEqual("Password1", actual.AuthenticationArgs.Password); - Assert.AreEqual("AltLogDb", actual.LogToDatabaseName); - Assert.AreEqual("c:\\Audit.sbm", actual.BuildFileName); - Assert.AreEqual("C:\\Temp", actual.RootLoggingPath); - Assert.AreEqual(true, actual.OverrideDesignated); - Assert.AreEqual("c:\\test.multiDb", actual.MultiDbRunConfigFileName); - Assert.AreEqual("Just Testing", actual.Description); - Assert.AreEqual(false, actual.Transactional); - Assert.AreEqual(CommandLineArgs.ActionType.Build, actual.Action); - } - - /// - ///A test for ParseCommandLineArg - /// - [TestMethod()] - public void ParseCommandLineArgTest_Alternate() - { - string[] args = new string[]{@"C:\Program Files\McKechney.com\Sql Build Manager\SqlBuildManager.Console.exe", - "/threaded=\"true\"", - "/LogToDatabaseName=\"AltLogDb\"", - "/scriptsrcdir=\"C:\\Temp\"", - "/server=\"MyServer\"", - "/database=\"MyDatabase\"", - "/description=\"Just Testing\""}; - CommandLineArgs actual; - actual = CommandLine.ParseCommandLineArg(args); - Assert.AreEqual(false, actual.Trial); - Assert.AreEqual("MyServer", actual.Server); - Assert.AreEqual("MyDatabase", actual.Database); - Assert.AreEqual("AltLogDb", actual.LogToDatabaseName); - Assert.AreEqual(false, actual.OverrideDesignated); - Assert.AreEqual("Just Testing", actual.Description); - Assert.AreEqual(true, actual.Transactional); - Assert.AreEqual(false, actual.AutoScriptingArgs.AutoScriptDesignated); - Assert.AreEqual(false, actual.StoredProcTestingArgs.SprocTestDesignated); - } - - /// - ///A test for ParseCommandLineArg - /// - [TestMethod()] - public void ParseCommandLineArgTest_AutoScript() - { - string[] args = new string[]{@"C:\Program Files\McKechney.com\Sql Build Manager\SqlBuildManager.Console.exe", - "/auto=\"C:\test.sqlauto\""}; - CommandLineArgs actual; - actual = CommandLine.ParseCommandLineArg(args); - Assert.AreEqual(true, actual.AutoScriptingArgs.AutoScriptDesignated); - Assert.AreEqual("C:\test.sqlauto", actual.AutoScriptingArgs.AutoScriptFileName); - } - - /// - ///A test for CommandLine Constructor - /// - [TestMethod()] - public void CommandLineConstructorTest() - { - CommandLine target = new CommandLine(); - Assert.AreEqual(typeof(CommandLine), target.GetType()); - } - } -} diff --git a/src/SqlSync.SqlBuild/CommandLine.cs b/src/SqlSync.SqlBuild/CommandLine.cs deleted file mode 100644 index 0cb777c5..00000000 --- a/src/SqlSync.SqlBuild/CommandLine.cs +++ /dev/null @@ -1,401 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Collections.Specialized; -using System.Text.RegularExpressions; -using System.Configuration; -using System.IO; -using Microsoft.Extensions.Logging; -using System.Reflection; -using Newtonsoft.Json; - -namespace SqlSync.SqlBuild -{ - public class CommandLine - { - private static ILogger log = SqlBuildManager.Logging.ApplicationLogging.CreateLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - /// - /// Parses out the command line arguments array and populates a CommandLineArgs object - /// - /// command line arguments array - /// Populated CommandLineArgs object - public static CommandLineArgs ParseCommandLineArg(string[] args) - { - CommandLineArgs cmdLine = new CommandLineArgs(); - - StringDictionary dict = Arguments.ParseArguments(args); - - CommandLineArgs.ActionType actionType = CommandLineArgs.ActionType.Error; - if (dict.ContainsKey("action")) - { - try - { - actionType = (CommandLineArgs.ActionType)Enum.Parse(typeof(CommandLineArgs.ActionType), dict["action"].ToString(), true); - cmdLine.Action = actionType; - }catch - { - cmdLine.Action = CommandLineArgs.ActionType.Error; - } - } - - //Configure from the settings file first if applicable. These would then get overwritten by the command-line args if duplicated - if (dict.ContainsKey("settingsfile") && actionType != CommandLineArgs.ActionType.SaveSettings) - { - string settings = dict["settingsfile"]; - if (!File.Exists(settings)) - { - log.LogError($"The specified Settings file (--settingsfile) does not exist at '{settings}'."); - } - else - { - try - { - cmdLine = JsonConvert.DeserializeObject(File.ReadAllText(settings)); - bool success; - (success, cmdLine) = Cryptography.DecryptSensitiveFields(cmdLine); - - } - catch (Exception exe) - { - log.LogError($"Unable to deserialize the specified Settings File at '{settings}'.\r\n{exe.Message}"); - } - } - } - //reset it, just in case. - cmdLine.Action = actionType; - - switch (cmdLine.Action) - { - case CommandLineArgs.ActionType.Threaded: - break; - case CommandLineArgs.ActionType.Package: - break; - case CommandLineArgs.ActionType.PolicyCheck: - break; - case CommandLineArgs.ActionType.GetHash: - break; - case CommandLineArgs.ActionType.CreateBackout: - break; - case CommandLineArgs.ActionType.GetDifference: - break; - case CommandLineArgs.ActionType.Synchronize: - break; - case CommandLineArgs.ActionType.Build: - cmdLine.BuildFileName = dict["packagename"]; - break; - default: - - break; - - } - - if (dict.ContainsKey("override")) - { - cmdLine.OverrideDesignated = true; - if (dict["override"].ToLower().Trim().EndsWith(".multidb") || dict["override"].ToLower().Trim().EndsWith(".cfg") || dict["override"].ToLower().EndsWith("multidbq") || dict["override"].ToLower().EndsWith(".sql")) - cmdLine.MultiDbRunConfigFileName = dict["override"]; - else - cmdLine.ManualOverRideSets = dict["override"]; - } - - if (dict.ContainsKey("auto")) - { - cmdLine.AutoScriptingArgs.AutoScriptDesignated = true; - cmdLine.AutoScriptingArgs.AutoScriptFileName = dict["auto"]; - } - - if (dict.ContainsKey("server")) - cmdLine.Server = dict["server"]; - - //if (dict.ContainsKey("log")) - // cmdLine.LogFileName = dict["log"]; - - //if (dict.ContainsKey("test")) - //{ - // cmdLine.StoredProcTestingArgs.SprocTestDesignated = true; - // cmdLine.StoredProcTestingArgs.SpTestFile = dict["test"]; - //} - - if (dict.ContainsKey("database")) - cmdLine.Database = dict["database"]; - - //if (dict.ContainsKey("scriptlogfile")) - // cmdLine.ScriptLogFileName = dict["scriptlogfile"]; - - if (dict.ContainsKey("rootloggingpath")) - cmdLine.RootLoggingPath = dict["rootloggingpath"].Trim(); - - bool trial; - if (dict.ContainsKey("trial") && Boolean.TryParse(dict["trial"], out trial)) - { - cmdLine.Trial = trial; - } - - if (dict.ContainsKey("scriptsrcdir")) - cmdLine.ScriptSrcDir = dict["scriptsrcdir"]; - - if (dict.ContainsKey("username")) - cmdLine.AuthenticationArgs.UserName = dict["username"]; - - if (dict.ContainsKey("password")) - cmdLine.AuthenticationArgs.Password = dict["password"]; - - if (dict.ContainsKey("logtodatabasename")) - cmdLine.LogToDatabaseName = dict["logtodatabasename"]; - - if (dict.ContainsKey("description")) - cmdLine.Description = dict["description"]; - - if (dict.ContainsKey("packagename")) - { - cmdLine.BuildFileName = dict["packagename"]; - } - - if (dict.ContainsKey("directory")) - cmdLine.Directory = dict["directory"]; - - bool isTrans; - if (dict.ContainsKey("transactional") && Boolean.TryParse(dict["transactional"], out isTrans)) - { - cmdLine.Transactional = isTrans; - } - - int allowableTimeoutRetries = 0; - if(dict.ContainsKey("timeoutretrycount")) - { - if(int.TryParse(dict["timeoutretrycount"],out allowableTimeoutRetries)) - cmdLine.TimeoutRetryCount = allowableTimeoutRetries; - } - - if (dict.ContainsKey("golddatabase")) - cmdLine.SynchronizeArgs.GoldDatabase = dict["golddatabase"]; - - - if (dict.ContainsKey("goldserver")) - cmdLine.SynchronizeArgs.GoldServer = dict["goldserver"]; - - bool cont; - if (dict.ContainsKey("continueonfailure") && Boolean.TryParse(dict["continueonfailure"], out cont)) - cmdLine.ContinueOnFailure = cont; - - if (dict.ContainsKey("platinumdacpac")) - cmdLine.DacPacArgs.PlatinumDacpac = dict["platinumdacpac"]; - - if (dict.ContainsKey("targetdacpac")) - cmdLine.DacPacArgs.TargetDacpac = dict["targetdacpac"]; - - bool forceCustom; - if (dict.ContainsKey("forcecustomdacpac") && Boolean.TryParse(dict["forcecustomdacpac"], out forceCustom)) - cmdLine.DacPacArgs.ForceCustomDacPac = forceCustom; - - if (dict.ContainsKey("platinumdbsource")) - cmdLine.DacPacArgs.PlatinumDbSource = dict["platinumdbsource"]; - - if (dict.ContainsKey("platinumserversource")) - cmdLine.DacPacArgs.PlatinumServerSource = dict["platinumserversource"]; - - if (dict.ContainsKey("buildrevision")) - cmdLine.BuildRevision = dict["buildrevision"]; - - if (dict.ContainsKey("outputsbm")) - cmdLine.OutputSbm = dict["outputsbm"]; - - - if (dict.ContainsKey("outputcontainersasurl")) - cmdLine.BatchArgs.OutputContainerSasUrl = dict["outputcontainersasurl"]; - - bool del; - if (dict.ContainsKey("deletebatchpool") && Boolean.TryParse(dict["deletebatchpool"], out del)) - { - cmdLine.BatchArgs.DeleteBatchPool = del; - } - bool delJob; - if (dict.ContainsKey("deletebatchjob") && Boolean.TryParse(dict["deletebatchjob"], out delJob)) - { - cmdLine.BatchArgs.DeleteBatchJob = delJob; - } - - int node; - if (dict.ContainsKey("batchnodecount") && Int32.TryParse(dict["batchnodecount"], out node)) - { - cmdLine.BatchArgs.BatchNodeCount = node; - } - - if (dict.ContainsKey("batchjobname")) - cmdLine.BatchArgs.BatchJobName = dict["batchjobname"]; - - if (dict.ContainsKey("batchaccountname")) - cmdLine.BatchArgs.BatchAccountName = dict["batchaccountname"]; - - if (dict.ContainsKey("batchaccountkey")) - cmdLine.BatchArgs.BatchAccountKey = dict["batchaccountkey"]; - - if (dict.ContainsKey("batchaccounturl")) - cmdLine.BatchArgs.BatchAccountUrl = dict["batchaccounturl"]; - - if (dict.ContainsKey("storageaccountname")) - cmdLine.BatchArgs.StorageAccountName = dict["storageaccountname"]; - - if (dict.ContainsKey("storageaccountkey")) - cmdLine.BatchArgs.StorageAccountKey = dict["storageaccountkey"]; - - if (dict.ContainsKey("batchvmsize")) - cmdLine.BatchArgs.BatchVmSize = dict["batchvmsize"]; - - if (dict.ContainsKey("batchpoolname")) - cmdLine.BatchArgs.BatchPoolName = dict["batchpoolname"]; - - if (dict.ContainsKey("settingsfile")) - cmdLine.SettingsFile = dict["settingsfile"]; - - if (dict.ContainsKey("eventhubconnection")) - cmdLine.BatchArgs.EventHubConnectionString = dict["eventhubconnection"]; - - int concurrency; - if (dict.ContainsKey("concurrency") && int.TryParse(dict["concurrency"], out concurrency)) - { - cmdLine.Concurrency = concurrency; - } - - object cType; - if (dict.ContainsKey("concurrencytype") && Enum.TryParse(typeof(ConcurrencyType), dict["concurrencytype"], out cType)) - { - cmdLine.ConcurrencyType = (ConcurrencyType)cType; - } - bool poll = true; - if(dict.ContainsKey("pollbatchpoolstatus") && Boolean.TryParse(dict["pollbatchpoolstatus"], out poll)) - { - cmdLine.BatchArgs.PollBatchPoolStatus = poll; - } - - if (String.IsNullOrEmpty(cmdLine.BatchArgs.BatchVmSize)) - cmdLine.BatchArgs.BatchVmSize = ConfigurationManager.AppSettings["BatchVmSize"]; - - int defaultTimeout = 500; - if (dict.ContainsKey("defaultscripttimeout") && int.TryParse(dict["defaultscripttimeout"], out defaultTimeout)) - { - cmdLine.DefaultScriptTimeout = defaultTimeout; - } - - if (dict.ContainsKey("authtype")) - { - switch(dict["authtype"].ToLower()) - { - case "windows": - cmdLine.AuthenticationArgs.AuthenticationType = Connection.AuthenticationType.Windows; - break; - case "azureadintegrated": - cmdLine.AuthenticationArgs.AuthenticationType = Connection.AuthenticationType.AzureADIntegrated; - break; - case "azureadpassword": - cmdLine.AuthenticationArgs.AuthenticationType = Connection.AuthenticationType.AzureADPassword; - break; - case "password": - default: - cmdLine.AuthenticationArgs.AuthenticationType = Connection.AuthenticationType.Password; - break; - } - } - else - { - if(!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.Password) && !string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.UserName)) - { - cmdLine.AuthenticationArgs.AuthenticationType = Connection.AuthenticationType.Password; - } - else - { - cmdLine.AuthenticationArgs.AuthenticationType = Connection.AuthenticationType.Windows; - } - } - - return cmdLine; - } - - /// - /// Arguments class - /// /* - ///* Arguments class: application arguments interpreter - ///* - ///* Authors: R. LOPES - ///* Contributors: R. LOPES - ///* Created: 25 October 2002 - ///* Modified: 28 October 2002 - ///* - ///* Version: 1.0 - ///*/ - /// - public class Arguments - { - - - public static StringDictionary ParseArguments(string[] Args) - { - StringDictionary Parameters = new StringDictionary(); - Regex Spliter = new Regex(@"^-{1,2}|^/|=|:", RegexOptions.IgnoreCase | RegexOptions.Compiled); - Regex Remover = new Regex(@"^['""]?(.*?)['""]?$", RegexOptions.IgnoreCase | RegexOptions.Compiled); - string Parameter = null; - string[] Parts; - - // Valid parameters forms: - // {-,/,--}param{ ,=,:}((",')value(",')) - // Examples: -param1 value1 --param2 /param3:"Test-:-work" /param4=happy -param5 '--=nice=--' - foreach (string Txt in Args) - { - // Look for new parameters (-,/ or --) and a possible enclosed value (=,:) - Parts = Spliter.Split(Txt, 3); - switch (Parts.Length) - { - // Found a value (for the last parameter found (space separator)) - case 1: - if (Parameter != null) - { - if (!Parameters.ContainsKey(Parameter)) - { - Parts[0] = Remover.Replace(Parts[0], "$1"); - Parameters.Add(Parameter, Parts[0]); - } - Parameter = null; - } - // else Error: no parameter waiting for a value (skipped) - break; - // Found just a parameter - case 2: - // The last parameter is still waiting. With no value, set it to true. - if (Parameter != null) - if (!Parameters.ContainsKey(Parameter)) - Parameters.Add(Parameter, "true"); - - Parameter = Parts[1]; - break; - // Parameter with enclosed value - case 3: - // The last parameter is still waiting. With no value, set it to true. - if (Parameter != null) - { - if (!Parameters.ContainsKey(Parameter)) - Parameters.Add(Parameter, "true"); - } - Parameter = Parts[1].ToLowerInvariant(); - // Remove possible enclosing characters (",') - if (!Parameters.ContainsKey(Parameter)) - { - Parts[2] = Remover.Replace(Parts[2], "$1"); - Parameters.Add(Parameter, Parts[2]); - } - Parameter = null; - break; - } - } - // In case a parameter is still waiting - if (Parameter != null) - { - if (!Parameters.ContainsKey(Parameter)) Parameters.Add(Parameter, "true"); - } - - return Parameters; - } - - - } - } -} diff --git a/src/SqlSync.SqlBuild/Cryptography.cs b/src/SqlSync.SqlBuild/Cryptography.cs index ee495a10..20334281 100644 --- a/src/SqlSync.SqlBuild/Cryptography.cs +++ b/src/SqlSync.SqlBuild/Cryptography.cs @@ -1,15 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Security.Cryptography; +using Microsoft.Extensions.Logging; +using System; using System.IO; -using SqlSync.Connection; -using Microsoft.Extensions.Logging; +using System.Security.Cryptography; +using System.Text; namespace SqlSync.SqlBuild { - + /// /// http://www.codeproject.com/Articles/769741/Csharp-AES-bits-Encryption-Library-with-Salt /// @@ -139,143 +135,6 @@ public static String Sha256Hash(this String value) return Sb.ToString(); } - public static CommandLineArgs EncryptSensitiveFields(CommandLineArgs cmdLine) - { - //Don't double in encrypt.. - bool tmp; - (tmp,cmdLine) = DecryptSensitiveFields(cmdLine, true); - string key = GetSettingsFileEncryptionKey(cmdLine); - - if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.UserName)) - { - cmdLine.AuthenticationArgs.UserName = Cryptography.EncryptText(cmdLine.AuthenticationArgs.UserName, key); - } - if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.Password)) - { - cmdLine.AuthenticationArgs.Password = Cryptography.EncryptText(cmdLine.AuthenticationArgs.Password, key); - } - - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.BatchAccountKey)) - { - cmdLine.BatchArgs.BatchAccountKey = Cryptography.EncryptText(cmdLine.BatchArgs.BatchAccountKey, key); - } - - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.StorageAccountKey)) - { - cmdLine.BatchArgs.StorageAccountKey = Cryptography.EncryptText(cmdLine.BatchArgs.StorageAccountKey, key); - } - - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.EventHubConnectionString)) - { - cmdLine.BatchArgs.EventHubConnectionString = Cryptography.EncryptText(cmdLine.BatchArgs.EventHubConnectionString, key); - } - - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.ServiceBusTopicConnectionString)) - { - cmdLine.BatchArgs.ServiceBusTopicConnectionString = Cryptography.EncryptText(cmdLine.BatchArgs.ServiceBusTopicConnectionString, key); - } - - return cmdLine; - } - - public static (bool, CommandLineArgs) DecryptSensitiveFields(CommandLineArgs cmdLine, bool suppressLog = false) - { - //Nothing to do if none of the settings came from a settings file! - if(string.IsNullOrWhiteSpace(cmdLine.SettingsFile)) - { - return (true,cmdLine); - } - bool consolidated = true; - bool success; - string key = GetSettingsFileEncryptionKey(cmdLine); - - if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.UserName)) - { - (success, cmdLine.AuthenticationArgs.UserName) = Cryptography.DecryptText(cmdLine.AuthenticationArgs.UserName, key, "--username", suppressLog); - consolidated = consolidated & success; - } - if (!string.IsNullOrWhiteSpace(cmdLine.AuthenticationArgs.Password)) - { - (success, cmdLine.AuthenticationArgs.Password) = Cryptography.DecryptText(cmdLine.AuthenticationArgs.Password, key, "--password", suppressLog); - consolidated = consolidated & success; - } - - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.BatchAccountKey)) - { - (success, cmdLine.BatchArgs.BatchAccountKey) = Cryptography.DecryptText(cmdLine.BatchArgs.BatchAccountKey, key, "--batchaccountkey", suppressLog); - consolidated = consolidated & success; - } - - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.StorageAccountKey)) - { - (success, cmdLine.BatchArgs.StorageAccountKey) = Cryptography.DecryptText(cmdLine.BatchArgs.StorageAccountKey, key, "--storageaccountkey", suppressLog); - consolidated = consolidated & success; - } - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.EventHubConnectionString)) - { - (success, cmdLine.BatchArgs.EventHubConnectionString) = Cryptography.DecryptText(cmdLine.BatchArgs.EventHubConnectionString, key, "--eventhubconnection", suppressLog); - consolidated = consolidated & success; - } - if (!string.IsNullOrWhiteSpace(cmdLine.BatchArgs.ServiceBusTopicConnectionString)) - { - (success, cmdLine.BatchArgs.ServiceBusTopicConnectionString) = Cryptography.DecryptText(cmdLine.BatchArgs.ServiceBusTopicConnectionString, key, "--servicebustopicconnection", suppressLog); - consolidated = consolidated & success; - } - - return (consolidated, cmdLine); - } - - - private static string GetSettingsFileEncryptionKey(CommandLineArgs cmdLine) - { - if (!string.IsNullOrWhiteSpace(cmdLine.SettingsFileKey)) - { - if(File.Exists(Path.GetFullPath(cmdLine.SettingsFileKey))) - { - return File.ReadAllText(cmdLine.SettingsFileKey).Trim(); - } - else - { - return cmdLine.SettingsFileKey; - } - } - - var ev = Environment.GetEnvironmentVariable(keyEnvronmentVariableName); - if (!string.IsNullOrWhiteSpace(ev)) - { - return ev; - } - - return GetDerivedKey(); - } - private static readonly string keyEnvronmentVariableName = "sbm-settingsfilekey"; - private static readonly string store = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Sql Build Manager", "sbm-store.txt"); - private static readonly string kek = "x/A?D(G+KbPeShVmYq3t6w9y$B&E)H@McQfTjWnZr4u7x!A%C*F-JaNdRgUkXp2s5v8y/B?E(G+KbPeShVmYq3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D*G-KaPdRgUkXp2s5v8y/B?E(H+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXnZr4u7x!A%D*G-KaPdSgVkYp3s5v8y/B?E(H+MbQeThWmZq4t7w9z$C&F)J@NcRfUjXn2r5u8x/A%D*G-KaP"; - private static string GetDerivedKey() - { - - - if(!File.Exists(store)) - { - SetDerivedKey(); - } - string e = File.ReadAllText(store); - (bool success,string pt) = DecryptText(e, kek,""); - return pt; - } - private static bool SetDerivedKey() - { - string key = GenerateEncryptionKey(); - string wrapped = EncryptText(key, kek); - File.WriteAllText(store,wrapped); - return true; - } - private static string GenerateEncryptionKey() - { - var a = Aes.Create(); - a.GenerateKey(); - var encoded = Convert.ToBase64String(a.Key); - return encoded; - } + } } diff --git a/src/SqlSync.SqlBuild/DacPacHelper.cs b/src/SqlSync.SqlBuild/DacPacHelper.cs index 75371a21..8dc913ec 100644 --- a/src/SqlSync.SqlBuild/DacPacHelper.cs +++ b/src/SqlSync.SqlBuild/DacPacHelper.cs @@ -1,17 +1,13 @@ -using System; +using Microsoft.Extensions.Logging; +using Microsoft.SqlServer.Dac; +using SqlSync.SqlBuild.MultiDb; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Data.SqlClient; using System.IO; +using System.Linq; using System.Reflection; using System.Text.RegularExpressions; -using SqlSync.SqlBuild.MultiDb; -using SqlSync.SqlBuild; -using System.Runtime.InteropServices; -using Microsoft.SqlServer.Dac; -using System.Data.SqlClient; -using Microsoft.Extensions.Logging; namespace SqlSync.SqlBuild { public class DacPacHelper @@ -378,38 +374,7 @@ public static DacpacDeltasStatus GetSbmFromDacPac(string rootLoggingPath, string { return GetSbmFromDacPac(rootLoggingPath, platinumDacPac, string.Empty, database, server, username, password, buildRevision, defaultScriptTimeout, multiDb, out sbmName); } - public static DacpacDeltasStatus GetSbmFromDacPac(CommandLineArgs cmd, MultiDbData multiDb, out string sbmName) - { - - if (cmd.MultiDbRunConfigFileName.Trim().ToLower().EndsWith("sql")) - { - //if we are getting the list from a SQL statement, then the database and server settings mean something different! Dont pass them in. - return GetSbmFromDacPac(cmd.RootLoggingPath, - cmd.DacPacArgs.PlatinumDacpac, - cmd.DacPacArgs.TargetDacpac, - string.Empty, - string.Empty, - cmd.AuthenticationArgs.UserName, - cmd.AuthenticationArgs.Password, - cmd.BuildRevision, - cmd.DefaultScriptTimeout, - multiDb, out sbmName); - } - else - { - return GetSbmFromDacPac(cmd.RootLoggingPath, - cmd.DacPacArgs.PlatinumDacpac, - cmd.DacPacArgs.TargetDacpac, - cmd.Database, - cmd.Server, - cmd.AuthenticationArgs.UserName, - cmd.AuthenticationArgs.Password, - cmd.BuildRevision, - cmd.DefaultScriptTimeout, - multiDb, out sbmName); - } - - } + } diff --git a/src/SqlSync.SqlBuild/EncryptAttribute.cs b/src/SqlSync.SqlBuild/EncryptAttribute.cs deleted file mode 100644 index 07651a60..00000000 --- a/src/SqlSync.SqlBuild/EncryptAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace SqlSync.SqlBuild -{ - [System.AttributeUsage(System.AttributeTargets.Property)] - public class EncryptAttribute : Attribute - { - } -} - diff --git a/src/SqlSync/App.config b/src/SqlSync/App.config index 4d7949a0..f61546fe 100644 --- a/src/SqlSync/App.config +++ b/src/SqlSync/App.config @@ -7,7 +7,6 @@
-
@@ -23,7 +22,6 @@ - - + diff --git a/src/SqlSync/SqlBuild/MultiDb/MultiDbRunForm.Designer.cs b/src/SqlSync/SqlBuild/MultiDb/MultiDbRunForm.Designer.cs index 765f9ed9..b616f145 100644 --- a/src/SqlSync/SqlBuild/MultiDb/MultiDbRunForm.Designer.cs +++ b/src/SqlSync/SqlBuild/MultiDb/MultiDbRunForm.Designer.cs @@ -125,7 +125,7 @@ private void InitializeComponent() this.toolStripSeparator5, this.runBuildUsingCurrentConfigurationWithoutTransactionsToolStripMenuItem, this.toolStripSeparator3, - this.constructCommandLineToolStripMenuItem, + //this.constructCommandLineToolStripMenuItem, this.toolStripSeparator4, this.mnuFileMRU}); this.mnuActionMain.Image = global::SqlSync.Properties.Resources.Execute; diff --git a/src/SqlSync/SqlBuild/RebuildForm.cs b/src/SqlSync/SqlBuild/RebuildForm.cs index 50a25734..2910a714 100644 --- a/src/SqlSync/SqlBuild/RebuildForm.cs +++ b/src/SqlSync/SqlBuild/RebuildForm.cs @@ -101,9 +101,17 @@ private void rebuildFileToolStripMenuItem_Click(object sender, EventArgs e) { if (DialogResult.Yes == MessageBox.Show("Reconstruction Complete. Open New Build File?", "Finished", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { - System.Diagnostics.Process prc = new System.Diagnostics.Process(); - prc.StartInfo.FileName = openFileDialog1.FileName; - prc.Start(); + try + { + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + var me = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; + prc.StartInfo.FileName = me; + prc.StartInfo.Arguments = openFileDialog1.FileName; + prc.Start(); + }catch(Exception exe) + { + MessageBox.Show($"Oops..something went wrong. Please try to open the file manually.{Environment.NewLine}{exe.Message}"); + } } } this.Cursor = Cursors.Default; diff --git a/src/SqlSync/SqlBuild/SqlBuildForm.cs b/src/SqlSync/SqlBuild/SqlBuildForm.cs index 276a97c2..86f484ae 100644 --- a/src/SqlSync/SqlBuild/SqlBuildForm.cs +++ b/src/SqlSync/SqlBuild/SqlBuildForm.cs @@ -2207,7 +2207,7 @@ private void InitializeComponent() this.mnuExportScriptText, this.menuItem15, this.startConfigureMultiServerDatabaseRunToolStripMenuItem, - this.remoteExecutionServiceToolStripMenuItem, + //this.remoteExecutionServiceToolStripMenuItem, this.toolStripSeparator7, this.mnuFileMRU, this.toolStripSeparator13, @@ -2963,7 +2963,7 @@ private void InitializeComponent() this.mnuAutoScripting, this.menuItem11, this.rebuildPreviouslyCommitedBuildFileToolStripMenuItem, - this.constructCommandLineStringToolStripMenuItem, + //this.constructCommandLineStringToolStripMenuItem, this.toolStripSeparator14, this.scriptPolicyCheckingToolStripMenuItem, this.calculateScriptPackageHashSignatureToolStripMenuItem}); diff --git a/src/SqlSync/change_notes.html b/src/SqlSync/change_notes.html index 0468919e..ddf9378b 100644 --- a/src/SqlSync/change_notes.html +++ b/src/SqlSync/change_notes.html @@ -39,6 +39,18 @@

SQL Build Manager Change Notes

+
Version 13.0.2
+
+ FIXED: Update to ensure all Queue messages are retrieved efficiently
+
+ ADDED: New utility method `sbm batch dequeue` to remove all messages from the Service Bus Queue topic (without processing them)
+
+ UPDATED: Code clean up and refactoring to accommodate latest version of System.CommandLine
+
+ FIXED: Issue with SQL text syntax higlighting formatting in .NET 5.0
+
+ NOTE: Removed "Construct Command Line" menu options from Windows UI. Users should leverage the generated help docs for sbm.exe
+
Version 13.0.1
FIXED: Updated distribution algorithm for `--concurrencytype` of `Server` and `MaxPerServer` when number of Batch nodes is very close to the number of SQL Server targets. Was yielding less than the number of nodes.
diff --git a/src/SqlSync/change_notes.xml b/src/SqlSync/change_notes.xml index 90776447..4e8bf43c 100644 --- a/src/SqlSync/change_notes.xml +++ b/src/SqlSync/change_notes.xml @@ -1,5 +1,12 @@ + + Update to ensure all Queue messages are retrieved efficiently + New utility method `sbm batch dequeue` to remove all messages from the Service Bus Queue topic (without processing them) + Code clean up and refactoring to accommodate latest version of System.CommandLine + Issue with SQL text syntax higlighting formatting in .NET 5.0 + Removed "Construct Command Line" menu options from Windows UI. Users should leverage the generated help docs for sbm.exe + Updated distribution algorithm for `--concurrencytype` of `Server` and `MaxPerServer` when number of Batch nodes is very close to the number of SQL Server targets. Was yielding less than the number of nodes. Updated Service Bus message retrieval to better manage when messages not matching the job name are in large quantity diff --git a/src/SyntaxHighlightingTextBox/SyntaxHighlightingTextBox.cs b/src/SyntaxHighlightingTextBox/SyntaxHighlightingTextBox.cs index 71b9502e..a5e2028b 100644 --- a/src/SyntaxHighlightingTextBox/SyntaxHighlightingTextBox.cs +++ b/src/SyntaxHighlightingTextBox/SyntaxHighlightingTextBox.cs @@ -196,6 +196,7 @@ public void RefreshHighlighting() /// protected override void OnTextChanged(EventArgs e) { + string initialText = Text; try { if (this.suspendHighlighting) @@ -222,7 +223,7 @@ protected override void OnTextChanged(EventArgs e) StringBuilder((int)(Text.Length * 1.5 + 150)); //Adding RTF header - sb.Append(@"{\rtf1\fbidis\ansi\ansicpg1255\deff0\deflang1037{\fonttbl{"); + sb.Append(@"{\rtf1\fbidis\ansi\ansicpg1255\deff0\nouicompat\deflang1037{\fonttbl{"); //Font table creation int fontCounter = 0; @@ -388,9 +389,9 @@ protected override void OnTextChanged(EventArgs e) } } } - - // System.Diagnostics.Debug.WriteLine(sb.ToString()); - Rtf = sb.ToString(); + sb.Append("}"); + var rtfSTring = sb.ToString(); + base.Rtf = sb.ToString(); //Restore cursor and scrollbars location. SelectionStart = cursorLoc; @@ -415,7 +416,9 @@ protected override void OnTextChanged(EventArgs e) catch (Exception exe) { log.LogError(exe, $"Error setting SyntaxHighlighting. Type={this.highlightType.ToString()}"); - } + base.Text = initialText; + + } }