From bd05b603142673135ac66cdbc81a2ae3028cb37f Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Fri, 30 Sep 2022 17:59:05 -0700 Subject: Allow independent extraction of BA to remove use of InternalsVisibleTo If tests need functionality, it is reasonable to expect users may require it in the future as well. To support the bundle tests, they needed independent extraction of BA from attached containers. So, add a new switch to extract the BA separate from the containers. --- src/testresultfilelist.txt | 1 - .../CommandLine/ExtractSubcommand.cs | 28 +++++++---- .../WixToolset.Core.Burn.csproj | 12 ----- .../WixToolset.Core.TestPackage/BundleExtractor.cs | 55 +++++++++++----------- .../WixToolsetTest.Core.Burn/BurnReaderFixture.cs | 44 ----------------- .../WixToolsetTest.Core.Burn.csproj | 17 ------- .../BundleExtractionFixture.cs | 1 + .../BundleFixture.cs | 12 ++--- .../WixToolsetTest.CoreIntegration.csproj | 2 +- src/wix/wix.cmd | 1 - src/wix/wix.sln | 19 -------- 11 files changed, 55 insertions(+), 137 deletions(-) delete mode 100644 src/wix/test/WixToolsetTest.Core.Burn/BurnReaderFixture.cs delete mode 100644 src/wix/test/WixToolsetTest.Core.Burn/WixToolsetTest.Core.Burn.csproj diff --git a/src/testresultfilelist.txt b/src/testresultfilelist.txt index 84b6b186..87de7c4e 100644 --- a/src/testresultfilelist.txt +++ b/src/testresultfilelist.txt @@ -11,7 +11,6 @@ build/logs/TestResults/WixToolsetTest.BurnE2E.trx build/logs/TestResults/WixToolsetTest.Converters.trx build/logs/TestResults/WixToolsetTest.Converters.Symbolizer.trx build/logs/TestResults/WixToolsetTest.Core.trx -build/logs/TestResults/WixToolsetTest.Core.Burn.trx build/logs/TestResults/WixToolsetTest.Core.Native.trx build/logs/TestResults/WixToolsetTest.CoreIntegration.trx build/logs/TestResults/WixToolsetTest.Dnc.HostGenerator.trx diff --git a/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs b/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs index b4d71580..1cab276b 100644 --- a/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs +++ b/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs @@ -27,13 +27,16 @@ namespace WixToolset.Core.Burn.CommandLine private string IntermediateFolder { get; set; } - private string ExtractPath { get; set; } + private string ExtractBootstrapperApplicationPath { get; set; } + + private string ExtractContainersPath { get; set; } public override CommandLineHelp GetCommandLineHelp() { return new CommandLineHelp("Extracts the internals of a bundle to a folder.", "burn extract [options] bundle.exe -o outputfolder ", new[] { new CommandLineHelpSwitch("-intermediateFolder", "Optional working folder. If not specified %TMP% will be used."), + new CommandLineHelpSwitch("-outba", "-oba", "Folder to extract the bundle bootstrapper application to."), new CommandLineHelpSwitch("-out", "-o", "Folder to extract the bundle contents to."), }); } @@ -44,7 +47,7 @@ namespace WixToolset.Core.Burn.CommandLine { this.Messaging.Write(ErrorMessages.FilePathRequired("input bundle")); } - else if (String.IsNullOrEmpty(this.ExtractPath)) + else if (String.IsNullOrEmpty(this.ExtractBootstrapperApplicationPath) && String.IsNullOrEmpty(this.ExtractContainersPath)) { this.Messaging.Write(ErrorMessages.FilePathRequired("output the extracted bundle")); } @@ -55,19 +58,23 @@ namespace WixToolset.Core.Burn.CommandLine this.IntermediateFolder = Path.GetTempPath(); } - var uxExtractPath = Path.Combine(this.ExtractPath, "BA"); - using (var reader = BurnReader.Open(this.Messaging, this.FileSystem, this.InputPath)) { - reader.ExtractUXContainer(uxExtractPath, this.IntermediateFolder); + if (!String.IsNullOrEmpty(this.ExtractBootstrapperApplicationPath)) + { + reader.ExtractUXContainer(this.ExtractBootstrapperApplicationPath, this.IntermediateFolder); + } try { - reader.ExtractAttachedContainers(this.ExtractPath, this.IntermediateFolder); + if (!String.IsNullOrEmpty(this.ExtractContainersPath)) + { + reader.ExtractAttachedContainers(this.ExtractContainersPath, this.IntermediateFolder); + } } catch { - this.Messaging.Write(BurnBackendWarnings.FailedToExtractAttachedContainers(new Data.SourceLineNumber(this.ExtractPath))); + this.Messaging.Write(BurnBackendWarnings.FailedToExtractAttachedContainers(new SourceLineNumber(this.ExtractContainersPath))); } } } @@ -85,10 +92,15 @@ namespace WixToolset.Core.Burn.CommandLine case "intermediatefolder": this.IntermediateFolder = parser.GetNextArgumentAsDirectoryOrError(argument); return true; + + case "oba": + case "outba": + this.ExtractBootstrapperApplicationPath = parser.GetNextArgumentAsDirectoryOrError(argument); + return true; case "o": case "out": - this.ExtractPath = parser.GetNextArgumentAsDirectoryOrError(argument); + this.ExtractContainersPath = parser.GetNextArgumentAsDirectoryOrError(argument); return true; } } diff --git a/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj b/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj index 4d1c91f9..754af45e 100644 --- a/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj +++ b/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj @@ -14,18 +14,6 @@ true - - - <_Parameter1>WixToolset.Core.TestPackage, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a9967ec28982f42ee51a47dd5204315975a6ed69294b982146a99a70130a2fa13e226aaddde14c17d1bf3af69e8956d69a86585e74d208efcc5ac98a0686055327b2e87960d3c39bf3a6bc1e572863327d19dbf4fd2616dda124dbea260755a2d1d39d3cf1049ea526493eb2bf996b8ad985e3012308529e5b9b0f5cd5fa04bd - - - <_Parameter1>WixToolsetTest.Core.Burn, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a9967ec28982f42ee51a47dd5204315975a6ed69294b982146a99a70130a2fa13e226aaddde14c17d1bf3af69e8956d69a86585e74d208efcc5ac98a0686055327b2e87960d3c39bf3a6bc1e572863327d19dbf4fd2616dda124dbea260755a2d1d39d3cf1049ea526493eb2bf996b8ad985e3012308529e5b9b0f5cd5fa04bd - - - <_Parameter1>WixToolsetTest.CoreIntegration, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a9967ec28982f42ee51a47dd5204315975a6ed69294b982146a99a70130a2fa13e226aaddde14c17d1bf3af69e8956d69a86585e74d208efcc5ac98a0686055327b2e87960d3c39bf3a6bc1e572863327d19dbf4fd2616dda124dbea260755a2d1d39d3cf1049ea526493eb2bf996b8ad985e3012308529e5b9b0f5cd5fa04bd - - - diff --git a/src/wix/WixToolset.Core.TestPackage/BundleExtractor.cs b/src/wix/WixToolset.Core.TestPackage/BundleExtractor.cs index f8cf49df..3161c4eb 100644 --- a/src/wix/WixToolset.Core.TestPackage/BundleExtractor.cs +++ b/src/wix/WixToolset.Core.TestPackage/BundleExtractor.cs @@ -2,9 +2,10 @@ namespace WixToolset.Core.TestPackage { + using System; + using System.Collections.Generic; using System.IO; using System.Xml; - using WixToolset.Core.Burn.Bundles; using WixToolset.Data.Burn; using WixToolset.Extensibility.Services; @@ -13,6 +14,10 @@ namespace WixToolset.Core.TestPackage /// public class BundleExtractor { + private const string BurnNamespace = "http://wixtoolset.org/schemas/v4/2008/Burn"; + private const string BADataFileName = "BootstrapperApplicationData.xml"; + private const string BundleExtensionDataFileName = "BundleExtensionData.xml"; + /// /// Extracts the BA container. /// @@ -32,25 +37,34 @@ namespace WixToolset.Core.TestPackage /// /// Path to the bundle. /// Path to extract BA to. - /// Path to extract other attached containers to. + /// Optional path to extract other attached containers to. /// Temp path for extraction. /// public static ExtractBAContainerResult ExtractAllContainers(IMessaging messaging, string bundleFilePath, string baFolderPath, string otherContainersFolderPath, string tempFolderPath) { - var result = new ExtractBAContainerResult(); Directory.CreateDirectory(tempFolderPath); - using (var burnReader = BurnReader.Open(messaging, new TestFileSystem(), bundleFilePath)) + + var args = new List { - result.Success = burnReader.ExtractUXContainer(baFolderPath, tempFolderPath); + "burn", "extract", + "-intermediatefolder", tempFolderPath, + bundleFilePath, + "-oba", baFolderPath + }; - if (otherContainersFolderPath != null) - { - result.AttachedContainersSuccess = burnReader.ExtractAttachedContainers(otherContainersFolderPath, tempFolderPath); - } + if (!String.IsNullOrEmpty(otherContainersFolderPath)) + { + args.Add("-o"); + args.Add(otherContainersFolderPath); } - if (result.Success) + var runnerResult = WixRunner.Execute(args.ToArray()); + + var result = new ExtractBAContainerResult(); + + if (runnerResult.ExitCode == 0) { + result.Success = true; result.ManifestDocument = LoadBurnManifest(baFolderPath); result.ManifestNamespaceManager = GetBurnNamespaceManager(result.ManifestDocument, "burn"); @@ -99,7 +113,7 @@ namespace WixToolset.Core.TestPackage public static XmlNamespaceManager GetBurnNamespaceManager(XmlDocument document, string prefix) { var namespaceManager = new XmlNamespaceManager(document.NameTable); - namespaceManager.AddNamespace(prefix, BurnCommon.BurnNamespace); + namespaceManager.AddNamespace(prefix, BurnNamespace); return namespaceManager; } @@ -111,7 +125,7 @@ namespace WixToolset.Core.TestPackage public static XmlDocument LoadBAData(string baFolderPath) { var document = new XmlDocument(); - document.Load(Path.Combine(baFolderPath, BurnCommon.BADataFileName)); + document.Load(Path.Combine(baFolderPath, BADataFileName)); return document; } @@ -123,7 +137,7 @@ namespace WixToolset.Core.TestPackage public static XmlDocument LoadBundleExtensionData(string baFolderPath) { var document = new XmlDocument(); - document.Load(Path.Combine(baFolderPath, BurnCommon.BundleExtensionDataFileName)); + document.Load(Path.Combine(baFolderPath, BundleExtensionDataFileName)); return document; } @@ -138,20 +152,5 @@ namespace WixToolset.Core.TestPackage document.Load(Path.Combine(baFolderPath, "manifest.xml")); return document; } - - private class TestFileSystem : IFileSystem - { - public void CopyFile(string source, string destination, bool allowHardlink) - { - Directory.CreateDirectory(Path.GetDirectoryName(destination)); - File.Copy(source, destination); - } - - public void MoveFile(string source, string destination) - { - Directory.CreateDirectory(Path.GetDirectoryName(destination)); - File.Move(source, destination); - } - } } } diff --git a/src/wix/test/WixToolsetTest.Core.Burn/BurnReaderFixture.cs b/src/wix/test/WixToolsetTest.Core.Burn/BurnReaderFixture.cs deleted file mode 100644 index a83da7f6..00000000 --- a/src/wix/test/WixToolsetTest.Core.Burn/BurnReaderFixture.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. - -namespace WixToolsetTest.Core.Burn -{ - using System; - using WixToolset.Core.Burn.Bundles; - using Xunit; - - public class BurnReaderFixture - { - [Fact] - public void CanReadUInt16Max() - { - var bytes = new byte[] { 0xFF, 0xFF }; - var offset = 0u; - - var result = BurnCommon.ReadUInt16(bytes, offset); - - Assert.Equal(UInt16.MaxValue, result); - } - - [Fact] - public void CanReadUInt32Max() - { - var bytes = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }; - var offset = 0u; - - var result = BurnCommon.ReadUInt32(bytes, offset); - - Assert.Equal(UInt32.MaxValue, result); - } - - [Fact] - public void CanReadUInt64Max() - { - var bytes = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - var offset = 0u; - - var result = BurnCommon.ReadUInt64(bytes, offset); - - Assert.Equal(UInt64.MaxValue, result); - } - } -} diff --git a/src/wix/test/WixToolsetTest.Core.Burn/WixToolsetTest.Core.Burn.csproj b/src/wix/test/WixToolsetTest.Core.Burn/WixToolsetTest.Core.Burn.csproj deleted file mode 100644 index 36dfa4b3..00000000 --- a/src/wix/test/WixToolsetTest.Core.Burn/WixToolsetTest.Core.Burn.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - netcoreapp3.1 - true - - - - - - - - - - diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundleExtractionFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundleExtractionFixture.cs index 478d8c95..7b4999cc 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/BundleExtractionFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundleExtractionFixture.cs @@ -46,6 +46,7 @@ namespace WixToolsetTest.CoreIntegration { "burn", "extract", exePath, + "-oba", baFolderPath, "-o", extractFolderPath }); diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs index f72adad0..db831d0a 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs @@ -140,7 +140,7 @@ namespace WixToolsetTest.CoreIntegration switch (attribute.LocalName) { case "EngineVersion": - WixAssert.StringEqual($"{ThisAssembly.Git.BaseVersion.Major}.{ThisAssembly.Git.BaseVersion.Minor}.{ThisAssembly.Git.BaseVersion.Patch}.{ThisAssembly.Git.Commits}", attribute.Value); + Assert.True(Version.TryParse(attribute.Value, out var _)); break; case "ProtocolVersion": WixAssert.StringEqual("1", attribute.Value); @@ -252,7 +252,7 @@ namespace WixToolsetTest.CoreIntegration switch (attribute.LocalName) { case "EngineVersion": - WixAssert.StringEqual($"{ThisAssembly.Git.BaseVersion.Major}.{ThisAssembly.Git.BaseVersion.Minor}.{ThisAssembly.Git.BaseVersion.Patch}.{ThisAssembly.Git.Commits}", attribute.Value); + Assert.True(Version.TryParse(attribute.Value, out var _)); break; case "ProtocolVersion": WixAssert.StringEqual("1", attribute.Value); @@ -553,7 +553,7 @@ namespace WixToolsetTest.CoreIntegration "-o", exePath, }); - var attachedContainerWarnings = result.Messages.Where(m => m.Id == (int)BurnBackendWarnings.Ids.AttachedContainerPayloadCollision) + var attachedContainerWarnings = result.Messages.Where(m => m.Id == 8500) .Select(m => m.ToString()) .ToArray(); WixAssert.CompareLineByLine(new string[] @@ -561,7 +561,7 @@ namespace WixToolsetTest.CoreIntegration "The Payload 'Auto2' has a duplicate Name 'burn.exe' in the attached container. When extracting the bundle with dark.exe, the file will get overwritten.", }, attachedContainerWarnings); - var baContainerErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.BAContainerPayloadCollision) + var baContainerErrors = result.Messages.Where(m => m.Id == 8002) .Select(m => m.ToString()) .ToArray(); WixAssert.CompareLineByLine(new string[] @@ -571,7 +571,7 @@ namespace WixToolsetTest.CoreIntegration "The Payload 'uxYRbgitOs0K878jn5L_z7LdJ21KI' has a duplicate Name 'BundleExtensionData.xml' in the BA container. When extracting the container at runtime, the file will get overwritten.", }, baContainerErrors); - var externalErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.ExternalPayloadCollision) + var externalErrors = result.Messages.Where(m => m.Id == 8004) .Select(m => m.ToString()) .ToArray(); WixAssert.CompareLineByLine(new string[] @@ -580,7 +580,7 @@ namespace WixToolsetTest.CoreIntegration "The external Container 'MsiPackagesContainer' has a duplicate Name 'ContainerCollision'. When building the bundle or laying out the bundle, the file will get overwritten.", }, externalErrors); - var packageCacheErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.PackageCachePayloadCollision) + var packageCacheErrors = result.Messages.Where(m => m.Id == 8006) .Select(m => m.ToString()) .ToArray(); WixAssert.CompareLineByLine(new string[] diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj b/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj index 16e6f73a..4ff61280 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj +++ b/src/wix/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj @@ -21,6 +21,6 @@ - + diff --git a/src/wix/wix.cmd b/src/wix/wix.cmd index 17c1ab6f..f2e64e50 100644 --- a/src/wix/wix.cmd +++ b/src/wix/wix.cmd @@ -27,7 +27,6 @@ msbuild wix.sln -p:Configuration=%_C% -nologo -m -warnaserror -bl:%_L%\wix_build dotnet test -c %_C% --no-build --nologo test\WixToolsetTest.Converters -l "trx;LogFileName=%_L%\TestResults\WixToolsetTest.Converters.trx" || exit /b dotnet test -c %_C% --no-build --nologo test\WixToolsetTest.Converters.Symbolizer -l "trx;LogFileName=%_L%\TestResults\WixToolsetTest.Converters.Symbolizer.trx" || exit /b dotnet test -c %_C% --no-build --nologo test\WixToolsetTest.Core -l "trx;LogFileName=%_L%\TestResults\WixToolsetTest.Core.trx" || exit /b -dotnet test -c %_C% --no-build --nologo test\WixToolsetTest.Core.Burn -l "trx;LogFileName=%_L%\TestResults\WixToolsetTest.Core.Burn.trx" || exit /b dotnet test -c %_C% --no-build --nologo test\WixToolsetTest.Core.Native -l "trx;LogFileName=%_L%\TestResults\WixToolsetTest.Core.Native.trx" || exit /b dotnet test -c %_C% --no-build --nologo test\WixToolsetTest.CoreIntegration -l "trx;LogFileName=%_L%\TestResults\WixToolsetTest.CoreIntegration.trx" || exit /b diff --git a/src/wix/wix.sln b/src/wix/wix.sln index 13ca8785..cffaf9ed 100644 --- a/src/wix/wix.sln +++ b/src/wix/wix.sln @@ -24,8 +24,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Extension", "test\E EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.CoreIntegration", "test\WixToolsetTest.CoreIntegration\WixToolsetTest.CoreIntegration.csproj", "{E8A08E86-1780-4ED4-8F63-AB2B52C1C16B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Core.Burn", "test\WixToolsetTest.Core.Burn\WixToolsetTest.Core.Burn.csproj", "{DF63F589-028E-45A1-A212-948FACF1FDCD}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Core.TestPackage", "WixToolset.Core.TestPackage\WixToolset.Core.TestPackage.csproj", "{853716DB-C02C-41BD-91BC-79CDC0C17D10}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CompileCoreTestExtensionWixlib", "test\CompileCoreTestExtensionWixlib\CompileCoreTestExtensionWixlib.csproj", "{23FC60D7-B101-42F8-9786-DB7A9CD964A2}" @@ -222,22 +220,6 @@ Global {E8A08E86-1780-4ED4-8F63-AB2B52C1C16B}.Release|x64.Build.0 = Release|Any CPU {E8A08E86-1780-4ED4-8F63-AB2B52C1C16B}.Release|x86.ActiveCfg = Release|Any CPU {E8A08E86-1780-4ED4-8F63-AB2B52C1C16B}.Release|x86.Build.0 = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|ARM64.Build.0 = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|x64.ActiveCfg = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|x64.Build.0 = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|x86.ActiveCfg = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Debug|x86.Build.0 = Debug|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|Any CPU.Build.0 = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|ARM64.ActiveCfg = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|ARM64.Build.0 = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|x64.ActiveCfg = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|x64.Build.0 = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|x86.ActiveCfg = Release|Any CPU - {DF63F589-028E-45A1-A212-948FACF1FDCD}.Release|x86.Build.0 = Release|Any CPU {853716DB-C02C-41BD-91BC-79CDC0C17D10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {853716DB-C02C-41BD-91BC-79CDC0C17D10}.Debug|Any CPU.Build.0 = Debug|Any CPU {853716DB-C02C-41BD-91BC-79CDC0C17D10}.Debug|ARM64.ActiveCfg = Debug|Any CPU @@ -439,7 +421,6 @@ Global {9DB36DB1-24A1-47A7-9E57-D48A2E33C13C} = {1284331E-BC6C-426D-AAAF-140C0174F875} {C66C2503-C671-4230-8B48-1D93A8532A28} = {1284331E-BC6C-426D-AAAF-140C0174F875} {E8A08E86-1780-4ED4-8F63-AB2B52C1C16B} = {1284331E-BC6C-426D-AAAF-140C0174F875} - {DF63F589-028E-45A1-A212-948FACF1FDCD} = {1284331E-BC6C-426D-AAAF-140C0174F875} {23FC60D7-B101-42F8-9786-DB7A9CD964A2} = {1284331E-BC6C-426D-AAAF-140C0174F875} {C44BB95F-5020-4876-933C-B73A24C488FD} = {1284331E-BC6C-426D-AAAF-140C0174F875} {93645356-5D5F-45DE-AC7F-252D35E1ACE5} = {1284331E-BC6C-426D-AAAF-140C0174F875} -- cgit v1.2.3-55-g6feb