Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corefx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Safar <marek.safar@gmail.com>2017-06-20 14:21:00 +0300
committerMarek Safar <marek.safar@gmail.com>2017-06-20 14:21:00 +0300
commitb177aba3ac6d685d48dce5359707be91a213fe0c (patch)
tree573e9c2160f3d38c4471b36d38263d1ac33187fa
parent8cf292c487d12ed451fe8c0d05acc509eb85fa70 (diff)
parentcf4b42457249f6d874141b43231bb727c60a0e20 (diff)
Merge remote-tracking branch 'upstream/master'
-rw-r--r--BuildToolsVersion.txt2
-rw-r--r--Documentation/project-docs/developer-guide.md49
-rw-r--r--build.cmd15
-rwxr-xr-xbuild.sh12
-rw-r--r--buildpipeline/linux.groovy (renamed from buildpipeline/portable-linux.groovy)25
-rw-r--r--buildpipeline/osx.groovy49
-rw-r--r--buildpipeline/pipeline.json26
-rw-r--r--buildpipeline/pipelinejobs.groovy76
-rw-r--r--buildpipeline/portable-windows.groovy71
-rw-r--r--buildpipeline/security/DotNet-CoreFx-Security-Windows.json564
-rw-r--r--buildpipeline/security/pipeline.json22
-rw-r--r--buildpipeline/windows.groovy107
-rw-r--r--config.json71
-rwxr-xr-xcross/arm32_ci_script.sh3
-rw-r--r--dependencies.props26
-rw-r--r--external/test-runtime/XUnit.Runtime.depproj11
-rw-r--r--external/test-runtime/optional.json7
-rw-r--r--netci.groovy106
-rwxr-xr-xrun.sh3
-rw-r--r--src/Common/Common.Tests.sln15
-rw-r--r--src/Common/src/Interop/Windows/kernel32/Interop.CopyFile.Uap.cs2
-rw-r--r--src/Common/src/Interop/Windows/kernel32/Interop.SafeCreateFile.cs11
-rw-r--r--src/Common/src/Interop/Windows/user32/Interop.GetSysColor.cs14
-rw-r--r--src/Common/src/Interop/Windows/user32/Interop.Win32SystemColors.cs46
-rw-r--r--src/Common/src/System/Data/Common/AdapterUtil.cs11
-rw-r--r--src/Common/src/System/Drawing/ColorConverterCommon.cs13
-rw-r--r--src/Common/src/System/Drawing/KnownColorTable.cs (renamed from src/System.Drawing.Common/src/System/Drawing/KnownColorTable.cs)109
-rw-r--r--src/Common/src/System/IO/Win32Marshal.cs4
-rw-r--r--src/Common/src/System/Net/LazyAsyncResult.cs6
-rw-r--r--src/Common/src/System/Net/SafeCloseSocket.Windows.cs70
-rw-r--r--src/Common/tests/Common.Tests.csproj1
-rw-r--r--src/Common/tests/System/AssertExtensions.cs90
-rw-r--r--src/Common/tests/System/Net/Prerequisites/Servers/CoreFxNetCloudService/WebServer/WebSocket/EchoWebSocket.ashx.cs7
-rw-r--r--src/Common/tests/System/PlatformDetection.cs58
-rw-r--r--src/Common/tests/System/ThreadCultureChange.cs21
-rw-r--r--src/Common/tests/Tests/System/AssertExtensionTests.cs211
-rw-r--r--src/CoreFx.Private.TestUtilities/CoreFx.Private.TestUtilities.sln38
-rw-r--r--src/CoreFx.Private.TestUtilities/dir.props8
-rw-r--r--src/CoreFx.Private.TestUtilities/ref/Configurations.props8
-rw-r--r--src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.cs57
-rw-r--r--src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.csproj15
-rw-r--r--src/CoreFx.Private.TestUtilities/src/Configurations.props12
-rw-r--r--src/CoreFx.Private.TestUtilities/src/CoreFx.Private.TestUtilities.csproj59
-rw-r--r--src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.Process.cs66
-rw-r--r--src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.cs (renamed from src/Common/tests/System/Diagnostics/RemoteExecutorTestBase.cs)163
-rw-r--r--src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netcore.cs18
-rw-r--r--src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netfx.cs17
-rw-r--r--src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uap.cs76
-rw-r--r--src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uapaot.cs18
-rw-r--r--src/CoreFx.Private.TestUtilities/src/System/IO/FileCleanupTestBase.cs (renamed from src/Common/tests/System/IO/FileCleanupTestBase.cs)0
-rw-r--r--src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderExtensions.cs26
-rw-r--r--src/Microsoft.CSharp/src/Resources/Microsoft.CSharp.rd.xml7
-rw-r--r--src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/ExceptionUtils.vb5
-rw-r--r--src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/IncompleteInitialization.vb8
-rw-r--r--src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/StaticLocalInitFlag.vb1
-rw-r--r--src/Microsoft.VisualBasic/tests/Microsoft.VisualBasic.Tests.csproj8
-rw-r--r--src/Microsoft.VisualBasic/tests/OperatorsTests.cs248
-rw-r--r--src/Microsoft.VisualBasic/tests/SerializationTests.cs23
-rw-r--r--src/Microsoft.VisualBasic/tests/StringsTests.cs35
-rw-r--r--src/Microsoft.VisualBasic/tests/UtilsTests.cs92
-rw-r--r--src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj9
-rw-r--r--src/System.Collections.NonGeneric/src/System/Collections/Queue.cs12
-rw-r--r--src/System.Collections.NonGeneric/src/System/Collections/SortedList.cs194
-rw-r--r--src/System.Collections.NonGeneric/src/System/Collections/Stack.cs6
-rw-r--r--src/System.Collections.Specialized/src/System/Collections/Specialized/HybridDictionary.cs130
-rw-r--r--src/System.Collections.Specialized/src/System/Collections/Specialized/ListDictionary.cs14
-rw-r--r--src/System.Collections.Specialized/src/System/Collections/Specialized/NameObjectCollectionBase.cs150
-rw-r--r--src/System.Collections.Specialized/src/System/Collections/Specialized/NameValueCollection.cs7
-rw-r--r--src/System.Collections.Specialized/src/System/Collections/Specialized/OrderedDictionary.cs8
-rw-r--r--src/System.Collections.Specialized/src/System/Collections/Specialized/StringDictionary.cs30
-rw-r--r--src/System.Collections/src/System/Collections/BitArray.cs16
-rw-r--r--src/System.Collections/src/System/Collections/Generic/HashSet.cs10
-rw-r--r--src/System.Collections/src/System/Collections/Generic/LinkedList.cs10
-rw-r--r--src/System.Collections/src/System/Collections/Generic/Queue.cs2
-rw-r--r--src/System.Collections/src/System/Collections/Generic/SortedDictionary.cs9
-rw-r--r--src/System.Collections/src/System/Collections/Generic/SortedList.cs4
-rw-r--r--src/System.Collections/src/System/Collections/Generic/SortedSet.cs20
-rw-r--r--src/System.Collections/src/System/Collections/Generic/Stack.cs6
-rw-r--r--src/System.Collections/tests/Generic/Comparers/EqualityComparer.Generic.Serialization.Tests.cs2
-rw-r--r--src/System.ComponentModel.Annotations/System.ComponentModel.Annotations.sln8
-rw-r--r--src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/CompareAttribute.cs18
-rw-r--r--src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/DisplayFormatAttribute.cs10
-rw-r--r--src/System.ComponentModel.Annotations/tests/CompareAttributeTests.cs12
-rw-r--r--src/System.ComponentModel.Annotations/tests/Configurations.props1
-rw-r--r--src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTest.cs154
-rw-r--r--src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.cs77
-rw-r--r--src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.netcoreapp.cs82
-rw-r--r--src/System.ComponentModel.Annotations/tests/System.ComponentModel.Annotations.Tests.csproj13
-rw-r--r--src/System.ComponentModel.EventBasedAsync/tests/AsyncOperationFinalizerTests.cs75
-rw-r--r--src/System.ComponentModel.EventBasedAsync/tests/BackgroundWorkerTests.cs35
-rw-r--r--src/System.ComponentModel.EventBasedAsync/tests/System.ComponentModel.EventBasedAsync.Tests.csproj7
-rw-r--r--src/System.ComponentModel.Primitives/ref/System.ComponentModel.Primitives.cs8
-rw-r--r--src/System.ComponentModel.Primitives/src/Resources/Strings.resx3
-rw-r--r--src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj3
-rw-r--r--src/System.ComponentModel.Primitives/src/System/ComponentModel/CategoryAttribute.cs24
-rw-r--r--src/System.ComponentModel.Primitives/src/System/ComponentModel/DescriptionAttribute.cs23
-rw-r--r--src/System.ComponentModel.Primitives/src/System/ComponentModel/DesignerCategoryAttribute.cs28
-rw-r--r--src/System.ComponentModel.Primitives/src/System/ComponentModel/DisplayNameAttribute.cs21
-rw-r--r--src/System.ComponentModel.Primitives/src/System/ComponentModel/InvalidEnumArgumentException.cs (renamed from src/System.Drawing.Common/src/System/ComponentModel/InvalidEnumArgumentException.cs)9
-rw-r--r--src/System.ComponentModel.Primitives/tests/CategoryAttributeTests.cs112
-rw-r--r--src/System.ComponentModel.Primitives/tests/DescriptionAttributeTests.cs62
-rw-r--r--src/System.ComponentModel.Primitives/tests/DesignerCategoryAttributeTests.cs76
-rw-r--r--src/System.ComponentModel.Primitives/tests/DisplayNameAttributeTests.cs59
-rw-r--r--src/System.ComponentModel.Primitives/tests/InvalidEnumArgumentExceptionTests.cs112
-rw-r--r--src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj1
-rw-r--r--src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.TypeConverter.cs2
-rw-r--r--src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.cs8
-rw-r--r--src/System.ComponentModel.TypeConverter/src/Resources/Strings.resx3
-rw-r--r--src/System.ComponentModel.TypeConverter/src/System.ComponentModel.TypeConverter.csproj1
-rw-r--r--src/System.ComponentModel.TypeConverter/src/System/ComponentModel/InvalidEnumArgumentException.cs68
-rw-r--r--src/System.ComponentModel.TypeConverter/src/System/Drawing/ColorConverter.cs2
-rw-r--r--src/System.Composition.AttributedModel/System.Composition.AttributedModel.sln12
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs19
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs8
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs9
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs9
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs11
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs12
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs8
-rw-r--r--src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs6
-rw-r--r--src/System.Composition.AttributedModel/tests/Configurations.props8
-rw-r--r--src/System.Composition.AttributedModel/tests/ExportAttributeTests.cs49
-rw-r--r--src/System.Composition.AttributedModel/tests/ExportMetadataAttributeTests.cs21
-rw-r--r--src/System.Composition.AttributedModel/tests/ImportAttributeTests.cs27
-rw-r--r--src/System.Composition.AttributedModel/tests/ImportManyAttributeTests.cs27
-rw-r--r--src/System.Composition.AttributedModel/tests/ImportMetadataConstraintAttributeTests.cs21
-rw-r--r--src/System.Composition.AttributedModel/tests/ImportingConstructorAttributeTests.cs18
-rw-r--r--src/System.Composition.AttributedModel/tests/MetadataAttributeAttributeTests.cs18
-rw-r--r--src/System.Composition.AttributedModel/tests/PartMetadataAttributeTests.cs27
-rw-r--r--src/System.Composition.AttributedModel/tests/PartNotDiscoverableAttributeTests.cs18
-rw-r--r--src/System.Composition.AttributedModel/tests/SharedAttributeTests.cs31
-rw-r--r--src/System.Composition.AttributedModel/tests/SharingBoundaryAttributeTests.cs33
-rw-r--r--src/System.Composition.AttributedModel/tests/System.Composition.AttributeModel.Tests.csproj26
-rw-r--r--src/System.Composition.Convention/System.Composition.Convention.sln12
-rw-r--r--src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj2
-rw-r--r--src/System.Composition.Runtime/System.Composition.Runtime.sln12
-rw-r--r--src/System.Composition.Runtime/tests/Configurations.props8
-rw-r--r--src/System.Composition.Runtime/tests/System.Composition.Runtime.Tests.csproj15
-rw-r--r--src/System.Composition.TypedParts/System.Composition.TypedParts.sln2
-rw-r--r--src/System.Configuration.ConfigurationManager/tests/Mono/ConfigurationSectionGroupTest.cs1
-rw-r--r--src/System.Configuration.ConfigurationManager/tests/Mono/TestUtil.cs7
-rw-r--r--src/System.Configuration.ConfigurationManager/tests/System/Configuration/ConfigurationElementCollectionTests.cs1
-rw-r--r--src/System.Configuration.ConfigurationManager/tests/System/Configuration/SectionGroupsTests.cs3
-rw-r--r--src/System.Configuration.ConfigurationManager/tests/System/Configuration/TimeSpanValidatorAttributeTests.cs4
-rw-r--r--src/System.Configuration.ConfigurationManager/tests/System/Configuration/UriSectionTests.cs4
-rw-r--r--src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata28
-rw-r--r--src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp2
-rw-r--r--src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.uap2
-rw-r--r--src/System.Console/tests/System.Console.Tests.csproj6
-rw-r--r--src/System.Data.Common/src/System/Data/Common/AdapterUtil.Common.cs11
-rw-r--r--src/System.Data.Common/src/System/Data/DataTable.cs42
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLBoolean.cs2
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLByte.cs2
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLDateTime.cs2
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLDouble.cs2
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLGuid.cs34
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLInt16.cs2
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLInt32.cs2
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLInt64.cs2
-rw-r--r--src/System.Data.Common/src/System/Data/SQLTypes/SQLString.cs2
-rw-r--r--src/System.Data.Odbc/src/Common/System/Data/Common/AdapterUtil.Odbc.cs5
-rw-r--r--src/System.Data.Odbc/src/Common/System/Data/Common/ReadOnlyCollection.cs130
-rw-r--r--src/System.Data.Odbc/src/Common/System/Data/Common/SafeNativeMethods.cs4
-rw-r--r--src/System.Data.Odbc/src/System.Data.Odbc.csproj1
-rw-r--r--src/System.Data.Odbc/src/System/Data/Odbc/OdbcConnectionStringbuilder.cs3
-rw-r--r--src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Unix.cs2
-rw-r--r--src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Windows.cs2
-rw-r--r--src/System.Data.SqlClient/src/System/Data/Common/ActivityCorrelator.cs2
-rw-r--r--src/System.Data.SqlClient/src/System/Data/Common/AdapterUtil.SqlClient.cs11
-rw-r--r--src/System.Data.SqlClient/src/System/Data/Common/DbConnectionStringCommon.cs4
-rw-r--r--src/System.Data.SqlClient/tests/FunctionalTests/System.Data.SqlClient.Tests.csproj6
-rw-r--r--src/System.Data.SqlClient/tests/ManualTests/SQL/RandomStressTest/RandomizerPool.cs17
-rw-r--r--src/System.Data.SqlClient/tests/StressTests/System.Data.StressFramework/DataStressConnection.cs8
-rw-r--r--src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.Current.net45.cs24
-rw-r--r--src/System.Diagnostics.DiagnosticSource/tests/System.Diagnostics.DiagnosticSource.Tests.csproj6
-rw-r--r--src/System.Diagnostics.FileVersionInfo/src/PinvokeAnalyzerExceptionList.analyzerdata4
-rw-r--r--src/System.Diagnostics.FileVersionInfo/tests/System.Diagnostics.FileVersionInfo.Tests/System.Diagnostics.FileVersionInfo.Tests.csproj3
-rw-r--r--src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata35
-rw-r--r--src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp12
-rw-r--r--src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.uap7
-rw-r--r--src/System.Diagnostics.Process/src/System.Diagnostics.Process.csproj42
-rw-r--r--src/System.Diagnostics.Process/tests/Configurations.props1
-rw-r--r--src/System.Diagnostics.Process/tests/Performance/System.Diagnostics.Process.Performance.Tests.csproj6
-rw-r--r--src/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs76
-rw-r--r--src/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj13
-rw-r--r--src/System.Diagnostics.StackTrace/System.Diagnostics.StackTrace.sln2
-rw-r--r--src/System.Diagnostics.TextWriterTraceListener/tests/DelimiterWriteMethodTests.cs8
-rw-r--r--src/System.Diagnostics.TextWriterTraceListener/tests/TextWriterTraceListener_WriteTests.cs8
-rw-r--r--src/System.Diagnostics.TraceSource/tests/System.Diagnostics.TraceSource.Tests.csproj3
-rw-r--r--src/System.Diagnostics.Tracing/System.Diagnostics.Tracing.sln9
-rw-r--r--src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/LoudListener.cs12
-rw-r--r--src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.cs6
-rw-r--r--src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsWriteEventToListener.cs178
-rw-r--r--src/System.DirectoryServices.AccountManagement/src/PinvokeAnalyzerExceptionList.analyzerdata.netstandard (renamed from src/System.DirectoryServices.AccountManagement/src/PinvokeAnalyzerExceptionList.analyzerdata)1
-rw-r--r--src/System.DirectoryServices.Protocols/System.DirectoryServices.Protocols.sln12
-rw-r--r--src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryException.cs10
-rw-r--r--src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapException.cs10
-rw-r--r--src/System.DirectoryServices.Protocols/tests/AddRequestTests.cs82
-rw-r--r--src/System.DirectoryServices.Protocols/tests/AsqRequestControlTests.cs45
-rw-r--r--src/System.DirectoryServices.Protocols/tests/BerConversionExceptionTests.cs40
-rw-r--r--src/System.DirectoryServices.Protocols/tests/CompareRequestTests.cs119
-rw-r--r--src/System.DirectoryServices.Protocols/tests/Configurations.props8
-rw-r--r--src/System.DirectoryServices.Protocols/tests/CrossDomainMoveControlTests.cs45
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DeleteRequestTests.cs45
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirSyncRequestControlTests.cs109
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryAttributeCollectionTests.cs177
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationCollectionTests.cs177
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationTests.cs37
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryAttributeTests.cs341
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryConnectionTests.cs47
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryControlCollectionTests.cs183
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryControlTests.cs52
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryExceptionTests.cs40
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryNotificationControlTests.cs22
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DirectoryOperationExceptionTests.cs70
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DomainScopeControlTests.cs22
-rw-r--r--src/System.DirectoryServices.Protocols/tests/DsmlAuthRequestTests.cs45
-rw-r--r--src/System.DirectoryServices.Protocols/tests/ExtendedDNControlTests.cs44
-rw-r--r--src/System.DirectoryServices.Protocols/tests/ExtendedRequestTests.cs67
-rw-r--r--src/System.DirectoryServices.Protocols/tests/LazyCommitControlTests.cs22
-rw-r--r--src/System.DirectoryServices.Protocols/tests/LdapConnectionTests.cs304
-rw-r--r--src/System.DirectoryServices.Protocols/tests/LdapDirectoryIdentifierTests.cs89
-rw-r--r--src/System.DirectoryServices.Protocols/tests/LdapExceptionTests.cs101
-rw-r--r--src/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs720
-rw-r--r--src/System.DirectoryServices.Protocols/tests/ModifyDNRequestTests.cs74
-rw-r--r--src/System.DirectoryServices.Protocols/tests/ModifyRequestTests.cs106
-rw-r--r--src/System.DirectoryServices.Protocols/tests/PageResultRequestControlTests.cs72
-rw-r--r--src/System.DirectoryServices.Protocols/tests/PermissiveModifyControlTests.cs22
-rw-r--r--src/System.DirectoryServices.Protocols/tests/QuotaControlTests.cs49
-rw-r--r--src/System.DirectoryServices.Protocols/tests/ReferralCallbackTests.cs46
-rw-r--r--src/System.DirectoryServices.Protocols/tests/SearchOptionsControlTests.cs44
-rw-r--r--src/System.DirectoryServices.Protocols/tests/SearchRequestTests.cs135
-rw-r--r--src/System.DirectoryServices.Protocols/tests/SecurityDescriptorFlagControlTests.cs38
-rw-r--r--src/System.DirectoryServices.Protocols/tests/ShowDeletedControlTests.cs25
-rw-r--r--src/System.DirectoryServices.Protocols/tests/SortKeyTests.cs51
-rw-r--r--src/System.DirectoryServices.Protocols/tests/SortRequestControlTests.cs116
-rw-r--r--src/System.DirectoryServices.Protocols/tests/System.DirectoryServices.Protocols.Tests.csproj58
-rw-r--r--src/System.DirectoryServices.Protocols/tests/TlsOperationExceptionTests.cs70
-rw-r--r--src/System.DirectoryServices.Protocols/tests/TreeDeleteControlTests.cs22
-rw-r--r--src/System.DirectoryServices.Protocols/tests/VerifyNameControlTests.cs82
-rw-r--r--src/System.DirectoryServices.Protocols/tests/VlvRequestControlTests.cs134
-rw-r--r--src/System.DirectoryServices/System.DirectoryServices.sln2
-rw-r--r--src/System.Drawing.Common/System.Drawing.Common.sln45
-rw-r--r--src/System.Drawing.Common/ref/System.Drawing.Common.csproj3
-rw-r--r--src/System.Drawing.Common/src/System.Drawing.Common.csproj219
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Brushes.cs4
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/ColorTranslator.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorTranslator.cs)136
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/AdjustableArrowCap.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/AdjustableArrowCap.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/Blend.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/Blend.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/BrushType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/BrushType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/ColorBlend.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorBlend.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/CombineMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/CombineMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/CompositingMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/CompositingMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/CompositingQuality.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/CompositingQuality.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/CoordinateSpace.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/CoordinateSpace.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/CustomLineCap.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/CustomLineCap.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/CustomLineCapType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/CustomLineCapType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/DashStyle.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/DashStyle.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/FillMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/FillMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/FlushIntention.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/FlushIntention.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsContainer.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsContainer.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsPath.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsPath.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsPathIterator.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsPathIterator.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsState.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsState.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/HatchBrush.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/HatchBrush.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/HatchStyle.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/HatchStyle.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/InterpolationMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/InterpolationMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/LineCap.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/LineCap.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/LineJoin.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/LineJoin.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/LinearGradientBrush.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/LinearGradientBrush.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/LinearGradientMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/LinearGradientMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/Matrix.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/Matrix.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/MatrixOrder.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/MatrixOrder.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathData.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PathData.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathGradientBrush.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PathGradientBrush.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathPointType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PathPointType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/PenAlignment.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PenAlignment.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/PenType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PenType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/PixelOffsetMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PixelOffsetMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/QualityMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/QualityMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/RegionData.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/RegionData.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/SafeCustomLineCapHandle.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/SafeCustomLineCapHandle.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/SmoothingMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/SmoothingMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/WarpMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/WarpMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Drawing2D/WrapMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/WrapMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Font.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/Font.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/FontFamily.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/FontFamily.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/FontStyle.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/FontStyle.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Gdiplus.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/Gdiplus.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/BitmapData.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/BitmapData.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorAdjustType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorAdjustType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorChannelFlags.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorChannelFlags.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMap.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMap.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMapType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMapType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMatrix.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMatrix.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMatrixFlags.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMatrixFlags.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ColorPalette.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ColorPalette.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/EmfPlusFlags.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/EmfPlusFlags.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/EmfPlusRecordType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/EmfPlusRecordType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/EmfType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/EmfType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/Encoder.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/Encoder.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameter.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameter.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameterValueType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameterValueType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameters.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameters.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderValue.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderValue.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/FrameDimension.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/FrameDimension.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ImageAttributes.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ImageAttributes.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecFlags.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecFlags.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecInfo.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecInfo.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecInfoPrivate.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecInfoPrivate.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ImageFlags.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ImageFlags.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ImageFormat.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ImageFormat.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/ImageLockMode.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ImageLockMode.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/METAHEADER.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/METAHEADER.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/Metafile.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/Metafile.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileFrameUnit.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileFrameUnit.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeader.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeader.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeaderEmf.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeaderEmf.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeaderWmf.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeaderWmf.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileType.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileType.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/PaletteFlags.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PaletteFlags.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/PixelFormat.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PixelFormat.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/PlayRecordCallback.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PlayRecordCallback.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/PropertyItem.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PropertyItem.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Imaging/WmfPlaceableFileHeader.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/WmfPlaceableFileHeader.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/GPPOINT.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GPPOINT.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/GPPOINTF.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GPPOINTF.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/GPRECT.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GPRECT.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/GPRECTF.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GPRECTF.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/GPStream.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GPStream.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/ISystemEventTracker.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/ISystemEventTracker.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/RectangleFEx.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/RectangleFEx.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Internal/SystemColorTracker.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/SystemColorTracker.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Pens.cs4
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/StringAlignment.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/StringAlignment.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/StringDigitSubstitute.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/StringDigitSubstitute.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/StringFormat.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/StringFormat.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/StringFormatFlags.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/StringFormatFlags.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/StringTrimming.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/StringTrimming.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/StringUnit.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/StringUnit.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/SystemBrushes.cs4
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/SystemPens.cs4
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Text/FontCollection.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/FontCollection.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Text/GenericFontFamilies.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/GenericFontFamilies.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Text/HotkeyPrefix.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/HotkeyPrefix.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Text/InstalledFontCollection.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/InstalledFontCollection.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Text/PrivateFontCollection.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/PrivateFontCollection.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Text/TextRenderingHint.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/TextRenderingHint.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/TextureBrush.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/TextureBrush.cs)0
-rw-r--r--src/System.Drawing.Common/src/System/Drawing/Unit.cs (renamed from src/System.Drawing.Common/src/System/Drawing/Advanced/Unit.cs)0
-rw-r--r--src/System.Drawing.Common/tests/BrushesTests.cs182
-rw-r--r--src/System.Drawing.Common/tests/ColorTranslatorTests.cs257
-rw-r--r--src/System.Drawing.Common/tests/Drawing2D/MatrixTests.cs790
-rw-r--r--src/System.Drawing.Common/tests/IconTests.cs2
-rw-r--r--src/System.Drawing.Common/tests/PensTests.cs172
-rw-r--r--src/System.Drawing.Common/tests/RegionTests.cs1930
-rw-r--r--src/System.Drawing.Common/tests/System.Drawing.Common.Tests.csproj10
-rw-r--r--src/System.Drawing.Common/tests/SystemBrushesTests.cs69
-rw-r--r--src/System.Drawing.Common/tests/SystemPensTest.cs70
-rw-r--r--src/System.Drawing.Primitives/System.Drawing.Primitives.sln20
-rw-r--r--src/System.Drawing.Primitives/src/Configurations.props3
-rw-r--r--src/System.Drawing.Primitives/src/System.Drawing.Primitives.csproj26
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/Color.cs10
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/KnownColorTable.cs358
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/Point.cs6
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/PointF.cs2
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/Rectangle.cs2
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/RectangleF.cs2
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/Size.cs2
-rw-r--r--src/System.Drawing.Primitives/src/System/Drawing/SizeF.cs2
-rw-r--r--src/System.Drawing.Primitives/tests/ColorTests.cs7
-rw-r--r--src/System.Drawing.Primitives/tests/System.Drawing.Primitives.Tests.csproj4
-rw-r--r--src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.genclass.cs94
-rw-r--r--src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.regclass.cs328
-rw-r--r--src/System.Dynamic.Runtime/tests/Dynamic.OverloadResolution/Conformance.dynamic.overloadResolution.Methods.1class2methods.cs1
-rw-r--r--src/System.Globalization/tests/NumberFormatInfo/NumberFormatInfoData.cs1
-rw-r--r--src/System.Globalization/tests/System.Globalization.Tests.csproj10
-rw-r--r--src/System.IO.Compression.ZipFile/tests/System.IO.Compression.ZipFile.Tests.csproj3
-rw-r--r--src/System.IO.Compression/tests/Performance/Perf.DeflateStream.cs8
-rw-r--r--src/System.IO.Compression/tests/System.IO.Compression.Tests.csproj3
-rw-r--r--src/System.IO.FileSystem.DriveInfo/src/PinvokeAnalyzerExceptionList.analyzerdata5
-rw-r--r--src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata2
-rw-r--r--src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata.uap3
-rw-r--r--src/System.IO.FileSystem.Watcher/tests/FileSystemWatcher.Directory.NotifyFilter.cs1
-rw-r--r--src/System.IO.FileSystem.Watcher/tests/System.IO.FileSystem.Watcher.Tests.csproj3
-rw-r--r--src/System.IO.FileSystem/src/PinvokeAnalyzerExceptionList.analyzerdata6
-rw-r--r--src/System.IO.FileSystem/src/System.IO.FileSystem.csproj3
-rw-r--r--src/System.IO.FileSystem/src/System/IO/Directory.cs197
-rw-r--r--src/System.IO.FileSystem/src/System/IO/DirectoryInfo.cs61
-rw-r--r--src/System.IO.FileSystem/src/System/IO/DisableMediaInsertionPrompt.cs34
-rw-r--r--src/System.IO.FileSystem/src/System/IO/Error.cs6
-rw-r--r--src/System.IO.FileSystem/src/System/IO/File.cs171
-rw-r--r--src/System.IO.FileSystem/src/System/IO/FileInfo.cs41
-rw-r--r--src/System.IO.FileSystem/src/System/IO/FileSystem.cs3
-rw-r--r--src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Windows.cs2
-rw-r--r--src/System.IO.FileSystem/src/System/IO/FileSystemInfo.cs16
-rw-r--r--src/System.IO.FileSystem/src/System/IO/MultiplexingWin32WinRTFileSystem.cs11
-rw-r--r--src/System.IO.FileSystem/src/System/IO/PathHelpers.Windows.cs2
-rw-r--r--src/System.IO.FileSystem/src/System/IO/PathHelpers.cs6
-rw-r--r--src/System.IO.FileSystem/src/System/IO/UnixFileSystem.cs11
-rw-r--r--src/System.IO.FileSystem/src/System/IO/Win32FileSystem.cs186
-rw-r--r--src/System.IO.FileSystem/src/System/IO/Win32FileSystemEnumerable.cs154
-rw-r--r--src/System.IO.FileSystem/src/System/IO/WinRTFileStream.cs245
-rw-r--r--src/System.IO.FileSystem/src/System/IO/WinRTFileSystem.cs603
-rw-r--r--src/System.IO.FileSystem/src/System/IO/WinRTFileSystemObject.cs228
-rw-r--r--src/System.IO.FileSystem/tests/Directory/CreateDirectory.cs2
-rw-r--r--src/System.IO.FileSystem/tests/FileStream/ctor_str_fm_fa_fs.delete.cs7
-rw-r--r--src/System.IO.FileSystem/tests/Performance/System.IO.FileSystem.Performance.Tests.csproj6
-rw-r--r--src/System.IO.FileSystem/tests/System.IO.FileSystem.Tests.csproj6
-rw-r--r--src/System.IO.MemoryMappedFiles/src/PinvokeAnalyzerExceptionList.analyzerdata4
-rw-r--r--src/System.IO.MemoryMappedFiles/src/System.IO.MemoryMappedFiles.csproj16
-rw-r--r--src/System.IO.MemoryMappedFiles/tests/Performance/System.IO.MemoryMappedFiles.Performance.Tests.csproj3
-rw-r--r--src/System.IO.MemoryMappedFiles/tests/System.IO.MemoryMappedFiles.Tests.csproj6
-rw-r--r--src/System.IO.Packaging/tests/Tests.cs147
-rw-r--r--src/System.IO.Pipes.AccessControl/tests/System.IO.Pipes.AccessControl.Tests.csproj6
-rw-r--r--src/System.IO.Pipes/src/PinvokeAnalyzerExceptionList.analyzerdata14
-rw-r--r--src/System.IO.Pipes/tests/System.IO.Pipes.Tests.csproj6
-rw-r--r--src/System.IO.Ports/src/PinvokeAnalyzerExceptionList.analyzerdata17
-rw-r--r--src/System.IO.Ports/tests/SerialPort/GetPortNames.cs4
-rw-r--r--src/System.IO.Ports/tests/SerialPort/OpenDevices.cs1
-rw-r--r--src/System.IO.Ports/tests/SerialPort/ctor_str.cs2
-rw-r--r--src/System.IO.Ports/tests/SerialPort/ctor_str_int.cs2
-rw-r--r--src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity.cs2
-rw-r--r--src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int.cs2
-rw-r--r--src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int_stopbits.cs2
-rw-r--r--src/System.IO.Ports/tests/Support/PortHelper.cs5
-rw-r--r--src/System.IO.Ports/tests/Support/PortsTest.cs3
-rw-r--r--src/System.IO.Ports/tests/System.IO.Ports.Tests.csproj10
-rw-r--r--src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/InterpretedFrame.cs8
-rw-r--r--src/System.Memory/tests/Performance/Perf.Span.IndexOf.cs90
-rw-r--r--src/System.Net.Http/src/System/Net/Http/HttpContent.cs12
-rw-r--r--src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.AcceptAllCerts.cs1
-rw-r--r--src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.cs2
-rw-r--r--src/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs36
-rw-r--r--src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj6
-rw-r--r--src/System.Net.Mail/src/PinvokeAnalyzerExceptionList.analyzerdata.uap (renamed from src/System.Net.Mail/src/PinvokeAnalyzerExceptionList.analyzerdata)1
-rw-r--r--src/System.Net.Mail/tests/Functional/LoggingTest.cs1
-rw-r--r--src/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj6
-rw-r--r--src/System.Net.NetworkInformation/tests/FunctionalTests/AddressParsingTests.cs24
-rw-r--r--src/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs49
-rw-r--r--src/System.Net.NetworkInformation/tests/FunctionalTests/DnsParsingTests.cs17
-rw-r--r--src/System.Net.NetworkInformation/tests/FunctionalTests/MiscParsingTests.cs17
-rw-r--r--src/System.Net.NetworkInformation/tests/FunctionalTests/NetworkInterfaceBasicTest.cs3
-rw-r--r--src/System.Net.NetworkInformation/tests/FunctionalTests/StatisticsParsingTests.cs66
-rw-r--r--src/System.Net.NetworkInformation/tests/UnitTests/NetworkInterfaceTest.cs6
-rw-r--r--src/System.Net.Primitives/src/System.Net.Primitives.csproj1
-rw-r--r--src/System.Net.Primitives/src/System/Net/Cookie.cs60
-rw-r--r--src/System.Net.Primitives/src/System/Net/CookieCollection.cs2
-rw-r--r--src/System.Net.Primitives/src/System/Net/CookieContainer.cs135
-rw-r--r--src/System.Net.Primitives/tests/FunctionalTests/System.Net.Primitives.Functional.Tests.csproj6
-rw-r--r--src/System.Net.Primitives/tests/UnitTests/CookieContainerTest.cs6
-rw-r--r--src/System.Net.Requests/tests/AuthenticationManagerTest.cs4
-rw-r--r--src/System.Net.Requests/tests/GlobalProxySelectionTest.cs1
-rw-r--r--src/System.Net.Requests/tests/HttpWebRequestTest.cs33
-rw-r--r--src/System.Net.Requests/tests/LoggingTest.cs1
-rw-r--r--src/System.Net.Requests/tests/RequestStreamTest.cs18
-rw-r--r--src/System.Net.Requests/tests/System.Net.Requests.Tests.csproj6
-rw-r--r--src/System.Net.Security/src/PinvokeAnalyzerExceptionList.analyzerdata.uap (renamed from src/System.Net.Security/src/PinvokeAnalyzerExceptionList.analyzerdata)1
-rw-r--r--src/System.Net.Security/tests/FunctionalTests/NegotiateStreamTestForUnix.cs15
-rw-r--r--src/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj6
-rw-r--r--src/System.Net.Security/tests/Scripts/Unix/setup-kdc.sh2
-rw-r--r--src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs198
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/LoggingTest.cs2
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/NetworkStreamTest.cs1
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/Resources/System.Net.Sockets.Tests.rd.xml9
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/SendPacketsAsync.cs20
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/SendReceive.cs1
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs19
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/SocketOptionNameTest.cs5
-rw-r--r--src/System.Net.Sockets/tests/FunctionalTests/System.Net.Sockets.Tests.csproj9
-rw-r--r--src/System.Net.WebSockets/tests/System.Net.WebSockets.Tests.csproj5
-rw-r--r--src/System.Net.WebSockets/tests/WebSocketExceptionTests.cs2
-rw-r--r--src/System.ObjectModel/src/System/Collections/ObjectModel/KeyedCollection.cs2
-rw-r--r--src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs30
-rw-r--r--src/System.ObjectModel/src/System/Collections/ObjectModel/ReadOnlyObservableCollection.cs10
-rw-r--r--src/System.Private.Uri/src/System/Uri.cs23
-rw-r--r--src/System.Private.Uri/tests/FunctionalTests/IriRelativeFileResolutionTest.cs5
-rw-r--r--src/System.Private.Uri/tests/FunctionalTests/UriTests.cs33
-rw-r--r--src/System.Private.Xml/src/System.Private.Xml.csproj1
-rw-r--r--src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.Unix.cs30
-rw-r--r--src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.cs6
-rw-r--r--src/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaProviderAttribute.cs4
-rw-r--r--src/System.Private.Xml/src/System/Xml/Serialization/XmlTextAttribute.cs4
-rw-r--r--src/System.Private.Xml/src/System/Xml/Serialization/XmlTypeAttribute.cs4
-rw-r--r--src/System.Private.Xml/tests/XmlReader/Tests/BaseUriTests.cs39
-rw-r--r--src/System.Private.Xml/tests/XmlReader/Tests/System.Xml.RW.XmlReader.Tests.csproj1
-rw-r--r--src/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_Compile.cs9
-rw-r--r--src/System.Private.Xml/tests/XmlSchema/XmlSchemaValidatorApi/ValidateMisc.cs11
-rw-r--r--src/System.Private.Xml/tests/XmlSerializer/Resources/System.Xml.XmlSerializer.Tests.rd.xml10
-rw-r--r--src/System.Private.Xml/tests/XmlSerializer/System.Xml.XmlSerializer.Tests.csproj3
-rw-r--r--src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs1
-rw-r--r--src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/System.Xml.Xsl.XslCompiledTransformApi.Tests.csproj6
-rw-r--r--src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XslTransformMultith.cs10
-rw-r--r--src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XsltArgumentListMultith.cs6
-rw-r--r--src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTArgumentList.cs17
-rw-r--r--src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTransform.cs6
-rw-r--r--src/System.Private.Xml/tests/Xslt/XslTransformApi/CXsltArgumentListMultith.cs2
-rw-r--r--src/System.Private.Xml/tests/Xslt/XslTransformApi/XSLTransform.cs5
-rw-r--r--src/System.Runtime.Extensions/System.Runtime.Extensions.sln5
-rw-r--r--src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata8
-rw-r--r--src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uap2
-rw-r--r--src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uapaot2
-rw-r--r--src/System.Runtime.Extensions/src/System.Runtime.Extensions.csproj2
-rw-r--r--src/System.Runtime.Extensions/src/System/Collections/ArrayList.cs6
-rw-r--r--src/System.Runtime.Extensions/src/System/Collections/Comparer.cs4
-rw-r--r--src/System.Runtime.Extensions/src/System/Collections/Hashtable.cs18
-rw-r--r--src/System.Runtime.Extensions/src/System/Collections/IHashCodeProvider.cs1
-rw-r--r--src/System.Runtime.Extensions/tests/System.Runtime.Extensions.Tests.csproj6
-rw-r--r--src/System.Runtime.Extensions/tests/System/Environment.Exit.cs2
-rw-r--r--src/System.Runtime.Extensions/tests/System/Environment.GetCommandLineArgs.cs1
-rw-r--r--src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzerExceptionList.analyzerdata1
-rw-r--r--src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzer_win8-wpa81-APIs.txt1
-rw-r--r--src/System.Runtime.InteropServices.RuntimeInformation/src/System.Runtime.InteropServices.RuntimeInformation.csproj3
-rw-r--r--src/System.Runtime.InteropServices.RuntimeInformation/src/System/Runtime/InteropServices/RuntimeInformation/RuntimeInformation.Windows.cs2
-rw-r--r--src/System.Runtime.InteropServices.RuntimeInformation/tests/DescriptionNameTests.cs16
-rw-r--r--src/System.Runtime.InteropServices.RuntimeInformation/tests/System.Runtime.InteropServices.RuntimeInformation.Tests.csproj3
-rw-r--r--src/System.Runtime.InteropServices/src/Resources/Strings.resx9
-rw-r--r--src/System.Runtime.InteropServices/src/System.Runtime.InteropServices.csproj22
-rw-r--r--src/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/Attributes.cs11
-rw-r--r--src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/Attributes.cs52
-rw-r--r--src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs79
-rw-r--r--src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs13
-rw-r--r--src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/DefaultParameterValueAttribute.cs11
-rw-r--r--src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/HandleCollector.cs30
-rw-r--r--src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/RuntimeEnvironment.cs34
-rw-r--r--src/System.Runtime.InteropServices/tests/System.Runtime.InteropServices.Tests.csproj5
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/AllowReversePInvokeCallsAttributeTests.cs13
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/CallingConventionTests.cs17
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComAliasNameAttributeTests.cs18
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComCompatibleVersionAttributeTests.cs29
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComConversionLossAttributeTests.cs8
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComRegisterFunctionAttributeTests.cs13
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComUnregisterFunctionAttributeTests.cs13
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComVisibleAttributeTests.cs18
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/DefaultParameterValueAttributeTests.cs6
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleCollectorTests.cs100
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleRefTests.cs28
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/LCIDConversionAttributeTests.cs24
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/MarshalTests.cs1
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/PrimaryInteropAssemblyAttributeTests.cs23
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ProgIdAttributeTests.cs18
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTest.cs43
-rw-r--r--src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTests.cs54
-rw-r--r--src/System.Runtime.Loader/tests/RefEmitLoadContext/RefEmitLoadContextTest.cs20
-rw-r--r--src/System.Runtime.Numerics/src/System/Numerics/BigInteger.cs4
-rw-r--r--src/System.Runtime.Numerics/src/System/Numerics/Complex.cs8
-rw-r--r--src/System.Runtime.Serialization.Formatters/src/Resources/System.Runtime.Serialization.Formatters.rd.xml7
-rw-r--r--src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/FormatterServices.cs9
-rw-r--r--src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryObjectWriter.cs2
-rw-r--r--src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryTypeConverter.cs2
-rw-r--r--src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/Converter.cs10
-rw-r--r--src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterHelper.cs85
-rw-r--r--src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTestData.cs512
-rw-r--r--src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTests.cs25
-rw-r--r--src/System.Runtime.Serialization.Formatters/tests/EqualityExtensions.cs787
-rw-r--r--src/System.Runtime.Serialization.Formatters/tests/SerializationTypes.cs18
-rw-r--r--src/System.Runtime.Serialization.Formatters/tests/System.Runtime.Serialization.Formatters.Tests.csproj6
-rw-r--r--src/System.Runtime.Serialization.Json/tests/DataContractJsonSerializer.cs14
-rw-r--r--src/System.Runtime.Serialization.Json/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Json.ReflectionOnly.Tests.rd.xml22
-rw-r--r--src/System.Runtime.Serialization.Json/tests/ReflectionOnly/System.Runtime.Serialization.Json.ReflectionOnly.Tests.csproj3
-rw-r--r--src/System.Runtime.Serialization.Xml/tests/DataContractSerializer.cs10
-rw-r--r--src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.rd.xml22
-rw-r--r--src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.csproj3
-rw-r--r--src/System.Runtime.WindowsRuntime/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeBuffer.cs18
-rw-r--r--src/System.Runtime.WindowsRuntime/tests/System.Runtime.WindowsRuntime.Tests.csproj6
-rw-r--r--src/System.Runtime.WindowsRuntime/tests/System/IO/AsWinRTStreamTests.cs396
-rw-r--r--src/System.Runtime.WindowsRuntime/tests/System/IO/TestStreamProvider.cs112
-rw-r--r--src/System.Runtime.WindowsRuntime/tests/System/IO/WriteOnlyStream.cs16
-rw-r--r--src/System.Runtime/tests/System.Runtime.Tests.csproj6
-rw-r--r--src/System.Runtime/tests/System/ArrayTests.cs1
-rw-r--r--src/System.Runtime/tests/System/Reflection/MemberInfoTests.cs28
-rw-r--r--src/System.Runtime/tests/System/Uri.CreateStringTests.cs54
-rw-r--r--src/System.Security.AccessControl/dir.props2
-rw-r--r--src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata4
-rw-r--r--src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata.uap6
-rw-r--r--src/System.Security.AccessControl/src/System/Security/AccessControl/Privilege.cs8
-rw-r--r--src/System.Security.AccessControl/tests/AccessRule.Tests.cs2
-rw-r--r--src/System.Security.AccessControl/tests/AuditRule.Tests.cs2
-rw-r--r--src/System.Security.AccessControl/tests/Resources/System.Security.AccessControl.Tests.rd.xml9
-rw-r--r--src/System.Security.AccessControl/tests/System.Security.AccessControl.Tests.csproj3
-rw-r--r--src/System.Security.Cryptography.Csp/src/PinvokeAnalyzerExceptionList.analyzerdata21
-rw-r--r--src/System.Security.Cryptography.X509Certificates/tests/ChainTests.cs9
-rw-r--r--src/System.Security.Principal.Windows/src/PinvokeAnalyzerExceptionList.analyzerdata.uap (renamed from src/System.Security.Principal.Windows/src/PinvokeAnalyzerExceptionList.analyzerdata)6
-rw-r--r--src/System.Text.RegularExpressions/tests/System.Text.RegularExpressions.Tests.csproj6
-rw-r--r--src/System.Threading.Overlapped/tests/HandleFactory.cs4
-rw-r--r--src/System.Threading.Overlapped/tests/OverlappedTests.cs2
-rw-r--r--src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_BindHandleTests.cs15
-rw-r--r--src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_GetNativeOverlappedStateTests.cs6
-rw-r--r--src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_HandleTests.cs4
-rw-r--r--src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_Helpers.cs12
-rw-r--r--src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_IntegrationTests.cs11
-rw-r--r--src/System.Threading.Tasks.Dataflow/tests/Dataflow/EtwTests.cs1
-rw-r--r--src/System.Threading.Tasks.Dataflow/tests/System.Threading.Tasks.Dataflow.Tests.csproj6
-rw-r--r--src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/AsyncTaskMethodBuilderTests.cs4
-rw-r--r--src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/TaskAwaiterTests.cs8
-rw-r--r--src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/YieldAwaitableTests.cs12
-rw-r--r--src/System.Threading.Tasks/tests/Task/TaskRtTests.cs51
-rw-r--r--src/System.Threading.Tasks/tests/TaskScheduler/TaskSchedulerTests.cs3
-rw-r--r--src/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj3
-rw-r--r--src/System.Threading.ThreadPool/tests/ThreadPoolTests.cs13
-rw-r--r--src/System.Threading/tests/MutexTests.cs2
-rw-r--r--src/System.Threading/tests/System.Threading.Tests.csproj6
-rw-r--r--src/System.Transactions.Local/src/System/Transactions/Transaction.cs18
-rw-r--r--src/dirs.proj6
-rw-r--r--src/shims/manual/System.csproj31
-rw-r--r--src/shims/manual/System.forwards.cs10
-rw-r--r--src/shims/manual/mscorlib.csproj7
-rw-r--r--src/shims/manual/mscorlib.forwards.cs7
-rw-r--r--src/shims/netfxreference.props4
610 files changed, 15950 insertions, 5822 deletions
diff --git a/BuildToolsVersion.txt b/BuildToolsVersion.txt
index 36592e5283..0d9718e699 100644
--- a/BuildToolsVersion.txt
+++ b/BuildToolsVersion.txt
@@ -1 +1 @@
-2.0.0-prerelease-01712-01
+2.0.0-prerelease-01714-03 \ No newline at end of file
diff --git a/Documentation/project-docs/developer-guide.md b/Documentation/project-docs/developer-guide.md
index 97e94be287..4d440859ba 100644
--- a/Documentation/project-docs/developer-guide.md
+++ b/Documentation/project-docs/developer-guide.md
@@ -137,7 +137,40 @@ Use it to pass extra msbuild properties, in this case to ignore tests ignored in
build-tests -- /p:WithoutCategories=IgnoreForCI
```
-### Building individual CoreFx DLLs
+### Building individual libraries
+
+**Note**: Before working on individual projects or test projects you **must** run `build` from the root once before beginning that work. It is also a good idea to run `build` whenever you pull a large set of unknown changes into your branch.
+
+Similar to building the entire repo with build.cmd/sh in the root you can build projects based on our directory structure by passing in the directory. We also support
+shortcuts for libraries so you can omit the root src folder from the path. When given a directory we will build all projects that we find recursively under that directory.
+
+**Examples**
+
+- Build all projects for a given library (ex: System.Collections) including running the tests
+```
+build System.Collections
+```
+or
+```
+build src\System.Collections
+```
+or
+```
+cd src\System.Collections
+..\..\build .
+```
+
+- Build just the tests for a library project.
+```
+build src\System.Collections\tests
+```
+
+- All the options listed above like framework and configuration are also supported (note they must be after the directory)
+```
+build System.Collections -framework:netfx -release
+```
+
+### Building individual projects
**Note**: Before working on individual projects or test projects you **must** run `build` from the root once before beginning that work. It is also a good idea to run `build` whenever you pull a large set of unknown changes into your branch.
@@ -157,13 +190,19 @@ For libraries that have multiple build configurations the configurations will be
**Examples**
- Build project for Linux for netcoreapp
-`msbuild System.Net.NetworkInformation.csproj /p:OSGroup=Linux`
+```
+msbuild System.Net.NetworkInformation.csproj /p:OSGroup=Linux
+```
- Build project for uap (not if trying to build on non-windows you also need to specify OSGroup=Windows_NT)
-`msbuild System.Net.NetworkInformation.csproj /p:TargetGroup=uap`
+```
+msbuild System.Net.NetworkInformation.csproj /p:TargetGroup=uap
+```
- Build release version of library
-`msbuild System.Net.NetworkInformation.csproj /p:ConfigurationGroup=Release`
+```
+msbuild System.Net.NetworkInformation.csproj /p:ConfigurationGroup=Release
+```
**Note:** If building in a non-Windows environment, call `<repo-root>/Tools/msbuild.sh` instead of just `msbuild`.
@@ -300,7 +339,7 @@ This attribute can be applied either to a test class (will disable all the tests
```cs
[SkipOnTargetFramework(TargetFrameworkMonikers frameworks, string reason)]
```
-Use this attribute over test methods to skip tests only on the specific target frameworks. The reason parameter doesn't affect the traits but we rather always use it so that when we see this attribute we know why it is being skipped on that framework.
+Use this attribute over test methods to skip tests only on the specific target frameworks. The reason parameter doesn't affect the traits but we rather always use it so that when we see this attribute we know why it is being skipped on that framework.
If it needs to be skipped in multiple frameworks and the reasons are different please use two attributes on the same test so that you can specify different reasons for each framework.
diff --git a/build.cmd b/build.cmd
index 5603646298..6c3f589ddc 100644
--- a/build.cmd
+++ b/build.cmd
@@ -3,11 +3,26 @@ setlocal
if /I [%1] == [-?] goto Usage
+if [%1] == [] goto Build
+
+set _rootDirectory=%CD%\
+if EXIST %_rootDirectory%%1 goto :BuildDirectory
+set _rootDirectory=%~dp0src\
+if EXIST %_rootDirectory%%1 goto :BuildDirectory
+
:Build
call %~dp0build-native.cmd %*
if NOT [%ERRORLEVEL%]==[0] exit /b 1
call %~dp0build-managed.cmd -BuildPackages=true %*
exit /b %ERRORLEVEL%
+goto :EOF
+
+:BuildDirectory
+echo %~dp0run.cmd build-directory -directory:%_rootDirectory%%*
+call %~dp0run.cmd build-directory -directory:%_rootDirectory%%*
+exit /b %ERRORLEVEL%
+
+goto :EOF
:Usage
echo.
diff --git a/build.sh b/build.sh
index 49030a819d..6aea9dd0a1 100755
--- a/build.sh
+++ b/build.sh
@@ -22,6 +22,18 @@ if [ "$1" == "-?" ]; then
fi
__scriptpath=$(cd "$(dirname "$0")"; pwd -P)
+__workingDir=$(pwd -P)
+
+if [ "$1" != "" ]; then
+ if [ -d $__workingDir/$1 ]; then
+ $__scriptpath/run.sh build-directory -directory:$__workingDir/$*
+ exit $?
+ fi
+ if [ -d $__scriptpath/src/$1 ]; then
+ $__scriptpath/run.sh build-directory -directory:$__scriptpath/$*
+ exit $?
+ fi
+fi
"$__scriptpath/build-native.sh" $*
if [ $? -ne 0 ];then
diff --git a/buildpipeline/portable-linux.groovy b/buildpipeline/linux.groovy
index 31581157fa..26414a56be 100644
--- a/buildpipeline/portable-linux.groovy
+++ b/buildpipeline/linux.groovy
@@ -1,9 +1,10 @@
@Library('dotnet-ci') _
// Incoming parameters. Access with "params.<param name>".
-// Config - Build configuration. Note that we don't using 'Configuration' since it's used
-// in the build scripts and this can cause problems.
-// OuterLoop - If true, runs outerloop, if false runs just innerloop
+// Note that the parameters will be set as env variables so we cannot use names that conflict
+// with the engineering system parameter names.
+// CGroup - Build configuration.
+// TestOuter - If true, runs outerloop, if false runs just innerloop
def submittedHelixJson = null
@@ -35,14 +36,14 @@ simpleDockerNode('microsoft/dotnet-buildtools-prereqs:rhel7_prereqs_2') {
sh "./sync.sh -p -- /p:ArchGroup=x64"
}
stage ('Build Product') {
- sh "./build.sh -buildArch=x64 -${params.Config}"
+ sh "./build.sh -buildArch=x64 -${params.CGroup}"
}
stage ('Build Tests') {
def additionalArgs = ''
- if (params.OuterLoop) {
+ if (params.TestOuter) {
additionalArgs = '-Outerloop'
}
- sh "./build-tests.sh -buildArch=x64 -${params.Config} -SkipTests ${additionalArgs} -- /p:ArchiveTests=true /p:EnableDumpling=true"
+ sh "./build-tests.sh -buildArch=x64 -${params.CGroup} -SkipTests ${additionalArgs} -- /p:ArchiveTests=true /p:EnableDumpling=true"
}
stage ('Submit To Helix For Testing') {
// Bind the credentials
@@ -63,14 +64,14 @@ simpleDockerNode('microsoft/dotnet-buildtools-prereqs:rhel7_prereqs_2') {
'Ubuntu.1610.Amd64.Open',
'suse.422.amd64.Open',
'fedora.25.amd64.Open',]
- if (params.OuterLoop) {
+ if (params.TestOuter) {
targetHelixQueues += ['Debian.90.Amd64.Open',
'Fedora.26.Amd64.Open',
'SLES.12.Amd64.Open',
'Ubuntu.1704.Amd64.Open',]
- }
+ }
- sh "./Tools/msbuild.sh src/upload-tests.proj /p:ArchGroup=x64 /p:ConfigurationGroup=${params.Config} /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Linux /p:HelixJobType=test/functional/cli/ /p:HelixSource=${helixSource} /p:BuildMoniker=${helixBuild} /p:HelixCreator=${helixCreator} /p:CloudDropAccountName=dotnetbuilddrops /p:CloudResultsAccountName=dotnetjobresults /p:CloudDropAccessToken=\$CloudDropAccessToken /p:CloudResultsAccessToken=\$OutputCloudResultsAccessToken /p:HelixApiEndpoint=https://helix.dot.net/api/2017-04-14/jobs /p:TargetQueues=${targetHelixQueues.join('+')} /p:HelixLogFolder=${WORKSPACE}/${logFolder}/ /p:HelixCorrelationInfoFileName=SubmittedHelixRuns.txt"
+ sh "./Tools/msbuild.sh src/upload-tests.proj /p:ArchGroup=x64 /p:ConfigurationGroup=${params.CGroup} /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Linux /p:HelixJobType=test/functional/cli/ /p:HelixSource=${helixSource} /p:BuildMoniker=${helixBuild} /p:HelixCreator=${helixCreator} /p:CloudDropAccountName=dotnetbuilddrops /p:CloudResultsAccountName=dotnetjobresults /p:CloudDropAccessToken=\$CloudDropAccessToken /p:CloudResultsAccessToken=\$OutputCloudResultsAccessToken /p:HelixApiEndpoint=https://helix.dot.net/api/2017-04-14/jobs /p:TargetQueues=${targetHelixQueues.join('+')} /p:HelixLogFolder=${WORKSPACE}/${logFolder}/ /p:HelixCorrelationInfoFileName=SubmittedHelixRuns.txt"
submittedHelixJson = readJSON file: "${logFolder}/SubmittedHelixRuns.txt"
}
@@ -79,11 +80,11 @@ simpleDockerNode('microsoft/dotnet-buildtools-prereqs:rhel7_prereqs_2') {
stage ('Execute Tests') {
def contextBase
- if (params.OuterLoop) {
- contextBase = "Linux x64 Tests w/outer - ${params.Config}"
+ if (params.TestOuter) {
+ contextBase = "Linux x64 Tests w/outer - ${params.CGroup}"
}
else {
- contextBase = "Linux x64 Tests - ${params.Config}"
+ contextBase = "Linux x64 Tests - ${params.CGroup}"
}
waitForHelixRuns(submittedHelixJson, contextBase)
} \ No newline at end of file
diff --git a/buildpipeline/osx.groovy b/buildpipeline/osx.groovy
new file mode 100644
index 0000000000..72b0275ca7
--- /dev/null
+++ b/buildpipeline/osx.groovy
@@ -0,0 +1,49 @@
+@Library('dotnet-ci') _
+
+// Incoming parameters. Access with "params.<param name>".
+// Note that the parameters will be set as env variables so we cannot use names that conflict
+// with the engineering system parameter names.
+// CGroup - Build configuration.
+// TestOuter - If true, runs outerloop, if false runs just innerloop
+
+def submittedHelixJson = null
+
+simpleNode('OSX10.12','latest') {
+ stage ('Checkout source') {
+ checkout scm
+ }
+
+ def logFolder = getLogFolder()
+
+ stage ('Initialize tools') {
+ try {
+ // Workaround nuget issue https://github.com/NuGet/Home/issues/5085 were we need to set HOME
+ // Init tools
+ sh 'HOME=\$WORKSPACE/tempHome ./init-tools.sh'
+ }
+ catch (err) {
+ // On errors for build tools initializations, it's useful to echo the contents of the file
+ // for easy diagnosis. This could also be copied to the log directory
+ sh 'cat init-tools.log'
+ // Ensure the build result is still propagated.
+ throw err
+ }
+ }
+ stage ('Generate version assets') {
+ // Generate the version assets. Do we need to even do this for non-official builds?
+ sh "./build-managed.sh -- /t:GenerateVersionSourceFile /p:GenerateVersionSourceFile=true"
+ }
+ stage ('Sync') {
+ sh "HOME=\$WORKSPACE/tempHome ./sync.sh -p -- /p:ArchGroup=x64"
+ }
+ stage ('Build Product') {
+ sh "HOME=\$WORKSPACE/tempHome ./build.sh -buildArch=x64 -${params.CGroup}"
+ }
+ stage ('Build Tests') {
+ def additionalArgs = ''
+ if (params.TestOuter) {
+ additionalArgs = '-Outerloop'
+ }
+ sh "HOME=\$WORKSPACE/tempHome ./build-tests.sh -buildArch=x64 -${params.CGroup} ${additionalArgs} -- /p:ArchiveTests=true /p:EnableDumpling=true"
+ }
+} \ No newline at end of file
diff --git a/buildpipeline/pipeline.json b/buildpipeline/pipeline.json
index 9f14553489..54aeae2806 100644
--- a/buildpipeline/pipeline.json
+++ b/buildpipeline/pipeline.json
@@ -177,7 +177,7 @@
"PB_BuildArguments": "-framework=uap -buildArch=x64 -Release -- /p:SignType=real /p:RuntimeOS=win10",
"PB_BuildTestsArguments": "-framework=uap -buildArch=x64 -Release -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
"PB_SyncArguments": "-p -- /p:ArchGroup=x64 /p:RuntimeOS=win10 /p:TargetGroup=uap",
- "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uap /p:ConfigurationGroup=Release /p:\"TargetQueues=Windows.10.Amd64\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/uwp/\""
+ "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uap /p:ConfigurationGroup=Release /p:\"TargetQueues=Windows.10.Amd64.ClientRS3\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/uwp/\""
},
"ReportingParameters": {
"OperatingSystem": "Windows",
@@ -227,7 +227,7 @@
"PB_BuildArguments": "-framework=uapaot -buildArch=x64 -Release -- /p:SignType=real /p:RuntimeOS=win10",
"PB_BuildTestsArguments": "-framework=uapaot -buildArch=x64 -Release -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
"PB_SyncArguments": "-p -- /p:ArchGroup=x64 /p:RuntimeOS=win10 /p:TargetGroup=uapaot",
- "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uapaot /p:ConfigurationGroup=Release /p:\"TargetQueues=Windows.10.Amd64\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
+ "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uapaot /p:ConfigurationGroup=Release /p:\"TargetQueues=Windows.10.Amd64.ClientRS3\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
},
"ReportingParameters": {
"OperatingSystem": "Windows",
@@ -244,7 +244,7 @@
"PB_BuildArguments": "-framework=uapaot -buildArch=x86 -Release -- /p:SignType=real /p:RuntimeOS=win10",
"PB_BuildTestsArguments": "-framework=uapaot -buildArch=x86 -Release -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
"PB_SyncArguments": "-p -- /p:ArchGroup=x86 /p:RuntimeOS=win10",
- "PB_CreateHelixArguments": "/p:ArchGroup=x86 /p:TargetGroup=uapaot /p:ConfigurationGroup=Release /p:\"TargetQueues=Windows.10.Amd64\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
+ "PB_CreateHelixArguments": "/p:ArchGroup=x86 /p:TargetGroup=uapaot /p:ConfigurationGroup=Release /p:\"TargetQueues=Windows.10.Amd64.ClientRS3\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
},
"ReportingParameters": {
"OperatingSystem": "Windows",
@@ -381,13 +381,11 @@
},
"Definitions": [
{
- "Name": "DotNet-CoreFx-Trusted-Windows",
+ "Name": "DotNet-CoreFx-Trusted-Windows-NoTest",
"Parameters": {
"PB_Platform": "arm",
"PB_BuildArguments": "-framework=uap -buildArch=arm -Debug -- /p:SignType=real /p:RuntimeOS=win10",
- "PB_BuildTestsArguments": "-framework=uap -buildArch=arm -Debug -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
- "PB_SyncArguments": "-p -- /p:ArchGroup=arm /p:RuntimeOS=win10 /p:TargetGroup=uap",
- "PB_CreateHelixArguments": "/p:ArchGroup=arm /p:TargetGroup=uap /p:ConfigurationGroup=Debug /p:TargetQueues=Windows.10.Amd64 /p:SecondaryQueue=Windows.10.Arm64 /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/uwp/\""
+ "PB_SyncArguments": "-p -- /p:ArchGroup=arm /p:RuntimeOS=win10"
},
"ReportingParameters": {
"OperatingSystem": "Windows",
@@ -404,7 +402,7 @@
"PB_BuildArguments": "-framework=uap -buildArch=x64 -Debug -- /p:SignType=real /p:RuntimeOS=win10",
"PB_BuildTestsArguments": "-framework=uap -buildArch=x64 -Debug -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
"PB_SyncArguments": "-p -- /p:ArchGroup=x64 /p:RuntimeOS=win10 /p:TargetGroup=uap",
- "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uap /p:ConfigurationGroup=Debug /p:\"TargetQueues=Windows.10.Amd64\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/uwp/\""
+ "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uap /p:ConfigurationGroup=Debug /p:\"TargetQueues=Windows.10.Amd64.ClientRS3\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/uwp/\""
},
"ReportingParameters": {
"OperatingSystem": "Windows",
@@ -431,11 +429,13 @@
}
},
{
- "Name": "DotNet-CoreFx-Trusted-Windows-NoTest",
+ "Name": "DotNet-CoreFx-Trusted-Windows",
"Parameters": {
"PB_Platform": "arm",
- "PB_BuildArguments": "-framework:uapaot -buildArch=arm -Debug -- /p:SignType=real /p:RuntimeOS=win10",
- "PB_SyncArguments": "-p -- /p:ArchGroup=arm /p:RuntimeOS=win10"
+ "PB_BuildArguments": "-framework=uapaot -buildArch=arm -Debug -- /p:SignType=real /p:RuntimeOS=win10",
+ "PB_BuildTestsArguments": "-framework=uapaot -buildArch=arm -Debug -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
+ "PB_SyncArguments": "-p -- /p:ArchGroup=arm /p:RuntimeOS=win10 /p:TargetGroup=uapaot",
+ "PB_CreateHelixArguments": "/p:ArchGroup=arm /p:TargetGroup=uapaot /p:ConfigurationGroup=Debug /p:TargetQueues=Windows.10.Amd64 /p:SecondaryQueue=Windows.10.Arm64 /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
},
"ReportingParameters": {
"OperatingSystem": "Windows",
@@ -452,7 +452,7 @@
"PB_BuildArguments": "-framework:uapaot -buildArch=x64 -Debug -- /p:SignType=real /p:RuntimeOS=win10",
"PB_BuildTestsArguments": "-framework=uapaot -buildArch=x64 -Debug -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
"PB_SyncArguments": "-p -- /p:ArchGroup=x64 /p:RuntimeOS=win10 /p:TargetGroup=uapaot",
- "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uapaot /p:ConfigurationGroup=Debug /p:\"TargetQueues=Windows.10.Amd64\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
+ "PB_CreateHelixArguments": "/p:ArchGroup=x64 /p:TargetGroup=uapaot /p:ConfigurationGroup=Debug /p:\"TargetQueues=Windows.10.Amd64.ClientRS3\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
},
"ReportingParameters": {
"OperatingSystem": "Windows",
@@ -470,7 +470,7 @@
"PB_BuildArguments": "-framework:uapaot -buildArch=x86 -Debug -- /p:SignType=real /p:RuntimeOS=win10",
"PB_BuildTestsArguments": "-framework=uapaot -buildArch=x86 -Debug -SkipTests -- /p:RuntimeOS=win10 /p:ArchiveTests=true",
"PB_SyncArguments": "-p -- /p:ArchGroup=x86 /p:RuntimeOS=win10",
- "PB_CreateHelixArguments": "/p:ArchGroup=x86 /p:TargetGroup=uapaot /p:ConfigurationGroup=Debug /p:\"TargetQueues=Windows.10.Amd64\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
+ "PB_CreateHelixArguments": "/p:ArchGroup=x86 /p:TargetGroup=uapaot /p:ConfigurationGroup=Debug /p:\"TargetQueues=Windows.10.Amd64.ClientRS3\" /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:\"HelixJobType=test/functional/ilc/\""
},
"ReportingParameters": {
"OperatingSystem": "Windows",
diff --git a/buildpipeline/pipelinejobs.groovy b/buildpipeline/pipelinejobs.groovy
index 3bd0a3a47d..69778eb356 100644
--- a/buildpipeline/pipelinejobs.groovy
+++ b/buildpipeline/pipelinejobs.groovy
@@ -10,40 +10,50 @@ def project = GithubProject
def branch = GithubBranchName
// **************************
-// Define innerloop testing. These jobs run on every merge and a subset of them run on every PR, the ones
-// that don't run per PR can be requested via a magic phrase.
+// Define innerloop testing. Any configuration in ForPR will run for every PR but all other configurations
+// will have a trigger that can be
// **************************
-def linuxPipeline = Pipeline.createPipelineForGithub(this, project, branch, 'buildpipeline/portable-linux.groovy')
-
-['netcoreapp'].each { targetGroup ->
- ['Debug', 'Release'].each { configurationGroup ->
- ['Linux x64'].each { osName ->
- // Runs the portable-linux.groovy pipeline on the target Helix queues mentioned in the pipeline. Currently:
- // CentOS 7.3, RedHat 7.3, Debian 8.7, Ubuntu 14.04, Ubuntu 16.04, Ubuntu 16.10, openSuSE 42.2 and Fedora 25
-
- // One for just innerloop.
- linuxPipeline.triggerPipelineOnEveryGithubPR("Portable ${osName} ${configurationGroup} Build", ['Config':configurationGroup, 'OuterLoop':false])
- // Add one for outerloop
- linuxPipeline.triggerPipelineOnGithubPRComment("Portable Outerloop ${osName} ${configurationGroup} Build", ['Config':configurationGroup, 'OuterLoop':true])
- }
- }
-}
-
-// Create a pipeline for portable windows
-def windowsPipeline = Pipeline.createPipelineForGithub(this, project, branch, 'buildpipeline/portable-windows.groovy')
-['netcoreapp'].each { targetGroup ->
- ['Debug', 'Release'].each { configurationGroup ->
- ['Windows x64'].each { osName ->
- // Runs the portable-windows.groovy pipeline on the target Helix queues mentioned in the pipeline. Currently:
- // Windows 10, Windows 7, Windows 8.1 and Windows Nano
-
- // One for just innerloop
- windowsPipeline.triggerPipelineOnEveryGithubPR("Portable ${osName} ${configurationGroup} Build", ['Config':configurationGroup, 'OuterLoop':false])
- // Add one for outerloop
- windowsPipeline.triggerPipelineOnGithubPRComment("Portable Outerloop ${osName} ${configurationGroup} Build", ['Config':configurationGroup, 'OuterLoop':true])
- }
- }
-}
+
+def linPipeline = Pipeline.createPipelineForGithub(this, project, branch, 'buildpipeline/linux.groovy')
+def osxPipeline = Pipeline.createPipelineForGithub(this, project, branch, 'buildpipeline/osx.groovy')
+def winPipeline = Pipeline.createPipelineForGithub(this, project, branch, 'buildpipeline/windows.groovy')
+
+def configurations = [
+ ['TGroup':"netcoreapp", 'Pipeline':linPipeline, 'Name':'Linux' ,'ForPR':"Release-x64", 'Arch':['x64']],
+ ['TGroup':"netcoreapp", 'Pipeline':osxPipeline, 'Name':'OSX', 'ForPR':"Debug-x64", 'Arch':['x64']],
+ ['TGroup':"netcoreapp", 'Pipeline':winPipeline, 'Name':'Windows' , 'ForPR':"Debug-x64|Release-x86"],
+ ['TGroup':"netfx", 'Pipeline':winPipeline, 'Name':'NETFX', 'ForPR':"Release-x86"],
+ ['TGroup':"uap", 'Pipeline':winPipeline, 'Name':'UWP CoreCLR', 'ForPR':"Debug-x64"],
+ ['TGroup':"uapaot", 'Pipeline':winPipeline, 'Name':'UWP NETNative', 'ForPR':"Release-x86"],
+ ['TGroup':"all", 'Pipeline':winPipeline, 'Name':'Packaging All Configurations', 'ForPR':"Debug-x64"],
+]
+
+configurations.each { config ->
+ ['Debug', 'Release'].each { configurationGroup ->
+ (config.Arch ?: ['x64', 'x86']).each { archGroup ->
+ def triggerName = "${config.Name} ${archGroup} ${configurationGroup} Build"
+
+ def pipeline = config.Pipeline
+ def params = ['TGroup':config.TGroup,
+ 'CGroup':configurationGroup,
+ 'AGroup':archGroup,
+ 'TestOuter': false]
+
+ // Add default PR triggers for particular configurations but manual triggers for all
+ if (config.ForPR.contains("${configurationGroup}-${archGroup}")) {
+ pipeline.triggerPipelineOnEveryGithubPR(triggerName, params)
+ }
+ else {
+ pipeline.triggerPipelineOnGithubPRComment(triggerName, params)
+ }
+
+ // Add trigger for all configurations to run on merge
+ pipeline.triggerPipelineOnGithubPush(params)
+
+ // Add optional PR trigger for Outerloop test runs
+ params.TestOuter = true
+ pipeline.triggerPipelineOnGithubPRComment("Outerloop ${triggerName}", params)
+}}}
JobReport.Report.generateJobReport(out)
diff --git a/buildpipeline/portable-windows.groovy b/buildpipeline/portable-windows.groovy
deleted file mode 100644
index e5f222c0f6..0000000000
--- a/buildpipeline/portable-windows.groovy
+++ /dev/null
@@ -1,71 +0,0 @@
-@Library('dotnet-ci') _
-
-// Incoming parameters. Access with "params.<param name>".
-// Config - Build configuration. Note that we don't using 'Configuration' since it's used
-// in the build scripts and this can cause problems.
-// OuterLoop - If true, runs outerloop, if false runs just innerloop
-
-def submittedHelixJson = null
-
-simpleNode('Windows_NT','latest') {
- stage ('Checkout source') {
- retry (10) {
- checkout scm
- }
- }
-
- def logFolder = getLogFolder()
-
- stage ('Clean') {
- bat '.\\clean.cmd -all'
- }
- stage ('Sync') {
- bat '.\\sync.cmd -p -- /p:ArchGroup=x64 /p:RuntimeOS=win10'
- }
- stage ('Generate Version Assets') {
- bat '.\\build-managed.cmd -GenerateVersion'
- }
- stage ('Build Product') {
- bat ".\\build.cmd -buildArch=x64 -${params.Config} -- /p:SignType=real /p:RuntimeOS=win10"
- }
- stage ('Build Tests') {
- def additionalArgs = ''
- if (params.OuterLoop) {
- additionalArgs = '-Outerloop'
- }
- bat ".\\build-tests.cmd -buildArch=x64 -${params.Config} -SkipTests ${additionalArgs} -- /p:RuntimeOS=win10 /p:ArchiveTests=true"
- }
- stage ('Submit To Helix For Testing') {
- // Bind the credentials
- withCredentials([string(credentialsId: 'CloudDropAccessToken', variable: 'CloudDropAccessToken'),
- string(credentialsId: 'OutputCloudResultsAccessToken', variable: 'OutputCloudResultsAccessToken')]) {
- // Ask the CI SDK for a Helix source that makes sense. This ensures that this pipeline works for both PR and non-PR cases
- def helixSource = getHelixSource()
- // Ask the CI SDK for a Build that makes sense. We currently use the hash for the build
- def helixBuild = getCommit()
- // Get the user that should be associated with the submission
- def helixCreator = getUser()
-
- // Target queues
- def targetHelixQueues = ['Windows.10.Amd64.Open',
- 'Windows.10.Nano.Amd64.Open',
- 'Windows.7.Amd64.Open',
- 'Windows.81.Amd64.Open']
-
- bat "\"%VS140COMNTOOLS%\\VsDevCmd.bat\" && msbuild src\\upload-tests.proj /p:ArchGroup=x64 /p:ConfigurationGroup=${params.Config} /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:HelixJobType=test/functional/cli/ /p:HelixSource=${helixSource} /p:BuildMoniker=${helixBuild} /p:HelixCreator=${helixCreator} /p:CloudDropAccountName=dotnetbuilddrops /p:CloudResultsAccountName=dotnetjobresults /p:CloudDropAccessToken=%CloudDropAccessToken% /p:CloudResultsAccessToken=%OutputCloudResultsAccessToken% /p:HelixApiEndpoint=https://helix.dot.net/api/2017-04-14/jobs /p:TargetQueues=\"${targetHelixQueues.join(',')}\" /p:HelixLogFolder= /p:HelixLogFolder=${WORKSPACE}\\${logFolder}\\ /p:HelixCorrelationInfoFileName=SubmittedHelixRuns.txt"
-
- submittedHelixJson = readJSON file: "${logFolder}\\SubmittedHelixRuns.txt"
- }
- }
-}
-
-stage ('Execute Tests') {
- def contextBase
- if (params.OuterLoop) {
- contextBase = "Win x64 tests w/outer - ${params.Config}"
- }
- else {
- contextBase = "Win x64 tests - ${params.Config}"
- }
- waitForHelixRuns(submittedHelixJson, contextBase)
-} \ No newline at end of file
diff --git a/buildpipeline/security/DotNet-CoreFx-Security-Windows.json b/buildpipeline/security/DotNet-CoreFx-Security-Windows.json
new file mode 100644
index 0000000000..a95214d6ff
--- /dev/null
+++ b/buildpipeline/security/DotNet-CoreFx-Security-Windows.json
@@ -0,0 +1,564 @@
+{
+ "build": [
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Run clean.cmd",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "filename": "clean.cmd",
+ "arguments": "-all",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "failOnStandardError": "false"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Run sync to download packages",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "scriptType": "inlineScript",
+ "scriptName": "",
+ "arguments": "$(PB_CloudDropAccountName) $(PB_CloudDropAccessToken) $(PB_CloudDropContainer)",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "inlineScript": "param($account, $token, $container)\n.\\sync.cmd -ab -- /p:CloudDropAccountName=$account /p:CloudDropAccessToken=$token /p:ContainerName=$container",
+ "failOnStandardError": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Extract downloaded nupkgs",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "scriptType": "inlineScript",
+ "scriptName": "",
+ "arguments": "$(Build.SourcesDirectory)",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "inlineScript": "param($SrcDir)\n$secDir = Join-Path \"$SrcDir\" \"security\"\n$pkgDir = \"$SrcDir\\packages\\AzureTransfer\\Release\\symbols\"\ngci \"$pkgDir\\*.nupkg\" | rename-item -newname { [io.path]::ChangeExtension($_.name, \"zip\") }\ngci \"$pkgDir\\*.zip\" | % {\n$dstDir = Join-Path \"$secDir\" $($_.BaseName)\nExpand-Archive -Path $($_.FullName) -DestinationPath \"$dstDir\" -Force\n}\n",
+ "failOnStandardError": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": false,
+ "alwaysRun": false,
+ "displayName": "List all files",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "scriptType": "inlineScript",
+ "scriptName": "",
+ "arguments": "$(Build.SourcesDirectory)",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "inlineScript": "param($SrcDir)\n$fileCount = 0\ngci $SrcDir -recurse | % {\nWrite-Host $($_.FullName)\n$fileCount += 1\n}\nWrite-Host \"File Count: $fileCount\"\n",
+ "failOnStandardError": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Remove files other than DLLs, PDBs and TXT",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "scriptType": "inlineScript",
+ "scriptName": "",
+ "arguments": "$(Build.SourcesDirectory)",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "inlineScript": "param($SrcDir)\n$secDir = Join-Path \"$SrcDir\" \"security\"\n$extList = \".dll\", \".pdb\", \".txt\"\ngci $secDir -Recurse | where { !$_.PSIsContainer } | % {\nif ($extList -inotcontains $_.Extension)\n{\n rm $_.FullName -Force -ErrorAction SilentlyContinue\n Write-Host \"Removed $($_.FullName)\"\n}\n}\n\n",
+ "failOnStandardError": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Workaround for long path - DELETE files with path length greater than or equal to 240 characters",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "scriptType": "inlineScript",
+ "scriptName": "",
+ "arguments": "$(Build.SourcesDirectory)",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "inlineScript": "param($SrcDir)\n$longPath = New-Object System.Collections.ArrayList\ngci \"$SrcDir\\*\" -recurse | where {!$_.PSIsContainer} | % {\nif ($($_.FullName.Length) -ge 240)\n{\n$longPath.Add($($_.Directory.FullName)) | Out-Null\n}\n}\n$longPath | % {\nStart-Process \"cmd\" -ArgumentList \"/c rd /S /Q $_\" -Wait\nWrite-Host \"DELETED $_\"\n}\n",
+ "failOnStandardError": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": false,
+ "alwaysRun": false,
+ "displayName": "List all files - post delete",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "scriptType": "inlineScript",
+ "scriptName": "",
+ "arguments": "$(Build.SourcesDirectory)",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "inlineScript": "param($SrcDir)\n$fileCount = 0\ngci $SrcDir -recurse | % {\nWrite-Host $($_.FullName)\n$fileCount += 1\n}\nWrite-Host \"File Count: $fileCount\"\n",
+ "failOnStandardError": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Run BinSkim ",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "3056813a-40e9-4b2f-8f6b-612d1bc4e045",
+ "versionSpec": "3.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "InputType": "CommandLine",
+ "arguments": "analyze security\\*.dll --recurse --sympath security\\*.pdb --verbose --statistics",
+ "Function": "analyze",
+ "AnalyzeTarget": "$(Build.ArtifactStagingDirectory)",
+ "AnalyzeSymPath": "",
+ "AnalyzeConfigPath": "default",
+ "AnalyzePluginPath": "",
+ "AnalyzeRecurse": "true",
+ "AnalyzeVerbose": "true",
+ "AnalyzeHashes": "true",
+ "AnalyzeStatistics": "false",
+ "AnalyzeEnvironment": "false",
+ "ExportRulesOutputType": "SARIF",
+ "DumpTarget": "$(Build.ArtifactStagingDirectory)",
+ "DumpRecurse": "true",
+ "DumpVerbose": "true",
+ "toolVersion": "Latest"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Run APIScan",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "9adea2b1-3752-438c-80c6-a6f0a812abdd",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "targetMode": "binarysym",
+ "softwareFolder": "$(Build.SourcesDirectory)\\security",
+ "mpdFolder": "",
+ "softwareName": "CoreFx",
+ "softwareVersionNum": "$(PB_BuildNumber)",
+ "softwareBuildNum": "$(PB_BuildNumber)",
+ "modeType": "prerelease",
+ "noCopySymbols": "false",
+ "noCopyBinaries": "false",
+ "noDecompress": "true",
+ "exclusionList": "",
+ "email": "",
+ "symbolsFolder": "$(Build.SourcesDirectory)\\security",
+ "preBbtBinariesFolder": "",
+ "preBbtSymbolsFolder": "",
+ "isLargeApp": "false",
+ "analyzerTimeout": "00:00:00",
+ "preserveTempFiles": "false",
+ "toolVersion": "Latest"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": false,
+ "alwaysRun": false,
+ "displayName": "git checkout",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "scriptType": "inlineScript",
+ "scriptName": "",
+ "arguments": "$(Build.SourcesDirectory) \"$(PB_Git)\"",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "inlineScript": "param($SrcDir, $git)\n$pkgExtPath= Join-Path \"$SrcDir\" \"security\"\ngci \"$pkgExtPath\\version.txt\" -Recurse | % { \n$sha = gc $_\nWrite-Host \"$sha\"\nif (-not [string]::IsNullOrWhiteSpace($sha))\n{\nStart-Process \"$git\" -ArgumentList \"checkout -- .\" -Wait -Verbose -ErrorAction Stop\nStart-Process \"$git\" -ArgumentList \"checkout $sha\" -Wait -Verbose -ErrorAction Stop\nWrite-Host \"Checked out at $sha\"\nbreak\n}\n}",
+ "failOnStandardError": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Run CredScan",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "ea576cd4-c61f-48f8-97e7-a3cb07b90a6f",
+ "versionSpec": "2.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "outputFormat": "pre",
+ "toolVersion": "Latest",
+ "scanFolder": "$(Build.SourcesDirectory)",
+ "searchersFileType": "Default",
+ "searchersFile": "",
+ "suppressionsFile": "",
+ "suppressAsError": "false",
+ "batchSize": ""
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Run PoliCheck",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "d785890c-0d0d-46bd-8167-8fa9d49990c7",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "inputType": "Basic",
+ "cmdLineArgs": "/F:$(Build.SourcesDirectory) /T:9 /O:PoliCheck.xml",
+ "targetType": "F",
+ "targetArgument": "$(Build.SourcesDirectory)",
+ "importEx": "0",
+ "termTypeT": "0029a9",
+ "termTypeTCustom": "9",
+ "termTypeK": "",
+ "termTypeL": "",
+ "EXGT": "false",
+ "result": "PoliCheck.xml",
+ "optionsFC": "1",
+ "optionsXS": "1",
+ "optionsCTGLEN": "",
+ "optionsSEV": "",
+ "optionsPE": "",
+ "optionsHMENABLE": "",
+ "optionsHPATH": "",
+ "optionsHVER": "",
+ "optionsRulesDBPath": "",
+ "optionsRule": "",
+ "optionsXCLASS": "",
+ "optionsTASKNAME": "",
+ "optionsWORKINGDIRECTORY": "",
+ "optionsFTPATH": "",
+ "optionsD": "",
+ "optionsB1": "",
+ "optionsB2": "",
+ "optionsB3": "",
+ "optionsOCDB": "",
+ "toolVersion": "Latest"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Post Analysis",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "f5679091-e6da-4974-a8dc-0eec03a8ea63",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "APIScan": "true",
+ "BinScope": "false",
+ "BinSkim": "true",
+ "BinSkimBreakOn": "Error",
+ "CredScan": "true",
+ "FortifySCA": "false",
+ "FxCop": "false",
+ "FxCopBreakOn": "ErrorAbove",
+ "ModernCop": "false",
+ "ModernCopBreakOn": "Error",
+ "PoliCheck": "true",
+ "PoliCheckBreakOn": "Severity1",
+ "SDLNativeRules": "false"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Publish Security Analysis Logs",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "4096c760-3a8a-435d-9689-88c0311bbc0e",
+ "versionSpec": "2.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "ArtifactName": "CodeAnalysisLogs",
+ "ArtifactType": "Container",
+ "TargetPath": "\\\\my\\share\\$(Build.DefinitionName)\\$(Build.BuildNumber)",
+ "RvName": "",
+ "ProductComponentName": "",
+ "ProductVersionNumber": "",
+ "PlatformName": "",
+ "SDLToolName": "",
+ "SDLToolResultFile": ""
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "TSA upload to Codebase: DotNet-CoreFx-Trusted_master Stamp: Azure",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "3da26988-bb64-4a23-8f06-45531d297dae",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "codebase": "NewOrUpdate",
+ "tsaStamp": "Azure",
+ "tsaWebApiUrl": "$(TSAStamp)",
+ "codeBaseName": "DotNet-CoreFx-Trusted_master",
+ "notificationAlias": "dncsec@microsoft.com",
+ "codeBaseAdmins": "NORTHAMERICA\\raeda",
+ "instanceUrlAzure": "MSAZURE",
+ "instanceUrlDevDiv": "DEVDIV",
+ "projectNameMSAZURE": "One",
+ "projectNameIDENTITYDIVISION": "",
+ "projectNameDEVDIV": "DevDiv",
+ "areaPath": "One\\DevDiv\\DotNetCore",
+ "iterationPath": "One",
+ "uploadAPIScan": "true",
+ "uploadBinScope": "false",
+ "uploadBinSkim": "true",
+ "uploadCredScan": "true",
+ "uploadFortifySCA": "false",
+ "uploadFxCop": "false",
+ "uploadModernCop": "false",
+ "uploadPoliCheck": "true",
+ "uploadPREfast": "false",
+ "validateToolOutput": "Warning",
+ "validateCompatibility": "Error",
+ "uploadAsync": "true"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": true,
+ "alwaysRun": false,
+ "displayName": "Run clean.cmd",
+ "timeoutInMinutes": 0,
+ "condition": "succeeded()",
+ "task": {
+ "id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "filename": "clean.cmd",
+ "arguments": "-all",
+ "workingFolder": "$(Build.SourcesDirectory)",
+ "failOnStandardError": "false"
+ }
+ }
+ ],
+ "options": [
+ {
+ "enabled": false,
+ "definition": {
+ "id": "5bc3cfb7-6b54-4a4b-b5d2-a3905949f8a6"
+ },
+ "inputs": {}
+ },
+ {
+ "enabled": false,
+ "definition": {
+ "id": "7c555368-ca64-4199-add6-9ebaf0b0137d"
+ },
+ "inputs": {
+ "multipliers": "[]",
+ "parallel": "false",
+ "continueOnError": "true",
+ "additionalFields": "{}"
+ }
+ },
+ {
+ "enabled": false,
+ "definition": {
+ "id": "a9db38f9-9fdc-478c-b0f9-464221e58316"
+ },
+ "inputs": {
+ "workItemType": "234347",
+ "assignToRequestor": "true",
+ "additionalFields": "{}"
+ }
+ },
+ {
+ "enabled": false,
+ "definition": {
+ "id": "57578776-4c22-4526-aeb0-86b6da17ee9c"
+ },
+ "inputs": {}
+ },
+ {
+ "enabled": false,
+ "definition": {
+ "id": "5d58cc01-7c75-450c-be18-a388ddb129ec"
+ },
+ "inputs": {
+ "branchFilters": "[\"+refs/heads/*\"]",
+ "additionalFields": "{}"
+ }
+ }
+ ],
+ "variables": {
+ "system.debug": {
+ "value": "false"
+ },
+ "CorefxGitUrl": {
+ "value": "https://github.com/dotnet/corefx"
+ }
+ },
+ "demands": [
+ "Agent.OS -equals windows_nt",
+ "msbuild"
+ ],
+ "retentionRules": [
+ {
+ "branches": [
+ "+refs/heads/*"
+ ],
+ "artifacts": [
+ "build.SourceLabel"
+ ],
+ "artifactTypesToDelete": [],
+ "daysToKeep": 10,
+ "minimumToKeep": 1,
+ "deleteBuildRecord": true,
+ "deleteTestResults": true
+ }
+ ],
+ "_links": {
+ "self": {
+ "href": "https://devdiv.visualstudio.com/0bdbc590-a062-4c3f-b0f6-9383f67865ee/_apis/build/Definitions/6389"
+ },
+ "web": {
+ "href": "https://devdiv.visualstudio.com/_permalink/_build/index?collectionId=011b8bdf-6d56-4f87-be0d-0092136884d9&projectId=0bdbc590-a062-4c3f-b0f6-9383f67865ee&definitionId=6389"
+ },
+ "editor": {
+ "href": "https://devdiv.visualstudio.com/_permalink/_build/definitionEditor?collectionId=011b8bdf-6d56-4f87-be0d-0092136884d9&projectId=0bdbc590-a062-4c3f-b0f6-9383f67865ee&definitionId=6389"
+ },
+ "badge": {
+ "href": "https://devdiv.visualstudio.com/_apis/public/build/definitions/0bdbc590-a062-4c3f-b0f6-9383f67865ee/6389/badge"
+ }
+ },
+ "buildNumberFormat": "$(date:yyyyMMdd)$(rev:-rr)",
+ "jobAuthorizationScope": 1,
+ "jobTimeoutInMinutes": 600,
+ "jobCancelTimeoutInMinutes": 5,
+ "badgeEnabled": true,
+ "repository": {
+ "properties": {
+ "cleanOptions": "3",
+ "labelSources": "0",
+ "labelSourcesFormat": "$(build.buildNumber)",
+ "reportBuildStatus": "true",
+ "gitLfsSupport": "false",
+ "skipSyncSource": "false",
+ "checkoutNestedSubmodules": "false",
+ "fetchDepth": "0"
+ },
+ "id": "58fa2458-e392-4373-ba2b-dd3ef0c2d7ce",
+ "type": "TfsGit",
+ "name": "DotNet-CoreFX-Trusted",
+ "url": "https://devdiv.visualstudio.com/DevDiv/_git/DotNet-CoreFX-Trusted",
+ "defaultBranch": "refs/heads/master",
+ "clean": "true",
+ "checkoutSubmodules": false
+ },
+ "processParameters": {},
+ "quality": 1,
+ "authoredBy": {
+ "id": "9d5fdf9f-36b6-4d0c-a12e-2737a673af94",
+ "displayName": "Ravi Eda",
+ "uniqueName": "raeda@microsoft.com",
+ "url": "https://app.vssps.visualstudio.com/Aa44b2c06-f247-425c-8464-4a0676af910a/_apis/Identities/9d5fdf9f-36b6-4d0c-a12e-2737a673af94",
+ "imageUrl": "https://devdiv.visualstudio.com/_api/_common/identityImage?id=9d5fdf9f-36b6-4d0c-a12e-2737a673af94"
+ },
+ "queue": {
+ "id": 36,
+ "name": "DotNet-Build",
+ "pool": {
+ "id": 39,
+ "name": "DotNet-Build"
+ }
+ },
+ "id": 6389,
+ "name": "DotNet-CoreFx-Security-Windows",
+ "url": "https://devdiv.visualstudio.com/0bdbc590-a062-4c3f-b0f6-9383f67865ee/_apis/build/Definitions/6389",
+ "uri": "vstfs:///Build/Definition/6389",
+ "path": "\\",
+ "type": 2,
+ "revision": 152,
+ "createdDate": "2017-06-08T18:05:53.047Z",
+ "project": {
+ "id": "0bdbc590-a062-4c3f-b0f6-9383f67865ee",
+ "name": "DevDiv",
+ "description": "Visual Studio and DevDiv team project for git source code repositories. Work items will be added for Adams, Dev14 work items are tracked in vstfdevdiv. ",
+ "url": "https://devdiv.visualstudio.com/_apis/projects/0bdbc590-a062-4c3f-b0f6-9383f67865ee",
+ "state": "wellFormed",
+ "revision": 418097676,
+ "visibility": 0
+ }
+}
diff --git a/buildpipeline/security/pipeline.json b/buildpipeline/security/pipeline.json
new file mode 100644
index 0000000000..ebce69b6c2
--- /dev/null
+++ b/buildpipeline/security/pipeline.json
@@ -0,0 +1,22 @@
+{
+ "Repository": "corefx",
+ "Definitions": {
+ "Path": ".",
+ "Type": "VSTS",
+ "BaseUrl": "https://devdiv.visualstudio.com/DefaultCollection",
+ "SkipBranchAndVersionOverrides": "false"
+ },
+ "Pipelines": [
+ {
+ "Name": "Security Build for Windows",
+ "Parameters": {
+ "TreatWarningsAsErrors": "false"
+ },
+ "Definitions": [
+ {
+ "Name": "DotNet-CoreFx-Security-Windows"
+ }
+ ]
+ }
+ ]
+}
diff --git a/buildpipeline/windows.groovy b/buildpipeline/windows.groovy
new file mode 100644
index 0000000000..e562a8e462
--- /dev/null
+++ b/buildpipeline/windows.groovy
@@ -0,0 +1,107 @@
+@Library('dotnet-ci') _
+
+// Incoming parameters. Access with "params.<param name>".
+// Note that the parameters will be set as env variables so we cannot use names that conflict
+// with the engineering system parameter names.
+// TGroup - The target framework to build.
+// CGroup - Build configuration.
+// TestOuter - If true, runs outerloop, if false runs just innerloop
+
+def submittedHelixJson = null
+def submitToHelix = (params.TGroup == 'netcoreapp')
+
+simpleNode('Windows_NT','latest') {
+ stage ('Checkout source') {
+ retry (10) {
+ checkout scm
+ }
+ }
+
+ def logFolder = getLogFolder()
+ def framework = ''
+ if (params.TGroup == 'all') {
+ framework = '-allConfigurations'
+ }
+ else {
+ framework = "-framework:${params.TGroup}"
+ }
+ def buildTests = (params.TGroup != 'all')
+
+ stage ('Initialize tools') {
+ try {
+ // Init tools
+ bat '.\\init-tools.cmd'
+ // Temporarily always dump the init-tools.log to try and identify why sometimes it takes really long
+ bat 'type init-tools.log'
+ }
+ catch (err) {
+ // On errors for build tools initializations, it's useful to echo the contents of the file
+ // for easy diagnosis. This could also be copied to the log directory
+ bat 'type init-tools.log'
+ // Ensure the build result is still propagated.
+ throw err
+ }
+ }
+ stage ('Sync') {
+ bat ".\\sync.cmd -p -- /p:ArchGroup=${params.AGroup} /p:RuntimeOS=win10"
+ }
+ stage ('Generate Version Assets') {
+ bat '.\\build-managed.cmd -GenerateVersion'
+ }
+ stage ('Build Product') {
+ bat ".\\build.cmd ${framework} -buildArch=${params.AGroup} -${params.CGroup} -- /p:RuntimeOS=win10"
+ }
+ if (buildTests) {
+ stage ('Build Tests') {
+ def additionalArgs = ''
+ def archiveTests = 'false'
+ if (params.TestOuter) {
+ additionalArgs += ' -Outerloop'
+ }
+ if (submitToHelix) {
+ archiveTests = 'true'
+ }
+ if (submitToHelix || params.TGroup == 'uap' || params.TGroup == 'uapaot') {
+ additionalArgs += ' -SkipTests'
+ }
+ bat ".\\build-tests.cmd ${framework} -buildArch=${params.AGroup} -${params.CGroup}${additionalArgs} -- /p:RuntimeOS=win10 /p:ArchiveTests=${archiveTests}"
+ }
+ }
+ if (submitToHelix) {
+ stage ('Submit To Helix For Testing') {
+ // Bind the credentials
+ withCredentials([string(credentialsId: 'CloudDropAccessToken', variable: 'CloudDropAccessToken'),
+ string(credentialsId: 'OutputCloudResultsAccessToken', variable: 'OutputCloudResultsAccessToken')]) {
+ // Ask the CI SDK for a Helix source that makes sense. This ensures that this pipeline works for both PR and non-PR cases
+ def helixSource = getHelixSource()
+ // Ask the CI SDK for a Build that makes sense. We currently use the hash for the build
+ def helixBuild = getCommit()
+ // Get the user that should be associated with the submission
+ def helixCreator = getUser()
+
+ // Target queues
+ def targetHelixQueues = ['Windows.10.Amd64.Open',
+ 'Windows.10.Nano.Amd64.Open',
+ 'Windows.7.Amd64.Open',
+ 'Windows.81.Amd64.Open']
+
+ bat "\"%VS140COMNTOOLS%\\VsDevCmd.bat\" && msbuild src\\upload-tests.proj /p:ArchGroup=${params.AGroup} /p:ConfigurationGroup=${params.CGroup} /p:TestProduct=corefx /p:TimeoutInSeconds=1200 /p:TargetOS=Windows_NT /p:HelixJobType=test/functional/cli/ /p:HelixSource=${helixSource} /p:BuildMoniker=${helixBuild} /p:HelixCreator=${helixCreator} /p:CloudDropAccountName=dotnetbuilddrops /p:CloudResultsAccountName=dotnetjobresults /p:CloudDropAccessToken=%CloudDropAccessToken% /p:CloudResultsAccessToken=%OutputCloudResultsAccessToken% /p:HelixApiEndpoint=https://helix.dot.net/api/2017-04-14/jobs /p:TargetQueues=\"${targetHelixQueues.join(',')}\" /p:HelixLogFolder= /p:HelixLogFolder=${WORKSPACE}\\${logFolder}\\ /p:HelixCorrelationInfoFileName=SubmittedHelixRuns.txt"
+
+ submittedHelixJson = readJSON file: "${logFolder}\\SubmittedHelixRuns.txt"
+ }
+ }
+ }
+}
+
+if (submitToHelix) {
+ stage ('Execute Tests') {
+ def contextBase
+ if (params.TestOuter) {
+ contextBase = "Win tests w/outer - ${params.AGroup} ${params.CGroup}"
+ }
+ else {
+ contextBase = "Win tests - ${params.AGroup} ${params.CGroup}"
+ }
+ waitForHelixRuns(submittedHelixJson, contextBase)
+ }
+} \ No newline at end of file
diff --git a/config.json b/config.json
index d30f859467..bf20cb414a 100644
--- a/config.json
+++ b/config.json
@@ -233,9 +233,78 @@
"valueType": "target",
"values": [],
"defaultValue": ""
- }
+ },
+ "DirectoryToBuild": {
+ "description": "MsBuild property used to set the directory to scope the build to things under that directory.",
+ "valueType": "property",
+ "values": [],
+ "defaultValue": "Please-Specify-A-Directory"
+ },
},
"commands": {
+ "build-directory": {
+ "alias":{
+ "directory": {
+ "description": "Root directory in which to scope the build from.",
+ "settings": {
+ "DirectoryToBuild": "default"
+ }
+ },
+ "debug": {
+ "description": "Sets optimization level to debug for managed build configuration. (/p:ConfigurationGroup=Debug)",
+ "settings": {
+ "ConfigurationGroup": "Debug"
+ }
+ },
+ "release": {
+ "description": "Sets optimization level to release for managed build configuration. (/p:ConfigurationGroup=Release)",
+ "settings": {
+ "ConfigurationGroup": "Release"
+ }
+ },
+ "allConfigurations": {
+ "description": "Builds all configurations instead of only those specified by framework/os.",
+ "settings": {
+ "BuildAllConfigurations":"true"
+ }
+ },
+ "framework": {
+ "description": "Sets target framework for managed build configuration and only builds the libraries applicable for that framework. (/p:TargetGroup=[value])",
+ "settings": {
+ "TargetGroup": "default"
+ }
+ },
+ "os": {
+ "description": "Sets OS for the managed build configuration and only builds the libraries applicable for that OS. (/p:OSGroup=[value])",
+ "settings": {
+ "OSGroup": "default"
+ }
+ },
+ "buildArch": {
+ "description": "Sets the architecture for the managed build confiuguration. (/p:ArchGroup=[value])",
+ "settings": {
+ "ArchGroup": "default"
+ }
+ },
+ "runtimeos": {
+ "description": "Sets runtime OS for the managed build configuration, which is used for building and restoring native OS dependent assets (i.e. RID specific binaries). (/p:RuntimeOS=[value]",
+ "settings": {
+ "RuntimeOS": "default"
+ }
+ },
+ },
+ "defaultValues": {
+ "toolName": "msbuild",
+ "settings": {
+ "Project": "src/dirs.proj",
+ "ConfigurationGroup": "default",
+ "DirectoryToBuild": "default",
+ "MsBuildLogging":"default",
+ "MsBuildWarning":"default",
+ "MsBuildError":"default"
+ }
+ }
+ },
"build-managed": {
"alias":{
"packages": {
diff --git a/cross/arm32_ci_script.sh b/cross/arm32_ci_script.sh
index c9630dc870..991842aa89 100755
--- a/cross/arm32_ci_script.sh
+++ b/cross/arm32_ci_script.sh
@@ -235,9 +235,10 @@ function cross_build_corefx_with_docker {
# Cross building corefx with rootfs in Docker
if [ "$__buildArch" == "armel" ]; then
__extraCmd="/p:OverridePackageSource=https://tizen.myget.org/F/dotnet-core/api/v3/index.json"
+ __portableLinux="-PortableBuild=false"
fi
- __buildCmd="./build.sh -buildArch=$__buildArch -$__buildConfig -RuntimeOS=$__runtimeOS -- $__extraCmd"
+ __buildCmd="./build.sh -buildArch=$__buildArch -$__buildConfig -RuntimeOS=$__runtimeOS $__portableLinux -- $__extraCmd"
$__dockerCmd $__buildCmd
sudo chown -R $(id -u -n) ./bin
}
diff --git a/dependencies.props b/dependencies.props
index f4cea44743..f37bfd853d 100644
--- a/dependencies.props
+++ b/dependencies.props
@@ -9,28 +9,28 @@
These ref versions are pulled from https://github.com/dotnet/versions.
-->
<PropertyGroup>
- <CoreFxCurrentRef>156d7c16cff74e50054ed195286aa53b887501e2</CoreFxCurrentRef>
- <CoreClrCurrentRef>156d7c16cff74e50054ed195286aa53b887501e2</CoreClrCurrentRef>
- <CoreSetupCurrentRef>156d7c16cff74e50054ed195286aa53b887501e2</CoreSetupCurrentRef>
+ <CoreFxCurrentRef>0859ae7107594b08945c0656dbf0e5e65ad3290a</CoreFxCurrentRef>
+ <CoreClrCurrentRef>01f90a3cfd90a2f33f08269244fcd876bb9f2fae</CoreClrCurrentRef>
+ <CoreSetupCurrentRef>0859ae7107594b08945c0656dbf0e5e65ad3290a</CoreSetupCurrentRef>
<ExternalCurrentRef>5a0606fccb09fce4b47545ae9896139acca547f5</ExternalCurrentRef>
- <ProjectNTfsCurrentRef>b1943f0630fb979a7e9ead2b86a6933d6c9409e9</ProjectNTfsCurrentRef>
- <ProjectNTfsTestILCCurrentRef>b1943f0630fb979a7e9ead2b86a6933d6c9409e9</ProjectNTfsTestILCCurrentRef>
+ <ProjectNTfsCurrentRef>2a896751f5d60ffb8e87e6af5242529b7aa5d0d7</ProjectNTfsCurrentRef>
+ <ProjectNTfsTestILCCurrentRef>2a896751f5d60ffb8e87e6af5242529b7aa5d0d7</ProjectNTfsTestILCCurrentRef>
<SniCurrentRef>97059fa979a3c8fb8b9fba127c526f15e48c9dde</SniCurrentRef>
- <StandardCurrentRef>156d7c16cff74e50054ed195286aa53b887501e2</StandardCurrentRef>
+ <StandardCurrentRef>01f90a3cfd90a2f33f08269244fcd876bb9f2fae</StandardCurrentRef>
</PropertyGroup>
<!-- Auto-upgraded properties for each build info dependency. -->
<PropertyGroup>
<PlatformPackageVersion>2.1.0-preview1-25324-02</PlatformPackageVersion>
- <CoreFxExpectedPrerelease>preview1-25413-01</CoreFxExpectedPrerelease>
- <CoreClrPackageVersion>2.1.0-preview1-25412-03</CoreClrPackageVersion>
+ <CoreFxExpectedPrerelease>preview1-25420-01</CoreFxExpectedPrerelease>
+ <CoreClrPackageVersion>2.1.0-preview1-25419-02</CoreClrPackageVersion>
<ExternalExpectedPrerelease>beta-25322-00</ExternalExpectedPrerelease>
- <ProjectNTfsExpectedPrerelease>beta-25413-00</ProjectNTfsExpectedPrerelease>
- <ProjectNTfsTestILCExpectedPrerelease>beta-25413-00</ProjectNTfsTestILCExpectedPrerelease>
- <ProjectNTfsTestILCPackageVersion>1.0.0-beta-25413-00</ProjectNTfsTestILCPackageVersion>
- <NETStandardPackageVersion>2.1.0-preview1-25412-01</NETStandardPackageVersion>
+ <ProjectNTfsExpectedPrerelease>beta-25420-00</ProjectNTfsExpectedPrerelease>
+ <ProjectNTfsTestILCExpectedPrerelease>beta-25420-00</ProjectNTfsTestILCExpectedPrerelease>
+ <ProjectNTfsTestILCPackageVersion>1.0.0-beta-25420-00</ProjectNTfsTestILCPackageVersion>
+ <NETStandardPackageVersion>2.1.0-preview1-25419-01</NETStandardPackageVersion>
<NETStandardPackageId>NETStandard.Library</NETStandardPackageId>
- <MicrosoftNETCoreAppPackageVersion>2.1.0-preview1-25412-02</MicrosoftNETCoreAppPackageVersion>
+ <MicrosoftNETCoreAppPackageVersion>2.1.0-preview1-25419-02</MicrosoftNETCoreAppPackageVersion>
<!-- Use the SNI runtime package -->
<SniPackageVersion>4.4.0-preview2-25312-01</SniPackageVersion>
</PropertyGroup>
diff --git a/external/test-runtime/XUnit.Runtime.depproj b/external/test-runtime/XUnit.Runtime.depproj
index 949ed87122..e4b8ae2367 100644
--- a/external/test-runtime/XUnit.Runtime.depproj
+++ b/external/test-runtime/XUnit.Runtime.depproj
@@ -86,6 +86,16 @@
<PackageToInclude Include="$(XUnitRunnerPackageId)" />
</ItemGroup>
+ <PropertyGroup Condition="'$(TargetGroup)' == 'uap'">
+ <UAPToolsPackageVersion>1.0.8</UAPToolsPackageVersion>
+ </PropertyGroup>
+
+ <ItemGroup Condition="'$(TargetGroup)' == 'uap'">
+ <PackageReference Include="Microsoft.DotNet.UAP.TestTools">
+ <Version>$(UAPToolsPackageVersion)</Version>
+ </PackageReference>
+ </ItemGroup>
+
<!-- System.Data.SqlClient tests require sni.dll in the test folder -->
<ItemGroup Condition="'$(TargetGroup)' == 'uapaot'">
<PackageReference Include="runtime.native.System.Data.SqlClient.sni">
@@ -114,7 +124,6 @@
Condition="'$(TargetGroup)'=='uap'" >
<PropertyGroup>
- <UAPToolsPackageVersion>1.0.2</UAPToolsPackageVersion>
<UAPToolsPackageName>microsoft.dotnet.uap.testtools</UAPToolsPackageName>
<UAPToolsFolder Condition="'$(UAPToolsFolder)'==''">$(PackagesDir)$(UAPToolsPackageName)\$(UAPToolsPackageVersion)\Tools</UAPToolsFolder>
diff --git a/external/test-runtime/optional.json b/external/test-runtime/optional.json
index d50a0489ac..4a0d64f32a 100644
--- a/external/test-runtime/optional.json
+++ b/external/test-runtime/optional.json
@@ -3,10 +3,9 @@
"net45": {
"dependencies": {
"Microsoft.DotNet.IBCMerge": "4.6.0-alpha-00001",
- "Microsoft.DotNet.UAP.TestTools": "1.0.2",
- "TestILC.amd64ret": "1.0.0-beta-25413-00",
- "TestILC.armret": "1.0.0-beta-25413-00",
- "TestILC.x86ret": "1.0.0-beta-25413-00"
+ "TestILC.amd64ret": "1.0.0-beta-25420-00",
+ "TestILC.armret": "1.0.0-beta-25420-00",
+ "TestILC.x86ret": "1.0.0-beta-25420-00"
}
}
}
diff --git a/netci.groovy b/netci.groovy
index e6ec812250..6fb478617b 100644
--- a/netci.groovy
+++ b/netci.groovy
@@ -25,8 +25,6 @@ def osGroupMap = ['Windows 7':'Windows_NT',
'OpenSUSE13.2': 'Linux',
'OpenSUSE42.1': 'Linux',
'RHEL7.2': 'Linux',
- 'Tizen': 'Linux',
- 'LinuxARMEmulator': 'Linux',
'PortableLinux': 'Linux']
def osShortName = ['Windows 7' : 'win7',
@@ -47,12 +45,10 @@ def buildArchConfiguration = ['Debug': 'x86',
'Release': 'x64']
def targetGroupOsMapOuterloop = ['netcoreapp': ['Windows 7', 'Windows_NT', 'Ubuntu14.04', 'Ubuntu16.04', 'Ubuntu16.10', 'CentOS7.1', 'OpenSUSE13.2', 'OpenSUSE42.1',
- 'RHEL7.2', 'Fedora24', 'Debian8.4', 'OSX10.12', 'PortableLinux'],
- 'netfx': ['Windows_NT']]
+ 'RHEL7.2', 'Fedora24', 'Debian8.4', 'OSX10.12', 'PortableLinux']]
def targetGroupOsMapInnerloop = ['netcoreapp': ['Windows_NT', 'Ubuntu14.04', 'Ubuntu16.04', 'Ubuntu16.10', 'CentOS7.1', 'OpenSUSE13.2', 'OpenSUSE42.1',
- 'RHEL7.2', 'Fedora24', 'Debian8.4', 'OSX10.12', 'PortableLinux'],
- 'netfx': ['Windows_NT']]
+ 'RHEL7.2', 'Fedora24', 'Debian8.4', 'OSX10.12', 'PortableLinux']]
// **************************
// Define code coverage build
@@ -127,7 +123,7 @@ def targetGroupOsMapInnerloop = ['netcoreapp': ['Windows_NT', 'Ubuntu14.04', 'Ub
// Define outerloop testing for OSes that can build and run. Run locally on each machine.
// **************************
[true, false].each { isPR ->
- ['netcoreapp', 'netfx'].each { targetGroup ->
+ ['netcoreapp'].each { targetGroup ->
(targetGroupOsMapOuterloop[targetGroup]).each { osName ->
['Debug', 'Release'].each { configurationGroup ->
@@ -210,81 +206,13 @@ def targetGroupOsMapInnerloop = ['netcoreapp': ['Windows_NT', 'Ubuntu14.04', 'Ub
}
}
-// **************************
-// Define target group vertical builds that will run on every merge.
-// **************************
-[true, false].each { isPR ->
- ['uap', 'uapaot'].each { targetGroup ->
- ['Debug'].each { configurationGroup ->
- ['Windows_NT'].each { osName ->
- def osGroup = osGroupMap[osName]
- def osForMachineAffinity = osName
-
- def newJobName = "${targetGroup}_${configurationGroup.toLowerCase()}"
-
- def newJob = job(Utilities.getFullJobName(project, newJobName, isPR)) {
- // On Windows we use the packer to put together everything. On *nix we use tar
- steps {
- batchFile("call \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat\" x86 && build.cmd -${configurationGroup} -framework:${targetGroup}")
- batchFile("call \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat\" x86 && build-tests.cmd -${configurationGroup} -framework:${targetGroup} -SkipTests")
- }
- }
- // Set the affinity.
- Utilities.setMachineAffinity(newJob, osForMachineAffinity, 'latest-or-auto')
- // Set up standard options.
- Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
- // Set up triggers
- if (isPR) {
- Utilities.addGithubPRTriggerForBranch(newJob, branch, "Vertical ${targetGroup} Build")
- }
- else {
- // Set a push trigger
- Utilities.addGithubPushTrigger(newJob)
- }
- }
- }
- }
-}
-
-// **************************
-// Define AllConfigurations builds that will run on every merge.
-// **************************
-[true, false].each { isPR ->
- ['Debug'].each { configurationGroup ->
- ['Windows_NT'].each { osName ->
- def osGroup = osGroupMap[osName]
- def osForMachineAffinity = osName
-
- def newJobName = "AllConfigurations_${configurationGroup.toLowerCase()}"
-
- def newJob = job(Utilities.getFullJobName(project, newJobName, isPR)) {
- // On Windows we use the packer to put together everything. On *nix we use tar
- steps {
- batchFile("call \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat\" x86 && build.cmd -${configurationGroup} -allConfigurations")
- }
- }
- // Set the affinity.
- Utilities.setMachineAffinity(newJob, osForMachineAffinity, 'latest-or-auto')
- // Set up standard options.
- Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
- // Set up triggers
- if (isPR) {
- Utilities.addGithubPRTriggerForBranch(newJob, branch, "${osName} ${configurationGroup} AllConfigurations Build")
- }
- else {
- // Set a push trigger
- Utilities.addGithubPushTrigger(newJob)
- }
- }
- }
-}
// **************************
// Define innerloop testing. These jobs run on every merge and a subset of them run on every PR, the ones
// that don't run per PR can be requested via a magic phrase.
// **************************
[true, false].each { isPR ->
- ['netcoreapp', 'netfx'].each { targetGroup ->
+ ['netcoreapp'].each { targetGroup ->
(targetGroupOsMapInnerloop[targetGroup]).each { osName ->
['Debug', 'Release'].each { configurationGroup ->
def osGroup = osGroupMap[osName]
@@ -341,13 +269,7 @@ def targetGroupOsMapInnerloop = ['netcoreapp': ['Windows_NT', 'Ubuntu14.04', 'Ub
// Set up triggers
if (isPR) {
targetGroupString = targetGroupString.replaceAll('_', ' ');
- // Set PR trigger only run netfx jobs automatically on every PR, the other legs except OSX10.12 are covered by the new portable pipeline legs
- if (targetGroup == 'netfx' || osName == 'OSX10.12') {
- Utilities.addGithubPRTriggerForBranch(newJob, branch, "Innerloop ${targetGroupString}${osName} ${configurationGroup} ${archGroup} Build and Test")
- }
- else {
- Utilities.addGithubPRTriggerForBranch(newJob, branch, "Innerloop ${targetGroupString}${osName} ${configurationGroup} ${archGroup} Build and Test", "(?i).*test\\W+innerloop\\W+${targetGroupString}${osName}\\W+${configurationGroup}.*")
- }
+ Utilities.addGithubPRTriggerForBranch(newJob, branch, "Innerloop ${targetGroupString}${osName} ${configurationGroup} ${archGroup} Build and Test", "(?i).*test\\W+innerloop\\W+${targetGroupString}${osName}\\W+${configurationGroup}.*")
}
else {
// Set a push trigger
@@ -365,12 +287,8 @@ def targetGroupOsMapInnerloop = ['netcoreapp': ['Windows_NT', 'Ubuntu14.04', 'Ub
[true, false].each { isPR ->
['netcoreapp'].each { targetGroup ->
['Debug', 'Release'].each { configurationGroup ->
- ['Ubuntu14.04', 'Ubuntu16.04', 'Tizen'].each { osName ->
- if (osName == "Ubuntu14.04") {
- linuxCodeName="trusty"
- abi = "arm"
- }
- else if (osName == "Ubuntu16.04") {
+ ['Linux', 'Tizen'].each { osName ->
+ if (osName == "Linux") {
linuxCodeName="xenial"
abi = "arm"
}
@@ -379,7 +297,7 @@ def targetGroupOsMapInnerloop = ['netcoreapp': ['Windows_NT', 'Ubuntu14.04', 'Ub
abi = "armel"
}
- def osGroup = osGroupMap[osName]
+ def osGroup = "Linux"
def newJobName = "${osName.toLowerCase()}_${abi.toLowerCase()}_cross_${configurationGroup.toLowerCase()}"
def newJob = job(Utilities.getFullJobName(project, newJobName, isPR)) {
@@ -406,12 +324,12 @@ def targetGroupOsMapInnerloop = ['netcoreapp': ['Windows_NT', 'Ubuntu14.04', 'Ub
// Set up triggers
if (isPR) {
- // We run Tizen release/debug, Ubuntu 14.04 release and Ubuntu 16.04 debug for ARM on every PR.
- if (osName == "Tizen" || (osName == "Ubuntu14.04" && configurationGroup == "Release") || (osName == "Ubuntu16.04" && configurationGroup == "Debug")) {
- Utilities.addGithubPRTriggerForBranch(newJob, branch, "Innerloop ${osName} ${abi} ${configurationGroup} Cross Build")
+ // We run Tizen Debug and Linux Release as default PR builds
+ if ((osName == "Tizen" && configurationGroup == "Debug") || (osName == "Linux" && configurationGroup == "Release") ) {
+ Utilities.addGithubPRTriggerForBranch(newJob, branch, "${osName} ${abi} ${configurationGroup} Build")
}
else {
- Utilities.addGithubPRTriggerForBranch(newJob, branch, "Innerloop ${osName} ${abi} ${configurationGroup} Cross Build", "(?i).*test\\W+innerloop\\W+${osName}\\W+${abi}\\W+${configurationGroup}.*")
+ Utilities.addGithubPRTriggerForBranch(newJob, branch, "${osName} ${abi} ${configurationGroup} Build", "(?i).*test\\W+${osName}\\W+${abi}\\W+${configurationGroup}.*")
}
}
else {
diff --git a/run.sh b/run.sh
index 1e6ce03463..e090ef467c 100755
--- a/run.sh
+++ b/run.sh
@@ -8,5 +8,6 @@ __scriptpath=$(cd "$(dirname "$0")"; pwd -P)
__toolRuntime=$__scriptpath/Tools
__dotnet=$__toolRuntime/dotnetcli/dotnet
-$__dotnet $__toolRuntime/run.exe $*
+cd $__scriptpath
+$__dotnet $__toolRuntime/run.exe $__scriptpath/config.json $*
exit $?
diff --git a/src/Common/Common.Tests.sln b/src/Common/Common.Tests.sln
index 6b3a6d94d1..5f88183bd5 100644
--- a/src/Common/Common.Tests.sln
+++ b/src/Common/Common.Tests.sln
@@ -1,6 +1,7 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.23107.0
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Tests", "tests\Common.Tests.csproj", "{C72FD34C-539A-4447-9796-62A229571199}"
EndProject
@@ -10,10 +11,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C72FD34C-539A-4447-9796-62A229571199}.Debug|Any CPU.ActiveCfg = netstandard1.3-Unix-Debug|Any CPU
- {C72FD34C-539A-4447-9796-62A229571199}.Debug|Any CPU.Build.0 = netstandard1.3-Unix-Debug|Any CPU
- {C72FD34C-539A-4447-9796-62A229571199}.Release|Any CPU.ActiveCfg = netstandard1.3-Unix-Release|Any CPU
- {C72FD34C-539A-4447-9796-62A229571199}.Release|Any CPU.Build.0 = netstandard1.3-Unix-Release|Any CPU
+ {C72FD34C-539A-4447-9796-62A229571199}.Debug|Any CPU.ActiveCfg = netstandard-Windows_NT-Debug|Any CPU
+ {C72FD34C-539A-4447-9796-62A229571199}.Debug|Any CPU.Build.0 = netstandard-Windows_NT-Debug|Any CPU
+ {C72FD34C-539A-4447-9796-62A229571199}.Release|Any CPU.ActiveCfg = netstandard-Windows_NT-Release|Any CPU
+ {C72FD34C-539A-4447-9796-62A229571199}.Release|Any CPU.Build.0 = netstandard-Windows_NT-Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/src/Common/src/Interop/Windows/kernel32/Interop.CopyFile.Uap.cs b/src/Common/src/Interop/Windows/kernel32/Interop.CopyFile.Uap.cs
index 96730728e5..8432cb56ec 100644
--- a/src/Common/src/Interop/Windows/kernel32/Interop.CopyFile.Uap.cs
+++ b/src/Common/src/Interop/Windows/kernel32/Interop.CopyFile.Uap.cs
@@ -10,7 +10,7 @@ internal partial class Interop
{
internal partial class Kernel32
{
- internal static int CopyFile(String src, String dst, bool failIfExists)
+ internal static int CopyFile(string src, string dst, bool failIfExists)
{
uint copyFlags = failIfExists ? (uint)Interop.Kernel32.FileOperations.COPY_FILE_FAIL_IF_EXISTS : 0;
Interop.Kernel32.COPYFILE2_EXTENDED_PARAMETERS parameters = new Interop.Kernel32.COPYFILE2_EXTENDED_PARAMETERS()
diff --git a/src/Common/src/Interop/Windows/kernel32/Interop.SafeCreateFile.cs b/src/Common/src/Interop/Windows/kernel32/Interop.SafeCreateFile.cs
index 55ab2f5c58..d9e1b55bb2 100644
--- a/src/Common/src/Interop/Windows/kernel32/Interop.SafeCreateFile.cs
+++ b/src/Common/src/Interop/Windows/kernel32/Interop.SafeCreateFile.cs
@@ -2,10 +2,9 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using Microsoft.Win32.SafeHandles;
using System;
using System.IO;
-using System.Runtime.InteropServices;
-using Microsoft.Win32.SafeHandles;
internal partial class Interop
{
@@ -20,10 +19,10 @@ internal partial class Interop
/// </summary>
[System.Security.SecurityCritical] // auto-generated
internal static SafeFileHandle SafeCreateFile(
- String lpFileName,
+ string lpFileName,
int dwDesiredAccess,
System.IO.FileShare dwShareMode,
- ref Interop.Kernel32.SECURITY_ATTRIBUTES securityAttrs,
+ ref SECURITY_ATTRIBUTES securityAttrs,
FileMode dwCreationDisposition,
int dwFlagsAndAttributes,
IntPtr hTemplateFile)
@@ -32,8 +31,8 @@ internal partial class Interop
if (!handle.IsInvalid)
{
- int fileType = Interop.Kernel32.GetFileType(handle);
- if (fileType != Interop.Kernel32.FileTypes.FILE_TYPE_DISK)
+ int fileType = GetFileType(handle);
+ if (fileType != FileTypes.FILE_TYPE_DISK)
{
handle.Dispose();
throw new NotSupportedException(SR.NotSupported_FileStreamOnNonFiles);
diff --git a/src/Common/src/Interop/Windows/user32/Interop.GetSysColor.cs b/src/Common/src/Interop/Windows/user32/Interop.GetSysColor.cs
new file mode 100644
index 0000000000..8ce696a0a8
--- /dev/null
+++ b/src/Common/src/Interop/Windows/user32/Interop.GetSysColor.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Runtime.InteropServices;
+
+internal partial class Interop
+{
+ internal partial class User32
+ {
+ [DllImport(Libraries.User32, SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern int GetSysColor(int nIndex);
+ }
+} \ No newline at end of file
diff --git a/src/Common/src/Interop/Windows/user32/Interop.Win32SystemColors.cs b/src/Common/src/Interop/Windows/user32/Interop.Win32SystemColors.cs
new file mode 100644
index 0000000000..2ba4db86f2
--- /dev/null
+++ b/src/Common/src/Interop/Windows/user32/Interop.Win32SystemColors.cs
@@ -0,0 +1,46 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+internal partial class Interop
+{
+ internal partial class User32
+ {
+ internal enum Win32SystemColors
+ {
+ ActiveBorder = 0x0A,
+ ActiveCaption = 0x02,
+ ActiveCaptionText = 0x09,
+ AppWorkspace = 0x0C,
+ ButtonFace = 0x0F,
+ ButtonHighlight = 0x14,
+ ButtonShadow = 0x10,
+ Control = 0x0F,
+ ControlDark = 0x10,
+ ControlDarkDark = 0x15,
+ ControlLight = 0x16,
+ ControlLightLight = 0x14,
+ ControlText = 0x12,
+ Desktop = 0x01,
+ GradientActiveCaption = 0x1B,
+ GradientInactiveCaption = 0x1C,
+ GrayText = 0x11,
+ Highlight = 0x0D,
+ HighlightText = 0x0E,
+ HotTrack = 0x1A,
+ InactiveBorder = 0x0B,
+ InactiveCaption = 0x03,
+ InactiveCaptionText = 0x13,
+ Info = 0x18,
+ InfoText = 0x17,
+ Menu = 0x04,
+ MenuBar = 0x1E,
+ MenuHighlight = 0x1D,
+ MenuText = 0x07,
+ ScrollBar = 0x00,
+ Window = 0x05,
+ WindowFrame = 0x06,
+ WindowText = 0x08
+ }
+ }
+} \ No newline at end of file
diff --git a/src/Common/src/System/Data/Common/AdapterUtil.cs b/src/Common/src/System/Data/Common/AdapterUtil.cs
index f57287ff84..7e88739026 100644
--- a/src/Common/src/System/Data/Common/AdapterUtil.cs
+++ b/src/Common/src/System/Data/Common/AdapterUtil.cs
@@ -34,6 +34,12 @@ namespace System.Data.Common
TraceException("<comm.ADP.TraceException|ERR|THROW> '{0}'", e);
}
+ internal static void TraceExceptionWithoutRethrow(Exception e)
+ {
+ Debug.Assert(ADP.IsCatchableExceptionType(e), "Invalid exception type, should have been re-thrown!");
+ TraceException("<comm.ADP.TraceException|ERR|CATCH> '%ls'\n", e);
+ }
+
internal static ArgumentException Argument(string error)
{
ArgumentException e = new ArgumentException(error);
@@ -123,6 +129,11 @@ namespace System.Data.Common
return e;
}
+ internal static ArgumentOutOfRangeException NotSupportedEnumerationValue(Type type, string value, string method)
+ {
+ return ArgumentOutOfRange(SR.Format(SR.ADP_NotSupportedEnumerationValue, type.Name, value, method), type.Name);
+ }
+
internal static InvalidOperationException DataAdapter(string error)
{
return InvalidOperation(error);
diff --git a/src/Common/src/System/Drawing/ColorConverterCommon.cs b/src/Common/src/System/Drawing/ColorConverterCommon.cs
index 6e3e901450..48ccf59290 100644
--- a/src/Common/src/System/Drawing/ColorConverterCommon.cs
+++ b/src/Common/src/System/Drawing/ColorConverterCommon.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Diagnostics;
using System.Globalization;
using System.Reflection;
@@ -12,6 +13,8 @@ namespace System.Drawing
{
public static Color ConvertFromString(string strValue, CultureInfo culture)
{
+ Debug.Assert(culture != null);
+
string text = strValue.Trim();
if (text.Length == 0)
@@ -29,11 +32,6 @@ namespace System.Drawing
}
}
- if (culture == null)
- {
- culture = CultureInfo.CurrentCulture;
- }
-
char sep = culture.TextInfo.ListSeparator[0];
// If the value is a 6 digit hex number only, then
@@ -123,10 +121,7 @@ namespace System.Drawing
}
else
{
- if (culture == null)
- {
- culture = CultureInfo.CurrentCulture;
- }
+ Debug.Assert(culture != null);
NumberFormatInfo formatInfo = (NumberFormatInfo)culture.GetFormat(typeof(NumberFormatInfo));
return IntFromString(text, formatInfo);
}
diff --git a/src/System.Drawing.Common/src/System/Drawing/KnownColorTable.cs b/src/Common/src/System/Drawing/KnownColorTable.cs
index a7009e3239..7b3ee71410 100644
--- a/src/System.Drawing.Common/src/System/Drawing/KnownColorTable.cs
+++ b/src/Common/src/System/Drawing/KnownColorTable.cs
@@ -426,9 +426,11 @@ namespace System.Drawing
return null;
}
}
+
+#if FEATURE_WINDOWS_SYSTEM_COLORS
private static int SystemColorToArgb(int index)
{
- return FromWin32Value(SafeNativeMethods.GetSysColor(index));
+ return FromWin32Value(Interop.User32.GetSysColor(index));
}
private static int Encode(int alpha, int red, int green, int blue)
@@ -443,6 +445,7 @@ namespace System.Drawing
(value >> Win32GreenShift) & 0xFF,
(value >> Win32BlueShift) & 0xFF);
}
+#endif
#if FEATURE_SYSTEM_EVENTS
private static void OnUserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
@@ -456,40 +459,76 @@ namespace System.Drawing
private static void UpdateSystemColors(int[] colorTable)
{
- colorTable[(int)KnownColor.ActiveBorder] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ActiveBorder);
- colorTable[(int)KnownColor.ActiveCaption] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ActiveCaption);
- colorTable[(int)KnownColor.ActiveCaptionText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ActiveCaptionText);
- colorTable[(int)KnownColor.AppWorkspace] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.AppWorkspace);
- colorTable[(int)KnownColor.ButtonFace] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ButtonFace);
- colorTable[(int)KnownColor.ButtonHighlight] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ButtonHighlight);
- colorTable[(int)KnownColor.ButtonShadow] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ButtonShadow);
- colorTable[(int)KnownColor.Control] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.Control);
- colorTable[(int)KnownColor.ControlDark] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ControlDark);
- colorTable[(int)KnownColor.ControlDarkDark] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ControlDarkDark);
- colorTable[(int)KnownColor.ControlLight] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ControlLight);
- colorTable[(int)KnownColor.ControlLightLight] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ControlLightLight);
- colorTable[(int)KnownColor.ControlText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ControlText);
- colorTable[(int)KnownColor.Desktop] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.Desktop);
- colorTable[(int)KnownColor.GradientActiveCaption] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.GradientActiveCaption);
- colorTable[(int)KnownColor.GradientInactiveCaption] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.GradientInactiveCaption);
- colorTable[(int)KnownColor.GrayText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.GrayText);
- colorTable[(int)KnownColor.Highlight] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.Highlight);
- colorTable[(int)KnownColor.HighlightText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.HighlightText);
- colorTable[(int)KnownColor.HotTrack] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.HotTrack);
- colorTable[(int)KnownColor.InactiveBorder] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.InactiveBorder);
- colorTable[(int)KnownColor.InactiveCaption] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.InactiveCaption);
- colorTable[(int)KnownColor.InactiveCaptionText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.InactiveCaptionText);
- colorTable[(int)KnownColor.Info] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.Info);
- colorTable[(int)KnownColor.InfoText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.InfoText);
- colorTable[(int)KnownColor.Menu] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.Menu);
- colorTable[(int)KnownColor.MenuBar] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.MenuBar);
- colorTable[(int)KnownColor.MenuHighlight] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.MenuHighlight);
- colorTable[(int)KnownColor.MenuText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.MenuText);
- colorTable[(int)KnownColor.ScrollBar] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.ScrollBar);
- colorTable[(int)KnownColor.Window] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.Window);
- colorTable[(int)KnownColor.WindowFrame] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.WindowFrame);
- colorTable[(int)KnownColor.WindowText] = SystemColorToArgb((int)SafeNativeMethods.Win32SystemColors.WindowText);
+#if FEATURE_WINDOWS_SYSTEM_COLORS
+ colorTable[(int)KnownColor.ActiveBorder] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ActiveBorder);
+ colorTable[(int)KnownColor.ActiveCaption] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ActiveCaption);
+ colorTable[(int)KnownColor.ActiveCaptionText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ActiveCaptionText);
+ colorTable[(int)KnownColor.AppWorkspace] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.AppWorkspace);
+ colorTable[(int)KnownColor.ButtonFace] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ButtonFace);
+ colorTable[(int)KnownColor.ButtonHighlight] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ButtonHighlight);
+ colorTable[(int)KnownColor.ButtonShadow] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ButtonShadow);
+ colorTable[(int)KnownColor.Control] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.Control);
+ colorTable[(int)KnownColor.ControlDark] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ControlDark);
+ colorTable[(int)KnownColor.ControlDarkDark] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ControlDarkDark);
+ colorTable[(int)KnownColor.ControlLight] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ControlLight);
+ colorTable[(int)KnownColor.ControlLightLight] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ControlLightLight);
+ colorTable[(int)KnownColor.ControlText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ControlText);
+ colorTable[(int)KnownColor.Desktop] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.Desktop);
+ colorTable[(int)KnownColor.GradientActiveCaption] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.GradientActiveCaption);
+ colorTable[(int)KnownColor.GradientInactiveCaption] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.GradientInactiveCaption);
+ colorTable[(int)KnownColor.GrayText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.GrayText);
+ colorTable[(int)KnownColor.Highlight] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.Highlight);
+ colorTable[(int)KnownColor.HighlightText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.HighlightText);
+ colorTable[(int)KnownColor.HotTrack] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.HotTrack);
+ colorTable[(int)KnownColor.InactiveBorder] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.InactiveBorder);
+ colorTable[(int)KnownColor.InactiveCaption] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.InactiveCaption);
+ colorTable[(int)KnownColor.InactiveCaptionText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.InactiveCaptionText);
+ colorTable[(int)KnownColor.Info] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.Info);
+ colorTable[(int)KnownColor.InfoText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.InfoText);
+ colorTable[(int)KnownColor.Menu] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.Menu);
+ colorTable[(int)KnownColor.MenuBar] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.MenuBar);
+ colorTable[(int)KnownColor.MenuHighlight] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.MenuHighlight);
+ colorTable[(int)KnownColor.MenuText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.MenuText);
+ colorTable[(int)KnownColor.ScrollBar] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.ScrollBar);
+ colorTable[(int)KnownColor.Window] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.Window);
+ colorTable[(int)KnownColor.WindowFrame] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.WindowFrame);
+ colorTable[(int)KnownColor.WindowText] = SystemColorToArgb((int)Interop.User32.Win32SystemColors.WindowText);
+#else
+ // Hard-coded constants, based on default Windows settings.
+ colorTable[(int)KnownColor.ActiveBorder] = unchecked((int)0xFFD4D0C8);
+ colorTable[(int)KnownColor.ActiveCaption] = unchecked((int)0xFF0054E3);
+ colorTable[(int)KnownColor.ActiveCaptionText] = unchecked((int)0xFFFFFFFF);
+ colorTable[(int)KnownColor.AppWorkspace] = unchecked((int)0xFF808080);
+ colorTable[(int)KnownColor.ButtonFace] = unchecked((int)0xFFF0F0F0);
+ colorTable[(int)KnownColor.ButtonHighlight] = unchecked((int)0xFFFFFFFF);
+ colorTable[(int)KnownColor.ButtonShadow] = unchecked((int)0xFFA0A0A0);
+ colorTable[(int)KnownColor.Control] = unchecked((int)0xFFECE9D8);
+ colorTable[(int)KnownColor.ControlDark] = unchecked((int)0xFFACA899);
+ colorTable[(int)KnownColor.ControlDarkDark] = unchecked((int)0xFF716F64);
+ colorTable[(int)KnownColor.ControlLight] = unchecked((int)0xFFF1EFE2);
+ colorTable[(int)KnownColor.ControlLightLight] = unchecked((int)0xFFFFFFFF);
+ colorTable[(int)KnownColor.ControlText] = unchecked((int)0xFF000000);
+ colorTable[(int)KnownColor.Desktop] = unchecked((int)0xFF004E98);
+ colorTable[(int)KnownColor.GradientActiveCaption] = unchecked((int)0xFFB9D1EA);
+ colorTable[(int)KnownColor.GradientInactiveCaption] = unchecked((int)0xFFD7E4F2);
+ colorTable[(int)KnownColor.GrayText] = unchecked((int)0xFFACA899);
+ colorTable[(int)KnownColor.Highlight] = unchecked((int)0xFF316AC5);
+ colorTable[(int)KnownColor.HighlightText] = unchecked((int)0xFFFFFFFF);
+ colorTable[(int)KnownColor.HotTrack] = unchecked((int)0xFF000080);
+ colorTable[(int)KnownColor.InactiveBorder] = unchecked((int)0xFFD4D0C8);
+ colorTable[(int)KnownColor.InactiveCaption] = unchecked((int)0xFF7A96DF);
+ colorTable[(int)KnownColor.InactiveCaptionText] = unchecked((int)0xFFD8E4F8);
+ colorTable[(int)KnownColor.Info] = unchecked((int)0xFFFFFFE1);
+ colorTable[(int)KnownColor.InfoText] = unchecked((int)0xFF000000);
+ colorTable[(int)KnownColor.Menu] = unchecked((int)0xFFFFFFFF);
+ colorTable[(int)KnownColor.MenuBar] = unchecked((int)0xFFF0F0F0);
+ colorTable[(int)KnownColor.MenuHighlight] = unchecked((int)0xFF3399FF);
+ colorTable[(int)KnownColor.MenuText] = unchecked((int)0xFF000000);
+ colorTable[(int)KnownColor.ScrollBar] = unchecked((int)0xFFD4D0C8);
+ colorTable[(int)KnownColor.Window] = unchecked((int)0xFFFFFFFF);
+ colorTable[(int)KnownColor.WindowFrame] = unchecked((int)0xFF000000);
+ colorTable[(int)KnownColor.WindowText] = unchecked((int)0xFF000000);
+#endif
}
}
}
-
diff --git a/src/Common/src/System/IO/Win32Marshal.cs b/src/Common/src/System/IO/Win32Marshal.cs
index f8229875f2..e1afc9fc0c 100644
--- a/src/Common/src/System/IO/Win32Marshal.cs
+++ b/src/Common/src/System/IO/Win32Marshal.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
-using System.Diagnostics;
using System.Runtime.InteropServices;
namespace System.IO
@@ -19,7 +17,7 @@ namespace System.IO
internal static Exception GetExceptionForLastWin32Error()
{
int errorCode = Marshal.GetLastWin32Error();
- return GetExceptionForWin32Error(errorCode, String.Empty);
+ return GetExceptionForWin32Error(errorCode, string.Empty);
}
/// <summary>
diff --git a/src/Common/src/System/Net/LazyAsyncResult.cs b/src/Common/src/System/Net/LazyAsyncResult.cs
index 3b444d15bc..ba93c49899 100644
--- a/src/Common/src/System/Net/LazyAsyncResult.cs
+++ b/src/Common/src/System/Net/LazyAsyncResult.cs
@@ -17,17 +17,17 @@ namespace System.Net
// This is to avoid user mistakes when they queue another async op from a callback the completes sync.
[ThreadStatic]
- private static ThreadContext s_threadContext;
+ private static ThreadContext t_threadContext;
private static ThreadContext CurrentThreadContext
{
get
{
- ThreadContext threadContext = s_threadContext;
+ ThreadContext threadContext = t_threadContext;
if (threadContext == null)
{
threadContext = new ThreadContext();
- s_threadContext = threadContext;
+ t_threadContext = threadContext;
}
return threadContext;
diff --git a/src/Common/src/System/Net/SafeCloseSocket.Windows.cs b/src/Common/src/System/Net/SafeCloseSocket.Windows.cs
index 9cf662490e..778e9bd300 100644
--- a/src/Common/src/System/Net/SafeCloseSocket.Windows.cs
+++ b/src/Common/src/System/Net/SafeCloseSocket.Windows.cs
@@ -33,52 +33,56 @@ namespace System.Net.Sockets
// Binds the Socket Win32 Handle to the ThreadPool's CompletionPort.
public ThreadPoolBoundHandle GetOrAllocateThreadPoolBoundHandle(bool trySkipCompletionPortOnSuccess)
{
+ // Check to see if the socket native _handle is already
+ // bound to the ThreadPool's completion port.
+ if (_released || _iocpBoundHandle == null)
+ {
+ GetOrAllocateThreadPoolBoundHandleSlow(trySkipCompletionPortOnSuccess);
+ }
+
+ return _iocpBoundHandle;
+ }
+
+ private void GetOrAllocateThreadPoolBoundHandleSlow(bool trySkipCompletionPortOnSuccess)
+ {
if (_released)
{
// Keep the exception message pointing at the external type.
throw new ObjectDisposedException(typeof(Socket).FullName);
}
- // Check to see if the socket native _handle is already
- // bound to the ThreadPool's completion port.
- if (_iocpBoundHandle == null)
+ lock (_iocpBindingLock)
{
- lock (_iocpBindingLock)
+ if (_iocpBoundHandle == null)
{
- if (_iocpBoundHandle == null)
- {
- // Bind the socket native _handle to the ThreadPool.
- if (NetEventSource.IsEnabled) NetEventSource.Info(this, "calling ThreadPool.BindHandle()");
+ // Bind the socket native _handle to the ThreadPool.
+ if (NetEventSource.IsEnabled) NetEventSource.Info(this, "calling ThreadPool.BindHandle()");
- ThreadPoolBoundHandle boundHandle;
- try
- {
- // The handle (this) may have been already released:
- // E.g.: The socket has been disposed in the main thread. A completion callback may
- // attempt starting another operation.
- boundHandle = ThreadPoolBoundHandle.BindHandle(this);
- }
- catch (Exception exception)
- {
- if (ExceptionCheck.IsFatal(exception)) throw;
- CloseAsIs();
- throw;
- }
-
- // Try to disable completions for synchronous success, if requested
- if (trySkipCompletionPortOnSuccess &&
- CompletionPortHelper.SkipCompletionPortOnSuccess(boundHandle.Handle))
- {
- _skipCompletionPortOnSuccess = true;
- }
+ ThreadPoolBoundHandle boundHandle;
+ try
+ {
+ // The handle (this) may have been already released:
+ // E.g.: The socket has been disposed in the main thread. A completion callback may
+ // attempt starting another operation.
+ boundHandle = ThreadPoolBoundHandle.BindHandle(this);
+ }
+ catch (Exception exception) when (!ExceptionCheck.IsFatal(exception))
+ {
+ CloseAsIs();
+ throw;
+ }
- // Don't set this until after we've configured the handle above (if we did)
- _iocpBoundHandle = boundHandle;
+ // Try to disable completions for synchronous success, if requested
+ if (trySkipCompletionPortOnSuccess &&
+ CompletionPortHelper.SkipCompletionPortOnSuccess(boundHandle.Handle))
+ {
+ _skipCompletionPortOnSuccess = true;
}
+
+ // Don't set this until after we've configured the handle above (if we did)
+ _iocpBoundHandle = boundHandle;
}
}
-
- return _iocpBoundHandle;
}
public bool SkipCompletionPortOnSuccess
diff --git a/src/Common/tests/Common.Tests.csproj b/src/Common/tests/Common.Tests.csproj
index 73b3f432bd..aad5077e4e 100644
--- a/src/Common/tests/Common.Tests.csproj
+++ b/src/Common/tests/Common.Tests.csproj
@@ -64,6 +64,7 @@
<Link>Common\System\Security\IdentityHelper.cs</Link>
</Compile>
<Compile Include="Tests\Interop\procfsTests.cs" />
+ <Compile Include="Tests\System\AssertExtensionTests.cs" />
<Compile Include="Tests\System\CharArrayHelpersTests.cs" />
<Compile Include="Tests\System\IO\StringParserTests.cs" />
<Compile Include="Tests\System\Security\IdentityHelperTests.cs" />
diff --git a/src/Common/tests/System/AssertExtensions.cs b/src/Common/tests/System/AssertExtensions.cs
index d28207aeec..adbe5c9691 100644
--- a/src/Common/tests/System/AssertExtensions.cs
+++ b/src/Common/tests/System/AssertExtensions.cs
@@ -129,5 +129,95 @@ namespace System
action();
}
}
+
+ private static string AddOptionalUserMessage(string message, string userMessage)
+ {
+ if (userMessage == null)
+ return message;
+ else
+ return $"{message} {userMessage}";
+ }
+
+ /// <summary>
+ /// Validate that a given value is greater than another value.
+ /// </summary>
+ /// <param name="actual">The value that should be greater than <paramref name="greaterThan"/>.</param>
+ /// <param name="greaterThan">The value that <paramref name="actual"/> should be greater than.</param>
+ public static void GreaterThan<T>(T actual, T greaterThan, string userMessage = null) where T : IComparable
+ {
+ if (actual == null)
+ throw new XunitException(
+ greaterThan == null
+ ? AddOptionalUserMessage($"Expected: <null> to be greater than <null>.", userMessage)
+ : AddOptionalUserMessage($"Expected: <null> to be greater than {greaterThan}.", userMessage));
+
+ if (actual.CompareTo(greaterThan) <= 0)
+ throw new XunitException(AddOptionalUserMessage($"Expected: {actual} to be greater than {greaterThan}", userMessage));
+ }
+
+ /// <summary>
+ /// Validate that a given value is less than another value.
+ /// </summary>
+ /// <param name="actual">The value that should be less than <paramref name="lessThan"/>.</param>
+ /// <param name="lessThan">The value that <paramref name="actual"/> should be less than.</param>
+ public static void LessThan<T>(T actual, T lessThan, string userMessage = null) where T : IComparable
+ {
+ if (actual == null)
+ {
+ if (lessThan == null)
+ {
+ throw new XunitException(AddOptionalUserMessage($"Expected: <null> to be less than <null>.", userMessage));
+ }
+ else
+ {
+ // Null is always less than non-null
+ return;
+ }
+ }
+
+ if (actual.CompareTo(lessThan) >= 0)
+ throw new XunitException(AddOptionalUserMessage($"Expected: {actual} to be less than {lessThan}", userMessage));
+ }
+
+ /// <summary>
+ /// Validate that a given value is less than or equal to another value.
+ /// </summary>
+ /// <param name="actual">The value that should be less than or equal to <paramref name="lessThanOrEqualTo"/></param>
+ /// <param name="lessThanOrEqualTo">The value that <paramref name="actual"/> should be less than or equal to.</param>
+ public static void LessThanOrEqualTo<T>(T actual, T lessThanOrEqualTo, string userMessage = null) where T : IComparable
+ {
+ // null, by definition is always less than or equal to
+ if (actual == null)
+ return;
+
+ if (actual.CompareTo(lessThanOrEqualTo) > 0)
+ throw new XunitException(AddOptionalUserMessage($"Expected: {actual} to be less than or equal to {lessThanOrEqualTo}", userMessage));
+ }
+
+ /// <summary>
+ /// Validate that a given value is greater than or equal to another value.
+ /// </summary>
+ /// <param name="actual">The value that should be greater than or equal to <paramref name="greaterThanOrEqualTo"/></param>
+ /// <param name="greaterThanOrEqualTo">The value that <paramref name="actual"/> should be greater than or equal to.</param>
+ public static void GreaterThanOrEqualTo<T>(T actual, T greaterThanOrEqualTo, string userMessage = null) where T : IComparable
+ {
+ // null, by definition is always less than or equal to
+ if (actual == null)
+ {
+ if (greaterThanOrEqualTo == null)
+ {
+ // We're equal
+ return;
+ }
+ else
+ {
+ // Null is always less than non-null
+ throw new XunitException(AddOptionalUserMessage($"Expected: <null> to be greater than or equal to <null>.", userMessage));
+ }
+ }
+
+ if (actual.CompareTo(greaterThanOrEqualTo) < 0)
+ throw new XunitException(AddOptionalUserMessage($"Expected: {actual} to be greater than or equal to {greaterThanOrEqualTo}", userMessage));
+ }
}
}
diff --git a/src/Common/tests/System/Net/Prerequisites/Servers/CoreFxNetCloudService/WebServer/WebSocket/EchoWebSocket.ashx.cs b/src/Common/tests/System/Net/Prerequisites/Servers/CoreFxNetCloudService/WebServer/WebSocket/EchoWebSocket.ashx.cs
index 815778be55..d69c98a6d6 100644
--- a/src/Common/tests/System/Net/Prerequisites/Servers/CoreFxNetCloudService/WebServer/WebSocket/EchoWebSocket.ashx.cs
+++ b/src/Common/tests/System/Net/Prerequisites/Servers/CoreFxNetCloudService/WebServer/WebSocket/EchoWebSocket.ashx.cs
@@ -15,12 +15,15 @@ namespace WebServer
public class EchoWebSocket : IHttpHandler
{
private const int MaxBufferSize = 128 * 1024;
+ private bool _replyWithPartialMessages = false;
public void ProcessRequest(HttpContext context)
{
+ _replyWithPartialMessages = context.Request.Url.Query.Contains("replyWithPartialMessages");
+
string subProtocol = context.Request.QueryString["subprotocol"];
- if (context.Request.Url.Query == "?delay10sec")
+ if (context.Request.Url.Query.Contains("delay10sec"))
{
Thread.Sleep(10000);
}
@@ -156,7 +159,7 @@ namespace WebServer
await socket.SendAsync(
new ArraySegment<byte>(receiveBuffer, 0, offset),
receiveResult.MessageType,
- true,
+ !_replyWithPartialMessages,
CancellationToken.None);
}
}
diff --git a/src/Common/tests/System/PlatformDetection.cs b/src/Common/tests/System/PlatformDetection.cs
index 09c3082f57..8905754175 100644
--- a/src/Common/tests/System/PlatformDetection.cs
+++ b/src/Common/tests/System/PlatformDetection.cs
@@ -66,7 +66,7 @@ namespace System
return runningVersion != null && runningVersion >= net470;
}
- public static bool IsNetfxBelow471()
+ public static bool IsNetfx471OrNewer()
{
if (!IsFullFramework)
{
@@ -75,7 +75,7 @@ namespace System
Version net471 = new Version(4, 7, 1);
Version runningVersion = GetFrameworkVersion();
- return runningVersion != null && runningVersion < net471;
+ return runningVersion != null && runningVersion >= net471;
}
public static Version GetFrameworkVersion()
@@ -186,6 +186,7 @@ namespace System
public static bool IsDebian8 => IsDistroAndVersion("debian", "8");
public static bool IsUbuntu1404 => IsDistroAndVersion("ubuntu", "14.04");
public static bool IsCentos7 => IsDistroAndVersion("centos", "7");
+ public static bool IsTizen => IsDistroAndVersion("tizen");
/// <summary>
/// Get whether the OS platform matches the given Linux distro and optional version.
@@ -197,7 +198,7 @@ namespace System
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
- IdVersionPair v = ParseOsReleaseFile();
+ DistroInfo v = ParseOsReleaseFile();
if (v.Id == distroId && (versionId == null || v.VersionId == versionId))
{
return true;
@@ -207,13 +208,27 @@ namespace System
return false;
}
- private static IdVersionPair ParseOsReleaseFile()
+ public static string GetDistroVersionString()
+ {
+ if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
+ {
+ return "";
+ }
+
+ DistroInfo v = ParseOsReleaseFile();
+
+ return "Distro=" + v.Id + " VersionId=" + v.VersionId + " Pretty=" + v.PrettyName + " Version=" + v.Version;
+ }
+
+ private static DistroInfo ParseOsReleaseFile()
{
Debug.Assert(RuntimeInformation.IsOSPlatform(OSPlatform.Linux));
- IdVersionPair ret = new IdVersionPair();
+ DistroInfo ret = new DistroInfo();
ret.Id = "";
ret.VersionId = "";
+ ret.Version = "";
+ ret.PrettyName = "";
if (File.Exists("/etc/os-release"))
{
@@ -221,35 +236,44 @@ namespace System
{
if (line.StartsWith("ID=", System.StringComparison.Ordinal))
{
- ret.Id = line.Substring("ID=".Length);
+ ret.Id = RemoveQuotes(line.Substring("ID=".Length));
}
else if (line.StartsWith("VERSION_ID=", System.StringComparison.Ordinal))
{
- ret.VersionId = line.Substring("VERSION_ID=".Length);
+ ret.VersionId = RemoveQuotes(line.Substring("VERSION_ID=".Length));
+ }
+ else if (line.StartsWith("VERSION=", System.StringComparison.Ordinal))
+ {
+ ret.Version = RemoveQuotes(line.Substring("VERSION=".Length));
+ }
+ else if (line.StartsWith("PRETTY_NAME=", System.StringComparison.Ordinal))
+ {
+ ret.PrettyName = RemoveQuotes(line.Substring("PRETTY_NAME=".Length));
}
}
}
- string versionId = ret.VersionId;
- if (versionId.Length >= 2 && versionId[0] == '"' && versionId[versionId.Length - 1] == '"')
- {
- // Remove quotes.
- ret.VersionId = versionId.Substring(1, versionId.Length - 2);
- }
+ return ret;
+ }
- if (ret.Id.Length >= 2 && ret.Id[0] == '"' && ret.Id[ret.Id.Length - 1] == '"')
+ private static string RemoveQuotes(string s)
+ {
+ s = s.Trim();
+ if (s.Length >= 2 && s[0] == '"' && s[s.Length - 1] == '"')
{
// Remove quotes.
- ret.Id = ret.Id.Substring(1, ret.Id.Length - 2);
+ s = s.Substring(1, s.Length - 2);
}
- return ret;
+ return s;
}
- private struct IdVersionPair
+ private struct DistroInfo
{
public string Id { get; set; }
public string VersionId { get; set; }
+ public string Version { get; set; }
+ public string PrettyName { get; set; }
}
private static int GetWindowsVersion()
diff --git a/src/Common/tests/System/ThreadCultureChange.cs b/src/Common/tests/System/ThreadCultureChange.cs
index 8137b7040d..8f1f8d4286 100644
--- a/src/Common/tests/System/ThreadCultureChange.cs
+++ b/src/Common/tests/System/ThreadCultureChange.cs
@@ -8,18 +8,25 @@ namespace System.Common.Tests
{
public sealed class ThreadCultureChange : IDisposable
{
- private readonly CultureInfo _originalCultureInfo;
- private readonly CultureInfo _originalUICultureInfo;
+ private readonly CultureInfo _originalCultureInfo = CultureInfo.CurrentCulture;
+ private readonly CultureInfo _originalUICultureInfo = CultureInfo.CurrentUICulture;
- public ThreadCultureChange()
+ public ThreadCultureChange() { }
+
+ public ThreadCultureChange(string culture) : this()
{
- _originalCultureInfo = CultureInfo.CurrentCulture;
- _originalUICultureInfo = CultureInfo.CurrentUICulture;
+ ChangeCultureInfo(culture);
}
- public void ChangeCultureInfo(string culture)
+ public ThreadCultureChange(CultureInfo newCulture) : this()
+ {
+ ChangeCultureInfo(newCulture);
+ }
+
+ public void ChangeCultureInfo(string culture) => ChangeCultureInfo(new CultureInfo(culture));
+
+ public void ChangeCultureInfo(CultureInfo newCulture)
{
- var newCulture = new CultureInfo(culture);
CultureInfo.CurrentCulture = newCulture;
CultureInfo.CurrentUICulture = newCulture;
}
diff --git a/src/Common/tests/Tests/System/AssertExtensionTests.cs b/src/Common/tests/Tests/System/AssertExtensionTests.cs
new file mode 100644
index 0000000000..afe75a5ed0
--- /dev/null
+++ b/src/Common/tests/Tests/System/AssertExtensionTests.cs
@@ -0,0 +1,211 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Xunit;
+using Xunit.Sdk;
+
+namespace Tests.System
+{
+ public class AssertExtensionTests
+ {
+ private const string Null = "<null>";
+
+ [Theory,
+ InlineData(0, 0, false),
+ InlineData(1, 1, false),
+ InlineData(0, 1, false),
+ InlineData(0, -1, true),
+ InlineData(-1, 0, false),
+ InlineData(1, 0, true),
+ InlineData(1, -1, true),
+ InlineData(-1, 1, false)
+ ]
+ public void GreaterThan_ValueType(int actual, int greaterThan, bool expected)
+ {
+ try
+ {
+ AssertExtensions.GreaterThan(actual, greaterThan);
+ Assert.True(expected, $"{actual} > {greaterThan} should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"{actual} > {greaterThan} should *not* have failed the assertion.");
+ }
+ }
+
+ [Theory,
+ // Null is always less than anything other than null
+ InlineData("", null, true),
+ InlineData(null, null, false),
+ InlineData(null, "", false),
+ InlineData("b", "b", false),
+ InlineData("b", "c", false),
+ InlineData("b", "a", true),
+ InlineData("a", "b", false),
+ InlineData("c", "b", true),
+ InlineData("c", "a", true),
+ InlineData("a", "c", false)
+ ]
+ public void GreaterThan_ReferenceType(string actual, string greaterThan, bool expected)
+ {
+ try
+ {
+ AssertExtensions.GreaterThan(actual, greaterThan);
+ Assert.True(expected, $"{actual ?? Null} > {greaterThan ?? Null} should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"{actual ?? Null} > {greaterThan ?? Null} should *not* have failed the assertion.");
+ }
+ }
+
+ [Theory,
+ InlineData(0, 0, false),
+ InlineData(1, 1, false),
+ InlineData(0, 1, true),
+ InlineData(0, -1, false),
+ InlineData(-1, 0, true),
+ InlineData(1, 0, false),
+ InlineData(1, -1, false),
+ InlineData(-1, 1, true)
+ ]
+ public void LessThan_ValueType(int actual, int lessThan, bool expected)
+ {
+ try
+ {
+ AssertExtensions.LessThan(actual, lessThan);
+ Assert.True(expected, $"{actual} < {lessThan} should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"{actual} < {lessThan} should *not* have failed the assertion.");
+ }
+ }
+
+ [Theory,
+ // Null is always less than anything other than null
+ InlineData("", null, false),
+ InlineData(null, null, false),
+ InlineData(null, "", true),
+ InlineData("b", "b", false),
+ InlineData("b", "c", true),
+ InlineData("b", "a", false),
+ InlineData("a", "b", true),
+ InlineData("c", "b", false),
+ InlineData("c", "a", false),
+ InlineData("a", "c", true)
+ ]
+ public void LessThan_ReferenceType(string actual, string lessThan, bool expected)
+ {
+ try
+ {
+ AssertExtensions.LessThan(actual, lessThan);
+ Assert.True(expected, $"'{actual ?? Null}' < '{lessThan ?? Null}' should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"'{actual ?? Null}' < '{lessThan ?? Null}' should *not* have failed the assertion.");
+ }
+ }
+
+ [Theory,
+ InlineData(0, 0, true),
+ InlineData(1, 1, true),
+ InlineData(0, 1, false),
+ InlineData(0, -1, true),
+ InlineData(-1, 0, false),
+ InlineData(1, 0, true),
+ InlineData(1, -1, true),
+ InlineData(-1, 1, false)
+ ]
+ public void GreaterThanOrEqualTo_ValueType(int actual, int greaterThanOrEqualTo, bool expected)
+ {
+ try
+ {
+ AssertExtensions.GreaterThanOrEqualTo(actual, greaterThanOrEqualTo);
+ Assert.True(expected, $"{actual} >= {greaterThanOrEqualTo} should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"{actual} >= {greaterThanOrEqualTo} should *not* have failed the assertion.");
+ }
+ }
+
+ [Theory,
+ // Null is always less than anything other than null
+ InlineData("", null, true),
+ InlineData(null, null, true),
+ InlineData(null, "", false),
+ InlineData("b", "b", true),
+ InlineData("b", "c", false),
+ InlineData("b", "a", true),
+ InlineData("a", "b", false),
+ InlineData("c", "b", true),
+ InlineData("c", "a", true),
+ InlineData("a", "c", false)
+ ]
+ public void GreaterThanOrEqualTo_ReferenceType(string actual, string greaterThanOrEqualTo, bool expected)
+ {
+ try
+ {
+ AssertExtensions.GreaterThanOrEqualTo(actual, greaterThanOrEqualTo);
+ Assert.True(expected, $"'{actual ?? Null}' >= '{greaterThanOrEqualTo ?? Null}' should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"'{actual ?? Null}' >= '{greaterThanOrEqualTo ?? Null}' should *not* have failed the assertion.");
+ }
+ }
+
+ [Theory,
+ InlineData(0, 0, true),
+ InlineData(1, 1, true),
+ InlineData(0, 1, true),
+ InlineData(0, -1, false),
+ InlineData(-1, 0, true),
+ InlineData(1, 0, false),
+ InlineData(1, -1, false),
+ InlineData(-1, 1, true)
+ ]
+ public void LessThanOrEqualTo_ValueType(int actual, int lessThanOrEqualTo, bool expected)
+ {
+ try
+ {
+ AssertExtensions.LessThanOrEqualTo(actual, lessThanOrEqualTo);
+ Assert.True(expected, $"{actual} <= {lessThanOrEqualTo} should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"{actual} <= {lessThanOrEqualTo} should *not* have failed the assertion.");
+ }
+ }
+
+ [Theory,
+ // Null is always less than anything other than null
+ InlineData("", null, false),
+ InlineData(null, null, true),
+ InlineData(null, "", true),
+ InlineData("b", "b", true),
+ InlineData("b", "c", true),
+ InlineData("b", "a", false),
+ InlineData("a", "b", true),
+ InlineData("c", "b", false),
+ InlineData("c", "a", false),
+ InlineData("a", "c", true)
+ ]
+ public void LessThanOrEqualTo_ReferenceType(string actual, string lessThanOrEqualTo, bool expected)
+ {
+ try
+ {
+ AssertExtensions.LessThanOrEqualTo(actual, lessThanOrEqualTo);
+ Assert.True(expected, $"'{actual ?? Null}' >= '{lessThanOrEqualTo ?? Null}' should have failed the assertion.");
+ }
+ catch (XunitException)
+ {
+ Assert.False(expected, $"'{actual ?? Null}' >= '{lessThanOrEqualTo ?? Null}' should *not* have failed the assertion.");
+ }
+ }
+ }
+}
diff --git a/src/CoreFx.Private.TestUtilities/CoreFx.Private.TestUtilities.sln b/src/CoreFx.Private.TestUtilities/CoreFx.Private.TestUtilities.sln
new file mode 100644
index 0000000000..e6c06ad87c
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/CoreFx.Private.TestUtilities.sln
@@ -0,0 +1,38 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreFx.Private.TestUtilities", "src\CoreFx.Private.TestUtilities.csproj", "{5B7EAEC-93CB-40DF-BE40-A60BC189B737}"
+ ProjectSection(ProjectDependencies) = postProject
+ {E2E59C98-998F-9965-991D-99411166AF6F} = {E2E59C98-998F-9965-991D-99411166AF6F}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreFx.Private.TestUtilities", "ref\CoreFx.Private.TestUtilities.csproj", "{E2E59C98-998F-9965-991D-99411166AF6F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{2E666815-2EDB-464B-9DF6-380BF4789AD4}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5B7EAEC-93CB-40DF-BE40-A60BC189B737}.Debug|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Debug|Any CPU
+ {5B7EAEC-93CB-40DF-BE40-A60BC189B737}.Debug|Any CPU.Build.0 = netcoreapp-Windows_NT-Debug|Any CPU
+ {5B7EAEC-93CB-40DF-BE40-A60BC189B737}.Release|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Release|Any CPU
+ {5B7EAEC-93CB-40DF-BE40-A60BC189B737}.Release|Any CPU.Build.0 = netcoreapp-Windows_NT-Release|Any CPU
+ {E2E59C98-998F-9965-991D-99411166AF6F}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
+ {E2E59C98-998F-9965-991D-99411166AF6F}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
+ {E2E59C98-998F-9965-991D-99411166AF6F}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
+ {E2E59C98-998F-9965-991D-99411166AF6F}.Release|Any CPU.Build.0 = netstandard-Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {5B7EAEC-93CB-40DF-BE40-A60BC189B737} = {E107E9C1-E893-4E87-987E-04EF0DCEAEFD}
+ {E2E59C98-998F-9965-991D-99411166AF6F} = {2E666815-2EDB-464B-9DF6-380BF4789AD4}
+ EndGlobalSection
+EndGlobal
diff --git a/src/CoreFx.Private.TestUtilities/dir.props b/src/CoreFx.Private.TestUtilities/dir.props
new file mode 100644
index 0000000000..04794ecf65
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/dir.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="..\dir.props" />
+ <PropertyGroup>
+ <AssemblyVersion>1.0.0.0</AssemblyVersion>
+ <AssemblyKey>Test</AssemblyKey>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/src/CoreFx.Private.TestUtilities/ref/Configurations.props b/src/CoreFx.Private.TestUtilities/ref/Configurations.props
new file mode 100644
index 0000000000..c398e42e89
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/ref/Configurations.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <BuildConfigurations>
+ netstandard;
+ </BuildConfigurations>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.cs b/src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.cs
new file mode 100644
index 0000000000..cdb6977322
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.cs
@@ -0,0 +1,57 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Threading.Tasks;
+using System.Runtime.CompilerServices;
+
+namespace System.Diagnostics
+{
+ public abstract partial class RemoteExecutorTestBase : System.IO.FileCleanupTestBase
+ {
+ public const int FailWaitTimeoutMilliseconds = 60000;
+ protected static readonly string HostRunner;
+ protected static readonly string HostRunnerName;
+ public const int SuccessExitCode = 42;
+ protected static readonly string TestConsoleApp;
+ protected RemoteExecutorTestBase() { }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvoke(System.Func<int> method, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvoke(System.Func<string, int> method, string arg, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvoke(System.Func<string, string, int> method, string arg1, string arg2, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvoke(System.Func<string, string, string, int> method, string arg1, string arg2, string arg3, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvoke(System.Func<string, string, string, string, int> method, string arg1, string arg2, string arg3, string arg4, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvoke(System.Func<string, string, string, string, string, int> method, string arg1, string arg2, string arg3, string arg4, string arg5, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvoke(System.Func<System.Threading.Tasks.Task<int>> method, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public static System.Diagnostics.RemoteExecutorTestBase.RemoteInvokeHandle RemoteInvokeRaw(System.Delegate method, string unparsedArg, System.Diagnostics.RemoteInvokeOptions options=null) { throw null; }
+ public sealed partial class RemoteInvokeHandle : System.IDisposable
+ {
+ public RemoteInvokeHandle(System.Diagnostics.Process process, System.Diagnostics.RemoteInvokeOptions options) { }
+ public System.Diagnostics.RemoteInvokeOptions Options { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
+ public System.Diagnostics.Process Process { [System.Runtime.CompilerServices.CompilerGeneratedAttribute] get { throw null; } }
+ public void Dispose() { }
+ }
+ }
+ public sealed partial class RemoteInvokeOptions
+ {
+ public RemoteInvokeOptions() { }
+ public bool CheckExitCode { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
+ public bool EnableProfiling { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
+ public bool Start { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
+ public System.Diagnostics.ProcessStartInfo StartInfo { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
+ public int TimeOut { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
+ }
+}
+namespace System.IO
+{
+ public abstract partial class FileCleanupTestBase : System.IDisposable
+ {
+ protected FileCleanupTestBase() { }
+ protected string TestDirectory { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
+ public void Dispose() { }
+ protected virtual void Dispose(bool disposing) { }
+ ~FileCleanupTestBase() { }
+ protected string GetTestFileName(System.Nullable<int> index=default(System.Nullable<int>), [System.Runtime.CompilerServices.CallerMemberNameAttribute]string memberName=null, [System.Runtime.CompilerServices.CallerLineNumberAttribute]int lineNumber=0) { throw null; }
+ protected string GetTestFilePath(System.Nullable<int> index=default(System.Nullable<int>), [System.Runtime.CompilerServices.CallerMemberNameAttribute]string memberName=null, [System.Runtime.CompilerServices.CallerLineNumberAttribute]int lineNumber=0) { throw null; }
+ }
+} \ No newline at end of file
diff --git a/src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.csproj b/src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.csproj
new file mode 100644
index 0000000000..5ec8f738f5
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/ref/CoreFx.Private.TestUtilities.csproj
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <ProjectGuid>{E2E59C98-998F-9965-991D-99411166AF6F}</ProjectGuid>
+ <ShouldWriteSigningRequired>false</ShouldWriteSigningRequired>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
+ <ItemGroup>
+ <Compile Include="CoreFx.Private.TestUtilities.cs" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/src/CoreFx.Private.TestUtilities/src/Configurations.props b/src/CoreFx.Private.TestUtilities/src/Configurations.props
new file mode 100644
index 0000000000..c25540e032
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/src/Configurations.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <BuildConfigurations>
+ uapaot-Windows_NT;
+ uap-Windows_NT;
+ netfx-Windows_NT;
+ netcoreapp-Windows_NT;
+ netcoreapp-Unix;
+ </BuildConfigurations>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/src/CoreFx.Private.TestUtilities/src/CoreFx.Private.TestUtilities.csproj b/src/CoreFx.Private.TestUtilities/src/CoreFx.Private.TestUtilities.csproj
new file mode 100644
index 0000000000..190fbe1375
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/src/CoreFx.Private.TestUtilities.csproj
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <AssemblyName>CoreFx.Private.TestUtilities</AssemblyName>
+ <ProjectGuid>{5B7EAEC-93CB-40DF-BE40-A60BC189B737}</ProjectGuid>
+ <RuntimeProjectFile>$(ProjectDir)\external\test-runtime\XUnit.Runtime.depproj</RuntimeProjectFile>
+ <ClsCompliant>false</ClsCompliant>
+ <ShouldWriteSigningRequired>false</ShouldWriteSigningRequired>
+ </PropertyGroup>
+
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Unix-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Unix-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uapaot-Windows_NT-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uapaot-Windows_NT-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Windows_NT-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Windows_NT-Release|AnyCPU'" />
+
+ <ItemGroup>
+ <Compile Include="System\IO\FileCleanupTestBase.cs" />
+ <Compile Include="System\Diagnostics\RemoteExecutorTestBase.cs" />
+ <Compile Condition="'$(TargetGroup)' == 'netcoreapp'" Include="System\Diagnostics\RemoteExecutorTestBase.netcore.cs" />
+ <Compile Condition="'$(TargetGroup)' == 'netfx'" Include="System\Diagnostics\RemoteExecutorTestBase.netfx.cs" />
+ <Compile Condition="'$(TargetGroup)' != 'uap'" Include="System\Diagnostics\RemoteExecutorTestBase.Process.cs" />
+ <Compile Condition="'$(TargetGroup)' == 'uap'" Include="System\Diagnostics\RemoteExecutorTestBase.uap.cs" />
+ <Compile Condition="'$(TargetGroup)' == 'uapaot'" Include="System\Diagnostics\RemoteExecutorTestBase.uapaot.cs" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="System.Runtime" />
+ <Reference Include="System.IO.FileSystem" />
+ <Reference Include="System.Threading.Thread" />
+ <Reference Include="System.Runtime.Extensions" />
+ <Reference Include="System.Diagnostics.Process" />
+ <Reference Include="System.ComponentModel.Primitives" />
+ <Reference Include="System.Runtime.InteropServices.RuntimeInformation" />
+
+ <ReferenceFromRuntime Include="xunit.core" />
+ <ReferenceFromRuntime Include="Xunit.NetCore.Extensions" />
+ <ReferenceFromRuntime Include="xunit.assert" />
+ </ItemGroup>
+
+ <ItemGroup Condition="'$(TargetGroup)' == 'uap'">
+ <Reference Include="Windows" />
+ <Reference Include="mscorlib" />
+ <Reference Include="System.Runtime.WindowsRuntime" />
+ </ItemGroup>
+
+ <ItemGroup Condition="'$(TargetGroup)' == 'netfx'">
+ <Reference Include="mscorlib" />
+ <Reference Include="System" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.Process.cs b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.Process.cs
new file mode 100644
index 0000000000..01c731be23
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.Process.cs
@@ -0,0 +1,66 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace System.Diagnostics
+{
+ /// <summary>Base class used for all tests that need to spawn a remote process.</summary>
+ public abstract partial class RemoteExecutorTestBase : FileCleanupTestBase
+ {
+ /// <summary>Invokes the method from this assembly in another process using the specified arguments.</summary>
+ /// <param name="method">The method to invoke.</param>
+ /// <param name="args">The arguments to pass to the method.</param>
+ /// <param name="start">true if this function should Start the Process; false if that responsibility is left up to the caller.</param>
+ /// <param name="psi">The ProcessStartInfo to use, or null for a default.</param>
+ private static RemoteInvokeHandle RemoteInvoke(MethodInfo method, string[] args, RemoteInvokeOptions options)
+ {
+ options = options ?? new RemoteInvokeOptions();
+
+ // Verify the specified method is and that it returns an int (the exit code),
+ // and that if it accepts any arguments, they're all strings.
+ Assert.True(method.ReturnType == typeof(int) || method.ReturnType == typeof(Task<int>));
+ Assert.All(method.GetParameters(), pi => Assert.Equal(typeof(string), pi.ParameterType));
+
+ // And make sure it's in this assembly. This isn't critical, but it helps with deployment to know
+ // that the method to invoke is available because we're already running in this assembly.
+ Type t = method.DeclaringType;
+ Assembly a = t.GetTypeInfo().Assembly;
+
+ // Start the other process and return a wrapper for it to handle its lifetime and exit checking.
+ var psi = options.StartInfo;
+ psi.UseShellExecute = false;
+
+ if (!options.EnableProfiling)
+ {
+ // Profilers / code coverage tools doing coverage of the test process set environment
+ // variables to tell the targeted process what profiler to load. We don't want the child process
+ // to be profiled / have code coverage, so we remove these environment variables for that process
+ // before it's started.
+ psi.Environment.Remove("Cor_Profiler");
+ psi.Environment.Remove("Cor_Enable_Profiling");
+ psi.Environment.Remove("CoreClr_Profiler");
+ psi.Environment.Remove("CoreClr_Enable_Profiling");
+ }
+
+ // If we need the host (if it exists), use it, otherwise target the console app directly.
+ string testConsoleAppArgs = "\"" + a.FullName + "\" " + t.FullName + " " + method.Name + " " + string.Join(" ", args);
+
+ if (!File.Exists(TestConsoleApp))
+ throw new IOException("RemoteExecutorConsoleApp test app isn't present in the test runtime directory.");
+
+ psi.FileName = HostRunner;
+ psi.Arguments = ExtraParameter + testConsoleAppArgs;
+
+ // Return the handle to the process, which may or not be started
+ return new RemoteInvokeHandle(options.Start ?
+ Process.Start(psi) :
+ new Process() { StartInfo = psi }, options);
+ }
+ }
+}
diff --git a/src/Common/tests/System/Diagnostics/RemoteExecutorTestBase.cs b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.cs
index 60d203b63e..f6178afa5b 100644
--- a/src/Common/tests/System/Diagnostics/RemoteExecutorTestBase.cs
+++ b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.cs
@@ -3,45 +3,30 @@
// See the LICENSE file in the project root for more information.
using System.IO;
+using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Xunit;
-#if uap
-using Windows.ApplicationModel;
-using Windows.ApplicationModel.AppService;
-using Windows.Foundation.Collections;
-#endif // uap
-
namespace System.Diagnostics
{
/// <summary>Base class used for all tests that need to spawn a remote process.</summary>
- public abstract class RemoteExecutorTestBase : FileCleanupTestBase
+ public abstract partial class RemoteExecutorTestBase : FileCleanupTestBase
{
- /// <summary>The name of the test console app.</summary>
- protected static readonly string TestConsoleApp = "RemoteExecutorConsoleApp.exe";
- /// <summary>The name, without an extension, of the host used to host the test console app.</summary>
- private static readonly string HostRunnerExecutableName = IsFullFramework ? "xunit.console" : IsNetNative ? "xunit.console.netcore" : "dotnet";
- /// <summary>The name, with an extension, of the host host used to host the test console app.</summary>
- protected static readonly string HostRunnerName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? HostRunnerExecutableName + ".exe" : HostRunnerExecutableName;
- /// <summary>The absolute path to the host runner executable.</summary>
- protected static string HostRunner => Process.GetCurrentProcess().MainModule.FileName;
-
/// <summary>A timeout (milliseconds) after which a wait on a remote operation should be considered a failure.</summary>
public const int FailWaitTimeoutMilliseconds = 60 * 1000;
/// <summary>The exit code returned when the test process exits successfully.</summary>
- internal const int SuccessExitCode = 42;
+ public const int SuccessExitCode = 42;
- /// <summary>Determines if we're running on the .NET Framework (rather than .NET Core).</summary>
- internal static bool IsFullFramework => RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework", StringComparison.OrdinalIgnoreCase);
+ /// <summary>The name of the test console app.</summary>
+ protected static readonly string TestConsoleApp = "RemoteExecutorConsoleApp.exe";
- internal static bool IsNetNative => RuntimeInformation.FrameworkDescription.StartsWith(".NET Native", StringComparison.OrdinalIgnoreCase);
/// <summary>Invokes the method from this assembly in another process using the specified arguments.</summary>
/// <param name="method">The method to invoke.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvoke(
+ public static RemoteInvokeHandle RemoteInvoke(
Func<int> method,
RemoteInvokeOptions options = null)
{
@@ -51,7 +36,7 @@ namespace System.Diagnostics
/// <summary>Invokes the method from this assembly in another process using the specified arguments.</summary>
/// <param name="method">The method to invoke.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvoke(
+ public static RemoteInvokeHandle RemoteInvoke(
Func<Task<int>> method,
RemoteInvokeOptions options = null)
{
@@ -62,7 +47,7 @@ namespace System.Diagnostics
/// <param name="method">The method to invoke.</param>
/// <param name="arg1">The first argument to pass to the method.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvoke(
+ public static RemoteInvokeHandle RemoteInvoke(
Func<string, int> method,
string arg,
RemoteInvokeOptions options = null)
@@ -75,7 +60,7 @@ namespace System.Diagnostics
/// <param name="arg1">The first argument to pass to the method.</param>
/// <param name="arg2">The second argument to pass to the method.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvoke(
+ public static RemoteInvokeHandle RemoteInvoke(
Func<string, string, int> method,
string arg1, string arg2,
RemoteInvokeOptions options = null)
@@ -89,7 +74,7 @@ namespace System.Diagnostics
/// <param name="arg2">The second argument to pass to the method.</param>
/// <param name="arg3">The third argument to pass to the method.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvoke(
+ public static RemoteInvokeHandle RemoteInvoke(
Func<string, string, string, int> method,
string arg1, string arg2, string arg3,
RemoteInvokeOptions options = null)
@@ -104,7 +89,7 @@ namespace System.Diagnostics
/// <param name="arg3">The third argument to pass to the method.</param>
/// <param name="arg4">The fourth argument to pass to the method.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvoke(
+ public static RemoteInvokeHandle RemoteInvoke(
Func<string, string, string, string, int> method,
string arg1, string arg2, string arg3, string arg4,
RemoteInvokeOptions options = null)
@@ -120,7 +105,7 @@ namespace System.Diagnostics
/// <param name="arg4">The fourth argument to pass to the method.</param>
/// <param name="arg5">The fifth argument to pass to the method.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvoke(
+ public static RemoteInvokeHandle RemoteInvoke(
Func<string, string, string, string, string, int> method,
string arg1, string arg2, string arg3, string arg4, string arg5,
RemoteInvokeOptions options = null)
@@ -132,130 +117,12 @@ namespace System.Diagnostics
/// <param name="method">The method to invoke.</param>
/// <param name="args">The arguments to pass to the method.</param>
/// <param name="options">Options to use for the invocation.</param>
- internal static RemoteInvokeHandle RemoteInvokeRaw(Delegate method, string unparsedArg,
+ public static RemoteInvokeHandle RemoteInvokeRaw(Delegate method, string unparsedArg,
RemoteInvokeOptions options = null)
{
return RemoteInvoke(GetMethodInfo(method), new[] { unparsedArg }, options);
}
-#if uap
- /// <summary>Invokes the method from this assembly in another process using the specified arguments.</summary>
- /// <param name="method">The method to invoke.</param>
- /// <param name="args">The arguments to pass to the method.</param>
- /// <param name="start">true if this function should Start the Process; false if that responsibility is left up to the caller.</param>
- /// <param name="psi">The ProcessStartInfo to use, or null for a default.</param>
- private static RemoteInvokeHandle RemoteInvoke(MethodInfo method, string[] args, RemoteInvokeOptions options)
- {
- options = options ?? new RemoteInvokeOptions();
-
- // Verify the specified method is and that it returns an int (the exit code),
- // and that if it accepts any arguments, they're all strings.
- Assert.True(method.ReturnType == typeof(int) || method.ReturnType == typeof(Task<int>));
- Assert.All(method.GetParameters(), pi => Assert.Equal(typeof(string), pi.ParameterType));
-
- // And make sure it's in this assembly. This isn't critical, but it helps with deployment to know
- // that the method to invoke is available because we're already running in this assembly.
- Type t = method.DeclaringType;
- Assembly a = t.GetTypeInfo().Assembly;
- Assert.Equal(typeof(RemoteExecutorTestBase).GetTypeInfo().Assembly, a);
-
- using (AppServiceConnection remoteExecutionService = new AppServiceConnection())
- {
- // Here, we use the app service name defined in the app service provider's Package.appxmanifest file in the <Extension> section.
- remoteExecutionService.AppServiceName = "com.microsoft.corefxuaptests";
- remoteExecutionService.PackageFamilyName = Package.Current.Id.FamilyName;
-
- AppServiceConnectionStatus status = remoteExecutionService.OpenAsync().GetAwaiter().GetResult();
- if (status != AppServiceConnectionStatus.Success)
- {
- throw new IOException($"RemoteInvoke cannot open the remote service. Open Service Status: {status}");
- }
-
- ValueSet message = new ValueSet();
-
- message.Add("AssemblyName", a.FullName);
- message.Add("TypeName", t.FullName);
- message.Add("MethodName", method.Name);
-
- int i = 0;
- foreach (string arg in args)
- {
- message.Add("Arg" + i, arg);
- i++;
- }
-
- AppServiceResponse response = remoteExecutionService.SendMessageAsync(message).GetAwaiter().GetResult();
-
- Assert.True(response.Status == AppServiceResponseStatus.Success, $"response.Status = {response.Status}");
- int res = (int) response.Message["Results"];
- Assert.True(res == SuccessExitCode, (string) response.Message["Log"] + Environment.NewLine + $"Returned Error code: {res}");
- }
-
- // RemoteInvokeHandle is not really needed in the UAP scenario but we use it just to have consistent interface as non UAP
- return new RemoteInvokeHandle(null, options);
- }
-#else
-
- /// <summary>Invokes the method from this assembly in another process using the specified arguments.</summary>
- /// <param name="method">The method to invoke.</param>
- /// <param name="args">The arguments to pass to the method.</param>
- /// <param name="start">true if this function should Start the Process; false if that responsibility is left up to the caller.</param>
- /// <param name="psi">The ProcessStartInfo to use, or null for a default.</param>
- private static RemoteInvokeHandle RemoteInvoke(MethodInfo method, string[] args, RemoteInvokeOptions options)
- {
- options = options ?? new RemoteInvokeOptions();
-
- // Verify the specified method is and that it returns an int (the exit code),
- // and that if it accepts any arguments, they're all strings.
- Assert.True(method.ReturnType == typeof(int) || method.ReturnType == typeof(Task<int>));
- Assert.All(method.GetParameters(), pi => Assert.Equal(typeof(string), pi.ParameterType));
-
- // And make sure it's in this assembly. This isn't critical, but it helps with deployment to know
- // that the method to invoke is available because we're already running in this assembly.
- Type t = method.DeclaringType;
- Assembly a = t.GetTypeInfo().Assembly;
- Assert.Equal(typeof(RemoteExecutorTestBase).GetTypeInfo().Assembly, a);
-
- // Start the other process and return a wrapper for it to handle its lifetime and exit checking.
- var psi = options.StartInfo;
- psi.UseShellExecute = false;
-
- if (!options.EnableProfiling)
- {
- // Profilers / code coverage tools doing coverage of the test process set environment
- // variables to tell the targeted process what profiler to load. We don't want the child process
- // to be profiled / have code coverage, so we remove these environment variables for that process
- // before it's started.
- psi.Environment.Remove("Cor_Profiler");
- psi.Environment.Remove("Cor_Enable_Profiling");
- psi.Environment.Remove("CoreClr_Profiler");
- psi.Environment.Remove("CoreClr_Enable_Profiling");
- }
-
- // If we need the host (if it exists), use it, otherwise target the console app directly.
- string testConsoleAppArgs = "\"" + a.FullName + "\" " + t.FullName + " " + method.Name + " " + string.Join(" ", args);
-
- if (!File.Exists(TestConsoleApp))
- throw new IOException("RemoteExecutorConsoleApp test app isn't present in the test runtime directory.");
-
- if (IsFullFramework || IsNetNative)
- {
- psi.FileName = TestConsoleApp;
- psi.Arguments = testConsoleAppArgs;
- }
- else
- {
- psi.FileName = HostRunner;
- psi.Arguments = TestConsoleApp + " " + testConsoleAppArgs;
- }
-
- // Return the handle to the process, which may or not be started
- return new RemoteInvokeHandle(options.Start ?
- Process.Start(psi) :
- new Process() { StartInfo = psi }, options);
- }
-#endif
-
private static MethodInfo GetMethodInfo(Delegate d)
{
// RemoteInvoke doesn't support marshaling state on classes associated with
@@ -279,7 +146,7 @@ namespace System.Diagnostics
}
/// <summary>A cleanup handle to the Process created for the remote invocation.</summary>
- internal sealed class RemoteInvokeHandle : IDisposable
+ public sealed class RemoteInvokeHandle : IDisposable
{
public RemoteInvokeHandle(Process process, RemoteInvokeOptions options)
{
@@ -321,7 +188,7 @@ namespace System.Diagnostics
}
/// <summary>Options used with RemoteInvoke.</summary>
- internal sealed class RemoteInvokeOptions
+ public sealed class RemoteInvokeOptions
{
public bool Start { get; set; } = true;
public ProcessStartInfo StartInfo { get; set; } = new ProcessStartInfo();
diff --git a/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netcore.cs b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netcore.cs
new file mode 100644
index 0000000000..fb2fe31cad
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netcore.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Runtime.InteropServices;
+
+namespace System.Diagnostics
+{
+ /// <summary>Base class used for all tests that need to spawn a remote process.</summary>
+ public abstract partial class RemoteExecutorTestBase : FileCleanupTestBase
+ {
+ protected static readonly string HostRunnerName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "dotnet.exe" : "dotnet";
+ protected static readonly string HostRunner = Process.GetCurrentProcess().MainModule.FileName;
+
+ private static readonly string ExtraParameter = TestConsoleApp + " " ;
+ }
+}
diff --git a/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netfx.cs b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netfx.cs
new file mode 100644
index 0000000000..01f6991471
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.netfx.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+
+namespace System.Diagnostics
+{
+ /// <summary>Base class used for all tests that need to spawn a remote process.</summary>
+ public abstract partial class RemoteExecutorTestBase : FileCleanupTestBase
+ {
+ protected static readonly string HostRunnerName = "xunit.console.exe";
+ protected static readonly string HostRunner = TestConsoleApp;
+
+ private static readonly string ExtraParameter = "";
+ }
+}
diff --git a/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uap.cs b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uap.cs
new file mode 100644
index 0000000000..218a1267d8
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uap.cs
@@ -0,0 +1,76 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+using System.IO;
+using System.Reflection;
+using System.Threading.Tasks;
+using Windows.ApplicationModel;
+using Windows.Foundation.Collections;
+using Windows.ApplicationModel.AppService;
+
+namespace System.Diagnostics
+{
+ /// <summary>Base class used for all tests that need to spawn a remote process.</summary>
+ public abstract partial class RemoteExecutorTestBase : FileCleanupTestBase
+ {
+ protected static readonly string HostRunnerName = "xunit.runner.uap.exe";
+ protected static readonly string HostRunner = "xunit.runner.uap";
+
+ /// <summary>Invokes the method from this assembly in another process using the specified arguments.</summary>
+ /// <param name="method">The method to invoke.</param>
+ /// <param name="args">The arguments to pass to the method.</param>
+ /// <param name="start">true if this function should Start the Process; false if that responsibility is left up to the caller.</param>
+ /// <param name="psi">The ProcessStartInfo to use, or null for a default.</param>
+ private static RemoteInvokeHandle RemoteInvoke(MethodInfo method, string[] args, RemoteInvokeOptions options)
+ {
+ options = options ?? new RemoteInvokeOptions();
+
+ // Verify the specified method is and that it returns an int (the exit code),
+ // and that if it accepts any arguments, they're all strings.
+ Assert.True(method.ReturnType == typeof(int) || method.ReturnType == typeof(Task<int>));
+ Assert.All(method.GetParameters(), pi => Assert.Equal(typeof(string), pi.ParameterType));
+
+ // And make sure it's in this assembly. This isn't critical, but it helps with deployment to know
+ // that the method to invoke is available because we're already running in this assembly.
+ Type t = method.DeclaringType;
+ Assembly a = t.GetTypeInfo().Assembly;
+
+ using (AppServiceConnection remoteExecutionService = new AppServiceConnection())
+ {
+ // Here, we use the app service name defined in the app service provider's Package.appxmanifest file in the <Extension> section.
+ remoteExecutionService.AppServiceName = "com.microsoft.corefxuaptests";
+ remoteExecutionService.PackageFamilyName = Package.Current.Id.FamilyName;
+
+ AppServiceConnectionStatus status = remoteExecutionService.OpenAsync().GetAwaiter().GetResult();
+ if (status != AppServiceConnectionStatus.Success)
+ {
+ throw new IOException($"RemoteInvoke cannot open the remote service. Open Service Status: {status}");
+ }
+
+ ValueSet message = new ValueSet();
+
+ message.Add("AssemblyName", a.FullName);
+ message.Add("TypeName", t.FullName);
+ message.Add("MethodName", method.Name);
+
+ int i = 0;
+ foreach (string arg in args)
+ {
+ message.Add("Arg" + i, arg);
+ i++;
+ }
+
+ AppServiceResponse response = remoteExecutionService.SendMessageAsync(message).GetAwaiter().GetResult();
+
+ Assert.True(response.Status == AppServiceResponseStatus.Success, $"response.Status = {response.Status}");
+ int res = (int) response.Message["Results"];
+ Assert.True(res == SuccessExitCode, (string) response.Message["Log"] + Environment.NewLine + $"Returned Error code: {res}");
+ }
+
+ // RemoteInvokeHandle is not really needed in the UAP scenario but we use it just to have consistent interface as non UAP
+ return new RemoteInvokeHandle(null, options);
+ }
+ }
+}
diff --git a/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uapaot.cs b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uapaot.cs
new file mode 100644
index 0000000000..adc0b6af27
--- /dev/null
+++ b/src/CoreFx.Private.TestUtilities/src/System/Diagnostics/RemoteExecutorTestBase.uapaot.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+
+namespace System.Diagnostics
+{
+ /// <summary>Base class used for all tests that need to spawn a remote process.</summary>
+ public abstract partial class RemoteExecutorTestBase : FileCleanupTestBase
+ {
+ protected static readonly string HostRunnerName = "xunit.console.netcore.exe";
+ protected static readonly string HostRunner = TestConsoleApp;
+
+ private static readonly string ExtraParameter = "";
+ }
+
+}
diff --git a/src/Common/tests/System/IO/FileCleanupTestBase.cs b/src/CoreFx.Private.TestUtilities/src/System/IO/FileCleanupTestBase.cs
index 131c58d0dd..131c58d0dd 100644
--- a/src/Common/tests/System/IO/FileCleanupTestBase.cs
+++ b/src/CoreFx.Private.TestUtilities/src/System/IO/FileCleanupTestBase.cs
diff --git a/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderExtensions.cs b/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderExtensions.cs
index 6616da712f..abf386aa7c 100644
--- a/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderExtensions.cs
+++ b/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderExtensions.cs
@@ -240,8 +240,32 @@ namespace Microsoft.CSharp.RuntimeBinder
{
try
{
- // See if MetadataToken property is available.
Type memberInfo = typeof(MemberInfo);
+
+ // First, try the actual API. (Post .NetCore 2.0) The api is the only one that gets it completely right on frameworks without MetadataToken.
+ MethodInfo apiMethod = memberInfo.GetMethod(
+ "HasSameMetadataDefinitionAs",
+ BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.ExactBinding,
+ binder: null,
+ types: new Type[] { typeof(MemberInfo) },
+ modifiers: null);
+ if (apiMethod != null)
+ {
+ Func<MemberInfo, MemberInfo, bool> apiDelegate = (Func<MemberInfo, MemberInfo, bool>)(apiMethod.CreateDelegate(typeof(Func<MemberInfo, MemberInfo, bool>)));
+ try
+ {
+ bool result = apiDelegate(m1, m2);
+ // it worked, so publish it
+ s_MemberEquivalence = apiDelegate;
+ return result;
+ }
+ catch
+ {
+ // Api found but apparently stubbed as not supported. Continue on to the next fallback...
+ }
+ }
+
+ // See if MetadataToken property is available.
PropertyInfo property = memberInfo.GetProperty("MetadataToken", typeof(int), Array.Empty<Type>());
if ((object)property != null && property.CanRead)
diff --git a/src/Microsoft.CSharp/src/Resources/Microsoft.CSharp.rd.xml b/src/Microsoft.CSharp/src/Resources/Microsoft.CSharp.rd.xml
index f0a2eb9ed9..9710fde6d3 100644
--- a/src/Microsoft.CSharp/src/Resources/Microsoft.CSharp.rd.xml
+++ b/src/Microsoft.CSharp/src/Resources/Microsoft.CSharp.rd.xml
@@ -82,6 +82,11 @@
</Type>
<Type Name="Object" Dynamic="Required Public" />
</Namespace>
+ <Namespace Name="System.Reflection">
+ <Type Name="MemberInfo">
+ <Method Name="HasSameMetadataDefinitionAs" Dynamic="Required"/>
+ </Type>
+ </Namespace>
</Assembly>
<Assembly Name="System.Linq.Expressions">
@@ -95,4 +100,4 @@
<Type Name="System.Reflection.Missing" Dynamic="Required All" />
</Assembly>
</Library>
-</Directives> \ No newline at end of file
+</Directives>
diff --git a/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/ExceptionUtils.vb b/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/ExceptionUtils.vb
index 54c4ec9a81..9e1a658cc5 100644
--- a/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/ExceptionUtils.vb
+++ b/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/ExceptionUtils.vb
@@ -58,7 +58,6 @@ Namespace Microsoft.VisualBasic.CompilerServices
End Class
- <Serializable()>
Public NotInheritable Class InternalErrorException
Inherits System.Exception
@@ -75,10 +74,6 @@ Namespace Microsoft.VisualBasic.CompilerServices
MyBase.New(GetResourceString(SR.InternalError))
End Sub
- Private Sub New(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext)
- MyBase.New(info, context)
- End Sub
-
End Class
End Namespace
diff --git a/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/IncompleteInitialization.vb b/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/IncompleteInitialization.vb
index 416358d810..52f2af042c 100644
--- a/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/IncompleteInitialization.vb
+++ b/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/IncompleteInitialization.vb
@@ -5,19 +5,11 @@
Namespace Global.Microsoft.VisualBasic.CompilerServices
<Global.System.Diagnostics.DebuggerNonUserCode()>
<Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)>
- <Global.System.Serializable>
Public Class IncompleteInitialization
Inherits Global.System.Exception
Public Sub New()
MyBase.New()
End Sub
-#Disable Warning CA2229 ' Rule wants ctor to be protected, but private to match desktop
- <Global.System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)>
- Private Sub New(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext)
- MyBase.New(info, context)
- End Sub
-#Enable Warning CA2229 ' Implement Serialization constructor
-
End Class
End Namespace
diff --git a/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/StaticLocalInitFlag.vb b/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/StaticLocalInitFlag.vb
index 0749b44928..4805db4aa2 100644
--- a/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/StaticLocalInitFlag.vb
+++ b/src/Microsoft.VisualBasic/src/Microsoft/VisualBasic/CompilerServices/StaticLocalInitFlag.vb
@@ -5,7 +5,6 @@
Namespace Global.Microsoft.VisualBasic.CompilerServices
<Global.System.Diagnostics.DebuggerNonUserCode()>
<Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)>
- <Global.System.Serializable()>
Public Class StaticLocalInitFlag
Public State As Short
End Class
diff --git a/src/Microsoft.VisualBasic/tests/Microsoft.VisualBasic.Tests.csproj b/src/Microsoft.VisualBasic/tests/Microsoft.VisualBasic.Tests.csproj
index c55152b7f0..7c34b69711 100644
--- a/src/Microsoft.VisualBasic/tests/Microsoft.VisualBasic.Tests.csproj
+++ b/src/Microsoft.VisualBasic/tests/Microsoft.VisualBasic.Tests.csproj
@@ -7,10 +7,14 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
<ItemGroup>
- <Compile Include="SerializationTests.cs" />
+ <Compile Include="OperatorsTests.cs" />
+ <Compile Include="UtilsTests.cs" />
<Compile Include="StringsTests.cs" />
+ <Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
+ <Link>Common\System\AssertExtensions.cs</Link>
+ </Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
- <Link>CommonTest\System\PlatformDetection.cs</Link>
+ <Link>Common\System\PlatformDetection.cs</Link>
</Compile>
<Compile Include="$(CommonTestPath)\System\Runtime\Serialization\Formatters\BinaryFormatterHelpers.cs">
<Link>Common\System\Runtime\Serialization\Formatters\BinaryFormatterHelpers.cs</Link>
diff --git a/src/Microsoft.VisualBasic/tests/OperatorsTests.cs b/src/Microsoft.VisualBasic/tests/OperatorsTests.cs
new file mode 100644
index 0000000000..f1f39dbd20
--- /dev/null
+++ b/src/Microsoft.VisualBasic/tests/OperatorsTests.cs
@@ -0,0 +1,248 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using Microsoft.VisualBasic.CompilerServices;
+using Xunit;
+
+namespace Microsoft.VisualBasic.CompilerServices.Tests
+{
+ public class OperatorsTests
+ {
+ public static IEnumerable<object[]> AddObject_Idempotent_TestData()
+ {
+ // byte + primitives.
+ yield return new object[] { (byte)1, (byte)2, (byte)3 };
+ yield return new object[] { (byte)2, (sbyte)2, (short)4 };
+ yield return new object[] { (byte)3, (ushort)2, (ushort)5 };
+ yield return new object[] { (byte)4, (short)2, (short)6 };
+ yield return new object[] { (byte)5, (uint)2, (uint)7 };
+ yield return new object[] { (byte)6, 2, 8 };
+ yield return new object[] { (byte)7, (long)2, (long)9 };
+ yield return new object[] { (byte)8, (ulong)2, (ulong)10 };
+ yield return new object[] { (byte)9, (float)2, (float)11 };
+ yield return new object[] { (byte)10, (double)2, (double)12 };
+ yield return new object[] { (byte)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (byte)12, "2", (double)14 };
+ yield return new object[] { (byte)13, true, (short)12 };
+ yield return new object[] { (byte)14, null, (byte)14 };
+ yield return new object[] { (byte)15, byte.MaxValue, (short)270 };
+
+ // sbyte + primitives.
+ yield return new object[] { (sbyte)1, (sbyte)2, (sbyte)3 };
+ yield return new object[] { (sbyte)3, (ushort)2, 5 };
+ yield return new object[] { (sbyte)4, (short)2, (short)6 };
+ yield return new object[] { (sbyte)5, (uint)2, (long)7 };
+ yield return new object[] { (sbyte)6, 2, 8 };
+ yield return new object[] { (sbyte)7, (long)2, (long)9 };
+ yield return new object[] { (sbyte)9, (float)2, (float)11 };
+ yield return new object[] { (sbyte)8, (ulong)2, (decimal)10 };
+ yield return new object[] { (sbyte)10, (double)2, (double)12 };
+ yield return new object[] { (sbyte)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (sbyte)12, "2", (double)14 };
+ yield return new object[] { (sbyte)13, true, (sbyte)12 };
+ yield return new object[] { (sbyte)14, null, (sbyte)14 };
+ yield return new object[] { (sbyte)15, sbyte.MaxValue, (short)142 };
+
+ // ushort + primitives.
+ yield return new object[] { (ushort)3, (ushort)2, (ushort)5 };
+ yield return new object[] { (ushort)4, (short)2, 6 };
+ yield return new object[] { (ushort)5, (uint)2, (uint)7 };
+ yield return new object[] { (ushort)6, 2, 8 };
+ yield return new object[] { (ushort)7, (long)2, (long)9 };
+ yield return new object[] { (ushort)8, (ulong)2, (ulong)10 };
+ yield return new object[] { (ushort)9, (float)2, (float)11 };
+ yield return new object[] { (ushort)10, (double)2, (double)12 };
+ yield return new object[] { (ushort)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (ushort)12, "2", (double)14 };
+ yield return new object[] { (ushort)13, true, 12 };
+ yield return new object[] { (ushort)14, null, (ushort)14 };
+ yield return new object[] { (ushort)15, ushort.MaxValue, 65550 };
+
+ // short + primitives.
+ yield return new object[] { (short)4, (short)2, (short)6 };
+ yield return new object[] { (short)5, (uint)2, (long)7 };
+ yield return new object[] { (short)6, 2, 8 };
+ yield return new object[] { (short)7, (long)2, (long)9 };
+ yield return new object[] { (short)8, (ulong)2, (decimal)10 };
+ yield return new object[] { (short)9, (float)2, (float)11 };
+ yield return new object[] { (short)10, (double)2, (double)12 };
+ yield return new object[] { (short)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (short)12, "2", (double)14 };
+ yield return new object[] { (short)13, true, (short)12 };
+ yield return new object[] { (short)14, null, (short)14 };
+ yield return new object[] { (short)15, short.MaxValue, 32782 };
+
+ // uint + primitives.
+ yield return new object[] { (uint)4, (short)2, (long)6 };
+ yield return new object[] { (uint)5, (uint)2, (uint)7 };
+ yield return new object[] { (uint)6, 2, (long)8 };
+ yield return new object[] { (uint)7, (ulong)2, (ulong)9 };
+ yield return new object[] { (uint)8, (long)2, (long)10 };
+ yield return new object[] { (uint)9, (float)2, (float)11 };
+ yield return new object[] { (uint)10, (double)2, (double)12 };
+ yield return new object[] { (uint)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (uint)12, "2", (double)14 };
+ yield return new object[] { (uint)13, true, (long)12 };
+ yield return new object[] { (uint)14, null, (uint)14 };
+ yield return new object[] { (uint)15, uint.MaxValue, 4294967310 };
+
+ // int + primitives.
+ yield return new object[] { 6, 2, 8 };
+ yield return new object[] { 7, (ulong)2, (decimal)9 };
+ yield return new object[] { 8, (long)2, (long)10 };
+ yield return new object[] { 9, (float)2, (float)11 };
+ yield return new object[] { 10, (double)2, (double)12 };
+ yield return new object[] { 11, (decimal)2, (decimal)13 };
+ yield return new object[] { 12, "2", (double)14 };
+ yield return new object[] { 13, true, 12 };
+ yield return new object[] { 14, null, 14 };
+ yield return new object[] { 15, int.MaxValue, (long)2147483662 };
+
+ // ulong + primitives.
+ yield return new object[] { (ulong)7, (ulong)2, (ulong)9 };
+ yield return new object[] { (ulong)8, (long)2, (decimal)10 };
+ yield return new object[] { (ulong)9, (float)2, (float)11 };
+ yield return new object[] { (ulong)10, (double)2, (double)12 };
+ yield return new object[] { (ulong)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (ulong)12, "2", (double)14 };
+ yield return new object[] { (ulong)13, true, (decimal)12 };
+ yield return new object[] { (ulong)14, null, (ulong)14 };
+ yield return new object[] { (ulong)15, ulong.MaxValue, decimal.Parse("18446744073709551630") };
+
+ // long + primitives.
+ yield return new object[] { (long)8, (long)2, (long)10 };
+ yield return new object[] { (long)9, (float)2, (float)11 };
+ yield return new object[] { (long)10, (double)2, (double)12 };
+ yield return new object[] { (long)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (long)12, "2", (double)14 };
+ yield return new object[] { (long)13, true, (long)12 };
+ yield return new object[] { (long)14, null, (long)14 };
+ yield return new object[] { (long)15, long.MaxValue, decimal.Parse("9223372036854775822") };
+
+ // float + primitives
+ yield return new object[] { (float)9, (float)2, (float)11 };
+ yield return new object[] { (float)10, (double)2, (double)12 };
+ yield return new object[] { (float)11, (decimal)2, (float)13 };
+ yield return new object[] { (float)12, "2", (double)14 };
+ yield return new object[] { (float)13, true, (float)12 };
+ yield return new object[] { (float)14, null, (float)14 };
+ yield return new object[] { (float)15, float.PositiveInfinity, float.PositiveInfinity };
+
+ // double + primitives
+ yield return new object[] { (double)10, (double)2, (double)12 };
+ yield return new object[] { (double)11, (decimal)2, (double)13 };
+ yield return new object[] { (double)12, "2", (double)14 };
+ yield return new object[] { (double)13, true, (double)12 };
+ yield return new object[] { (double)14, null, (double)14 };
+ yield return new object[] { (double)15, double.PositiveInfinity, double.PositiveInfinity };
+
+ // decimal + primitives
+ yield return new object[] { (decimal)11, (decimal)2, (decimal)13 };
+ yield return new object[] { (decimal)12, "2", (double)14 };
+ yield return new object[] { (decimal)13, true, (decimal)12 };
+ yield return new object[] { (decimal)14, null, (decimal)14 };
+
+ // string + primitives
+ yield return new object[] { "1", "2", "12" };
+ yield return new object[] { "2", '2', "22" };
+ yield return new object[] { "3", true, (double)2 };
+ yield return new object[] { "5", null, "5" };
+
+ // bool + primitives
+ yield return new object[] { true, "2", (double)1 };
+ yield return new object[] { true, true, (short)-2 };
+ yield return new object[] { true, false, (short)-1 };
+ yield return new object[] { true, null, (short)-1 };
+
+ // char + primitives
+ yield return new object[] { 'a', null, "a\0" };
+
+ // null + null
+ yield return new object[] { null, null, 0 };
+ }
+
+ [Theory]
+ [MemberData(nameof(AddObject_Idempotent_TestData))]
+ public void AddObject_Convertible_ReturnsExpected(object left, object right, object expected)
+ {
+ Assert.Equal(expected, Operators.AddObject(left, right));
+
+ if (expected is string expectedString)
+ {
+ string reversed = new string(expectedString.Reverse().ToArray());
+ Assert.Equal(reversed, Operators.AddObject(right, left));
+ }
+ else
+ {
+ Assert.Equal(expected, Operators.AddObject(right, left));
+ }
+ }
+
+ [Fact]
+ public void AddObject_DateString_ReturnsExpected()
+ {
+ string expected = Assert.IsType<string>(Operators.AddObject("String", new DateTime(2017, 10, 10)));
+ Assert.StartsWith("String", expected);
+ Assert.Contains("17", expected);
+ }
+
+ [Fact]
+ public void AddObject_DateDate_ReturnsExpected()
+ {
+ string expected = Assert.IsType<string>(Operators.AddObject(new DateTime(2018, 10, 10), new DateTime(2017, 10, 10)));
+ Assert.Contains("17", expected);
+ Assert.Contains("18", expected);
+ }
+
+ [Fact]
+ public void AddObject_DateNull_ReturnsExpected()
+ {
+ string expected = Assert.IsType<string>(Operators.AddObject(new DateTime(2018, 10, 10), null));
+ Assert.Contains("18", expected);
+ }
+
+ [Fact]
+ public void AddObject_NullDate_ReturnsExpected()
+ {
+ string expected = Assert.IsType<string>(Operators.AddObject(null, new DateTime(2018, 10, 10)));
+ Assert.Contains("18", expected);
+ }
+
+ [Fact]
+ public void AddObject_StringDate_ReturnsExpected()
+ {
+ string expected = Assert.IsType<string>(Operators.AddObject(new DateTime(2017, 10, 10), "String"));
+ Assert.EndsWith("String", expected);
+ Assert.Contains("17", expected);
+ }
+
+ [Fact]
+ public void AddObject_FloatDoubleDecimalOverflow_ReturnsMax()
+ {
+ Assert.Equal(float.MaxValue, Operators.AddObject((float)15, float.MaxValue));
+ Assert.Equal(double.MaxValue, Operators.AddObject((double)15, double.MaxValue));
+ Assert.NotEqual(decimal.MaxValue, Operators.AddObject((decimal)15, decimal.MaxValue));
+ }
+
+ public static IEnumerable<object[]> IncompatibleAddObject_TestData()
+ {
+ yield return new object[] { 1, '2' };
+ yield return new object[] { 2, DBNull.Value };
+ yield return new object[] { '3', new object() };
+ }
+
+ [Theory]
+ [MemberData(nameof(IncompatibleAddObject_TestData))]
+ [ActiveIssue(21088)]
+ public void AddObject_Incompatible_ThrowsInvalidCastException(object left, object right)
+ {
+ Assert.Throws<InvalidCastException>(() => Operators.AddObject(left, right));
+ Assert.Throws<InvalidCastException>(() => Operators.AddObject(right, left));
+ }
+ }
+}
diff --git a/src/Microsoft.VisualBasic/tests/SerializationTests.cs b/src/Microsoft.VisualBasic/tests/SerializationTests.cs
deleted file mode 100644
index c7b974ee78..0000000000
--- a/src/Microsoft.VisualBasic/tests/SerializationTests.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Runtime.Serialization.Formatters.Tests;
-using Microsoft.VisualBasic.CompilerServices;
-using Xunit;
-
-namespace Microsoft.VisualBasic.Tests
-{
- public class SerializationTests
- {
- [Fact]
- public void SerializeDeserialize_Roundtrip_Success()
- {
- BinaryFormatterHelpers.AssertRoundtrips(new IncompleteInitialization());
-
- var initFlag = new StaticLocalInitFlag { State = 42 };
- var clonedInitFlag = BinaryFormatterHelpers.Clone(initFlag);
- Assert.Equal(42, clonedInitFlag.State);
- }
- }
-}
diff --git a/src/Microsoft.VisualBasic/tests/StringsTests.cs b/src/Microsoft.VisualBasic/tests/StringsTests.cs
index 2121be08d7..ff67ecddbd 100644
--- a/src/Microsoft.VisualBasic/tests/StringsTests.cs
+++ b/src/Microsoft.VisualBasic/tests/StringsTests.cs
@@ -10,23 +10,25 @@ namespace Microsoft.VisualBasic.Tests
public class StringsTests
{
[Fact]
- public void AscWTest()
+ public void AscW_Char_ReturnsChar()
{
Assert.Equal('3', Strings.AscW('3'));
+ }
- Assert.Throws<ArgumentException>(() => Strings.AscW(null));
- Assert.Throws<ArgumentException>(() => Strings.AscW(""));
-
- Assert.Equal('3', Strings.AscW("3"));
- Assert.Equal('3', Strings.AscW("345"));
+ [Theory]
+ [InlineData("3", '3')]
+ [InlineData("345", '3')]
+ public void AscW_String_ReturnsExpected(string String, int expected)
+ {
+ Assert.Equal(expected, Strings.AscW(String));
}
[Theory]
- [InlineData(-32769)]
- [InlineData(65536)]
- public void ChrW_CharCodeOutOfRange(int charCode)
+ [InlineData(null)]
+ [InlineData("")]
+ public void AscW_NullOrEmpty_ThrowsArgumentException(string String)
{
- Assert.Throws<ArgumentException>(() => Strings.ChrW(charCode));
+ Assert.Throws<ArgumentException>(null, () => Strings.AscW(String));
}
[Theory]
@@ -34,10 +36,17 @@ namespace Microsoft.VisualBasic.Tests
[InlineData(65)]
[InlineData(65535)]
[InlineData(-32768)]
- public void ChrW_CharCodeInRange(int charCode)
+ public void ChrW_CharCodeInRange_ReturnsExpected(int charCode)
+ {
+ Assert.Equal(Convert.ToChar(charCode & 0XFFFF), Strings.ChrW(charCode));
+ }
+
+ [Theory]
+ [InlineData(-32769)]
+ [InlineData(65536)]
+ public void ChrW_CharCodeOutOfRange_ThrowsArgumentException(int charCode)
{
- char result = Strings.ChrW(charCode);
- Assert.Equal(Convert.ToChar(charCode & 0XFFFF), result);
+ Assert.Throws<ArgumentException>(null, () => Strings.ChrW(charCode));
}
}
}
diff --git a/src/Microsoft.VisualBasic/tests/UtilsTests.cs b/src/Microsoft.VisualBasic/tests/UtilsTests.cs
new file mode 100644
index 0000000000..ea9986cd31
--- /dev/null
+++ b/src/Microsoft.VisualBasic/tests/UtilsTests.cs
@@ -0,0 +1,92 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using Microsoft.VisualBasic.CompilerServices;
+using Xunit;
+
+namespace Microsoft.VisualBasic.CompilerServices.Tests
+{
+ public class UtilsTests
+ {
+ public static IEnumerable<object[]> CopyArray_TestData()
+ {
+ yield return new object[] { new int[] { 1, 2 }, new int[3], new int[] { 1, 2, 0 } };
+ yield return new object[] { new int[] { 1, 2 }, new int[2], new int[] { 1, 2 } };
+ yield return new object[] { new int[] { 1, 2 }, new int[1], new int[] { 1 } };
+
+ yield return new object[] { new int[,] { { 1, 2 }, { 3, 4 } }, new int[2, 2], new int[,] { { 1, 2 }, { 3, 4 } } };
+
+ if (PlatformDetection.IsNonZeroLowerBoundArraySupported)
+ {
+ Array array1 = Array.CreateInstance(typeof(int), 1);
+ Array array2 = Array.CreateInstance(typeof(int), new int[] { 1 }, new int[] { 2 });
+ yield return new object[] { array1, array2, array2 };
+
+ Array array3 = Array.CreateInstance(typeof(int), new int[] { 1, 1 }, new int[] { 0, -1 });
+ Array array4 = Array.CreateInstance(typeof(int), new int[] { 1, 0 }, new int[] { 0, 2 });
+ yield return new object[] { array3, array4, array4 };
+
+ Array array5 = Array.CreateInstance(typeof(int), new int[] { 1, 2 }, new int[] { 0, 0 });
+ Array array6 = Array.CreateInstance(typeof(int), new int[] { 1, 1 }, new int[] { 0, 1 });
+ yield return new object[] { array5, array6, array6};
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(CopyArray_TestData))]
+ public void CopyArray_Valid_ReturnsExpected(Array source, Array destination, Array expected)
+ {
+ Assert.Same(destination, Utils.CopyArray(source, destination));
+ Assert.Equal(expected, destination);
+ }
+
+
+ [Fact]
+ public void CopyArray_NullSourceArray_ReturnsDestination()
+ {
+ Array destination = new object[0];
+ Assert.Same(destination, Utils.CopyArray(null, destination));
+ }
+
+ [Fact]
+ public void CopyArray_EmptySourceArray_ReturnsDestination()
+ {
+ Array destination = new object[0];
+ Assert.Same(destination, Utils.CopyArray(new int[0], destination));
+ Assert.Null(Utils.CopyArray(new int[0], null));
+ }
+
+ [Fact]
+ public void CopyArray_NullDestinationArray_ThrowsNullReferenceException()
+ {
+ Assert.Throws<NullReferenceException>(() => Utils.CopyArray(new int[1], null));
+ }
+
+ [Fact]
+ public void CopyArray_NonMatchingRanks_ThrowsInvalidCastException()
+ {
+ Assert.Throws<InvalidCastException>(() => Utils.CopyArray(new int[1], new int[1, 1]));
+ }
+
+ [Fact]
+ public void CopyArray_RankGreaterThanTwoAndNonMatchingBounds_ThrowsArrayTypeMismatchException()
+ {
+ Array array1 = Array.CreateInstance(typeof(int), new int[] { 1, 2, 3 }, new int[] { 2, 3, 4 });
+ Array array2 = Array.CreateInstance(typeof(int), new int[] { 1, 2, 3}, new int[] { 2, 4, 4 });
+ Assert.Throws<ArrayTypeMismatchException>(() => Utils.CopyArray(array1, array2));
+ Assert.Throws<ArrayTypeMismatchException>(() => Utils.CopyArray(array2, array1));
+ }
+
+ [Fact]
+ public void CopyArray_NonMatchingBounds_ThrowsArgumentOutOfRangeException()
+ {
+ Array array1 = Array.CreateInstance(typeof(int), new int[] { 1, 2 }, new int[] { 2, 3 });
+ Array array2 = Array.CreateInstance(typeof(int), new int[] { 1, 2 }, new int[] { 2, 4 });
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("sourceIndex", "srcIndex", () => Utils.CopyArray(array1, array2));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("sourceIndex", "srcIndex", () => Utils.CopyArray(array2, array1));
+ }
+ }
+}
diff --git a/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj b/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj
index 11b2d42fc3..4c24f60006 100644
--- a/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj
+++ b/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj
@@ -108,9 +108,6 @@
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlReflectionMember.cs">
<Link>System\Xml\Serialization\XmlReflectionMember.cs</Link>
</Compile>
- <Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSchemaProviderAttribute.cs">
- <Link>System\Xml\Serialization\XmlSchemaProviderAttribute.cs</Link>
- </Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializationGeneratedCode.cs">
<Link>System\Xml\Serialization\XmlSerializationGeneratedCode.cs</Link>
</Compile>
@@ -129,12 +126,6 @@
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializerNamespaces.cs">
<Link>System\Xml\Serialization\XmlSerializerNamespaces.cs</Link>
</Compile>
- <Compile Include="$(SourceDir)\System\Xml\Serialization\XmlTextAttribute.cs">
- <Link>System\Xml\Serialization\XmlTextAttribute.cs</Link>
- </Compile>
- <Compile Include="$(SourceDir)\System\Xml\Serialization\XmlTypeAttribute.cs">
- <Link>System\Xml\Serialization\XmlTypeAttribute.cs</Link>
- </Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlTypeMapping.cs">
<Link>System\Xml\Serialization\XmlTypeMapping.cs</Link>
</Compile>
diff --git a/src/System.Collections.NonGeneric/src/System/Collections/Queue.cs b/src/System.Collections.NonGeneric/src/System/Collections/Queue.cs
index dcfcd35eed..4bfdeef453 100644
--- a/src/System.Collections.NonGeneric/src/System/Collections/Queue.cs
+++ b/src/System.Collections.NonGeneric/src/System/Collections/Queue.cs
@@ -26,12 +26,12 @@ namespace System.Collections
#endif
public class Queue : ICollection, ICloneable
{
- private Object[] _array;
- private int _head; // First valid element in the queue
- private int _tail; // Last valid element in the queue
- private int _size; // Number of elements.
- private int _growFactor; // 100 == 1.0, 130 == 1.3, 200 == 2.0
- private int _version;
+ private Object[] _array; // Do not rename (binary serialization)
+ private int _head; // First valid element in the queue. Do not rename (binary serialization)
+ private int _tail; // Last valid element in the queue. Do not rename (binary serialization)
+ private int _size; // Number of elements. Do not rename (binary serialization)
+ private int _growFactor; // 100 == 1.0, 130 == 1.3, 200 == 2.0. Do not rename (binary serialization)
+ private int _version; // Do not rename (binary serialization)
[NonSerialized]
private Object _syncRoot;
diff --git a/src/System.Collections.NonGeneric/src/System/Collections/SortedList.cs b/src/System.Collections.NonGeneric/src/System/Collections/SortedList.cs
index 45c6ecdd6b..81cb92eef2 100644
--- a/src/System.Collections.NonGeneric/src/System/Collections/SortedList.cs
+++ b/src/System.Collections.NonGeneric/src/System/Collections/SortedList.cs
@@ -66,13 +66,13 @@ namespace System.Collections
#endif
public class SortedList : IDictionary, ICloneable
{
- private Object[] _keys;
- private Object[] _values;
- private int _size;
- private int _version;
- private IComparer _comparer;
- private KeyList _keyList;
- private ValueList _valueList;
+ private Object[] keys; // Do not rename (binary serialization)
+ private Object[] values; // Do not rename (binary serialization)
+ private int _size; // Do not rename (binary serialization)
+ private int version; // Do not rename (binary serialization)
+ private IComparer comparer; // Do not rename (binary serialization)
+ private KeyList keyList; // Do not rename (binary serialization)
+ private ValueList valueList; // Do not rename (binary serialization)
[NonSerialized]
private Object _syncRoot;
@@ -94,10 +94,10 @@ namespace System.Collections
private void Init()
{
- _keys = Array.Empty<Object>();
- _values = Array.Empty<Object>();
+ keys = Array.Empty<Object>();
+ values = Array.Empty<Object>();
_size = 0;
- _comparer = new Comparer(CultureInfo.CurrentCulture);
+ comparer = new Comparer(CultureInfo.CurrentCulture);
}
// Constructs a new sorted list. The sorted list is initially empty and has
@@ -112,9 +112,9 @@ namespace System.Collections
if (initialCapacity < 0)
throw new ArgumentOutOfRangeException(nameof(initialCapacity), SR.ArgumentOutOfRange_NeedNonNegNum);
Contract.EndContractBlock();
- _keys = new Object[initialCapacity];
- _values = new Object[initialCapacity];
- _comparer = new Comparer(CultureInfo.CurrentCulture);
+ keys = new Object[initialCapacity];
+ values = new Object[initialCapacity];
+ comparer = new Comparer(CultureInfo.CurrentCulture);
}
// Constructs a new sorted list with a given IComparer
@@ -130,7 +130,7 @@ namespace System.Collections
public SortedList(IComparer comparer)
: this()
{
- if (comparer != null) _comparer = comparer;
+ if (comparer != null) this.comparer = comparer;
}
// Constructs a new sorted list with a given IComparer
@@ -173,15 +173,15 @@ namespace System.Collections
if (d == null)
throw new ArgumentNullException(nameof(d), SR.ArgumentNull_Dictionary);
Contract.EndContractBlock();
- d.Keys.CopyTo(_keys, 0);
- d.Values.CopyTo(_values, 0);
+ d.Keys.CopyTo(keys, 0);
+ d.Values.CopyTo(values, 0);
// Array.Sort(Array keys, Array values, IComparer comparer) does not exist in System.Runtime contract v4.0.10.0.
// This works around that by sorting only on the keys and then assigning values accordingly.
- Array.Sort(_keys, comparer);
- for (int i = 0; i < _keys.Length; i++)
+ Array.Sort(keys, comparer);
+ for (int i = 0; i < keys.Length; i++)
{
- _values[i] = d[_keys[i]];
+ values[i] = d[keys[i]];
}
_size = d.Count;
}
@@ -193,7 +193,7 @@ namespace System.Collections
{
if (key == null) throw new ArgumentNullException(nameof(key), SR.ArgumentNull_Key);
Contract.EndContractBlock();
- int i = Array.BinarySearch(_keys, 0, _size, key, _comparer);
+ int i = Array.BinarySearch(keys, 0, _size, key, comparer);
if (i >= 0)
throw new ArgumentException(SR.Format(SR.Argument_AddingDuplicate__, GetKey(i), key));
Insert(~i, key, value);
@@ -209,7 +209,7 @@ namespace System.Collections
{
get
{
- return _keys.Length;
+ return keys.Length;
}
set
{
@@ -219,7 +219,7 @@ namespace System.Collections
}
Contract.EndContractBlock();
- if (value != _keys.Length)
+ if (value != keys.Length)
{
if (value > 0)
{
@@ -227,18 +227,18 @@ namespace System.Collections
Object[] newValues = new Object[value];
if (_size > 0)
{
- Array.Copy(_keys, 0, newKeys, 0, _size);
- Array.Copy(_values, 0, newValues, 0, _size);
+ Array.Copy(keys, 0, newKeys, 0, _size);
+ Array.Copy(values, 0, newValues, 0, _size);
}
- _keys = newKeys;
- _values = newValues;
+ keys = newKeys;
+ values = newValues;
}
else
{
// size can only be zero here.
Debug.Assert(_size == 0, "Size is not zero");
- _keys = Array.Empty<Object>();
- _values = Array.Empty<Object>();
+ keys = Array.Empty<Object>();
+ values = Array.Empty<Object>();
}
}
}
@@ -312,9 +312,9 @@ namespace System.Collections
public virtual void Clear()
{
// clear does not change the capacity
- _version++;
- Array.Clear(_keys, 0, _size); // Don't need to doc this but we clear the elements so that the gc can reclaim the references.
- Array.Clear(_values, 0, _size); // Don't need to doc this but we clear the elements so that the gc can reclaim the references.
+ version++;
+ Array.Clear(keys, 0, _size); // Don't need to doc this but we clear the elements so that the gc can reclaim the references.
+ Array.Clear(values, 0, _size); // Don't need to doc this but we clear the elements so that the gc can reclaim the references.
_size = 0;
}
@@ -324,11 +324,11 @@ namespace System.Collections
public virtual Object Clone()
{
SortedList sl = new SortedList(_size);
- Array.Copy(_keys, 0, sl._keys, 0, _size);
- Array.Copy(_values, 0, sl._values, 0, _size);
+ Array.Copy(keys, 0, sl.keys, 0, _size);
+ Array.Copy(values, 0, sl.values, 0, _size);
sl._size = _size;
- sl._version = _version;
- sl._comparer = _comparer;
+ sl.version = version;
+ sl.comparer = comparer;
// Don't copy keyList nor valueList.
return sl;
}
@@ -374,7 +374,7 @@ namespace System.Collections
Contract.EndContractBlock();
for (int i = 0; i < Count; i++)
{
- DictionaryEntry entry = new DictionaryEntry(_keys[i], _values[i]);
+ DictionaryEntry entry = new DictionaryEntry(keys[i], values[i]);
array.SetValue(entry, i + arrayIndex);
}
}
@@ -388,7 +388,7 @@ namespace System.Collections
KeyValuePairs[] array = new KeyValuePairs[Count];
for (int i = 0; i < Count; i++)
{
- array[i] = new KeyValuePairs(_keys[i], _values[i]);
+ array[i] = new KeyValuePairs(keys[i], values[i]);
}
return array;
}
@@ -399,7 +399,7 @@ namespace System.Collections
// to min, whichever is larger.
private void EnsureCapacity(int min)
{
- int newCapacity = _keys.Length == 0 ? 16 : _keys.Length * 2;
+ int newCapacity = keys.Length == 0 ? 16 : keys.Length * 2;
// Allow the list to grow to maximum possible capacity (~2G elements) before encountering overflow.
// Note that this check works even when _items.Length overflowed thanks to the (uint) cast
if ((uint)newCapacity > MaxArrayLength) newCapacity = MaxArrayLength;
@@ -414,7 +414,7 @@ namespace System.Collections
if (index < 0 || index >= Count)
throw new ArgumentOutOfRangeException(nameof(index), SR.ArgumentOutOfRange_Index);
Contract.EndContractBlock();
- return _values[index];
+ return values[index];
}
// Returns an IEnumerator for this sorted list. If modifications
@@ -443,7 +443,7 @@ namespace System.Collections
{
if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException(nameof(index), SR.ArgumentOutOfRange_Index);
Contract.EndContractBlock();
- return _keys[index];
+ return keys[index];
}
// Returns an IList representing the keys of this sorted list. The
@@ -460,8 +460,8 @@ namespace System.Collections
//
public virtual IList GetKeyList()
{
- if (_keyList == null) _keyList = new KeyList(this);
- return _keyList;
+ if (keyList == null) keyList = new KeyList(this);
+ return keyList;
}
// Returns an IList representing the values of this sorted list. The
@@ -477,8 +477,8 @@ namespace System.Collections
//
public virtual IList GetValueList()
{
- if (_valueList == null) _valueList = new ValueList(this);
- return _valueList;
+ if (valueList == null) valueList = new ValueList(this);
+ return valueList;
}
// Returns the value associated with the given key. If an entry with the
@@ -489,18 +489,18 @@ namespace System.Collections
get
{
int i = IndexOfKey(key);
- if (i >= 0) return _values[i];
+ if (i >= 0) return values[i];
return null;
}
set
{
if (key == null) throw new ArgumentNullException(nameof(key), SR.ArgumentNull_Key);
Contract.EndContractBlock();
- int i = Array.BinarySearch(_keys, 0, _size, key, _comparer);
+ int i = Array.BinarySearch(keys, 0, _size, key, comparer);
if (i >= 0)
{
- _values[i] = value;
- _version++;
+ values[i] = value;
+ version++;
return;
}
Insert(~i, key, value);
@@ -519,7 +519,7 @@ namespace System.Collections
if (key == null)
throw new ArgumentNullException(nameof(key), SR.ArgumentNull_Key);
Contract.EndContractBlock();
- int ret = Array.BinarySearch(_keys, 0, _size, key, _comparer);
+ int ret = Array.BinarySearch(keys, 0, _size, key, comparer);
return ret >= 0 ? ret : -1;
}
@@ -531,22 +531,22 @@ namespace System.Collections
//
public virtual int IndexOfValue(Object value)
{
- return Array.IndexOf(_values, value, 0, _size);
+ return Array.IndexOf(values, value, 0, _size);
}
// Inserts an entry with a given key and value at a given index.
private void Insert(int index, Object key, Object value)
{
- if (_size == _keys.Length) EnsureCapacity(_size + 1);
+ if (_size == keys.Length) EnsureCapacity(_size + 1);
if (index < _size)
{
- Array.Copy(_keys, index, _keys, index + 1, _size - index);
- Array.Copy(_values, index, _values, index + 1, _size - index);
+ Array.Copy(keys, index, keys, index + 1, _size - index);
+ Array.Copy(values, index, values, index + 1, _size - index);
}
- _keys[index] = key;
- _values[index] = value;
+ keys[index] = key;
+ values[index] = value;
_size++;
- _version++;
+ version++;
}
// Removes the entry at the given index. The size of the sorted list is
@@ -559,12 +559,12 @@ namespace System.Collections
_size--;
if (index < _size)
{
- Array.Copy(_keys, index + 1, _keys, index, _size - index);
- Array.Copy(_values, index + 1, _values, index, _size - index);
+ Array.Copy(keys, index + 1, keys, index, _size - index);
+ Array.Copy(values, index + 1, values, index, _size - index);
}
- _keys[_size] = null;
- _values[_size] = null;
- _version++;
+ keys[_size] = null;
+ values[_size] = null;
+ version++;
}
// Removes an entry from this sorted list. If an entry with the specified
@@ -585,8 +585,8 @@ namespace System.Collections
{
if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException(nameof(index), SR.ArgumentOutOfRange_Index);
Contract.EndContractBlock();
- _values[index] = value;
- _version++;
+ values[index] = value;
+ version++;
}
// Returns a thread-safe SortedList.
@@ -614,11 +614,13 @@ namespace System.Collections
}
[Serializable]
+#if !MONO
+ [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
+#endif
private class SyncSortedList : SortedList
{
- private SortedList _list;
- private Object _root;
-
+ private SortedList _list; // Do not rename (binary serialization)
+ private Object _root; // Do not rename (binary serialization)
internal SyncSortedList(SortedList list)
{
@@ -858,7 +860,7 @@ namespace System.Collections
_index = index;
_startIndex = index;
_endIndex = index + count;
- _version = sortedList._version;
+ _version = sortedList.version;
_getObjectRetType = getObjRetType;
_current = false;
}
@@ -869,7 +871,7 @@ namespace System.Collections
{
get
{
- if (_version != _sortedList._version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
+ if (_version != _sortedList.version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
if (_current == false) throw new InvalidOperationException(SR.InvalidOperation_EnumOpCantHappen);
return _key;
}
@@ -877,11 +879,11 @@ namespace System.Collections
public virtual bool MoveNext()
{
- if (_version != _sortedList._version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
+ if (_version != _sortedList.version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
if (_index < _endIndex)
{
- _key = _sortedList._keys[_index];
- _value = _sortedList._values[_index];
+ _key = _sortedList.keys[_index];
+ _value = _sortedList.values[_index];
_index++;
_current = true;
return true;
@@ -896,7 +898,7 @@ namespace System.Collections
{
get
{
- if (_version != _sortedList._version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
+ if (_version != _sortedList.version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
if (_current == false) throw new InvalidOperationException(SR.InvalidOperation_EnumOpCantHappen);
return new DictionaryEntry(_key, _value);
}
@@ -921,7 +923,7 @@ namespace System.Collections
{
get
{
- if (_version != _sortedList._version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
+ if (_version != _sortedList.version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
if (_current == false) throw new InvalidOperationException(SR.InvalidOperation_EnumOpCantHappen);
return _value;
}
@@ -929,7 +931,7 @@ namespace System.Collections
public virtual void Reset()
{
- if (_version != _sortedList._version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
+ if (_version != _sortedList.version) throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);
_index = _startIndex;
_current = false;
_key = null;
@@ -938,18 +940,19 @@ namespace System.Collections
}
[Serializable]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
private class KeyList : IList
{
- private SortedList _sortedList;
+ private SortedList sortedList; // Do not rename (binary serialization)
internal KeyList(SortedList sortedList)
{
- _sortedList = sortedList;
+ this.sortedList = sortedList;
}
public virtual int Count
{
- get { return _sortedList._size; }
+ get { return sortedList._size; }
}
public virtual bool IsReadOnly
@@ -964,12 +967,12 @@ namespace System.Collections
public virtual bool IsSynchronized
{
- get { return _sortedList.IsSynchronized; }
+ get { return sortedList.IsSynchronized; }
}
public virtual Object SyncRoot
{
- get { return _sortedList.SyncRoot; }
+ get { return sortedList.SyncRoot; }
}
public virtual int Add(Object key)
@@ -985,7 +988,7 @@ namespace System.Collections
public virtual bool Contains(Object key)
{
- return _sortedList.Contains(key);
+ return sortedList.Contains(key);
}
public virtual void CopyTo(Array array, int arrayIndex)
@@ -995,7 +998,7 @@ namespace System.Collections
Contract.EndContractBlock();
// defer error checking to Array.Copy
- Array.Copy(_sortedList._keys, 0, array, arrayIndex, _sortedList.Count);
+ Array.Copy(sortedList.keys, 0, array, arrayIndex, sortedList.Count);
}
public virtual void Insert(int index, Object value)
@@ -1007,7 +1010,7 @@ namespace System.Collections
{
get
{
- return _sortedList.GetKey(index);
+ return sortedList.GetKey(index);
}
set
{
@@ -1017,7 +1020,7 @@ namespace System.Collections
public virtual IEnumerator GetEnumerator()
{
- return new SortedListEnumerator(_sortedList, 0, _sortedList.Count, SortedListEnumerator.Keys);
+ return new SortedListEnumerator(sortedList, 0, sortedList.Count, SortedListEnumerator.Keys);
}
public virtual int IndexOf(Object key)
@@ -1026,8 +1029,8 @@ namespace System.Collections
throw new ArgumentNullException(nameof(key), SR.ArgumentNull_Key);
Contract.EndContractBlock();
- int i = Array.BinarySearch(_sortedList._keys, 0,
- _sortedList.Count, key, _sortedList._comparer);
+ int i = Array.BinarySearch(sortedList.keys, 0,
+ sortedList.Count, key, sortedList.comparer);
if (i >= 0) return i;
return -1;
}
@@ -1044,18 +1047,19 @@ namespace System.Collections
}
[Serializable]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
private class ValueList : IList
{
- private SortedList _sortedList;
+ private SortedList sortedList; // Do not rename (binary serialization)
internal ValueList(SortedList sortedList)
{
- _sortedList = sortedList;
+ this.sortedList = sortedList;
}
public virtual int Count
{
- get { return _sortedList._size; }
+ get { return sortedList._size; }
}
public virtual bool IsReadOnly
@@ -1070,12 +1074,12 @@ namespace System.Collections
public virtual bool IsSynchronized
{
- get { return _sortedList.IsSynchronized; }
+ get { return sortedList.IsSynchronized; }
}
public virtual Object SyncRoot
{
- get { return _sortedList.SyncRoot; }
+ get { return sortedList.SyncRoot; }
}
public virtual int Add(Object key)
@@ -1090,7 +1094,7 @@ namespace System.Collections
public virtual bool Contains(Object value)
{
- return _sortedList.ContainsValue(value);
+ return sortedList.ContainsValue(value);
}
public virtual void CopyTo(Array array, int arrayIndex)
@@ -1100,7 +1104,7 @@ namespace System.Collections
Contract.EndContractBlock();
// defer error checking to Array.Copy
- Array.Copy(_sortedList._values, 0, array, arrayIndex, _sortedList.Count);
+ Array.Copy(sortedList.values, 0, array, arrayIndex, sortedList.Count);
}
public virtual void Insert(int index, Object value)
@@ -1112,7 +1116,7 @@ namespace System.Collections
{
get
{
- return _sortedList.GetByIndex(index);
+ return sortedList.GetByIndex(index);
}
set
{
@@ -1122,12 +1126,12 @@ namespace System.Collections
public virtual IEnumerator GetEnumerator()
{
- return new SortedListEnumerator(_sortedList, 0, _sortedList.Count, SortedListEnumerator.Values);
+ return new SortedListEnumerator(sortedList, 0, sortedList.Count, SortedListEnumerator.Values);
}
public virtual int IndexOf(Object value)
{
- return Array.IndexOf(_sortedList._values, value, 0, _sortedList.Count);
+ return Array.IndexOf(sortedList.values, value, 0, sortedList.Count);
}
public virtual void Remove(Object value)
diff --git a/src/System.Collections.NonGeneric/src/System/Collections/Stack.cs b/src/System.Collections.NonGeneric/src/System/Collections/Stack.cs
index f6b6aabeb9..5d40e432da 100644
--- a/src/System.Collections.NonGeneric/src/System/Collections/Stack.cs
+++ b/src/System.Collections.NonGeneric/src/System/Collections/Stack.cs
@@ -28,10 +28,10 @@ namespace System.Collections
#endif
public class Stack : ICollection, ICloneable
{
- private Object[] _array; // Storage for stack elements
+ private Object[] _array; // Storage for stack elements. Do not rename (binary serialization)
[ContractPublicPropertyName("Count")]
- private int _size; // Number of items in the stack.
- private int _version; // Used to keep enumerator in sync w/ collection.
+ private int _size; // Number of items in the stack. Do not rename (binary serialization)
+ private int _version; // Used to keep enumerator in sync w/ collection. Do not rename (binary serialization)
[NonSerialized]
private Object _syncRoot;
diff --git a/src/System.Collections.Specialized/src/System/Collections/Specialized/HybridDictionary.cs b/src/System.Collections.Specialized/src/System/Collections/Specialized/HybridDictionary.cs
index 68bf5e9ac3..e28a5abc03 100644
--- a/src/System.Collections.Specialized/src/System/Collections/Specialized/HybridDictionary.cs
+++ b/src/System.Collections.Specialized/src/System/Collections/Specialized/HybridDictionary.cs
@@ -27,9 +27,9 @@ namespace System.Collections.Specialized
private const int FixedSizeCutoverPoint = 6;
// Instance variables. This keeps the HybridDictionary very light-weight when empty
- private ListDictionary _list;
- private Hashtable _hashtable;
- private readonly bool _caseInsensitive;
+ private ListDictionary list; // Do not rename (binary serialization)
+ private Hashtable hashtable; // Do not rename (binary serialization)
+ private readonly bool caseInsensitive; // Do not rename (binary serialization)
public HybridDictionary()
{
@@ -41,21 +41,21 @@ namespace System.Collections.Specialized
public HybridDictionary(bool caseInsensitive)
{
- _caseInsensitive = caseInsensitive;
+ this.caseInsensitive = caseInsensitive;
}
public HybridDictionary(int initialSize, bool caseInsensitive)
{
- _caseInsensitive = caseInsensitive;
+ this.caseInsensitive = caseInsensitive;
if (initialSize >= FixedSizeCutoverPoint)
{
if (caseInsensitive)
{
- _hashtable = new Hashtable(initialSize, StringComparer.OrdinalIgnoreCase);
+ hashtable = new Hashtable(initialSize, StringComparer.OrdinalIgnoreCase);
}
else
{
- _hashtable = new Hashtable(initialSize);
+ hashtable = new Hashtable(initialSize);
}
}
}
@@ -68,10 +68,10 @@ namespace System.Collections.Specialized
// Although we never made the same guarantee for HybridDictionary,
// it is still nice to do the same thing here since we have recommended
// HybridDictionary as replacement for Hashtable.
- ListDictionary cachedList = _list;
- if (_hashtable != null)
+ ListDictionary cachedList = list;
+ if (hashtable != null)
{
- return _hashtable[key];
+ return hashtable[key];
}
else if (cachedList != null)
{
@@ -90,26 +90,26 @@ namespace System.Collections.Specialized
}
set
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- _hashtable[key] = value;
+ hashtable[key] = value;
}
- else if (_list != null)
+ else if (list != null)
{
- if (_list.Count >= CutoverPoint - 1)
+ if (list.Count >= CutoverPoint - 1)
{
ChangeOver();
- _hashtable[key] = value;
+ hashtable[key] = value;
}
else
{
- _list[key] = value;
+ list[key] = value;
}
}
else
{
- _list = new ListDictionary(_caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
- _list[key] = value;
+ list = new ListDictionary(caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
+ list[key] = value;
}
}
}
@@ -118,19 +118,19 @@ namespace System.Collections.Specialized
{
get
{
- if (_list == null)
+ if (list == null)
{
- _list = new ListDictionary(_caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
+ list = new ListDictionary(caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
}
- return _list;
+ return list;
}
}
private void ChangeOver()
{
- IDictionaryEnumerator en = _list.GetEnumerator();
+ IDictionaryEnumerator en = list.GetEnumerator();
Hashtable newTable;
- if (_caseInsensitive)
+ if (caseInsensitive)
{
newTable = new Hashtable(InitialHashtableSize, StringComparer.OrdinalIgnoreCase);
}
@@ -146,18 +146,18 @@ namespace System.Collections.Specialized
// Keep the order of writing to hashtable and list.
// We assume we will see the change in hashtable if list is set to null in
// this method in another reader thread.
- _hashtable = newTable;
- _list = null;
+ hashtable = newTable;
+ list = null;
}
public int Count
{
get
{
- ListDictionary cachedList = _list;
- if (_hashtable != null)
+ ListDictionary cachedList = list;
+ if (hashtable != null)
{
- return _hashtable.Count;
+ return hashtable.Count;
}
else if (cachedList != null)
{
@@ -174,9 +174,9 @@ namespace System.Collections.Specialized
{
get
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- return _hashtable.Keys;
+ return hashtable.Keys;
}
else
{
@@ -221,9 +221,9 @@ namespace System.Collections.Specialized
{
get
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- return _hashtable.Values;
+ return hashtable.Values;
}
else
{
@@ -234,52 +234,52 @@ namespace System.Collections.Specialized
public void Add(object key, object value)
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- _hashtable.Add(key, value);
+ hashtable.Add(key, value);
}
else
{
- if (_list == null)
+ if (list == null)
{
- _list = new ListDictionary(_caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
- _list.Add(key, value);
+ list = new ListDictionary(caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
+ list.Add(key, value);
}
- else if (_list.Count + 1 >= CutoverPoint)
+ else if (list.Count + 1 >= CutoverPoint)
{
ChangeOver();
- _hashtable.Add(key, value);
+ hashtable.Add(key, value);
}
else
{
- _list.Add(key, value);
+ list.Add(key, value);
}
}
}
public void Clear()
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- Hashtable cachedHashtable = _hashtable;
- _hashtable = null;
+ Hashtable cachedHashtable = hashtable;
+ hashtable = null;
cachedHashtable.Clear();
}
- if (_list != null)
+ if (list != null)
{
- ListDictionary cachedList = _list;
- _list = null;
+ ListDictionary cachedList = list;
+ list = null;
cachedList.Clear();
}
}
public bool Contains(object key)
{
- ListDictionary cachedList = _list;
- if (_hashtable != null)
+ ListDictionary cachedList = list;
+ if (hashtable != null)
{
- return _hashtable.Contains(key);
+ return hashtable.Contains(key);
}
else if (cachedList != null)
{
@@ -294,9 +294,9 @@ namespace System.Collections.Specialized
public void CopyTo(Array array, int index)
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- _hashtable.CopyTo(array, index);
+ hashtable.CopyTo(array, index);
}
else
{
@@ -306,39 +306,39 @@ namespace System.Collections.Specialized
public IDictionaryEnumerator GetEnumerator()
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- return _hashtable.GetEnumerator();
+ return hashtable.GetEnumerator();
}
- if (_list == null)
+ if (list == null)
{
- _list = new ListDictionary(_caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
+ list = new ListDictionary(caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
}
- return _list.GetEnumerator();
+ return list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- return _hashtable.GetEnumerator();
+ return hashtable.GetEnumerator();
}
- if (_list == null)
+ if (list == null)
{
- _list = new ListDictionary(_caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
+ list = new ListDictionary(caseInsensitive ? StringComparer.OrdinalIgnoreCase : null);
}
- return _list.GetEnumerator();
+ return list.GetEnumerator();
}
public void Remove(object key)
{
- if (_hashtable != null)
+ if (hashtable != null)
{
- _hashtable.Remove(key);
+ hashtable.Remove(key);
}
- else if (_list != null)
+ else if (list != null)
{
- _list.Remove(key);
+ list.Remove(key);
}
else if (key == null)
{
diff --git a/src/System.Collections.Specialized/src/System/Collections/Specialized/ListDictionary.cs b/src/System.Collections.Specialized/src/System/Collections/Specialized/ListDictionary.cs
index eea6693391..55b40e4e86 100644
--- a/src/System.Collections.Specialized/src/System/Collections/Specialized/ListDictionary.cs
+++ b/src/System.Collections.Specialized/src/System/Collections/Specialized/ListDictionary.cs
@@ -373,8 +373,7 @@ namespace System.Collections.Specialized
_current = null;
}
}
-
-
+
private class NodeKeyValueCollection : ICollection
{
private ListDictionary _list;
@@ -495,11 +494,14 @@ namespace System.Collections.Specialized
}
[Serializable]
- private class DictionaryNode
+#if !MONO
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
+#endif
+ public class DictionaryNode
{
- public object key;
- public object value;
- public DictionaryNode next;
+ public object key; // Do not rename (binary serialization)
+ public object value; // Do not rename (binary serialization)
+ public DictionaryNode next; // Do not rename (binary serialization)
}
}
}
diff --git a/src/System.Collections.Specialized/src/System/Collections/Specialized/NameObjectCollectionBase.cs b/src/System.Collections.Specialized/src/System/Collections/Specialized/NameObjectCollectionBase.cs
index b99a0b0b30..ba1dd69864 100644
--- a/src/System.Collections.Specialized/src/System/Collections/Specialized/NameObjectCollectionBase.cs
+++ b/src/System.Collections.Specialized/src/System/Collections/Specialized/NameObjectCollectionBase.cs
@@ -22,21 +22,8 @@ namespace System.Collections.Specialized
/// the key or with the index.</para>
/// </devdoc>
[Serializable]
-#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
-#endif
public abstract class NameObjectCollectionBase : ICollection, ISerializable, IDeserializationCallback
{
- // const names used for serialization
- private const String ReadOnlyName = "ReadOnly";
- private const String CountName = "Count";
- private const String ComparerName = "Comparer";
- private const String HashCodeProviderName = "HashProvider";
- private const String KeysName = "Keys";
- private const String ValuesName = "Values";
- private const String KeyComparerName = "KeyComparer";
- private const String VersionName = "Version";
-
private bool _readOnly = false;
private ArrayList _entriesArray;
private IEqualityComparer _keyComparer;
@@ -44,8 +31,6 @@ namespace System.Collections.Specialized
private volatile NameObjectEntry _nullKeyEntry;
private KeysCollection _keys;
private int _version;
- private SerializationInfo _serializationInfo;
- [NonSerialized]
private Object _syncRoot;
private static readonly StringComparer s_defaultComparer = CultureInfo.InvariantCulture.CompareInfo.GetStringComparer(CompareOptions.IgnoreCase);
@@ -94,146 +79,17 @@ namespace System.Collections.Specialized
protected NameObjectCollectionBase(SerializationInfo info, StreamingContext context)
{
- _serializationInfo = info;
+ throw new PlatformNotSupportedException();
}
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
- if (info == null)
- {
- throw new ArgumentNullException(nameof(info));
- }
-
- info.AddValue(ReadOnlyName, _readOnly);
-
- // Maintain backward serialization compatibility if new APIs are not used.
- if (_keyComparer == s_defaultComparer)
- {
- info.AddValue(HashCodeProviderName, CaseInsensitiveHashCodeProvider.DefaultInvariant, typeof(IHashCodeProvider));
- info.AddValue(ComparerName, CaseInsensitiveComparer.DefaultInvariant, typeof(IComparer));
- }
- else if (_keyComparer == null)
- {
- info.AddValue(HashCodeProviderName, null, typeof(IHashCodeProvider));
- info.AddValue(ComparerName, null, typeof(IComparer));
- }
- else if (_keyComparer is CompatibleComparer)
- {
- CompatibleComparer c = (CompatibleComparer)_keyComparer;
- info.AddValue(HashCodeProviderName, c.HashCodeProvider, typeof(IHashCodeProvider));
- info.AddValue(ComparerName, c.Comparer, typeof(IComparer));
- }
- else
- {
- info.AddValue(KeyComparerName, _keyComparer, typeof(IEqualityComparer));
- }
-
- int count = _entriesArray.Count;
- info.AddValue(CountName, count);
-
- string[] keys = new string[count];
- object[] values = new object[count];
-
- for (int i = 0; i < count; i++)
- {
- NameObjectEntry entry = (NameObjectEntry)_entriesArray[i];
- keys[i] = entry.Key;
- values[i] = entry.Value;
- }
-
- info.AddValue(KeysName, keys, typeof(String[]));
- info.AddValue(ValuesName, values, typeof(Object[]));
- info.AddValue(VersionName, _version);
+ throw new PlatformNotSupportedException();
}
public virtual void OnDeserialization(object sender)
{
- if (_keyComparer != null)
- {
- //Somebody had a dependency on this and fixed us up before the ObjectManager got to it.
- return;
- }
-
- if (_serializationInfo == null)
- {
- throw new SerializationException();
- }
-
- SerializationInfo info = _serializationInfo;
- _serializationInfo = null;
-
- bool readOnly = false;
- int count = 0;
- string[] keys = null;
- object[] values = null;
- IHashCodeProvider hashProvider = null;
- IComparer comparer = null;
- bool hasVersion = false;
- int serializedVersion = 0;
-
- SerializationInfoEnumerator enumerator = info.GetEnumerator();
- while (enumerator.MoveNext())
- {
- switch (enumerator.Name)
- {
- case ReadOnlyName:
- readOnly = info.GetBoolean(ReadOnlyName); ;
- break;
- case HashCodeProviderName:
- hashProvider = (IHashCodeProvider)info.GetValue(HashCodeProviderName, typeof(IHashCodeProvider)); ;
- break;
- case ComparerName:
- comparer = (IComparer)info.GetValue(ComparerName, typeof(IComparer));
- break;
- case KeyComparerName:
- _keyComparer = (IEqualityComparer)info.GetValue(KeyComparerName, typeof(IEqualityComparer));
- break;
- case CountName:
- count = info.GetInt32(CountName);
- break;
- case KeysName:
- keys = (String[])info.GetValue(KeysName, typeof(String[]));
- break;
- case ValuesName:
- values = (Object[])info.GetValue(ValuesName, typeof(Object[]));
- break;
- case VersionName:
- hasVersion = true;
- serializedVersion = info.GetInt32(VersionName);
- break;
- }
- }
-
- if (_keyComparer == null)
- {
- if (comparer == null || hashProvider == null)
- {
- throw new SerializationException();
- }
- else
- {
- // create a new key comparer for V1 Object
- _keyComparer = new CompatibleComparer(hashProvider, comparer);
- }
- }
-
- if (keys == null || values == null)
- {
- throw new SerializationException();
- }
-
- Reset(count);
-
- for (int i = 0; i < count; i++)
- {
- BaseAdd(keys[i], values[i]);
- }
-
- _readOnly = readOnly; // after collection populated
- if (hasVersion)
- {
- _version = serializedVersion;
- }
+ throw new PlatformNotSupportedException();
}
//
diff --git a/src/System.Collections.Specialized/src/System/Collections/Specialized/NameValueCollection.cs b/src/System.Collections.Specialized/src/System/Collections/Specialized/NameValueCollection.cs
index 13578e1536..b3c0b9e0c2 100644
--- a/src/System.Collections.Specialized/src/System/Collections/Specialized/NameValueCollection.cs
+++ b/src/System.Collections.Specialized/src/System/Collections/Specialized/NameValueCollection.cs
@@ -18,13 +18,10 @@ namespace System.Collections.Specialized
/// can be accessed either with the hash code of the key or with the index.</para>
/// </devdoc>
[Serializable]
-#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
-#endif
public class NameValueCollection : NameObjectCollectionBase
{
- private String[] _all;
- private String[] _allKeys;
+ private String[] _all; // Do not rename (binary serialization)
+ private String[] _allKeys; // Do not rename (binary serialization)
//
// Constructors
diff --git a/src/System.Collections.Specialized/src/System/Collections/Specialized/OrderedDictionary.cs b/src/System.Collections.Specialized/src/System/Collections/Specialized/OrderedDictionary.cs
index 8d31edd2bb..97738af52d 100644
--- a/src/System.Collections.Specialized/src/System/Collections/Specialized/OrderedDictionary.cs
+++ b/src/System.Collections.Specialized/src/System/Collections/Specialized/OrderedDictionary.cs
@@ -34,10 +34,10 @@ namespace System.Collections.Specialized
private Object _syncRoot;
private SerializationInfo _siInfo; //A temporary variable which we need during deserialization.
- private const string KeyComparerName = "KeyComparer";
- private const string ArrayListName = "ArrayList";
- private const string ReadOnlyName = "ReadOnly";
- private const string InitCapacityName = "InitialCapacity";
+ private const string KeyComparerName = "KeyComparer"; // Do not rename (binary serialization)
+ private const string ArrayListName = "ArrayList"; // Do not rename (binary serialization)
+ private const string ReadOnlyName = "ReadOnly"; // Do not rename (binary serialization)
+ private const string InitCapacityName = "InitialCapacity"; // Do not rename (binary serialization)
public OrderedDictionary() : this(0)
{
diff --git a/src/System.Collections.Specialized/src/System/Collections/Specialized/StringDictionary.cs b/src/System.Collections.Specialized/src/System/Collections/Specialized/StringDictionary.cs
index e4d41790de..986fc6666e 100644
--- a/src/System.Collections.Specialized/src/System/Collections/Specialized/StringDictionary.cs
+++ b/src/System.Collections.Specialized/src/System/Collections/Specialized/StringDictionary.cs
@@ -21,7 +21,7 @@ namespace System.Collections.Specialized
// That means using ToLower in each property on this type. Also for backwards
// compatibility, we will be converting strings to lower-case, which has a
// problem for some Georgian alphabets.
- private readonly Hashtable _contents = new Hashtable();
+ private readonly Hashtable contents = new Hashtable(); // Do not rename (binary serialization)
/// <devdoc>
@@ -41,7 +41,7 @@ namespace System.Collections.Specialized
{
get
{
- return _contents.Count;
+ return contents.Count;
}
}
@@ -54,7 +54,7 @@ namespace System.Collections.Specialized
{
get
{
- return _contents.IsSynchronized;
+ return contents.IsSynchronized;
}
}
@@ -70,7 +70,7 @@ namespace System.Collections.Specialized
throw new ArgumentNullException(nameof(key));
}
- return (string)_contents[key.ToLowerInvariant()];
+ return (string)contents[key.ToLowerInvariant()];
}
set
{
@@ -79,7 +79,7 @@ namespace System.Collections.Specialized
throw new ArgumentNullException(nameof(key));
}
- _contents[key.ToLowerInvariant()] = value;
+ contents[key.ToLowerInvariant()] = value;
}
}
@@ -90,7 +90,7 @@ namespace System.Collections.Specialized
{
get
{
- return _contents.Keys;
+ return contents.Keys;
}
}
@@ -102,7 +102,7 @@ namespace System.Collections.Specialized
{
get
{
- return _contents.SyncRoot;
+ return contents.SyncRoot;
}
}
@@ -113,7 +113,7 @@ namespace System.Collections.Specialized
{
get
{
- return _contents.Values;
+ return contents.Values;
}
}
@@ -127,7 +127,7 @@ namespace System.Collections.Specialized
throw new ArgumentNullException(nameof(key));
}
- _contents.Add(key.ToLowerInvariant(), value);
+ contents.Add(key.ToLowerInvariant(), value);
}
/// <devdoc>
@@ -135,7 +135,7 @@ namespace System.Collections.Specialized
/// </devdoc>
public virtual void Clear()
{
- _contents.Clear();
+ contents.Clear();
}
/// <devdoc>
@@ -148,7 +148,7 @@ namespace System.Collections.Specialized
throw new ArgumentNullException(nameof(key));
}
- return _contents.ContainsKey(key.ToLowerInvariant());
+ return contents.ContainsKey(key.ToLowerInvariant());
}
/// <devdoc>
@@ -156,7 +156,7 @@ namespace System.Collections.Specialized
/// </devdoc>
public virtual bool ContainsValue(string value)
{
- return _contents.ContainsValue(value);
+ return contents.ContainsValue(value);
}
/// <devdoc>
@@ -165,7 +165,7 @@ namespace System.Collections.Specialized
/// </devdoc>
public virtual void CopyTo(Array array, int index)
{
- _contents.CopyTo(array, index);
+ contents.CopyTo(array, index);
}
/// <devdoc>
@@ -173,7 +173,7 @@ namespace System.Collections.Specialized
/// </devdoc>
public virtual IEnumerator GetEnumerator()
{
- return _contents.GetEnumerator();
+ return contents.GetEnumerator();
}
/// <devdoc>
@@ -186,7 +186,7 @@ namespace System.Collections.Specialized
throw new ArgumentNullException(nameof(key));
}
- _contents.Remove(key.ToLowerInvariant());
+ contents.Remove(key.ToLowerInvariant());
}
}
}
diff --git a/src/System.Collections/src/System/Collections/BitArray.cs b/src/System.Collections/src/System/Collections/BitArray.cs
index 0359ca32ee..b050d00c40 100644
--- a/src/System.Collections/src/System/Collections/BitArray.cs
+++ b/src/System.Collections/src/System/Collections/BitArray.cs
@@ -15,6 +15,14 @@ namespace System.Collections
#endif
public sealed class BitArray : ICollection, ICloneable
{
+ private int[] m_array; // Do not rename (binary serialization)
+ private int m_length; // Do not rename (binary serialization)
+ private int _version; // Do not rename (binary serialization)
+ [NonSerialized]
+ private object _syncRoot;
+
+ private const int _ShrinkThreshold = 256;
+
/*=========================================================================
** Allocates space to hold length bit values. All of the values in the bit
** array are set to false.
@@ -701,13 +709,5 @@ namespace System.Collections
index = -1;
}
}
-
- private int[] m_array;
- private int m_length;
- private int _version;
- [NonSerialized]
- private object _syncRoot;
-
- private const int _ShrinkThreshold = 256;
}
}
diff --git a/src/System.Collections/src/System/Collections/Generic/HashSet.cs b/src/System.Collections/src/System/Collections/Generic/HashSet.cs
index e06f55cceb..562ed2c4cd 100644
--- a/src/System.Collections/src/System/Collections/Generic/HashSet.cs
+++ b/src/System.Collections/src/System/Collections/Generic/HashSet.cs
@@ -51,7 +51,7 @@ namespace System.Collections.Generic
[SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification = "By design")]
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Core, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public class HashSet<T> : ICollection<T>, ISet<T>, IReadOnlyCollection<T>, ISerializable, IDeserializationCallback
{
@@ -67,10 +67,10 @@ namespace System.Collections.Generic
private const int ShrinkThreshold = 3;
// constants for serialization
- private const string CapacityName = "Capacity";
- private const string ElementsName = "Elements";
- private const string ComparerName = "Comparer";
- private const string VersionName = "Version";
+ private const string CapacityName = "Capacity"; // Do not rename (binary serialization)
+ private const string ElementsName = "Elements"; // Do not rename (binary serialization)
+ private const string ComparerName = "Comparer"; // Do not rename (binary serialization)
+ private const string VersionName = "Version"; // Do not rename (binary serialization)
private int[] _buckets;
private Slot[] _slots;
diff --git a/src/System.Collections/src/System/Collections/Generic/LinkedList.cs b/src/System.Collections/src/System/Collections/Generic/LinkedList.cs
index 2ef7147d90..fa35610fe3 100644
--- a/src/System.Collections/src/System/Collections/Generic/LinkedList.cs
+++ b/src/System.Collections/src/System/Collections/Generic/LinkedList.cs
@@ -12,8 +12,8 @@ namespace System.Collections.Generic
[DebuggerDisplay("Count = {Count}")]
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089 ")]
-#endif
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
+#endif
public class LinkedList<T> : ICollection<T>, ICollection, IReadOnlyCollection<T>, ISerializable, IDeserializationCallback
{
// This LinkedList is a doubly-Linked circular list.
@@ -24,9 +24,9 @@ namespace System.Collections.Generic
private SerializationInfo _siInfo; //A temporary variable which we need during deserialization.
// names for serialization
- private const string VersionName = "Version";
- private const string CountName = "Count";
- private const string ValuesName = "Data";
+ private const string VersionName = "Version"; // Do not rename (binary serialization)
+ private const string CountName = "Count"; // Do not rename (binary serialization)
+ private const string ValuesName = "Data"; // Do not rename (binary serialization)
public LinkedList()
{
diff --git a/src/System.Collections/src/System/Collections/Generic/Queue.cs b/src/System.Collections/src/System/Collections/Generic/Queue.cs
index 8f0773be71..547df798df 100644
--- a/src/System.Collections/src/System/Collections/Generic/Queue.cs
+++ b/src/System.Collections/src/System/Collections/Generic/Queue.cs
@@ -22,7 +22,7 @@ namespace System.Collections.Generic
[DebuggerDisplay("Count = {Count}")]
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public class Queue<T> : IEnumerable<T>,
System.Collections.ICollection,
diff --git a/src/System.Collections/src/System/Collections/Generic/SortedDictionary.cs b/src/System.Collections/src/System/Collections/Generic/SortedDictionary.cs
index 225a34c797..0154cd6a1f 100644
--- a/src/System.Collections/src/System/Collections/Generic/SortedDictionary.cs
+++ b/src/System.Collections/src/System/Collections/Generic/SortedDictionary.cs
@@ -21,7 +21,7 @@ namespace System.Collections.Generic
[NonSerialized]
private ValueCollection _values;
- private TreeSet<KeyValuePair<TKey, TValue>> _set;
+ private TreeSet<KeyValuePair<TKey, TValue>> _set; // Do not rename (binary serialization)
public SortedDictionary() : this((IComparer<TKey>)null)
{
@@ -928,7 +928,7 @@ namespace System.Collections.Generic
[Serializable]
internal sealed class KeyValuePairComparer : Comparer<KeyValuePair<TKey, TValue>>
{
- internal IComparer<TKey> keyComparer;
+ internal IComparer<TKey> keyComparer; // Do not rename (binary serialization)
public KeyValuePairComparer(IComparer<TKey> keyComparer)
{
@@ -960,7 +960,10 @@ namespace System.Collections.Generic
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
- internal sealed class TreeSet<T> : SortedSet<T>
+#if !MONO
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
+#endif
+ public sealed class TreeSet<T> : SortedSet<T>
{
public TreeSet()
: base()
diff --git a/src/System.Collections/src/System/Collections/Generic/SortedList.cs b/src/System.Collections/src/System/Collections/Generic/SortedList.cs
index c38aef1a47..64d3065321 100644
--- a/src/System.Collections/src/System/Collections/Generic/SortedList.cs
+++ b/src/System.Collections/src/System/Collections/Generic/SortedList.cs
@@ -1048,7 +1048,7 @@ namespace System.Collections.Generic
[Serializable]
private sealed class KeyList : IList<TKey>, ICollection
{
- private SortedList<TKey, TValue> _dict;
+ private SortedList<TKey, TValue> _dict; // Do not rename (binary serialization)
internal KeyList(SortedList<TKey, TValue> dictionary)
{
@@ -1167,7 +1167,7 @@ namespace System.Collections.Generic
[Serializable]
private sealed class ValueList : IList<TValue>, ICollection
{
- private SortedList<TKey, TValue> _dict;
+ private SortedList<TKey, TValue> _dict; // Do not rename (binary serialization)
internal ValueList(SortedList<TKey, TValue> dictionary)
{
diff --git a/src/System.Collections/src/System/Collections/Generic/SortedSet.cs b/src/System.Collections/src/System/Collections/Generic/SortedSet.cs
index b247ef97e1..331dd64944 100644
--- a/src/System.Collections/src/System/Collections/Generic/SortedSet.cs
+++ b/src/System.Collections/src/System/Collections/Generic/SortedSet.cs
@@ -44,18 +44,18 @@ namespace System.Collections.Generic
{
#region Local variables/constants
- private Node root; // Do not rename (binary serialization)
- private IComparer<T> comparer; // Do not rename (binary serialization)
- private int count; // Do not rename (binary serialization)
- private int version; // Do not rename (binary serialization)
+ private Node root;
+ private IComparer<T> comparer;
+ private int count;
+ private int version;
[NonSerialized]
- private object _syncRoot; // Do not rename (binary serialization)
- private SerializationInfo siInfo; // A temporary variable which we need during deserialization. Do not rename (binary serialization)
+ private object _syncRoot;
+ private SerializationInfo siInfo; // A temporary variable which we need during deserialization.
- private const string ComparerName = "Comparer";
- private const string CountName = "Count";
- private const string ItemsName = "Items";
- private const string VersionName = "Version";
+ private const string ComparerName = "Comparer"; // Do not rename (binary serialization)
+ private const string CountName = "Count"; // Do not rename (binary serialization)
+ private const string ItemsName = "Items"; // Do not rename (binary serialization)
+ private const string VersionName = "Version"; // Do not rename (binary serialization)
// Needed for enumerator
private const string TreeName = "Tree";
private const string NodeValueName = "Item";
diff --git a/src/System.Collections/src/System/Collections/Generic/Stack.cs b/src/System.Collections/src/System/Collections/Generic/Stack.cs
index 8fb6dfb481..38c5bbb07b 100644
--- a/src/System.Collections/src/System/Collections/Generic/Stack.cs
+++ b/src/System.Collections/src/System/Collections/Generic/Stack.cs
@@ -29,9 +29,9 @@ namespace System.Collections.Generic
System.Collections.ICollection,
IReadOnlyCollection<T>
{
- private T[] _array; // Storage for stack elements
- private int _size; // Number of items in the stack.
- private int _version; // Used to keep enumerator in sync w/ collection.
+ private T[] _array; // Storage for stack elements. Do not rename (binary serialization)
+ private int _size; // Number of items in the stack. Do not rename (binary serialization)
+ private int _version; // Used to keep enumerator in sync w/ collection. Do not rename (binary serialization)
[NonSerialized]
private object _syncRoot;
diff --git a/src/System.Collections/tests/Generic/Comparers/EqualityComparer.Generic.Serialization.Tests.cs b/src/System.Collections/tests/Generic/Comparers/EqualityComparer.Generic.Serialization.Tests.cs
index 6932a4a755..2ca0e6a063 100644
--- a/src/System.Collections/tests/Generic/Comparers/EqualityComparer.Generic.Serialization.Tests.cs
+++ b/src/System.Collections/tests/Generic/Comparers/EqualityComparer.Generic.Serialization.Tests.cs
@@ -13,7 +13,7 @@ namespace System.Collections.Generic.Tests
public abstract partial class ComparersGenericTests<T>
{
[Fact]
- [ActiveIssue(20888, TargetFrameworkMonikers.UapAot)]
+ [ActiveIssue(20888, TargetFrameworkMonikers.Uap)]
public void EqualityComparer_SerializationRoundtrip()
{
var bf = new BinaryFormatter();
diff --git a/src/System.ComponentModel.Annotations/System.ComponentModel.Annotations.sln b/src/System.ComponentModel.Annotations/System.ComponentModel.Annotations.sln
index c846e40455..432ddc937f 100644
--- a/src/System.ComponentModel.Annotations/System.ComponentModel.Annotations.sln
+++ b/src/System.ComponentModel.Annotations/System.ComponentModel.Annotations.sln
@@ -26,10 +26,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
- {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
- {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
- {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Release|Any CPU.Build.0 = netstandard-Release|Any CPU
+ {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
+ {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
+ {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
+ {6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
{4266D58F-EB60-46C2-BA81-3ABDE759A7D5}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
{4266D58F-EB60-46C2-BA81-3ABDE759A7D5}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
{4266D58F-EB60-46C2-BA81-3ABDE759A7D5}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
diff --git a/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/CompareAttribute.cs b/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/CompareAttribute.cs
index f351205a15..250dbec6ce 100644
--- a/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/CompareAttribute.cs
+++ b/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/CompareAttribute.cs
@@ -56,27 +56,15 @@ namespace System.ComponentModel.DataAnnotations
{
if (OtherPropertyDisplayName == null)
{
- OtherPropertyDisplayName = GetDisplayNameForProperty(validationContext.ObjectType, OtherProperty);
+ OtherPropertyDisplayName = GetDisplayNameForProperty(validationContext.ObjectType, otherPropertyInfo);
}
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
- private static string GetDisplayNameForProperty(Type containerType, string propertyName)
+ private string GetDisplayNameForProperty(Type containerType, PropertyInfo property)
{
- var property = containerType.GetRuntimeProperties()
- .SingleOrDefault(
- prop =>
- IsPublic(prop) &&
- string.Equals(propertyName, prop.Name, StringComparison.OrdinalIgnoreCase));
-
- if (property == null)
- {
- throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
- SR.Common_PropertyNotFound, containerType.FullName, propertyName));
- }
-
var attributes = CustomAttributeExtensions.GetCustomAttributes(property, true);
var display = attributes.OfType<DisplayAttribute>().FirstOrDefault();
if (display != null)
@@ -84,7 +72,7 @@ namespace System.ComponentModel.DataAnnotations
return display.GetName();
}
- return propertyName;
+ return OtherProperty;
}
private static bool IsPublic(PropertyInfo p)
diff --git a/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/DisplayFormatAttribute.cs b/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/DisplayFormatAttribute.cs
index 11f5b4db3f..13f2be0192 100644
--- a/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/DisplayFormatAttribute.cs
+++ b/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/DisplayFormatAttribute.cs
@@ -68,11 +68,11 @@ namespace System.ComponentModel.DataAnnotations
/// </summary>
public bool HtmlEncode { get; set; }
- /// <summary>
- /// Gets or sets the <see cref="Type" /> that contains the resources for <see cref="NullDisplayText" />.
- /// Using <see cref="NullDisplayTextResourceType" /> along with <see cref="NullDisplayText" />, allows the <see cref="GetNullDisplayText" />
- /// method to return localized values.
- /// </summary>
+ /// <summary>
+ /// Gets or sets the <see cref="Type" /> that contains the resources for <see cref="NullDisplayText" />.
+ /// Using <see cref="NullDisplayTextResourceType" /> along with <see cref="NullDisplayText" />, allows the <see cref="GetNullDisplayText" />
+ /// method to return localized values.
+ /// </summary>
public Type NullDisplayTextResourceType
{
get { return _nullDisplayText.ResourceType; }
diff --git a/src/System.ComponentModel.Annotations/tests/CompareAttributeTests.cs b/src/System.ComponentModel.Annotations/tests/CompareAttributeTests.cs
index 3a25365d0d..fef7110487 100644
--- a/src/System.ComponentModel.Annotations/tests/CompareAttributeTests.cs
+++ b/src/System.ComponentModel.Annotations/tests/CompareAttributeTests.cs
@@ -66,6 +66,15 @@ namespace System.ComponentModel.DataAnnotations.Tests
}
[Fact]
+ public static void Validate_LowerAndUpperPropertyName_Success()
+ {
+ CompareAttribute attribute = new CompareAttribute(nameof(CompareObject.comparepropertycased));
+ Assert.NotNull(attribute.GetValidationResult("b", s_context).ErrorMessage);
+ Assert.Equal(ValidationResult.Success, attribute.GetValidationResult(null, s_context));
+ Assert.Equal(nameof(CompareObject.comparepropertycased), attribute.OtherPropertyDisplayName);
+ }
+
+ [Fact]
public static void Validate_PropertyHasDisplayName_UpdatesFormatErrorMessageToContainDisplayName()
{
CompareAttribute attribute = new CompareAttribute(nameof(CompareObject.ComparePropertyWithDisplayName));
@@ -97,6 +106,9 @@ namespace System.ComponentModel.DataAnnotations.Tests
public string this[int index] { get { return "abc"; } set { } }
public string SetOnlyProperty { set { } }
+ public string ComparePropertyCased { get; set; }
+ public string comparepropertycased { get; set; }
+
public CompareObject(string otherValue)
{
CompareProperty = otherValue;
diff --git a/src/System.ComponentModel.Annotations/tests/Configurations.props b/src/System.ComponentModel.Annotations/tests/Configurations.props
index c398e42e89..77a4b65bc9 100644
--- a/src/System.ComponentModel.Annotations/tests/Configurations.props
+++ b/src/System.ComponentModel.Annotations/tests/Configurations.props
@@ -3,6 +3,7 @@
<PropertyGroup>
<BuildConfigurations>
netstandard;
+ netcoreapp;
</BuildConfigurations>
</PropertyGroup>
</Project> \ No newline at end of file
diff --git a/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTest.cs b/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTest.cs
deleted file mode 100644
index bfa27e8947..0000000000
--- a/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTest.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Collections.Generic;
-using Xunit;
-
-namespace System.ComponentModel.DataAnnotations.Tests
-{
- public class DisplayFormatAttributeTest
- {
- [Fact]
- public void Ctor()
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- Assert.True(attribute.ConvertEmptyStringToNull);
- Assert.True(attribute.HtmlEncode);
- Assert.False(attribute.ApplyFormatInEditMode);
-
- Assert.Null(attribute.DataFormatString);
- Assert.Null(attribute.NullDisplayText);
-#if netcoreapp
- Assert.Null(attribute.NullDisplayTextResourceType);
-#endif
- }
-
- [Theory]
- [InlineData("{0:C}")]
- [InlineData("{0:d}")]
- public void DataFormatString_Get_Set(string input)
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.DataFormatString = input;
-
- Assert.Equal(input, attribute.DataFormatString);
- }
-
- [Fact]
- public void ConvertEmptyStringToNull_Get_Set()
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.ConvertEmptyStringToNull = false;
-
- Assert.False(attribute.ConvertEmptyStringToNull);
- }
-
- [Fact]
- public void ApplyFormatInEditMode_Get_Set()
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.ApplyFormatInEditMode = true;
-
- Assert.True(attribute.ApplyFormatInEditMode);
- }
-
- [Fact]
- public void HtmlEncode_Get_Set()
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.HtmlEncode = false;
-
- Assert.False(attribute.HtmlEncode);
- }
-
- public static IEnumerable<object[]> Strings_TestData()
- {
- yield return new object[] { "" };
- yield return new object[] { " \r \t \n " };
- yield return new object[] { "abc" };
- yield return new object[] { "NullDisplayText" };
- }
-
- [Theory]
- [MemberData(nameof(Strings_TestData))]
- public void NullDisplayText_Get_Set(string input)
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.NullDisplayText = input;
-
- Assert.Equal(input, attribute.NullDisplayText);
-#if netcoreapp
- Assert.NotNull(attribute.GetNullDisplayText());
-#endif
-
- // Set again, to cover the setter avoiding operations if the value is the same
- attribute.NullDisplayText = input;
- Assert.Equal(input, attribute.NullDisplayText);
- }
-
-#if netcoreapp
- public class FakeResourceType
- {
- public static string Resource1
- {
- get { return "Resource1Text"; }
- }
-
- public static string Resource2
- {
- get { return "Resource2Text"; }
- }
- }
-
- [Fact]
- public void NullDisplayTextResourceType_Get_Set()
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.NullDisplayTextResourceType = typeof(FakeResourceType);
-
- Assert.Equal(typeof(FakeResourceType), attribute.NullDisplayTextResourceType);
- }
-
- [Fact]
- public void NullDisplayText_WithResource()
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.NullDisplayTextResourceType = typeof(FakeResourceType);
-
- attribute.NullDisplayText = "Resource1";
- Assert.Equal(FakeResourceType.Resource1, attribute.GetNullDisplayText());
-
- // Changing target resource
- attribute.NullDisplayText = "Resource2";
- Assert.Equal(FakeResourceType.Resource2, attribute.GetNullDisplayText());
-
- // Not existing resource in the resource type
- attribute.NullDisplayText = "Resource3";
- Assert.Throws<InvalidOperationException>(() => attribute.GetNullDisplayText());
- }
-
- [Fact]
- public void NullDisplayText_NotAResourceType()
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- // Setting a type that is not a resource type
- attribute.NullDisplayTextResourceType = typeof(string);
-
- attribute.NullDisplayText = "foo";
- Assert.Throws<InvalidOperationException>(() => attribute.GetNullDisplayText());
- }
-
- [Theory]
- [InlineData(null)]
- [InlineData(typeof(FakeResourceType))]
- public void GetNullDisplayText_WhenNullDisplayTextNotSet(Type input)
- {
- DisplayFormatAttribute attribute = new DisplayFormatAttribute();
- attribute.NullDisplayTextResourceType = input;
-
- Assert.Null(attribute.GetNullDisplayText());
- }
-#endif
- }
-}
diff --git a/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.cs b/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.cs
new file mode 100644
index 0000000000..f720a06419
--- /dev/null
+++ b/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.cs
@@ -0,0 +1,77 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using Xunit;
+
+namespace System.ComponentModel.DataAnnotations.Tests
+{
+ public partial class DisplayFormatAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new DisplayFormatAttribute();
+ Assert.True(attribute.ConvertEmptyStringToNull);
+ Assert.True(attribute.HtmlEncode);
+ Assert.False(attribute.ApplyFormatInEditMode);
+
+ Assert.Null(attribute.DataFormatString);
+ Assert.Null(attribute.NullDisplayText);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("")]
+ [InlineData("{0:C}")]
+ [InlineData("{0:d}")]
+ public void DataFormatString_Set_GetReturnsExpected(string input)
+ {
+ var attribute = new DisplayFormatAttribute { DataFormatString = input };
+ Assert.Equal(input, attribute.DataFormatString);
+ }
+
+ [Fact]
+ public void ConvertEmptyStringToNull_Set_GetReturnsExpected()
+ {
+ var attribute = new DisplayFormatAttribute { ConvertEmptyStringToNull = false };
+ Assert.False(attribute.ConvertEmptyStringToNull);
+ }
+
+ [Fact]
+ public void ApplyFormatInEditMode_Set_GetReturnsExpected()
+ {
+ var attribute = new DisplayFormatAttribute { ApplyFormatInEditMode = true };
+ Assert.True(attribute.ApplyFormatInEditMode);
+ }
+
+ [Fact]
+ public void HtmlEncode_Set_GetReturnsExpected()
+ {
+ DisplayFormatAttribute attribute = new DisplayFormatAttribute { HtmlEncode = false };
+ Assert.False(attribute.HtmlEncode);
+ }
+
+ public static IEnumerable<object[]> NullDisplayText_TestData()
+ {
+ yield return new object[] { "" };
+ yield return new object[] { " \r \t \n " };
+ yield return new object[] { "abc" };
+ yield return new object[] { "NullDisplayText" };
+ }
+
+ [Theory]
+ [MemberData(nameof(NullDisplayText_TestData))]
+ public void NullDisplayText_Get_Set(string input)
+ {
+ var attribute = new DisplayFormatAttribute { NullDisplayText = input };
+
+ Assert.Equal(input, attribute.NullDisplayText);
+
+ // Set again, to cover the setter avoiding operations if the value is the same
+ attribute.NullDisplayText = input;
+ Assert.Equal(input, attribute.NullDisplayText);
+ }
+ }
+}
diff --git a/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.netcoreapp.cs b/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.netcoreapp.cs
new file mode 100644
index 0000000000..170bcb5c79
--- /dev/null
+++ b/src/System.ComponentModel.Annotations/tests/DisplayFormatAttributeTests.netcoreapp.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.ComponentModel.DataAnnotations.Tests
+{
+ public partial class DisplayFormatAttributeTests
+ {
+ [Fact]
+ public void NullDisplayTextResourceType_GetDefault_ReturnsNull()
+ {
+ var attribute = new DisplayFormatAttribute();
+ Assert.Null(attribute.NullDisplayTextResourceType);
+ }
+
+ [Theory]
+ [MemberData(nameof(NullDisplayText_TestData))]
+ public void NullDisplayText_Set_GetReturnsExpected(string input)
+ {
+ var attribute = new DisplayFormatAttribute { NullDisplayText = input };
+ Assert.Equal(input, attribute.GetNullDisplayText());
+
+ // Set again, to cover the setter avoiding operations if the value is the same
+ attribute.NullDisplayText = input;
+ Assert.Equal(input, attribute.NullDisplayText);
+ }
+
+ [Fact]
+ public void NullDisplayTextResourceType_Set_GetReturnsExpected()
+ {
+ var attribute = new DisplayFormatAttribute { NullDisplayTextResourceType = typeof(FakeResourceType) };
+ Assert.Equal(typeof(FakeResourceType), attribute.NullDisplayTextResourceType);
+ }
+
+ [Fact]
+ public void GetNullDisplayText_ValidResource_ReturnsExpected()
+ {
+ var attribute = new DisplayFormatAttribute { NullDisplayTextResourceType = typeof(FakeResourceType) };
+
+ attribute.NullDisplayText = "Resource1";
+ Assert.Equal(FakeResourceType.Resource1, attribute.GetNullDisplayText());
+
+ // Changing target resource
+ attribute.NullDisplayText = "Resource2";
+ Assert.Equal(FakeResourceType.Resource2, attribute.GetNullDisplayText());
+ }
+
+ [Theory]
+ [InlineData(typeof(FakeResourceType), "Resource3")]
+ [InlineData(typeof(FakeResourceType), nameof(FakeResourceType.InstanceProperty))]
+ [InlineData(typeof(FakeResourceType), nameof(FakeResourceType.SetOnlyProperty))]
+ [InlineData(typeof(FakeResourceType), "NonPublicGetProperty")]
+ [InlineData(typeof(string), "foo")]
+ public void GetNullDisplayText_InvalidResourceType_ThrowsInvalidOperationException(Type nullDisplayTextResourceType, string nullDisplayText)
+ {
+ var attribute = new DisplayFormatAttribute { NullDisplayTextResourceType = nullDisplayTextResourceType };
+ attribute.NullDisplayText = nullDisplayText;
+ Assert.Throws<InvalidOperationException>(() => attribute.GetNullDisplayText());
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData(typeof(FakeResourceType))]
+ public void GetNullDisplayText_NullDisplayText_ReturnsNull(Type input)
+ {
+ var attribute = new DisplayFormatAttribute { NullDisplayTextResourceType = input };
+ Assert.Null(attribute.GetNullDisplayText());
+ }
+
+ public class FakeResourceType
+ {
+ public static string Resource1 => "Resource1Text";
+ public static string Resource2 => "Resource2Text";
+
+ public string InstanceProperty => "InstanceProperty";
+ public static string SetOnlyProperty { set => Assert.NotNull(value); }
+ private static string NonPublicGetProperty => "NonPublicGetProperty";
+ }
+ }
+}
diff --git a/src/System.ComponentModel.Annotations/tests/System.ComponentModel.Annotations.Tests.csproj b/src/System.ComponentModel.Annotations/tests/System.ComponentModel.Annotations.Tests.csproj
index 8a5e81315d..ab115fee70 100644
--- a/src/System.ComponentModel.Annotations/tests/System.ComponentModel.Annotations.Tests.csproj
+++ b/src/System.ComponentModel.Annotations/tests/System.ComponentModel.Annotations.Tests.csproj
@@ -1,12 +1,14 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
<PropertyGroup>
<ProjectGuid>{6E48765E-D6AC-4A79-9C2E-B5EE67EEDECF}</ProjectGuid>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
<!-- Default configurations to help VS understand the configurations -->
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='netstandard-Debug|AnyCPU'" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='netstandard-Release|AnyCPU'" />
<ItemGroup>
<Compile Include="UIHintAttributeTests.cs" />
<Compile Include="FilterUIHintAttributeTests.cs" />
@@ -17,6 +19,8 @@
<Compile Include="CreditCardAttributeTests.cs" />
<Compile Include="CustomValidationAttributeTests.cs" />
<Compile Include="DataTypeAttributeTests.cs" />
+ <Compile Include="DisplayFormatAttributeTests.cs" />
+ <Compile Include="DisplayFormatAttributeTests.netcoreapp.cs" Condition="'$(TargetGroup)' == 'netcoreapp'" />
<Compile Include="EditableAttributeTests.cs" />
<Compile Include="EmailAddressAttributeTests.cs" />
<Compile Include="EnumDataTypeAttributeTests.cs" />
@@ -46,7 +50,6 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
- <Compile Include="DisplayFormatAttributeTest.cs" />
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
+</Project> \ No newline at end of file
diff --git a/src/System.ComponentModel.EventBasedAsync/tests/AsyncOperationFinalizerTests.cs b/src/System.ComponentModel.EventBasedAsync/tests/AsyncOperationFinalizerTests.cs
new file mode 100644
index 0000000000..1a7b979f18
--- /dev/null
+++ b/src/System.ComponentModel.EventBasedAsync/tests/AsyncOperationFinalizerTests.cs
@@ -0,0 +1,75 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics;
+using System.Threading;
+using Xunit;
+
+namespace System.ComponentModel.Tests
+{
+ public class AsyncOperationFinalizerTests : RemoteExecutorTestBase
+ {
+ [Fact]
+ public void Finalizer_OperationCompleted_DoesNotCallOperationCompleted()
+ {
+ RemoteInvoke(() =>
+ {
+ Completed();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ return SuccessExitCode;
+ }).Dispose();
+ }
+
+ private void Completed()
+ {
+ // This is in a helper method to ensure the JIT doesn't artifically extend the lifetime of the operation.
+ var tracker = new OperationCompletedTracker();
+ AsyncOperationManager.SynchronizationContext = tracker;
+ AsyncOperation operation = AsyncOperationManager.CreateOperation(new object());
+
+ Assert.False(tracker.OperationDidComplete);
+ operation.OperationCompleted();
+ Assert.True(tracker.OperationDidComplete);
+ }
+
+ [Fact]
+ public void Finalizer_OperationNotCompleted_CompletesOperation()
+ {
+ RemoteInvoke(() =>
+ {
+ var tracker = new OperationCompletedTracker();
+ NotCompleted(tracker);
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Assert.True(tracker.OperationDidComplete);
+
+ return SuccessExitCode;
+ }).Dispose();
+ }
+
+ private void NotCompleted(OperationCompletedTracker tracker)
+ {
+ // This is in a helper method to ensure the JIT doesn't artifically extend the lifetime of the operation.
+ AsyncOperationManager.SynchronizationContext = tracker;
+ AsyncOperation operation = AsyncOperationManager.CreateOperation(new object());
+ Assert.False(tracker.OperationDidComplete);
+ }
+
+ public class OperationCompletedTracker : SynchronizationContext
+ {
+ public bool OperationDidComplete { get; set; }
+
+ public override void OperationCompleted()
+ {
+ Assert.False(OperationDidComplete);
+ OperationDidComplete = true;
+ }
+ }
+ }
+}
diff --git a/src/System.ComponentModel.EventBasedAsync/tests/BackgroundWorkerTests.cs b/src/System.ComponentModel.EventBasedAsync/tests/BackgroundWorkerTests.cs
index 24ec25b80a..595f176ccc 100644
--- a/src/System.ComponentModel.EventBasedAsync/tests/BackgroundWorkerTests.cs
+++ b/src/System.ComponentModel.EventBasedAsync/tests/BackgroundWorkerTests.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
+using System.Diagnostics;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
@@ -70,6 +71,30 @@ namespace System.ComponentModel.EventBasedAsync.Tests
}
}
+ [Fact]
+ public void RunWorkerAsync_NoOnWorkHandler_SetsResultToNull()
+ {
+ var backgroundWorker = new BackgroundWorker { WorkerReportsProgress = true };
+ bool isCompleted = false;
+ backgroundWorker.RunWorkerCompleted += (sender, e) =>
+ {
+ isCompleted = true;
+ Assert.Null(e.Result);
+ Assert.False(backgroundWorker.IsBusy);
+ };
+ backgroundWorker.RunWorkerAsync();
+
+ var stopwatch = new Stopwatch();
+ stopwatch.Start();
+ while (!isCompleted)
+ {
+ if (stopwatch.Elapsed > TimeSpan.FromSeconds(10))
+ {
+ throw new Exception("The background worker never completed.");
+ }
+ }
+ }
+
#region TestCancelAsync
private ManualResetEventSlim manualResetEvent3;
@@ -284,6 +309,16 @@ namespace System.ComponentModel.EventBasedAsync.Tests
}
[Fact]
+ public void ReportProgress_NoProgressHandle_Nop()
+ {
+ var backgroundWorker = new BackgroundWorker { WorkerReportsProgress = true };
+ foreach (int i in new int[] { 1, 2, 3, 4, 5 })
+ {
+ backgroundWorker.ReportProgress(i);
+ }
+ }
+
+ [Fact]
public void TestReportProgressWithWorkerReportsProgressFalse()
{
var bw = new BackgroundWorker() { WorkerReportsProgress = false };
diff --git a/src/System.ComponentModel.EventBasedAsync/tests/System.ComponentModel.EventBasedAsync.Tests.csproj b/src/System.ComponentModel.EventBasedAsync/tests/System.ComponentModel.EventBasedAsync.Tests.csproj
index 3a478941e4..b4a20c142f 100644
--- a/src/System.ComponentModel.EventBasedAsync/tests/System.ComponentModel.EventBasedAsync.Tests.csproj
+++ b/src/System.ComponentModel.EventBasedAsync/tests/System.ComponentModel.EventBasedAsync.Tests.csproj
@@ -12,6 +12,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
<ItemGroup>
<Compile Include="AsyncOperationManagerTests.cs" />
+ <Compile Include="AsyncOperationFinalizerTests.cs" />
<Compile Include="RunWorkerCompletedEventArgsTests.cs" />
<Compile Include="AsyncCompletedEventArgsTests.cs" />
<Compile Include="DoWorkEventArgsTests.cs" />
@@ -20,5 +21,11 @@
<Compile Include="BackgroundWorkerTests.cs" />
<Compile Include="TestException.cs" />
</ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorConsoleApp\RemoteExecutorConsoleApp.csproj">
+ <Project>{69e46a6f-9966-45a5-8945-2559fe337827}</Project>
+ <Name>RemoteExecutorConsoleApp</Name>
+ </ProjectReference>
+ </ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.ComponentModel.Primitives/ref/System.ComponentModel.Primitives.cs b/src/System.ComponentModel.Primitives/ref/System.ComponentModel.Primitives.cs
index b3ba09734d..cead28d244 100644
--- a/src/System.ComponentModel.Primitives/ref/System.ComponentModel.Primitives.cs
+++ b/src/System.ComponentModel.Primitives/ref/System.ComponentModel.Primitives.cs
@@ -184,6 +184,14 @@ namespace System.ComponentModel
public InitializationEventAttribute(string eventName) { }
public string EventName { get; }
}
+ public partial class InvalidEnumArgumentException : System.ArgumentException
+ {
+ public InvalidEnumArgumentException() { }
+ protected InvalidEnumArgumentException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { }
+ public InvalidEnumArgumentException(string message) { }
+ public InvalidEnumArgumentException(string message, System.Exception innerException) { }
+ public InvalidEnumArgumentException(string argumentName, int invalidValue, System.Type enumClass) { }
+ }
public partial interface ISite : System.IServiceProvider
{
System.ComponentModel.IComponent Component { get; }
diff --git a/src/System.ComponentModel.Primitives/src/Resources/Strings.resx b/src/System.ComponentModel.Primitives/src/Resources/Strings.resx
index 0b72d849a5..e1b8f5bef3 100644
--- a/src/System.ComponentModel.Primitives/src/Resources/Strings.resx
+++ b/src/System.ComponentModel.Primitives/src/Resources/Strings.resx
@@ -58,6 +58,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
+ <data name="InvalidEnumArgument" xml:space="preserve">
+ <value>The value of argument '{0}' ({1}) is invalid for Enum type '{2}'.</value>
+ </data>
<data name="PropertyCategoryAction" xml:space="preserve">
<value>Action</value>
</data>
diff --git a/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj b/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj
index a90afd3b97..4f41e765d6 100644
--- a/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj
+++ b/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj
@@ -28,6 +28,7 @@
<Compile Include="System\ComponentModel\IContainer.cs" />
<Compile Include="System\ComponentModel\ImmutableObjectAttribute.cs" />
<Compile Include="System\ComponentModel\InitializationEventAttribute.cs" />
+ <Compile Include="System\ComponentModel\InvalidEnumArgumentException.cs" />
<Compile Include="System\ComponentModel\ISite.cs" />
<Compile Include="System\ComponentModel\ISupportInitialize.cs" />
<Compile Include="System\ComponentModel\LocalizableAttribute.cs" />
@@ -51,4 +52,4 @@
<Reference Include="System.Threading" />
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
+</Project> \ No newline at end of file
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/CategoryAttribute.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/CategoryAttribute.cs
index bbb9c5083d..b658c5ca4a 100644
--- a/src/System.ComponentModel.Primitives/src/System/ComponentModel/CategoryAttribute.cs
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/CategoryAttribute.cs
@@ -285,12 +285,6 @@ namespace System.ComponentModel
}
}
- /// <summary>
- /// </summary>
- /// <summary>
- /// </summary>
- /// <internalonly/>
- /// <internalonly/>
public override bool Equals(object obj)
{
if (obj == this)
@@ -302,25 +296,13 @@ namespace System.ComponentModel
return other != null && Category.Equals(other.Category);
}
- /// <summary>
- /// <para>[To be supplied.]</para>
- /// </summary>
- public override int GetHashCode()
- {
- return Category.GetHashCode();
- }
+ public override int GetHashCode() => Category.GetHashCode();
/// <summary>
/// <para>Looks up the localized name of a given category.</para>
/// </summary>
- protected virtual string GetLocalizedString(string value)
- {
- return SR.GetResourceString("PropertyCategory" + value, null);
- }
+ protected virtual string GetLocalizedString(string value) => SR.GetResourceString("PropertyCategory" + value, null);
- public override bool IsDefaultAttribute()
- {
- return Category.Equals(CategoryAttribute.Default.Category);
- }
+ public override bool IsDefaultAttribute() => Category.Equals(Default.Category);
}
}
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/DescriptionAttribute.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/DescriptionAttribute.cs
index 062c50ce54..45310db4bd 100644
--- a/src/System.ComponentModel.Primitives/src/System/ComponentModel/DescriptionAttribute.cs
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/DescriptionAttribute.cs
@@ -5,8 +5,7 @@
namespace System.ComponentModel
{
/// <summary>
- /// <para>Specifies a description for a property
- /// or event.</para>
+ /// <para>Specifies a description for a property or event.</para>
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class DescriptionAttribute : Attribute
@@ -17,9 +16,6 @@ namespace System.ComponentModel
/// </summary>
public static readonly DescriptionAttribute Default = new DescriptionAttribute();
- /// <summary>
- /// <para>[To be supplied.]</para>
- /// </summary>
public DescriptionAttribute() : this(string.Empty)
{
}
@@ -27,10 +23,7 @@ namespace System.ComponentModel
/// <summary>
/// <para>Initializes a new instance of the <see cref='System.ComponentModel.DescriptionAttribute'/> class.</para>
/// </summary>
- public DescriptionAttribute(string description)
- {
- DescriptionValue = description;
- }
+ public DescriptionAttribute(string description) => DescriptionValue = description;
/// <summary>
/// <para>Gets the description stored in this attribute.</para>
@@ -52,17 +45,11 @@ namespace System.ComponentModel
}
DescriptionAttribute other = obj as DescriptionAttribute;
- return (other != null) && other.Description == Description;
+ return other != null && other.Description == Description;
}
- public override int GetHashCode()
- {
- return Description.GetHashCode();
- }
+ public override int GetHashCode() => Description.GetHashCode();
- public override bool IsDefaultAttribute()
- {
- return Equals(DescriptionAttribute.Default);
- }
+ public override bool IsDefaultAttribute() => Equals(Default);
}
}
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/DesignerCategoryAttribute.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/DesignerCategoryAttribute.cs
index e270ea76ab..d960e9847b 100644
--- a/src/System.ComponentModel.Primitives/src/System/ComponentModel/DesignerCategoryAttribute.cs
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/DesignerCategoryAttribute.cs
@@ -48,10 +48,7 @@ namespace System.ComponentModel
/// default category.
/// </para>
/// </summary>
- public DesignerCategoryAttribute()
- {
- Category = string.Empty;
- }
+ public DesignerCategoryAttribute() => Category = string.Empty;
/// <summary>
/// <para>
@@ -59,10 +56,7 @@ namespace System.ComponentModel
/// the given category name.
/// </para>
/// </summary>
- public DesignerCategoryAttribute(string category)
- {
- Category = category;
- }
+ public DesignerCategoryAttribute(string category) => Category = category;
/// <summary>
/// <para>
@@ -82,22 +76,10 @@ namespace System.ComponentModel
return other != null && other.Category == Category;
}
- public override int GetHashCode()
- {
- return Category.GetHashCode();
- }
+ public override int GetHashCode() => Category.GetHashCode();
- public override bool IsDefaultAttribute()
- {
- return Category.Equals(DesignerCategoryAttribute.Default.Category);
- }
+ public override bool IsDefaultAttribute() => Category.Equals(Default.Category);
- public override object TypeId
- {
- get
- {
- return base.GetType().FullName + Category;
- }
- }
+ public override object TypeId => GetType().FullName + Category;
}
}
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/DisplayNameAttribute.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/DisplayNameAttribute.cs
index 9fc5595620..9f9d5ce93b 100644
--- a/src/System.ComponentModel.Primitives/src/System/ComponentModel/DisplayNameAttribute.cs
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/DisplayNameAttribute.cs
@@ -16,9 +16,6 @@ namespace System.ComponentModel
/// </summary>
public static readonly DisplayNameAttribute Default = new DisplayNameAttribute();
- /// <summary>
- /// <para>[To be supplied.]</para>
- /// </summary>
public DisplayNameAttribute() : this(string.Empty)
{
}
@@ -26,10 +23,7 @@ namespace System.ComponentModel
/// <summary>
/// <para>Initializes a new instance of the <see cref='System.ComponentModel.DisplayNameAttribute'/> class.</para>
/// </summary>
- public DisplayNameAttribute(string displayName)
- {
- DisplayNameValue = displayName;
- }
+ public DisplayNameAttribute(string displayName) => DisplayNameValue = displayName;
/// <summary>
/// <para>Gets the description stored in this attribute.</para>
@@ -51,18 +45,11 @@ namespace System.ComponentModel
}
DisplayNameAttribute other = obj as DisplayNameAttribute;
-
- return (other != null) && other.DisplayName == DisplayName;
+ return other != null && other.DisplayName == DisplayName;
}
- public override int GetHashCode()
- {
- return DisplayName.GetHashCode();
- }
+ public override int GetHashCode() => DisplayName.GetHashCode();
- public override bool IsDefaultAttribute()
- {
- return Equals(DisplayNameAttribute.Default);
- }
+ public override bool IsDefaultAttribute() => Equals(Default);
}
}
diff --git a/src/System.Drawing.Common/src/System/ComponentModel/InvalidEnumArgumentException.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/InvalidEnumArgumentException.cs
index 0e2fc28594..203b8439fc 100644
--- a/src/System.Drawing.Common/src/System/ComponentModel/InvalidEnumArgumentException.cs
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/InvalidEnumArgumentException.cs
@@ -11,17 +11,17 @@ namespace System.ComponentModel
/// <para>The exception that is thrown when using invalid arguments that are enumerators.</para>
/// </summary>
[Serializable]
- internal class InvalidEnumArgumentException : ArgumentException
+ public class InvalidEnumArgumentException : ArgumentException
{
/// <summary>
- /// <para>Initializes a new instance of the <see cref='System.ComponentModel.InvalidEnumArgumentException'/> class without a message.</para>
+ /// <para>Initializes a new instance of the <see cref='InvalidEnumArgumentException'/> class without a message.</para>
/// </summary>
public InvalidEnumArgumentException() : this(null)
{
}
/// <summary>
- /// <para>Initializes a new instance of the <see cref='System.ComponentModel.InvalidEnumArgumentException'/> class with
+ /// <para>Initializes a new instance of the <see cref='InvalidEnumArgumentException'/> class with
/// the specified message.</para>
/// </summary>
public InvalidEnumArgumentException(string message)
@@ -40,7 +40,7 @@ namespace System.ComponentModel
}
/// <summary>
- /// <para>Initializes a new instance of the <see cref='System.ComponentModel.InvalidEnumArgumentException'/> class with a
+ /// <para>Initializes a new instance of the <see cref='InvalidEnumArgumentException'/> class with a
/// message generated from the argument, invalid value, and enumeration
/// class.</para>
/// </summary>
@@ -58,6 +58,7 @@ namespace System.ComponentModel
/// </summary>
protected InvalidEnumArgumentException(SerializationInfo info, StreamingContext context) : base(info, context)
{
+ throw new PlatformNotSupportedException();
}
}
}
diff --git a/src/System.ComponentModel.Primitives/tests/CategoryAttributeTests.cs b/src/System.ComponentModel.Primitives/tests/CategoryAttributeTests.cs
index 958c9e2d69..fd8825518e 100644
--- a/src/System.ComponentModel.Primitives/tests/CategoryAttributeTests.cs
+++ b/src/System.ComponentModel.Primitives/tests/CategoryAttributeTests.cs
@@ -5,52 +5,106 @@
using System.Collections.Generic;
using Xunit;
-namespace System.ComponentModel.Primitives.Tests
+namespace System.ComponentModel.Tests
{
public class CategoryAttributeTests
{
[Fact]
- public void Equals_DifferentCategories()
+ public void Ctor_Default()
{
- Assert.False(CategoryAttribute.Action.Equals(CategoryAttribute.Appearance));
+ var attribute = new CategoryAttribute();
+ Assert.Equal("Misc", attribute.Category);
+ Assert.True(attribute.IsDefaultAttribute());
+ }
+
+ public static IEnumerable<object[]> Ctor_Category_TestData()
+ {
+ yield return new object[] { "", false };
+ yield return new object[] { "test category", false };
+ yield return new object[] { "Misc", true };
+ yield return new object[] { "misc", false };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_Category_TestData))]
+ public void Ctor_Category(string category, bool expectedIsDefaultAttribute)
+ {
+ var attribute = new CategoryAttribute(category);
+ Assert.Equal(category, attribute.Category);
+ Assert.Equal(expectedIsDefaultAttribute, attribute.IsDefaultAttribute());
+ }
+
+ [Fact]
+ public void IsDefaultAttribute_NullCategory_ThrowsNullReferenceException()
+ {
+ var attribute = new CategoryAttribute(null);
+ Assert.Null(attribute.Category);
+ Assert.Throws<NullReferenceException>(() => attribute.IsDefaultAttribute());
+ }
+
+ public static IEnumerable<object[]> Equals_TestData()
+ {
+ yield return new object[] { new CategoryAttribute("category"), new CategoryAttribute("category"), true };
+ yield return new object[] { new CategoryAttribute("category"), new CategoryAttribute(null), false };
+ yield return new object[] { CategoryAttribute.Action, CategoryAttribute.Action, true };
+ yield return new object[] { CategoryAttribute.Action, CategoryAttribute.Appearance, false };
+
+ yield return new object[] { CategoryAttribute.Action, null, false };
+ yield return new object[] { CategoryAttribute.Action, new object(), false };
+ yield return new object[] { new CategoryAttribute(null), null, false };
+ }
+
+ [Theory]
+ [MemberData(nameof(Equals_TestData))]
+ public void Equals_Object_ReturnsExpected(CategoryAttribute attribute, object other, bool expected)
+ {
+ Assert.Equal(expected, attribute.Equals(other));
+ if (other is CategoryAttribute otherAttribute && otherAttribute.Category != null)
+ {
+ Assert.Equal(expected, attribute.GetHashCode().Equals(other.GetHashCode()));
+ }
}
[Fact]
- public void Equals_SameCategory()
+ public void Equals_NullCategory_ThrowsNullReferenceException()
{
- Assert.True(CategoryAttribute.Default.Equals(CategoryAttribute.Default));
+ var attribute = new CategoryAttribute(null);
+ Assert.Throws<NullReferenceException>(() => attribute.Equals(new CategoryAttribute("a")));
}
[Fact]
- public void GetCategory()
+ public void GetHashCode_NullCategory_ThrowsNullReferenceException()
{
- var category = "test category";
- var attribute = new CategoryAttribute(category);
+ var attribute = new CategoryAttribute(null);
+ Assert.Throws<NullReferenceException>(() => attribute.GetHashCode());
+ }
- Assert.Equal(category, attribute.Category);
+ private static IEnumerable<object[]> DefaultProperties_TestData()
+ {
+ yield return Attribute(() => CategoryAttribute.Appearance, "Appearance");
+ yield return Attribute(() => CategoryAttribute.Asynchronous, "Asynchronous");
+ yield return Attribute(() => CategoryAttribute.Behavior, "Behavior");
+ yield return Attribute(() => CategoryAttribute.Data, "Data");
+ yield return Attribute(() => CategoryAttribute.Default, "Misc");
+ yield return Attribute(() => CategoryAttribute.Design, "Design");
+ yield return Attribute(() => CategoryAttribute.DragDrop, "Drag Drop");
+ yield return Attribute(() => CategoryAttribute.Focus, "Focus");
+ yield return Attribute(() => CategoryAttribute.Format, "Format");
+ yield return Attribute(() => CategoryAttribute.Key, "Key");
+ yield return Attribute(() => CategoryAttribute.Layout, "Layout");
+ yield return Attribute(() => CategoryAttribute.Mouse, "Mouse");
+ yield return Attribute(() => CategoryAttribute.WindowStyle, "Window Style");
}
+ private static object[] Attribute(Func<CategoryAttribute> attribute, string expectedCategory) => new object[] { attribute, expectedCategory };
+
[Theory]
- [MemberData(nameof(CategoryNameData))]
- public void CategoryNames(CategoryAttribute attribute, string name)
- {
- Assert.Equal(name, attribute.Category);
- }
-
- private static IEnumerable<object[]> CategoryNameData()
- {
- yield return new object[] { CategoryAttribute.Appearance, "Appearance" };
- yield return new object[] { CategoryAttribute.Asynchronous, "Asynchronous" };
- yield return new object[] { CategoryAttribute.Behavior, "Behavior" };
- yield return new object[] { CategoryAttribute.Data, "Data" };
- yield return new object[] { CategoryAttribute.Default, "Misc" };
- yield return new object[] { CategoryAttribute.Design, "Design" };
- yield return new object[] { CategoryAttribute.DragDrop, "Drag Drop" };
- yield return new object[] { CategoryAttribute.Focus, "Focus" };
- yield return new object[] { CategoryAttribute.Key, "Key" };
- yield return new object[] { CategoryAttribute.Layout, "Layout" };
- yield return new object[] { CategoryAttribute.Mouse, "Mouse" };
- yield return new object[] { CategoryAttribute.WindowStyle, "Window Style" };
+ [MemberData(nameof(DefaultProperties_TestData))]
+ public void CategoryProperties_GetCategory_ReturnsExpected(Func<CategoryAttribute> attributeThunk, string expectedCategory)
+ {
+ CategoryAttribute attribute = attributeThunk();
+ Assert.Same(attribute, attributeThunk());
+ Assert.Equal(expectedCategory, attribute.Category);
}
}
}
diff --git a/src/System.ComponentModel.Primitives/tests/DescriptionAttributeTests.cs b/src/System.ComponentModel.Primitives/tests/DescriptionAttributeTests.cs
index 280b17445d..c6f7148338 100644
--- a/src/System.ComponentModel.Primitives/tests/DescriptionAttributeTests.cs
+++ b/src/System.ComponentModel.Primitives/tests/DescriptionAttributeTests.cs
@@ -5,46 +5,66 @@
using System.Collections.Generic;
using Xunit;
-namespace System.ComponentModel.Primitives.Tests
+namespace System.ComponentModel.Tests
{
public class DescriptionAttributeTests
{
[Fact]
- public void Equals_DifferentDescriptions()
+ public void Ctor_Default()
{
- var firstAttribute = new DescriptionAttribute("description");
- var secondAttribute = new DescriptionAttribute(string.Empty);
-
- Assert.False(firstAttribute.Equals(secondAttribute));
+ var attribute = new DescriptionAttribute();
+ Assert.Equal(string.Empty, attribute.Description);
+ Assert.True(attribute.IsDefaultAttribute());
}
- [Fact]
- public void Equals_SameDescription()
+ [Theory]
+ [InlineData(null, false)]
+ [InlineData("", true)]
+ [InlineData("test description", false)]
+ public void Ctor_Description(string description, bool expectedIsDefaultAttribute)
{
- Assert.True(DescriptionAttribute.Default.Equals(DescriptionAttribute.Default));
+ var attribute = new DescriptionAttribute(description);
+ Assert.Equal(description, attribute.Description);
+ Assert.Equal(expectedIsDefaultAttribute, attribute.IsDefaultAttribute());
}
- [Fact]
- public void GetDescription()
+ public static IEnumerable<object[]> Equals_TestData()
{
- var description = "test description";
- var attribute = new DescriptionAttribute(description);
+ yield return new object[] { new DescriptionAttribute("description"), new DescriptionAttribute("description"), true };
+ yield return new object[] { new DescriptionAttribute("description"), new DescriptionAttribute(""), false };
+ yield return new object[] { DescriptionAttribute.Default, DescriptionAttribute.Default, true };
- Assert.Equal(description, attribute.Description);
+ yield return new object[] { new DescriptionAttribute(null), new DescriptionAttribute(null), true };
+ yield return new object[] { new DescriptionAttribute("description"), new DescriptionAttribute(null), false };
+ yield return new object[] { new DescriptionAttribute(null), new DescriptionAttribute("description"), false };
+
+ yield return new object[] { new DescriptionAttribute("description"), new object(), false };
+ yield return new object[] { new DescriptionAttribute("description"), null, false };
+ yield return new object[] { new DescriptionAttribute(null), null, false };
}
[Theory]
- [MemberData(nameof(DescriptionData))]
- public void CategoryNames(DescriptionAttribute attribute, string name)
+ [MemberData(nameof(Equals_TestData))]
+ public void Equals_Object_ReturnsExpected(DescriptionAttribute attribute, object other, bool expected)
{
- Assert.Equal(name, attribute.Description);
+ Assert.Equal(expected, attribute.Equals(other));
+ if (other is DescriptionAttribute otherAttribute && otherAttribute.Description != null && attribute.Description != null)
+ {
+ Assert.Equal(expected, attribute.GetHashCode().Equals(other.GetHashCode()));
+ }
}
- private static IEnumerable<object[]> DescriptionData()
+ [Fact]
+ public void GetHashCode_NullDescription_ThrowsNullReferenceException()
+ {
+ var attribute = new DescriptionAttribute(null);
+ Assert.Throws<NullReferenceException>(() => attribute.GetHashCode());
+ }
+
+ [Fact]
+ public void DefaultDescriptionAttribute_GetDescription_ReturnsEmptyString()
{
- yield return new object[] { DescriptionAttribute.Default, "" };
- yield return new object[] { new DescriptionAttribute(""), "" };
- yield return new object[] { new DescriptionAttribute("other"), "other" };
+ Assert.Empty(DescriptionAttribute.Default.Description);
}
}
}
diff --git a/src/System.ComponentModel.Primitives/tests/DesignerCategoryAttributeTests.cs b/src/System.ComponentModel.Primitives/tests/DesignerCategoryAttributeTests.cs
index 2bfecd8c9c..07b42141e1 100644
--- a/src/System.ComponentModel.Primitives/tests/DesignerCategoryAttributeTests.cs
+++ b/src/System.ComponentModel.Primitives/tests/DesignerCategoryAttributeTests.cs
@@ -2,34 +2,88 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Collections.Generic;
using Xunit;
-namespace System.ComponentModel.Primitives.Tests
+namespace System.ComponentModel.Tests
{
public class DesignerCategoryAttributeTests
{
[Fact]
- public void Equals_DifferentCategories()
+ public void Ctor_Default()
{
- var firstAttribute = new CategoryAttribute("category");
- var secondAttribute = new DescriptionAttribute(string.Empty);
+ var attribute = new DesignerCategoryAttribute();
+ Assert.Equal(string.Empty, attribute.Category);
+ Assert.True(attribute.IsDefaultAttribute());
+ Assert.Equal("System.ComponentModel.DesignerCategoryAttribute", attribute.TypeId);
+ }
- Assert.False(firstAttribute.Equals(secondAttribute));
+ [Theory]
+ [InlineData("", true, "System.ComponentModel.DesignerCategoryAttribute")]
+ [InlineData("test category", false, "System.ComponentModel.DesignerCategoryAttributetest category")]
+ public void Ctor_Category(string category, bool expectedIsDefaultAttribute, string expectedTypeId)
+ {
+ var attribute = new DesignerCategoryAttribute(category);
+ Assert.Equal(category, attribute.Category);
+ Assert.Equal(expectedIsDefaultAttribute, attribute.IsDefaultAttribute());
+ Assert.Equal(expectedTypeId, attribute.TypeId);
}
[Fact]
- public void Equals_SameDescription()
+ public void IsDefaultAttribute_NullCategory_ThrowsNullReferenceException()
{
- Assert.True(CategoryAttribute.Default.Equals(CategoryAttribute.Default));
+ var attribute = new CategoryAttribute(null);
+ Assert.Null(attribute.Category);
+ Assert.Equal(typeof(CategoryAttribute), attribute.TypeId);
+ Assert.Throws<NullReferenceException>(() => attribute.IsDefaultAttribute());
+ }
+
+ public static IEnumerable<object[]> Equals_TestData()
+ {
+ yield return new object[] { new DesignerCategoryAttribute("category"), new DesignerCategoryAttribute("category"), true };
+ yield return new object[] { new DesignerCategoryAttribute("category"), new DesignerCategoryAttribute(""), false };
+ yield return new object[] { DesignerCategoryAttribute.Default, DesignerCategoryAttribute.Default, true };
+
+ yield return new object[] { new DesignerCategoryAttribute(null), new DesignerCategoryAttribute(null), true };
+ yield return new object[] { new DesignerCategoryAttribute("category"), new DesignerCategoryAttribute(null), false };
+ yield return new object[] { new DesignerCategoryAttribute(null), new DesignerCategoryAttribute("category"), false };
+
+ yield return new object[] { new DesignerCategoryAttribute("category"), new object(), false };
+ yield return new object[] { new DesignerCategoryAttribute("category"), null, false };
+ yield return new object[] { new DesignerCategoryAttribute(null), null, false };
+ }
+
+ [Theory]
+ [MemberData(nameof(Equals_TestData))]
+ public void Equals_Object_ReturnsExpected(DesignerCategoryAttribute attribute, object other, bool expected)
+ {
+ Assert.Equal(expected, attribute.Equals(other));
+ if (other is DesignerCategoryAttribute otherAttribute && otherAttribute.Category != null && attribute.Category != null)
+ {
+ Assert.Equal(expected, attribute.GetHashCode().Equals(other.GetHashCode()));
+ }
}
[Fact]
- public void GetCategory()
+ public void GetHashCode_NullCategory_ThrowsNullReferenceException()
{
- var category = "test category";
- var attribute = new CategoryAttribute(category);
+ var attribute = new DesignerCategoryAttribute(null);
+ Assert.Throws<NullReferenceException>(() => attribute.GetHashCode());
+ }
- Assert.Equal(category, attribute.Category);
+ public static IEnumerable<object[]> DefaultCategories_TestData()
+ {
+ yield return new object[] { DesignerCategoryAttribute.Component, "Component" };
+ yield return new object[] { DesignerCategoryAttribute.Default, string.Empty };
+ yield return new object[] { DesignerCategoryAttribute.Form, "Form" };
+ yield return new object[] { DesignerCategoryAttribute.Generic, "Designer" };
+ }
+
+ [Theory]
+ [MemberData(nameof(DefaultCategories_TestData))]
+ public void DefaultDesignerCategoryAttribute_GetCategory_ReturnsEmptyString(DesignerCategoryAttribute attribute, string expectedCategory)
+ {
+ Assert.Equal(expectedCategory, attribute.Category);
}
}
}
diff --git a/src/System.ComponentModel.Primitives/tests/DisplayNameAttributeTests.cs b/src/System.ComponentModel.Primitives/tests/DisplayNameAttributeTests.cs
index 1d5c9f8ba4..d792981ef9 100644
--- a/src/System.ComponentModel.Primitives/tests/DisplayNameAttributeTests.cs
+++ b/src/System.ComponentModel.Primitives/tests/DisplayNameAttributeTests.cs
@@ -5,31 +5,66 @@
using System.Collections.Generic;
using Xunit;
-namespace System.ComponentModel.Primitives.Tests
+namespace System.ComponentModel.Tests
{
public class DisplayNameAttributeTests
{
[Fact]
- public void GetDisplayName()
+ public void Ctor_Default()
{
- var name = "test name";
- var attribute = new DisplayNameAttribute(name);
+ var attribute = new DisplayNameAttribute();
+ Assert.Equal(string.Empty, attribute.DisplayName);
+ Assert.True(attribute.IsDefaultAttribute());
+ }
- Assert.Equal(name, attribute.DisplayName);
+ [Theory]
+ [InlineData(null, false)]
+ [InlineData("", true)]
+ [InlineData("test name", false)]
+ public void Ctor_DisplayName(string displayName, bool expectedIsDefaultAttribute)
+ {
+ var attribute = new DisplayNameAttribute(displayName);
+ Assert.Equal(displayName, attribute.DisplayName);
+ Assert.Equal(expectedIsDefaultAttribute, attribute.IsDefaultAttribute());
+ }
+
+ public static IEnumerable<object[]> Equals_TestData()
+ {
+ yield return new object[] { new DisplayNameAttribute("name"), new DisplayNameAttribute("name"), true };
+ yield return new object[] { new DisplayNameAttribute("name"), new DisplayNameAttribute(""), false };
+ yield return new object[] { DisplayNameAttribute.Default, DisplayNameAttribute.Default, true };
+
+ yield return new object[] { new DisplayNameAttribute(null), new DisplayNameAttribute(null), true };
+ yield return new object[] { new DisplayNameAttribute("name"), new DisplayNameAttribute(null), false };
+ yield return new object[] { new DisplayNameAttribute(null), new DisplayNameAttribute("name"), false };
+
+ yield return new object[] { new DisplayNameAttribute("name"), new object(), false };
+ yield return new object[] { new DisplayNameAttribute("name"), null, false };
+ yield return new object[] { new DisplayNameAttribute(null), null, false };
}
[Theory]
- [MemberData(nameof(NameData))]
- public void NameTests(DisplayNameAttribute attribute, string name)
+ [MemberData(nameof(Equals_TestData))]
+ public void Equals_Object_ReturnsExpected(DisplayNameAttribute attribute, object other, bool expected)
+ {
+ Assert.Equal(expected, attribute.Equals(other));
+ if (other is DisplayNameAttribute otherAttribute && otherAttribute.DisplayName != null && attribute.DisplayName != null)
+ {
+ Assert.Equal(expected, attribute.GetHashCode().Equals(other.GetHashCode()));
+ }
+ }
+
+ [Fact]
+ public void GetHashCode_NullDisplayName_ThrowsNullReferenceException()
{
- Assert.Equal(name, attribute.DisplayName);
+ var attribute = new DisplayNameAttribute(null);
+ Assert.Throws<NullReferenceException>(() => attribute.GetHashCode());
}
- private static IEnumerable<object[]> NameData()
+ [Fact]
+ public void DefaultDisplayNameAttribute_GetDisplayName_ReturnsEmptyString()
{
- yield return new object[] { DisplayNameAttribute.Default, "" };
- yield return new object[] { new DisplayNameAttribute(""), "" };
- yield return new object[] { new DisplayNameAttribute("other"), "other" };
+ Assert.Empty(DisplayNameAttribute.Default.DisplayName);
}
}
}
diff --git a/src/System.ComponentModel.Primitives/tests/InvalidEnumArgumentExceptionTests.cs b/src/System.ComponentModel.Primitives/tests/InvalidEnumArgumentExceptionTests.cs
new file mode 100644
index 0000000000..d36aed88e7
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/tests/InvalidEnumArgumentExceptionTests.cs
@@ -0,0 +1,112 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using Xunit;
+
+namespace System.ComponentModel.Tests
+{
+ public class InvalidEnumArgumentExceptionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var exception = new InvalidEnumArgumentException();
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.ParamName);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("")]
+ [InlineData("message")]
+ public void Ctor_Message(string message)
+ {
+ var exception = new InvalidEnumArgumentException(message);
+ if (message == null)
+ {
+ Assert.NotEmpty(exception.Message);
+ }
+ else
+ {
+ Assert.Equal(message, exception.Message);
+ }
+ Assert.Null(exception.ParamName);
+ Assert.Null(exception.InnerException);
+ }
+
+ public static IEnumerable<object[]> Ctor_Message_Exception_TestData()
+ {
+ yield return new object[] { null, null };
+ yield return new object[] { "", new DivideByZeroException() };
+ yield return new object[] { "message", new ArgumentException() };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_Message_Exception_TestData))]
+ public void Ctor_Message_InnerException(string message, Exception innerException)
+ {
+ var exception = new InvalidEnumArgumentException(message, innerException);
+ if (message == null)
+ {
+ Assert.NotEmpty(exception.Message);
+ }
+ else
+ {
+ Assert.Equal(message, exception.Message);
+ }
+ Assert.Null(exception.ParamName);
+ Assert.Same(innerException, exception.InnerException);
+ }
+
+ [Theory]
+ [InlineData(null, 0, typeof(int))]
+ [InlineData("", 1, typeof(int))]
+ [InlineData("argumentName", int.MaxValue, typeof(int))]
+ public void Ctor_ArgumentName_InvalidValue_EnumClass(string argumentName, int invalidValue, Type enumClass)
+ {
+ var exception = new InvalidEnumArgumentException(argumentName, invalidValue, enumClass);
+ if (argumentName != null)
+ {
+ Assert.Contains(argumentName, exception.Message);
+ }
+ Assert.Contains(invalidValue.ToString(), exception.Message);
+ Assert.Contains(enumClass.Name, exception.Message);
+ Assert.Equal(argumentName, exception.ParamName);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_NullEnumClass_ThrowsNullReferenceException()
+ {
+ Assert.Throws<NullReferenceException>(() => new InvalidEnumArgumentException("argumentName", 1, null));
+ }
+
+ [Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
+ public void Deserialize_ThrowsPlatformNotSupportedException()
+ {
+ var binaryFormatter = new BinaryFormatter();
+ using (var stream = new MemoryStream())
+ {
+ binaryFormatter.Serialize(stream, new SubException());
+ stream.Position = 0;
+ Exception ex = Assert.Throws<TargetInvocationException>(() => binaryFormatter.Deserialize(stream));
+ Assert.IsType<PlatformNotSupportedException>(ex.InnerException);
+ }
+ }
+
+ [Serializable]
+ public class SubException : InvalidEnumArgumentException
+ {
+ public SubException() : base() { }
+ protected SubException(SerializationInfo info, StreamingContext context) : base(info, context) { }
+ }
+ }
+}
diff --git a/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj b/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj
index 9b0b767c74..9de390cd4b 100644
--- a/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj
+++ b/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj
@@ -8,6 +8,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
<ItemGroup>
+ <Compile Include="InvalidEnumArgumentExceptionTests.cs" />
<Compile Include="BrowsableAttributeTests.cs" />
<Compile Include="ComponentCollectionTests.cs" />
<Compile Include="ComponentTests.cs" />
diff --git a/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.TypeConverter.cs b/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.TypeConverter.cs
index aafa55cfcf..b6528ab8bb 100644
--- a/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.TypeConverter.cs
+++ b/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.TypeConverter.cs
@@ -7,6 +7,8 @@
using System.Runtime.Serialization;
+// These types were moved down to System.Primitives
+[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.ComponentModel.InvalidEnumArgumentException))]
[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.ComponentModel.Component))]
[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.ComponentModel.ISupportInitialize))]
diff --git a/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.cs b/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.cs
index 5e44b58be5..2a6ada4171 100644
--- a/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.cs
+++ b/src/System.ComponentModel.TypeConverter/ref/System.ComponentModel.cs
@@ -403,14 +403,6 @@ namespace System.ComponentModel
public virtual string Text { get { throw null; } }
public abstract object CreateInstance(System.ComponentModel.ITypeDescriptorContext context, System.Type instanceType);
}
- public partial class InvalidEnumArgumentException : System.ArgumentException
- {
- public InvalidEnumArgumentException() { }
- protected InvalidEnumArgumentException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { }
- public InvalidEnumArgumentException(string message) { }
- public InvalidEnumArgumentException(string message, System.Exception innerException) { }
- public InvalidEnumArgumentException(string argumentName, int invalidValue, System.Type enumClass) { }
- }
public partial interface IRaiseItemChangedEvents
{
bool RaisesItemChangedEvents { get; }
diff --git a/src/System.ComponentModel.TypeConverter/src/Resources/Strings.resx b/src/System.ComponentModel.TypeConverter/src/Resources/Strings.resx
index 3947d0e4ba..8027e4209b 100644
--- a/src/System.ComponentModel.TypeConverter/src/Resources/Strings.resx
+++ b/src/System.ComponentModel.TypeConverter/src/Resources/Strings.resx
@@ -241,9 +241,6 @@
<data name="InstanceCreationEditorDefaultText" xml:space="preserve">
<value>(New...)</value>
</data>
- <data name="InvalidEnumArgument" xml:space="preserve">
- <value>The value of argument '{0}' ({1}) is invalid for Enum type '{2}'.</value>
- </data>
<data name="ErrorPropertyAccessorException" xml:space="preserve">
<value>Property accessor '{0}' on object '{1}' threw the following exception:'{2}'</value>
</data>
diff --git a/src/System.ComponentModel.TypeConverter/src/System.ComponentModel.TypeConverter.csproj b/src/System.ComponentModel.TypeConverter/src/System.ComponentModel.TypeConverter.csproj
index ce823889ef..ef86c10b9d 100644
--- a/src/System.ComponentModel.TypeConverter/src/System.ComponentModel.TypeConverter.csproj
+++ b/src/System.ComponentModel.TypeConverter/src/System.ComponentModel.TypeConverter.csproj
@@ -154,7 +154,6 @@
<Compile Include="System\ComponentModel\INestedSite.cs" />
<Compile Include="System\ComponentModel\InstallerTypeAttribute.cs" />
<Compile Include="System\ComponentModel\InstanceCreationEditor.cs" />
- <Compile Include="System\ComponentModel\InvalidEnumArgumentException.cs" />
<Compile Include="System\ComponentModel\ISupportInitializeNotification.cs" />
<Compile Include="System\ComponentModel\License.cs" />
<Compile Include="System\ComponentModel\LicenseContext.cs" />
diff --git a/src/System.ComponentModel.TypeConverter/src/System/ComponentModel/InvalidEnumArgumentException.cs b/src/System.ComponentModel.TypeConverter/src/System/ComponentModel/InvalidEnumArgumentException.cs
deleted file mode 100644
index b3ecdb1209..0000000000
--- a/src/System.ComponentModel.TypeConverter/src/System/ComponentModel/InvalidEnumArgumentException.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using Microsoft.Win32;
-using System;
-using System.Diagnostics;
-using System.Globalization;
-using System.Runtime.Serialization;
-using System.Security.Permissions;
-
-namespace System.ComponentModel
-{
- /// <summary>
- /// <para>The exception that is thrown when using invalid arguments that are enumerators.</para>
- /// </summary>
- [Serializable]
- public class InvalidEnumArgumentException : ArgumentException
- {
- /// <summary>
- /// <para>Initializes a new instance of the <see cref='System.ComponentModel.InvalidEnumArgumentException'/> class without a message.</para>
- /// </summary>
- public InvalidEnumArgumentException() : this(null)
- {
- }
-
- /// <summary>
- /// <para>Initializes a new instance of the <see cref='System.ComponentModel.InvalidEnumArgumentException'/> class with
- /// the specified message.</para>
- /// </summary>
- public InvalidEnumArgumentException(string message)
- : base(message)
- {
- }
-
- /// <summary>
- /// Initializes a new instance of the Exception class with a specified error message and a
- /// reference to the inner exception that is the cause of this exception.
- /// FxCop CA1032: Multiple constructors are required to correctly implement a custom exception.
- /// </summary>
- public InvalidEnumArgumentException(string message, Exception innerException)
- : base(message, innerException)
- {
- }
-
- /// <summary>
- /// <para>Initializes a new instance of the <see cref='System.ComponentModel.InvalidEnumArgumentException'/> class with a
- /// message generated from the argument, invalid value, and enumeration
- /// class.</para>
- /// </summary>
- public InvalidEnumArgumentException(string argumentName, int invalidValue, Type enumClass)
- : base(SR.Format(SR.InvalidEnumArgument,
- argumentName,
- invalidValue.ToString(CultureInfo.CurrentCulture),
- enumClass.Name), argumentName)
- {
- }
-
- /// <summary>
- /// Need this constructor since Exception implements ISerializable. We don't have any fields,
- /// so just forward this to base.
- /// </summary>
- protected InvalidEnumArgumentException(SerializationInfo info, StreamingContext context) : base(info, context)
- {
- throw new PlatformNotSupportedException();
- }
- }
-}
diff --git a/src/System.ComponentModel.TypeConverter/src/System/Drawing/ColorConverter.cs b/src/System.ComponentModel.TypeConverter/src/System/Drawing/ColorConverter.cs
index b9ca22d4d7..ba7839efe9 100644
--- a/src/System.ComponentModel.TypeConverter/src/System/Drawing/ColorConverter.cs
+++ b/src/System.ComponentModel.TypeConverter/src/System/Drawing/ColorConverter.cs
@@ -53,7 +53,7 @@ namespace System.Drawing
string strValue = value as string;
if (strValue != null)
{
- return ColorConverterCommon.ConvertFromString(strValue, culture);
+ return ColorConverterCommon.ConvertFromString(strValue, culture ?? CultureInfo.CurrentCulture);
}
return base.ConvertFrom(context, culture, value);
}
diff --git a/src/System.Composition.AttributedModel/System.Composition.AttributedModel.sln b/src/System.Composition.AttributedModel/System.Composition.AttributedModel.sln
index 7b601b011a..6e89d7b5a9 100644
--- a/src/System.Composition.AttributedModel/System.Composition.AttributedModel.sln
+++ b/src/System.Composition.AttributedModel/System.Composition.AttributedModel.sln
@@ -2,8 +2,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.AttributeModel.Tests", "tests\System.Composition.AttributeModel.Tests.csproj", "{853BB14F-8A5B-42B4-A053-21DE1AEBB335}"
+ ProjectSection(ProjectDependencies) = postProject
+ {C6257381-C624-494A-A9D9-5586E60856EA} = {C6257381-C624-494A-A9D9-5586E60856EA}
+ EndProjectSection
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.AttributedModel", "src\System.Composition.AttributedModel.csproj", "{C6257381-C624-494A-A9D9-5586E60856EA}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1A2F9F4A-A032-433E-B914-ADD5992BB178}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
EndProject
Global
@@ -12,6 +19,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
+ {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
+ {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
+ {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Release|Any CPU.Build.0 = netstandard-Release|Any CPU
{C6257381-C624-494A-A9D9-5586E60856EA}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
{C6257381-C624-494A-A9D9-5586E60856EA}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
{C6257381-C624-494A-A9D9-5586E60856EA}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
@@ -21,6 +32,7 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {853BB14F-8A5B-42B4-A053-21DE1AEBB335} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{C6257381-C624-494A-A9D9-5586E60856EA} = {E107E9C1-E893-4E87-987E-04EF0DCEAEFD}
EndGlobalSection
EndGlobal
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs
index 41e2473458..0c0e86c395 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs
@@ -18,8 +18,7 @@ namespace System.Composition
/// Initializes a new instance of the <see cref="ExportAttribute"/> class, exporting the
/// type or member marked with this attribute under the default contract name.
/// </summary>
- public ExportAttribute()
- : this((string)null, (Type)null)
+ public ExportAttribute() : this(null, null)
{
}
@@ -33,8 +32,7 @@ namespace System.Composition
/// member marked with this attribute, under; or <see langword="null"/> to use the
/// default contract name.
/// </param>
- public ExportAttribute(Type contractType)
- : this((string)null, contractType)
+ public ExportAttribute(Type contractType) : this(null, contractType)
{
}
@@ -43,12 +41,11 @@ namespace System.Composition
/// type or member marked with this attribute under the specified contract name.
/// </summary>
/// <param name="contractName">
- /// A <see cref="String"/> containing the contract name to export the type or member
+ /// A <see cref="string"/> containing the contract name to export the type or member
/// marked with this attribute, under; or <see langword="null"/> or an empty string
/// ("") to use the default contract name.
/// </param>
- public ExportAttribute(string contractName)
- : this(contractName, (Type)null)
+ public ExportAttribute(string contractName) : this(contractName, null)
{
}
@@ -57,7 +54,7 @@ namespace System.Composition
/// type or member marked with this attribute under the specified contract name.
/// </summary>
/// <param name="contractName">
- /// A <see cref="String"/> containing the contract name to export the type or member
+ /// A <see cref="string"/> containing the contract name to export the type or member
/// marked with this attribute, under; or <see langword="null"/> or an empty string
/// ("") to use the default contract name.
/// </param>
@@ -76,10 +73,10 @@ namespace System.Composition
/// Gets the contract name to export the type or member under.
/// </summary>
/// <value>
- /// A <see cref="String"/> containing the contract name to export the type or member
+ /// A <see cref="string"/> containing the contract name to export the type or member
/// marked with this attribute, under. The default value is an empty string ("").
/// </value>
- public string ContractName { get; private set; }
+ public string ContractName { get; }
/// <summary>
/// Get the contract type that is exported by the member that this attribute is attached to.
@@ -89,6 +86,6 @@ namespace System.Composition
/// <see langword="null"/> which means that the type will be obtained by looking at the type on
/// the member that this export is attached to.
/// </value>
- public Type ContractType { get; private set; }
+ public Type ContractType { get; }
}
}
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs
index 4ecba6cb82..6a2de876c2 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs
@@ -17,7 +17,7 @@ namespace System.Composition
/// specified name and metadata value.
/// </summary>
/// <param name="name">
- /// A <see cref="String"/> containing the name of the metadata value; or
+ /// A <see cref="string"/> containing the name of the metadata value; or
/// <see langword="null"/> to set the <see cref="Name"/> property to an empty
/// string ("").
/// </param>
@@ -35,9 +35,9 @@ namespace System.Composition
/// Gets the name of the metadata value.
/// </summary>
/// <value>
- /// A <see cref="String"/> containing the name of the metadata value.
+ /// A <see cref="string"/> containing the name of the metadata value.
/// </value>
- public string Name { get; private set; }
+ public string Name { get; }
/// <summary>
/// Gets the metadata value.
@@ -45,6 +45,6 @@ namespace System.Composition
/// <value>
/// An <see cref="object"/> containing the metadata value.
/// </value>
- public object Value { get; private set; }
+ public object Value { get; }
}
}
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs
index fb190194e1..3d78dda588 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs
@@ -18,8 +18,7 @@ namespace System.Composition
/// Initializes a new instance of the <see cref="ImportAttribute"/> class, importing the
/// export without a contract name.
/// </summary>
- public ImportAttribute()
- : this((string)null)
+ public ImportAttribute() : this(null)
{
}
@@ -28,7 +27,7 @@ namespace System.Composition
/// export with the specified contract name.
/// </summary>
/// <param name="contractName">
- /// A <see cref="String"/> containing the contract name of the export to import, or
+ /// A <see cref="string"/> containing the contract name of the export to import, or
/// <see langword="null"/> or an empty string ("") to use the default contract name.
/// </param>
public ImportAttribute(string contractName)
@@ -40,10 +39,10 @@ namespace System.Composition
/// Gets the contract name of the export to import.
/// </summary>
/// <value>
- /// A <see cref="String"/> containing the contract name of the export to import. The
+ /// A <see cref="string"/> containing the contract name of the export to import. The
/// default value is null.
/// </value>
- public string ContractName { get; private set; }
+ public string ContractName { get; }
/// <summary>
/// Gets or sets a value indicating whether the property, field or parameter will be left
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs
index cfd1aa9118..be29a7cabc 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs
@@ -18,8 +18,7 @@ namespace System.Composition
/// Initializes a new instance of the <see cref="ImportManyAttribute"/> class, importing the
/// set of exports without a contract name.
/// </summary>
- public ImportManyAttribute()
- : this((string)null)
+ public ImportManyAttribute() : this(null)
{
}
@@ -28,7 +27,7 @@ namespace System.Composition
/// set of exports with the specified contract name.
/// </summary>
/// <param name="contractName">
- /// A <see cref="String"/> containing the contract name of the exports to import, or
+ /// A <see cref="string"/> containing the contract name of the exports to import, or
/// <see langword="null"/>.
/// </param>
public ImportManyAttribute(string contractName)
@@ -40,9 +39,9 @@ namespace System.Composition
/// Gets the contract name of the exports to import.
/// </summary>
/// <value>
- /// A <see cref="String"/> containing the contract name of the exports to import. The
+ /// A <see cref="string"/> containing the contract name of the exports to import. The
/// default value is null.
/// </value>
- public string ContractName { get; private set; }
+ public string ContractName { get; }
}
}
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs
index 1fd8f0e34f..f8a9562c6e 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs
@@ -10,9 +10,6 @@ namespace System.Composition
[AttributeUsage(AttributeTargets.Property, Inherited = false)]
public sealed class ImportMetadataConstraintAttribute : Attribute
{
- private readonly string _name;
- private readonly object _value;
-
/// <summary>
/// Require a specific metadata value on the exporter.
/// </summary>
@@ -20,18 +17,18 @@ namespace System.Composition
/// <param name="value">The value to match.</param>
public ImportMetadataConstraintAttribute(string name, object value)
{
- _name = name;
- _value = value;
+ Name = name;
+ Value = value;
}
/// <summary>
/// The metadata key to match.
/// </summary>
- public string Name { get { return _name; } }
+ public string Name { get; }
/// <summary>
/// The value to match.
/// </summary>
- public object Value { get { return _value; } }
+ public object Value { get; }
}
}
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs
index 61bfc4ca4c..f77194d64c 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs
@@ -15,7 +15,7 @@ namespace System.Composition
/// specified name and metadata value.
/// </summary>
/// <param name="name">
- /// A <see cref="String"/> containing the name of the metadata value; or
+ /// A <see cref="string"/> containing the name of the metadata value; or
/// <see langword="null"/> to use an empty string ("").
/// </param>
/// <param name="value">
@@ -24,9 +24,7 @@ namespace System.Composition
/// </param>
public PartMetadataAttribute(string name, object value)
{
- if (name == null) throw new ArgumentNullException(nameof(name));
-
- Name = name;
+ Name = name ?? throw new ArgumentNullException(nameof(name));
Value = value;
}
@@ -34,9 +32,9 @@ namespace System.Composition
/// Gets the name of the metadata value.
/// </summary>
/// <value>
- /// A <see cref="String"/> containing the name of the metadata value.
+ /// A <see cref="string"/> containing the name of the metadata value.
/// </value>
- public string Name { get; private set; }
+ public string Name { get; }
/// <summary>
/// Gets the metadata value.
@@ -44,6 +42,6 @@ namespace System.Composition
/// <value>
/// An <see cref="object"/> containing the metadata value.
/// </value>
- public object Value { get; private set; }
+ public object Value { get; }
}
}
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs
index d3b08973c6..5c9f3f9b24 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs
@@ -21,8 +21,7 @@ namespace System.Composition
/// <summary>
/// Mark a part as globally shared.
/// </summary>
- public SharedAttribute()
- : base(SharingBoundaryPartMetadataName, null)
+ public SharedAttribute() : base(SharingBoundaryPartMetadataName, null)
{
}
@@ -31,14 +30,13 @@ namespace System.Composition
/// boundary name.
/// </summary>
/// <param name="sharingBoundaryName">The boundary outside of which this part is inaccessible.</param>
- public SharedAttribute(string sharingBoundaryName)
- : base(SharingBoundaryPartMetadataName, sharingBoundaryName)
+ public SharedAttribute(string sharingBoundaryName) : base(SharingBoundaryPartMetadataName, sharingBoundaryName)
{
}
/// <summary>
/// he boundary outside of which this part is inaccessible.
/// </summary>
- public string SharingBoundary { get { return (string)base.Value; } }
+ public string SharingBoundary => (string)base.Value;
}
}
diff --git a/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs
index e30e3a5899..73dd009691 100644
--- a/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs
+++ b/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs
@@ -30,14 +30,12 @@ namespace System.Composition
/// <param name="sharingBoundaryNames">Boundaries implemented by the created ExportLifetimeContext{T}s.</param>
public SharingBoundaryAttribute(params string[] sharingBoundaryNames)
{
- if (sharingBoundaryNames == null) throw new ArgumentNullException(nameof(sharingBoundaryNames));
-
- _sharingBoundaryNames = sharingBoundaryNames;
+ _sharingBoundaryNames = sharingBoundaryNames ?? throw new ArgumentNullException(nameof(sharingBoundaryNames));
}
/// <summary>
/// Boundaries implemented by the created ExportLifetimeContext{T}s.
/// </summary>
- public ReadOnlyCollection<string> SharingBoundaryNames { get { return new ReadOnlyCollection<string>(_sharingBoundaryNames); } }
+ public ReadOnlyCollection<string> SharingBoundaryNames => new ReadOnlyCollection<string>(_sharingBoundaryNames);
}
}
diff --git a/src/System.Composition.AttributedModel/tests/Configurations.props b/src/System.Composition.AttributedModel/tests/Configurations.props
new file mode 100644
index 0000000000..c398e42e89
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/Configurations.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <BuildConfigurations>
+ netstandard;
+ </BuildConfigurations>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/src/System.Composition.AttributedModel/tests/ExportAttributeTests.cs b/src/System.Composition.AttributedModel/tests/ExportAttributeTests.cs
new file mode 100644
index 0000000000..6f60815f84
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/ExportAttributeTests.cs
@@ -0,0 +1,49 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class ExportAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new ExportAttribute();
+ Assert.Null(attribute.ContractName);
+ Assert.Null(attribute.ContractType);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("ContractName")]
+ public void Ctor_ContractName(string contractName)
+ {
+ var attribute = new ExportAttribute(contractName);
+ Assert.Equal(contractName, attribute.ContractName);
+ Assert.Null(attribute.ContractType);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData(typeof(string))]
+ public void Ctor_ContractName(Type contractType)
+ {
+ var attribute = new ExportAttribute(contractType);
+ Assert.Null(attribute.ContractName);
+ Assert.Equal(contractType, attribute.ContractType);
+ }
+
+ [Theory]
+ [InlineData(null, null)]
+ [InlineData("ContractName", typeof(string))]
+ public void Ctor_ContractName_ContractType(string contractName, Type contractType)
+ {
+ var attribute = new ExportAttribute(contractName, contractType);
+ Assert.Equal(contractName, attribute.ContractName);
+ Assert.Equal(contractType, attribute.ContractType);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/ExportMetadataAttributeTests.cs b/src/System.Composition.AttributedModel/tests/ExportMetadataAttributeTests.cs
new file mode 100644
index 0000000000..bede1bca1f
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/ExportMetadataAttributeTests.cs
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class ExportMetadataAttributeTests
+ {
+ [Theory]
+ [InlineData(null, null)]
+ [InlineData("Name", "Value")]
+ public void Ctor_Name_Value(string name, string value)
+ {
+ var attribute = new ExportMetadataAttribute(name, value);
+ Assert.Equal(name ?? string.Empty, attribute.Name);
+ Assert.Equal(value, attribute.Value);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/ImportAttributeTests.cs b/src/System.Composition.AttributedModel/tests/ImportAttributeTests.cs
new file mode 100644
index 0000000000..dbbb00bdb5
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/ImportAttributeTests.cs
@@ -0,0 +1,27 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class ImportAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new ImportAttribute();
+ Assert.Null(attribute.ContractName);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("ContractName")]
+ public void Ctor_ContractName(string contractName)
+ {
+ var attribute = new ImportAttribute(contractName);
+ Assert.Equal(contractName, attribute.ContractName);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/ImportManyAttributeTests.cs b/src/System.Composition.AttributedModel/tests/ImportManyAttributeTests.cs
new file mode 100644
index 0000000000..7a362f2faf
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/ImportManyAttributeTests.cs
@@ -0,0 +1,27 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class ImportManyAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new ImportManyAttribute();
+ Assert.Null(attribute.ContractName);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("ContractName")]
+ public void Ctor_ContractName(string contractName)
+ {
+ var attribute = new ImportManyAttribute(contractName);
+ Assert.Equal(contractName, attribute.ContractName);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/ImportMetadataConstraintAttributeTests.cs b/src/System.Composition.AttributedModel/tests/ImportMetadataConstraintAttributeTests.cs
new file mode 100644
index 0000000000..2f7d20d8f7
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/ImportMetadataConstraintAttributeTests.cs
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class ImportMetadataConstraintAttributeTests
+ {
+ [Theory]
+ [InlineData(null, null)]
+ [InlineData("Name", "Value")]
+ public void Ctor_Name_Value(string name, string value)
+ {
+ var attribute = new ImportMetadataConstraintAttribute(name, value);
+ Assert.Equal(name, attribute.Name);
+ Assert.Equal(value, attribute.Value);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/ImportingConstructorAttributeTests.cs b/src/System.Composition.AttributedModel/tests/ImportingConstructorAttributeTests.cs
new file mode 100644
index 0000000000..9df14b4bfa
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/ImportingConstructorAttributeTests.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class ImportingConstructorAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new ImportingConstructorAttribute();
+ Assert.Equal(typeof(ImportingConstructorAttribute), attribute.TypeId);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/MetadataAttributeAttributeTests.cs b/src/System.Composition.AttributedModel/tests/MetadataAttributeAttributeTests.cs
new file mode 100644
index 0000000000..0dfa8f280a
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/MetadataAttributeAttributeTests.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class MetadataAttributeAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new MetadataAttributeAttribute();
+ Assert.Equal(typeof(MetadataAttributeAttribute), attribute.TypeId);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/PartMetadataAttributeTests.cs b/src/System.Composition.AttributedModel/tests/PartMetadataAttributeTests.cs
new file mode 100644
index 0000000000..0d353c1aed
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/PartMetadataAttributeTests.cs
@@ -0,0 +1,27 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class PartMetadataAttributeTests
+ {
+ [Theory]
+ [InlineData("", null)]
+ [InlineData("Name", "Value")]
+ public void Ctor_Name_Value(string name, string value)
+ {
+ var attribute = new PartMetadataAttribute(name, value);
+ Assert.Equal(name, attribute.Name);
+ Assert.Equal(value, attribute.Value);
+ }
+
+ [Fact]
+ public void Ctor_NullName_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("name", () => new PartMetadataAttribute(null, "value"));
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/PartNotDiscoverableAttributeTests.cs b/src/System.Composition.AttributedModel/tests/PartNotDiscoverableAttributeTests.cs
new file mode 100644
index 0000000000..074a4072b5
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/PartNotDiscoverableAttributeTests.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class PartNotDiscoverableAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new PartNotDiscoverableAttribute();
+ Assert.Equal(typeof(PartNotDiscoverableAttribute), attribute.TypeId);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/SharedAttributeTests.cs b/src/System.Composition.AttributedModel/tests/SharedAttributeTests.cs
new file mode 100644
index 0000000000..0dfdf0e205
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/SharedAttributeTests.cs
@@ -0,0 +1,31 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class SharedAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new SharedAttribute();
+ Assert.Null(attribute.SharingBoundary);
+ Assert.Equal("SharingBoundary", attribute.Name);
+ Assert.Null(attribute.Value);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("Name")]
+ public void Ctor_SharingBoundaryName(string sharingBoundaryName)
+ {
+ var attribute = new SharedAttribute(sharingBoundaryName);
+ Assert.Equal(sharingBoundaryName, attribute.SharingBoundary);
+ Assert.Equal("SharingBoundary", attribute.Name);
+ Assert.Equal(sharingBoundaryName, attribute.Value);
+ }
+ }
+}
diff --git a/src/System.Composition.AttributedModel/tests/SharingBoundaryAttributeTests.cs b/src/System.Composition.AttributedModel/tests/SharingBoundaryAttributeTests.cs
new file mode 100644
index 0000000000..bffb562821
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/SharingBoundaryAttributeTests.cs
@@ -0,0 +1,33 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using Xunit;
+
+namespace System.Composition.Tests
+{
+ public class SharingBoundaryAttributeTests
+ {
+ public static IEnumerable<object[]> SharingBoundaryNames_TestData()
+ {
+ yield return new object[] { new string[0] };
+ yield return new object[] { new string[] { "1", null, "2" } };
+ }
+
+ [Theory]
+ [MemberData(nameof(SharingBoundaryNames_TestData))]
+ public void Ctor_SharingBoundaryNames(string[] sharingBoundaryNames)
+ {
+ var attribute = new SharingBoundaryAttribute(sharingBoundaryNames);
+ Assert.Equal(sharingBoundaryNames, attribute.SharingBoundaryNames);
+ }
+
+ [Fact]
+ public void Ctor_NullSharingBoundaryNames_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("sharingBoundaryNames", () => new SharingBoundaryAttribute(null));
+ }
+ }
+}
+
diff --git a/src/System.Composition.AttributedModel/tests/System.Composition.AttributeModel.Tests.csproj b/src/System.Composition.AttributedModel/tests/System.Composition.AttributeModel.Tests.csproj
new file mode 100644
index 0000000000..584f4187cd
--- /dev/null
+++ b/src/System.Composition.AttributedModel/tests/System.Composition.AttributeModel.Tests.csproj
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <ProjectGuid>{853BB14F-8A5B-42B4-A053-21DE1AEBB335}</ProjectGuid>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
+ <ItemGroup>
+ <Compile Include="SharingBoundaryAttributeTests.cs" />
+ <Compile Include="SharedAttributeTests.cs" />
+ <Compile Include="PartNotDiscoverableAttributeTests.cs" />
+ <Compile Include="PartMetadataAttributeTests.cs" />
+ <Compile Include="MetadataAttributeAttributeTests.cs" />
+ <Compile Include="ImportMetadataConstraintAttributeTests.cs" />
+ <Compile Include="ImportManyAttributeTests.cs" />
+ <Compile Include="ImportingConstructorAttributeTests.cs" />
+ <Compile Include="ImportAttributeTests.cs" />
+ <Compile Include="ExportMetadataAttributeTests.cs" />
+ <Compile Include="ExportAttributeTests.cs" />
+ <Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
+ <Link>Common\System\AssertExtensions.cs</Link>
+ </Compile>
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/src/System.Composition.Convention/System.Composition.Convention.sln b/src/System.Composition.Convention/System.Composition.Convention.sln
index a0ae890b10..d11a0e6490 100644
--- a/src/System.Composition.Convention/System.Composition.Convention.sln
+++ b/src/System.Composition.Convention/System.Composition.Convention.sln
@@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Convention.Tests", "tests\System.Composition.Convention.Tests.csproj", "{853BB14F-8A5B-42B4-A053-21DE1AEBB335}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Convention.Tests", "tests\System.Composition.Convention.Tests.csproj", "{17DBE1D4-FCB5-4D55-805C-C4A22EE8C032}"
ProjectSection(ProjectDependencies) = postProject
{E6592FAD-10B5-4B56-9287-D72DD136992F} = {E6592FAD-10B5-4B56-9287-D72DD136992F}
EndProjectSection
@@ -19,10 +19,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
- {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
- {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
- {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
+ {17DBE1D4-FCB5-4D55-805C-C4A22EE8C032}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
+ {17DBE1D4-FCB5-4D55-805C-C4A22EE8C032}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
+ {17DBE1D4-FCB5-4D55-805C-C4A22EE8C032}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
+ {17DBE1D4-FCB5-4D55-805C-C4A22EE8C032}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
{E6592FAD-10B5-4B56-9287-D72DD136992F}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
{E6592FAD-10B5-4B56-9287-D72DD136992F}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
{E6592FAD-10B5-4B56-9287-D72DD136992F}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
@@ -32,7 +32,7 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {853BB14F-8A5B-42B4-A053-21DE1AEBB335} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
+ {17DBE1D4-FCB5-4D55-805C-C4A22EE8C032} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{E6592FAD-10B5-4B56-9287-D72DD136992F} = {E107E9C1-E893-4E87-987E-04EF0DCEAEFD}
EndGlobalSection
EndGlobal
diff --git a/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj b/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj
index c71c4ad55a..58e99826ad 100644
--- a/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj
+++ b/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj
@@ -2,7 +2,7 @@
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
<PropertyGroup>
- <ProjectGuid>{853BB14F-8A5B-42B4-A053-21DE1AEBB335}</ProjectGuid>
+ <ProjectGuid>{17DBE1D4-FCB5-4D55-805C-C4A22EE8C032}</ProjectGuid>
<RootNamespace>ConventionsUnitTests</RootNamespace>
<AssemblyName>System.Composition.Convention.Tests</AssemblyName>
</PropertyGroup>
diff --git a/src/System.Composition.Runtime/System.Composition.Runtime.sln b/src/System.Composition.Runtime/System.Composition.Runtime.sln
index 60c084fc2e..fd6f5880d8 100644
--- a/src/System.Composition.Runtime/System.Composition.Runtime.sln
+++ b/src/System.Composition.Runtime/System.Composition.Runtime.sln
@@ -2,8 +2,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Runtime.Tests", "tests\System.Composition.Runtime.Tests.csproj", "{52BE9F68-69EC-44AA-806E-11EFB57D9B4B}"
+ ProjectSection(ProjectDependencies) = postProject
+ {2711DFD2-8541-4628-BC53-EB784A14CDCF} = {2711DFD2-8541-4628-BC53-EB784A14CDCF}
+ EndProjectSection
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Runtime", "src\System.Composition.Runtime.csproj", "{2711DFD2-8541-4628-BC53-EB784A14CDCF}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1A2F9F4A-A032-433E-B914-ADD5992BB178}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
EndProject
Global
@@ -12,6 +19,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {52BE9F68-69EC-44AA-806E-11EFB57D9B4B}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
+ {52BE9F68-69EC-44AA-806E-11EFB57D9B4B}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
+ {52BE9F68-69EC-44AA-806E-11EFB57D9B4B}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
+ {52BE9F68-69EC-44AA-806E-11EFB57D9B4B}.Release|Any CPU.Build.0 = netstandard-Release|Any CPU
{2711DFD2-8541-4628-BC53-EB784A14CDCF}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
{2711DFD2-8541-4628-BC53-EB784A14CDCF}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
{2711DFD2-8541-4628-BC53-EB784A14CDCF}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
@@ -21,6 +32,7 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {52BE9F68-69EC-44AA-806E-11EFB57D9B4B} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{2711DFD2-8541-4628-BC53-EB784A14CDCF} = {E107E9C1-E893-4E87-987E-04EF0DCEAEFD}
EndGlobalSection
EndGlobal
diff --git a/src/System.Composition.Runtime/tests/Configurations.props b/src/System.Composition.Runtime/tests/Configurations.props
new file mode 100644
index 0000000000..c398e42e89
--- /dev/null
+++ b/src/System.Composition.Runtime/tests/Configurations.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <BuildConfigurations>
+ netstandard;
+ </BuildConfigurations>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/src/System.Composition.Runtime/tests/System.Composition.Runtime.Tests.csproj b/src/System.Composition.Runtime/tests/System.Composition.Runtime.Tests.csproj
new file mode 100644
index 0000000000..f77391e66d
--- /dev/null
+++ b/src/System.Composition.Runtime/tests/System.Composition.Runtime.Tests.csproj
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <ProjectGuid>{52BE9F68-69EC-44AA-806E-11EFB57D9B4B}</ProjectGuid>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
+ <ItemGroup>
+ <Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
+ <Link>Common\System\AssertExtensions.cs</Link>
+ </Compile>
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/src/System.Composition.TypedParts/System.Composition.TypedParts.sln b/src/System.Composition.TypedParts/System.Composition.TypedParts.sln
index 455fef15ec..0d36663c26 100644
--- a/src/System.Composition.TypedParts/System.Composition.TypedParts.sln
+++ b/src/System.Composition.TypedParts/System.Composition.TypedParts.sln
@@ -4,6 +4,8 @@ VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.TypedParts", "src\System.Composition.TypedParts.csproj", "{B4B5E15C-E6B9-48EA-94C2-F067484D4D3E}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1A2F9F4A-A032-433E-B914-ADD5992BB178}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
EndProject
Global
diff --git a/src/System.Configuration.ConfigurationManager/tests/Mono/ConfigurationSectionGroupTest.cs b/src/System.Configuration.ConfigurationManager/tests/Mono/ConfigurationSectionGroupTest.cs
index 758511c8ff..2cba684d54 100644
--- a/src/System.Configuration.ConfigurationManager/tests/Mono/ConfigurationSectionGroupTest.cs
+++ b/src/System.Configuration.ConfigurationManager/tests/Mono/ConfigurationSectionGroupTest.cs
@@ -46,6 +46,7 @@ namespace MonoTests.System.Configuration
}
[Fact]
+ [ActiveIssue(21000, TargetFrameworkMonikers.UapAot)]
public void EditAfterAdd()
{
Config cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
diff --git a/src/System.Configuration.ConfigurationManager/tests/Mono/TestUtil.cs b/src/System.Configuration.ConfigurationManager/tests/Mono/TestUtil.cs
index 8153da0f0a..548ffc9614 100644
--- a/src/System.Configuration.ConfigurationManager/tests/Mono/TestUtil.cs
+++ b/src/System.Configuration.ConfigurationManager/tests/Mono/TestUtil.cs
@@ -58,8 +58,8 @@ namespace MonoTests.System.Configuration.Util
{
get
{
- var asm = Assembly.GetEntryAssembly();
- return asm.Location;
+ return Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
+ Assembly.GetEntryAssembly().ManifestModule.Name);
}
}
@@ -67,8 +67,7 @@ namespace MonoTests.System.Configuration.Util
{
get
{
- var exe = Path.GetFileName(ThisApplicationPath);
- return exe + ".config";
+ return Assembly.GetEntryAssembly().ManifestModule.Name + ".config";
}
}
}
diff --git a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/ConfigurationElementCollectionTests.cs b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/ConfigurationElementCollectionTests.cs
index cd3345f3f0..d204487f59 100644
--- a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/ConfigurationElementCollectionTests.cs
+++ b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/ConfigurationElementCollectionTests.cs
@@ -47,6 +47,7 @@ namespace System.ConfigurationTests
}
[Fact]
+ [ActiveIssue(21004, TargetFrameworkMonikers.UapAot)]
public void NullComparerThrows()
{
Assert.Equal("comparer", Assert.Throws<ArgumentNullException>(() => new SimpleCollection(null)).ParamName);
diff --git a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/SectionGroupsTests.cs b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/SectionGroupsTests.cs
index 35611f0e1b..89bb630bb2 100644
--- a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/SectionGroupsTests.cs
+++ b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/SectionGroupsTests.cs
@@ -54,6 +54,7 @@ namespace System.ConfigurationTests
[Fact]
[ActiveIssue("dotnet/corefx #19383", TargetFrameworkMonikers.NetFramework)]
+ [ActiveIssue(21000, TargetFrameworkMonikers.UapAot)]
public void SimpleSectionGroup()
{
using (var temp = new TempConfig(SimpleSectionGroupConfiguration))
@@ -67,4 +68,4 @@ namespace System.ConfigurationTests
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/TimeSpanValidatorAttributeTests.cs b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/TimeSpanValidatorAttributeTests.cs
index 651deed5d7..4c9ae4abb2 100644
--- a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/TimeSpanValidatorAttributeTests.cs
+++ b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/TimeSpanValidatorAttributeTests.cs
@@ -111,6 +111,7 @@ namespace System.ConfigurationTests
}
[Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot,"Exception messages are different")]
public void MinValueString_TooSmall()
{
TimeSpanValidatorAttribute attribute = new TimeSpanValidatorAttribute();
@@ -122,6 +123,7 @@ namespace System.ConfigurationTests
}
[Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "Exception messages are different")]
public void MaxValueString_TooBig()
{
TimeSpanValidatorAttribute attribute = new TimeSpanValidatorAttribute();
@@ -132,4 +134,4 @@ namespace System.ConfigurationTests
Assert.Equal(expectedException.Message, result.Message);
}
}
-} \ No newline at end of file
+}
diff --git a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/UriSectionTests.cs b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/UriSectionTests.cs
index 8a000386b0..d31a9434d5 100644
--- a/src/System.Configuration.ConfigurationManager/tests/System/Configuration/UriSectionTests.cs
+++ b/src/System.Configuration.ConfigurationManager/tests/System/Configuration/UriSectionTests.cs
@@ -39,6 +39,7 @@ namespace System.ConfigurationTests
</configuration>";
[Fact]
+ [ActiveIssue(21000, TargetFrameworkMonikers.UapAot)]
public void UriSectionIdnIriParsing()
{
using (var temp = new TempConfig(PlatformDetection.IsFullFramework ? UriSectionConfiguration_NetFX : UriSectionConfiguration_Core))
@@ -51,6 +52,7 @@ namespace System.ConfigurationTests
}
[Fact]
+ [ActiveIssue(21000, TargetFrameworkMonikers.UapAot)]
public void UriSectionSchemeSettings()
{
using (var temp = new TempConfig(PlatformDetection.IsFullFramework ? UriSectionConfiguration_NetFX : UriSectionConfiguration_Core))
@@ -64,4 +66,4 @@ namespace System.ConfigurationTests
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 931b673fcf..0000000000
--- a/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,28 +0,0 @@
-kernel32.dll!Beep
-kernel32.dll!GetConsoleCursorInfo
-kernel32.dll!SetConsoleCursorInfo
-kernel32.dll!FillConsoleOutputAttribute
-kernel32.dll!FillConsoleOutputCharacterW
-kernel32.dll!GetConsoleScreenBufferInfo
-kernel32.dll!GetConsoleCP
-kernel32.dll!GetConsoleTitleW
-kernel32.dll!GetConsoleMode
-kernel32.dll!SetConsoleMode
-kernel32.dll!GetConsoleOutputCP
-kernel32.dll!GetLargestConsoleWindowSize
-kernel32.dll!GetStdHandle
-kernel32.dll!PeekConsoleInputW
-kernel32.dll!ReadConsoleW
-kernel32.dll!ReadConsoleInputW
-kernel32.dll!ReadConsoleOutputW
-kernel32.dll!SetConsoleCP
-kernel32.dll!SetConsoleCtrlHandler
-kernel32.dll!SetConsoleCursorPosition
-kernel32.dll!SetConsoleOutputCP
-kernel32.dll!SetConsoleScreenBufferSize
-kernel32.dll!SetConsoleTextAttribute
-kernel32.dll!SetConsoleWindowInfo
-kernel32.dll!SetConsoleTitleW
-kernel32.dll!WriteConsoleW
-kernel32.dll!WriteConsoleOutputW
-user32.dll!GetKeyState \ No newline at end of file
diff --git a/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp b/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp
new file mode 100644
index 0000000000..2e448cefb0
--- /dev/null
+++ b/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp
@@ -0,0 +1,2 @@
+# Windows are adding to OneCore
+user32.dll!GetKeyState \ No newline at end of file
diff --git a/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.uap b/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
new file mode 100644
index 0000000000..acc87f2e33
--- /dev/null
+++ b/src/System.Console/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -0,0 +1,2 @@
+# Windows are adding to WACK and OneCore
+user32.dll!GetKeyState \ No newline at end of file
diff --git a/src/System.Console/tests/System.Console.Tests.csproj b/src/System.Console/tests/System.Console.Tests.csproj
index c10c8f5b28..7729b83ea5 100644
--- a/src/System.Console/tests/System.Console.Tests.csproj
+++ b/src/System.Console/tests/System.Console.Tests.csproj
@@ -40,12 +40,6 @@
<Compile Include="$(CommonTestPath)\System\IO\InterceptStreamWriter.cs">
<Link>Common\System\IO\InterceptStreamWriter.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\ShouldNotBeInvokedException.cs">
<Link>Common\System\ShouldNotBeInvokedException.cs</Link>
</Compile>
diff --git a/src/System.Data.Common/src/System/Data/Common/AdapterUtil.Common.cs b/src/System.Data.Common/src/System/Data/Common/AdapterUtil.Common.cs
index 95c97eca7c..075fb749d3 100644
--- a/src/System.Data.Common/src/System/Data/Common/AdapterUtil.Common.cs
+++ b/src/System.Data.Common/src/System/Data/Common/AdapterUtil.Common.cs
@@ -38,12 +38,6 @@ namespace System.Data.Common
TraceException("<comm.ADP.TraceException|ERR|CATCH> '{0}'", e);
}
- internal static void TraceExceptionWithoutRethrow(Exception e)
- {
- Debug.Assert(IsCatchableExceptionType(e), "Invalid exception type, should have been re-thrown!");
- TraceException("<comm.ADP.TraceException|ERR|CATCH> '{0}'", e);
- }
-
internal static DataException Data(string message)
{
DataException e = new DataException(message);
@@ -70,11 +64,6 @@ namespace System.Data.Common
// Invalid Enumeration
- internal static ArgumentOutOfRangeException NotSupportedEnumerationValue(Type type, string value, string method)
- {
- return ArgumentOutOfRange(SR.Format(SR.ADP_NotSupportedEnumerationValue, type.Name, value, method), type.Name);
- }
-
internal static ArgumentOutOfRangeException InvalidAcceptRejectRule(AcceptRejectRule value)
{
#if DEBUG
diff --git a/src/System.Data.Common/src/System/Data/DataTable.cs b/src/System.Data.Common/src/System/Data/DataTable.cs
index fde12ccac1..9f3b04d44b 100644
--- a/src/System.Data.Common/src/System/Data/DataTable.cs
+++ b/src/System.Data.Common/src/System/Data/DataTable.cs
@@ -6702,7 +6702,7 @@ namespace System.Data
//
// do not allocate TLS data in RETAIL bits!
[ThreadStatic]
- internal static List<DataTable> s_usedTables;
+ internal static List<DataTable> t_usedTables;
#endif //DEBUG
private DataTable _targetTable;
@@ -6713,14 +6713,14 @@ namespace System.Data
Debug.Assert(table != null);
Debug.Assert(table._rowDiffId == null, "rowDiffId wasn't previously cleared");
#if DEBUG
- Debug.Assert(s_usedTables == null || !s_usedTables.Contains(table),
+ Debug.Assert(t_usedTables == null || !t_usedTables.Contains(table),
"Nested call with same table can cause data corruption!");
#endif
#if DEBUG
- if (s_usedTables == null)
- s_usedTables = new List<DataTable>();
- s_usedTables.Add(table);
+ if (t_usedTables == null)
+ t_usedTables = new List<DataTable>();
+ t_usedTables.Add(table);
#endif
_targetTable = table;
table._rowDiffId = null;
@@ -6733,12 +6733,12 @@ namespace System.Data
if (_targetTable != null)
{
#if DEBUG
- Debug.Assert(s_usedTables != null && s_usedTables.Contains(_targetTable), "missing Prepare before Cleanup");
- if (s_usedTables != null)
+ Debug.Assert(t_usedTables != null && t_usedTables.Contains(_targetTable), "missing Prepare before Cleanup");
+ if (t_usedTables != null)
{
- s_usedTables.Remove(_targetTable);
- if (s_usedTables.Count == 0)
- s_usedTables = null;
+ t_usedTables.Remove(_targetTable);
+ if (t_usedTables.Count == 0)
+ t_usedTables = null;
}
#endif
_targetTable._rowDiffId = null;
@@ -6750,8 +6750,8 @@ namespace System.Data
{
#if DEBUG
// this code asserts scope was created, but it does not assert that the table was included in it
- // note that in case of DataSet, new tables might be added to the list in which case they won't appear in s_usedTables.
- Debug.Assert(s_usedTables != null, message);
+ // note that in case of DataSet, new tables might be added to the list in which case they won't appear in t_usedTables.
+ Debug.Assert(t_usedTables != null, message);
#endif
}
}
@@ -6769,15 +6769,15 @@ namespace System.Data
#if DEBUG
// initialize list of tables out of current tables
// note: it might remain empty (still initialization is needed for assert to operate)
- if (RowDiffIdUsageSection.s_usedTables == null)
- RowDiffIdUsageSection.s_usedTables = new List<DataTable>();
+ if (RowDiffIdUsageSection.t_usedTables == null)
+ RowDiffIdUsageSection.t_usedTables = new List<DataTable>();
#endif
for (int tableIndex = 0; tableIndex < ds.Tables.Count; ++tableIndex)
{
DataTable table = ds.Tables[tableIndex];
#if DEBUG
- Debug.Assert(!RowDiffIdUsageSection.s_usedTables.Contains(table), "Nested call with same table can cause data corruption!");
- RowDiffIdUsageSection.s_usedTables.Add(table);
+ Debug.Assert(!RowDiffIdUsageSection.t_usedTables.Contains(table), "Nested call with same table can cause data corruption!");
+ RowDiffIdUsageSection.t_usedTables.Add(table);
#endif
Debug.Assert(table._rowDiffId == null, "rowDiffId wasn't previously cleared");
table._rowDiffId = null;
@@ -6791,7 +6791,7 @@ namespace System.Data
if (_targetDS != null)
{
#if DEBUG
- Debug.Assert(RowDiffIdUsageSection.s_usedTables != null, "missing Prepare before Cleanup");
+ Debug.Assert(RowDiffIdUsageSection.t_usedTables != null, "missing Prepare before Cleanup");
#endif
for (int tableIndex = 0; tableIndex < _targetDS.Tables.Count; ++tableIndex)
@@ -6800,14 +6800,14 @@ namespace System.Data
#if DEBUG
// cannot assert that table exists in the usedTables - new tables might be
// created during diffgram processing in DataSet.ReadXml.
- if (RowDiffIdUsageSection.s_usedTables != null)
- RowDiffIdUsageSection.s_usedTables.Remove(table);
+ if (RowDiffIdUsageSection.t_usedTables != null)
+ RowDiffIdUsageSection.t_usedTables.Remove(table);
#endif
table._rowDiffId = null;
}
#if DEBUG
- if (RowDiffIdUsageSection.s_usedTables != null && RowDiffIdUsageSection.s_usedTables.Count == 0)
- RowDiffIdUsageSection.s_usedTables = null; // out-of-scope
+ if (RowDiffIdUsageSection.t_usedTables != null && RowDiffIdUsageSection.t_usedTables.Count == 0)
+ RowDiffIdUsageSection.t_usedTables = null; // out-of-scope
#endif
}
}
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLBoolean.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLBoolean.cs
index 63dab0ba45..25ef236899 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLBoolean.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLBoolean.cs
@@ -18,7 +18,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlBoolean : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLByte.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLByte.cs
index f22d69671c..b9110b5eb0 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLByte.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLByte.cs
@@ -18,7 +18,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlByte : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLDateTime.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLDateTime.cs
index e5febff15d..13436850b8 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLDateTime.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLDateTime.cs
@@ -21,7 +21,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlDateTime : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLDouble.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLDouble.cs
index 9964e85f9d..506a0064dc 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLDouble.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLDouble.cs
@@ -19,7 +19,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlDouble : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLGuid.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLGuid.cs
index 32899c7cae..5e1839be43 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLGuid.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLGuid.cs
@@ -16,7 +16,7 @@ namespace System.Data.SqlTypes
[Serializable]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlGuid : INullable, IComparable, IXmlSerializable
{
@@ -27,13 +27,13 @@ namespace System.Data.SqlTypes
{10, 11, 12, 13, 14, 15, 8, 9, 6, 7, 4, 5, 0, 1, 2, 3};
// NOTE: If any instance fields change, update SqlTypeWorkarounds type in System.Data.SqlClient.
- private byte[] _value; // the SqlGuid is null if m_value is null
+ private byte[] m_value; // the SqlGuid is null if m_value is null
// constructor
// construct a SqlGuid.Null
private SqlGuid(bool fNull)
{
- _value = null;
+ m_value = null;
}
public SqlGuid(byte[] value)
@@ -41,8 +41,8 @@ namespace System.Data.SqlTypes
if (value == null || value.Length != s_sizeOfGuid)
throw new ArgumentException(SQLResource.InvalidArraySizeMessage);
- _value = new byte[s_sizeOfGuid];
- value.CopyTo(_value, 0);
+ m_value = new byte[s_sizeOfGuid];
+ value.CopyTo(m_value, 0);
}
internal SqlGuid(byte[] value, bool ignored)
@@ -50,17 +50,17 @@ namespace System.Data.SqlTypes
if (value == null || value.Length != s_sizeOfGuid)
throw new ArgumentException(SQLResource.InvalidArraySizeMessage);
- _value = value;
+ m_value = value;
}
public SqlGuid(string s)
{
- _value = (new Guid(s)).ToByteArray();
+ m_value = (new Guid(s)).ToByteArray();
}
public SqlGuid(Guid g)
{
- _value = g.ToByteArray();
+ m_value = g.ToByteArray();
}
public SqlGuid(int a, short b, short c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k)
@@ -72,7 +72,7 @@ namespace System.Data.SqlTypes
// INullable
public bool IsNull
{
- get { return (_value == null); }
+ get { return (m_value == null); }
}
// property: Value
@@ -83,7 +83,7 @@ namespace System.Data.SqlTypes
if (IsNull)
throw new SqlNullValueException();
else
- return new Guid(_value);
+ return new Guid(m_value);
}
}
@@ -102,7 +102,7 @@ namespace System.Data.SqlTypes
public byte[] ToByteArray()
{
byte[] ret = new byte[s_sizeOfGuid];
- _value.CopyTo(ret, 0);
+ m_value.CopyTo(ret, 0);
return ret;
}
@@ -111,7 +111,7 @@ namespace System.Data.SqlTypes
if (IsNull)
return SQLResource.NullString;
- Guid g = new Guid(_value);
+ Guid g = new Guid(m_value);
return g.ToString();
}
@@ -132,8 +132,8 @@ namespace System.Data.SqlTypes
{
byte b1, b2;
- b1 = x._value[s_rgiGuidOrder[i]];
- b2 = y._value[s_rgiGuidOrder[i]];
+ b1 = x.m_value[s_rgiGuidOrder[i]];
+ b2 = y.m_value[s_rgiGuidOrder[i]];
if (b1 != b2)
return (b1 < b2) ? EComparison.LT : EComparison.GT;
}
@@ -313,11 +313,11 @@ namespace System.Data.SqlTypes
{
// Read the next value.
reader.ReadElementString();
- _value = null;
+ m_value = null;
}
else
{
- _value = new Guid(reader.ReadElementString()).ToByteArray();
+ m_value = new Guid(reader.ReadElementString()).ToByteArray();
}
}
@@ -329,7 +329,7 @@ namespace System.Data.SqlTypes
}
else
{
- writer.WriteString(XmlConvert.ToString(new Guid(_value)));
+ writer.WriteString(XmlConvert.ToString(new Guid(m_value)));
}
}
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt16.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt16.cs
index a9a24d88a9..82308b5451 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt16.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt16.cs
@@ -17,7 +17,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlInt16 : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt32.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt32.cs
index 984f458037..c2da03eead 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt32.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt32.cs
@@ -17,7 +17,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlInt32 : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt64.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt64.cs
index 7daafc683d..77db898322 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt64.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLInt64.cs
@@ -18,7 +18,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlInt64 : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Common/src/System/Data/SQLTypes/SQLString.cs b/src/System.Data.Common/src/System/Data/SQLTypes/SQLString.cs
index 413817fca7..1c970d5fd8 100644
--- a/src/System.Data.Common/src/System/Data/SQLTypes/SQLString.cs
+++ b/src/System.Data.Common/src/System/Data/SQLTypes/SQLString.cs
@@ -33,7 +33,7 @@ namespace System.Data.SqlTypes
[StructLayout(LayoutKind.Sequential)]
[XmlSchemaProvider("GetXsdType")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SqlString : INullable, IComparable, IXmlSerializable
{
diff --git a/src/System.Data.Odbc/src/Common/System/Data/Common/AdapterUtil.Odbc.cs b/src/System.Data.Odbc/src/Common/System/Data/Common/AdapterUtil.Odbc.cs
index d81527199c..f354ee884c 100644
--- a/src/System.Data.Odbc/src/Common/System/Data/Common/AdapterUtil.Odbc.cs
+++ b/src/System.Data.Odbc/src/Common/System/Data/Common/AdapterUtil.Odbc.cs
@@ -50,11 +50,6 @@ namespace System.Data.Common
return caught;
}
}
- internal static void TraceExceptionWithoutRethrow(Exception e)
- {
- Debug.Assert(ADP.IsCatchableExceptionType(e), "Invalid exception type, should have been re-thrown!");
- TraceException("<comm.ADP.TraceException|ERR|CATCH> '%ls'\n", e);
- }
//
// COM+ exceptions
diff --git a/src/System.Data.Odbc/src/Common/System/Data/Common/ReadOnlyCollection.cs b/src/System.Data.Odbc/src/Common/System/Data/Common/ReadOnlyCollection.cs
deleted file mode 100644
index 2bd0c8ad55..0000000000
--- a/src/System.Data.Odbc/src/Common/System/Data/Common/ReadOnlyCollection.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Collections.Generic;
-using System.Diagnostics;
-
-namespace System.Data.Common
-{
- [Serializable()]
- internal sealed class ReadOnlyCollection<T> : System.Collections.ICollection, ICollection<T>
- {
- private T[] _items;
-
- internal ReadOnlyCollection(T[] items)
- {
- _items = items;
-#if DEBUG
- for (int i = 0; i < items.Length; ++i)
- {
- Debug.Assert(null != items[i], "null item");
- }
-#endif
- }
-
- public void CopyTo(T[] array, int arrayIndex)
- {
- Array.Copy(_items, 0, array, arrayIndex, _items.Length);
- }
-
- void System.Collections.ICollection.CopyTo(Array array, int arrayIndex)
- {
- Array.Copy(_items, 0, array, arrayIndex, _items.Length);
- }
-
-
- IEnumerator<T> IEnumerable<T>.GetEnumerator()
- {
- return new Enumerator<T>(_items);
- }
-
- public System.Collections.IEnumerator GetEnumerator()
- {
- return new Enumerator<T>(_items);
- }
-
- bool System.Collections.ICollection.IsSynchronized
- {
- get { return false; }
- }
-
- Object System.Collections.ICollection.SyncRoot
- {
- get { return _items; }
- }
-
- bool ICollection<T>.IsReadOnly
- {
- get { return true; }
- }
-
- void ICollection<T>.Add(T value)
- {
- throw new NotSupportedException();
- }
-
- void ICollection<T>.Clear()
- {
- throw new NotSupportedException();
- }
-
- bool ICollection<T>.Contains(T value)
- {
- return Array.IndexOf(_items, value) >= 0;
- }
-
- bool ICollection<T>.Remove(T value)
- {
- throw new NotSupportedException();
- }
-
- public int Count
- {
- get { return _items.Length; }
- }
-
- [Serializable()]
- internal struct Enumerator<K> : IEnumerator<K>, System.Collections.IEnumerator
- { // based on List<T>.Enumerator
- private K[] _items;
- private int _index;
-
- internal Enumerator(K[] items)
- {
- _items = items;
- _index = -1;
- }
-
- public void Dispose()
- {
- }
-
- public bool MoveNext()
- {
- return (++_index < _items.Length);
- }
-
- public K Current
- {
- get
- {
- return _items[_index];
- }
- }
-
- Object System.Collections.IEnumerator.Current
- {
- get
- {
- return _items[_index];
- }
- }
-
- void System.Collections.IEnumerator.Reset()
- {
- _index = -1;
- }
- }
- }
-}
diff --git a/src/System.Data.Odbc/src/Common/System/Data/Common/SafeNativeMethods.cs b/src/System.Data.Odbc/src/Common/System/Data/Common/SafeNativeMethods.cs
index 2b11ee3eb1..e619e7159c 100644
--- a/src/System.Data.Odbc/src/Common/System/Data/Common/SafeNativeMethods.cs
+++ b/src/System.Data.Odbc/src/Common/System/Data/Common/SafeNativeMethods.cs
@@ -1,8 +1,8 @@
using System.Runtime.InteropServices;
-namespace System.Data.Common
+namespace System.Data
{
- internal class SafeNativeMethods
+ internal partial class SafeNativeMethods
{
internal static IntPtr LocalAlloc(IntPtr initialSize)
{
diff --git a/src/System.Data.Odbc/src/System.Data.Odbc.csproj b/src/System.Data.Odbc/src/System.Data.Odbc.csproj
index 36f778ff66..43dbb34d2a 100644
--- a/src/System.Data.Odbc/src/System.Data.Odbc.csproj
+++ b/src/System.Data.Odbc/src/System.Data.Odbc.csproj
@@ -107,7 +107,6 @@
<Compile Include="$(CommonPath)\System\Data\Common\MultipartIdentifier.cs">
<Link>Common\System\Data\Common\MultipartIdentifier.cs</Link>
</Compile>
- <Compile Include="Common\System\Data\Common\ReadOnlyCollection.cs" />
<Compile Include="Common\System\Data\Common\UnsafeNativeMethods.cs" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetsLinux)' == 'true' And '$(IsPartialFacadeAssembly)' != 'true' ">
diff --git a/src/System.Data.Odbc/src/System/Data/Odbc/OdbcConnectionStringbuilder.cs b/src/System.Data.Odbc/src/System/Data/Odbc/OdbcConnectionStringbuilder.cs
index 91200bb642..183e8522b9 100644
--- a/src/System.Data.Odbc/src/System/Data/Odbc/OdbcConnectionStringbuilder.cs
+++ b/src/System.Data.Odbc/src/System/Data/Odbc/OdbcConnectionStringbuilder.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System.Collections;
+using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.Common;
@@ -192,7 +193,7 @@ namespace System.Data.Odbc
}
_knownKeywords = knownKeywords;
}
- return new System.Data.Common.ReadOnlyCollection<string>(knownKeywords);
+ return new ReadOnlyCollection<string>(knownKeywords);
}
}
diff --git a/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Unix.cs b/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Unix.cs
index 42a52b9091..673c91efb7 100644
--- a/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Unix.cs
+++ b/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Unix.cs
@@ -25,7 +25,7 @@ namespace System.Data.SqlClient
namespace System.Data
{
- internal static class SafeNativeMethods
+ internal static partial class SafeNativeMethods
{
internal static IntPtr GetProcAddress(IntPtr HModule, string funcName)
{
diff --git a/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Windows.cs b/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Windows.cs
index 23cd8aa548..4f5784f954 100644
--- a/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Windows.cs
+++ b/src/System.Data.SqlClient/src/Interop/SNINativeMethodWrapper.Windows.cs
@@ -414,7 +414,7 @@ namespace System.Data.SqlClient
namespace System.Data
{
- internal static class SafeNativeMethods
+ internal static partial class SafeNativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true, SetLastError = true)]
internal static extern IntPtr GetProcAddress(IntPtr HModule, [MarshalAs(UnmanagedType.LPStr), In] string funcName);
diff --git a/src/System.Data.SqlClient/src/System/Data/Common/ActivityCorrelator.cs b/src/System.Data.SqlClient/src/System/Data/Common/ActivityCorrelator.cs
index e77fa53f30..d40daebef2 100644
--- a/src/System.Data.SqlClient/src/System/Data/Common/ActivityCorrelator.cs
+++ b/src/System.Data.SqlClient/src/System/Data/Common/ActivityCorrelator.cs
@@ -51,7 +51,7 @@ namespace System.Data.Common
// Declare the ActivityId which will be stored in TLS. The Id is unique for each thread.
// The Sequence number will be incremented when each event happens.
// Correlation along threads is consistent with the current XEvent mechanism at server.
- [ThreadStaticAttribute]
+ [ThreadStatic]
private static ActivityId t_tlsActivity;
/// <summary>
diff --git a/src/System.Data.SqlClient/src/System/Data/Common/AdapterUtil.SqlClient.cs b/src/System.Data.SqlClient/src/System/Data/Common/AdapterUtil.SqlClient.cs
index 2510b8bcd4..63990dc4e8 100644
--- a/src/System.Data.SqlClient/src/System/Data/Common/AdapterUtil.SqlClient.cs
+++ b/src/System.Data.SqlClient/src/System/Data/Common/AdapterUtil.SqlClient.cs
@@ -31,12 +31,6 @@ namespace System.Data.Common
}
}
- internal static void TraceExceptionWithoutRethrow(Exception e)
- {
- Debug.Assert(ADP.IsCatchableExceptionType(e), "Invalid exception type, should have been re-thrown!");
- TraceException("<comm.ADP.TraceException|ERR|CATCH> '%ls'\n", e);
- }
-
//
// COM+ exceptions
//
@@ -882,11 +876,6 @@ namespace System.Data.Common
}
}
- internal static ArgumentOutOfRangeException NotSupportedEnumerationValue(Type type, string value, string method)
- {
- return ArgumentOutOfRange(SR.GetString(SR.ADP_NotSupportedEnumerationValue, type.Name, value, method), type.Name);
- }
-
internal static ArgumentOutOfRangeException NotSupportedCommandBehavior(CommandBehavior value, string method)
{
return NotSupportedEnumerationValue(typeof(CommandBehavior), value.ToString(), method);
diff --git a/src/System.Data.SqlClient/src/System/Data/Common/DbConnectionStringCommon.cs b/src/System.Data.SqlClient/src/System/Data/Common/DbConnectionStringCommon.cs
index 8eac562d01..e9a7ed8345 100644
--- a/src/System.Data.SqlClient/src/System/Data/Common/DbConnectionStringCommon.cs
+++ b/src/System.Data.SqlClient/src/System/Data/Common/DbConnectionStringCommon.cs
@@ -224,7 +224,7 @@ namespace System.Data.Common
}
}
- internal static class DbConnectionStringDefaults
+ internal static partial class DbConnectionStringDefaults
{
// all
// internal const string NamedConnection = "";
@@ -263,7 +263,7 @@ namespace System.Data.Common
}
- internal static class DbConnectionStringKeywords
+ internal static partial class DbConnectionStringKeywords
{
// all
// internal const string NamedConnection = "Named Connection";
diff --git a/src/System.Data.SqlClient/tests/FunctionalTests/System.Data.SqlClient.Tests.csproj b/src/System.Data.SqlClient/tests/FunctionalTests/System.Data.SqlClient.Tests.csproj
index 162185615e..77e2f7f277 100644
--- a/src/System.Data.SqlClient/tests/FunctionalTests/System.Data.SqlClient.Tests.csproj
+++ b/src/System.Data.SqlClient/tests/FunctionalTests/System.Data.SqlClient.Tests.csproj
@@ -31,12 +31,6 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
diff --git a/src/System.Data.SqlClient/tests/ManualTests/SQL/RandomStressTest/RandomizerPool.cs b/src/System.Data.SqlClient/tests/ManualTests/SQL/RandomStressTest/RandomizerPool.cs
index 273e9ed6ac..bd193fab42 100644
--- a/src/System.Data.SqlClient/tests/ManualTests/SQL/RandomStressTest/RandomizerPool.cs
+++ b/src/System.Data.SqlClient/tests/ManualTests/SQL/RandomStressTest/RandomizerPool.cs
@@ -216,13 +216,14 @@ namespace System.Data.SqlClient.ManualTesting.Tests
/// application crashes
/// </summary>
[ThreadStatic]
- private static IScope s_ts_lastCreatedScope;
+ private static IScope t_lastCreatedScope;
/// <summary>
/// holds the current scope on the thread, it is used to ensure scope creation and disposal calls are balanced
/// </summary>
[ThreadStatic]
- private static IScope s_ts_currentScope;
+ private static IScope t_currentScope;
+
/// <summary>
/// represents a randomizer scope, that makes use of Randomizer or derived types
/// </summary>
@@ -250,9 +251,9 @@ namespace System.Data.SqlClient.ManualTesting.Tests
/// </summary>
internal Scope(RandomizerPool pool, IScope parent)
{
- s_ts_lastCreatedScope = this;
- _previousScope = s_ts_currentScope;
- s_ts_currentScope = this;
+ t_lastCreatedScope = this;
+ _previousScope = t_currentScope;
+ t_currentScope = this;
_pool = pool;
RandomizerType current;
@@ -280,14 +281,14 @@ namespace System.Data.SqlClient.ManualTesting.Tests
{
_current = null;
- if (s_ts_currentScope != this)
+ if (t_currentScope != this)
{
// every creation of scope in test must be balanced with Dispose call, use 'using' to enforce that!
// nested scopes are allowed, child scope must be disposed before the parent one
throw new InvalidOperationException("Unbalanced call to scope.Dispose");
}
- s_ts_currentScope = _previousScope;
+ t_currentScope = _previousScope;
}
}
@@ -358,7 +359,7 @@ namespace System.Data.SqlClient.ManualTesting.Tests
/// </summary>
public void SaveLastThreadScopeRepro(string reproFile)
{
- SaveReproInternal(reproFile, s_ts_lastCreatedScope);
+ SaveReproInternal(reproFile, t_lastCreatedScope);
}
}
}
diff --git a/src/System.Data.SqlClient/tests/StressTests/System.Data.StressFramework/DataStressConnection.cs b/src/System.Data.SqlClient/tests/StressTests/System.Data.StressFramework/DataStressConnection.cs
index 45e932b34b..e9157fbc72 100644
--- a/src/System.Data.SqlClient/tests/StressTests/System.Data.StressFramework/DataStressConnection.cs
+++ b/src/System.Data.SqlClient/tests/StressTests/System.Data.StressFramework/DataStressConnection.cs
@@ -29,14 +29,14 @@ namespace Stress.Data
private short _spid = 0;
[ThreadStatic]
- private static TrackedRandom s_randomInstance;
+ private static TrackedRandom t_randomInstance;
private static TrackedRandom RandomInstance
{
get
{
- if (s_randomInstance == null)
- s_randomInstance = new TrackedRandom();
- return s_randomInstance;
+ if (t_randomInstance == null)
+ t_randomInstance = new TrackedRandom();
+ return t_randomInstance;
}
}
diff --git a/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.Current.net45.cs b/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.Current.net45.cs
index d736712512..21fbee09a6 100644
--- a/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.Current.net45.cs
+++ b/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.Current.net45.cs
@@ -2,13 +2,12 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Security;
namespace System.Diagnostics
{
- // this code is specific to .NET 4.5 and uses CallContext to store Activity.Current which requires Activity to be Serializable.
- [Serializable] // DO NOT remove
public partial class Activity
{
/// <summary>
@@ -22,7 +21,14 @@ namespace System.Diagnostics
#endif
get
{
- return (Activity)CallContext.LogicalGetData(FieldKey);
+ ObjectHandle activityHandle = (ObjectHandle)CallContext.LogicalGetData(FieldKey);
+
+ // Unwrap the Activity if it was set in the same AppDomain (as FieldKey is AppDomain-specific).
+ if (activityHandle != null)
+ {
+ return (Activity)activityHandle.Unwrap();
+ }
+ return null;
}
#if ALLOW_PARTIALLY_TRUSTED_CALLERS
@@ -30,17 +36,23 @@ namespace System.Diagnostics
#endif
private set
{
- CallContext.LogicalSetData(FieldKey, value);
+ // Applications may implicitly or explicitly call other AppDomains
+ // that do not have DiagnosticSource DLL, therefore may not be able to resolve Activity type stored in the logical call context.
+ // To avoid it, we wrap Activity with ObjectHandle.
+ CallContext.LogicalSetData(FieldKey, new ObjectHandle(value));
}
}
#region private
- [Serializable] // DO NOT remove
+
private partial class KeyValueListNode
{
}
- private static readonly string FieldKey = $"{typeof(Activity).FullName}";
+ // Slot name depends on the AppDomain Id in order to prevent AppDomains to use the same Activity
+ // Cross AppDomain calls are considered as 'external' i.e. only Activity Id and Baggage should be propagated and
+ // new Activity should be started for the RPC calls (incoming and outgoing)
+ private static readonly string FieldKey = $"{typeof(Activity).FullName}_{AppDomain.CurrentDomain.Id}";
#endregion
}
} \ No newline at end of file
diff --git a/src/System.Diagnostics.DiagnosticSource/tests/System.Diagnostics.DiagnosticSource.Tests.csproj b/src/System.Diagnostics.DiagnosticSource/tests/System.Diagnostics.DiagnosticSource.Tests.csproj
index 2fbd944ab5..86316971ef 100644
--- a/src/System.Diagnostics.DiagnosticSource/tests/System.Diagnostics.DiagnosticSource.Tests.csproj
+++ b/src/System.Diagnostics.DiagnosticSource/tests/System.Diagnostics.DiagnosticSource.Tests.csproj
@@ -35,12 +35,6 @@
<Compile Include="$(CommonTestPath)\System\Net\Configuration.Http.cs">
<Link>Common\System\Net\Configuration.Http.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Diagnostics.FileVersionInfo/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Diagnostics.FileVersionInfo/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 60adf0311b..0000000000
--- a/src/System.Diagnostics.FileVersionInfo/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,4 +0,0 @@
-kernel32.dll!VerLanguageNameW
-version.dll!GetFileVersionInfoExW
-version.dll!GetFileVersionInfoSizeExW
-version.dll!VerQueryValueW \ No newline at end of file
diff --git a/src/System.Diagnostics.FileVersionInfo/tests/System.Diagnostics.FileVersionInfo.Tests/System.Diagnostics.FileVersionInfo.Tests.csproj b/src/System.Diagnostics.FileVersionInfo/tests/System.Diagnostics.FileVersionInfo.Tests/System.Diagnostics.FileVersionInfo.Tests.csproj
index 6f695af037..16c061f977 100644
--- a/src/System.Diagnostics.FileVersionInfo/tests/System.Diagnostics.FileVersionInfo.Tests/System.Diagnostics.FileVersionInfo.Tests.csproj
+++ b/src/System.Diagnostics.FileVersionInfo/tests/System.Diagnostics.FileVersionInfo.Tests/System.Diagnostics.FileVersionInfo.Tests.csproj
@@ -27,9 +27,6 @@
</ItemGroup>
<ItemGroup>
<Compile Include="FileVersionInfoTest.cs" />
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
diff --git a/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 34132ba704..0000000000
--- a/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,35 +0,0 @@
-advapi32.dll!CreateProcessWithLogonW
-advapi32.dll!OpenProcessToken
-kernel32.dll!CreatePipe
-kernel32.dll!CreateProcessW
-kernel32.dll!GetComputerNameW
-kernel32.dll!GetConsoleCP
-kernel32.dll!GetConsoleOutputCP
-kernel32.dll!GetPriorityClass
-kernel32.dll!GetProcessAffinityMask
-kernel32.dll!GetProcessPriorityBoost
-kernel32.dll!GetProcessWorkingSetSizeEx
-kernel32.dll!GetStdHandle
-kernel32.dll!GetThreadPriorityBoost
-kernel32.dll!IsWow64Process
-kernel32.dll!K32EnumProcesses
-kernel32.dll!K32EnumProcessModules
-kernel32.dll!SetPriorityClass
-kernel32.dll!SetProcessAffinityMask
-kernel32.dll!SetProcessPriorityBoost
-kernel32.dll!SetProcessWorkingSetSizeEx
-kernel32.dll!SetThreadAffinityMask
-kernel32.dll!SetThreadPriorityBoost
-ntdll.dll!NtQueryInformationProcess
-ntdll.dll!NtQuerySystemInformation
-user32.dll!EnumWindows
-user32.dll!GetWindow
-user32.dll!GetWindowLongW
-user32.dll!GetWindowTextW
-user32.dll!GetWindowTextLengthW
-user32.dll!GetWindowThreadProcessId
-user32.dll!IsWindowVisible
-user32.dll!PostMessageW
-user32.dll!SendMessageTimeoutW
-user32.dll!WaitForInputIdle
-shell32.dll!ShellExecuteExW
diff --git a/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp b/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp
new file mode 100644
index 0000000000..efb577d99c
--- /dev/null
+++ b/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.netcoreapp
@@ -0,0 +1,12 @@
+# Not available in OneCore: we fall back gracefully on Nano because
+# stub APIs are present and our tests currently don't use actual windows
+shell32.dll!ShellExecuteExW
+user32.dll!EnumWindows
+user32.dll!GetWindow
+user32.dll!GetWindowLongW
+user32.dll!GetWindowTextLengthW
+user32.dll!GetWindowTextW
+user32.dll!GetWindowThreadProcessId
+user32.dll!IsWindowVisible
+user32.dll!PostMessageW
+user32.dll!WaitForInputIdle \ No newline at end of file
diff --git a/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.uap b/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
new file mode 100644
index 0000000000..07c1cd2c40
--- /dev/null
+++ b/src/System.Diagnostics.Process/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -0,0 +1,7 @@
+advapi32.dll!OpenProcessToken
+kernel32.dll!GetProcessAffinityMask
+kernel32.dll!K32EnumProcessModules
+kernel32.dll!SetProcessAffinityMask
+kernel32.dll!SetThreadAffinityMask
+ntdll.dll!NtQueryInformationProcess
+ntdll.dll!NtQuerySystemInformation \ No newline at end of file
diff --git a/src/System.Diagnostics.Process/src/System.Diagnostics.Process.csproj b/src/System.Diagnostics.Process/src/System.Diagnostics.Process.csproj
index 38c94e722d..9c8b6fdc53 100644
--- a/src/System.Diagnostics.Process/src/System.Diagnostics.Process.csproj
+++ b/src/System.Diagnostics.Process/src/System.Diagnostics.Process.csproj
@@ -46,39 +46,41 @@
<Compile Include="System\Diagnostics\MonitoringDescriptionAttribute.cs" />
<Compile Include="System\Collections\Specialized\StringDictionaryWrapper.cs" />
</ItemGroup>
- <ItemGroup Condition=" '$(TargetsWindows)' == 'true' AND '$(IsPartialFacadeAssembly)'!='true'">
- <Compile Include="$(CommonPath)\Interop\Windows\Interop.Libraries.cs">
- <Link>Common\Interop\Windows\Interop.Libraries.cs</Link>
- </Compile>
+ <ItemGroup Condition=" '$(TargetsWindows)' == 'true' and '$(TargetGroup)' != 'uap'">
<Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.EnumWindows.cs">
<Link>Common\Interop\Windows\user32\Interop.EnumWindows.cs</Link>
</Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindow.cs">
+ <Link>Common\Interop\Windows\user32\Interop.GetWindow.cs</Link>
+ </Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindowLong.cs">
+ <Link>Common\Interop\Windows\user32\Interop.GetWindowLong.cs</Link>
+ </Compile>
<Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindowTextLengthW.cs">
<Link>Common\Interop\Windows\user32\Interop.GetWindowTextLengthW.cs</Link>
</Compile>
- <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.SendMessageTimeout.cs">
- <Link>Common\Interop\Windows\user32\Interop.SendMessageTimeout.cs</Link>
- </Compile>
<Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindowTextW.cs">
<Link>Common\Interop\Windows\user32\Interop.GetWindowTextW.cs</Link>
</Compile>
- <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindow.cs">
- <Link>Common\Interop\Windows\user32\Interop.GetWindow.cs</Link>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindowThreadProcessId.cs">
+ <Link>Common\Interop\Windows\user32\Interop.GetWindowThreadProcessId.cs</Link>
</Compile>
<Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.PostMessage.cs">
<Link>Common\Interop\Windows\user32\Interop.PostMessage.cs</Link>
</Compile>
- <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindowLong.cs">
- <Link>Common\Interop\Windows\user32\Interop.GetWindowLong.cs</Link>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.IsWindowVisible.cs">
+ <Link>Common\Interop\Windows\user32\Interop.IsWindowVisible.cs</Link>
+ </Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.SendMessageTimeout.cs">
+ <Link>Common\Interop\Windows\user32\Interop.SendMessageTimeout.cs</Link>
</Compile>
<Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.WaitForInputIdle.cs">
<Link>Common\Interop\Windows\user32\Interop.WaitForInputIdle.cs</Link>
</Compile>
- <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.IsWindowVisible.cs">
- <Link>Common\Interop\Windows\user32\Interop.IsWindowVisible.cs</Link>
- </Compile>
- <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetWindowThreadProcessId.cs">
- <Link>Common\Interop\Windows\user32\Interop.GetWindowThreadProcessId.cs</Link>
+ </ItemGroup>
+ <ItemGroup Condition=" '$(TargetsWindows)' == 'true'">
+ <Compile Include="$(CommonPath)\Interop\Windows\Interop.Libraries.cs">
+ <Link>Common\Interop\Windows\Interop.Libraries.cs</Link>
</Compile>
<Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.CloseHandle.cs">
<Link>Common\Interop\Windows\kernel32\Interop.CloseHandle.cs</Link>
@@ -274,7 +276,7 @@
<Compile Include="System\Diagnostics\ProcessThreadTimes.cs" />
<Compile Include="System\Diagnostics\ProcessWaitHandle.Windows.cs" />
</ItemGroup>
- <ItemGroup Condition=" '$(TargetsUnix)' == 'true' AND '$(IsPartialFacadeAssembly)'!='true'">
+ <ItemGroup Condition=" '$(TargetsUnix)' == 'true'">
<Compile Include="Microsoft\Win32\SafeHandles\SafeProcessHandle.Unix.cs" />
<Compile Include="System\Diagnostics\Process.Unix.cs" />
<Compile Include="System\Diagnostics\ProcessManager.Unix.cs" />
@@ -334,7 +336,7 @@
<Link>Common\Interop\Unix\Interop.WaitPid.cs</Link>
</Compile>
</ItemGroup>
- <ItemGroup Condition=" '$(TargetsLinux)' == 'true' AND '$(IsPartialFacadeAssembly)'!='true'">
+ <ItemGroup Condition=" '$(TargetsLinux)' == 'true'">
<Compile Include="System\Diagnostics\Process.Linux.cs" />
<Compile Include="System\Diagnostics\ProcessManager.Linux.cs" />
<Compile Include="System\Diagnostics\ProcessThread.Linux.cs" />
@@ -357,7 +359,7 @@
<Link>Common\System\Text\ReusableTextReader.cs</Link>
</Compile>
</ItemGroup>
- <ItemGroup Condition=" '$(TargetsOSX)' == 'true' AND '$(IsPartialFacadeAssembly)'!='true'">
+ <ItemGroup Condition=" '$(TargetsOSX)' == 'true'">
<Compile Include="System\Diagnostics\Process.OSX.cs" />
<Compile Include="System\Diagnostics\ProcessManager.OSX.cs" />
<Compile Include="System\Diagnostics\ProcessThread.OSX.cs" />
@@ -387,7 +389,7 @@
<Compile Include="System\Diagnostics\ProcessManager.Uap.cs" />
<Compile Include="System\Diagnostics\ProcessStartInfo.Uap.cs" />
</ItemGroup>
- <ItemGroup Condition=" ('$(TargetsFreeBSD)' == 'true' OR '$(TargetsUnknownUnix)' == 'true') AND '$(IsPartialFacadeAssembly)'!='true'">
+ <ItemGroup Condition=" ('$(TargetsFreeBSD)' == 'true' OR '$(TargetsUnknownUnix)' == 'true')">
<Compile Include="System\Diagnostics\Process.UnknownUnix.cs" />
<Compile Include="System\Diagnostics\ProcessManager.UnknownUnix.cs" />
<Compile Include="System\Diagnostics\ProcessThread.UnknownUnix.cs" />
diff --git a/src/System.Diagnostics.Process/tests/Configurations.props b/src/System.Diagnostics.Process/tests/Configurations.props
index f333d20c1a..c71f0fb5ae 100644
--- a/src/System.Diagnostics.Process/tests/Configurations.props
+++ b/src/System.Diagnostics.Process/tests/Configurations.props
@@ -4,6 +4,7 @@
<BuildConfigurations>
netstandard-Windows_NT;
netstandard-Unix;
+ uap-Windows_NT;
</BuildConfigurations>
</PropertyGroup>
</Project> \ No newline at end of file
diff --git a/src/System.Diagnostics.Process/tests/Performance/System.Diagnostics.Process.Performance.Tests.csproj b/src/System.Diagnostics.Process/tests/Performance/System.Diagnostics.Process.Performance.Tests.csproj
index be629d4072..0bb7bb2f75 100644
--- a/src/System.Diagnostics.Process/tests/Performance/System.Diagnostics.Process.Performance.Tests.csproj
+++ b/src/System.Diagnostics.Process/tests/Performance/System.Diagnostics.Process.Performance.Tests.csproj
@@ -10,12 +10,6 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'" />
<ItemGroup>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="..\ProcessTestBase.cs" />
<Compile Include="Perf.Process.cs" />
<Compile Include="$(CommonTestPath)\System\PerfUtils.cs">
diff --git a/src/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs b/src/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs
index e2c959d950..7e3eea3e3e 100644
--- a/src/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs
+++ b/src/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs
@@ -958,7 +958,6 @@ namespace System.Diagnostics.Tests
[MemberData(nameof(UseShellExecute))]
[OuterLoop("Launches notepad")]
[PlatformSpecific(TestPlatforms.Windows)]
- [SkipOnTargetFramework(TargetFrameworkMonikers.Uap, "HWND not available")]
public void StartInfo_NotepadWithContent(bool useShellExecute)
{
string tempFile = GetTestFilePath() + ".txt";
@@ -981,8 +980,15 @@ namespace System.Diagnostics.Tests
process.WaitForInputIdle(); // Give the file a chance to load
Assert.Equal("notepad", process.ProcessName);
- // On some Windows versions, the file extension is not included in the title
- Assert.StartsWith(Path.GetFileNameWithoutExtension(tempFile), process.MainWindowTitle);
+ if (PlatformDetection.IsUap)
+ {
+ Assert.Throws<PlatformNotSupportedException>(() => process.MainWindowTitle);
+ }
+ else
+ {
+ // On some Windows versions, the file extension is not included in the title
+ Assert.StartsWith(Path.GetFileNameWithoutExtension(tempFile), process.MainWindowTitle);
+ }
}
finally
{
@@ -995,8 +1001,10 @@ namespace System.Diagnostics.Tests
[ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))] // Does not support UseShellExecute
[OuterLoop("Launches notepad")]
[PlatformSpecific(TestPlatforms.Windows)]
- [SkipOnTargetFramework(TargetFrameworkMonikers.Uap, "HWND not available")]
- [ActiveIssue("https://github.com/dotnet/corefx/issues/20388")]
+ // Re-enabling with extra diagnostic info
+ // [ActiveIssue("https://github.com/dotnet/corefx/issues/20388")]
+ // We don't have the ability yet for UseShellExecute in UAP
+ [ActiveIssue("https://github.com/dotnet/corefx/issues/20204", TargetFrameworkMonikers.Uap | TargetFrameworkMonikers.UapAot)]
public void StartInfo_TextFile_ShellExecute()
{
string tempFile = GetTestFilePath() + ".txt";
@@ -1011,15 +1019,22 @@ namespace System.Diagnostics.Tests
using (var process = Process.Start(info))
{
- Assert.True(process != null, $"Could not start {info.FileName} UseShellExecute={info.UseShellExecute}");
+ Assert.True(process != null, $"Could not start {info.FileName} UseShellExecute={info.UseShellExecute}\r\n{GetAssociationDetails()}");
try
{
process.WaitForInputIdle(); // Give the file a chance to load
Assert.Equal("notepad", process.ProcessName);
- // On some Windows versions, the file extension is not included in the title
- Assert.StartsWith(Path.GetFileNameWithoutExtension(tempFile), process.MainWindowTitle);
+ if (PlatformDetection.IsUap)
+ {
+ Assert.Throws<PlatformNotSupportedException>(() => process.MainWindowTitle);
+ }
+ else
+ {
+ // On some Windows versions, the file extension is not included in the title
+ Assert.StartsWith(Path.GetFileNameWithoutExtension(tempFile), process.MainWindowTitle);
+ }
}
finally
{
@@ -1029,6 +1044,51 @@ namespace System.Diagnostics.Tests
}
}
+ [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
+ private unsafe static extern int AssocQueryStringW(
+ int flags,
+ int str,
+ string pszAssoc,
+ string pszExtra,
+ char* pszOut,
+ ref uint pcchOut);
+
+ private unsafe static string GetAssociationString(int flags, int str, string pszAssoc, string pszExtra)
+ {
+ uint count = 0;
+ int result = AssocQueryStringW(flags, str, pszAssoc, pszExtra, null, ref count);
+ if (result != 1)
+ return $"Didn't get expected HRESULT (1) when getting char count. HRESULT was 0x{result:x8}";
+
+ string value = new string((char)0, (int)count - 1);
+ fixed(char* s = value)
+ {
+ result = AssocQueryStringW(flags, str, pszAssoc, pszExtra, s, ref count);
+ }
+
+ if (result != 0)
+ return $"Didn't get expected HRESULT (0), when getting char count. HRESULT was 0x{result:x8}";
+
+ return value;
+ }
+
+ private static string GetAssociationDetails()
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine("Association details for '.txt'");
+ sb.AppendLine("------------------------------");
+
+ string open = GetAssociationString(0, 1 /* ASSOCSTR_COMMAND */, ".txt", "open");
+ sb.AppendFormat("Open command: {0}", open);
+ sb.AppendLine();
+
+ string progId = GetAssociationString(0, 20 /* ASSOCSTR_PROGID */, ".txt", null);
+ sb.AppendFormat("ProgID: {0}", progId);
+ sb.AppendLine();
+ return sb.ToString();
+ }
+
+
[ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsWindowsNanoServer))]
public void ShellExecute_Nano_Fails_Start()
{
diff --git a/src/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj b/src/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj
index fd1e907a95..ae6b50a8a8 100644
--- a/src/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj
+++ b/src/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj
@@ -6,12 +6,15 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants Condition="'$(TargetsWindows)' == 'true'">$(DefineConstants);TargetsWindows</DefineConstants>
</PropertyGroup>
- <!-- Default configurations to help VS understand the configurations -->
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Unix-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Unix-Release|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Windows_NT-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Windows_NT-Release|AnyCPU'" />
- <ItemGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Release|AnyCPU'" />
+ <!-- Default configurations to help VS understand the configurations -->
+ <!-- Disable the whole Process tests on UAP with the active issue https://github.com/dotnet/corefx/issues/20948 -->
+ <ItemGroup Condition="'$(TargetGroup)' != 'uap'">
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
@@ -21,12 +24,6 @@
<Compile Include="$(CommonTestPath)\System\PlatformDetection.Unix.cs" Condition="'$(TargetsWindows)' != 'true'">
<Link>Common\System\PlatformDetection.Unix.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\ShouldNotBeInvokedException.cs">
<Link>Common\System\ShouldNotBeInvokedException.cs</Link>
</Compile>
diff --git a/src/System.Diagnostics.StackTrace/System.Diagnostics.StackTrace.sln b/src/System.Diagnostics.StackTrace/System.Diagnostics.StackTrace.sln
index d927a1faea..2de99a51cb 100644
--- a/src/System.Diagnostics.StackTrace/System.Diagnostics.StackTrace.sln
+++ b/src/System.Diagnostics.StackTrace/System.Diagnostics.StackTrace.sln
@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Diagnostics.StackTra
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Diagnostics.StackTrace", "ref\System.Diagnostics.StackTrace.csproj", "{C38217EF-88F4-4D56-9F58-780BE1DDAFF6}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1A2F9F4A-A032-433E-B914-ADD5992BB178}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{2E666815-2EDB-464B-9DF6-380BF4789AD4}"
diff --git a/src/System.Diagnostics.TextWriterTraceListener/tests/DelimiterWriteMethodTests.cs b/src/System.Diagnostics.TextWriterTraceListener/tests/DelimiterWriteMethodTests.cs
index dbf285faea..14faf159b1 100644
--- a/src/System.Diagnostics.TextWriterTraceListener/tests/DelimiterWriteMethodTests.cs
+++ b/src/System.Diagnostics.TextWriterTraceListener/tests/DelimiterWriteMethodTests.cs
@@ -8,14 +8,14 @@ using Xunit;
namespace System.Diagnostics.TextWriterTraceListenerTests
{
- public class DelimiterWriteMethodTests : IDisposable
+ public class DelimiterWriteMethodTests : FileCleanupTestBase
{
private readonly Stream _stream;
private readonly string _fileName;
public DelimiterWriteMethodTests()
{
- _fileName = string.Format("{0}.xml", GetType().Name);
+ _fileName = $"{GetTestFilePath()}.xml";
CommonUtilities.DeleteFile(_fileName);
_stream = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.Write);
}
@@ -146,10 +146,10 @@ namespace System.Diagnostics.TextWriterTraceListenerTests
Assert.Equal(expected, File.ReadAllText(_fileName));
}
- public void Dispose()
+ protected override void Dispose(bool disposing)
{
_stream.Dispose();
- CommonUtilities.DeleteFile(_fileName);
+ base.Dispose(disposing);
}
}
}
diff --git a/src/System.Diagnostics.TextWriterTraceListener/tests/TextWriterTraceListener_WriteTests.cs b/src/System.Diagnostics.TextWriterTraceListener/tests/TextWriterTraceListener_WriteTests.cs
index 560e48daf7..6528089912 100644
--- a/src/System.Diagnostics.TextWriterTraceListener/tests/TextWriterTraceListener_WriteTests.cs
+++ b/src/System.Diagnostics.TextWriterTraceListener/tests/TextWriterTraceListener_WriteTests.cs
@@ -7,7 +7,7 @@ using Xunit;
namespace System.Diagnostics.TextWriterTraceListenerTests
{
- public class TextWriterTraceListener_WriteTests : IDisposable
+ public class TextWriterTraceListener_WriteTests : FileCleanupTestBase
{
private readonly Stream _stream;
private readonly string _fileName;
@@ -15,7 +15,7 @@ namespace System.Diagnostics.TextWriterTraceListenerTests
public TextWriterTraceListener_WriteTests()
{
- _fileName = string.Format("{0}.xml", GetType().Name);
+ _fileName = $"{GetTestFilePath()}.xml";
CommonUtilities.DeleteFile(_fileName);
_stream = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.Write);
}
@@ -77,10 +77,10 @@ namespace System.Diagnostics.TextWriterTraceListenerTests
}
}
- public void Dispose()
+ protected override void Dispose(bool disposing)
{
_stream.Dispose();
- CommonUtilities.DeleteFile(_fileName);
+ base.Dispose(disposing);
}
}
}
diff --git a/src/System.Diagnostics.TraceSource/tests/System.Diagnostics.TraceSource.Tests.csproj b/src/System.Diagnostics.TraceSource/tests/System.Diagnostics.TraceSource.Tests.csproj
index e7197d9e27..58badc80b5 100644
--- a/src/System.Diagnostics.TraceSource/tests/System.Diagnostics.TraceSource.Tests.csproj
+++ b/src/System.Diagnostics.TraceSource/tests/System.Diagnostics.TraceSource.Tests.csproj
@@ -34,9 +34,6 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\tests\System\PlatformDetection.cs</Link>
</Compile>
diff --git a/src/System.Diagnostics.Tracing/System.Diagnostics.Tracing.sln b/src/System.Diagnostics.Tracing/System.Diagnostics.Tracing.sln
index cb0c4383a6..f8890b0fe9 100644
--- a/src/System.Diagnostics.Tracing/System.Diagnostics.Tracing.sln
+++ b/src/System.Diagnostics.Tracing/System.Diagnostics.Tracing.sln
@@ -1,12 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26430.12
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{90DA2470-329A-4DD0-95B3-F00D42DD9137}"
- ProjectSection(SolutionItems) = preProject
- documentation\EventCounterTutorial.md = documentation\EventCounterTutorial.md
- EndProjectSection
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Diagnostics.Tracing.Tests", "tests\System.Diagnostics.Tracing.Tests.csproj", "{7E0E1B11-FF70-461E-99F7-C0AF252C0C60}"
ProjectSection(ProjectDependencies) = postProject
{EB880FDC-326D-42B3-A3FD-0CD3BA29A7F4} = {EB880FDC-326D-42B3-A3FD-0CD3BA29A7F4}
diff --git a/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/LoudListener.cs b/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/LoudListener.cs
index 1d76057147..65d77a3c97 100644
--- a/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/LoudListener.cs
+++ b/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/LoudListener.cs
@@ -3,17 +3,15 @@
// See the LICENSE file in the project root for more information.
using System;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.Tracing;
-
namespace BasicEventSourceTests
{
internal class LoudListener : EventListener
{
[ThreadStatic]
- public static EventWrittenEventArgs LastEvent;
+ public static EventWrittenEventArgs t_lastEvent;
protected override void OnEventSourceCreated(EventSource eventSource)
{
@@ -23,11 +21,11 @@ namespace BasicEventSourceTests
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
- LastEvent = eventData;
+ t_lastEvent = eventData;
- Debug.Write(String.Format("Event {0} ", eventData.EventId));
- Debug.Write(String.Format(" (activity {0}{1}) ", eventData.ActivityId, eventData.RelatedActivityId != null ? "->" + eventData.RelatedActivityId : ""));
- Debug.WriteLine(String.Format(" ({0}).", eventData.Payload != null ? string.Join(", ", eventData.Payload) : ""));
+ Debug.Write(string.Format("Event {0} ", eventData.EventId));
+ Debug.Write(string.Format(" (activity {0}{1}) ", eventData.ActivityId, eventData.RelatedActivityId != null ? "->" + eventData.RelatedActivityId : ""));
+ Debug.WriteLine(string.Format(" ({0}).", eventData.Payload != null ? string.Join(", ", eventData.Payload) : ""));
}
}
}
diff --git a/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.cs b/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.cs
index 62f3f8a6da..d138998231 100644
--- a/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.cs
+++ b/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.cs
@@ -35,9 +35,9 @@ namespace BasicEventSourceTests
int i = 12;
es.EventWrite(i);
- Assert.Equal(1, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(i, LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(1, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(i, LoudListener.t_lastEvent.Payload[0]);
}
}
}
diff --git a/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsWriteEventToListener.cs b/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsWriteEventToListener.cs
index db6480b3c6..9cb58dba1b 100644
--- a/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsWriteEventToListener.cs
+++ b/src/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsWriteEventToListener.cs
@@ -31,119 +31,119 @@ namespace BasicEventSourceTests
Assert.Null(EventSource.GenerateManifest(typeof(EventSourceTest), string.Empty, EventManifestOptions.OnlyIfNeededForRegistration));
log.Event0();
- Assert.Equal(1, LoudListener.LastEvent.EventId);
- Assert.Equal(0, LoudListener.LastEvent.Payload.Count);
+ Assert.Equal(1, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(0, LoudListener.t_lastEvent.Payload.Count);
#region Validate "int" arguments
log.EventI(10);
- Assert.Equal(2, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(10, (int)LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(2, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(10, (int)LoudListener.t_lastEvent.Payload[0]);
log.EventII(10, 11);
- Assert.Equal(3, LoudListener.LastEvent.EventId);
- Assert.Equal(2, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(10, (int)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(11, (int)LoudListener.LastEvent.Payload[1]);
+ Assert.Equal(3, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(2, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(10, (int)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(11, (int)LoudListener.t_lastEvent.Payload[1]);
log.EventIII(10, 11, 12);
- Assert.Equal(4, LoudListener.LastEvent.EventId);
- Assert.Equal(3, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(10, (int)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(11, (int)LoudListener.LastEvent.Payload[1]);
- Assert.Equal(12, (int)LoudListener.LastEvent.Payload[2]);
+ Assert.Equal(4, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(3, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(10, (int)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(11, (int)LoudListener.t_lastEvent.Payload[1]);
+ Assert.Equal(12, (int)LoudListener.t_lastEvent.Payload[2]);
#endregion
#region Validate "long" arguments
log.EventL(10);
- Assert.Equal(5, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(10, (long)LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(5, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(10, (long)LoudListener.t_lastEvent.Payload[0]);
log.EventLL(10, 11);
- Assert.Equal(6, LoudListener.LastEvent.EventId);
- Assert.Equal(2, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(10, (long)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(11, (long)LoudListener.LastEvent.Payload[1]);
+ Assert.Equal(6, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(2, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(10, (long)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(11, (long)LoudListener.t_lastEvent.Payload[1]);
log.EventLLL(10, 11, 12);
- Assert.Equal(7, LoudListener.LastEvent.EventId);
- Assert.Equal(3, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(10, (long)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(11, (long)LoudListener.LastEvent.Payload[1]);
- Assert.Equal(12, (long)LoudListener.LastEvent.Payload[2]);
+ Assert.Equal(7, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(3, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(10, (long)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(11, (long)LoudListener.t_lastEvent.Payload[1]);
+ Assert.Equal(12, (long)LoudListener.t_lastEvent.Payload[2]);
#endregion
#region Validate "string" arguments
log.EventS("10");
- Assert.Equal(8, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("10", (string)LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(8, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("10", (string)LoudListener.t_lastEvent.Payload[0]);
log.EventSS("10", "11");
- Assert.Equal(9, LoudListener.LastEvent.EventId);
- Assert.Equal(2, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("10", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal("11", (string)LoudListener.LastEvent.Payload[1]);
+ Assert.Equal(9, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(2, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("10", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal("11", (string)LoudListener.t_lastEvent.Payload[1]);
log.EventSSS("10", "11", "12");
- Assert.Equal(10, LoudListener.LastEvent.EventId);
- Assert.Equal(3, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("10", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal("11", (string)LoudListener.LastEvent.Payload[1]);
- Assert.Equal("12", (string)LoudListener.LastEvent.Payload[2]);
+ Assert.Equal(10, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(3, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("10", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal("11", (string)LoudListener.t_lastEvent.Payload[1]);
+ Assert.Equal("12", (string)LoudListener.t_lastEvent.Payload[2]);
#endregion
#region Validate byte array arguments
byte[] arr = new byte[20];
log.EventWithByteArray(arr);
- Assert.Equal(52, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(arr.Length, ((byte[])LoudListener.LastEvent.Payload[0]).Length);
+ Assert.Equal(52, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(arr.Length, ((byte[])LoudListener.t_lastEvent.Payload[0]).Length);
#endregion
#region Validate mixed type arguments
log.EventSI("10", 11);
- Assert.Equal(11, LoudListener.LastEvent.EventId);
- Assert.Equal(2, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("10", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(11, (int)LoudListener.LastEvent.Payload[1]);
+ Assert.Equal(11, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(2, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("10", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(11, (int)LoudListener.t_lastEvent.Payload[1]);
log.EventSL("10", 11);
- Assert.Equal(12, LoudListener.LastEvent.EventId);
- Assert.Equal(2, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("10", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(11, (long)LoudListener.LastEvent.Payload[1]);
+ Assert.Equal(12, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(2, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("10", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(11, (long)LoudListener.t_lastEvent.Payload[1]);
log.EventSII("10", 11, 12);
- Assert.Equal(13, LoudListener.LastEvent.EventId);
- Assert.Equal(3, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("10", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(11, (int)LoudListener.LastEvent.Payload[1]);
- Assert.Equal(12, (int)LoudListener.LastEvent.Payload[2]);
+ Assert.Equal(13, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(3, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("10", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(11, (int)LoudListener.t_lastEvent.Payload[1]);
+ Assert.Equal(12, (int)LoudListener.t_lastEvent.Payload[2]);
#endregion
#region Validate enums/flags
log.EventEnum(MyColor.Blue);
- Assert.Equal(19, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(MyColor.Blue, (MyColor)LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(19, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(MyColor.Blue, (MyColor)LoudListener.t_lastEvent.Payload[0]);
log.EventEnum1(MyColor.Green);
- Assert.Equal(20, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(MyColor.Green, (MyColor)LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(20, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(MyColor.Green, (MyColor)LoudListener.t_lastEvent.Payload[0]);
log.EventFlags(MyFlags.Flag1);
- Assert.Equal(21, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(MyFlags.Flag1, (MyFlags)LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(21, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(MyFlags.Flag1, (MyFlags)LoudListener.t_lastEvent.Payload[0]);
log.EventFlags1(MyFlags.Flag1);
- Assert.Equal(22, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count);
- Assert.Equal(MyFlags.Flag1, (MyFlags)LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(22, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal(MyFlags.Flag1, (MyFlags)LoudListener.t_lastEvent.Payload[0]);
#endregion
#if USE_ETW // TODO: Enable when TraceEvent is available on CoreCLR. GitHub issue #4864.
@@ -192,16 +192,16 @@ namespace BasicEventSourceTests
Assert.Equal(guid, (Guid)LoudListener.LastEvent.Payload[11]);
#endif // USE_ETW
log.EventWith7Strings("s0", "s1", "s2", "s3", "s4", "s5", "s6");
- Assert.Equal(26, LoudListener.LastEvent.EventId);
- Assert.Equal(7, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("s0", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal("s6", (string)LoudListener.LastEvent.Payload[6]);
+ Assert.Equal(26, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(7, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("s0", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal("s6", (string)LoudListener.t_lastEvent.Payload[6]);
log.EventWith9Strings("s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8");
- Assert.Equal(27, LoudListener.LastEvent.EventId);
- Assert.Equal(9, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("s0", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal("s8", (string)LoudListener.LastEvent.Payload[8]);
+ Assert.Equal(27, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(9, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("s0", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal("s8", (string)LoudListener.t_lastEvent.Payload[8]);
#if USE_ETW // TODO: Enable when TraceEvent is available on CoreCLR. GitHub issue #4864.
log.EventWithWeirdArgs(IntPtr.Zero, true, MyLongEnum.LongVal1 /*, 9999999999999999999999999999m*/);
Assert.Equal(30, LoudListener.LastEvent.EventId);
@@ -225,14 +225,14 @@ namespace BasicEventSourceTests
using (var el = new LoudListener())
{
log.WriteTooManyArgs("Hello");
- Assert.Equal(2, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count); // Faked count (compat)
- Assert.Equal("Hello", LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(2, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count); // Faked count (compat)
+ Assert.Equal("Hello", LoudListener.t_lastEvent.Payload[0]);
log.WriteTooFewArgs(10, 100);
- Assert.Equal(1, LoudListener.LastEvent.EventId);
- Assert.Equal(1, LoudListener.LastEvent.Payload.Count); // Real # of args passed to WriteEvent
- Assert.Equal(10, LoudListener.LastEvent.Payload[0]);
+ Assert.Equal(1, LoudListener.t_lastEvent.EventId);
+ Assert.Equal(1, LoudListener.t_lastEvent.Payload.Count); // Real # of args passed to WriteEvent
+ Assert.Equal(10, LoudListener.t_lastEvent.Payload[0]);
}
}
TestUtilities.CheckNoEventSourcesRunning("Stop");
@@ -329,21 +329,21 @@ namespace BasicEventSourceTests
// 1. Validate that the event fires when ETW event method called unconditionally
log.EventWithEscapingMessage("Hello world!", 10);
- Assert.NotNull(LoudListener.LastEvent);
- Assert.Equal(2, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("Hello world!", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(10, (int)LoudListener.LastEvent.Payload[1]);
+ Assert.NotNull(LoudListener.t_lastEvent);
+ Assert.Equal(2, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("Hello world!", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(10, (int)LoudListener.t_lastEvent.Payload[1]);
// reset LastEvent
- LoudListener.LastEvent = null;
+ LoudListener.t_lastEvent = null;
// 2. Validate that the event fires when ETW event method call is guarded by IsEnabled
if (log.IsEnabled(EventLevel.Informational, 0))
log.EventWithEscapingMessage("Goodbye skies!", 100);
- Assert.NotNull(LoudListener.LastEvent);
- Assert.Equal(2, LoudListener.LastEvent.Payload.Count);
- Assert.Equal("Goodbye skies!", (string)LoudListener.LastEvent.Payload[0]);
- Assert.Equal(100, (int)LoudListener.LastEvent.Payload[1]);
+ Assert.NotNull(LoudListener.t_lastEvent);
+ Assert.Equal(2, LoudListener.t_lastEvent.Payload.Count);
+ Assert.Equal("Goodbye skies!", (string)LoudListener.t_lastEvent.Payload[0]);
+ Assert.Equal(100, (int)LoudListener.t_lastEvent.Payload[1]);
}
}
TestUtilities.CheckNoEventSourcesRunning("Stop");
diff --git a/src/System.DirectoryServices.AccountManagement/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.DirectoryServices.AccountManagement/src/PinvokeAnalyzerExceptionList.analyzerdata.netstandard
index 9df17a61aa..6aacd75e95 100644
--- a/src/System.DirectoryServices.AccountManagement/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ b/src/System.DirectoryServices.AccountManagement/src/PinvokeAnalyzerExceptionList.analyzerdata.netstandard
@@ -1,3 +1,4 @@
+# not available in OneCore
activeds.dll!ADsOpenObject
advapi32.dll!LsaNtStatusToWinError
credui.dll!CredUIParseUserNameW
diff --git a/src/System.DirectoryServices.Protocols/System.DirectoryServices.Protocols.sln b/src/System.DirectoryServices.Protocols/System.DirectoryServices.Protocols.sln
index 78def5ce28..b37e05fa92 100644
--- a/src/System.DirectoryServices.Protocols/System.DirectoryServices.Protocols.sln
+++ b/src/System.DirectoryServices.Protocols/System.DirectoryServices.Protocols.sln
@@ -2,6 +2,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.DirectoryServices.Protocols.Tests", "tests\System.DirectoryServices.Protocols.Tests.csproj", "{297A9116-1005-499D-A895-2063D03E4C94}"
+ ProjectSection(ProjectDependencies) = postProject
+ {135980AC-4583-44EC-894E-CB3B1A481920} = {135980AC-4583-44EC-894E-CB3B1A481920}
+ EndProjectSection
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.DirectoryServices.Protocols", "src\System.DirectoryServices.Protocols.csproj", "{135980AC-4583-44EC-894E-CB3B1A481920}"
ProjectSection(ProjectDependencies) = postProject
{7DEA4539-9A0D-4801-B229-3824710EBCEE} = {7DEA4539-9A0D-4801-B229-3824710EBCEE}
@@ -9,6 +14,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.DirectoryServices.Pr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.DirectoryServices.Protocols", "ref\System.DirectoryServices.Protocols.csproj", "{7DEA4539-9A0D-4801-B229-3824710EBCEE}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1A2F9F4A-A032-433E-B914-ADD5992BB178}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{2E666815-2EDB-464B-9DF6-380BF4789AD4}"
@@ -19,6 +26,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {297A9116-1005-499D-A895-2063D03E4C94}.Debug|Any CPU.ActiveCfg = netstandard-Windows_NT-Debug|Any CPU
+ {297A9116-1005-499D-A895-2063D03E4C94}.Debug|Any CPU.Build.0 = netstandard-Windows_NT-Debug|Any CPU
+ {297A9116-1005-499D-A895-2063D03E4C94}.Release|Any CPU.ActiveCfg = netstandard-Windows_NT-Release|Any CPU
+ {297A9116-1005-499D-A895-2063D03E4C94}.Release|Any CPU.Build.0 = netstandard-Windows_NT-Release|Any CPU
{135980AC-4583-44EC-894E-CB3B1A481920}.Debug|Any CPU.ActiveCfg = netstandard-Windows_NT-Debug|Any CPU
{135980AC-4583-44EC-894E-CB3B1A481920}.Debug|Any CPU.Build.0 = netstandard-Windows_NT-Debug|Any CPU
{135980AC-4583-44EC-894E-CB3B1A481920}.Release|Any CPU.ActiveCfg = netstandard-Windows_NT-Release|Any CPU
@@ -32,6 +43,7 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {297A9116-1005-499D-A895-2063D03E4C94} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{135980AC-4583-44EC-894E-CB3B1A481920} = {E107E9C1-E893-4E87-987E-04EF0DCEAEFD}
{7DEA4539-9A0D-4801-B229-3824710EBCEE} = {2E666815-2EDB-464B-9DF6-380BF4789AD4}
EndGlobalSection
diff --git a/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryException.cs b/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryException.cs
index 0461d7623d..25e2e3f1b0 100644
--- a/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryException.cs
+++ b/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/common/DirectoryException.cs
@@ -33,10 +33,7 @@ namespace System.DirectoryServices.Protocols
public class DirectoryOperationException : DirectoryException, ISerializable
{
internal DirectoryResponse response = null;
- protected DirectoryOperationException(SerializationInfo info, StreamingContext context) : base(info, context)
- {
- throw new PlatformNotSupportedException();
- }
+ protected DirectoryOperationException(SerializationInfo info, StreamingContext context) : base(info, context) { }
public DirectoryOperationException() : base() { }
@@ -76,10 +73,7 @@ namespace System.DirectoryServices.Protocols
[Serializable]
public class BerConversionException : DirectoryException
{
- protected BerConversionException(SerializationInfo info, StreamingContext context) : base(info, context)
- {
- throw new PlatformNotSupportedException();
- }
+ protected BerConversionException(SerializationInfo info, StreamingContext context) : base(info, context) { }
public BerConversionException() : base(String.Format(CultureInfo.CurrentCulture, SR.BerConversionError))
{
diff --git a/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapException.cs b/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapException.cs
index 70111bdbf5..de8c2fdaaf 100644
--- a/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapException.cs
+++ b/src/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapException.cs
@@ -79,10 +79,7 @@ namespace System.DirectoryServices.Protocols
private int _errorCode;
private string _serverErrorMessage;
internal PartialResultsCollection results = new PartialResultsCollection();
- protected LdapException(SerializationInfo info, StreamingContext context) : base(info, context)
- {
- throw new PlatformNotSupportedException();
- }
+ protected LdapException(SerializationInfo info, StreamingContext context) : base(info, context) { }
public LdapException() : base() { }
@@ -144,10 +141,7 @@ namespace System.DirectoryServices.Protocols
[Serializable]
public class TlsOperationException : DirectoryOperationException
{
- protected TlsOperationException(SerializationInfo info, StreamingContext context) : base(info, context)
- {
- throw new PlatformNotSupportedException();
- }
+ protected TlsOperationException(SerializationInfo info, StreamingContext context) : base(info, context) { }
public TlsOperationException() : base() { }
diff --git a/src/System.DirectoryServices.Protocols/tests/AddRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/AddRequestTests.cs
new file mode 100644
index 0000000000..2b3ffe2008
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/AddRequestTests.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class AddRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new AddRequest();
+ Assert.Empty(request.Attributes);
+ Assert.Empty(request.Controls);
+ Assert.Null(request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ public static IEnumerable<object[]> Ctor_DistinguishedName_Attributes_TestData()
+ {
+ yield return new object[] { null, null };
+ yield return new object[] { string.Empty, new DirectoryAttribute[0] };
+ yield return new object[] { "DistinguishedName", new DirectoryAttribute[] { new DirectoryAttribute("name", "value") } };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_DistinguishedName_Attributes_TestData))]
+ public void Ctor_DistinguishedString_Attributes(string distinguishedName, DirectoryAttribute[] attributes)
+ {
+ var request = new AddRequest(distinguishedName, attributes);
+ Assert.Equal(attributes ?? Enumerable.Empty<DirectoryAttribute>(), request.Attributes.Cast<DirectoryAttribute>());
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Ctor_NullObjectInAttributes_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>(null, () => new AddRequest("DistinguishedName", new DirectoryAttribute[] { null }));
+ }
+
+ [Theory]
+ [InlineData(null, "")]
+ [InlineData("DistinguishedName", "ObjectClass")]
+ public void Ctor_DistinguishedName_ObjectClass(string distinguishedName, string objectClass)
+ {
+ var request = new AddRequest(distinguishedName, objectClass);
+ DirectoryAttribute attribute = (DirectoryAttribute)Assert.Single(request.Attributes);
+ Assert.Equal("objectClass", attribute.Name);
+ Assert.Equal(new string[] { objectClass }, attribute.GetValues(typeof(string)));
+
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Ctor_NullObjectClass_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("objectClass", () => new AddRequest("DistinguishedName", (string)null));
+ }
+
+ [Fact]
+ public void DistinguishedName_Set_GetReturnsExpected()
+ {
+ var request = new AddRequest { DistinguishedName = "Name" };
+ Assert.Equal("Name", request.DistinguishedName);
+ }
+
+ [Fact]
+ public void RequestId_Set_GetReturnsExpected()
+ {
+ var request = new AddRequest { RequestId = "Id" };
+ Assert.Equal("Id", request.RequestId);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/AsqRequestControlTests.cs b/src/System.DirectoryServices.Protocols/tests/AsqRequestControlTests.cs
new file mode 100644
index 0000000000..a48e2be193
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/AsqRequestControlTests.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class AsqRequestControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new AsqRequestControl();
+ Assert.Null(control.AttributeName);
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1504", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 2, 4, 0 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(null, new byte[] { 48, 132, 0, 0, 0, 2, 4, 0 })]
+ [InlineData("", new byte[] { 48, 132, 0, 0, 0, 2, 4, 0 })]
+ [InlineData("A", new byte[] { 48, 132, 0, 0, 0, 3, 4, 1, 65 })]
+ public void Ctor_String(string attributeName, byte[] expectedValue)
+ {
+ var control = new AsqRequestControl(attributeName);
+ Assert.Equal(attributeName, control.AttributeName);
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1504", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Fact]
+ public void AttributeName_Set_GetReturnsExpected()
+ {
+ var control = new AsqRequestControl { AttributeName = "Name" };
+ Assert.Equal("Name", control.AttributeName);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/BerConversionExceptionTests.cs b/src/System.DirectoryServices.Protocols/tests/BerConversionExceptionTests.cs
new file mode 100644
index 0000000000..f6fc17a2ca
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/BerConversionExceptionTests.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class BerConversionExceptionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var exception = new BerConversionException();
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message()
+ {
+ var exception = new BerConversionException("message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new BerConversionException("message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Same(innerException, exception.InnerException);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/CompareRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/CompareRequestTests.cs
new file mode 100644
index 0000000000..98e90b0bc0
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/CompareRequestTests.cs
@@ -0,0 +1,119 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class CompareRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new CompareRequest();
+ Assert.Empty(request.Assertion);
+ Assert.Empty(request.Controls);
+ Assert.Null(request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Theory]
+ [InlineData(null, "", "")]
+ [InlineData("DistinguishedName", "AttributeName", "value")]
+ public void Ctor_DistinguishedName_AttributeName_StringValue(string distinguishedName, string attributeName, string value)
+ {
+ var request = new CompareRequest(distinguishedName, attributeName, value);
+ Assert.Equal(attributeName, request.Assertion.Name);
+ Assert.Equal(new string[] { value }, request.Assertion.GetValues(typeof(string)));
+
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Theory]
+ [InlineData(null, "", new byte[0])]
+ [InlineData("DistinguishedName", "AttributeName", new byte[] { 1, 2, 3 })]
+ public void Ctor_DistinguishedName_AttributeName_ByteArrayValue(string distinguishedName, string attributeName, byte[] value)
+ {
+ var request = new CompareRequest(distinguishedName, attributeName, value);
+ Assert.Equal(attributeName, request.Assertion.Name);
+ Assert.Equal(new byte[][] { value }, request.Assertion.GetValues(typeof(byte[])));
+
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Ctor_DistinguishedName_AttributeName_Uri()
+ {
+ var uri = new Uri("http://microsoft.com");
+ var request = new CompareRequest("DistinguishedName", "AttributeName", uri);
+
+ Assert.Equal("AttributeName", request.Assertion.Name);
+ Assert.Equal(uri, Assert.Single(request.Assertion));
+
+ Assert.Empty(request.Controls);
+ Assert.Equal("DistinguishedName", request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Ctor_NullAttributeName_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("attributeName", () => new CompareRequest("DistinguishedName", null, "Value"));
+ AssertExtensions.Throws<ArgumentNullException>("attributeName", () => new CompareRequest("DistinguishedName", null, new byte[0]));
+ AssertExtensions.Throws<ArgumentNullException>("attributeName", () => new CompareRequest("DistinguishedName", null, new Uri("http://microsoft.com")));
+ }
+
+ [Fact]
+ public void Ctor_NullValue_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new CompareRequest("DistinguishedName", "AttributeName", (string)null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new CompareRequest("DistinguishedName", "AttributeName", (byte[])null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new CompareRequest("DistinguishedName", "AttributeName", (Uri)null));
+ }
+
+ [Fact]
+ public void Ctor_DistinguishedName_Assertion()
+ {
+ var assertion = new DirectoryAttribute { "value" };
+ var request = new CompareRequest("DistinguishedName", assertion);
+
+ Assert.NotSame(assertion, request.Assertion);
+ Assert.Equal(assertion, request.Assertion);
+ Assert.Empty(request.Controls);
+ Assert.Equal("DistinguishedName", request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Ctor_NullAssertion_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("assertion", () => new CompareRequest("DistinguishedName", null));
+ }
+
+ public static IEnumerable<object[]> InvalidAssertion_TestData()
+ {
+ yield return new object[] { new DirectoryAttribute { "value1", "value2" } };
+ yield return new object[] { new DirectoryAttribute() };
+ }
+
+ [Theory]
+ [MemberData(nameof(InvalidAssertion_TestData))]
+ public void Ctor_InvalidAssertion_ThrowsArgumentException(DirectoryAttribute assertion)
+ {
+ AssertExtensions.Throws<ArgumentException>(null, () => new CompareRequest("DistinguishedName", assertion));
+ }
+
+ [Fact]
+ public void DistinguishedName_Set_GetReturnsExpected()
+ {
+ var request = new CompareRequest { DistinguishedName = "Name" };
+ Assert.Equal("Name", request.DistinguishedName);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/Configurations.props b/src/System.DirectoryServices.Protocols/tests/Configurations.props
new file mode 100644
index 0000000000..ed4061c7d6
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/Configurations.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <BuildConfigurations>
+ netstandard-Windows_NT;
+ </BuildConfigurations>
+ </PropertyGroup>
+</Project>
diff --git a/src/System.DirectoryServices.Protocols/tests/CrossDomainMoveControlTests.cs b/src/System.DirectoryServices.Protocols/tests/CrossDomainMoveControlTests.cs
new file mode 100644
index 0000000000..b9b86d913c
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/CrossDomainMoveControlTests.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class CrossDomainMoveControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new CrossDomainMoveControl();
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Null(control.TargetDomainController);
+ Assert.Equal("1.2.840.113556.1.4.521", control.Type);
+
+ Assert.Empty(control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(null, new byte[0])]
+ [InlineData("", new byte[] { 0, 0 })]
+ [InlineData("A", new byte[] { 65, 0, 0 })]
+ public void Ctor_String(string targetDomainController, byte[] expectedValue)
+ {
+ var control = new CrossDomainMoveControl(targetDomainController);
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal(targetDomainController, control.TargetDomainController);
+ Assert.Equal("1.2.840.113556.1.4.521", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Fact]
+ public void TargetDomainController_Set_GetReturnsExpected()
+ {
+ var control = new CrossDomainMoveControl { TargetDomainController = "Name" };
+ Assert.Equal("Name", control.TargetDomainController);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DeleteRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/DeleteRequestTests.cs
new file mode 100644
index 0000000000..2d432ae21c
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DeleteRequestTests.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DeleteRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new DeleteRequest();
+ Assert.Empty(request.Controls);
+ Assert.Null(request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("DistinguishedName")]
+ public void Ctor_DistinguishedName(string distinguishedName)
+ {
+ var request = new DeleteRequest(distinguishedName);
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void DistinguishedName_Set_GetReturnsExpected()
+ {
+ var request = new DeleteRequest { DistinguishedName = "Name" };
+ Assert.Equal("Name", request.DistinguishedName);
+ }
+
+ [Fact]
+ public void RequestId_Set_GetReturnsExpected()
+ {
+ var request = new DeleteRequest { RequestId = "Id" };
+ Assert.Equal("Id", request.RequestId);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirSyncRequestControlTests.cs b/src/System.DirectoryServices.Protocols/tests/DirSyncRequestControlTests.cs
new file mode 100644
index 0000000000..ac93d56d56
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirSyncRequestControlTests.cs
@@ -0,0 +1,109 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirSyncRequestControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new DirSyncRequestControl();
+ Assert.Equal(1048576, control.AttributeCount);
+ Assert.Empty(control.Cookie);
+ Assert.Equal(DirectorySynchronizationOptions.None, control.Option);
+
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.841", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 10, 2, 1, 0, 2, 3, 16, 0, 0, 4, 0 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(null, new byte[] { 48, 132, 0, 0, 0, 10, 2, 1, 0, 2, 3, 16, 0, 0, 4, 0 })]
+ [InlineData(new byte[0], new byte[] { 48, 132, 0, 0, 0, 10, 2, 1, 0, 2, 3, 16, 0, 0, 4, 0 })]
+ [InlineData(new byte[] { 97, 98, 99 }, new byte[] { 48, 132, 0, 0, 0, 13, 2, 1, 0, 2, 3, 16, 0, 0, 4, 3, 97, 98, 99 })]
+ public void Ctor_Cookie(byte[] cookie, byte[] expectedValue)
+ {
+ var control = new DirSyncRequestControl(cookie);
+ Assert.Equal(1048576, control.AttributeCount);
+ Assert.Equal(cookie ?? Array.Empty<byte>(), control.Cookie);
+ Assert.Equal(DirectorySynchronizationOptions.None, control.Option);
+
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.841", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(null, DirectorySynchronizationOptions.None, new byte[] { 48, 132, 0, 0, 0, 10, 2, 1, 0, 2, 3, 16, 0, 0, 4, 0 })]
+ [InlineData(new byte[0], DirectorySynchronizationOptions.None - 1, new byte[] { 48, 132, 0, 0, 0, 13, 2, 4, 255, 255, 255, 255, 2, 3, 16, 0, 0, 4, 0 })]
+ [InlineData(new byte[] { 97, 98, 99 }, DirectorySynchronizationOptions.ObjectSecurity, new byte[] { 48, 132, 0, 0, 0, 13, 2, 1, 1, 2, 3, 16, 0, 0, 4, 3, 97, 98, 99 })]
+ public void Ctor_Cookie_Options(byte[] cookie, DirectorySynchronizationOptions option, byte[] expectedValue)
+ {
+ var control = new DirSyncRequestControl(cookie, option);
+ Assert.Equal(1048576, control.AttributeCount);
+ Assert.Equal(cookie ?? Array.Empty<byte>(), control.Cookie);
+ Assert.Equal(option, control.Option);
+
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.841", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(null, DirectorySynchronizationOptions.None, 1048576, new byte[] { 48, 132, 0, 0, 0, 10, 2, 1, 0, 2, 3, 16, 0, 0, 4, 0 })]
+ [InlineData(new byte[0], DirectorySynchronizationOptions.None - 1, 0, new byte[] { 48, 132, 0, 0, 0, 11, 2, 4, 255, 255, 255, 255, 2, 1, 0, 4, 0 })]
+ [InlineData(new byte[] { 97, 98, 99 }, DirectorySynchronizationOptions.ObjectSecurity, 10, new byte[] { 48, 132, 0, 0, 0, 11, 2, 1, 1, 2, 1, 10, 4, 3, 97, 98, 99 })]
+ public void Ctor_Cookie_Options_AttributeCount(byte[] cookie, DirectorySynchronizationOptions option, int attributeCount , byte[] expectedValue)
+ {
+ var control = new DirSyncRequestControl(cookie, option, attributeCount);
+ Assert.Equal(attributeCount, control.AttributeCount);
+ Assert.Equal(cookie ?? Array.Empty<byte>(), control.Cookie);
+ Assert.Equal(option, control.Option);
+
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.841", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Fact]
+ public void Ctor_NegativeAttributeCount_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => new DirSyncRequestControl(new byte[0], DirectorySynchronizationOptions.None, -1));
+ }
+
+ [Fact]
+ public void AttributeCount_SetValid_GetReturnsExpected()
+ {
+ var control = new DirSyncRequestControl { AttributeCount = 0 };
+ Assert.Equal(0, control.AttributeCount);
+ }
+
+ [Fact]
+ public void AttributeCount_SetNegative_ThrowsArgumentException()
+ {
+ var control = new DirSyncRequestControl();
+ AssertExtensions.Throws<ArgumentException>("value", () => control.AttributeCount = -1);
+ }
+
+ [Fact]
+ public void Cookie_Set_GetReturnsExpected()
+ {
+ byte[] cookie = new byte[] { 1, 2, 3 };
+ var control = new DirSyncRequestControl { Cookie = cookie };
+ Assert.NotSame(cookie, control.Cookie);
+ Assert.Equal(cookie, control.Cookie);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeCollectionTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeCollectionTests.cs
new file mode 100644
index 0000000000..1361f65bd1
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeCollectionTests.cs
@@ -0,0 +1,177 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryAttributeCollectionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var collection = new DirectoryAttributeCollection();
+ Assert.Equal(0, collection.Count);
+ Assert.Equal(0, collection.Capacity);
+ }
+
+ [Fact]
+ public void Indexer_Set_GetReturnsExpected()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ var collection = new DirectoryAttributeCollection { new DirectoryAttribute() };
+ collection[0] = attribute;
+ Assert.Equal(attribute, collection[0]);
+ }
+
+ [Fact]
+ public void Indexer_SetNull_ThrowsArgumentException()
+ {
+ var collection = new DirectoryAttributeCollection();
+ AssertExtensions.Throws<ArgumentException>(null, () => collection[0] = null);
+ }
+
+ [Fact]
+ public void Add_ValidAttribute_AppendsToList()
+ {
+ var attribute1 = new DirectoryAttribute("name1", "value");
+ var attribute2 = new DirectoryAttribute("name2", "value");
+ var collection = new DirectoryAttributeCollection { attribute1, attribute2 };
+ Assert.Equal(2, collection.Count);
+ Assert.Equal(new DirectoryAttribute[] { attribute1, attribute2 }, collection.Cast<DirectoryAttribute>());
+ }
+
+ [Fact]
+ public void Add_NullAttribute_ThrowsArgumentException()
+ {
+ var collection = new DirectoryAttributeCollection();
+ AssertExtensions.Throws<ArgumentException>(null, () => collection.Add(null));
+ }
+
+ [Fact]
+ public void AddRange_ValidAttributes_AddsToCollection()
+ {
+ DirectoryAttribute[] attributes = new DirectoryAttribute[] { new DirectoryAttribute(), new DirectoryAttribute() };
+
+ var collection = new DirectoryAttributeCollection();
+ collection.AddRange(attributes);
+
+ Assert.Equal(attributes, collection.Cast<DirectoryAttribute>());
+ }
+
+ [Fact]
+ public void AddRange_NullAttributes_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryAttributeCollection();
+ AssertExtensions.Throws<ArgumentNullException>("attributes", () => collection.AddRange((DirectoryAttribute[])null));
+ }
+
+ [Fact]
+ public void AddRange_NullObjectInValues_ThrowsArgumentException()
+ {
+ DirectoryAttribute[] attributes = new DirectoryAttribute[] { new DirectoryAttribute(), null, new DirectoryAttribute() };
+ var collection = new DirectoryAttributeCollection();
+
+ AssertExtensions.Throws<ArgumentException>(null, () => collection.AddRange(attributes));
+ Assert.Equal(0, collection.Count);
+ }
+
+ [Fact]
+ public void AddRange_ValidAttributeCollection_AddsToCollection()
+ {
+ DirectoryAttribute[] attributes = new DirectoryAttribute[] { new DirectoryAttribute(), new DirectoryAttribute() };
+ var attributeCollection = new DirectoryAttributeCollection();
+ attributeCollection.AddRange(attributes);
+
+ var collection = new DirectoryAttributeCollection();
+ collection.AddRange(attributeCollection);
+
+ Assert.Equal(attributes, collection.Cast<DirectoryAttribute>());
+ }
+
+ [Fact]
+ public void AddRange_NullAttributeCollection_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryAttributeCollection();
+ AssertExtensions.Throws<ArgumentNullException>("attributeCollection", () => collection.AddRange((DirectoryAttributeCollection)null));
+ }
+
+ [Fact]
+ public void Contains_Valid_ReturnsExpected()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ var collection = new DirectoryAttributeCollection { attribute };
+ Assert.True(collection.Contains(attribute));
+ Assert.False(collection.Contains(new DirectoryAttribute()));
+ Assert.False(collection.Contains(null));
+ }
+
+ [Fact]
+ public void CopyTo_MultipleTypes_Success()
+ {
+ DirectoryAttribute[] array = new DirectoryAttribute[3];
+ var attribute = new DirectoryAttribute { "value" };
+
+ var collection = new DirectoryAttributeCollection { attribute };
+ collection.CopyTo(array, 1);
+ Assert.Equal(new DirectoryAttribute[] { null, attribute, null }, array);
+ }
+
+ [Fact]
+ public void Insert_ValidDirectoryAttribute_Success()
+ {
+ var attribute1 = new DirectoryAttribute { "value1" };
+ var attribute2 = new DirectoryAttribute { "value2" };
+ var collection = new DirectoryAttributeCollection();
+ collection.Insert(0, attribute1);
+ collection.Insert(1, attribute2);
+
+ Assert.Equal(new DirectoryAttribute[] { attribute1, attribute2 }, collection.Cast<DirectoryAttribute>());
+ }
+
+ [Fact]
+ public void Insert_NullValue_ThrowsArgumentException()
+ {
+ var collection = new DirectoryAttributeCollection();
+ AssertExtensions.Throws<ArgumentException>(null, () => collection.Insert(0, null));
+ }
+
+ [Fact]
+ public void IndexOf_Valid_ReturnsExpected()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ var collection = new DirectoryAttributeCollection { attribute };
+ Assert.Equal(0, collection.IndexOf(attribute));
+ Assert.Equal(-1, collection.IndexOf(new DirectoryAttribute()));
+ Assert.Equal(-1, collection.IndexOf(null));
+ }
+
+ [Fact]
+ public void Remove_Valid_Success()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ var collection = new DirectoryAttributeCollection { attribute };
+ collection.Remove(attribute);
+ Assert.Empty(collection);
+ }
+
+ public static IEnumerable<object[]> Remove_InvalidValue_TestData()
+ {
+ yield return new object[] { null, null };
+ yield return new object[] { new DirectoryAttribute(), null };
+ yield return new object[] { 1, "value" };
+ }
+
+ [Theory]
+ [MemberData(nameof(Remove_InvalidValue_TestData))]
+ public void Remove_InvalidValue_ThrowsArgumentException(object value, string paramName)
+ {
+ IList collection = new DirectoryAttributeCollection { new DirectoryAttribute() };
+ AssertExtensions.Throws<ArgumentException>(paramName, () => collection.Remove(value));
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationCollectionTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationCollectionTests.cs
new file mode 100644
index 0000000000..11cfd2cbc1
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationCollectionTests.cs
@@ -0,0 +1,177 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryAttributeModificationCollectionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var collection = new DirectoryAttributeModificationCollection();
+ Assert.Equal(0, collection.Count);
+ Assert.Equal(0, collection.Capacity);
+ }
+
+ [Fact]
+ public void Indexer_Set_GetReturnsExpected()
+ {
+ var attribute = new DirectoryAttributeModification { "value" };
+ var collection = new DirectoryAttributeModificationCollection { new DirectoryAttributeModification() };
+ collection[0] = attribute;
+ Assert.Equal(attribute, collection[0]);
+ }
+
+ [Fact]
+ public void Indexer_SetNull_ThrowsArgumentException()
+ {
+ var collection = new DirectoryAttributeModificationCollection();
+ AssertExtensions.Throws<ArgumentException>(null, () => collection[0] = null);
+ }
+
+ [Fact]
+ public void Add_ValidAttribute_AppendsToList()
+ {
+ var attribute1 = new DirectoryAttributeModification { "value1" };
+ var attribute2 = new DirectoryAttributeModification { "value2" };
+ var collection = new DirectoryAttributeModificationCollection { attribute1, attribute2 };
+ Assert.Equal(2, collection.Count);
+ Assert.Equal(new DirectoryAttributeModification[] { attribute1, attribute2 }, collection.Cast<DirectoryAttributeModification>());
+ }
+
+ [Fact]
+ public void Add_NullAttribute_ThrowsArgumentException()
+ {
+ var collection = new DirectoryAttributeModificationCollection();
+ AssertExtensions.Throws<ArgumentException>(null, () => collection.Add(null));
+ }
+
+ [Fact]
+ public void AddRange_ValidAttributes_AddsToCollection()
+ {
+ DirectoryAttributeModification[] attributes = new DirectoryAttributeModification[] { new DirectoryAttributeModification(), new DirectoryAttributeModification() };
+
+ var collection = new DirectoryAttributeModificationCollection();
+ collection.AddRange(attributes);
+
+ Assert.Equal(attributes, collection.Cast<DirectoryAttributeModification>());
+ }
+
+ [Fact]
+ public void AddRange_NullAttributes_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryAttributeModificationCollection();
+ AssertExtensions.Throws<ArgumentNullException>("attributes", () => collection.AddRange((DirectoryAttributeModification[])null));
+ }
+
+ [Fact]
+ public void AddRange_NullObjectInValues_ThrowsArgumentException()
+ {
+ DirectoryAttributeModification[] attributes = new DirectoryAttributeModification[] { new DirectoryAttributeModification(), null, new DirectoryAttributeModification() };
+ var collection = new DirectoryAttributeModificationCollection();
+
+ AssertExtensions.Throws<ArgumentException>(null, () => collection.AddRange(attributes));
+ Assert.Equal(0, collection.Count);
+ }
+
+ [Fact]
+ public void AddRange_ValidAttributeCollection_AddsToCollection()
+ {
+ DirectoryAttributeModification[] attributes = new DirectoryAttributeModification[] { new DirectoryAttributeModification(), new DirectoryAttributeModification() };
+ var attributeCollection = new DirectoryAttributeModificationCollection();
+ attributeCollection.AddRange(attributes);
+
+ var collection = new DirectoryAttributeModificationCollection();
+ collection.AddRange(attributeCollection);
+
+ Assert.Equal(attributes, collection.Cast<DirectoryAttributeModification>());
+ }
+
+ [Fact]
+ public void AddRange_NullAttributeCollection_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryAttributeModificationCollection();
+ AssertExtensions.Throws<ArgumentNullException>("attributeCollection", () => collection.AddRange((DirectoryAttributeModificationCollection)null));
+ }
+
+ [Fact]
+ public void Contains_Valid_ReturnsExpected()
+ {
+ var attribute = new DirectoryAttributeModification { "value" };
+ var collection = new DirectoryAttributeModificationCollection { attribute };
+ Assert.True(collection.Contains(attribute));
+ Assert.False(collection.Contains(new DirectoryAttributeModification()));
+ Assert.False(collection.Contains(null));
+ }
+
+ [Fact]
+ public void CopyTo_MultipleTypes_Success()
+ {
+ DirectoryAttributeModification[] array = new DirectoryAttributeModification[3];
+ var attribute = new DirectoryAttributeModification { "value" };
+
+ var collection = new DirectoryAttributeModificationCollection { attribute };
+ collection.CopyTo(array, 1);
+ Assert.Equal(new DirectoryAttributeModification[] { null, attribute, null }, array);
+ }
+
+ [Fact]
+ public void Insert_ValidDirectoryAttribute_Success()
+ {
+ var attribute1 = new DirectoryAttributeModification { "value1" };
+ var attribute2 = new DirectoryAttributeModification { "value2" };
+ var collection = new DirectoryAttributeModificationCollection();
+ collection.Insert(0, attribute1);
+ collection.Insert(1, attribute2);
+
+ Assert.Equal(new DirectoryAttributeModification[] { attribute1, attribute2 }, collection.Cast<DirectoryAttributeModification>());
+ }
+
+ [Fact]
+ public void Insert_NullValue_ThrowsArgumentException()
+ {
+ var collection = new DirectoryAttributeModificationCollection();
+ AssertExtensions.Throws<ArgumentException>(null, () => collection.Insert(0, null));
+ }
+
+ [Fact]
+ public void IndexOf_Valid_ReturnsExpected()
+ {
+ var attribute = new DirectoryAttributeModification { "value" };
+ var collection = new DirectoryAttributeModificationCollection { attribute };
+ Assert.Equal(0, collection.IndexOf(attribute));
+ Assert.Equal(-1, collection.IndexOf(new DirectoryAttributeModification()));
+ Assert.Equal(-1, collection.IndexOf(null));
+ }
+
+ [Fact]
+ public void Remove_Valid_Success()
+ {
+ var attribute = new DirectoryAttributeModification { "value" };
+ var collection = new DirectoryAttributeModificationCollection { attribute };
+ collection.Remove(attribute);
+ Assert.Empty(collection);
+ }
+
+ public static IEnumerable<object[]> Remove_InvalidValue_TestData()
+ {
+ yield return new object[] { null, null };
+ yield return new object[] { new DirectoryAttributeModification(), null };
+ yield return new object[] { 1, "value" };
+ }
+
+ [Theory]
+ [MemberData(nameof(Remove_InvalidValue_TestData))]
+ public void Remove_InvalidValue_ThrowsArgumentException(object value, string paramName)
+ {
+ IList collection = new DirectoryAttributeModificationCollection { new DirectoryAttributeModification() };
+ AssertExtensions.Throws<ArgumentException>(paramName, () => collection.Remove(value));
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationTests.cs
new file mode 100644
index 0000000000..b7661d93df
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeModificationTests.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.ComponentModel;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryAttributeModificationTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var modification = new DirectoryAttributeModification();
+ Assert.Empty(modification.Name);
+ Assert.Empty(modification);
+ Assert.Equal(DirectoryAttributeOperation.Replace, modification.Operation);
+ }
+
+ [Fact]
+ public void Operation_SetValid_GetReturnsExpected()
+ {
+ var modification = new DirectoryAttributeModification { Operation = DirectoryAttributeOperation.Delete };
+ Assert.Equal(DirectoryAttributeOperation.Delete, modification.Operation);
+ }
+
+ [Theory]
+ [InlineData(DirectoryAttributeOperation.Add - 1)]
+ [InlineData(DirectoryAttributeOperation.Replace + 1)]
+ public void Operation_SetInvalid_InvalidEnumArgumentException(DirectoryAttributeOperation operation)
+ {
+ var modification = new DirectoryAttributeModification();
+ AssertExtensions.Throws<InvalidEnumArgumentException>("value", () => modification.Operation = operation);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeTests.cs
new file mode 100644
index 0000000000..7cbbe2efb7
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryAttributeTests.cs
@@ -0,0 +1,341 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Linq;
+using System.Reflection;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryAttributeTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var attribute = new DirectoryAttribute();
+ Assert.Empty(attribute.Name);
+ Assert.Equal(0, attribute.Count);
+ Assert.Equal(0, attribute.Capacity);
+ }
+
+ [Theory]
+ [InlineData("", "")]
+ [InlineData("name", "value")]
+ public void Ctor_Name_StringValue(string name, string value)
+ {
+ var attribute = new DirectoryAttribute(name, value);
+ Assert.Equal(name, attribute.Name);
+ Assert.Equal(value, Assert.Single(attribute));
+
+ Assert.Equal(1, attribute.Count);
+ Assert.Equal(4, attribute.Capacity);
+ }
+
+
+ [Theory]
+ [InlineData("", new byte[] { 1, 2, 3 })]
+ [InlineData("name", new byte[] { 1, 2, 3 })]
+ public void Ctor_Name_ByteArrayValue(string name, byte[] value)
+ {
+ var attribute = new DirectoryAttribute(name, value);
+ Assert.Equal(name, attribute.Name);
+ Assert.Equal(value, Assert.Single(attribute));
+
+ Assert.Equal(1, attribute.Count);
+ Assert.Equal(4, attribute.Capacity);
+ }
+
+ [Fact]
+ public void Ctor_Name_UriValue()
+ {
+ var uri = new Uri("http://microsoft.com");
+ var attribute = new DirectoryAttribute("Name", uri);
+ Assert.Equal("Name", attribute.Name);
+ Assert.Equal(uri, Assert.Single(attribute));
+
+ Assert.Equal(1, attribute.Count);
+ Assert.Equal(4, attribute.Capacity);
+ }
+
+ [Fact]
+ public void Ctor_NullName_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("name", () => new DirectoryAttribute(null, ""));
+ AssertExtensions.Throws<ArgumentNullException>("name", () => new DirectoryAttribute(null, new byte[0]));
+ AssertExtensions.Throws<ArgumentNullException>("name", () => new DirectoryAttribute(null, new Uri("http://microsoft.com")));
+ AssertExtensions.Throws<ArgumentNullException>("name", () => new DirectoryAttribute(null, new object[0]));
+ }
+
+ [Fact]
+ public void Ctor_NullValue_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new DirectoryAttribute("Name", (string)null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new DirectoryAttribute("Name", (byte[])null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new DirectoryAttribute("Name", (Uri)null));
+ }
+
+ [Fact]
+ public void Ctor_Name_Values()
+ {
+ object[] values = new object[] { "value", new byte[] { 1, 2, 3 }, new Uri("http://microsoft.com") };
+
+ var attribute = new DirectoryAttribute("Name", values);
+ Assert.Equal("Name", attribute.Name);
+ Assert.Equal(3, attribute.Count);
+ Assert.Equal(values, attribute.Cast<object>());
+ }
+
+ [Fact]
+ public void Ctor_NullValues_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("values", () => new DirectoryAttribute("Name", (object[])null));
+ }
+
+ [Fact]
+ public void Ctor_NullObjectValues_ThrowsArgumentNullException()
+ {
+ string[] values = new string[] { "value1", null, "value2" };
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new DirectoryAttribute("Name", values));
+ }
+
+ [Fact]
+ public void Ctor_InvalidObjectInValues_ThrowsArgumentException()
+ {
+ object[] values = new object[] { 1 };
+ AssertExtensions.Throws<ArgumentException>("value", () => new DirectoryAttribute("Name", values));
+ }
+
+ [Fact]
+ public void Name_Set_GetReturnsExpected()
+ {
+ var attribute = new DirectoryAttribute { Name = "Name" };
+ Assert.Equal("Name", attribute.Name);
+ }
+
+ [Fact]
+ public void Name_SetNull_ThrowsArgumentNullException()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Name = null);
+ }
+
+ [Fact]
+ public void GetValues_Mixed_Success()
+ {
+ var attribute = new DirectoryAttribute { "abc", new byte[] { 100, 101, 102 } };
+ Assert.Equal(new byte[][] { new byte[] { 97, 98, 99 }, new byte[] { 100, 101, 102 } }, attribute.GetValues(typeof(byte[])));
+ Assert.Equal(new string[] { "abc", "def" }, attribute.GetValues(typeof(string)));
+ }
+
+ [Fact]
+ public void GetValues_ContainsUri_ThrowsNotSupportedException()
+ {
+ var attribute = new DirectoryAttribute { "abc", new byte[] { 100, 101, 102 }, new Uri("http://microsoft.com") };
+ Assert.Throws<NotSupportedException>(() => attribute.GetValues(typeof(byte[])));
+ Assert.Throws<NotSupportedException>(() => attribute.GetValues(typeof(string)));
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData(typeof(Uri))]
+ [InlineData(typeof(int))]
+ public void GetValues_InvalidType_ThrowsArgumentException(Type valuesType)
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentException>("valuesType", () => attribute.GetValues(valuesType));
+ }
+
+ [Fact]
+ public void Indexer_SetMultipleType_GetReturnsExpected()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+
+ attribute[0] = new Uri("http://microsoft.com");
+ Assert.Equal(new Uri("http://microsoft.com"), attribute[0]);
+
+ attribute[0] = "value";
+ Assert.Equal("value", attribute[0]);
+
+ attribute[0] = new byte[] { 1, 2, 3 };
+ Assert.Equal(new byte[] { 1, 2, 3 }, attribute[0]);
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData(1)]
+ public void Indexer_InvalidIndex_ThrowsArgumentOutOfRangeException(int index)
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("index", () => attribute[index]);
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("index", () => attribute[index] = "value");
+ }
+
+ [Fact]
+ public void Indexer_SetNull_ThrowsArgumentNullException()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute[0] = null);
+ }
+
+ [Fact]
+ public void Indexer_SetInvalidType_ThrowsArgumentException()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentException>("value", () => attribute[0] = 1);
+ }
+
+ [Fact]
+ public void Add_MultipleTypes_Success()
+ {
+ var attribute = new DirectoryAttribute { "value", new byte[] { 1, 2, 3 }, new Uri("http://microsoft.com") };
+ Assert.Equal(3, attribute.Count);
+ Assert.Equal(new object[] { "value", new byte[] { 1, 2, 3 }, new Uri("http://microsoft.com") }, attribute.Cast<object>());
+ }
+
+ [Fact]
+ public void Add_NullValue_ThrowsArgumentNullException()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Add((string)null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Add((byte[])null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Add((Uri)null));
+ }
+
+ [Fact]
+ public void AddRange_Strings_Success()
+ {
+ string[] values = new string[] { "value1", "value2" };
+ var attribute = new DirectoryAttribute();
+ attribute.AddRange(values);
+ Assert.Equal(2, attribute.Count);
+ Assert.Equal(values, attribute.Cast<string>());
+ }
+
+ [Fact]
+ public void AddRange_ByteArrays_Success()
+ {
+ byte[][] values = new byte[][] { new byte[] { 1, 2, 3 }, new byte[0] };
+ var attribute = new DirectoryAttribute();
+ attribute.AddRange(values);
+ Assert.Equal(2, attribute.Count);
+ Assert.Equal(values, attribute.Cast<byte[]>());
+ }
+
+ [Fact]
+ public void AddRange_Uris_Success()
+ {
+ Uri[] values = new Uri[] { new Uri("http://microsoft.com") };
+ var attribute = new DirectoryAttribute();
+ attribute.AddRange(values);
+ Assert.Equal(1, attribute.Count);
+ Assert.Equal(values, attribute.Cast<Uri>());
+ }
+
+ [Fact]
+ public void AddRange_NullValues_ThrowsArgumentNullException()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentNullException>("values", () => attribute.AddRange(null));
+ }
+
+ [Fact]
+ public void AddRange_InvalidArray_ThrowsArgumentExceptionn()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentException>("values", () => attribute.AddRange(new object[0]));
+ }
+
+ [Fact]
+ public void AddRange_NullObjectInValues_ThrowsArgumentException()
+ {
+ string[] objects = new string[] { "value1", null, "value2" };
+ var attribute = new DirectoryAttribute();
+
+ AssertExtensions.Throws<ArgumentException>("values", () => attribute.AddRange(objects));
+ Assert.Equal(0, attribute.Count);
+ }
+
+ [Fact]
+ public void Contains_Valid_ReturnsExpected()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ Assert.True(attribute.Contains("value"));
+ Assert.False(attribute.Contains("vaLue"));
+ Assert.False(attribute.Contains(null));
+ }
+
+ [Fact]
+ public void CopyTo_MultipleTypes_Success()
+ {
+ object[] array = new object[5];
+ var attribute = new DirectoryAttribute { "value", new byte[] { 1, 2, 3 }, new Uri("http://microsoft.com") };
+ attribute.CopyTo(array, 1);
+ Assert.Equal(new object[] { null, "value", new byte[] { 1, 2, 3 }, new Uri("http://microsoft.com"), null }, array);
+ }
+
+ [Fact]
+ public void Insert_MultipleTypes_Success()
+ {
+ var attribute = new DirectoryAttribute { "value2" };
+ attribute.Insert(0, "value1");
+ attribute.Insert(1, new byte[] { 1, 2, 3 });
+ attribute.Insert(3, new Uri("http://microsoft.com"));
+
+ Assert.Equal(new object[] { "value1", new byte[] { 1, 2, 3 }, "value2", new Uri("http://microsoft.com") }, attribute.Cast<object>());
+ }
+
+ [Fact]
+ public void Insert_NullValue_ThrowsArgumentNullException()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Insert(0, (string)null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Insert(0, (byte[])null));
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Insert(0, (Uri)null));
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData(2)]
+ public void Insert_InvalidIndex_ThrowsArgumentOutOfRangeException(int index)
+ {
+ var attribute = new DirectoryAttribute { "value2" };
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("index", () => attribute.Insert(index, "value"));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("index", () => attribute.Insert(index, new byte[] { 1, 2, 3 }));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("index", () => attribute.Insert(index, new Uri("http://microsoft.com")));
+ }
+
+ [Fact]
+ public void IndexOf_Valid_ReturnsExpected()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ Assert.Equal(0, attribute.IndexOf("value"));
+ Assert.Equal(-1, attribute.IndexOf("vaLue"));
+ Assert.Equal(-1, attribute.IndexOf(null));
+ }
+
+ [Fact]
+ public void Remove_Valid_Success()
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ attribute.Remove("value");
+ Assert.Empty(attribute);
+ }
+
+ [Fact]
+ public void Remove_NullValue_ThrowsArgumentNullException()
+ {
+ var attribute = new DirectoryAttribute();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => attribute.Remove(null));
+ }
+
+ [Theory]
+ [InlineData("vaLue", null)]
+ [InlineData(1, "value")]
+ public void Remove_InvalidValue_ThrowsArgumentException(object value, string paramName)
+ {
+ var attribute = new DirectoryAttribute { "value" };
+ AssertExtensions.Throws<ArgumentException>(paramName, () => attribute.Remove(value));
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryConnectionTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryConnectionTests.cs
new file mode 100644
index 0000000000..c08a3b2bd8
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryConnectionTests.cs
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Net;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryConnectionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var connection = new SubDirectoryConnection();
+ Assert.Empty(connection.ClientCertificates);
+ Assert.Null(connection.Directory);
+ Assert.Equal(new TimeSpan(0, 0, 30), connection.Timeout);
+ }
+
+ [Fact]
+ public void Timeout_SetValid_GetReturnsExpected()
+ {
+ var connection = new SubDirectoryConnection { Timeout = TimeSpan.Zero };
+ Assert.Equal(TimeSpan.Zero, connection.Timeout);
+ }
+
+ [Fact]
+ public void Timeout_SetNegative_ThrowsArgumentException()
+ {
+ var connection = new SubDirectoryConnection();
+ AssertExtensions.Throws<ArgumentException>("value", () => connection.Timeout = TimeSpan.FromTicks(-1));
+ }
+
+ [Fact]
+ public void Credential_Set_Success()
+ {
+ var connection = new SubDirectoryConnection { Credential = new NetworkCredential("username", "password") };
+ connection.Credential = null;
+ }
+
+ public class SubDirectoryConnection : DirectoryConnection
+ {
+ public override DirectoryResponse SendRequest(DirectoryRequest request) => throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryControlCollectionTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryControlCollectionTests.cs
new file mode 100644
index 0000000000..bfdd0349f0
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryControlCollectionTests.cs
@@ -0,0 +1,183 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryControlCollectionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var collection = new DirectoryControlCollection();
+ Assert.Equal(0, collection.Count);
+ Assert.Equal(0, collection.Capacity);
+ }
+
+ [Fact]
+ public void Indexer_Set_GetReturnsExpected()
+ {
+ var control = new AsqRequestControl("name");
+ var collection = new DirectoryControlCollection { new AsqRequestControl() };
+ collection[0] = control;
+ Assert.Equal(control, collection[0]);
+ }
+
+ [Fact]
+ public void Indexer_SetNull_ThrowsArgumentException()
+ {
+ var collection = new DirectoryControlCollection();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => collection[0] = null);
+ }
+
+ [Fact]
+ public void Add_ValidControl_AppendsToList()
+ {
+ var control1 = new AsqRequestControl("name1");
+ var control2 = new AsqRequestControl("name2");
+ var collection = new DirectoryControlCollection { control1, control2 };
+ Assert.Equal(2, collection.Count);
+ Assert.Equal(new DirectoryControl[] { control1, control2 }, collection.Cast<DirectoryControl>());
+ }
+
+ [Fact]
+ public void Add_NullControl_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryControlCollection();
+ AssertExtensions.Throws<ArgumentNullException>("control", () => collection.Add(null));
+ }
+
+ [Fact]
+ public void AddRange_ValidControls_AddsToCollection()
+ {
+ DirectoryControl[] controls = new DirectoryControl[] { new AsqRequestControl(), new AsqRequestControl() };
+
+ var collection = new DirectoryControlCollection();
+ collection.AddRange(controls);
+
+ Assert.Equal(controls, collection.Cast<DirectoryControl>());
+ }
+
+ [Fact]
+ public void AddRange_NullControls_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryControlCollection();
+ AssertExtensions.Throws<ArgumentNullException>("controls", () => collection.AddRange((DirectoryControl[])null));
+ }
+
+ [Fact]
+ public void AddRange_NullObjectInValues_ThrowsArgumentException()
+ {
+ DirectoryControl[] controls = new DirectoryControl[] { new AsqRequestControl(), null, new AsqRequestControl() };
+ var collection = new DirectoryControlCollection();
+
+ AssertExtensions.Throws<ArgumentException>("controls", () => collection.AddRange(controls));
+ Assert.Equal(0, collection.Count);
+ }
+
+ [Fact]
+ public void AddRange_ValidControlCollection_AddsToCollection()
+ {
+ DirectoryControl[] controls = new DirectoryControl[] { new AsqRequestControl(), new AsqRequestControl() };
+ var attributeCollection = new DirectoryControlCollection();
+ attributeCollection.AddRange(controls);
+
+ var collection = new DirectoryControlCollection();
+ collection.AddRange(attributeCollection);
+
+ Assert.Equal(controls, collection.Cast<DirectoryControl>());
+ }
+
+ [Fact]
+ public void AddRange_NullControlCollection_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryControlCollection();
+ AssertExtensions.Throws<ArgumentNullException>("controlCollection", () => collection.AddRange((DirectoryControlCollection)null));
+ }
+
+ [Fact]
+ public void Contains_Valid_ReturnsExpected()
+ {
+ var control = new AsqRequestControl("name");
+ var collection = new DirectoryControlCollection { control };
+ Assert.True(collection.Contains(control));
+ Assert.False(collection.Contains(new AsqRequestControl()));
+ Assert.False(collection.Contains(null));
+ }
+
+ [Fact]
+ public void CopyTo_MultipleTypes_Success()
+ {
+ DirectoryControl[] array = new DirectoryControl[3];
+ var control = new AsqRequestControl("name");
+
+ var collection = new DirectoryControlCollection { control };
+ collection.CopyTo(array, 1);
+ Assert.Equal(new DirectoryControl[] { null, control, null }, array);
+ }
+
+ [Fact]
+ public void Insert_ValidDirectoryAttribute_Success()
+ {
+ var control1 = new AsqRequestControl("name1");
+ var control2 = new AsqRequestControl("name1");
+ var collection = new DirectoryControlCollection();
+ collection.Insert(0, control1);
+ collection.Insert(1, control2);
+
+ Assert.Equal(new DirectoryControl[] { control1, control2 }, collection.Cast<DirectoryControl>());
+ }
+
+ [Fact]
+ public void Insert_NullValue_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryControlCollection();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => collection.Insert(0, null));
+ }
+
+ [Fact]
+ public void IndexOf_Valid_ReturnsExpected()
+ {
+ var control = new AsqRequestControl("name");
+ var collection = new DirectoryControlCollection { control };
+ Assert.Equal(0, collection.IndexOf(control));
+ Assert.Equal(-1, collection.IndexOf(new AsqRequestControl()));
+ Assert.Equal(-1, collection.IndexOf(null));
+ }
+
+ [Fact]
+ public void Remove_Valid_Success()
+ {
+ var control = new AsqRequestControl("name");
+ var collection = new DirectoryControlCollection { control };
+ collection.Remove(control);
+ Assert.Empty(collection);
+ }
+
+ [Fact]
+ public void Remove_NullValue_ThrowsArgumentNullException()
+ {
+ var collection = new DirectoryControlCollection { new AsqRequestControl() };
+ AssertExtensions.Throws<ArgumentNullException>("value", () => collection.Remove(null));
+ }
+
+ public static IEnumerable<object[]> Remove_InvalidValue_TestData()
+ {
+ yield return new object[] { new AsqRequestControl(), null };
+ yield return new object[] { 1, "value" };
+ }
+
+ [Theory]
+ [MemberData(nameof(Remove_InvalidValue_TestData))]
+ public void Remove_InvalidValue_ThrowsArgumentException(object value, string paramName)
+ {
+ IList collection = new DirectoryControlCollection { new AsqRequestControl() };
+ AssertExtensions.Throws<ArgumentException>(paramName, () => collection.Remove(value));
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryControlTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryControlTests.cs
new file mode 100644
index 0000000000..afae479e1f
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryControlTests.cs
@@ -0,0 +1,52 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryControlTests
+ {
+ [Theory]
+ [InlineData("", null, false, false)]
+ [InlineData("Type", new byte[] { 1, 2, 3 }, true, true)]
+ public void Ctor_Type_Value_IsCritical_ServerSide(string type, byte[] value, bool isCritical, bool serverSide)
+ {
+ var control = new DirectoryControl(type, value, isCritical, serverSide);
+ Assert.Equal(type, control.Type);
+ Assert.Equal(isCritical, control.IsCritical);
+ Assert.Equal(serverSide, control.ServerSide);
+
+ byte[] controlValue = control.GetValue();
+ Assert.NotSame(controlValue, value);
+ Assert.Equal(value ?? Array.Empty<byte>(), controlValue);
+ }
+
+ [Fact]
+ public void Ctor_NullType_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("type", () => new DirectoryControl(null, new byte[0], false, false));
+ }
+
+ [Fact]
+ public void IsCritical_Set_GetReturnsExpected()
+ {
+ var control = new DirectoryControl("Type", null, false, true);
+ Assert.False(control.IsCritical);
+
+ control.IsCritical = true;
+ Assert.True(control.IsCritical);
+ }
+
+ [Fact]
+ public void ServerSide_Set_GetReturnsExpected()
+ {
+ var control = new DirectoryControl("Type", null, true, false);
+ Assert.False(control.ServerSide);
+
+ control.ServerSide = true;
+ Assert.True(control.ServerSide);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryExceptionTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryExceptionTests.cs
new file mode 100644
index 0000000000..cc8bdcb62e
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryExceptionTests.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryExceptionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var exception = new DirectoryException();
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message()
+ {
+ var exception = new DirectoryException("message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new DirectoryException("message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Same(innerException, exception.InnerException);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryNotificationControlTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryNotificationControlTests.cs
new file mode 100644
index 0000000000..26128c004c
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryNotificationControlTests.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryNotificationRequestControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new DirectoryNotificationControl();
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.528", control.Type);
+
+ Assert.Empty(control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DirectoryOperationExceptionTests.cs b/src/System.DirectoryServices.Protocols/tests/DirectoryOperationExceptionTests.cs
new file mode 100644
index 0000000000..03b76ca968
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DirectoryOperationExceptionTests.cs
@@ -0,0 +1,70 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DirectoryOperationExceptionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var exception = new DirectoryOperationException();
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message()
+ {
+ var exception = new DirectoryOperationException("message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new DirectoryOperationException("message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Same(innerException, exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Response()
+ {
+ var exception = new DirectoryOperationException((DirectoryResponse)null);
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Response_Message()
+ {
+ var exception = new DirectoryOperationException(null, "message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Response_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new DirectoryOperationException(null, "message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Same(innerException, exception.InnerException);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DomainScopeControlTests.cs b/src/System.DirectoryServices.Protocols/tests/DomainScopeControlTests.cs
new file mode 100644
index 0000000000..6a1a3060c0
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DomainScopeControlTests.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DomainScopeControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new DomainScopeControl();
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1339", control.Type);
+
+ Assert.Empty(control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/DsmlAuthRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/DsmlAuthRequestTests.cs
new file mode 100644
index 0000000000..2afdf966ab
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/DsmlAuthRequestTests.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class DsmlAuthRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new DsmlAuthRequest();
+ Assert.Empty(request.Controls);
+ Assert.Empty(request.Principal);
+ Assert.Null(request.RequestId);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("Principal")]
+ public void Ctor_Principal(string principal)
+ {
+ var request = new DsmlAuthRequest(principal);
+ Assert.Empty(request.Controls);
+ Assert.Equal(principal, request.Principal);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Principal_Set_GetReturnsExpected()
+ {
+ var request = new DsmlAuthRequest { Principal = "Principal" };
+ Assert.Equal("Principal", request.Principal);
+ }
+
+ [Fact]
+ public void RequestId_Set_GetReturnsExpected()
+ {
+ var request = new DsmlAuthRequest { RequestId = "Id" };
+ Assert.Equal("Id", request.RequestId);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/ExtendedDNControlTests.cs b/src/System.DirectoryServices.Protocols/tests/ExtendedDNControlTests.cs
new file mode 100644
index 0000000000..7a759afeb0
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/ExtendedDNControlTests.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.ComponentModel;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class ExtendedDNControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new ExtendedDNControl();
+ Assert.True(control.IsCritical);
+ Assert.Equal(ExtendedDNFlag.HexString, control.Flag);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.529", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 3, 2, 1, 0 }, control.GetValue());
+ }
+
+ [Fact]
+ public void Ctor_Flag()
+ {
+ var control = new ExtendedDNControl(ExtendedDNFlag.StandardString);
+ Assert.True(control.IsCritical);
+ Assert.Equal(ExtendedDNFlag.StandardString, control.Flag);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.529", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 3, 2, 1, 1 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(ExtendedDNFlag.HexString - 1)]
+ [InlineData(ExtendedDNFlag.StandardString + 1)]
+ public void Ctor_InvalidFlag_ThrowsInvalidEnumArgumentException(ExtendedDNFlag flag)
+ {
+ AssertExtensions.Throws<InvalidEnumArgumentException>("value", () => new ExtendedDNControl(flag));
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/ExtendedRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/ExtendedRequestTests.cs
new file mode 100644
index 0000000000..dd8ba94d0e
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/ExtendedRequestTests.cs
@@ -0,0 +1,67 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class ExtendedRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new ExtendedRequest();
+ Assert.Empty(request.Controls);
+ Assert.Null(request.RequestId);
+ Assert.Null(request.RequestName);
+ Assert.Empty(request.RequestValue);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("RequestName")]
+ public void Ctor_RequestName(string requestName)
+ {
+ var request = new ExtendedRequest(requestName);
+ Assert.Empty(request.Controls);
+ Assert.Null(request.RequestId);
+ Assert.Equal(requestName, request.RequestName);
+ Assert.Empty(request.RequestValue);
+ }
+
+ [Theory]
+ [InlineData(null, null)]
+ [InlineData("RequestName", new byte[] { 1, 2, 3 })]
+ public void Ctor_RequestName_RequestValue(string requestName, byte[] requestValue)
+ {
+ var request = new ExtendedRequest(requestName, requestValue);
+ Assert.Empty(request.Controls);
+ Assert.Null(request.RequestId);
+ Assert.Equal(requestName, request.RequestName);
+ Assert.NotSame(requestValue, request.RequestValue);
+ Assert.Equal(requestValue ?? Array.Empty<byte>(), request.RequestValue);
+ }
+
+ [Fact]
+ public void RequestName_Set_GetReturnsExpected()
+ {
+ var request = new ExtendedRequest { RequestName = "RequestName" };
+ Assert.Equal("RequestName", request.RequestName);
+ }
+
+ [Fact]
+ public void RequestValue_Set_GetReturnsExpected()
+ {
+ var request = new ExtendedRequest { RequestValue = new byte[] { 1, 2, 3 } };
+ Assert.Equal(new byte[] { 1, 2, 3 }, request.RequestValue);
+ }
+
+ [Fact]
+ public void RequestId_Set_GetReturnsExpected()
+ {
+ var request = new ExtendedRequest { RequestId = "Id" };
+ Assert.Equal("Id", request.RequestId);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/LazyCommitControlTests.cs b/src/System.DirectoryServices.Protocols/tests/LazyCommitControlTests.cs
new file mode 100644
index 0000000000..9872655f62
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/LazyCommitControlTests.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class LazyCommitControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new LazyCommitControl();
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.619", control.Type);
+
+ Assert.Empty(control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/LdapConnectionTests.cs b/src/System.DirectoryServices.Protocols/tests/LdapConnectionTests.cs
new file mode 100644
index 0000000000..0a635b65c3
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/LdapConnectionTests.cs
@@ -0,0 +1,304 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class LdapConnectionTests
+ {
+ [Theory]
+ [InlineData(null, new string[0])]
+ [InlineData("server", new string[] { "server" })]
+ public void Ctor_String(string server, string[] expectedServer)
+ {
+ var connection = new LdapConnection(server);
+ Assert.Equal(AuthType.Negotiate, connection.AuthType);
+ Assert.True(connection.AutoBind);
+ Assert.Equal(expectedServer, ((LdapDirectoryIdentifier)connection.Directory).Servers);
+ Assert.Equal(new TimeSpan(0, 0, 30), connection.Timeout);
+ }
+
+ [Fact]
+ public void Ctor_ServerHasSpaceInName_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapConnection("se rver"));
+ }
+
+ public static IEnumerable<object[]> Ctor_Identifier_TestData()
+ {
+ yield return new object[] { new LdapDirectoryIdentifier("server") };
+ yield return new object[] { new LdapDirectoryIdentifier(new string[] { "server", null, "server" }, false, false) };
+ yield return new object[] { new LdapDirectoryIdentifier(new string[] { null }, false, false) };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_Identifier_TestData))]
+ public void Ctor_Identifier(LdapDirectoryIdentifier identifier)
+ {
+ var connection = new LdapConnection(identifier);
+ Assert.Equal(AuthType.Negotiate, connection.AuthType);
+ Assert.True(connection.AutoBind);
+ Assert.Equal(identifier, connection.Directory);
+ Assert.Equal(new TimeSpan(0, 0, 30), connection.Timeout);
+ }
+
+ public static IEnumerable<object[]> Ctor_Identifier_NetworkCredential_TestData()
+ {
+ yield return new object[] { new LdapDirectoryIdentifier("server"), null };
+ yield return new object[] { new LdapDirectoryIdentifier("server"), new NetworkCredential("username", "password") };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_Identifier_NetworkCredential_TestData))]
+ public void Ctor_Identifier_AuthType(LdapDirectoryIdentifier identifier, NetworkCredential credential)
+ {
+ var connection = new LdapConnection(identifier, credential);
+ Assert.Equal(AuthType.Negotiate, connection.AuthType);
+ Assert.True(connection.AutoBind);
+ Assert.Equal(identifier, connection.Directory);
+ Assert.Equal(new TimeSpan(0, 0, 30), connection.Timeout);
+ }
+
+ public static IEnumerable<object[]> Ctor_Identifier_NetworkCredential_AuthType_TestData()
+ {
+ yield return new object[] { new LdapDirectoryIdentifier("server"), null, AuthType.Anonymous };
+ yield return new object[] { new LdapDirectoryIdentifier("server"), new NetworkCredential(), AuthType.Anonymous };
+ yield return new object[] { new LdapDirectoryIdentifier("server"), new NetworkCredential("username", "password"), AuthType.Kerberos };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_Identifier_NetworkCredential_AuthType_TestData))]
+ public void Ctor_Identifier_AuthType(LdapDirectoryIdentifier identifier, NetworkCredential credential, AuthType authType)
+ {
+ var connection = new LdapConnection(identifier, credential, authType);
+ Assert.Equal(authType, connection.AuthType);
+ Assert.True(connection.AutoBind);
+ Assert.Equal(identifier, connection.Directory);
+ Assert.Equal(new TimeSpan(0, 0, 30), connection.Timeout);
+ }
+
+ [Fact]
+ public void Ctor_NullIdentifier_ThrowsNullReferenceException()
+ {
+ Assert.Throws<NullReferenceException>(() => new LdapConnection((LdapDirectoryIdentifier)null));
+ Assert.Throws<NullReferenceException>(() => new LdapConnection(null, new NetworkCredential()));
+ Assert.Throws<NullReferenceException>(() => new LdapConnection(null, new NetworkCredential(), AuthType.Dpa));
+ }
+
+ [Theory]
+ [InlineData(AuthType.Anonymous - 1)]
+ [InlineData(AuthType.Kerberos + 1)]
+ public void Ctor_InvalidAuthType_ThrowsInvalidEnumArgumentException(AuthType authType)
+ {
+ AssertExtensions.Throws<InvalidEnumArgumentException>("authType", () => new LdapConnection(new LdapDirectoryIdentifier("server"), new NetworkCredential(), authType));
+ }
+
+ [Fact]
+ public void Ctor_InvalidAuthTypeWithCredentials_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapConnection(new LdapDirectoryIdentifier("server"), new NetworkCredential("username", "password"), AuthType.Anonymous));
+ }
+
+ [Fact]
+ public void AuthType_SetValid_GetReturnsExpected()
+ {
+ var connection = new LdapConnection("server") { AuthType = AuthType.Basic };
+ Assert.Equal(AuthType.Basic, connection.AuthType);
+ }
+
+ [Theory]
+ [InlineData(AuthType.Anonymous - 1)]
+ [InlineData(AuthType.Kerberos + 1)]
+ public void AuthType_SetInvalid_ThrowsInvalidEnumArgumentException(AuthType authType)
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<InvalidEnumArgumentException>("value", () => connection.AuthType = authType);
+ }
+
+ [Fact]
+ public void AutoBind_Set_GetReturnsExpected()
+ {
+ var connection = new LdapConnection("server") { AutoBind = false };
+ Assert.False(connection.AutoBind);
+ }
+
+ [Fact]
+ public void Timeout_SetValid_GetReturnsExpected()
+ {
+ var connection = new LdapConnection("server") { Timeout = TimeSpan.Zero };
+ Assert.Equal(TimeSpan.Zero, connection.Timeout);
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData((long)int.MaxValue + 1)]
+ public void Timeout_SetInvalid_ThrowsArgumentException(long totalSeconds)
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentException>("value", () => connection.Timeout = TimeSpan.FromSeconds(totalSeconds));
+ }
+
+ [Fact]
+ public void Bind_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.Bind());
+ Assert.Throws<ObjectDisposedException>(() => connection.Bind(null));
+ }
+
+ [Fact]
+ public void Bind_AnonymouseAuthenticationAndNetworkCredentials_ThrowsInvalidOperationException()
+ {
+ var connection = new LdapConnection("server") { AuthType = AuthType.Anonymous };
+ Assert.Throws<InvalidOperationException>(() => connection.Bind(new NetworkCredential("name", "password")));
+
+ connection.Credential = new NetworkCredential("name", "password");
+ Assert.Throws<InvalidOperationException>(() => connection.Bind());
+ }
+
+ [Fact]
+ public void SendRequest_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SendRequest(new AddRequest()));
+ Assert.Throws<ObjectDisposedException>(() => connection.BeginSendRequest(new AddRequest(), PartialResultProcessing.NoPartialResultSupport, null, null));
+ }
+
+ [Fact]
+ public void SendRequest_NullRequest_ThrowsArgumentNullException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentNullException>("request", () => connection.SendRequest(null));
+ AssertExtensions.Throws<ArgumentNullException>("request", () => connection.BeginSendRequest(null, PartialResultProcessing.NoPartialResultSupport, null, null));
+ }
+
+ [Fact]
+ public void SendRequest_DsmlAuthRequest_ThrowsNotSupportedException()
+ {
+ var connection = new LdapConnection("server");
+ Assert.Throws<NotSupportedException>(() => connection.SendRequest(new DsmlAuthRequest()));
+ }
+
+ [Theory]
+ [InlineData(PartialResultProcessing.NoPartialResultSupport - 1)]
+ [InlineData(PartialResultProcessing.ReturnPartialResultsAndNotifyCallback + 1)]
+ public void BeginSendRequest_InvalidPartialMode_ThrowsInvalidEnumArgumentException(PartialResultProcessing partialMode)
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<InvalidEnumArgumentException>("partialMode", () => connection.BeginSendRequest(new AddRequest(), partialMode, null, null));
+ }
+
+ [Theory]
+ [InlineData(PartialResultProcessing.ReturnPartialResults)]
+ [InlineData(PartialResultProcessing.ReturnPartialResultsAndNotifyCallback)]
+ public void BeginSendRequest_ReturnModeAndSearchRequest_ThrowsInvalidNotSupportedException(PartialResultProcessing partialMode)
+ {
+ var connection = new LdapConnection("server");
+ Assert.Throws<NotSupportedException>(() => connection.BeginSendRequest(new AddRequest(), partialMode, null, null));
+ }
+
+ [Fact]
+ public void BeginSendRequest_NotifyCallbackAndNullCallback_ThrowsArgumentException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentException>("callback", () => connection.BeginSendRequest(new SearchRequest(), PartialResultProcessing.ReturnPartialResultsAndNotifyCallback, null, null));
+ }
+
+ [Fact]
+ public void EndSendRequest_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.EndSendRequest(null));
+ }
+
+ [Fact]
+ public void EndSendRequest_NullAsyncResult_ThrowsArgumentNullException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentNullException>("asyncResult", () => connection.EndSendRequest(null));
+ }
+
+ [Fact]
+ public void EndSendRequest_InvalidAsyncResult_ThrowsArgumentNullException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentException>(null, () => connection.EndSendRequest(new CustomAsyncResult()));
+ }
+
+ [Fact]
+ public void GetPartialResults_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.GetPartialResults(null));
+ }
+
+ [Fact]
+ public void GetPartialResults_NullAsyncResult_ThrowsArgumentNullException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentNullException>("asyncResult", () => connection.GetPartialResults(null));
+ }
+
+ [Fact]
+ public void GetPartialResults_InvalidAsyncResult_ThrowsArgumentNullException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentException>(null, () => connection.GetPartialResults(new CustomAsyncResult()));
+ }
+
+ [Fact]
+ public void Abort_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.Abort(null));
+ }
+
+ [Fact]
+ public void Abort_NullAsyncResult_ThrowsArgumentNullException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentNullException>("asyncResult", () => connection.Abort(null));
+ }
+
+ [Fact]
+ public void Abort_InvalidAsyncResult_ThrowsArgumentNullException()
+ {
+ var connection = new LdapConnection("server");
+ AssertExtensions.Throws<ArgumentException>(null, () => connection.Abort(new CustomAsyncResult()));
+ }
+
+ [Fact]
+ public void Dispose_MultipleTimes_Nop()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+ connection.Dispose();
+ }
+
+ public class CustomAsyncResult : IAsyncResult
+ {
+ public object AsyncState => throw new NotImplementedException();
+ public WaitHandle AsyncWaitHandle => throw new NotImplementedException();
+ public bool CompletedSynchronously => throw new NotImplementedException();
+ public bool IsCompleted => throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/LdapDirectoryIdentifierTests.cs b/src/System.DirectoryServices.Protocols/tests/LdapDirectoryIdentifierTests.cs
new file mode 100644
index 0000000000..68a6a57e08
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/LdapDirectoryIdentifierTests.cs
@@ -0,0 +1,89 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class LdapDirectoryIdentifierTests
+ {
+ [Theory]
+ [InlineData(null, new string[0])]
+ [InlineData("", new string[] { "" })]
+ [InlineData("server", new string[] { "server" })]
+ public void Ctor_Server(string server, string[] expectedServers)
+ {
+ var identifier = new LdapDirectoryIdentifier(server);
+ Assert.False(identifier.Connectionless);
+ Assert.False(identifier.FullyQualifiedDnsHostName);
+ Assert.Equal(389, identifier.PortNumber);
+ Assert.Equal(expectedServers, identifier.Servers);
+ }
+
+ [Theory]
+ [InlineData(null, 389, new string[0])]
+ [InlineData("", -1, new string[] { "" })]
+ [InlineData("server", int.MaxValue, new string[] { "server" })]
+ public void Ctor_Server_PortNumber(string server, int portNumber, string[] expectedServers)
+ {
+ var identifier = new LdapDirectoryIdentifier(server, portNumber);
+ Assert.False(identifier.Connectionless);
+ Assert.False(identifier.FullyQualifiedDnsHostName);
+ Assert.Equal(portNumber, identifier.PortNumber);
+ Assert.Equal(expectedServers, identifier.Servers);
+ }
+
+ [Theory]
+ [InlineData(null, true, false, new string[0])]
+ [InlineData("", false, true, new string[] { "" })]
+ [InlineData("server", true, true, new string[] { "server" })]
+ public void Ctor_Server_FullQualifiedDnsHostName_Conectionless(string server, bool fullyQualifiedDnsHostName, bool connectionless, string[] expectedServers)
+ {
+ var identifier = new LdapDirectoryIdentifier(server, fullyQualifiedDnsHostName, connectionless);
+ Assert.Equal(connectionless, identifier.Connectionless);
+ Assert.Equal(fullyQualifiedDnsHostName, identifier.FullyQualifiedDnsHostName);
+ Assert.Equal(389, identifier.PortNumber);
+ Assert.Equal(expectedServers, identifier.Servers);
+ }
+
+ [Theory]
+ [InlineData(null, -1, true, false, new string[0])]
+ [InlineData("", 389, false, true, new string[] { "" })]
+ [InlineData("server", int.MaxValue, true, true, new string[] { "server" })]
+ public void Ctor_PortNumber_Server_FullQualifiedDnsHostName_Conectionless(string server, int portNumber, bool fullyQualifiedDnsHostName, bool connectionless, string[] expectedServers)
+ {
+ var identifier = new LdapDirectoryIdentifier(server, portNumber, fullyQualifiedDnsHostName, connectionless);
+ Assert.Equal(connectionless, identifier.Connectionless);
+ Assert.Equal(fullyQualifiedDnsHostName, identifier.FullyQualifiedDnsHostName);
+ Assert.Equal(portNumber, identifier.PortNumber);
+ Assert.Equal(expectedServers, identifier.Servers);
+ }
+
+ [Theory]
+ [InlineData(null, false, true)]
+ [InlineData(new string[0], true, false)]
+ [InlineData(new string[] { "server" }, true, true)]
+ [InlineData(new string[] { "server", null }, false, false)]
+ public void Ctor_Servers_FullQualifiedDnsHostName_Conectionless(string[] servers, bool fullyQualifiedDnsHostName, bool connectionless)
+ {
+ var identifier = new LdapDirectoryIdentifier(servers, fullyQualifiedDnsHostName, connectionless);
+ Assert.Equal(connectionless, identifier.Connectionless);
+ Assert.Equal(fullyQualifiedDnsHostName, identifier.FullyQualifiedDnsHostName);
+ Assert.Equal(389, identifier.PortNumber);
+ Assert.NotSame(servers, identifier.Servers);
+ Assert.Equal(servers ?? Array.Empty<string>(), identifier.Servers);
+ }
+
+ [Fact]
+ public void Ctor_ServerHasSpaceInName_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapDirectoryIdentifier("se rver"));
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapDirectoryIdentifier("se rver", 0));
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapDirectoryIdentifier("se rver", false, false));
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapDirectoryIdentifier("se rver", 0, false, false));
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapDirectoryIdentifier(new string[] { "se rver" }, false, false));
+ AssertExtensions.Throws<ArgumentException>(null, () => new LdapDirectoryIdentifier(new string[] { "se rver" }, 0, false, false));
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/LdapExceptionTests.cs b/src/System.DirectoryServices.Protocols/tests/LdapExceptionTests.cs
new file mode 100644
index 0000000000..841188c36c
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/LdapExceptionTests.cs
@@ -0,0 +1,101 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class LdapExceptionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var exception = new LdapException();
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.InnerException);
+
+ Assert.Equal(0, exception.ErrorCode);
+ Assert.Null(exception.ServerErrorMessage);
+ Assert.Empty(exception.PartialResults);
+ }
+
+ [Fact]
+ public void Ctor_Message()
+ {
+ var exception = new LdapException("message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.InnerException);
+
+ Assert.Equal(0, exception.ErrorCode);
+ Assert.Null(exception.ServerErrorMessage);
+ Assert.Empty(exception.PartialResults);
+ }
+
+ [Fact]
+ public void Ctor_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new LdapException("message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Same(innerException, exception.InnerException);
+
+ Assert.Equal(0, exception.ErrorCode);
+ Assert.Null(exception.ServerErrorMessage);
+ Assert.Empty(exception.PartialResults);
+ }
+
+ [Fact]
+ public void Ctor_ErrorCode()
+ {
+ var exception = new LdapException(10);
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.InnerException);
+
+ Assert.Equal(10, exception.ErrorCode);
+ Assert.Null(exception.ServerErrorMessage);
+ Assert.Empty(exception.PartialResults);
+ }
+
+ [Fact]
+ public void Ctor_ErrorCode_Message()
+ {
+ var exception = new LdapException(10, "message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.InnerException);
+
+ Assert.Equal(10, exception.ErrorCode);
+ Assert.Null(exception.ServerErrorMessage);
+ Assert.Empty(exception.PartialResults);
+ }
+
+ [Fact]
+ public void Ctor_ErrorCode_Message_ServerErrorMessage()
+ {
+ var exception = new LdapException(10, "message", "serverErrorMessage");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.InnerException);
+
+ Assert.Equal(10, exception.ErrorCode);
+ Assert.Equal("serverErrorMessage", exception.ServerErrorMessage);
+ Assert.Empty(exception.PartialResults);
+ }
+
+ [Fact]
+ public void Ctor_ErrorCode_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new LdapException(10, "message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Same(innerException, exception.InnerException);
+
+ Assert.Equal(10, exception.ErrorCode);
+ Assert.Null(exception.ServerErrorMessage);
+ Assert.Empty(exception.PartialResults);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs b/src/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs
new file mode 100644
index 0000000000..4190b979b6
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs
@@ -0,0 +1,720 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.ComponentModel;
+using System.Security.Cryptography.X509Certificates;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class LdapSessionOptionsTests
+ {
+ [Theory]
+ [InlineData(ReferralChasingOptions.None)]
+ [InlineData(ReferralChasingOptions.External)]
+ public void ReferralChasing_Set_GetReturnsExpected(ReferralChasingOptions value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(ReferralChasingOptions.All, options.ReferralChasing);
+
+ options.ReferralChasing = value;
+ Assert.Equal(value, options.ReferralChasing);
+ }
+ }
+
+ [Theory]
+ [InlineData((ReferralChasingOptions)(-1))]
+ [InlineData((ReferralChasingOptions)3)]
+ public void ReferralChasing_SetInvalid_ThrowsInvalidEnumArgumentException(ReferralChasingOptions referralChasing)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ AssertExtensions.Throws<InvalidEnumArgumentException>("value", () => connection.SessionOptions.ReferralChasing = referralChasing);
+ }
+ }
+
+ [Fact]
+ public void ReferralChasing_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ReferralChasing);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ReferralChasing = ReferralChasingOptions.All);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void SecureSocketLayer_Set_GetReturnsExpected(bool value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.False(options.SecureSocketLayer);
+
+ options.SecureSocketLayer = value;
+ Assert.False(options.SecureSocketLayer);
+ }
+ }
+
+ [Fact]
+ public void SecureSocketLayer_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SecureSocketLayer);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SecureSocketLayer = true);
+ }
+
+ [Fact]
+ public void ReferralHopLimit_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(32, options.ReferralHopLimit);
+
+ options.ReferralHopLimit = 10;
+ Assert.Equal(10, options.ReferralHopLimit);
+ }
+ }
+
+ [Fact]
+ public void ReferralHopLimit_SetNegative_ThrowsArgumentException()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => connection.SessionOptions.ReferralHopLimit = -1);
+ }
+ }
+
+ [Fact]
+ public void ReferralHopLimit_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ReferralHopLimit);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ReferralHopLimit = 10);
+ }
+
+ [Fact]
+ public void ProtocolVersion_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(2, options.ProtocolVersion);
+
+ options.ProtocolVersion = 3;
+ Assert.Equal(3, options.ProtocolVersion);
+
+ options.ProtocolVersion = 2;
+ Assert.Equal(2, options.ProtocolVersion);
+ }
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData(0)]
+ public void ProtocolVersion_SetInvalid_ThrowsLdapException(int value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Throws<LdapException>(() => options.ProtocolVersion = value);
+ }
+ }
+
+ [Fact]
+ public void ProtocolVersion_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ProtocolVersion);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ProtocolVersion = 10);
+ }
+
+ [Fact]
+ public void HostName_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Null(options.HostName);
+
+ options.HostName = "HostName";
+ Assert.Equal("HostName", options.HostName);
+
+ options.HostName = null;
+ Assert.Equal("HostName", options.HostName);
+ }
+ }
+
+ [Fact]
+ public void HostName_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.HostName);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.HostName = null);
+ }
+
+ [Fact]
+ public void DomainName_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Null(options.DomainName);
+
+ options.DomainName = "DomainName";
+ Assert.Equal("DomainName", options.DomainName);
+
+ options.DomainName = null;
+ Assert.Null(options.DomainName);
+ }
+ }
+
+ [Fact]
+ public void DomainName_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.DomainName);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.DomainName = null);
+ }
+
+ [Theory]
+ [InlineData(LocatorFlags.AvoidSelf)]
+ [InlineData(LocatorFlags.None - 1)]
+ public void LocatorFlag_Set_GetReturnsExpected(LocatorFlags value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(LocatorFlags.None, options.LocatorFlag);
+
+ options.LocatorFlag = value;
+ Assert.Equal(value, options.LocatorFlag);
+ }
+ }
+
+ [Fact]
+ public void LocatorFlag_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.LocatorFlag);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.LocatorFlag = LocatorFlags.AvoidSelf);
+ }
+
+ [Fact]
+ public void HostReachable_Get_ReturnsTrue()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.True(options.HostReachable);
+ }
+ }
+
+ [Fact]
+ public void HostReachable_GetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.HostReachable);
+ }
+
+ [Fact]
+ public void PingKeepAliveTimeout_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(TimeSpan.FromMinutes(2), options.PingKeepAliveTimeout);
+
+ options.PingKeepAliveTimeout = TimeSpan.FromSeconds(10);
+ Assert.Equal(TimeSpan.FromSeconds(10), options.PingKeepAliveTimeout);
+ }
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData((long)int.MaxValue + 1)]
+ public void PingKeepAliveTimeout_InvalidTotalSeconds_ThrowsArgumentException(long seconds)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => connection.SessionOptions.PingKeepAliveTimeout = TimeSpan.FromSeconds(seconds));
+ }
+ }
+
+ [Fact]
+ public void PingKeepAliveTimeout_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.PingKeepAliveTimeout);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.PingKeepAliveTimeout = TimeSpan.Zero);
+ }
+
+ [Fact]
+ public void PingLimit_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(4, options.PingLimit);
+
+ options.PingLimit = 10;
+ Assert.Equal(10, options.PingLimit);
+ }
+ }
+
+ [Fact]
+ public void PingLimit_SetNegative_ThrowsArgumentException()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => connection.SessionOptions.PingLimit = -1);
+ }
+ }
+
+ [Fact]
+ public void PingLimit_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.PingLimit);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.PingLimit = 10);
+ }
+
+ [Fact]
+ public void PingWaitTimeout_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(TimeSpan.FromSeconds(2), options.PingWaitTimeout);
+
+ options.PingWaitTimeout = TimeSpan.FromSeconds(10);
+ Assert.Equal(TimeSpan.FromSeconds(10), options.PingWaitTimeout);
+ }
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData((long)int.MaxValue + 1)]
+ public void PingWaitTimeout_InvalidTotalSeconds_ThrowsArgumentException(long seconds)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => connection.SessionOptions.PingWaitTimeout = TimeSpan.FromSeconds(seconds));
+ }
+ }
+
+ [Fact]
+ public void PingWaitTimeout_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.PingWaitTimeout);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.PingWaitTimeout = TimeSpan.Zero);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void AutoReconnect_Set_GetReturnsExpected(bool value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.True(options.AutoReconnect);
+
+ options.AutoReconnect = value;
+ Assert.Equal(value, options.AutoReconnect);
+ }
+ }
+
+ [Fact]
+ public void AutoReconnect_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.AutoReconnect);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.AutoReconnect = false);
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData(10)]
+ public void SspiFlag_Set_GetReturnsExpected(int value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(16386, options.SspiFlag);
+
+ options.SspiFlag = value;
+ Assert.Equal(value, options.SspiFlag);
+ }
+ }
+
+ [Fact]
+ public void SspiFlag_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SspiFlag);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SspiFlag = 10);
+ }
+
+ [Fact]
+ public void SslInformation_GetNotStarted_ThrowsDirectoryOperationException()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Throws<DirectoryOperationException>(() => options.SslInformation);
+ }
+ }
+
+ [Fact]
+ public void SslInformation_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SslInformation);
+ }
+
+ [Fact]
+ public void SecurityContext_GetNotStarted_ThrowsDirectoryOperationException()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Throws<DirectoryOperationException>(() => options.SecurityContext);
+ }
+ }
+
+ [Fact]
+ public void SecurityContext_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SecurityContext);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void Signing_Set_GetReturnsExpected(bool value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.False(options.Signing);
+
+ options.Signing = value;
+ Assert.Equal(value, options.Signing);
+ }
+ }
+
+ [Fact]
+ public void Signing_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.Signing);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.Signing = false);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void Sealing_Set_GetReturnsExpected(bool value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.False(options.Sealing);
+
+ options.Sealing = value;
+ Assert.Equal(value, options.Sealing);
+ }
+ }
+
+ [Fact]
+ public void Sealing_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.Sealing);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.Sealing = false);
+ }
+
+ [Fact]
+ public void SaslMethod_Set_ThrowsLdapException()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Null(options.SaslMethod);
+
+ Assert.Throws<LdapException>(() => options.SaslMethod = "SaslMethod");
+ }
+ }
+
+ [Fact]
+ public void SaslMethod_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SaslMethod);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SaslMethod = null);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void RootDseCache_Set_GetReturnsExpected(bool value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.True(options.RootDseCache);
+
+ options.RootDseCache = value;
+ Assert.Equal(value, options.RootDseCache);
+ }
+ }
+
+ [Fact]
+ public void RootDseCache_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.RootDseCache);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.RootDseCache = false);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void TcpKeepAlive_Set_GetReturnsExpected(bool value)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.False(options.TcpKeepAlive);
+
+ options.TcpKeepAlive = value;
+ Assert.Equal(value, options.TcpKeepAlive);
+ }
+ }
+
+ [Fact]
+ public void TcpKeepAlive_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.TcpKeepAlive);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.TcpKeepAlive = false);
+ }
+
+ [Fact]
+ public void SendTimeout_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Equal(TimeSpan.FromSeconds(-1), options.SendTimeout);
+
+ options.SendTimeout = TimeSpan.FromSeconds(10);
+ Assert.Equal(TimeSpan.FromSeconds(10), options.SendTimeout);
+ }
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData((long)int.MaxValue + 1)]
+ public void SendTimeout_InvalidTotalSeconds_ThrowsArgumentException(long seconds)
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => connection.SessionOptions.SendTimeout = TimeSpan.FromSeconds(seconds));
+ }
+ }
+
+ [Fact]
+ public void SendTimeout_GetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SendTimeout);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.SendTimeout = TimeSpan.Zero);
+ }
+
+ [Fact]
+ public void ReferralCallback_Get_ReturnsException()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Null(options.ReferralCallback.DereferenceConnection);
+ Assert.Null(options.ReferralCallback.NotifyNewConnection);
+ Assert.Null(options.ReferralCallback.QueryForConnection);
+ Assert.Same(options.ReferralCallback, options.ReferralCallback);
+ }
+ }
+
+ [Fact]
+ public void ReferralCallback_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ var value = new ReferralCallback
+ {
+ DereferenceConnection = ReferralCallbackTests.DereferenceConnection,
+ NotifyNewConnection = ReferralCallbackTests.NotifyNewConnection,
+ QueryForConnection = ReferralCallbackTests.QueryForConnection
+ };
+ options.ReferralCallback = value;
+ Assert.Same(value, options.ReferralCallback);
+
+ options.ReferralCallback = null;
+ Assert.Null(options.ReferralCallback);
+ }
+ }
+
+ [Fact]
+ public void ReferralCallback_GetGetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ReferralCallback);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.ReferralCallback = null);
+ }
+
+ [Fact]
+ public void QueryClientCertificate_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Null(options.QueryClientCertificate);
+
+ options.QueryClientCertificate = QueryClientCertificate;
+ Assert.Equal(QueryClientCertificate, options.QueryClientCertificate);
+
+ options.QueryClientCertificate = null;
+ Assert.Null(options.QueryClientCertificate);
+ }
+ }
+
+ public X509Certificate QueryClientCertificate(LdapConnection connection, byte[][] trustedCAs) => null;
+
+ [Fact]
+ public void QueryClientCertificate_GetGetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.QueryClientCertificate);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.QueryClientCertificate = null);
+ }
+
+ [Fact]
+ public void VerifyServerCertificate_Set_GetReturnsExpected()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Null(options.VerifyServerCertificate);
+
+ options.VerifyServerCertificate = VerifyServerCertificate;
+ Assert.Equal(VerifyServerCertificate, options.VerifyServerCertificate);
+
+ options.VerifyServerCertificate = null;
+ Assert.Null(options.VerifyServerCertificate);
+ }
+ }
+
+ public bool VerifyServerCertificate(LdapConnection connection, X509Certificate certificate) => false;
+
+ [Fact]
+ public void VerifyServerCertificate_GetGetSetWhenDisposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.VerifyServerCertificate);
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.VerifyServerCertificate = null);
+ }
+
+ [Fact]
+ public void FastConcurrentBind_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.FastConcurrentBind());
+ }
+
+ [Fact]
+ public void StartTransportLayerSecurity_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.StartTransportLayerSecurity(null));
+ }
+
+ [Fact]
+ public void StopTransportLayerSecurity_NotStarted_ThrowsTlsOperationException()
+ {
+ using (var connection = new LdapConnection("server"))
+ {
+ LdapSessionOptions options = connection.SessionOptions;
+ Assert.Throws<TlsOperationException>(() => options.StopTransportLayerSecurity());
+ }
+ }
+
+ [Fact]
+ public void StopTransportLayerSecurity_Disposed_ThrowsObjectDisposedException()
+ {
+ var connection = new LdapConnection("server");
+ connection.Dispose();
+
+ Assert.Throws<ObjectDisposedException>(() => connection.SessionOptions.StopTransportLayerSecurity());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/ModifyDNRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/ModifyDNRequestTests.cs
new file mode 100644
index 0000000000..bedcad28c5
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/ModifyDNRequestTests.cs
@@ -0,0 +1,74 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class ModifyDNRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new ModifyDNRequest();
+ Assert.Empty(request.Controls);
+ Assert.Null(request.DistinguishedName);
+ Assert.Null(request.NewName);
+ Assert.Null(request.NewParentDistinguishedName);
+ Assert.True(request.DeleteOldRdn);
+ Assert.Null(request.RequestId);
+ }
+
+ [Theory]
+ [InlineData(null, null, null)]
+ [InlineData("DistinguishedName", "NewParentDistinguishedName", "NewName")]
+ public void Ctor_DistinguishedName_NewParentDistinguishedName_NewName(string distinguishedName, string newParentDistinguishedName, string newName)
+ {
+ var request = new ModifyDNRequest(distinguishedName, newParentDistinguishedName, newName);
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Equal(newName, request.NewName);
+ Assert.Equal(newParentDistinguishedName, request.NewParentDistinguishedName);
+ Assert.True(request.DeleteOldRdn);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void DistinguishedName_Set_GetReturnsExpected()
+ {
+ var request = new ModifyDNRequest { DistinguishedName = "Name" };
+ Assert.Equal("Name", request.DistinguishedName);
+ }
+
+ [Fact]
+ public void NewParentDistinguishedName_Set_GetReturnsExpected()
+ {
+ var request = new ModifyDNRequest { NewParentDistinguishedName = "NewParentDistinguishedName" };
+ Assert.Equal("NewParentDistinguishedName", request.NewParentDistinguishedName);
+ }
+
+ [Fact]
+ public void NewName_Set_GetReturnsExpected()
+ {
+ var request = new ModifyDNRequest { NewName = "NewName" };
+ Assert.Equal("NewName", request.NewName);
+ }
+
+ [Fact]
+ public void DeleteOldRdn_Set_GetReturnsExpected()
+ {
+ var request = new ModifyDNRequest { DeleteOldRdn = false };
+ Assert.False(request.DeleteOldRdn);
+ }
+
+ [Fact]
+ public void RequestId_Set_GetReturnsExpected()
+ {
+ var request = new ModifyDNRequest { RequestId = "Id" };
+ Assert.Equal("Id", request.RequestId);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/ModifyRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/ModifyRequestTests.cs
new file mode 100644
index 0000000000..8fb1bb1504
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/ModifyRequestTests.cs
@@ -0,0 +1,106 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class ModifyRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new ModifyRequest();
+ Assert.Empty(request.Controls);
+ Assert.Null(request.DistinguishedName);
+ Assert.Empty(request.Modifications);
+ Assert.Null(request.RequestId);
+ }
+
+ public static IEnumerable<object[]> Ctor_DistinguishedName_Modifications_TestData()
+ {
+ yield return new object[] { string.Empty, new DirectoryAttributeModification[0] };
+ yield return new object[] { "DistinguishedName", new DirectoryAttributeModification[] { new DirectoryAttributeModification() } };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_DistinguishedName_Modifications_TestData))]
+ public void Ctor_DistinguishedString_Modifications(string distinguishedName, DirectoryAttributeModification[] modifications)
+ {
+ var request = new ModifyRequest(distinguishedName, modifications);
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Equal(modifications ?? Enumerable.Empty<DirectoryAttributeModification>(), request.Modifications.Cast<DirectoryAttributeModification>());
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Ctor_NullModifications_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("attributes", () => new ModifyRequest("DistinguishedName", null));
+ }
+
+ [Fact]
+ public void Ctor_NullObjectInAttributes_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>(null, () => new ModifyRequest("DistinguishedName", new DirectoryAttributeModification[] { null }));
+ }
+
+ public static IEnumerable<object[]> Ctor_DistinguishedName_Operation_AttributeName_Values_TestData()
+ {
+ yield return new object[] { null, null, "AttributeName", null };
+ yield return new object[] { string.Empty, null, "AttributeName", new object[0] };
+ yield return new object[] { "DistinguishedName", new DirectoryAttributeOperation(), "AttributeName", new object[] { "1", "2" } };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_DistinguishedName_Operation_AttributeName_Values_TestData))]
+ public void Ctor_DistinguishedName_Operation_AttributeName_Values(string distinguishedName, DirectoryAttributeOperation operation, string attributeName, object[] values)
+ {
+ var request = new ModifyRequest(distinguishedName, operation, attributeName, values);
+ Assert.Empty(request.Controls);
+ DirectoryAttributeModification modification = (DirectoryAttributeModification)Assert.Single(request.Modifications);
+ Assert.Equal(attributeName, modification.Name);
+ Assert.Equal(operation, modification.Operation);
+ Assert.Equal(values ?? Enumerable.Empty<object>(), modification.Cast<object>());
+
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Null(request.RequestId);
+ }
+
+ [Fact]
+ public void Ctor_NullAttributeName_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("attributeName", () => new ModifyRequest("DistinguishedName", new DirectoryAttributeOperation(), null, new object[0]));
+ }
+
+ [Fact]
+ public void Ctor_NullObjectInValues_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new ModifyRequest("DistinguishedName", new DirectoryAttributeOperation(), "AttributeName", new object[] { null }));
+ }
+
+ [Fact]
+ public void Ctor_InvalidObjectInValues_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => new ModifyRequest("DistinguishedName", new DirectoryAttributeOperation(), "AttributeName", new object[] { 1 }));
+ }
+
+ [Fact]
+ public void DistinguishedName_Set_GetReturnsExpected()
+ {
+ var request = new ModifyRequest { DistinguishedName = "Name" };
+ Assert.Equal("Name", request.DistinguishedName);
+ }
+
+ [Fact]
+ public void RequestId_Set_GetReturnsExpected()
+ {
+ var request = new ModifyRequest { RequestId = "Id" };
+ Assert.Equal("Id", request.RequestId);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/PageResultRequestControlTests.cs b/src/System.DirectoryServices.Protocols/tests/PageResultRequestControlTests.cs
new file mode 100644
index 0000000000..affb61a8b0
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/PageResultRequestControlTests.cs
@@ -0,0 +1,72 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Security.Principal;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class PageResultRequestControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new PageResultRequestControl();
+ Assert.True(control.IsCritical);
+ Assert.Empty(control.Cookie);
+ Assert.True(control.ServerSide);
+ Assert.Equal(512, control.PageSize);
+ Assert.Equal("1.2.840.113556.1.4.319", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 6, 2, 2, 2, 0, 4, 0 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(0, new byte[] { 48, 132, 0, 0, 0, 5, 2, 1, 0, 4, 0 })]
+ [InlineData(10, new byte[] { 48, 132, 0, 0, 0, 5, 2, 1, 10, 4, 0 })]
+ public void Ctor_PageSize(int pageSize, byte[] expectedValue)
+ {
+ var control = new PageResultRequestControl(pageSize);
+ Assert.True(control.IsCritical);
+ Assert.Empty(control.Cookie);
+ Assert.True(control.ServerSide);
+ Assert.Equal(pageSize, control.PageSize);
+ Assert.Equal("1.2.840.113556.1.4.319", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Fact]
+ public void Ctor_NegativePageSize_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => new PageResultRequestControl(-1));
+ }
+
+ [Theory]
+ [InlineData(null, new byte[] { 48, 132, 0, 0, 0, 6, 2, 2, 2, 0, 4, 0 })]
+ [InlineData(new byte[0], new byte[] { 48, 132, 0, 0, 0, 6, 2, 2, 2, 0, 4, 0 })]
+ [InlineData(new byte[] { 1, 2, 3, }, new byte[] { 48, 132, 0, 0, 0, 9, 2, 2, 2, 0, 4, 3, 1, 2, 3 })]
+ public void Ctor_Cookie(byte[] cookie, byte[] expectedValue)
+ {
+ var control = new PageResultRequestControl(cookie);
+ Assert.True(control.IsCritical);
+ Assert.NotSame(cookie, control.Cookie);
+ Assert.Equal(cookie ?? Array.Empty<byte>(), control.Cookie);
+ Assert.True(control.ServerSide);
+ Assert.Equal(512, control.PageSize);
+ Assert.Equal("1.2.840.113556.1.4.319", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Fact]
+ public void Cookie_Set_GetReturnsExpected()
+ {
+ var control = new PageResultRequestControl { Cookie = new byte[] { 1, 2, 3 } };
+ Assert.Equal(new byte[] { 1, 2, 3 }, control.Cookie);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/PermissiveModifyControlTests.cs b/src/System.DirectoryServices.Protocols/tests/PermissiveModifyControlTests.cs
new file mode 100644
index 0000000000..28987b70aa
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/PermissiveModifyControlTests.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class PermissiveModifyControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new PermissiveModifyControl();
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1413", control.Type);
+
+ Assert.Empty(control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/QuotaControlTests.cs b/src/System.DirectoryServices.Protocols/tests/QuotaControlTests.cs
new file mode 100644
index 0000000000..7fccc2cd4c
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/QuotaControlTests.cs
@@ -0,0 +1,49 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Security.Principal;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class QuotaControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new QuotaControl();
+ Assert.True(control.IsCritical);
+ Assert.Null(control.QuerySid);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1852", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 2, 4, 0 }, control.GetValue());
+ }
+
+ public static IEnumerable<object[]> Ctor_QuerySid_TestData()
+ {
+ yield return new object[] { new SecurityIdentifier("S-1-5-32-544"), new byte[] { 48, 132, 0, 0, 0, 18, 4, 16, 1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0 } };
+ yield return new object[] { null, new byte[] { 48, 132, 0, 0, 0, 2, 4, 0 } };
+ }
+
+ [Theory]
+ [MemberData(nameof(Ctor_QuerySid_TestData))]
+ public void Ctor_QuerySid_TestData(SecurityIdentifier querySid, byte[] expectedValue)
+ {
+ var control = new QuotaControl(querySid);
+ Assert.True(control.IsCritical);
+ if (querySid != null)
+ {
+ Assert.NotSame(querySid, control.QuerySid);
+ }
+ Assert.Equal(querySid, control.QuerySid);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1852", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/ReferralCallbackTests.cs b/src/System.DirectoryServices.Protocols/tests/ReferralCallbackTests.cs
new file mode 100644
index 0000000000..e2013c5727
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/ReferralCallbackTests.cs
@@ -0,0 +1,46 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Net;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class ReferralCallbackTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var callback = new ReferralCallback();
+ Assert.Null(callback.DereferenceConnection);
+ Assert.Null(callback.NotifyNewConnection);
+ Assert.Null(callback.QueryForConnection);
+ }
+
+ [Fact]
+ public void DereferenceConnection_Set_GetReturnsExpected()
+ {
+ var callback = new ReferralCallback { DereferenceConnection = DereferenceConnection };
+ Assert.Equal(DereferenceConnection, callback.DereferenceConnection);
+ }
+
+ [Fact]
+ public void NotifyNewConnection_Set_GetReturnsExpected()
+ {
+ var callback = new ReferralCallback { NotifyNewConnection = NotifyNewConnection };
+ Assert.Equal(NotifyNewConnection, callback.NotifyNewConnection);
+ }
+
+ [Fact]
+ public void QueryForConnection_Set_GetReturnsExpected()
+ {
+ var callback = new ReferralCallback { QueryForConnection = QueryForConnection };
+ Assert.Equal(QueryForConnection, callback.QueryForConnection);
+ }
+
+ public static void DereferenceConnection(LdapConnection primaryConnection, LdapConnection connectionToDereference) { }
+ public static bool NotifyNewConnection(LdapConnection primaryConnection, LdapConnection referralFromConnection, string newDistinguishedName, LdapDirectoryIdentifier identifier, LdapConnection newConnection, NetworkCredential credential, long currentUserToken, int errorCodeFromBind) => true;
+ public static LdapConnection QueryForConnection(LdapConnection primaryConnection, LdapConnection referralFromConnection, string newDistinguishedName, LdapDirectoryIdentifier identifier, NetworkCredential credential, long currentUserToken) => null;
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/SearchOptionsControlTests.cs b/src/System.DirectoryServices.Protocols/tests/SearchOptionsControlTests.cs
new file mode 100644
index 0000000000..d83c13c9fe
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/SearchOptionsControlTests.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.ComponentModel;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class SearchOptionsControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new SearchOptionsControl();
+ Assert.True(control.IsCritical);
+ Assert.Equal(SearchOption.DomainScope, control.SearchOption);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1340", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 3, 2, 1, 1 }, control.GetValue());
+ }
+
+ [Fact]
+ public void Ctor_Flags()
+ {
+ var control = new SearchOptionsControl(SearchOption.PhantomRoot);
+ Assert.True(control.IsCritical);
+ Assert.Equal(SearchOption.PhantomRoot, control.SearchOption);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1340", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 3, 2, 1, 2 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(SearchOption.DomainScope - 1)]
+ [InlineData(SearchOption.PhantomRoot + 1)]
+ public void Ctor_InvalidFlags_ThrowsInvalidEnumArgumentException(SearchOption flag)
+ {
+ AssertExtensions.Throws<InvalidEnumArgumentException>("value", () => new SearchOptionsControl(flag));
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/SearchRequestTests.cs b/src/System.DirectoryServices.Protocols/tests/SearchRequestTests.cs
new file mode 100644
index 0000000000..d4b81a1fda
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/SearchRequestTests.cs
@@ -0,0 +1,135 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.ComponentModel;
+using System.Linq;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class SearchRequestTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var request = new SearchRequest();
+ Assert.Equal(DereferenceAlias.Never, request.Aliases);
+ Assert.Empty(request.Attributes);
+ Assert.Empty(request.Controls);
+ Assert.Null(request.DistinguishedName);
+ Assert.Null(request.Filter);
+ Assert.Equal(SearchScope.Subtree, request.Scope);
+ Assert.Null(request.RequestId);
+ Assert.Equal(TimeSpan.Zero, request.TimeLimit);
+ Assert.False(request.TypesOnly);
+ }
+
+ [Theory]
+ [InlineData(null, null, SearchScope.Subtree, null)]
+ [InlineData("", "", SearchScope.OneLevel, new string[0])]
+ [InlineData("DistinguishedName", "LdapFilter", SearchScope.Base, new string[] { "attribute" })]
+ [InlineData("DistinguishedName", "LdapFilter", SearchScope.OneLevel, new string[] { null })]
+ public void Ctor_DistinguishedName_LdapFilter_SearchScope_AttributeList(string distinguishedName, string ldapFilter, SearchScope searchScope, string[] attributeList)
+ {
+ var request = new SearchRequest(distinguishedName, ldapFilter, searchScope, attributeList);
+ Assert.Equal(DereferenceAlias.Never, request.Aliases);
+ Assert.Equal(attributeList ?? Enumerable.Empty<string>(), request.Attributes.Cast<string>());
+ Assert.Empty(request.Controls);
+ Assert.Equal(distinguishedName, request.DistinguishedName);
+ Assert.Equal(ldapFilter, request.Filter);
+ Assert.Equal(searchScope, request.Scope);
+ Assert.Null(request.RequestId);
+ Assert.Equal(TimeSpan.Zero, request.TimeLimit);
+ Assert.False(request.TypesOnly);
+ }
+
+ [Theory]
+ [InlineData(SearchScope.Base - 1)]
+ [InlineData(SearchScope.Subtree + 1)]
+ public void Ctor_InvalidScope_ThrowsInvalidEnumArgumentException(SearchScope searchScope)
+ {
+ AssertExtensions.Throws<InvalidEnumArgumentException>("value", () => new SearchRequest("DistinguishedName", "LdapFilter", searchScope));
+ }
+
+ [Fact]
+ public void DistinguishedName_Set_GetReturnsExpected()
+ {
+ var request = new SearchRequest { DistinguishedName = "Name" };
+ Assert.Equal("Name", request.DistinguishedName);
+ }
+
+ [Fact]
+ public void Filter_Set_GetReturnsExpected()
+ {
+ var request = new SearchRequest { Filter = "filter" };
+ Assert.Equal("filter", request.Filter);
+
+ request.Filter = null;
+ Assert.Null(request.Filter);
+ }
+
+ [Fact]
+ public void Filter_SetInvalid_ThrowsArgumentException()
+ {
+ var request = new SearchRequest();
+ AssertExtensions.Throws<ArgumentException>("value", () => request.Filter = 1);
+ }
+
+ [Fact]
+ public void Aliases_SetValid_GetReturnsExpected()
+ {
+ var request = new SearchRequest { Aliases = DereferenceAlias.Always };
+ Assert.Equal(DereferenceAlias.Always, request.Aliases);
+ }
+
+ [Theory]
+ [InlineData(DereferenceAlias.Never - 1)]
+ [InlineData(DereferenceAlias.Always + 1)]
+ public void Aliases_SetInvalid_ThrowsInvalidEnumArgumentException(DereferenceAlias aliases)
+ {
+ var request = new SearchRequest();
+ AssertExtensions.Throws<InvalidEnumArgumentException>("value", () => request.Aliases = aliases);
+ }
+
+
+ [Fact]
+ public void SizeLimit_SetValid_GetReturnsExpected()
+ {
+ var request = new SearchRequest { SizeLimit = 0 };
+ Assert.Equal(0, request.SizeLimit);
+ }
+
+ [Fact]
+ public void SizeLimit_SetNegative_ThrowsArgumentException()
+ {
+ var request = new SearchRequest();
+ AssertExtensions.Throws<ArgumentException>("value", () => request.SizeLimit = -1);
+ }
+
+ [Fact]
+ public void TimeLimit_SetValid_GetReturnsExpected()
+ {
+ var request = new SearchRequest { TimeLimit = TimeSpan.FromSeconds(1) };
+ Assert.Equal(TimeSpan.FromSeconds(1), request.TimeLimit);
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData((long)int.MaxValue + 1)]
+ public void TimeLimit_SetInvalid_ThrowsArgumentException(long totalSeconds)
+ {
+ var request = new SearchRequest();
+ AssertExtensions.Throws<ArgumentException>("value", () => request.TimeLimit = TimeSpan.FromSeconds(totalSeconds));
+ }
+
+ [Fact]
+ public void TypesOnly_Set_GetReturnsExpected()
+ {
+ var request = new SearchRequest { TypesOnly = true };
+ Assert.True(request.TypesOnly);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/SecurityDescriptorFlagControlTests.cs b/src/System.DirectoryServices.Protocols/tests/SecurityDescriptorFlagControlTests.cs
new file mode 100644
index 0000000000..3d0fc4e6d5
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/SecurityDescriptorFlagControlTests.cs
@@ -0,0 +1,38 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.ComponentModel;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class SecurityDescriptorFlagControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new SecurityDescriptorFlagControl();
+ Assert.True(control.IsCritical);
+ Assert.Equal(SecurityMasks.None, control.SecurityMasks);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.801", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 3, 2, 1, 0 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(SecurityMasks.Group, new byte[] { 48, 132, 0, 0, 0, 3, 2, 1, 2 })]
+ [InlineData(SecurityMasks.None - 1, new byte[] { 48, 132, 0, 0, 0, 6, 2, 4, 255, 255, 255, 255 })]
+ public void Ctor_Flags(SecurityMasks masks, byte[] expectedValue)
+ {
+ var control = new SecurityDescriptorFlagControl(masks);
+ Assert.True(control.IsCritical);
+ Assert.Equal(masks, control.SecurityMasks);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.801", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/ShowDeletedControlTests.cs b/src/System.DirectoryServices.Protocols/tests/ShowDeletedControlTests.cs
new file mode 100644
index 0000000000..0f8e07234c
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/ShowDeletedControlTests.cs
@@ -0,0 +1,25 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Security.Principal;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class ShowDeletedControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new ShowDeletedControl();
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.417", control.Type);
+
+ Assert.Empty(control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/SortKeyTests.cs b/src/System.DirectoryServices.Protocols/tests/SortKeyTests.cs
new file mode 100644
index 0000000000..c5c6c103d0
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/SortKeyTests.cs
@@ -0,0 +1,51 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class SortKeyTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var sortKey = new SortKey();
+ Assert.Null(sortKey.AttributeName);
+ Assert.Null(sortKey.MatchingRule);
+ Assert.False(sortKey.ReverseOrder);
+ }
+
+ [Theory]
+ [InlineData("", null, false)]
+ [InlineData("AttributeName", null, false)]
+ public void Ctor_Default(string attributeName, string matchingRule, bool reverseOrder)
+ {
+ var sortKey = new SortKey(attributeName, matchingRule, reverseOrder);
+ Assert.Equal(attributeName, sortKey.AttributeName);
+ Assert.Equal(matchingRule, sortKey.MatchingRule);
+ Assert.Equal(reverseOrder, sortKey.ReverseOrder);
+ }
+
+ [Fact]
+ public void Ctor_NullAttributeName_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("value", () => new SortKey(null, "MatchingRule", false));
+ }
+
+ [Fact]
+ public void MatchingRule_Set_GetReturnsExpected()
+ {
+ var sortKey = new SortKey { MatchingRule = "MatchingRule" };
+ Assert.Equal("MatchingRule", sortKey.MatchingRule);
+ }
+
+ [Fact]
+ public void ReverseOrder_Set_GetReturnsExpected()
+ {
+ var sortKey = new SortKey { ReverseOrder = true };
+ Assert.True(sortKey.ReverseOrder);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/SortRequestControlTests.cs b/src/System.DirectoryServices.Protocols/tests/SortRequestControlTests.cs
new file mode 100644
index 0000000000..db412ff9e7
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/SortRequestControlTests.cs
@@ -0,0 +1,116 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Reflection;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class SortRequestControlTests
+ {
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void Ctor_SortKeys(bool critical)
+ {
+ SortKey[] sortKeys = new SortKey[] { new SortKey("name1", "rule1", true), new SortKey("name2", "rule2", false) };
+ var control = new SortRequestControl(sortKeys);
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.473", control.Type);
+
+ Assert.NotSame(sortKeys, control.SortKeys);
+ for (int i = 0; i < sortKeys.Length; i++)
+ {
+ Assert.Equal(sortKeys[i].AttributeName, control.SortKeys[i].AttributeName);
+ Assert.Equal(sortKeys[i].MatchingRule, control.SortKeys[i].MatchingRule);
+ Assert.Equal(sortKeys[i].ReverseOrder, control.SortKeys[i].ReverseOrder);
+ }
+
+ control.IsCritical = critical;
+ Assert.Equal(new byte[]
+ {
+ 48, 132, 0, 0, 0, 43, 48, 132, 0, 0, 0, 17, 4, 5,110,
+ 97, 109, 101, 49, 128, 5, 114, 117, 108, 101, 49, 129,
+ 1, 255, 48, 132, 0, 0, 0, 14, 4, 5, 110, 97, 109, 101,
+ 50, 128, 5, 114, 117, 108, 101, 50
+ }, control.GetValue());
+ }
+
+ [Fact]
+ public void Ctor_NullSortKeys_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("sortKeys", () => new SortRequestControl(null));
+ }
+
+ [Fact]
+ public void CtorNullValueInSortKeys_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>("sortKeys", () => new SortRequestControl(new SortKey[] { null }));
+ }
+
+ [Fact]
+ public void Ctor_AttributeName_ReverseOrder()
+ {
+ var control = new SortRequestControl("AttributeName", true);
+ SortKey sortKey = Assert.Single(control.SortKeys);
+ Assert.Equal("AttributeName", sortKey.AttributeName);
+ Assert.True(control.IsCritical);
+ Assert.Null(sortKey.MatchingRule);
+ Assert.True(sortKey.ReverseOrder);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.473", control.Type);
+ }
+
+ [Fact]
+ public void Ctor_AttributeName_MatchingRule_ReverseOrder()
+ {
+ var control = new SortRequestControl("AttributeName", "MatchingRule", true);
+ SortKey sortKey = Assert.Single(control.SortKeys);
+ Assert.Equal("AttributeName", sortKey.AttributeName);
+ Assert.True(control.IsCritical);
+ Assert.Equal("MatchingRule", sortKey.MatchingRule);
+ Assert.True(sortKey.ReverseOrder);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.473", control.Type);
+ }
+
+ [Fact]
+ public void SortKeys_SetValid_GetReturnsExpected()
+ {
+ SortKey[] sortKeys = new SortKey[] { new SortKey("name1", "rule1", true), new SortKey("name2", "rule2", false) };
+ var control = new SortRequestControl { SortKeys = sortKeys };
+ Assert.NotSame(sortKeys, control.SortKeys);
+ for (int i = 0; i < sortKeys.Length; i++)
+ {
+ Assert.Equal(sortKeys[i].AttributeName, control.SortKeys[i].AttributeName);
+ Assert.Equal(sortKeys[i].MatchingRule, control.SortKeys[i].MatchingRule);
+ Assert.Equal(sortKeys[i].ReverseOrder, control.SortKeys[i].ReverseOrder);
+ }
+ }
+
+ [Fact]
+ public void SortKeys_GetNull_ReturnsEmptyArray()
+ {
+ var control = new SortRequestControl();
+ FieldInfo field = control.GetType().GetField("_keys", BindingFlags.NonPublic | BindingFlags.Instance);
+ field.SetValue(control, null);
+ Assert.Empty(control.SortKeys);
+ }
+
+ [Fact]
+ public void SortKeys_SetNull_ThrowsArgumentNullException()
+ {
+ var control = new SortRequestControl(new SortKey[0]);
+ AssertExtensions.Throws<ArgumentNullException>("value", () => control.SortKeys = null);
+ }
+
+ [Fact]
+ public void SortKeys_SetNullInValue_ThrowsArgumentException()
+ {
+ var control = new SortRequestControl(new SortKey[0]);
+ AssertExtensions.Throws<ArgumentException>("value", () => control.SortKeys = new SortKey[] { null });
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/System.DirectoryServices.Protocols.Tests.csproj b/src/System.DirectoryServices.Protocols/tests/System.DirectoryServices.Protocols.Tests.csproj
new file mode 100644
index 0000000000..22b60124ea
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/System.DirectoryServices.Protocols.Tests.csproj
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <ProjectGuid>{297A9116-1005-499D-A895-2063D03E4C94}</ProjectGuid>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Windows_NT-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Windows_NT-Release|AnyCPU'" />
+ <!-- Default configurations to help VS understand the configurations -->
+ <ItemGroup>
+ <Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
+ <Link>Common\System\AssertExtensions.cs</Link>
+ </Compile>
+ <Compile Include="LdapSessionOptionsTests.cs" />
+ <Compile Include="PermissiveModifyControlTests.cs" />
+ <Compile Include="ModifyDNRequestTests.cs" />
+ <Compile Include="ModifyRequestTests.cs" />
+ <Compile Include="PageResultRequestControlTests.cs" />
+ <Compile Include="SortRequestControlTests.cs" />
+ <Compile Include="SortKeyTests.cs" />
+ <Compile Include="ReferralCallbackTests.cs" />
+ <Compile Include="VlvRequestControlTests.cs" />
+ <Compile Include="VerifyNameControlTests.cs" />
+ <Compile Include="TreeDeleteControlTests.cs" />
+ <Compile Include="ShowDeletedControlTests.cs" />
+ <Compile Include="QuotaControlTests.cs" />
+ <Compile Include="SecurityDescriptorFlagControlTests.cs" />
+ <Compile Include="SearchOptionsControlTests.cs" />
+ <Compile Include="SearchRequestTests.cs" />
+ <Compile Include="TlsOperationExceptionTests.cs" />
+ <Compile Include="LdapExceptionTests.cs" />
+ <Compile Include="LdapConnectionTests.cs" />
+ <Compile Include="LazyCommitControlTests.cs" />
+ <Compile Include="ExtendedRequestTests.cs" />
+ <Compile Include="ExtendedDNControlTests.cs" />
+ <Compile Include="DsmlAuthRequestTests.cs" />
+ <Compile Include="DomainScopeControlTests.cs" />
+ <Compile Include="DirSyncRequestControlTests.cs" />
+ <Compile Include="LdapDirectoryIdentifierTests.cs" />
+ <Compile Include="DirectoryNotificationControlTests.cs" />
+ <Compile Include="DirectoryControlCollectionTests.cs" />
+ <Compile Include="DirectoryAttributeModificationCollectionTests.cs" />
+ <Compile Include="DirectoryAttributeCollectionTests.cs" />
+ <Compile Include="DirectoryControlTests.cs" />
+ <Compile Include="DirectoryConnectionTests.cs" />
+ <Compile Include="DirectoryAttributeTests.cs" />
+ <Compile Include="DeleteRequestTests.cs" />
+ <Compile Include="CrossDomainMoveControlTests.cs" />
+ <Compile Include="CompareRequestTests.cs" />
+ <Compile Include="DirectoryAttributeModificationTests.cs" />
+ <Compile Include="DirectoryOperationExceptionTests.cs" />
+ <Compile Include="DirectoryExceptionTests.cs" />
+ <Compile Include="BerConversionExceptionTests.cs" />
+ <Compile Include="AsqRequestControlTests.cs" />
+ <Compile Include="AddRequestTests.cs" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/src/System.DirectoryServices.Protocols/tests/TlsOperationExceptionTests.cs b/src/System.DirectoryServices.Protocols/tests/TlsOperationExceptionTests.cs
new file mode 100644
index 0000000000..6be0518a8f
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/TlsOperationExceptionTests.cs
@@ -0,0 +1,70 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class TlsOperationExceptionTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var exception = new TlsOperationException();
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message()
+ {
+ var exception = new TlsOperationException("message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new TlsOperationException("message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Same(innerException, exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Response()
+ {
+ var exception = new TlsOperationException((DirectoryResponse)null);
+ Assert.NotEmpty(exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Response_Message()
+ {
+ var exception = new TlsOperationException(null, "message");
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Null(exception.InnerException);
+ }
+
+ [Fact]
+ public void Ctor_Response_Message_InnerException()
+ {
+ var innerException = new Exception();
+ var exception = new TlsOperationException(null, "message", innerException);
+ Assert.Equal("message", exception.Message);
+ Assert.Null(exception.Response);
+ Assert.Same(innerException, exception.InnerException);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/TreeDeleteControlTests.cs b/src/System.DirectoryServices.Protocols/tests/TreeDeleteControlTests.cs
new file mode 100644
index 0000000000..b1d97acc13
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/TreeDeleteControlTests.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class TreeDeleteControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new TreeDeleteControl();
+ Assert.True(control.IsCritical);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.805", control.Type);
+
+ Assert.Empty(control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/VerifyNameControlTests.cs b/src/System.DirectoryServices.Protocols/tests/VerifyNameControlTests.cs
new file mode 100644
index 0000000000..09228d4940
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/VerifyNameControlTests.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class VerifyNameControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new VerifyNameControl();
+ Assert.True(control.IsCritical);
+ Assert.Equal(0, control.Flag);
+ Assert.Null(control.ServerName);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1338", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 5, 2, 1, 0, 4, 0 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData("", new byte[] { 48, 132, 0, 0, 0, 5, 2, 1, 0, 4, 0 })]
+ [InlineData("S", new byte[] { 48, 132, 0, 0, 0, 7, 2, 1, 0, 4, 2, 83, 0 })]
+ public void Ctor_ServerName(string serverName, byte[] expectedValue)
+ {
+ var control = new VerifyNameControl(serverName);
+ Assert.True(control.IsCritical);
+ Assert.Equal(0, control.Flag);
+ Assert.Equal(serverName, control.ServerName);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1338", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData("", -1, new byte[] { 48, 132, 0, 0, 0, 8, 2, 4, 255, 255, 255, 255, 4, 0 })]
+ [InlineData("S", 10, new byte[] { 48, 132, 0, 0, 0, 7, 2, 1, 10, 4, 2, 83, 0 })]
+ public void Ctor_ServerName_Flag(string serverName, int flag, byte[] expectedValue)
+ {
+ var control = new VerifyNameControl(serverName, flag);
+ Assert.True(control.IsCritical);
+ Assert.Equal(flag, control.Flag);
+ Assert.Equal(serverName, control.ServerName);
+ Assert.True(control.ServerSide);
+ Assert.Equal("1.2.840.113556.1.4.1338", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Fact]
+ public void Ctor_NullServerName_ThrowsArgumentNullException()
+ {
+ AssertExtensions.Throws<ArgumentNullException>("serverName", () => new VerifyNameControl(null));
+ AssertExtensions.Throws<ArgumentNullException>("serverName", () => new VerifyNameControl(null, 0));
+ }
+
+ [Fact]
+ public void ServerName_SetValid_GetReturnsExpected()
+ {
+ var control = new VerifyNameControl { ServerName = "ServerName" };
+ Assert.Equal("ServerName", control.ServerName);
+ }
+
+ [Fact]
+ public void ServerName_SetNull_ThrowsArgumentNullException()
+ {
+ var control = new VerifyNameControl();
+ AssertExtensions.Throws<ArgumentNullException>("value", () => control.ServerName = null);
+ }
+
+ [Fact]
+ public void Flag_Set_GetReturnsExpected()
+ {
+ var control = new VerifyNameControl { Flag = 10 };
+ Assert.Equal(10, control.Flag);
+ }
+ }
+}
diff --git a/src/System.DirectoryServices.Protocols/tests/VlvRequestControlTests.cs b/src/System.DirectoryServices.Protocols/tests/VlvRequestControlTests.cs
new file mode 100644
index 0000000000..c4dff30c62
--- /dev/null
+++ b/src/System.DirectoryServices.Protocols/tests/VlvRequestControlTests.cs
@@ -0,0 +1,134 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace System.DirectoryServices.Protocols.Tests
+{
+ public class VlvRequestControlTests
+ {
+ [Fact]
+ public void Ctor_Default()
+ {
+ var control = new VlvRequestControl();
+ Assert.Equal(0, control.AfterCount);
+ Assert.Equal(0, control.BeforeCount);
+ Assert.True(control.IsCritical);
+ Assert.Equal(0, control.Offset);
+ Assert.Equal(0, control.EstimateCount);
+ Assert.Empty(control.Target);
+ Assert.Empty(control.ContextId);
+ Assert.True(control.ServerSide);
+ Assert.Equal("2.16.840.1.113730.3.4.9", control.Type);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 18, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0 }, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(0, 0, 0, new byte[] { 48, 132, 0, 0, 0, 18, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0 })]
+ [InlineData(10, 10, 10, new byte[] { 48, 132, 0, 0, 0, 18, 2, 1, 10, 2, 1, 10, 160, 132, 0, 0, 0, 6, 2, 1, 10, 2, 1, 0 })]
+ public void Ctor_BeforeCount_AfterCount_Offset(int beforeCount, int afterCount, int offset, byte[] expectedValue)
+ {
+ var control = new VlvRequestControl(beforeCount, afterCount, offset);
+ Assert.Equal(afterCount, control.AfterCount);
+ Assert.Equal(beforeCount, control.BeforeCount);
+ Assert.True(control.IsCritical);
+ Assert.Equal(offset, control.Offset);
+ Assert.Equal(0, control.EstimateCount);
+ Assert.Empty(control.Target);
+ Assert.Empty(control.ContextId);
+ Assert.True(control.ServerSide);
+ Assert.Equal("2.16.840.1.113730.3.4.9", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(0, 0, null, new byte[0], new byte[] { 48, 132, 0, 0, 0, 18, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0 })]
+ [InlineData(10, 10, "abc", new byte[] { 97, 98, 99 }, new byte[] { 48, 132, 0, 0, 0, 11, 2, 1, 10, 2, 1, 10, 129, 3, 97, 98, 99 })]
+ public void Ctor_BeforeCount_AfterCount_StringTarget(int beforeCount, int afterCount, string target, byte[] expectedTarget, byte[] expectedValue)
+ {
+ var control = new VlvRequestControl(beforeCount, afterCount, target);
+ Assert.Equal(afterCount, control.AfterCount);
+ Assert.Equal(beforeCount, control.BeforeCount);
+ Assert.True(control.IsCritical);
+ Assert.Equal(0, control.Offset);
+ Assert.Equal(0, control.EstimateCount);
+ Assert.NotSame(target, control.Target);
+ Assert.Equal(expectedTarget ?? Array.Empty<byte>(), control.Target);
+ Assert.Empty(control.ContextId);
+ Assert.True(control.ServerSide);
+ Assert.Equal("2.16.840.1.113730.3.4.9", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Theory]
+ [InlineData(0, 0, null, new byte[] { 48, 132, 0, 0, 0, 18, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0 })]
+ [InlineData(10, 10, new byte[] { 1, 2, 3 }, new byte[] { 48, 132, 0, 0, 0, 11, 2, 1, 10, 2, 1, 10, 129, 3, 1, 2, 3 })]
+ public void Ctor_BeforeCount_AfterCount_ByteArrayTarget(int beforeCount, int afterCount, byte[] target, byte[] expectedValue)
+ {
+ var control = new VlvRequestControl(beforeCount, afterCount, target);
+ Assert.Equal(afterCount, control.AfterCount);
+ Assert.Equal(beforeCount, control.BeforeCount);
+ Assert.True(control.IsCritical);
+ Assert.Equal(0, control.Offset);
+ Assert.Equal(0, control.EstimateCount);
+ Assert.NotSame(target, control.Target);
+ Assert.Equal(target ?? Array.Empty<byte>(), control.Target);
+ Assert.Empty(control.ContextId);
+ Assert.True(control.ServerSide);
+ Assert.Equal("2.16.840.1.113730.3.4.9", control.Type);
+
+ Assert.Equal(expectedValue, control.GetValue());
+ }
+
+ [Fact]
+ public void Ctor_NegativeBeforeCount_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => new VlvRequestControl(-1, 0, "target"));
+ AssertExtensions.Throws<ArgumentException>("value", () => new VlvRequestControl(-1, 0, 0));
+ AssertExtensions.Throws<ArgumentException>("value", () => new VlvRequestControl(-1, 0, new byte[0]));
+ }
+
+ [Fact]
+ public void Ctor_NegativeAfterCount_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => new VlvRequestControl(0, -1, "target"));
+ AssertExtensions.Throws<ArgumentException>("value", () => new VlvRequestControl(0, -1, 0));
+ AssertExtensions.Throws<ArgumentException>("value", () => new VlvRequestControl(0, -1, new byte[0]));
+ }
+
+ [Fact]
+ public void Ctor_NegativeOffset_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>("value", () => new VlvRequestControl(0, 0, -1));
+ }
+
+ [Fact]
+ public void EstimateCount_SetValid_GetReturnsExpected()
+ {
+ var control = new VlvRequestControl { EstimateCount = 10 };
+ Assert.Equal(10, control.EstimateCount);
+ }
+
+ [Fact]
+ public void EstimateCount_SetNegative_ThrowsArgumentException()
+ {
+ var control = new VlvRequestControl();
+ AssertExtensions.Throws<ArgumentException>("value", () => control.EstimateCount = -1);
+ }
+
+ [Fact]
+ public void ContextId_Set_GetReturnsExpected()
+ {
+ byte[] contextId = new byte[] { 1, 2, 3 };
+ var control = new VlvRequestControl { ContextId = contextId };
+ Assert.NotSame(contextId, control.ContextId);
+ Assert.Equal(contextId, control.ContextId);
+
+ Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 23, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0, 4, 3, 1, 2, 3 }, control.GetValue());
+ }
+ }
+}
diff --git a/src/System.DirectoryServices/System.DirectoryServices.sln b/src/System.DirectoryServices/System.DirectoryServices.sln
index 430c87fff1..5207aba05a 100644
--- a/src/System.DirectoryServices/System.DirectoryServices.sln
+++ b/src/System.DirectoryServices/System.DirectoryServices.sln
@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.DirectoryServices",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.DirectoryServices", "ref\System.DirectoryServices.csproj", "{CBCDA53B-4C01-4267-B08C-413205FE4D8D}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1A2F9F4A-A032-433E-B914-ADD5992BB178}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{2E666815-2EDB-464B-9DF6-380BF4789AD4}"
diff --git a/src/System.Drawing.Common/System.Drawing.Common.sln b/src/System.Drawing.Common/System.Drawing.Common.sln
index c603ed2f26..e28fde2290 100644
--- a/src/System.Drawing.Common/System.Drawing.Common.sln
+++ b/src/System.Drawing.Common/System.Drawing.Common.sln
@@ -1,45 +1,50 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26430.6
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Drawing.Common.Tests", "tests\System.Drawing.Common.Tests.csproj", "{4B93E684-0630-45F4-8F63-6C7788C9892F}"
+ ProjectSection(ProjectDependencies) = postProject
+ {191B3618-FECD-4ABD-9D6B-5AC90DC33621} = {191B3618-FECD-4ABD-9D6B-5AC90DC33621}
+ EndProjectSection
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Drawing.Common", "src\System.Drawing.Common.csproj", "{191B3618-FECD-4ABD-9D6B-5AC90DC33621}"
+ ProjectSection(ProjectDependencies) = postProject
+ {D7AEA698-275D-441F-B7A7-8491D1F0EFF0} = {D7AEA698-275D-441F-B7A7-8491D1F0EFF0}
+ EndProjectSection
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Drawing.Common", "ref\System.Drawing.Common.csproj", "{D7AEA698-275D-441F-B7A7-8491D1F0EFF0}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A6F820B0-2679-4543-AE8B-CB9BB71FF175}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1A2F9F4A-A032-433E-B914-ADD5992BB178}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Drawing.Common.Tests", "tests\System.Drawing.Common.Tests.csproj", "{4B93E684-0630-45F4-8F63-6C7788C9892F}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E107E9C1-E893-4E87-987E-04EF0DCEAEFD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{2E666815-2EDB-464B-9DF6-380BF4789AD4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
- netcoreapp-Windows_NT-Debug|Any CPU = netcoreapp-Windows_NT-Debug|Any CPU
- netcoreapp-Windows_NT-Release|Any CPU = netcoreapp-Windows_NT-Release|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Debug|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Debug|Any CPU
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Debug|Any CPU.Build.0 = netcoreapp-Windows_NT-Debug|Any CPU
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.netcoreapp-Windows_NT-Debug|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Debug|Any CPU
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.netcoreapp-Windows_NT-Debug|Any CPU.Build.0 = netcoreapp-Windows_NT-Debug|Any CPU
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.netcoreapp-Windows_NT-Release|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Release|Any CPU
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.netcoreapp-Windows_NT-Release|Any CPU.Build.0 = netcoreapp-Windows_NT-Release|Any CPU
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Release|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Release|Any CPU
- {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Release|Any CPU.Build.0 = netcoreapp-Windows_NT-Release|Any CPU
{4B93E684-0630-45F4-8F63-6C7788C9892F}.Debug|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Debug|Any CPU
{4B93E684-0630-45F4-8F63-6C7788C9892F}.Debug|Any CPU.Build.0 = netcoreapp-Windows_NT-Debug|Any CPU
- {4B93E684-0630-45F4-8F63-6C7788C9892F}.netcoreapp-Windows_NT-Debug|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Debug|Any CPU
- {4B93E684-0630-45F4-8F63-6C7788C9892F}.netcoreapp-Windows_NT-Debug|Any CPU.Build.0 = netcoreapp-Windows_NT-Debug|Any CPU
- {4B93E684-0630-45F4-8F63-6C7788C9892F}.netcoreapp-Windows_NT-Release|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Release|Any CPU
- {4B93E684-0630-45F4-8F63-6C7788C9892F}.netcoreapp-Windows_NT-Release|Any CPU.Build.0 = netcoreapp-Windows_NT-Release|Any CPU
{4B93E684-0630-45F4-8F63-6C7788C9892F}.Release|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Release|Any CPU
{4B93E684-0630-45F4-8F63-6C7788C9892F}.Release|Any CPU.Build.0 = netcoreapp-Windows_NT-Release|Any CPU
+ {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Debug|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Debug|Any CPU
+ {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Debug|Any CPU.Build.0 = netcoreapp-Windows_NT-Debug|Any CPU
+ {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Release|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Release|Any CPU
+ {191B3618-FECD-4ABD-9D6B-5AC90DC33621}.Release|Any CPU.Build.0 = netcoreapp-Windows_NT-Release|Any CPU
+ {D7AEA698-275D-441F-B7A7-8491D1F0EFF0}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
+ {D7AEA698-275D-441F-B7A7-8491D1F0EFF0}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
+ {D7AEA698-275D-441F-B7A7-8491D1F0EFF0}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
+ {D7AEA698-275D-441F-B7A7-8491D1F0EFF0}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {4B93E684-0630-45F4-8F63-6C7788C9892F} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{191B3618-FECD-4ABD-9D6B-5AC90DC33621} = {E107E9C1-E893-4E87-987E-04EF0DCEAEFD}
- {4B93E684-0630-45F4-8F63-6C7788C9892F} = {A6F820B0-2679-4543-AE8B-CB9BB71FF175}
+ {D7AEA698-275D-441F-B7A7-8491D1F0EFF0} = {2E666815-2EDB-464B-9DF6-380BF4789AD4}
EndGlobalSection
EndGlobal
diff --git a/src/System.Drawing.Common/ref/System.Drawing.Common.csproj b/src/System.Drawing.Common/ref/System.Drawing.Common.csproj
index 52b77920a3..95030c06a4 100644
--- a/src/System.Drawing.Common/ref/System.Drawing.Common.csproj
+++ b/src/System.Drawing.Common/ref/System.Drawing.Common.csproj
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <ProjectGuid>{D7AEA698-275D-441F-B7A7-8491D1F0EFF0}</ProjectGuid>
+ </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Release|AnyCPU'" />
<ItemGroup>
diff --git a/src/System.Drawing.Common/src/System.Drawing.Common.csproj b/src/System.Drawing.Common/src/System.Drawing.Common.csproj
index 7716dffe5d..375b551702 100644
--- a/src/System.Drawing.Common/src/System.Drawing.Common.csproj
+++ b/src/System.Drawing.Common/src/System.Drawing.Common.csproj
@@ -10,6 +10,7 @@
<!-- TODO: RE-ENABLE THIS -->
<EnablePInvokeAnalyzer>false</EnablePInvokeAnalyzer>
<WarningsNotAsErrors>CS0618</WarningsNotAsErrors>
+ <DefineConstants Condition="'$(TargetsWindows)' == 'true'">$(DefineConstants);FEATURE_WINDOWS_SYSTEM_COLORS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Release|AnyCPU'" />
@@ -39,109 +40,6 @@
<ItemGroup>
<Compile Include="AssemblyRef.cs" />
<Compile Include="SRDescriptionAttribute.cs" />
- <Compile Include="System\ComponentModel\InvalidEnumArgumentException.cs" />
- <Compile Include="System\Drawing\Advanced\AdjustableArrowCap.cs" />
- <Compile Include="System\Drawing\Advanced\BitmapData.cs" />
- <Compile Include="System\Drawing\Advanced\Blend.cs" />
- <Compile Include="System\Drawing\Advanced\BrushType.cs" />
- <Compile Include="System\Drawing\Advanced\ColorAdjustType.cs" />
- <Compile Include="System\Drawing\Advanced\ColorBlend.cs" />
- <Compile Include="System\Drawing\Advanced\ColorChannelFlags.cs" />
- <Compile Include="System\Drawing\Advanced\ColorMap.cs" />
- <Compile Include="System\Drawing\Advanced\ColorMapType.cs" />
- <Compile Include="System\Drawing\Advanced\ColorMatrix.cs" />
- <Compile Include="System\Drawing\Advanced\ColorMatrixFlags.cs" />
- <Compile Include="System\Drawing\Advanced\ColorMode.cs" />
- <Compile Include="System\Drawing\Advanced\ColorPalette.cs" />
- <Compile Include="System\Drawing\Advanced\ColorTranslator.cs" />
- <Compile Include="System\Drawing\Advanced\CombineMode.cs" />
- <Compile Include="System\Drawing\Advanced\CompositingMode.cs" />
- <Compile Include="System\Drawing\Advanced\CompositingQuality.cs" />
- <Compile Include="System\Drawing\Advanced\CoordinateSpace.cs" />
- <Compile Include="System\Drawing\Advanced\CustomLineCap.cs" />
- <Compile Include="System\Drawing\Advanced\CustomLineCapType.cs" />
- <Compile Include="System\Drawing\Advanced\DashStyle.cs" />
- <Compile Include="System\Drawing\Advanced\EmfPlusFlags.cs" />
- <Compile Include="System\Drawing\Advanced\EmfPlusRecordType.cs" />
- <Compile Include="System\Drawing\Advanced\EmfType.cs" />
- <Compile Include="System\Drawing\Advanced\Encoder.cs" />
- <Compile Include="System\Drawing\Advanced\EncoderParameter.cs" />
- <Compile Include="System\Drawing\Advanced\EncoderParameters.cs" />
- <Compile Include="System\Drawing\Advanced\EncoderParameterValueType.cs" />
- <Compile Include="System\Drawing\Advanced\EncoderValue.cs" />
- <Compile Include="System\Drawing\Advanced\FillMode.cs" />
- <Compile Include="System\Drawing\Advanced\FlushIntention.cs" />
- <Compile Include="System\Drawing\Advanced\Font.cs" />
- <Compile Include="System\Drawing\Advanced\FontCollection.cs" />
- <Compile Include="System\Drawing\Advanced\FontFamily.cs" />
- <Compile Include="System\Drawing\Advanced\FontStyle.cs" />
- <Compile Include="System\Drawing\Advanced\FrameDimension.cs" />
- <Compile Include="System\Drawing\Advanced\Gdiplus.cs" />
- <Compile Include="System\Drawing\Advanced\GenericFontFamilies.cs" />
- <Compile Include="System\Drawing\Advanced\GPPOINT.cs" />
- <Compile Include="System\Drawing\Advanced\GPPOINTF.cs" />
- <Compile Include="System\Drawing\Advanced\GPRECT.cs" />
- <Compile Include="System\Drawing\Advanced\GPRECTF.cs" />
- <Compile Include="System\Drawing\Advanced\GPStream.cs" />
- <Compile Include="System\Drawing\Advanced\GraphicsContainer.cs" />
- <Compile Include="System\Drawing\Advanced\GraphicsPath.cs" />
- <Compile Include="System\Drawing\Advanced\GraphicsPathIterator.cs" />
- <Compile Include="System\Drawing\Advanced\GraphicsState.cs" />
- <Compile Include="System\Drawing\Advanced\HatchBrush.cs" />
- <Compile Include="System\Drawing\Advanced\HatchStyle.cs" />
- <Compile Include="System\Drawing\Advanced\HotkeyPrefix.cs" />
- <Compile Include="System\Drawing\Advanced\ImageAttributes.cs" />
- <Compile Include="System\Drawing\Advanced\ImageCodecFlags.cs" />
- <Compile Include="System\Drawing\Advanced\ImageCodecInfo.cs" />
- <Compile Include="System\Drawing\Advanced\ImageCodecInfoPrivate.cs" />
- <Compile Include="System\Drawing\Advanced\ImageFlags.cs" />
- <Compile Include="System\Drawing\Advanced\ImageFormat.cs" />
- <Compile Include="System\Drawing\Advanced\ImageLockMode.cs" />
- <Compile Include="System\Drawing\Advanced\InstalledFontCollection.cs" />
- <Compile Include="System\Drawing\Advanced\InterpolationMode.cs" />
- <Compile Include="System\Drawing\Advanced\ISystemEventTracker.cs" />
- <Compile Include="System\Drawing\Advanced\LinearGradientBrush.cs" />
- <Compile Include="System\Drawing\Advanced\LinearGradientMode.cs" />
- <Compile Include="System\Drawing\Advanced\LineCap.cs" />
- <Compile Include="System\Drawing\Advanced\LineJoin.cs" />
- <Compile Include="System\Drawing\Advanced\Matrix.cs" />
- <Compile Include="System\Drawing\Advanced\MatrixOrder.cs" />
- <Compile Include="System\Drawing\Advanced\Metafile.cs" />
- <Compile Include="System\Drawing\Advanced\MetafileFrameUnit.cs" />
- <Compile Include="System\Drawing\Advanced\MetafileHeader.cs" />
- <Compile Include="System\Drawing\Advanced\MetafileHeaderEmf.cs" />
- <Compile Include="System\Drawing\Advanced\MetafileHeaderWmf.cs" />
- <Compile Include="System\Drawing\Advanced\MetafileType.cs" />
- <Compile Include="System\Drawing\Advanced\METAHEADER.cs" />
- <Compile Include="System\Drawing\Advanced\PaletteFlags.cs" />
- <Compile Include="System\Drawing\Advanced\PathData.cs" />
- <Compile Include="System\Drawing\Advanced\PathGradientBrush.cs" />
- <Compile Include="System\Drawing\Advanced\PathPointType.cs" />
- <Compile Include="System\Drawing\Advanced\PenAlignment.cs" />
- <Compile Include="System\Drawing\Advanced\PenType.cs" />
- <Compile Include="System\Drawing\Advanced\PixelFormat.cs" />
- <Compile Include="System\Drawing\Advanced\PixelOffsetMode.cs" />
- <Compile Include="System\Drawing\Advanced\PlayRecordCallback.cs" />
- <Compile Include="System\Drawing\Advanced\PrivateFontCollection.cs" />
- <Compile Include="System\Drawing\Advanced\PropertyItem.cs" />
- <Compile Include="System\Drawing\Advanced\QualityMode.cs" />
- <Compile Include="System\Drawing\Advanced\RectangleFEx.cs" />
- <Compile Include="System\Drawing\Advanced\RegionData.cs" />
- <Compile Include="System\Drawing\Advanced\SafeCustomLineCapHandle.cs" />
- <Compile Include="System\Drawing\Advanced\SmoothingMode.cs" />
- <Compile Include="System\Drawing\Advanced\StringAlignment.cs" />
- <Compile Include="System\Drawing\Advanced\StringDigitSubstitute.cs" />
- <Compile Include="System\Drawing\Advanced\StringFormat.cs" />
- <Compile Include="System\Drawing\Advanced\StringFormatFlags.cs" />
- <Compile Include="System\Drawing\Advanced\StringTrimming.cs" />
- <Compile Include="System\Drawing\Advanced\StringUnit.cs" />
- <Compile Include="System\Drawing\Advanced\SystemColorTracker.cs" />
- <Compile Include="System\Drawing\Advanced\TextRenderingHint.cs" />
- <Compile Include="System\Drawing\Advanced\TextureBrush.cs" />
- <Compile Include="System\Drawing\Advanced\Unit.cs" />
- <Compile Include="System\Drawing\Advanced\WarpMode.cs" />
- <Compile Include="System\Drawing\Advanced\WmfPlaceableFileHeader.cs" />
- <Compile Include="System\Drawing\Advanced\WrapMode.cs" />
<Compile Include="System\Drawing\Bitmap.cs" />
<Compile Include="System\Drawing\BitmapSelector.cs" />
<Compile Include="System\Drawing\BitmapSuffixInSameAssemblyAttribute.cs" />
@@ -151,11 +49,54 @@
<Compile Include="System\Drawing\BufferedGraphics.cs" />
<Compile Include="System\Drawing\BufferedGraphicsContext.cs" />
<Compile Include="System\Drawing\BufferedGraphicsManager.cs" />
+ <Compile Include="System\Drawing\ColorTranslator.cs" />
<Compile Include="System\Drawing\Configuration\SystemDrawingSection.cs" />
<Compile Include="System\Drawing\ContentAlignment.cs" />
<Compile Include="System\Drawing\CopyPixelOperation.cs" />
<Compile Include="System\Drawing\DashCap.cs" />
<Compile Include="System\Drawing\Design\CategoryNameCollection.cs" />
+ <Compile Include="System\Drawing\Drawing2D\AdjustableArrowCap.cs" />
+ <Compile Include="System\Drawing\Drawing2D\Blend.cs" />
+ <Compile Include="System\Drawing\Drawing2D\BrushType.cs" />
+ <Compile Include="System\Drawing\Drawing2D\ColorBlend.cs" />
+ <Compile Include="System\Drawing\Drawing2D\CombineMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\CompositingMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\CompositingQuality.cs" />
+ <Compile Include="System\Drawing\Drawing2D\CoordinateSpace.cs" />
+ <Compile Include="System\Drawing\Drawing2D\CustomLineCap.cs" />
+ <Compile Include="System\Drawing\Drawing2D\CustomLineCapType.cs" />
+ <Compile Include="System\Drawing\Drawing2D\DashStyle.cs" />
+ <Compile Include="System\Drawing\Drawing2D\FillMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\FlushIntention.cs" />
+ <Compile Include="System\Drawing\Drawing2D\GraphicsContainer.cs" />
+ <Compile Include="System\Drawing\Drawing2D\GraphicsPath.cs" />
+ <Compile Include="System\Drawing\Drawing2D\GraphicsPathIterator.cs" />
+ <Compile Include="System\Drawing\Drawing2D\GraphicsState.cs" />
+ <Compile Include="System\Drawing\Drawing2D\HatchBrush.cs" />
+ <Compile Include="System\Drawing\Drawing2D\HatchStyle.cs" />
+ <Compile Include="System\Drawing\Drawing2D\InterpolationMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\LinearGradientBrush.cs" />
+ <Compile Include="System\Drawing\Drawing2D\LinearGradientMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\LineCap.cs" />
+ <Compile Include="System\Drawing\Drawing2D\LineJoin.cs" />
+ <Compile Include="System\Drawing\Drawing2D\Matrix.cs" />
+ <Compile Include="System\Drawing\Drawing2D\MatrixOrder.cs" />
+ <Compile Include="System\Drawing\Drawing2D\PathData.cs" />
+ <Compile Include="System\Drawing\Drawing2D\PathGradientBrush.cs" />
+ <Compile Include="System\Drawing\Drawing2D\PathPointType.cs" />
+ <Compile Include="System\Drawing\Drawing2D\PenAlignment.cs" />
+ <Compile Include="System\Drawing\Drawing2D\PenType.cs" />
+ <Compile Include="System\Drawing\Drawing2D\PixelOffsetMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\QualityMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\RegionData.cs" />
+ <Compile Include="System\Drawing\Drawing2D\SafeCustomLineCapHandle.cs" />
+ <Compile Include="System\Drawing\Drawing2D\SmoothingMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\WarpMode.cs" />
+ <Compile Include="System\Drawing\Drawing2D\WrapMode.cs" />
+ <Compile Include="System\Drawing\Font.cs" />
+ <Compile Include="System\Drawing\FontFamily.cs" />
+ <Compile Include="System\Drawing\FontStyle.cs" />
+ <Compile Include="System\Drawing\Gdiplus.cs" />
<Compile Include="System\Drawing\Graphics.cs" />
<Compile Include="System\Drawing\GraphicsContext.cs" />
<Compile Include="System\Drawing\Icon.cs" />
@@ -163,7 +104,51 @@
<Compile Include="System\Drawing\Image.cs" />
<Compile Include="System\Drawing\ImageAnimator.cs" />
<Compile Include="System\Drawing\ImageInfo.cs" />
- <Compile Include="System\Drawing\KnownColorTable.cs" />
+ <Compile Include="System\Drawing\Imaging\BitmapData.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorAdjustType.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorChannelFlags.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorMap.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorMapType.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorMatrix.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorMatrixFlags.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorMode.cs" />
+ <Compile Include="System\Drawing\Imaging\ColorPalette.cs" />
+ <Compile Include="System\Drawing\Imaging\EmfPlusFlags.cs" />
+ <Compile Include="System\Drawing\Imaging\EmfPlusRecordType.cs" />
+ <Compile Include="System\Drawing\Imaging\EmfType.cs" />
+ <Compile Include="System\Drawing\Imaging\Encoder.cs" />
+ <Compile Include="System\Drawing\Imaging\EncoderParameter.cs" />
+ <Compile Include="System\Drawing\Imaging\EncoderParameters.cs" />
+ <Compile Include="System\Drawing\Imaging\EncoderParameterValueType.cs" />
+ <Compile Include="System\Drawing\Imaging\EncoderValue.cs" />
+ <Compile Include="System\Drawing\Imaging\FrameDimension.cs" />
+ <Compile Include="System\Drawing\Imaging\ImageAttributes.cs" />
+ <Compile Include="System\Drawing\Imaging\ImageCodecFlags.cs" />
+ <Compile Include="System\Drawing\Imaging\ImageCodecInfo.cs" />
+ <Compile Include="System\Drawing\Imaging\ImageCodecInfoPrivate.cs" />
+ <Compile Include="System\Drawing\Imaging\ImageFlags.cs" />
+ <Compile Include="System\Drawing\Imaging\ImageFormat.cs" />
+ <Compile Include="System\Drawing\Imaging\ImageLockMode.cs" />
+ <Compile Include="System\Drawing\Imaging\Metafile.cs" />
+ <Compile Include="System\Drawing\Imaging\MetafileFrameUnit.cs" />
+ <Compile Include="System\Drawing\Imaging\MetafileHeader.cs" />
+ <Compile Include="System\Drawing\Imaging\MetafileHeaderEmf.cs" />
+ <Compile Include="System\Drawing\Imaging\MetafileHeaderWmf.cs" />
+ <Compile Include="System\Drawing\Imaging\MetafileType.cs" />
+ <Compile Include="System\Drawing\Imaging\METAHEADER.cs" />
+ <Compile Include="System\Drawing\Imaging\PaletteFlags.cs" />
+ <Compile Include="System\Drawing\Imaging\PixelFormat.cs" />
+ <Compile Include="System\Drawing\Imaging\PlayRecordCallback.cs" />
+ <Compile Include="System\Drawing\Imaging\PropertyItem.cs" />
+ <Compile Include="System\Drawing\Imaging\WmfPlaceableFileHeader.cs" />
+ <Compile Include="System\Drawing\Internal\GPPOINT.cs" />
+ <Compile Include="System\Drawing\Internal\GPPOINTF.cs" />
+ <Compile Include="System\Drawing\Internal\GPRECT.cs" />
+ <Compile Include="System\Drawing\Internal\GPRECTF.cs" />
+ <Compile Include="System\Drawing\Internal\GPStream.cs" />
+ <Compile Include="System\Drawing\Internal\ISystemEventTracker.cs" />
+ <Compile Include="System\Drawing\Internal\RectangleFEx.cs" />
+ <Compile Include="System\Drawing\Internal\SystemColorTracker.cs" />
<Compile Include="System\Drawing\LocalAppContextSwitches.cs" />
<Compile Include="System\Drawing\NativeMethods.cs" />
<Compile Include="System\Drawing\Pen.cs" />
@@ -203,12 +188,26 @@
<Compile Include="System\Drawing\Region.cs" />
<Compile Include="System\Drawing\RotateFlipType.cs" />
<Compile Include="System\Drawing\SolidBrush.cs" />
+ <Compile Include="System\Drawing\StringAlignment.cs" />
+ <Compile Include="System\Drawing\StringDigitSubstitute.cs" />
+ <Compile Include="System\Drawing\StringFormat.cs" />
+ <Compile Include="System\Drawing\StringFormatFlags.cs" />
+ <Compile Include="System\Drawing\StringTrimming.cs" />
+ <Compile Include="System\Drawing\StringUnit.cs" />
<Compile Include="System\Drawing\SystemBrushes.cs" />
<Compile Include="System\Drawing\SystemColors.cs" />
<Compile Include="System\Drawing\SystemFonts.cs" />
<Compile Include="System\Drawing\SystemIcons.cs" />
<Compile Include="System\Drawing\SystemPens.cs" />
+ <Compile Include="System\Drawing\TextureBrush.cs" />
+ <Compile Include="System\Drawing\Text\FontCollection.cs" />
+ <Compile Include="System\Drawing\Text\GenericFontFamilies.cs" />
+ <Compile Include="System\Drawing\Text\HotkeyPrefix.cs" />
+ <Compile Include="System\Drawing\Text\InstalledFontCollection.cs" />
+ <Compile Include="System\Drawing\Text\PrivateFontCollection.cs" />
+ <Compile Include="System\Drawing\Text\TextRenderingHint.cs" />
<Compile Include="System\Drawing\ToolboxBitmapAttribute.cs" />
+ <Compile Include="System\Drawing\Unit.cs" />
<Compile Include="System\Drawing\UnsafeNativeMethods.cs" />
<Compile Include="misc\ClientUtils.cs" />
<Compile Include="misc\CompModSwitches.cs" />
@@ -232,12 +231,24 @@
<Compile Include="misc\HandleCollector.cs" />
<Compile Include="misc\InvariantComparer.cs" />
<Compile Include="$(CommonPath)\System\LocalAppContext.cs" />
+ <Compile Include="$(CommonPath)\Interop\Windows\Interop.Libraries.cs">
+ <Link>Common\Interop\Windows\Interop.Libraries.cs</Link>
+ </Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetSysColor.cs">
+ <Link>Common\Interop\Windows\user32\Interop.GetSysColor.cs</Link>
+ </Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.Win32SystemColors.cs">
+ <Link>Common\Interop\Windows\user32\Interop.Win32SystemColors.cs</Link>
+ </Compile>
<Compile Include="$(CommonPath)/System/Drawing/ColorConverterCommon.cs">
<Link>System\Drawing\ColorConverterCommon.cs</Link>
</Compile>
<Compile Include="$(CommonPath)/System/Drawing/ColorTable.cs">
<Link>System\Drawing\ColorTable.cs</Link>
</Compile>
+ <Compile Include="$(CommonPath)\System\Drawing\KnownColorTable.cs">
+ <Link>System\Drawing\KnownColorTable.cs</Link>
+ </Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\System\Drawing\DefaultComponent.bmp" />
diff --git a/src/System.Drawing.Common/src/System/Drawing/Brushes.cs b/src/System.Drawing.Common/src/System/Drawing/Brushes.cs
index d8c2d6db5c..28ed9f7725 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Brushes.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Brushes.cs
@@ -152,10 +152,6 @@ namespace System.Drawing
private static readonly object s_yellowKey = new object();
private static readonly object s_yellowGreenKey = new object();
- private Brushes()
- {
- }
-
/// <include file='doc\Brushes.uex' path='docs/doc[@for="Brushes.Transparent"]/*' />
/// <devdoc>
/// A transparent brush.
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorTranslator.cs b/src/System.Drawing.Common/src/System/Drawing/ColorTranslator.cs
index 43ca9e400f..df06a5e4f4 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorTranslator.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/ColorTranslator.cs
@@ -19,12 +19,6 @@ namespace System.Drawing
private static Hashtable s_htmlSysColorTable;
- // not creatable...
- //
- private ColorTranslator()
- {
- }
-
/// <include file='doc\ColorTranslator.uex' path='docs/doc[@for="ColorTranslator.ToWin32"]/*' />
/// <devdoc>
/// Translates the specified <see cref='System.Drawing.Color'/> to a
@@ -133,75 +127,69 @@ namespace System.Drawing
// WARNING!!! WARNING!!! WARNING!!! WARNING!!!
// We must never have another method called ToOle() with a different signature.
// This is so that we can push into the runtime a custom marshaller for OLE_COLOR to Color.
-
- // if system color
- // (the if < 0x18 check test whether it's a well-formed system color)
- if (unchecked((int)(oleColor & 0xFF000000)) == unchecked((int)0x80000000)
- && (oleColor & 0xFFFFFF) <= 0x1E)
+
+ switch (oleColor)
{
- switch (oleColor)
- {
- case unchecked((int)0x8000000A):
- return Color.FromKnownColor(KnownColor.ActiveBorder);
- case unchecked((int)0x80000002):
- return Color.FromKnownColor(KnownColor.ActiveCaption);
- case unchecked((int)0x80000009):
- return Color.FromKnownColor(KnownColor.ActiveCaptionText);
- case unchecked((int)0x8000000C):
- return Color.FromKnownColor(KnownColor.AppWorkspace);
- case unchecked((int)0x8000000F):
- return Color.FromKnownColor(KnownColor.Control);
- case unchecked((int)0x80000010):
- return Color.FromKnownColor(KnownColor.ControlDark);
- case unchecked((int)0x80000015):
- return Color.FromKnownColor(KnownColor.ControlDarkDark);
- case unchecked((int)0x80000016):
- return Color.FromKnownColor(KnownColor.ControlLight);
- case unchecked((int)0x80000014):
- return Color.FromKnownColor(KnownColor.ControlLightLight);
- case unchecked((int)0x80000012):
- return Color.FromKnownColor(KnownColor.ControlText);
- case unchecked((int)0x80000001):
- return Color.FromKnownColor(KnownColor.Desktop);
- case unchecked((int)0x8000001B):
- return Color.FromKnownColor(KnownColor.GradientActiveCaption);
- case unchecked((int)0x8000001C):
- return Color.FromKnownColor(KnownColor.GradientInactiveCaption);
- case unchecked((int)0x80000011):
- return Color.FromKnownColor(KnownColor.GrayText);
- case unchecked((int)0x8000000D):
- return Color.FromKnownColor(KnownColor.Highlight);
- case unchecked((int)0x8000000E):
- return Color.FromKnownColor(KnownColor.HighlightText);
- case unchecked((int)0x8000001A):
- return Color.FromKnownColor(KnownColor.HotTrack);
- case unchecked((int)0x8000000B):
- return Color.FromKnownColor(KnownColor.InactiveBorder);
- case unchecked((int)0x80000003):
- return Color.FromKnownColor(KnownColor.InactiveCaption);
- case unchecked((int)0x80000013):
- return Color.FromKnownColor(KnownColor.InactiveCaptionText);
- case unchecked((int)0x80000018):
- return Color.FromKnownColor(KnownColor.Info);
- case unchecked((int)0x80000017):
- return Color.FromKnownColor(KnownColor.InfoText);
- case unchecked((int)0x80000004):
- return Color.FromKnownColor(KnownColor.Menu);
- case unchecked((int)0x8000001E):
- return Color.FromKnownColor(KnownColor.MenuBar);
- case unchecked((int)0x8000001D):
- return Color.FromKnownColor(KnownColor.MenuHighlight);
- case unchecked((int)0x80000007):
- return Color.FromKnownColor(KnownColor.MenuText);
- case unchecked((int)0x80000000):
- return Color.FromKnownColor(KnownColor.ScrollBar);
- case unchecked((int)0x80000005):
- return Color.FromKnownColor(KnownColor.Window);
- case unchecked((int)0x80000006):
- return Color.FromKnownColor(KnownColor.WindowFrame);
- case unchecked((int)0x80000008):
- return Color.FromKnownColor(KnownColor.WindowText);
- }
+ case unchecked((int)0x8000000A):
+ return Color.FromKnownColor(KnownColor.ActiveBorder);
+ case unchecked((int)0x80000002):
+ return Color.FromKnownColor(KnownColor.ActiveCaption);
+ case unchecked((int)0x80000009):
+ return Color.FromKnownColor(KnownColor.ActiveCaptionText);
+ case unchecked((int)0x8000000C):
+ return Color.FromKnownColor(KnownColor.AppWorkspace);
+ case unchecked((int)0x8000000F):
+ return Color.FromKnownColor(KnownColor.Control);
+ case unchecked((int)0x80000010):
+ return Color.FromKnownColor(KnownColor.ControlDark);
+ case unchecked((int)0x80000015):
+ return Color.FromKnownColor(KnownColor.ControlDarkDark);
+ case unchecked((int)0x80000016):
+ return Color.FromKnownColor(KnownColor.ControlLight);
+ case unchecked((int)0x80000014):
+ return Color.FromKnownColor(KnownColor.ControlLightLight);
+ case unchecked((int)0x80000012):
+ return Color.FromKnownColor(KnownColor.ControlText);
+ case unchecked((int)0x80000001):
+ return Color.FromKnownColor(KnownColor.Desktop);
+ case unchecked((int)0x8000001B):
+ return Color.FromKnownColor(KnownColor.GradientActiveCaption);
+ case unchecked((int)0x8000001C):
+ return Color.FromKnownColor(KnownColor.GradientInactiveCaption);
+ case unchecked((int)0x80000011):
+ return Color.FromKnownColor(KnownColor.GrayText);
+ case unchecked((int)0x8000000D):
+ return Color.FromKnownColor(KnownColor.Highlight);
+ case unchecked((int)0x8000000E):
+ return Color.FromKnownColor(KnownColor.HighlightText);
+ case unchecked((int)0x8000001A):
+ return Color.FromKnownColor(KnownColor.HotTrack);
+ case unchecked((int)0x8000000B):
+ return Color.FromKnownColor(KnownColor.InactiveBorder);
+ case unchecked((int)0x80000003):
+ return Color.FromKnownColor(KnownColor.InactiveCaption);
+ case unchecked((int)0x80000013):
+ return Color.FromKnownColor(KnownColor.InactiveCaptionText);
+ case unchecked((int)0x80000018):
+ return Color.FromKnownColor(KnownColor.Info);
+ case unchecked((int)0x80000017):
+ return Color.FromKnownColor(KnownColor.InfoText);
+ case unchecked((int)0x80000004):
+ return Color.FromKnownColor(KnownColor.Menu);
+ case unchecked((int)0x8000001E):
+ return Color.FromKnownColor(KnownColor.MenuBar);
+ case unchecked((int)0x8000001D):
+ return Color.FromKnownColor(KnownColor.MenuHighlight);
+ case unchecked((int)0x80000007):
+ return Color.FromKnownColor(KnownColor.MenuText);
+ case unchecked((int)0x80000000):
+ return Color.FromKnownColor(KnownColor.ScrollBar);
+ case unchecked((int)0x80000005):
+ return Color.FromKnownColor(KnownColor.Window);
+ case unchecked((int)0x80000006):
+ return Color.FromKnownColor(KnownColor.WindowFrame);
+ case unchecked((int)0x80000008):
+ return Color.FromKnownColor(KnownColor.WindowText);
}
Color color = Color.FromArgb((byte)((oleColor >> Win32RedShift) & 0xFF),
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/AdjustableArrowCap.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/AdjustableArrowCap.cs
index d964096160..d964096160 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/AdjustableArrowCap.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/AdjustableArrowCap.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/Blend.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/Blend.cs
index f5a74f880d..f5a74f880d 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/Blend.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/Blend.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/BrushType.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/BrushType.cs
index 560c1ddeb6..560c1ddeb6 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/BrushType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/BrushType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorBlend.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/ColorBlend.cs
index 63986970d3..63986970d3 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorBlend.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/ColorBlend.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/CombineMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CombineMode.cs
index a5c7b05014..a5c7b05014 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/CombineMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CombineMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/CompositingMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CompositingMode.cs
index dfdaec75fa..dfdaec75fa 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/CompositingMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CompositingMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/CompositingQuality.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CompositingQuality.cs
index 3e2fe818a3..3e2fe818a3 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/CompositingQuality.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CompositingQuality.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/CoordinateSpace.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CoordinateSpace.cs
index 03322300ba..03322300ba 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/CoordinateSpace.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CoordinateSpace.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/CustomLineCap.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CustomLineCap.cs
index 8d83abd73f..8d83abd73f 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/CustomLineCap.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CustomLineCap.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/CustomLineCapType.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CustomLineCapType.cs
index 3ac7d202ba..3ac7d202ba 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/CustomLineCapType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/CustomLineCapType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/DashStyle.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/DashStyle.cs
index 531ea97393..531ea97393 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/DashStyle.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/DashStyle.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/FillMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/FillMode.cs
index 49ac81d8d2..49ac81d8d2 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/FillMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/FillMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/FlushIntention.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/FlushIntention.cs
index 88e1c2baec..88e1c2baec 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/FlushIntention.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/FlushIntention.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsContainer.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsContainer.cs
index 532ad86000..532ad86000 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsContainer.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsContainer.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsPath.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsPath.cs
index 1300c06253..1300c06253 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsPath.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsPath.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsPathIterator.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsPathIterator.cs
index 4c93d67633..4c93d67633 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsPathIterator.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsPathIterator.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsState.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsState.cs
index 58e0952cf5..58e0952cf5 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GraphicsState.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/GraphicsState.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/HatchBrush.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/HatchBrush.cs
index e1893618f9..e1893618f9 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/HatchBrush.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/HatchBrush.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/HatchStyle.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/HatchStyle.cs
index cdef717999..cdef717999 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/HatchStyle.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/HatchStyle.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/InterpolationMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/InterpolationMode.cs
index 5a1ae21a13..5a1ae21a13 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/InterpolationMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/InterpolationMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/LineCap.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LineCap.cs
index c9a854f403..c9a854f403 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/LineCap.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LineCap.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/LineJoin.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LineJoin.cs
index 25bc930743..25bc930743 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/LineJoin.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LineJoin.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/LinearGradientBrush.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LinearGradientBrush.cs
index 36ad66c708..36ad66c708 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/LinearGradientBrush.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LinearGradientBrush.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/LinearGradientMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LinearGradientMode.cs
index b3463987cb..b3463987cb 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/LinearGradientMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/LinearGradientMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/Matrix.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/Matrix.cs
index 7112769b2b..7112769b2b 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/Matrix.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/Matrix.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/MatrixOrder.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/MatrixOrder.cs
index 672181cb8f..672181cb8f 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/MatrixOrder.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/MatrixOrder.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PathData.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathData.cs
index 177a60e095..177a60e095 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PathData.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathData.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PathGradientBrush.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathGradientBrush.cs
index fd8b796b39..fd8b796b39 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PathGradientBrush.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathGradientBrush.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PathPointType.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathPointType.cs
index f7910ec97f..f7910ec97f 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PathPointType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PathPointType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PenAlignment.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PenAlignment.cs
index fc8cb1b09f..fc8cb1b09f 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PenAlignment.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PenAlignment.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PenType.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PenType.cs
index 2ee42bfa3e..2ee42bfa3e 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PenType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PenType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PixelOffsetMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PixelOffsetMode.cs
index ee02085767..ee02085767 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PixelOffsetMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/PixelOffsetMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/QualityMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/QualityMode.cs
index 07ef4b7916..07ef4b7916 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/QualityMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/QualityMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/RegionData.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/RegionData.cs
index a6f3094cc5..a6f3094cc5 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/RegionData.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/RegionData.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/SafeCustomLineCapHandle.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/SafeCustomLineCapHandle.cs
index e2326e995d..e2326e995d 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/SafeCustomLineCapHandle.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/SafeCustomLineCapHandle.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/SmoothingMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/SmoothingMode.cs
index c573e143d6..c573e143d6 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/SmoothingMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/SmoothingMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/WarpMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/WarpMode.cs
index e08d2eb920..e08d2eb920 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/WarpMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/WarpMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/WrapMode.cs b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/WrapMode.cs
index 7db0661a0a..7db0661a0a 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/WrapMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Drawing2D/WrapMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/Font.cs b/src/System.Drawing.Common/src/System/Drawing/Font.cs
index 46a382b599..46a382b599 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/Font.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Font.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/FontFamily.cs b/src/System.Drawing.Common/src/System/Drawing/FontFamily.cs
index fb87c48ed9..fb87c48ed9 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/FontFamily.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/FontFamily.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/FontStyle.cs b/src/System.Drawing.Common/src/System/Drawing/FontStyle.cs
index ff4a9647ce..ff4a9647ce 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/FontStyle.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/FontStyle.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/Gdiplus.cs b/src/System.Drawing.Common/src/System/Drawing/Gdiplus.cs
index 8c38be40f8..8c38be40f8 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/Gdiplus.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Gdiplus.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/BitmapData.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/BitmapData.cs
index 850f21a36a..850f21a36a 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/BitmapData.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/BitmapData.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorAdjustType.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorAdjustType.cs
index 0dda3f3b09..0dda3f3b09 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorAdjustType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorAdjustType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorChannelFlags.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorChannelFlags.cs
index a1c0295c12..a1c0295c12 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorChannelFlags.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorChannelFlags.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMap.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMap.cs
index 7fda5bd0c1..7fda5bd0c1 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMap.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMap.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMapType.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMapType.cs
index c523120266..c523120266 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMapType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMapType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMatrix.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMatrix.cs
index aed76b0487..aed76b0487 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMatrix.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMatrix.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMatrixFlags.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMatrixFlags.cs
index 1f3e732bf6..1f3e732bf6 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMatrixFlags.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMatrixFlags.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMode.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMode.cs
index 63df6b7125..63df6b7125 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorPalette.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorPalette.cs
index eac8755460..eac8755460 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ColorPalette.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ColorPalette.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/EmfPlusFlags.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/EmfPlusFlags.cs
index 22e725b845..22e725b845 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/EmfPlusFlags.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/EmfPlusFlags.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/EmfPlusRecordType.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/EmfPlusRecordType.cs
index e2c0279680..e2c0279680 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/EmfPlusRecordType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/EmfPlusRecordType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/EmfType.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/EmfType.cs
index b463052e46..b463052e46 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/EmfType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/EmfType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/Encoder.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/Encoder.cs
index bdba3631cc..bdba3631cc 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/Encoder.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/Encoder.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameter.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameter.cs
index 4c34ce564f..4c34ce564f 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameter.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameter.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameterValueType.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameterValueType.cs
index f77f4a21c1..f77f4a21c1 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameterValueType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameterValueType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameters.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameters.cs
index 6e3b963567..6e3b963567 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderParameters.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderParameters.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderValue.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderValue.cs
index 61a24e60db..61a24e60db 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/EncoderValue.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/EncoderValue.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/FrameDimension.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/FrameDimension.cs
index 39f7583f81..39f7583f81 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/FrameDimension.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/FrameDimension.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageAttributes.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageAttributes.cs
index 6026cc88ae..6026cc88ae 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageAttributes.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageAttributes.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecFlags.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecFlags.cs
index caa89b3725..caa89b3725 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecFlags.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecFlags.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecInfo.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecInfo.cs
index 919d65b419..919d65b419 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecInfo.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecInfo.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecInfoPrivate.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecInfoPrivate.cs
index b205e2905e..b205e2905e 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageCodecInfoPrivate.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageCodecInfoPrivate.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageFlags.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageFlags.cs
index 7765a23240..7765a23240 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageFlags.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageFlags.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageFormat.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageFormat.cs
index 1df7ee392d..1df7ee392d 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageFormat.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageFormat.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageLockMode.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageLockMode.cs
index 4f8049a7f6..4f8049a7f6 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ImageLockMode.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/ImageLockMode.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/METAHEADER.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/METAHEADER.cs
index a8e3092e8d..a8e3092e8d 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/METAHEADER.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/METAHEADER.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/Metafile.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/Metafile.cs
index cf9fba5424..cf9fba5424 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/Metafile.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/Metafile.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileFrameUnit.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileFrameUnit.cs
index fae4d86708..fae4d86708 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileFrameUnit.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileFrameUnit.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeader.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeader.cs
index 9e1ae89d65..9e1ae89d65 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeader.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeader.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeaderEmf.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeaderEmf.cs
index 4d852f0292..4d852f0292 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeaderEmf.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeaderEmf.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeaderWmf.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeaderWmf.cs
index dc2d1e82cf..dc2d1e82cf 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileHeaderWmf.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileHeaderWmf.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileType.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileType.cs
index 1d14721add..1d14721add 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/MetafileType.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/MetafileType.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PaletteFlags.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/PaletteFlags.cs
index 505c7c3f30..505c7c3f30 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PaletteFlags.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/PaletteFlags.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PixelFormat.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/PixelFormat.cs
index 84ac4a4aaf..84ac4a4aaf 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PixelFormat.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/PixelFormat.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PlayRecordCallback.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/PlayRecordCallback.cs
index 301e0b7808..301e0b7808 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PlayRecordCallback.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/PlayRecordCallback.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PropertyItem.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/PropertyItem.cs
index 63cc60d4b0..63cc60d4b0 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PropertyItem.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/PropertyItem.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/WmfPlaceableFileHeader.cs b/src/System.Drawing.Common/src/System/Drawing/Imaging/WmfPlaceableFileHeader.cs
index 6c9bae3bf8..6c9bae3bf8 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/WmfPlaceableFileHeader.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Imaging/WmfPlaceableFileHeader.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPPOINT.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/GPPOINT.cs
index a356967aae..a356967aae 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPPOINT.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/GPPOINT.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPPOINTF.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/GPPOINTF.cs
index 2265b13dc3..2265b13dc3 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPPOINTF.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/GPPOINTF.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPRECT.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/GPRECT.cs
index 321316f08d..321316f08d 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPRECT.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/GPRECT.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPRECTF.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/GPRECTF.cs
index 59805efa30..59805efa30 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPRECTF.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/GPRECTF.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPStream.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/GPStream.cs
index 32bbb36d7b..32bbb36d7b 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GPStream.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/GPStream.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/ISystemEventTracker.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/ISystemEventTracker.cs
index 3fd555f575..3fd555f575 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/ISystemEventTracker.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/ISystemEventTracker.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/RectangleFEx.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/RectangleFEx.cs
index 16cf97b958..16cf97b958 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/RectangleFEx.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/RectangleFEx.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/SystemColorTracker.cs b/src/System.Drawing.Common/src/System/Drawing/Internal/SystemColorTracker.cs
index e2ff0fcd7f..e2ff0fcd7f 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/SystemColorTracker.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Internal/SystemColorTracker.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Pens.cs b/src/System.Drawing.Common/src/System/Drawing/Pens.cs
index 130ff652a6..106102a870 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Pens.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Pens.cs
@@ -152,10 +152,6 @@ namespace System.Drawing
private static readonly object s_yellowKey = new object();
private static readonly object s_yellowGreenKey = new object();
- private Pens()
- {
- }
-
/// <include file='doc\Pens.uex' path='docs/doc[@for="Pens.Transparent"]/*' />
/// <devdoc>
/// <para>[To be supplied.]</para>
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringAlignment.cs b/src/System.Drawing.Common/src/System/Drawing/StringAlignment.cs
index ec2c65164e..ec2c65164e 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringAlignment.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/StringAlignment.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringDigitSubstitute.cs b/src/System.Drawing.Common/src/System/Drawing/StringDigitSubstitute.cs
index 500f76a766..500f76a766 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringDigitSubstitute.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/StringDigitSubstitute.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringFormat.cs b/src/System.Drawing.Common/src/System/Drawing/StringFormat.cs
index e737d7c1f8..e737d7c1f8 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringFormat.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/StringFormat.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringFormatFlags.cs b/src/System.Drawing.Common/src/System/Drawing/StringFormatFlags.cs
index 4cd31cccc8..4cd31cccc8 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringFormatFlags.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/StringFormatFlags.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringTrimming.cs b/src/System.Drawing.Common/src/System/Drawing/StringTrimming.cs
index c38638311a..c38638311a 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringTrimming.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/StringTrimming.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringUnit.cs b/src/System.Drawing.Common/src/System/Drawing/StringUnit.cs
index 05a15acfed..05a15acfed 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/StringUnit.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/StringUnit.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/SystemBrushes.cs b/src/System.Drawing.Common/src/System/Drawing/SystemBrushes.cs
index a18b0d81bb..a3ec306e5b 100644
--- a/src/System.Drawing.Common/src/System/Drawing/SystemBrushes.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/SystemBrushes.cs
@@ -15,10 +15,6 @@ namespace System.Drawing
{
private static readonly object s_systemBrushesKey = new object();
- private SystemBrushes()
- {
- }
-
/// <include file='doc\SystemBrushes.uex' path='docs/doc[@for="SystemBrushes.ActiveBorder"]/*' />
/// <devdoc>
/// Brush is the color of the active window border.
diff --git a/src/System.Drawing.Common/src/System/Drawing/SystemPens.cs b/src/System.Drawing.Common/src/System/Drawing/SystemPens.cs
index 2e759b9564..0428bd3b49 100644
--- a/src/System.Drawing.Common/src/System/Drawing/SystemPens.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/SystemPens.cs
@@ -15,10 +15,6 @@ namespace System.Drawing
{
private static readonly object s_systemPensKey = new object();
- private SystemPens()
- {
- }
-
/// <include file='doc\SystemPens.uex' path='docs/doc[@for="SystemPens.ActiveBorder"]/*' />
/// <devdoc>
/// Pen is the color of the filled area of an active window border.
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/FontCollection.cs b/src/System.Drawing.Common/src/System/Drawing/Text/FontCollection.cs
index 86cb2a414b..86cb2a414b 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/FontCollection.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Text/FontCollection.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/GenericFontFamilies.cs b/src/System.Drawing.Common/src/System/Drawing/Text/GenericFontFamilies.cs
index e09d00939c..e09d00939c 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/GenericFontFamilies.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Text/GenericFontFamilies.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/HotkeyPrefix.cs b/src/System.Drawing.Common/src/System/Drawing/Text/HotkeyPrefix.cs
index db9aa51fe6..db9aa51fe6 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/HotkeyPrefix.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Text/HotkeyPrefix.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/InstalledFontCollection.cs b/src/System.Drawing.Common/src/System/Drawing/Text/InstalledFontCollection.cs
index d7fc469522..d7fc469522 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/InstalledFontCollection.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Text/InstalledFontCollection.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/PrivateFontCollection.cs b/src/System.Drawing.Common/src/System/Drawing/Text/PrivateFontCollection.cs
index 2fc0bfac6b..2fc0bfac6b 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/PrivateFontCollection.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Text/PrivateFontCollection.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/TextRenderingHint.cs b/src/System.Drawing.Common/src/System/Drawing/Text/TextRenderingHint.cs
index 4bcd20811c..4bcd20811c 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/TextRenderingHint.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Text/TextRenderingHint.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/TextureBrush.cs b/src/System.Drawing.Common/src/System/Drawing/TextureBrush.cs
index 78c242d2d8..78c242d2d8 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/TextureBrush.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/TextureBrush.cs
diff --git a/src/System.Drawing.Common/src/System/Drawing/Advanced/Unit.cs b/src/System.Drawing.Common/src/System/Drawing/Unit.cs
index 78d43adac2..78d43adac2 100644
--- a/src/System.Drawing.Common/src/System/Drawing/Advanced/Unit.cs
+++ b/src/System.Drawing.Common/src/System/Drawing/Unit.cs
diff --git a/src/System.Drawing.Common/tests/BrushesTests.cs b/src/System.Drawing.Common/tests/BrushesTests.cs
new file mode 100644
index 0000000000..458c30f517
--- /dev/null
+++ b/src/System.Drawing.Common/tests/BrushesTests.cs
@@ -0,0 +1,182 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Drawing.Drawing2D;
+using System.Reflection;
+using Xunit;
+
+namespace System.Drawing.Tests
+{
+ public class BrushesTests
+ {
+ public static IEnumerable<object[]> Brushes_TestData()
+ {
+ yield return Brush(() => Brushes.AliceBlue, Color.AliceBlue);
+ yield return Brush(() => Brushes.AntiqueWhite, Color.AntiqueWhite);
+ yield return Brush(() => Brushes.Aqua, Color.Aqua);
+ yield return Brush(() => Brushes.Aquamarine, Color.Aquamarine);
+ yield return Brush(() => Brushes.Azure, Color.Azure);
+ yield return Brush(() => Brushes.Beige, Color.Beige);
+ yield return Brush(() => Brushes.Bisque, Color.Bisque);
+ yield return Brush(() => Brushes.Black, Color.Black);
+ yield return Brush(() => Brushes.BlanchedAlmond, Color.BlanchedAlmond);
+ yield return Brush(() => Brushes.Blue, Color.Blue);
+ yield return Brush(() => Brushes.BlueViolet, Color.BlueViolet);
+ yield return Brush(() => Brushes.Brown, Color.Brown);
+ yield return Brush(() => Brushes.BurlyWood, Color.BurlyWood);
+ yield return Brush(() => Brushes.CadetBlue, Color.CadetBlue);
+ yield return Brush(() => Brushes.Chartreuse, Color.Chartreuse);
+ yield return Brush(() => Brushes.Chocolate, Color.Chocolate);
+ yield return Brush(() => Brushes.Coral, Color.Coral);
+ yield return Brush(() => Brushes.CornflowerBlue, Color.CornflowerBlue);
+ yield return Brush(() => Brushes.Cornsilk, Color.Cornsilk);
+ yield return Brush(() => Brushes.Crimson, Color.Crimson);
+ yield return Brush(() => Brushes.Cyan, Color.Cyan);
+ yield return Brush(() => Brushes.DarkBlue, Color.DarkBlue);
+ yield return Brush(() => Brushes.DarkCyan, Color.DarkCyan);
+ yield return Brush(() => Brushes.DarkGoldenrod, Color.DarkGoldenrod);
+ yield return Brush(() => Brushes.DarkGray, Color.DarkGray);
+ yield return Brush(() => Brushes.DarkGreen, Color.DarkGreen);
+ yield return Brush(() => Brushes.DarkKhaki, Color.DarkKhaki);
+ yield return Brush(() => Brushes.DarkMagenta, Color.DarkMagenta);
+ yield return Brush(() => Brushes.DarkOliveGreen, Color.DarkOliveGreen);
+ yield return Brush(() => Brushes.DarkOrange, Color.DarkOrange);
+ yield return Brush(() => Brushes.DarkOrchid, Color.DarkOrchid);
+ yield return Brush(() => Brushes.DarkRed, Color.DarkRed);
+ yield return Brush(() => Brushes.DarkSalmon, Color.DarkSalmon);
+ yield return Brush(() => Brushes.DarkSeaGreen, Color.DarkSeaGreen);
+ yield return Brush(() => Brushes.DarkSlateBlue, Color.DarkSlateBlue);
+ yield return Brush(() => Brushes.DarkSlateGray, Color.DarkSlateGray);
+ yield return Brush(() => Brushes.DarkTurquoise, Color.DarkTurquoise);
+ yield return Brush(() => Brushes.DarkViolet, Color.DarkViolet);
+ yield return Brush(() => Brushes.DeepPink, Color.DeepPink);
+ yield return Brush(() => Brushes.DeepSkyBlue, Color.DeepSkyBlue);
+ yield return Brush(() => Brushes.DimGray, Color.DimGray);
+ yield return Brush(() => Brushes.DodgerBlue, Color.DodgerBlue);
+ yield return Brush(() => Brushes.Firebrick, Color.Firebrick);
+ yield return Brush(() => Brushes.FloralWhite, Color.FloralWhite);
+ yield return Brush(() => Brushes.ForestGreen, Color.ForestGreen);
+ yield return Brush(() => Brushes.Fuchsia, Color.Fuchsia);
+ yield return Brush(() => Brushes.Gainsboro, Color.Gainsboro);
+ yield return Brush(() => Brushes.GhostWhite, Color.GhostWhite);
+ yield return Brush(() => Brushes.Gold, Color.Gold);
+ yield return Brush(() => Brushes.Goldenrod, Color.Goldenrod);
+ yield return Brush(() => Brushes.Gray, Color.Gray);
+ yield return Brush(() => Brushes.Green, Color.Green);
+ yield return Brush(() => Brushes.GreenYellow, Color.GreenYellow);
+ yield return Brush(() => Brushes.Honeydew, Color.Honeydew);
+ yield return Brush(() => Brushes.HotPink, Color.HotPink);
+ yield return Brush(() => Brushes.IndianRed, Color.IndianRed);
+ yield return Brush(() => Brushes.Indigo, Color.Indigo);
+ yield return Brush(() => Brushes.Ivory, Color.Ivory);
+ yield return Brush(() => Brushes.Khaki, Color.Khaki);
+ yield return Brush(() => Brushes.Lavender, Color.Lavender);
+ yield return Brush(() => Brushes.LavenderBlush, Color.LavenderBlush);
+ yield return Brush(() => Brushes.LawnGreen, Color.LawnGreen);
+ yield return Brush(() => Brushes.LemonChiffon, Color.LemonChiffon);
+ yield return Brush(() => Brushes.LightBlue, Color.LightBlue);
+ yield return Brush(() => Brushes.LightCoral, Color.LightCoral);
+ yield return Brush(() => Brushes.LightCyan, Color.LightCyan);
+ yield return Brush(() => Brushes.LightGoldenrodYellow, Color.LightGoldenrodYellow);
+ yield return Brush(() => Brushes.LightGray, Color.LightGray);
+ yield return Brush(() => Brushes.LightGreen, Color.LightGreen);
+ yield return Brush(() => Brushes.LightPink, Color.LightPink);
+ yield return Brush(() => Brushes.LightSalmon, Color.LightSalmon);
+ yield return Brush(() => Brushes.LightSeaGreen, Color.LightSeaGreen);
+ yield return Brush(() => Brushes.LightSkyBlue, Color.LightSkyBlue);
+ yield return Brush(() => Brushes.LightSlateGray, Color.LightSlateGray);
+ yield return Brush(() => Brushes.LightSteelBlue, Color.LightSteelBlue);
+ yield return Brush(() => Brushes.LightYellow, Color.LightYellow);
+ yield return Brush(() => Brushes.Lime, Color.Lime);
+ yield return Brush(() => Brushes.LimeGreen, Color.LimeGreen);
+ yield return Brush(() => Brushes.Linen, Color.Linen);
+ yield return Brush(() => Brushes.Magenta, Color.Magenta);
+ yield return Brush(() => Brushes.Maroon, Color.Maroon);
+ yield return Brush(() => Brushes.MediumAquamarine, Color.MediumAquamarine);
+ yield return Brush(() => Brushes.MediumBlue, Color.MediumBlue);
+ yield return Brush(() => Brushes.MediumOrchid, Color.MediumOrchid);
+ yield return Brush(() => Brushes.MediumPurple, Color.MediumPurple);
+ yield return Brush(() => Brushes.MediumSeaGreen, Color.MediumSeaGreen);
+ yield return Brush(() => Brushes.MediumSlateBlue, Color.MediumSlateBlue);
+ yield return Brush(() => Brushes.MediumSpringGreen, Color.MediumSpringGreen);
+ yield return Brush(() => Brushes.MediumTurquoise, Color.MediumTurquoise);
+ yield return Brush(() => Brushes.MediumVioletRed, Color.MediumVioletRed);
+ yield return Brush(() => Brushes.MidnightBlue, Color.MidnightBlue);
+ yield return Brush(() => Brushes.MintCream, Color.MintCream);
+ yield return Brush(() => Brushes.MistyRose, Color.MistyRose);
+ yield return Brush(() => Brushes.Moccasin, Color.Moccasin);
+ yield return Brush(() => Brushes.NavajoWhite, Color.NavajoWhite);
+ yield return Brush(() => Brushes.Navy, Color.Navy);
+ yield return Brush(() => Brushes.OldLace, Color.OldLace);
+ yield return Brush(() => Brushes.Olive, Color.Olive);
+ yield return Brush(() => Brushes.OliveDrab, Color.OliveDrab);
+ yield return Brush(() => Brushes.Orange, Color.Orange);
+ yield return Brush(() => Brushes.OrangeRed, Color.OrangeRed);
+ yield return Brush(() => Brushes.Orchid, Color.Orchid);
+ yield return Brush(() => Brushes.PaleGoldenrod, Color.PaleGoldenrod);
+ yield return Brush(() => Brushes.PaleGreen, Color.PaleGreen);
+ yield return Brush(() => Brushes.PaleTurquoise, Color.PaleTurquoise);
+ yield return Brush(() => Brushes.PaleVioletRed, Color.PaleVioletRed);
+ yield return Brush(() => Brushes.PapayaWhip, Color.PapayaWhip);
+ yield return Brush(() => Brushes.PeachPuff, Color.PeachPuff);
+ yield return Brush(() => Brushes.Peru, Color.Peru);
+ yield return Brush(() => Brushes.Pink, Color.Pink);
+ yield return Brush(() => Brushes.Plum, Color.Plum);
+ yield return Brush(() => Brushes.PowderBlue, Color.PowderBlue);
+ yield return Brush(() => Brushes.Purple, Color.Purple);
+ yield return Brush(() => Brushes.Red, Color.Red);
+ yield return Brush(() => Brushes.RosyBrown, Color.RosyBrown);
+ yield return Brush(() => Brushes.RoyalBlue, Color.RoyalBlue);
+ yield return Brush(() => Brushes.SaddleBrown, Color.SaddleBrown);
+ yield return Brush(() => Brushes.Salmon, Color.Salmon);
+ yield return Brush(() => Brushes.SandyBrown, Color.SandyBrown);
+ yield return Brush(() => Brushes.SeaGreen, Color.SeaGreen);
+ yield return Brush(() => Brushes.SeaShell, Color.SeaShell);
+ yield return Brush(() => Brushes.Sienna, Color.Sienna);
+ yield return Brush(() => Brushes.Silver, Color.Silver);
+ yield return Brush(() => Brushes.SkyBlue, Color.SkyBlue);
+ yield return Brush(() => Brushes.SlateBlue, Color.SlateBlue);
+ yield return Brush(() => Brushes.SlateGray, Color.SlateGray);
+ yield return Brush(() => Brushes.Snow, Color.Snow);
+ yield return Brush(() => Brushes.SpringGreen, Color.SpringGreen);
+ yield return Brush(() => Brushes.SteelBlue, Color.SteelBlue);
+ yield return Brush(() => Brushes.Tan, Color.Tan);
+ yield return Brush(() => Brushes.Teal, Color.Teal);
+ yield return Brush(() => Brushes.Thistle, Color.Thistle);
+ yield return Brush(() => Brushes.Tomato, Color.Tomato);
+ yield return Brush(() => Brushes.Transparent, Color.Transparent);
+ yield return Brush(() => Brushes.Turquoise, Color.Turquoise);
+ yield return Brush(() => Brushes.Violet, Color.Violet);
+ yield return Brush(() => Brushes.Wheat, Color.Wheat);
+ yield return Brush(() => Brushes.White, Color.White);
+ yield return Brush(() => Brushes.WhiteSmoke, Color.WhiteSmoke);
+ yield return Brush(() => Brushes.Yellow, Color.Yellow);
+ yield return Brush(() => Brushes.YellowGreen, Color.YellowGreen);
+ }
+
+ public static object[] Brush(Func<Brush> brushThunk, Color expectedColor) => new object[] { brushThunk, expectedColor };
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Brushes_TestData))]
+ public void Brushes_Get_ReturnsExpected(Func<Brush> brushThunk, Color expectedColor)
+ {
+ SolidBrush brush = Assert.IsType<SolidBrush>(brushThunk());
+ Assert.Equal(expectedColor, brush.Color);
+
+ Assert.Same(brush, brushThunk());
+
+ // Brushes are not immutable.
+ Color color = brush.Color;
+ try
+ {
+ brush.Color = Color.Red;
+ Assert.Equal(Color.Red, brush.Color);
+ }
+ finally
+ {
+ brush.Color = color;
+ }
+ }
+ }
+}
diff --git a/src/System.Drawing.Common/tests/ColorTranslatorTests.cs b/src/System.Drawing.Common/tests/ColorTranslatorTests.cs
new file mode 100644
index 0000000000..32d5968a47
--- /dev/null
+++ b/src/System.Drawing.Common/tests/ColorTranslatorTests.cs
@@ -0,0 +1,257 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Common.Tests;
+using System.Globalization;
+using System.Reflection;
+using System.Threading;
+using Xunit;
+
+namespace System.Drawing.Tests
+{
+ public class ColorTranslatorTests
+ {
+ public static IEnumerable<(int, Color)> SystemColors_TestData()
+ {
+ yield return (unchecked((int)0x8000000A), SystemColors.ActiveBorder);
+ yield return (unchecked((int)0x80000002), SystemColors.ActiveCaption);
+ yield return (unchecked((int)0x80000009), SystemColors.ActiveCaptionText);
+ yield return (unchecked((int)0x8000000C), SystemColors.AppWorkspace);
+ yield return (unchecked((int)0x8000000F), SystemColors.Control);
+ yield return (unchecked((int)0x80000010), SystemColors.ControlDark);
+ yield return (unchecked((int)0x80000015), SystemColors.ControlDarkDark);
+ yield return (unchecked((int)0x80000016), SystemColors.ControlLight);
+ yield return (unchecked((int)0x80000014), SystemColors.ControlLightLight);
+ yield return (unchecked((int)0x80000012), SystemColors.ControlText);
+ yield return (unchecked((int)0x80000001), SystemColors.Desktop);
+ yield return (unchecked((int)0x8000001B), SystemColors.GradientActiveCaption);
+ yield return (unchecked((int)0x8000001C), SystemColors.GradientInactiveCaption);
+ yield return (unchecked((int)0x80000011), SystemColors.GrayText);
+ yield return (unchecked((int)0x8000000D), SystemColors.Highlight);
+ yield return (unchecked((int)0x8000000E), SystemColors.HighlightText);
+ yield return (unchecked((int)0x8000001A), SystemColors.HotTrack);
+ yield return (unchecked((int)0x8000000B), SystemColors.InactiveBorder);
+ yield return (unchecked((int)0x80000003), SystemColors.InactiveCaption);
+ yield return (unchecked((int)0x80000013), SystemColors.InactiveCaptionText);
+ yield return (unchecked((int)0x80000018), SystemColors.Info);
+ yield return (unchecked((int)0x80000017), SystemColors.InfoText);
+ yield return (unchecked((int)0x80000004), SystemColors.Menu);
+ yield return (unchecked((int)0x8000001E), SystemColors.MenuBar);
+ yield return (unchecked((int)0x8000001D), SystemColors.MenuHighlight);
+ yield return (unchecked((int)0x80000007), SystemColors.MenuText);
+ yield return (unchecked((int)0x80000000), SystemColors.ScrollBar);
+ yield return (unchecked((int)0x80000005), SystemColors.Window);
+ yield return (unchecked((int)0x80000006), SystemColors.WindowFrame);
+ yield return (unchecked((int)0x80000008), SystemColors.WindowText);
+ }
+
+ public static IEnumerable<object[]> ToWin32Color_TestData()
+ {
+ yield return new object[] { new Color(), 0 };
+ yield return new object[] { Color.Red, 255 };
+ yield return new object[] { Color.White, 16777215 };
+ yield return new object[] { Color.FromArgb(1, 2, 3), 197121 };
+ }
+
+ [Theory]
+ [MemberData(nameof(ToWin32Color_TestData))]
+ public void ToWin32Color_Color_ReturnsExpected(Color color, int expected)
+ {
+ Assert.Equal(expected, ColorTranslator.ToWin32(color));
+ }
+
+ public static IEnumerable<object[]> FromOle_TestData()
+ {
+ yield return new object[] { int.MinValue, SystemColors.ScrollBar };
+ yield return new object[] { -1, Color.White };
+ yield return new object[] { 0, Color.Black };
+ yield return new object[] { 197121, Color.FromArgb(1, 2, 3) };
+ yield return new object[] { 16777215, Color.White };
+ yield return new object[] { int.MaxValue, Color.White };
+ yield return new object[] { unchecked((int)0x8000001F), Color.FromArgb(255, 31, 0, 0) };
+ yield return new object[] { unchecked((int)0x80000019), Color.FromArgb(255, 25, 0, 0) };
+
+ foreach ((int oleColor, Color color) in SystemColors_TestData())
+ {
+ yield return new object[] { oleColor, color };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(FromOle_TestData))]
+ public void FromOle_Color_ReturnsExpected(int oleColor, Color color)
+ {
+ Assert.Equal(color, ColorTranslator.FromOle(oleColor));
+ Assert.Equal(color, ColorTranslator.FromWin32(oleColor));
+ }
+
+ public static IEnumerable<object[]> ToOle_TestData()
+ {
+ yield return new object[] { new Color(), 0 };
+ yield return new object[] { Color.Red, 255 };
+ yield return new object[] { Color.White, 16777215 };
+ yield return new object[] { Color.FromArgb(1, 2, 3), 197121 };
+
+ foreach ((int oleColor, Color color) in SystemColors_TestData())
+ {
+ yield return new object[] { color, oleColor };
+ }
+
+
+ // These system colors are equivilent to Control, ControlLight and ControlDark.
+ yield return new object[] { SystemColors.ButtonFace, unchecked((int)0x8000000F) };
+ yield return new object[] { SystemColors.ButtonHighlight, unchecked((int)0x80000014) };
+ yield return new object[] { SystemColors.ButtonShadow, unchecked((int)0x80000010) };
+ }
+
+ [Theory]
+ [MemberData(nameof(ToOle_TestData))]
+ public void ToOle_Color_ReturnsExpected(Color color, int oleColor)
+ {
+ Assert.Equal(oleColor, ColorTranslator.ToOle(color));
+ }
+
+ public static IEnumerable<(string, Color)> HtmlColors_TestData()
+ {
+ yield return ("activeborder", SystemColors.ActiveBorder);
+ yield return ("activecaption", SystemColors.ActiveCaption);
+ yield return ("appworkspace", SystemColors.AppWorkspace);
+ yield return ("background", SystemColors.Desktop);
+ yield return ("buttonface", SystemColors.Control);
+ yield return ("buttonhighlight", SystemColors.ControlLightLight);
+ yield return ("buttonshadow", SystemColors.ControlDark);
+ yield return ("buttontext", SystemColors.ControlText);
+ yield return ("captiontext", SystemColors.ActiveCaptionText);
+ yield return ("graytext", SystemColors.GrayText);
+ yield return ("highlight", SystemColors.Highlight);
+ yield return ("highlighttext", SystemColors.HighlightText);
+ yield return ("inactiveborder", SystemColors.InactiveBorder);
+ yield return ("inactivecaption", SystemColors.InactiveCaption);
+ yield return ("inactivecaptiontext", SystemColors.InactiveCaptionText);
+ yield return ("infobackground", SystemColors.Info);
+ yield return ("infotext", SystemColors.InfoText);
+ yield return ("menu", SystemColors.Menu);
+ yield return ("menutext", SystemColors.MenuText);
+ yield return ("scrollbar", SystemColors.ScrollBar);
+ yield return ("window", SystemColors.Window);
+ yield return ("windowframe", SystemColors.WindowFrame);
+ yield return ("windowtext", SystemColors.WindowText);
+ yield return ("threeddarkshadow", SystemColors.ControlDarkDark);
+
+ yield return ("LightGrey", Color.LightGray);
+ yield return ("Blue", Color.Blue);
+ yield return ("#1F2E3D", Color.FromArgb(31, 46, 61));
+ }
+
+ public static IEnumerable<object[]> FromHtml_TestData()
+ {
+ yield return new object[] { null, Color.Empty };
+ yield return new object[] { "", Color.Empty };
+ yield return new object[] { " ", Color.Empty };
+ yield return new object[] { "''", Color.FromName("") };
+ yield return new object[] { "\"\"", Color.FromName("") };
+
+ yield return new object[] { "#1B3", Color.FromArgb(17, 187, 51) };
+ yield return new object[] { " #1F2E3D ", Color.FromArgb(31, 46, 61) };
+
+ yield return new object[] { "ActiveBorder", SystemColors.ActiveBorder };
+ yield return new object[] { "ACTIVEBORDER", SystemColors.ActiveBorder };
+ yield return new object[] { " Blue ", Color.Blue };
+ yield return new object[] { "'Blue'", Color.Blue };
+ yield return new object[] { "\"Blue\"", Color.Blue };
+ yield return new object[] { "'None'", Color.FromName("None") };
+ yield return new object[] { "\"None\"", Color.FromName("None") };
+ yield return new object[] { "255,0,0", Color.Red };
+
+ // Color(argb)
+ yield return new object[] { 498, Color.FromArgb(0, 0, 1, 242) };
+ yield return new object[] { "&h1F2", Color.FromArgb(0, 0, 1, 242) };
+ yield return new object[] { "&h1F2", Color.FromArgb(0, 0, 1, 242) };
+
+ // Color(red, green, blue)
+ yield return new object[] { "1, 0x2, &h3", Color.FromArgb(1, 2, 3) };
+
+ // Color(alpha, red, green, blue)
+ yield return new object[] { "1, 2, 0x3, &h4", Color.FromArgb(1, 2, 3, 4) };
+
+ foreach ((string htmlColor, Color color) in HtmlColors_TestData())
+ {
+ yield return new object[] { htmlColor, color };
+ }
+
+ // Some of the SystemColors.Control colors don't roundtrip.
+ yield return new object[] { "threedface", SystemColors.Control };
+ yield return new object[] { "threedhighlight", SystemColors.ControlLight };
+ yield return new object[] { "threedlightshadow", SystemColors.ControlLightLight };
+ }
+
+ [Theory]
+ [MemberData(nameof(FromHtml_TestData))]
+ public void FromHtml_String_ReturnsExpected(string htmlColor, Color expected)
+ {
+ using (new ThreadCultureChange(CultureInfo.InvariantCulture))
+ {
+ Assert.Equal(expected, ColorTranslator.FromHtml(htmlColor));
+ }
+ }
+
+ [Theory]
+ [InlineData("'", typeof(Exception))]
+ [InlineData("'\"", typeof(Exception))]
+ [InlineData("\"'", typeof(Exception))]
+ [InlineData("#", typeof(Exception))]
+ [InlineData("#G12", typeof(FormatException))]
+ [InlineData("#G12345", typeof(FormatException))]
+ [InlineData(" #G12 ", typeof(Exception))]
+ [InlineData(" #G12345 ", typeof(Exception))]
+ [InlineData("#FFFFFFFFF", typeof(Exception))]
+ [InlineData("0x", typeof(Exception))]
+ [InlineData("0xFFFFFFFFF", typeof(Exception))]
+ [InlineData("0xG12", typeof(Exception))]
+ [InlineData("&h", typeof(Exception))]
+ [InlineData("&hG12", typeof(Exception))]
+ [InlineData("1,2", typeof(ArgumentException))]
+ [InlineData("1,2,3,4,5", typeof(ArgumentException))]
+ [InlineData("-1,2,3", typeof(ArgumentException))]
+ [InlineData("256,2,3", typeof(ArgumentException))]
+ [InlineData("1,-1,3", typeof(ArgumentException))]
+ [InlineData("1,256,3", typeof(ArgumentException))]
+ [InlineData("1,2,-1", typeof(ArgumentException))]
+ [InlineData("1,2,256", typeof(ArgumentException))]
+ public void FromHtml_Invalid_Throws(string htmlColor, Type exception)
+ {
+ using (new ThreadCultureChange(CultureInfo.InvariantCulture))
+ {
+ Assert.Throws(exception, () => ColorTranslator.FromHtml(htmlColor));
+ }
+ }
+
+ public static IEnumerable<object[]> ToHtml_TestData()
+ {
+ yield return new object[] { Color.Empty, "" };
+
+ foreach ((string htmlColor, Color color) in HtmlColors_TestData())
+ {
+ yield return new object[] { color, htmlColor };
+ }
+
+ // SystemColors.ControlLight don't roundtrip.
+ yield return new object[] { SystemColors.ControlLight, "buttonface" };
+ yield return new object[] { SystemColors.GradientActiveCaption, "activecaption" };
+ yield return new object[] { SystemColors.HotTrack, "highlight" };
+ yield return new object[] { SystemColors.MenuHighlight, "highlighttext" };
+ yield return new object[] { SystemColors.GradientInactiveCaption, "inactivecaption" };
+ yield return new object[] { SystemColors.MenuBar, "menu" };
+ yield return new object[] { SystemColors.ButtonShadow, "" };
+ }
+
+ [Theory]
+ [MemberData(nameof(ToHtml_TestData))]
+ public void ToHtml_Color_ReturnsExpected(Color color, string expected)
+ {
+ Assert.Equal(expected, ColorTranslator.ToHtml(color));
+ }
+ }
+}
diff --git a/src/System.Drawing.Common/tests/Drawing2D/MatrixTests.cs b/src/System.Drawing.Common/tests/Drawing2D/MatrixTests.cs
new file mode 100644
index 0000000000..1619edf0b2
--- /dev/null
+++ b/src/System.Drawing.Common/tests/Drawing2D/MatrixTests.cs
@@ -0,0 +1,790 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// See the LICENSE file in the project root for more information.
+//
+// Copyright (C) 2005-2006 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace System.Drawing.Drawing2D.Tests
+{
+ public class MatrixTests
+ {
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_Default()
+ {
+ var matrix = new Matrix();
+ Assert.Equal(new float[] { 1, 0, 0, 1, 0, 0 }, matrix.Elements);
+ Assert.True(matrix.IsIdentity);
+ Assert.True(matrix.IsInvertible);
+ Assert.Equal(0, matrix.OffsetX);
+ Assert.Equal(0, matrix.OffsetY);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(float.NaN)]
+ [InlineData(float.NegativeInfinity)]
+ [InlineData(float.PositiveInfinity)]
+ public void Ctor_FloatingPointBoundsInElements(float f)
+ {
+ Ctor_Elements(f, 0, 0, 1, 0, 0, false, false);
+ Ctor_Elements(1, f, 0, 1, 0, 0, false, false);
+ Ctor_Elements(1, 0, f, 1, 0, 0, false, false);
+ Ctor_Elements(1, 0, 0, f, 0, 0, false, false);
+ Ctor_Elements(1, 0, 0, 1, f, 0, false, false);
+ Ctor_Elements(1, 0, 0, 1, 0, f, false, false);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(1, 0, 0, 1, 0, 0, true, true)]
+ [InlineData(0, 1, 2, 1, 3, 4, false, true)]
+ [InlineData(0, 0, 0, 0, 0, 0, false, false)]
+ [InlineData(1, 2, 3, 4, 5, 6, false, true)]
+ [InlineData(-1, -2, -3, -4, -5, -6, false, true)]
+ [InlineData(123, 24, 82, 16, 47, 30, false, false)]
+ [InlineData(156, 46, 0, 0, 106, 19, false, false)]
+ [InlineData(146, 66, 158, 104, 42, 150, false, true)]
+ [InlineData(119, 140, 145, 74, 102, 58, false, true)]
+ [InlineData(1.1f, 0.1f, -0.1f, 0.9f, 0, 0, false, true)]
+ [InlineData(1.01f, 0.01f, -0.01f, 0.99f, 0, 0, false, true)]
+ [InlineData(1.001f, 0.001f, -0.001f, 0.999f, 0, 0, false, true)]
+ [InlineData(1.0001f, 0.0001f, -0.0001f, 0.9999f, 0, 0, true, true)]
+ [InlineData(1.0009f, 0.0009f, -0.0009f, 0.99995f, 0, 0, false, true)]
+ public void Ctor_Elements(float m11, float m12, float m21, float m22, float dx, float dy, bool isIdentity, bool isInvertible)
+ {
+ var matrix = new Matrix(m11, m12, m21, m22, dx, dy);
+ Assert.Equal(new float[] { m11, m12, m21, m22, dx, dy }, matrix.Elements);
+ Assert.Equal(isIdentity, matrix.IsIdentity);
+ Assert.Equal(isInvertible, matrix.IsInvertible);
+ Assert.Equal(dx, matrix.OffsetX);
+ Assert.Equal(dy, matrix.OffsetY);
+ }
+
+ public static IEnumerable<object[]> Ctor_Rectangle_Points_TestData()
+ {
+ yield return new object[] { new Rectangle(1, 4, 8, 16), new Point[] { new Point(32, 64), new Point(128, 256), new Point(512, 1024) }, new float[] { 12, 24, 30, 60, -100, -200 }, false, false };
+ yield return new object[] { new Rectangle(0, 0, 2, 4), new Point[] { new Point(8, 16), new Point(32, 64), new Point(128, 256) }, new float[] { 12, 24, 30, 60, 8, 16 }, false, false };
+ yield return new object[] { new Rectangle(0, 0, 1, 1), new Point[] { new Point(0, 0), new Point(0, 0), new Point(0, 0) }, new float[] { 0, 0, 0, 0, 0, 0 }, false, false };
+ yield return new object[] { new Rectangle(0, 0, 1, 1), new Point[] { new Point(0, 0), new Point(1, 0), new Point(0, 1) }, new float[] { 1, 0, 0, 1, 0, 0 }, true, true };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Ctor_Rectangle_Points_TestData))]
+ public void Ctor_Rectangle_Points(Rectangle rect, Point[] plgpnts, float[] expectedElements, bool isIdentity, bool isInvertible)
+ {
+ var matrix = new Matrix(rect, plgpnts);
+ Assert.Equal(expectedElements, matrix.Elements);
+ Assert.Equal(isIdentity, matrix.IsIdentity);
+ Assert.Equal(isInvertible, matrix.IsInvertible);
+ Assert.Equal(expectedElements[4], matrix.OffsetX);
+ Assert.Equal(expectedElements[5], matrix.OffsetY);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Ctor_Rectangle_Points_TestData))]
+ public void Ctor_RectangleF_Points(Rectangle rect, Point[] plgpnts, float[] expectedElements, bool isIdentity, bool isInvertible)
+ {
+ var matrix = new Matrix(rect, plgpnts.Select(p => (PointF)p).ToArray());
+ Assert.Equal(expectedElements, matrix.Elements);
+ Assert.Equal(isIdentity, matrix.IsIdentity);
+ Assert.Equal(isInvertible, matrix.IsInvertible);
+ Assert.Equal(expectedElements[4], matrix.OffsetX);
+ Assert.Equal(expectedElements[5], matrix.OffsetY);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_NullPoints_ThrowsArgumentNullException()
+ {
+ Assert.Throws<ArgumentNullException>("plgpts", () => new Matrix(new RectangleF(), null));
+ Assert.Throws<ArgumentNullException>("plgpts", () => new Matrix(new Rectangle(), null));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(0)]
+ [InlineData(2)]
+ [InlineData(4)]
+ public void Ctor_PointsLengthNotThree_ThrowsArgumentNullException(int length)
+ {
+ Assert.Throws<ArgumentException>(null, () => new Matrix(new RectangleF(), new PointF[length]));
+ Assert.Throws<ArgumentException>(null, () => new Matrix(new Rectangle(), new Point[length]));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_WidthZero_ThrowsOutOfMemoryException()
+ {
+ Assert.Throws<OutOfMemoryException>(() => new Matrix(new Rectangle(1, 1, 0, 1), new Point[3]));
+ Assert.Throws<OutOfMemoryException>(() => new Matrix(new RectangleF(1, 1, 0, 1), new PointF[3]));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_HeightZero_ThrowsOutOfMemoryException()
+ {
+ Assert.Throws<OutOfMemoryException>(() => new Matrix(new Rectangle(1, 1, 1, 0), new Point[3]));
+ Assert.Throws<OutOfMemoryException>(() => new Matrix(new RectangleF(1, 1, 1, 0), new PointF[3]));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Clone_Matrix_ReturnsExpected()
+ {
+ var matrix = new Matrix(1, 2, 3, 4, 5, 6);
+ Matrix clone = Assert.IsType<Matrix>(matrix.Clone());
+ Assert.NotSame(matrix, clone);
+ Assert.Equal(new float[] { 1, 2, 3, 4, 5, 6 }, clone.Elements);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Clone_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Clone());
+ }
+
+ public static IEnumerable<object[]> Equals_TestData()
+ {
+ yield return new object[] { new Matrix(), new Matrix(1, 0, 0, 1, 0, 0), true };
+ yield return new object[] { new Matrix(), new Matrix(123, 24, 82, 16, 47, 30), false };
+ yield return new object[] { new Matrix(), new Matrix(1.1f, 0.1f, -0.1f, 0.9f, 0, 0), false };
+ yield return new object[] { new Matrix(), new Matrix(1.01f, 0.01f, -0.01f, 0.99f, 0, 0), false };
+ yield return new object[] { new Matrix(), new Matrix(1.001f, 0.001f, -0.001f, 0.999f, 0, 0), false };
+ yield return new object[] { new Matrix(), new Matrix(1.0001f, 0.0001f, -0.0001f, 0.9999f, 0, 0), false };
+ yield return new object[] { new Matrix(), new Matrix(1.0009f, 0.0009f, -0.0009f, 0.99995f, 0, 0), false };
+
+ var matrix = new Matrix(1, 2, 3, 4, 5, 6);
+ yield return new object[] { matrix, matrix, true };
+ yield return new object[] { matrix, matrix.Clone(), true };
+ yield return new object[] { matrix, new Matrix(1, 2, 3, 4, 5, 6), true };
+ yield return new object[] { matrix, new Matrix(2, 2, 3, 4, 5, 6), false };
+ yield return new object[] { matrix, new Matrix(1, 3, 3, 4, 5, 6), false };
+ yield return new object[] { matrix, new Matrix(1, 2, 4, 4, 5, 6), false };
+ yield return new object[] { matrix, new Matrix(1, 2, 3, 5, 5, 6), false };
+ yield return new object[] { matrix, new Matrix(1, 2, 3, 4, 6, 6), false };
+ yield return new object[] { matrix, new Matrix(1, 2, 3, 4, 5, 7), false };
+
+ yield return new object[] { new Matrix(), null, false };
+ yield return new object[] { new Matrix(), new object(), false };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Equals_TestData))]
+ public void Equals_Other_ReturnsExpected(Matrix matrix, object other, bool expected)
+ {
+ Assert.Equal(expected, matrix.Equals(other));
+ if (other is Matrix otherMatrix)
+ {
+ Assert.Equal(object.ReferenceEquals(matrix, other), matrix.GetHashCode().Equals(other.GetHashCode()));
+ }
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Equals_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Equals(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Equals_DisposedOther_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Matrix().Equals(matrix));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Elements_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Elements);
+ }
+
+ public static IEnumerable<object[]> Invert_TestData()
+ {
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), new float[] { -2, 1, 1.5f, -0.5f, 1, -2 } };
+ yield return new object[] { new Matrix(1, 0, 0, 1, 8, 8), new float[] { 1, 0, 0, 1, -8, -8 } };
+ yield return new object[] { new Matrix(), new float[] { 1, 0, 0, 1, 0, 0 } };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Invert_TestData))]
+ public void Invert_Matrix_Success(Matrix matrix, float[] expectedElements)
+ {
+ matrix.Invert();
+ Assert.Equal(expectedElements, matrix.Elements);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(float.NaN)]
+ [InlineData(float.PositiveInfinity)]
+ [InlineData(float.NegativeInfinity)]
+ public void Invert_FloatBounds_ThrowsArgumentException(float f)
+ {
+ Assert.Throws<ArgumentException>(null, () => new Matrix(f, 2, 3, 4, 5, 6).Invert());
+ Assert.Throws<ArgumentException>(null, () => new Matrix(1, f, 3, 4, 5, 6).Invert());
+ Assert.Throws<ArgumentException>(null, () => new Matrix(1, 2, f, 4, 5, 6).Invert());
+ Assert.Throws<ArgumentException>(null, () => new Matrix(1, 2, 3, f, 5, 6).Invert());
+ Assert.Throws<ArgumentException>(null, () => new Matrix(1, 2, 3, 4, f, 6).Invert());
+ Assert.Throws<ArgumentException>(null, () => new Matrix(1, 2, 3, 4, 5, f).Invert());
+
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Invert_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Invert());
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void IsIdentity_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.IsIdentity);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void IsInvertible_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.IsInvertible);
+ }
+
+ public static IEnumerable<object[]> Multiply_TestData()
+ {
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(10, 20, 30, 40, 50, 60), MatrixOrder.Prepend, new float[] { 700, 1000, 1500, 2200, 2350, 3460 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(10, 20, 30, 40, 50, 60), MatrixOrder.Append, new float[] { 700, 1000, 1500, 2200, 2350, 3460 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(), MatrixOrder.Prepend, new float[] { 10, 20, 30, 40, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(), MatrixOrder.Append, new float[] { 10, 20, 30, 40, 50, 60 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(0, 0, 0, 0, 0, 0), MatrixOrder.Prepend, new float[] { 0, 0, 0, 0, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(0, 0, 0, 0, 0, 0), MatrixOrder.Append, new float[] { 0, 0, 0, 0, 0, 0 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(1, 1, 1, 1, 1, 1), MatrixOrder.Prepend, new float[] { 40, 60, 40, 60, 90, 120 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(1, 1, 1, 1, 1, 1), MatrixOrder.Append, new float[] { 30, 30, 70, 70, 111, 111 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN), MatrixOrder.Prepend, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN), MatrixOrder.Append, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity), MatrixOrder.Prepend, new float[] { float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity), MatrixOrder.Append, new float[] { float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity), MatrixOrder.Prepend, new float[] { float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity), MatrixOrder.Append, new float[] { float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue), MatrixOrder.Prepend, new float[] { float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), new Matrix(float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue), MatrixOrder.Append, new float[] { float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue } };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Multiply_TestData))]
+ public void Multiply_Matrix_Success(Matrix matrix, Matrix multiple, MatrixOrder order, float[] expected)
+ {
+ if (order == MatrixOrder.Prepend)
+ {
+ Matrix clone1 = matrix.Clone();
+ clone1.Multiply(multiple);
+ Assert.Equal(expected, clone1.Elements);
+ }
+ matrix.Multiply(multiple, order);
+ Assert.Equal(expected, matrix.Elements);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Multiply_NullMatrix_ThrowsArgumentNullException()
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentNullException>("matrix", () => matrix.Multiply(null));
+ Assert.Throws<ArgumentNullException>("matrix", () => matrix.Multiply(null, MatrixOrder.Prepend));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(MatrixOrder.Prepend - 1)]
+ [InlineData(MatrixOrder.Append + 1)]
+ public void Multiply_InvalidMatrixOrder_ThrowsArgumentException(MatrixOrder order)
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.Multiply(new Matrix(), order));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Multiply_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Multiply(new Matrix()));
+ Assert.Throws<ArgumentException>(null, () => matrix.Multiply(new Matrix(), MatrixOrder.Prepend));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Multiply_DisposedMatrix_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Matrix().Multiply(matrix));
+ Assert.Throws<ArgumentException>(null, () => new Matrix().Multiply(matrix, MatrixOrder.Prepend));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Reset_Matrix_ReturnsExpected()
+ {
+ var matrix = new Matrix(1, 2, 3, 4, 5, 6);
+ matrix.Reset();
+ Assert.Equal(new float[] { 1, 0, 0, 1, 0, 0 }, matrix.Elements);
+
+ matrix.Reset();
+ Assert.Equal(new float[] { 1, 0, 0, 1, 0, 0 }, matrix.Elements);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Reset_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Reset());
+ }
+
+ public static IEnumerable<object[]> Rotate_TestData()
+ {
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 180, PointF.Empty, MatrixOrder.Prepend, new float[] { -9.999996f, -19.9999943f, -30.0000019f, -40.0000038f, 50, 60 }, null, false };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 180, PointF.Empty, MatrixOrder.Append, new float[] { -9.999996f, -20, -30f, -40f, -50, -60 }, null, false };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 540, PointF.Empty, MatrixOrder.Prepend, new float[] { -9.999996f, -19.9999943f, -30.0000019f, -40.0000038f, 50, 60 }, null, false };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 540, PointF.Empty, MatrixOrder.Append, new float[] { -9.999996f, -20, -30f, -40f, -50, -60 }, null, false };
+
+ yield return new object[] { new Matrix(), 45, PointF.Empty, MatrixOrder.Prepend, new float[] { 0.707106769f, 0.707106769f, -0.707106829f, 0.707106769f, 0, 0 }, null, false };
+ yield return new object[] { new Matrix(), 45, PointF.Empty, MatrixOrder.Append, new float[] { 0.707106769f, 0.707106769f, -0.707106829f, 0.707106769f, 0, 0 }, null, false };
+
+ var rotated45 = new Matrix();
+ rotated45.Rotate(45);
+ yield return new object[] { rotated45, 135, PointF.Empty, MatrixOrder.Prepend, new float[] { -1, 0, 0, -1, 0, 0 }, null, false };
+ yield return new object[] { rotated45, 135, PointF.Empty, MatrixOrder.Append, new float[] { -1, 0, 0, -1, 0, 0 }, null, false };
+
+ yield return new object[] { new Matrix(), 90, PointF.Empty, MatrixOrder.Prepend, new float[] { 0, 1, -1, 0, 0, 0 }, null, false };
+ yield return new object[] { new Matrix(), 90, PointF.Empty, MatrixOrder.Append, new float[] { 0, 1, -1, 0, 0, 0 }, null, false };
+
+ var rotated90 = new Matrix();
+ rotated90.Rotate(90);
+ yield return new object[] { rotated90, 270, PointF.Empty, MatrixOrder.Prepend, new float[] { 1, 0, 0, 1, 0, 0 }, null, true };
+ yield return new object[] { rotated90, 270, PointF.Empty, MatrixOrder.Append, new float[] { 1, 0, 0, 1, 0, 0 }, null, true };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 180, new PointF(10, 10), MatrixOrder.Prepend, new float[] { -10, -20, -30, -40, 850, 1260 }, null, false };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 180, new PointF(10, 10), MatrixOrder.Append, new float[] { -10, -20, -30, -40, -30, -40 }, null, false };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NaN, PointF.Empty, MatrixOrder.Prepend, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, 50, 60 }, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN }, false };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NaN, PointF.Empty, MatrixOrder.Append, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN }, null, false };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.PositiveInfinity, PointF.Empty, MatrixOrder.Prepend, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, 50, 60 }, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN }, false };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.PositiveInfinity, PointF.Empty, MatrixOrder.Append, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN }, null, false };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NegativeInfinity, PointF.Empty, MatrixOrder.Prepend, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, 50, 60 }, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN }, false };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NegativeInfinity, PointF.Empty, MatrixOrder.Append, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN }, null, false };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Rotate_TestData))]
+ public void Rotate_Matrix_Success(Matrix matrix, float angle, PointF point, MatrixOrder order, float[] expectedElements, float[] expectedElementsRotateAt, bool isIdentity)
+ {
+ if (order == MatrixOrder.Prepend)
+ {
+ if (point == Point.Empty)
+ {
+ Matrix clone1 = matrix.Clone();
+ clone1.Rotate(angle);
+ AssertEqualFloatArray(expectedElements, clone1.Elements);
+ Assert.Equal(isIdentity, clone1.IsIdentity);
+ }
+
+ Matrix clone2 = matrix.Clone();
+ clone2.RotateAt(angle, point);
+ AssertEqualFloatArray(expectedElementsRotateAt ?? expectedElements, clone2.Elements);
+ Assert.False(clone2.IsIdentity);
+ }
+
+ if (point == Point.Empty)
+ {
+ Matrix clone3 = matrix.Clone();
+ clone3.Rotate(angle, order);
+ AssertEqualFloatArray(expectedElements, clone3.Elements);
+ Assert.Equal(isIdentity, clone3.IsIdentity);
+ }
+
+ Matrix clone4 = matrix.Clone();
+ clone4.RotateAt(angle, point, order);
+ AssertEqualFloatArray(expectedElementsRotateAt ?? expectedElements, clone4.Elements);
+ Assert.False(clone4.IsIdentity);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Rotate_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Rotate(1, MatrixOrder.Append));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(MatrixOrder.Prepend - 1)]
+ [InlineData(MatrixOrder.Append + 1)]
+ public void Rotate_InvalidMatrixOrder_ThrowsArgumentException(MatrixOrder order)
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.Rotate(1, order));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void RotateAt_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.RotateAt(1, PointF.Empty));
+ Assert.Throws<ArgumentException>(null, () => matrix.RotateAt(1, PointF.Empty, MatrixOrder.Append));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(MatrixOrder.Prepend - 1)]
+ [InlineData(MatrixOrder.Append + 1)]
+ public void RotateAt_InvalidMatrixOrder_ThrowsArgumentException(MatrixOrder order)
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.RotateAt(1, PointF.Empty, order));
+ }
+
+ public static IEnumerable<object[]> Scale_TestData()
+ {
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 2, 4, MatrixOrder.Prepend, new float[] { 20, 40, 120, 160, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 2, 4, MatrixOrder.Append, new float[] { 20, 80, 60, 160, 100, 240 } };
+
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 0.5, 0.25, MatrixOrder.Prepend, new float[] { 10, 20, 30, 40, 50, 60 } };
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 0.5, 0.25, MatrixOrder.Append, new float[] { 10, 10, 60, 40, 25, 15 } };
+
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 0, 0, MatrixOrder.Prepend, new float[] { 0, 0, 0, 0, 50, 60 } };
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 0, 0, MatrixOrder.Append, new float[] { 0, 0, 0, 0, 0, 0 } };
+
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 1, 1, MatrixOrder.Prepend, new float[] { 20, 40, 120, 160, 50, 60 } };
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 1, 1, MatrixOrder.Append, new float[] { 20, 40, 120, 160, 50, 60 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), -2, -4, MatrixOrder.Prepend, new float[] { -20, -40, -120, -160, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), -2, -4, MatrixOrder.Append, new float[] { -20, -80, -60, -160, -100, -240 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NaN, float.NaN, MatrixOrder.Prepend, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NaN, float.NaN, MatrixOrder.Append, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.PositiveInfinity, float.PositiveInfinity, MatrixOrder.Prepend, new float[] { float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.PositiveInfinity, float.PositiveInfinity, MatrixOrder.Append, new float[] { float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NegativeInfinity, float.NegativeInfinity, MatrixOrder.Prepend, new float[] { float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NegativeInfinity, float.NegativeInfinity, MatrixOrder.Append, new float[] { float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.MaxValue, float.MaxValue, MatrixOrder.Prepend, new float[] { float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.MaxValue, float.MaxValue, MatrixOrder.Append, new float[] { float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue } };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Scale_TestData))]
+ public void Scale_Matrix_Succss(Matrix matrix, float scaleX, float scaleY, MatrixOrder order, float[] expectedElements)
+ {
+ if (order == MatrixOrder.Prepend)
+ {
+ Matrix clone = matrix.Clone();
+ clone.Scale(scaleX, scaleY);
+ Assert.Equal(expectedElements, clone.Elements);
+ }
+
+ matrix.Scale(scaleX, scaleY, order);
+ Assert.Equal(expectedElements, matrix.Elements);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(MatrixOrder.Prepend - 1)]
+ [InlineData(MatrixOrder.Append + 1)]
+ public void Scale_InvalidMatrixOrder_ThrowsArgumentException(MatrixOrder order)
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.Shear(1, 2, order));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Scale_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Scale(1, 2));
+ Assert.Throws<ArgumentException>(null, () => matrix.Scale(1, 2, MatrixOrder.Append));
+ }
+
+ public static IEnumerable<object[]> Shear_TestData()
+ {
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 2, 4, MatrixOrder.Prepend, new float[] { 130, 180, 50, 80, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), 2, 4, MatrixOrder.Append, new float[] { 50, 60, 110, 160, 170, 260 } };
+
+ yield return new object[] { new Matrix(5, 3, 9, 2, 2, 1), 10, 20, MatrixOrder.Prepend, new float[] { 185, 43, 59, 32, 2, 1 } };
+ yield return new object[] { new Matrix(5, 3, 9, 2, 2, 1), 10, 20, MatrixOrder.Append, new float[] { 35, 103, 29, 182, 12, 41 } };
+
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 0, 0, MatrixOrder.Prepend, new float[] { 20, 40, 120, 160, 50, 60 } };
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 0, 0, MatrixOrder.Append, new float[] { 20, 40, 120, 160, 50, 60 } };
+
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 1, 1, MatrixOrder.Prepend, new float[] { 140, 200, 140, 200, 50, 60 } };
+ yield return new object[] { new Matrix(20, 40, 120, 160, 50, 60), 1, 1, MatrixOrder.Append, new float[] { 60, 60, 280, 280, 110, 110 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), -2, -4, MatrixOrder.Prepend, new float[] { -110, -140, 10, 0, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), -2, -4, MatrixOrder.Append, new float[] { -30, -20, -50, -80, -70, -140 } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NaN, float.NaN, MatrixOrder.Prepend, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NaN, float.NaN, MatrixOrder.Append, new float[] { float.NaN, float.NaN, float.NaN, float.NaN, float.NaN, float.NaN } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.PositiveInfinity, float.PositiveInfinity, MatrixOrder.Prepend, new float[] { float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.PositiveInfinity, float.PositiveInfinity, MatrixOrder.Append, new float[] { float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NegativeInfinity, float.NegativeInfinity, MatrixOrder.Prepend, new float[] { float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.NegativeInfinity, float.NegativeInfinity, MatrixOrder.Append, new float[] { float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity } };
+
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.MaxValue, float.MaxValue, MatrixOrder.Prepend, new float[] { float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, 50, 60 } };
+ yield return new object[] { new Matrix(10, 20, 30, 40, 50, 60), float.MaxValue, float.MaxValue, MatrixOrder.Append, new float[] { float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue } };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Shear_TestData))]
+ public void Shear_Matrix_Succss(Matrix matrix, float shearX, float shearY, MatrixOrder order, float[] expectedElements)
+ {
+ if (order == MatrixOrder.Prepend)
+ {
+ Matrix clone = matrix.Clone();
+ clone.Shear(shearX, shearY);
+ Assert.Equal(expectedElements, clone.Elements);
+ }
+
+ matrix.Shear(shearX, shearY, order);
+ Assert.Equal(expectedElements, matrix.Elements);
+ }
+
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(MatrixOrder.Prepend - 1)]
+ [InlineData(MatrixOrder.Append + 1)]
+ public void Shear_InvalidMatrixOrder_ThrowsArgumentException(MatrixOrder order)
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.Shear(1, 2, order));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Shear_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Shear(1, 2));
+ Assert.Throws<ArgumentException>(null, () => matrix.Shear(1, 2, MatrixOrder.Append));
+ }
+
+ public static IEnumerable<object[]> Translate_TestData()
+ {
+ yield return new object[] { new Matrix(2, 4, 6, 8, 10, 12), 5, 10, MatrixOrder.Prepend, new float[] { 2, 4, 6, 8, 80, 112 } };
+ yield return new object[] { new Matrix(2, 4, 6, 8, 10, 12), 5, 10, MatrixOrder.Append, new float[] { 2, 4, 6, 8, 15, 22 } };
+
+ yield return new object[] { new Matrix(), 5, 10, MatrixOrder.Prepend, new float[] { 1, 0, 0, 1, 5, 10 } };
+ yield return new object[] { new Matrix(), 5, 10, MatrixOrder.Append, new float[] { 1, 0, 0, 1, 5, 10 } };
+
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.NaN, float.NaN, MatrixOrder.Prepend, new float[] { 1, 2, 3, 4, float.NaN, float.NaN } };
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.NaN, float.NaN, MatrixOrder.Append, new float[] { 1, 2, 3, 4, float.NaN, float.NaN } };
+
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.PositiveInfinity, float.PositiveInfinity, MatrixOrder.Prepend, new float[] { 1, 2, 3, 4, float.PositiveInfinity, float.PositiveInfinity } };
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.PositiveInfinity, float.PositiveInfinity, MatrixOrder.Append, new float[] { 1, 2, 3, 4, float.PositiveInfinity, float.PositiveInfinity } };
+
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.NegativeInfinity, float.NegativeInfinity, MatrixOrder.Prepend, new float[] { 1, 2, 3, 4, float.NegativeInfinity, float.NegativeInfinity } };
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.NegativeInfinity, float.NegativeInfinity, MatrixOrder.Append, new float[] { 1, 2, 3, 4, float.NegativeInfinity, float.NegativeInfinity } };
+
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.MaxValue, float.MaxValue, MatrixOrder.Prepend, new float[] { 1, 2, 3, 4, float.MaxValue, float.MaxValue } };
+ yield return new object[] { new Matrix(1, 2, 3, 4, 5, 6), float.MaxValue, float.MaxValue, MatrixOrder.Append, new float[] { 1, 2, 3, 4, float.MaxValue, float.MaxValue } };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Translate_TestData))]
+ public void Translate_Matrix_Success(Matrix matrix, float offsetX, float offsetY, MatrixOrder order, float[] expectedElements)
+ {
+ if (order == MatrixOrder.Prepend)
+ {
+ Matrix clone = matrix.Clone();
+ clone.Translate(offsetX, offsetY);
+ AssertEqualFloatArray(expectedElements, clone.Elements);
+ }
+
+ matrix.Translate(offsetX, offsetY, order);
+ AssertEqualFloatArray(expectedElements, matrix.Elements);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(MatrixOrder.Prepend - 1)]
+ [InlineData(MatrixOrder.Append + 1)]
+ public void Translate_InvalidMatrixOrder_ThrowsArgumentException(MatrixOrder order)
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.Translate(1, 2, order));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Translate_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => matrix.Translate(1, 2));
+ Assert.Throws<ArgumentException>(null, () => matrix.Translate(1, 2, MatrixOrder.Append));
+ }
+
+ public static IEnumerable<object[]> TransformPoints_TestData()
+ {
+ yield return new object[] { new Matrix(2, 4, 6, 8, 10, 12), new Point[] { new Point(2, 4), new Point(4, 8) }, new Point[] { new Point(38, 52), new Point(66, 92) } };
+ yield return new object[] { new Matrix(), new Point[] { new Point(2, 4), new Point(4, 8) }, new Point[] { new Point(2, 4), new Point(4, 8) } };
+ yield return new object[] { new Matrix(2, 4, 6, 8, 10, 12), new Point[1], new Point[] { new Point(10, 12) } };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(TransformPoints_TestData))]
+ public void TransformPoints_Point_Success(Matrix matrix, Point[] points, Point[] expectedPoints)
+ {
+ matrix.TransformPoints(points);
+ Assert.Equal(expectedPoints, points);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(TransformPoints_TestData))]
+ public void TransformPoints_PointF_Success(Matrix matrix, Point[] points, Point[] expectedPoints)
+ {
+ PointF[] pointFs = points.Select(p => (PointF)p).ToArray();
+ matrix.TransformPoints(pointFs);
+ Assert.Equal(expectedPoints.Select(p => (PointF)p), pointFs);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void TransformPoints_NullPoints_ThrowsArgumentNullException()
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentNullException>("pts", () => matrix.TransformPoints((Point[])null));
+ Assert.Throws<ArgumentNullException>("pts", () => matrix.TransformPoints((PointF[])null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void TransformPoints_EmptyPoints_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformPoints(new Point[0]));
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformPoints(new PointF[0]));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void TransformPoints_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformPoints(new Point[1]));
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformPoints(new PointF[1]));
+ }
+
+ public static IEnumerable<object[]> TransformVectors_TestData()
+ {
+ yield return new object[] { new Matrix(2, 4, 6, 8, 10, 12), new Point[] { new Point(2, 4), new Point(4, 8) }, new Point[] { new Point(28, 40), new Point(56, 80) } };
+ yield return new object[] { new Matrix(), new Point[] { new Point(2, 4), new Point(4, 8) }, new Point[] { new Point(2, 4), new Point(4, 8) } };
+ yield return new object[] { new Matrix(2, 4, 6, 8, 10, 12), new Point[1], new Point[1] };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(TransformVectors_TestData))]
+ public void TransformVectors_Point_Success(Matrix matrix, Point[] points, Point[] expectedPoints)
+ {
+ matrix.TransformVectors(points);
+ Assert.Equal(expectedPoints, points);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(TransformVectors_TestData))]
+ public void TransformVectors_PointF_Success(Matrix matrix, Point[] points, Point[] expectedPoints)
+ {
+ PointF[] pointFs = points.Select(p => (PointF)p).ToArray();
+ matrix.TransformVectors(pointFs);
+ Assert.Equal(expectedPoints.Select(p => (PointF)p), pointFs);
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(TransformVectors_TestData))]
+ public void VectorTransformPoints_Points_Success(Matrix matrix, Point[] points, Point[] expectedPoints)
+ {
+ matrix.VectorTransformPoints(points);
+ Assert.Equal(expectedPoints, points);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void TransformVectors_NullPoints_ThrowsArgumentNullException()
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentNullException>("pts", () => matrix.VectorTransformPoints(null));
+ Assert.Throws<ArgumentNullException>("pts", () => matrix.TransformVectors((Point[])null));
+ Assert.Throws<ArgumentNullException>("pts", () => matrix.TransformVectors((PointF[])null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void TransformVectors_EmptyPoints_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ Assert.Throws<ArgumentException>(null, () => matrix.VectorTransformPoints(new Point[0]));
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformVectors(new Point[0]));
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformVectors(new PointF[0]));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void TransformVectors_Disposed_ThrowsArgumentException()
+ {
+ var matrix = new Matrix();
+ matrix.Dispose();
+
+ Assert.Throws<ArgumentException>(null, () => matrix.VectorTransformPoints(new Point[1]));
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformPoints(new Point[1]));
+ Assert.Throws<ArgumentException>(null, () => matrix.TransformVectors(new PointF[1]));
+ }
+
+ private static void AssertEqualFloatArray(float[] expected, float[] actual)
+ {
+ Assert.Equal(expected.Length, actual.Length);
+ for (int i = 0; i < expected.Length; i++)
+ {
+ try
+ {
+ Assert.Equal(expected[i], actual[i], 3);
+ }
+ catch
+ {
+ Console.WriteLine(i);
+ Console.WriteLine($"Expected: {string.Join(", ", expected)}");
+ Console.WriteLine($"Actual: {string.Join(", ", actual)}");
+ throw;
+ }
+ }
+ }
+ }
+}
diff --git a/src/System.Drawing.Common/tests/IconTests.cs b/src/System.Drawing.Common/tests/IconTests.cs
index e10afba38d..d6aa4fe3da 100644
--- a/src/System.Drawing.Common/tests/IconTests.cs
+++ b/src/System.Drawing.Common/tests/IconTests.cs
@@ -352,7 +352,7 @@ namespace System.Drawing.Tests
[InlineData("\\\\uncpath")]
public void ExtractAssociatedIcon_InvalidFilePath_ThrowsArgumentException(string filePath)
{
- Assert.Throws<ArgumentException>(null, () => Icon.ExtractAssociatedIcon(filePath));
+ Assert.Throws<ArgumentException>(() => Icon.ExtractAssociatedIcon(filePath));
}
[ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
diff --git a/src/System.Drawing.Common/tests/PensTests.cs b/src/System.Drawing.Common/tests/PensTests.cs
new file mode 100644
index 0000000000..8f806b4ae5
--- /dev/null
+++ b/src/System.Drawing.Common/tests/PensTests.cs
@@ -0,0 +1,172 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Drawing.Drawing2D;
+using System.Reflection;
+using Xunit;
+
+namespace System.Drawing.Tests
+{
+ public class PensTests
+ {
+ public static IEnumerable<object[]> Pens_TestData()
+ {
+ yield return Pen(() => Pens.AliceBlue, Color.AliceBlue);
+ yield return Pen(() => Pens.AntiqueWhite, Color.AntiqueWhite);
+ yield return Pen(() => Pens.Aqua, Color.Aqua);
+ yield return Pen(() => Pens.Aquamarine, Color.Aquamarine);
+ yield return Pen(() => Pens.Azure, Color.Azure);
+ yield return Pen(() => Pens.Beige, Color.Beige);
+ yield return Pen(() => Pens.Bisque, Color.Bisque);
+ yield return Pen(() => Pens.Black, Color.Black);
+ yield return Pen(() => Pens.BlanchedAlmond, Color.BlanchedAlmond);
+ yield return Pen(() => Pens.Blue, Color.Blue);
+ yield return Pen(() => Pens.BlueViolet, Color.BlueViolet);
+ yield return Pen(() => Pens.Brown, Color.Brown);
+ yield return Pen(() => Pens.BurlyWood, Color.BurlyWood);
+ yield return Pen(() => Pens.CadetBlue, Color.CadetBlue);
+ yield return Pen(() => Pens.Chartreuse, Color.Chartreuse);
+ yield return Pen(() => Pens.Chocolate, Color.Chocolate);
+ yield return Pen(() => Pens.Coral, Color.Coral);
+ yield return Pen(() => Pens.CornflowerBlue, Color.CornflowerBlue);
+ yield return Pen(() => Pens.Cornsilk, Color.Cornsilk);
+ yield return Pen(() => Pens.Crimson, Color.Crimson);
+ yield return Pen(() => Pens.Cyan, Color.Cyan);
+ yield return Pen(() => Pens.DarkBlue, Color.DarkBlue);
+ yield return Pen(() => Pens.DarkCyan, Color.DarkCyan);
+ yield return Pen(() => Pens.DarkGoldenrod, Color.DarkGoldenrod);
+ yield return Pen(() => Pens.DarkGray, Color.DarkGray);
+ yield return Pen(() => Pens.DarkGreen, Color.DarkGreen);
+ yield return Pen(() => Pens.DarkKhaki, Color.DarkKhaki);
+ yield return Pen(() => Pens.DarkMagenta, Color.DarkMagenta);
+ yield return Pen(() => Pens.DarkOliveGreen, Color.DarkOliveGreen);
+ yield return Pen(() => Pens.DarkOrange, Color.DarkOrange);
+ yield return Pen(() => Pens.DarkOrchid, Color.DarkOrchid);
+ yield return Pen(() => Pens.DarkRed, Color.DarkRed);
+ yield return Pen(() => Pens.DarkSalmon, Color.DarkSalmon);
+ yield return Pen(() => Pens.DarkSeaGreen, Color.DarkSeaGreen);
+ yield return Pen(() => Pens.DarkSlateBlue, Color.DarkSlateBlue);
+ yield return Pen(() => Pens.DarkSlateGray, Color.DarkSlateGray);
+ yield return Pen(() => Pens.DarkTurquoise, Color.DarkTurquoise);
+ yield return Pen(() => Pens.DarkViolet, Color.DarkViolet);
+ yield return Pen(() => Pens.DeepPink, Color.DeepPink);
+ yield return Pen(() => Pens.DeepSkyBlue, Color.DeepSkyBlue);
+ yield return Pen(() => Pens.DimGray, Color.DimGray);
+ yield return Pen(() => Pens.DodgerBlue, Color.DodgerBlue);
+ yield return Pen(() => Pens.Firebrick, Color.Firebrick);
+ yield return Pen(() => Pens.FloralWhite, Color.FloralWhite);
+ yield return Pen(() => Pens.ForestGreen, Color.ForestGreen);
+ yield return Pen(() => Pens.Fuchsia, Color.Fuchsia);
+ yield return Pen(() => Pens.Gainsboro, Color.Gainsboro);
+ yield return Pen(() => Pens.GhostWhite, Color.GhostWhite);
+ yield return Pen(() => Pens.Gold, Color.Gold);
+ yield return Pen(() => Pens.Goldenrod, Color.Goldenrod);
+ yield return Pen(() => Pens.Gray, Color.Gray);
+ yield return Pen(() => Pens.Green, Color.Green);
+ yield return Pen(() => Pens.GreenYellow, Color.GreenYellow);
+ yield return Pen(() => Pens.Honeydew, Color.Honeydew);
+ yield return Pen(() => Pens.HotPink, Color.HotPink);
+ yield return Pen(() => Pens.IndianRed, Color.IndianRed);
+ yield return Pen(() => Pens.Indigo, Color.Indigo);
+ yield return Pen(() => Pens.Ivory, Color.Ivory);
+ yield return Pen(() => Pens.Khaki, Color.Khaki);
+ yield return Pen(() => Pens.Lavender, Color.Lavender);
+ yield return Pen(() => Pens.LavenderBlush, Color.LavenderBlush);
+ yield return Pen(() => Pens.LawnGreen, Color.LawnGreen);
+ yield return Pen(() => Pens.LemonChiffon, Color.LemonChiffon);
+ yield return Pen(() => Pens.LightBlue, Color.LightBlue);
+ yield return Pen(() => Pens.LightCoral, Color.LightCoral);
+ yield return Pen(() => Pens.LightCyan, Color.LightCyan);
+ yield return Pen(() => Pens.LightGoldenrodYellow, Color.LightGoldenrodYellow);
+ yield return Pen(() => Pens.LightGray, Color.LightGray);
+ yield return Pen(() => Pens.LightGreen, Color.LightGreen);
+ yield return Pen(() => Pens.LightPink, Color.LightPink);
+ yield return Pen(() => Pens.LightSalmon, Color.LightSalmon);
+ yield return Pen(() => Pens.LightSeaGreen, Color.LightSeaGreen);
+ yield return Pen(() => Pens.LightSkyBlue, Color.LightSkyBlue);
+ yield return Pen(() => Pens.LightSlateGray, Color.LightSlateGray);
+ yield return Pen(() => Pens.LightSteelBlue, Color.LightSteelBlue);
+ yield return Pen(() => Pens.LightYellow, Color.LightYellow);
+ yield return Pen(() => Pens.Lime, Color.Lime);
+ yield return Pen(() => Pens.LimeGreen, Color.LimeGreen);
+ yield return Pen(() => Pens.Linen, Color.Linen);
+ yield return Pen(() => Pens.Magenta, Color.Magenta);
+ yield return Pen(() => Pens.Maroon, Color.Maroon);
+ yield return Pen(() => Pens.MediumAquamarine, Color.MediumAquamarine);
+ yield return Pen(() => Pens.MediumBlue, Color.MediumBlue);
+ yield return Pen(() => Pens.MediumOrchid, Color.MediumOrchid);
+ yield return Pen(() => Pens.MediumPurple, Color.MediumPurple);
+ yield return Pen(() => Pens.MediumSeaGreen, Color.MediumSeaGreen);
+ yield return Pen(() => Pens.MediumSlateBlue, Color.MediumSlateBlue);
+ yield return Pen(() => Pens.MediumSpringGreen, Color.MediumSpringGreen);
+ yield return Pen(() => Pens.MediumTurquoise, Color.MediumTurquoise);
+ yield return Pen(() => Pens.MediumVioletRed, Color.MediumVioletRed);
+ yield return Pen(() => Pens.MidnightBlue, Color.MidnightBlue);
+ yield return Pen(() => Pens.MintCream, Color.MintCream);
+ yield return Pen(() => Pens.MistyRose, Color.MistyRose);
+ yield return Pen(() => Pens.Moccasin, Color.Moccasin);
+ yield return Pen(() => Pens.NavajoWhite, Color.NavajoWhite);
+ yield return Pen(() => Pens.Navy, Color.Navy);
+ yield return Pen(() => Pens.OldLace, Color.OldLace);
+ yield return Pen(() => Pens.Olive, Color.Olive);
+ yield return Pen(() => Pens.OliveDrab, Color.OliveDrab);
+ yield return Pen(() => Pens.Orange, Color.Orange);
+ yield return Pen(() => Pens.OrangeRed, Color.OrangeRed);
+ yield return Pen(() => Pens.Orchid, Color.Orchid);
+ yield return Pen(() => Pens.PaleGoldenrod, Color.PaleGoldenrod);
+ yield return Pen(() => Pens.PaleGreen, Color.PaleGreen);
+ yield return Pen(() => Pens.PaleTurquoise, Color.PaleTurquoise);
+ yield return Pen(() => Pens.PaleVioletRed, Color.PaleVioletRed);
+ yield return Pen(() => Pens.PapayaWhip, Color.PapayaWhip);
+ yield return Pen(() => Pens.PeachPuff, Color.PeachPuff);
+ yield return Pen(() => Pens.Peru, Color.Peru);
+ yield return Pen(() => Pens.Pink, Color.Pink);
+ yield return Pen(() => Pens.Plum, Color.Plum);
+ yield return Pen(() => Pens.PowderBlue, Color.PowderBlue);
+ yield return Pen(() => Pens.Purple, Color.Purple);
+ yield return Pen(() => Pens.Red, Color.Red);
+ yield return Pen(() => Pens.RosyBrown, Color.RosyBrown);
+ yield return Pen(() => Pens.RoyalBlue, Color.RoyalBlue);
+ yield return Pen(() => Pens.SaddleBrown, Color.SaddleBrown);
+ yield return Pen(() => Pens.Salmon, Color.Salmon);
+ yield return Pen(() => Pens.SandyBrown, Color.SandyBrown);
+ yield return Pen(() => Pens.SeaGreen, Color.SeaGreen);
+ yield return Pen(() => Pens.SeaShell, Color.SeaShell);
+ yield return Pen(() => Pens.Sienna, Color.Sienna);
+ yield return Pen(() => Pens.Silver, Color.Silver);
+ yield return Pen(() => Pens.SkyBlue, Color.SkyBlue);
+ yield return Pen(() => Pens.SlateBlue, Color.SlateBlue);
+ yield return Pen(() => Pens.SlateGray, Color.SlateGray);
+ yield return Pen(() => Pens.Snow, Color.Snow);
+ yield return Pen(() => Pens.SpringGreen, Color.SpringGreen);
+ yield return Pen(() => Pens.SteelBlue, Color.SteelBlue);
+ yield return Pen(() => Pens.Tan, Color.Tan);
+ yield return Pen(() => Pens.Teal, Color.Teal);
+ yield return Pen(() => Pens.Thistle, Color.Thistle);
+ yield return Pen(() => Pens.Tomato, Color.Tomato);
+ yield return Pen(() => Pens.Transparent, Color.Transparent);
+ yield return Pen(() => Pens.Turquoise, Color.Turquoise);
+ yield return Pen(() => Pens.Violet, Color.Violet);
+ yield return Pen(() => Pens.Wheat, Color.Wheat);
+ yield return Pen(() => Pens.White, Color.White);
+ yield return Pen(() => Pens.WhiteSmoke, Color.WhiteSmoke);
+ yield return Pen(() => Pens.Yellow, Color.Yellow);
+ yield return Pen(() => Pens.YellowGreen, Color.YellowGreen);
+ }
+
+ public static object[] Pen(Func<Pen> penThunk, Color expectedColor) => new object[] { penThunk, expectedColor };
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Pens_TestData))]
+ public void Pens_Get_ReturnsExpected(Func<Pen> penThunk, Color expectedColor)
+ {
+ Pen pen = penThunk();
+ Assert.Equal(expectedColor, pen.Color);
+ Assert.Equal(PenType.SolidColor, pen.PenType);
+ Assert.Throws<ArgumentException>(null, () => pen.Color = Color.AliceBlue);
+
+ Assert.Same(pen, penThunk());
+ }
+ }
+}
diff --git a/src/System.Drawing.Common/tests/RegionTests.cs b/src/System.Drawing.Common/tests/RegionTests.cs
new file mode 100644
index 0000000000..e11b767c6d
--- /dev/null
+++ b/src/System.Drawing.Common/tests/RegionTests.cs
@@ -0,0 +1,1930 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// See the LICENSE file in the project root for more information.
+//
+// Copyright (C) 2004-2008 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Collections.Generic;
+using System.Drawing.Drawing2D;
+using System.Runtime.InteropServices;
+using Xunit;
+
+namespace System.Drawing.Tests
+{
+ public class RegionTests
+ {
+ private static readonly Graphics s_graphic = Graphics.FromImage(new Bitmap(1, 1));
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_Default()
+ {
+ var region = new Region();
+ Assert.False(region.IsEmpty(s_graphic));
+ Assert.True(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF(-4194304, -4194304, 8388608, 8388608), region.GetBounds(s_graphic));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(-1, -2, -3, -4, true)]
+ [InlineData(0, 0, 0, 0, true)]
+ [InlineData(1, 2, 3, 4, false)]
+ public void Ctor_Rectangle(int x, int y, int width, int height, bool isEmpty)
+ {
+ var rectangle = new Rectangle(x, y, width, height);
+
+ var region = new Region(rectangle);
+ Assert.Equal(isEmpty, region.IsEmpty(s_graphic));
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF(x, y, width, height), region.GetBounds(s_graphic));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(1, 2, 3, float.NegativeInfinity, true)]
+ [InlineData(-1, -2, -3, -4, true)]
+ [InlineData(0, 0, 0, 0, true)]
+ [InlineData(1, 2, 3, 4, false)]
+ [InlineData(float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue, true)]
+ public void Ctor_RectangleF(float x, float y, float width, float height, bool isEmpty)
+ {
+ var rectangle = new RectangleF(x, y, width, height);
+
+ var region = new Region(rectangle);
+ Assert.Equal(isEmpty, region.IsEmpty(s_graphic));
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(rectangle, region.GetBounds(s_graphic));
+ }
+
+ public static IEnumerable<object[]> Region_TestData()
+ {
+ yield return new object[] { new Region() };
+ yield return new object[] { new Region(new Rectangle(0, 0, 0, 0)) };
+ yield return new object[] { new Region(new Rectangle(1, 2, 3, 4)) };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Region_TestData))]
+ public void Ctor_RegionData(Region region)
+ {
+ var otherRegion = new Region(region.GetRegionData());
+
+ Assert.Equal(region.GetBounds(s_graphic), otherRegion.GetBounds(s_graphic));
+ Assert.Equal(region.GetRegionScans(new Matrix()), otherRegion.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_NullRegionData_ThrowsArgumentNullException()
+ {
+ Assert.Throws<ArgumentNullException>("rgnData", () => new Region((RegionData)null));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(0)]
+ [InlineData(1)]
+ [InlineData(256)]
+ public void Ctor_InvalidRegionData_ThrowsExternalException(int dataLength)
+ {
+ RegionData regionData = new Region().GetRegionData();
+ regionData.Data = new byte[dataLength];
+ Assert.Throws<ExternalException>(() => new Region(regionData));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_EmptyGraphicsPath_ThrowsExternalException()
+ {
+ var region = new Region(new GraphicsPath());
+ RegionData regionData = region.GetRegionData();
+ Assert.Throws<ExternalException>(() => new Region(regionData));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_NullDataInRegionData_ThrowsNullReferenceException()
+ {
+ RegionData regionData = new Region().GetRegionData();
+ regionData.Data = null;
+ Assert.Throws<NullReferenceException>(() => new Region(regionData));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_GraphicsPath()
+ {
+ var graphicsPath = new GraphicsPath();
+ graphicsPath.AddRectangle(new Rectangle(1, 2, 3, 4));
+ graphicsPath.AddRectangle(new Rectangle(4, 5, 6, 7));
+
+ var region = new Region(graphicsPath);
+ Assert.Equal(new RectangleF[]
+ {
+ new RectangleF(1, 2, 3, 3),
+ new RectangleF(1, 5, 9, 1),
+ new RectangleF(4, 6, 6, 6)
+ }, region.GetRegionScans(new Matrix()));
+ Assert.Equal(new RectangleF(1, 2, 9, 10), region.GetBounds(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_EmptyGraphicsPath()
+ {
+ var region = new Region(new GraphicsPath());
+ Assert.True(region.IsEmpty(s_graphic));
+ Assert.Empty(region.GetRegionScans(new Matrix()));
+ }
+
+ public static IEnumerable<object[]> Ctor_InfiniteGraphicsPath_TestData()
+ {
+ var path1 = new GraphicsPath();
+ path1.AddRectangle(new Rectangle(-4194304, -4194304, 8388608, 8388608));
+ yield return new object[] { path1, true };
+
+ var path2 = new GraphicsPath();
+ path2.AddRectangle(new Rectangle(-4194304, -4194304, 8388608, 8388608));
+ path2.AddRectangle(Rectangle.Empty);
+ yield return new object[] { path2, true };
+
+ var path3 = new GraphicsPath();
+ path3.AddRectangle(new Rectangle(-4194304, -4194304, 8388608, 8388608));
+ path3.AddRectangle(new Rectangle(1, 2, 3, 4));
+ yield return new object[] { path3, false };
+
+ var path4 = new GraphicsPath();
+ path4.AddCurve(new Point[] { new Point(-4194304, -4194304), new Point(4194304, 4194304) });
+ yield return new object[] { path4, false };
+
+ var path5 = new GraphicsPath();
+ path5.AddPolygon(new Point[] { new Point(-4194304, -4194304), new Point(-4194304, 4194304), new Point(4194304, 4194304), new Point(4194304, -4194304) });
+ yield return new object[] { path5, true };
+
+ var path6 = new GraphicsPath();
+ path6.AddPolygon(new Point[] { new Point(-4194304, -4194304), new Point(-4194304, 4194304), new Point(4194304, 4194304), new Point(4194304, -4194304), new Point(-4194304, -4194304) });
+ yield return new object[] { path6, true };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Ctor_InfiniteGraphicsPath_TestData))]
+ public void Ctor_InfiniteGraphicsPath_IsInfinite(GraphicsPath path, bool isInfinite)
+ {
+ var region = new Region(path);
+ Assert.Equal(isInfinite, region.IsInfinite(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_GraphicsPathTooLarge_SetsToEmpty()
+ {
+ var path = new GraphicsPath();
+ path.AddCurve(new Point[] { new Point(-4194304, -4194304), new Point(4194304, 4194304) });
+
+ var rect = new Region(path);
+ Assert.Empty(rect.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_NullGraphicsPath_ThrowsArgumentNullException()
+ {
+ Assert.Throws<ArgumentNullException>("path", () => new Region((GraphicsPath)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Ctor_DisposedGraphicsPath_ThrowsArgumentException()
+ {
+ var path = new GraphicsPath();
+ path.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Region(path));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Region_TestData))]
+ public void Clone(Region region)
+ {
+ Region clone = Assert.IsType<Region>(region.Clone());
+ Assert.NotSame(region, clone);
+
+ Assert.Equal(region.GetBounds(s_graphic), clone.GetBounds(s_graphic));
+ Assert.Equal(region.GetRegionScans(new Matrix()), clone.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Clone_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Clone());
+ }
+
+ public static IEnumerable<object[]> Complement_TestData()
+ {
+ yield return new object[]
+ {
+ new Region(new RectangleF(10, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(40, 60, 100, 20) },
+ new RectangleF[] { new RectangleF(110, 60, 30, 20) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(70, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(40, 60, 100, 20) },
+ new RectangleF[] { new RectangleF(40, 60, 30, 20) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(40, 100, 100, 100)),
+ new RectangleF[] { new RectangleF(70, 80, 50, 40) },
+ new RectangleF[] { new RectangleF(70, 80, 50, 20) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(40, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(70, 80, 50, 40) },
+ new RectangleF[] { new RectangleF(70, 110, 50, 10) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(30, 30, 80, 80)),
+ new RectangleF[]
+ {
+ new RectangleF(45, 45, 200, 200),
+ new RectangleF(160, 260, 10, 10),
+ new RectangleF(170, 260, 10, 10),
+ },
+ new RectangleF[] { new RectangleF(170, 260, 10, 10) }
+ };
+
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[0]
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { new RectangleF(1, 2, 3, 4) },
+ new RectangleF[0]
+ };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Complement_TestData))]
+ public void Complement_Region_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Complement(new Region(rect));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_UnionRegion_Success()
+ {
+ var complement = new Region(new Rectangle(20, 80, 20, 10));
+ complement.Union(new Rectangle(60, 60, 30, 10));
+
+ var region = new Region(new Rectangle(20, 20, 20, 20));
+ region.Complement(complement);
+
+ Assert.Equal(new RectangleF[]
+ {
+ new RectangleF(60, 60, 30, 10),
+ new RectangleF(20, 80, 20, 10)
+ }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_InfiniteAndWithIntersectRegion_Success()
+ {
+ var region = new Region();
+ region.Intersect(new Rectangle(5, 5, -10, -10));
+ region.Complement(new Rectangle(-5, -5, 12, 12));
+
+ Assert.False(region.IsEmpty(s_graphic));
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[]
+ {
+ new RectangleF(5, -5, 2, 10),
+ new RectangleF(-5, 5, 12, 2)
+ }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_InfiniteRegion_Success()
+ {
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ region.Complement(new Region());
+
+ Assert.Equal(new RectangleF[]
+ {
+ new RectangleF(-4194304, -4194304, 8388608, 4194306),
+ new RectangleF(-4194304, 2, 4194305, 4),
+ new RectangleF(4, 2, 4194300, 4),
+ new RectangleF(-4194304, 6, 8388608, 4194298)
+ }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_NullRegion_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("region", () => region.Complement((Region)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_DisposedRegion_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Region().Complement(region));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_SameRegion_ThrowsInvalidOperationException()
+ {
+ var region = new Region();
+ Assert.Throws<InvalidOperationException>(() => region.Complement(region));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Complement_TestData))]
+ public void Complement_Rectangle_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Complement(new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Complement_TestData))]
+ public void Complement_RectangleF_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Complement(rect);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Complement_TestData))]
+ public void Complement_GraphicsPath_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ var path = new GraphicsPath();
+ path.AddRectangle(rect);
+ region.Complement(path);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_GraphicsPathWithMultipleRectangles_Success()
+ {
+ Graphics graphics = Graphics.FromImage(new Bitmap(600, 800));
+
+ var rect1 = new Rectangle(20, 30, 60, 80);
+ var rect2 = new Rectangle(50, 40, 60, 80);
+ var region1 = new Region(rect1);
+ var region2 = new Region(rect2);
+ graphics.DrawRectangle(Pens.Green, rect1);
+ graphics.DrawRectangle(Pens.Red, rect2);
+
+ region1.Complement(region2);
+ graphics.FillRegion(Brushes.Blue, region1);
+ graphics.DrawRectangles(Pens.Yellow, region1.GetRegionScans(new Matrix()));
+
+ Assert.Equal(new RectangleF[]
+ {
+ new RectangleF(80, 40, 30, 70),
+ new RectangleF(50, 110, 60, 10)
+ }, region1.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_EmptyPathWithInfiniteRegion_MakesEmpty()
+ {
+ var region = new Region();
+ region.Complement(new GraphicsPath());
+ Assert.True(region.IsEmpty(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_NullGraphicsPath_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("path", () => region.Complement((GraphicsPath)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Complement_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Complement(new GraphicsPath()));
+ Assert.Throws<ArgumentException>(null, () => region.Complement(new Rectangle()));
+ Assert.Throws<ArgumentException>(null, () => region.Complement(new RectangleF()));
+ Assert.Throws<ArgumentException>(null, () => region.Complement(new Region()));
+ }
+
+ public static IEnumerable<object[]> Equals_TestData()
+ {
+ Func<Region> empty = () =>
+ {
+ var emptyRegion = new Region();
+ emptyRegion.MakeEmpty();
+ return emptyRegion;
+ };
+
+ var region = new Region();
+ yield return new object[] { region, region, true };
+ yield return new object[] { region, new Region(), true };
+ yield return new object[] { region, empty(), false };
+ yield return new object[] { region, new Region(new Rectangle(1, 2, 3, 4)), false };
+
+ yield return new object[] { empty(), empty(), true };
+ yield return new object[] { empty(), new Region(new Rectangle(0, 0, 0, 0)), true };
+ yield return new object[] { empty(), new Region(new Rectangle(1, 2, 3, 3)), false };
+
+ yield return new object[] { new Region(new Rectangle(1, 2, 3, 4)), new Region(new Rectangle(1, 2, 3, 4)), true };
+ yield return new object[] { new Region(new Rectangle(1, 2, 3, 4)), new Region(new RectangleF(1, 2, 3, 4)), true };
+ yield return new object[] { new Region(new Rectangle(1, 2, 3, 4)), new Region(new Rectangle(2, 2, 3, 4)), false };
+ yield return new object[] { new Region(new Rectangle(1, 2, 3, 4)), new Region(new Rectangle(1, 3, 3, 4)), false };
+ yield return new object[] { new Region(new Rectangle(1, 2, 3, 4)), new Region(new Rectangle(1, 2, 4, 4)), false };
+ yield return new object[] { new Region(new Rectangle(1, 2, 3, 4)), new Region(new Rectangle(1, 2, 3, 5)), false };
+
+ var graphics1 = new GraphicsPath();
+ graphics1.AddRectangle(new Rectangle(1, 2, 3, 4));
+
+ var graphics2 = new GraphicsPath();
+ graphics2.AddRectangle(new Rectangle(1, 2, 3, 4));
+
+ var graphics3 = new GraphicsPath();
+ graphics3.AddRectangle(new Rectangle(2, 2, 3, 4));
+
+ var graphics4 = new GraphicsPath();
+ graphics4.AddRectangle(new Rectangle(1, 3, 3, 4));
+
+ var graphics5 = new GraphicsPath();
+ graphics5.AddRectangle(new Rectangle(1, 2, 4, 4));
+
+ var graphics6 = new GraphicsPath();
+ graphics6.AddRectangle(new Rectangle(1, 2, 3, 5));
+
+ yield return new object[] { new Region(graphics1), new Region(graphics1), true };
+ yield return new object[] { new Region(graphics1), new Region(graphics2), true };
+ yield return new object[] { new Region(graphics1), new Region(graphics3), false };
+ yield return new object[] { new Region(graphics1), new Region(graphics4), false };
+ yield return new object[] { new Region(graphics1), new Region(graphics5), false };
+ yield return new object[] { new Region(graphics1), new Region(graphics6), false };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Equals_TestData))]
+ public void Equals_Valid_ReturnsExpected(Region region, Region other, bool expected)
+ {
+ Assert.Equal(expected, region.Equals(other, s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Equals_NullRegion_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("region", () => region.Equals(null, s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Equals_NullGraphics_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("g", () => region.Equals(new Region(), null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Equals_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Equals(new Region(), s_graphic));
+ Assert.Throws<ArgumentException>(null, () => new Region().Equals(region, s_graphic));
+ }
+
+ public static IEnumerable<object[]> Exclude_TestData()
+ {
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) },
+ new RectangleF[0]
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) }
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { new RectangleF(520, 40, 60, 80) },
+ new RectangleF[]
+ {
+ new RectangleF(-4194304, -4194304, 8388608, 4194344),
+ new RectangleF(-4194304, 40, 4194824, 80),
+ new RectangleF(580, 40, 4193724, 80),
+ new RectangleF(-4194304, 120, 8388608, 4194184)
+ }
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[] { new Rectangle(-4194304, -4194304, 8388608, 8388608) }
+ };
+
+ // Intersecting from the right.
+ yield return new object[]
+ {
+ new Region(new Rectangle(10, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(40, 60, 100, 20) },
+ new RectangleF[]
+ {
+ new RectangleF(10, 10, 100, 50),
+ new RectangleF(10, 60, 30, 20),
+ new RectangleF(10, 80, 100, 30)
+ }
+ };
+
+ // Intersecting from the left.
+ yield return new object[]
+ {
+ new Region(new Rectangle(70, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(40, 60, 100, 20) },
+ new RectangleF[]
+ {
+ new RectangleF(70, 10, 100, 50),
+ new RectangleF(140, 60, 30, 20),
+ new RectangleF(70, 80, 100, 30)
+ }
+ };
+
+ // Intersecting from the top.
+ yield return new object[]
+ {
+ new Region(new Rectangle(40, 100, 100, 100)),
+ new RectangleF[] { new RectangleF(70, 80, 50, 40) },
+ new RectangleF[]
+ {
+ new RectangleF(40, 100, 30, 20),
+ new RectangleF(120, 100, 20, 20),
+ new RectangleF(40, 120, 100, 80)
+ }
+ };
+
+ // Intersecting from the bottom.
+ yield return new object[]
+ {
+ new Region(new Rectangle(40, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(70, 80, 50, 40) },
+ new RectangleF[]
+ {
+ new RectangleF(40, 10, 100, 70),
+ new RectangleF(40, 80, 30, 30),
+ new RectangleF(120, 80, 20, 30)
+ }
+ };
+
+ // Multiple regions.
+ yield return new object[]
+ {
+ new Region(new Rectangle(30, 30, 80, 80)),
+ new RectangleF[]
+ {
+ new RectangleF(45, 45, 200, 200),
+ new RectangleF(160, 260, 10, 10),
+ new RectangleF(170, 260, 10, 10)
+ },
+ new RectangleF[]
+ {
+ new RectangleF(30, 30, 80, 15),
+ new RectangleF(30, 45, 15, 65)
+ }
+ };
+
+ // Intersecting from the top with a larger rect.
+ yield return new object[]
+ {
+ new Region(new Rectangle(50, 100, 100, 100)),
+ new RectangleF[] { new RectangleF(30, 70, 150, 40) },
+ new RectangleF[] { new RectangleF(50, 110, 100, 90) }
+ };
+
+ // Intersecting from the right with a larger rect.
+ yield return new object[]
+ {
+ new Region(new Rectangle(70, 60, 100, 70)),
+ new RectangleF[] { new RectangleF(40, 10, 100, 150) },
+ new RectangleF[] { new RectangleF(140, 60, 30, 70) }
+ };
+
+ // Intersecting from the left with a larger rect.
+ yield return new object[]
+ {
+ new Region(new Rectangle(70, 60, 100, 70)),
+ new RectangleF[] { new RectangleF(100, 10, 100, 150) },
+ new RectangleF[] { new RectangleF(70, 60, 30, 70) }
+ };
+
+ // Intersecting from the bottom with a larger rect.
+ yield return new object[]
+ {
+ new Region(new Rectangle(20, 20, 100, 100)),
+ new RectangleF[] { new RectangleF(10, 80, 140, 150) },
+ new RectangleF[] { new RectangleF(20, 20, 100, 60) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(130, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(170, 40, 60, 80) },
+ new RectangleF[]
+ {
+ new RectangleF(130, 30, 60, 10),
+ new RectangleF(130, 40, 40, 70)
+ }
+ };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Exclude_TestData))]
+ public void Exclude_Region_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Exclude(new Region(rect));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_UnionRegion_Success()
+ {
+ var union = new Region(new RectangleF(20, 80, 20, 10));
+ union.Union(new RectangleF(60, 60, 30, 10));
+
+ var region = new Region(new RectangleF(20, 20, 20, 20));
+ region.Exclude(union);
+ Assert.Equal(new RectangleF[] { new RectangleF(20, 20, 20, 20) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_InfiniteRegion_Success()
+ {
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ region.Exclude(new Region());
+
+ Assert.Equal(new RectangleF[0], region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_NullRegion_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("region", () => region.Exclude((Region)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_DisposedRegion_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Region().Exclude(region));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_SameRegion_ThrowsInvalidOperationException()
+ {
+ var region = new Region();
+ Assert.Throws<InvalidOperationException>(() => region.Exclude(region));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Exclude_TestData))]
+ public void Exclude_Rectangle_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Exclude(new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Exclude_TestData))]
+ public void Exclude_RectangleF_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Exclude(rect);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Exclude_TestData))]
+ public void Exclude_GraphicsPath_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ var path = new GraphicsPath();
+ path.AddRectangle(rect);
+ region.Exclude(path);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_EmptyPathWithInfiniteRegion_MakesInfinite()
+ {
+ var region = new Region();
+ region.Exclude(new GraphicsPath());
+ Assert.True(region.IsInfinite(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_NullGraphicsPath_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("path", () => region.Exclude((GraphicsPath)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Exclude_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Exclude(new GraphicsPath()));
+ Assert.Throws<ArgumentException>(null, () => region.Exclude(new Rectangle()));
+ Assert.Throws<ArgumentException>(null, () => region.Exclude(new RectangleF()));
+ Assert.Throws<ArgumentException>(null, () => region.Exclude(new Region()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void FromHrgn_ValidHrgn_ReturnsExpected()
+ {
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ IntPtr handle1 = region.GetHrgn(s_graphic);
+ IntPtr handle2 = region.GetHrgn(s_graphic);
+ Assert.NotEqual(IntPtr.Zero, handle1);
+ Assert.NotEqual(handle1, handle2);
+
+ Region newRegion = Region.FromHrgn(handle1);
+ IntPtr handle3 = newRegion.GetHrgn(s_graphic);
+ Assert.NotEqual(handle3, handle1);
+ Assert.Equal(new RectangleF(1, 2, 3, 4), newRegion.GetBounds(s_graphic));
+
+ region.ReleaseHrgn(handle1);
+ region.ReleaseHrgn(handle2);
+ newRegion.ReleaseHrgn(handle3);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void FromHrgn_ZeroHrgn_ThrowsArgumentException()
+ {
+ Assert.Throws<ArgumentException>(null, () => Region.FromHrgn(IntPtr.Zero));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetHrgn_Infinite_ReturnsZero()
+ {
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ IntPtr handle = region.GetHrgn(s_graphic);
+ Assert.NotEqual(IntPtr.Zero, handle);
+ region.ReleaseHrgn(handle);
+
+ region.MakeInfinite();
+ Assert.Equal(IntPtr.Zero, region.GetHrgn(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetHrgn_Empty_ReturnsNonZero()
+ {
+ var region = new Region();
+ Assert.Equal(IntPtr.Zero, region.GetHrgn(s_graphic));
+
+ region.MakeEmpty();
+ IntPtr handle = region.GetHrgn(s_graphic);
+ Assert.NotEqual(IntPtr.Zero, handle);
+ region.ReleaseHrgn(handle);
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetHrgn_NullGraphics_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("g", () => region.GetHrgn(null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetHrgn_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.GetHrgn(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void ReleaseHrgn_ZeroHandle_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("regionHandle", () => region.ReleaseHrgn(IntPtr.Zero));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetBounds_NullGraphics_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("g", () => region.GetBounds(null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetBounds_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.GetBounds(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetRegionData_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.GetRegionData());
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetRegionScans_CustomMatrix_TransformsRegionScans()
+ {
+ var matrix = new Matrix();
+ matrix.Translate(10, 11);
+ matrix.Scale(5, 6);
+
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ Assert.Equal(new RectangleF[] { new RectangleF(1, 2, 3, 4) }, region.GetRegionScans(new Matrix()));
+ Assert.Equal(new RectangleF[] { new RectangleF(15, 23, 15, 24) }, region.GetRegionScans(matrix));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetRegionScans_NullMatrix_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentNullException>("matrix", () => region.GetRegionScans(null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetRegionScans_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void GetRegionScans_DisposedMatrix_ThrowsArgumentException()
+ {
+ var region = new Region();
+ var matrix = new Matrix();
+ matrix.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.GetRegionScans(matrix));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Test()
+ {
+ var clipRegion = new Region();
+
+ Rectangle smaller = new Rectangle(5, 5, -10, -10);
+
+ clipRegion.Intersect(smaller);
+ Assert.False(clipRegion.IsEmpty(s_graphic), "IsEmpty");
+ Assert.False(clipRegion.IsInfinite(s_graphic), "IsInfinite");
+
+ RectangleF[] rects = clipRegion.GetRegionScans(new Matrix());
+ Assert.Equal(1, rects.Length);
+ Assert.Equal(new RectangleF(-5, -5, 10, 10), rects[0]);
+ }
+
+ public static IEnumerable<object[]> Intersect_TestData()
+ {
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) },
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) }
+ };
+ yield return new object[]
+ {
+ new Region(new Rectangle(0, 0, 0, 0)),
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) },
+ new RectangleF[0]
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[0]
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { new RectangleF(520, 40, 60, 80) },
+ new RectangleF[] { new Rectangle(520, 40, 60, 80) }
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[0]
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(260, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(290, 40, 60, 90) },
+ new RectangleF[] { new RectangleF(290, 40, 30, 70) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(20, 330, 40, 50)),
+ new RectangleF[]
+ {
+ new RectangleF(50, 340, 40, 50),
+ new RectangleF(70, 360, 30, 50),
+ new RectangleF(80, 400, 30, 10)
+ },
+ new RectangleF[0]
+ };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Intersect_TestData))]
+ public void Intersect_Region_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Intersect(new Region(rect));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_InfiniteRegion_Success()
+ {
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ region.Intersect(new Region());
+
+ Assert.Equal(new RectangleF[] { new Rectangle(1, 2, 3, 4) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_NullRegion_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("region", () => region.Intersect((Region)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_DisposedRegion_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Region().Intersect(region));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_SameRegion_ThrowsInvalidOperationException()
+ {
+ var region = new Region();
+ Assert.Throws<InvalidOperationException>(() => region.Intersect(region));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Intersect_TestData))]
+ public void Intersect_Rectangle_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Intersect(new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_InfiniteRegionWithSmallerRectangle_Success()
+ {
+ var region = new Region();
+ region.Intersect(new Rectangle(5, 5, -10, -10));
+
+ Assert.False(region.IsEmpty(s_graphic));
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(-5, -5, 10, 10) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Intersect_TestData))]
+ public void Intersect_RectangleF_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Intersect(rect);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_InfiniteRegionWithSmallerRectangleF_Success()
+ {
+ var region = new Region();
+ region.Intersect(new RectangleF(5, 5, -10, -10));
+
+ Assert.False(region.IsEmpty(s_graphic));
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(-5, -5, 10, 10) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Intersect_TestData))]
+ public void Intersect_GraphicsPath_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ var path = new GraphicsPath();
+ path.AddRectangle(rect);
+ region.Intersect(path);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_EmptyPathWithInfiniteRegion_MakesEmpty()
+ {
+ var region = new Region();
+ region.Intersect(new GraphicsPath());
+ Assert.True(region.IsEmpty(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_NullGraphicsPath_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("path", () => region.Intersect((GraphicsPath)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Intersect_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Intersect(new GraphicsPath()));
+ Assert.Throws<ArgumentException>(null, () => region.Intersect(new Rectangle()));
+ Assert.Throws<ArgumentException>(null, () => region.Intersect(new RectangleF()));
+ Assert.Throws<ArgumentException>(null, () => region.Intersect(new Region()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void IsEmpty_NullGraphics_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("g", () => region.IsEmpty(null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void IsEmpty_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.IsEmpty(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void IsInfinite_NullGraphics_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("g", () => region.IsInfinite(null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void IsInfinite_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.IsInfinite(s_graphic));
+ }
+
+ public static IEnumerable<object[]> IsVisible_Rectangle_TestData()
+ {
+ var infiniteExclude = new Region();
+ infiniteExclude.Exclude(new Rectangle(387, 292, 189, 133));
+ infiniteExclude.Exclude(new Rectangle(387, 66, 189, 133));
+
+ yield return new object[] { infiniteExclude, new Rectangle(66, 292, 189, 133), true };
+ yield return new object[] { new Region(), Rectangle.Empty, false };
+
+ yield return new object[] { new Region(new Rectangle(0, 0, 10, 10)), new Rectangle(0, 0, 0, 1), false };
+ yield return new object[] { new Region(new Rectangle(500, 30, 60, 80)), new Rectangle(500, 30, 60, 80), true };
+ yield return new object[] { new Region(new Rectangle(500, 30, 60, 80)), new Rectangle(520, 40, 60, 80), true };
+
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Rectangle(1, 1, 2, 1), true };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Rectangle(1, 1, 2, 2), true };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Rectangle(1, 1, 10, 10), true };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Rectangle(1, 1, 1, 1), true };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Rectangle(2, 2, 1, 1), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Rectangle(0, 0, 1, 1), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Rectangle(3, 3, 1, 1), false };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(IsVisible_Rectangle_TestData))]
+ public void IsVisible_Rectangle_ReturnsExpected(Region region, Rectangle rectangle, bool expected)
+ {
+ Assert.Equal(expected, region.IsVisible(rectangle));
+ Assert.Equal(expected, region.IsVisible((RectangleF)rectangle));
+ Assert.Equal(expected, region.IsVisible(rectangle, s_graphic));
+ Assert.Equal(expected, region.IsVisible(rectangle, null));
+ Assert.Equal(expected, region.IsVisible((RectangleF)rectangle, s_graphic));
+ Assert.Equal(expected, region.IsVisible((RectangleF)rectangle, null));
+
+ Assert.Equal(expected, region.IsVisible(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height));
+ Assert.Equal(expected, region.IsVisible((float)rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height));
+ Assert.Equal(expected, region.IsVisible(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, s_graphic));
+ Assert.Equal(expected, region.IsVisible(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, null));
+ Assert.Equal(expected, region.IsVisible((float)rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, s_graphic));
+ Assert.Equal(expected, region.IsVisible((float)rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, null));
+ }
+
+ public static IEnumerable<object[]> IsVisible_Point_TestData()
+ {
+ var infiniteExclude = new Region();
+ infiniteExclude.Exclude(new Rectangle(387, 292, 189, 133));
+ infiniteExclude.Exclude(new Rectangle(387, 66, 189, 133));
+
+ yield return new object[] { infiniteExclude, new Point(66, 292), true };
+ yield return new object[] { new Region(), Point.Empty, true };
+
+ yield return new object[] { new Region(new Rectangle(500, 30, 60, 80)), new Point(500, 29), false };
+ yield return new object[] { new Region(new Rectangle(500, 30, 60, 80)), new Point(500, 30), true };
+
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(0, 1), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(1, 0), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(2, 0), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(3, 0), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(1, 1), true };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(2, 1), true };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(3, 1), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(0, 2), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(2, 2), false };
+ yield return new object[] { new Region(new Rectangle(1, 1, 2, 1)), new Point(3, 2), false };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(IsVisible_Point_TestData))]
+ public void IsVisible_Point_ReturnsExpected(Region region, Point point, bool expected)
+ {
+ Assert.Equal(expected, region.IsVisible(point));
+ Assert.Equal(expected, region.IsVisible((PointF)point));
+ Assert.Equal(expected, region.IsVisible(point, s_graphic));
+ Assert.Equal(expected, region.IsVisible(point, null));
+ Assert.Equal(expected, region.IsVisible((PointF)point, s_graphic));
+ Assert.Equal(expected, region.IsVisible((PointF)point, null));
+
+ Assert.Equal(expected, region.IsVisible(point.X, point.Y));
+ Assert.Equal(expected, region.IsVisible(point.X, point.Y, s_graphic));
+ Assert.Equal(expected, region.IsVisible(point.X, point.Y, null));
+
+ Assert.Equal(expected, region.IsVisible(point.X, point.Y, s_graphic));
+ Assert.Equal(expected, region.IsVisible(point.X, point.Y, null));
+ Assert.Equal(expected, region.IsVisible((float)point.X, point.Y, s_graphic));
+ Assert.Equal(expected, region.IsVisible((float)point.X, point.Y, null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void IsVisible_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(1f, 2f));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new PointF(1, 2)));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new Point(1, 2)));
+
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(1f, 2f, s_graphic));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new PointF(1, 2), s_graphic));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new Point(1, 2), s_graphic));
+
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(1f, 2f, 3f, 4f));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new Rectangle(1, 2, 3, 4)));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new RectangleF(1, 2, 3, 4)));
+
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(1f, 2f, 3f, 4f, s_graphic));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new Rectangle(1, 2, 3, 4), s_graphic));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(new RectangleF(1, 2, 3, 4), s_graphic));
+
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(1, 2, s_graphic));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(1, 2, 3, 4));
+ Assert.Throws<ArgumentException>(null, () => region.IsVisible(1, 2, 3, 4, s_graphic));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Region_TestData))]
+ public void MakeEmpty_NonEmpty_Success(Region region)
+ {
+ region.MakeEmpty();
+ Assert.True(region.IsEmpty(s_graphic));
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(RectangleF.Empty, region.GetBounds(s_graphic));
+ Assert.Empty(region.GetRegionScans(new Matrix()));
+
+ region.MakeEmpty();
+ Assert.True(region.IsEmpty(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void MakeEmpty_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.MakeEmpty());
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Region_TestData))]
+ public void MakeInfinite_NonInfinity_Success(Region region)
+ {
+ region.MakeInfinite();
+ Assert.False(region.IsEmpty(s_graphic));
+ Assert.True(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF(-4194304, -4194304, 8388608, 8388608), region.GetBounds(s_graphic));
+
+ region.MakeInfinite();
+ Assert.False(region.IsEmpty(s_graphic));
+ Assert.True(region.IsInfinite(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void MakeInfinite_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.MakeInfinite());
+ }
+
+ public static IEnumerable<object[]> Union_TestData()
+ {
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) },
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(520, 30, 60, 80) },
+ new RectangleF[] { new RectangleF(500, 30, 80, 80) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(500, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(520, 40, 60, 80) },
+ new RectangleF[]
+ {
+ new RectangleF(500, 30, 60, 10),
+ new RectangleF(500, 40, 80, 70),
+ new RectangleF(520, 110, 60, 10),
+ }
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { new RectangleF(520, 40, 60, 80) },
+ new RectangleF[] { new Rectangle(-4194304, -4194304, 8388608, 8388608) }
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[] { new Rectangle(-4194304, -4194304, 8388608, 8388608) }
+ };
+
+ // No intersecting rects.
+ yield return new object[]
+ {
+ new Region(new Rectangle(20, 20, 20, 20)),
+ new RectangleF[]
+ {
+ new RectangleF(20, 80, 20, 10),
+ new RectangleF(60, 60, 30, 10)
+ },
+ new RectangleF[]
+ {
+ new RectangleF(20, 20, 20, 20),
+ new RectangleF(60, 60, 30, 10),
+ new RectangleF(20, 80, 20, 10)
+ }
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(20, 180, 40, 50)),
+ new RectangleF[]
+ {
+ new RectangleF(50, 190, 40, 50),
+ new RectangleF(70, 210, 30, 50)
+ },
+ new RectangleF[]
+ {
+ new RectangleF(20, 180, 40, 10),
+ new RectangleF(20, 190, 70, 20),
+ new RectangleF(20, 210, 80, 20),
+ new RectangleF(50, 230, 50, 10),
+ new RectangleF(70, 240, 30, 20)
+ }
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(20, 330, 40, 50)),
+ new RectangleF[]
+ {
+ new RectangleF(50, 340, 40, 50),
+ new RectangleF(70, 360, 30, 50),
+ new RectangleF(80, 400, 30, 10)
+ },
+ new RectangleF[]
+ {
+ new RectangleF(20, 330, 40, 10),
+ new RectangleF(20, 340, 70, 20),
+ new RectangleF(20, 360, 80, 20),
+ new RectangleF(50, 380, 50, 10),
+ new RectangleF(70, 390, 30, 10),
+ new RectangleF(70, 400, 40, 10)
+ }
+ };
+
+ yield return new object[]
+ {
+ new Region(new Rectangle(10, 20, 50, 50)),
+ new RectangleF[]
+ {
+ new RectangleF(100, 100, 60, 60),
+ new RectangleF(200, 200, 80, 80)
+ },
+ new RectangleF[]
+ {
+ new RectangleF(10, 20, 50, 50),
+ new RectangleF(100, 100, 60, 60),
+ new RectangleF(200, 200, 80, 80)
+ }
+ };
+
+ // Intersecting from the right.
+ yield return new object[]
+ {
+ new Region(new Rectangle(10, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(40, 60, 100, 20) },
+ new RectangleF[]
+ {
+ new RectangleF(10, 10, 100, 50),
+ new RectangleF(10, 60, 130, 20),
+ new RectangleF(10, 80, 100, 30)
+ }
+ };
+
+ // Intersecting from the left.
+ yield return new object[]
+ {
+ new Region(new Rectangle(70, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(40, 60, 100, 20) },
+ new RectangleF[]
+ {
+ new RectangleF(70, 10, 100, 50),
+ new RectangleF(40, 60, 130, 20),
+ new RectangleF(70, 80, 100, 30)
+ }
+ };
+
+ // Intersecting from the top.
+ yield return new object[]
+ {
+ new Region(new Rectangle(40, 100, 100, 100)),
+ new RectangleF[] { new RectangleF(70, 80, 50, 40) },
+ new RectangleF[]
+ {
+ new RectangleF(70, 80, 50, 20),
+ new RectangleF(40, 100, 100, 100)
+ }
+ };
+
+ // Intersecting from the bottom.
+ yield return new object[]
+ {
+ new Region(new Rectangle(40, 10, 100, 100)),
+ new RectangleF[] { new RectangleF(70, 80, 50, 40) },
+ new RectangleF[]
+ {
+ new RectangleF(40, 10, 100, 100),
+ new RectangleF(70, 110, 50, 10)
+ }
+ };
+
+ // Multiple regions separated by 0 pixels.
+ yield return new object[]
+ {
+ new Region(new Rectangle(30, 30, 80, 80)),
+ new RectangleF[]
+ {
+ new RectangleF(45, 45, 200, 200),
+ new RectangleF(160, 260, 10, 10),
+ new RectangleF(170, 260, 10, 10)
+ },
+ new RectangleF[]
+ {
+ new RectangleF(30, 30, 80, 15),
+ new RectangleF(30, 45, 215, 65),
+ new RectangleF(45, 110, 200, 135),
+ new RectangleF(160, 260, 20, 10)
+ }
+ };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Union_TestData))]
+ public void Union_Region_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Union(new Region(rect));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Union_InfiniteRegion_Success()
+ {
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ region.Union(new Region());
+
+ Assert.Equal(new RectangleF[] { new Rectangle(-4194304, -4194304, 8388608, 8388608) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Union_NullRegion_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("region", () => region.Union((Region)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Union_DisposedRegion_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Region().Union(region));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Union_SameRegion_ThrowsInvalidOperationException()
+ {
+ var region = new Region();
+ Assert.Throws<InvalidOperationException>(() => region.Union(region));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Union_TestData))]
+ public void Union_Rectangle_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Union(new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Union_TestData))]
+ public void Union_RectangleF_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Union(rect);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Union_TestData))]
+ public void Union_GraphicsPath_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ var path = new GraphicsPath();
+ path.AddRectangle(rect);
+ region.Union(path);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Union_EmptyPathWithInfiniteRegion_MakesInfinite()
+ {
+ var region = new Region();
+ region.Union(new GraphicsPath());
+ Assert.True(region.IsInfinite(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Union_NullGraphicsPath_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("path", () => region.Union((GraphicsPath)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Union_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Union(new GraphicsPath()));
+ Assert.Throws<ArgumentException>(null, () => region.Union(new Rectangle()));
+ Assert.Throws<ArgumentException>(null, () => region.Union(new RectangleF()));
+ Assert.Throws<ArgumentException>(null, () => region.Union(new Region()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Transform_EmptyMatrix_Nop()
+ {
+ var region = new Region(new RectangleF(1, 2, 3, 4));
+ region.Transform(new Matrix());
+ Assert.Equal(new RectangleF[] { new RectangleF(1, 2, 3, 4) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Transform_CustomMatrix_Success()
+ {
+ var matrix = new Matrix();
+ matrix.Translate(10, 11);
+ matrix.Scale(5, 6);
+
+ var region = new Region(new RectangleF(1, 2, 3, 4));
+ region.Transform(matrix);
+ Assert.Equal(new RectangleF[] { new RectangleF(15, 23, 15, 24) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(1, 2, 0, 0, 0)]
+ [InlineData(0, 0, 2, 2, 0)]
+ [InlineData(0, 0, 0.5, 0.5, 0)]
+ [InlineData(0, 0, 1, 1, 45)]
+ public void Transform_Infinity_Nop(int x, int y, float scaleX, float scaleY, int angle)
+ {
+ var matrix = new Matrix();
+ matrix.Translate(10, 11);
+ matrix.Scale(scaleX, scaleY);
+ matrix.Rotate(angle);
+
+ var region = new Region();
+ region.Transform(matrix);
+
+ Assert.True(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(-4194304, -4194304, 8388608, 8388608) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Tranform_InfinityIntersectScale_Success()
+ {
+ var matrix = new Matrix();
+ matrix.Scale(2, 0.5f);
+
+ var region = new Region();
+ region.Intersect(new Rectangle(-10, -10, 20, 20));
+ region.Transform(matrix);
+
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(-20, -5, 40, 10) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Tranform_InfinityIntersectTransform_Success()
+ {
+ var region = new Region();
+ region.Intersect(new Rectangle(-10, -10, 20, 20));
+ region.Transform(new Matrix(2, 0, 0, 0.5f, 10, 10));
+
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(-10, 5, 40, 10) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Transform_NullMatrix_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentNullException>("matrix", () => region.Transform(null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Transform_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Transform(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(0, 0)]
+ [InlineData(2, 3)]
+ [InlineData(-2, -3)]
+ public void Translate_Int_Success(float dx, float dy)
+ {
+ var region = new Region(new RectangleF(1, 2, 3, 4));
+ region.Translate(dx, dy);
+ Assert.Equal(new RectangleF[] { new RectangleF(1 + dx, 2 + dy, 3, 4) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Translate_IntInfinityIntersect_Success()
+ {
+ var region = new Region();
+ region.Intersect(new Rectangle(-10, -10, 20, 20));
+ region.Translate(10, 10);
+
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(0, 0, 20, 20) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(0, 0)]
+ [InlineData(2, 3)]
+ public void Translate_Float_Success(int dx, int dy)
+ {
+ var region = new Region(new RectangleF(1, 2, 3, 4));
+ region.Translate(dx, dy);
+ Assert.Equal(new RectangleF[] { new RectangleF(1 + dx, 2 + dy, 3, 4) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Translate_FloatInfinityIntersect_Success()
+ {
+ var region = new Region();
+ region.Intersect(new Rectangle(-10, -10, 20, 20));
+ region.Translate(10f, 10f);
+
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(0, 0, 20, 20) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Translate_Infinity_Nop()
+ {
+ var region = new Region();
+ region.Translate(10, 10);
+ region.Translate(10f, 10f);
+
+ Assert.True(region.IsInfinite(s_graphic));
+ Assert.Equal(new RectangleF[] { new RectangleF(-4194304, -4194304, 8388608, 8388608) }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [InlineData(float.MaxValue)]
+ [InlineData(float.MinValue)]
+ [InlineData(float.NaN)]
+ [InlineData(float.PositiveInfinity)]
+ [InlineData(float.NegativeInfinity)]
+ public void Translate_InvalidFloatValue_EmptiesRegion(float f)
+ {
+ var region = new Region(new RectangleF(1, 2, 3, 4));
+ region.Translate(f, 0);
+
+ Assert.True(region.IsEmpty(s_graphic));
+ Assert.False(region.IsInfinite(s_graphic));
+ Assert.Empty(region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Translate_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Translate(1, 2));
+ Assert.Throws<ArgumentException>(null, () => region.Translate(1f, 2f));
+ }
+
+ public static IEnumerable<object[]> Xor_TestData()
+ {
+ yield return new object[]
+ {
+ new Region(new RectangleF(500, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) },
+ new RectangleF[0]
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(500, 30, 60, 80)),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(0, 0, 0, 0)),
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) },
+ new RectangleF[] { new RectangleF(500, 30, 60, 80) }
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { new RectangleF(520, 40, 60, 80) },
+ new RectangleF[]
+ {
+ new RectangleF(-4194304, -4194304, 8388608, 4194344),
+ new RectangleF(-4194304, 40, 4194824, 80),
+ new RectangleF(580, 40, 4193724, 80),
+ new RectangleF(-4194304, 120, 8388608, 4194184)
+ }
+ };
+
+ yield return new object[]
+ {
+ new Region(),
+ new RectangleF[] { RectangleF.Empty },
+ new RectangleF[] { new Rectangle(-4194304, -4194304, 8388608, 8388608) }
+ };
+
+ yield return new object[]
+ {
+ new Region(new RectangleF(380, 30, 60, 80)),
+ new RectangleF[] { new RectangleF(410, 40, 60, 80) },
+ new RectangleF[]
+ {
+ new RectangleF(380, 30, 60, 10),
+ new RectangleF(380, 40, 30, 70),
+ new RectangleF(440, 40, 30, 70),
+ new RectangleF(410, 110, 60, 10)
+ }
+ };
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Xor_TestData))]
+ public void Xor_Region_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Xor(new Region(rect));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Xor_InfiniteRegion_Success()
+ {
+ var region = new Region(new Rectangle(1, 2, 3, 4));
+ region.Xor(new Region());
+
+ Assert.Equal(new RectangleF[]
+ {
+ new RectangleF(-4194304, -4194304, 8388608, 4194306),
+ new RectangleF(-4194304, 2, 4194305, 4),
+ new RectangleF(4, 2, 4194300, 4),
+ new RectangleF(-4194304, 6, 8388608, 4194298)
+ }, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Xor_NullRegion_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("region", () => region.Xor((Region)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Xor_DisposedRegion_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => new Region().Xor(region));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Xor_SameRegion_ThrowsInvalidOperationException()
+ {
+ var region = new Region();
+ Assert.Throws<InvalidOperationException>(() => region.Xor(region));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Xor_TestData))]
+ public void Xor_Rectangle_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Xor(new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height));
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Xor_TestData))]
+ public void Xor_RectangleF_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ region.Xor(rect);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(Xor_TestData))]
+ public void Xor_GraphicsPath_Success(Region region, RectangleF[] rectangles, RectangleF[] expectedScans)
+ {
+ foreach (RectangleF rect in rectangles)
+ {
+ var path = new GraphicsPath();
+ path.AddRectangle(rect);
+ region.Xor(path);
+ }
+ Assert.Equal(expectedScans, region.GetRegionScans(new Matrix()));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Xor_EmptyPathWithInfiniteRegion_MakesInfinite()
+ {
+ var region = new Region();
+ region.Xor(new GraphicsPath());
+ Assert.True(region.IsInfinite(s_graphic));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Xor_NullGraphicsPath_ThrowsArgumentNullException()
+ {
+ var region = new Region();
+ Assert.Throws<ArgumentNullException>("path", () => region.Xor((GraphicsPath)null));
+ }
+
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ public void Xor_Disposed_ThrowsArgumentException()
+ {
+ var region = new Region();
+ region.Dispose();
+ Assert.Throws<ArgumentException>(null, () => region.Xor(new GraphicsPath()));
+ Assert.Throws<ArgumentException>(null, () => region.Xor(new Rectangle()));
+ Assert.Throws<ArgumentException>(null, () => region.Xor(new RectangleF()));
+ Assert.Throws<ArgumentException>(null, () => region.Xor(new Region()));
+ }
+ }
+}
diff --git a/src/System.Drawing.Common/tests/System.Drawing.Common.Tests.csproj b/src/System.Drawing.Common/tests/System.Drawing.Common.Tests.csproj
index 8000402caa..ed4af49a34 100644
--- a/src/System.Drawing.Common/tests/System.Drawing.Common.Tests.csproj
+++ b/src/System.Drawing.Common/tests/System.Drawing.Common.Tests.csproj
@@ -8,14 +8,24 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Release|AnyCPU'" />
<ItemGroup>
+ <Compile Include="BrushesTests.cs" />
+ <Compile Include="ColorTranslatorTests.cs" />
<Compile Include="Helpers.cs" />
<Compile Include="IconTests.cs" />
+ <Compile Include="PensTests.cs" />
+ <Compile Include="RegionTests.cs" />
+ <Compile Include="SystemBrushesTests.cs" />
+ <Compile Include="SystemPensTest.cs" />
+ <Compile Include="Drawing2D\MatrixTests.cs" />
<Compile Include="$(CommonTestPath)\System\Diagnostics\DebuggerAttributes.cs">
<Link>Common\System\Diagnostics\DebuggerAttributes.cs</Link>
</Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
+ <Compile Include="$(CommonTestPath)\System\ThreadCultureChange.cs">
+ <Link>Common\System\ThreadCultureChange.cs</Link>
+ </Compile>
</ItemGroup>
<ItemGroup>
<Content Include="bitmaps\16x16_one_entry_4bit.ico">
diff --git a/src/System.Drawing.Common/tests/SystemBrushesTests.cs b/src/System.Drawing.Common/tests/SystemBrushesTests.cs
new file mode 100644
index 0000000000..0fec9d3c62
--- /dev/null
+++ b/src/System.Drawing.Common/tests/SystemBrushesTests.cs
@@ -0,0 +1,69 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Drawing.Drawing2D;
+using System.Reflection;
+using Xunit;
+
+namespace System.Drawing.Tests
+{
+ public class SystemBrushesTests
+ {
+ public static IEnumerable<object[]> SystemBrushes_TestData()
+ {
+ yield return Brush(() => SystemBrushes.ActiveBorder, SystemColors.ActiveBorder);
+ yield return Brush(() => SystemBrushes.ActiveCaption, SystemColors.ActiveCaption);
+ yield return Brush(() => SystemBrushes.ActiveCaptionText, SystemColors.ActiveCaptionText);
+ yield return Brush(() => SystemBrushes.AppWorkspace, SystemColors.AppWorkspace);
+ yield return Brush(() => SystemBrushes.ButtonFace, SystemColors.ButtonFace);
+ yield return Brush(() => SystemBrushes.ButtonHighlight, SystemColors.ButtonHighlight);
+ yield return Brush(() => SystemBrushes.ButtonShadow, SystemColors.ButtonShadow);
+ yield return Brush(() => SystemBrushes.Control, SystemColors.Control);
+ yield return Brush(() => SystemBrushes.ControlDark, SystemColors.ControlDark);
+ yield return Brush(() => SystemBrushes.ControlDarkDark, SystemColors.ControlDarkDark);
+ yield return Brush(() => SystemBrushes.ControlLight, SystemColors.ControlLight);
+ yield return Brush(() => SystemBrushes.ControlLightLight, SystemColors.ControlLightLight);
+ yield return Brush(() => SystemBrushes.ControlText, SystemColors.ControlText);
+ yield return Brush(() => SystemBrushes.Desktop, SystemColors.Desktop);
+ yield return Brush(() => SystemBrushes.GradientActiveCaption, SystemColors.GradientActiveCaption);
+ yield return Brush(() => SystemBrushes.GradientInactiveCaption, SystemColors.GradientInactiveCaption);
+ yield return Brush(() => SystemBrushes.GrayText, SystemColors.GrayText);
+ yield return Brush(() => SystemBrushes.Highlight, SystemColors.Highlight);
+ yield return Brush(() => SystemBrushes.HighlightText, SystemColors.HighlightText);
+ yield return Brush(() => SystemBrushes.HotTrack, SystemColors.HotTrack);
+ yield return Brush(() => SystemBrushes.InactiveBorder, SystemColors.InactiveBorder);
+ yield return Brush(() => SystemBrushes.InactiveCaption, SystemColors.InactiveCaption);
+ yield return Brush(() => SystemBrushes.InactiveCaptionText, SystemColors.InactiveCaptionText);
+ yield return Brush(() => SystemBrushes.Info, SystemColors.Info);
+ yield return Brush(() => SystemBrushes.InfoText, SystemColors.InfoText);
+ yield return Brush(() => SystemBrushes.Menu, SystemColors.Menu);
+ yield return Brush(() => SystemBrushes.MenuBar, SystemColors.MenuBar);
+ yield return Brush(() => SystemBrushes.MenuHighlight, SystemColors.MenuHighlight);
+ yield return Brush(() => SystemBrushes.MenuText, SystemColors.MenuText);
+ yield return Brush(() => SystemBrushes.ScrollBar, SystemColors.ScrollBar);
+ yield return Brush(() => SystemBrushes.Window, SystemColors.Window);
+ yield return Brush(() => SystemBrushes.WindowFrame, SystemColors.WindowFrame);
+ yield return Brush(() => SystemBrushes.WindowText, SystemColors.WindowText);
+ }
+
+ public static object[] Brush(Func<Brush> brushThunk, Color expectedColor) => new object[] { brushThunk, expectedColor };
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(SystemBrushes_TestData))]
+ public void SystemBrushes_Get_ReturnsExpected(Func<Brush> brushThunk, Color expectedColor)
+ {
+ SolidBrush brush = Assert.IsType<SolidBrush>(brushThunk());
+ Assert.Equal(expectedColor, brush.Color);
+ Assert.Throws<ArgumentException>(null, () => brush.Color = Color.Red);
+
+ Assert.Same(brush, brushThunk());
+ }
+
+ [Fact]
+ public void FromSystemColor_NotSystemColor_ThrowsArgumentException()
+ {
+ Assert.Throws<ArgumentException>(null, () => SystemBrushes.FromSystemColor(Color.Blue));
+ }
+ }
+}
diff --git a/src/System.Drawing.Common/tests/SystemPensTest.cs b/src/System.Drawing.Common/tests/SystemPensTest.cs
new file mode 100644
index 0000000000..d7f1e4cfd2
--- /dev/null
+++ b/src/System.Drawing.Common/tests/SystemPensTest.cs
@@ -0,0 +1,70 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Drawing.Drawing2D;
+using System.Reflection;
+using Xunit;
+
+namespace System.Drawing.Tests
+{
+ public class SystemPensTests
+ {
+ public static IEnumerable<object[]> SystemPens_TestData()
+ {
+ yield return Pen(() => SystemPens.ActiveBorder, SystemColors.ActiveBorder);
+ yield return Pen(() => SystemPens.ActiveCaption, SystemColors.ActiveCaption);
+ yield return Pen(() => SystemPens.ActiveCaptionText, SystemColors.ActiveCaptionText);
+ yield return Pen(() => SystemPens.AppWorkspace, SystemColors.AppWorkspace);
+ yield return Pen(() => SystemPens.ButtonFace, SystemColors.ButtonFace);
+ yield return Pen(() => SystemPens.ButtonHighlight, SystemColors.ButtonHighlight);
+ yield return Pen(() => SystemPens.ButtonShadow, SystemColors.ButtonShadow);
+ yield return Pen(() => SystemPens.Control, SystemColors.Control);
+ yield return Pen(() => SystemPens.ControlDark, SystemColors.ControlDark);
+ yield return Pen(() => SystemPens.ControlDarkDark, SystemColors.ControlDarkDark);
+ yield return Pen(() => SystemPens.ControlLight, SystemColors.ControlLight);
+ yield return Pen(() => SystemPens.ControlLightLight, SystemColors.ControlLightLight);
+ yield return Pen(() => SystemPens.ControlText, SystemColors.ControlText);
+ yield return Pen(() => SystemPens.Desktop, SystemColors.Desktop);
+ yield return Pen(() => SystemPens.GradientActiveCaption, SystemColors.GradientActiveCaption);
+ yield return Pen(() => SystemPens.GradientInactiveCaption, SystemColors.GradientInactiveCaption);
+ yield return Pen(() => SystemPens.GrayText, SystemColors.GrayText);
+ yield return Pen(() => SystemPens.Highlight, SystemColors.Highlight);
+ yield return Pen(() => SystemPens.HighlightText, SystemColors.HighlightText);
+ yield return Pen(() => SystemPens.HotTrack, SystemColors.HotTrack);
+ yield return Pen(() => SystemPens.InactiveBorder, SystemColors.InactiveBorder);
+ yield return Pen(() => SystemPens.InactiveCaption, SystemColors.InactiveCaption);
+ yield return Pen(() => SystemPens.InactiveCaptionText, SystemColors.InactiveCaptionText);
+ yield return Pen(() => SystemPens.Info, SystemColors.Info);
+ yield return Pen(() => SystemPens.InfoText, SystemColors.InfoText);
+ yield return Pen(() => SystemPens.Menu, SystemColors.Menu);
+ yield return Pen(() => SystemPens.MenuBar, SystemColors.MenuBar);
+ yield return Pen(() => SystemPens.MenuHighlight, SystemColors.MenuHighlight);
+ yield return Pen(() => SystemPens.MenuText, SystemColors.MenuText);
+ yield return Pen(() => SystemPens.ScrollBar, SystemColors.ScrollBar);
+ yield return Pen(() => SystemPens.Window, SystemColors.Window);
+ yield return Pen(() => SystemPens.WindowFrame, SystemColors.WindowFrame);
+ yield return Pen(() => SystemPens.WindowText, SystemColors.WindowText);
+ }
+
+ public static object[] Pen(Func<Pen> penThunk, Color expectedColor) => new object[] { penThunk, expectedColor };
+
+ [ConditionalTheory(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsNotWindowsNanoServer))]
+ [MemberData(nameof(SystemPens_TestData))]
+ public void SystemPens_Get_ReturnsExpected(Func<Pen> penThunk, Color expectedColor)
+ {
+ Pen pen = penThunk();
+ Assert.Equal(expectedColor, pen.Color);
+ Assert.Equal(PenType.SolidColor, pen.PenType);
+ Assert.Throws<ArgumentException>(null, () => pen.Color = Color.AliceBlue);
+
+ Assert.Same(pen, penThunk());
+ }
+
+ [Fact]
+ public void FromSystemColor_NotSystemColor_ThrowsArgumentException()
+ {
+ Assert.Throws<ArgumentException>(null, () => SystemPens.FromSystemColor(Color.Blue));
+ }
+ }
+}
diff --git a/src/System.Drawing.Primitives/System.Drawing.Primitives.sln b/src/System.Drawing.Primitives/System.Drawing.Primitives.sln
index 0404b31543..a846aea85d 100644
--- a/src/System.Drawing.Primitives/System.Drawing.Primitives.sln
+++ b/src/System.Drawing.Primitives/System.Drawing.Primitives.sln
@@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Drawing.Primitives.Tests", "tests\System.Drawing.Primitives.Tests.csproj", "{297A9116-1005-499D-A895-2063D03E4C94}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Drawing.Primitives.Tests", "tests\System.Drawing.Primitives.Tests.csproj", "{CF54638C-A382-4A78-9AD6-2304CEEFEB01}"
ProjectSection(ProjectDependencies) = postProject
{8F472B93-574C-4AEC-9D28-6C2360A55BBF} = {8F472B93-574C-4AEC-9D28-6C2360A55BBF}
EndProjectSection
@@ -26,14 +26,14 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {297A9116-1005-499D-A895-2063D03E4C94}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
- {297A9116-1005-499D-A895-2063D03E4C94}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
- {297A9116-1005-499D-A895-2063D03E4C94}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
- {297A9116-1005-499D-A895-2063D03E4C94}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
- {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
- {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
- {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
- {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
+ {CF54638C-A382-4A78-9AD6-2304CEEFEB01}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
+ {CF54638C-A382-4A78-9AD6-2304CEEFEB01}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
+ {CF54638C-A382-4A78-9AD6-2304CEEFEB01}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
+ {CF54638C-A382-4A78-9AD6-2304CEEFEB01}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
+ {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Debug|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Debug|Any CPU
+ {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Debug|Any CPU.Build.0 = netcoreapp-Windows_NT-Debug|Any CPU
+ {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Release|Any CPU.ActiveCfg = netcoreapp-Windows_NT-Release|Any CPU
+ {8F472B93-574C-4AEC-9D28-6C2360A55BBF}.Release|Any CPU.Build.0 = netcoreapp-Windows_NT-Release|Any CPU
{10F74537-6423-48F5-A7F3-4DE94E42AF8F}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
{10F74537-6423-48F5-A7F3-4DE94E42AF8F}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
{10F74537-6423-48F5-A7F3-4DE94E42AF8F}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
@@ -43,7 +43,7 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {297A9116-1005-499D-A895-2063D03E4C94} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
+ {CF54638C-A382-4A78-9AD6-2304CEEFEB01} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{8F472B93-574C-4AEC-9D28-6C2360A55BBF} = {E107E9C1-E893-4E87-987E-04EF0DCEAEFD}
{10F74537-6423-48F5-A7F3-4DE94E42AF8F} = {2E666815-2EDB-464B-9DF6-380BF4789AD4}
EndGlobalSection
diff --git a/src/System.Drawing.Primitives/src/Configurations.props b/src/System.Drawing.Primitives/src/Configurations.props
index a8910ef718..bbb5be814e 100644
--- a/src/System.Drawing.Primitives/src/Configurations.props
+++ b/src/System.Drawing.Primitives/src/Configurations.props
@@ -3,7 +3,8 @@
<PropertyGroup>
<BuildConfigurations>
uap-Windows_NT;
- netcoreapp;
+ netcoreapp-Windows_NT;
+ netcoreapp-Unix;
</BuildConfigurations>
</PropertyGroup>
</Project> \ No newline at end of file
diff --git a/src/System.Drawing.Primitives/src/System.Drawing.Primitives.csproj b/src/System.Drawing.Primitives/src/System.Drawing.Primitives.csproj
index 0cd290b3b9..2b49c5a61a 100644
--- a/src/System.Drawing.Primitives/src/System.Drawing.Primitives.csproj
+++ b/src/System.Drawing.Primitives/src/System.Drawing.Primitives.csproj
@@ -6,9 +6,14 @@
<RootNamespace>System.Drawing</RootNamespace>
<AssemblyName>System.Drawing.Primitives</AssemblyName>
<ProjectGuid>{8F472B93-574C-4AEC-9D28-6C2360A55BBF}</ProjectGuid>
+ <DefineConstants Condition="'$(TargetsWindows)' == 'true' And '$(TargetGroup)' != 'uap'">$(DefineConstants);FEATURE_WINDOWS_SYSTEM_COLORS</DefineConstants>
+ <!-- This library contains PInvokes that cannot be used on OneCore. -->
+ <EnablePInvokeAnalyzer>false</EnablePInvokeAnalyzer>
</PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Debug|AnyCPU'" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Unix-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Unix-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Windows_NT-Release|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Release|AnyCPU'" />
<ItemGroup>
@@ -19,6 +24,7 @@
<Reference Include="System.Resources.ResourceManager" />
<Reference Include="System.Runtime" />
<Reference Include="System.Runtime.Extensions" />
+ <Reference Include="System.Runtime.InteropServices" />
<Reference Include="System.ComponentModel.Primitives" />
</ItemGroup>
<ItemGroup>
@@ -32,11 +38,25 @@
<Compile Include="$(CommonPath)\System\Drawing\ColorTable.cs">
<Link>System\Drawing\ColorTable.cs</Link>
</Compile>
+ <Compile Include="$(CommonPath)\System\Drawing\KnownColorTable.cs">
+ <Link>System\Drawing\KnownColorTable.cs</Link>
+ </Compile>
<Compile Include="$(CommonPath)\System\Numerics\Hashing\HashHelpers.cs">
<Link>Common\System\Numerics\Hashing\HashHelpers.cs</Link>
</Compile>
<Compile Include="System\Drawing\KnownColor.cs" />
- <Compile Include="System\Drawing\KnownColorTable.cs" />
+ </ItemGroup>
+ <!-- System color features require Win32 PInvoke's which are disallowed in UAP. -->
+ <ItemGroup Condition="'$(TargetsWindows)' == 'true' And '$(TargetGroup)' != 'uap'">
+ <Compile Include="$(CommonPath)\Interop\Windows\Interop.Libraries.cs">
+ <Link>Common\Interop\Windows\Interop.Libraries.cs</Link>
+ </Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.GetSysColor.cs">
+ <Link>Common\Interop\Windows\user32\Interop.GetSysColor.cs</Link>
+ </Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\user32\Interop.Win32SystemColors.cs">
+ <Link>Common\Interop\Windows\user32\Interop.Win32SystemColors.cs</Link>
+ </Compile>
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/Color.cs b/src/System.Drawing.Primitives/src/System/Drawing/Color.cs
index 6bfe096c01..e5fd831d7f 100644
--- a/src/System.Drawing.Primitives/src/System/Drawing/Color.cs
+++ b/src/System.Drawing.Primitives/src/System/Drawing/Color.cs
@@ -11,7 +11,7 @@ namespace System.Drawing
[DebuggerDisplay("{NameAndARGBValue}")]
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, PublicKeyToken=b03f5f7f11d50a3a")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
#endif
public struct Color : IEquatable<Color>
{
@@ -327,19 +327,19 @@ namespace System.Drawing
// user supplied name of color. Will not be filled in if
// we map to a "knowncolor"
//
- private readonly string name;
+ private readonly string name; // Do not rename (binary serialization)
// will contain standard 32bit sRGB (ARGB)
//
- private readonly long value;
+ private readonly long value; // Do not rename (binary serialization)
// ignored, unless "state" says it is valid
//
- private readonly short knownColor;
+ private readonly short knownColor; // Do not rename (binary serialization)
// implementation specific information
//
- private readonly short state;
+ private readonly short state; // Do not rename (binary serialization)
internal Color(KnownColor knownColor)
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/KnownColorTable.cs b/src/System.Drawing.Primitives/src/System/Drawing/KnownColorTable.cs
deleted file mode 100644
index 390e695844..0000000000
--- a/src/System.Drawing.Primitives/src/System/Drawing/KnownColorTable.cs
+++ /dev/null
@@ -1,358 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-namespace System.Drawing
-{
- internal static class KnownColorTable
- {
- private static int[] s_colorTable;
- private static string[] s_colorNameTable;
-
- private static void EnsureColorTable()
- {
- // no need to lock... worse case is a double create of the table...
- //
- if (s_colorTable == null)
- {
- InitColorTable();
- }
- }
-
- private static void InitColorTable()
- {
- int[] values = new int[KnownColor.LastColor - KnownColor.FirstColor + 1];
-
- // just consts...
- //
- values[(int)KnownColor.Transparent] = 0x00FFFFFF;
- values[(int)KnownColor.AliceBlue] = unchecked((int)0xFFF0F8FF);
- values[(int)KnownColor.AntiqueWhite] = unchecked((int)0xFFFAEBD7);
- values[(int)KnownColor.Aqua] = unchecked((int)0xFF00FFFF);
- values[(int)KnownColor.Aquamarine] = unchecked((int)0xFF7FFFD4);
- values[(int)KnownColor.Azure] = unchecked((int)0xFFF0FFFF);
- values[(int)KnownColor.Beige] = unchecked((int)0xFFF5F5DC);
- values[(int)KnownColor.Bisque] = unchecked((int)0xFFFFE4C4);
- values[(int)KnownColor.Black] = unchecked((int)0xFF000000);
- values[(int)KnownColor.BlanchedAlmond] = unchecked((int)0xFFFFEBCD);
- values[(int)KnownColor.Blue] = unchecked((int)0xFF0000FF);
- values[(int)KnownColor.BlueViolet] = unchecked((int)0xFF8A2BE2);
- values[(int)KnownColor.Brown] = unchecked((int)0xFFA52A2A);
- values[(int)KnownColor.BurlyWood] = unchecked((int)0xFFDEB887);
- values[(int)KnownColor.CadetBlue] = unchecked((int)0xFF5F9EA0);
- values[(int)KnownColor.Chartreuse] = unchecked((int)0xFF7FFF00);
- values[(int)KnownColor.Chocolate] = unchecked((int)0xFFD2691E);
- values[(int)KnownColor.Coral] = unchecked((int)0xFFFF7F50);
- values[(int)KnownColor.CornflowerBlue] = unchecked((int)0xFF6495ED);
- values[(int)KnownColor.Cornsilk] = unchecked((int)0xFFFFF8DC);
- values[(int)KnownColor.Crimson] = unchecked((int)0xFFDC143C);
- values[(int)KnownColor.Cyan] = unchecked((int)0xFF00FFFF);
- values[(int)KnownColor.DarkBlue] = unchecked((int)0xFF00008B);
- values[(int)KnownColor.DarkCyan] = unchecked((int)0xFF008B8B);
- values[(int)KnownColor.DarkGoldenrod] = unchecked((int)0xFFB8860B);
- values[(int)KnownColor.DarkGray] = unchecked((int)0xFFA9A9A9);
- values[(int)KnownColor.DarkGreen] = unchecked((int)0xFF006400);
- values[(int)KnownColor.DarkKhaki] = unchecked((int)0xFFBDB76B);
- values[(int)KnownColor.DarkMagenta] = unchecked((int)0xFF8B008B);
- values[(int)KnownColor.DarkOliveGreen] = unchecked((int)0xFF556B2F);
- values[(int)KnownColor.DarkOrange] = unchecked((int)0xFFFF8C00);
- values[(int)KnownColor.DarkOrchid] = unchecked((int)0xFF9932CC);
- values[(int)KnownColor.DarkRed] = unchecked((int)0xFF8B0000);
- values[(int)KnownColor.DarkSalmon] = unchecked((int)0xFFE9967A);
- values[(int)KnownColor.DarkSeaGreen] = unchecked((int)0xFF8FBC8B);
- values[(int)KnownColor.DarkSlateBlue] = unchecked((int)0xFF483D8B);
- values[(int)KnownColor.DarkSlateGray] = unchecked((int)0xFF2F4F4F);
- values[(int)KnownColor.DarkTurquoise] = unchecked((int)0xFF00CED1);
- values[(int)KnownColor.DarkViolet] = unchecked((int)0xFF9400D3);
- values[(int)KnownColor.DeepPink] = unchecked((int)0xFFFF1493);
- values[(int)KnownColor.DeepSkyBlue] = unchecked((int)0xFF00BFFF);
- values[(int)KnownColor.DimGray] = unchecked((int)0xFF696969);
- values[(int)KnownColor.DodgerBlue] = unchecked((int)0xFF1E90FF);
- values[(int)KnownColor.Firebrick] = unchecked((int)0xFFB22222);
- values[(int)KnownColor.FloralWhite] = unchecked((int)0xFFFFFAF0);
- values[(int)KnownColor.ForestGreen] = unchecked((int)0xFF228B22);
- values[(int)KnownColor.Fuchsia] = unchecked((int)0xFFFF00FF);
- values[(int)KnownColor.Gainsboro] = unchecked((int)0xFFDCDCDC);
- values[(int)KnownColor.GhostWhite] = unchecked((int)0xFFF8F8FF);
- values[(int)KnownColor.Gold] = unchecked((int)0xFFFFD700);
- values[(int)KnownColor.Goldenrod] = unchecked((int)0xFFDAA520);
- values[(int)KnownColor.Gray] = unchecked((int)0xFF808080);
- values[(int)KnownColor.Green] = unchecked((int)0xFF008000);
- values[(int)KnownColor.GreenYellow] = unchecked((int)0xFFADFF2F);
- values[(int)KnownColor.Honeydew] = unchecked((int)0xFFF0FFF0);
- values[(int)KnownColor.HotPink] = unchecked((int)0xFFFF69B4);
- values[(int)KnownColor.IndianRed] = unchecked((int)0xFFCD5C5C);
- values[(int)KnownColor.Indigo] = unchecked((int)0xFF4B0082);
- values[(int)KnownColor.Ivory] = unchecked((int)0xFFFFFFF0);
- values[(int)KnownColor.Khaki] = unchecked((int)0xFFF0E68C);
- values[(int)KnownColor.Lavender] = unchecked((int)0xFFE6E6FA);
- values[(int)KnownColor.LavenderBlush] = unchecked((int)0xFFFFF0F5);
- values[(int)KnownColor.LawnGreen] = unchecked((int)0xFF7CFC00);
- values[(int)KnownColor.LemonChiffon] = unchecked((int)0xFFFFFACD);
- values[(int)KnownColor.LightBlue] = unchecked((int)0xFFADD8E6);
- values[(int)KnownColor.LightCoral] = unchecked((int)0xFFF08080);
- values[(int)KnownColor.LightCyan] = unchecked((int)0xFFE0FFFF);
- values[(int)KnownColor.LightGoldenrodYellow] = unchecked((int)0xFFFAFAD2);
- values[(int)KnownColor.LightGray] = unchecked((int)0xFFD3D3D3);
- values[(int)KnownColor.LightGreen] = unchecked((int)0xFF90EE90);
- values[(int)KnownColor.LightPink] = unchecked((int)0xFFFFB6C1);
- values[(int)KnownColor.LightSalmon] = unchecked((int)0xFFFFA07A);
- values[(int)KnownColor.LightSeaGreen] = unchecked((int)0xFF20B2AA);
- values[(int)KnownColor.LightSkyBlue] = unchecked((int)0xFF87CEFA);
- values[(int)KnownColor.LightSlateGray] = unchecked((int)0xFF778899);
- values[(int)KnownColor.LightSteelBlue] = unchecked((int)0xFFB0C4DE);
- values[(int)KnownColor.LightYellow] = unchecked((int)0xFFFFFFE0);
- values[(int)KnownColor.Lime] = unchecked((int)0xFF00FF00);
- values[(int)KnownColor.LimeGreen] = unchecked((int)0xFF32CD32);
- values[(int)KnownColor.Linen] = unchecked((int)0xFFFAF0E6);
- values[(int)KnownColor.Magenta] = unchecked((int)0xFFFF00FF);
- values[(int)KnownColor.Maroon] = unchecked((int)0xFF800000);
- values[(int)KnownColor.MediumAquamarine] = unchecked((int)0xFF66CDAA);
- values[(int)KnownColor.MediumBlue] = unchecked((int)0xFF0000CD);
- values[(int)KnownColor.MediumOrchid] = unchecked((int)0xFFBA55D3);
- values[(int)KnownColor.MediumPurple] = unchecked((int)0xFF9370DB);
- values[(int)KnownColor.MediumSeaGreen] = unchecked((int)0xFF3CB371);
- values[(int)KnownColor.MediumSlateBlue] = unchecked((int)0xFF7B68EE);
- values[(int)KnownColor.MediumSpringGreen] = unchecked((int)0xFF00FA9A);
- values[(int)KnownColor.MediumTurquoise] = unchecked((int)0xFF48D1CC);
- values[(int)KnownColor.MediumVioletRed] = unchecked((int)0xFFC71585);
- values[(int)KnownColor.MidnightBlue] = unchecked((int)0xFF191970);
- values[(int)KnownColor.MintCream] = unchecked((int)0xFFF5FFFA);
- values[(int)KnownColor.MistyRose] = unchecked((int)0xFFFFE4E1);
- values[(int)KnownColor.Moccasin] = unchecked((int)0xFFFFE4B5);
- values[(int)KnownColor.NavajoWhite] = unchecked((int)0xFFFFDEAD);
- values[(int)KnownColor.Navy] = unchecked((int)0xFF000080);
- values[(int)KnownColor.OldLace] = unchecked((int)0xFFFDF5E6);
- values[(int)KnownColor.Olive] = unchecked((int)0xFF808000);
- values[(int)KnownColor.OliveDrab] = unchecked((int)0xFF6B8E23);
- values[(int)KnownColor.Orange] = unchecked((int)0xFFFFA500);
- values[(int)KnownColor.OrangeRed] = unchecked((int)0xFFFF4500);
- values[(int)KnownColor.Orchid] = unchecked((int)0xFFDA70D6);
- values[(int)KnownColor.PaleGoldenrod] = unchecked((int)0xFFEEE8AA);
- values[(int)KnownColor.PaleGreen] = unchecked((int)0xFF98FB98);
- values[(int)KnownColor.PaleTurquoise] = unchecked((int)0xFFAFEEEE);
- values[(int)KnownColor.PaleVioletRed] = unchecked((int)0xFFDB7093);
- values[(int)KnownColor.PapayaWhip] = unchecked((int)0xFFFFEFD5);
- values[(int)KnownColor.PeachPuff] = unchecked((int)0xFFFFDAB9);
- values[(int)KnownColor.Peru] = unchecked((int)0xFFCD853F);
- values[(int)KnownColor.Pink] = unchecked((int)0xFFFFC0CB);
- values[(int)KnownColor.Plum] = unchecked((int)0xFFDDA0DD);
- values[(int)KnownColor.PowderBlue] = unchecked((int)0xFFB0E0E6);
- values[(int)KnownColor.Purple] = unchecked((int)0xFF800080);
- values[(int)KnownColor.Red] = unchecked((int)0xFFFF0000);
- values[(int)KnownColor.RosyBrown] = unchecked((int)0xFFBC8F8F);
- values[(int)KnownColor.RoyalBlue] = unchecked((int)0xFF4169E1);
- values[(int)KnownColor.SaddleBrown] = unchecked((int)0xFF8B4513);
- values[(int)KnownColor.Salmon] = unchecked((int)0xFFFA8072);
- values[(int)KnownColor.SandyBrown] = unchecked((int)0xFFF4A460);
- values[(int)KnownColor.SeaGreen] = unchecked((int)0xFF2E8B57);
- values[(int)KnownColor.SeaShell] = unchecked((int)0xFFFFF5EE);
- values[(int)KnownColor.Sienna] = unchecked((int)0xFFA0522D);
- values[(int)KnownColor.Silver] = unchecked((int)0xFFC0C0C0);
- values[(int)KnownColor.SkyBlue] = unchecked((int)0xFF87CEEB);
- values[(int)KnownColor.SlateBlue] = unchecked((int)0xFF6A5ACD);
- values[(int)KnownColor.SlateGray] = unchecked((int)0xFF708090);
- values[(int)KnownColor.Snow] = unchecked((int)0xFFFFFAFA);
- values[(int)KnownColor.SpringGreen] = unchecked((int)0xFF00FF7F);
- values[(int)KnownColor.SteelBlue] = unchecked((int)0xFF4682B4);
- values[(int)KnownColor.Tan] = unchecked((int)0xFFD2B48C);
- values[(int)KnownColor.Teal] = unchecked((int)0xFF008080);
- values[(int)KnownColor.Thistle] = unchecked((int)0xFFD8BFD8);
- values[(int)KnownColor.Tomato] = unchecked((int)0xFFFF6347);
- values[(int)KnownColor.Turquoise] = unchecked((int)0xFF40E0D0);
- values[(int)KnownColor.Violet] = unchecked((int)0xFFEE82EE);
- values[(int)KnownColor.Wheat] = unchecked((int)0xFFF5DEB3);
- values[(int)KnownColor.White] = unchecked((int)0xFFFFFFFF);
- values[(int)KnownColor.WhiteSmoke] = unchecked((int)0xFFF5F5F5);
- values[(int)KnownColor.Yellow] = unchecked((int)0xFFFFFF00);
- values[(int)KnownColor.YellowGreen] = unchecked((int)0xFF9ACD32);
- s_colorTable = values;
- }
-
- private static void EnsureColorNameTable()
- {
- // no need to lock... worse case is a double create of the table...
- //
- if (s_colorNameTable == null)
- {
- InitColorNameTable();
- }
- }
-
- private static void InitColorNameTable()
- {
- string[] values = new string[KnownColor.LastColor - KnownColor.FirstColor + 1];
-
- // just consts...
- //
- values[(int)KnownColor.Transparent] = "Transparent";
- values[(int)KnownColor.AliceBlue] = "AliceBlue";
- values[(int)KnownColor.AntiqueWhite] = "AntiqueWhite";
- values[(int)KnownColor.Aqua] = "Aqua";
- values[(int)KnownColor.Aquamarine] = "Aquamarine";
- values[(int)KnownColor.Azure] = "Azure";
- values[(int)KnownColor.Beige] = "Beige";
- values[(int)KnownColor.Bisque] = "Bisque";
- values[(int)KnownColor.Black] = "Black";
- values[(int)KnownColor.BlanchedAlmond] = "BlanchedAlmond";
- values[(int)KnownColor.Blue] = "Blue";
- values[(int)KnownColor.BlueViolet] = "BlueViolet";
- values[(int)KnownColor.Brown] = "Brown";
- values[(int)KnownColor.BurlyWood] = "BurlyWood";
- values[(int)KnownColor.CadetBlue] = "CadetBlue";
- values[(int)KnownColor.Chartreuse] = "Chartreuse";
- values[(int)KnownColor.Chocolate] = "Chocolate";
- values[(int)KnownColor.Coral] = "Coral";
- values[(int)KnownColor.CornflowerBlue] = "CornflowerBlue";
- values[(int)KnownColor.Cornsilk] = "Cornsilk";
- values[(int)KnownColor.Crimson] = "Crimson";
- values[(int)KnownColor.Cyan] = "Cyan";
- values[(int)KnownColor.DarkBlue] = "DarkBlue";
- values[(int)KnownColor.DarkCyan] = "DarkCyan";
- values[(int)KnownColor.DarkGoldenrod] = "DarkGoldenrod";
- values[(int)KnownColor.DarkGray] = "DarkGray";
- values[(int)KnownColor.DarkGreen] = "DarkGreen";
- values[(int)KnownColor.DarkKhaki] = "DarkKhaki";
- values[(int)KnownColor.DarkMagenta] = "DarkMagenta";
- values[(int)KnownColor.DarkOliveGreen] = "DarkOliveGreen";
- values[(int)KnownColor.DarkOrange] = "DarkOrange";
- values[(int)KnownColor.DarkOrchid] = "DarkOrchid";
- values[(int)KnownColor.DarkRed] = "DarkRed";
- values[(int)KnownColor.DarkSalmon] = "DarkSalmon";
- values[(int)KnownColor.DarkSeaGreen] = "DarkSeaGreen";
- values[(int)KnownColor.DarkSlateBlue] = "DarkSlateBlue";
- values[(int)KnownColor.DarkSlateGray] = "DarkSlateGray";
- values[(int)KnownColor.DarkTurquoise] = "DarkTurquoise";
- values[(int)KnownColor.DarkViolet] = "DarkViolet";
- values[(int)KnownColor.DeepPink] = "DeepPink";
- values[(int)KnownColor.DeepSkyBlue] = "DeepSkyBlue";
- values[(int)KnownColor.DimGray] = "DimGray";
- values[(int)KnownColor.DodgerBlue] = "DodgerBlue";
- values[(int)KnownColor.Firebrick] = "Firebrick";
- values[(int)KnownColor.FloralWhite] = "FloralWhite";
- values[(int)KnownColor.ForestGreen] = "ForestGreen";
- values[(int)KnownColor.Fuchsia] = "Fuchsia";
- values[(int)KnownColor.Gainsboro] = "Gainsboro";
- values[(int)KnownColor.GhostWhite] = "GhostWhite";
- values[(int)KnownColor.Gold] = "Gold";
- values[(int)KnownColor.Goldenrod] = "Goldenrod";
- values[(int)KnownColor.Gray] = "Gray";
- values[(int)KnownColor.Green] = "Green";
- values[(int)KnownColor.GreenYellow] = "GreenYellow";
- values[(int)KnownColor.Honeydew] = "Honeydew";
- values[(int)KnownColor.HotPink] = "HotPink";
- values[(int)KnownColor.IndianRed] = "IndianRed";
- values[(int)KnownColor.Indigo] = "Indigo";
- values[(int)KnownColor.Ivory] = "Ivory";
- values[(int)KnownColor.Khaki] = "Khaki";
- values[(int)KnownColor.Lavender] = "Lavender";
- values[(int)KnownColor.LavenderBlush] = "LavenderBlush";
- values[(int)KnownColor.LawnGreen] = "LawnGreen";
- values[(int)KnownColor.LemonChiffon] = "LemonChiffon";
- values[(int)KnownColor.LightBlue] = "LightBlue";
- values[(int)KnownColor.LightCoral] = "LightCoral";
- values[(int)KnownColor.LightCyan] = "LightCyan";
- values[(int)KnownColor.LightGoldenrodYellow] = "LightGoldenrodYellow";
- values[(int)KnownColor.LightGray] = "LightGray";
- values[(int)KnownColor.LightGreen] = "LightGreen";
- values[(int)KnownColor.LightPink] = "LightPink";
- values[(int)KnownColor.LightSalmon] = "LightSalmon";
- values[(int)KnownColor.LightSeaGreen] = "LightSeaGreen";
- values[(int)KnownColor.LightSkyBlue] = "LightSkyBlue";
- values[(int)KnownColor.LightSlateGray] = "LightSlateGray";
- values[(int)KnownColor.LightSteelBlue] = "LightSteelBlue";
- values[(int)KnownColor.LightYellow] = "LightYellow";
- values[(int)KnownColor.Lime] = "Lime";
- values[(int)KnownColor.LimeGreen] = "LimeGreen";
- values[(int)KnownColor.Linen] = "Linen";
- values[(int)KnownColor.Magenta] = "Magenta";
- values[(int)KnownColor.Maroon] = "Maroon";
- values[(int)KnownColor.MediumAquamarine] = "MediumAquamarine";
- values[(int)KnownColor.MediumBlue] = "MediumBlue";
- values[(int)KnownColor.MediumOrchid] = "MediumOrchid";
- values[(int)KnownColor.MediumPurple] = "MediumPurple";
- values[(int)KnownColor.MediumSeaGreen] = "MediumSeaGreen";
- values[(int)KnownColor.MediumSlateBlue] = "MediumSlateBlue";
- values[(int)KnownColor.MediumSpringGreen] = "MediumSpringGreen";
- values[(int)KnownColor.MediumTurquoise] = "MediumTurquoise";
- values[(int)KnownColor.MediumVioletRed] = "MediumVioletRed";
- values[(int)KnownColor.MidnightBlue] = "MidnightBlue";
- values[(int)KnownColor.MintCream] = "MintCream";
- values[(int)KnownColor.MistyRose] = "MistyRose";
- values[(int)KnownColor.Moccasin] = "Moccasin";
- values[(int)KnownColor.NavajoWhite] = "NavajoWhite";
- values[(int)KnownColor.Navy] = "Navy";
- values[(int)KnownColor.OldLace] = "OldLace";
- values[(int)KnownColor.Olive] = "Olive";
- values[(int)KnownColor.OliveDrab] = "OliveDrab";
- values[(int)KnownColor.Orange] = "Orange";
- values[(int)KnownColor.OrangeRed] = "OrangeRed";
- values[(int)KnownColor.Orchid] = "Orchid";
- values[(int)KnownColor.PaleGoldenrod] = "PaleGoldenrod";
- values[(int)KnownColor.PaleGreen] = "PaleGreen";
- values[(int)KnownColor.PaleTurquoise] = "PaleTurquoise";
- values[(int)KnownColor.PaleVioletRed] = "PaleVioletRed";
- values[(int)KnownColor.PapayaWhip] = "PapayaWhip";
- values[(int)KnownColor.PeachPuff] = "PeachPuff";
- values[(int)KnownColor.Peru] = "Peru";
- values[(int)KnownColor.Pink] = "Pink";
- values[(int)KnownColor.Plum] = "Plum";
- values[(int)KnownColor.PowderBlue] = "PowderBlue";
- values[(int)KnownColor.Purple] = "Purple";
- values[(int)KnownColor.Red] = "Red";
- values[(int)KnownColor.RosyBrown] = "RosyBrown";
- values[(int)KnownColor.RoyalBlue] = "RoyalBlue";
- values[(int)KnownColor.SaddleBrown] = "SaddleBrown";
- values[(int)KnownColor.Salmon] = "Salmon";
- values[(int)KnownColor.SandyBrown] = "SandyBrown";
- values[(int)KnownColor.SeaGreen] = "SeaGreen";
- values[(int)KnownColor.SeaShell] = "SeaShell";
- values[(int)KnownColor.Sienna] = "Sienna";
- values[(int)KnownColor.Silver] = "Silver";
- values[(int)KnownColor.SkyBlue] = "SkyBlue";
- values[(int)KnownColor.SlateBlue] = "SlateBlue";
- values[(int)KnownColor.SlateGray] = "SlateGray";
- values[(int)KnownColor.Snow] = "Snow";
- values[(int)KnownColor.SpringGreen] = "SpringGreen";
- values[(int)KnownColor.SteelBlue] = "SteelBlue";
- values[(int)KnownColor.Tan] = "Tan";
- values[(int)KnownColor.Teal] = "Teal";
- values[(int)KnownColor.Thistle] = "Thistle";
- values[(int)KnownColor.Tomato] = "Tomato";
- values[(int)KnownColor.Turquoise] = "Turquoise";
- values[(int)KnownColor.Violet] = "Violet";
- values[(int)KnownColor.Wheat] = "Wheat";
- values[(int)KnownColor.White] = "White";
- values[(int)KnownColor.WhiteSmoke] = "WhiteSmoke";
- values[(int)KnownColor.Yellow] = "Yellow";
- values[(int)KnownColor.YellowGreen] = "YellowGreen";
- s_colorNameTable = values;
- }
-
- public static int KnownColorToArgb(KnownColor color)
- {
- EnsureColorTable();
- if (color >= KnownColor.FirstColor && color <= KnownColor.LastColor)
- {
- return s_colorTable[(int)color];
- }
- else
- {
- return 0;
- }
- }
-
- public static string KnownColorToName(KnownColor color)
- {
- EnsureColorNameTable();
- if (color >= KnownColor.FirstColor && color <= KnownColor.LastColor)
- {
- return s_colorNameTable[(int)color];
- }
- else
- {
- return null;
- }
- }
- }
-}
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/Point.cs b/src/System.Drawing.Primitives/src/System/Drawing/Point.cs
index e01ac07ab3..825bc4101e 100644
--- a/src/System.Drawing.Primitives/src/System/Drawing/Point.cs
+++ b/src/System.Drawing.Primitives/src/System/Drawing/Point.cs
@@ -13,7 +13,7 @@ namespace System.Drawing
/// </summary>
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, PublicKeyToken=b03f5f7f11d50a3a")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
#endif
public struct Point : IEquatable<Point>
{
@@ -23,8 +23,8 @@ namespace System.Drawing
/// </summary>
public static readonly Point Empty = new Point();
- private int x; // Do not rename (binary serialization)
- private int y; // Do not rename (binary serialization)
+ private int x; // Do not rename (binary serialization)
+ private int y; // Do not rename (binary serialization)
/// <summary>
/// Initializes a new instance of the <see cref='System.Drawing.Point'/> class
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/PointF.cs b/src/System.Drawing.Primitives/src/System/Drawing/PointF.cs
index 473991ab2f..1608ff2f54 100644
--- a/src/System.Drawing.Primitives/src/System/Drawing/PointF.cs
+++ b/src/System.Drawing.Primitives/src/System/Drawing/PointF.cs
@@ -13,7 +13,7 @@ namespace System.Drawing
/// </summary>
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, PublicKeyToken=b03f5f7f11d50a3a")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
#endif
public struct PointF : IEquatable<PointF>
{
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/Rectangle.cs b/src/System.Drawing.Primitives/src/System/Drawing/Rectangle.cs
index 758f636a48..14558dcf50 100644
--- a/src/System.Drawing.Primitives/src/System/Drawing/Rectangle.cs
+++ b/src/System.Drawing.Primitives/src/System/Drawing/Rectangle.cs
@@ -15,7 +15,7 @@ namespace System.Drawing
/// </summary>
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, PublicKeyToken=b03f5f7f11d50a3a")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
#endif
public struct Rectangle : IEquatable<Rectangle>
{
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/RectangleF.cs b/src/System.Drawing.Primitives/src/System/Drawing/RectangleF.cs
index 47844683f3..135db559de 100644
--- a/src/System.Drawing.Primitives/src/System/Drawing/RectangleF.cs
+++ b/src/System.Drawing.Primitives/src/System/Drawing/RectangleF.cs
@@ -15,7 +15,7 @@ namespace System.Drawing
/// </summary>
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, PublicKeyToken=b03f5f7f11d50a3a")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
#endif
public struct RectangleF : IEquatable<RectangleF>
{
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/Size.cs b/src/System.Drawing.Primitives/src/System/Drawing/Size.cs
index f8e6d4ae1b..9de74ffb07 100644
--- a/src/System.Drawing.Primitives/src/System/Drawing/Size.cs
+++ b/src/System.Drawing.Primitives/src/System/Drawing/Size.cs
@@ -16,7 +16,7 @@ namespace System.Drawing
/// </summary>
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, PublicKeyToken=b03f5f7f11d50a3a")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
#endif
public struct Size : IEquatable<Size>
{
diff --git a/src/System.Drawing.Primitives/src/System/Drawing/SizeF.cs b/src/System.Drawing.Primitives/src/System/Drawing/SizeF.cs
index 6f600ac036..bf05c482a5 100644
--- a/src/System.Drawing.Primitives/src/System/Drawing/SizeF.cs
+++ b/src/System.Drawing.Primitives/src/System/Drawing/SizeF.cs
@@ -18,7 +18,7 @@ namespace System.Drawing
/// </summary>
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct SizeF : IEquatable<SizeF>
{
diff --git a/src/System.Drawing.Primitives/tests/ColorTests.cs b/src/System.Drawing.Primitives/tests/ColorTests.cs
index 4dd98ae113..cb80989bdd 100644
--- a/src/System.Drawing.Primitives/tests/ColorTests.cs
+++ b/src/System.Drawing.Primitives/tests/ColorTests.cs
@@ -11,7 +11,7 @@ namespace System.Drawing.Primitives.Tests
{
public partial class ColorTests
{
- public static IEnumerable<object[]> NamedArgbValues =>
+ public static readonly IEnumerable<object[]> NamedArgbValues =
new[]
{
new object[] {"Transparent", 0, 255, 255, 255},
@@ -157,9 +157,10 @@ namespace System.Drawing.Primitives.Tests
new object[] {"YellowGreen", 255, 154, 205, 50},
};
- public static IEnumerable<object[]> ColorNames => typeof(Color).GetProperties()
+ public static readonly IEnumerable<object[]> ColorNames = typeof(Color).GetProperties()
.Where(p => p.PropertyType == typeof(Color))
- .Select(p => new object[] { p.Name} );
+ .Select(p => new object[] { p.Name })
+ .ToArray();
private Color? GetColorByProperty(string name)
{
diff --git a/src/System.Drawing.Primitives/tests/System.Drawing.Primitives.Tests.csproj b/src/System.Drawing.Primitives/tests/System.Drawing.Primitives.Tests.csproj
index bc7c3a767d..6201723711 100644
--- a/src/System.Drawing.Primitives/tests/System.Drawing.Primitives.Tests.csproj
+++ b/src/System.Drawing.Primitives/tests/System.Drawing.Primitives.Tests.csproj
@@ -2,7 +2,7 @@
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
<PropertyGroup>
- <ProjectGuid>{297A9116-1005-499D-A895-2063D03E4C94}</ProjectGuid>
+ <ProjectGuid>{CF54638C-A382-4A78-9AD6-2304CEEFEB01}</ProjectGuid>
</PropertyGroup>
<!-- Default configurations to help VS understand the configurations -->
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Debug|AnyCPU'" />
@@ -37,4 +37,4 @@
<Compile Include="SizeTests.netcoreapp.cs" />
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
+</Project> \ No newline at end of file
diff --git a/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.genclass.cs b/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.genclass.cs
index 0a318c7b9f..3816b36f16 100644
--- a/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.genclass.cs
+++ b/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.genclass.cs
@@ -29,18 +29,18 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
public class MemberClass<T>
{
[ThreadStatic]
- public static int Status;
+ public static int t_status;
public bool? this[string p1, float p2, short[] p3]
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return null;
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -48,13 +48,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return (byte)3;
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -62,13 +62,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return p1;
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -76,7 +76,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return new dynamic[]
{
p1, p2
@@ -87,7 +87,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -95,7 +95,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return new double[]
{
1.4, double.Epsilon, double.NaN
@@ -106,7 +106,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -114,13 +114,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return p1;
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -128,7 +128,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return new MyClass[]
{
null, new MyClass()
@@ -142,7 +142,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -150,13 +150,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return default(T);
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -164,13 +164,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return new MyClass();
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -178,13 +178,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return default(T);
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -192,13 +192,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return default(T);
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
@@ -206,13 +206,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClass<T>.Status = 1;
+ MemberClass<T>.t_status = 1;
return default(T);
}
set
{
- MemberClass<T>.Status = 2;
+ MemberClass<T>.t_status = 2;
}
}
}
@@ -239,18 +239,18 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
where T : class
{
[ThreadStatic]
- public static int Status;
+ public static int t_status;
public int this[int x]
{
get
{
- MemberClassWithClassConstraint<T>.Status = 3;
+ MemberClassWithClassConstraint<T>.t_status = 3;
return 1;
}
set
{
- MemberClassWithClassConstraint<T>.Status = 4;
+ MemberClassWithClassConstraint<T>.t_status = 4;
}
}
@@ -258,13 +258,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
{
get
{
- MemberClassWithClassConstraint<T>.Status = 1;
+ MemberClassWithClassConstraint<T>.t_status = 1;
return null;
}
set
{
- MemberClassWithClassConstraint<T>.Status = 2;
+ MemberClassWithClassConstraint<T>.t_status = 2;
}
}
}
@@ -273,18 +273,18 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
where T : new()
{
[ThreadStatic]
- public static int Status;
+ public static int t_status;
public dynamic this[T t]
{
get
{
- MemberClassWithNewConstraint<T>.Status = 1;
+ MemberClassWithNewConstraint<T>.t_status = 1;
return new T();
}
set
{
- MemberClassWithNewConstraint<T>.Status = 2;
+ MemberClassWithNewConstraint<T>.t_status = 2;
}
}
}
@@ -450,7 +450,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
ClassWithImplicitOperator target = new ClassWithImplicitOperator();
EmptyClass result = target; //implicit
Assert.Null(result);
- Assert.Equal(1, MemberClass<ClassWithImplicitOperator>.Status);
+ Assert.Equal(1, MemberClass<ClassWithImplicitOperator>.t_status);
}
}
//</Code>
@@ -493,7 +493,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
byte b = 1;
ClassWithExplicitOperator result = (ClassWithExplicitOperator)b;
Assert.Equal(3, result.field);
- Assert.Equal(1, MemberClass<int>.Status);
+ Assert.Equal(1, MemberClass<int>.t_status);
}
}
//</Code>
@@ -535,8 +535,8 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
}
Assert.Equal("Test", result);
- Assert.Equal(1, MemberClass<string>.Status);
- Assert.Equal(1, MemberClass<bool>.Status);
+ Assert.Equal(1, MemberClass<string>.t_status);
+ Assert.Equal(1, MemberClass<bool>.t_status);
}
}
//</Code>
@@ -586,7 +586,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
}
Assert.Equal(10, index);
- Assert.Equal(3, MemberClassWithClassConstraint<Test>.Status);
+ Assert.Equal(3, MemberClassWithClassConstraint<Test>.t_status);
}
}
//</Code>
@@ -623,7 +623,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
while (dy[p1, p2, p3] ?? true);
Assert.Equal(10, index);
- Assert.Equal(1, MemberClass<int>.Status);
+ Assert.Equal(1, MemberClass<int>.t_status);
}
}
//</Code>
@@ -657,7 +657,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
}
Assert.True(isChecked);
- Assert.Equal(1, MemberClass<int>.Status);
+ Assert.Equal(1, MemberClass<int>.t_status);
}
}
//</Code>
@@ -753,7 +753,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
Assert.Equal(10, ((MyClass)result[0]).Field);
Assert.Equal(11, ((MyStruct)result[1]).Number);
- Assert.Equal(2, MemberClass<int>.Status);
+ Assert.Equal(2, MemberClass<int>.t_status);
}
}
//</Code>
@@ -802,7 +802,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
Assert.True(threwException);
Assert.Equal(new int?[] { null, null, null }, result);
- Assert.Equal(1, MemberClass<int>.Status);
+ Assert.Equal(1, MemberClass<int>.t_status);
}
}
//</Code>
@@ -838,7 +838,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
dynamic t = new Test();
foreach (MyClass[] me in t.Increment())
{
- if (MemberClass<string>.Status != 1 || me.Length != 2)
+ if (MemberClass<string>.t_status != 1 || me.Length != 2)
return 1;
}
@@ -889,7 +889,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
Assert.Equal(1, list.Count);
Assert.Null(list[0]._field);
- Assert.Equal(1, MemberClassWithClassConstraint<string>.Status);
+ Assert.Equal(1, MemberClassWithClassConstraint<string>.t_status);
}
}
//</Code>
@@ -939,7 +939,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
Assert.Equal(2, result.Count);
Assert.Equal(3, MemberClassWithAnotherTypeConstraint<string, string>.Status);
- Assert.Equal(1, MemberClassWithNewConstraint<Test>.Status);
+ Assert.Equal(1, MemberClassWithNewConstraint<Test>.t_status);
foreach (var m in result)
{
@@ -976,11 +976,11 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.genclas
dynamic dy = new MemberClassWithNewConstraint<MyClass>();
MyClass p1 = null;
dy[p1] = dy;
- Assert.Equal(2, MemberClassWithNewConstraint<MyClass>.Status);
+ Assert.Equal(2, MemberClassWithNewConstraint<MyClass>.t_status);
dynamic p2 = dy[p1];
Assert.IsType<MyClass>(p2);
- Assert.Equal(1, MemberClassWithNewConstraint<MyClass>.Status);
+ Assert.Equal(1, MemberClassWithNewConstraint<MyClass>.t_status);
}
}
//</Code>
diff --git a/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.regclass.cs b/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.regclass.cs
index fe8ef9ce62..fde96f0f3a 100644
--- a/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.regclass.cs
+++ b/src/System.Dynamic.Runtime/tests/Dynamic.Context/Conformance.dynamic.context.indexer.regclass.cs
@@ -29,19 +29,19 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public class MemberClass
{
[ThreadStatic]
- public static int Status;
+ public static int t_status;
public bool? this[string p1, float p2, short[] p3]
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -49,13 +49,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return (byte)3;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -63,7 +63,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new byte?[]
{
null, (byte)2
@@ -74,7 +74,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
private set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -82,13 +82,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
protected get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return 'a';
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -96,13 +96,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -110,13 +110,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
private set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -124,7 +124,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
protected internal get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new decimal[]
{
1m, 0m
@@ -135,7 +135,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -143,7 +143,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new double[]
{
1.4, double.Epsilon, double.NaN
@@ -154,7 +154,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
internal set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -162,13 +162,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return p1;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -176,7 +176,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new dynamic[]
{
p1, p2
@@ -187,7 +187,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -195,13 +195,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return float.NegativeInfinity;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -209,13 +209,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return float.NegativeInfinity;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -223,13 +223,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return 0;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -237,13 +237,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return 4;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -251,7 +251,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new int?[]
{
1, null, int.MinValue
@@ -262,7 +262,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -270,7 +270,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyClass()
{
Field = 3
@@ -281,7 +281,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -289,7 +289,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyClass[]
{
null, new MyClass()
@@ -303,7 +303,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -311,13 +311,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return MyEnum.Second;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -325,13 +325,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -339,7 +339,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyEnum?[]
{
null, MyEnum.Second
@@ -350,7 +350,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -358,7 +358,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyEnum[]
{
MyEnum.Second, MyEnum.First
@@ -369,7 +369,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -377,7 +377,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyStruct()
{
Number = 4
@@ -388,7 +388,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -396,13 +396,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -410,7 +410,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyStruct?[]
{
null, new MyStruct()
@@ -424,7 +424,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -432,7 +432,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyStruct[]
{
}
@@ -442,7 +442,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -450,7 +450,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new object[]
{
p1, p2, p3
@@ -461,7 +461,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -469,7 +469,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new short[]
{
1
@@ -480,7 +480,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -488,13 +488,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return string.Empty;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -502,7 +502,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new ulong[]
{
ulong.MaxValue
@@ -513,7 +513,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -521,14 +521,14 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -536,13 +536,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return (byte)3;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -550,7 +550,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new byte?[]
{
null, (byte)2
@@ -561,7 +561,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -569,13 +569,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return 'a';
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -583,13 +583,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -597,13 +597,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -611,7 +611,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new decimal[]
{
1m, 0m
@@ -622,7 +622,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -630,7 +630,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new double[]
{
1.4, double.Epsilon, double.NaN
@@ -641,7 +641,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -649,13 +649,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return p1;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -663,7 +663,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new dynamic[]
{
p1
@@ -674,7 +674,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -682,13 +682,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return float.NegativeInfinity;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -696,13 +696,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return float.PositiveInfinity;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -710,13 +710,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return 0;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -724,13 +724,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return 4;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -738,7 +738,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new int?[]
{
1, null, int.MinValue
@@ -749,7 +749,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -757,7 +757,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyClass()
{
Field = 3
@@ -768,7 +768,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -776,7 +776,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyClass[]
{
null, new MyClass()
@@ -790,7 +790,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -798,13 +798,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -812,7 +812,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyEnum?[]
{
null, MyEnum.Second
@@ -823,7 +823,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -832,7 +832,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyEnum[]
{
MyEnum.Second, MyEnum.First
@@ -843,7 +843,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -851,7 +851,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyStruct()
{
Number = 4
@@ -862,7 +862,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -870,13 +870,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return null;
}
internal set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -884,7 +884,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyStruct?[]
{
null, new MyStruct()
@@ -898,7 +898,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -906,7 +906,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new MyStruct[]
{
}
@@ -916,7 +916,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -924,7 +924,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new object[]
{
p1
@@ -935,7 +935,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -943,7 +943,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new short[]
{
1
@@ -954,7 +954,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -962,13 +962,13 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return string.Empty;
}
private set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
@@ -976,7 +976,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
get
{
- MemberClass.Status = 1;
+ MemberClass.t_status = 1;
return new ulong[]
{
ulong.MaxValue
@@ -987,7 +987,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
set
{
- MemberClass.Status = 2;
+ MemberClass.t_status = 2;
}
}
}
@@ -1021,7 +1021,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public int TestGetMethod(MemberClass mc)
{
dynamic dy = mc;
- if (dy[string.Empty, 1.2f, new short[0]] != null && MemberClass.Status != 1)
+ if (dy[string.Empty, 1.2f, new short[0]] != null && MemberClass.t_status != 1)
return 1;
else
return 0;
@@ -1031,7 +1031,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
dynamic dy = mc;
dy[string.Empty, 1.2f, new short[0]] = false;
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
else
return 0;
@@ -1075,7 +1075,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
;
ulong[] p2 = new ulong[1];
dynamic p3 = dy;
- if (dy[p1, p2, p3] != 3 && MemberClass.Status != 1)
+ if (dy[p1, p2, p3] != 3 && MemberClass.t_status != 1)
return 1;
else
return 0;
@@ -1093,7 +1093,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
ulong[] p2 = new ulong[1];
dynamic p3 = dy;
dy[p1, p2, p3] = (byte)4;
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
else
return 0;
@@ -1134,7 +1134,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
byte p2 = 11;
decimal? p3 = null;
byte?[] result = dy[p1, p2, p3];
- if (result.Length == 2 && result[0] == null && result[1] == 2 && MemberClass.Status == 1)
+ if (result.Length == 2 && result[0] == null && result[1] == 2 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -1240,7 +1240,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
MemberClass mc = new MemberClass();
dynamic dy = mc;
double[] result = dy[1, new object[1], 1.2f];
- if (result.Length == 3 && result[0] == 1.4 && result[1] == double.Epsilon && double.IsNaN(result[2]) && MemberClass.Status == 1)
+ if (result.Length == 3 && result[0] == 1.4 && result[1] == double.Epsilon && double.IsNaN(result[2]) && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -1273,9 +1273,9 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
MemberClass mc = new MemberClass();
dynamic dy = mc;
int result1 = t.TestMethod(dy['a', 10, new MyEnum[10]]);
- if (MemberClass.Status != 1)
+ if (MemberClass.t_status != 1)
return 1;
- MemberClass.Status = 0;
+ MemberClass.t_status = 0;
char? pp = null;
int result2 = Test.TestMethod(dy[new MyClass()
{
@@ -1283,7 +1283,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
}
, pp, new MyEnum[3]]);
- if (result1 == 0 && result2 == 0 && MemberClass.Status == 1)
+ if (result1 == 0 && result2 == 0 && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -1349,7 +1349,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
;
var result = dy[p1, p2, p3];
- if (result == float.NegativeInfinity && MemberClass.Status == 1)
+ if (result == float.NegativeInfinity && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -1391,7 +1391,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
}
;
- if (result.Length == 2 && result[0] == float.NegativeInfinity && result[1] == float.PositiveInfinity && MemberClass.Status == 1)
+ if (result.Length == 2 && result[0] == float.NegativeInfinity && result[1] == float.PositiveInfinity && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -1432,7 +1432,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
}
;
- if (result.Length == 2 && result[0].Field == 3 && result[1].Field == 3 && MemberClass.Status == 1)
+ if (result.Length == 2 && result[0].Field == 3 && result[1].Field == 3 && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -1489,7 +1489,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
}
;
- if (result.Field == 4 && result.MyEnum == MyEnum.Second && MemberClass.Status == 1)
+ if (result.Field == 4 && result.MyEnum == MyEnum.Second && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -1536,7 +1536,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
}
;
- if (result.Field1 == 'a' && result.Field2.Length == 1 && result.Field2[0] == ulong.MaxValue && MemberClass.Status == 1)
+ if (result.Field1 == 'a' && result.Field2.Length == 1 && result.Field2[0] == ulong.MaxValue && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -1586,7 +1586,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public static int MainMethod()
{
- if (s_result.Length == 2 && s_result[0] == StaticTestClass.p1 && ((MyStruct?)s_result[1]).Value.Number == StaticTestClass.p2.Value.Number && MemberClass.Status == 1)
+ if (s_result.Length == 2 && s_result[0] == StaticTestClass.p1 && ((MyStruct?)s_result[1]).Value.Number == StaticTestClass.p2.Value.Number && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -1618,7 +1618,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
{
Test t = new Test();
int?[] result = t.MyProperty;
- if (result.Length == 3 && result[0] == 1 && result[1] == null && result[2] == int.MinValue && MemberClass.Status == 1)
+ if (result.Length == 3 && result[0] == 1 && result[1] == null && result[2] == int.MinValue && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -1668,7 +1668,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public static int MainMethod()
{
Test.MyProperty = "Test";
- if (MemberClass.Status == 2)
+ if (MemberClass.t_status == 2)
return 0;
return 1;
}
@@ -1721,7 +1721,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
index++;
}
- if (index == 3 && MemberClass.Status == 1)
+ if (index == 3 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -1778,7 +1778,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
}
;
- if (list.Count == 3 && list[0].Number == 4 && list[1].Number == 4 && list[2].Number == 4 && MemberClass.Status == 1)
+ if (list.Count == 3 && list[0].Number == 4 && list[1].Number == 4 && list[2].Number == 4 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -1844,7 +1844,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public static int MainMethod()
{
Test t = new Test();
- if (t._filed1.Length == 2 && t._filed1[0] == null && t._filed1[1].Field == 3 && t._filed2 == null && MemberClass.Status == 1)
+ if (t._filed1.Length == 2 && t._filed1[0] == null && t._filed1[1].Field == 3 && t._filed2 == null && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -1877,7 +1877,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dynamic dy = mc;
int m1 = unchecked(dy[new double[3]] + int.MaxValue); // max + 4
int m2 = checked(dy[new MyStruct()] + int.MaxValue);
- if (m1 == -2147483645 && m2 == int.MaxValue && MemberClass.Status == 1) // 0xFFFFFFFF80000003
+ if (m1 == -2147483645 && m2 == int.MaxValue && MemberClass.t_status == 1) // 0xFFFFFFFF80000003
return 0;
return 1;
}
@@ -1922,7 +1922,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
}
;
- if (ms.Value.Number == 10 && MemberClass.Status == 1)
+ if (ms.Value.Number == 10 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -1982,7 +1982,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
byte p1 = 10;
int p2 = p1;
var result = list.Where(p => !p._field1.HasValue && !((MyStruct?)dy[p1]).HasValue && p._field2 == dy[p2]).Select(p => p._field3).Average();
- if (result == 1 && MemberClass.Status == 1)
+ if (result == 1 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2030,7 +2030,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
b = false;
}
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
b = true;
index = 0;
@@ -2046,7 +2046,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
b = false;
}
- if (MemberClass.Status != 1)
+ if (MemberClass.t_status != 1)
return 1;
return 0;
}
@@ -2079,11 +2079,11 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dynamic dy = mc;
int? p1 = 10;
dy[p1] = true;
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
var result0 = dy[p1];
var result1 = result0 == null ? false : result0;
- if (result1 == false && MemberClass.Status == 1)
+ if (result1 == false && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2142,7 +2142,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
if (!ErrorVerifier.Verify(ErrorMessageId.BadArgCount, e.Message, "this", "6"))
return 1;
ms = dy[p1, p2, p3];
- if (ms.Number != 4 || MemberClass.Status != 1)
+ if (ms.Number != 4 || MemberClass.t_status != 1)
return 1;
}
finally
@@ -2150,7 +2150,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dy[p1, p2, p3] = ms;
}
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
return 0;
}
@@ -2191,7 +2191,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public static int MainMethod()
{
- if (Test.s_ms.Length == 2 && Test.s_ms[0] == null && Test.s_ms[1].Value.Number == 4 && MemberClass.Status == 1)
+ if (Test.s_ms.Length == 2 && Test.s_ms[0] == null && Test.s_ms[1].Value.Number == 4 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2236,7 +2236,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dy[p1, p2, p3] = null;
s_field = dy[p1, p2, p3];
- memberClassStatus = MemberClass.Status;
+ memberClassStatus = MemberClass.t_status;
}
Assert.Equal(0, Verify());
@@ -2308,7 +2308,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dynamic dynamic = mc;
object[] array = dynamic[true, 10, dynamic];
- if (array.Length == 3 && (bool?)array[0] == true && (int?)array[1] == 10 && array[2] == dynamic && MemberClass.Status == 1)
+ if (array.Length == 3 && (bool?)array[0] == true && (int?)array[1] == 10 && array[2] == dynamic && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2345,7 +2345,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
;
char result = ((char?)dy[p1]).Method();
- if (result == '&' && MemberClass.Status == 1)
+ if (result == '&' && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2394,7 +2394,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
;
decimal[] result = dy[b];
- if (result.Length == 2 && result[0] == 1M && result[1] == 0M && MemberClass.Status == 1)
+ if (result.Length == 2 && result[0] == 1M && result[1] == 0M && MemberClass.t_status == 1)
return 0;
else
return 1;
@@ -2430,10 +2430,10 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
object[] p2 = null;
dynamic p3 = null;
ulong[] result = dy[p1, p2, p3];
- if (result.Length != 1 || result[0] != ulong.MaxValue || MemberClass.Status != 1)
+ if (result.Length != 1 || result[0] != ulong.MaxValue || MemberClass.t_status != 1)
return 1;
dy[p1, p2, p3] = result;
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
return 0;
}
@@ -2473,7 +2473,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
;
Func<int, dynamic[]> func = (int arg1) => dy[p1];
dynamic[] result = func(1);
- if (result.Length != 1 || MemberClass.Status != 1)
+ if (result.Length != 1 || MemberClass.t_status != 1)
return 1;
MyEnum?[] meArray = result[0];
if (meArray[0] == MyEnum.First && meArray[1] == MyEnum.Third && meArray[2] == null)
@@ -2512,7 +2512,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
char p1 = 'a';
Func<char, decimal?> func = (char arg1) => dy[arg1];
decimal? result = func(p1);
- if (result == null && MemberClass.Status == 1)
+ if (result == null && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2544,7 +2544,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public static int MainMethod()
{
- if (s_result.Length == 3 && s_result[0] == 1.4 && s_result[1] == double.Epsilon && double.IsNaN(s_result[2]) && MemberClass.Status == 1)
+ if (s_result.Length == 3 && s_result[0] == 1.4 && s_result[1] == double.Epsilon && double.IsNaN(s_result[2]) && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2577,7 +2577,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
public static int MainMethod()
{
Test t = new Test();
- if (t._field.Length == 10 && MemberClass.Status == 1)
+ if (t._field.Length == 10 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2620,7 +2620,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
index++;
}
- if (index == 3 && MemberClass.Status == 1)
+ if (index == 3 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2658,7 +2658,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
index++;
}
- if (index == 2 && MemberClass.Status == 1)
+ if (index == 2 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2696,7 +2696,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
isChecked = true;
}
- if (isChecked && MemberClass.Status == 1)
+ if (isChecked && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2745,7 +2745,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dy[p1] = new MyStruct[7];
}
- if (ms.Length == 0 && MemberClass.Status == 2)
+ if (ms.Length == 0 && MemberClass.t_status == 2)
return 0;
return 1;
}
@@ -2783,10 +2783,10 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dynamic dy = mc;
char? p1 = null;
MyStruct?[] result = dy[p1];
- if (result.Length != 2 || result[0] != null || result[1].Value.Number != 4 || MemberClass.Status != 1)
+ if (result.Length != 2 || result[0] != null || result[1].Value.Number != 4 || MemberClass.t_status != 1)
return 1;
dy[p1] = result;
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
return 0;
}
@@ -2833,7 +2833,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
index++;
}
- if (index == 2 && result.Length == 2 && result[0] == null && result[1].Field == 3 && MemberClass.Status == 1)
+ if (index == 2 && result.Length == 2 && result[0] == null && result[1].Field == 3 && MemberClass.t_status == 1)
return 0;
return 1;
}
@@ -2874,7 +2874,7 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.context.indexer.regclas
dy[new MyEnum[index]] = null;
}
- if (MemberClass.Status != 2)
+ if (MemberClass.t_status != 2)
return 1;
foreach (MyEnum? me in array)
if (me != null)
diff --git a/src/System.Dynamic.Runtime/tests/Dynamic.OverloadResolution/Conformance.dynamic.overloadResolution.Methods.1class2methods.cs b/src/System.Dynamic.Runtime/tests/Dynamic.OverloadResolution/Conformance.dynamic.overloadResolution.Methods.1class2methods.cs
index fbe7f9de7e..fcd80f99f4 100644
--- a/src/System.Dynamic.Runtime/tests/Dynamic.OverloadResolution/Conformance.dynamic.overloadResolution.Methods.1class2methods.cs
+++ b/src/System.Dynamic.Runtime/tests/Dynamic.OverloadResolution/Conformance.dynamic.overloadResolution.Methods.1class2methods.cs
@@ -4170,7 +4170,6 @@ namespace ManagedTests.DynamicCSharp.Conformance.dynamic.overloadResolution.Meth
}
[Fact]
- [ActiveIssue("https://github.com/dotnet/corefx/issues/19895 - Switch over to real HasSameMetadataDefinitionAs() - once CoreRt implements it.", TargetFrameworkMonikers.UapAot)]
public static void DynamicCSharpRunTest()
{
Assert.Equal(0, MainMethod());
diff --git a/src/System.Globalization/tests/NumberFormatInfo/NumberFormatInfoData.cs b/src/System.Globalization/tests/NumberFormatInfo/NumberFormatInfoData.cs
index 7d0e3839df..de89807751 100644
--- a/src/System.Globalization/tests/NumberFormatInfo/NumberFormatInfoData.cs
+++ b/src/System.Globalization/tests/NumberFormatInfo/NumberFormatInfoData.cs
@@ -17,6 +17,7 @@ namespace System.Globalization.Tests
|| (PlatformDetection.IsUbuntu && !PlatformDetection.IsUbuntu1404)
|| PlatformDetection.IsFedora
|| (PlatformDetection.IsDebian && !PlatformDetection.IsDebian8)
+ || PlatformDetection.IsTizen
)
{
return new int[] { 3 };
diff --git a/src/System.Globalization/tests/System.Globalization.Tests.csproj b/src/System.Globalization/tests/System.Globalization.Tests.csproj
index f9f3b21250..ff7eb68ae4 100644
--- a/src/System.Globalization/tests/System.Globalization.Tests.csproj
+++ b/src/System.Globalization/tests/System.Globalization.Tests.csproj
@@ -143,22 +143,12 @@
<Compile Include="$(CommonTestPath)\System\RandomDataGenerator.cs">
<Link>Common\System\RandomDataGenerator.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<ProjectReference Condition="'$(TargetGroup)' != 'uap'" Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorConsoleApp\RemoteExecutorConsoleApp.csproj">
<Project>{69e46a6f-9966-45a5-8945-2559fe337827}</Project>
<Name>RemoteExecutorConsoleApp</Name>
</ProjectReference>
</ItemGroup>
- <ItemGroup Condition="'$(TargetGroup)' == 'uap'">
- <Reference Include="Windows" />
- </ItemGroup>
-
<ItemGroup>
<EmbeddedResource Include="$(CommonTestPath)\Data\UnicodeData.8.0.txt">
<Link>CharUnicodeInfo\UnicodeData8.0.txt</Link>
diff --git a/src/System.IO.Compression.ZipFile/tests/System.IO.Compression.ZipFile.Tests.csproj b/src/System.IO.Compression.ZipFile/tests/System.IO.Compression.ZipFile.Tests.csproj
index 52213bf0dd..c61ecbcd70 100644
--- a/src/System.IO.Compression.ZipFile/tests/System.IO.Compression.ZipFile.Tests.csproj
+++ b/src/System.IO.Compression.ZipFile/tests/System.IO.Compression.ZipFile.Tests.csproj
@@ -15,9 +15,6 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\IO\TempFile.cs">
<Link>Common\System\IO\TempFile.cs</Link>
</Compile>
diff --git a/src/System.IO.Compression/tests/Performance/Perf.DeflateStream.cs b/src/System.IO.Compression/tests/Performance/Perf.DeflateStream.cs
index 2a0112a0f8..3eb6f996b1 100644
--- a/src/System.IO.Compression/tests/Performance/Perf.DeflateStream.cs
+++ b/src/System.IO.Compression/tests/Performance/Perf.DeflateStream.cs
@@ -97,7 +97,9 @@ namespace System.IO.Compression.Tests
NormalData = 4
}
- [Benchmark]
+ private const int Iter = 1000;
+
+ [Benchmark(InnerIterationCount = Iter)]
[InlineData(CompressionType.CryptoRandom)]
[InlineData(CompressionType.RepeatedSegments)]
[InlineData(CompressionType.NormalData)]
@@ -105,14 +107,14 @@ namespace System.IO.Compression.Tests
{
string testFilePath = CreateCompressedFile(type);
int _bufferSize = 1024;
- int retCount = -1;
var bytes = new byte[_bufferSize];
using (MemoryStream gzStream = await LocalMemoryStream.readAppFileAsync(testFilePath))
using (MemoryStream strippedMs = StripHeaderAndFooter.Strip(gzStream))
foreach (var iteration in Benchmark.Iterations)
using (iteration.StartMeasurement())
- for (int i = 0; i < 10000; i++)
+ for (int i = 0; i < Benchmark.InnerIterationCount; i++)
{
+ int retCount = -1;
using (DeflateStream zip = new DeflateStream(strippedMs, CompressionMode.Decompress, leaveOpen: true))
{
while (retCount != 0)
diff --git a/src/System.IO.Compression/tests/System.IO.Compression.Tests.csproj b/src/System.IO.Compression/tests/System.IO.Compression.Tests.csproj
index cec2b8b3be..64e2dfde30 100644
--- a/src/System.IO.Compression/tests/System.IO.Compression.Tests.csproj
+++ b/src/System.IO.Compression/tests/System.IO.Compression.Tests.csproj
@@ -42,9 +42,6 @@
<Compile Include="$(CommonTestPath)\System\IO\Compression\StreamHelpers.cs">
<Link>Common\System\IO\Compression\StreamHelpers.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\IO\TempFile.cs">
<Link>Common\System\IO\TempFile.cs</Link>
</Compile>
diff --git a/src/System.IO.FileSystem.DriveInfo/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.IO.FileSystem.DriveInfo/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 4a86b6a2a7..0000000000
--- a/src/System.IO.FileSystem.DriveInfo/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,5 +0,0 @@
-kernel32.dll!GetDriveTypeW
-kernel32.dll!GetLogicalDrives
-kernel32.dll!GetVolumeInformationW
-kernel32.dll!SetThreadErrorMode
-kernel32.dll!SetVolumeLabelW
diff --git a/src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index c2ec44e811..0000000000
--- a/src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,2 +0,0 @@
-kernel32.dll!CreateFileW
-kernel32.dll!ReadDirectoryChangesW
diff --git a/src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata.uap b/src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
new file mode 100644
index 0000000000..0719fa0f9d
--- /dev/null
+++ b/src/System.IO.FileSystem.Watcher/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -0,0 +1,3 @@
+## need to create a uap config that uses CreateFileFromApp, then remove this baseline ##
+# https://github.com/dotnet/corefx/issues/21025
+kernel32.dll!CreateFileW \ No newline at end of file
diff --git a/src/System.IO.FileSystem.Watcher/tests/FileSystemWatcher.Directory.NotifyFilter.cs b/src/System.IO.FileSystem.Watcher/tests/FileSystemWatcher.Directory.NotifyFilter.cs
index 2dc0eb0cd7..f390e58913 100644
--- a/src/System.IO.FileSystem.Watcher/tests/FileSystemWatcher.Directory.NotifyFilter.cs
+++ b/src/System.IO.FileSystem.Watcher/tests/FileSystemWatcher.Directory.NotifyFilter.cs
@@ -143,6 +143,7 @@ namespace System.IO.Tests
[Theory]
[MemberData(nameof(FilterTypes))]
[PlatformSpecific(TestPlatforms.Windows)] // Uses P/Invokes to set security info
+ [ActiveIssue(21109, TargetFrameworkMonikers.Uap)]
public void FileSystemWatcher_Directory_NotifyFilter_Security(NotifyFilters filter)
{
using (var testDirectory = new TempDirectory(GetTestFilePath()))
diff --git a/src/System.IO.FileSystem.Watcher/tests/System.IO.FileSystem.Watcher.Tests.csproj b/src/System.IO.FileSystem.Watcher/tests/System.IO.FileSystem.Watcher.Tests.csproj
index c97af90ff2..f6ee7a174d 100644
--- a/src/System.IO.FileSystem.Watcher/tests/System.IO.FileSystem.Watcher.Tests.csproj
+++ b/src/System.IO.FileSystem.Watcher/tests/System.IO.FileSystem.Watcher.Tests.csproj
@@ -40,9 +40,6 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\IO\TempFile.cs">
<Link>Common\System\IO\TempFile.cs</Link>
</Compile>
diff --git a/src/System.IO.FileSystem/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.IO.FileSystem/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 4b690b7504..0000000000
--- a/src/System.IO.FileSystem/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,6 +0,0 @@
-kernel32.dll!CopyFileExW
-kernel32.dll!CreateFileW
-kernel32.dll!DeleteVolumeMountPointW
-kernel32.dll!GetLogicalDrives
-kernel32.dll!SetThreadErrorMode
-
diff --git a/src/System.IO.FileSystem/src/System.IO.FileSystem.csproj b/src/System.IO.FileSystem/src/System.IO.FileSystem.csproj
index 1036cfbf78..c604f2f0af 100644
--- a/src/System.IO.FileSystem/src/System.IO.FileSystem.csproj
+++ b/src/System.IO.FileSystem/src/System.IO.FileSystem.csproj
@@ -63,6 +63,7 @@
</ItemGroup>
<!-- Windows -->
<ItemGroup Condition="'$(TargetsWindows)' == 'true'">
+ <Compile Include="System\IO\DisableMediaInsertionPrompt.cs" />
<Compile Include="Microsoft\Win32\SafeHandles\SafeFindHandle.Windows.cs" />
<Compile Include="System\IO\DirectoryInfo.Windows.cs" />
<Compile Include="System\IO\FileInfo.Windows.cs" />
@@ -235,9 +236,7 @@
<Compile Include="System\IO\FileSystemInfo.WinRT.cs" />
<Compile Include="System\IO\MultiplexingWin32WinRTFileSystem.cs" />
<Compile Include="System\IO\WinRTIOExtensions.cs" />
- <Compile Include="System\IO\WinRTFileStream.cs" />
<Compile Include="System\IO\WinRTFileSystem.cs" />
- <Compile Include="System\IO\WinRTFileSystemObject.cs" />
<Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.CopyFile2.cs">
<Link>Common\Interop\Windows\Interop.CopyFile2.cs</Link>
</Compile>
diff --git a/src/System.IO.FileSystem/src/System/IO/Directory.cs b/src/System.IO.FileSystem/src/System/IO/Directory.cs
index cd7ada9dd2..8039cc6a83 100644
--- a/src/System.IO.FileSystem/src/System/IO/Directory.cs
+++ b/src/System.IO.FileSystem/src/System/IO/Directory.cs
@@ -2,25 +2,16 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
-using System.Collections;
using System.Collections.Generic;
-using System.Security;
-using Microsoft.Win32;
-using Microsoft.Win32.SafeHandles;
-using System.Text;
-using System.Runtime.InteropServices;
-using System.Globalization;
-using System.Runtime.Versioning;
using System.Diagnostics;
using System.Diagnostics.Contracts;
-using System.Threading;
+using System.Security;
namespace System.IO
{
public static partial class Directory
{
- public static DirectoryInfo GetParent(String path)
+ public static DirectoryInfo GetParent(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -29,16 +20,16 @@ namespace System.IO
throw new ArgumentException(SR.Argument_PathEmpty, nameof(path));
Contract.EndContractBlock();
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
- String s = Path.GetDirectoryName(fullPath);
+ string s = Path.GetDirectoryName(fullPath);
if (s == null)
return null;
return new DirectoryInfo(s);
}
[System.Security.SecuritySafeCritical]
- public static DirectoryInfo CreateDirectory(String path)
+ public static DirectoryInfo CreateDirectory(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -46,7 +37,7 @@ namespace System.IO
throw new ArgumentException(SR.Argument_PathEmpty, nameof(path));
Contract.EndContractBlock();
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.CreateDirectory(fullPath);
@@ -55,9 +46,9 @@ namespace System.IO
// Input to this method should already be fullpath. This method will ensure that we append
// the trailing slash only when appropriate.
- internal static String EnsureTrailingDirectorySeparator(string fullPath)
+ internal static string EnsureTrailingDirectorySeparator(string fullPath)
{
- String fullPathWithTrailingDirectorySeparator;
+ string fullPathWithTrailingDirectorySeparator;
if (!PathHelpers.EndsInDirectorySeparator(fullPath))
fullPathWithTrailingDirectorySeparator = fullPath + PathHelpers.DirectorySeparatorCharAsString;
@@ -74,7 +65,7 @@ namespace System.IO
// contents.
//
[System.Security.SecuritySafeCritical] // auto-generated
- public static bool Exists(String path)
+ public static bool Exists(string path)
{
try
{
@@ -83,7 +74,7 @@ namespace System.IO
if (path.Length == 0)
return false;
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.DirectoryExists(fullPath);
}
@@ -96,78 +87,78 @@ namespace System.IO
return false;
}
- public static void SetCreationTime(String path, DateTime creationTime)
+ public static void SetCreationTime(string path, DateTime creationTime)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetCreationTime(fullPath, creationTime, asDirectory: true);
}
- public static void SetCreationTimeUtc(String path, DateTime creationTimeUtc)
+ public static void SetCreationTimeUtc(string path, DateTime creationTimeUtc)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetCreationTime(fullPath, File.GetUtcDateTimeOffset(creationTimeUtc), asDirectory: true);
}
- public static DateTime GetCreationTime(String path)
+ public static DateTime GetCreationTime(string path)
{
return File.GetCreationTime(path);
}
- public static DateTime GetCreationTimeUtc(String path)
+ public static DateTime GetCreationTimeUtc(string path)
{
return File.GetCreationTimeUtc(path);
}
- public static void SetLastWriteTime(String path, DateTime lastWriteTime)
+ public static void SetLastWriteTime(string path, DateTime lastWriteTime)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastWriteTime(fullPath, lastWriteTime, asDirectory: true);
}
- public static void SetLastWriteTimeUtc(String path, DateTime lastWriteTimeUtc)
+ public static void SetLastWriteTimeUtc(string path, DateTime lastWriteTimeUtc)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastWriteTime(fullPath, File.GetUtcDateTimeOffset(lastWriteTimeUtc), asDirectory: true);
}
- public static DateTime GetLastWriteTime(String path)
+ public static DateTime GetLastWriteTime(string path)
{
return File.GetLastWriteTime(path);
}
- public static DateTime GetLastWriteTimeUtc(String path)
+ public static DateTime GetLastWriteTimeUtc(string path)
{
return File.GetLastWriteTimeUtc(path);
}
- public static void SetLastAccessTime(String path, DateTime lastAccessTime)
+ public static void SetLastAccessTime(string path, DateTime lastAccessTime)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastAccessTime(fullPath, lastAccessTime, asDirectory: true);
}
- public static void SetLastAccessTimeUtc(String path, DateTime lastAccessTimeUtc)
+ public static void SetLastAccessTimeUtc(string path, DateTime lastAccessTimeUtc)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastAccessTime(fullPath, File.GetUtcDateTimeOffset(lastAccessTimeUtc), asDirectory: true);
}
- public static DateTime GetLastAccessTime(String path)
+ public static DateTime GetLastAccessTime(string path)
{
return File.GetLastAccessTime(path);
}
- public static DateTime GetLastAccessTimeUtc(String path)
+ public static DateTime GetLastAccessTimeUtc(string path)
{
return File.GetLastAccessTimeUtc(path);
}
// Returns an array of filenames in the DirectoryInfo specified by path
- public static String[] GetFiles(String path)
+ public static string[] GetFiles(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetFiles(path, "*", SearchOption.TopDirectoryOnly);
@@ -175,13 +166,13 @@ namespace System.IO
// Returns an array of Files in the current DirectoryInfo matching the
// given search pattern (i.e. "*.txt").
- public static String[] GetFiles(String path, String searchPattern)
+ public static string[] GetFiles(string path, string searchPattern)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetFiles(path, searchPattern, SearchOption.TopDirectoryOnly);
@@ -189,7 +180,7 @@ namespace System.IO
// Returns an array of Files in the current DirectoryInfo matching the
// given search pattern (i.e. "*.txt") and search option
- public static String[] GetFiles(String path, String searchPattern, SearchOption searchOption)
+ public static string[] GetFiles(string path, string searchPattern, SearchOption searchOption)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -197,7 +188,7 @@ namespace System.IO
throw new ArgumentNullException(nameof(searchPattern));
if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories))
throw new ArgumentOutOfRangeException(nameof(searchOption), SR.ArgumentOutOfRange_Enum);
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetFiles(path, searchPattern, searchOption);
@@ -205,7 +196,7 @@ namespace System.IO
// Returns an array of Files in the current DirectoryInfo matching the
// given search pattern (i.e. "*.txt") and search option
- private static String[] InternalGetFiles(String path, String searchPattern, SearchOption searchOption)
+ private static string[] InternalGetFiles(string path, string searchPattern, SearchOption searchOption)
{
Debug.Assert(path != null);
Debug.Assert(searchPattern != null);
@@ -215,11 +206,11 @@ namespace System.IO
}
// Returns an array of Directories in the current directory.
- public static String[] GetDirectories(String path)
+ public static string[] GetDirectories(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetDirectories(path, "*", SearchOption.TopDirectoryOnly);
@@ -227,13 +218,13 @@ namespace System.IO
// Returns an array of Directories in the current DirectoryInfo matching the
// given search criteria (i.e. "*.txt").
- public static String[] GetDirectories(String path, String searchPattern)
+ public static string[] GetDirectories(string path, string searchPattern)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetDirectories(path, searchPattern, SearchOption.TopDirectoryOnly);
@@ -241,7 +232,7 @@ namespace System.IO
// Returns an array of Directories in the current DirectoryInfo matching the
// given search criteria (i.e. "*.txt").
- public static String[] GetDirectories(String path, String searchPattern, SearchOption searchOption)
+ public static string[] GetDirectories(string path, string searchPattern, SearchOption searchOption)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -249,7 +240,7 @@ namespace System.IO
throw new ArgumentNullException(nameof(searchPattern));
if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories))
throw new ArgumentOutOfRangeException(nameof(searchOption), SR.ArgumentOutOfRange_Enum);
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetDirectories(path, searchPattern, searchOption);
@@ -257,22 +248,22 @@ namespace System.IO
// Returns an array of Directories in the current DirectoryInfo matching the
// given search criteria (i.e. "*.txt").
- private static String[] InternalGetDirectories(String path, String searchPattern, SearchOption searchOption)
+ private static string[] InternalGetDirectories(string path, string searchPattern, SearchOption searchOption)
{
Debug.Assert(path != null);
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
return InternalGetFileDirectoryNames(path, path, searchPattern, false, true, searchOption);
}
// Returns an array of strongly typed FileSystemInfo entries in the path
- public static String[] GetFileSystemEntries(String path)
+ public static string[] GetFileSystemEntries(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetFileSystemEntries(path, "*", SearchOption.TopDirectoryOnly);
@@ -280,13 +271,13 @@ namespace System.IO
// Returns an array of strongly typed FileSystemInfo entries in the path with the
// given search criteria (i.e. "*.txt"). We disallow .. as a part of the search criteria
- public static String[] GetFileSystemEntries(String path, String searchPattern)
+ public static string[] GetFileSystemEntries(string path, string searchPattern)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetFileSystemEntries(path, searchPattern, SearchOption.TopDirectoryOnly);
@@ -294,7 +285,7 @@ namespace System.IO
// Returns an array of strongly typed FileSystemInfo entries in the path with the
// given search criteria (i.e. "*.txt"). We disallow .. as a part of the search criteria
- public static String[] GetFileSystemEntries(String path, String searchPattern, SearchOption searchOption)
+ public static string[] GetFileSystemEntries(string path, string searchPattern, SearchOption searchOption)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -302,13 +293,13 @@ namespace System.IO
throw new ArgumentNullException(nameof(searchPattern));
if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories))
throw new ArgumentOutOfRangeException(nameof(searchOption), SR.ArgumentOutOfRange_Enum);
- Contract.Ensures(Contract.Result<String[]>() != null);
+ Contract.Ensures(Contract.Result<string[]>() != null);
Contract.EndContractBlock();
return InternalGetFileSystemEntries(path, searchPattern, searchOption);
}
- private static String[] InternalGetFileSystemEntries(String path, String searchPattern, SearchOption searchOption)
+ private static string[] InternalGetFileSystemEntries(string path, string searchPattern, SearchOption searchOption)
{
Debug.Assert(path != null);
Debug.Assert(searchPattern != null);
@@ -322,19 +313,19 @@ namespace System.IO
// the given search criteria against every dir.
// For all the dirs/files returned, it will then demand path discovery permission for
// their parent folders (it will avoid duplicate permission checks)
- internal static String[] InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, bool includeFiles, bool includeDirs, SearchOption searchOption)
+ internal static string[] InternalGetFileDirectoryNames(string path, string userPathOriginal, string searchPattern, bool includeFiles, bool includeDirs, SearchOption searchOption)
{
Debug.Assert(path != null);
Debug.Assert(userPathOriginal != null);
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
- IEnumerable<String> enumerable = FileSystem.Current.EnumeratePaths(path, searchPattern, searchOption,
+ IEnumerable<string> enumerable = FileSystem.Current.EnumeratePaths(path, searchPattern, searchOption,
(includeFiles ? SearchTarget.Files : 0) | (includeDirs ? SearchTarget.Directories : 0));
return EnumerableHelpers.ToArray(enumerable);
}
- public static IEnumerable<String> EnumerateDirectories(String path)
+ public static IEnumerable<string> EnumerateDirectories(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -343,7 +334,7 @@ namespace System.IO
return InternalEnumerateDirectories(path, "*", SearchOption.TopDirectoryOnly);
}
- public static IEnumerable<String> EnumerateDirectories(String path, String searchPattern)
+ public static IEnumerable<string> EnumerateDirectories(string path, string searchPattern)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -354,7 +345,7 @@ namespace System.IO
return InternalEnumerateDirectories(path, searchPattern, SearchOption.TopDirectoryOnly);
}
- public static IEnumerable<String> EnumerateDirectories(String path, String searchPattern, SearchOption searchOption)
+ public static IEnumerable<string> EnumerateDirectories(string path, string searchPattern, SearchOption searchOption)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -367,7 +358,7 @@ namespace System.IO
return InternalEnumerateDirectories(path, searchPattern, searchOption);
}
- private static IEnumerable<String> InternalEnumerateDirectories(String path, String searchPattern, SearchOption searchOption)
+ private static IEnumerable<string> InternalEnumerateDirectories(string path, string searchPattern, SearchOption searchOption)
{
Debug.Assert(path != null);
Debug.Assert(searchPattern != null);
@@ -376,29 +367,29 @@ namespace System.IO
return EnumerateFileSystemNames(path, searchPattern, searchOption, false, true);
}
- public static IEnumerable<String> EnumerateFiles(String path)
+ public static IEnumerable<string> EnumerateFiles(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
Contract.EndContractBlock();
return InternalEnumerateFiles(path, "*", SearchOption.TopDirectoryOnly);
}
- public static IEnumerable<String> EnumerateFiles(String path, String searchPattern)
+ public static IEnumerable<string> EnumerateFiles(string path, string searchPattern)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
Contract.EndContractBlock();
return InternalEnumerateFiles(path, searchPattern, SearchOption.TopDirectoryOnly);
}
- public static IEnumerable<String> EnumerateFiles(String path, String searchPattern, SearchOption searchOption)
+ public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOption)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -406,45 +397,45 @@ namespace System.IO
throw new ArgumentNullException(nameof(searchPattern));
if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories))
throw new ArgumentOutOfRangeException(nameof(searchOption), SR.ArgumentOutOfRange_Enum);
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
Contract.EndContractBlock();
return InternalEnumerateFiles(path, searchPattern, searchOption);
}
- private static IEnumerable<String> InternalEnumerateFiles(String path, String searchPattern, SearchOption searchOption)
+ private static IEnumerable<string> InternalEnumerateFiles(string path, string searchPattern, SearchOption searchOption)
{
Debug.Assert(path != null);
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
return EnumerateFileSystemNames(path, searchPattern, searchOption, true, false);
}
- public static IEnumerable<String> EnumerateFileSystemEntries(String path)
+ public static IEnumerable<string> EnumerateFileSystemEntries(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
Contract.EndContractBlock();
return InternalEnumerateFileSystemEntries(path, "*", SearchOption.TopDirectoryOnly);
}
- public static IEnumerable<String> EnumerateFileSystemEntries(String path, String searchPattern)
+ public static IEnumerable<string> EnumerateFileSystemEntries(string path, string searchPattern)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
Contract.EndContractBlock();
return InternalEnumerateFileSystemEntries(path, searchPattern, SearchOption.TopDirectoryOnly);
}
- public static IEnumerable<String> EnumerateFileSystemEntries(String path, String searchPattern, SearchOption searchOption)
+ public static IEnumerable<string> EnumerateFileSystemEntries(string path, string searchPattern, SearchOption searchOption)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -452,48 +443,48 @@ namespace System.IO
throw new ArgumentNullException(nameof(searchPattern));
if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories))
throw new ArgumentOutOfRangeException(nameof(searchOption), SR.ArgumentOutOfRange_Enum);
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
Contract.EndContractBlock();
return InternalEnumerateFileSystemEntries(path, searchPattern, searchOption);
}
- private static IEnumerable<String> InternalEnumerateFileSystemEntries(String path, String searchPattern, SearchOption searchOption)
+ private static IEnumerable<string> InternalEnumerateFileSystemEntries(string path, string searchPattern, SearchOption searchOption)
{
Debug.Assert(path != null);
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
return EnumerateFileSystemNames(path, searchPattern, searchOption, true, true);
}
- private static IEnumerable<String> EnumerateFileSystemNames(String path, String searchPattern, SearchOption searchOption,
+ private static IEnumerable<string> EnumerateFileSystemNames(string path, string searchPattern, SearchOption searchOption,
bool includeFiles, bool includeDirs)
{
Debug.Assert(path != null);
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
- Contract.Ensures(Contract.Result<IEnumerable<String>>() != null);
+ Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
return FileSystem.Current.EnumeratePaths(path, searchPattern, searchOption,
(includeFiles ? SearchTarget.Files : 0) | (includeDirs ? SearchTarget.Directories : 0));
}
[System.Security.SecuritySafeCritical]
- public static String GetDirectoryRoot(String path)
+ public static string GetDirectoryRoot(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
Contract.EndContractBlock();
- String fullPath = Path.GetFullPath(path);
- String root = fullPath.Substring(0, PathInternal.GetRootLength(fullPath));
+ string fullPath = Path.GetFullPath(path);
+ string root = fullPath.Substring(0, PathInternal.GetRootLength(fullPath));
return root;
}
- internal static String InternalGetDirectoryRoot(String path)
+ internal static string InternalGetDirectoryRoot(string path)
{
if (path == null) return null;
return path.Substring(0, PathInternal.GetRootLength(path));
@@ -507,14 +498,14 @@ namespace System.IO
**Exceptions:
==============================================================================*/
[System.Security.SecuritySafeCritical]
- public static String GetCurrentDirectory()
+ public static string GetCurrentDirectory()
{
return FileSystem.Current.GetCurrentDirectory();
}
[System.Security.SecurityCritical] // auto-generated
- public static void SetCurrentDirectory(String path)
+ public static void SetCurrentDirectory(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -524,13 +515,13 @@ namespace System.IO
if (PathInternal.IsPathTooLong(path))
throw new PathTooLongException(SR.IO_PathTooLong);
- String fulldestDirName = Path.GetFullPath(path);
+ string fulldestDirName = Path.GetFullPath(path);
FileSystem.Current.SetCurrentDirectory(fulldestDirName);
}
[System.Security.SecuritySafeCritical]
- public static void Move(String sourceDirName, String destDirName)
+ public static void Move(string sourceDirName, string destDirName)
{
if (sourceDirName == null)
throw new ArgumentNullException(nameof(sourceDirName));
@@ -543,25 +534,25 @@ namespace System.IO
throw new ArgumentException(SR.Argument_EmptyFileName, nameof(destDirName));
Contract.EndContractBlock();
- String fullsourceDirName = Path.GetFullPath(sourceDirName);
- String sourcePath = EnsureTrailingDirectorySeparator(fullsourceDirName);
+ string fullsourceDirName = Path.GetFullPath(sourceDirName);
+ string sourcePath = EnsureTrailingDirectorySeparator(fullsourceDirName);
if (PathInternal.IsDirectoryTooLong(sourcePath))
throw new PathTooLongException(SR.IO_PathTooLong);
- String fulldestDirName = Path.GetFullPath(destDirName);
- String destPath = EnsureTrailingDirectorySeparator(fulldestDirName);
+ string fulldestDirName = Path.GetFullPath(destDirName);
+ string destPath = EnsureTrailingDirectorySeparator(fulldestDirName);
if (PathInternal.IsDirectoryTooLong(destPath))
throw new PathTooLongException(SR.IO_PathTooLong);
StringComparison pathComparison = PathInternal.StringComparison;
- if (String.Equals(sourcePath, destPath, pathComparison))
+ if (string.Equals(sourcePath, destPath, pathComparison))
throw new IOException(SR.IO_SourceDestMustBeDifferent);
- String sourceRoot = Path.GetPathRoot(sourcePath);
- String destinationRoot = Path.GetPathRoot(destPath);
- if (!String.Equals(sourceRoot, destinationRoot, pathComparison))
+ string sourceRoot = Path.GetPathRoot(sourcePath);
+ string destinationRoot = Path.GetPathRoot(destPath);
+ if (!string.Equals(sourceRoot, destinationRoot, pathComparison))
throw new IOException(SR.IO_SourceDestMustHaveSameRoot);
// Windows will throw if the source file/directory doesn't exist, we preemptively check
@@ -576,16 +567,16 @@ namespace System.IO
}
[System.Security.SecuritySafeCritical]
- public static void Delete(String path)
+ public static void Delete(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.RemoveDirectory(fullPath, false);
}
[System.Security.SecuritySafeCritical]
- public static void Delete(String path, bool recursive)
+ public static void Delete(string path, bool recursive)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.RemoveDirectory(fullPath, recursive);
}
diff --git a/src/System.IO.FileSystem/src/System/IO/DirectoryInfo.cs b/src/System.IO.FileSystem/src/System/IO/DirectoryInfo.cs
index 4b4a274997..9842c70f87 100644
--- a/src/System.IO.FileSystem/src/System/IO/DirectoryInfo.cs
+++ b/src/System.IO.FileSystem/src/System/IO/DirectoryInfo.cs
@@ -6,7 +6,6 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.Contracts;
using System.Security;
-using System.Runtime.Serialization;
namespace System.IO
{
@@ -14,7 +13,7 @@ namespace System.IO
public sealed partial class DirectoryInfo : FileSystemInfo
{
[System.Security.SecuritySafeCritical]
- public DirectoryInfo(String path)
+ public DirectoryInfo(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -26,7 +25,7 @@ namespace System.IO
}
[System.Security.SecuritySafeCritical]
- internal DirectoryInfo(String fullPath, String originalPath)
+ internal DirectoryInfo(string fullPath, string originalPath)
{
Debug.Assert(Path.IsPathRooted(fullPath), "fullPath must be fully qualified!");
@@ -36,7 +35,7 @@ namespace System.IO
DisplayPath = GetDisplayName(OriginalPath);
}
- public override String Name
+ public override string Name
{
get
{
@@ -68,7 +67,7 @@ namespace System.IO
[System.Security.SecuritySafeCritical]
- public DirectoryInfo CreateSubdirectory(String path)
+ public DirectoryInfo CreateSubdirectory(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -78,16 +77,16 @@ namespace System.IO
}
[System.Security.SecurityCritical] // auto-generated
- private DirectoryInfo CreateSubdirectoryHelper(String path)
+ private DirectoryInfo CreateSubdirectoryHelper(string path)
{
Debug.Assert(path != null);
PathHelpers.ThrowIfEmptyOrRootedPath(path);
- String newDirs = Path.Combine(FullPath, path);
- String fullPath = Path.GetFullPath(newDirs);
+ string newDirs = Path.Combine(FullPath, path);
+ string fullPath = Path.GetFullPath(newDirs);
- if (0 != String.Compare(FullPath, 0, fullPath, 0, FullPath.Length, PathInternal.StringComparison))
+ if (0 != string.Compare(FullPath, 0, fullPath, 0, FullPath.Length, PathInternal.StringComparison))
{
throw new ArgumentException(SR.Format(SR.Argument_InvalidSubPath, path, DisplayPath), nameof(path));
}
@@ -128,7 +127,7 @@ namespace System.IO
// Returns an array of Files in the current DirectoryInfo matching the
// given search criteria (i.e. "*.txt").
[SecurityCritical]
- public FileInfo[] GetFiles(String searchPattern)
+ public FileInfo[] GetFiles(string searchPattern)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -139,7 +138,7 @@ namespace System.IO
// Returns an array of Files in the current DirectoryInfo matching the
// given search criteria (i.e. "*.txt").
- public FileInfo[] GetFiles(String searchPattern, SearchOption searchOption)
+ public FileInfo[] GetFiles(string searchPattern, SearchOption searchOption)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -152,7 +151,7 @@ namespace System.IO
// Returns an array of Files in the current DirectoryInfo matching the
// given search criteria (i.e. "*.txt").
- private FileInfo[] InternalGetFiles(String searchPattern, SearchOption searchOption)
+ private FileInfo[] InternalGetFiles(string searchPattern, SearchOption searchOption)
{
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
@@ -175,7 +174,7 @@ namespace System.IO
// Returns an array of strongly typed FileSystemInfo entries in the path with the
// given search criteria (i.e. "*.txt").
- public FileSystemInfo[] GetFileSystemInfos(String searchPattern)
+ public FileSystemInfo[] GetFileSystemInfos(string searchPattern)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -186,7 +185,7 @@ namespace System.IO
// Returns an array of strongly typed FileSystemInfo entries in the path with the
// given search criteria (i.e. "*.txt").
- public FileSystemInfo[] GetFileSystemInfos(String searchPattern, SearchOption searchOption)
+ public FileSystemInfo[] GetFileSystemInfos(string searchPattern, SearchOption searchOption)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -199,7 +198,7 @@ namespace System.IO
// Returns an array of strongly typed FileSystemInfo entries in the path with the
// given search criteria (i.e. "*.txt").
- private FileSystemInfo[] InternalGetFileSystemInfos(String searchPattern, SearchOption searchOption)
+ private FileSystemInfo[] InternalGetFileSystemInfos(string searchPattern, SearchOption searchOption)
{
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
@@ -218,7 +217,7 @@ namespace System.IO
// Returns an array of Directories in the current DirectoryInfo matching the
// given search criteria (i.e. "System*" could match the System & System32
// directories).
- public DirectoryInfo[] GetDirectories(String searchPattern)
+ public DirectoryInfo[] GetDirectories(string searchPattern)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -230,7 +229,7 @@ namespace System.IO
// Returns an array of Directories in the current DirectoryInfo matching the
// given search criteria (i.e. "System*" could match the System & System32
// directories).
- public DirectoryInfo[] GetDirectories(String searchPattern, SearchOption searchOption)
+ public DirectoryInfo[] GetDirectories(string searchPattern, SearchOption searchOption)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -244,7 +243,7 @@ namespace System.IO
// Returns an array of Directories in the current DirectoryInfo matching the
// given search criteria (i.e. "System*" could match the System & System32
// directories).
- private DirectoryInfo[] InternalGetDirectories(String searchPattern, SearchOption searchOption)
+ private DirectoryInfo[] InternalGetDirectories(string searchPattern, SearchOption searchOption)
{
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
@@ -258,7 +257,7 @@ namespace System.IO
return InternalEnumerateDirectories("*", SearchOption.TopDirectoryOnly);
}
- public IEnumerable<DirectoryInfo> EnumerateDirectories(String searchPattern)
+ public IEnumerable<DirectoryInfo> EnumerateDirectories(string searchPattern)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -267,7 +266,7 @@ namespace System.IO
return InternalEnumerateDirectories(searchPattern, SearchOption.TopDirectoryOnly);
}
- public IEnumerable<DirectoryInfo> EnumerateDirectories(String searchPattern, SearchOption searchOption)
+ public IEnumerable<DirectoryInfo> EnumerateDirectories(string searchPattern, SearchOption searchOption)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -278,7 +277,7 @@ namespace System.IO
return InternalEnumerateDirectories(searchPattern, searchOption);
}
- private IEnumerable<DirectoryInfo> InternalEnumerateDirectories(String searchPattern, SearchOption searchOption)
+ private IEnumerable<DirectoryInfo> InternalEnumerateDirectories(string searchPattern, SearchOption searchOption)
{
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
@@ -291,7 +290,7 @@ namespace System.IO
return InternalEnumerateFiles("*", SearchOption.TopDirectoryOnly);
}
- public IEnumerable<FileInfo> EnumerateFiles(String searchPattern)
+ public IEnumerable<FileInfo> EnumerateFiles(string searchPattern)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -300,7 +299,7 @@ namespace System.IO
return InternalEnumerateFiles(searchPattern, SearchOption.TopDirectoryOnly);
}
- public IEnumerable<FileInfo> EnumerateFiles(String searchPattern, SearchOption searchOption)
+ public IEnumerable<FileInfo> EnumerateFiles(string searchPattern, SearchOption searchOption)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -311,7 +310,7 @@ namespace System.IO
return InternalEnumerateFiles(searchPattern, searchOption);
}
- private IEnumerable<FileInfo> InternalEnumerateFiles(String searchPattern, SearchOption searchOption)
+ private IEnumerable<FileInfo> InternalEnumerateFiles(string searchPattern, SearchOption searchOption)
{
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
@@ -324,7 +323,7 @@ namespace System.IO
return InternalEnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly);
}
- public IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(String searchPattern)
+ public IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(string searchPattern)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -333,7 +332,7 @@ namespace System.IO
return InternalEnumerateFileSystemInfos(searchPattern, SearchOption.TopDirectoryOnly);
}
- public IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(String searchPattern, SearchOption searchOption)
+ public IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(string searchPattern, SearchOption searchOption)
{
if (searchPattern == null)
throw new ArgumentNullException(nameof(searchPattern));
@@ -344,7 +343,7 @@ namespace System.IO
return InternalEnumerateFileSystemInfos(searchPattern, searchOption);
}
- private IEnumerable<FileSystemInfo> InternalEnumerateFileSystemInfos(String searchPattern, SearchOption searchOption)
+ private IEnumerable<FileSystemInfo> InternalEnumerateFileSystemInfos(string searchPattern, SearchOption searchOption)
{
Debug.Assert(searchPattern != null);
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
@@ -367,7 +366,7 @@ namespace System.IO
[System.Security.SecuritySafeCritical]
get
{
- String rootPath = Path.GetPathRoot(FullPath);
+ string rootPath = Path.GetPathRoot(FullPath);
return new DirectoryInfo(rootPath);
}
@@ -442,12 +441,12 @@ namespace System.IO
/// <summary>
/// Returns the original path. Use FullPath or Name properties for the path / directory name.
/// </summary>
- public override String ToString()
+ public override string ToString()
{
return DisplayPath;
}
- private static String GetDisplayName(String originalPath)
+ private static string GetDisplayName(string originalPath)
{
Debug.Assert(originalPath != null);
@@ -458,7 +457,7 @@ namespace System.IO
originalPath;
}
- private static String GetDirName(String fullPath)
+ private static string GetDirName(string fullPath)
{
Debug.Assert(fullPath != null);
diff --git a/src/System.IO.FileSystem/src/System/IO/DisableMediaInsertionPrompt.cs b/src/System.IO.FileSystem/src/System/IO/DisableMediaInsertionPrompt.cs
new file mode 100644
index 0000000000..ca6261e8e7
--- /dev/null
+++ b/src/System.IO.FileSystem/src/System/IO/DisableMediaInsertionPrompt.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace System.IO
+{
+ /// <summary>
+ /// Simple wrapper to safely disable the normal media insertion prompt for
+ /// removable media (floppies, cds, memory cards, etc.)
+ /// </summary>
+ /// <remarks>
+ /// Note that removable media file systems lazily load. After starting the OS
+ /// they won't be loaded until you have media in the drive- and as such the
+ /// prompt won't happen. You have to have had media in at least once to get
+ /// the file system to load and then have removed it.
+ /// </remarks>
+ public sealed class DisableMediaInsertionPrompt : IDisposable
+ {
+ private bool _disableSuccess;
+ private uint _oldMode;
+
+ public DisableMediaInsertionPrompt()
+ {
+ _disableSuccess = Interop.Kernel32.SetThreadErrorMode(Interop.Kernel32.SEM_FAILCRITICALERRORS, out _oldMode);
+ }
+
+ public void Dispose()
+ {
+ uint ignore;
+ if (_disableSuccess)
+ Interop.Kernel32.SetThreadErrorMode(_oldMode, out ignore);
+ }
+ }
+}
diff --git a/src/System.IO.FileSystem/src/System/IO/Error.cs b/src/System.IO.FileSystem/src/System/IO/Error.cs
index c8434ffad8..c0fd1450e2 100644
--- a/src/System.IO.FileSystem/src/System/IO/Error.cs
+++ b/src/System.IO.FileSystem/src/System/IO/Error.cs
@@ -2,16 +2,12 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Globalization;
using System.Diagnostics.Contracts;
namespace System.IO
{
/// <summary>
- /// Provides centralized methods for creating exceptions for System.IO.FileSystem.
+ /// Provides centralized methods for creating exceptions for System.IO.FileSystem.
/// </summary>
[Pure]
internal static class Error
diff --git a/src/System.IO.FileSystem/src/System/IO/File.cs b/src/System.IO.FileSystem/src/System/IO/File.cs
index c58fed4c4b..af43f0e260 100644
--- a/src/System.IO.FileSystem/src/System/IO/File.cs
+++ b/src/System.IO.FileSystem/src/System/IO/File.cs
@@ -21,7 +21,7 @@ namespace System.IO
internal const int DefaultBufferSize = 4096;
- public static StreamReader OpenText(String path)
+ public static StreamReader OpenText(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -30,7 +30,7 @@ namespace System.IO
return new StreamReader(path);
}
- public static StreamWriter CreateText(String path)
+ public static StreamWriter CreateText(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -39,7 +39,7 @@ namespace System.IO
return new StreamWriter(path, append: false);
}
- public static StreamWriter AppendText(String path)
+ public static StreamWriter AppendText(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -51,14 +51,14 @@ namespace System.IO
// Copies an existing file to a new file. An exception is raised if the
// destination file already exists. Use the
- // Copy(String, String, boolean) method to allow
+ // Copy(string, string, boolean) method to allow
// overwriting an existing file.
//
// The caller must have certain FileIOPermissions. The caller must have
// Read permission to sourceFileName and Create
// and Write permissions to destFileName.
//
- public static void Copy(String sourceFileName, String destFileName)
+ public static void Copy(string sourceFileName, string destFileName)
{
if (sourceFileName == null)
throw new ArgumentNullException(nameof(sourceFileName), SR.ArgumentNull_FileName);
@@ -82,7 +82,7 @@ namespace System.IO
// Read permission to sourceFileName
// and Write permissions to destFileName.
//
- public static void Copy(String sourceFileName, String destFileName, bool overwrite)
+ public static void Copy(string sourceFileName, string destFileName, bool overwrite)
{
if (sourceFileName == null)
throw new ArgumentNullException(nameof(sourceFileName), SR.ArgumentNull_FileName);
@@ -101,15 +101,15 @@ namespace System.IO
/// Note: This returns the fully qualified name of the destination file.
/// </devdoc>
[System.Security.SecuritySafeCritical]
- internal static String InternalCopy(String sourceFileName, String destFileName, bool overwrite)
+ internal static string InternalCopy(string sourceFileName, string destFileName, bool overwrite)
{
Debug.Assert(sourceFileName != null);
Debug.Assert(destFileName != null);
Debug.Assert(sourceFileName.Length > 0);
Debug.Assert(destFileName.Length > 0);
- String fullSourceFileName = Path.GetFullPath(sourceFileName);
- String fullDestFileName = Path.GetFullPath(destFileName);
+ string fullSourceFileName = Path.GetFullPath(sourceFileName);
+ string fullDestFileName = Path.GetFullPath(destFileName);
FileSystem.Current.CopyFile(fullSourceFileName, fullDestFileName, overwrite);
@@ -138,12 +138,12 @@ namespace System.IO
// Your application must have Create, Read, and Write permissions to
// the file.
//
- public static FileStream Create(String path, int bufferSize)
+ public static FileStream Create(string path, int bufferSize)
{
return new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None, bufferSize);
}
- public static FileStream Create(String path, int bufferSize, FileOptions options)
+ public static FileStream Create(string path, int bufferSize, FileOptions options)
{
return new FileStream(path, FileMode.Create, FileAccess.ReadWrite,
FileShare.None, bufferSize, options);
@@ -159,13 +159,13 @@ namespace System.IO
// Your application must have Delete permission to the target file.
//
[System.Security.SecuritySafeCritical]
- public static void Delete(String path)
+ public static void Delete(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
Contract.EndContractBlock();
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.DeleteFile(fullPath);
}
@@ -179,7 +179,7 @@ namespace System.IO
// Your application must have Read permission for the target directory.
//
[System.Security.SecuritySafeCritical]
- public static bool Exists(String path)
+ public static bool Exists(string path)
{
try
{
@@ -210,22 +210,22 @@ namespace System.IO
}
[System.Security.SecurityCritical] // auto-generated
- internal static bool InternalExists(String path)
+ internal static bool InternalExists(string path)
{
return FileSystem.Current.FileExists(path);
}
- public static FileStream Open(String path, FileMode mode)
+ public static FileStream Open(string path, FileMode mode)
{
return Open(path, mode, (mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite), FileShare.None);
}
- public static FileStream Open(String path, FileMode mode, FileAccess access)
+ public static FileStream Open(string path, FileMode mode, FileAccess access)
{
return Open(path, mode, access, FileShare.None);
}
- public static FileStream Open(String path, FileMode mode, FileAccess access, FileShare share)
+ public static FileStream Open(string path, FileMode mode, FileAccess access, FileShare share)
{
return new FileStream(path, mode, access, share);
}
@@ -242,113 +242,112 @@ namespace System.IO
return dateTime.ToUniversalTime();
}
- public static void SetCreationTime(String path, DateTime creationTime)
+ public static void SetCreationTime(string path, DateTime creationTime)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetCreationTime(fullPath, creationTime, asDirectory: false);
}
- public static void SetCreationTimeUtc(String path, DateTime creationTimeUtc)
+ public static void SetCreationTimeUtc(string path, DateTime creationTimeUtc)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetCreationTime(fullPath, GetUtcDateTimeOffset(creationTimeUtc), asDirectory: false);
}
[System.Security.SecuritySafeCritical]
- public static DateTime GetCreationTime(String path)
+ public static DateTime GetCreationTime(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.GetCreationTime(fullPath).LocalDateTime;
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static DateTime GetCreationTimeUtc(String path)
+ public static DateTime GetCreationTimeUtc(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.GetCreationTime(fullPath).UtcDateTime;
}
- public static void SetLastAccessTime(String path, DateTime lastAccessTime)
+ public static void SetLastAccessTime(string path, DateTime lastAccessTime)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastAccessTime(fullPath, lastAccessTime, asDirectory: false);
}
- public static void SetLastAccessTimeUtc(String path, DateTime lastAccessTimeUtc)
+ public static void SetLastAccessTimeUtc(string path, DateTime lastAccessTimeUtc)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastAccessTime(fullPath, GetUtcDateTimeOffset(lastAccessTimeUtc), asDirectory: false);
}
[System.Security.SecuritySafeCritical]
- public static DateTime GetLastAccessTime(String path)
+ public static DateTime GetLastAccessTime(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.GetLastAccessTime(fullPath).LocalDateTime;
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static DateTime GetLastAccessTimeUtc(String path)
+ public static DateTime GetLastAccessTimeUtc(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.GetLastAccessTime(fullPath).UtcDateTime;
}
- public static void SetLastWriteTime(String path, DateTime lastWriteTime)
+ public static void SetLastWriteTime(string path, DateTime lastWriteTime)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastWriteTime(fullPath, lastWriteTime, asDirectory: false);
}
- public static void SetLastWriteTimeUtc(String path, DateTime lastWriteTimeUtc)
+ public static void SetLastWriteTimeUtc(string path, DateTime lastWriteTimeUtc)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetLastWriteTime(fullPath, GetUtcDateTimeOffset(lastWriteTimeUtc), asDirectory: false);
}
[System.Security.SecuritySafeCritical]
- public static DateTime GetLastWriteTime(String path)
+ public static DateTime GetLastWriteTime(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.GetLastWriteTime(fullPath).LocalDateTime;
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static DateTime GetLastWriteTimeUtc(String path)
+ public static DateTime GetLastWriteTimeUtc(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.GetLastWriteTime(fullPath).UtcDateTime;
}
[System.Security.SecuritySafeCritical]
- public static FileAttributes GetAttributes(String path)
+ public static FileAttributes GetAttributes(string path)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
return FileSystem.Current.GetAttributes(fullPath);
}
[System.Security.SecurityCritical]
- public static void SetAttributes(String path, FileAttributes fileAttributes)
+ public static void SetAttributes(string path, FileAttributes fileAttributes)
{
- String fullPath = Path.GetFullPath(path);
+ string fullPath = Path.GetFullPath(path);
FileSystem.Current.SetAttributes(fullPath, fileAttributes);
}
[System.Security.SecuritySafeCritical]
- public static FileStream OpenRead(String path)
+ public static FileStream OpenRead(string path)
{
return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
}
-
- public static FileStream OpenWrite(String path)
+ public static FileStream OpenWrite(string path)
{
return new FileStream(path, FileMode.OpenOrCreate,
FileAccess.Write, FileShare.None);
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static String ReadAllText(String path)
+ public static string ReadAllText(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -360,7 +359,7 @@ namespace System.IO
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static String ReadAllText(String path, Encoding encoding)
+ public static string ReadAllText(string path, Encoding encoding)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -374,7 +373,7 @@ namespace System.IO
}
[System.Security.SecurityCritical]
- private static String InternalReadAllText(String path, Encoding encoding)
+ private static string InternalReadAllText(string path, Encoding encoding)
{
Debug.Assert(path != null);
Debug.Assert(encoding != null);
@@ -385,7 +384,7 @@ namespace System.IO
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static void WriteAllText(String path, String contents)
+ public static void WriteAllText(string path, string contents)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -400,7 +399,7 @@ namespace System.IO
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static void WriteAllText(String path, String contents, Encoding encoding)
+ public static void WriteAllText(string path, string contents, Encoding encoding)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -417,19 +416,19 @@ namespace System.IO
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static byte[] ReadAllBytes(String path)
+ public static byte[] ReadAllBytes(string path)
{
return InternalReadAllBytes(path);
}
[System.Security.SecurityCritical]
- private static byte[] InternalReadAllBytes(String path)
+ private static byte[] InternalReadAllBytes(string path)
{
// bufferSize == 1 used to avoid unnecessary buffer in FileStream
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 1))
{
long fileLength = fs.Length;
- if (fileLength > Int32.MaxValue)
+ if (fileLength > int.MaxValue)
throw new IOException(SR.IO_FileTooLong2GB);
int index = 0;
@@ -448,7 +447,7 @@ namespace System.IO
}
[System.Security.SecuritySafeCritical] // auto-generated
- public static void WriteAllBytes(String path, byte[] bytes)
+ public static void WriteAllBytes(string path, byte[] bytes)
{
if (path == null)
throw new ArgumentNullException(nameof(path), SR.ArgumentNull_Path);
@@ -462,7 +461,7 @@ namespace System.IO
}
[System.Security.SecurityCritical]
- private static void InternalWriteAllBytes(String path, byte[] bytes)
+ private static void InternalWriteAllBytes(string path, byte[] bytes)
{
Debug.Assert(path != null);
Debug.Assert(path.Length != 0);
@@ -473,7 +472,7 @@ namespace System.IO
fs.Write(bytes, 0, bytes.Length);
}
}
- public static String[] ReadAllLines(String path)
+ public static string[] ReadAllLines(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -484,7 +483,7 @@ namespace System.IO
return InternalReadAllLines(path, Encoding.UTF8);
}
- public static String[] ReadAllLines(String path, Encoding encoding)
+ public static string[] ReadAllLines(string path, Encoding encoding)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -497,14 +496,14 @@ namespace System.IO
return InternalReadAllLines(path, encoding);
}
- private static String[] InternalReadAllLines(String path, Encoding encoding)
+ private static string[] InternalReadAllLines(string path, Encoding encoding)
{
Debug.Assert(path != null);
Debug.Assert(encoding != null);
Debug.Assert(path.Length != 0);
- String line;
- List<String> lines = new List<String>();
+ string line;
+ List<string> lines = new List<string>();
using (StreamReader sr = new StreamReader(path, encoding))
while ((line = sr.ReadLine()) != null)
@@ -513,7 +512,7 @@ namespace System.IO
return lines.ToArray();
}
- public static IEnumerable<String> ReadLines(String path)
+ public static IEnumerable<string> ReadLines(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -524,7 +523,7 @@ namespace System.IO
return ReadLinesIterator.CreateIterator(path, Encoding.UTF8);
}
- public static IEnumerable<String> ReadLines(String path, Encoding encoding)
+ public static IEnumerable<string> ReadLines(string path, Encoding encoding)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -537,12 +536,12 @@ namespace System.IO
return ReadLinesIterator.CreateIterator(path, encoding);
}
- public static void WriteAllLines(String path, String[] contents)
+ public static void WriteAllLines(string path, string[] contents)
{
- WriteAllLines(path, (IEnumerable<String>)contents);
+ WriteAllLines(path, (IEnumerable<string>)contents);
}
- public static void WriteAllLines(String path, IEnumerable<String> contents)
+ public static void WriteAllLines(string path, IEnumerable<string> contents)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -555,12 +554,12 @@ namespace System.IO
InternalWriteAllLines(new StreamWriter(path), contents);
}
- public static void WriteAllLines(String path, String[] contents, Encoding encoding)
+ public static void WriteAllLines(string path, string[] contents, Encoding encoding)
{
- WriteAllLines(path, (IEnumerable<String>)contents, encoding);
+ WriteAllLines(path, (IEnumerable<string>)contents, encoding);
}
- public static void WriteAllLines(String path, IEnumerable<String> contents, Encoding encoding)
+ public static void WriteAllLines(string path, IEnumerable<string> contents, Encoding encoding)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -575,21 +574,21 @@ namespace System.IO
InternalWriteAllLines(new StreamWriter(path, false, encoding), contents);
}
- private static void InternalWriteAllLines(TextWriter writer, IEnumerable<String> contents)
+ private static void InternalWriteAllLines(TextWriter writer, IEnumerable<string> contents)
{
Debug.Assert(writer != null);
Debug.Assert(contents != null);
using (writer)
{
- foreach (String line in contents)
+ foreach (string line in contents)
{
writer.WriteLine(line);
}
}
}
- public static void AppendAllText(String path, String contents)
+ public static void AppendAllText(string path, string contents)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -603,7 +602,7 @@ namespace System.IO
}
}
- public static void AppendAllText(String path, String contents, Encoding encoding)
+ public static void AppendAllText(string path, string contents, Encoding encoding)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -619,7 +618,7 @@ namespace System.IO
}
}
- public static void AppendAllLines(String path, IEnumerable<String> contents)
+ public static void AppendAllLines(string path, IEnumerable<string> contents)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -632,7 +631,7 @@ namespace System.IO
InternalWriteAllLines(new StreamWriter(path, append: true), contents);
}
- public static void AppendAllLines(String path, IEnumerable<String> contents, Encoding encoding)
+ public static void AppendAllLines(string path, IEnumerable<string> contents, Encoding encoding)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -647,12 +646,12 @@ namespace System.IO
InternalWriteAllLines(new StreamWriter(path, true, encoding), contents);
}
- public static void Replace(String sourceFileName, String destinationFileName, String destinationBackupFileName)
+ public static void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName)
{
Replace(sourceFileName, destinationFileName, destinationBackupFileName, ignoreMetadataErrors: false);
}
- public static void Replace(String sourceFileName, String destinationFileName, String destinationBackupFileName, bool ignoreMetadataErrors)
+ public static void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors)
{
if (sourceFileName == null)
throw new ArgumentNullException(nameof(sourceFileName));
@@ -675,7 +674,7 @@ namespace System.IO
// permissions to destFileName.
//
[System.Security.SecuritySafeCritical]
- public static void Move(String sourceFileName, String destFileName)
+ public static void Move(string sourceFileName, string destFileName)
{
if (sourceFileName == null)
throw new ArgumentNullException(nameof(sourceFileName), SR.ArgumentNull_FileName);
@@ -687,8 +686,8 @@ namespace System.IO
throw new ArgumentException(SR.Argument_EmptyFileName, nameof(destFileName));
Contract.EndContractBlock();
- String fullSourceFileName = Path.GetFullPath(sourceFileName);
- String fullDestFileName = Path.GetFullPath(destFileName);
+ string fullSourceFileName = Path.GetFullPath(sourceFileName);
+ string fullDestFileName = Path.GetFullPath(destFileName);
if (!InternalExists(fullSourceFileName))
{
@@ -698,7 +697,7 @@ namespace System.IO
FileSystem.Current.MoveFile(fullSourceFileName, fullDestFileName);
}
- public static void Encrypt(String path)
+ public static void Encrypt(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -711,7 +710,7 @@ namespace System.IO
throw new PlatformNotSupportedException(SR.PlatformNotSupported_FileEncryption);
}
- public static void Decrypt(String path)
+ public static void Decrypt(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
@@ -907,7 +906,7 @@ namespace System.IO
: InternalWriteAllBytesAsync(path, bytes, cancellationToken);
}
- private static async Task InternalWriteAllBytesAsync(String path, byte[] bytes, CancellationToken cancellationToken)
+ private static async Task InternalWriteAllBytesAsync(string path, byte[] bytes, CancellationToken cancellationToken)
{
Debug.Assert(!string.IsNullOrEmpty(path));
Debug.Assert(bytes != null);
diff --git a/src/System.IO.FileSystem/src/System/IO/FileInfo.cs b/src/System.IO.FileSystem/src/System/IO/FileInfo.cs
index e13fcfe9f5..0a3540bace 100644
--- a/src/System.IO.FileSystem/src/System/IO/FileInfo.cs
+++ b/src/System.IO.FileSystem/src/System/IO/FileInfo.cs
@@ -2,13 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
using System.Diagnostics;
using System.Diagnostics.Contracts;
-using System.Globalization;
-using System.Runtime.InteropServices;
-using System.Runtime.Serialization;
-using System.Runtime.Versioning;
using System.Text;
namespace System.IO
@@ -18,13 +13,13 @@ namespace System.IO
[Serializable]
public sealed partial class FileInfo : FileSystemInfo
{
- private String _name;
+ private string _name;
[System.Security.SecurityCritical]
private FileInfo() { }
[System.Security.SecuritySafeCritical]
- public FileInfo(String fileName)
+ public FileInfo(string fileName)
{
if (fileName == null)
throw new ArgumentNullException(nameof(fileName));
@@ -34,24 +29,24 @@ namespace System.IO
}
[System.Security.SecurityCritical]
- private void Init(String fileName)
+ private void Init(string fileName)
{
OriginalPath = fileName;
// Must fully qualify the path for the security check
- String fullPath = Path.GetFullPath(fileName);
+ string fullPath = Path.GetFullPath(fileName);
_name = Path.GetFileName(fileName);
FullPath = fullPath;
DisplayPath = GetDisplayPath(fileName);
}
- private String GetDisplayPath(String originalPath)
+ private string GetDisplayPath(string originalPath)
{
return originalPath;
}
[System.Security.SecuritySafeCritical]
- internal FileInfo(String fullPath, String originalPath)
+ internal FileInfo(string fullPath, string originalPath)
{
Debug.Assert(Path.IsPathRooted(fullPath), "fullPath must be fully qualified!");
_name = originalPath ?? Path.GetFileName(fullPath);
@@ -60,7 +55,7 @@ namespace System.IO
DisplayPath = _name;
}
- public override String Name
+ public override string Name
{
get { return _name; }
}
@@ -80,7 +75,7 @@ namespace System.IO
}
/* Returns the name of the directory that the file is in */
- public String DirectoryName
+ public string DirectoryName
{
[System.Security.SecuritySafeCritical]
get
@@ -94,7 +89,7 @@ namespace System.IO
{
get
{
- String dirName = DirectoryName;
+ string dirName = DirectoryName;
if (dirName == null)
return null;
return new DirectoryInfo(dirName);
@@ -135,14 +130,14 @@ namespace System.IO
// Copies an existing file to a new file. An exception is raised if the
// destination file already exists. Use the
- // Copy(String, String, boolean) method to allow
+ // Copy(string, string, boolean) method to allow
// overwriting an existing file.
//
// The caller must have certain FileIOPermissions. The caller must have
// Read permission to sourceFileName
// and Write permissions to destFileName.
//
- public FileInfo CopyTo(String destFileName)
+ public FileInfo CopyTo(string destFileName)
{
if (destFileName == null)
throw new ArgumentNullException(nameof(destFileName), SR.ArgumentNull_FileName);
@@ -164,7 +159,7 @@ namespace System.IO
// Read permission to sourceFileName and Create
// and Write permissions to destFileName.
//
- public FileInfo CopyTo(String destFileName, bool overwrite)
+ public FileInfo CopyTo(string destFileName, bool overwrite)
{
if (destFileName == null)
throw new ArgumentNullException(nameof(destFileName), SR.ArgumentNull_FileName);
@@ -234,7 +229,6 @@ namespace System.IO
return new FileStream(FullPath, mode, access, share);
}
-
[System.Security.SecuritySafeCritical] // auto-generated
public FileStream OpenRead()
{
@@ -242,7 +236,6 @@ namespace System.IO
FileShare.Read, 4096, false);
}
-
public FileStream OpenWrite()
{
return new FileStream(FullPath, FileMode.OpenOrCreate,
@@ -258,7 +251,7 @@ namespace System.IO
// permissions to destFileName.
//
[System.Security.SecuritySafeCritical]
- public void MoveTo(String destFileName)
+ public void MoveTo(string destFileName)
{
if (destFileName == null)
throw new ArgumentNullException(nameof(destFileName));
@@ -266,7 +259,7 @@ namespace System.IO
throw new ArgumentException(SR.Argument_EmptyFileName, nameof(destFileName));
Contract.EndContractBlock();
- String fullDestFileName = Path.GetFullPath(destFileName);
+ string fullDestFileName = Path.GetFullPath(destFileName);
// These checks are in place to ensure Unix error throwing happens the same way
// as it does on Windows.These checks can be removed if a solution to #2460 is
@@ -290,19 +283,19 @@ namespace System.IO
Invalidate();
}
- public FileInfo Replace(String destinationFileName, String destinationBackupFileName)
+ public FileInfo Replace(string destinationFileName, string destinationBackupFileName)
{
return Replace(destinationFileName, destinationBackupFileName, ignoreMetadataErrors: false);
}
- public FileInfo Replace(String destinationFileName, String destinationBackupFileName, bool ignoreMetadataErrors)
+ public FileInfo Replace(string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors)
{
File.Replace(FullPath, destinationFileName, destinationBackupFileName, ignoreMetadataErrors);
return new FileInfo(destinationFileName);
}
// Returns the display path
- public override String ToString()
+ public override string ToString()
{
return DisplayPath;
}
diff --git a/src/System.IO.FileSystem/src/System/IO/FileSystem.cs b/src/System.IO.FileSystem/src/System/IO/FileSystem.cs
index 87b304e4f5..9e3056e2cc 100644
--- a/src/System.IO.FileSystem/src/System/IO/FileSystem.cs
+++ b/src/System.IO.FileSystem/src/System/IO/FileSystem.cs
@@ -21,7 +21,6 @@ namespace System.IO
public abstract void ReplaceFile(string sourceFullPath, string destFullPath, string destBackupFullPath, bool ignoreMetadataErrors);
public abstract void DeleteFile(string fullPath);
public abstract bool FileExists(string fullPath);
- public abstract FileStream Open(string fullPath, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options, FileStream parent);
public abstract void MoveFile(string sourceFullPath, string destFullPath);
public abstract FileAttributes GetAttributes(string fullPath);
@@ -42,8 +41,6 @@ namespace System.IO
// Path
public abstract string GetCurrentDirectory();
public abstract void SetCurrentDirectory(string fullPath);
- public abstract int MaxPath { get; }
- public abstract int MaxDirectoryPath { get; }
// Volume
public abstract string[] GetLogicalDrives();
diff --git a/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Windows.cs b/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Windows.cs
index 3c6aa499c5..301425c7df 100644
--- a/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Windows.cs
+++ b/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Windows.cs
@@ -126,7 +126,7 @@ namespace System.IO
{
// This should not throw, instead we store the result so that we can throw it
// when someone actually accesses a property
- _dataInitialized = Win32FileSystem.FillAttributeInfo(FullPath, ref _data, tryagain: false, returnErrorOnNotFound: false);
+ _dataInitialized = Win32FileSystem.FillAttributeInfo(FullPath, ref _data, returnErrorOnNotFound: false);
}
}
}
diff --git a/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.cs b/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.cs
index 5002a4c828..268eb289d9 100644
--- a/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.cs
+++ b/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.cs
@@ -16,9 +16,9 @@ namespace System.IO
[Serializable]
public abstract partial class FileSystemInfo : MarshalByRefObject, ISerializable
{
- protected String FullPath; // fully qualified path of the file or directory
- protected String OriginalPath; // path passed in by the user
- private String _displayPath = ""; // path that can be displayed to the user
+ protected string FullPath; // fully qualified path of the file or directory
+ protected string OriginalPath; // path passed in by the user
+ private string _displayPath = ""; // path that can be displayed to the user
[System.Security.SecurityCritical]
protected FileSystemInfo()
@@ -36,7 +36,7 @@ namespace System.IO
}
// Full path of the directory/file
- public virtual String FullName
+ public virtual string FullName
{
[System.Security.SecuritySafeCritical]
get
@@ -45,7 +45,7 @@ namespace System.IO
}
}
- public String Extension
+ public string Extension
{
get
{
@@ -59,13 +59,13 @@ namespace System.IO
if (PathInternal.IsDirectorySeparator(ch) || ch == Path.VolumeSeparatorChar)
break;
}
- return String.Empty;
+ return string.Empty;
}
}
// For files name of the file is returned, for directories the last directory in hierarchy is returned if possible,
// otherwise the fully qualified name s returned
- public abstract String Name
+ public abstract string Name
{
get;
}
@@ -181,7 +181,7 @@ namespace System.IO
}
}
- internal String DisplayPath
+ internal string DisplayPath
{
get
{
diff --git a/src/System.IO.FileSystem/src/System/IO/MultiplexingWin32WinRTFileSystem.cs b/src/System.IO.FileSystem/src/System/IO/MultiplexingWin32WinRTFileSystem.cs
index 9f4715fcd5..83ffc18458 100644
--- a/src/System.IO.FileSystem/src/System/IO/MultiplexingWin32WinRTFileSystem.cs
+++ b/src/System.IO.FileSystem/src/System/IO/MultiplexingWin32WinRTFileSystem.cs
@@ -20,9 +20,6 @@ namespace System.IO
(IFileSystemObject)caller;
}
- public override int MaxPath { get { return Interop.Kernel32.MAX_PATH; } }
- public override int MaxDirectoryPath { get { return Interop.Kernel32.MAX_DIRECTORY_PATH; } }
-
public override void CopyFile(string sourceFullPath, string destFullPath, bool overwrite)
{
Select(sourceFullPath, destFullPath).CopyFile(sourceFullPath, destFullPath, overwrite);
@@ -105,12 +102,6 @@ namespace System.IO
Select(sourceFullPath, destFullPath).MoveFile(sourceFullPath, destFullPath);
}
- public override FileStreamBase Open(string fullPath, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options, FileStream parent)
- {
- bool isCreate = mode != FileMode.Open && mode != FileMode.Truncate;
- return Select(fullPath, isCreate).Open(fullPath, mode, access, share, bufferSize, options, parent);
- }
-
public override void RemoveDirectory(string fullPath, bool recursive)
{
Select(fullPath).RemoveDirectory(fullPath, recursive);
@@ -235,7 +226,7 @@ namespace System.IO
// the parent directory, so we walk up the path.
fullPath = PathHelpers.GetDirectoryNameInternal(fullPath);
// only walk up the path if we are creating a file/directory and not at the root
- } while (isCreate && !String.IsNullOrEmpty(fullPath));
+ } while (isCreate && !string.IsNullOrEmpty(fullPath));
return useWinRt;
}
diff --git a/src/System.IO.FileSystem/src/System/IO/PathHelpers.Windows.cs b/src/System.IO.FileSystem/src/System/IO/PathHelpers.Windows.cs
index c0c3cc12ab..a8da668317 100644
--- a/src/System.IO.FileSystem/src/System/IO/PathHelpers.Windows.cs
+++ b/src/System.IO.FileSystem/src/System/IO/PathHelpers.Windows.cs
@@ -9,7 +9,7 @@ namespace System.IO
internal static partial class PathHelpers
{
// Trim trailing whitespace, tabs etc but don't be aggressive in removing everything that has UnicodeCategory of trailing space.
- // String.WhitespaceChars will trim more aggressively than what the underlying FS does (for ex, NTFS, FAT).
+ // string.WhitespaceChars will trim more aggressively than what the underlying FS does (for ex, NTFS, FAT).
internal static readonly char[] TrimEndChars = { (char)0x9, (char)0xA, (char)0xB, (char)0xC, (char)0xD, (char)0x20, (char)0x85, (char)0xA0 };
internal static readonly char[] TrimStartChars = { ' ' };
diff --git a/src/System.IO.FileSystem/src/System/IO/PathHelpers.cs b/src/System.IO.FileSystem/src/System/IO/PathHelpers.cs
index bc73175ff4..b6d966731e 100644
--- a/src/System.IO.FileSystem/src/System/IO/PathHelpers.cs
+++ b/src/System.IO.FileSystem/src/System/IO/PathHelpers.cs
@@ -11,8 +11,8 @@ namespace System.IO
// Array of the separator chars
internal static readonly char[] DirectorySeparatorChars = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };
- // String-representation of the directory-separator character, used when appending the character to another
- // string so as to avoid the boxing of the character when calling String.Concat(..., object).
+ // string-representation of the directory-separator character, used when appending the character to another
+ // string so as to avoid the boxing of the character when calling string.Concat(..., object).
internal static readonly string DirectorySeparatorCharAsString = Path.DirectorySeparatorChar.ToString();
// System.IO.Path has both public Combine and internal InternalCombine
@@ -34,7 +34,7 @@ namespace System.IO
return path.Length == PathInternal.GetRootLength(path);
}
- internal static bool EndsInDirectorySeparator(String path)
+ internal static bool EndsInDirectorySeparator(string path)
{
return path.Length > 0 && PathInternal.IsDirectorySeparator(path[path.Length - 1]);
}
diff --git a/src/System.IO.FileSystem/src/System/IO/UnixFileSystem.cs b/src/System.IO.FileSystem/src/System/IO/UnixFileSystem.cs
index 91df2c7c90..958d91037d 100644
--- a/src/System.IO.FileSystem/src/System/IO/UnixFileSystem.cs
+++ b/src/System.IO.FileSystem/src/System/IO/UnixFileSystem.cs
@@ -15,15 +15,6 @@ namespace System.IO
{
internal const int DefaultBufferSize = 4096;
- public override int MaxPath { get { return Interop.Sys.MaxPath; } }
-
- public override int MaxDirectoryPath { get { return Interop.Sys.MaxPath; } }
-
- public override FileStream Open(string fullPath, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options, FileStream parent)
- {
- return new FileStream(fullPath, mode, access, share, bufferSize, options);
- }
-
public override void CopyFile(string sourceFullPath, string destFullPath, bool overwrite)
{
// The destination path may just be a directory into which the file should be copied.
@@ -238,7 +229,7 @@ namespace System.IO
while (stackDir.Count > 0)
{
string name = stackDir.Pop();
- if (name.Length >= MaxDirectoryPath)
+ if (name.Length >= Interop.Sys.MaxPath)
{
throw new PathTooLongException(SR.IO_PathTooLong);
}
diff --git a/src/System.IO.FileSystem/src/System/IO/Win32FileSystem.cs b/src/System.IO.FileSystem/src/System/IO/Win32FileSystem.cs
index a2a6733554..7342c9c401 100644
--- a/src/System.IO.FileSystem/src/System/IO/Win32FileSystem.cs
+++ b/src/System.IO.FileSystem/src/System/IO/Win32FileSystem.cs
@@ -13,9 +13,6 @@ namespace System.IO
{
internal const int GENERIC_READ = unchecked((int)0x80000000);
- public override int MaxPath { get { return Interop.Kernel32.MAX_PATH; } }
- public override int MaxDirectoryPath { get { return Interop.Kernel32.MAX_DIRECTORY_PATH; } }
-
public override void CopyFile(string sourceFullPath, string destFullPath, bool overwrite)
{
Interop.Kernel32.SECURITY_ATTRIBUTES secAttrs = default(Interop.Kernel32.SECURITY_ATTRIBUTES);
@@ -99,7 +96,7 @@ namespace System.IO
int i = length - 1;
while (i >= lengthRoot && !somepathexists)
{
- String dir = fullPath.Substring(0, i + 1);
+ string dir = fullPath.Substring(0, i + 1);
if (!DirectoryExists(dir)) // Create only the ones missing
stackDir.Add(dir);
@@ -119,12 +116,12 @@ namespace System.IO
bool r = true;
int firstError = 0;
- String errorString = fullPath;
+ string errorString = fullPath;
// If all the security checks succeeded create all the directories
while (stackDir.Count > 0)
{
- String name = stackDir[stackDir.Count - 1];
+ string name = stackDir[stackDir.Count - 1];
stackDir.RemoveAt(stackDir.Count - 1);
r = Interop.Kernel32.CreateDirectory(name, ref secAttrs);
@@ -157,7 +154,7 @@ namespace System.IO
// Handle CreateDirectory("X:\\") when X: doesn't exist. Similarly for n/w paths.
if ((count == 0) && !somepathexists)
{
- String root = Directory.InternalGetDirectoryRoot(fullPath);
+ string root = Directory.InternalGetDirectoryRoot(fullPath);
if (!DirectoryExists(root))
throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_PATH_NOT_FOUND, root);
return;
@@ -169,7 +166,7 @@ namespace System.IO
throw Win32Marshal.GetExceptionForWin32Error(firstError, errorString);
}
- public override void DeleteFile(System.String fullPath)
+ public override void DeleteFile(string fullPath)
{
bool r = Interop.Kernel32.DeleteFile(fullPath);
if (!r)
@@ -188,10 +185,10 @@ namespace System.IO
return DirectoryExists(fullPath, out lastError);
}
- private bool DirectoryExists(String path, out int lastError)
+ private bool DirectoryExists(string path, out int lastError)
{
Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data = new Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA();
- lastError = FillAttributeInfo(path, ref data, false, true);
+ lastError = FillAttributeInfo(path, ref data, returnErrorOnNotFound: true);
return (lastError == 0) && (data.fileAttributes != -1)
&& ((data.fileAttributes & Interop.Kernel32.FileAttributes.FILE_ATTRIBUTE_DIRECTORY) != 0);
@@ -220,128 +217,68 @@ namespace System.IO
}
}
- // Returns 0 on success, otherwise a Win32 error code. Note that
- // classes should use -1 as the uninitialized state for dataInitialized.
- [System.Security.SecurityCritical] // auto-generated
- internal static int FillAttributeInfo(String path, ref Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data, bool tryagain, bool returnErrorOnNotFound)
+ /// <summary>
+ /// Returns 0 on success, otherwise a Win32 error code. Note that
+ /// classes should use -1 as the uninitialized state for dataInitialized.
+ /// </summary>
+ /// <param name="returnErrorOnNotFound">Return the error code for not found errors?</param>
+ [System.Security.SecurityCritical]
+ internal static int FillAttributeInfo(string path, ref Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data, bool returnErrorOnNotFound)
{
- int errorCode = 0;
- if (tryagain) // someone has a handle to the file open, or other error
+ int errorCode = Interop.Errors.ERROR_SUCCESS;
+
+ // Neither GetFileAttributes or FindFirstFile like trailing separators
+ path = path.TrimEnd(PathHelpers.DirectorySeparatorChars);
+
+ using (new DisableMediaInsertionPrompt())
{
- Interop.Kernel32.WIN32_FIND_DATA findData;
- findData = new Interop.Kernel32.WIN32_FIND_DATA();
-
- // Remove trailing slash since this can cause grief to FindFirstFile. You will get an invalid argument error
- String tempPath = path.TrimEnd(PathHelpers.DirectorySeparatorChars);
-
- // For removable media drives, normally the OS will pop up a dialog requesting insertion
- // of the relevant media (CD, floppy, memory card, etc.). We don't want this prompt so we
- // set SEM_FAILCRITICALERRORS to suppress it.
- //
- // Note that said dialog only shows once the relevant filesystem has been loaded, which
- // does not happen until actual media is accessed at least once since booting.
-
- uint oldMode;
- bool success = Interop.Kernel32.SetThreadErrorMode(Interop.Kernel32.SEM_FAILCRITICALERRORS, out oldMode);
- try
+ if (!Interop.Kernel32.GetFileAttributesEx(path, Interop.Kernel32.GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, ref data))
{
- bool error = false;
- SafeFindHandle handle = Interop.Kernel32.FindFirstFile(tempPath, ref findData);
- try
+ errorCode = Marshal.GetLastWin32Error();
+ if (errorCode == Interop.Errors.ERROR_ACCESS_DENIED)
{
- if (handle.IsInvalid)
- {
- error = true;
- errorCode = Marshal.GetLastWin32Error();
+ // Files that are marked for deletion will not let you GetFileAttributes,
+ // ERROR_ACCESS_DENIED is given back without filling out the data struct.
+ // FindFirstFile, however, will. Historically we always gave back attributes
+ // for marked-for-deletion files.
- if (errorCode == Interop.Errors.ERROR_FILE_NOT_FOUND ||
- errorCode == Interop.Errors.ERROR_PATH_NOT_FOUND ||
- errorCode == Interop.Errors.ERROR_NOT_READY) // Removable media not inserted
+ var findData = new Interop.Kernel32.WIN32_FIND_DATA();
+ using (SafeFindHandle handle = Interop.Kernel32.FindFirstFile(path, ref findData))
+ {
+ if (handle.IsInvalid)
{
- if (!returnErrorOnNotFound)
- {
- // Return default value for backward compatibility
- errorCode = 0;
- data.fileAttributes = -1;
- }
+ errorCode = Marshal.GetLastWin32Error();
}
- return errorCode;
- }
- }
- finally
- {
- // Close the Win32 handle
- try
- {
- handle.Dispose();
- }
- catch
- {
- // if we're already returning an error, don't throw another one.
- if (!error)
+ else
{
- throw Win32Marshal.GetExceptionForLastWin32Error();
+ errorCode = Interop.Errors.ERROR_SUCCESS;
+ data.PopulateFrom(ref findData);
}
}
}
}
- finally
- {
- if (success)
- Interop.Kernel32.SetThreadErrorMode(oldMode, out oldMode);
- }
-
- // Copy the information to data
- data.PopulateFrom(ref findData);
}
- else
+
+ if (errorCode != Interop.Errors.ERROR_SUCCESS && !returnErrorOnNotFound)
{
- // For floppy drives, normally the OS will pop up a dialog saying
- // there is no disk in drive A:, please insert one. We don't want that.
- // SetErrorMode will let us disable this, but we should set the error
- // mode back, since this may have wide-ranging effects.
- bool success = false;
- uint oldMode;
- bool errorModeSuccess = Interop.Kernel32.SetThreadErrorMode(Interop.Kernel32.SEM_FAILCRITICALERRORS, out oldMode);
- try
+ switch (errorCode)
{
- success = Interop.Kernel32.GetFileAttributesEx(path, Interop.Kernel32.GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, ref data);
- }
- finally
- {
- if (errorModeSuccess)
- Interop.Kernel32.SetThreadErrorMode(oldMode, out oldMode);
- }
-
- if (!success)
- {
- errorCode = Marshal.GetLastWin32Error();
- if (errorCode != Interop.Errors.ERROR_FILE_NOT_FOUND &&
- errorCode != Interop.Errors.ERROR_PATH_NOT_FOUND &&
- errorCode != Interop.Errors.ERROR_NOT_READY) // floppy device not ready
- {
- // In case someone latched onto the file. Take the perf hit only for failure
- return FillAttributeInfo(path, ref data, true, returnErrorOnNotFound);
- }
- else
- {
- if (!returnErrorOnNotFound)
- {
- // Return default value for backward compatibility
- errorCode = 0;
- data.fileAttributes = -1;
- }
- }
+ case Interop.Errors.ERROR_FILE_NOT_FOUND:
+ case Interop.Errors.ERROR_PATH_NOT_FOUND:
+ case Interop.Errors.ERROR_NOT_READY: // Removable media not ready
+ // Return default value for backward compatibility
+ data.fileAttributes = -1;
+ return Interop.Errors.ERROR_SUCCESS;
}
}
return errorCode;
}
- public override bool FileExists(System.String fullPath)
+ public override bool FileExists(string fullPath)
{
Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data = new Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA();
- int errorCode = FillAttributeInfo(fullPath, ref data, false, true);
+ int errorCode = FillAttributeInfo(fullPath, ref data, returnErrorOnNotFound: true);
return (errorCode == 0) && (data.fileAttributes != -1)
&& ((data.fileAttributes & Interop.Kernel32.FileAttributes.FILE_ATTRIBUTE_DIRECTORY) == 0);
@@ -350,7 +287,7 @@ namespace System.IO
public override FileAttributes GetAttributes(string fullPath)
{
Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data = new Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA();
- int errorCode = FillAttributeInfo(fullPath, ref data, false, true);
+ int errorCode = FillAttributeInfo(fullPath, ref data, returnErrorOnNotFound: true);
if (errorCode != 0)
throw Win32Marshal.GetExceptionForWin32Error(errorCode, fullPath);
@@ -362,7 +299,7 @@ namespace System.IO
StringBuilder sb = StringBuilderCache.Acquire(Interop.Kernel32.MAX_PATH + 1);
if (Interop.Kernel32.GetCurrentDirectory(sb.Capacity, sb) == 0)
throw Win32Marshal.GetExceptionForLastWin32Error();
- String currentDirectory = sb.ToString();
+ string currentDirectory = sb.ToString();
// Note that if we have somehow put our command prompt into short
// file name mode (i.e. by running edlin or a DOS grep, etc), then
// this will return a short file name.
@@ -390,7 +327,7 @@ namespace System.IO
public override DateTimeOffset GetCreationTime(string fullPath)
{
Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data = new Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA();
- int errorCode = FillAttributeInfo(fullPath, ref data, false, false);
+ int errorCode = FillAttributeInfo(fullPath, ref data, returnErrorOnNotFound: false);
if (errorCode != 0)
throw Win32Marshal.GetExceptionForWin32Error(errorCode, fullPath);
@@ -408,7 +345,7 @@ namespace System.IO
public override DateTimeOffset GetLastAccessTime(string fullPath)
{
Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data = new Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA();
- int errorCode = FillAttributeInfo(fullPath, ref data, false, false);
+ int errorCode = FillAttributeInfo(fullPath, ref data, returnErrorOnNotFound: false);
if (errorCode != 0)
throw Win32Marshal.GetExceptionForWin32Error(errorCode, fullPath);
@@ -419,7 +356,7 @@ namespace System.IO
public override DateTimeOffset GetLastWriteTime(string fullPath)
{
Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data = new Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA();
- int errorCode = FillAttributeInfo(fullPath, ref data, false, false);
+ int errorCode = FillAttributeInfo(fullPath, ref data, returnErrorOnNotFound: false);
if (errorCode != 0)
throw Win32Marshal.GetExceptionForWin32Error(errorCode, fullPath);
@@ -452,15 +389,10 @@ namespace System.IO
}
}
- public override FileStream Open(string fullPath, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options, FileStream parent)
- {
- return new FileStream(fullPath, mode, access, share, bufferSize, options);
- }
-
[System.Security.SecurityCritical]
private static SafeFileHandle OpenHandle(string fullPath, bool asDirectory)
{
- String root = fullPath.Substring(0, PathInternal.GetRootLength(fullPath));
+ string root = fullPath.Substring(0, PathInternal.GetRootLength(fullPath));
if (root == fullPath && root[1] == Path.VolumeSeparatorChar)
{
// intentionally not fullpath, most upstack public APIs expose this as path.
@@ -470,11 +402,11 @@ namespace System.IO
Interop.Kernel32.SECURITY_ATTRIBUTES secAttrs = default(Interop.Kernel32.SECURITY_ATTRIBUTES);
SafeFileHandle handle = Interop.Kernel32.SafeCreateFile(
fullPath,
- (int)Interop.Kernel32.GenericOperations.GENERIC_WRITE,
+ Interop.Kernel32.GenericOperations.GENERIC_WRITE,
FileShare.ReadWrite | FileShare.Delete,
ref secAttrs,
FileMode.Open,
- asDirectory ? (int)Interop.Kernel32.FileOperations.FILE_FLAG_BACKUP_SEMANTICS : (int)FileOptions.None,
+ asDirectory ? Interop.Kernel32.FileOperations.FILE_FLAG_BACKUP_SEMANTICS : (int)FileOptions.None,
IntPtr.Zero
);
@@ -499,7 +431,7 @@ namespace System.IO
// but for now we're much safer if we err on the conservative side.
// This applies to symbolic links and mount points.
Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA data = new Interop.Kernel32.WIN32_FILE_ATTRIBUTE_DATA();
- int errorCode = FillAttributeInfo(fullPath, ref data, false, true);
+ int errorCode = FillAttributeInfo(fullPath, ref data, returnErrorOnNotFound: true);
if (errorCode != 0)
{
// Ensure we throw a DirectoryNotFoundException.
@@ -528,7 +460,7 @@ namespace System.IO
// but for now we're much safer if we err on the conservative side.
// This applies to symbolic links and mount points.
// Note the logic to check whether fullPath is a reparse point is
- // in Delete(String, String, bool), and will set "recursive" to false.
+ // in Delete(string, string, bool), and will set "recursive" to false.
// Note that Win32's DeleteFile and RemoveDirectory will just delete
// the reparse point itself.
@@ -576,7 +508,7 @@ namespace System.IO
if (data.dwReserved0 == Interop.Kernel32.IOReparseOptions.IO_REPARSE_TAG_MOUNT_POINT)
{
// Use full path plus a trailing '\'
- String mountPoint = Path.Combine(fullPath, data.cFileName + PathHelpers.DirectorySeparatorCharAsString);
+ string mountPoint = Path.Combine(fullPath, data.cFileName + PathHelpers.DirectorySeparatorCharAsString);
if (!Interop.Kernel32.DeleteVolumeMountPoint(mountPoint))
{
errorCode = Marshal.GetLastWin32Error();
@@ -599,7 +531,7 @@ namespace System.IO
// RemoveDirectory on a symbolic link will
// remove the link itself.
- String reparsePoint = Path.Combine(fullPath, data.cFileName);
+ string reparsePoint = Path.Combine(fullPath, data.cFileName);
r = Interop.Kernel32.RemoveDirectory(reparsePoint);
if (!r)
{
@@ -621,7 +553,7 @@ namespace System.IO
}
else
{
- String fileName = Path.Combine(fullPath, data.cFileName);
+ string fileName = Path.Combine(fullPath, data.cFileName);
r = Interop.Kernel32.DeleteFile(fileName);
if (!r)
{
diff --git a/src/System.IO.FileSystem/src/System/IO/Win32FileSystemEnumerable.cs b/src/System.IO.FileSystem/src/System/IO/Win32FileSystemEnumerable.cs
index 5d305718f8..cc1d3daf6d 100644
--- a/src/System.IO.FileSystem/src/System/IO/Win32FileSystemEnumerable.cs
+++ b/src/System.IO.FileSystem/src/System/IO/Win32FileSystemEnumerable.cs
@@ -2,13 +2,12 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using Microsoft.Win32.SafeHandles;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;
-using Microsoft.Win32.SafeHandles;
-
namespace System.IO
{
// Overview:
@@ -111,8 +110,6 @@ namespace System.IO
private readonly SearchOption _searchOption;
private readonly string _fullPath;
private readonly string _normalizedSearchPath;
- private readonly uint _oldMode;
- private readonly bool _setBackOldMode;
[SecuritySafeCritical]
internal Win32FileSystemEnumerableIterator(string path, string originalUserPath, string searchPattern, SearchOption searchOption, SearchResultHandler<TSource> resultHandler)
@@ -123,8 +120,6 @@ namespace System.IO
Debug.Assert(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);
Debug.Assert(resultHandler != null);
- _setBackOldMode = Interop.Kernel32.SetThreadErrorMode(Interop.Kernel32.SEM_FAILCRITICALERRORS, out _oldMode);
-
string normalizedSearchPattern = PathHelpers.NormalizeSearchPattern(searchPattern);
if (normalizedSearchPattern.Length == 0)
@@ -166,27 +161,31 @@ namespace System.IO
Interop.Kernel32.WIN32_FIND_DATA data = new Interop.Kernel32.WIN32_FIND_DATA();
- // Open a Find handle
- _hnd = Interop.Kernel32.FindFirstFile(searchPath, ref data);
-
- if (_hnd.IsInvalid)
+ using (new DisableMediaInsertionPrompt())
{
- int errorCode = Marshal.GetLastWin32Error();
- if (errorCode != Interop.Errors.ERROR_FILE_NOT_FOUND && errorCode != Interop.Errors.ERROR_NO_MORE_FILES)
- {
- HandleError(errorCode, _searchData.FullPath);
- }
- else
+ // Open a Find handle
+ _hnd = Interop.Kernel32.FindFirstFile(searchPath, ref data);
+
+ if (_hnd.IsInvalid)
{
- // flag this as empty only if we're searching just top directory
- // Used in fast path for top directory only
- _empty = _searchOption == SearchOption.TopDirectoryOnly;
+ int errorCode = Marshal.GetLastWin32Error();
+ if (errorCode != Interop.Errors.ERROR_FILE_NOT_FOUND && errorCode != Interop.Errors.ERROR_NO_MORE_FILES)
+ {
+ throw HandleError(errorCode, _searchData.FullPath);
+ }
+ else
+ {
+ // flag this as empty only if we're searching just top directory
+ // Used in fast path for top directory only
+ _empty = _searchOption == SearchOption.TopDirectoryOnly;
+ }
}
}
- // fast path for TopDirectoryOnly. If we have a result, go ahead and set it to
- // current. If empty, dispose handle.
+
if (_searchOption == SearchOption.TopDirectoryOnly)
{
+ // fast path for TopDirectoryOnly. If we have a result, go ahead and set it to
+ // current. If empty, dispose handle.
if (_empty)
{
_hnd.Dispose();
@@ -200,10 +199,10 @@ namespace System.IO
}
}
}
- // for AllDirectories, we first recurse into dirs, so cleanup and add searchData
- // to the list
else
{
+ // for AllDirectories, we first recurse into dirs, so cleanup and add searchData
+ // to the list
_hnd.Dispose();
_searchList = new List<PathPair>();
_searchList.Add(_searchData);
@@ -245,18 +244,10 @@ namespace System.IO
{
try
{
- if (_hnd != null)
- {
- _hnd.Dispose();
- }
+ _hnd?.Dispose();
}
finally
{
- if (_setBackOldMode)
- {
- uint _ignore;
- Interop.Kernel32.SetThreadErrorMode(_oldMode, out _ignore);
- }
base.Dispose(disposing);
}
}
@@ -310,16 +301,25 @@ namespace System.IO
// Execute searchCriteria against the current directory
string searchPath = Path.Combine(_searchData.FullPath, _searchCriteria);
- // Open a Find handle
- _hnd = Interop.Kernel32.FindFirstFile(searchPath, ref data);
- if (_hnd.IsInvalid)
+ using (new DisableMediaInsertionPrompt())
{
- int errorCode = Marshal.GetLastWin32Error();
- if (errorCode == Interop.Errors.ERROR_FILE_NOT_FOUND || errorCode == Interop.Errors.ERROR_NO_MORE_FILES || errorCode == Interop.Errors.ERROR_PATH_NOT_FOUND)
- continue;
+ // Open a Find handle
+ _hnd = Interop.Kernel32.FindFirstFile(searchPath, ref data);
- _hnd.Dispose();
- HandleError(errorCode, _searchData.FullPath);
+ if (_hnd.IsInvalid)
+ {
+ int errorCode = Marshal.GetLastWin32Error();
+ switch (errorCode)
+ {
+ case Interop.Errors.ERROR_FILE_NOT_FOUND:
+ case Interop.Errors.ERROR_NO_MORE_FILES:
+ case Interop.Errors.ERROR_PATH_NOT_FOUND:
+ continue;
+ }
+
+ _hnd.Dispose();
+ throw HandleError(errorCode, _searchData.FullPath);
+ }
}
state = STATE_FIND_NEXT_FILE;
@@ -342,32 +342,39 @@ namespace System.IO
{
if (_hnd != null)
{
- // Keep asking for more matching files/dirs, add it to the list
- while (Interop.Kernel32.FindNextFile(_hnd, ref data))
+ using (new DisableMediaInsertionPrompt())
{
- TSource result;
- if (IsResultIncluded(ref data, out result))
+ // Keep asking for more matching files/dirs, add it to the list
+ while (Interop.Kernel32.FindNextFile(_hnd, ref data))
{
- current = result;
- return true;
+ TSource result;
+ if (IsResultIncluded(ref data, out result))
+ {
+ current = result;
+ return true;
+ }
}
}
// Make sure we quit with a sensible error.
int errorCode = Marshal.GetLastWin32Error();
+ _hnd?.Dispose();
- if (_hnd != null)
- _hnd.Dispose();
-
- // ERROR_FILE_NOT_FOUND is valid here because if the top level
- // dir doesn't contain any subdirs and matching files then
- // we will get here with this errorcode from the _searchList walk
- if ((errorCode != 0) && (errorCode != Interop.Errors.ERROR_NO_MORE_FILES)
- && (errorCode != Interop.Errors.ERROR_FILE_NOT_FOUND))
+ switch (errorCode)
{
- HandleError(errorCode, _searchData.FullPath);
+ case Interop.Errors.ERROR_SUCCESS:
+ case Interop.Errors.ERROR_NO_MORE_FILES:
+
+ // ERROR_FILE_NOT_FOUND is valid here because if the top level
+ // dir doesn't contain any subdirs and matching files then
+ // we will get here with this errorcode from the _searchList walk
+ case Interop.Errors.ERROR_FILE_NOT_FOUND:
+ break;
+ default:
+ throw HandleError(errorCode, _searchData.FullPath);
}
}
+
if (_searchOption == SearchOption.TopDirectoryOnly)
{
state = STATE_FINISH;
@@ -398,10 +405,10 @@ namespace System.IO
}
[SecurityCritical]
- private void HandleError(int errorCode, string path)
+ private Exception HandleError(int errorCode, string path)
{
Dispose();
- throw Win32Marshal.GetExceptionForWin32Error(errorCode, path);
+ return Win32Marshal.GetExceptionForWin32Error(errorCode, path);
}
[SecurityCritical] // auto-generated
@@ -412,20 +419,28 @@ namespace System.IO
Interop.Kernel32.WIN32_FIND_DATA data = new Interop.Kernel32.WIN32_FIND_DATA();
try
{
- // Get all files and dirs
- hnd = Interop.Kernel32.FindFirstFile(searchPath, ref data);
-
- if (hnd.IsInvalid)
+ using (new DisableMediaInsertionPrompt())
{
- int errorCode = Marshal.GetLastWin32Error();
+ // Get all files and dirs
+ hnd = Interop.Kernel32.FindFirstFile(searchPath, ref data);
- // This could happen if the dir doesn't contain any files.
- // Continue with the recursive search though, eventually
- // _searchList will become empty
- if (errorCode == Interop.Errors.ERROR_FILE_NOT_FOUND || errorCode == Interop.Errors.ERROR_NO_MORE_FILES || errorCode == Interop.Errors.ERROR_PATH_NOT_FOUND)
- return;
+ if (hnd.IsInvalid)
+ {
+ int errorCode = Marshal.GetLastWin32Error();
- HandleError(errorCode, localSearchData.FullPath);
+ // This could happen if the dir doesn't contain any files.
+ // Continue with the recursive search though, eventually
+ // _searchList will become empty
+ switch (errorCode)
+ {
+ case Interop.Errors.ERROR_FILE_NOT_FOUND:
+ case Interop.Errors.ERROR_NO_MORE_FILES:
+ case Interop.Errors.ERROR_PATH_NOT_FOUND:
+ return;
+ default:
+ throw HandleError(errorCode, localSearchData.FullPath);
+ }
+ }
}
// Add subdirs to _searchList. Exempt ReparsePoints as appropriate
@@ -458,8 +473,7 @@ namespace System.IO
}
finally
{
- if (hnd != null)
- hnd.Dispose();
+ hnd?.Dispose();
}
}
diff --git a/src/System.IO.FileSystem/src/System/IO/WinRTFileStream.cs b/src/System.IO.FileSystem/src/System/IO/WinRTFileStream.cs
deleted file mode 100644
index 3f83fa0e64..0000000000
--- a/src/System.IO.FileSystem/src/System/IO/WinRTFileStream.cs
+++ /dev/null
@@ -1,245 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using Microsoft.Win32.SafeHandles;
-using System.Diagnostics;
-using System.Threading;
-using System.Threading.Tasks;
-using Windows.Storage;
-
-namespace System.IO
-{
- internal sealed class WinRTFileStream : FileStreamBase
- {
- private readonly FileAccess _access;
- private bool _disposed;
- private StorageFile _file;
- private readonly Stream _innerStream;
- private readonly FileOptions _options;
- private static readonly SafeFileHandle s_invalidHandle = new SafeFileHandle(IntPtr.Zero, false);
-
- internal WinRTFileStream(Stream innerStream, StorageFile file, FileAccess access, FileOptions options, FileStream parent)
- : base(parent)
- {
- Debug.Assert(innerStream != null);
- Debug.Assert(file != null);
-
- this._access = access;
- this._disposed = false;
- this._file = file;
- this._innerStream = innerStream;
- this._options = options;
- }
-
- ~WinRTFileStream()
- {
- Dispose(false);
- }
-
- #region FileStream members
- public override bool IsAsync { get { return true; } }
- public override string Name { get { return _file.Name; } }
- public override Microsoft.Win32.SafeHandles.SafeFileHandle SafeFileHandle { get { return s_invalidHandle; } }
- internal override bool IsClosed => false;
-
- public override void Flush(bool flushToDisk)
- {
- // WinRT streams are not buffered, however the WinRT stream will be wrapped in a BufferedStream
- // Flush & FlushAsync will flush the internal managed buffer of the BufferedStream wrapper
- // The WinRT stream only exposes FlushAsync which flushes to disk.
- // The managed Stream adapter does nothing for Flush() and forwards to WinRT for FlushAsync (flushing to disk).
- if (flushToDisk)
- {
- // FlushAsync() will do the write to disk when it hits the WinRT->NetFx adapter
- Task flushTask = _innerStream.FlushAsync();
- flushTask.Wait();
- }
- else
- {
- // Flush doesn't write to disk
- _innerStream.Flush();
- }
- }
-
- public override void Lock(long position, long length)
- {
- throw new PlatformNotSupportedException(); // https://github.com/dotnet/corefx/issues/17470
- }
-
- public override void Unlock(long position, long length)
- {
- throw new PlatformNotSupportedException(); // https://github.com/dotnet/corefx/issues/17470
- }
- #endregion
-
- #region Stream members
- #region Properties
-
- public override bool CanRead
- {
- // WinRT doesn't support write-only streams, override what the stream tells us
- // with what was passed in when creating it.
- get { return _innerStream.CanRead && (_access & FileAccess.Read) != 0; }
- }
-
- public override bool CanSeek
- {
- get { return _innerStream.CanSeek; }
- }
-
- public override bool CanWrite
- {
- get { return _innerStream.CanWrite; }
- }
-
- public override long Length
- {
- get { return _innerStream.Length; }
- }
-
- public override long Position
- {
- get { return _innerStream.Position; }
- set { _innerStream.Position = value; }
- }
-
- public override int ReadTimeout
- {
- get { return _innerStream.ReadTimeout; }
- set { _innerStream.ReadTimeout = value; }
- }
-
- public override bool CanTimeout
- {
- get { return _innerStream.CanTimeout; }
- }
-
- public override int WriteTimeout
- {
- get { return _innerStream.WriteTimeout; }
- set { _innerStream.WriteTimeout = value; }
- }
-
- #endregion Properties
-
- #region Methods
- public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken)
- {
- return _innerStream.CopyToAsync(destination, bufferSize, cancellationToken);
- }
-
- protected override void Dispose(bool disposing)
- {
- try
- {
- if (disposing)
- _innerStream.Dispose();
-
- if ((_options & FileOptions.DeleteOnClose) != 0 && _file != null)
- {
- // WinRT doesn't directly support DeleteOnClose but we can mimic it
- // There are a few reasons that this will fail
- // 1) the file may not allow delete permissions for the current user
- // 2) the storage file RCW may have already been disconnected
- try
- {
- _file.DeleteAsync().AsTask().Wait();
- }
- catch { }
- }
-
- _disposed = true;
- _file = null;
- }
- finally
- {
- base.Dispose(disposing);
- }
- }
-
- public override void Flush()
- {
- _parent.Flush(false);
- }
-
- public override Task FlushAsync(CancellationToken cancellationToken)
- {
- return _innerStream.FlushAsync(cancellationToken);
- }
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- if (!_disposed && !CanRead)
- throw Error.GetReadNotSupported();
-
- return _innerStream.Read(buffer, offset, count);
- }
-
- public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- if (!_disposed && !CanRead)
- throw Error.GetReadNotSupported();
-
- return _innerStream.ReadAsync(buffer, offset, count, cancellationToken);
- }
-
- public override int ReadByte()
- {
- if (!_disposed && !CanRead)
- throw Error.GetReadNotSupported();
-
- return _innerStream.ReadByte();
- }
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- if (origin == SeekOrigin.Begin && offset < 0)
- throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_NEGATIVE_SEEK);
-
- return _innerStream.Seek(offset, origin);
- }
-
- public override void SetLength(long value)
- {
- _innerStream.SetLength(value);
-
- // WinRT ignores all errors when setting length, check after setting
-
- if (_innerStream.Length < value)
- {
- throw new ArgumentOutOfRangeException(nameof(value), SR.ArgumentOutOfRange_FileLengthTooBig);
- }
- else if (_innerStream.Length != value)
- {
- throw new ArgumentException(SR.Argument_FileNotResized, nameof(value));
- }
-
- // WinRT doesn't update the position when truncating a file
- if (value < _innerStream.Position)
- _innerStream.Position = value;
- }
-
- public override string ToString()
- {
- return _innerStream.ToString();
- }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- _innerStream.Write(buffer, offset, count);
- }
-
- public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- return _innerStream.WriteAsync(buffer, offset, count, cancellationToken);
- }
-
- public override void WriteByte(byte value)
- {
- _innerStream.WriteByte(value);
- }
- #endregion Methods
- #endregion Stream members
- }
-}
diff --git a/src/System.IO.FileSystem/src/System/IO/WinRTFileSystem.cs b/src/System.IO.FileSystem/src/System/IO/WinRTFileSystem.cs
index 1ddc7f834e..9d838d605c 100644
--- a/src/System.IO.FileSystem/src/System/IO/WinRTFileSystem.cs
+++ b/src/System.IO.FileSystem/src/System/IO/WinRTFileSystem.cs
@@ -19,65 +19,6 @@ namespace System.IO
{
internal sealed partial class WinRTFileSystem : FileSystem
{
- public override int MaxPath { get { return Interop.Kernel32.MAX_PATH; } }
- public override int MaxDirectoryPath { get { return Interop.Kernel32.MAX_DIRECTORY_PATH; } }
-
- private static System.IO.FileAttributes ConvertFileAttributes(WinRTFileAttributes fileAttributes)
- {
- //namespace Windows.Storage
- //{
- // [Flags]
- // public enum FileAttributes
- // {
- // Normal = 0,
- // ReadOnly = 1,
- // Directory = 16,
- // Archive = 32,
- // Temporary = 256,
- // LocallyIncomplete = 512,
- // }
- //}
-
- //namespace System.IO
- //{
- // [Flags]
- // public enum FileAttributes
- // {
- // ReadOnly = 1,
- // Hidden = 2,
- // System = 4,
- // Directory = 16,
- // Archive = 32,
- // Device = 64,
- // Normal = 128,
- // Temporary = 256,
- // SparseFile = 512,
- // ReparsePoint = 1024,
- // Compressed = 2048,
- // Offline = 4096,
- // NotContentIndexed = 8192,
- // Encrypted = 16384,
- // }
- //}
-
- // Normal is a special case and happens to have different values in WinRT and Win32.
- // It's meant to indicate the absence of other flags. On WinRT this logically is 0,
- // however on Win32 it is represented with a discrete value of 128.
- return (fileAttributes == WinRTFileAttributes.Normal) ?
- FileAttributes.Normal :
- (FileAttributes)fileAttributes;
- }
-
- private static WinRTFileAttributes ConvertFileAttributes(FileAttributes fileAttributes)
- {
- // see comment above
- // Here we make sure to remove the "normal" value since it is redundant
- // We do not mask unsupported values
- return (fileAttributes == FileAttributes.Normal) ?
- WinRTFileAttributes.Normal :
- (WinRTFileAttributes)(fileAttributes & ~FileAttributes.Normal);
- }
-
public override void CopyFile(string sourceFullPath, string destFullPath, bool overwrite)
{
EnsureBackgroundThread();
@@ -117,391 +58,11 @@ namespace System.IO
await DeleteFileAsync(sourceFullPath).ConfigureAwait(false);
}
- public override void CreateDirectory(string fullPath)
- {
- EnsureBackgroundThread();
- SynchronousResultOf(CreateDirectoryAsync(fullPath, failIfExists: false));
- }
-
- private async Task<StorageFolder> CreateDirectoryAsync(string fullPath, bool failIfExists)
- {
- if (fullPath.Length >= Interop.Kernel32.MAX_DIRECTORY_PATH)
- throw new PathTooLongException(SR.IO_PathTooLong);
-
- Stack<string> stackDir = new Stack<string>();
- StorageFolder workingFolder = null;
- string workingPath = fullPath;
-
- // walk up the path until we can get a directory
- while (workingFolder == null)
- {
- try
- {
- workingFolder = await StorageFolder.GetFolderFromPathAsync(workingPath).TranslateWinRTTask(workingPath, isDirectory: true);
- }
- catch (IOException) { }
- catch (UnauthorizedAccessException) { }
-
- if (workingFolder == null)
- {
- // we couldn't get the directory, we'll need to create it
- string folderName = null;
- PathHelpers.SplitDirectoryFile(workingPath, out workingPath, out folderName);
-
- if (String.IsNullOrEmpty(folderName))
- {
- // we reached the root and it did not exist. we can't create roots.
- throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_PATH_NOT_FOUND, workingPath);
- }
-
- stackDir.Push(folderName);
- Debug.Assert(!String.IsNullOrEmpty(workingPath));
- }
- }
-
- Debug.Assert(workingFolder != null);
-
- if (failIfExists && (stackDir.Count == 0))
- throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_ALREADY_EXISTS, fullPath);
-
- // we have work to do. if stackDir is empty it means we were passed a path to an existing directory.
- while (stackDir.Count > 0)
- {
- // use CreationCollisionOption.OpenIfExists to address a race conditions when creating directories
- workingFolder = await workingFolder.CreateFolderAsync(stackDir.Pop(), CreationCollisionOption.OpenIfExists).TranslateWinRTTask(fullPath, isDirectory: true);
- }
-
- return workingFolder;
- }
-
- public override void DeleteFile(string fullPath)
- {
- EnsureBackgroundThread();
- SynchronousResultOf(DeleteFileAsync(fullPath));
- }
-
- private async Task DeleteFileAsync(string fullPath)
- {
- try
- {
- // Note the absence of TranslateWinRTTask, we translate below in the catch block.
- StorageFile file = await StorageFile.GetFileFromPathAsync(fullPath).AsTask().ConfigureAwait(false);
- await file.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask().ConfigureAwait(false);
- }
- catch (Exception exception)
- {
- // For consistency with Win32 we ignore missing files
- if (exception.HResult != HResults.ERROR_FILE_NOT_FOUND)
- throw exception.TranslateWinRTException(fullPath);
- }
- }
-
- public override bool DirectoryExists(string fullPath)
- {
- EnsureBackgroundThread();
- return SynchronousResultOf(DirectoryExistsAsync(fullPath));
- }
-
- private async Task<bool> DirectoryExistsAsync(string fullPath)
- {
- string directoryPath = null, fileName = null;
- PathHelpers.SplitDirectoryFile(fullPath, out directoryPath, out fileName);
-
- // Rather than call await StorageFolder.GetFolderFromPathAsync(fullPath); and catch FileNotFoundException
- // we try to avoid the exception by calling TryGetItemAsync.
- // We can still hit an exception if the parent directory doesn't exist but it does provide better performance
- // for the existing parent/non-existing directory case and avoids a first chance exception which is a developer
- // pain point.
-
- StorageFolder parent = null;
- try
- {
- parent = await StorageFolder.GetFolderFromPathAsync(directoryPath).TranslateWinRTTask(directoryPath, isDirectory: true);
- }
- catch (IOException) { }
- catch (UnauthorizedAccessException) { }
-
- if (String.IsNullOrEmpty(fileName))
- {
- // we were given a root
- return parent != null;
- }
-
- if (parent != null)
- {
- StorageFolder folder = await parent.TryGetItemAsync(fileName).TranslateWinRTTask(fullPath, isDirectory: true) as StorageFolder;
- return folder != null;
- }
- else
- {
- // it's possible we don't have access to the parent but do have access to this folder
- try
- {
- StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(fullPath).TranslateWinRTTask(fullPath, isDirectory: true);
- return folder != null;
- }
- catch (IOException) { }
- catch (UnauthorizedAccessException) { }
- }
-
- return false;
- }
-
-
- public override IEnumerable<string> EnumeratePaths(string fullPath, string searchPattern, SearchOption searchOption, SearchTarget searchTarget)
- {
- IReadOnlyList<IStorageItem> storageFiles = SynchronousResultOf(EnumerateFileQuery(fullPath, searchPattern, searchOption, searchTarget));
- return IteratePathsFromStorageItems(storageFiles);
- }
-
- public override IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(string fullPath, string searchPattern, SearchOption searchOption, SearchTarget searchTarget)
- {
- IReadOnlyList<IStorageItem> storageFiles = SynchronousResultOf(EnumerateFileQuery(fullPath, searchPattern, searchOption, searchTarget));
- return IterateFileSystemInfosFromStorageItems(storageFiles);
- }
-
- /// <summary>
- /// Translates IStorageItems into FileSystemInfos and yields the results.
- /// </summary>
- private static IEnumerable<FileSystemInfo> IterateFileSystemInfosFromStorageItems(IReadOnlyList<IStorageItem> storageFiles)
- {
- int count = storageFiles.Count;
- for (int i = 0; i < count; i++)
- {
- if (storageFiles[i].IsOfType(StorageItemTypes.Folder))
- {
- yield return new DirectoryInfo(storageFiles[i].Path);
- }
- else // If it is neither a File nor folder then we treat it as a File.
- {
- yield return new FileInfo(storageFiles[i].Path);
- }
- }
- }
-
- /// <summary>
- /// Translates IStorageItems into string paths and yields the results.
- /// </summary>
- private static IEnumerable<string> IteratePathsFromStorageItems(IReadOnlyList<IStorageItem> storageFiles)
- {
- int count = storageFiles.Count;
- for (int i = 0; i < count; i++)
- {
- yield return storageFiles[i].Path;
- }
- }
-
- private async static Task<IReadOnlyList<IStorageItem>> EnumerateFileQuery(string path, string searchPattern, SearchOption searchOption, SearchTarget searchTarget)
- {
- // Get a StorageFolder for "path"
- string fullPath = Path.GetFullPath(path);
- StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(fullPath).TranslateWinRTTask(fullPath, isDirectory: true);
-
- // Construct a query for the search.
- QueryOptions query = new QueryOptions();
-
- // Translate SearchOption into FolderDepth
- query.FolderDepth = searchOption == SearchOption.AllDirectories ? FolderDepth.Deep : FolderDepth.Shallow;
-
- // Construct an AQS filter
- string normalizedSearchPattern = PathHelpers.NormalizeSearchPattern(searchPattern);
- if (normalizedSearchPattern.Length == 0)
- {
- // An empty searchPattern will return no results and requires no AQS parsing.
- return new IStorageItem[0];
- }
- else
- {
- // Parse the query as an ItemPathDisplay filter.
- string searchPath = PathHelpers.GetFullSearchString(fullPath, normalizedSearchPattern);
- string aqs = "System.ItemPathDisplay:~\"" + searchPath + "\"";
- query.ApplicationSearchFilter = aqs;
-
- // If the filtered path is deeper than the given user path, we need to get a new folder for it.
- // This occurs when someone does something like Enumerate("C:\first\second\", "C:\first\second\third\*").
- // When AllDirectories is set this isn't an issue, but for TopDirectoryOnly we have to do some special work
- // to make sure something is actually returned when the searchPattern is a subdirectory of the path.
- // To do this, we attempt to get a new StorageFolder for the subdirectory and return an empty enumerable
- // if we can't.
- string searchPatternDirName = Path.GetDirectoryName(normalizedSearchPattern);
- string userPath = string.IsNullOrEmpty(searchPatternDirName) ? fullPath : Path.Combine(fullPath, searchPatternDirName);
- if (userPath != folder.Path)
- {
- folder = await StorageFolder.GetFolderFromPathAsync(userPath).TranslateWinRTTask(userPath, isDirectory: true);
- }
- }
-
- // Execute our built query
- if (searchTarget == SearchTarget.Files)
- {
- StorageFileQueryResult queryResult = folder.CreateFileQueryWithOptions(query);
- return await queryResult.GetFilesAsync().TranslateWinRTTask(folder.Path, isDirectory: true);
- }
- else if (searchTarget == SearchTarget.Directories)
- {
- StorageFolderQueryResult queryResult = folder.CreateFolderQueryWithOptions(query);
- return await queryResult.GetFoldersAsync().TranslateWinRTTask(folder.Path, isDirectory: true);
- }
- else
- {
- StorageItemQueryResult queryResult = folder.CreateItemQueryWithOptions(query);
- return await queryResult.GetItemsAsync().TranslateWinRTTask(folder.Path, isDirectory: true);
- }
- }
-
- public override bool FileExists(string fullPath)
- {
- EnsureBackgroundThread();
- return SynchronousResultOf(FileExistsAsync(fullPath));
- }
-
- private async Task<bool> FileExistsAsync(string fullPath)
- {
- string directoryPath = null, fileName = null;
- PathHelpers.SplitDirectoryFile(fullPath, out directoryPath, out fileName);
-
- if (String.IsNullOrEmpty(fileName))
- {
- // No filename was provided
- return false;
- }
-
- // Rather than call await StorageFile.GetFileFromPathAsync(fullPath); and catch FileNotFoundException
- // we try to avoid the exception by calling TryGetItemAsync.
- // We can still hit an exception if the directory doesn't exist but it does provide better performance
- // for the existing folder/non-existing file case and avoids a first chance exception which is a developer
- // pain point.
-
- StorageFolder parent = null;
- try
- {
- parent = await StorageFolder.GetFolderFromPathAsync(directoryPath).TranslateWinRTTask(directoryPath);
- }
- catch (IOException) { }
- catch (UnauthorizedAccessException) { }
-
- StorageFile file = null;
-
- if (parent != null)
- {
- // The expectation is that this API will never throw, thus it is missing TranslateWinRTTask
- file = await parent.TryGetItemAsync(fileName).TranslateWinRTTask(fullPath) as StorageFile;
- }
- else
- {
- // it's possible we don't have access to the parent but do have access to this file
- try
- {
- file = await StorageFile.GetFileFromPathAsync(fullPath).TranslateWinRTTask(fullPath);
- }
- catch (IOException) { }
- catch (UnauthorizedAccessException) { }
- }
-
- return (file != null) ? file.IsAvailable : false;
- }
-
- public override FileAttributes GetAttributes(string fullPath)
- {
- EnsureBackgroundThread();
- return SynchronousResultOf(GetAttributesAsync(fullPath));
- }
-
- private async Task<FileAttributes> GetAttributesAsync(string fullPath)
- {
- IStorageItem item = await GetStorageItemAsync(fullPath).ConfigureAwait(false);
-
- return ConvertFileAttributes(item.Attributes);
- }
-
- public override DateTimeOffset GetCreationTime(string fullPath)
- {
- EnsureBackgroundThread();
- return SynchronousResultOf(GetCreationTimeAsync(fullPath));
- }
-
- private async Task<DateTimeOffset> GetCreationTimeAsync(string fullPath)
- {
- IStorageItem item = await GetStorageItemAsync(fullPath).ConfigureAwait(false);
-
- return item.DateCreated;
- }
-
public override string GetCurrentDirectory()
{
throw new PlatformNotSupportedException(); // https://github.com/dotnet/corefx/issues/17470;
}
- public override IFileSystemObject GetFileSystemInfo(string fullPath, bool asDirectory)
- {
- return new WinRTFileSystemObject(fullPath, asDirectory);
- }
-
- public override DateTimeOffset GetLastAccessTime(string fullPath)
- {
- EnsureBackgroundThread();
- return SynchronousResultOf(GetLastAccessTimeAsync(fullPath));
- }
-
- private async Task<DateTimeOffset> GetLastAccessTimeAsync(string fullPath)
- {
- IStorageItem item = await GetStorageItemAsync(fullPath).ConfigureAwait(false);
-
- return await GetLastAccessTimeAsync(item).ConfigureAwait(false);
- }
-
- // declare a static to avoid unnecessary heap allocations
- private static readonly string[] s_dateAccessedKey = { "System.DateAccessed" };
-
- private static async Task<DateTimeOffset> GetLastAccessTimeAsync(IStorageItem item)
- {
- BasicProperties properties = await item.GetBasicPropertiesAsync().TranslateWinRTTask(item.Path);
-
- var propertyMap = await properties.RetrievePropertiesAsync(s_dateAccessedKey).TranslateWinRTTask(item.Path);
-
- // shell doesn't expose this metadata on all item types
- if (propertyMap.ContainsKey(s_dateAccessedKey[0]))
- {
- return (DateTimeOffset)propertyMap[s_dateAccessedKey[0]];
- }
-
- // fallback to modified date
- return properties.DateModified;
- }
-
- public override DateTimeOffset GetLastWriteTime(string fullPath)
- {
- EnsureBackgroundThread();
- return SynchronousResultOf(GetLastWriteTimeAsync(fullPath));
- }
-
- private async Task<DateTimeOffset> GetLastWriteTimeAsync(string fullPath)
- {
- IStorageItem item = await GetStorageItemAsync(fullPath).ConfigureAwait(false);
-
- return await GetLastWriteTimeAsync(item).ConfigureAwait(false);
- }
-
- private static async Task<DateTimeOffset> GetLastWriteTimeAsync(IStorageItem item)
- {
- BasicProperties properties = await item.GetBasicPropertiesAsync().TranslateWinRTTask(item.Path);
-
- return properties.DateModified;
- }
-
- private static async Task<IStorageItem> GetStorageItemAsync(string fullPath)
- {
- string directoryPath, itemName;
- PathHelpers.SplitDirectoryFile(fullPath, out directoryPath, out itemName);
-
- StorageFolder parent = await StorageFolder.GetFolderFromPathAsync(directoryPath).TranslateWinRTTask(directoryPath, isDirectory: true);
-
- if (String.IsNullOrEmpty(itemName))
- return parent;
-
- return await parent.GetItemAsync(itemName).TranslateWinRTTask(fullPath);
- }
-
public override void MoveDirectory(string sourceFullPath, string destFullPath)
{
EnsureBackgroundThread();
@@ -519,10 +80,10 @@ namespace System.IO
PathHelpers.SplitDirectoryFile(destFullPath, out destParent, out destFolderName);
// same parent folder
- if (String.Equals(sourceParent, destParent, StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(sourceParent, destParent, StringComparison.OrdinalIgnoreCase))
{
// not the same subfolder
- if (!String.Equals(sourceFolderName, destFolderName, StringComparison.OrdinalIgnoreCase))
+ if (!string.Equals(sourceFolderName, destFolderName, StringComparison.OrdinalIgnoreCase))
{
await sourceFolder.RenameAsync(destFolderName).TranslateWinRTTask(destFullPath, isDirectory: true);
}
@@ -581,171 +142,11 @@ namespace System.IO
}
}
- public override FileStreamBase Open(string fullPath, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options, FileStream parent)
- {
- EnsureBackgroundThread();
- return SynchronousResultOf(OpenAsync(fullPath, mode, access, share, bufferSize, options, parent));
- }
-
- private async Task<FileStreamBase> OpenAsync(string fullPath, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options, FileStream parent)
- {
- // When trying to open the root directory, we need to throw an Access Denied
- if (PathInternal.GetRootLength(fullPath) == fullPath.Length)
- throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_ACCESS_DENIED, fullPath);
-
- // Win32 CreateFile returns ERROR_PATH_NOT_FOUND when given a path that ends with '\'
- if (PathHelpers.EndsInDirectorySeparator(fullPath))
- throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_PATH_NOT_FOUND, fullPath);
-
- StorageFile file = null;
-
- // FileMode
- if (mode == FileMode.Open || mode == FileMode.Truncate)
- {
- file = await StorageFile.GetFileFromPathAsync(fullPath).TranslateWinRTTask(fullPath);
- }
- else
- {
- CreationCollisionOption collisionOptions;
-
- switch (mode)
- {
- case FileMode.Create:
- collisionOptions = CreationCollisionOption.ReplaceExisting;
- break;
- case FileMode.CreateNew:
- collisionOptions = CreationCollisionOption.FailIfExists;
- break;
- case FileMode.Append:
- case FileMode.OpenOrCreate:
- default:
- collisionOptions = CreationCollisionOption.OpenIfExists;
- break;
- }
-
- string directoryPath, fileName;
- PathHelpers.SplitDirectoryFile(fullPath, out directoryPath, out fileName);
-
- StorageFolder directory = await StorageFolder.GetFolderFromPathAsync(directoryPath).TranslateWinRTTask(directoryPath, isDirectory: true);
-
- file = await directory.CreateFileAsync(fileName, collisionOptions).TranslateWinRTTask(fullPath);
- }
-
- // FileAccess: WinRT doesn't support FileAccessMode.Write so we upgrade to ReadWrite
- FileAccessMode accessMode = ((access & FileAccess.Write) != 0) ? FileAccessMode.ReadWrite : FileAccessMode.Read;
-
- // FileShare: cannot translate StorageFile uses a different sharing model (oplocks) that is controlled via FileAccessMode
-
- // FileOptions: ignore most values of FileOptions as they are hints and are not supported by WinRT.
- // FileOptions.Encrypted is not a hint, and not supported by WinRT, but there is precedent for ignoring this (FAT).
- // FileOptions.DeleteOnClose should result in an UnauthorizedAccessException when
- // opening a file that can only be read, but we cannot safely reproduce that behavior
- // in WinRT without actually deleting the file.
- // Instead the failure will occur in the finalizer for WinRTFileStream and be ignored.
-
- // open our stream
- Stream stream = (await file.OpenAsync(accessMode).TranslateWinRTTask(fullPath)).AsStream(bufferSize);
-
- if (mode == FileMode.Append)
- {
- // seek to end.
- stream.Seek(0, SeekOrigin.End);
- }
- else if (mode == FileMode.Truncate)
- {
- // truncate stream to 0
- stream.SetLength(0);
- }
-
- return new WinRTFileStream(stream, file, access, options, parent);
- }
-
- public override void RemoveDirectory(string fullPath, bool recursive)
- {
- EnsureBackgroundThread();
- SynchronousResultOf(RemoveDirectoryAsync(fullPath, recursive));
- }
-
- private async Task RemoveDirectoryAsync(string fullPath, bool recursive)
- {
- StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(fullPath).TranslateWinRTTask(fullPath, isDirectory: true);
-
- // StorageFolder.DeleteAsync will always be recursive. Detect a non-empty folder up front and throw.
- if (!recursive && (await folder.GetItemsAsync()).Count != 0)
- throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_DIR_NOT_EMPTY, fullPath);
-
- // StorageFolder.Delete ignores readonly attribute. Detect and throw.
- if ((folder.Attributes & WinRTFileAttributes.ReadOnly) == WinRTFileAttributes.ReadOnly)
- throw new IOException(SR.Format(SR.UnauthorizedAccess_IODenied_Path, fullPath));
-
- StorageFolder parentFolder = await folder.GetParentAsync().TranslateWinRTTask(fullPath, isDirectory: true);
-
- // StorageFolder.Delete throws on hidden directories but we cannot prevent it.
- await folder.DeleteAsync(StorageDeleteOption.PermanentDelete).TranslateWinRTTask(fullPath, isDirectory: true);
-
- // WinRT will ignore failures to delete in cases where files are in use.
- // Throw if the folder still remains after successful DeleteAsync
- if (null != await (parentFolder.TryGetItemAsync(folder.Name)))
- throw Win32Marshal.GetExceptionForWin32Error(Interop.Errors.ERROR_DIR_NOT_EMPTY, fullPath);
- }
-
- public override void SetAttributes(string fullPath, FileAttributes attributes)
- {
- EnsureBackgroundThread();
- SynchronousResultOf(SetAttributesAsync(fullPath, attributes));
- }
-
- private async Task SetAttributesAsync(string fullPath, FileAttributes attributes)
- {
- IStorageItem item = await GetStorageItemAsync(fullPath).ConfigureAwait(false);
-
- await SetAttributesAsync(item, attributes).ConfigureAwait(false);
- }
-
- private static async Task SetAttributesAsync(IStorageItem item, FileAttributes attributes)
- {
- BasicProperties basicProperties = await item.GetBasicPropertiesAsync().TranslateWinRTTask(item.Path);
-
- // This works for only a subset of attributes, unsupported attributes are ignored.
- // We don't mask the attributes since WinRT just ignores the unsupported ones and flowing
- // them enables possible lightup in the future.
- var property = new KeyValuePair<string, object>("System.FileAttributes", (UInt32)ConvertFileAttributes(attributes));
- try
- {
- await basicProperties.SavePropertiesAsync(new[] { property }).AsTask().ConfigureAwait(false);
- }
- catch (Exception exception)
- {
- if (exception.HResult != HResults.ERROR_INVALID_PARAMETER)
- throw new ArgumentException(SR.Arg_InvalidFileAttrs);
-
- throw exception.TranslateWinRTException(item.Path);
- }
- }
-
- public override void SetCreationTime(string fullPath, DateTimeOffset time, bool asDirectory)
- {
- // intentionally noop : not supported
- // "System.DateCreated" property is readonly
- }
-
public override void SetCurrentDirectory(string fullPath)
{
throw new PlatformNotSupportedException(); // https://github.com/dotnet/corefx/issues/17470
}
- public override void SetLastAccessTime(string fullPath, DateTimeOffset time, bool asDirectory)
- {
- // intentionally noop
- // "System.DateAccessed" property is readonly
- }
-
- public override void SetLastWriteTime(string fullPath, DateTimeOffset time, bool asDirectory)
- {
- // intentionally noop : not supported
- // "System.DateModified" property is readonly
- }
-
public override string[] GetLogicalDrives()
{
return DriveInfoInternal.GetLogicalDrives();
diff --git a/src/System.IO.FileSystem/src/System/IO/WinRTFileSystemObject.cs b/src/System.IO.FileSystem/src/System/IO/WinRTFileSystemObject.cs
deleted file mode 100644
index a479fac8a9..0000000000
--- a/src/System.IO.FileSystem/src/System/IO/WinRTFileSystemObject.cs
+++ /dev/null
@@ -1,228 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Runtime.ExceptionServices;
-using System.Threading.Tasks;
-using Windows.Storage;
-using Windows.Storage.FileProperties;
-
-namespace System.IO
-{
- partial class WinRTFileSystem
- {
- internal sealed class WinRTFileSystemObject : IFileSystemObject
- {
- private readonly bool _asDirectory;
-
- // Cache the file/directory information
- private readonly string _fullPath;
-
- // Cache the file information
- private IStorageItem _item;
-
- // Cache any error retrieving the file/directory information
- // We use this field in conjunction with the Refresh method which should never throw.
- // If we succeed this is null, on failure we capture the Exception so that we can
- // throw it when attempting to access the cached info later.
- private ExceptionDispatchInfo _initializationException;
-
- public WinRTFileSystemObject(string fullPath, bool asDirectory)
- {
- _asDirectory = asDirectory;
- _fullPath = fullPath;
- _item = null;
- _initializationException = null;
- }
-
- public FileAttributes Attributes
- {
- get
- {
- EnsureItemInitialized();
-
- if (_item == null)
- return (FileAttributes)(-1);
-
- return ConvertFileAttributes(_item.Attributes);
- }
- set
- {
- EnsureItemExists();
- EnsureBackgroundThread();
-
- try
- {
- SynchronousResultOf(SetAttributesAsync(_item, value));
- }
- catch (UnauthorizedAccessException)
- {
- // For consistency with Win32 we remap ACCESS_DENIED to ArgumentException
- // Intentionally omit argument name since this is mimicking the Win32 sourced ArgumentException
- throw new ArgumentException(SR.UnauthorizedAccess_IODenied_NoPathName /*, intentionally omitted*/);
- }
- // reset our attributes
- _item = null;
- }
- }
-
- public DateTimeOffset CreationTime
- {
- get
- {
- EnsureItemInitialized();
-
- if (_item == null)
- return DateTimeOffset.FromFileTime(0);
-
- return _item.DateCreated;
- }
- set
- {
- EnsureItemExists();
- // intentionally noop : not supported
- }
- }
-
- public bool Exists
- {
- get
- {
- // Do not throw
- if (_item == null)
- Refresh();
-
- if (_item == null)
- return false;
-
- return _item.IsOfType(_asDirectory ? StorageItemTypes.Folder : StorageItemTypes.File);
- }
- }
-
- public DateTimeOffset LastAccessTime
- {
- get
- {
- EnsureItemInitialized();
-
- if (_item == null)
- return DateTimeOffset.FromFileTime(0);
-
- EnsureBackgroundThread();
- return SynchronousResultOf(GetLastAccessTimeAsync(_item));
- }
- set
- {
- EnsureItemExists();
- // intentionally noop : not supported
- }
- }
-
- public DateTimeOffset LastWriteTime
- {
- get
- {
- EnsureItemInitialized();
-
- if (_item == null)
- return DateTimeOffset.FromFileTime(0);
-
- EnsureBackgroundThread();
- return SynchronousResultOf(GetLastWriteTimeAsync(_item));
- }
- set
- {
- EnsureItemExists();
- // intentionally noop : not supported
- }
- }
-
- public long Length
- {
- get
- {
- EnsureItemExists();
- EnsureBackgroundThread();
- return (long)SynchronousResultOf(GetLengthAsync());
- }
- }
-
- private async Task<ulong> GetLengthAsync()
- {
- BasicProperties properties = await _item.GetBasicPropertiesAsync().TranslateWinRTTask(_fullPath, _asDirectory);
- return properties.Size;
- }
-
- // Consumes cached file/directory information and throw if any error occurred retrieving
- // it, including file not found.
- private void EnsureItemExists()
- {
- // If we've already tried and failed to get the item, throw
- if (_initializationException != null)
- _initializationException.Throw();
-
- // We don't have the item, try and get it allowing any exception to be thrown
- if (_item == null)
- {
- EnsureBackgroundThread();
- _item = SynchronousResultOf(GetStorageItemAsync(_fullPath));
- }
- }
-
- private void EnsureItemInitialized()
- {
- // Refresh only if we haven't already done so once.
- if (_item == null && _initializationException == null)
- {
- // Refresh will ignore file-not-found errors.
- Refresh();
- }
-
- // Refresh was unable to initialize the data
- if (_initializationException != null)
- _initializationException.Throw();
- }
-
- public void Refresh()
- {
- EnsureBackgroundThread();
- SynchronousResultOf(RefreshAsync());
- }
-
- // Similar to WinRTFileSystem.TryGetStorageItemAsync but we only
- // want to capture exceptions that are not related to file not
- // found. This matches the behavior of the Win32 implementation.
- private async Task RefreshAsync()
- {
- string directoryPath, itemName;
- _item = null;
- _initializationException = null;
-
- try
- {
- PathHelpers.SplitDirectoryFile(_fullPath, out directoryPath, out itemName);
-
- StorageFolder parent = null;
-
- try
- {
- parent = await StorageFolder.GetFolderFromPathAsync(directoryPath).TranslateWinRTTask(directoryPath, isDirectory: true);
- }
- catch (DirectoryNotFoundException)
- {
- // Ignore DirectoryNotFound, in this case we just return null;
- }
-
- if (String.IsNullOrEmpty(itemName) || null == parent)
- _item = parent;
- else
- _item = await parent.TryGetItemAsync(itemName).TranslateWinRTTask(_fullPath);
- }
- catch (Exception e)
- {
- _initializationException = ExceptionDispatchInfo.Capture(e);
- }
- }
- }
- }
-}
diff --git a/src/System.IO.FileSystem/tests/Directory/CreateDirectory.cs b/src/System.IO.FileSystem/tests/Directory/CreateDirectory.cs
index a5db695dc5..641f11cd71 100644
--- a/src/System.IO.FileSystem/tests/Directory/CreateDirectory.cs
+++ b/src/System.IO.FileSystem/tests/Directory/CreateDirectory.cs
@@ -36,7 +36,7 @@ namespace System.IO.Tests
public void PathWithInvalidCharactersAsPath_ThrowsArgumentException(string invalidPath)
{
if (invalidPath.Equals(@"\\?\") && !PathFeatures.IsUsingLegacyPathNormalization())
- Assert.Throws<IOException>(() => Create(invalidPath));
+ AssertExtensions.ThrowsAny<IOException, UnauthorizedAccessException>(() => Create(invalidPath));
else if (invalidPath.Contains(@"\\?\") && !PathFeatures.IsUsingLegacyPathNormalization())
Assert.Throws<DirectoryNotFoundException>(() => Create(invalidPath));
else
diff --git a/src/System.IO.FileSystem/tests/FileStream/ctor_str_fm_fa_fs.delete.cs b/src/System.IO.FileSystem/tests/FileStream/ctor_str_fm_fa_fs.delete.cs
index 2d45705429..dcd4978f57 100644
--- a/src/System.IO.FileSystem/tests/FileStream/ctor_str_fm_fa_fs.delete.cs
+++ b/src/System.IO.FileSystem/tests/FileStream/ctor_str_fm_fa_fs.delete.cs
@@ -84,6 +84,7 @@ namespace System.IO.Tests
Assert.True(File.Exists(newFileName));
}
}
+
[Fact]
[PlatformSpecific(TestPlatforms.Windows)] // file sharing restriction limitations on Unix
public void FileShareDeleteExistingMultipleClients()
@@ -95,7 +96,7 @@ namespace System.IO.Tests
fs.WriteByte(0);
}
- Assert.True(File.Exists(fileName));
+ Assert.True(File.Exists(fileName), $"'{fileName}' should exist after creating and closing filestream.");
using (FileStream fs1 = CreateFileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.Delete | FileShare.ReadWrite))
{
@@ -103,7 +104,7 @@ namespace System.IO.Tests
{
File.Delete(fileName);
Assert.Equal(0, fs2.ReadByte());
- Assert.True(File.Exists(fileName));
+ Assert.True(File.Exists(fileName), $"'{fileName}' should still exist after calling delete with two handles open.");
}
Assert.Equal(0, fs1.ReadByte());
@@ -112,7 +113,7 @@ namespace System.IO.Tests
// Any attempt to reopen a file in pending-delete state will return Access-denied
Assert.Throws<UnauthorizedAccessException>(() => CreateFileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite));
- Assert.True(File.Exists(fileName));
+ Assert.True(File.Exists(fileName), $"'{fileName}' should still exist after calling delete with inner filestream closed.");
}
Assert.False(File.Exists(fileName));
diff --git a/src/System.IO.FileSystem/tests/Performance/System.IO.FileSystem.Performance.Tests.csproj b/src/System.IO.FileSystem/tests/Performance/System.IO.FileSystem.Performance.Tests.csproj
index 85258bbfe6..14a24cd377 100644
--- a/src/System.IO.FileSystem/tests/Performance/System.IO.FileSystem.Performance.Tests.csproj
+++ b/src/System.IO.FileSystem/tests/Performance/System.IO.FileSystem.Performance.Tests.csproj
@@ -23,15 +23,9 @@
<Compile Include="$(CommonTestPath)\System\PerfUtils.cs">
<Link>Common\System\PerfUtils.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\IO\PathFeatures.cs">
<Link>Common\System\IO\PathFeatures.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(CommonPath)\..\perf\PerfRunner\PerfRunner.csproj">
diff --git a/src/System.IO.FileSystem/tests/System.IO.FileSystem.Tests.csproj b/src/System.IO.FileSystem/tests/System.IO.FileSystem.Tests.csproj
index 0332976b83..b57b70ef61 100644
--- a/src/System.IO.FileSystem/tests/System.IO.FileSystem.Tests.csproj
+++ b/src/System.IO.FileSystem/tests/System.IO.FileSystem.Tests.csproj
@@ -159,9 +159,6 @@
<Compile Include="FileInfo\AppendText.cs" />
<Compile Include="FileInfo\CopyTo.cs" />
<!-- Helpers -->
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\IO\TempFile.cs">
<Link>Common\System\IO\TempFile.cs</Link>
</Compile>
@@ -171,9 +168,6 @@
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
diff --git a/src/System.IO.MemoryMappedFiles/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.IO.MemoryMappedFiles/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 33367e4f3a..0000000000
--- a/src/System.IO.MemoryMappedFiles/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,4 +0,0 @@
-kernel32.dll!CreateFileMappingW
-kernel32.dll!MapViewOfFile
-kernel32.dll!OpenFileMappingW
-kernel32.dll!VirtualAlloc
diff --git a/src/System.IO.MemoryMappedFiles/src/System.IO.MemoryMappedFiles.csproj b/src/System.IO.MemoryMappedFiles/src/System.IO.MemoryMappedFiles.csproj
index 5e21d731b6..9b57c2bd08 100644
--- a/src/System.IO.MemoryMappedFiles/src/System.IO.MemoryMappedFiles.csproj
+++ b/src/System.IO.MemoryMappedFiles/src/System.IO.MemoryMappedFiles.csproj
@@ -43,11 +43,6 @@
</ItemGroup>
<ItemGroup Condition="'$(TargetsWindows)' == 'true' and '$(TargetGroup)' != 'uap'">
<Compile Include="System\IO\MemoryMappedFiles\Interop.Windows.cs" />
- </ItemGroup>
- <ItemGroup Condition=" '$(TargetsWindows)' == 'true'">
- <Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.GlobalMemoryStatusEx.cs">
- <Link>Common\Interop\Windows\Interop.GlobalMemoryStatusEx.cs</Link>
- </Compile>
<Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.CreateFileMapping.cs">
<Link>Common\Interop\Windows\Interop.CreateFileMapping.cs</Link>
</Compile>
@@ -57,12 +52,17 @@
<Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.OpenFileMapping.cs">
<Link>Common\Interop\Windows\Interop.OpenFileMapping.cs</Link>
</Compile>
- <Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.SECURITY_ATTRIBUTES.cs">
- <Link>Common\Interop\Windows\Interop.SECURITY_ATTRIBUTES.cs</Link>
- </Compile>
<Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.VirtualAlloc.cs">
<Link>Common\Interop\Windows\Interop.VirtualAlloc.cs</Link>
</Compile>
+ </ItemGroup>
+ <ItemGroup Condition=" '$(TargetsWindows)' == 'true'">
+ <Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.GlobalMemoryStatusEx.cs">
+ <Link>Common\Interop\Windows\Interop.GlobalMemoryStatusEx.cs</Link>
+ </Compile>
+ <Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.SECURITY_ATTRIBUTES.cs">
+ <Link>Common\Interop\Windows\Interop.SECURITY_ATTRIBUTES.cs</Link>
+ </Compile>
<Compile Include="$(CommonPath)\Interop\Windows\Interop.Libraries.cs">
<Link>Common\Interop\Windows\Interop.Libraries.cs</Link>
</Compile>
diff --git a/src/System.IO.MemoryMappedFiles/tests/Performance/System.IO.MemoryMappedFiles.Performance.Tests.csproj b/src/System.IO.MemoryMappedFiles/tests/Performance/System.IO.MemoryMappedFiles.Performance.Tests.csproj
index b5eb4684a0..7d0243f7d1 100644
--- a/src/System.IO.MemoryMappedFiles/tests/Performance/System.IO.MemoryMappedFiles.Performance.Tests.csproj
+++ b/src/System.IO.MemoryMappedFiles/tests/Performance/System.IO.MemoryMappedFiles.Performance.Tests.csproj
@@ -14,9 +14,6 @@
<Compile Include="..\MemoryMappedFilesTestsBase.cs" />
<Compile Include="..\MemoryMappedFilesTestsBase.Unix.cs" Condition="'$(TargetsUnix)' == 'true'" />
<Compile Include="..\MemoryMappedFilesTestsBase.Windows.cs" Condition="'$(TargetsWindows)' == 'true'" />
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonPath)\System\IO\StringBuilderCache.cs">
<Link>Common\System\IO\StringBuilderCache.cs</Link>
</Compile>
diff --git a/src/System.IO.MemoryMappedFiles/tests/System.IO.MemoryMappedFiles.Tests.csproj b/src/System.IO.MemoryMappedFiles/tests/System.IO.MemoryMappedFiles.Tests.csproj
index f3f89a4c2f..a18106f2fb 100644
--- a/src/System.IO.MemoryMappedFiles/tests/System.IO.MemoryMappedFiles.Tests.csproj
+++ b/src/System.IO.MemoryMappedFiles/tests/System.IO.MemoryMappedFiles.Tests.csproj
@@ -26,12 +26,6 @@
<Compile Include="$(CommonTestPath)\System\IO\TempFile.cs">
<Link>Common\System\IO\TempFile.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
diff --git a/src/System.IO.Packaging/tests/Tests.cs b/src/System.IO.Packaging/tests/Tests.cs
index 324d777bb6..8b0928ba24 100644
--- a/src/System.IO.Packaging/tests/Tests.cs
+++ b/src/System.IO.Packaging/tests/Tests.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System.Linq;
+using System.Runtime.CompilerServices;
using System.Text;
using System.Xml;
using System.Xml.Linq;
@@ -10,30 +11,25 @@ using Xunit;
namespace System.IO.Packaging.Tests
{
- public class Tests
+ public class Tests : FileCleanupTestBase
{
private const string Mime_MediaTypeNames_Text_Xml = "text/xml";
private const string Mime_MediaTypeNames_Image_Jpeg = "image/jpeg"; // System.Net.Mime.MediaTypeNames.Image.Jpeg
private const string s_DocumentXml = @"<Hello>Test</Hello>";
private const string s_ResourceXml = @"<Resource>Test</Resource>";
- private static FileInfo GetFileSavedWithGuidName(string test, string name)
+ private FileInfo GetTempFileInfoFromExistingFile(string existingFileName, [CallerMemberName] string memberName = null, [CallerLineNumber] int lineNumber = 0)
{
- var fiDoc = new FileInfo(name);
- var ba = File.ReadAllBytes(fiDoc.FullName);
- var fiGuidName = new FileInfo("Temp-" + Guid.NewGuid().ToString().Replace("-", "") + fiDoc.Extension);
- File.WriteAllBytes(fiGuidName.FullName, ba);
- // If a test leaves a Test-* file in existence, then uncomment following line to determine which test it was.
- // Console.WriteLine("{0}:{1}", test, fiGuidName.Name);
- return fiGuidName;
+ FileInfo existingDoc = new FileInfo(existingFileName);
+ byte[] content = File.ReadAllBytes(existingDoc.FullName);
+ FileInfo newFile = new FileInfo($"{GetTestFilePath(null, memberName, lineNumber)}.{existingDoc.Extension}");
+ File.WriteAllBytes(newFile.FullName, content);
+ return newFile;
}
- public static FileInfo GetGuidNameForNewFile(string test, string extension)
+ public FileInfo GetTempFileInfoWithExtension(string extension, [CallerMemberName] string memberName = null, [CallerLineNumber] int lineNumber = 0)
{
- var fiDoc = new FileInfo("Temp-" + Guid.NewGuid().ToString().Replace("-", "") + extension);
- // If a test leaves a Test-* file in existence, then uncomment following line to determine which test it was.
- // Console.WriteLine("{0}:{1}", test, fiDoc.Name);
- return fiDoc;
+ return new FileInfo($"{GetTestFilePath(null, memberName, lineNumber)}.{extension}");
}
[Fact]
@@ -211,7 +207,7 @@ namespace System.IO.Packaging.Tests
public void T170_InvalidRelationshipId()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T170_InvalidRelationshipId", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
var documentPath = "document.xml";
Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(documentPath, UriKind.Relative));
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
@@ -254,7 +250,7 @@ namespace System.IO.Packaging.Tests
public void T168_InvalidRelationshipId()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T168_InvalidRelationshipId", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
var documentPath = "document.xml";
Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(documentPath, UriKind.Relative));
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
@@ -819,7 +815,7 @@ namespace System.IO.Packaging.Tests
public void T139_Access_Length_Prop_of_Stream()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T139_Access_Length_Prop_of_Stream", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.Read))
@@ -1130,7 +1126,7 @@ namespace System.IO.Packaging.Tests
public void T040_InvalidRelationshipId()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T040_InvalidRelationshipId", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
XNamespace W = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
@@ -1226,7 +1222,7 @@ namespace System.IO.Packaging.Tests
var packageRelationshipType = "http://packageRelType";
var ResourceRelationshipType = "http://resourceRelType";
- var packagePath1 = GetGuidNameForNewFile("T036_CreateRelationshipWithId", ".docx");
+ var packagePath1 = GetTempFileInfoWithExtension(".docx");
Uri partUriDocument = PackUriHelper.CreatePartUri(
new Uri(documentPath, UriKind.Relative));
Uri partUriResource = PackUriHelper.CreatePartUri(
@@ -1886,7 +1882,7 @@ namespace System.IO.Packaging.Tests
public void T015_CreatePart()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T015_CreatePart", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
var documentPath = "document.xml";
var packageRelationshipType = "http://packageRelType";
@@ -1980,7 +1976,7 @@ namespace System.IO.Packaging.Tests
public void T011_PackageOpen()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T011_PackageOpen", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
var documentPath = "document.xml";
Uri partUriDocument = PackUriHelper.CreatePartUri(
@@ -1998,7 +1994,7 @@ namespace System.IO.Packaging.Tests
public void T010_PackageOpen()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T010_PackageOpen", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Open, FileAccess.Read))
{
@@ -2012,7 +2008,7 @@ namespace System.IO.Packaging.Tests
public void T009_PackageOpen()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T009_PackageOpen", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
using (Package package = Package.Open(fiGuidName.FullName))
{
@@ -2026,7 +2022,7 @@ namespace System.IO.Packaging.Tests
public void T008_PackageProperties()
{
var docName = "docprops.docx";
- var fiGuidName = GetFileSavedWithGuidName("T008_PackageProperties", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
XNamespace W = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Open))
@@ -2050,7 +2046,7 @@ namespace System.IO.Packaging.Tests
public void T007_PackageProperties()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T007_PackageProperties", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
XNamespace W = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Open))
@@ -2082,7 +2078,7 @@ namespace System.IO.Packaging.Tests
FileInfo packagePath2 = null;
try
{
- packagePath2 = GetGuidNameForNewFile("T006_CreateExternalRelationshipInvalidUri", ".docx");
+ packagePath2 = GetTempFileInfoWithExtension(".docx");
Uri partUriDocument2 = PackUriHelper.CreatePartUri(
new Uri(documentPath, UriKind.Relative));
Uri partUriResource2 = PackUriHelper.CreatePartUri(
@@ -2097,7 +2093,7 @@ namespace System.IO.Packaging.Tests
CompressionOption.Normal);
// Copy the data to the Document Part
- var fiDocumentPath = GetGuidNameForNewFile("T006_CreateExternalRelationshipInvalidUri", ".xml");
+ var fiDocumentPath = GetTempFileInfoWithExtension(".xml");
File.WriteAllText(fiDocumentPath.FullName, s_DocumentXml);
using (FileStream fileStream = new FileStream(fiDocumentPath.FullName, FileMode.Open, FileAccess.Read))
using (Stream partStream = packagePartDocument.GetStream())
@@ -2134,7 +2130,7 @@ namespace System.IO.Packaging.Tests
var packageRelationshipType = "http://packageRelType";
var ResourceRelationshipType = "http://resourceRelType";
- var packagePath1 = GetGuidNameForNewFile("T005_CreateInternalRelationship", ".docx");
+ var packagePath1 = GetTempFileInfoWithExtension(".docx");
Uri partUriDocument = PackUriHelper.CreatePartUri(
new Uri(documentPath, UriKind.Relative));
Uri partUriResource = PackUriHelper.CreatePartUri(
@@ -2191,7 +2187,7 @@ namespace System.IO.Packaging.Tests
var packageRelationshipType = "http://packageRelType";
var ResourceRelationshipType = "http://resourceRelType";
- var packagePath1 = GetGuidNameForNewFile("T004_CreateInternalRelationship", ".docx");
+ var packagePath1 = GetTempFileInfoWithExtension(".docx");
Uri partUriDocument = PackUriHelper.CreatePartUri(
new Uri(documentPath, UriKind.Relative));
Uri partUriResource = PackUriHelper.CreatePartUri(
@@ -2206,7 +2202,7 @@ namespace System.IO.Packaging.Tests
CompressionOption.Normal);
// Copy the data to the Document Part
- var fiDocumentPath = GetGuidNameForNewFile("T004_CreateInternalRelationship", ".xml");
+ var fiDocumentPath = GetTempFileInfoWithExtension(".xml");
File.WriteAllText(fiDocumentPath.FullName, s_DocumentXml);
using (FileStream fileStream = new FileStream(fiDocumentPath.FullName, FileMode.Open, FileAccess.Read))
using (Stream partStream = packagePartDocument.GetStream())
@@ -2227,7 +2223,7 @@ namespace System.IO.Packaging.Tests
CompressionOption.Normal);
// Copy the data to the Resource Part
- fiDocumentPath = GetGuidNameForNewFile("T004_CreateInternalRelationship", ".xml");
+ fiDocumentPath = GetTempFileInfoWithExtension(".xml");
File.WriteAllText(fiDocumentPath.FullName, s_DocumentXml);
using (FileStream fileStream = new FileStream(fiDocumentPath.FullName, FileMode.Open, FileAccess.Read))
using (Stream partStream = packagePartResource.GetStream())
@@ -2255,11 +2251,11 @@ namespace System.IO.Packaging.Tests
var packageRelationshipType = "http://packageRelType";
var ResourceRelationshipType = "http://resourceRelType";
- var packagePath2 = GetGuidNameForNewFile("T003_CreateExternalRelationship", ".docx");
+ var packagePath2 = $"{GetTestFilePath()}.docx";
Uri partUriDocument2 = PackUriHelper.CreatePartUri(new Uri(documentPath, UriKind.Relative));
Uri partUriResource2 = PackUriHelper.CreatePartUri(new Uri(resourcePath, UriKind.Relative));
- using (Package package = Package.Open(packagePath2.FullName, FileMode.Create))
+ using (Package package = Package.Open(packagePath2, FileMode.Create))
{
// Add the Document part to the Package
PackagePart packagePartDocument =
@@ -2268,7 +2264,7 @@ namespace System.IO.Packaging.Tests
CompressionOption.Normal);
// Copy the data to the Document Part
- var fiDocumentPath = GetGuidNameForNewFile("T003_CreateExternalRelationship", ".xml");
+ var fiDocumentPath = GetTempFileInfoWithExtension(".xml");
File.WriteAllText(fiDocumentPath.FullName, s_DocumentXml);
using (FileStream fileStream = new FileStream(fiDocumentPath.FullName, FileMode.Open, FileAccess.Read))
using (Stream partStream = packagePartDocument.GetStream())
@@ -2290,7 +2286,6 @@ namespace System.IO.Packaging.Tests
ResourceRelationshipType);
}
- packagePath2.Delete();
}
private static void CopyStream(Stream source, Stream target)
@@ -2307,7 +2302,7 @@ namespace System.IO.Packaging.Tests
public void T001_AddParagraphToDocument()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T001_AddParagraphToDocument", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
XNamespace W = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Open))
@@ -2350,7 +2345,7 @@ namespace System.IO.Packaging.Tests
public void T002_IterateParts()
{
var docName = "plain.docx";
- var fiGuidName = GetFileSavedWithGuidName("T002_IterateParts", docName);
+ var fiGuidName = GetTempFileInfoFromExistingFile(docName);
using (Package package = Package.Open(fiGuidName.FullName, FileMode.Open))
{
@@ -2378,7 +2373,7 @@ namespace System.IO.Packaging.Tests
public void T138_String_Truncate_ReadWrite_OpenOrCreate_Read_Write()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T138_String_Truncate_ReadWrite_OpenOrCreate_Read_Write", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
// Truncate is invalid
@@ -2393,7 +2388,7 @@ namespace System.IO.Packaging.Tests
public void T137_String_Truncate_Write_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T137_String_Truncate_Write_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
// Truncate is invalid
@@ -2408,7 +2403,7 @@ namespace System.IO.Packaging.Tests
public void T136_String_Truncate_Read_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T136_String_Truncate_Read_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
// Truncate is invalid
@@ -2423,7 +2418,7 @@ namespace System.IO.Packaging.Tests
public void T135_String_OpenOrCreate_ReadWrite_OpenOrCreate_Read_Write()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T135_String_OpenOrCreate_ReadWrite_OpenOrCreate_Read_Write", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
@@ -2475,7 +2470,7 @@ namespace System.IO.Packaging.Tests
public void T134_String_OpenOrCreate_ReadWrite_OpenOrCreate_Read_Write()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T134_String_OpenOrCreate_ReadWrite_OpenOrCreate_Read_Write", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
@@ -2515,7 +2510,7 @@ namespace System.IO.Packaging.Tests
public void T133_String_OpenOrCreate_ReadWrite_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T133_String_OpenOrCreate_ReadWrite_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
@@ -2555,7 +2550,7 @@ namespace System.IO.Packaging.Tests
public void T132_String_OpenOrCreate_ReadWrite_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T132_String_OpenOrCreate_ReadWrite_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
@@ -2595,7 +2590,7 @@ namespace System.IO.Packaging.Tests
public void T131_String_OpenOrCreate_ReadWrite_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T131_String_OpenOrCreate_ReadWrite_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
@@ -2634,7 +2629,7 @@ namespace System.IO.Packaging.Tests
public void T130_String_OpenOrCreate_Write_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T130_String_OpenOrCreate_Write_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
Assert.Throws<ArgumentException>(() =>
@@ -2648,7 +2643,7 @@ namespace System.IO.Packaging.Tests
public void T129_String_OpenOrCreate_Read_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T129_String_OpenOrCreate_Read_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
Assert.Throws<ArgumentException>(() =>
@@ -2662,7 +2657,7 @@ namespace System.IO.Packaging.Tests
public void T128_String_Open_ReadWrite_OpenOrCreate_Read_Write_ReadWrite()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T128_String_Open_ReadWrite_OpenOrCreate_Read_Write_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.ReadWrite))
@@ -2710,7 +2705,7 @@ namespace System.IO.Packaging.Tests
public void T127_String_Open_ReadWrite_Open_Read_Write_ReadWrite()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T127_String_Open_ReadWrite_Open_Read_Write_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.ReadWrite))
@@ -2755,7 +2750,7 @@ namespace System.IO.Packaging.Tests
public void T126_String_Open_Write_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T126_String_Open_Write_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
Assert.Throws<ArgumentException>(() =>
@@ -2769,7 +2764,7 @@ namespace System.IO.Packaging.Tests
public void T125_String_Open_Read_OpenOrCreate()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T125_String_Open_Read_OpenOrCreate", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.Read))
@@ -2818,7 +2813,7 @@ namespace System.IO.Packaging.Tests
public void T124_String_Open_Read_Create_Write()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T124_String_Open_Read_Create_Write", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.Read))
@@ -2862,7 +2857,7 @@ namespace System.IO.Packaging.Tests
public void T123_String_Open_Read_Create_Star()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T123_String_Open_Read_Create_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.Read))
@@ -2898,7 +2893,7 @@ namespace System.IO.Packaging.Tests
public void T122_String_Open_Read_Open_ReadWrite()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T122_String_Open_Read_Open_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.Read))
@@ -2935,7 +2930,7 @@ namespace System.IO.Packaging.Tests
public void T121_String_Open_Read_Open_Write()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T121_String_Open_Read_Open_Write", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.Read))
@@ -2971,7 +2966,7 @@ namespace System.IO.Packaging.Tests
public void T120_String_Open_Read_Open_Read()
{
var ba = File.ReadAllBytes("plain.docx");
- var tempGuidName = GetGuidNameForNewFile("T120_String_Open_Read_Open_Read", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
File.WriteAllBytes(tempGuidName.FullName, ba);
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Open, FileAccess.Read))
@@ -3003,7 +2998,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T119_String_CreateNew_ReadWrite_OpenOrCreate_ReadWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T119_String_CreateNew_ReadWrite_OpenOrCreate_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3032,7 +3027,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T118_String_CreateNew_ReadWrite_Truncate_ReadWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T118_String_CreateNew_ReadWrite_Truncate_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3059,7 +3054,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T117_String_CreateNew_ReadWrite_CreateNew_Star()
{
- var tempGuidName = GetGuidNameForNewFile("T117_String_CreateNew_ReadWrite_CreateNew_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3085,7 +3080,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T116_String_CreateNew_ReadWrite_Open_ReadAndWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T116_String_CreateNew_ReadWrite_Open_ReadAndWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3114,7 +3109,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T115_String_CreateNew_ReadWrite_Open_ReadAndWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T115_String_CreateNew_ReadWrite_Open_ReadAndWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3146,7 +3141,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T114_String_CreateNew_ReadWrite_Open_ReadAndWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T114_String_CreateNew_ReadWrite_Open_ReadAndWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3175,7 +3170,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T113_String_CreateNew_Write_Open_Read()
{
- var tempGuidName = GetGuidNameForNewFile("T113_String_CreateNew_Write_Open_Read", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
Assert.Throws<ArgumentException>(() =>
{
Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.Write);
@@ -3186,7 +3181,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T112_String_CreateNew_Read_Create_Read()
{
- var tempGuidName = GetGuidNameForNewFile("T112_String_CreateNew_Read_Create_Read", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
Assert.Throws<ArgumentException>(() =>
{
Package package = Package.Open(tempGuidName.FullName, FileMode.CreateNew, FileAccess.Read);
@@ -3197,7 +3192,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T111_String_Create_Write_Star()
{
- var tempGuidName = GetGuidNameForNewFile("T111_String_Create_Write_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
// opening the package attempts to read the package, and no permissions.
Assert.Throws<ArgumentException>(() => Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.Write));
tempGuidName.Delete();
@@ -3206,7 +3201,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T110_String_Create_ReadWrite_OpenOrCreate_ReadWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T110_String_Create_ReadWrite_OpenOrCreate_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3235,7 +3230,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T109_String_Create_ReadWrite_OpenOrCreate_ReadWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T109_String_Create_ReadWrite_OpenOrCreate_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3264,7 +3259,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T108_String_Create_ReadWrite_OpenOrCreate_Read()
{
- var tempGuidName = GetGuidNameForNewFile("T108_String_Create_ReadWrite_OpenOrCreate_Read", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3293,7 +3288,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T107_String_Create_ReadWrite_Open_ReadWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T107_String_Create_ReadWrite_Open_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3322,7 +3317,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T106_String_Create_ReadWrite_Open_ReadWrite()
{
- var tempGuidName = GetGuidNameForNewFile("T106_String_Create_ReadWrite_Open_ReadWrite", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3351,7 +3346,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T105_String_Create_ReadWrite_Open_Write()
{
- var tempGuidName = GetGuidNameForNewFile("T105_String_Create_ReadWrite_Open_Write", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3379,7 +3374,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T104_String_Create_ReadWrite_Open_Write()
{
- var tempGuidName = GetGuidNameForNewFile("T104_String_Create_ReadWrite_Open_Write", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3402,7 +3397,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T103_String_Create_ReadWrite_Open_Read()
{
- var tempGuidName = GetGuidNameForNewFile("T103_String_Create_ReadWrite_Open_Read", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3426,7 +3421,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T102_String_Create_ReadWrite_Open_Read()
{
- var tempGuidName = GetGuidNameForNewFile("T102_String_Create_ReadWrite_Open_Read", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3452,7 +3447,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T101_String_Create_ReadWrite_Create_Read()
{
- var tempGuidName = GetGuidNameForNewFile("T101_String_Create_ReadWrite_Create_Read", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
using (Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.ReadWrite))
{
Uri uri = PackUriHelper.CreatePartUri(new Uri("dummy.xml", UriKind.Relative));
@@ -3486,7 +3481,7 @@ namespace System.IO.Packaging.Tests
[Fact]
public void T100_String_Create_Read_Star()
{
- var tempGuidName = GetGuidNameForNewFile("T100_String_Create_Read_Star", ".docx");
+ var tempGuidName = GetTempFileInfoWithExtension(".docx");
Assert.Throws<ArgumentException>(() =>
{
Package package = Package.Open(tempGuidName.FullName, FileMode.Create, FileAccess.Read);
diff --git a/src/System.IO.Pipes.AccessControl/tests/System.IO.Pipes.AccessControl.Tests.csproj b/src/System.IO.Pipes.AccessControl/tests/System.IO.Pipes.AccessControl.Tests.csproj
index 0539a6885f..b531986ec2 100644
--- a/src/System.IO.Pipes.AccessControl/tests/System.IO.Pipes.AccessControl.Tests.csproj
+++ b/src/System.IO.Pipes.AccessControl/tests/System.IO.Pipes.AccessControl.Tests.csproj
@@ -11,12 +11,6 @@
<Compile Include="NamedPipeTests\NamedPipeTest.AclExtensions.cs" />
<Compile Include="PipeTest.AclExtensions.cs" />
<Compile Include="..\..\System.IO.Pipes\tests\PipeTestBase.cs" />
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
diff --git a/src/System.IO.Pipes/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.IO.Pipes/src/PinvokeAnalyzerExceptionList.analyzerdata
index 096979fa7d..0719fa0f9d 100644
--- a/src/System.IO.Pipes/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ b/src/System.IO.Pipes/src/PinvokeAnalyzerExceptionList.analyzerdata
@@ -1,11 +1,3 @@
-advapi32.dll!ImpersonateNamedPipeClient
-advapi32.dll!RevertToSelf
-kernel32.dll!ConnectNamedPipe
-kernel32.dll!CreateFileW
-kernel32.dll!CreateNamedPipeW
-kernel32.dll!CreatePipe
-kernel32.dll!DisconnectNamedPipe
-kernel32.dll!GetNamedPipeHandleStateW
-kernel32.dll!GetNamedPipeInfo
-kernel32.dll!SetNamedPipeHandleState
-kernel32.dll!WaitNamedPipeW \ No newline at end of file
+## need to create a uap config that uses CreateFileFromApp, then remove this baseline ##
+# https://github.com/dotnet/corefx/issues/21025
+kernel32.dll!CreateFileW \ No newline at end of file
diff --git a/src/System.IO.Pipes/tests/System.IO.Pipes.Tests.csproj b/src/System.IO.Pipes/tests/System.IO.Pipes.Tests.csproj
index fec7b2d3c8..33fc1ef8a1 100644
--- a/src/System.IO.Pipes/tests/System.IO.Pipes.Tests.csproj
+++ b/src/System.IO.Pipes/tests/System.IO.Pipes.Tests.csproj
@@ -36,12 +36,6 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
diff --git a/src/System.IO.Ports/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.IO.Ports/src/PinvokeAnalyzerExceptionList.analyzerdata
index 5464e9945c..0719fa0f9d 100644
--- a/src/System.IO.Ports/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ b/src/System.IO.Ports/src/PinvokeAnalyzerExceptionList.analyzerdata
@@ -1,14 +1,3 @@
-kernel32.dll!ClearCommBreak
-kernel32.dll!ClearCommError
-kernel32.dll!CreateFileW
-kernel32.dll!EscapeCommFunction
-kernel32.dll!GetCommModemStatus
-kernel32.dll!GetCommProperties
-kernel32.dll!GetCommState
-kernel32.dll!PurgeComm
-kernel32.dll!SetCommBreak
-kernel32.dll!SetCommMask
-kernel32.dll!SetCommState
-kernel32.dll!SetCommTimeouts
-kernel32.dll!SetupComm
-kernel32.dll!WaitCommEvent
+## need to create a uap config that uses CreateFileFromApp, then remove this baseline ##
+# https://github.com/dotnet/corefx/issues/21025
+kernel32.dll!CreateFileW \ No newline at end of file
diff --git a/src/System.IO.Ports/tests/SerialPort/GetPortNames.cs b/src/System.IO.Ports/tests/SerialPort/GetPortNames.cs
index ae5cd4ec18..7439ec05f8 100644
--- a/src/System.IO.Ports/tests/SerialPort/GetPortNames.cs
+++ b/src/System.IO.Ports/tests/SerialPort/GetPortNames.cs
@@ -11,6 +11,7 @@ using Xunit;
namespace System.IO.Ports.Tests
{
+ [ActiveIssue("https://github.com/dotnet/corefx/issues/20588", TargetFrameworkMonikers.Uap)] // fails in both Uap and UapAot
public class GetPortNames : PortsTest
{
#region Test Cases
@@ -19,7 +20,6 @@ namespace System.IO.Ports.Tests
/// Check that all ports either open correctly or fail with UnauthorizedAccessException (which implies they're already open)
/// </summary>
[Fact]
- [ActiveIssue("https://github.com/dotnet/corefx/issues/20588 - GetPortNames() has registry dependency.", TargetFrameworkMonikers.UapAot)]
private void OpenEveryPortName()
{
foreach (string portName in SerialPort.GetPortNames())
@@ -41,7 +41,6 @@ namespace System.IO.Ports.Tests
/// (On Windows, the latter uses a different technique to SerialPort to find ports).
/// </summary>
[Fact]
- [ActiveIssue("https://github.com/dotnet/corefx/issues/20588 - GetPortNames() has registry dependency.", TargetFrameworkMonikers.UapAot)]
private void AllHelperPortsAreInGetPortNames()
{
string[] serialPortNames = SerialPort.GetPortNames();
@@ -57,7 +56,6 @@ namespace System.IO.Ports.Tests
/// This catches regressions in the test helpers, eg GH #18928 / #20668
/// </summary>
[Fact]
- [ActiveIssue("https://github.com/dotnet/corefx/issues/20588 - GetPortNames() has registry dependency.", TargetFrameworkMonikers.UapAot)]
private void AllGetPortNamesAreInHelperPorts()
{
string[] helperPortNames = PortHelper.GetPorts();
diff --git a/src/System.IO.Ports/tests/SerialPort/OpenDevices.cs b/src/System.IO.Ports/tests/SerialPort/OpenDevices.cs
index d57312b17f..88e15972a7 100644
--- a/src/System.IO.Ports/tests/SerialPort/OpenDevices.cs
+++ b/src/System.IO.Ports/tests/SerialPort/OpenDevices.cs
@@ -13,6 +13,7 @@ namespace System.IO.Ports.Tests
public class OpenDevices : PortsTest
{
[Fact]
+ [ActiveIssue(21156, TargetFrameworkMonikers.Uap)]
public void OpenDevices01()
{
DosDevices dosDevices = new DosDevices();
diff --git a/src/System.IO.Ports/tests/SerialPort/ctor_str.cs b/src/System.IO.Ports/tests/SerialPort/ctor_str.cs
index 9565855ddd..7e46028e2c 100644
--- a/src/System.IO.Ports/tests/SerialPort/ctor_str.cs
+++ b/src/System.IO.Ports/tests/SerialPort/ctor_str.cs
@@ -76,7 +76,7 @@ namespace System.IO.Ports.Tests
public void Filename()
{
string portName;
- string fileName = portName = "PortNameEqualToFileName.txt";
+ string fileName = portName = GetTestFilePath();
FileStream testFile = File.Open(fileName, FileMode.Create);
ASCIIEncoding asciiEncd = new ASCIIEncoding();
string testStr = "Hello World";
diff --git a/src/System.IO.Ports/tests/SerialPort/ctor_str_int.cs b/src/System.IO.Ports/tests/SerialPort/ctor_str_int.cs
index 0c4fac7cbb..43e498dd97 100644
--- a/src/System.IO.Ports/tests/SerialPort/ctor_str_int.cs
+++ b/src/System.IO.Ports/tests/SerialPort/ctor_str_int.cs
@@ -98,7 +98,7 @@ namespace System.IO.Ports.Tests
{
string portName;
int baudRate = 9600;
- string fileName = portName = "PortNameEqualToFileName.txt";
+ string fileName = portName = GetTestFilePath();
FileStream testFile = File.Open(fileName, FileMode.Create);
ASCIIEncoding asciiEncd = new ASCIIEncoding();
string testStr = "Hello World";
diff --git a/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity.cs b/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity.cs
index 014588ca82..82e833e4db 100644
--- a/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity.cs
+++ b/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity.cs
@@ -105,7 +105,7 @@ namespace System.IO.Ports.Tests
string portName;
int baudRate = 9600;
int parity = (int)Parity.Space;
- string fileName = portName = "PortNameEqualToFileName.txt";
+ string fileName = portName = GetTestFilePath();
FileStream testFile = File.Open(fileName, FileMode.Create);
ASCIIEncoding asciiEncd = new ASCIIEncoding();
string testStr = "Hello World";
diff --git a/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int.cs b/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int.cs
index d48f9699cf..c03867eace 100644
--- a/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int.cs
+++ b/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int.cs
@@ -128,7 +128,7 @@ namespace System.IO.Ports.Tests
int baudRate = 9600;
int parity = (int)Parity.Space;
int dataBits = 8;
- string fileName = portName = "PortNameEqualToFileName.txt";
+ string fileName = portName = GetTestFilePath();
FileStream testFile = File.Open(fileName, FileMode.Create);
ASCIIEncoding asciiEncd = new ASCIIEncoding();
string testStr = "Hello World";
diff --git a/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int_stopbits.cs b/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int_stopbits.cs
index d7f5ef089c..3f8462b999 100644
--- a/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int_stopbits.cs
+++ b/src/System.IO.Ports/tests/SerialPort/ctor_str_int_parity_int_stopbits.cs
@@ -216,7 +216,7 @@ namespace System.IO.Ports.Tests
int parity = (int)Parity.Space;
int dataBits = 8;
int stopBits = (int)StopBits.One;
- string fileName = portName = "PortNameEqualToFileName.txt";
+ string fileName = portName = GetTestFilePath();
FileStream testFile = File.Open(fileName, FileMode.Create);
ASCIIEncoding asciiEncd = new ASCIIEncoding();
string testStr = "Hello World";
diff --git a/src/System.IO.Ports/tests/Support/PortHelper.cs b/src/System.IO.Ports/tests/Support/PortHelper.cs
index 2795dcd955..ac42f99c0d 100644
--- a/src/System.IO.Ports/tests/Support/PortHelper.cs
+++ b/src/System.IO.Ports/tests/Support/PortHelper.cs
@@ -19,6 +19,11 @@ namespace Legacy.Support
public static string[] GetPorts()
{
+ if (PlatformDetection.IsWinRT)
+ {
+ return new string[0]; // we are waiting for a Win32 new QueryDosDevice API since the current doesn't work for Uap https://github.com/dotnet/corefx/issues/21156
+ }
+
List<string> ports = new List<string>();
int returnSize = 0;
int maxSize = 1000000;
diff --git a/src/System.IO.Ports/tests/Support/PortsTest.cs b/src/System.IO.Ports/tests/Support/PortsTest.cs
index 7c9d28c67d..38e446ca86 100644
--- a/src/System.IO.Ports/tests/Support/PortsTest.cs
+++ b/src/System.IO.Ports/tests/Support/PortsTest.cs
@@ -2,12 +2,13 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.IO;
using Legacy.Support;
using Xunit;
namespace System.IO.PortsTests
{
- public class PortsTest
+ public class PortsTest : FileCleanupTestBase
{
public static bool HasOneSerialPort => TCSupport.SufficientHardwareRequirements(TCSupport.SerialPortRequirements.OneSerialPort);
diff --git a/src/System.IO.Ports/tests/System.IO.Ports.Tests.csproj b/src/System.IO.Ports/tests/System.IO.Ports.Tests.csproj
index 6b46808881..f0412cb9ab 100644
--- a/src/System.IO.Ports/tests/System.IO.Ports.Tests.csproj
+++ b/src/System.IO.Ports/tests/System.IO.Ports.Tests.csproj
@@ -5,9 +5,11 @@
<ProjectGuid>{4259DCE9-3480-40BB-B08A-64A2D446264B}</ProjectGuid>
<TestCategories>InnerLoop;OuterLoop</TestCategories>
</PropertyGroup>
- <!-- Default configurations to help VS understand the options -->
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Release|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Windows_NT-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Windows_NT-Release|AnyCPU'" />
+ <!-- Default configurations to help VS understand the options -->
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="SerialPort\BaseStream.cs" />
@@ -116,9 +118,9 @@
<Compile Include="Support\TCSupport.cs" />
<Compile Include="Support\PortsTest.cs" />
<Compile Include="Support\TestEventHandler.cs" />
- </ItemGroup>
- <ItemGroup>
- <Reference Include="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" />
+ <Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
+ <Link>CommonTest\System\PlatformDetection.cs</Link>
+ </Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="Legacy\Manual\" />
diff --git a/src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/InterpretedFrame.cs b/src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/InterpretedFrame.cs
index d7abecadab..0e676a6b8e 100644
--- a/src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/InterpretedFrame.cs
+++ b/src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/InterpretedFrame.cs
@@ -13,7 +13,7 @@ namespace System.Linq.Expressions.Interpreter
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
[ThreadStatic]
- public static InterpretedFrame CurrentFrame;
+ private static InterpretedFrame s_currentFrame;
internal readonly Interpreter Interpreter;
internal InterpretedFrame _parent;
@@ -177,14 +177,14 @@ namespace System.Linq.Expressions.Interpreter
internal InterpretedFrame Enter()
{
- InterpretedFrame currentFrame = CurrentFrame;
- CurrentFrame = this;
+ InterpretedFrame currentFrame = s_currentFrame;
+ s_currentFrame = this;
return _parent = currentFrame;
}
internal void Leave(InterpretedFrame prevFrame)
{
- CurrentFrame = prevFrame;
+ s_currentFrame = prevFrame;
}
#endregion
diff --git a/src/System.Memory/tests/Performance/Perf.Span.IndexOf.cs b/src/System.Memory/tests/Performance/Perf.Span.IndexOf.cs
new file mode 100644
index 0000000000..28212e2828
--- /dev/null
+++ b/src/System.Memory/tests/Performance/Perf.Span.IndexOf.cs
@@ -0,0 +1,90 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.Xunit.Performance;
+using Xunit;
+
+namespace System.Memory.Tests
+{
+ public class Perf_Span_IndexOf
+ {
+ private const int InnerCount = 100000;
+
+ [Benchmark(InnerIterationCount = InnerCount)]
+ [InlineData(1)]
+ [InlineData(10)]
+ [InlineData(100)]
+ [InlineData(1000)]
+ public void SpanIndexOfChar(int size)
+ {
+ Span<char> charSpan = new char[size];
+ charSpan[size/2] = '5';
+
+ int index = 0;
+ foreach (BenchmarkIteration iteration in Benchmark.Iterations)
+ {
+ using (iteration.StartMeasurement())
+ {
+ for (int i = 0; i < Benchmark.InnerIterationCount; i++)
+ {
+ index |= charSpan.IndexOf('5');
+ }
+ }
+ }
+ Assert.Equal(size/2, index);
+ }
+
+ [Benchmark(InnerIterationCount = InnerCount)]
+ [InlineData(1)]
+ [InlineData(10)]
+ [InlineData(100)]
+ [InlineData(1000)]
+ public void SpanIndexOfCharAsBytes(int size)
+ {
+ Span<char> charSpan = new char[size];
+ charSpan[size/2] = '5';
+ Span<byte> byteSpan = charSpan.AsBytes();
+
+ int index = 0;
+ foreach (BenchmarkIteration iteration in Benchmark.Iterations)
+ {
+ using (iteration.StartMeasurement())
+ {
+ for (int i = 0; i < Benchmark.InnerIterationCount; i++)
+ {
+ index |= byteSpan.IndexOf(53); // '5' = 53
+ }
+ }
+ }
+ Assert.Equal(size > 1 ? size : 0, index);
+ }
+
+ [Benchmark(InnerIterationCount = InnerCount)]
+ [InlineData(1)]
+ [InlineData(10)]
+ [InlineData(100)]
+ [InlineData(1000)]
+ public void StringIndexOfChar(int size)
+ {
+ string str = new string('0', size/2) + "5";
+ if (size > 1)
+ {
+ str += new string('0', size/2 - 1);
+ }
+
+ int index = 0;
+ foreach (BenchmarkIteration iteration in Benchmark.Iterations)
+ {
+ using (iteration.StartMeasurement())
+ {
+ for (int i = 0; i < Benchmark.InnerIterationCount; i++)
+ {
+ index |= str.IndexOf('5');
+ }
+ }
+ }
+ Assert.Equal(size/2, index);
+ }
+ }
+}
diff --git a/src/System.Net.Http/src/System/Net/Http/HttpContent.cs b/src/System.Net.Http/src/System/Net/Http/HttpContent.cs
index 6c6b745789..dd26774e3e 100644
--- a/src/System.Net.Http/src/System/Net/Http/HttpContent.cs
+++ b/src/System.Net.Http/src/System/Net/Http/HttpContent.cs
@@ -776,23 +776,19 @@ namespace System.Net.Http
private void EnsureCapacity(int value)
{
- if (value > _buffer.Length)
+ if ((uint)value > (uint)_maxBufferSize) // value cast handles overflow to negative as well
{
- Grow(value);
+ throw CreateOverCapacityException(_maxBufferSize);
}
- else if (value < 0) // overflow
+ else if (value > _buffer.Length)
{
- throw CreateOverCapacityException(_maxBufferSize);
+ Grow(value);
}
}
private void Grow(int value)
{
Debug.Assert(value > _buffer.Length);
- if (value > _maxBufferSize)
- {
- throw CreateOverCapacityException(_maxBufferSize);
- }
// Extract the current buffer to be replaced.
byte[] currentBuffer = _buffer;
diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.AcceptAllCerts.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.AcceptAllCerts.cs
index d9cd44c399..69ce6fff37 100644
--- a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.AcceptAllCerts.cs
+++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.AcceptAllCerts.cs
@@ -57,6 +57,7 @@ namespace System.Net.Http.Functional.Tests
new object[] { Configuration.Http.WrongHostNameCertRemoteServer },
};
+ [ActiveIssue(7812, TestPlatforms.Windows)]
[OuterLoop] // TODO: Issue #11345
[Theory]
[MemberData(nameof(InvalidCertificateServers))]
diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.cs
index 0dc0e4586c..7ca6b66968 100644
--- a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.cs
+++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.ServerCertificates.cs
@@ -160,6 +160,7 @@ namespace System.Net.Http.Functional.Tests
new object[] { Configuration.Http.WrongHostNameCertRemoteServer },
};
+ [ActiveIssue(7812, TestPlatforms.Windows)]
[OuterLoop] // TODO: Issue #11345
[Theory]
[MemberData(nameof(CertificateValidationServers))]
@@ -211,6 +212,7 @@ namespace System.Net.Http.Functional.Tests
new object[] { Configuration.Http.WrongHostNameCertRemoteServer , SslPolicyErrors.RemoteCertificateNameMismatch},
};
+ [ActiveIssue(7812, TestPlatforms.Windows)]
[OuterLoop] // TODO: Issue #11345
[ConditionalTheory(nameof(BackendSupportsCustomCertificateHandling))]
[MemberData(nameof(CertificateValidationServersAndExpectedPolicies))]
diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs
index dff4986ba8..72e56853a8 100644
--- a/src/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs
+++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientTest.cs
@@ -113,13 +113,37 @@ namespace System.Net.Http.Functional.Tests
}
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "no exception throw on netfx")]
- [Fact]
- public async Task MaxResponseContentBufferSize_TooSmallForContent_Throws()
- {
- using (var client = new HttpClient())
+ [Theory]
+ [InlineData(1, 2, true)]
+ [InlineData(1, 127, true)]
+ [InlineData(254, 255, true)]
+ [InlineData(10, 256, true)]
+ [InlineData(1, 440, true)]
+ [InlineData(2, 1, false)]
+ [InlineData(2, 2, false)]
+ [InlineData(1000, 1000, false)]
+ public async Task MaxResponseContentBufferSize_ThrowsIfTooSmallForContent(int maxSize, int contentLength, bool exceptionExpected)
+ {
+ using (var client = new HttpClient() { MaxResponseContentBufferSize = maxSize })
{
- client.MaxResponseContentBufferSize = 1;
- await Assert.ThrowsAsync<HttpRequestException>(() => client.GetStringAsync(Configuration.Http.RemoteEchoServer));
+ await LoopbackServer.CreateServerAsync(async (server, url) =>
+ {
+ Task<string> t = client.GetStringAsync(url);
+ await LoopbackServer.ReadRequestAndSendResponseAsync(server,
+ $"HTTP/1.1 200 OK\r\n" +
+ $"Date: {DateTimeOffset.UtcNow:R}\r\n" +
+ $"Content-Length: {contentLength}\r\n" +
+ "\r\n" +
+ new string('s', contentLength));
+ if (exceptionExpected)
+ {
+ await Assert.ThrowsAsync<HttpRequestException>(() => t);
+ }
+ else
+ {
+ await t;
+ }
+ });
}
}
diff --git a/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj b/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj
index 67bb82b274..b00fcf4966 100644
--- a/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj
+++ b/src/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj
@@ -23,18 +23,12 @@
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\Diagnostics\Tracing\TestEventListener.cs">
<Link>Common\System\Diagnostics\Tracing\TestEventListener.cs</Link>
</Compile>
<Compile Include="$(CommonTestPath)\System\IO\DelegateStream.cs">
<Link>Common\System\IO\DelegateStream.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\Net\Configuration.Certificates.cs">
<Link>Common\System\Net\Configuration.Certificates.cs</Link>
</Compile>
diff --git a/src/System.Net.Mail/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Net.Mail/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
index e229924b6e..7129605e6a 100644
--- a/src/System.Net.Mail/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ b/src/System.Net.Mail/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -1,3 +1,4 @@
+# Discussing with Networking team
sspicli.dll!AcceptSecurityContext
sspicli.dll!AcquireCredentialsHandleW
sspicli.dll!ApplyControlToken
diff --git a/src/System.Net.Mail/tests/Functional/LoggingTest.cs b/src/System.Net.Mail/tests/Functional/LoggingTest.cs
index ffaaeee545..2a2260d6a5 100644
--- a/src/System.Net.Mail/tests/Functional/LoggingTest.cs
+++ b/src/System.Net.Mail/tests/Functional/LoggingTest.cs
@@ -24,6 +24,7 @@ namespace System.Net.Mail.Tests
Assert.NotEmpty(EventSource.GenerateManifest(esType, esType.Assembly.Location));
}
+ [ActiveIssue(20131, TargetFrameworkMonikers.Uap)]
[Fact]
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "NetEventSource is only part of .NET Core")]
public void EventSource_EventsRaisedAsExpected()
diff --git a/src/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj b/src/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj
index 5ea28c39c4..1075c5a8be 100644
--- a/src/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj
+++ b/src/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj
@@ -28,12 +28,6 @@
<Compile Include="$(CommonTestPath)\System\Diagnostics\Tracing\TestEventListener.cs">
<Link>Common\System\Diagnostics\Tracing\TestEventListener.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorConsoleApp\RemoteExecutorConsoleApp.csproj">
diff --git a/src/System.Net.NetworkInformation/tests/FunctionalTests/AddressParsingTests.cs b/src/System.Net.NetworkInformation/tests/FunctionalTests/AddressParsingTests.cs
index 6eb261069d..684fadc085 100644
--- a/src/System.Net.NetworkInformation/tests/FunctionalTests/AddressParsingTests.cs
+++ b/src/System.Net.NetworkInformation/tests/FunctionalTests/AddressParsingTests.cs
@@ -3,17 +3,19 @@
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
+using System.IO;
using Xunit;
namespace System.Net.NetworkInformation.Tests
{
- public class AddressParsingTests
+ public class AddressParsingTests : FileCleanupTestBase
{
[Fact]
- public static void GatewayAddressParsing()
+ public void GatewayAddressParsing()
{
- FileUtil.NormalizeLineEndings("route", "route_normalized1");
- List<GatewayIPAddressInformation> gatewayAddresses = StringParsingHelpers.ParseGatewayAddressesFromRouteFile("route_normalized1", "wlan0");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("route", fileName);
+ List<GatewayIPAddressInformation> gatewayAddresses = StringParsingHelpers.ParseGatewayAddressesFromRouteFile(fileName, "wlan0");
Assert.Equal(3, gatewayAddresses.Count);
Assert.Equal(StringParsingHelpers.ParseHexIPAddress("0180690A"), gatewayAddresses[0].Address);
@@ -22,20 +24,22 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void DhcpServerAddressParsing()
+ public void DhcpServerAddressParsing()
{
- FileUtil.NormalizeLineEndings("dhclient.leases", "dhclient.leases_normalized0");
- List<IPAddress> dhcpServerAddresses = StringParsingHelpers.ParseDhcpServerAddressesFromLeasesFile("dhclient.leases_normalized0", "wlan0");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("dhclient.leases", fileName);
+ List<IPAddress> dhcpServerAddresses = StringParsingHelpers.ParseDhcpServerAddressesFromLeasesFile(fileName, "wlan0");
Assert.Equal(1, dhcpServerAddresses.Count);
Assert.Equal(IPAddress.Parse("10.105.128.4"), dhcpServerAddresses[0]);
}
[Fact]
- public static void WinsServerAddressParsing()
+ public void WinsServerAddressParsing()
{
- FileUtil.NormalizeLineEndings("smb.conf", "smb.conf_normalized");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("smb.conf", fileName);
- List<IPAddress> winsServerAddresses = StringParsingHelpers.ParseWinsServerAddressesFromSmbConfFile("smb.conf_normalized");
+ List<IPAddress> winsServerAddresses = StringParsingHelpers.ParseWinsServerAddressesFromSmbConfFile(fileName);
Assert.Equal(1, winsServerAddresses.Count);
Assert.Equal(IPAddress.Parse("255.1.255.1"), winsServerAddresses[0]);
}
diff --git a/src/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs b/src/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs
index f126ee7d0a..fb64e82921 100644
--- a/src/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs
+++ b/src/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs
@@ -2,38 +2,43 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.IO;
using Xunit;
namespace System.Net.NetworkInformation.Tests
{
- public class ConnectionsParsingTests
+ public class ConnectionsParsingTests : FileCleanupTestBase
{
[Fact]
- public static void NumSocketConnectionsParsing()
+ public void NumSocketConnectionsParsing()
{
- FileUtil.NormalizeLineEndings("sockstat", "sockstat_normalized");
- FileUtil.NormalizeLineEndings("sockstat6", "sockstat6_normalized");
+ string sockstatFile = GetTestFilePath();
+ string sockstat6File = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("sockstat", sockstatFile);
+ FileUtil.NormalizeLineEndings("sockstat6", sockstat6File);
- int numTcp = StringParsingHelpers.ParseNumSocketConnections("sockstat_normalized", "TCP");
+ int numTcp = StringParsingHelpers.ParseNumSocketConnections(sockstatFile, "TCP");
Assert.Equal(4, numTcp);
- int numTcp6 = StringParsingHelpers.ParseNumSocketConnections("sockstat6_normalized", "TCP6");
+ int numTcp6 = StringParsingHelpers.ParseNumSocketConnections(sockstat6File, "TCP6");
Assert.Equal(6, numTcp6);
- int numUdp = StringParsingHelpers.ParseNumSocketConnections("sockstat_normalized", "UDP");
+ int numUdp = StringParsingHelpers.ParseNumSocketConnections(sockstatFile, "UDP");
Assert.Equal(12, numUdp);
- int numUdp6 = StringParsingHelpers.ParseNumSocketConnections("sockstat6_normalized", "UDP6");
+ int numUdp6 = StringParsingHelpers.ParseNumSocketConnections(sockstat6File, "UDP6");
Assert.Equal(3, numUdp6);
}
[Fact]
- public static void ActiveTcpConnectionsParsing()
+ public void ActiveTcpConnectionsParsing()
{
- FileUtil.NormalizeLineEndings("tcp", "tcp_normalized0");
- FileUtil.NormalizeLineEndings("tcp6", "tcp6_normalized0");
+ string tcpFile = GetTestFilePath();
+ string tcp6File = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("tcp", tcpFile);
+ FileUtil.NormalizeLineEndings("tcp6", tcp6File);
- TcpConnectionInformation[] infos = StringParsingHelpers.ParseActiveTcpConnectionsFromFiles("tcp_normalized0", "tcp6_normalized0");
+ TcpConnectionInformation[] infos = StringParsingHelpers.ParseActiveTcpConnectionsFromFiles(tcpFile, tcp6File);
Assert.Equal(11, infos.Length);
ValidateInfo(infos[0], new IPEndPoint(0xFFFFFF01L, 0x01BD), new IPEndPoint(0L, 0), TcpState.Established);
ValidateInfo(infos[1], new IPEndPoint(0x12345678L, 0x008B), new IPEndPoint(0L, 0), TcpState.SynSent);
@@ -79,12 +84,14 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void TcpListenersParsing()
+ public void TcpListenersParsing()
{
- FileUtil.NormalizeLineEndings("tcp", "tcp_normalized1");
- FileUtil.NormalizeLineEndings("tcp6", "tcp6_normalized1");
+ string tcpFile = GetTestFilePath();
+ string tcp6File = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("tcp", tcpFile);
+ FileUtil.NormalizeLineEndings("tcp6", tcp6File);
- IPEndPoint[] listeners = StringParsingHelpers.ParseActiveTcpListenersFromFiles("tcp_normalized1", "tcp6_normalized1");
+ IPEndPoint[] listeners = StringParsingHelpers.ParseActiveTcpListenersFromFiles(tcpFile, tcp6File);
Assert.Equal(11, listeners.Length);
Assert.Equal(new IPEndPoint(0xFFFFFF01, 0x01Bd), listeners[0]);
@@ -102,12 +109,14 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void UdpListenersParsing()
+ public void UdpListenersParsing()
{
- FileUtil.NormalizeLineEndings("udp", "udp_normalized0");
- FileUtil.NormalizeLineEndings("udp6", "udp6_normalized0");
+ string udpFile = GetTestFilePath();
+ string udp6File = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("udp", udpFile);
+ FileUtil.NormalizeLineEndings("udp6", udp6File);
- IPEndPoint[] listeners = StringParsingHelpers.ParseActiveUdpListenersFromFiles("udp_normalized0", "udp6_normalized0");
+ IPEndPoint[] listeners = StringParsingHelpers.ParseActiveUdpListenersFromFiles(udpFile, udp6File);
Assert.Equal(15, listeners.Length);
Assert.Equal(listeners[0], new IPEndPoint(0x00000000, 0x8E15));
diff --git a/src/System.Net.NetworkInformation/tests/FunctionalTests/DnsParsingTests.cs b/src/System.Net.NetworkInformation/tests/FunctionalTests/DnsParsingTests.cs
index d8e8a1c092..416b9fd271 100644
--- a/src/System.Net.NetworkInformation/tests/FunctionalTests/DnsParsingTests.cs
+++ b/src/System.Net.NetworkInformation/tests/FunctionalTests/DnsParsingTests.cs
@@ -2,31 +2,34 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.IO;
using Xunit;
namespace System.Net.NetworkInformation.Tests
{
- public class DnsParsingTests
+ public class DnsParsingTests : FileCleanupTestBase
{
[InlineData("resolv.conf")]
[InlineData("resolv_nonewline.conf")]
[Theory]
- public static void DnsSuffixParsing(string file)
+ public void DnsSuffixParsing(string file)
{
- FileUtil.NormalizeLineEndings(file, file + "_normalized0");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings(file, fileName);
- string suffix = StringParsingHelpers.ParseDnsSuffixFromResolvConfFile(file + "_normalized0");
+ string suffix = StringParsingHelpers.ParseDnsSuffixFromResolvConfFile(fileName);
Assert.Equal("fake.suffix.net", suffix);
}
[InlineData("resolv.conf")]
[InlineData("resolv_nonewline.conf")]
[Theory]
- public static void DnsAddressesParsing(string file)
+ public void DnsAddressesParsing(string file)
{
- FileUtil.NormalizeLineEndings(file, file + "_normalized1");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings(file, fileName);
- var dnsAddresses = StringParsingHelpers.ParseDnsAddressesFromResolvConfFile(file + "_normalized1");
+ var dnsAddresses = StringParsingHelpers.ParseDnsAddressesFromResolvConfFile(fileName);
Assert.Equal(1, dnsAddresses.Count);
Assert.Equal(IPAddress.Parse("127.0.1.1"), dnsAddresses[0]);
}
diff --git a/src/System.Net.NetworkInformation/tests/FunctionalTests/MiscParsingTests.cs b/src/System.Net.NetworkInformation/tests/FunctionalTests/MiscParsingTests.cs
index ad85b01621..669af3f26d 100644
--- a/src/System.Net.NetworkInformation/tests/FunctionalTests/MiscParsingTests.cs
+++ b/src/System.Net.NetworkInformation/tests/FunctionalTests/MiscParsingTests.cs
@@ -2,25 +2,28 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.IO;
using Xunit;
namespace System.Net.NetworkInformation.Tests
{
- public class MiscParsingTests
+ public class MiscParsingTests : FileCleanupTestBase
{
[Fact]
- public static void NumRoutesParsing()
+ public void NumRoutesParsing()
{
- FileUtil.NormalizeLineEndings("route", "route_normalized0");
- int numRoutes = StringParsingHelpers.ParseNumRoutesFromRouteFile("route_normalized0");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("route", fileName);
+ int numRoutes = StringParsingHelpers.ParseNumRoutesFromRouteFile(fileName);
Assert.Equal(4, numRoutes);
}
[Fact]
- public static void DefaultTtlParsing()
+ public void DefaultTtlParsing()
{
- FileUtil.NormalizeLineEndings("snmp", "snmp_normalized0");
- int ttl = StringParsingHelpers.ParseDefaultTtlFromFile("snmp_normalized0");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp", fileName);
+ int ttl = StringParsingHelpers.ParseDefaultTtlFromFile(fileName);
Assert.Equal(64, ttl);
}
diff --git a/src/System.Net.NetworkInformation/tests/FunctionalTests/NetworkInterfaceBasicTest.cs b/src/System.Net.NetworkInformation/tests/FunctionalTests/NetworkInterfaceBasicTest.cs
index 3b14f083ae..302bce43d8 100644
--- a/src/System.Net.NetworkInformation/tests/FunctionalTests/NetworkInterfaceBasicTest.cs
+++ b/src/System.Net.NetworkInformation/tests/FunctionalTests/NetworkInterfaceBasicTest.cs
@@ -261,7 +261,8 @@ namespace System.Net.NetworkInformation.Tests
[PlatformSpecific(~TestPlatforms.OSX)]
[InlineData(false)]
[InlineData(true)]
- [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "https://github.com/dotnet/corefx/issues/19314")]
+ [ActiveIssue(19314, TargetFrameworkMonikers.UapAot)]
+ [ActiveIssue(20014, TargetFrameworkMonikers.Uap)]
public async Task NetworkInterface_LoopbackInterfaceIndex_MatchesReceivedPackets(bool ipv6)
{
using (var client = new Socket(SocketType.Dgram, ProtocolType.Udp))
diff --git a/src/System.Net.NetworkInformation/tests/FunctionalTests/StatisticsParsingTests.cs b/src/System.Net.NetworkInformation/tests/FunctionalTests/StatisticsParsingTests.cs
index 3dd4725f7b..13c6317b2b 100644
--- a/src/System.Net.NetworkInformation/tests/FunctionalTests/StatisticsParsingTests.cs
+++ b/src/System.Net.NetworkInformation/tests/FunctionalTests/StatisticsParsingTests.cs
@@ -2,17 +2,19 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.IO;
using Xunit;
namespace System.Net.NetworkInformation.Tests
{
- public class StatisticsParsingTests
+ public class StatisticsParsingTests : FileCleanupTestBase
{
[Fact]
- public static void Icmpv4Parsing()
+ public void Icmpv4Parsing()
{
- FileUtil.NormalizeLineEndings("snmp", "snmp_normalized1");
- Icmpv4StatisticsTable table = StringParsingHelpers.ParseIcmpv4FromSnmpFile("snmp_normalized1");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp", fileName);
+ Icmpv4StatisticsTable table = StringParsingHelpers.ParseIcmpv4FromSnmpFile(fileName);
Assert.Equal(1, table.InMsgs);
Assert.Equal(2, table.InErrors);
Assert.Equal(3, table.InCsumErrors);
@@ -43,10 +45,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void Icmpv6Parsing()
+ public void Icmpv6Parsing()
{
- FileUtil.NormalizeLineEndings("snmp6", "snmp6_normalized0");
- Icmpv6StatisticsTable table = StringParsingHelpers.ParseIcmpv6FromSnmp6File("snmp6_normalized0");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp6", fileName);
+ Icmpv6StatisticsTable table = StringParsingHelpers.ParseIcmpv6FromSnmp6File(fileName);
Assert.Equal(1, table.InMsgs);
Assert.Equal(2, table.InErrors);
Assert.Equal(3, table.OutMsgs);
@@ -82,10 +85,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void TcpGlobalStatisticsParsing()
+ public void TcpGlobalStatisticsParsing()
{
- FileUtil.NormalizeLineEndings("snmp", "snmp_normalized2");
- TcpGlobalStatisticsTable table = StringParsingHelpers.ParseTcpGlobalStatisticsFromSnmpFile("snmp_normalized2");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp", fileName);
+ TcpGlobalStatisticsTable table = StringParsingHelpers.ParseTcpGlobalStatisticsFromSnmpFile(fileName);
Assert.Equal(1, table.RtoAlgorithm);
Assert.Equal(200, table.RtoMin);
Assert.Equal(120000, table.RtoMax);
@@ -104,10 +108,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void Udpv4GlobalStatisticsParsing()
+ public void Udpv4GlobalStatisticsParsing()
{
- FileUtil.NormalizeLineEndings("snmp", "snmp_normalized3");
- UdpGlobalStatisticsTable table = StringParsingHelpers.ParseUdpv4GlobalStatisticsFromSnmpFile("snmp_normalized3");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp", fileName);
+ UdpGlobalStatisticsTable table = StringParsingHelpers.ParseUdpv4GlobalStatisticsFromSnmpFile(fileName);
Assert.Equal(7181, table.InDatagrams);
Assert.Equal(150, table.NoPorts);
Assert.Equal(0, table.InErrors);
@@ -118,10 +123,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void Udpv6GlobalStatisticsParsing()
+ public void Udpv6GlobalStatisticsParsing()
{
- FileUtil.NormalizeLineEndings("snmp6", "snmp6_normalized1");
- UdpGlobalStatisticsTable table = StringParsingHelpers.ParseUdpv6GlobalStatisticsFromSnmp6File("snmp6_normalized1");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp6", fileName);
+ UdpGlobalStatisticsTable table = StringParsingHelpers.ParseUdpv6GlobalStatisticsFromSnmp6File(fileName);
Assert.Equal(19, table.InDatagrams);
Assert.Equal(0, table.NoPorts);
Assert.Equal(0, table.InErrors);
@@ -132,10 +138,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void Ipv4GlobalStatisticsParsing()
+ public void Ipv4GlobalStatisticsParsing()
{
- FileUtil.NormalizeLineEndings("snmp", "snmp_normalized4");
- IPGlobalStatisticsTable table = StringParsingHelpers.ParseIPv4GlobalStatisticsFromSnmpFile("snmp_normalized4");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp", fileName);
+ IPGlobalStatisticsTable table = StringParsingHelpers.ParseIPv4GlobalStatisticsFromSnmpFile(fileName);
Assert.Equal(false, table.Forwarding);
Assert.Equal(64, table.DefaultTtl);
@@ -159,10 +166,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void Ipv6GlobalStatisticsParsing()
+ public void Ipv6GlobalStatisticsParsing()
{
- FileUtil.NormalizeLineEndings("snmp6", "snmp6_normalized2");
- IPGlobalStatisticsTable table = StringParsingHelpers.ParseIPv6GlobalStatisticsFromSnmp6File("snmp6_normalized2");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("snmp6", fileName);
+ IPGlobalStatisticsTable table = StringParsingHelpers.ParseIPv6GlobalStatisticsFromSnmp6File(fileName);
Assert.Equal(189, table.InReceives);
Assert.Equal(0, table.InHeaderErrors);
@@ -184,10 +192,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void IpInterfaceStatisticsParsingFirst()
+ public void IpInterfaceStatisticsParsingFirst()
{
- FileUtil.NormalizeLineEndings("dev", "dev_normalized0");
- IPInterfaceStatisticsTable table = StringParsingHelpers.ParseInterfaceStatisticsTableFromFile("dev_normalized0", "wlan0");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("dev", fileName);
+ IPInterfaceStatisticsTable table = StringParsingHelpers.ParseInterfaceStatisticsTableFromFile(fileName, "wlan0");
Assert.Equal(26622u, table.BytesReceived);
Assert.Equal(394u, table.PacketsReceived);
@@ -209,10 +218,11 @@ namespace System.Net.NetworkInformation.Tests
}
[Fact]
- public static void IpInterfaceStatisticsParsingLast()
+ public void IpInterfaceStatisticsParsingLast()
{
- FileUtil.NormalizeLineEndings("dev", "dev_normalized1");
- IPInterfaceStatisticsTable table = StringParsingHelpers.ParseInterfaceStatisticsTableFromFile("dev_normalized1", "lo");
+ string fileName = GetTestFilePath();
+ FileUtil.NormalizeLineEndings("dev", fileName);
+ IPInterfaceStatisticsTable table = StringParsingHelpers.ParseInterfaceStatisticsTableFromFile(fileName, "lo");
Assert.Equal(uint.MaxValue, table.BytesReceived);
Assert.Equal(302u, table.PacketsReceived);
diff --git a/src/System.Net.NetworkInformation/tests/UnitTests/NetworkInterfaceTest.cs b/src/System.Net.NetworkInformation/tests/UnitTests/NetworkInterfaceTest.cs
index 8ed90eff31..bf99d46bf4 100644
--- a/src/System.Net.NetworkInformation/tests/UnitTests/NetworkInterfaceTest.cs
+++ b/src/System.Net.NetworkInformation/tests/UnitTests/NetworkInterfaceTest.cs
@@ -11,7 +11,8 @@ namespace System.Net.NetworkInformation.Unit.Tests
public class NetworkInterfaceTest
{
[Fact]
- [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework | TargetFrameworkMonikers.UapAot, "dotnet/corefx #17993")]
+ [ActiveIssue(17993, TargetFrameworkMonikers.NetFramework | TargetFrameworkMonikers.UapAot)]
+ [ActiveIssue(20014, TargetFrameworkMonikers.Uap)]
public void GetIsNetworkAvailable_ConnectionProfileNotPresent_ReturnsFalse()
{
FakeNetwork.IsConnectionProfilePresent = false;
@@ -19,7 +20,8 @@ namespace System.Net.NetworkInformation.Unit.Tests
}
[Fact]
- [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework | TargetFrameworkMonikers.UapAot, "dotnet/corefx #17993")]
+ [ActiveIssue(17993, TargetFrameworkMonikers.NetFramework | TargetFrameworkMonikers.UapAot)]
+ [ActiveIssue(20014, TargetFrameworkMonikers.Uap)]
public void GetIsNetworkAvailable_NetworkConnectivityLevelIsNone_ReturnsFalse()
{
FakeNetwork.IsConnectionProfilePresent = true;
diff --git a/src/System.Net.Primitives/src/System.Net.Primitives.csproj b/src/System.Net.Primitives/src/System.Net.Primitives.csproj
index 68be9b8fb9..fc322c7798 100644
--- a/src/System.Net.Primitives/src/System.Net.Primitives.csproj
+++ b/src/System.Net.Primitives/src/System.Net.Primitives.csproj
@@ -190,6 +190,7 @@
<ItemGroup>
<Reference Include="Microsoft.Win32.Primitives" />
<Reference Include="System.Collections" />
+ <Reference Include="System.Collections.NonGeneric" />
<Reference Include="System.Diagnostics.Contracts" />
<Reference Include="System.Diagnostics.Debug" />
<Reference Include="System.Diagnostics.Tracing" />
diff --git a/src/System.Net.Primitives/src/System/Net/Cookie.cs b/src/System.Net.Primitives/src/System/Net/Cookie.cs
index 0f94e1981b..204f398075 100644
--- a/src/System.Net.Primitives/src/System/Net/Cookie.cs
+++ b/src/System.Net.Primitives/src/System/Net/Cookie.cs
@@ -10,6 +10,7 @@ using System.Text;
namespace System.Net
{
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
public enum CookieVariant
{
Unknown,
@@ -28,7 +29,7 @@ namespace System.Net
// (e.g. "Cookie: $Version=1; name=value; $Path=/foo; $Secure")
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public sealed class Cookie
{
@@ -50,15 +51,16 @@ namespace System.Net
private CookieVariant m_cookieVariant = CookieVariant.Plain; // Do not rename (binary serialization)
private bool m_discard = false; // Do not rename (binary serialization)
private string m_domain = string.Empty; // Do not rename (binary serialization)
- private bool m_domainImplicit = true; // Do not rename (binary serialization)
+ private bool m_domain_implicit = true; // Do not rename (binary serialization)
private DateTime m_expires = DateTime.MinValue; // Do not rename (binary serialization)
private string m_name = string.Empty; // Do not rename (binary serialization)
private string m_path = string.Empty; // Do not rename (binary serialization)
- private bool m_pathImplicit = true; // Do not rename (binary serialization)
+ private bool m_path_implicit = true; // Do not rename (binary serialization)
private string m_port = string.Empty; // Do not rename (binary serialization)
- private bool m_portImplicit = true; // Do not rename (binary serialization)
- private int[] m_portList = null; // Do not rename (binary serialization)
+ private bool m_port_implicit = true; // Do not rename (binary serialization)
+ private int[] m_port_list = null; // Do not rename (binary serialization)
private bool m_secure = false; // Do not rename (binary serialization)
+ [System.Runtime.Serialization.OptionalField]
private bool m_httpOnly = false; // Do not rename (binary serialization)
private DateTime m_timeStamp = DateTime.Now; // Do not rename (binary serialization)
private string m_value = string.Empty; // Do not rename (binary serialization)
@@ -156,7 +158,7 @@ namespace System.Net
set
{
m_domain = value ?? string.Empty;
- m_domainImplicit = false;
+ m_domain_implicit = false;
m_domainKey = string.Empty; // _domainKey will be set when adding this cookie to a container.
}
}
@@ -165,11 +167,11 @@ namespace System.Net
{
get
{
- return m_domainImplicit;
+ return m_domain_implicit;
}
set
{
- m_domainImplicit = value;
+ m_domain_implicit = value;
}
}
@@ -246,7 +248,7 @@ namespace System.Net
set
{
m_path = value ?? string.Empty;
- m_pathImplicit = false;
+ m_path_implicit = false;
}
}
@@ -263,18 +265,18 @@ namespace System.Net
Cookie clonedCookie = new Cookie(m_name, m_value);
// Copy over all the properties from the original cookie
- if (!m_portImplicit)
+ if (!m_port_implicit)
{
clonedCookie.Port = m_port;
}
- if (!m_pathImplicit)
+ if (!m_path_implicit)
{
clonedCookie.Path = m_path;
}
clonedCookie.Domain = m_domain;
// If the domain in the original cookie was implicit, we should preserve that property
- clonedCookie.DomainImplicit = m_domainImplicit;
+ clonedCookie.DomainImplicit = m_domain_implicit;
clonedCookie.m_timeStamp = m_timeStamp;
clonedCookie.Comment = m_comment;
clonedCookie.CommentUri = m_commentUri;
@@ -376,13 +378,13 @@ namespace System.Net
// Check/set domain
//
// If domain is implicit => assume a) uri is valid, b) just set domain to uri hostname.
- if (setDefault && m_domainImplicit == true)
+ if (setDefault && m_domain_implicit == true)
{
m_domain = host;
}
else
{
- if (!m_domainImplicit)
+ if (!m_domain_implicit)
{
// Forwarding note: If Uri.Host is of IP address form then the only supported case
// is for IMPLICIT domain property of a cookie.
@@ -483,7 +485,7 @@ namespace System.Net
}
// Check/Set Path
- if (setDefault && m_pathImplicit == true)
+ if (setDefault && m_path_implicit == true)
{
// This code assumes that the URI path is always valid and contains at least one '/'.
switch (m_cookieVariant)
@@ -516,16 +518,16 @@ namespace System.Net
}
// Set the default port if Port attribute was present but had no value.
- if (setDefault && (m_portImplicit == false && m_port.Length == 0))
+ if (setDefault && (m_port_implicit == false && m_port.Length == 0))
{
- m_portList = new int[1] { port };
+ m_port_list = new int[1] { port };
}
- if (m_portImplicit == false)
+ if (m_port_implicit == false)
{
// Port must match against the one from the uri.
valid = false;
- foreach (int p in m_portList)
+ foreach (int p in m_port_list)
{
if (p == port)
{
@@ -576,7 +578,7 @@ namespace System.Net
}
set
{
- m_portImplicit = false;
+ m_port_implicit = false;
if (string.IsNullOrEmpty(value))
{
// "Port" is present but has no value.
@@ -613,7 +615,7 @@ namespace System.Net
portList.Add(port);
}
}
- m_portList = portList.ToArray();
+ m_port_list = portList.ToArray();
m_port = value;
m_version = MaxSupportedVersion;
m_cookieVariant = CookieVariant.Rfc2965;
@@ -627,7 +629,7 @@ namespace System.Net
get
{
// PortList will be null if Port Attribute was omitted in the response.
- return m_portList;
+ return m_port_list;
}
}
@@ -688,7 +690,7 @@ namespace System.Net
{
get
{
- return m_domainImplicit ? Domain : m_domainKey;
+ return m_domain_implicit ? Domain : m_domainKey;
}
}
@@ -756,14 +758,14 @@ namespace System.Net
if (!Plain)
{
// Add the Path if necessary.
- if (!m_pathImplicit && m_path.Length > 0)
+ if (!m_path_implicit && m_path.Length > 0)
{
sb.Append(SeparatorLiteral + SpecialAttributeLiteral + CookieFields.PathAttributeName + EqualsLiteral); // const strings
sb.Append(m_path);
}
// Add the Domain if necessary.
- if (!m_domainImplicit && m_domain.Length > 0)
+ if (!m_domain_implicit && m_domain.Length > 0)
{
sb.Append(SeparatorLiteral + SpecialAttributeLiteral + CookieFields.DomainAttributeName + EqualsLiteral); // const strings
if (IsQuotedDomain) sb.Append('"');
@@ -773,7 +775,7 @@ namespace System.Net
}
// Add the Port if necessary.
- if (!m_portImplicit)
+ if (!m_port_implicit)
{
sb.Append(SeparatorLiteral + SpecialAttributeLiteral + CookieFields.PortAttributeName); // const strings
if (m_port.Length > 0)
@@ -807,7 +809,7 @@ namespace System.Net
{
result += SeparatorLiteral + CookieFields.DiscardAttributeName;
}
- if (!m_domainImplicit && m_domain != null && m_domain.Length > 0)
+ if (!m_domain_implicit && m_domain != null && m_domain.Length > 0)
{
result += SeparatorLiteral + CookieFields.DomainAttributeName + EqualsLiteral + m_domain;
}
@@ -822,11 +824,11 @@ namespace System.Net
}
result += SeparatorLiteral + CookieFields.MaxAgeAttributeName + EqualsLiteral + seconds.ToString(NumberFormatInfo.InvariantInfo);
}
- if (!m_pathImplicit && m_path != null && m_path.Length > 0)
+ if (!m_path_implicit && m_path != null && m_path.Length > 0)
{
result += SeparatorLiteral + CookieFields.PathAttributeName + EqualsLiteral + m_path;
}
- if (!Plain && !m_portImplicit && m_port != null && m_port.Length > 0)
+ if (!Plain && !m_port_implicit && m_port != null && m_port.Length > 0)
{
// QuotesLiteral are included in _port.
result += SeparatorLiteral + CookieFields.PortAttributeName + EqualsLiteral + m_port;
diff --git a/src/System.Net.Primitives/src/System/Net/CookieCollection.cs b/src/System.Net.Primitives/src/System/Net/CookieCollection.cs
index d7a8390de8..68112dfa63 100644
--- a/src/System.Net.Primitives/src/System/Net/CookieCollection.cs
+++ b/src/System.Net.Primitives/src/System/Net/CookieCollection.cs
@@ -12,7 +12,7 @@ namespace System.Net
// A list of cookies maintained in Sorted order. Only one cookie with matching Name/Domain/Path
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public class CookieCollection : ICollection
{
diff --git a/src/System.Net.Primitives/src/System/Net/CookieContainer.cs b/src/System.Net.Primitives/src/System/Net/CookieContainer.cs
index 10260658d5..7c1a1f821f 100644
--- a/src/System.Net.Primitives/src/System/Net/CookieContainer.cs
+++ b/src/System.Net.Primitives/src/System/Net/CookieContainer.cs
@@ -2,7 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Collections.Generic;
+using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Net.NetworkInformation;
@@ -89,7 +89,7 @@ namespace System.Net
// Manage cookies for a user (implicit). Based on RFC 2965.
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public class CookieContainer
{
@@ -102,8 +102,7 @@ namespace System.Net
new HeaderVariantInfo(HttpKnownHeaderNames.SetCookie2, CookieVariant.Rfc2965)
};
- // NOTE: all accesses of _domainTable must be performed with _domainTable locked.
- private readonly Dictionary<string, PathList> m_domainTable = new Dictionary<string, PathList>(); // Do not rename (binary serialization)
+ private readonly Hashtable m_domainTable = new Hashtable(); // Do not rename (binary serialization)
private int m_maxCookieSize = DefaultCookieLengthLimit; // Do not rename (binary serialization)
private int m_maxCookies = DefaultCookieLimit; // Do not rename (binary serialization)
private int m_maxCookiesPerDomain = DefaultPerDomainCookieLimit; // Do not rename (binary serialization)
@@ -283,11 +282,12 @@ namespace System.Net
try
{
- lock (m_domainTable)
+ lock (m_domainTable.SyncRoot)
{
- if (!m_domainTable.TryGetValue(cookie.DomainKey, out pathList))
+ pathList = (PathList)m_domainTable[cookie.DomainKey];
+ if (pathList == null)
{
- m_domainTable[cookie.DomainKey] = (pathList = PathList.Create());
+ m_domainTable[cookie.DomainKey] = (pathList = new PathList());
}
}
int domain_count = pathList.GetCookiesCount();
@@ -295,7 +295,7 @@ namespace System.Net
CookieCollection cookies;
lock (pathList.SyncRoot)
{
- cookies = pathList[cookie.Path];
+ cookies = (CookieCollection)pathList[cookie.Path];
if (cookies == null)
{
@@ -383,27 +383,26 @@ namespace System.Net
// Each domain will be cut accordingly.
remainingFraction = (float)m_maxCookies / (float)m_count;
}
- lock (m_domainTable)
+ lock (m_domainTable.SyncRoot)
{
- foreach (KeyValuePair<string, PathList> entry in m_domainTable)
+ foreach (DictionaryEntry entry in m_domainTable)
{
if (domain == null)
{
- tempDomain = entry.Key;
- pathList = entry.Value; // Aliasing to trick foreach
+ tempDomain = (string)entry.Key;
+ pathList = (PathList)entry.Value; // Aliasing to trick foreach
}
else
{
tempDomain = domain;
- m_domainTable.TryGetValue(domain, out pathList);
+ pathList = (PathList)m_domainTable[domain];
}
domain_count = 0; // Cookies in the domain
lock (pathList.SyncRoot)
{
- foreach (KeyValuePair<string, CookieCollection> pair in pathList)
+ foreach (CookieCollection cc in pathList.Values)
{
- CookieCollection cc = pair.Value;
itemp = ExpireCollection(cc);
removed += itemp;
m_count -= itemp; // Update this container's count
@@ -425,23 +424,25 @@ namespace System.Net
if (domain_count > min_count)
{
// This case requires sorting all domain collections by timestamp.
- KeyValuePair<DateTime, CookieCollection>[] cookies;
+ Array cookies;
+ Array stamps;
lock (pathList.SyncRoot)
{
- cookies = new KeyValuePair<DateTime, CookieCollection>[pathList.Count];
- foreach (KeyValuePair<string, CookieCollection> pair in pathList)
+ cookies = Array.CreateInstance(typeof(CookieCollection), pathList.Count);
+ stamps = Array.CreateInstance(typeof(DateTime), pathList.Count);
+ foreach (CookieCollection cc in pathList.Values)
{
- CookieCollection cc = pair.Value;
- cookies[itemp] = new KeyValuePair<DateTime, CookieCollection>(cc.TimeStamp(CookieCollection.Stamp.Check), cc);
+ stamps.SetValue(cc.TimeStamp(CookieCollection.Stamp.Check), itemp);
+ cookies.SetValue(cc, itemp);
++itemp;
}
}
- Array.Sort(cookies, (a, b) => a.Key.CompareTo(b.Key));
+ Array.Sort(stamps, cookies);
itemp = 0;
for (int i = 0; i < cookies.Length; ++i)
{
- CookieCollection cc = cookies[i].Value;
+ CookieCollection cc = (CookieCollection)cookies.GetValue(i);
lock (cc)
{
@@ -739,8 +740,8 @@ namespace System.Net
int port = uri.Port;
CookieCollection cookies = null;
- List<string> domainAttributeMatchAnyCookieVariant = new List<string>();
- List<string> domainAttributeMatchOnlyCookieVariantPlain = null;
+ var domainAttributeMatchAnyCookieVariant = new System.Collections.Generic.List<string>();
+ System.Collections.Generic.List<string> domainAttributeMatchOnlyCookieVariantPlain = null;
string fqdnRemote = uri.Host;
@@ -784,7 +785,7 @@ namespace System.Net
{
if (domainAttributeMatchOnlyCookieVariantPlain == null)
{
- domainAttributeMatchOnlyCookieVariantPlain = new List<string>();
+ domainAttributeMatchOnlyCookieVariantPlain = new System.Collections.Generic.List<string>();
}
// These candidates can only match CookieVariant.Plain cookies.
@@ -803,16 +804,17 @@ namespace System.Net
return cookies;
}
- private void BuildCookieCollectionFromDomainMatches(Uri uri, bool isSecure, int port, ref CookieCollection cookies, List<string> domainAttribute, bool matchOnlyPlainCookie)
+ private void BuildCookieCollectionFromDomainMatches(Uri uri, bool isSecure, int port, ref CookieCollection cookies, System.Collections.Generic.List<string> domainAttribute, bool matchOnlyPlainCookie)
{
for (int i = 0; i < domainAttribute.Count; i++)
{
bool found = false;
bool defaultAdded = false;
PathList pathList;
- lock (m_domainTable)
+ lock (m_domainTable.SyncRoot)
{
- if (!m_domainTable.TryGetValue(domainAttribute[i], out pathList))
+ pathList = (PathList)m_domainTable[domainAttribute[i]];
+ if (pathList == null)
{
continue;
}
@@ -820,14 +822,16 @@ namespace System.Net
lock (pathList.SyncRoot)
{
- foreach (KeyValuePair<string, CookieCollection> pair in pathList)
+ // Manual use of IDictionaryEnumerator instead of foreach to avoid DictionaryEntry box allocations.
+ IDictionaryEnumerator e = pathList.GetEnumerator();
+ while (e.MoveNext())
{
- string path = pair.Key;
+ string path = (string)e.Key;
if (uri.AbsolutePath.StartsWith(CookieParser.CheckQuoted(path)))
{
found = true;
- CookieCollection cc = pair.Value;
+ CookieCollection cc = (CookieCollection)e.Value;
cc.TimeStamp(CookieCollection.Stamp.Set);
MergeUpdateCollections(ref cookies, cc, port, isSecure, matchOnlyPlainCookie);
@@ -845,7 +849,7 @@ namespace System.Net
if (!defaultAdded)
{
- CookieCollection cc = pathList["/"];
+ CookieCollection cc = (CookieCollection)pathList["/"];
if (cc != null)
{
@@ -858,7 +862,7 @@ namespace System.Net
// (This is the only place that does domain removal)
if (pathList.Count == 0)
{
- lock (m_domainTable)
+ lock (m_domainTable.SyncRoot)
{
m_domainTable.Remove(domainAttribute[i]);
}
@@ -937,6 +941,7 @@ namespace System.Net
{
throw new ArgumentNullException(nameof(uri));
}
+
string dummy;
return GetCookieHeader(uri, out dummy);
}
@@ -952,7 +957,7 @@ namespace System.Net
string delimiter = string.Empty;
- var builder = StringBuilderCache.Acquire();
+ StringBuilder builder = StringBuilderCache.Acquire();
for (int i = 0; i < cookies.Count; i++)
{
builder.Append(delimiter);
@@ -984,55 +989,46 @@ namespace System.Net
}
}
+ // PathList needs to be public in order to maintain binary serialization compatibility as the System shim
+ // needs to have access to type-forward it.
[Serializable]
- internal struct PathList
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
+ public sealed class PathList
{
// Usage of PathList depends on it being shallowly immutable;
// adding any mutable fields to it would result in breaks.
- private readonly SortedList<string, CookieCollection> m_list; // Do not rename (binary serialization)
-
- public static PathList Create() => new PathList(new SortedList<string, CookieCollection>(PathListComparer.StaticInstance));
+ private readonly SortedList m_list = SortedList.Synchronized(new SortedList(PathListComparer.StaticInstance)); // Do not rename (binary serialization)
- private PathList(SortedList<string, CookieCollection> list)
- {
- Debug.Assert(list != null, $"{nameof(list)} must not be null.");
- m_list = list;
- }
+ internal int Count => m_list.Count;
- public int Count
+ internal int GetCookiesCount()
{
- get
+ int count = 0;
+ lock (SyncRoot)
{
- lock (SyncRoot)
+ foreach (CookieCollection cc in m_list.Values)
{
- return m_list.Count;
+ count += cc.Count;
}
}
+ return count;
}
- public int GetCookiesCount()
+ internal ICollection Values
{
- int count = 0;
- lock (SyncRoot)
+ get
{
- foreach (KeyValuePair<string, CookieCollection> pair in m_list)
- {
- CookieCollection cc = pair.Value;
- count += cc.Count;
- }
+ return m_list.Values;
}
- return count;
}
- public CookieCollection this[string s]
+ internal object this[string s]
{
get
{
lock (SyncRoot)
{
- CookieCollection value;
- m_list.TryGetValue(s, out value);
- return value;
+ return m_list[s];
}
}
set
@@ -1045,7 +1041,7 @@ namespace System.Net
}
}
- public IEnumerator<KeyValuePair<string, CookieCollection>> GetEnumerator()
+ internal IDictionaryEnumerator GetEnumerator()
{
lock (SyncRoot)
{
@@ -1053,24 +1049,17 @@ namespace System.Net
}
}
- public object SyncRoot
- {
- get
- {
- Debug.Assert(m_list != null, $"{nameof(PathList)} should never be default initialized and only ever created with {nameof(Create)}.");
- return m_list;
- }
- }
+ internal object SyncRoot => m_list.SyncRoot;
[Serializable]
- private sealed class PathListComparer : IComparer<string>
+ private sealed class PathListComparer : IComparer
{
internal static readonly PathListComparer StaticInstance = new PathListComparer();
- int IComparer<string>.Compare(string x, string y)
+ int IComparer.Compare(object ol, object or)
{
- string pathLeft = CookieParser.CheckQuoted(x);
- string pathRight = CookieParser.CheckQuoted(y);
+ string pathLeft = CookieParser.CheckQuoted((string)ol);
+ string pathRight = CookieParser.CheckQuoted((string)or);
int ll = pathLeft.Length;
int lr = pathRight.Length;
int length = Math.Min(ll, lr);
diff --git a/src/System.Net.Primitives/tests/FunctionalTests/System.Net.Primitives.Functional.Tests.csproj b/src/System.Net.Primitives/tests/FunctionalTests/System.Net.Primitives.Functional.Tests.csproj
index 5321e59a4b..c3be1073ea 100644
--- a/src/System.Net.Primitives/tests/FunctionalTests/System.Net.Primitives.Functional.Tests.csproj
+++ b/src/System.Net.Primitives/tests/FunctionalTests/System.Net.Primitives.Functional.Tests.csproj
@@ -36,12 +36,6 @@
<Compile Include="$(CommonTestPath)\System\Diagnostics\Tracing\TestEventListener.cs">
<Link>Common\System\Diagnostics\Tracing\TestEventListener.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\Runtime\Serialization\Formatters\BinaryFormatterHelpers.cs">
<Link>Common\System\Runtime\Serialization\Formatters\BinaryFormatterHelpers.cs</Link>
</Compile>
diff --git a/src/System.Net.Primitives/tests/UnitTests/CookieContainerTest.cs b/src/System.Net.Primitives/tests/UnitTests/CookieContainerTest.cs
index a981883c36..6bb4e0d17b 100644
--- a/src/System.Net.Primitives/tests/UnitTests/CookieContainerTest.cs
+++ b/src/System.Net.Primitives/tests/UnitTests/CookieContainerTest.cs
@@ -251,7 +251,7 @@ namespace System.Net.Primitives.Unit.Tests
container.Add(uri, cookie1);
container.Add(uri, cookie2);
- var cookies = container.GetCookies(uri);
+ CookieCollection cookies = container.GetCookies(uri);
Assert.Equal(2, cookies.Count);
Assert.Equal(OriginalDomain, cookies[CookieName1].Domain);
Assert.Equal(OriginalDomain, cookies[CookieName2].Domain);
@@ -284,7 +284,7 @@ namespace System.Net.Primitives.Unit.Tests
container.Add(new Uri(SchemePrefix + OriginalDomain), cookie1);
var uri = new Uri(SchemePrefix + OriginalDomain);
- var cookies = container.GetCookies(uri);
+ CookieCollection cookies = container.GetCookies(uri);
Assert.Equal(1, cookies.Count);
Assert.Equal(OriginalDomain, cookies[CookieName1].Domain);
@@ -317,7 +317,7 @@ namespace System.Net.Primitives.Unit.Tests
container.Add(new Uri(SchemePrefix + OriginalDomain), cookie1);
var uri = new Uri(SchemePrefix + OriginalDomain);
- var cookies = container.GetCookies(uri);
+ CookieCollection cookies = container.GetCookies(uri);
Assert.Equal(1, cookies.Count);
Assert.Equal(OriginalDomainWithLeadingDot, cookies[CookieName1].Domain);
diff --git a/src/System.Net.Requests/tests/AuthenticationManagerTest.cs b/src/System.Net.Requests/tests/AuthenticationManagerTest.cs
index 8baf87e2b5..9ac794edd8 100644
--- a/src/System.Net.Requests/tests/AuthenticationManagerTest.cs
+++ b/src/System.Net.Requests/tests/AuthenticationManagerTest.cs
@@ -26,6 +26,7 @@ namespace System.Net.Tests
Assert.Throws<ArgumentNullException>(() => AuthenticationManager.Register(null));
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
[Fact]
public void Register_Unregister_ModuleCountUnchanged()
{
@@ -41,6 +42,7 @@ namespace System.Net.Tests
}).Dispose();
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
public void Register_UnregisterByScheme_ModuleCountUnchanged()
{
RemoteInvoke(() =>
@@ -64,6 +66,7 @@ namespace System.Net.Tests
Assert.Equal(PlatformDetection.IsFullFramework ? 5 : 0, count);
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
[Fact]
public void CredentialPolicy_Roundtrip()
{
@@ -82,6 +85,7 @@ namespace System.Net.Tests
}).Dispose();
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
[Fact]
public void CustomTargetNameDictionary_ValidCollection()
{
diff --git a/src/System.Net.Requests/tests/GlobalProxySelectionTest.cs b/src/System.Net.Requests/tests/GlobalProxySelectionTest.cs
index 7947624eb3..2cd3338470 100644
--- a/src/System.Net.Requests/tests/GlobalProxySelectionTest.cs
+++ b/src/System.Net.Requests/tests/GlobalProxySelectionTest.cs
@@ -38,6 +38,7 @@ namespace System.Net.Tests
}
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
[Fact]
public void Select_Success()
{
diff --git a/src/System.Net.Requests/tests/HttpWebRequestTest.cs b/src/System.Net.Requests/tests/HttpWebRequestTest.cs
index 3c8b8abfa6..35c398fae7 100644
--- a/src/System.Net.Requests/tests/HttpWebRequestTest.cs
+++ b/src/System.Net.Requests/tests/HttpWebRequestTest.cs
@@ -136,7 +136,7 @@ namespace System.Net.Tests
public void ContentLength_SetNegativeOne_ThrowsArgumentOutOfRangeException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentOutOfRangeException>("value", () => request.ContentLength = -1);
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.ContentLength = -1);
}
[Theory, MemberData(nameof(EchoServers))]
@@ -191,7 +191,7 @@ namespace System.Net.Tests
public void MaximumResponseHeadersLength_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentOutOfRangeException>("value", () => request.MaximumResponseHeadersLength = -2);
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.MaximumResponseHeadersLength = -2);
}
[Theory, MemberData(nameof(EchoServers))]
@@ -207,8 +207,8 @@ namespace System.Net.Tests
public void MaximumAutomaticRedirections_SetZeroOrNegative_ThrowsArgumentException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentException>("value", () => request.MaximumAutomaticRedirections = 0);
- Assert.Throws<ArgumentException>("value", () => request.MaximumAutomaticRedirections = -1);
+ AssertExtensions.Throws<ArgumentException>("value", () => request.MaximumAutomaticRedirections = 0);
+ AssertExtensions.Throws<ArgumentException>("value", () => request.MaximumAutomaticRedirections = -1);
}
[Theory, MemberData(nameof(EchoServers))]
@@ -239,7 +239,7 @@ namespace System.Net.Tests
public void ContinueTimeout_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentOutOfRangeException>("value", () => request.ContinueTimeout = -2);
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.ContinueTimeout = -2);
}
[Theory, MemberData(nameof(EchoServers))]
@@ -262,7 +262,7 @@ namespace System.Net.Tests
public void Timeout_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentOutOfRangeException>("value", () => request.Timeout = -2);
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.Timeout = -2);
}
[Theory, MemberData(nameof(EchoServers))]
@@ -406,7 +406,7 @@ namespace System.Net.Tests
public void TransferEncoding_SetChunked_ThrowsArgumentException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentException>("value", () => request.TransferEncoding = "chunked");
+ AssertExtensions.Throws<ArgumentException>("value", () => request.TransferEncoding = "chunked");
}
[Theory, MemberData(nameof(EchoServers))]
@@ -534,8 +534,8 @@ namespace System.Net.Tests
public void Connection_SetKeepAliveAndClose_ThrowsArgumentException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentException>("value", () => request.Connection = "keep-alive");
- Assert.Throws<ArgumentException>("value", () => request.Connection = "close");
+ AssertExtensions.Throws<ArgumentException>("value", () => request.Connection = "keep-alive");
+ AssertExtensions.Throws<ArgumentException>("value", () => request.Connection = "close");
}
[Theory, MemberData(nameof(EchoServers))]
@@ -553,9 +553,10 @@ namespace System.Net.Tests
public void Expect_Set100Continue_ThrowsArgumentException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentException>("value", () => request.Expect = "100-continue");
+ AssertExtensions.Throws<ArgumentException>("value", () => request.Expect = "100-continue");
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
[Fact]
public void DefaultMaximumResponseHeadersLength_SetAndGetLength_ValuesMatch()
{
@@ -578,6 +579,7 @@ namespace System.Net.Tests
}).Dispose();
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
[Fact]
public void DefaultMaximumErrorResponseLength_SetAndGetLength_ValuesMatch()
{
@@ -600,6 +602,7 @@ namespace System.Net.Tests
}).Dispose();
}
+ [ActiveIssue(20136, TargetFrameworkMonikers.Uap)]
[Fact]
public void DefaultCachePolicy_SetAndGetPolicyReload_ValuesMatch()
{
@@ -703,7 +706,7 @@ namespace System.Net.Tests
public void ClientCertificates_SetNullX509_ThrowsArgumentNullException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentNullException>("value", () => request.ClientCertificates = null);
+ AssertExtensions.Throws<ArgumentNullException>("value", () => request.ClientCertificates = null);
}
[Theory, MemberData(nameof(EchoServers))]
@@ -719,7 +722,7 @@ namespace System.Net.Tests
public void ProtocolVersion_SetInvalidHttpVersion_ThrowsArgumentException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentException>("value", () => request.ProtocolVersion = new Version());
+ AssertExtensions.Throws<ArgumentException>("value", () => request.ProtocolVersion = new Version());
}
[Theory, MemberData(nameof(EchoServers))]
@@ -1077,9 +1080,9 @@ namespace System.Net.Tests
public void Method_SetInvalidString_ThrowsArgumentException(Uri remoteServer)
{
HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
- Assert.Throws<ArgumentException>("value", () => request.Method = null);
- Assert.Throws<ArgumentException>("value", () => request.Method = string.Empty);
- Assert.Throws<ArgumentException>("value", () => request.Method = "Method(2");
+ AssertExtensions.Throws<ArgumentException>("value", () => request.Method = null);
+ AssertExtensions.Throws<ArgumentException>("value", () => request.Method = string.Empty);
+ AssertExtensions.Throws<ArgumentException>("value", () => request.Method = "Method(2");
}
[Theory, MemberData(nameof(EchoServers))]
diff --git a/src/System.Net.Requests/tests/LoggingTest.cs b/src/System.Net.Requests/tests/LoggingTest.cs
index 9bb0d37791..a99d9f262a 100644
--- a/src/System.Net.Requests/tests/LoggingTest.cs
+++ b/src/System.Net.Requests/tests/LoggingTest.cs
@@ -11,6 +11,7 @@ namespace System.Net.Tests
{
[Fact]
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "NetEventSource is only part of .NET Core")]
+ [ActiveIssue(20136, TargetFrameworkMonikers.UapAot)]
public void EventSource_ExistsWithCorrectId()
{
Type esType = typeof(WebRequest).Assembly.GetType("System.Net.NetEventSource", throwOnError: true, ignoreCase: false);
diff --git a/src/System.Net.Requests/tests/RequestStreamTest.cs b/src/System.Net.Requests/tests/RequestStreamTest.cs
index 6daf9d59c8..963dc8822e 100644
--- a/src/System.Net.Requests/tests/RequestStreamTest.cs
+++ b/src/System.Net.Requests/tests/RequestStreamTest.cs
@@ -22,7 +22,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentNullException>("buffer", () => stream.Write(null, 0, 1));
+ AssertExtensions.Throws<ArgumentNullException>("buffer", () => stream.Write(null, 0, 1));
});
}
@@ -31,7 +31,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentOutOfRangeException>("offset", () => stream.Write(buffer, -1, buffer.Length));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("offset", () => stream.Write(buffer, -1, buffer.Length));
});
}
@@ -58,7 +58,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentOutOfRangeException>("offset", () => stream.Write(buffer, int.MaxValue, int.MaxValue));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("offset", () => stream.Write(buffer, int.MaxValue, int.MaxValue));
});
}
@@ -71,7 +71,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentNullException>("buffer", () => { Task t = stream.WriteAsync(null, 0, 1); });
+ AssertExtensions.Throws<ArgumentNullException>("buffer", () => { Task t = stream.WriteAsync(null, 0, 1); });
});
}
@@ -80,7 +80,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentOutOfRangeException>("offset", () => { Task t = stream.WriteAsync(buffer, -1, buffer.Length); });
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("offset", () => { Task t = stream.WriteAsync(buffer, -1, buffer.Length); });
});
}
@@ -107,7 +107,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentOutOfRangeException>("offset", () => { Task t = stream.WriteAsync(buffer, int.MaxValue, int.MaxValue); });
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("offset", () => { Task t = stream.WriteAsync(buffer, int.MaxValue, int.MaxValue); });
});
}
@@ -142,7 +142,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentNullException>("buffer", () => stream.BeginWrite(null, 0, 1, null, null));
+ AssertExtensions.Throws<ArgumentNullException>("buffer", () => stream.BeginWrite(null, 0, 1, null, null));
});
}
@@ -151,7 +151,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentOutOfRangeException>("offset", () => stream.BeginWrite(buffer, -1, buffer.Length, null, null));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("offset", () => stream.BeginWrite(buffer, -1, buffer.Length, null, null));
});
}
@@ -178,7 +178,7 @@ namespace System.Net.Tests
{
await GetRequestStream((stream) =>
{
- Assert.Throws<ArgumentOutOfRangeException>("offset", () => stream.BeginWrite(buffer, int.MaxValue, int.MaxValue, null, null));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("offset", () => stream.BeginWrite(buffer, int.MaxValue, int.MaxValue, null, null));
});
}
diff --git a/src/System.Net.Requests/tests/System.Net.Requests.Tests.csproj b/src/System.Net.Requests/tests/System.Net.Requests.Tests.csproj
index 57100724eb..f74fa454cc 100644
--- a/src/System.Net.Requests/tests/System.Net.Requests.Tests.csproj
+++ b/src/System.Net.Requests/tests/System.Net.Requests.Tests.csproj
@@ -30,12 +30,6 @@
<Compile Include="$(CommonTestPath)\System\Net\Http\LoopbackServer.cs">
<Link>Common\System\Net\Http\LoopbackServer.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<ProjectReference Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorConsoleApp\RemoteExecutorConsoleApp.csproj">
<Project>{69e46a6f-9966-45a5-8945-2559fe337827}</Project>
<Name>RemoteExecutorConsoleApp</Name>
diff --git a/src/System.Net.Security/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Net.Security/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
index e229924b6e..7129605e6a 100644
--- a/src/System.Net.Security/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ b/src/System.Net.Security/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -1,3 +1,4 @@
+# Discussing with Networking team
sspicli.dll!AcceptSecurityContext
sspicli.dll!AcquireCredentialsHandleW
sspicli.dll!ApplyControlToken
diff --git a/src/System.Net.Security/tests/FunctionalTests/NegotiateStreamTestForUnix.cs b/src/System.Net.Security/tests/FunctionalTests/NegotiateStreamTestForUnix.cs
index 3bd731e3e8..71c9ab2439 100644
--- a/src/System.Net.Security/tests/FunctionalTests/NegotiateStreamTestForUnix.cs
+++ b/src/System.Net.Security/tests/FunctionalTests/NegotiateStreamTestForUnix.cs
@@ -109,10 +109,19 @@ namespace System.Net.Security.Tests
// the program to be run
startInfo.FileName = SudoCommand;
startInfo.Arguments = string.Format("bash {0} {1}", ScriptName, args);
- using (Process kdcSetup = Process.Start(startInfo))
+
+ try
+ {
+ using (Process kdcSetup = Process.Start(startInfo))
+ {
+ kdcSetup.WaitForExit();
+ return kdcSetup.ExitCode;
+ }
+ }
+ catch
{
- kdcSetup.WaitForExit();
- return kdcSetup.ExitCode;
+ // Could not find the file
+ return 1;
}
}
}
diff --git a/src/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj b/src/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj
index 62134ea08a..f0ddcc4fe1 100644
--- a/src/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj
+++ b/src/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj
@@ -107,12 +107,6 @@
<Compile Include="$(CommonTestPath)\System\Diagnostics\Tracing\TestEventListener.cs">
<Link>Common\System\Diagnostics\Tracing\TestEventListener.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
</ItemGroup>
<ItemGroup Condition=" '$(TargetsWindows)' == 'true' ">
<Compile Include="IdentityValidator.Windows.cs" />
diff --git a/src/System.Net.Security/tests/Scripts/Unix/setup-kdc.sh b/src/System.Net.Security/tests/Scripts/Unix/setup-kdc.sh
index c550416f29..3fe002aa77 100644
--- a/src/System.Net.Security/tests/Scripts/Unix/setup-kdc.sh
+++ b/src/System.Net.Security/tests/Scripts/Unix/setup-kdc.sh
@@ -66,6 +66,7 @@ clean_up()
;;
*)
echo "This is an unsupported operating system"
+ exit 1
;;
esac
@@ -288,6 +289,7 @@ case ${OS} in
;;
*)
echo "This is an unsupported operating system"
+ exit 1
;;
esac
diff --git a/src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs b/src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs
index 091726f9e9..8aa08a26f8 100644
--- a/src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs
+++ b/src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
+using System.Diagnostics;
using System.Threading;
namespace System.Net.Sockets
@@ -135,7 +136,7 @@ namespace System.Net.Sockets
if (_buffer != null)
{
// Can't have both set
- throw new ArgumentException(SR.Format(SR.net_ambiguousbuffers, "Buffer"));
+ throw new ArgumentException(SR.Format(SR.net_ambiguousbuffers, nameof(Buffer)));
}
// Copy the user-provided list into our internal buffer list,
@@ -304,7 +305,7 @@ namespace System.Net.Sockets
// Can't have both Buffer and BufferList.
if (_bufferList != null)
{
- throw new ArgumentException(SR.Format(SR.net_ambiguousbuffers, "BufferList"));
+ throw new ArgumentException(SR.Format(SR.net_ambiguousbuffers, nameof(BufferList)));
}
// Offset and count can't be negative and the
@@ -418,14 +419,23 @@ namespace System.Net.Sockets
private void StartConfiguring()
{
int status = Interlocked.CompareExchange(ref _operating, Configuring, Free);
- if (status == InProgress || status == Configuring)
+ if (status != Free)
{
- throw new InvalidOperationException(SR.net_socketopinprogress);
+ ThrowForNonFreeStatus(status);
}
- else if (status == Disposed)
+ }
+
+ private void ThrowForNonFreeStatus(int status)
+ {
+ Debug.Assert(status == InProgress || status == Configuring || status == Disposed, $"Unexpected status: {status}");
+ if (status == Disposed)
{
throw new ObjectDisposedException(GetType().FullName);
}
+ else
+ {
+ throw new InvalidOperationException(SR.net_socketopinprogress);
+ }
}
// Prepares for a native async socket call.
@@ -433,17 +443,10 @@ namespace System.Net.Sockets
internal void StartOperationCommon(Socket socket)
{
// Change status to "in-use".
- if (Interlocked.CompareExchange(ref _operating, InProgress, Free) != Free)
+ int status = Interlocked.CompareExchange(ref _operating, InProgress, Free);
+ if (status != Free)
{
- // If it was already "in-use" check if Dispose was called.
- if (_disposeCalled)
- {
- // Dispose was called - throw ObjectDisposed.
- throw new ObjectDisposedException(GetType().FullName);
- }
-
- // Only one at a time.
- throw new InvalidOperationException(SR.net_socketopinprogress);
+ ThrowForNonFreeStatus(status);
}
// Prepare execution context for callback.
@@ -452,6 +455,7 @@ namespace System.Net.Sockets
if (_completedChanged || socket != _currentSocket)
{
_completedChanged = false;
+ _currentSocket = socket;
_context = null;
}
@@ -460,9 +464,6 @@ namespace System.Net.Sockets
{
_context = ExecutionContext.Capture();
}
-
- // Remember current socket.
- _currentSocket = socket;
}
internal void StartOperationAccept()
@@ -484,7 +485,7 @@ namespace System.Net.Sockets
// Caller specified a buffer - see if it is large enough
if (_count < _acceptAddressBufferCount)
{
- throw new ArgumentException(SR.Format(SR.net_buffercounttoosmall, "Count"));
+ throw new ArgumentException(SR.Format(SR.net_buffercounttoosmall, nameof(Count)));
}
// Buffer is already pinned if necessary.
@@ -688,23 +689,15 @@ namespace System.Net.Sockets
{
SetResults(SocketError.Success, bytesTransferred, flags);
+ if (NetEventSource.IsEnabled || Socket.s_perfCountersEnabled)
+ {
+ LogBytesTransferred(bytesTransferred, _completedOperation);
+ }
+
SocketError socketError = SocketError.Success;
switch (_completedOperation)
{
case SocketAsyncOperation.Accept:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogBuffer(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, false);
- }
- }
-
// Get the endpoint.
Internals.SocketAddress remoteSocketAddress = IPEndPointExtensions.Serialize(_currentSocket._rightEndPoint);
@@ -718,72 +711,35 @@ namespace System.Net.Sockets
}
else
{
- SetResults(socketError, bytesTransferred, SocketFlags.None);
+ SetResults(socketError, bytesTransferred, flags);
_acceptSocket = null;
+ _currentSocket.UpdateStatusAfterSocketError(socketError);
}
break;
case SocketAsyncOperation.Connect:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogBuffer(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, true);
- }
- }
-
socketError = FinishOperationConnect();
-
- // Mark socket connected.
if (socketError == SocketError.Success)
{
if (NetEventSource.IsEnabled) NetEventSource.Connected(_currentSocket, _currentSocket.LocalEndPoint, _currentSocket.RemoteEndPoint);
+ // Mark socket connected.
_currentSocket.SetToConnected();
_connectSocket = _currentSocket;
}
+ else
+ {
+ SetResults(socketError, bytesTransferred, flags);
+ _currentSocket.UpdateStatusAfterSocketError(socketError);
+ }
break;
case SocketAsyncOperation.Disconnect:
_currentSocket.SetToDisconnected();
_currentSocket._remoteEndPoint = null;
-
- break;
-
- case SocketAsyncOperation.Receive:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogBuffer(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, false);
- }
- }
break;
case SocketAsyncOperation.ReceiveFrom:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogBuffer(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, false);
- }
- }
-
// Deal with incoming address.
_socketAddress.InternalSize = GetSocketAddressSize();
Internals.SocketAddress socketAddressOriginal = IPEndPointExtensions.Serialize(_remoteEndPoint);
@@ -800,19 +756,6 @@ namespace System.Net.Sockets
break;
case SocketAsyncOperation.ReceiveMessageFrom:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogBuffer(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, false);
- }
- }
-
// Deal with incoming address.
_socketAddress.InternalSize = GetSocketAddressSize();
socketAddressOriginal = IPEndPointExtensions.Serialize(_remoteEndPoint);
@@ -830,63 +773,38 @@ namespace System.Net.Sockets
FinishOperationReceiveMessageFrom();
break;
- case SocketAsyncOperation.Send:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogBuffer(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, true);
- }
- }
- break;
-
case SocketAsyncOperation.SendPackets:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogSendPacketsBuffers(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, true);
- }
- }
-
FinishOperationSendPackets();
break;
-
- case SocketAsyncOperation.SendTo:
- if (bytesTransferred > 0)
- {
- // Log and Perf counters.
- if (NetEventSource.IsEnabled)
- {
- LogBuffer(bytesTransferred);
- }
- if (Socket.s_perfCountersEnabled)
- {
- UpdatePerfCounters(bytesTransferred, true);
- }
- }
- break;
}
- if (socketError != SocketError.Success)
+ Complete();
+ }
+
+ private void LogBytesTransferred(int bytesTransferred, SocketAsyncOperation operation)
+ {
+ if (bytesTransferred > 0)
{
- // Asynchronous failure or something went wrong after async success.
- SetResults(socketError, bytesTransferred, flags);
- _currentSocket.UpdateStatusAfterSocketError(socketError);
- }
+ if (NetEventSource.IsEnabled)
+ {
+ LogBuffer(bytesTransferred);
+ }
- // Complete the operation.
- Complete();
+ if (Socket.s_perfCountersEnabled)
+ {
+ bool sendOp = false;
+ switch (operation)
+ {
+ case SocketAsyncOperation.Connect:
+ case SocketAsyncOperation.Send:
+ case SocketAsyncOperation.SendPackets:
+ case SocketAsyncOperation.SendTo:
+ sendOp = true;
+ break;
+ }
+ UpdatePerfCounters(bytesTransferred, sendOp);
+ }
+ }
}
internal void FinishOperationAsyncSuccess(int bytesTransferred, SocketFlags flags)
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/LoggingTest.cs b/src/System.Net.Sockets/tests/FunctionalTests/LoggingTest.cs
index f727549053..1c34520df3 100644
--- a/src/System.Net.Sockets/tests/FunctionalTests/LoggingTest.cs
+++ b/src/System.Net.Sockets/tests/FunctionalTests/LoggingTest.cs
@@ -14,6 +14,7 @@ namespace System.Net.Sockets.Tests
{
[Fact]
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "NetEventSource is only part of .NET Core")]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public static void EventSource_ExistsWithCorrectId()
{
Type esType = typeof(Socket).Assembly.GetType("System.Net.NetEventSource", throwOnError: true, ignoreCase: false);
@@ -28,6 +29,7 @@ namespace System.Net.Sockets.Tests
[OuterLoop]
[Fact]
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "NetEventSource is only part of .NET Core")]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public void EventSource_EventsRaisedAsExpected()
{
RemoteInvoke(() =>
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/NetworkStreamTest.cs b/src/System.Net.Sockets/tests/FunctionalTests/NetworkStreamTest.cs
index e6e36ae068..629a0a93d3 100644
--- a/src/System.Net.Sockets/tests/FunctionalTests/NetworkStreamTest.cs
+++ b/src/System.Net.Sockets/tests/FunctionalTests/NetworkStreamTest.cs
@@ -623,6 +623,7 @@ namespace System.Net.Sockets.Tests
[InlineData(4096)]
[InlineData(4095)]
[InlineData(1024*1024)]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public async Task CopyToAsync_AllDataCopied(int byteCount)
{
await RunWithConnectedNetworkStreamsAsync(async (server, client) =>
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/Resources/System.Net.Sockets.Tests.rd.xml b/src/System.Net.Sockets/tests/FunctionalTests/Resources/System.Net.Sockets.Tests.rd.xml
new file mode 100644
index 0000000000..28ddd4703d
--- /dev/null
+++ b/src/System.Net.Sockets/tests/FunctionalTests/Resources/System.Net.Sockets.Tests.rd.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
+ <Library Name="System.Net.Sockets.Tests">
+ <Assembly Name="System.Net.Sockets">
+ <!-- Needed for 2 tests that require inline metadata -->
+ <Namespace Name="System.Net.Sockets" Dynamic="Required All" />
+ </Assembly>
+ </Library>
+</Directives>
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/SendPacketsAsync.cs b/src/System.Net.Sockets/tests/FunctionalTests/SendPacketsAsync.cs
index fb5bcc2855..11dc2534e7 100644
--- a/src/System.Net.Sockets/tests/FunctionalTests/SendPacketsAsync.cs
+++ b/src/System.Net.Sockets/tests/FunctionalTests/SendPacketsAsync.cs
@@ -89,12 +89,8 @@ namespace System.Net.Sockets.Tests
using (Socket sock = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp))
{
sock.Connect(new IPEndPoint(_serverAddress, port));
-
- ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() =>
- {
- sock.SendPacketsAsync(null);
- });
- Assert.Equal("e", ex.ParamName);
+
+ AssertExtensions.Throws<ArgumentNullException>("e", () => sock.SendPacketsAsync(null));
}
}
}
@@ -118,18 +114,14 @@ namespace System.Net.Sockets.Tests
[InlineData(SocketImplementationType.Async)]
public void NullList_Throws(SocketImplementationType type)
{
- ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() =>
- {
- SendPackets(type, (SendPacketsElement[])null, SocketError.Success, 0);
- });
-
- Assert.Equal("e.SendPacketsElements", ex.ParamName);
+ AssertExtensions.Throws<ArgumentNullException>("e.SendPacketsElements", () => SendPackets(type, (SendPacketsElement[])null, SocketError.Success, 0));
}
[OuterLoop] // TODO: Issue #11345
[Theory]
[InlineData(SocketImplementationType.APM)]
[InlineData(SocketImplementationType.Async)]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public void NullElement_Ignored(SocketImplementationType type)
{
SendPackets(type, (SendPacketsElement)null, 0);
@@ -139,6 +131,7 @@ namespace System.Net.Sockets.Tests
[Theory]
[InlineData(SocketImplementationType.APM)]
[InlineData(SocketImplementationType.Async)]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public void EmptyList_Ignored(SocketImplementationType type)
{
SendPackets(type, new SendPacketsElement[0], SocketError.Success, 0);
@@ -175,6 +168,7 @@ namespace System.Net.Sockets.Tests
[Theory]
[InlineData(SocketImplementationType.APM)]
[InlineData(SocketImplementationType.Async)]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public void EmptyBuffer_Ignored(SocketImplementationType type)
{
SendPackets(type, new SendPacketsElement(new byte[0]), 0);
@@ -183,6 +177,7 @@ namespace System.Net.Sockets.Tests
[Theory]
[InlineData(SocketImplementationType.APM)]
[InlineData(SocketImplementationType.Async)]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public void BufferZeroCount_Ignored(SocketImplementationType type)
{
SendPackets(type, new SendPacketsElement(new byte[10], 4, 0), 0);
@@ -205,6 +200,7 @@ namespace System.Net.Sockets.Tests
[Theory]
[InlineData(SocketImplementationType.APM)]
[InlineData(SocketImplementationType.Async)]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public void BufferZeroCountThenNormal_ZeroCountIgnored(SocketImplementationType type)
{
Assert.True(Capability.IPv6Support());
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/SendReceive.cs b/src/System.Net.Sockets/tests/FunctionalTests/SendReceive.cs
index 200947a1db..7c945de442 100644
--- a/src/System.Net.Sockets/tests/FunctionalTests/SendReceive.cs
+++ b/src/System.Net.Sockets/tests/FunctionalTests/SendReceive.cs
@@ -657,6 +657,7 @@ namespace System.Net.Sockets.Tests
}
[Fact]
+ [ActiveIssue(20135, TargetFrameworkMonikers.Uap)]
public async Task SendRecv_0ByteReceive_Success()
{
using (Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs b/src/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs
index 4ccfc64074..38b73fc6cb 100644
--- a/src/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs
+++ b/src/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs
@@ -157,6 +157,25 @@ namespace System.Net.Sockets.Tests
}
[Fact]
+ public void SetBuffer_NoBuffer_ResetsCountOffset()
+ {
+ using (var saea = new SocketAsyncEventArgs())
+ {
+ saea.SetBuffer(42, 84);
+ Assert.Equal(0, saea.Offset);
+ Assert.Equal(0, saea.Count);
+
+ saea.SetBuffer(new byte[3], 1, 2);
+ Assert.Equal(1, saea.Offset);
+ Assert.Equal(2, saea.Count);
+
+ saea.SetBuffer(null, 1, 2);
+ Assert.Equal(0, saea.Offset);
+ Assert.Equal(0, saea.Count);
+ }
+ }
+
+ [Fact]
public void SetBufferListWhenBufferSet_Throws()
{
using (var saea = new SocketAsyncEventArgs())
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/SocketOptionNameTest.cs b/src/System.Net.Sockets/tests/FunctionalTests/SocketOptionNameTest.cs
index 5857bf202b..d1cba4b00e 100644
--- a/src/System.Net.Sockets/tests/FunctionalTests/SocketOptionNameTest.cs
+++ b/src/System.Net.Sockets/tests/FunctionalTests/SocketOptionNameTest.cs
@@ -55,7 +55,7 @@ namespace System.Net.Sockets.Tests
// TODO: Issue #4887
// The socket option 'ReuseUnicastPost' only works on Windows 10 systems. In addition, setting the option
// is a no-op unless specialized network settings using PowerShell configuration are first applied to the
- // machine. This is currently difficult to test in the CI environment. So, this ests will be disabled for now
+ // machine. This is currently difficult to test in the CI environment. So, this test will be disabled for now
[OuterLoop] // TODO: Issue #11345
[ActiveIssue(4887)]
public void ReuseUnicastPort_CreateSocketSetOptionToOneAndGetOption_SocketsReuseUnicastPortSupport_OptionIsOne()
@@ -83,6 +83,8 @@ namespace System.Net.Sockets.Tests
}
[OuterLoop] // TODO: Issue #11345
+ [Fact]
+ [ActiveIssue(21018, TargetFrameworkMonikers.Uap)]
public async Task MulticastInterface_Set_AnyInterface_Succeeds()
{
// On all platforms, index 0 means "any interface"
@@ -92,6 +94,7 @@ namespace System.Net.Sockets.Tests
[OuterLoop] // TODO: Issue #11345
[Fact]
[PlatformSpecific(TestPlatforms.Windows)] // see comment below
+ [ActiveIssue(21018, TargetFrameworkMonikers.Uap)]
public async Task MulticastInterface_Set_Loopback_Succeeds()
{
// On Windows, we can apparently assume interface 1 is "loopback." On other platforms, this is not a
diff --git a/src/System.Net.Sockets/tests/FunctionalTests/System.Net.Sockets.Tests.csproj b/src/System.Net.Sockets/tests/FunctionalTests/System.Net.Sockets.Tests.csproj
index 9ca5cf8077..2d5baf01d5 100644
--- a/src/System.Net.Sockets/tests/FunctionalTests/System.Net.Sockets.Tests.csproj
+++ b/src/System.Net.Sockets/tests/FunctionalTests/System.Net.Sockets.Tests.csproj
@@ -98,12 +98,6 @@
<Compile Include="$(CommonTestPath)\System\Diagnostics\Tracing\TestEventListener.cs">
<Link>Common\System\Diagnostics\Tracing\TestEventListener.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorConsoleApp\RemoteExecutorConsoleApp.csproj">
@@ -111,5 +105,8 @@
<Name>RemoteExecutorConsoleApp</Name>
</ProjectReference>
</ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Resources\$(AssemblyName).rd.xml" />
+ </ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project>
diff --git a/src/System.Net.WebSockets/tests/System.Net.WebSockets.Tests.csproj b/src/System.Net.WebSockets/tests/System.Net.WebSockets.Tests.csproj
index 7767d83749..5d80272dcc 100644
--- a/src/System.Net.WebSockets/tests/System.Net.WebSockets.Tests.csproj
+++ b/src/System.Net.WebSockets/tests/System.Net.WebSockets.Tests.csproj
@@ -16,6 +16,9 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
+ <Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
+ <Link>Common\System\PlatformDetection.cs</Link>
+ </Compile>
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project> \ No newline at end of file
+</Project>
diff --git a/src/System.Net.WebSockets/tests/WebSocketExceptionTests.cs b/src/System.Net.WebSockets/tests/WebSocketExceptionTests.cs
index 0342dc9873..2035e85305 100644
--- a/src/System.Net.WebSockets/tests/WebSocketExceptionTests.cs
+++ b/src/System.Net.WebSockets/tests/WebSocketExceptionTests.cs
@@ -180,7 +180,7 @@ namespace System.Net.WebSockets.Tests
Assert.Same(inner, wse.InnerException);
}
- [Fact]
+ [ConditionalFact(nameof(PlatformDetection) + "." + nameof(PlatformDetection.IsFullFramework))]
public void GetObjectData_Success()
{
var wse = new WebSocketException();
diff --git a/src/System.ObjectModel/src/System/Collections/ObjectModel/KeyedCollection.cs b/src/System.ObjectModel/src/System/Collections/ObjectModel/KeyedCollection.cs
index c18de0c466..e3db58289d 100644
--- a/src/System.ObjectModel/src/System/Collections/ObjectModel/KeyedCollection.cs
+++ b/src/System.ObjectModel/src/System/Collections/ObjectModel/KeyedCollection.cs
@@ -12,7 +12,7 @@ namespace System.Collections.ObjectModel
[DebuggerTypeProxy(typeof(CollectionDebugView<>))]
[DebuggerDisplay("Count = {Count}")]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public abstract class KeyedCollection<TKey, TItem> : Collection<TItem>
{
diff --git a/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs b/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs
index 3ada6f4298..1dbaad782b 100644
--- a/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs
+++ b/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs
@@ -25,6 +25,20 @@ namespace System.Collections.ObjectModel
{
//------------------------------------------------------
//
+ // Private Fields
+ //
+ //------------------------------------------------------
+
+ #region Private Fields
+
+ private SimpleMonitor _monitor; // Lazily allocated only when a subclass calls BlockReentrancy() or during serialization. Do not rename (binary serialization)
+
+ [NonSerialized]
+ private int _blockReentrancyCount;
+ #endregion Private Fields
+
+ //------------------------------------------------------
+ //
// Constructors
//
//------------------------------------------------------
@@ -382,7 +396,7 @@ namespace System.Collections.ObjectModel
#endif
private sealed class SimpleMonitor : IDisposable
{
- internal int _busyCount; // Only used during (de)serialization to maintain compatibility with desktop.
+ internal int _busyCount; // Only used during (de)serialization to maintain compatibility with desktop. Do not rename (binary serialization)
[NonSerialized]
internal ObservableCollection<T> _collection;
@@ -400,20 +414,6 @@ namespace System.Collections.ObjectModel
}
#endregion Private Types
-
- //------------------------------------------------------
- //
- // Private Fields
- //
- //------------------------------------------------------
-
- #region Private Fields
-
- private SimpleMonitor _monitor; // Lazily allocated only when a subclass calls BlockReentrancy() or during serialization.
-
- [NonSerialized]
- private int _blockReentrancyCount;
- #endregion Private Fields
}
internal static class EventArgsCache
diff --git a/src/System.ObjectModel/src/System/Collections/ObjectModel/ReadOnlyObservableCollection.cs b/src/System.ObjectModel/src/System/Collections/ObjectModel/ReadOnlyObservableCollection.cs
index 8abc2a8a02..d967c545c1 100644
--- a/src/System.ObjectModel/src/System/Collections/ObjectModel/ReadOnlyObservableCollection.cs
+++ b/src/System.ObjectModel/src/System/Collections/ObjectModel/ReadOnlyObservableCollection.cs
@@ -139,16 +139,6 @@ namespace System.Collections.ObjectModel
OnPropertyChanged(e);
}
#endregion Private Methods
-
- #region Private Fields
-
- //------------------------------------------------------
- //
- // Private Fields
- //
- //------------------------------------------------------
-
- #endregion Private Fields
}
}
diff --git a/src/System.Private.Uri/src/System/Uri.cs b/src/System.Private.Uri/src/System/Uri.cs
index 49bee6ad5e..3a632e810c 100644
--- a/src/System.Private.Uri/src/System/Uri.cs
+++ b/src/System.Private.Uri/src/System/Uri.cs
@@ -407,7 +407,7 @@ namespace System
//
protected Uri(SerializationInfo serializationInfo, StreamingContext streamingContext)
{
- string uriString = serializationInfo.GetString("AbsoluteUri");
+ string uriString = serializationInfo.GetString("AbsoluteUri"); // Do not rename (binary serialization)
if (uriString.Length != 0)
{
@@ -415,7 +415,7 @@ namespace System
return;
}
- uriString = serializationInfo.GetString("RelativeUri");
+ uriString = serializationInfo.GetString("RelativeUri"); // Do not rename (binary serialization)
if ((object)uriString == null)
throw new ArgumentNullException("uriString");
@@ -440,11 +440,11 @@ namespace System
{
if (IsAbsoluteUri)
- serializationInfo.AddValue("AbsoluteUri", GetParts(UriComponents.SerializationInfoString, UriFormat.UriEscaped));
+ serializationInfo.AddValue("AbsoluteUri", GetParts(UriComponents.SerializationInfoString, UriFormat.UriEscaped)); // Do not rename (binary serialization)
else
{
- serializationInfo.AddValue("AbsoluteUri", string.Empty);
- serializationInfo.AddValue("RelativeUri", GetParts(UriComponents.SerializationInfoString, UriFormat.UriEscaped));
+ serializationInfo.AddValue("AbsoluteUri", string.Empty); // Do not rename (binary serialization)
+ serializationInfo.AddValue("RelativeUri", GetParts(UriComponents.SerializationInfoString, UriFormat.UriEscaped)); // Do not rename (binary serialization)
}
}
@@ -2111,13 +2111,21 @@ namespace System
// Only FILE scheme may have UNC Path flag set
_flags |= Flags.UncPath;
idx = i;
+
+ _syntax = IsWindowsSystem ? _syntax : UriParser.UnixFileUri;
+ }
+ else if (!IsWindowsSystem && _syntax.InFact(UriSyntaxFlags.FileLikeUri) && pUriString[i - 1] == '/' && i - idx == 3)
+ {
+ _syntax = UriParser.UnixFileUri;
+ _flags |= Flags.UnixPath | Flags.AuthorityFound;
+ idx += 2;
}
}
}
//
//STEP 1.5 decide on the Authority component
//
- if ((_flags & (Flags.UncPath | Flags.DosPath)) != 0)
+ if ((_flags & (Flags.UncPath | Flags.DosPath | Flags.UnixPath)) != 0)
{
}
else if ((idx + 2) <= length)
@@ -2189,7 +2197,8 @@ namespace System
// This will disallow '\' as the host terminator for any scheme that is not implicitFile or cannot have a Dos Path
if ((idx < (ushort)length && pUriString[idx] == '\\') && NotAny(Flags.ImplicitFile) &&
- _syntax.NotAny(UriSyntaxFlags.AllowDOSPath))
+ (_syntax.NotAny(UriSyntaxFlags.AllowDOSPath) ||
+ (InFact(Flags.UncPath) && _syntax.NotAny(UriSyntaxFlags.ConvertPathSlashes))))
{
return ParsingError.BadAuthorityTerminator;
}
diff --git a/src/System.Private.Uri/tests/FunctionalTests/IriRelativeFileResolutionTest.cs b/src/System.Private.Uri/tests/FunctionalTests/IriRelativeFileResolutionTest.cs
index 64967056a3..ed4aeb7c0a 100644
--- a/src/System.Private.Uri/tests/FunctionalTests/IriRelativeFileResolutionTest.cs
+++ b/src/System.Private.Uri/tests/FunctionalTests/IriRelativeFileResolutionTest.cs
@@ -73,7 +73,7 @@ namespace System.PrivateUri.Tests
public void IriRelativeResolution_CompareImplcitAndExplicitUncWithNoUnicode_AllPropertiesTheSame()
{
string nonUnicodeImplicitTestUnc = @"\\c\path\path3\test.txt";
- string nonUnicodeImplicitUncBase = @"\\c\path\file.txt";
+ string nonUnicodeImplicitUncBase = s_isWindowsSystem ? @"\\c\path\file.txt" : @"\\c/path/file.txt";
string testResults;
int errorCount = RelatavizeRestoreCompareImplicitVsExplicitFiles(nonUnicodeImplicitTestUnc,
@@ -100,7 +100,7 @@ namespace System.PrivateUri.Tests
public void IriRelativeResolution_CompareImplcitAndExplicitUncWithUnicodeIriOn_AllPropertiesTheSame()
{
string unicodeImplicitTestUnc = @"\\c\path\\u30AF\path3\\u30EB\u30DE.text";
- string nonUnicodeImplicitUncBase = @"\\c\path\file.txt";
+ string nonUnicodeImplicitUncBase = s_isWindowsSystem ? @"\\c\path\file.txt" : @"\\c/path/file.txt";
string testResults;
int errorCount = RelatavizeRestoreCompareImplicitVsExplicitFiles(unicodeImplicitTestUnc,
@@ -120,7 +120,6 @@ namespace System.PrivateUri.Tests
Uri rel = implicitBaseUri.MakeRelativeUri(implicitTestUri);
Uri implicitResultUri = new Uri(implicitBaseUri, rel);
Uri explicitResultUri = new Uri(explicitBaseUri, rel);
-
Type uriType = typeof(Uri);
PropertyInfo[] infoList = uriType.GetProperties();
StringBuilder testResults = new StringBuilder();
diff --git a/src/System.Private.Uri/tests/FunctionalTests/UriTests.cs b/src/System.Private.Uri/tests/FunctionalTests/UriTests.cs
index 10b42bf5c9..4c9a56b68d 100644
--- a/src/System.Private.Uri/tests/FunctionalTests/UriTests.cs
+++ b/src/System.Private.Uri/tests/FunctionalTests/UriTests.cs
@@ -2,12 +2,45 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Collections.Generic;
using Xunit;
namespace System.PrivateUri.Tests
{
public static class UriTests
{
+ public static IEnumerable<object[]> Uri_TestData
+ {
+ get
+ {
+ if (PlatformDetection.IsWindows)
+ {
+ yield return new object[] { @"file:///path1\path2/path3\path4", @"/path1/path2/path3/path4", @"/path1/path2/path3/path4", @"file:///path1/path2/path3/path4", "" };
+ yield return new object[] { @"file:///path1%5Cpath2\path3", @"/path1/path2/path3", @"/path1/path2/path3", @"file:///path1/path2/path3", ""};
+ yield return new object[] { @"file://localhost/path1\path2/path3\path4\", @"/path1/path2/path3/path4/", @"\\localhost\path1\path2\path3\path4\", @"file://localhost/path1/path2/path3/path4/", "localhost"};
+ yield return new object[] { @"file://randomhost/path1%5Cpath2\path3", @"/path1/path2/path3", @"\\randomhost\path1\path2\path3", @"file://randomhost/path1/path2/path3", "randomhost"};
+ }
+ else
+ {
+ yield return new object[] { @"file:///path1\path2/path3\path4", @"/path1\path2/path3\path4", @"/path1\path2/path3\path4", @"file:///path1\path2/path3\path4", "" };
+ yield return new object[] { @"file:///path1%5Cpath2\path3", @"/path1%5Cpath2%5Cpath3", @"/path1\path2\path3", @"file:///path1%5Cpath2%5Cpath3", ""};
+ yield return new object[] { @"file://localhost/path1\path2/path3\path4\", @"/path1\path2/path3\path4\", @"\\localhost\path1\path2\path3\path4\", @"file://localhost/path1\path2/path3\path4\", "localhost"};
+ yield return new object[] { @"file://randomhost/path1%5Cpath2\path3", @"/path1%5Cpath2%5Cpath3", @"\\randomhost\path1\path2\path3", @"file://randomhost/path1%5Cpath2%5Cpath3", "randomhost"};
+ }
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(Uri_TestData))]
+ public static void TestCtor_BackwardSlashInPath(string uri, string expectedAbsolutePath, string expectedLocalPath, string expectedAbsoluteUri, string expectedHost)
+ {
+ Uri actualUri = new Uri(uri);
+ Assert.Equal(expectedAbsolutePath, actualUri.AbsolutePath);
+ Assert.Equal(expectedLocalPath, actualUri.LocalPath);
+ Assert.Equal(expectedAbsoluteUri, actualUri.AbsoluteUri);
+ Assert.Equal(expectedHost, actualUri.Host);
+ }
+
[Fact]
public static void TestCtor_String()
{
diff --git a/src/System.Private.Xml/src/System.Private.Xml.csproj b/src/System.Private.Xml/src/System.Private.Xml.csproj
index 89f12d9ca6..27dbcb2546 100644
--- a/src/System.Private.Xml/src/System.Private.Xml.csproj
+++ b/src/System.Private.Xml/src/System.Private.Xml.csproj
@@ -742,6 +742,7 @@
</ItemGroup>
<ItemGroup Condition="'$(TargetsUnix)'=='true'">
<Compile Include="System\Xml\Xsl\Runtime\XmlCollation.Unix.cs" />
+ <Compile Include="System\Xml\Core\XmlTextReaderImpl.Unix.cs" />
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.Unix.cs b/src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.Unix.cs
new file mode 100644
index 0000000000..96e32fd9d3
--- /dev/null
+++ b/src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.Unix.cs
@@ -0,0 +1,30 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace System.Xml
+{
+ internal partial class XmlTextReaderImpl
+ {
+ static partial void ConvertAbsoluteUnixPathToAbsoluteUri(ref string url, XmlResolver resolver)
+ {
+ // new Uri(uri, UriKind.RelativeOrAbsolute) returns a Relative Uri for absolute unix paths (e.g. /tmp).
+ // We convert the native unix path to a 'file://' uri string to make it an Absolute Uri.
+ if (url != null && url.Length > 0 && url[0] == '/')
+ {
+ if (resolver != null)
+ {
+ Uri uri = resolver.ResolveUri(null, url);
+ if (uri.IsFile)
+ {
+ url = uri.ToString();
+ }
+ }
+ else
+ {
+ url = new Uri(url).ToString();
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.cs b/src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.cs
index dd909fce57..ea72797ef0 100644
--- a/src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.cs
+++ b/src/System.Private.Xml/src/System/Xml/Core/XmlTextReaderImpl.cs
@@ -452,6 +452,7 @@ namespace System.Xml
}
internal XmlTextReaderImpl(string url, Stream input, XmlNameTable nt) : this(nt)
{
+ ConvertAbsoluteUnixPathToAbsoluteUri(ref url, resolver: null);
_namespaceManager = new XmlNamespaceManager(nt);
if (url == null || url.Length == 0)
{
@@ -478,6 +479,7 @@ namespace System.Xml
}
internal XmlTextReaderImpl(string url, TextReader input, XmlNameTable nt) : this(nt)
{
+ ConvertAbsoluteUnixPathToAbsoluteUri(ref url, resolver: null);
_namespaceManager = new XmlNamespaceManager(nt);
_reportedBaseUri = (url != null) ? url : string.Empty;
InitTextReaderInput(_reportedBaseUri, input);
@@ -670,6 +672,7 @@ namespace System.Xml
XmlParserContext context, bool closeInput)
: this(settings.GetXmlResolver(), settings, context)
{
+ ConvertAbsoluteUnixPathToAbsoluteUri(ref baseUriStr, settings.GetXmlResolver());
// get BaseUri from XmlParserContext
if (context != null)
{
@@ -735,6 +738,7 @@ namespace System.Xml
internal XmlTextReaderImpl(TextReader input, XmlReaderSettings settings, string baseUriStr, XmlParserContext context)
: this(settings.GetXmlResolver(), settings, context)
{
+ ConvertAbsoluteUnixPathToAbsoluteUri(ref baseUriStr, settings.GetXmlResolver());
// get BaseUri from XmlParserContext
if (context != null)
{
@@ -9811,6 +9815,8 @@ namespace System.Xml
{
Buffer.BlockCopy(src, srcOffset, dst, dstOffset, count);
}
+
+ static partial void ConvertAbsoluteUnixPathToAbsoluteUri(ref string url, XmlResolver resolver);
}
}
diff --git a/src/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaProviderAttribute.cs b/src/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaProviderAttribute.cs
index 66b537723b..8b2f4e50c6 100644
--- a/src/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaProviderAttribute.cs
+++ b/src/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaProviderAttribute.cs
@@ -2,11 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-#if XMLSERIALIZERGENERATOR
-namespace Microsoft.XmlSerializer.Generator
-#else
namespace System.Xml.Serialization
-#endif
{
using System;
using System.Xml.Schema;
diff --git a/src/System.Private.Xml/src/System/Xml/Serialization/XmlTextAttribute.cs b/src/System.Private.Xml/src/System/Xml/Serialization/XmlTextAttribute.cs
index 64b2cf1f62..a3b4064df1 100644
--- a/src/System.Private.Xml/src/System/Xml/Serialization/XmlTextAttribute.cs
+++ b/src/System.Private.Xml/src/System/Xml/Serialization/XmlTextAttribute.cs
@@ -5,11 +5,7 @@
using System;
-#if XMLSERIALIZERGENERATOR
-namespace Microsoft.XmlSerializer.Generator
-#else
namespace System.Xml.Serialization
-#endif
{
/// <devdoc>
/// <para>[To be supplied.]</para>
diff --git a/src/System.Private.Xml/src/System/Xml/Serialization/XmlTypeAttribute.cs b/src/System.Private.Xml/src/System/Xml/Serialization/XmlTypeAttribute.cs
index b0494116b5..205b4ca4fb 100644
--- a/src/System.Private.Xml/src/System/Xml/Serialization/XmlTypeAttribute.cs
+++ b/src/System.Private.Xml/src/System/Xml/Serialization/XmlTypeAttribute.cs
@@ -5,11 +5,7 @@
using System;
-#if XMLSERIALIZERGENERATOR
-namespace Microsoft.XmlSerializer.Generator
-#else
namespace System.Xml.Serialization
-#endif
{
/// <devdoc>
/// <para>[To be supplied.]</para>
diff --git a/src/System.Private.Xml/tests/XmlReader/Tests/BaseUriTests.cs b/src/System.Private.Xml/tests/XmlReader/Tests/BaseUriTests.cs
new file mode 100644
index 0000000000..7a159155dd
--- /dev/null
+++ b/src/System.Private.Xml/tests/XmlReader/Tests/BaseUriTests.cs
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Xunit;
+
+namespace System.Xml.Tests
+{
+ public class BaseUriTests : FileCleanupTestBase
+ {
+ private const string DummyXml = @"<?xml version=""1.0""?>";
+
+ public static IEnumerable<object[]> GetXmlReaderUrlCreateMethods()
+ {
+ yield return new [] { new Func<string, XmlReader>(s => XmlReader.Create(s)) };
+ yield return new [] { new Func<string, XmlReader>(s => XmlReader.Create(File.OpenRead(s), new XmlReaderSettings { CloseInput = true }, s)) };
+ yield return new [] { new Func<string, XmlReader>(s => XmlReader.Create(new StreamReader(File.OpenRead(s)), new XmlReaderSettings { CloseInput = true }, s)) };
+ yield return new [] { new Func<string, XmlReader>(s => new XmlTextReader(s)) };
+ yield return new [] { new Func<string, XmlReader>(s => new XmlTextReader(s, File.OpenRead(s))) };
+ yield return new [] { new Func<string, XmlReader>(s => new XmlTextReader(s, new StreamReader(File.OpenRead(s)))) };
+ }
+
+ [Theory]
+ [MemberData(nameof(GetXmlReaderUrlCreateMethods))]
+ public void CreateWithAbsolutePathGivesAbsoluteBaseUri(Func<string, XmlReader> factory)
+ {
+ string tempPath = GetTestFilePath();
+ File.WriteAllText(tempPath, DummyXml);
+ using (XmlReader reader = factory(tempPath))
+ {
+ Assert.True(new Uri(reader.BaseURI).IsAbsoluteUri);
+ }
+ }
+ }
+}
diff --git a/src/System.Private.Xml/tests/XmlReader/Tests/System.Xml.RW.XmlReader.Tests.csproj b/src/System.Private.Xml/tests/XmlReader/Tests/System.Xml.RW.XmlReader.Tests.csproj
index 42bc4b2742..f91333bbd8 100644
--- a/src/System.Private.Xml/tests/XmlReader/Tests/System.Xml.RW.XmlReader.Tests.csproj
+++ b/src/System.Private.Xml/tests/XmlReader/Tests/System.Xml.RW.XmlReader.Tests.csproj
@@ -12,6 +12,7 @@
<ItemGroup>
<Compile Include="AsyncReaderLateInitTests.cs" />
<Compile Include="DisposeTests.cs" />
+ <Compile Include="BaseUriTests.cs" />
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_Compile.cs b/src/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_Compile.cs
index 6aeda32446..b360f5bd19 100644
--- a/src/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_Compile.cs
+++ b/src/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_Compile.cs
@@ -137,7 +137,7 @@ namespace System.Xml.Tests
ss.Add(null, XmlReader.Create(new StringReader(cham)));
// TempDirectory path must end with a DirectorySeratorChar, otherwise it will throw in the Xml validation.
var settings = new XmlReaderSettings() { XmlResolver = new XmlUrlResolver() };
- ss.Add(null, XmlReader.Create(new StringReader(main), settings, ToAbsoluteUri(tempDirectoryPath)));
+ ss.Add(null, XmlReader.Create(new StringReader(main), settings, tempDirectoryPath));
ss.Compile();
Assert.Equal(2, ss.Count);
@@ -156,12 +156,5 @@ namespace System.Xml.Tests
Assert.Equal(0, errorCount);
}
}
-
- // This is a workaround for https://github.com/dotnet/corefx/issues/20046
- private static string ToAbsoluteUri(string path)
- {
- Uri uri = new Uri(path, UriKind.Absolute);
- return uri.ToString();
- }
}
}
diff --git a/src/System.Private.Xml/tests/XmlSchema/XmlSchemaValidatorApi/ValidateMisc.cs b/src/System.Private.Xml/tests/XmlSchema/XmlSchemaValidatorApi/ValidateMisc.cs
index 835653ebf4..31e44a8e33 100644
--- a/src/System.Private.Xml/tests/XmlSchema/XmlSchemaValidatorApi/ValidateMisc.cs
+++ b/src/System.Private.Xml/tests/XmlSchema/XmlSchemaValidatorApi/ValidateMisc.cs
@@ -904,7 +904,7 @@ namespace System.Xml.Tests
settings.XmlResolver = new XmlUrlResolver();
settings.Schemas.XmlResolver = new XmlUrlResolver();
// TempDirectory path must end with a DirectorySeratorChar, otherwise it will throw in the Xml validation.
- settings.Schemas.Add("mainschema", XmlReader.Create(new StringReader(xsd), null, EnsureTrailingSlash(ToAbsoluteUri(tempDirectory.Path))));
+ settings.Schemas.Add("mainschema", XmlReader.Create(new StringReader(xsd), null, EnsureTrailingSlash(tempDirectory.Path)));
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create(new StringReader(xml), settings);
XmlDocument doc = new XmlDocument();
@@ -930,7 +930,7 @@ namespace System.Xml.Tests
settings.XmlResolver = new XmlUrlResolver();
settings.Schemas.XmlResolver = new XmlUrlResolver();
// TempDirectory path must end with a DirectorySeratorChar, otherwise it will throw in the Xml validation.
- settings.Schemas.Add("mainschema", XmlReader.Create(new StringReader(xsd), null, EnsureTrailingSlash(ToAbsoluteUri(tempDirectory.Path))));
+ settings.Schemas.Add("mainschema", XmlReader.Create(new StringReader(xsd), null, EnsureTrailingSlash(tempDirectory.Path)));
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create(new StringReader(xml), settings);
XmlDocument doc = new XmlDocument();
@@ -954,13 +954,6 @@ namespace System.Xml.Tests
path + Path.DirectorySeparatorChar;
}
- // This is a workaround for https://github.com/dotnet/corefx/issues/20046
- private static string ToAbsoluteUri(string path)
- {
- Uri uri = new Uri(path, UriKind.Absolute);
- return uri.ToString();
- }
-
private static string xsd445844 = @"<?xml version='1.0' encoding='utf-8' ?>
<xs:schema xmlns:mstns='http://tempuri.org/XMLSchema.xsd' elementFormDefault='qualified' targetNamespace='http://tempuri.org/XMLSchema.xsd' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:complexType name='a'>
diff --git a/src/System.Private.Xml/tests/XmlSerializer/Resources/System.Xml.XmlSerializer.Tests.rd.xml b/src/System.Private.Xml/tests/XmlSerializer/Resources/System.Xml.XmlSerializer.Tests.rd.xml
new file mode 100644
index 0000000000..337a120980
--- /dev/null
+++ b/src/System.Private.Xml/tests/XmlSerializer/Resources/System.Xml.XmlSerializer.Tests.rd.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
+ <Library Name="System.Xml.XmlSerializer.Tests">
+ <Assembly Name="System.Xml.XmlSerializer.Tests">
+ <Namespace Name="SerializationTypes">
+ <Type Name="TypeWith2DArrayProperty1" XmlSerializer="Excluded" />
+ </Namespace>
+ </Assembly>
+ </Library>
+</Directives>
diff --git a/src/System.Private.Xml/tests/XmlSerializer/System.Xml.XmlSerializer.Tests.csproj b/src/System.Private.Xml/tests/XmlSerializer/System.Xml.XmlSerializer.Tests.csproj
index 46923e4eb6..b3bc738f4e 100644
--- a/src/System.Private.Xml/tests/XmlSerializer/System.Xml.XmlSerializer.Tests.csproj
+++ b/src/System.Private.Xml/tests/XmlSerializer/System.Xml.XmlSerializer.Tests.csproj
@@ -18,5 +18,8 @@
<Link>CommonTest\System\PlatformDetection.cs</Link>
</Compile>
</ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Resources\$(AssemblyName).rd.xml" />
+ </ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs b/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs
index 884c57aea4..e248c9e595 100644
--- a/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs
+++ b/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs
@@ -1817,7 +1817,6 @@ string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
}
[Fact]
- [ActiveIssue("dotnet/corefx #19897", TargetFrameworkMonikers.Uap)]
public static void Xml_TypeWithTwoDimensionalArrayProperty1()
{
SimpleType[][] simpleType2D = GetObjectwith2DArrayOfSimpleType();
diff --git a/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/System.Xml.Xsl.XslCompiledTransformApi.Tests.csproj b/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/System.Xml.Xsl.XslCompiledTransformApi.Tests.csproj
index abe7326552..673ac18de7 100644
--- a/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/System.Xml.Xsl.XslCompiledTransformApi.Tests.csproj
+++ b/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/System.Xml.Xsl.XslCompiledTransformApi.Tests.csproj
@@ -4,11 +4,11 @@
<PropertyGroup>
<ProjectGuid>{B01E2AE1-1B52-4518-B32E-016070356A7F}</ProjectGuid>
</PropertyGroup>
- <!-- Default configurations to help VS understand the configurations -->
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Release|AnyCPU'" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Release|AnyCPU'" />
+ <!-- Default configurations to help VS understand the configurations -->
<ItemGroup Condition="'$(TargetGroup)' == 'netcoreapp'">
<Compile Include="XslCompiledTransform.cs" />
</ItemGroup>
diff --git a/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XslTransformMultith.cs b/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XslTransformMultith.cs
index a15b046c08..719c96e0d4 100644
--- a/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XslTransformMultith.cs
+++ b/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XslTransformMultith.cs
@@ -29,7 +29,7 @@ namespace System.Xml.Tests
public new void Init(object objParam)
{
xsltSameInstance = new XslCompiledTransform();
- _strPath = Path.Combine(@"TestFiles\", FilePathUtil.GetTestDataPath(), @"XsltApiV2\");
+ _strPath = Path.Combine("TestFiles", FilePathUtil.GetTestDataPath(), "XsltApiV2");
return;
}
}
@@ -48,7 +48,7 @@ namespace System.Xml.Tests
public void Load(string _strXslFile, string _strXmlFile)
{
- _xrData = XmlReader.Create(_strPath + _strXmlFile);
+ _xrData = XmlReader.Create(Path.Combine(_strPath, _strXmlFile));
_xd = new XPathDocument(_xrData, XmlSpace.Preserve);
_xrData.Dispose();
@@ -56,7 +56,7 @@ namespace System.Xml.Tests
#pragma warning disable 0618
xrs.ProhibitDtd = false;
#pragma warning restore 0618
- XmlReader xrTemp = XmlReader.Create(_strPath + _strXslFile, xrs);
+ XmlReader xrTemp = XmlReader.Create(Path.Combine(_strPath, _strXslFile), xrs);
xsltSameInstance.Load(xrTemp);
}
@@ -362,7 +362,7 @@ namespace System.Xml.Tests
public void Load(string _strXslFile, string _strXmlFile)
{
- _xrData = XmlReader.Create(_strPath + _strXmlFile);
+ _xrData = XmlReader.Create(Path.Combine(_strPath, _strXmlFile));
_xd = new XPathDocument(_xrData, XmlSpace.Preserve);
_xrData.Dispose();
@@ -370,7 +370,7 @@ namespace System.Xml.Tests
#pragma warning disable 0618
xrs.ProhibitDtd = false;
#pragma warning restore 0618
- XmlReader xrTemp = XmlReader.Create(_strPath + _strXslFile, xrs);
+ XmlReader xrTemp = XmlReader.Create(Path.Combine(_strPath, _strXslFile), xrs);
xsltSameInstance.Load(xrTemp);
}
diff --git a/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XsltArgumentListMultith.cs b/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XsltArgumentListMultith.cs
index 1df71c169d..9a94fab58c 100644
--- a/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XsltArgumentListMultith.cs
+++ b/src/System.Private.Xml/tests/Xslt/XslCompiledTransformApi/XsltArgumentListMultith.cs
@@ -29,7 +29,7 @@ namespace System.Xml.Tests
public new void Init(object objParam)
{
// Get parameter info
- _strPath = Path.Combine(@"TestFiles\", FilePathUtil.GetTestDataPath(), @"XsltApiV2\");
+ _strPath = Path.Combine("TestFiles", FilePathUtil.GetTestDataPath(), "XsltApiV2");
xsltArg1 = new XsltArgumentList();
MyObject obj1 = new MyObject(1, _output);
@@ -246,9 +246,9 @@ namespace System.Xml.Tests
string _strXmlFile = ((object[])args)[2].ToString();
if (_strXslFile.Substring(0, 5) != "http:")
- _strXslFile = _strPath + _strXslFile;
+ _strXslFile = Path.Combine(_strPath, _strXslFile);
if (_strXmlFile.Substring(0, 5) != "http:")
- _strXmlFile = _strPath + _strXmlFile;
+ _strXmlFile = Path.Combine(_strPath, _strXmlFile);
XmlReader xrData = XmlReader.Create(_strXmlFile);
XPathDocument xd = new XPathDocument(xrData, XmlSpace.Preserve);
diff --git a/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTArgumentList.cs b/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTArgumentList.cs
index 26d1078893..603863a9f0 100644
--- a/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTArgumentList.cs
+++ b/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTArgumentList.cs
@@ -20,9 +20,14 @@ namespace System.Xml.Tests
public class CArgIntegrity : XsltApiTestCaseBase
{
private ITestOutputHelper _output;
+ private string _xslFile;
+ private string _xmlFile;
+
public CArgIntegrity(ITestOutputHelper output) : base(output)
{
_output = output;
+ _xslFile = $"{GetTestFilePath()}.xsl";
+ _xmlFile = $"{GetTestFilePath()}.xml";
}
//[Variation(Desc = "Basic Verification Test", Pri = 0)]
@@ -51,7 +56,7 @@ namespace System.Xml.Tests
</xsl:template>
</xsl:stylesheet>";
- private static void WriteFiles(string input, string output)
+ private void WriteFiles(string input, string output)
{
using (XmlWriter w = XmlWriter.Create(output))
{
@@ -62,10 +67,10 @@ namespace System.Xml.Tests
}
}
- private static void WriteXmlAndXslFiles()
+ private void WriteXmlAndXslFiles()
{
- WriteFiles(s_typeXml, "type.xml");
- WriteFiles(s_typeXsl, "type.xsl");
+ WriteFiles(s_typeXml, _xmlFile);
+ WriteFiles(s_typeXsl, _xslFile);
}
//[Variation(Desc = "Tuple.XsltArgumentList.AddParam/AddExtensionObject", Param = 1)]
@@ -94,13 +99,13 @@ namespace System.Xml.Tests
#pragma warning disable 0618
XslTransform xslt = new XslTransform();
#pragma warning restore 0618
- xslt.Load("type.xsl");
+ xslt.Load(_xslFile);
XsltArgumentList xslArg = new XsltArgumentList();
xslArg.AddParam("param", "", t);
xslArg.AddExtensionObject("", t);
- XPathDocument xpathDom = new XPathDocument("type.xml");
+ XPathDocument xpathDom = new XPathDocument(_xmlFile);
using (StringWriter sw = new StringWriter())
{
xslt.Transform(xpathDom, xslArg, sw);
diff --git a/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTransform.cs b/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTransform.cs
index 2048d5bc31..1dbbacdb4f 100644
--- a/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTransform.cs
+++ b/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXslTransform.cs
@@ -2759,7 +2759,7 @@ namespace System.Xml.Tests
{
if (LoadXSL("XmlResolver_Main.xsl", inputType, readerType) == 1)
{
- CallTransform(xslt, szFullFilename, "out.xml", null);
+ CallTransform(xslt, szFullFilename, _strOutFile, null);
VerifyResult(expected);
return;
}
@@ -2786,7 +2786,7 @@ namespace System.Xml.Tests
if (LoadXSL("xmlResolver_document_function.xsl", inputType, readerType) == 1)
{
- CallTransform(xslt, szFullFilename, "out.xml", null);
+ CallTransform(xslt, szFullFilename, _strOutFile, null);
VerifyResult(expected);
return;
}
@@ -2920,7 +2920,7 @@ param2 (correct answer is 'local-param2-arg'): local-param2-arg
if ((LoadXSL("Bug109644.xsl", inputType, readerType) == 1) && (Transform("foo.xml", transformType, docType) == 1))
{
- Assert.Equal(expected, File.ReadAllText("out.xml"));
+ Assert.Equal(expected, File.ReadAllText(_strOutFile));
return;
}
else
diff --git a/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXsltArgumentListMultith.cs b/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXsltArgumentListMultith.cs
index 57e1f1e5bf..b711520fcb 100644
--- a/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXsltArgumentListMultith.cs
+++ b/src/System.Private.Xml/tests/Xslt/XslTransformApi/CXsltArgumentListMultith.cs
@@ -31,7 +31,7 @@ namespace System.Xml.Tests
public new void Init(object objParam)
{
// Get parameter info
- _strPath = Path.Combine(@"TestFiles\", FilePathUtil.GetTestDataPath(), @"XsltApi\");
+ _strPath = Path.Combine("TestFiles", FilePathUtil.GetTestDataPath(), "XsltApi");
xsltArg1 = new XsltArgumentList();
diff --git a/src/System.Private.Xml/tests/Xslt/XslTransformApi/XSLTransform.cs b/src/System.Private.Xml/tests/Xslt/XslTransformApi/XSLTransform.cs
index c26bf1bbf1..37f873d0bd 100644
--- a/src/System.Private.Xml/tests/Xslt/XslTransformApi/XSLTransform.cs
+++ b/src/System.Private.Xml/tests/Xslt/XslTransformApi/XSLTransform.cs
@@ -46,7 +46,7 @@ namespace System.Xml.Tests
// Base class for test cases
//
////////////////////////////////////////////////////////////////
- public class XsltApiTestCaseBase
+ public class XsltApiTestCaseBase : FileCleanupTestBase
{
// Generic data for all derived test cases
public String szXslNS = "http://www.w3.org/1999/XSL/Transform";
@@ -66,7 +66,7 @@ namespace System.Xml.Tests
private bool _fTrace; // Should we write out the results of the transform?
// Other global variables
- protected string _strOutFile = "out.xml"; // File to create when using write transforms
+ protected string _strOutFile; // File to create when using write transforms
#pragma warning disable 0618
protected XslTransform xslt; // Main XslTransform instance
@@ -83,6 +83,7 @@ namespace System.Xml.Tests
// Make sure that we don't cache the value of the switch to enable testing
AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
_output = output;
+ _strOutFile = GetTestFilePath();
this.Init(null);
}
diff --git a/src/System.Runtime.Extensions/System.Runtime.Extensions.sln b/src/System.Runtime.Extensions/System.Runtime.Extensions.sln
index 81b5e18926..8f39f620ce 100644
--- a/src/System.Runtime.Extensions/System.Runtime.Extensions.sln
+++ b/src/System.Runtime.Extensions/System.Runtime.Extensions.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26228.9
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Runtime.Extensions.Tests", "tests\System.Runtime.Extensions.Tests.csproj", "{6C314C9B-3D28-4B05-9B4C-B57A00A9B3B9}"
ProjectSection(ProjectDependencies) = postProject
@@ -89,6 +89,7 @@ Global
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{6C314C9B-3D28-4B05-9B4C-B57A00A9B3B9} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
+ {E60AFAE8-2EA7-471C-9E24-52A99453B26B} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{978FA427-F87B-46E2-B276-F5B727C50A01} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{24BCEC6B-B9D2-47BC-9D66-725BD6B526FA} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
{C44B33E3-F89F-40B9-B353-D380C1524988} = {1A2F9F4A-A032-433E-B914-ADD5992BB178}
diff --git a/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 83392d90a2..0000000000
--- a/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,8 +0,0 @@
-kernel32.dll!ExpandEnvironmentStringsW
-kernel32.dll!GetComputerNameW
-kernel32.dll!GetLogicalDrives
-kernel32.dll!GetSystemDirectoryW
-kernel32.dll!GetVersionExW
-kernel32.dll!IsWow64Process
-secur32.dll!GetUserNameExW
-shell32.dll!SHGetKnownFolderPath \ No newline at end of file
diff --git a/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uap b/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
new file mode 100644
index 0000000000..b6a3730d5f
--- /dev/null
+++ b/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -0,0 +1,2 @@
+kernel32.dll!GetSystemDirectoryW
+shell32.dll!SHGetKnownFolderPath \ No newline at end of file
diff --git a/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uapaot b/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uapaot
new file mode 100644
index 0000000000..b6a3730d5f
--- /dev/null
+++ b/src/System.Runtime.Extensions/src/PinvokeAnalyzerExceptionList.analyzerdata.uapaot
@@ -0,0 +1,2 @@
+kernel32.dll!GetSystemDirectoryW
+shell32.dll!SHGetKnownFolderPath \ No newline at end of file
diff --git a/src/System.Runtime.Extensions/src/System.Runtime.Extensions.csproj b/src/System.Runtime.Extensions/src/System.Runtime.Extensions.csproj
index 3ff71dbe1e..20a2cea4dc 100644
--- a/src/System.Runtime.Extensions/src/System.Runtime.Extensions.csproj
+++ b/src/System.Runtime.Extensions/src/System.Runtime.Extensions.csproj
@@ -160,7 +160,7 @@
<Compile Include="$(CommonPath)\Interop\Windows\kernel32\Interop.SYSTEM_INFO.cs">
<Link>Common\Interop\Windows\kernel32\Interop.SYSTEM_INFO.cs</Link>
</Compile>
- <Compile Include="$(CommonPath)\Interop\Windows\secur32\Interop.GetUserNameExW.cs">
+ <Compile Include="$(CommonPath)\Interop\Windows\secur32\Interop.GetUserNameExW.cs" Condition="'$(TargetGroup)' != 'uapaot' and '$(TargetGroup)' != 'uap'" >
<Link>Common\Interop\Windows\secur32\Interop.GetUserNameExW.cs</Link>
</Compile>
<Compile Include="$(CommonPath)\Interop\Windows\shell32\Interop.SHGetKnownFolderPath.cs">
diff --git a/src/System.Runtime.Extensions/src/System/Collections/ArrayList.cs b/src/System.Runtime.Extensions/src/System/Collections/ArrayList.cs
index d997e1a4c4..54f9099835 100644
--- a/src/System.Runtime.Extensions/src/System/Collections/ArrayList.cs
+++ b/src/System.Runtime.Extensions/src/System/Collections/ArrayList.cs
@@ -39,10 +39,10 @@ namespace System.Collections
#endif
public class ArrayList : IList, ICloneable
{
- private Object[] _items;
+ private Object[] _items; // Do not rename (binary serialization)
[ContractPublicPropertyName("Count")]
- private int _size;
- private int _version;
+ private int _size; // Do not rename (binary serialization)
+ private int _version; // Do not rename (binary serialization)
[NonSerialized]
private Object _syncRoot;
diff --git a/src/System.Runtime.Extensions/src/System/Collections/Comparer.cs b/src/System.Runtime.Extensions/src/System/Collections/Comparer.cs
index 7f93db3a7c..12a04d4391 100644
--- a/src/System.Runtime.Extensions/src/System/Collections/Comparer.cs
+++ b/src/System.Runtime.Extensions/src/System/Collections/Comparer.cs
@@ -19,7 +19,7 @@ namespace System.Collections
{
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public sealed class Comparer : IComparer, ISerializable
{
@@ -27,7 +27,7 @@ namespace System.Collections
public static readonly Comparer Default = new Comparer(CultureInfo.CurrentCulture);
public static readonly Comparer DefaultInvariant = new Comparer(CultureInfo.InvariantCulture);
- private const string CompareInfoName = "CompareInfo";
+ private const string CompareInfoName = "CompareInfo"; // Do not rename (binary serialization)
public Comparer(CultureInfo culture)
{
diff --git a/src/System.Runtime.Extensions/src/System/Collections/Hashtable.cs b/src/System.Runtime.Extensions/src/System/Collections/Hashtable.cs
index 68ac41ce7c..e921e34ae6 100644
--- a/src/System.Runtime.Extensions/src/System/Collections/Hashtable.cs
+++ b/src/System.Runtime.Extensions/src/System/Collections/Hashtable.cs
@@ -58,7 +58,7 @@ namespace System.Collections
[DebuggerDisplay("Count = {Count}")]
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public class Hashtable : IDictionary, ISerializable, IDeserializationCallback, ICloneable
{
@@ -116,14 +116,14 @@ namespace System.Collections
internal const Int32 HashPrime = 101;
private const Int32 InitialSize = 3;
- private const String LoadFactorName = "LoadFactor";
- private const String VersionName = "Version";
- private const String ComparerName = "Comparer";
- private const String HashCodeProviderName = "HashCodeProvider";
- private const String HashSizeName = "HashSize"; // Must save buckets.Length
- private const String KeysName = "Keys";
- private const String ValuesName = "Values";
- private const String KeyComparerName = "KeyComparer";
+ private const String LoadFactorName = "LoadFactor"; // Do not rename (binary serialization)
+ private const String VersionName = "Version"; // Do not rename (binary serialization)
+ private const String ComparerName = "Comparer"; // Do not rename (binary serialization)
+ private const String HashCodeProviderName = "HashCodeProvider"; // Do not rename (binary serialization)
+ private const String HashSizeName = "HashSize"; // Must save buckets.Length. Do not rename (binary serialization)
+ private const String KeysName = "Keys"; // Do not rename (binary serialization)
+ private const String ValuesName = "Values"; // Do not rename (binary serialization)
+ private const String KeyComparerName = "KeyComparer"; // Do not rename (binary serialization)
// Deleted entries have their key set to buckets
diff --git a/src/System.Runtime.Extensions/src/System/Collections/IHashCodeProvider.cs b/src/System.Runtime.Extensions/src/System/Collections/IHashCodeProvider.cs
index 46ee88a54a..70316f10ef 100644
--- a/src/System.Runtime.Extensions/src/System/Collections/IHashCodeProvider.cs
+++ b/src/System.Runtime.Extensions/src/System/Collections/IHashCodeProvider.cs
@@ -9,6 +9,7 @@ namespace System.Collections
/// GetHashCode() function on Objects, providing their own hash function.
/// </summary>
[Obsolete("Please use IEqualityComparer instead.")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
public interface IHashCodeProvider
{
/// <summary>Returns a hash code for the given object.</summary>
diff --git a/src/System.Runtime.Extensions/tests/System.Runtime.Extensions.Tests.csproj b/src/System.Runtime.Extensions/tests/System.Runtime.Extensions.Tests.csproj
index b6f2852073..08dc833192 100644
--- a/src/System.Runtime.Extensions/tests/System.Runtime.Extensions.Tests.csproj
+++ b/src/System.Runtime.Extensions/tests/System.Runtime.Extensions.Tests.csproj
@@ -90,12 +90,6 @@
<Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\IO\PathFeatures.cs">
<Link>Common\System\IO\PathFeatures.cs</Link>
</Compile>
diff --git a/src/System.Runtime.Extensions/tests/System/Environment.Exit.cs b/src/System.Runtime.Extensions/tests/System/Environment.Exit.cs
index 29af52ccd7..0852b97878 100644
--- a/src/System.Runtime.Extensions/tests/System/Environment.Exit.cs
+++ b/src/System.Runtime.Extensions/tests/System/Environment.Exit.cs
@@ -60,7 +60,7 @@ namespace System.Tests
const string AppName = "VoidMainWithExitCodeApp.exe";
var psi = new ProcessStartInfo();
- if (IsFullFramework || IsNetNative)
+ if (PlatformDetection.IsFullFramework || PlatformDetection.IsNetNative)
{
psi.FileName = AppName;
psi.Arguments = $"{expectedExitCode} {mode}";
diff --git a/src/System.Runtime.Extensions/tests/System/Environment.GetCommandLineArgs.cs b/src/System.Runtime.Extensions/tests/System/Environment.GetCommandLineArgs.cs
index 014edab8d7..713555d0b2 100644
--- a/src/System.Runtime.Extensions/tests/System/Environment.GetCommandLineArgs.cs
+++ b/src/System.Runtime.Extensions/tests/System/Environment.GetCommandLineArgs.cs
@@ -8,7 +8,6 @@ using Xunit;
namespace System.Tests
{
- [ActiveIssue("https://github.com/dotnet/corert/issues/3743 - Environment.GetCommandLineArgs() returning null on .Net Native", TargetFrameworkMonikers.UapAot)]
public class GetCommandLineArgs : RemoteExecutorTestBase
{
[Fact]
diff --git a/src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 98ae555040..0000000000
--- a/src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1 +0,0 @@
-ntdll.dll!RtlGetVersion
diff --git a/src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzer_win8-wpa81-APIs.txt b/src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzer_win8-wpa81-APIs.txt
deleted file mode 100644
index 334e3b3783..0000000000
--- a/src/System.Runtime.InteropServices.RuntimeInformation/src/PinvokeAnalyzer_win8-wpa81-APIs.txt
+++ /dev/null
@@ -1 +0,0 @@
-api-ms-win-core-sysinfo-l1-2-0.dll!GetNativeSystemInfo \ No newline at end of file
diff --git a/src/System.Runtime.InteropServices.RuntimeInformation/src/System.Runtime.InteropServices.RuntimeInformation.csproj b/src/System.Runtime.InteropServices.RuntimeInformation/src/System.Runtime.InteropServices.RuntimeInformation.csproj
index bc7e1a012d..8a4aa14e9d 100644
--- a/src/System.Runtime.InteropServices.RuntimeInformation/src/System.Runtime.InteropServices.RuntimeInformation.csproj
+++ b/src/System.Runtime.InteropServices.RuntimeInformation/src/System.Runtime.InteropServices.RuntimeInformation.csproj
@@ -10,6 +10,7 @@
<DefineConstants Condition="'$(TargetGroup)'=='wpa81'">$(DefineConstants);wpa81</DefineConstants>
<DefineConstants Condition="'$(TargetGroup)'=='win8'">$(DefineConstants);win8</DefineConstants>
<DefineConstants Condition="'$(TargetGroup)'=='uap'">$(DefineConstants);uap</DefineConstants>
+ <DefineConstants Condition="'$(TargetGroup)'=='netstandard1.1'">$(DefineConstants);netstandard11</DefineConstants>
<GeneratePlatformNotSupportedAssemblyMessage Condition="'$(TargetGroup)'=='netstandard1.1' AND '$(OSGroup)'=='AnyOS'">SR.PlatformNotSupported_RuntimeInformation</GeneratePlatformNotSupportedAssemblyMessage>
<!-- use netstandard1.1 refs for win8 and wpa81 -->
<RefPath Condition="'$(TargetGroup)'=='wpa81' OR '$(TargetGroup)'=='win8'">$(RefRootPath)/netstandard1.1</RefPath>
@@ -65,7 +66,7 @@
</Compile>
<Compile Include="System\Runtime\InteropServices\RuntimeInformation\RuntimeInformation.Unix.cs" />
</ItemGroup>
- <ItemGroup Condition="'$(TargetsWindows)'=='true' And ('$(TargetGroup)' != 'win8' AND '$(TargetGroup)' != 'wpa81')">
+ <ItemGroup Condition="'$(TargetsWindows)'=='true' And ('$(TargetGroup)' != 'win8' AND '$(TargetGroup)' != 'wpa81' and '$(TargetGroup)' != 'netstandard1.1' and '$(TargetGroup)' != 'uap')">
<Compile Include="$(CommonPath)\Interop\Windows\NtDll\Interop.RtlGetVersion.cs">
<Link>Common\Interop\Windows\NtDll\Interop.RtlGetVersion.cs</Link>
</Compile>
diff --git a/src/System.Runtime.InteropServices.RuntimeInformation/src/System/Runtime/InteropServices/RuntimeInformation/RuntimeInformation.Windows.cs b/src/System.Runtime.InteropServices.RuntimeInformation/src/System/Runtime/InteropServices/RuntimeInformation/RuntimeInformation.Windows.cs
index e07cbbdd64..89a7a51eb8 100644
--- a/src/System.Runtime.InteropServices.RuntimeInformation/src/System/Runtime/InteropServices/RuntimeInformation/RuntimeInformation.Windows.cs
+++ b/src/System.Runtime.InteropServices.RuntimeInformation/src/System/Runtime/InteropServices/RuntimeInformation/RuntimeInformation.Windows.cs
@@ -25,7 +25,7 @@ namespace System.Runtime.InteropServices
{
if (null == s_osDescription)
{
-#if uap || win8
+#if uap || win8 || netstandard11 // all these are subject to WACK
s_osDescription = "Microsoft Windows";
#elif wpa81
s_osDescription = "Microsoft Windows Phone";
diff --git a/src/System.Runtime.InteropServices.RuntimeInformation/tests/DescriptionNameTests.cs b/src/System.Runtime.InteropServices.RuntimeInformation/tests/DescriptionNameTests.cs
index 2c4c2116b4..e987aed3ff 100644
--- a/src/System.Runtime.InteropServices.RuntimeInformation/tests/DescriptionNameTests.cs
+++ b/src/System.Runtime.InteropServices.RuntimeInformation/tests/DescriptionNameTests.cs
@@ -10,6 +10,22 @@ namespace System.Runtime.InteropServices.RuntimeInformationTests
public class DescriptionNameTests
{
[Fact]
+ public void DumpRuntimeInformationToConsole()
+ {
+ // Not really a test, but useful to dump to the log to
+ // sanity check that the test run or CI job
+ // was actually run on the OS that it claims to be on
+ string dvs = PlatformDetection.GetDistroVersionString();
+ string osd = RuntimeInformation.OSDescription.Trim();
+ string osv = Environment.OSVersion.ToString();
+ string osa = RuntimeInformation.OSArchitecture.ToString();
+ string pra = RuntimeInformation.ProcessArchitecture.ToString();
+ string frd = RuntimeInformation.FrameworkDescription.Trim();
+
+ Console.WriteLine($@"{dvs} OS={osd} OSVer={osv} OSArch={osa} Arch={pra} Framework={frd}");
+ }
+
+ [Fact]
[SkipOnTargetFramework(~TargetFrameworkMonikers.Netcoreapp)]
public void VerifyRuntimeDebugNameOnNetCoreApp()
{
diff --git a/src/System.Runtime.InteropServices.RuntimeInformation/tests/System.Runtime.InteropServices.RuntimeInformation.Tests.csproj b/src/System.Runtime.InteropServices.RuntimeInformation/tests/System.Runtime.InteropServices.RuntimeInformation.Tests.csproj
index e669059993..760bafe99d 100644
--- a/src/System.Runtime.InteropServices.RuntimeInformation/tests/System.Runtime.InteropServices.RuntimeInformation.Tests.csproj
+++ b/src/System.Runtime.InteropServices.RuntimeInformation/tests/System.Runtime.InteropServices.RuntimeInformation.Tests.csproj
@@ -14,6 +14,9 @@
<Compile Include="CheckArchitectureTests.cs" />
<Compile Include="CheckPlatformTests.cs" />
<Compile Include="DescriptionNameTests.cs" />
+ <Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
+ <Link>Common\System\PlatformDetection.cs</Link>
+ </Compile>
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Runtime.InteropServices/src/Resources/Strings.resx b/src/System.Runtime.InteropServices/src/Resources/Strings.resx
index 0fea87ef77..3fe80de455 100644
--- a/src/System.Runtime.InteropServices/src/Resources/Strings.resx
+++ b/src/System.Runtime.InteropServices/src/Resources/Strings.resx
@@ -67,4 +67,13 @@
<data name="Arg_InvalidThreshold" xml:space="preserve">
<value>maximumThreshold cannot be less than initialThreshold.</value>
</data>
+ <data name="InvalidOperation_NoComEventInterfaceAttribute" xml:space="preserve">
+ <value>Event invocation for COM objects requires the declaring interface of the event to be attributed with ComEventInterfaceAttribute.</value>
+ </data>
+ <data name="AmbiguousMatch_MultipleEventInterfaceAttributes" xml:space="preserve">
+ <value>More than one ComEventInterfaceAttribute was found on the declaring interface of the event.</value>
+ </data>
+ <data name="InvalidOperation_NoDispIdAttribute" xml:space="preserve">
+ <value>Event invocation for COM objects requires event to be attributed with DispIdAttribute.</value>
+ </data>
</root> \ No newline at end of file
diff --git a/src/System.Runtime.InteropServices/src/System.Runtime.InteropServices.csproj b/src/System.Runtime.InteropServices/src/System.Runtime.InteropServices.csproj
index fab1983a37..53ade3a076 100644
--- a/src/System.Runtime.InteropServices/src/System.Runtime.InteropServices.csproj
+++ b/src/System.Runtime.InteropServices/src/System.Runtime.InteropServices.csproj
@@ -23,20 +23,20 @@
<Compile Include="System\Runtime\InteropServices\Attributes.cs" />
<Compile Include="System\Runtime\InteropServices\ComAwareEventInfo.cs" />
<Compile Include="System\Runtime\InteropServices\ComEventInterfaceAttribute.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
- <Compile Include="System\Runtime\InteropServices\DefaultParameterValueAttribute.cs" />
- <Compile Include="System\Runtime\InteropServices\HandleCollector.cs" />
+ <Compile Include="System\Runtime\InteropServices\DefaultParameterValueAttribute.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
+ <Compile Include="System\Runtime\InteropServices\HandleCollector.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
<Compile Include="System\Runtime\InteropServices\RuntimeEnvironment.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\advf.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\datadir.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\dvaspect.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\formatetc.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\IAdviseSink.cs" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\advf.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\datadir.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\dvaspect.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\formatetc.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\IAdviseSink.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
<Compile Include="System\Runtime\InteropServices\ComTypes\IDataObject.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\IEnumFormatETC.cs" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\IEnumFormatETC.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
<Compile Include="System\Runtime\InteropServices\ComTypes\IEnumSTATDATA.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\statdata.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\stgmedium.cs" />
- <Compile Include="System\Runtime\InteropServices\ComTypes\tymed.cs" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\statdata.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\stgmedium.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
+ <Compile Include="System\Runtime\InteropServices\ComTypes\tymed.cs" Condition="'$(TargetGroup)' != 'uapaot'" />
<Compile Include="System\Runtime\InteropServices\AssemblyRegistrationFlags.cs" />
<Compile Include="System\Runtime\InteropServices\ExporterEventKind.cs" />
<Compile Include="System\Runtime\InteropServices\RegistrationClassContext.cs" />
diff --git a/src/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/Attributes.cs b/src/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/Attributes.cs
index e25fca281d..8399a70423 100644
--- a/src/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/Attributes.cs
+++ b/src/System.Runtime.InteropServices/src/System/Runtime/CompilerServices/Attributes.cs
@@ -8,15 +8,10 @@ namespace System.Runtime.CompilerServices
{
[Serializable]
[System.AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)]
- public sealed partial class IUnknownConstantAttribute : System.Runtime.CompilerServices.CustomConstantAttribute
+ public sealed partial class IUnknownConstantAttribute : CustomConstantAttribute
{
public IUnknownConstantAttribute() { }
- public override object Value
- {
- get
- {
- return new UnknownWrapper(null);
- }
- }
+
+ public override object Value => new UnknownWrapper(null);
}
}
diff --git a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/Attributes.cs b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/Attributes.cs
index af989d0742..4c52d0ca5b 100644
--- a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/Attributes.cs
+++ b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/Attributes.cs
@@ -2,27 +2,21 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
-
namespace System.Runtime.InteropServices
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Interface, Inherited = false)]
public sealed class AutomationProxyAttribute : Attribute
{
- public AutomationProxyAttribute(bool val)
- {
- Value = val;
- }
+ public AutomationProxyAttribute(bool val) => Value = val;
+
public bool Value { get; }
}
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]
public sealed class ComAliasNameAttribute : Attribute
{
- public ComAliasNameAttribute(string alias)
- {
- Value = alias;
- }
+ public ComAliasNameAttribute(string alias) => Value = alias;
+
public string Value { get; }
}
@@ -59,21 +53,19 @@ namespace System.Runtime.InteropServices
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)]
- [Obsolete("This attribute is deprecated and will be removed in a future version.", false)]
+ [Obsolete("This attribute is deprecated and will be removed in a future version.", error: false)]
public sealed class IDispatchImplAttribute : Attribute
{
- public IDispatchImplAttribute(short implType)
- {
- Value = (IDispatchImplType)implType;
- }
- public IDispatchImplAttribute(IDispatchImplType implType)
+ public IDispatchImplAttribute(short implType) : this((IDispatchImplType)implType)
{
- Value = implType;
}
+
+ public IDispatchImplAttribute(IDispatchImplType implType) => Value = implType;
+
public IDispatchImplType Value { get; }
}
- [Obsolete("The IDispatchImplAttribute is deprecated.", false)]
+ [Obsolete("The IDispatchImplAttribute is deprecated.", error: false)]
public enum IDispatchImplType
{
CompatibleImpl = 2,
@@ -84,10 +76,8 @@ namespace System.Runtime.InteropServices
[AttributeUsage(AttributeTargets.Assembly, Inherited = false)]
public sealed class ImportedFromTypeLibAttribute : Attribute
{
- public ImportedFromTypeLibAttribute(String tlbFile)
- {
- Value = tlbFile;
- }
+ public ImportedFromTypeLibAttribute(string tlbFile) => Value = tlbFile;
+
public string Value { get; }
}
@@ -117,7 +107,7 @@ namespace System.Runtime.InteropServices
public int MinorVersion { get; }
}
- [Obsolete("This attribute has been deprecated. Application Domains no longer respect Activation Context boundaries in IDispatch calls.", false)]
+ [Obsolete("This attribute has been deprecated. Application Domains no longer respect Activation Context boundaries in IDispatch calls.", error: false)]
[AttributeUsage(AttributeTargets.Assembly, Inherited = false)]
public sealed class SetWin32ContextInIDispatchAttribute : Attribute
{
@@ -129,10 +119,8 @@ namespace System.Runtime.InteropServices
[AttributeUsage(AttributeTargets.Interface, Inherited = false)]
public sealed class TypeLibImportClassAttribute : Attribute
{
- public TypeLibImportClassAttribute(Type importClass)
- {
- Value = importClass.ToString();
- }
+ public TypeLibImportClassAttribute(Type importClass) => Value = importClass.ToString();
+
public string Value { get; }
}
@@ -192,16 +180,18 @@ namespace System.Runtime.InteropServices
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Enum | AttributeTargets.Struct, Inherited = false)]
- public sealed class TypeLibTypeAttribute : Attribute
+ public sealed class TypeLibTypeAttribute : Attribute
{
public TypeLibTypeAttribute(TypeLibTypeFlags flags)
{
Value = flags;
}
+
public TypeLibTypeAttribute(short flags)
{
Value = (TypeLibTypeFlags)flags;
}
+
public TypeLibTypeFlags Value { get; }
}
@@ -212,10 +202,12 @@ namespace System.Runtime.InteropServices
{
Value = flags;
}
+
public TypeLibFuncAttribute(short flags)
{
Value = (TypeLibFuncFlags)flags;
}
+
public TypeLibFuncFlags Value { get; }
}
@@ -226,15 +218,17 @@ namespace System.Runtime.InteropServices
{
Value = flags;
}
+
public TypeLibVarAttribute(short flags)
{
Value = (TypeLibVarFlags)flags;
}
+
public TypeLibVarFlags Value { get; }
}
[AttributeUsage(AttributeTargets.Assembly, Inherited = false)]
- [System.Runtime.InteropServices.ComVisible(true)]
+ [ComVisible(true)]
public sealed class TypeLibVersionAttribute : Attribute
{
public TypeLibVersionAttribute(int major, int minor)
diff --git a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs
index f5fac0b579..dc50823bab 100644
--- a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs
+++ b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs
@@ -2,28 +2,29 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Reflection;
+using System.Security;
+
namespace System.Runtime.InteropServices
{
- [System.Security.SecuritySafeCritical]
- public class ComAwareEventInfo : System.Reflection.EventInfo
+ [SecuritySafeCritical]
+ public class ComAwareEventInfo : EventInfo
{
- private System.Reflection.EventInfo _innerEventInfo;
+ private EventInfo _innerEventInfo;
public ComAwareEventInfo(Type type, string eventName)
{
_innerEventInfo = type.GetEvent(eventName);
}
- [System.Security.SecuritySafeCritical]
+ [SecuritySafeCritical]
public override void AddEventHandler(object target, Delegate handler)
{
if (Marshal.IsComObject(target))
{
// retrieve sourceIid and dispid
- Guid sourceIid;
- int dispid;
- GetDataForComInvocation(_innerEventInfo, out sourceIid, out dispid);
- System.Runtime.InteropServices.ComEventsHelper.Combine(target, sourceIid, dispid, handler);
+ GetDataForComInvocation(_innerEventInfo, out Guid sourceIid, out int dispid);
+ ComEventsHelper.Combine(target, sourceIid, dispid, handler);
}
else
{
@@ -32,17 +33,15 @@ namespace System.Runtime.InteropServices
}
}
- [System.Security.SecuritySafeCritical]
+ [SecuritySafeCritical]
public override void RemoveEventHandler(object target, Delegate handler)
{
if (Marshal.IsComObject(target))
{
// retrieve sourceIid and dispid
- Guid sourceIid;
- int dispid;
- GetDataForComInvocation(_innerEventInfo, out sourceIid, out dispid);
+ GetDataForComInvocation(_innerEventInfo, out Guid sourceIid, out int dispid);
- System.Runtime.InteropServices.ComEventsHelper.Remove(target, sourceIid, dispid, handler);
+ ComEventsHelper.Remove(target, sourceIid, dispid, handler);
}
else
{
@@ -51,30 +50,15 @@ namespace System.Runtime.InteropServices
}
}
- public override System.Reflection.EventAttributes Attributes
- {
- get { return _innerEventInfo.Attributes; }
- }
+ public override EventAttributes Attributes => _innerEventInfo.Attributes;
- public override System.Reflection.MethodInfo GetAddMethod(bool nonPublic)
- {
- return _innerEventInfo.GetAddMethod(nonPublic);
- }
+ public override MethodInfo GetAddMethod(bool nonPublic) => _innerEventInfo.GetAddMethod(nonPublic);
- public override System.Reflection.MethodInfo GetRaiseMethod(bool nonPublic)
- {
- return _innerEventInfo.GetRaiseMethod(nonPublic);
- }
+ public override MethodInfo GetRaiseMethod(bool nonPublic) => _innerEventInfo.GetRaiseMethod(nonPublic);
- public override System.Reflection.MethodInfo GetRemoveMethod(bool nonPublic)
- {
- return _innerEventInfo.GetRemoveMethod(nonPublic);
- }
+ public override MethodInfo GetRemoveMethod(bool nonPublic) => _innerEventInfo.GetRemoveMethod(nonPublic);
- public override Type DeclaringType
- {
- get { return _innerEventInfo.DeclaringType; }
- }
+ public override Type DeclaringType => _innerEventInfo.DeclaringType;
public override object[] GetCustomAttributes(Type attributeType, bool inherit)
{
@@ -91,41 +75,32 @@ namespace System.Runtime.InteropServices
return _innerEventInfo.IsDefined(attributeType, inherit);
}
- public override string Name
- {
- get { return _innerEventInfo.Name; }
- }
+ public override string Name => _innerEventInfo.Name;
- public override Type ReflectedType
- {
- get { return _innerEventInfo.ReflectedType; }
- }
+ public override Type ReflectedType => _innerEventInfo.ReflectedType;
- private static void GetDataForComInvocation(System.Reflection.EventInfo eventInfo, out Guid sourceIid, out int dispid)
+ private static void GetDataForComInvocation(EventInfo eventInfo, out Guid sourceIid, out int dispid)
{
- object[] comEventInterfaces = eventInfo.DeclaringType.GetCustomAttributes(typeof(ComEventInterfaceAttribute), false);
+ object[] comEventInterfaces = eventInfo.DeclaringType.GetCustomAttributes(typeof(ComEventInterfaceAttribute), inherit: false);
if (comEventInterfaces == null || comEventInterfaces.Length == 0)
{
- // TODO: event strings need to be localizable
- throw new InvalidOperationException("event invocation for COM objects requires interface to be attributed with ComSourceInterfaceGuidAttribute");
+ throw new InvalidOperationException(SR.InvalidOperation_NoComEventInterfaceAttribute);
}
if (comEventInterfaces.Length > 1)
{
- // TODO: event strings need to be localizable
- throw new System.Reflection.AmbiguousMatchException("more than one ComSourceInterfaceGuidAttribute found");
+ throw new AmbiguousMatchException(SR.AmbiguousMatch_MultipleEventInterfaceAttributes);
}
- Type sourceItf = ((ComEventInterfaceAttribute)comEventInterfaces[0]).SourceInterface;
- Guid guid = sourceItf.GUID;
+ Type sourceInterface = ((ComEventInterfaceAttribute)comEventInterfaces[0]).SourceInterface;
+ Guid guid = sourceInterface.GUID;
- System.Reflection.MethodInfo methodInfo = sourceItf.GetMethod(eventInfo.Name);
+ MethodInfo methodInfo = sourceInterface.GetMethod(eventInfo.Name);
Attribute dispIdAttribute = Attribute.GetCustomAttribute(methodInfo, typeof(DispIdAttribute));
if (dispIdAttribute == null)
{
- // TODO: event strings need to be localizable
- throw new InvalidOperationException("event invocation for COM objects requires event to be attributed with DispIdAttribute");
+ throw new InvalidOperationException(SR.InvalidOperation_NoDispIdAttribute);
}
sourceIid = guid;
diff --git a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs
index 7cb6fb951e..3a3cef7c4e 100644
--- a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs
+++ b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs
@@ -2,23 +2,18 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
-
namespace System.Runtime.InteropServices
{
[AttributeUsage(AttributeTargets.Interface, Inherited = false)]
public sealed class ComEventInterfaceAttribute : Attribute
{
- internal Type _SourceInterface;
- internal Type _EventProvider;
-
public ComEventInterfaceAttribute(Type SourceInterface, Type EventProvider)
{
- _SourceInterface = SourceInterface;
- _EventProvider = EventProvider;
+ this.SourceInterface = SourceInterface;
+ this.EventProvider = EventProvider;
}
- public Type SourceInterface { get { return _SourceInterface; } }
- public Type EventProvider { get { return _EventProvider; } }
+ public Type SourceInterface { get; }
+ public Type EventProvider { get; }
}
} \ No newline at end of file
diff --git a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/DefaultParameterValueAttribute.cs b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/DefaultParameterValueAttribute.cs
index 6b50bd148d..160a961790 100644
--- a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/DefaultParameterValueAttribute.cs
+++ b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/DefaultParameterValueAttribute.cs
@@ -10,16 +10,11 @@ namespace System.Runtime.InteropServices
// from other languages. This is particularly useful for
// methods defined in COM interop interfaces.
//
- [AttributeUsageAttribute(AttributeTargets.Parameter)]
+ [AttributeUsage(AttributeTargets.Parameter)]
public sealed class DefaultParameterValueAttribute : Attribute
{
- public DefaultParameterValueAttribute(object value)
- {
- _value = value;
- }
+ public DefaultParameterValueAttribute(object value) => Value = value;
- public object Value { get { return _value; } }
-
- private object _value;
+ public object Value { get; }
}
}
diff --git a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/HandleCollector.cs b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/HandleCollector.cs
index 2dea85f3af..49eba3b952 100644
--- a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/HandleCollector.cs
+++ b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/HandleCollector.cs
@@ -8,10 +8,8 @@ namespace System.Runtime.InteropServices
{
public sealed class HandleCollector
{
- private const int deltaPercent = 10; // this is used for increasing the threshold.
- private string _name;
+ private const int DeltaPercent = 10; // this is used for increasing the threshold.
private int _initialThreshold;
- private int _maximumThreshold;
private int _threshold;
private int _handleCount;
@@ -40,28 +38,20 @@ namespace System.Runtime.InteropServices
throw new ArgumentException(SR.Arg_InvalidThreshold);
}
- if (name != null)
- {
- _name = name;
- }
- else
- {
- _name = String.Empty;
- }
-
+ Name = name ?? string.Empty;
_initialThreshold = initialThreshold;
- _maximumThreshold = maximumThreshold;
+ MaximumThreshold = maximumThreshold;
_threshold = initialThreshold;
_handleCount = 0;
}
- public int Count { get { return _handleCount; } }
+ public int Count => _handleCount;
- public int InitialThreshold { get { return _initialThreshold; } }
+ public int InitialThreshold => _initialThreshold;
- public int MaximumThreshold { get { return _maximumThreshold; } }
+ public int MaximumThreshold { get; }
- public string Name { get { return _name; } }
+ public string Name { get; }
public void Add()
{
@@ -76,7 +66,7 @@ namespace System.Runtime.InteropServices
{
lock (this)
{
- _threshold = _handleCount + (_handleCount / deltaPercent);
+ _threshold = _handleCount + (_handleCount / DeltaPercent);
gen_collect = _gc_gen;
if (_gc_gen < 2)
{
@@ -108,8 +98,8 @@ namespace System.Runtime.InteropServices
throw new InvalidOperationException(SR.InvalidOperation_HCCountOverflow);
}
- int newThreshold = _handleCount + _handleCount / deltaPercent;
- if (newThreshold < (_threshold - _threshold / deltaPercent))
+ int newThreshold = _handleCount + _handleCount / DeltaPercent;
+ if (newThreshold < (_threshold - _threshold / DeltaPercent))
{
lock (this)
{
diff --git a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/RuntimeEnvironment.cs b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/RuntimeEnvironment.cs
index 57f0837ee3..b68f90baf5 100644
--- a/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/RuntimeEnvironment.cs
+++ b/src/System.Runtime.InteropServices/src/System/Runtime/InteropServices/RuntimeEnvironment.cs
@@ -2,7 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
using System.IO;
using System.Reflection;
@@ -10,17 +9,10 @@ namespace System.Runtime.InteropServices
{
public static class RuntimeEnvironment
{
- public static string SystemConfigurationFile
- {
- get
- {
- throw new PlatformNotSupportedException();
- }
- }
- public static bool FromGlobalAccessCache(System.Reflection.Assembly a)
- {
- return false;
- }
+ public static string SystemConfigurationFile => throw new PlatformNotSupportedException();
+
+ public static bool FromGlobalAccessCache(Assembly a) => false;
+
public static string GetRuntimeDirectory()
{
string runtimeDirectory = typeof(object).Assembly.Location;
@@ -30,17 +22,11 @@ namespace System.Runtime.InteropServices
}
return Path.GetDirectoryName(runtimeDirectory) + Path.DirectorySeparatorChar;
}
- public static System.IntPtr GetRuntimeInterfaceAsIntPtr(Guid clsid, Guid riid)
- {
- throw new PlatformNotSupportedException();
- }
- public static object GetRuntimeInterfaceAsObject(Guid clsid, Guid riid)
- {
- throw new PlatformNotSupportedException();
- }
- public static string GetSystemVersion()
- {
- return typeof(object).Assembly.ImageRuntimeVersion;
- }
+
+ public static IntPtr GetRuntimeInterfaceAsIntPtr(Guid clsid, Guid riid) => throw new PlatformNotSupportedException();
+
+ public static object GetRuntimeInterfaceAsObject(Guid clsid, Guid riid) => throw new PlatformNotSupportedException();
+
+ public static string GetSystemVersion() => typeof(object).Assembly.ImageRuntimeVersion;
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System.Runtime.InteropServices.Tests.csproj b/src/System.Runtime.InteropServices/tests/System.Runtime.InteropServices.Tests.csproj
index 5d13a5b16a..a43afc32dc 100644
--- a/src/System.Runtime.InteropServices/tests/System.Runtime.InteropServices.Tests.csproj
+++ b/src/System.Runtime.InteropServices/tests/System.Runtime.InteropServices.Tests.csproj
@@ -18,7 +18,6 @@
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\System\PlatformDetection.cs</Link>
</Compile>
- <Compile Include="System\Runtime\InteropServices\RuntimeEnvironmentTest.cs" />
<Compile Include="System\Runtime\InteropServices\AllowReversePInvokeCallsAttributeTests.cs" />
<Compile Include="System\Runtime\InteropServices\CallingConventionTests.cs" />
<Compile Include="System\Runtime\InteropServices\ComAliasNameAttributeTests.cs" />
@@ -31,6 +30,10 @@
<Compile Include="System\Runtime\InteropServices\LCIDConversionAttributeTests.cs" />
<Compile Include="System\Runtime\InteropServices\PrimaryInteropAssemblyAttributeTests.cs" />
<Compile Include="System\Runtime\InteropServices\ProgIdAttributeTests.cs" />
+ <Compile Include="System\Runtime\InteropServices\RuntimeEnvironmentTests.cs" />
+ <Compile Include="$(CommonTestPath)\System\AssertExtensions.cs">
+ <Link>Common\System\AssertExtensions.cs</Link>
+ </Compile>
<Compile Include="$(CommonTestPath)\System\Runtime\Serialization\Formatters\BinaryFormatterHelpers.cs">
<Link>System\Runtime\Serialization\Formatters\BinaryFormatterHelpers.cs</Link>
</Compile>
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/AllowReversePInvokeCallsAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/AllowReversePInvokeCallsAttributeTests.cs
index 1d71e986e5..9b92d54dba 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/AllowReversePInvokeCallsAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/AllowReversePInvokeCallsAttributeTests.cs
@@ -11,18 +11,15 @@ namespace System.Runtime.InteropServices.Tests
public class AllowReversePInvokeCallsAttributeTests
{
[AllowReversePInvokeCalls]
- private int Func(int a, int b)
- {
- return a + b;
- }
+ private int Func(int a, int b) => a + b;
[Fact]
public void Exists()
{
- var type = typeof(AllowReversePInvokeCallsAttributeTests);
- var method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
- var attr = method.GetCustomAttributes(typeof(AllowReversePInvokeCallsAttribute), false).OfType<AllowReversePInvokeCallsAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
+ Type type = typeof(AllowReversePInvokeCallsAttributeTests);
+ MethodInfo method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
+ AllowReversePInvokeCallsAttribute attribute = Assert.Single(method.GetCustomAttributes< AllowReversePInvokeCallsAttribute>(inherit: false));
+ Assert.NotNull(attribute);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/CallingConventionTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/CallingConventionTests.cs
index 7ea53a1e2b..63df4f90dc 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/CallingConventionTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/CallingConventionTests.cs
@@ -2,22 +2,21 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Linq;
-using System.Reflection;
using Xunit;
namespace System.Runtime.InteropServices.Tests
{
public class CallingConventionTests
{
- [Fact]
- public void Values()
+ [Theory]
+ [InlineData(CallingConvention.Winapi, 1)]
+ [InlineData(CallingConvention.Cdecl, 2)]
+ [InlineData(CallingConvention.StdCall, 3)]
+ [InlineData(CallingConvention.ThisCall, 4)]
+ [InlineData(CallingConvention.FastCall, 5)]
+ public void CallingConvention_Get_ReturnsExpected(CallingConvention convention, int expected)
{
- Assert.Equal(1, (int)CallingConvention.Winapi);
- Assert.Equal(2, (int)CallingConvention.Cdecl);
- Assert.Equal(3, (int)CallingConvention.StdCall);
- Assert.Equal(4, (int)CallingConvention.ThisCall);
- Assert.Equal(5, (int)CallingConvention.FastCall);
+ Assert.Equal(expected, (int)convention);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComAliasNameAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComAliasNameAttributeTests.cs
index 88ad06210a..f8a8cc3f84 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComAliasNameAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComAliasNameAttributeTests.cs
@@ -18,11 +18,19 @@ namespace System.Runtime.InteropServices.Tests
[Fact]
public void Exists()
{
- var type = typeof(ComAliasNameAttributeTests);
- var field = type.GetTypeInfo().DeclaredFields.Single(f => f.Name == "_foo");
- var attr = field.GetCustomAttributes(typeof(ComAliasNameAttribute), false).OfType<ComAliasNameAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
- Assert.Equal("foo", attr.Value);
+ FieldInfo field = typeof(ComAliasNameAttributeTests).GetTypeInfo().DeclaredFields.Single(f => f.Name == "_foo");
+ ComAliasNameAttribute attribute = Assert.Single(field.GetCustomAttributes<ComAliasNameAttribute>(inherit: false));
+ Assert.Equal("foo", attribute.Value);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("")]
+ [InlineData("value")]
+ public void Ctor_Alias(string alias)
+ {
+ var attribute = new ComAliasNameAttribute(alias);
+ Assert.Equal(alias, attribute.Value);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComCompatibleVersionAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComCompatibleVersionAttributeTests.cs
index 6545abba7b..695f80ad1b 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComCompatibleVersionAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComCompatibleVersionAttributeTests.cs
@@ -2,7 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using Xunit;
@@ -16,14 +15,26 @@ namespace System.Runtime.InteropServices.Tests
[Fact]
public void Exists()
{
- var type = typeof(ComCompatibleVersionAttributeTests);
- var assembly = type.GetTypeInfo().Assembly;
- var attr = assembly.GetCustomAttributes(typeof(ComCompatibleVersionAttribute), false).OfType<ComCompatibleVersionAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
- Assert.Equal(1, attr.MajorVersion);
- Assert.Equal(2, attr.MinorVersion);
- Assert.Equal(3, attr.BuildNumber);
- Assert.Equal(4, attr.RevisionNumber);
+ Type type = typeof(ComCompatibleVersionAttributeTests);
+ Assembly assembly = type.GetTypeInfo().Assembly;
+ ComCompatibleVersionAttribute attribute = Assert.Single(assembly.GetCustomAttributes<ComCompatibleVersionAttribute>());
+ Assert.Equal(1, attribute.MajorVersion);
+ Assert.Equal(2, attribute.MinorVersion);
+ Assert.Equal(3, attribute.BuildNumber);
+ Assert.Equal(4, attribute.RevisionNumber);
+ }
+
+ [Theory]
+ [InlineData(-1, -2, -3, -4)]
+ [InlineData(0, 0, 0, 0)]
+ [InlineData(1, 2, 3, 4)]
+ public void Ctor_Major_Minor_Build_Revision(int major, int minor, int build, int revision)
+ {
+ var attribute = new ComCompatibleVersionAttribute(major, minor, build, revision);
+ Assert.Equal(major, attribute.MajorVersion);
+ Assert.Equal(minor, attribute.MinorVersion);
+ Assert.Equal(build, attribute.BuildNumber);
+ Assert.Equal(revision, attribute.RevisionNumber);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComConversionLossAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComConversionLossAttributeTests.cs
index a723f49257..20b84c6c88 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComConversionLossAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComConversionLossAttributeTests.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Linq;
-using System.Reflection;
using Xunit;
namespace System.Runtime.InteropServices.Tests
@@ -14,9 +12,9 @@ namespace System.Runtime.InteropServices.Tests
[Fact]
public void Exists()
{
- var type = typeof(ComConversionLossAttributeTests);
- var attr = type.GetCustomAttributes(typeof(ComConversionLossAttribute), false).OfType<ComConversionLossAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
+ Type type = typeof(ComConversionLossAttributeTests);
+ ComConversionLossAttribute attribute = Assert.IsType<ComConversionLossAttribute>(Assert.Single(type.GetCustomAttributes(typeof(ComConversionLossAttribute), inherit: false)));
+ Assert.NotNull(attribute);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComRegisterFunctionAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComRegisterFunctionAttributeTests.cs
index fbc4332026..7a36dd96dd 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComRegisterFunctionAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComRegisterFunctionAttributeTests.cs
@@ -11,18 +11,15 @@ namespace System.Runtime.InteropServices.Tests
public class ComRegisterFunctionAttributeTests
{
[ComRegisterFunction]
- private int Func(int a, int b)
- {
- return a + b;
- }
+ private int Func(int a, int b) => a + b;
[Fact]
public void Exists()
{
- var type = typeof(ComRegisterFunctionAttributeTests);
- var method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
- var attr = method.GetCustomAttributes(typeof(ComRegisterFunctionAttribute), false).OfType<ComRegisterFunctionAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
+ Type type = typeof(ComRegisterFunctionAttributeTests);
+ MethodInfo method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
+ ComRegisterFunctionAttribute attribute = Assert.Single(method.GetCustomAttributes<ComRegisterFunctionAttribute>(inherit: false));
+ Assert.NotNull(attribute);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComUnregisterFunctionAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComUnregisterFunctionAttributeTests.cs
index 3189d93e69..7b50d0d9b9 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComUnregisterFunctionAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComUnregisterFunctionAttributeTests.cs
@@ -11,18 +11,15 @@ namespace System.Runtime.InteropServices.Tests
public class ComUnregisterFunctionAttributeTests
{
[ComUnregisterFunction]
- private int Func(int a, int b)
- {
- return a + b;
- }
+ private int Func(int a, int b) => a + b;
[Fact]
public void Exists()
{
- var type = typeof(ComUnregisterFunctionAttributeTests);
- var method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
- var attr = method.GetCustomAttributes(typeof(ComUnregisterFunctionAttribute), false).OfType<ComUnregisterFunctionAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
+ Type type = typeof(ComUnregisterFunctionAttributeTests);
+ MethodInfo method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
+ ComUnregisterFunctionAttribute attribute = Assert.Single(method.GetCustomAttributes<ComUnregisterFunctionAttribute>(inherit: false));
+ Assert.NotNull(attribute);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComVisibleAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComVisibleAttributeTests.cs
index 6c0124ad00..13fb6d4a29 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComVisibleAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ComVisibleAttributeTests.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Linq;
-using System.Reflection;
using Xunit;
namespace System.Runtime.InteropServices.Tests
@@ -14,10 +12,18 @@ namespace System.Runtime.InteropServices.Tests
[Fact]
public void Exists()
{
- var type = typeof(ComVisibleAttributeTests);
- var attr = type.GetCustomAttributes(typeof(ComVisibleAttribute), false).OfType<ComVisibleAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
- Assert.Equal(true, attr.Value);
+ Type type = typeof(ComVisibleAttributeTests);
+ ComVisibleAttribute attribute = Assert.IsType<ComVisibleAttribute>(Assert.Single(type.GetCustomAttributes(typeof(ComVisibleAttribute), inherit: false)));
+ Assert.True(attribute.Value);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void Ctor_Visible(bool visibility)
+ {
+ var attribute = new ComVisibleAttribute(visibility);
+ Assert.Equal(visibility, attribute.Value);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/DefaultParameterValueAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/DefaultParameterValueAttributeTests.cs
index 97f568deb5..fa2ac4bdf6 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/DefaultParameterValueAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/DefaultParameterValueAttributeTests.cs
@@ -15,10 +15,10 @@ namespace System.Runtime.InteropServices
[InlineData(5.0f)]
[InlineData("ExpectedValue")]
[InlineData(null)]
- public static void Constructor(object expected)
+ public static void Ctor_Value(object value)
{
- DefaultParameterValueAttribute attribute = new DefaultParameterValueAttribute(expected);
- Assert.Equal(expected, attribute.Value);
+ var attribute = new DefaultParameterValueAttribute(value);
+ Assert.Equal(value, attribute.Value);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleCollectorTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleCollectorTests.cs
index 4c73dd4244..d67005548d 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleCollectorTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleCollectorTests.cs
@@ -7,53 +7,81 @@ using Xunit;
namespace System.Runtime.InteropServices
{
- public static class HandleCollectorTests
+ public class HandleCollectorTests
{
private const int LowLimitSize = 20;
private const int HighLimitSize = 100000;
- [Fact]
- public static void NegativeInitialThresholdCtor()
+ [Theory]
+ [InlineData(null, 0)]
+ [InlineData("", 10)]
+ [InlineData("InitialThreshold", int.MaxValue)]
+ public void Ctor_Name_InitialThreshold(string name, int initialThreshold)
{
- Assert.Throws<ArgumentOutOfRangeException>(() => new HandleCollector("NegativeInitial", -1));
+ var handleCollector = new HandleCollector(name, initialThreshold);
+ Assert.Equal(0, handleCollector.Count);
+ Assert.Equal(name ?? string.Empty, handleCollector.Name);
+ Assert.Equal(initialThreshold, handleCollector.InitialThreshold);
+ Assert.Equal(int.MaxValue, handleCollector.MaximumThreshold);
}
- [Fact]
- public static void NegateMaximumThresholdCtor()
+ [Theory]
+ [InlineData(null, 0, 0)]
+ [InlineData("", 10, 15)]
+ [InlineData("InitialThreshold", 1, 2)]
+ public void Ctor_Name_InitialThreshold_MaximumThreshold(string name, int initialThreshold, int maximumThreshold)
{
- Assert.Throws<ArgumentOutOfRangeException>(() => new HandleCollector("NegativeMax", 0, -1));
+ var handleCollector = new HandleCollector(name, initialThreshold, maximumThreshold);
+ Assert.Equal(0, handleCollector.Count);
+ Assert.Equal(name ?? string.Empty, handleCollector.Name);
+ Assert.Equal(initialThreshold, handleCollector.InitialThreshold);
+ Assert.Equal(maximumThreshold, handleCollector.MaximumThreshold);
}
[Fact]
- public static void InitialGreaterThanMaxThresholdCtor()
+ public void Ctor_NegativeInitialThreshold_ThrowsArgumentOufORangeException()
{
- Assert.Throws<ArgumentException>(() => new HandleCollector("InitialGreaterThanMax", 100, 1));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("initialThreshold", () => new HandleCollector("NegativeInitial", -1));
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("initialThreshold", () => new HandleCollector("NegativeInitial", -1, 0));
}
[Fact]
- public static void SimplePropertyValidation()
+ public static void Ctor_NegativeMaximumThreshold_ThrowsArgumentOutOfRangeException()
{
- string name = "ExampleName";
- int initial = 10;
- int max = 20;
-
- HandleCollector collector = new HandleCollector(name, initial, max);
+ AssertExtensions.Throws<ArgumentOutOfRangeException>("maximumThreshold", () => new HandleCollector("NegativeMax", 0, -1));
+ }
- Assert.Equal(0, collector.Count);
- Assert.Equal(name, collector.Name);
- Assert.Equal(initial, collector.InitialThreshold);
- Assert.Equal(max, collector.MaximumThreshold);
+ [Fact]
+ public static void Ctor_InitialThresholdGreaterThanMaximumThreshold_ThrowsArgumentException()
+ {
+ AssertExtensions.Throws<ArgumentException>(null, () => new HandleCollector("InitialGreaterThanMax", 100, 1));
}
[Fact]
- public static void NullNameCtor()
+ public void AddRemove_AcrossMultipleGenerations_Success()
{
- HandleCollector collector = new HandleCollector(null, 0, 0);
- Assert.Equal(string.Empty, collector.Name);
+ var collector = new HandleCollector("name", 0);
+ collector.Add();
+ Assert.Equal(1, collector.Count);
+
+ collector.Add();
+ Assert.Equal(2, collector.Count);
+
+ collector.Add();
+ Assert.Equal(3, collector.Count);
+
+ collector.Remove();
+ Assert.Equal(2, collector.Count);
+
+ collector.Remove();
+ Assert.Equal(1, collector.Count);
+
+ collector.Remove();
+ Assert.Equal(0, collector.Count);
}
[Fact]
- public static void EmptyRemoval()
+ public static void Remove_EmptyCollection_ThrowsInvalidOperationException()
{
HandleCollector collector = new HandleCollector("EmptyRemoval", 10);
Assert.Throws<InvalidOperationException>(() => collector.Remove());
@@ -61,7 +89,7 @@ namespace System.Runtime.InteropServices
[Fact]
[SkipOnTargetFramework(TargetFrameworkMonikers.UapAot,"Reflects on private member handleCount")]
- public static void CountOverflow()
+ public static void Add_Overflows_ThrowsInvalidOperationException()
{
HandleCollector collector = new HandleCollector("CountOverflow", int.MaxValue);
@@ -95,10 +123,7 @@ namespace System.Runtime.InteropServices
[Fact]
public static void TestHandleCollector()
{
- Tuple<int, int, int> initialGcState = new Tuple<int, int, int>(
- GC.CollectionCount(0),
- GC.CollectionCount(1),
- GC.CollectionCount(2));
+ (int gen0, int gen1, int gen2) initialGcState = (GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2));
HandleCollector lowLimitCollector = new HandleCollector("LowLimit.Collector", LowLimitSize);
for (int i = 0; i < LowLimitSize + 1; ++i)
@@ -106,12 +131,9 @@ namespace System.Runtime.InteropServices
HandleLimitTester hlt = new HandleLimitTester(lowLimitCollector);
}
- Tuple<int, int, int> postLowLimitState = new Tuple<int, int, int>(
- GC.CollectionCount(0),
- GC.CollectionCount(1),
- GC.CollectionCount(2));
+ (int gen0, int gen1, int gen2) postLowLimitState = (GC.CollectionCount(0),GC.CollectionCount(1), GC.CollectionCount(2));
- Assert.True(initialGcState.Item1 + initialGcState.Item2 + initialGcState.Item3 < postLowLimitState.Item1 + postLowLimitState.Item2 + postLowLimitState.Item3, "Low limit handle did not trigger a GC");
+ Assert.True(initialGcState.gen0 + initialGcState.gen1 + initialGcState.gen2 < postLowLimitState.gen0 + postLowLimitState.gen1 + postLowLimitState.gen2, "Low limit handle did not trigger a GC");
HandleCollector highLimitCollector = new HandleCollector("HighLimit.Collector", HighLimitSize);
for (int i = 0; i < HighLimitSize + 10; ++i)
@@ -119,12 +141,9 @@ namespace System.Runtime.InteropServices
HandleLimitTester hlt = new HandleLimitTester(highLimitCollector);
}
- Tuple<int, int, int> postHighLimitState = new Tuple<int, int, int>(
- GC.CollectionCount(0),
- GC.CollectionCount(1),
- GC.CollectionCount(2));
+ (int gen0, int gen1, int gen2) postHighLimitState = (GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2));
- Assert.True(postLowLimitState.Item1 + postLowLimitState.Item2 + postLowLimitState.Item3 < postHighLimitState.Item1 + postHighLimitState.Item2 + postHighLimitState.Item3, "High limit handle did not trigger a GC");
+ Assert.True(postLowLimitState.gen0 + postLowLimitState.gen1 + postLowLimitState.gen2 < postHighLimitState.gen0 + postHighLimitState.gen1 + postHighLimitState.gen2, "High limit handle did not trigger a GC");
}
private sealed class HandleLimitTester
@@ -138,10 +157,7 @@ namespace System.Runtime.InteropServices
GC.KeepAlive(this);
}
- ~HandleLimitTester()
- {
- _collector.Remove();
- }
+ ~HandleLimitTester() => _collector.Remove();
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleRefTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleRefTests.cs
index 8f1979e262..9183dcd010 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleRefTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/HandleRefTests.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Linq;
-using System.Reflection;
using Xunit;
namespace System.Runtime.InteropServices.Tests
@@ -11,15 +9,25 @@ namespace System.Runtime.InteropServices.Tests
public class HandleRefTests
{
[Fact]
- public void Properties()
+ public void Ctor_Default()
{
- var obj = new object();
- var ptr = new IntPtr(1337);
- var handleRef = new HandleRef(obj, ptr);
- Assert.Equal(ptr, (IntPtr)handleRef);
- Assert.Equal(ptr, HandleRef.ToIntPtr(handleRef));
- Assert.Equal(ptr, handleRef.Handle);
- Assert.Same(obj, handleRef.Wrapper);
+ var handleRef = new HandleRef();
+ Assert.Null(handleRef.Wrapper);
+ Assert.Equal(IntPtr.Zero, handleRef.Handle);
+ Assert.Equal(IntPtr.Zero, (IntPtr)handleRef);
+ Assert.Equal(IntPtr.Zero, HandleRef.ToIntPtr(handleRef));
+ }
+
+ [Theory]
+ [InlineData(null, 0)]
+ [InlineData("Wrapper", 1337)]
+ public void Ctor_Wrapper_Handle(object wrapper, int handle)
+ {
+ var handleRef = new HandleRef(wrapper, (IntPtr)handle);
+ Assert.Same(wrapper, handleRef.Wrapper);
+ Assert.Equal((IntPtr)handle, handleRef.Handle);
+ Assert.Equal((IntPtr)handle, (IntPtr)handleRef);
+ Assert.Equal((IntPtr)handle, HandleRef.ToIntPtr(handleRef));
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/LCIDConversionAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/LCIDConversionAttributeTests.cs
index 48198b04e8..fafcfbaf25 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/LCIDConversionAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/LCIDConversionAttributeTests.cs
@@ -11,19 +11,25 @@ namespace System.Runtime.InteropServices.Tests
public class LCIDConversionAttributeTests
{
[LCIDConversion(1337)]
- private int Func(int a, int b)
- {
- return a + b;
- }
+ private int Func(int a, int b) => a + b;
[Fact]
public void Exists()
{
- var type = typeof(LCIDConversionAttributeTests);
- var method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
- var attr = method.GetCustomAttributes(typeof(LCIDConversionAttribute), false).OfType<LCIDConversionAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
- Assert.Equal(1337, attr.Value);
+ Type type = typeof(LCIDConversionAttributeTests);
+ MethodInfo method = type.GetTypeInfo().DeclaredMethods.Single(m => m.Name == "Func");
+ LCIDConversionAttribute attribute = Assert.Single(method.GetCustomAttributes<LCIDConversionAttribute>(inherit: false));
+ Assert.Equal(1337, attribute.Value);
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData(0)]
+ [InlineData(1)]
+ public void Ctor_Lcid(int lcid)
+ {
+ var attribute = new LCIDConversionAttribute(lcid);
+ Assert.Equal(lcid, attribute.Value);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/MarshalTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/MarshalTests.cs
index a7ccb59f8c..a4c97eb480 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/MarshalTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/MarshalTests.cs
@@ -3,7 +3,6 @@
// See the LICENSE file in the project root for more information.
using Xunit;
-using System.Collections.Generic;
using System.Security;
namespace System.Runtime.InteropServices
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/PrimaryInteropAssemblyAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/PrimaryInteropAssemblyAttributeTests.cs
index 2135e9ccaa..68f85ff0c2 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/PrimaryInteropAssemblyAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/PrimaryInteropAssemblyAttributeTests.cs
@@ -2,7 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using Xunit;
@@ -16,12 +15,22 @@ namespace System.Runtime.InteropServices.Tests
[Fact]
public void Exists()
{
- var type = typeof(PrimaryInteropAssemblyAttributeTests);
- var assembly = type.GetTypeInfo().Assembly;
- var attr = assembly.GetCustomAttributes(typeof(PrimaryInteropAssemblyAttribute), false).OfType<PrimaryInteropAssemblyAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
- Assert.Equal(1, attr.MajorVersion);
- Assert.Equal(2, attr.MinorVersion);
+ Type type = typeof(PrimaryInteropAssemblyAttributeTests);
+ Assembly assembly = type.GetTypeInfo().Assembly;
+ PrimaryInteropAssemblyAttribute attribute = Assert.Single(assembly.GetCustomAttributes<PrimaryInteropAssemblyAttribute>());
+ Assert.Equal(1, attribute.MajorVersion);
+ Assert.Equal(2, attribute.MinorVersion);
+ }
+
+ [Theory]
+ [InlineData(-1, -2)]
+ [InlineData(0, 0)]
+ [InlineData(1, 2)]
+ public void Ctor_MajorVersion_MinorVersion(int major, int minor)
+ {
+ var attribute = new PrimaryInteropAssemblyAttribute(major, minor);
+ Assert.Equal(major, attribute.MajorVersion);
+ Assert.Equal(minor, attribute.MinorVersion);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ProgIdAttributeTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ProgIdAttributeTests.cs
index a0e00935cd..8cadc92770 100644
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ProgIdAttributeTests.cs
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/ProgIdAttributeTests.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Linq;
-using System.Reflection;
using Xunit;
namespace System.Runtime.InteropServices.Tests
@@ -14,10 +12,18 @@ namespace System.Runtime.InteropServices.Tests
[Fact]
public void Exists()
{
- var type = typeof(ProgIdAttributeTests);
- var attr = type.GetCustomAttributes(typeof(ProgIdAttribute), false).OfType<ProgIdAttribute>().SingleOrDefault();
- Assert.NotNull(attr);
- Assert.Equal("pizza", attr.Value);
+ Type type = typeof(ProgIdAttributeTests);
+ ProgIdAttribute attribute = Assert.IsType<ProgIdAttribute>(Assert.Single(type.GetCustomAttributes(typeof(ProgIdAttribute), inherit: false)));
+ Assert.Equal("pizza", attribute.Value);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("ProgId")]
+ public void Ctor_ProgId(string progId)
+ {
+ var attribute = new ProgIdAttribute(progId);
+ Assert.Equal(progId, attribute.Value);
}
}
}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTest.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTest.cs
deleted file mode 100644
index b758813c4b..0000000000
--- a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTest.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Reflection;
-using System.Runtime;
-using System.Runtime.InteropServices;
-using System.IO;
-using Xunit;
-
-namespace System.Runtime.InteropServices
-{
- public static class RuntimeEnvironmentTest
- {
- [Fact]
- public static void RuntimeEnvironmentRuntimeDirectory()
- {
- Assert.True(Directory.Exists(RuntimeEnvironment.GetRuntimeDirectory()));
- }
-
- [Fact]
- [ActiveIssue(20600, TargetFrameworkMonikers.UapAot)]
- public static void RuntimeEnvironmentSysVersion()
- {
- Assert.True(!String.IsNullOrEmpty(RuntimeEnvironment.GetSystemVersion()));
- }
-
- [Fact]
- [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
- public static void RuntimeEnvironmentNegTest()
- {
- Type clsType = typeof(RuntimeEnvironmentTest);
- Assembly assem = clsType.Assembly;
- Assert.True(!RuntimeEnvironment.FromGlobalAccessCache(assem));
-
- Assert.Throws<PlatformNotSupportedException>(() => RuntimeEnvironment.SystemConfigurationFile);
-
- Guid guid;
- Assert.Throws<PlatformNotSupportedException>(() => RuntimeEnvironment.GetRuntimeInterfaceAsObject(guid, guid));
- Assert.Throws<PlatformNotSupportedException>(() => RuntimeEnvironment.GetRuntimeInterfaceAsIntPtr(guid, guid));
- }
- }
-}
diff --git a/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTests.cs b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTests.cs
new file mode 100644
index 0000000000..e54d0615f0
--- /dev/null
+++ b/src/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/RuntimeEnvironmentTests.cs
@@ -0,0 +1,54 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using Xunit;
+
+namespace System.Runtime.InteropServices
+{
+ public class RuntimeEnvironmentTests
+ {
+ [Fact]
+ public void RuntimeEnvironmentRuntimeDirectory()
+ {
+ Assert.True(Directory.Exists(RuntimeEnvironment.GetRuntimeDirectory()));
+ }
+
+ [Fact]
+ [ActiveIssue(20600, TargetFrameworkMonikers.UapAot)]
+ public void RuntimeEnvironmentSysVersion()
+ {
+ Assert.NotEmpty(RuntimeEnvironment.GetSystemVersion());
+ }
+
+ [Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "SystemConfigurationFile is not supported on .NET Core.")]
+ public void SystemConfigurationFile_Get_ThrowsPlatformNotSupportedException()
+ {
+ Assert.Throws<PlatformNotSupportedException>(() => RuntimeEnvironment.SystemConfigurationFile);
+ }
+
+ [Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "GetRuntimeInterfaceAsObject is not supported on .NET Core.")]
+ public void GetRuntimeInterfaceAsObject_Invoke_ThrowsPlatformNotSupportedException()
+ {
+ Assert.Throws<PlatformNotSupportedException>(() => RuntimeEnvironment.GetRuntimeInterfaceAsObject(Guid.Empty, Guid.Empty));
+ }
+
+ [Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "GetRuntimeInterfaceAsIntPtr is not supported on .NET Core.")]
+ public void GetRuntimeInterfaceAsIntPtr_Invoke_ThrowsPlatformNotSupportedException()
+ {
+ Assert.Throws<PlatformNotSupportedException>(() => RuntimeEnvironment.GetRuntimeInterfaceAsIntPtr(Guid.Empty, Guid.Empty));
+ }
+
+ [Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "FromGlobalAccessCache always returns true on .NET Core.")]
+ public void FromGlobalAccessCache_nNvoke_ReturnsFalse()
+ {
+ Assert.False(RuntimeEnvironment.FromGlobalAccessCache(typeof(RuntimeEnvironmentTests).Assembly));
+ Assert.False(RuntimeEnvironment.FromGlobalAccessCache(null));
+ }
+ }
+}
diff --git a/src/System.Runtime.Loader/tests/RefEmitLoadContext/RefEmitLoadContextTest.cs b/src/System.Runtime.Loader/tests/RefEmitLoadContext/RefEmitLoadContextTest.cs
index 16c2a83ac1..756e35a65d 100644
--- a/src/System.Runtime.Loader/tests/RefEmitLoadContext/RefEmitLoadContextTest.cs
+++ b/src/System.Runtime.Loader/tests/RefEmitLoadContext/RefEmitLoadContextTest.cs
@@ -37,7 +37,6 @@ namespace System.Runtime.Loader.Tests
private static void Init()
{
- // Delete the assembly from the temp location if it exists.
var assemblyFilename = "System.Runtime.Loader.Noop.Assembly.dll";
// Form the dynamic path that would not collide if another instance of this test is running.
@@ -50,19 +49,9 @@ namespace System.Runtime.Loader.Tests
// Rename the file local to the test folder.
var sourcePath = Path.Combine(Directory.GetCurrentDirectory(),assemblyFilename);
- var targetRenamedPath = Path.Combine(Directory.GetCurrentDirectory(), "System.Runtime.Loader.Noop.Assembly_test.dll");
- if (File.Exists(sourcePath))
- {
- if (File.Exists(targetRenamedPath))
- {
- File.Delete(targetRenamedPath);
- }
-
- File.Move(sourcePath, targetRenamedPath);
- }
// Finally, copy the file to the temp location from where we expect to load it
- File.Copy(targetRenamedPath, targetPath);
+ File.Copy(sourcePath, targetPath);
// Copy the current assembly to the target location as well since we will load it in the custom load context via the
// RefEmitted assembly.
@@ -74,6 +63,12 @@ namespace System.Runtime.Loader.Tests
File.Copy(pathCurrentAssembly, targetPath);
}
+ private static void DeleteDirectory()
+ {
+ try { Directory.Delete(s_loadFromPath, recursive: true); }
+ catch { }
+ }
+
[Fact]
public static void LoadRefEmitAssembly()
{
@@ -86,6 +81,7 @@ namespace System.Runtime.Loader.Tests
// Scenario 2 - Generate a collectible dynamic assembly that triggers load of a static assembly
RefEmitLoadContext refEmitLCRunAndCollect = new RefEmitLoadContext();
LoadRefEmitAssemblyInLoadContext(refEmitLCRunAndCollect, AssemblyBuilderAccess.RunAndCollect);
+ DeleteDirectory();
}
public static void LoadRefEmitAssemblyInLoadContext(AssemblyLoadContext loadContext, AssemblyBuilderAccess builderType)
diff --git a/src/System.Runtime.Numerics/src/System/Numerics/BigInteger.cs b/src/System.Runtime.Numerics/src/System/Numerics/BigInteger.cs
index a576f31e24..ac987bf474 100644
--- a/src/System.Runtime.Numerics/src/System/Numerics/BigInteger.cs
+++ b/src/System.Runtime.Numerics/src/System/Numerics/BigInteger.cs
@@ -23,8 +23,8 @@ namespace System.Numerics
// For values int.MinValue < n <= int.MaxValue, the value is stored in sign
// and _bits is null. For all other values, sign is +1 or -1 and the bits are in _bits
- internal readonly int _sign;
- internal readonly uint[] _bits;
+ internal readonly int _sign; // Do not rename (binary serialization)
+ internal readonly uint[] _bits; // Do not rename (binary serialization)
// We have to make a choice of how to represent int.MinValue. This is the one
// value that fits in an int, but whose negation does not fit in an int.
diff --git a/src/System.Runtime.Numerics/src/System/Numerics/Complex.cs b/src/System.Runtime.Numerics/src/System/Numerics/Complex.cs
index 984fa10178..2325eaad97 100644
--- a/src/System.Runtime.Numerics/src/System/Numerics/Complex.cs
+++ b/src/System.Runtime.Numerics/src/System/Numerics/Complex.cs
@@ -14,7 +14,7 @@ namespace System.Numerics
/// </summary>
[Serializable]
#if !MONO
- [System.Runtime.CompilerServices.TypeForwardedFrom("System.Numerics, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
+ [System.Runtime.CompilerServices.TypeForwardedFrom("System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public struct Complex : IEquatable<Complex>, IFormattable
{
@@ -34,9 +34,9 @@ namespace System.Numerics
private static readonly double s_log2 = Math.Log(2.0);
// Do not rename, these fields are needed for binary serialization
- private double m_real;
- private double m_imaginary;
-
+ private double m_real; // Do not rename (binary serialization)
+ private double m_imaginary; // Do not rename (binary serialization)
+
public Complex(double real, double imaginary)
{
m_real = real;
diff --git a/src/System.Runtime.Serialization.Formatters/src/Resources/System.Runtime.Serialization.Formatters.rd.xml b/src/System.Runtime.Serialization.Formatters/src/Resources/System.Runtime.Serialization.Formatters.rd.xml
index 131fbc46c5..d0dac46c61 100644
--- a/src/System.Runtime.Serialization.Formatters/src/Resources/System.Runtime.Serialization.Formatters.rd.xml
+++ b/src/System.Runtime.Serialization.Formatters/src/Resources/System.Runtime.Serialization.Formatters.rd.xml
@@ -21,6 +21,13 @@
<!-- This is dynamically called by SerializationInfoExtensions.UpdateValue -->
<Method Name="UpdateValue" Dynamic="Required" />
</Type>
+ <!-- Comparers are usually only referred to by interface, so analysis is unlikely to find them -->
+ <Type Name="System.Collections.IEqualityComparer">
+ <Subtypes BinaryFormatter="All" />
+ </Type>
+ <Type Name="System.Collections.IComparer">
+ <Subtypes BinaryFormatter="All" />
+ </Type>
</Assembly>
</Library>
</Directives> \ No newline at end of file
diff --git a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/FormatterServices.cs b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/FormatterServices.cs
index f2499b5983..52e9dd60a7 100644
--- a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/FormatterServices.cs
+++ b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/FormatterServices.cs
@@ -322,7 +322,14 @@ namespace System.Runtime.Serialization
throw new ArgumentNullException(nameof(type));
}
- foreach (Attribute first in type.GetCustomAttributes(typeof(TypeForwardedFromAttribute), false))
+ // Special case types like arrays
+ Type attributedType = type;
+ while (attributedType.HasElementType)
+ {
+ attributedType = attributedType.GetElementType();
+ }
+
+ foreach (Attribute first in attributedType.GetCustomAttributes(typeof(TypeForwardedFromAttribute), false))
{
hasTypeForwardedFrom = true;
return ((TypeForwardedFromAttribute)first).AssemblyFullName;
diff --git a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryObjectWriter.cs b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryObjectWriter.cs
index 6e61358457..328cc3bb0e 100644
--- a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryObjectWriter.cs
+++ b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryObjectWriter.cs
@@ -984,7 +984,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
{
assemId = 0;
}
- else if (assemblyString.Equals(Converter.s_urtAssemblyString))
+ else if (assemblyString.Equals(Converter.s_urtAssemblyString) || assemblyString.Equals(Converter.s_urtAlternativeAssemblyString))
{
// Urt type is an assemId of 0. No assemblyString needs
// to be sent
diff --git a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryTypeConverter.cs b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryTypeConverter.cs
index 92a2205f1e..9ce50ec6e5 100644
--- a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryTypeConverter.cs
+++ b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/BinaryTypeConverter.cs
@@ -57,7 +57,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
typeInformation = objectInfo.GetTypeFullName();
}
- if (assembly.Equals(Converter.s_urtAssemblyString))
+ if (assembly.Equals(Converter.s_urtAssemblyString) || assembly.Equals(Converter.s_urtAlternativeAssemblyString))
{
binaryTypeEnum = BinaryTypeEnum.ObjectUrt;
assemId = 0;
diff --git a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/Converter.cs b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/Converter.cs
index 18319c79a5..ca76aa8c98 100644
--- a/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/Converter.cs
+++ b/src/System.Runtime.Serialization.Formatters/src/System/Runtime/Serialization/Formatters/Binary/Converter.cs
@@ -30,9 +30,17 @@ namespace System.Runtime.Serialization.Formatters.Binary
internal static readonly Type s_typeofUInt64 = typeof(ulong);
internal static readonly Type s_typeofObject = typeof(object);
internal static readonly Type s_typeofSystemVoid = typeof(void);
- internal static readonly Assembly s_urtAssembly = s_typeofString.Assembly;
+
+ // In netfx the default assembly is mscorlib.dll --> typeof(string).Assembly.
+ // In Core type string lives in System.Private.Corelib.dll which doesn't
+ // contain all the types which are living in mscorlib in netfx. Therefore we
+ // use our mscorlib facade which also contains manual type forwards for deserialization.
+ internal static readonly Assembly s_urtAssembly = Assembly.Load("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
internal static readonly string s_urtAssemblyString = s_urtAssembly.FullName;
+ internal static readonly Assembly s_urtAlternativeAssembly = s_typeofString.Assembly;
+ internal static readonly string s_urtAlternativeAssemblyString = s_urtAlternativeAssembly.FullName;
+
// Arrays
internal static readonly Type s_typeofTypeArray = typeof(Type[]);
internal static readonly Type s_typeofObjectArray = typeof(object[]);
diff --git a/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterHelper.cs b/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterHelper.cs
index efd366e74c..1b65cbb258 100644
--- a/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterHelper.cs
+++ b/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterHelper.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -16,16 +17,24 @@ namespace System.Runtime.Serialization.Formatters.Tests
{
private static void CheckForAnyEquals(object obj, object deserializedObj)
{
- if (obj != null && deserializedObj != null)
+ Assert.True(CheckEquals(obj, deserializedObj), "Error during equality check of type " + obj?.GetType()?.FullName);
+ }
+
+ public static bool CheckEquals(object objA, object objB)
+ {
+ if (objA == null && objB == null)
+ return true;
+
+ if (objA != null && objB != null)
{
object equalityResult = null;
- Type objType = obj.GetType();
+ Type objType = objA.GetType();
// Check if custom equality extension method is available
- MethodInfo customEqualityCheck = GetExtensionMethod(typeof(EqualityExtensions).Assembly, objType);
+ MethodInfo customEqualityCheck = GetExtensionMethod(objType);
if (customEqualityCheck != null)
{
- equalityResult = customEqualityCheck.Invoke(obj, new object[] { obj, deserializedObj });
+ equalityResult = customEqualityCheck.Invoke(objA, new object[] { objA, objB });
}
else
{
@@ -38,41 +47,75 @@ namespace System.Runtime.Serialization.Formatters.Tests
MethodInfo equalsMethod = objType.GetMethod("Equals", new Type[] { objType });
if (equalsMethod.DeclaringType != typeof(object))
{
- equalityResult = equalsMethod.Invoke(obj, new object[] { deserializedObj });
+ equalityResult = equalsMethod.Invoke(objA, new object[] { objB });
}
}
}
if (equalityResult != null)
{
- Assert.True((bool)equalityResult, "Error during equality check of type " + objType.FullName);
- return;
+ return (bool)equalityResult;
}
}
+ if (objA is IEnumerable objAEnumerable && objB is IEnumerable objBEnumerable)
+ {
+ return CheckSequenceEquals(objAEnumerable, objBEnumerable);
+ }
+
+ return objA.Equals(objB);
+ }
+
+ public static bool CheckSequenceEquals(IEnumerable a, IEnumerable b)
+ {
+ if (a == null || b == null)
+ return a == b;
+
+ if (a.GetType() != b.GetType())
+ return false;
+
+ IEnumerator eA = null;
+ IEnumerator eB = null;
+
try
{
- Assert.Equal(obj, deserializedObj);
+ eA = (a as IEnumerable).GetEnumerator();
+ eB = (a as IEnumerable).GetEnumerator();
+ while (true)
+ {
+ bool moved = eA.MoveNext();
+ if (moved != eB.MoveNext())
+ return false;
+ if (!moved)
+ return true;
+ if (eA.Current == null && eB.Current == null)
+ return true;
+ if (!CheckEquals(eA.Current, eB.Current))
+ return true;
+ }
}
- catch (Exception)
+ finally
{
- Console.WriteLine("Error during equality check of type " + obj?.GetType()?.FullName);
- throw;
+ (eA as IDisposable)?.Dispose();
+ (eB as IDisposable)?.Dispose();
}
}
- private static MethodInfo GetExtensionMethod(Assembly assembly, Type extendedType)
+ private static MethodInfo GetExtensionMethod(Type extendedType)
{
if (extendedType.IsGenericType)
{
- return typeof(EqualityExtensions).GetMethods()
- ?.SingleOrDefault(m => m.Name == "IsEqual" && m.GetParameters().Length == 2 && m.GetParameters()[0].ParameterType.Name == extendedType.Name)
- ?.MakeGenericMethod(extendedType.GenericTypeArguments[0]);
- }
- else
- {
- return typeof(EqualityExtensions).GetMethod("IsEqual", new[] { extendedType, extendedType });
+ MethodInfo method = typeof(EqualityExtensions).GetMethods()
+ ?.SingleOrDefault(m =>
+ m.Name == "IsEqual" &&
+ m.GetParameters().Length == 2 &&
+ m.GetParameters()[0].ParameterType.Name == extendedType.Name &&
+ m.IsGenericMethodDefinition);
+ if (method != null)
+ return method.MakeGenericMethod(extendedType.GenericTypeArguments[0]);
}
+
+ return typeof(EqualityExtensions).GetMethod("IsEqual", new[] { extendedType, extendedType });
}
public static string GetTestDataFilePath()
@@ -140,11 +183,11 @@ namespace System.Runtime.Serialization.Formatters.Tests
if (PlatformDetection.IsFullFramework)
{
- testDataLine = Regex.Replace(testDataLine, ", \"AAEAAAD.+\"(?!,)", ", \"" + blobs[numberOfBlobs] + "\"");
+ testDataLine = Regex.Replace(testDataLine, ", \"AAEAAAD[^\"]+\"(?!,)", ", \"" + blobs[numberOfBlobs] + "\"");
}
else
{
- testDataLine = Regex.Replace(testDataLine, "\"AAEAAAD.+\",", "\"" + blobs[numberOfBlobs] + "\",");
+ testDataLine = Regex.Replace(testDataLine, "\"AAEAAAD[^\"]+\",", "\"" + blobs[numberOfBlobs] + "\",");
}
updatedTestDataLines.Add(testDataLine);
diff --git a/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTestData.cs b/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTestData.cs
index e1f3405b37..7780900bc7 100644
--- a/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTestData.cs
+++ b/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTestData.cs
@@ -1,11 +1,17 @@
+using System.Collections;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+using System.ComponentModel;
using System.Data;
using System.Data.SqlTypes;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Numerics;
+using System.Reflection;
using System.Text;
+using Xunit;
namespace System.Runtime.Serialization.Formatters.Tests
{
@@ -21,11 +27,11 @@ namespace System.Runtime.Serialization.Formatters.Tests
public static IEnumerable<object[]> SerializableEqualityComparers_MemberData()
{
// Internal specialized equality comparers
- yield return new object[] { EqualityComparer<UInt32Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=" } };
- yield return new object[] { EqualityComparer<Int64Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50NjRFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50NjRFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
- yield return new object[] { EqualityComparer<UInt64Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDY0RW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDY0RW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=" } };
- yield return new object[] { EqualityComparer<SByteEnum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU0J5dGVFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU0J5dGVFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
- yield return new object[] { EqualityComparer<Int16Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50MTZFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50MTZFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
+ yield return new object[] { EqualityComparer<UInt32Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=" } };
+ yield return new object[] { EqualityComparer<Int64Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50NjRFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50NjRFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
+ yield return new object[] { EqualityComparer<UInt64Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDY0RW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVUludDY0RW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=" } };
+ yield return new object[] { EqualityComparer<SByteEnum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU0J5dGVFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU0J5dGVFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
+ yield return new object[] { EqualityComparer<Int16Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50MTZFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSW50MTZFbnVtLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
}
/// <summary>
@@ -36,67 +42,67 @@ namespace System.Runtime.Serialization.Formatters.Tests
public static IEnumerable<object[]> SerializableObjects_MemberData()
{
// Primitive types
- yield return new object[] { byte.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQACAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQACAAs=" } };
- yield return new object[] { byte.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQAC/ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQAC/ws=" } };
- yield return new object[] { sbyte.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACoAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACoAL" } };
- yield return new object[] { sbyte.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACn8L", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACn8L" } };
- yield return new object[] { short.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUABwCACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUABwCACw==" } };
- yield return new object[] { short.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUAB/9/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUAB/9/Cw==" } };
- yield return new object[] { ushort.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA4AAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA4AAAs=" } };
- yield return new object[] { ushort.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA7//ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA7//ws=" } };
- yield return new object[] { int.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAAAAIAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAAAAIAL" } };
- yield return new object[] { int.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACP///38L", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACP///38L" } };
- yield return new object[] { uint.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA8AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA8AAAAACw==" } };
- yield return new object[] { uint.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA//////Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA//////Cw==" } };
- yield return new object[] { long.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACQAAAAAAAACACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACQAAAAAAAACACw==" } };
- yield return new object[] { long.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACf////////9/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACf////////9/Cw==" } };
- yield return new object[] { ulong.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABAAAAAAAAAAAAs=" } };
- yield return new object[] { ulong.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABD//////////ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABD//////////ws=" } };
- yield return new object[] { char.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQADAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQADAAs=" } };
- yield return new object[] { char.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQAD77+/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQAD77+/Cw==" } };
- yield return new object[] { float.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//3//Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//3//Cw==" } };
- yield return new object[] { float.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//39/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//39/Cw==" } };
- yield return new object[] { double.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////v/ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////v/ws=" } };
- yield return new object[] { double.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////vfws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////vfws=" } };
- yield return new object[] { decimal.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACA////////////////Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACA////////////////Cw==" } };
- yield return new object[] { decimal.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAAAA////////////////Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAAAA////////////////Cw==" } };
- yield return new object[] { decimal.MinusOne, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACAAAAAAAEAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACAAAAAAAEAAAAAAAAACw==" } };
- yield return new object[] { true, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAQs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAQs=" } };
- yield return new object[] { false, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=" } };
- yield return new object[] { "", new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGAQAAAAAL", "AAEAAAD/////AQAAAAAAAAAGAQAAAAAL" } };
- yield return new object[] { "c", new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGAQAAAAFjCw==", "AAEAAAD/////AQAAAAAAAAAGAQAAAAFjCw==" } };
- yield return new object[] { "\u4F60\u597D", new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGAQAAAAbkvaDlpb0L", "AAEAAAD/////AQAAAAAAAAAGAQAAAAbkvaDlpb0L" } };
- yield return new object[] { "some\0data\0with\0null\0chars", new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGAQAAABlzb21lAGRhdGEAd2l0aABudWxsAGNoYXJzCw==", "AAEAAAD/////AQAAAAAAAAAGAQAAABlzb21lAGRhdGEAd2l0aABudWxsAGNoYXJzCw==" } };
- yield return new object[] { "<>&\"\'", new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGAQAAAAU8PiYiJws=", "AAEAAAD/////AQAAAAAAAAAGAQAAAAU8PiYiJws=" } };
- yield return new object[] { " < ", new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGAQAAAAMgPCAL", "AAEAAAD/////AQAAAAAAAAAGAQAAAAMgPCAL" } };
- yield return new object[] { "minchar" + char.MinValue + "minchar", new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGAQAAAA9taW5jaGFyAG1pbmNoYXIL", "AAEAAAD/////AQAAAAAAAAAGAQAAAA9taW5jaGFyAG1pbmNoYXIL" } };
+ yield return new object[] { byte.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQACAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQACAAs=" } };
+ yield return new object[] { byte.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQAC/ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQnl0ZQEAAAAHbV92YWx1ZQAC/ws=" } };
+ yield return new object[] { sbyte.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACoAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACoAL" } };
+ yield return new object[] { sbyte.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACn8L", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uU0J5dGUBAAAAB21fdmFsdWUACn8L" } };
+ yield return new object[] { short.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUABwCACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUABwCACw==" } };
+ yield return new object[] { short.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUAB/9/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MTYBAAAAB21fdmFsdWUAB/9/Cw==" } };
+ yield return new object[] { ushort.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA4AAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA4AAAs=" } };
+ yield return new object[] { ushort.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA7//ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDE2AQAAAAdtX3ZhbHVlAA7//ws=" } };
+ yield return new object[] { int.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAAAAIAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAAAAIAL" } };
+ yield return new object[] { int.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACP///38L", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACP///38L" } };
+ yield return new object[] { uint.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA8AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA8AAAAACw==" } };
+ yield return new object[] { uint.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA//////Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDMyAQAAAAdtX3ZhbHVlAA//////Cw==" } };
+ yield return new object[] { long.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACQAAAAAAAACACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACQAAAAAAAACACw==" } };
+ yield return new object[] { long.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACf////////9/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50NjQBAAAAB21fdmFsdWUACf////////9/Cw==" } };
+ yield return new object[] { ulong.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABAAAAAAAAAAAAs=" } };
+ yield return new object[] { ulong.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABD//////////ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uVUludDY0AQAAAAdtX3ZhbHVlABD//////////ws=" } };
+ yield return new object[] { char.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQADAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQADAAs=" } };
+ yield return new object[] { char.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQAD77+/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uQ2hhcgEAAAAHbV92YWx1ZQAD77+/Cw==" } };
+ yield return new object[] { float.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//3//Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//3//Cw==" } };
+ yield return new object[] { float.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//39/Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uU2luZ2xlAQAAAAdtX3ZhbHVlAAv//39/Cw==" } };
+ yield return new object[] { double.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////v/ws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////v/ws=" } };
+ yield return new object[] { double.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////vfws=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uRG91YmxlAQAAAAdtX3ZhbHVlAAb////////vfws=" } };
+ yield return new object[] { decimal.MinValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACA////////////////Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACA////////////////Cw==" } };
+ yield return new object[] { decimal.MaxValue, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAAAA////////////////Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAAAA////////////////Cw==" } };
+ yield return new object[] { decimal.MinusOne, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACAAAAAAAEAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uRGVjaW1hbAQAAAAFZmxhZ3MCaGkCbG8DbWlkAAAAAAgICAgAAACAAAAAAAEAAAAAAAAACw==" } };
+ yield return new object[] { true, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAQs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAQs=" } };
+ yield return new object[] { false, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=" } };
+ yield return new object[] { "", new string[] { "AAEAAAD/////AQAAAAAAAAAGAQAAAAAL", "AAEAAAD/////AQAAAAAAAAAGAQAAAAAL" } };
+ yield return new object[] { "c", new string[] { "AAEAAAD/////AQAAAAAAAAAGAQAAAAFjCw==", "AAEAAAD/////AQAAAAAAAAAGAQAAAAFjCw==" } };
+ yield return new object[] { "\u4F60\u597D", new string[] { "AAEAAAD/////AQAAAAAAAAAGAQAAAAbkvaDlpb0L", "AAEAAAD/////AQAAAAAAAAAGAQAAAAbkvaDlpb0L" } };
+ yield return new object[] { "some\0data\0with\0null\0chars", new string[] { "AAEAAAD/////AQAAAAAAAAAGAQAAABlzb21lAGRhdGEAd2l0aABudWxsAGNoYXJzCw==", "AAEAAAD/////AQAAAAAAAAAGAQAAABlzb21lAGRhdGEAd2l0aABudWxsAGNoYXJzCw==" } };
+ yield return new object[] { "<>&\"\'", new string[] { "AAEAAAD/////AQAAAAAAAAAGAQAAAAU8PiYiJws=", "AAEAAAD/////AQAAAAAAAAAGAQAAAAU8PiYiJws=" } };
+ yield return new object[] { " < ", new string[] { "AAEAAAD/////AQAAAAAAAAAGAQAAAAMgPCAL", "AAEAAAD/////AQAAAAAAAAAGAQAAAAMgPCAL" } };
+ yield return new object[] { "minchar" + char.MinValue + "minchar", new string[] { "AAEAAAD/////AQAAAAAAAAAGAQAAAA9taW5jaGFyAG1pbmNoYXIL", "AAEAAAD/////AQAAAAAAAAAGAQAAAA9taW5jaGFyAG1pbmNoYXIL" } };
// Enum values
yield return new object[] { DayOfWeek.Monday, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABBTeXN0ZW0uRGF5T2ZXZWVrAQAAAAd2YWx1ZV9fAAgBAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABBTeXN0ZW0uRGF5T2ZXZWVrAQAAAAd2YWx1ZV9fAAgBAAAACw==" } };
yield return new object[] { DateTimeKind.Local, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABNTeXN0ZW0uRGF0ZVRpbWVLaW5kAQAAAAd2YWx1ZV9fAAgCAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABNTeXN0ZW0uRGF0ZVRpbWVLaW5kAQAAAAd2YWx1ZV9fAAgCAAAACw==" } };
// Nullables
- yield return new object[] { (int?)1, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAEAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAEAAAAL" } };
+ yield return new object[] { (int?)1, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAEAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAAxTeXN0ZW0uSW50MzIBAAAAB21fdmFsdWUACAEAAAAL" } };
yield return new object[] { (StructWithIntField?)new StructWithIntField() { X = 42 }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABAU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhJbnRGaWVsZAEAAAABWAAIAgAAACoAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABAU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhJbnRGaWVsZAEAAAABWAAIAgAAACoAAAAL" } };
// Nullable equality comparer roundtrips as opposed to other equality comparers which serialize to ObjectEqualityComparer
- yield return new object[] { EqualityComparer<int>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
- yield return new object[] { EqualityComparer<long>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
- yield return new object[] { EqualityComparer<string>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
- yield return new object[] { EqualityComparer<object>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
- yield return new object[] { EqualityComparer<int?>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
- yield return new object[] { EqualityComparer<double?>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
+ yield return new object[] { EqualityComparer<int>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+ yield return new object[] { EqualityComparer<long>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+ yield return new object[] { EqualityComparer<string>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+ yield return new object[] { EqualityComparer<object>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+ yield return new object[] { EqualityComparer<int?>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+ yield return new object[] { EqualityComparer<double?>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAJMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
// Equality comparers which can roundtrip
- yield return new object[] { EqualityComparer<byte>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAC9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5CeXRlRXF1YWxpdHlDb21wYXJlcgAAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAC9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5CeXRlRXF1YWxpdHlDb21wYXJlcgAAAAAL" } };
- yield return new object[] { EqualityComparer<Int32Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRW51bUVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRW51bUVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=" } };
+ yield return new object[] { EqualityComparer<byte>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAC9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5CeXRlRXF1YWxpdHlDb21wYXJlcgAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAC9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5CeXRlRXF1YWxpdHlDb21wYXJlcgAAAAAL" } };
+ yield return new object[] { EqualityComparer<Int32Enum>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRW51bUVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRW51bUVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkludDMyRW51bSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=" } };
// Other core serializable types
- yield return new object[] { IntPtr.Zero, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAA1TeXN0ZW0uSW50UHRyAQAAAAV2YWx1ZQAJAgAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uSW50UHRyAQAAAAV2YWx1ZQAJAAAAAAAAAAAL" } };
- yield return new object[] { UIntPtr.Zero, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAA5TeXN0ZW0uVUludFB0cgEAAAAFdmFsdWUAEAIAAAAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uVUludFB0cgEAAAAFdmFsdWUAEAAAAAAAAAAACw==" } };
- yield return new object[] { new DateTime(1990, 11, 23), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAA9TeXN0ZW0uRGF0ZVRpbWUCAAAABXRpY2tzCGRhdGVEYXRhAAAJEADA9z1t7LYIAMD3PW3stggL", "AAEAAAD/////AQAAAAAAAAAEAQAAAA9TeXN0ZW0uRGF0ZVRpbWUCAAAABXRpY2tzCGRhdGVEYXRhAAAJEADA9z1t7LYIAMD3PW3stggL" } };
- yield return new object[] { new DateTimeOffset(1990, 11, 23, 03, 30, 00, 00, TimeSpan.FromMinutes(30)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0ZVRpbWVPZmZzZXQCAAAACERhdGVUaW1lDU9mZnNldE1pbnV0ZXMAAA0HAgAAAAD4RGOG7LYIHgAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABVTeXN0ZW0uRGF0ZVRpbWVPZmZzZXQCAAAACERhdGVUaW1lDU9mZnNldE1pbnV0ZXMAAA0HAPhEY4bstggeAAs=" } };
- yield return new object[] { TimeZoneInfo.Utc, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uVGltZVpvbmVJbmZvBwAAAAJJZAtEaXNwbGF5TmFtZQxTdGFuZGFyZE5hbWUMRGF5bGlnaHROYW1lDUJhc2VVdGNPZmZzZXQPQWRqdXN0bWVudFJ1bGVzGlN1cHBvcnRzRGF5bGlnaHRTYXZpbmdUaW1lAQEBAQACAAwBAgAAAAYEAAAAA1VUQwkEAAAACQQAAAAJBAAAAAAAAAAAAAAACgAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uVGltZVpvbmVJbmZvBwAAAAJJZAtEaXNwbGF5TmFtZQxTdGFuZGFyZE5hbWUMRGF5bGlnaHROYW1lDUJhc2VVdGNPZmZzZXQPQWRqdXN0bWVudFJ1bGVzGlN1cHBvcnRzRGF5bGlnaHRTYXZpbmdUaW1lAQEBAQACAAwBAgAAAAYDAAAAA1VUQwkDAAAACQMAAAAJAwAAAAAAAAAAAAAACgAL" } };
+ yield return new object[] { IntPtr.Zero, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uSW50UHRyAQAAAAV2YWx1ZQAJAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAA1TeXN0ZW0uSW50UHRyAQAAAAV2YWx1ZQAJAAAAAAAAAAAL" } };
+ yield return new object[] { UIntPtr.Zero, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uVUludFB0cgEAAAAFdmFsdWUAEAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uVUludFB0cgEAAAAFdmFsdWUAEAAAAAAAAAAACw==" } };
+ yield return new object[] { new DateTime(1990, 11, 23), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA9TeXN0ZW0uRGF0ZVRpbWUCAAAABXRpY2tzCGRhdGVEYXRhAAAJEADA9z1t7LYIAMD3PW3stggL", "AAEAAAD/////AQAAAAAAAAAEAQAAAA9TeXN0ZW0uRGF0ZVRpbWUCAAAABXRpY2tzCGRhdGVEYXRhAAAJEADA9z1t7LYIAMD3PW3stggL" } };
+ yield return new object[] { new DateTimeOffset(1990, 11, 23, 03, 30, 00, 00, TimeSpan.FromMinutes(30)), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABVTeXN0ZW0uRGF0ZVRpbWVPZmZzZXQCAAAACERhdGVUaW1lDU9mZnNldE1pbnV0ZXMAAA0HAPhEY4bstggeAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABVTeXN0ZW0uRGF0ZVRpbWVPZmZzZXQCAAAACERhdGVUaW1lDU9mZnNldE1pbnV0ZXMAAA0HAPhEY4bstggeAAs=" } };
+ yield return new object[] { TimeZoneInfo.Utc, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uVGltZVpvbmVJbmZvBwAAAAJJZAtEaXNwbGF5TmFtZQxTdGFuZGFyZE5hbWUMRGF5bGlnaHROYW1lDUJhc2VVdGNPZmZzZXQPQWRqdXN0bWVudFJ1bGVzGlN1cHBvcnRzRGF5bGlnaHRTYXZpbmdUaW1lAQEBAQACAAwBAgAAAAYDAAAAA1VUQwkDAAAACQMAAAAJAwAAAAAAAAAAAAAACgAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uVGltZVpvbmVJbmZvBwAAAAJJZAtEaXNwbGF5TmFtZQxTdGFuZGFyZE5hbWUMRGF5bGlnaHROYW1lDUJhc2VVdGNPZmZzZXQPQWRqdXN0bWVudFJ1bGVzGlN1cHBvcnRzRGF5bGlnaHRTYXZpbmdUaW1lAQEBAQACAAwBAgAAAAYDAAAAA1VUQwkDAAAACQMAAAAJAwAAAAAAAAAAAAAACgAL" } };
yield return new object[] { TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 3, 15), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uVGltZVpvbmVJbmZvK1RyYW5zaXRpb25UaW1lBgAAAAlUaW1lT2ZEYXkFTW9udGgEV2VlawNEYXkJRGF5T2ZXZWVrD0lzRml4ZWREYXRlUnVsZQAAAAADAA0CAgIQU3lzdGVtLkRheU9mV2VlawEA0IjDEAAAAAMBDwT+////EFN5c3RlbS5EYXlPZldlZWsBAAAAB3ZhbHVlX18ACAAAAAABCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACJTeXN0ZW0uVGltZVpvbmVJbmZvK1RyYW5zaXRpb25UaW1lBgAAAAlUaW1lT2ZEYXkFTW9udGgEV2VlawNEYXkJRGF5T2ZXZWVrD0lzRml4ZWREYXRlUnVsZQAAAAADAA0CAgIQU3lzdGVtLkRheU9mV2VlawECAAAAANCIwxAAAAADAQ8E/f///xBTeXN0ZW0uRGF5T2ZXZWVrAQAAAAd2YWx1ZV9fAAgAAAAAAQs=" } };
var adjustmentRule = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(
@@ -107,62 +113,117 @@ namespace System.Runtime.Serialization.Formatters.Tests
TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 3, 4));
yield return new object[] { adjustmentRule, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uVGltZVpvbmVJbmZvK0FkanVzdG1lbnRSdWxlBwAAAAlEYXRlU3RhcnQHRGF0ZUVuZA1EYXlsaWdodERlbHRhF0RheWxpZ2h0VHJhbnNpdGlvblN0YXJ0FURheWxpZ2h0VHJhbnNpdGlvbkVuZBJCYXNlVXRjT2Zmc2V0RGVsdGEVTm9EYXlsaWdodFRyYW5zaXRpb25zAAAAAwMAAA0NDCJTeXN0ZW0uVGltZVpvbmVJbmZvK1RyYW5zaXRpb25UaW1lIlN5c3RlbS5UaW1lWm9uZUluZm8rVHJhbnNpdGlvblRpbWUMAQBAVyBTBVEIAEDGiJPMjwgA0IjDEAAAAAT+////IlN5c3RlbS5UaW1lWm9uZUluZm8rVHJhbnNpdGlvblRpbWUGAAAACVRpbWVPZkRheQVNb250aARXZWVrA0RheQlEYXlPZldlZWsPSXNGaXhlZERhdGVSdWxlAAAAAAMADQICAhBTeXN0ZW0uRGF5T2ZXZWVrAQDQiMMQAAAAAgEDBP3///8QU3lzdGVtLkRheU9mV2VlawEAAAAHdmFsdWVfXwAIAAAAAAEB/P////7///8A0IjDEAAAAAMBBAH7/////f///wAAAAABAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACJTeXN0ZW0uVGltZVpvbmVJbmZvK0FkanVzdG1lbnRSdWxlBgAAAAlEYXRlU3RhcnQHRGF0ZUVuZA1EYXlsaWdodERlbHRhF0RheWxpZ2h0VHJhbnNpdGlvblN0YXJ0FURheWxpZ2h0VHJhbnNpdGlvbkVuZBJCYXNlVXRjT2Zmc2V0RGVsdGEAAAAEBAANDQwiU3lzdGVtLlRpbWVab25lSW5mbytUcmFuc2l0aW9uVGltZQIAAAAiU3lzdGVtLlRpbWVab25lSW5mbytUcmFuc2l0aW9uVGltZQIAAAAMAgAAAABAVyBTBVEIAEDGiJPMjwgA0IjDEAAAAAX9////IlN5c3RlbS5UaW1lWm9uZUluZm8rVHJhbnNpdGlvblRpbWUGAAAACVRpbWVPZkRheQVNb250aARXZWVrA0RheQlEYXlPZldlZWsPSXNGaXhlZERhdGVSdWxlAAAAAAMADQICAhBTeXN0ZW0uRGF5T2ZXZWVrAQIAAAAA0IjDEAAAAAIBAwT8////EFN5c3RlbS5EYXlPZldlZWsBAAAAB3ZhbHVlX18ACAAAAAABAfv////9////ANCIwxAAAAADAQQB+v////z///8AAAAAAQAAAAAAAAAACw==" } };
yield return new object[] { TimeSpan.FromDays(7), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA9TeXN0ZW0uVGltZVNwYW4BAAAABl90aWNrcwAJAEDkKIAFAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAA9TeXN0ZW0uVGltZVNwYW4BAAAABl90aWNrcwAJAEDkKIAFAAAL" } };
- yield return new object[] { new Version(1, 2, 3, 4), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgCAAAAAQAAAAIAAAADAAAABAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgBAAAAAgAAAAMAAAAEAAAACw==" } };
- yield return new object[] { new Guid("0CACAA4D-C6BD-420A-B660-2F557337CA89"), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAAtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICAgAAAE2qrAy9xgpCtmAvVXM3yokL", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICTaqsDL3GCkK2YC9VczfKiQs=" } };
- yield return new object[] { new List<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAIAAAAJAwAAAAAAAAAAAAAADwMAAAAAAAAACAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAAAAAAAAAAAPAgAAAAAAAAAICw==" } };
- yield return new object[] { new List<int>() { 1, 2, 3, 4, 5 }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAIAAAAJAwAAAAUAAAAFAAAADwMAAAAIAAAACAEAAAACAAAAAwAAAAQAAAAFAAAAAAAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAABQAAAAUAAAAPAgAAAAgAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAAAAAAAAAAAAAAAAAL" } };
+ yield return new object[] { new Version(1, 2, 3, 4), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgBAAAAAgAAAAMAAAAEAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgBAAAAAgAAAAMAAAAEAAAACw==" } };
+ yield return new object[] { new Guid("0CACAA4D-C6BD-420A-B660-2F557337CA89"), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICTaqsDL3GCkK2YC9VczfKiQs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAAtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICTaqsDL3GCkK2YC9VczfKiQs=" } };
+ yield return new object[] { new List<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAAAAAAAAAAAPAgAAAAAAAAAICw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAAAAAAAAAAAPAgAAAAAAAAAICw==" } };
+ yield return new object[] { new List<int>(27), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAAAAAAAAAAAPAgAAABsAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAAAAAAAAAAAPAgAAABsAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACw==" } };
+ yield return new object[] { new List<int>() { 1, 2, 3, 4, 5 }, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAABQAAAAUAAAAPAgAAAAgAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAAAAAAAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAABQAAAAUAAAAPAgAAAAgAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAAAAAAAAAAAAAAAAAL" } };
var dictionary = new Dictionary<int, string>() { { 1, "test" }, { 2, "another test" } };
- yield return new object[] { dictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplDUtleVZhbHVlUGFpcnMABAADCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAI5QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAIAAAAJAwAAAAMAAAAJBAAAAAUDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAIAAAAHBAAAAAABAAAAAgAAAATjAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAX7////4wFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAADa2V5BXZhbHVlAAEIAgAAAAEAAAAGBgAAAAR0ZXN0Afn////7////AgAAAAYIAAAADGFub3RoZXIgdGVzdAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplDUtleVZhbHVlUGFpcnMAAwADCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQjlAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10CAAAACQIAAAADAAAACQMAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAHAwAAAAABAAAAAgAAAAPjAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBPz////jAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUAAQgBAAAABgUAAAAEdGVzdAH6/////P///wIAAAAGBwAAAAxhbm90aGVyIHRlc3QL" } };
+ yield return new object[] { dictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplDUtleVZhbHVlUGFpcnMAAwADCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQjlAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10CAAAACQIAAAADAAAACQMAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAHAwAAAAABAAAAAgAAAAPjAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBPz////jAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUAAQgBAAAABgUAAAAEdGVzdAH6/////P///wIAAAAGBwAAAAxhbm90aGVyIHRlc3QL", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplDUtleVZhbHVlUGFpcnMAAwADCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQjlAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10CAAAACQIAAAADAAAACQMAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAHAwAAAAABAAAAAgAAAAPjAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBPz////jAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUAAQgBAAAABgUAAAAEdGVzdAH6/////P///wIAAAAGBwAAAAxhbm90aGVyIHRlc3QL" } };
var pointDictionary = new Dictionary<int, Point>()
{
{ 1, new Point(1, 1) },
{ 2, new Point(2, 2) }
};
- yield return new object[] { Tuple.Create(1), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQAIAgAAAAEAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQAIAQAAAAs=" } };
- yield return new object[] { Tuple.Create(1, "2"), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAMgBU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAB21fSXRlbTEHbV9JdGVtMgABCAIAAAABAAAABgMAAAABMgs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAMgBU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAB21fSXRlbTEHbV9JdGVtMgABCAEAAAAGAgAAAAEyCw==" } };
- yield return new object[] { Tuple.Create(1, "2", 3u), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAKUCU3lzdGVtLlR1cGxlYDNbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zAAEACA8CAAAAAQAAAAYDAAAAATIDAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAKUCU3lzdGVtLlR1cGxlYDNbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zAAEACA8BAAAABgIAAAABMgMAAAAL" } };
- yield return new object[] { Tuple.Create(1, "2", 3u, 4L), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIEDU3lzdGVtLlR1cGxlYDRbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAABAAAIDwkCAAAAAQAAAAYDAAAAATIDAAAABAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAIEDU3lzdGVtLlR1cGxlYDRbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAABAAAIDwkBAAAABgIAAAABMgMAAAAEAAAAAAAAAAs=" } };
- yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAN4DU3lzdGVtLlR1cGxlYDVbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01AAEAAAAIDwkGAgAAAAEAAAAGAwAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAN4DU3lzdGVtLlR1cGxlYDVbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01AAEAAAAIDwkGAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQAs=" } };
- yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6, 7.8f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAALsEU3lzdGVtLlR1cGxlYDZbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQYAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01B21fSXRlbTYAAQAAAAAIDwkGCwIAAAABAAAABgMAAAABMgMAAAAEAAAAAAAAAGZmZmZmZhZAmpn5QAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAALsEU3lzdGVtLlR1cGxlYDZbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQYAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01B21fSXRlbTYAAQAAAAAIDwkGCwEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflACw==" } };
- yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJkFU3lzdGVtLlR1cGxlYDdbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcAAQAAAAAACA8JBgsFAgAAAAEAAAAGAwAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflAATkL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJkFU3lzdGVtLlR1cGxlYDdbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcAAQAAAAAACA8JBgsFAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UABOQs=" } };
- yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m, Tuple.Create(10)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAALMHU3lzdGVtLlR1cGxlYDhbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcGbV9SZXN0AAEAAAAAAAQIDwkGCwXKAVN5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAAgAAAAEAAAAGAwAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflAATkJBAAAAAUEAAAAygFTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAdtX0l0ZW0xBGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAACQUAAAAFBQAAAGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQAIAgAAAAoAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAALMHU3lzdGVtLlR1cGxlYDhbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcGbV9SZXN0AAEAAAAAAAMIDwkGCwXKAVN5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABgIAAAABMgMAAAAEAAAAAAAAAGZmZmZmZhZAmpn5QAE5CQMAAAAEAwAAAMoBU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQNrU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JBAAAAAQEAAAAa1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAdtX0l0ZW0xAAgKAAAACw==" } };
- yield return new object[] { new KeyValuePair<int, byte>(42, 84), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkJ5dGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUAAAgCAgAAACoAAABUCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkJ5dGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUAAAgCKgAAAFQL" } };
+ yield return new object[] { Tuple.Create(1), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQAIAQAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQAIAQAAAAs=" } };
+ yield return new object[] { Tuple.Create(1, "2"), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAMgBU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAB21fSXRlbTEHbV9JdGVtMgABCAEAAAAGAgAAAAEyCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAMgBU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAB21fSXRlbTEHbV9JdGVtMgABCAEAAAAGAgAAAAEyCw==" } };
+ yield return new object[] { Tuple.Create(1, "2", 3u), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAKUCU3lzdGVtLlR1cGxlYDNbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zAAEACA8BAAAABgIAAAABMgMAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAKUCU3lzdGVtLlR1cGxlYDNbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zAAEACA8BAAAABgIAAAABMgMAAAAL" } };
+ yield return new object[] { Tuple.Create(1, "2", 3u, 4L), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAIEDU3lzdGVtLlR1cGxlYDRbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAABAAAIDwkBAAAABgIAAAABMgMAAAAEAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAIEDU3lzdGVtLlR1cGxlYDRbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAABAAAIDwkBAAAABgIAAAABMgMAAAAEAAAAAAAAAAs=" } };
+ yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAN4DU3lzdGVtLlR1cGxlYDVbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01AAEAAAAIDwkGAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAN4DU3lzdGVtLlR1cGxlYDVbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01AAEAAAAIDwkGAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQAs=" } };
+ yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6, 7.8f), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAALsEU3lzdGVtLlR1cGxlYDZbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQYAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01B21fSXRlbTYAAQAAAAAIDwkGCwEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAALsEU3lzdGVtLlR1cGxlYDZbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQYAAAAHbV9JdGVtMQdtX0l0ZW0yB21fSXRlbTMHbV9JdGVtNAdtX0l0ZW01B21fSXRlbTYAAQAAAAAIDwkGCwEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflACw==" } };
+ yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJkFU3lzdGVtLlR1cGxlYDdbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcAAQAAAAAACA8JBgsFAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UABOQs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAJkFU3lzdGVtLlR1cGxlYDdbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcAAQAAAAAACA8JBgsFAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UABOQs=" } };
+ yield return new object[] { Tuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m, Tuple.Create(10)), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAALMHU3lzdGVtLlR1cGxlYDhbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcGbV9SZXN0AAEAAAAAAAMIDwkGCwXKAVN5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABgIAAAABMgMAAAAEAAAAAAAAAGZmZmZmZhZAmpn5QAE5CQMAAAAEAwAAAMoBU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQNrU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JBAAAAAQEAAAAa1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAdtX0l0ZW0xAAgKAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAALMHU3lzdGVtLlR1cGxlYDhbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlVJbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRG91YmxlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU2luZ2xlLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGVjaW1hbCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAAAAB21fSXRlbTEHbV9JdGVtMgdtX0l0ZW0zB21fSXRlbTQHbV9JdGVtNQdtX0l0ZW02B21fSXRlbTcGbV9SZXN0AAEAAAAAAAMIDwkGCwXKAVN5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABgIAAAABMgMAAAAEAAAAAAAAAGZmZmZmZhZAmpn5QAE5CQMAAAAEAwAAAMoBU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQNrU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JBAAAAAQEAAAAa1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAdtX0l0ZW0xAAgKAAAACw==" } };
+ yield return new object[] { new KeyValuePair<int, byte>(42, 84), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkJ5dGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUAAAgCKgAAAFQL", "AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkJ5dGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUAAAgCKgAAAFQL" } };
var dotnetUri = new Uri("https://dot.net");
yield return new object[] { dotnetUri, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAKU3lzdGVtLlVyaQEAAAALQWJzb2x1dGVVcmkBAgAAAAYDAAAAEGh0dHBzOi8vZG90Lm5ldC8L", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAKU3lzdGVtLlVyaQEAAAALQWJzb2x1dGVVcmkBAgAAAAYDAAAAEGh0dHBzOi8vZG90Lm5ldC8L" } };
yield return new object[] { new Uri(dotnetUri, "articles/info.html"), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAKU3lzdGVtLlVyaQEAAAALQWJzb2x1dGVVcmkBAgAAAAYDAAAAImh0dHBzOi8vZG90Lm5ldC9hcnRpY2xlcy9pbmZvLmh0bWwL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAKU3lzdGVtLlVyaQEAAAALQWJzb2x1dGVVcmkBAgAAAAYDAAAAImh0dHBzOi8vZG90Lm5ldC9hcnRpY2xlcy9pbmZvLmh0bWwL" } };
- yield return new object[] { new WeakReference(dotnetUri, false), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAUU3lzdGVtLldlYWtSZWZlcmVuY2UCAAAADVRyYWNrZWRPYmplY3QRVHJhY2tSZXN1cnJlY3Rpb24EAApTeXN0ZW0uVXJpAwAAAAECAAAACQQAAAAABQQAAAAKU3lzdGVtLlVyaQEAAAALQWJzb2x1dGVVcmkBAwAAAAYFAAAAEGh0dHBzOi8vZG90Lm5ldC8L", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BAEAAAAUU3lzdGVtLldlYWtSZWZlcmVuY2UCAAAADVRyYWNrZWRPYmplY3QRVHJhY2tSZXN1cnJlY3Rpb24EAApTeXN0ZW0uVXJpAgAAAAEJAwAAAAAFAwAAAApTeXN0ZW0uVXJpAQAAAAtBYnNvbHV0ZVVyaQECAAAABgQAAAAQaHR0cHM6Ly9kb3QubmV0Lws=" } };
+ yield return new object[] { new WeakReference(dotnetUri, false), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BAEAAAAUU3lzdGVtLldlYWtSZWZlcmVuY2UCAAAADVRyYWNrZWRPYmplY3QRVHJhY2tSZXN1cnJlY3Rpb24EAApTeXN0ZW0uVXJpAgAAAAEJAwAAAAAFAwAAAApTeXN0ZW0uVXJpAQAAAAtBYnNvbHV0ZVVyaQECAAAABgQAAAAQaHR0cHM6Ly9kb3QubmV0Lws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BAEAAAAUU3lzdGVtLldlYWtSZWZlcmVuY2UCAAAADVRyYWNrZWRPYmplY3QRVHJhY2tSZXN1cnJlY3Rpb24EAApTeXN0ZW0uVXJpAgAAAAEJAwAAAAAFAwAAAApTeXN0ZW0uVXJpAQAAAAtBYnNvbHV0ZVVyaQECAAAABgQAAAAQaHR0cHM6Ly9kb3QubmV0Lws=" } };
var trackingPoint = new Point(2, 3);
- yield return new object[] { new WeakReference<Point>(trackingPoint, false), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAC/AVN5c3RlbS5XZWFrUmVmZXJlbmNlYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAA1UcmFja2VkT2JqZWN0EVRyYWNrUmVzdXJyZWN0aW9uBAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAECAAAACQQAAAAABQQAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAIAAAADAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAAC/AVN5c3RlbS5XZWFrUmVmZXJlbmNlYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAA1UcmFja2VkT2JqZWN0EVRyYWNrUmVzdXJyZWN0aW9uBAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAEJAwAAAAAFAwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgCAAAAAgAAAAMAAAAL" } };
- yield return new object[] { new StringBuilder(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICAIAAAD///9/EAAAAAYDAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICP///38QAAAABgIAAAAAAAAAAAs=" } };
- yield return new object[] { new StringBuilder("starting", 0, 5, 10), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICAIAAAD///9/CgAAAAYDAAAABXN0YXJ0AAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICP///38KAAAABgIAAAAFc3RhcnQAAAAACw==" } };
- var cookie = new Cookie("host", "edge", "auth", "dot.net");
- yield return new object[] { cookie, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADhTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQwDAAAASVN5c3RlbSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMBAAAAFhTeXN0ZW0uTmV0LlByaW1pdGl2ZXMsIFZlcnNpb249NC4xLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhBtX2RvbWFpbkltcGxpY2l0CW1fZXhwaXJlcwZtX25hbWUGbV9wYXRoDm1fcGF0aEltcGxpY2l0Bm1fcG9ydA5tX3BvcnRJbXBsaWNpdAptX3BvcnRMaXN0CG1fc2VjdXJlCm1faHR0cE9ubHkLbV90aW1lU3RhbXAHbV92YWx1ZQltX3ZlcnNpb24LbV9kb21haW5LZXkPSXNRdW90ZWRWZXJzaW9uDklzUXVvdGVkRG9tYWluAQQEAAEAAAEBAAEABwAAAAEAAQAAClN5c3RlbS5VcmkDAAAAGFN5c3RlbS5OZXQuQ29va2llVmFyaWFudAQAAAABAQ0BAQgBAQ0IAQECAAAABgUAAAAACgX6////GFN5c3RlbS5OZXQuQ29va2llVmFyaWFudAEAAAAHdmFsdWVfXwAIBAAAAAEAAAAABgcAAAAHZG90Lm5ldAAAAAAAAAAAAAYIAAAABGhvc3QGCQAAAARhdXRoAAkFAAAAAQoAALpa4GZ8sdQIBgsAAAAEZWRnZQAAAAAJBQAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhFtX2RvbWFpbl9pbXBsaWNpdAltX2V4cGlyZXMGbV9uYW1lBm1fcGF0aA9tX3BhdGhfaW1wbGljaXQGbV9wb3J0D21fcG9ydF9pbXBsaWNpdAttX3BvcnRfbGlzdAhtX3NlY3VyZQptX2h0dHBPbmx5C21fdGltZVN0YW1wB21fdmFsdWUJbV92ZXJzaW9uC21fZG9tYWluS2V5D0lzUXVvdGVkVmVyc2lvbg5Jc1F1b3RlZERvbWFpbgEEBAABAAABAQABAAcAAAABAAEAAApTeXN0ZW0uVXJpAgAAABhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQCAAAAAQENAQEIAQENCAEBAgAAAAYDAAAAAAoF/P///xhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQBAAAAB3ZhbHVlX18ACAIAAAABAAAAAAYFAAAAB2RvdC5uZXQAAAAAAAAAAAAGBgAAAARob3N0BgcAAAAEYXV0aAAJAwAAAAEKAACcB9D316nUiAYJAAAABGVkZ2UAAAAACQMAAAAAAAs=" } };
+ yield return new object[] { new WeakReference<Point>(trackingPoint, false), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAAC/AVN5c3RlbS5XZWFrUmVmZXJlbmNlYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAA1UcmFja2VkT2JqZWN0EVRyYWNrUmVzdXJyZWN0aW9uBAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAEJAwAAAAAFAwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgCAAAAAgAAAAMAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAAC/AVN5c3RlbS5XZWFrUmVmZXJlbmNlYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAA1UcmFja2VkT2JqZWN0EVRyYWNrUmVzdXJyZWN0aW9uBAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAEJAwAAAAAFAwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgCAAAAAgAAAAMAAAAL" } };
+ yield return new object[] { new StringBuilder(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICP///38QAAAABgIAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICP///38QAAAABgIAAAAAAAAAAAs=" } };
+ yield return new object[] { new StringBuilder("starting", 0, 5, 10), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICP///38KAAAABgIAAAAFc3RhcnQAAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABlTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyBAAAAA1tX01heENhcGFjaXR5CENhcGFjaXR5DW1fU3RyaW5nVmFsdWUPbV9jdXJyZW50VGhyZWFkAAABAAgICP///38KAAAABgIAAAAFc3RhcnQAAAAACw==" } };
+ var cookie = new Cookie("name1", "value", "/path", "127.0.0.1");
+ DateTime fixedTimestamp = DateTime.Parse("11/3/1989 04:50:29 AM", CultureInfo.InvariantCulture.DateTimeFormat);
+ typeof(Cookie)
+ .GetField("m_timeStamp", BindingFlags.Instance | BindingFlags.NonPublic)
+ .SetValue(cookie, fixedTimestamp);
+
+ yield return new object[] { cookie, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhFtX2RvbWFpbl9pbXBsaWNpdAltX2V4cGlyZXMGbV9uYW1lBm1fcGF0aA9tX3BhdGhfaW1wbGljaXQGbV9wb3J0D21fcG9ydF9pbXBsaWNpdAttX3BvcnRfbGlzdAhtX3NlY3VyZQptX2h0dHBPbmx5C21fdGltZVN0YW1wB21fdmFsdWUJbV92ZXJzaW9uC21fZG9tYWluS2V5D0lzUXVvdGVkVmVyc2lvbg5Jc1F1b3RlZERvbWFpbgEEBAABAAABAQABAAcAAAABAAEAAApTeXN0ZW0uVXJpAgAAABhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQCAAAAAQENAQEIAQENCAEBAgAAAAYDAAAAAAoF/P///xhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQBAAAAB3ZhbHVlX18ACAIAAAABAAAAAAYFAAAACTEyNy4wLjAuMQAAAAAAAAAAAAYGAAAABW5hbWUxBgcAAAAFL3BhdGgACQMAAAABCgAAgFhsCQ2+tQgGCQAAAAV2YWx1ZQAAAAAJAwAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhFtX2RvbWFpbl9pbXBsaWNpdAltX2V4cGlyZXMGbV9uYW1lBm1fcGF0aA9tX3BhdGhfaW1wbGljaXQGbV9wb3J0D21fcG9ydF9pbXBsaWNpdAttX3BvcnRfbGlzdAhtX3NlY3VyZQptX2h0dHBPbmx5C21fdGltZVN0YW1wB21fdmFsdWUJbV92ZXJzaW9uC21fZG9tYWluS2V5D0lzUXVvdGVkVmVyc2lvbg5Jc1F1b3RlZERvbWFpbgEEBAABAAABAQABAAcAAAABAAEAAApTeXN0ZW0uVXJpAgAAABhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQCAAAAAQENAQEIAQENCAEBAgAAAAYDAAAAAAoF/P///xhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQBAAAAB3ZhbHVlX18ACAIAAAABAAAAAAYFAAAACTEyNy4wLjAuMQAAAAAAAAAAAAYGAAAABW5hbWUxBgcAAAAFL3BhdGgACQMAAAABCgAAgFhsCQ2+tQgGCQAAAAV2YWx1ZQAAAAAJAwAAAAAACw==" } };
var cookieCollection = new CookieCollection();
cookieCollection.Add(cookie);
- yield return new object[] { cookieCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADhTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQwDAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAG1N5c3RlbS5OZXQuQ29va2llQ29sbGVjdGlvbgMAAAAGbV9saXN0C21fdGltZVN0YW1wFG1faGFzX290aGVyX3ZlcnNpb25zBAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QDAAAADQECAAAACQQAAAAAAAAAAAAAAAAFBAAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAMAAAAJBQAAAAEAAAABAAAAEAUAAAAEAAAACQYAAAANAwwHAAAASVN5c3RlbSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMCAAAAFhTeXN0ZW0uTmV0LlByaW1pdGl2ZXMsIFZlcnNpb249NC4xLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQYAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhBtX2RvbWFpbkltcGxpY2l0CW1fZXhwaXJlcwZtX25hbWUGbV9wYXRoDm1fcGF0aEltcGxpY2l0Bm1fcG9ydA5tX3BvcnRJbXBsaWNpdAptX3BvcnRMaXN0CG1fc2VjdXJlCm1faHR0cE9ubHkLbV90aW1lU3RhbXAHbV92YWx1ZQltX3ZlcnNpb24LbV9kb21haW5LZXkPSXNRdW90ZWRWZXJzaW9uDklzUXVvdGVkRG9tYWluAQQEAAEAAAEBAAEABwAAAAEAAQAAClN5c3RlbS5VcmkHAAAAGFN5c3RlbS5OZXQuQ29va2llVmFyaWFudAgAAAABAQ0BAQgBAQ0IAQECAAAABgkAAAAACgX2////GFN5c3RlbS5OZXQuQ29va2llVmFyaWFudAEAAAAHdmFsdWVfXwAICAAAAAEAAAAABgsAAAAHZG90Lm5ldAAAAAAAAAAAAAYMAAAABGhvc3QGDQAAAARhdXRoAAkJAAAAAQoAALpa4GZ8sdQIBg8AAAAEZWRnZQAAAAAJCQAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAbU3lzdGVtLk5ldC5Db29raWVDb2xsZWN0aW9uBQAAAAltX3ZlcnNpb24GbV9saXN0C21fVGltZVN0YW1wFG1faGFzX290aGVyX3ZlcnNpb25zDG1fSXNSZWFkT25seQADAAAACBxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQEBAgAAAAEAAAAJAwAAAAAAAAAAAAAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAQAAAAEAAAAQBAAAAAQAAAAJBQAAAA0DBQUAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhFtX2RvbWFpbl9pbXBsaWNpdAltX2V4cGlyZXMGbV9uYW1lBm1fcGF0aA9tX3BhdGhfaW1wbGljaXQGbV9wb3J0D21fcG9ydF9pbXBsaWNpdAttX3BvcnRfbGlzdAhtX3NlY3VyZQptX2h0dHBPbmx5C21fdGltZVN0YW1wB21fdmFsdWUJbV92ZXJzaW9uC21fZG9tYWluS2V5D0lzUXVvdGVkVmVyc2lvbg5Jc1F1b3RlZERvbWFpbgEEBAABAAABAQABAAcAAAABAAEAAApTeXN0ZW0uVXJpAgAAABhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQCAAAAAQENAQEIAQENCAEBAgAAAAYGAAAAAAoF+f///xhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQBAAAAB3ZhbHVlX18ACAIAAAABAAAAAAYIAAAAB2RvdC5uZXQAAAAAAAAAAAAGCQAAAARob3N0BgoAAAAEYXV0aAAJBgAAAAEKAACcB9D316nUiAYMAAAABGVkZ2UAAAAACQYAAAAAAAs=" } };
+ yield return new object[] { cookieCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAbU3lzdGVtLk5ldC5Db29raWVDb2xsZWN0aW9uAwAAAAZtX2xpc3QLbV90aW1lU3RhbXAUbV9oYXNfb3RoZXJfdmVyc2lvbnMDAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdA0BAgAAAAkDAAAAAAAAAAAAAAAABAMAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdAMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBQAACAgJBAAAAAEAAAABAAAAEAQAAAAEAAAACQUAAAANAwUFAAAAEVN5c3RlbS5OZXQuQ29va2llFQAAAAltX2NvbW1lbnQMbV9jb21tZW50VXJpD21fY29va2llVmFyaWFudAltX2Rpc2NhcmQIbV9kb21haW4RbV9kb21haW5faW1wbGljaXQJbV9leHBpcmVzBm1fbmFtZQZtX3BhdGgPbV9wYXRoX2ltcGxpY2l0Bm1fcG9ydA9tX3BvcnRfaW1wbGljaXQLbV9wb3J0X2xpc3QIbV9zZWN1cmUKbV9odHRwT25seQttX3RpbWVTdGFtcAdtX3ZhbHVlCW1fdmVyc2lvbgttX2RvbWFpbktleQ9Jc1F1b3RlZFZlcnNpb24OSXNRdW90ZWREb21haW4BBAQAAQAAAQEAAQAHAAAAAQABAAAKU3lzdGVtLlVyaQIAAAAYU3lzdGVtLk5ldC5Db29raWVWYXJpYW50AgAAAAEBDQEBCAEBDQgBAQIAAAAGBgAAAAAKBfn///8YU3lzdGVtLk5ldC5Db29raWVWYXJpYW50AQAAAAd2YWx1ZV9fAAgCAAAAAQAAAAAGCAAAAAkxMjcuMC4wLjEAAAAAAAAAAAAGCQAAAAVuYW1lMQYKAAAABS9wYXRoAAkGAAAAAQoAAIBYbAkNvrUIBgwAAAAFdmFsdWUAAAAACQYAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAbU3lzdGVtLk5ldC5Db29raWVDb2xsZWN0aW9uBQAAAAltX3ZlcnNpb24GbV9saXN0C21fVGltZVN0YW1wFG1faGFzX290aGVyX3ZlcnNpb25zDG1fSXNSZWFkT25seQADAAAACBxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQEBAgAAAAEAAAAJAwAAAAAAAAAAAAAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAQAAAAEAAAAQBAAAAAQAAAAJBQAAAA0DBQUAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhFtX2RvbWFpbl9pbXBsaWNpdAltX2V4cGlyZXMGbV9uYW1lBm1fcGF0aA9tX3BhdGhfaW1wbGljaXQGbV9wb3J0D21fcG9ydF9pbXBsaWNpdAttX3BvcnRfbGlzdAhtX3NlY3VyZQptX2h0dHBPbmx5C21fdGltZVN0YW1wB21fdmFsdWUJbV92ZXJzaW9uC21fZG9tYWluS2V5D0lzUXVvdGVkVmVyc2lvbg5Jc1F1b3RlZERvbWFpbgEEBAABAAABAQABAAcAAAABAAEAAApTeXN0ZW0uVXJpAgAAABhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQCAAAAAQENAQEIAQENCAEBAgAAAAYGAAAAAAoF+f///xhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQBAAAAB3ZhbHVlX18ACAIAAAABAAAAAAYIAAAACTEyNy4wLjAuMQAAAAAAAAAAAAYJAAAABW5hbWUxBgoAAAAFL3BhdGgACQYAAAABCgAAgFhsCQ2+tQgGDAAAAAV2YWx1ZQAAAAAJBgAAAAAACw==" } };
var cookieContainer = new CookieContainer(10, 5, 1024);
- cookieCollection.Add(cookie);
- yield return new object[] { cookieContainer, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADhTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQwDAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAGlN5c3RlbS5OZXQuQ29va2llQ29udGFpbmVyBgAAAA1tX2RvbWFpblRhYmxlD21fbWF4Q29va2llU2l6ZQxtX21heENvb2tpZXMVbV9tYXhDb29raWVzUGVyRG9tYWluB21fY291bnQObV9mcWRuTXlEb21haW4EAAAAAAH1AVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLk5ldC5QYXRoTGlzdCwgU3lzdGVtLk5ldC5QcmltaXRpdmVzLCBWZXJzaW9uPTQuMS4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYV1dAwAAAAgICAgCAAAACQQAAAAABAAACgAAAAUAAAAAAAAABgUAAAAgLm5vcnRoYW1lcmljYS5jb3JwLm1pY3Jvc29mdC5jb20FBAAAAPUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uTmV0LlBhdGhMaXN0LCBTeXN0ZW0uTmV0LlByaW1pdGl2ZXMsIFZlcnNpb249NC4xLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhXV0DAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUABAAIPlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk5vblJhbmRvbWl6ZWRTdHJpbmdFcXVhbGl0eUNvbXBhcmVyAwAAAAgDAAAAAAAAAAkGAAAAAAAAAAUGAAAAPlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk5vblJhbmRvbWl6ZWRTdHJpbmdFcXVhbGl0eUNvbXBhcmVyAAAAAAMAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAaU3lzdGVtLk5ldC5Db29raWVDb250YWluZXIGAAAADW1fZG9tYWluVGFibGUPbV9tYXhDb29raWVTaXplDG1fbWF4Q29va2llcxVtX21heENvb2tpZXNQZXJEb21haW4HbV9jb3VudA5tX2ZxZG5NeURvbWFpbgMAAAAAARxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlCAgICAIAAAAJAwAAAAAEAAAKAAAABQAAAAAAAAAGBAAAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKAwAAAAkFAAAACQYAAAAQBQAAAAAAAAAQBgAAAAAAAAAL" } };
- yield return new object[] { new DataSet("Dataset") { Locale = CultureInfo.InvariantCulture }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0EAQEOU3lzdGVtLlZlcnNpb24DAAAAAgAAAAkEAAAABgUAAAD3Ajw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSBpZD0iRGF0YXNldCIgeG1sbnM9IiIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSI+DQogIDx4czplbGVtZW50IG5hbWU9IkRhdGFzZXQiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYGAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgUEAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAMAAAACAAAAAAAAAP//////////Cw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAPcCPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIGlkPSJEYXRhc2V0IiB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YXNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOkxvY2FsZT0iIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KPC94czpzY2hlbWE+BgUAAACAATxkaWZmZ3I6ZGlmZmdyYW0geG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIHhtbG5zOmRpZmZncj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtZGlmZmdyYW0tdjEiIC8+BAMAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAD//////////ws=" } };
- yield return new object[] { new DataTable("Datatable", "corens") { Locale = CultureInfo.InvariantCulture }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtBAEBDlN5c3RlbS5WZXJzaW9uAwAAAAIAAAAJBAAAAAYFAAAA/wQ8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJjb3JlbnMiIHhtbG5zOm1zdG5zPSJjb3JlbnMiIHhtbG5zPSJjb3JlbnMiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YXRhYmxlIiBtc2RhdGE6TG9jYWxlPSIiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQogIDx4czplbGVtZW50IG5hbWU9InRtcERhdGFTZXQiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpNYWluRGF0YVRhYmxlPSJjb3JlbnNfeDAwM0FfRGF0YXRhYmxlIiBtc2RhdGE6TG9jYWxlPSIiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQo8L3hzOnNjaGVtYT4GBgAAAIABPGRpZmZncjpkaWZmZ3JhbSB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgeG1sbnM6ZGlmZmdyPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1kaWZmZ3JhbS12MSIgLz4FBAAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgDAAAAAgAAAAAAAAD//////////ws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAAD/BDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvcmVucyIgeG1sbnM6bXN0bnM9ImNvcmVucyIgeG1sbnM9ImNvcmVucyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCiAgPHhzOmVsZW1lbnQgbmFtZT0idG1wRGF0YVNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOk1haW5EYXRhVGFibGU9ImNvcmVuc194MDAzQV9EYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L" } };
+ cookieContainer.Add(cookie);
+ yield return new object[] { cookieContainer, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAaU3lzdGVtLk5ldC5Db29raWVDb250YWluZXIGAAAADW1fZG9tYWluVGFibGUPbV9tYXhDb29raWVTaXplDG1fbWF4Q29va2llcxVtX21heENvb2tpZXNQZXJEb21haW4HbV9jb3VudA5tX2ZxZG5NeURvbWFpbgMAAAAAARxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlCAgICAIAAAAJAwAAAAAEAAAKAAAABQAAAAEAAAAGBAAAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AQAAAAoKAwAAAAkFAAAACQYAAAAQBQAAAAEAAAAGBwAAAAouMTI3LjAuMC4xEAYAAAABAAAACQgAAAAFCAAAABNTeXN0ZW0uTmV0LlBhdGhMaXN0AQAAAAZtX2xpc3QDLFN5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1N5bmNTb3J0ZWRMaXN0AgAAAAkJAAAABAkAAAAsU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrU3luY1NvcnRlZExpc3QJAAAABV9saXN0BV9yb290D1NvcnRlZExpc3Qra2V5cxFTb3J0ZWRMaXN0K3ZhbHVlcxBTb3J0ZWRMaXN0K19zaXplElNvcnRlZExpc3QrdmVyc2lvbhNTb3J0ZWRMaXN0K2NvbXBhcmVyElNvcnRlZExpc3Qra2V5TGlzdBRTb3J0ZWRMaXN0K3ZhbHVlTGlzdAMCBQUAAAMDAx1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAgIG1N5c3RlbS5Db2xsZWN0aW9ucy5Db21wYXJlciVTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtLZXlMaXN0J1N5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1ZhbHVlTGlzdAkKAAAACQsAAAAJDAAAAAkMAAAAAAAAAAAAAAAJDQAAAAoKBAoAAAAdU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QHAAAABGtleXMGdmFsdWVzBV9zaXplB3ZlcnNpb24IY29tcGFyZXIHa2V5TGlzdAl2YWx1ZUxpc3QFBQAABAMDCAgkU3lzdGVtLk5ldC5QYXRoTGlzdCtQYXRoTGlzdENvbXBhcmVyAgAAACVTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtLZXlMaXN0J1N5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1ZhbHVlTGlzdAkOAAAACQ8AAAABAAAAAQAAAAkQAAAACgkRAAAABAsAAAANU3lzdGVtLk9iamVjdAAAAAAQDAAAAAAAAAAEDQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIBAAAAC0NvbXBhcmVJbmZvAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwkSAAAAEA4AAAAQAAAABhMAAAAFL3BhdGgNDxAPAAAAEAAAAAkUAAAADQ8FEAAAACRTeXN0ZW0uTmV0LlBhdGhMaXN0K1BhdGhMaXN0Q29tcGFyZXIAAAAAAgAAAAQRAAAAJ1N5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1ZhbHVlTGlzdAEAAAAKc29ydGVkTGlzdAMdU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QJCgAAAAQSAAAAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvAgAAAAZtX25hbWUNbV9zb3J0VmVyc2lvbgEDIFN5c3RlbS5HbG9iYWxpemF0aW9uLlNvcnRWZXJzaW9uBhYAAAAFZW4tVVMKBRQAAAAbU3lzdGVtLk5ldC5Db29raWVDb2xsZWN0aW9uAwAAAAZtX2xpc3QLbV90aW1lU3RhbXAUbV9oYXNfb3RoZXJfdmVyc2lvbnMDAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdA0BAgAAAAkXAAAAAAAAAAAAAAABBBcAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdAMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBQAACAgJGAAAAAEAAAABAAAAEBgAAAAEAAAACRkAAAANAwUZAAAAEVN5c3RlbS5OZXQuQ29va2llFQAAAAltX2NvbW1lbnQMbV9jb21tZW50VXJpD21fY29va2llVmFyaWFudAltX2Rpc2NhcmQIbV9kb21haW4RbV9kb21haW5faW1wbGljaXQJbV9leHBpcmVzBm1fbmFtZQZtX3BhdGgPbV9wYXRoX2ltcGxpY2l0Bm1fcG9ydA9tX3BvcnRfaW1wbGljaXQLbV9wb3J0X2xpc3QIbV9zZWN1cmUKbV9odHRwT25seQttX3RpbWVTdGFtcAdtX3ZhbHVlCW1fdmVyc2lvbgttX2RvbWFpbktleQ9Jc1F1b3RlZFZlcnNpb24OSXNRdW90ZWREb21haW4BBAQAAQAAAQEAAQAHAAAAAQABAAAKU3lzdGVtLlVyaQIAAAAYU3lzdGVtLk5ldC5Db29raWVWYXJpYW50AgAAAAEBDQEBCAEBDQgBAQIAAAAJBAAAAAoF5f///xhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQBAAAAB3ZhbHVlX18ACAIAAAABAAAAAAYcAAAACTEyNy4wLjAuMQAAAAAAAAAAAAYdAAAABW5hbWUxCRMAAAAACQQAAAABCgAAgFhsCQ2+tQgGIAAAAAV2YWx1ZQAAAAAJBwAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAaU3lzdGVtLk5ldC5Db29raWVDb250YWluZXIGAAAADW1fZG9tYWluVGFibGUPbV9tYXhDb29raWVTaXplDG1fbWF4Q29va2llcxVtX21heENvb2tpZXNQZXJEb21haW4HbV9jb3VudA5tX2ZxZG5NeURvbWFpbgMAAAAAARxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlCAgICAIAAAAJAwAAAAAEAAAKAAAABQAAAAEAAAAGBAAAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AQAAAAoKAwAAAAkFAAAACQYAAAAQBQAAAAEAAAAGBwAAAAouMTI3LjAuMC4xEAYAAAABAAAACQgAAAAFCAAAABNTeXN0ZW0uTmV0LlBhdGhMaXN0AQAAAAZtX2xpc3QDLFN5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1N5bmNTb3J0ZWRMaXN0AgAAAAkJAAAABAkAAAAsU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrU3luY1NvcnRlZExpc3QJAAAABV9saXN0BV9yb290D1NvcnRlZExpc3Qra2V5cxFTb3J0ZWRMaXN0K3ZhbHVlcxBTb3J0ZWRMaXN0K19zaXplElNvcnRlZExpc3QrdmVyc2lvbhNTb3J0ZWRMaXN0K2NvbXBhcmVyElNvcnRlZExpc3Qra2V5TGlzdBRTb3J0ZWRMaXN0K3ZhbHVlTGlzdAMCBQUAAAMDAx1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAgIG1N5c3RlbS5Db2xsZWN0aW9ucy5Db21wYXJlciVTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtLZXlMaXN0J1N5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1ZhbHVlTGlzdAkKAAAACQsAAAAJDAAAAAkMAAAAAAAAAAAAAAAJDQAAAAoKBAoAAAAdU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QHAAAABGtleXMGdmFsdWVzBV9zaXplB3ZlcnNpb24IY29tcGFyZXIHa2V5TGlzdAl2YWx1ZUxpc3QFBQAABAMDCAgkU3lzdGVtLk5ldC5QYXRoTGlzdCtQYXRoTGlzdENvbXBhcmVyAgAAACVTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtLZXlMaXN0J1N5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1ZhbHVlTGlzdAkOAAAACQ8AAAABAAAAAQAAAAkQAAAACgkRAAAABAsAAAANU3lzdGVtLk9iamVjdAAAAAAQDAAAAAAAAAAEDQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIBAAAAC0NvbXBhcmVJbmZvAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwkSAAAAEA4AAAAQAAAABhMAAAAFL3BhdGgNDxAPAAAAEAAAAAkUAAAADQ8FEAAAACRTeXN0ZW0uTmV0LlBhdGhMaXN0K1BhdGhMaXN0Q29tcGFyZXIAAAAAAgAAAAQRAAAAJ1N5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1ZhbHVlTGlzdAEAAAAKc29ydGVkTGlzdAMdU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QJCgAAAAQSAAAAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvBAAAAAZtX25hbWUJd2luMzJMQ0lEB2N1bHR1cmUNbV9Tb3J0VmVyc2lvbgEAAAMICCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYWAAAABWVuLVVTAAAAAAkEAAAKBRQAAAAbU3lzdGVtLk5ldC5Db29raWVDb2xsZWN0aW9uBQAAAAltX3ZlcnNpb24GbV9saXN0C21fVGltZVN0YW1wFG1faGFzX290aGVyX3ZlcnNpb25zDG1fSXNSZWFkT25seQADAAAACBxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQEBAgAAAAAAAAAJFwAAAAAAAAAAAAAAAQEEFwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkYAAAAAQAAAAEAAAAQGAAAAAQAAAAJGQAAAA0DBRkAAAARU3lzdGVtLk5ldC5Db29raWUVAAAACW1fY29tbWVudAxtX2NvbW1lbnRVcmkPbV9jb29raWVWYXJpYW50CW1fZGlzY2FyZAhtX2RvbWFpbhFtX2RvbWFpbl9pbXBsaWNpdAltX2V4cGlyZXMGbV9uYW1lBm1fcGF0aA9tX3BhdGhfaW1wbGljaXQGbV9wb3J0D21fcG9ydF9pbXBsaWNpdAttX3BvcnRfbGlzdAhtX3NlY3VyZQptX2h0dHBPbmx5C21fdGltZVN0YW1wB21fdmFsdWUJbV92ZXJzaW9uC21fZG9tYWluS2V5D0lzUXVvdGVkVmVyc2lvbg5Jc1F1b3RlZERvbWFpbgEEBAABAAABAQABAAcAAAABAAEAAApTeXN0ZW0uVXJpAgAAABhTeXN0ZW0uTmV0LkNvb2tpZVZhcmlhbnQCAAAAAQENAQEIAQENCAEBAgAAAAkEAAAACgXl////GFN5c3RlbS5OZXQuQ29va2llVmFyaWFudAEAAAAHdmFsdWVfXwAIAgAAAAEAAAAABhwAAAAJMTI3LjAuMC4xAAAAAAAAAAAABh0AAAAFbmFtZTEJEwAAAAAJBAAAAAEKAACAWGwJDb61CAYgAAAABXZhbHVlAAAAAAkHAAAAAAAL" } };
+ yield return new object[] { new DataSet("Dataset") { Locale = CultureInfo.InvariantCulture }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAPcCPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIGlkPSJEYXRhc2V0IiB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YXNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOkxvY2FsZT0iIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KPC94czpzY2hlbWE+BgUAAACAATxkaWZmZ3I6ZGlmZmdyYW0geG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIHhtbG5zOmRpZmZncj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtZGlmZmdyYW0tdjEiIC8+BAMAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAD//////////ws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAPcCPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIGlkPSJEYXRhc2V0IiB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YXNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOkxvY2FsZT0iIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KPC94czpzY2hlbWE+BgUAAACAATxkaWZmZ3I6ZGlmZmdyYW0geG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIHhtbG5zOmRpZmZncj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtZGlmZmdyYW0tdjEiIC8+BAMAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAD//////////ws=" } };
+ yield return new object[] { new DataSet() { Locale = CultureInfo.InvariantCulture }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAP0CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIGlkPSJOZXdEYXRhU2V0IiB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTmV3RGF0YVNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOkxvY2FsZT0iIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KPC94czpzY2hlbWE+BgUAAACAATxkaWZmZ3I6ZGlmZmdyYW0geG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIHhtbG5zOmRpZmZncj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtZGlmZmdyYW0tdjEiIC8+BAMAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAD//////////ws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAP0CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIGlkPSJOZXdEYXRhU2V0IiB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTmV3RGF0YVNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOkxvY2FsZT0iIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KPC94czpzY2hlbWE+BgUAAACAATxkaWZmZ3I6ZGlmZmdyYW0geG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIHhtbG5zOmRpZmZncj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtZGlmZmdyYW0tdjEiIC8+BAMAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAD//////////ws=" } };
+ yield return new object[] { new DataTable("Datatable", "corens") { Locale = CultureInfo.InvariantCulture }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAAD/BDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvcmVucyIgeG1sbnM6bXN0bnM9ImNvcmVucyIgeG1sbnM9ImNvcmVucyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCiAgPHhzOmVsZW1lbnQgbmFtZT0idG1wRGF0YVNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOk1haW5EYXRhVGFibGU9ImNvcmVuc194MDAzQV9EYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAAD/BDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvcmVucyIgeG1sbnM6bXN0bnM9ImNvcmVucyIgeG1sbnM9ImNvcmVucyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCiAgPHhzOmVsZW1lbnQgbmFtZT0idG1wRGF0YVNldCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOk1haW5EYXRhVGFibGU9ImNvcmVuc194MDAzQV9EYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L" } };
+ yield return new object[] { new DataTable("Datatable") { Locale = CultureInfo.InvariantCulture }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAAD+Azw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YXRhYmxlIiBtc2RhdGE6TG9jYWxlPSIiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQogIDx4czplbGVtZW50IG5hbWU9InRtcERhdGFTZXQiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpNYWluRGF0YVRhYmxlPSJEYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAAD+Azw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YXRhYmxlIiBtc2RhdGE6TG9jYWxlPSIiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQogIDx4czplbGVtZW50IG5hbWU9InRtcERhdGFTZXQiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpNYWluRGF0YVRhYmxlPSJEYXRhdGFibGUiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L" } };
+
+ var dt1 = new DataTable("abc", "myns1");
+ dt1.Columns.Add("col1");
+ dt1.Columns.Add("col2");
+ dt1.Rows.Add("foo", "bar");
+ dt1.Rows.Add("asdasd", "fffffffff");
+
+ var dt2 = new DataTable("sdfsdf");
+ dt2.Columns.Add("kkk");
+ dt2.Columns.Add("jfjfjf");
+ dt2.Rows.Add("ff1", "ff2");
+ dt2.Rows.Add("ooo", "sdflkjsdflkjsd");
+
+ var ds = new DataSet("DataSet123");
+ ds.Tables.Add(dt1);
+ ds.Tables.Add(dt2);
+
+ yield return new object[] { dt1, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAADbBjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im15bnMxIiB4bWxuczptc3Rucz0ibXluczEiIHhtbG5zPSJteW5zMSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJhYmMiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSJteW5zMSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9Im15bnMxIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8L3hzOnNlcXVlbmNlPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldDEyMyIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOk1haW5EYXRhVGFibGU9Im15bnMxX3gwMDNBX2FiYyIgbXNkYXRhOlVzZUN1cnJlbnRMb2NhbGU9InRydWUiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQo8L3hzOnNjaGVtYT4GBQAAANwDPGRpZmZncjpkaWZmZ3JhbSB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgeG1sbnM6ZGlmZmdyPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1kaWZmZ3JhbS12MSI+DQogIDxEYXRhU2V0MTIzIHhtbG5zPSJteW5zMSI+DQogICAgPGFiYyBkaWZmZ3I6aWQ9ImFiYzEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj4NCiAgICAgIDxjb2wxPmZvbzwvY29sMT4NCiAgICAgIDxjb2wyPmJhcjwvY29sMj4NCiAgICA8L2FiYz4NCiAgICA8YWJjIGRpZmZncjppZD0iYWJjMiIgbXNkYXRhOnJvd09yZGVyPSIxIiBkaWZmZ3I6aGFzQ2hhbmdlcz0iaW5zZXJ0ZWQiPg0KICAgICAgPGNvbDE+YXNkYXNkPC9jb2wxPg0KICAgICAgPGNvbDI+ZmZmZmZmZmZmPC9jb2wyPg0KICAgIDwvYWJjPg0KICA8L0RhdGFTZXQxMjM+DQo8L2RpZmZncjpkaWZmZ3JhbT4EAwAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgCAAAAAAAAAP//////////Cw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAADbBjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im15bnMxIiB4bWxuczptc3Rucz0ibXluczEiIHhtbG5zPSJteW5zMSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJhYmMiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSJteW5zMSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9Im15bnMxIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8L3hzOnNlcXVlbmNlPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldDEyMyIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOk1haW5EYXRhVGFibGU9Im15bnMxX3gwMDNBX2FiYyIgbXNkYXRhOlVzZUN1cnJlbnRMb2NhbGU9InRydWUiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQo8L3hzOnNjaGVtYT4GBQAAANwDPGRpZmZncjpkaWZmZ3JhbSB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgeG1sbnM6ZGlmZmdyPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1kaWZmZ3JhbS12MSI+DQogIDxEYXRhU2V0MTIzIHhtbG5zPSJteW5zMSI+DQogICAgPGFiYyBkaWZmZ3I6aWQ9ImFiYzEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj4NCiAgICAgIDxjb2wxPmZvbzwvY29sMT4NCiAgICAgIDxjb2wyPmJhcjwvY29sMj4NCiAgICA8L2FiYz4NCiAgICA8YWJjIGRpZmZncjppZD0iYWJjMiIgbXNkYXRhOnJvd09yZGVyPSIxIiBkaWZmZ3I6aGFzQ2hhbmdlcz0iaW5zZXJ0ZWQiPg0KICAgICAgPGNvbDE+YXNkYXNkPC9jb2wxPg0KICAgICAgPGNvbDI+ZmZmZmZmZmZmPC9jb2wyPg0KICAgIDwvYWJjPg0KICA8L0RhdGFTZXQxMjM+DQo8L2RpZmZncjpkaWZmZ3JhbT4EAwAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgCAAAAAAAAAP//////////Cw==" } };
+ yield return new object[] { dt2, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAADbBTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0ic2Rmc2RmIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9ImtrayIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSIiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamZqZmpmIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9IiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQogIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXQxMjMiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpNYWluRGF0YVRhYmxlPSJzZGZzZGYiIG1zZGF0YTpVc2VDdXJyZW50TG9jYWxlPSJ0cnVlIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KPC94czpzY2hlbWE+BgUAAADmAzxkaWZmZ3I6ZGlmZmdyYW0geG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIHhtbG5zOmRpZmZncj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtZGlmZmdyYW0tdjEiPg0KICA8RGF0YVNldDEyMz4NCiAgICA8c2Rmc2RmIGRpZmZncjppZD0ic2Rmc2RmMSIgbXNkYXRhOnJvd09yZGVyPSIwIiBkaWZmZ3I6aGFzQ2hhbmdlcz0iaW5zZXJ0ZWQiPg0KICAgICAgPGtraz5mZjE8L2traz4NCiAgICAgIDxqZmpmamY+ZmYyPC9qZmpmamY+DQogICAgPC9zZGZzZGY+DQogICAgPHNkZnNkZiBkaWZmZ3I6aWQ9InNkZnNkZjIiIG1zZGF0YTpyb3dPcmRlcj0iMSIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj4NCiAgICAgIDxra2s+b29vPC9ra2s+DQogICAgICA8amZqZmpmPnNkZmxranNkZmxranNkPC9qZmpmamY+DQogICAgPC9zZGZzZGY+DQogIDwvRGF0YVNldDEyMz4NCjwvZGlmZmdyOmRpZmZncmFtPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAADbBTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0ic2Rmc2RmIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9ImtrayIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSIiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamZqZmpmIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9IiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQogIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXQxMjMiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpNYWluRGF0YVRhYmxlPSJzZGZzZGYiIG1zZGF0YTpVc2VDdXJyZW50TG9jYWxlPSJ0cnVlIj4NCiAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KPC94czpzY2hlbWE+BgUAAADmAzxkaWZmZ3I6ZGlmZmdyYW0geG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiIHhtbG5zOmRpZmZncj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtZGlmZmdyYW0tdjEiPg0KICA8RGF0YVNldDEyMz4NCiAgICA8c2Rmc2RmIGRpZmZncjppZD0ic2Rmc2RmMSIgbXNkYXRhOnJvd09yZGVyPSIwIiBkaWZmZ3I6aGFzQ2hhbmdlcz0iaW5zZXJ0ZWQiPg0KICAgICAgPGtraz5mZjE8L2traz4NCiAgICAgIDxqZmpmamY+ZmYyPC9qZmpmamY+DQogICAgPC9zZGZzZGY+DQogICAgPHNkZnNkZiBkaWZmZ3I6aWQ9InNkZnNkZjIiIG1zZGF0YTpyb3dPcmRlcj0iMSIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj4NCiAgICAgIDxra2s+b29vPC9ra2s+DQogICAgICA8amZqZmpmPnNkZmxranNkZmxranNkPC9qZmpmamY+DQogICAgPC9zZGZzZGY+DQogIDwvRGF0YVNldDEyMz4NCjwvZGlmZmdyOmRpZmZncmFtPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L" } };
+ yield return new object[] { ds, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAKYJPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIGlkPSJEYXRhU2V0MTIzIiB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldDEyMyIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOlVzZUN1cnJlbnRMb2NhbGU9InRydWUiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQogICAgICAgIDx4czplbGVtZW50IG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9Im15bnMxIiBuYW1lPSJhYmMiPg0KICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSJteW5zMSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9Im15bnMxIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQogICAgICAgIDwveHM6ZWxlbWVudD4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2Rmc2RmIj4NCiAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImtrayIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSIiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamZqZmpmIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9IiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICAgICAgICA8L3hzOmVsZW1lbnQ+DQogICAgICA8L3hzOmNob2ljZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQo8L3hzOnNjaGVtYT4GBQAAAKMFPGRpZmZncjpkaWZmZ3JhbSB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgeG1sbnM6ZGlmZmdyPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1kaWZmZ3JhbS12MSI+PERhdGFTZXQxMjM+PGFiYyBkaWZmZ3I6aWQ9ImFiYzEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIiB4bWxucz0ibXluczEiPjxjb2wxPmZvbzwvY29sMT48Y29sMj5iYXI8L2NvbDI+PC9hYmM+PGFiYyBkaWZmZ3I6aWQ9ImFiYzIiIG1zZGF0YTpyb3dPcmRlcj0iMSIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIiB4bWxucz0ibXluczEiPjxjb2wxPmFzZGFzZDwvY29sMT48Y29sMj5mZmZmZmZmZmY8L2NvbDI+PC9hYmM+PHNkZnNkZiBkaWZmZ3I6aWQ9InNkZnNkZjEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj48a2trPmZmMTwva2trPjxqZmpmamY+ZmYyPC9qZmpmamY+PC9zZGZzZGY+PHNkZnNkZiBkaWZmZ3I6aWQ9InNkZnNkZjIiIG1zZGF0YTpyb3dPcmRlcj0iMSIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj48a2trPm9vbzwva2trPjxqZmpmamY+c2RmbGtqc2RmbGtqc2Q8L2pmamZqZj48L3NkZnNkZj48L0RhdGFTZXQxMjM+PC9kaWZmZ3I6ZGlmZmdyYW0+BAMAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAD//////////ws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABNTeXN0ZW0uRGF0YS5EYXRhU2V0AwAAABdEYXRhU2V0LlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAKYJPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIGlkPSJEYXRhU2V0MTIzIiB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldDEyMyIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSIgbXNkYXRhOlVzZUN1cnJlbnRMb2NhbGU9InRydWUiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQogICAgICAgIDx4czplbGVtZW50IG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9Im15bnMxIiBuYW1lPSJhYmMiPg0KICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSJteW5zMSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9Im15bnMxIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQogICAgICAgIDwveHM6ZWxlbWVudD4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2Rmc2RmIj4NCiAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImtrayIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSIiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamZqZmpmIiB0eXBlPSJ4czpzdHJpbmciIG1zZGF0YTp0YXJnZXROYW1lc3BhY2U9IiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICAgICAgICA8L3hzOmVsZW1lbnQ+DQogICAgICA8L3hzOmNob2ljZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQo8L3hzOnNjaGVtYT4GBQAAAKMFPGRpZmZncjpkaWZmZ3JhbSB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSIgeG1sbnM6ZGlmZmdyPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1kaWZmZ3JhbS12MSI+PERhdGFTZXQxMjM+PGFiYyBkaWZmZ3I6aWQ9ImFiYzEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIiB4bWxucz0ibXluczEiPjxjb2wxPmZvbzwvY29sMT48Y29sMj5iYXI8L2NvbDI+PC9hYmM+PGFiYyBkaWZmZ3I6aWQ9ImFiYzIiIG1zZGF0YTpyb3dPcmRlcj0iMSIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIiB4bWxucz0ibXluczEiPjxjb2wxPmFzZGFzZDwvY29sMT48Y29sMj5mZmZmZmZmZmY8L2NvbDI+PC9hYmM+PHNkZnNkZiBkaWZmZ3I6aWQ9InNkZnNkZjEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj48a2trPmZmMTwva2trPjxqZmpmamY+ZmYyPC9qZmpmamY+PC9zZGZzZGY+PHNkZnNkZiBkaWZmZ3I6aWQ9InNkZnNkZjIiIG1zZGF0YTpyb3dPcmRlcj0iMSIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj48a2trPm9vbzwva2trPjxqZmpmamY+c2RmbGtqc2RmbGtqc2Q8L2pmamZqZj48L3NkZnNkZj48L0RhdGFTZXQxMjM+PC9kaWZmZ3I6ZGlmZmdyYW0+BAMAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAgAAAAAAAAD//////////ws=" } };
+
+ // sets default table name - possibly by design
+ //yield return new object[] { new DataTable() { Locale = CultureInfo.InvariantCulture }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAAD4Azw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVGFibGUxIiBtc2RhdGE6TG9jYWxlPSIiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQogIDx4czplbGVtZW50IG5hbWU9InRtcERhdGFTZXQiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpNYWluRGF0YVRhYmxlPSJUYWJsZTEiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABVTeXN0ZW0uRGF0YS5EYXRhVGFibGUDAAAAGURhdGFUYWJsZS5SZW1vdGluZ1ZlcnNpb24JWG1sU2NoZW1hC1htbERpZmZHcmFtAwEBDlN5c3RlbS5WZXJzaW9uAgAAAAkDAAAABgQAAAD4Azw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPHhzOnNjaGVtYSB4bWxucz0iIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVGFibGUxIiBtc2RhdGE6TG9jYWxlPSIiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8L3hzOmVsZW1lbnQ+DQogIDx4czplbGVtZW50IG5hbWU9InRtcERhdGFTZXQiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiIG1zZGF0YTpNYWluRGF0YVRhYmxlPSJUYWJsZTEiIG1zZGF0YTpMb2NhbGU9IiI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAAgAE8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIiAvPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8L" } };
var propertyCollection = new PropertyCollection
{
{ "p1", "v1" },
{ "px", "vx" }
};
- yield return new object[] { propertyCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFxTeXN0ZW0uUnVudGltZS5FeHRlbnNpb25zLCBWZXJzaW9uPTQuMi4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUBAAAAHlN5c3RlbS5EYXRhLlByb3BlcnR5Q29sbGVjdGlvbgcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMEAAUFCwgcU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlciRTeXN0ZW0uQ29sbGVjdGlvbnMuSUhhc2hDb2RlUHJvdmlkZXIDAAAACAIAAADsUTg/AgAAAAoKAwAAAAkEAAAACQUAAAAMBgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQBAAAAAIAAAAGBwAAAAJweAYIAAAAAnAxEAUAAAACAAAABgkAAAACdngGCgAAAAJ2MQs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5Qcm9wZXJ0eUNvbGxlY3Rpb24HAAAACkxvYWRGYWN0b3IHVmVyc2lvbghDb21wYXJlchBIYXNoQ29kZVByb3ZpZGVyCEhhc2hTaXplBEtleXMGVmFsdWVzAAADAwAFBQsIHFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIkU3lzdGVtLkNvbGxlY3Rpb25zLklIYXNoQ29kZVByb3ZpZGVyCAIAAADsUTg/AgAAAAoKAwAAAAkDAAAACQQAAAAQAwAAAAIAAAAGBQAAAAJweAYGAAAAAnAxEAQAAAACAAAABgcAAAACdngGCAAAAAJ2MQs=" } };
- yield return new object[] { new SqlBoolean(true), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAfU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQm9vbGVhbgEAAAAHbV92YWx1ZQACAgAAAAIL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB9TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCb29sZWFuAQAAAAdtX3ZhbHVlAAICAAAAAgs=" } };
- yield return new object[] { new SqlByte(255), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAcU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQnl0ZQIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABAgIAAAAB/ws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCeXRlAgAAAAptX2ZOb3ROdWxsB21fdmFsdWUAAAECAgAAAAH/Cw==" } };
- yield return new object[] { new SqlDateTime(new DateTime(1990, 11, 23, 03, 30, 00, 00, DateTimeKind.Utc)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAgU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsRGF0ZVRpbWUDAAAACm1fZk5vdE51bGwFbV9kYXkGbV90aW1lAAAAAQgIAgAAAAGugQAAoK05AAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAAa6BAACgrTkACw==" } };
- yield return new object[] { new SqlDouble(34.5), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsRG91YmxlAgAAAAptX2ZOb3ROdWxsB21fdmFsdWUAAAEGAgAAAAEAAAAAAEBBQAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEb3VibGUCAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQYCAAAAAQAAAAAAQEFACw==" } };
- yield return new object[] { new SqlInt16(256), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAdU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsSW50MTYCAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQcCAAAAAQABCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQxNgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABBwIAAAABAAEL" } };
- yield return new object[] { new SqlInt32(4096314), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAdU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsSW50MzICAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQgCAAAAATqBPgAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQzMgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCAIAAAABOoE+AAs=" } };
- yield return new object[] { new SqlInt64(3492867384596), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAdU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsSW50NjQCAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQkCAAAAARSlHj8tAwAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQ2NAIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCQIAAAABFKUePy0DAAAL" } };
- yield return new object[] { new SqlString("abc", CultureInfo.InvariantCulture.LCID, SqlCompareOptions.BinarySort), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAQAAABVU3lzdGVtLkRhdGEuQ29tbW9uLCBWZXJzaW9uPTQuMi4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUBAAAAHlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbFN0cmluZwUAAAAHbV92YWx1ZQltX2NtcEluZm8GbV9sY2lkBm1fZmxhZwptX2ZOb3ROdWxsAQQABAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8DAAAACCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwQAAAABAgAAAAYFAAAAA2FiYwp/AAAABfr///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAQAAAAAgAAAAQs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAYDAAAAA2FiYwp/AAAABfz///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAIAAAAAgAAAAQs=" } };
+ yield return new object[] { propertyCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5Qcm9wZXJ0eUNvbGxlY3Rpb24HAAAACkxvYWRGYWN0b3IHVmVyc2lvbghDb21wYXJlchBIYXNoQ29kZVByb3ZpZGVyCEhhc2hTaXplBEtleXMGVmFsdWVzAAADAwAFBQsIHFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIkU3lzdGVtLkNvbGxlY3Rpb25zLklIYXNoQ29kZVByb3ZpZGVyCAIAAADsUTg/AgAAAAoKAwAAAAkDAAAACQQAAAAQAwAAAAIAAAAGBQAAAAJweAYGAAAAAnAxEAQAAAACAAAABgcAAAACdngGCAAAAAJ2MQs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5Qcm9wZXJ0eUNvbGxlY3Rpb24HAAAACkxvYWRGYWN0b3IHVmVyc2lvbghDb21wYXJlchBIYXNoQ29kZVByb3ZpZGVyCEhhc2hTaXplBEtleXMGVmFsdWVzAAADAwAFBQsIHFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIkU3lzdGVtLkNvbGxlY3Rpb25zLklIYXNoQ29kZVByb3ZpZGVyCAIAAADsUTg/AgAAAAoKAwAAAAkDAAAACQQAAAAQAwAAAAIAAAAGBQAAAAJweAYGAAAAAnAxEAQAAAACAAAABgcAAAACdngGCAAAAAJ2MQs=" } };
+ yield return new object[] { new SqlGuid(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACgs=" } };
+ yield return new object[] { new SqlGuid(new byte[] { 74, 17, 188, 26, 104, 117, 191, 64, 132, 93, 95, 0, 182, 136, 150, 121 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACQMAAAAPAwAAABAAAAACShG8Gmh1v0CEXV8AtoiWeQs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACQMAAAAPAwAAABAAAAACShG8Gmh1v0CEXV8AtoiWeQs=" } };
+ yield return new object[] { new SqlGuid(new Guid("aad872f5-82bb-4989-af0f-bee5de636fd7")), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACQMAAAAPAwAAABAAAAAC9XLYqruCiUmvD77l3mNv1ws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACQMAAAAPAwAAABAAAAAC9XLYqruCiUmvD77l3mNv1ws=" } };
+ yield return new object[] { new SqlGuid("aad872f5-82bb-4989-af0f-bee5de636fd7"), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACQMAAAAPAwAAABAAAAAC9XLYqruCiUmvD77l3mNv1ws=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxHdWlkAQAAAAdtX3ZhbHVlBwICAAAACQMAAAAPAwAAABAAAAAC9XLYqruCiUmvD77l3mNv1ws=" } };
+ yield return new object[] { new SqlBoolean(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB9TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCb29sZWFuAQAAAAdtX3ZhbHVlAAICAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB9TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCb29sZWFuAQAAAAdtX3ZhbHVlAAICAAAAAAs=" } };
+ yield return new object[] { new SqlBoolean(1), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB9TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCb29sZWFuAQAAAAdtX3ZhbHVlAAICAAAAAgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB9TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCb29sZWFuAQAAAAdtX3ZhbHVlAAICAAAAAgs=" } };
+ yield return new object[] { new SqlBoolean(true), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB9TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCb29sZWFuAQAAAAdtX3ZhbHVlAAICAAAAAgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB9TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCb29sZWFuAQAAAAdtX3ZhbHVlAAICAAAAAgs=" } };
+ yield return new object[] { new SqlByte(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCeXRlAgAAAAptX2ZOb3ROdWxsB21fdmFsdWUAAAECAgAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCeXRlAgAAAAptX2ZOb3ROdWxsB21fdmFsdWUAAAECAgAAAAAACw==" } };
+ yield return new object[] { new SqlByte(255), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCeXRlAgAAAAptX2ZOb3ROdWxsB21fdmFsdWUAAAECAgAAAAH/Cw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxCeXRlAgAAAAptX2ZOb3ROdWxsB21fdmFsdWUAAAECAgAAAAH/Cw==" } };
+ yield return new object[] { new SqlDateTime(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAAAAAAAAAAAAACw==" } };
+ yield return new object[] { new SqlDateTime(123, 546), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAAXsAAAAiAgAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAAXsAAAAiAgAACw==" } };
+ yield return new object[] { new SqlDateTime(2017, 11, 3), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAASCoAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAASCoAAAAAAAACw==" } };
+ yield return new object[] { new SqlDateTime(2017, 11, 3, 4, 50, 30), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAASCoAADIyU8ACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAASCoAADIyU8ACw==" } };
+ yield return new object[] { new SqlDateTime(2017, 11, 3, 4, 50, 30, 99.9), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAASCoAADmyU8ACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAASCoAADmyU8ACw==" } };
+ yield return new object[] { new SqlDateTime(new DateTime(1990, 11, 23, 03, 30, 00, 00, DateTimeKind.Utc)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAAa6BAACgrTkACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEYXRlVGltZQMAAAAKbV9mTm90TnVsbAVtX2RheQZtX3RpbWUAAAABCAgCAAAAAa6BAACgrTkACw==" } };
+ yield return new object[] { new SqlDouble(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEb3VibGUCAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQYCAAAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEb3VibGUCAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQYCAAAAAAAAAAAAAAAACw==" } };
+ yield return new object[] { new SqlDouble(34.5), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEb3VibGUCAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQYCAAAAAQAAAAAAQEFACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxEb3VibGUCAAAACm1fZk5vdE51bGwHbV92YWx1ZQAAAQYCAAAAAQAAAAAAQEFACw==" } };
+ yield return new object[] { new SqlInt16(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQxNgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABBwIAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQxNgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABBwIAAAAAAAAL" } };
+ yield return new object[] { new SqlInt16(256), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQxNgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABBwIAAAABAAEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQxNgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABBwIAAAABAAEL" } };
+ yield return new object[] { new SqlInt32(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQzMgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCAIAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQzMgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCAIAAAAAAAAAAAs=" } };
+ yield return new object[] { new SqlInt32(4096314), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQzMgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCAIAAAABOoE+AAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQzMgIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCAIAAAABOoE+AAs=" } };
+ yield return new object[] { new SqlInt64(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQ2NAIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCQIAAAAAAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQ2NAIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCQIAAAAAAAAAAAAAAAAL" } };
+ yield return new object[] { new SqlInt64(3492867384596), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQ2NAIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCQIAAAABFKUePy0DAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB1TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxJbnQ2NAIAAAAKbV9mTm90TnVsbAdtX3ZhbHVlAAABCQIAAAABFKUePy0DAAAL" } };
+ yield return new object[] { new SqlString(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFVTeXN0ZW0uRGF0YS5Db21tb24sIFZlcnNpb249NC4yLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsU3RyaW5nBQAAAAdtX3ZhbHVlCW1fY21wSW5mbwZtX2xjaWQGbV9mbGFnCm1fZk5vdE51bGwBAwAEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwgmU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMDAAAAAQIAAAAKCgAAAAAF/P///yZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwEAAAAHdmFsdWVfXwAIAwAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAoKAAAAAAX9////JlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbENvbXBhcmVPcHRpb25zAQAAAAd2YWx1ZV9fAAgCAAAAAAAAAAAL" } };
+ yield return new object[] { new SqlString("abc", CultureInfo.InvariantCulture.LCID), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFVTeXN0ZW0uRGF0YS5Db21tb24sIFZlcnNpb249NC4yLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsU3RyaW5nBQAAAAdtX3ZhbHVlCW1fY21wSW5mbwZtX2xjaWQGbV9mbGFnCm1fZk5vdE51bGwBAwAEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwgmU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMDAAAAAQIAAAAGBAAAAANhYmMKfwAAAAX7////JlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbENvbXBhcmVPcHRpb25zAQAAAAd2YWx1ZV9fAAgDAAAAGQAAAAEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAYDAAAAA2FiYwp/AAAABfz///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAIAAAAZAAAAAQs=" } };
+ yield return new object[] { new SqlString("abc", CultureInfo.InvariantCulture.LCID, SqlCompareOptions.BinarySort), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFVTeXN0ZW0uRGF0YS5Db21tb24sIFZlcnNpb249NC4yLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsU3RyaW5nBQAAAAdtX3ZhbHVlCW1fY21wSW5mbwZtX2xjaWQGbV9mbGFnCm1fZk5vdE51bGwBAwAEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwgmU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMDAAAAAQIAAAAGBAAAAANhYmMKfwAAAAX7////JlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbENvbXBhcmVPcHRpb25zAQAAAAd2YWx1ZV9fAAgDAAAAAIAAAAEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAYDAAAAA2FiYwp/AAAABfz///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAIAAAAAgAAAAQs=" } };
+ yield return new object[] { new SqlString(CultureInfo.InvariantCulture.LCID, SqlCompareOptions.BinarySort, new byte[] { 65, 66, 67 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFVTeXN0ZW0uRGF0YS5Db21tb24sIFZlcnNpb249NC4yLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsU3RyaW5nBQAAAAdtX3ZhbHVlCW1fY21wSW5mbwZtX2xjaWQGbV9mbGFnCm1fZk5vdE51bGwBAwAEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwgmU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMDAAAAAQIAAAAGBAAAAAbkiYHvv70KfwAAAAX7////JlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbENvbXBhcmVPcHRpb25zAQAAAAd2YWx1ZV9fAAgDAAAAAIAAAAEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAYDAAAABuSJge+/vQp/AAAABfz///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAIAAAAAgAAAAQs=" } };
+ yield return new object[] { new SqlString(CultureInfo.InvariantCulture.LCID, SqlCompareOptions.BinarySort, new byte[] { 65, 66, 67 }, true), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFVTeXN0ZW0uRGF0YS5Db21tb24sIFZlcnNpb249NC4yLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsU3RyaW5nBQAAAAdtX3ZhbHVlCW1fY21wSW5mbwZtX2xjaWQGbV9mbGFnCm1fZk5vdE51bGwBAwAEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwgmU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMDAAAAAQIAAAAGBAAAAAbkiYHvv70KfwAAAAX7////JlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbENvbXBhcmVPcHRpb25zAQAAAAd2YWx1ZV9fAAgDAAAAAIAAAAEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAYDAAAABuSJge+/vQp/AAAABfz///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAIAAAAAgAAAAQs=" } };
+ yield return new object[] { new SqlString(CultureInfo.InvariantCulture.LCID, SqlCompareOptions.BinarySort, new byte[] { 65, 66, 67 }, 0, 3), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFVTeXN0ZW0uRGF0YS5Db21tb24sIFZlcnNpb249NC4yLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsU3RyaW5nBQAAAAdtX3ZhbHVlCW1fY21wSW5mbwZtX2xjaWQGbV9mbGFnCm1fZk5vdE51bGwBAwAEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwgmU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMDAAAAAQIAAAAGBAAAAAbkiYHvv70KfwAAAAX7////JlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbENvbXBhcmVPcHRpb25zAQAAAAd2YWx1ZV9fAAgDAAAAAIAAAAEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAYDAAAABuSJge+/vQp/AAAABfz///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAIAAAAAgAAAAQs=" } };
+ yield return new object[] { new SqlString(CultureInfo.InvariantCulture.LCID, SqlCompareOptions.BinarySort, new byte[] { 65, 66, 67 }, 0, 3, true), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFVTeXN0ZW0uRGF0YS5Db21tb24sIFZlcnNpb249NC4yLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAeU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsU3RyaW5nBQAAAAdtX3ZhbHVlCW1fY21wSW5mbwZtX2xjaWQGbV9mbGFnCm1fZk5vdE51bGwBAwAEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwgmU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMDAAAAAQIAAAAGBAAAAAbkiYHvv70KfwAAAAX7////JlN5c3RlbS5EYXRhLlNxbFR5cGVzLlNxbENvbXBhcmVPcHRpb25zAQAAAAd2YWx1ZV9fAAgDAAAAAIAAAAEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxTdHJpbmcFAAAAB21fdmFsdWUJbV9jbXBJbmZvBm1fbGNpZAZtX2ZsYWcKbV9mTm90TnVsbAEDAAQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCCZTeXN0ZW0uRGF0YS5TcWxUeXBlcy5TcWxDb21wYXJlT3B0aW9ucwIAAAABAgAAAAYDAAAABuSJge+/vQp/AAAABfz///8mU3lzdGVtLkRhdGEuU3FsVHlwZXMuU3FsQ29tcGFyZU9wdGlvbnMBAAAAB3ZhbHVlX18ACAIAAAAAgAAAAQs=" } };
yield return new object[] { new BigInteger(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEFTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAGlN5c3RlbS5OdW1lcmljcy5CaWdJbnRlZ2VyAgAAAAVfc2lnbgVfYml0cwAHCA8CAAAAAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAaU3lzdGVtLk51bWVyaWNzLkJpZ0ludGVnZXICAAAABV9zaWduBV9iaXRzAAcIDwIAAAAAAAAACgs=" } };
yield return new object[] { new BigInteger(10324176), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEFTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAGlN5c3RlbS5OdW1lcmljcy5CaWdJbnRlZ2VyAgAAAAVfc2lnbgVfYml0cwAHCA8CAAAA0IidAAoL", "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAaU3lzdGVtLk51bWVyaWNzLkJpZ0ludGVnZXICAAAABV9zaWduBV9iaXRzAAcIDwIAAADQiJ0ACgs=" } };
- yield return new object[] { new Complex(12, 6), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEFTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAF1N5c3RlbS5OdW1lcmljcy5Db21wbGV4AgAAAAZtX3JlYWwLbV9pbWFnaW5hcnkAAAYGAgAAAAAAAAAAAChAAAAAAAAAGEAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAXU3lzdGVtLk51bWVyaWNzLkNvbXBsZXgCAAAABm1fcmVhbAttX2ltYWdpbmFyeQAABgYCAAAAAAAAAAAAKEAAAAAAAAAYQAs=" } };
+ yield return new object[] { new BigInteger(new byte[] { 1, 2, 3, 4, 5 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEFTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAGlN5c3RlbS5OdW1lcmljcy5CaWdJbnRlZ2VyAgAAAAVfc2lnbgVfYml0cwAHCA8CAAAAAQAAAAkDAAAADwMAAAACAAAADwECAwQFAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAaU3lzdGVtLk51bWVyaWNzLkJpZ0ludGVnZXICAAAABV9zaWduBV9iaXRzAAcIDwIAAAABAAAACQMAAAAPAwAAAAIAAAAPAQIDBAUAAAAL" } };
+ yield return new object[] { new Complex(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAXU3lzdGVtLk51bWVyaWNzLkNvbXBsZXgCAAAABm1fcmVhbAttX2ltYWdpbmFyeQAABgYCAAAAAAAAAAAAAAAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAXU3lzdGVtLk51bWVyaWNzLkNvbXBsZXgCAAAABm1fcmVhbAttX2ltYWdpbmFyeQAABgYCAAAAAAAAAAAAAAAAAAAAAAAAAAs=" } };
+ yield return new object[] { new Complex(12, 6), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAXU3lzdGVtLk51bWVyaWNzLkNvbXBsZXgCAAAABm1fcmVhbAttX2ltYWdpbmFyeQAABgYCAAAAAAAAAAAAKEAAAAAAAAAYQAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFJTeXN0ZW0uTnVtZXJpY3MsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAXU3lzdGVtLk51bWVyaWNzLkNvbXBsZXgCAAAABm1fcmVhbAttX2ltYWdpbmFyeQAABgYCAAAAAAAAAAAAKEAAAAAAAAAYQAs=" } };
// Arrays of primitive types
yield return new object[] { Enumerable.Range(0, 256).Select(i => (byte)i).ToArray(), new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAABAAACAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/ws=", "AAEAAAD/////AQAAAAAAAAAPAQAAAAABAAACAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/ws=" } };
@@ -170,8 +231,8 @@ namespace System.Runtime.Serialization.Formatters.Tests
yield return new object[] { new int[] { 1 }, new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAIAQAAAAs=", "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAIAQAAAAs=" } };
yield return new object[] { new int[] { 1, 2, 3, 4, 5 }, new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAUAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAL", "AAEAAAD/////AQAAAAAAAAAPAQAAAAUAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAL" } };
yield return new object[] { new char[] { 'a', 'b', 'c', 'd', 'e' }, new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAUAAAADYWJjZGUL", "AAEAAAD/////AQAAAAAAAAAPAQAAAAUAAAADYWJjZGUL" } };
- yield return new object[] { new string[] { }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkRAQAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAARAQAAAAAAAAAL" } };
- yield return new object[] { new string[] { "hello", "world" }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkRAQAAAAIAAAAGAwAAAAVoZWxsbwYEAAAABXdvcmxkCw==", "AAEAAAD/////AQAAAAAAAAARAQAAAAIAAAAGAgAAAAVoZWxsbwYDAAAABXdvcmxkCw==" } };
+ yield return new object[] { new string[] { }, new string[] { "AAEAAAD/////AQAAAAAAAAARAQAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAARAQAAAAAAAAAL" } };
+ yield return new object[] { new string[] { "hello", "world" }, new string[] { "AAEAAAD/////AQAAAAAAAAARAQAAAAIAAAAGAgAAAAVoZWxsbwYDAAAABXdvcmxkCw==", "AAEAAAD/////AQAAAAAAAAARAQAAAAIAAAAGAgAAAAVoZWxsbwYDAAAABXdvcmxkCw==" } };
yield return new object[] { new short[] { short.MaxValue }, new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAH/38L", "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAH/38L" } };
yield return new object[] { new long[] { long.MaxValue }, new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAJ/////////38L", "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAJ/////////38L" } };
yield return new object[] { new ushort[] { ushort.MaxValue }, new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAO//8L", "AAEAAAD/////AQAAAAAAAAAPAQAAAAEAAAAO//8L" } };
@@ -182,11 +243,12 @@ namespace System.Runtime.Serialization.Formatters.Tests
yield return new object[] { new float[] { 1.2f, 3.4f }, new string[] { "AAEAAAD/////AQAAAAAAAAAPAQAAAAIAAAALmpmZP5qZWUAL", "AAEAAAD/////AQAAAAAAAAAPAQAAAAIAAAALmpmZP5qZWUAL" } };
// Arrays of other types
- yield return new object[] { new object[] { }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAQAQAAAAAAAAAL" } };
- yield return new object[] { new Guid[] { new Guid("0CACAA4D-C6BD-420A-B660-2F557337CA89"), new Guid("BE4E9FF4-82D9-4B54-85EA-0957E21DE0E2") }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkHAQAAAAABAAAAAgAAAAQLU3lzdGVtLkd1aWQCAAAABf3///8LU3lzdGVtLkd1aWQLAAAAAl9hAl9iAl9jAl9kAl9lAl9mAl9nAl9oAl9pAl9qAl9rAAAAAAAAAAAAAAAIBwcCAgICAgICAgIAAABNqqwMvcYKQrZgL1VzN8qJAfz////9////9J9OvtmCVEuF6glX4h3g4gs=", "AAEAAAD/////AQAAAAAAAAAHAQAAAAABAAAAAgAAAAMLU3lzdGVtLkd1aWQE/v///wtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICTaqsDL3GCkK2YC9VczfKiQH9/////v////SfTr7ZglRLheoJV+Id4OIL" } };
+ yield return new object[] { new object[] { }, new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAQAQAAAAAAAAAL" } };
+ yield return new object[] { new Guid[] { new Guid("0CACAA4D-C6BD-420A-B660-2F557337CA89"), new Guid("BE4E9FF4-82D9-4B54-85EA-0957E21DE0E2") }, new string[] { "AAEAAAD/////AQAAAAAAAAAHAQAAAAABAAAAAgAAAAMLU3lzdGVtLkd1aWQE/v///wtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICTaqsDL3GCkK2YC9VczfKiQH9/////v////SfTr7ZglRLheoJV+Id4OIL", "AAEAAAD/////AQAAAAAAAAAHAQAAAAABAAAAAgAAAAMLU3lzdGVtLkd1aWQE/v///wtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICTaqsDL3GCkK2YC9VczfKiQH9/////v////SfTr7ZglRLheoJV+Id4OIL" } };
yield return new object[] { new DayOfWeek[] { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday }, new string[] { "AAEAAAD/////AQAAAAAAAAAHAQAAAAABAAAABQAAAAMQU3lzdGVtLkRheU9mV2VlawT+////EFN5c3RlbS5EYXlPZldlZWsBAAAAB3ZhbHVlX18ACAEAAAAB/f////7///8CAAAAAfz////+////AwAAAAH7/////v///wQAAAAB+v////7///8FAAAACw==", "AAEAAAD/////AQAAAAAAAAAHAQAAAAABAAAABQAAAAMQU3lzdGVtLkRheU9mV2VlawT+////EFN5c3RlbS5EYXlPZldlZWsBAAAAB3ZhbHVlX18ACAEAAAAB/f////7///8CAAAAAfz////+////AwAAAAH7/////v///wQAAAAB+v////7///8FAAAACw==" } };
yield return new object[] { new Point[] { new Point(1, 2), new Point(3, 4) }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBwEAAAAAAQAAAAIAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAAJAwAAAAkEAAAABQMAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAgAAAAEAAAACAAAAAQQAAAADAAAAAwAAAAQAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBwEAAAAAAQAAAAIAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAAJAwAAAAkEAAAABQMAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAgAAAAEAAAACAAAAAQQAAAADAAAAAwAAAAQAAAAL" } };
- yield return new object[] { new ObjectWithArrays
+
+ var objectWithArrays = new ObjectWithArrays
{
IntArray = new int[0],
StringArray = new string[] { "hello", "world" },
@@ -194,22 +256,143 @@ namespace System.Runtime.Serialization.Formatters.Tests
JaggedArray = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 } },
MultiDimensionalArray = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } },
TreeArray = new Tree<int>[] { new Tree<int>(1, new Tree<int>(2, null, null), new Tree<int>(3, null, null)) }
- }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjIuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAA+U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLk9iamVjdFdpdGhBcnJheXMGAAAACEludEFycmF5C1N0cmluZ0FycmF5CVRyZWVBcnJheQlCeXRlQXJyYXkLSmFnZ2VkQXJyYXkVTXVsdGlEaW1lbnNpb25hbEFycmF5BwYEBwMDCKEBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBTeXN0ZW0uUHJpdmF0ZS5Db3JlTGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49N2NlYzg1ZDdiZWE3Nzk4ZV1dW10CAAAAAhBTeXN0ZW0uSW50MzJbXVtdD1N5c3RlbS5JbnQzMlssXQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkHAAAACQgAAAAPAwAAAAAAAAAIEQQAAAACAAAABgkAAAAFaGVsbG8GCgAAAAV3b3JsZAcFAAAAAAEAAAABAAAABJ8BU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBTeXN0ZW0uUHJpdmF0ZS5Db3JlTGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49N2NlYzg1ZDdiZWE3Nzk4ZV1dAgAAAAkLAAAADwYAAAAUAAAAAgABAgMEBQYHCAkKCwwNDg8QERITBwcAAAABAQAAAAIAAAAHCAkMAAAACQ0AAAAHCAAAAAICAAAAAwAAAAIAAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAULAAAAnwFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIFN5c3RlbS5Qcml2YXRlLkNvcmVMaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj03Y2VjODVkN2JlYTc3OThlXV0DAAAAFjxWYWx1ZT5rX19CYWNraW5nRmllbGQVPExlZnQ+a19fQmFja2luZ0ZpZWxkFjxSaWdodD5rX19CYWNraW5nRmllbGQABAQInwFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIFN5c3RlbS5Qcml2YXRlLkNvcmVMaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj03Y2VjODVkN2JlYTc3OThlXV0CAAAAnwFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIFN5c3RlbS5Qcml2YXRlLkNvcmVMaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj03Y2VjODVkN2JlYTc3OThlXV0CAAAAAgAAAAEAAAAJDgAAAAkPAAAADwwAAAADAAAACAEAAAACAAAAAwAAAA8NAAAABAAAAAgEAAAABQAAAAYAAAAHAAAAAQ4AAAALAAAAAgAAAAoKAQ8AAAALAAAAAwAAAAoKCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjIuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAA+U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLk9iamVjdFdpdGhBcnJheXMGAAAACEludEFycmF5C1N0cmluZ0FycmF5CVRyZWVBcnJheQlCeXRlQXJyYXkLSmFnZ2VkQXJyYXkVTXVsdGlEaW1lbnNpb25hbEFycmF5BwYEBwMDCJMBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAIQU3lzdGVtLkludDMyW11bXQ9TeXN0ZW0uSW50MzJbLF0CAAAACQMAAAAJBAAAAAkFAAAACQYAAAAJBwAAAAkIAAAADwMAAAAAAAAACBEEAAAAAgAAAAYJAAAABWhlbGxvBgoAAAAFd29ybGQHBQAAAAABAAAAAQAAAASRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQsAAAAPBgAAABQAAAACAAECAwQFBgcICQoLDA0ODxAREhMHBwAAAAEBAAAAAgAAAAcICQwAAAAJDQAAAAcIAAAAAgIAAAADAAAAAgAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABQsAAACRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAFjxWYWx1ZT5rX19CYWNraW5nRmllbGQVPExlZnQ+a19fQmFja2luZ0ZpZWxkFjxSaWdodD5rX19CYWNraW5nRmllbGQABAQIkQFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAJEBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAAAQAAAAkOAAAACQ8AAAAPDAAAAAMAAAAIAQAAAAIAAAADAAAADw0AAAAEAAAACAQAAAAFAAAABgAAAAcAAAABDgAAAAsAAAACAAAACgoBDwAAAAsAAAADAAAACgoL" } };
+ };
+ yield return new object[] { objectWithArrays, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAA+U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLk9iamVjdFdpdGhBcnJheXMGAAAACEludEFycmF5C1N0cmluZ0FycmF5CVRyZWVBcnJheQlCeXRlQXJyYXkLSmFnZ2VkQXJyYXkVTXVsdGlEaW1lbnNpb25hbEFycmF5BwYEBwMDCJMBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAIQU3lzdGVtLkludDMyW11bXQ9TeXN0ZW0uSW50MzJbLF0CAAAACQMAAAAJBAAAAAkFAAAACQYAAAAJBwAAAAkIAAAADwMAAAAAAAAACBEEAAAAAgAAAAYJAAAABWhlbGxvBgoAAAAFd29ybGQHBQAAAAABAAAAAQAAAASRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQsAAAAPBgAAABQAAAACAAECAwQFBgcICQoLDA0ODxAREhMHBwAAAAEBAAAAAgAAAAcICQwAAAAJDQAAAAcIAAAAAgIAAAADAAAAAgAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABQsAAACRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAFjxWYWx1ZT5rX19CYWNraW5nRmllbGQVPExlZnQ+a19fQmFja2luZ0ZpZWxkFjxSaWdodD5rX19CYWNraW5nRmllbGQABAQIkQFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAJEBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAAAQAAAAkOAAAACQ8AAAAPDAAAAAMAAAAIAQAAAAIAAAADAAAADw0AAAAEAAAACAQAAAAFAAAABgAAAAcAAAABDgAAAAsAAAACAAAACgoBDwAAAAsAAAADAAAACgoL", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAA+U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLk9iamVjdFdpdGhBcnJheXMGAAAACEludEFycmF5C1N0cmluZ0FycmF5CVRyZWVBcnJheQlCeXRlQXJyYXkLSmFnZ2VkQXJyYXkVTXVsdGlEaW1lbnNpb25hbEFycmF5BwYEBwMDCJMBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAIQU3lzdGVtLkludDMyW11bXQ9TeXN0ZW0uSW50MzJbLF0CAAAACQMAAAAJBAAAAAkFAAAACQYAAAAJBwAAAAkIAAAADwMAAAAAAAAACBEEAAAAAgAAAAYJAAAABWhlbGxvBgoAAAAFd29ybGQHBQAAAAABAAAAAQAAAASRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQsAAAAPBgAAABQAAAACAAECAwQFBgcICQoLDA0ODxAREhMHBwAAAAEBAAAAAgAAAAcICQwAAAAJDQAAAAcIAAAAAgIAAAADAAAAAgAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABQsAAACRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAFjxWYWx1ZT5rX19CYWNraW5nRmllbGQVPExlZnQ+a19fQmFja2luZ0ZpZWxkFjxSaWdodD5rX19CYWNraW5nRmllbGQABAQIkQFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAJEBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAAAQAAAAkOAAAACQ8AAAAPDAAAAAMAAAAIAQAAAAIAAAADAAAADw0AAAAEAAAACAQAAAAFAAAABgAAAAcAAAABDgAAAAsAAAACAAAACgoBDwAAAAsAAAADAAAACgoL" } };
+
+ yield return new object[] { new List<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAAAAAAAAAAAPAgAAAAAAAAAICw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAAAAAAAAAAAPAgAAAAAAAAAICw==" } };
+ yield return new object[] { new List<int>(Enumerable.Range(0, 123)), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAewAAAAEAAAAPAgAAAIAAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAewAAAHsAAAAPAgAAAIAAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL" } };
+ yield return new object[] { new List<int>(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAwAAAAAAAAAPAgAAAAMAAAAIBQAAAAcAAAAJAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkCAAAAAwAAAAAAAAAPAgAAAAMAAAAIBQAAAAcAAAAJAAAACw==" } };
+ yield return new object[] { new List<Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAkDAAAAAAAAAAAAAAAHAwAAAAABAAAAAAAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAkDAAAAAAAAAAAAAAAHAwAAAAABAAAAAAAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAs=" } };
+ yield return new object[] { new List<Point>(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAkDAAAAAgAAAAAAAAAHAwAAAAABAAAAAgAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAkEAAAACQUAAAAFBAAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgCAAAAAQAAAAIAAAABBQAAAAQAAAAEAAAAAwAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAkDAAAAAgAAAAAAAAAHAwAAAAABAAAAAgAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAkEAAAACQUAAAAFBAAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgCAAAAAQAAAAIAAAABBQAAAAQAAAAEAAAAAwAAAAs=" } };
+ yield return new object[] { new List<Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAA9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10ICAkCAAAAAAAAAAAAAAAHAgAAAAABAAAAAAAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0L", "AAEAAAD/////AQAAAAAAAAAEAQAAAOQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAA9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10ICAkCAAAAAAAAAAAAAAAHAgAAAAABAAAAAAAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0L" } };
+ yield return new object[] { new List<Tuple<int, Graph<int>>>(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAA9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10ICAkCAAAAAgAAAAAAAAAHAgAAAAABAAAAAgAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0JAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQDAAAA8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAdtX0l0ZW0xB21fSXRlbTIABAiSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAEAAAAJBgAAAAEEAAAAAwAAAAUAAAAJBwAAAAUGAAAAkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFVmFsdWUFTGlua3MABAiUAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10FAAAABQAAAAAAAAAKAQcAAAAGAAAAAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAEAQAAAOQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAA9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10ICAkCAAAAAgAAAAAAAAAHAgAAAAABAAAAAgAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0JAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQDAAAA8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAdtX0l0ZW0xB21fSXRlbTIABAiSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAEAAAAJBgAAAAEEAAAAAwAAAAUAAAAJBwAAAAUGAAAAkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFVmFsdWUFTGlua3MABAiUAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10FAAAABQAAAAAAAAAKAQcAAAAGAAAAAAAAAAoL" } };
+
+ yield return new object[] { new Dictionary<int, int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUAAwAIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAAJAgAAAAAAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUAAwAIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAAJAgAAAAAAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+ yield return new object[] { new Dictionary<int, int>(4), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwADAAMIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCOQBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAAAAAAkCAAAABwAAAAkDAAAABAIAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwMAAAAAAQAAAAAAAAAD4gFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAOABU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwADAAMIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCOQBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAAAAAAkCAAAABwAAAAkDAAAABAIAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwMAAAAAAQAAAAAAAAAD4gFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCw==" } };
+ yield return new object[] { new Dictionary<int, Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAKwCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplAAMACJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAACQIAAAAAAAAABAIAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAKwCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplAAMACJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAACQIAAAAAAAAABAIAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+ yield return new object[] { new Dictionary<int, Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAMYEU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplAAMACJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAACQIAAAAAAAAABAIAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAMYEU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplAAMACJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAACQIAAAAAAAAABAIAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+ yield return new object[] { new Dictionary<Tuple<int, Point>, Graph<int>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJIFU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQADAAiXA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdEVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAAJAgAAAAAAAAAEAgAAAJcDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAJIFU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQADAAiXA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdEVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAAJAgAAAAAAAAAEAgAAAJcDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+
+ yield return new object[] { new CookieCollection(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAbU3lzdGVtLk5ldC5Db29raWVDb2xsZWN0aW9uAwAAAAZtX2xpc3QLbV90aW1lU3RhbXAUbV9oYXNfb3RoZXJfdmVyc2lvbnMDAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdA0BAgAAAAkDAAAAAAAAAAAAAAAABAMAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdAMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBQAACAgJBAAAAAAAAAAAAAAAEAQAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAbU3lzdGVtLk5ldC5Db29raWVDb2xsZWN0aW9uBQAAAAltX3ZlcnNpb24GbV9saXN0C21fVGltZVN0YW1wFG1faGFzX290aGVyX3ZlcnNpb25zDG1fSXNSZWFkT25seQADAAAACBxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQEBAgAAAAAAAAAJAwAAAAAAAAAAAAAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAAAAAAAAAAAQBAAAAAAAAAAL" } };
+ yield return new object[] { new PropertyCollection(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5Qcm9wZXJ0eUNvbGxlY3Rpb24HAAAACkxvYWRGYWN0b3IHVmVyc2lvbghDb21wYXJlchBIYXNoQ29kZVByb3ZpZGVyCEhhc2hTaXplBEtleXMGVmFsdWVzAAADAwAFBQsIHFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIkU3lzdGVtLkNvbGxlY3Rpb25zLklIYXNoQ29kZVByb3ZpZGVyCAIAAADsUTg/AAAAAAoKAwAAAAkDAAAACQQAAAAQAwAAAAAAAAAQBAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAB5TeXN0ZW0uRGF0YS5Qcm9wZXJ0eUNvbGxlY3Rpb24HAAAACkxvYWRGYWN0b3IHVmVyc2lvbghDb21wYXJlchBIYXNoQ29kZVByb3ZpZGVyCEhhc2hTaXplBEtleXMGVmFsdWVzAAADAwAFBQsIHFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIkU3lzdGVtLkNvbGxlY3Rpb25zLklIYXNoQ29kZVByb3ZpZGVyCAIAAADsUTg/AAAAAAoKAwAAAAkDAAAACQQAAAAQAwAAAAAAAAAQBAAAAAAAAAAL" } };
+
+ yield return new object[] { new ArrayList(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAAAAAAL" } };
+ yield return new object[] { new ArrayList(7), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAcAAAANBws=", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAcAAAANBws=" } };
+ yield return new object[] { new ArrayList(Enumerable.Range(0, 123).ToArray()), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAewAAAAEAAAAQAgAAAHsAAAAICAAAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAICCkAAAAICCoAAAAICCsAAAAICCwAAAAICC0AAAAICC4AAAAICC8AAAAICDAAAAAICDEAAAAICDIAAAAICDMAAAAICDQAAAAICDUAAAAICDYAAAAICDcAAAAICDgAAAAICDkAAAAICDoAAAAICDsAAAAICDwAAAAICD0AAAAICD4AAAAICD8AAAAICEAAAAAICEEAAAAICEIAAAAICEMAAAAICEQAAAAICEUAAAAICEYAAAAICEcAAAAICEgAAAAICEkAAAAICEoAAAAICEsAAAAICEwAAAAICE0AAAAICE4AAAAICE8AAAAICFAAAAAICFEAAAAICFIAAAAICFMAAAAICFQAAAAICFUAAAAICFYAAAAICFcAAAAICFgAAAAICFkAAAAICFoAAAAICFsAAAAICFwAAAAICF0AAAAICF4AAAAICF8AAAAICGAAAAAICGEAAAAICGIAAAAICGMAAAAICGQAAAAICGUAAAAICGYAAAAICGcAAAAICGgAAAAICGkAAAAICGoAAAAICGsAAAAICGwAAAAICG0AAAAICG4AAAAICG8AAAAICHAAAAAICHEAAAAICHIAAAAICHMAAAAICHQAAAAICHUAAAAICHYAAAAICHcAAAAICHgAAAAICHkAAAAICHoAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAewAAAAEAAAAQAgAAAHsAAAAICAAAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAICCkAAAAICCoAAAAICCsAAAAICCwAAAAICC0AAAAICC4AAAAICC8AAAAICDAAAAAICDEAAAAICDIAAAAICDMAAAAICDQAAAAICDUAAAAICDYAAAAICDcAAAAICDgAAAAICDkAAAAICDoAAAAICDsAAAAICDwAAAAICD0AAAAICD4AAAAICD8AAAAICEAAAAAICEEAAAAICEIAAAAICEMAAAAICEQAAAAICEUAAAAICEYAAAAICEcAAAAICEgAAAAICEkAAAAICEoAAAAICEsAAAAICEwAAAAICE0AAAAICE4AAAAICE8AAAAICFAAAAAICFEAAAAICFIAAAAICFMAAAAICFQAAAAICFUAAAAICFYAAAAICFcAAAAICFgAAAAICFkAAAAICFoAAAAICFsAAAAICFwAAAAICF0AAAAICF4AAAAICF8AAAAICGAAAAAICGEAAAAICGIAAAAICGMAAAAICGQAAAAICGUAAAAICGYAAAAICGcAAAAICGgAAAAICGkAAAAICGoAAAAICGsAAAAICGwAAAAICG0AAAAICG4AAAAICG8AAAAICHAAAAAICHEAAAAICHIAAAAICHMAAAAICHQAAAAICHUAAAAICHYAAAAICHcAAAAICHgAAAAICHkAAAAICHoAAAAL" } };
+ yield return new object[] { new ArrayList(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAwAAAAEAAAAQAgAAAAMAAAAICAUAAAAICAcAAAAICAkAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAwAAAAEAAAAQAgAAAAMAAAAICAUAAAAICAcAAAAICAkAAAAL" } };
+ yield return new object[] { new ArrayList(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAgAAAAEAAAAQAgAAAAIAAAAJAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUDAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAUAAAABAAAAAgAAAAEEAAAAAwAAAAQAAAADAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAgAAAAEAAAAQAgAAAAIAAAAJAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUDAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAUAAAABAAAAAgAAAAEEAAAAAwAAAAQAAAADAAAACw==" } };
+ yield return new object[] { new ArrayList(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAgAAAAEAAAAQAgAAAAIAAAAJAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQDAAAA8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAdtX0l0ZW0xB21fSXRlbTIABAiSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAEAAAAJBgAAAAEEAAAAAwAAAAUAAAAJBwAAAAUGAAAAkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFVmFsdWUFTGlua3MABAiUAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10FAAAABQAAAAAAAAAKAQcAAAAGAAAAAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAgAAAAEAAAAQAgAAAAIAAAAJAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQDAAAA8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAdtX0l0ZW0xB21fSXRlbTIABAiSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAEAAAAJBgAAAAEEAAAAAwAAAAUAAAAJBwAAAAUGAAAAkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFVmFsdWUFTGlua3MABAiUAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10FAAAABQAAAAAAAAAKAQcAAAAGAAAAAAAAAAoL" } };
+
+ yield return new object[] { new HashSet<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCENhcGFjaXR5AAMACJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgCAAAAAAAAAAkDAAAAAAAAAAQDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCENhcGFjaXR5AAMACJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgCAAAAAAAAAAkDAAAAAAAAAAQDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
+ yield return new object[] { new HashSet<int>(Enumerable.Range(0, 123)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCENhcGFjaXR5CEVsZW1lbnRzAAMABwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0ICAIAAAB7AAAACQMAAADFAAAACQQAAAAEAwAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAPBAAAAHsAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCENhcGFjaXR5CEVsZW1lbnRzAAMABwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0ICAIAAAB7AAAACQMAAADFAAAACQQAAAAEAwAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAPBAAAAHsAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAACw==" } };
+ yield return new object[] { new HashSet<int>(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCENhcGFjaXR5CEVsZW1lbnRzAAMABwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0ICAIAAAADAAAACQMAAAADAAAACQQAAAAEAwAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAPBAAAAAMAAAAIBQAAAAcAAAAJAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCENhcGFjaXR5CEVsZW1lbnRzAAMABwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0ICAIAAAADAAAACQMAAAADAAAACQQAAAAEAwAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAPBAAAAAMAAAAIBQAAAAcAAAAJAAAACw==" } };
+ yield return new object[] { new HashSet<Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAM0BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAHVmVyc2lvbghDb21wYXJlcghDYXBhY2l0eQADAAjdAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCAIAAAAAAAAACQMAAAAAAAAABAMAAADdAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAM0BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAHVmVyc2lvbghDb21wYXJlcghDYXBhY2l0eQADAAjdAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCAIAAAAAAAAACQMAAAAAAAAABAMAAADdAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAAAAAAs=" } };
+ yield return new object[] { new HashSet<Point>(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAADNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIIQ2FwYWNpdHkIRWxlbWVudHMAAwAECN0BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0INVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAwAAAAIAAAACAAAACQQAAAADAAAACQUAAAAEBAAAAN0BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAABwUAAAAAAQAAAAIAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAMAAAAJBgAAAAkHAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAAAQcAAAAGAAAABAAAAAMAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAADNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIIQ2FwYWNpdHkIRWxlbWVudHMAAwAECN0BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0INVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAwAAAAIAAAACAAAACQQAAAADAAAACQUAAAAEBAAAAN0BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAABwUAAAAAAQAAAAIAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAMAAAAJBgAAAAkHAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAAAQcAAAAGAAAABAAAAAMAAAAL" } };
+ yield return new object[] { new HashSet<Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOcDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAHVmVyc2lvbghDb21wYXJlcghDYXBhY2l0eQADAAj2A1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdEVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAAAAAAJAwAAAAAAAAAEAwAAAPYDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOcDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAHVmVyc2lvbghDb21wYXJlcghDYXBhY2l0eQADAAj2A1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdEVxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAAAAAAJAwAAAAAAAAAEAwAAAPYDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+ yield return new object[] { new HashSet<Tuple<int, Graph<int>>>(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOcDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHVmVyc2lvbghDb21wYXJlcghDYXBhY2l0eQhFbGVtZW50cwADAAMI9gNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdAgAAAAIAAAAJAwAAAAMAAAAJBAAAAAQDAAAA9gNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAcEAAAAAAEAAAACAAAAA/ICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkFAAAACQYAAAAMBwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAUAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAAAQAAAAkIAAAAAQYAAAAFAAAABQAAAAkJAAAABQgAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQcAAAAHAAAAAAAAAAoBCQAAAAgAAAAAAAAACgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOcDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHVmVyc2lvbghDb21wYXJlcghDYXBhY2l0eQhFbGVtZW50cwADAAMI9gNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdAgAAAAIAAAAJAwAAAAMAAAAJBAAAAAQDAAAA9gNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAcEAAAAAAEAAAACAAAAA/ICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkFAAAACQYAAAAMBwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAUAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAAAQAAAAkIAAAAAQYAAAAFAAAABQAAAAkJAAAABQgAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQcAAAAHAAAAAAAAAAoBCQAAAAgAAAAAAAAACgs=" } };
+
+ yield return new object[] { new LinkedList<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAHVmVyc2lvbgVDb3VudAAACAgCAAAAAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAHVmVyc2lvbgVDb3VudAAACAgCAAAAAAAAAAAAAAAL" } };
+ yield return new object[] { new LinkedList<int>(Enumerable.Range(0, 123)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAHVmVyc2lvbgVDb3VudAREYXRhAAAHCAgIAgAAAHsAAAB7AAAACQMAAAAPAwAAAHsAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAHVmVyc2lvbgVDb3VudAREYXRhAAAHCAgIAgAAAHsAAAB7AAAACQMAAAAPAwAAAHsAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAACw==" } };
+ yield return new object[] { new LinkedList<int>(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAHVmVyc2lvbgVDb3VudAREYXRhAAAHCAgIAgAAAAMAAAADAAAACQMAAAAPAwAAAAMAAAAIBQAAAAcAAAAJAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAHVmVyc2lvbgVDb3VudAREYXRhAAAHCAgIAgAAAAMAAAADAAAACQMAAAAPAwAAAAMAAAAIBQAAAAcAAAAJAAAACw==" } };
+ yield return new object[] { new LinkedList<Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADQAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB1ZlcnNpb24FQ291bnQAAAgIAgAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADQAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB1ZlcnNpb24FQ291bnQAAAgIAgAAAAAAAAAAAAAACw==" } };
+ yield return new object[] { new LinkedList<Point>(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAA0AFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaW5rZWRMaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAdWZXJzaW9uBUNvdW50BERhdGEAAAQICDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAgAAAAIAAAAJBAAAAAcEAAAAAAEAAAACAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAJBgAAAAUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAMAAAABAAAAAgAAAAEGAAAABQAAAAQAAAADAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAA0AFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaW5rZWRMaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAdWZXJzaW9uBUNvdW50BERhdGEAAAQICDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAgAAAAIAAAAJBAAAAAcEAAAAAAEAAAACAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAJBgAAAAUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAMAAAABAAAAAgAAAAEGAAAABQAAAAQAAAADAAAACw==" } };
+ yield return new object[] { new LinkedList<Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADqA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAB1ZlcnNpb24FQ291bnQAAAgIAgAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADqA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAB1ZlcnNpb24FQ291bnQAAAgIAgAAAAAAAAAAAAAACw==" } };
+ yield return new object[] { new LinkedList<Tuple<int, Graph<int>>>(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADqA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB1ZlcnNpb24FQ291bnQERGF0YQAAAwgI9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10CAAAAAgAAAAIAAAAJAwAAAAcDAAAAAAEAAAACAAAAA/ICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkEAAAACQUAAAAMBgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAQAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0GAAAAAQAAAAkHAAAAAQUAAAAEAAAABQAAAAkIAAAABQcAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQYAAAAGAAAAAAAAAAoBCAAAAAcAAAAAAAAACgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADqA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAB1ZlcnNpb24FQ291bnQERGF0YQAAAwgI9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10CAAAAAgAAAAIAAAAJAwAAAAcDAAAAAAEAAAACAAAAA/ICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkEAAAACQUAAAAMBgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAQAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0GAAAAAQAAAAkHAAAAAQUAAAAEAAAABQAAAAkIAAAABQcAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQYAAAAGAAAAAAAAAAoBCAAAAAcAAAAAAAAACgs=" } };
+
+ yield return new object[] { new Queue(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAADIAAAAAAAAABACAAAAIAAAAA0gCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAADIAAAAAAAAABACAAAAIAAAAA0gCw==" } };
+ yield return new object[] { new Queue(5), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAADIAAAAAAAAABACAAAABQAAAA0FCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAADIAAAAAAAAABACAAAABQAAAA0FCw==" } };
+ yield return new object[] { new Queue(7, 2.2f), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAADcAAAAAAAAABACAAAABwAAAA0HCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAADcAAAAAAAAABACAAAABwAAAA0HCw==" } };
+ yield return new object[] { new Queue(Enumerable.Range(0, 123).ToArray()), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAHsAAADIAAAAewAAABACAAAAewAAAAgIAAAAAAgIAQAAAAgIAgAAAAgIAwAAAAgIBAAAAAgIBQAAAAgIBgAAAAgIBwAAAAgICAAAAAgICQAAAAgICgAAAAgICwAAAAgIDAAAAAgIDQAAAAgIDgAAAAgIDwAAAAgIEAAAAAgIEQAAAAgIEgAAAAgIEwAAAAgIFAAAAAgIFQAAAAgIFgAAAAgIFwAAAAgIGAAAAAgIGQAAAAgIGgAAAAgIGwAAAAgIHAAAAAgIHQAAAAgIHgAAAAgIHwAAAAgIIAAAAAgIIQAAAAgIIgAAAAgIIwAAAAgIJAAAAAgIJQAAAAgIJgAAAAgIJwAAAAgIKAAAAAgIKQAAAAgIKgAAAAgIKwAAAAgILAAAAAgILQAAAAgILgAAAAgILwAAAAgIMAAAAAgIMQAAAAgIMgAAAAgIMwAAAAgINAAAAAgINQAAAAgINgAAAAgINwAAAAgIOAAAAAgIOQAAAAgIOgAAAAgIOwAAAAgIPAAAAAgIPQAAAAgIPgAAAAgIPwAAAAgIQAAAAAgIQQAAAAgIQgAAAAgIQwAAAAgIRAAAAAgIRQAAAAgIRgAAAAgIRwAAAAgISAAAAAgISQAAAAgISgAAAAgISwAAAAgITAAAAAgITQAAAAgITgAAAAgITwAAAAgIUAAAAAgIUQAAAAgIUgAAAAgIUwAAAAgIVAAAAAgIVQAAAAgIVgAAAAgIVwAAAAgIWAAAAAgIWQAAAAgIWgAAAAgIWwAAAAgIXAAAAAgIXQAAAAgIXgAAAAgIXwAAAAgIYAAAAAgIYQAAAAgIYgAAAAgIYwAAAAgIZAAAAAgIZQAAAAgIZgAAAAgIZwAAAAgIaAAAAAgIaQAAAAgIagAAAAgIawAAAAgIbAAAAAgIbQAAAAgIbgAAAAgIbwAAAAgIcAAAAAgIcQAAAAgIcgAAAAgIcwAAAAgIdAAAAAgIdQAAAAgIdgAAAAgIdwAAAAgIeAAAAAgIeQAAAAgIegAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAHsAAADIAAAAewAAABACAAAAewAAAAgIAAAAAAgIAQAAAAgIAgAAAAgIAwAAAAgIBAAAAAgIBQAAAAgIBgAAAAgIBwAAAAgICAAAAAgICQAAAAgICgAAAAgICwAAAAgIDAAAAAgIDQAAAAgIDgAAAAgIDwAAAAgIEAAAAAgIEQAAAAgIEgAAAAgIEwAAAAgIFAAAAAgIFQAAAAgIFgAAAAgIFwAAAAgIGAAAAAgIGQAAAAgIGgAAAAgIGwAAAAgIHAAAAAgIHQAAAAgIHgAAAAgIHwAAAAgIIAAAAAgIIQAAAAgIIgAAAAgIIwAAAAgIJAAAAAgIJQAAAAgIJgAAAAgIJwAAAAgIKAAAAAgIKQAAAAgIKgAAAAgIKwAAAAgILAAAAAgILQAAAAgILgAAAAgILwAAAAgIMAAAAAgIMQAAAAgIMgAAAAgIMwAAAAgINAAAAAgINQAAAAgINgAAAAgINwAAAAgIOAAAAAgIOQAAAAgIOgAAAAgIOwAAAAgIPAAAAAgIPQAAAAgIPgAAAAgIPwAAAAgIQAAAAAgIQQAAAAgIQgAAAAgIQwAAAAgIRAAAAAgIRQAAAAgIRgAAAAgIRwAAAAgISAAAAAgISQAAAAgISgAAAAgISwAAAAgITAAAAAgITQAAAAgITgAAAAgITwAAAAgIUAAAAAgIUQAAAAgIUgAAAAgIUwAAAAgIVAAAAAgIVQAAAAgIVgAAAAgIVwAAAAgIWAAAAAgIWQAAAAgIWgAAAAgIWwAAAAgIXAAAAAgIXQAAAAgIXgAAAAgIXwAAAAgIYAAAAAgIYQAAAAgIYgAAAAgIYwAAAAgIZAAAAAgIZQAAAAgIZgAAAAgIZwAAAAgIaAAAAAgIaQAAAAgIagAAAAgIawAAAAgIbAAAAAgIbQAAAAgIbgAAAAgIbwAAAAgIcAAAAAgIcQAAAAgIcgAAAAgIcwAAAAgIdAAAAAgIdQAAAAgIdgAAAAgIdwAAAAgIeAAAAAgIeQAAAAgIegAAAAs=" } };
+ yield return new object[] { new Queue(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAMAAADIAAAAAwAAABACAAAAAwAAAAgIBQAAAAgIBwAAAAgICQAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAMAAADIAAAAAwAAABACAAAAAwAAAAgIBQAAAAgIBwAAAAgICQAAAAs=" } };
+ yield return new object[] { new Queue(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAIAAADIAAAAAgAAABACAAAAAgAAAAkDAAAACQQAAAAMBQAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQMAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBQAAAAEAAAACAAAAAQQAAAADAAAABAAAAAMAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAIAAADIAAAAAgAAABACAAAAAgAAAAkDAAAACQQAAAAMBQAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQMAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBQAAAAEAAAACAAAAAQQAAAADAAAABAAAAAMAAAAL" } };
+ yield return new object[] { new Queue(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAIAAADIAAAAAgAAABACAAAAAgAAAAkDAAAACQQAAAAMBQAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAMAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0FAAAAAQAAAAkGAAAAAQQAAAADAAAABQAAAAkHAAAABQYAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQUAAAAFAAAAAAAAAAoBBwAAAAYAAAAAAAAACgs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAIAAADIAAAAAgAAABACAAAAAgAAAAkDAAAACQQAAAAMBQAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAMAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0FAAAAAQAAAAkGAAAAAQQAAAADAAAABQAAAAkHAAAABQYAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQUAAAAFAAAAAAAAAAoBBwAAAAYAAAAAAAAACgs=" } };
+
+ yield return new object[] { new SortedDictionary<int, int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARfc2V0BNcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAACQMAAAAMBAAAAFVTeXN0ZW0uQ29sbGVjdGlvbnMsIFZlcnNpb249NC4xLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQMAAADXAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24ABAAI+wFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAIAgAAAAAAAAAJBQAAAAAAAAAFBQAAAPsBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAAC2tleUNvbXBhcmVyA4kBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAACQYAAAAEBgAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARfc2V0BNcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAACQMAAAAFAwAAANcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgAEAAj7AVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAgCAAAAAAAAAAkEAAAAAAAAAAUEAAAA+wFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAALa2V5Q29tcGFyZXIDiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJBQAAAAQFAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+ yield return new object[] { new SortedDictionary<int, int>(Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARfc2V0BNcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAACQMAAAAMBAAAAFVTeXN0ZW0uQ29sbGVjdGlvbnMsIFZlcnNpb249NC4xLjEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQMAAADXAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24ABAAI+wFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAIAgAAAAAAAAAJBQAAAAAAAAAFBQAAAPsBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAAC2tleUNvbXBhcmVyA4kBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAACQYAAAAEBgAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARfc2V0BNcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAACQMAAAAFAwAAANcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgAEAAj7AVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAgCAAAAAAAAAAkEAAAAAAAAAAUEAAAA+wFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAALa2V5Q29tcGFyZXIDiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJBQAAAAQFAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+ yield return new object[] { new SortedDictionary<int, Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACyAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAAEX3NldASjA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAwEAAAAVVN5c3RlbS5Db2xsZWN0aW9ucywgVmVyc2lvbj00LjEuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAwAAAKMDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24ABAAIxwJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAACAIAAAAAAAAACQUAAAAAAAAABQUAAADHAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAALa2V5Q29tcGFyZXIDiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAJBgAAAAQGAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACyAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAAEX3NldASjA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAUDAAAAowNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5UcmVlU2V0YDFbW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgAEAAjHAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAAIAgAAAAAAAAAJBAAAAAAAAAAFBAAAAMcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAQAAAAtrZXlDb21wYXJlcgOJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkFAAAABAUAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
+ yield return new object[] { new SortedDictionary<int, Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADMBFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAEX3NldAS9BVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAwEAAAAVVN5c3RlbS5Db2xsZWN0aW9ucywgVmVyc2lvbj00LjEuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAwAAAL0FU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24ABAAI4QRTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAACAIAAAAAAAAACQUAAAAAAAAABQUAAADhBFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAALa2V5Q29tcGFyZXIDiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAJBgAAAAQGAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADMBFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAEX3NldAS9BVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAUDAAAAvQVTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5UcmVlU2V0YDFbW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgAEAAjhBFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAIAgAAAAAAAAAJBAAAAAAAAAAFBAAAAOEEU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAtrZXlDb21wYXJlcgOJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkFAAAABAUAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
+ yield return new object[] { new SortedDictionary<Tuple<int, Point>, Graph<int>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACYBVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAABF9zZXQEiQZTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5UcmVlU2V0YDFbW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAAgAAAAkDAAAADAQAAABVU3lzdGVtLkNvbGxlY3Rpb25zLCBWZXJzaW9uPTQuMS4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUDAAAAiQZTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5UcmVlU2V0YDFbW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24ABAAIrQVTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBAAAAAgCAAAAAAAAAAkFAAAAAAAAAAUFAAAArQVTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAQAAAAtrZXlDb21wYXJlcgOPA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdENvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAJBgAAAAQGAAAAjwNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RDb21wYXJlcmAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACYBVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAABF9zZXQEiQZTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5UcmVlU2V0YDFbW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAAgAAAAkDAAAABQMAAACJBlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgAEAAitBVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAACAIAAAAAAAAACQQAAAAAAAAABQQAAACtBVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAAC2tleUNvbXBhcmVyA48DU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0Q29tcGFyZXJgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkFAAAABAUAAACPA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdENvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL" } };
+
+ yield return new object[] { new SortedList(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIlU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkCAAAAAAAAAAAAAAAJAwAAAAoKEAIAAAAAAAAABAMAAAAbU3lzdGVtLkNvbGxlY3Rpb25zLkNvbXBhcmVyAQAAAAtDb21wYXJlSW5mbwMgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8JBAAAAAQEAAAAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvAgAAAAZtX25hbWUNbV9Tb3J0VmVyc2lvbgEDIFN5c3RlbS5HbG9iYWxpemF0aW9uLlNvcnRWZXJzaW9uBgUAAAAFZW4tVVMKCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIlU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkCAAAAAAAAAAAAAAAJAwAAAAoKEAIAAAAAAAAABAMAAAAbU3lzdGVtLkNvbGxlY3Rpb25zLkNvbXBhcmVyAQAAAAtDb21wYXJlSW5mbwMgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8JBAAAAAQEAAAAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvBAAAAAZtX25hbWUJd2luMzJMQ0lEB2N1bHR1cmUNbV9Tb3J0VmVyc2lvbgEAAAMICCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYFAAAABWVuLVVTAAAAAAkEAAAKCw==" } };
+ yield return new object[] { new SortedList(Comparer.DefaultInvariant), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIlU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkCAAAAAAAAAAAAAAAJAwAAAAoKEAIAAAAAAAAABAMAAAAbU3lzdGVtLkNvbGxlY3Rpb25zLkNvbXBhcmVyAQAAAAtDb21wYXJlSW5mbwMgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8JBAAAAAQEAAAAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvAgAAAAZtX25hbWUNbV9Tb3J0VmVyc2lvbgEDIFN5c3RlbS5HbG9iYWxpemF0aW9uLlNvcnRWZXJzaW9uBgUAAAAACgs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIlU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkCAAAAAAAAAAAAAAAJAwAAAAoKEAIAAAAAAAAABAMAAAAbU3lzdGVtLkNvbGxlY3Rpb25zLkNvbXBhcmVyAQAAAAtDb21wYXJlSW5mbwMgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8JBAAAAAQEAAAAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvBAAAAAZtX25hbWUJd2luMzJMQ0lEB2N1bHR1cmUNbV9Tb3J0VmVyc2lvbgEAAAMICCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYFAAAAAAAAAAB/AAAACgs=" } };
+ yield return new object[] { new SortedList(Comparer.DefaultInvariant, 4), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIlU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkDAAAAAAAAAAAAAAAJBAAAAAoKEAIAAAAEAAAADQQQAwAAAAQAAAANBAQEAAAAG1N5c3RlbS5Db2xsZWN0aW9ucy5Db21wYXJlcgEAAAALQ29tcGFyZUluZm8DIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCQUAAAAEBQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwIAAAAGbV9uYW1lDW1fU29ydFZlcnNpb24BAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYGAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIlU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkDAAAAAAAAAAAAAAAJBAAAAAoKEAIAAAAEAAAADQQQAwAAAAQAAAANBAQEAAAAG1N5c3RlbS5Db2xsZWN0aW9ucy5Db21wYXJlcgEAAAALQ29tcGFyZUluZm8DIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCQUAAAAEBQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GBgAAAAAAAAAAfwAAAAoL" } };
+
+ yield return new object[] { new SortedSet<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uAAMACIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAAAAAAJAwAAAAAAAAAEAwAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uAAMACIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAAAAAAJAwAAAAAAAAAEAwAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+ yield return new object[] { new SortedSet<int>(Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uAAMACIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAAAAAAJAwAAAAAAAAAEAwAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uAAMACIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAAAAAAJAwAAAAAAAAAEAwAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+ yield return new object[] { new SortedSet<int>(Enumerable.Range(0, 123)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uBUl0ZW1zAAMABwiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAgCAAAAewAAAAkDAAAAAAAAAAkEAAAABAMAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAA8EAAAAewAAAAgAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uBUl0ZW1zAAMABwiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAgCAAAAewAAAAkDAAAAAAAAAAkEAAAABAMAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAA8EAAAAewAAAAgAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAAL" } };
+ yield return new object[] { new SortedSet<int>(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uBUl0ZW1zAAMABwiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAgCAAAAAwAAAAkDAAAAAAAAAAkEAAAABAMAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAA8EAAAAAwAAAAgFAAAABwAAAAkAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACDAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uBUl0ZW1zAAMABwiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAgCAAAAAwAAAAkDAAAAAAAAAAkEAAAABAMAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAA8EAAAAAwAAAAgFAAAABwAAAAkAAAAL" } };
+ yield return new object[] { new SortedSet<Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADPAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgADAAjVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgCAAAAAAAAAAkDAAAAAAAAAAQDAAAA1QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADPAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgADAAjVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgCAAAAAAAAAAkDAAAAAAAAAAQDAAAA1QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
+ yield return new object[] { new SortedSet<Point>(Comparer<Point>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADPAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgADAAjVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgCAAAAAAAAAAkDAAAAAAAAAAQDAAAA1QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADPAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgADAAjVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgCAAAAAAAAAAkDAAAAAAAAAAQDAAAA1QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAACw==" } };
+ yield return new object[] { new SortedSet<Point>(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzwFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwAECNUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAkEAAAAAAAAAAkFAAAABAQAAADVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQAAAAAHBQAAAAABAAAAAQAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkGAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzwFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwAECNUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAkEAAAAAAAAAAkFAAAABAQAAADVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQAAAAAHBQAAAAABAAAAAQAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkGAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAACw==" } };
+ yield return new object[] { new SortedSet<Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADpA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgADAAjuA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdENvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAIAAAAAAAAACQMAAAAAAAAABAMAAADuA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdENvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADpA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgADAAjuA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdENvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAIAAAAAAAAACQMAAAAAAAAABAMAAADuA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLk9iamVjdENvbXBhcmVyYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
+ yield return new object[] { new SortedSet<Tuple<int, Graph<int>>>(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADpA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgVJdGVtcwADAAMI7gNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RDb21wYXJlcmAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQj0AlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV1bXQIAAAACAAAACQMAAAAAAAAACQQAAAAEAwAAAO4DU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0Q29tcGFyZXJgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwQAAAAAAQAAAAIAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCQUAAAAJBgAAAAwHAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIEBQAAAPICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAAHbV9JdGVtMQdtX0l0ZW0yAAQIkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAABAAAACQgAAAABBgAAAAUAAAAFAAAACQkAAAAFCAAAAJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABVZhbHVlBUxpbmtzAAQIlAFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdBwAAAAcAAAAAAAAACgEJAAAACAAAAAAAAAAKCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADpA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgVJdGVtcwADAAMI7gNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RDb21wYXJlcmAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQj0AlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV1bXQIAAAACAAAACQMAAAAAAAAACQQAAAAEAwAAAO4DU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0Q29tcGFyZXJgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwQAAAAAAQAAAAIAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCQUAAAAJBgAAAAwHAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIEBQAAAPICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAAHbV9JdGVtMQdtX0l0ZW0yAAQIkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAABAAAACQgAAAABBgAAAAUAAAAFAAAACQkAAAAFCAAAAJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABVZhbHVlBUxpbmtzAAQIlAFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdBwAAAAcAAAAAAAAACgEJAAAACAAAAAAAAAAKCw==" } };
+
+ yield return new object[] { new Stack(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAAAAAAAAAAAABACAAAACgAAAA0KCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAAAAAAAAAAAABACAAAACgAAAA0KCw==" } };
+ yield return new object[] { new Stack(Enumerable.Range(0, 123).ToArray()), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAB7AAAAewAAABACAAAAewAAAAgIAAAAAAgIAQAAAAgIAgAAAAgIAwAAAAgIBAAAAAgIBQAAAAgIBgAAAAgIBwAAAAgICAAAAAgICQAAAAgICgAAAAgICwAAAAgIDAAAAAgIDQAAAAgIDgAAAAgIDwAAAAgIEAAAAAgIEQAAAAgIEgAAAAgIEwAAAAgIFAAAAAgIFQAAAAgIFgAAAAgIFwAAAAgIGAAAAAgIGQAAAAgIGgAAAAgIGwAAAAgIHAAAAAgIHQAAAAgIHgAAAAgIHwAAAAgIIAAAAAgIIQAAAAgIIgAAAAgIIwAAAAgIJAAAAAgIJQAAAAgIJgAAAAgIJwAAAAgIKAAAAAgIKQAAAAgIKgAAAAgIKwAAAAgILAAAAAgILQAAAAgILgAAAAgILwAAAAgIMAAAAAgIMQAAAAgIMgAAAAgIMwAAAAgINAAAAAgINQAAAAgINgAAAAgINwAAAAgIOAAAAAgIOQAAAAgIOgAAAAgIOwAAAAgIPAAAAAgIPQAAAAgIPgAAAAgIPwAAAAgIQAAAAAgIQQAAAAgIQgAAAAgIQwAAAAgIRAAAAAgIRQAAAAgIRgAAAAgIRwAAAAgISAAAAAgISQAAAAgISgAAAAgISwAAAAgITAAAAAgITQAAAAgITgAAAAgITwAAAAgIUAAAAAgIUQAAAAgIUgAAAAgIUwAAAAgIVAAAAAgIVQAAAAgIVgAAAAgIVwAAAAgIWAAAAAgIWQAAAAgIWgAAAAgIWwAAAAgIXAAAAAgIXQAAAAgIXgAAAAgIXwAAAAgIYAAAAAgIYQAAAAgIYgAAAAgIYwAAAAgIZAAAAAgIZQAAAAgIZgAAAAgIZwAAAAgIaAAAAAgIaQAAAAgIagAAAAgIawAAAAgIbAAAAAgIbQAAAAgIbgAAAAgIbwAAAAgIcAAAAAgIcQAAAAgIcgAAAAgIcwAAAAgIdAAAAAgIdQAAAAgIdgAAAAgIdwAAAAgIeAAAAAgIeQAAAAgIegAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAB7AAAAewAAABACAAAAewAAAAgIAAAAAAgIAQAAAAgIAgAAAAgIAwAAAAgIBAAAAAgIBQAAAAgIBgAAAAgIBwAAAAgICAAAAAgICQAAAAgICgAAAAgICwAAAAgIDAAAAAgIDQAAAAgIDgAAAAgIDwAAAAgIEAAAAAgIEQAAAAgIEgAAAAgIEwAAAAgIFAAAAAgIFQAAAAgIFgAAAAgIFwAAAAgIGAAAAAgIGQAAAAgIGgAAAAgIGwAAAAgIHAAAAAgIHQAAAAgIHgAAAAgIHwAAAAgIIAAAAAgIIQAAAAgIIgAAAAgIIwAAAAgIJAAAAAgIJQAAAAgIJgAAAAgIJwAAAAgIKAAAAAgIKQAAAAgIKgAAAAgIKwAAAAgILAAAAAgILQAAAAgILgAAAAgILwAAAAgIMAAAAAgIMQAAAAgIMgAAAAgIMwAAAAgINAAAAAgINQAAAAgINgAAAAgINwAAAAgIOAAAAAgIOQAAAAgIOgAAAAgIOwAAAAgIPAAAAAgIPQAAAAgIPgAAAAgIPwAAAAgIQAAAAAgIQQAAAAgIQgAAAAgIQwAAAAgIRAAAAAgIRQAAAAgIRgAAAAgIRwAAAAgISAAAAAgISQAAAAgISgAAAAgISwAAAAgITAAAAAgITQAAAAgITgAAAAgITwAAAAgIUAAAAAgIUQAAAAgIUgAAAAgIUwAAAAgIVAAAAAgIVQAAAAgIVgAAAAgIVwAAAAgIWAAAAAgIWQAAAAgIWgAAAAgIWwAAAAgIXAAAAAgIXQAAAAgIXgAAAAgIXwAAAAgIYAAAAAgIYQAAAAgIYgAAAAgIYwAAAAgIZAAAAAgIZQAAAAgIZgAAAAgIZwAAAAgIaAAAAAgIaQAAAAgIagAAAAgIawAAAAgIbAAAAAgIbQAAAAgIbgAAAAgIbwAAAAgIcAAAAAgIcQAAAAgIcgAAAAgIcwAAAAgIdAAAAAgIdQAAAAgIdgAAAAgIdwAAAAgIeAAAAAgIeQAAAAgIegAAAAs=" } };
+ yield return new object[] { new Stack(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAADAAAAAwAAABACAAAACgAAAAgIBQAAAAgIBwAAAAgICQAAAA0HCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAADAAAAAwAAABACAAAACgAAAAgIBQAAAAgIBwAAAAgICQAAAA0HCw==" } };
+ yield return new object[] { new Stack(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAACAAAAAgAAABACAAAACgAAAAkDAAAACQQAAAANCAwFAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIFAwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgFAAAAAQAAAAIAAAABBAAAAAMAAAAEAAAAAwAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAACAAAAAgAAABACAAAACgAAAAkDAAAACQQAAAANCAwFAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIFAwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgFAAAAAQAAAAIAAAABBAAAAAMAAAAEAAAAAwAAAAs=" } };
+ yield return new object[] { new Stack(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAACAAAAAgAAABACAAAACgAAAAkDAAAACQQAAAANCAwFAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIEAwAAAPICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAAHbV9JdGVtMQdtX0l0ZW0yAAQIkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAABAAAACQYAAAABBAAAAAMAAAAFAAAACQcAAAAFBgAAAJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABVZhbHVlBUxpbmtzAAQIlAFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdBQAAAAUAAAAAAAAACgEHAAAABgAAAAAAAAAKCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAACAAAAAgAAABACAAAACgAAAAkDAAAACQQAAAANCAwFAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIEAwAAAPICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAAHbV9JdGVtMQdtX0l0ZW0yAAQIkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAABAAAACQYAAAABBAAAAAMAAAAFAAAACQcAAAAFBgAAAJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABVZhbHVlBUxpbmtzAAQIlAFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdBQAAAAUAAAAAAAAACgEHAAAABgAAAAAAAAAKCw==" } };
+
+ yield return new object[] { new Hashtable(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKAwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKAwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL" } };
+ yield return new object[] { new Hashtable(EqualityComparer<object>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQjsUTg/AAAAAAkCAAAAAwAAAAkDAAAACQQAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAQAwAAAAAAAAAQBAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQjsUTg/AAAAAAkCAAAAAwAAAAkDAAAACQQAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAQAwAAAAAAAAAQBAAAAAAAAAAL" } };
+ yield return new object[] { new Hashtable(5), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKBwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKBwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL" } };
+ yield return new object[] { new Hashtable(new Dictionary<int, string>(), 0.77f), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcggp7Q0/AAAAAAoKAwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcggp7Q0/AAAAAAoKAwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL" } };
+ yield return new object[] { new Hashtable(StringComparer.InvariantCultureIgnoreCase), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCBtTeXN0ZW0uQ3VsdHVyZUF3YXJlQ29tcGFyZXII7FE4PwAAAAAJAgAAAAMAAAAJAwAAAAkEAAAABAIAAAAbU3lzdGVtLkN1bHR1cmVBd2FyZUNvbXBhcmVyAgAAAAxfY29tcGFyZUluZm8LX2lnbm9yZUNhc2UDACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwEJBQAAAAEQAwAAAAAAAAAQBAAAAAAAAAAEBQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwIAAAAGbV9uYW1lDW1fU29ydFZlcnNpb24BAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYGAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCBtTeXN0ZW0uQ3VsdHVyZUF3YXJlQ29tcGFyZXII7FE4PwAAAAAJAgAAAAMAAAAJAwAAAAkEAAAABAIAAAAbU3lzdGVtLkN1bHR1cmVBd2FyZUNvbXBhcmVyAgAAAAxfY29tcGFyZUluZm8LX2lnbm9yZUNhc2UDACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwEJBQAAAAEQAwAAAAAAAAAQBAAAAAAAAAAEBQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GBgAAAAAAAAAAfwAAAAoL" } };
+#pragma warning disable 0618 // obsolete warning
+ yield return new object[] { new Hashtable(15, 0.8f, new HashCodeProvider(), Comparer.DefaultInvariant), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMEAAUFCwgbU3lzdGVtLkNvbGxlY3Rpb25zLkNvbXBhcmVyPlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5IYXNoQ29kZVByb3ZpZGVyAgAAAAi9dBM/AAAAAAkDAAAACQQAAAAdAAAACQUAAAAJBgAAAAQDAAAAG1N5c3RlbS5Db2xsZWN0aW9ucy5Db21wYXJlcgEAAAALQ29tcGFyZUluZm8DIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCQcAAAAFBAAAAD5TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSGFzaENvZGVQcm92aWRlcgAAAAACAAAAEAUAAAAAAAAAEAYAAAAAAAAABAcAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8CAAAABm1fbmFtZQ1tX1NvcnRWZXJzaW9uAQMgU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GCAAAAAAKCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMEAAUFCwgbU3lzdGVtLkNvbGxlY3Rpb25zLkNvbXBhcmVyPlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5IYXNoQ29kZVByb3ZpZGVyAgAAAAi9dBM/AAAAAAkDAAAACQQAAAAdAAAACQUAAAAJBgAAAAQDAAAAG1N5c3RlbS5Db2xsZWN0aW9ucy5Db21wYXJlcgEAAAALQ29tcGFyZUluZm8DIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvCQcAAAAFBAAAAD5TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuSGFzaENvZGVQcm92aWRlcgAAAAACAAAAEAUAAAAAAAAAEAYAAAAAAAAABAcAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8EAAAABm1fbmFtZQl3aW4zMkxDSUQHY3VsdHVyZQ1tX1NvcnRWZXJzaW9uAQAAAwgIIFN5c3RlbS5HbG9iYWxpemF0aW9uLlNvcnRWZXJzaW9uBggAAAAAAAAAAH8AAAAKCw==" } };
+#pragma warning restore 0618
+
+ yield return new object[] { new BindingList<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAD/////AQABAQEACQMAAAAEAwAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkEAAAAAAAAAAAAAAAPBAAAAAAAAAAICw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAD/////AQABAQEACQMAAAAEAwAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAkEAAAAAAAAAAAAAAAPBAAAAAAAAAAICw==" } };
+ yield return new object[] { new BindingList<int>(Enumerable.Range(0, 123).ToArray()), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBDlN5c3RlbS5JbnQzMltdAgAAAP////8BAAEBAQAJAwAAAA8DAAAAewAAAAgAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBDlN5c3RlbS5JbnQzMltdAgAAAP////8BAAEBAQAJAwAAAA8DAAAAewAAAAgAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAAL" } };
+ yield return new object[] { new BindingList<int>(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBDlN5c3RlbS5JbnQzMltdAgAAAP////8BAAEBAQAJAwAAAA8DAAAAAwAAAAgFAAAABwAAAAkAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBDlN5c3RlbS5JbnQzMltdAgAAAP////8BAAEBAQAJAwAAAA8DAAAAAwAAAAgFAAAABwAAAAkAAAAL" } };
+ yield return new object[] { new BindingList<Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADMAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgAAAAJYWRkTmV3UG9zFnJhaXNlTGlzdENoYW5nZWRFdmVudHMWcmFpc2VJdGVtQ2hhbmdlZEV2ZW50cwhhbGxvd05ldwlhbGxvd0VkaXQLYWxsb3dSZW1vdmUPdXNlclNldEFsbG93TmV3EkNvbGxlY3Rpb25gMStpdGVtcwAAAAAAAAADCAEBAQEBAcoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAD/////AQAAAQEACQMAAAAMBAAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAMAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQQAAAAICAkFAAAAAAAAAAAAAAAHBQAAAAABAAAAAAAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50BAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADMAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgAAAAJYWRkTmV3UG9zFnJhaXNlTGlzdENoYW5nZWRFdmVudHMWcmFpc2VJdGVtQ2hhbmdlZEV2ZW50cwhhbGxvd05ldwlhbGxvd0VkaXQLYWxsb3dSZW1vdmUPdXNlclNldEFsbG93TmV3EkNvbGxlY3Rpb25gMStpdGVtcwAAAAAAAAADCAEBAQEBAcoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAD/////AQAAAQEACQMAAAAMBAAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAMAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQQAAAAICAkFAAAAAAAAAAAAAAAHBQAAAAABAAAAAAAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50BAAAAAs=" } };
+ yield return new object[] { new BindingList<Point>(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzAFTeXN0ZW0uQ29tcG9uZW50TW9kZWwuQmluZGluZ0xpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0IAAAACWFkZE5ld1BvcxZyYWlzZUxpc3RDaGFuZ2VkRXZlbnRzFnJhaXNlSXRlbUNoYW5nZWRFdmVudHMIYWxsb3dOZXcJYWxsb3dFZGl0C2FsbG93UmVtb3ZlD3VzZXJTZXRBbGxvd05ldxJDb2xsZWN0aW9uYDEraXRlbXMAAAAAAAAABAgBAQEBAQE1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAAAgAAAP////8BAAABAQAJBAAAAAcEAAAAAAEAAAACAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAJBgAAAAUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAMAAAABAAAAAgAAAAEGAAAABQAAAAQAAAADAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzAFTeXN0ZW0uQ29tcG9uZW50TW9kZWwuQmluZGluZ0xpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0IAAAACWFkZE5ld1BvcxZyYWlzZUxpc3RDaGFuZ2VkRXZlbnRzFnJhaXNlSXRlbUNoYW5nZWRFdmVudHMIYWxsb3dOZXcJYWxsb3dFZGl0C2FsbG93UmVtb3ZlD3VzZXJTZXRBbGxvd05ldxJDb2xsZWN0aW9uYDEraXRlbXMAAAAAAAAABAgBAQEBAQE1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAAAgAAAP////8BAAABAQAJBAAAAAcEAAAAAAEAAAACAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAJBgAAAAUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAMAAAABAAAAAgAAAAEGAAAABQAAAAQAAAADAAAACw==" } };
+ yield return new object[] { new BindingList<Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmA1N5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAJYWRkTmV3UG9zFnJhaXNlTGlzdENoYW5nZWRFdmVudHMWcmFpc2VJdGVtQ2hhbmdlZEV2ZW50cwhhbGxvd05ldwlhbGxvd0VkaXQLYWxsb3dSZW1vdmUPdXNlclNldEFsbG93TmV3EkNvbGxlY3Rpb25gMStpdGVtcwAAAAAAAAADCAEBAQEBAeQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAD/////AQAAAQEACQMAAAAEAwAAAOQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAA9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10ICAkEAAAAAAAAAAAAAAAHBAAAAAABAAAAAAAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0L", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmA1N5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAJYWRkTmV3UG9zFnJhaXNlTGlzdENoYW5nZWRFdmVudHMWcmFpc2VJdGVtQ2hhbmdlZEV2ZW50cwhhbGxvd05ldwlhbGxvd0VkaXQLYWxsb3dSZW1vdmUPdXNlclNldEFsbG93TmV3EkNvbGxlY3Rpb25gMStpdGVtcwAAAAAAAAADCAEBAQEBAeQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAD/////AQAAAQEACQMAAAAEAwAAAOQDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAA9AJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10ICAkEAAAAAAAAAAAAAAAHBAAAAAABAAAAAAAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0L" } };
+ yield return new object[] { new BindingList<Tuple<int, Graph<int>>>(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmA1N5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAJYWRkTmV3UG9zFnJhaXNlTGlzdENoYW5nZWRFdmVudHMWcmFpc2VJdGVtQ2hhbmdlZEV2ZW50cwhhbGxvd05ldwlhbGxvd0VkaXQLYWxsb3dSZW1vdmUPdXNlclNldEFsbG93TmV3EkNvbGxlY3Rpb25gMStpdGVtcwAAAAAAAAADCAEBAQEBAfQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdAgAAAP////8BAAABAQAJAwAAAAcDAAAAAAEAAAACAAAAA/ICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkEAAAACQUAAAAMBgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAQAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0GAAAAAQAAAAkHAAAAAQUAAAAEAAAABQAAAAkIAAAABQcAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQYAAAAGAAAAAAAAAAoBCAAAAAcAAAAAAAAACgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADmA1N5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAAJYWRkTmV3UG9zFnJhaXNlTGlzdENoYW5nZWRFdmVudHMWcmFpc2VJdGVtQ2hhbmdlZEV2ZW50cwhhbGxvd05ldwlhbGxvd0VkaXQLYWxsb3dSZW1vdmUPdXNlclNldEFsbG93TmV3EkNvbGxlY3Rpb25gMStpdGVtcwAAAAAAAAADCAEBAQEBAfQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdAgAAAP////8BAAABAQAJAwAAAAcDAAAAAAEAAAACAAAAA/ICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkEAAAACQUAAAAMBgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAQAAADyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAB21fSXRlbTEHbV9JdGVtMgAECJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0GAAAAAQAAAAkHAAAAAQUAAAAEAAAABQAAAAkIAAAABQcAAACSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAVWYWx1ZQVMaW5rcwAECJQBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQYAAAAGAAAAAAAAAAoBCAAAAAcAAAAAAAAACgs=" } };
+
+ yield return new object[] { new StringDictionary(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0RpY3Rpb25hcnkBAAAACGNvbnRlbnRzAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkDAAAABAMAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMDAAUFCwgcU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlciRTeXN0ZW0uQ29sbGVjdGlvbnMuSUhhc2hDb2RlUHJvdmlkZXII7FE4PwAAAAAKCgMAAAAJBAAAAAkFAAAAEAQAAAAAAAAAEAUAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0RpY3Rpb25hcnkBAAAACGNvbnRlbnRzAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkDAAAABAMAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMDAAUFCwgcU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlciRTeXN0ZW0uQ29sbGVjdGlvbnMuSUhhc2hDb2RlUHJvdmlkZXII7FE4PwAAAAAKCgMAAAAJBAAAAAkFAAAAEAQAAAAAAAAAEAUAAAAAAAAACw==" } };
+ yield return new object[] { new StringCollection(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0NvbGxlY3Rpb24BAAAABGRhdGEDHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAACQMAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAAAAAAAAAAAQBAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0NvbGxlY3Rpb24BAAAABGRhdGEDHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAACQMAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAAAAAAAAAAAQBAAAAAAAAAAL" } };
+ yield return new object[] { new OrderedDictionary(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABSRTeXN0ZW0uQ29sbGVjdGlvbnMuSUVxdWFsaXR5Q29tcGFyZXIBCAIAAAAKAAAAAAAJAwAAABADAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABSRTeXN0ZW0uQ29sbGVjdGlvbnMuSUVxdWFsaXR5Q29tcGFyZXIBCAIAAAAKAAAAAAAJAwAAABADAAAAAAAAAAs=" } };
+ yield return new object[] { new OrderedDictionary(17, EqualityComparer<object>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABZEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEIAgAAAAkDAAAAABEAAAAJBAAAAAQDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5PYmplY3QsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAABAEAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABZEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuT2JqZWN0RXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEIAgAAAAkDAAAAABEAAAAJBAAAAAQDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5PYmplY3RFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5PYmplY3QsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAABAEAAAAAAAAAAs=" } };
+
+ yield return new object[] { new ListDictionary(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyAgAAAAoAAAAAAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyAgAAAAoAAAAAAAAAAAoL" } };
+ yield return new object[] { new ListDictionary(Comparer.DefaultInvariant), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXICAAAACgAAAAAAAAAACQMAAAAEAwAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIBAAAAC0NvbXBhcmVJbmZvAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwkEAAAABAQAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8CAAAABm1fbmFtZQ1tX1NvcnRWZXJzaW9uAQMgU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GBQAAAAAKCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXICAAAACgAAAAAAAAAACQMAAAAEAwAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIBAAAAC0NvbXBhcmVJbmZvAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwkEAAAABAQAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8EAAAABm1fbmFtZQl3aW4zMkxDSUQHY3VsdHVyZQ1tX1NvcnRWZXJzaW9uAQAAAwgIIFN5c3RlbS5HbG9iYWxpemF0aW9uLlNvcnRWZXJzaW9uBgUAAAAAAAAAAH8AAAAKCw==" } };
+ yield return new object[] { new HybridDictionary(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkh5YnJpZERpY3Rpb25hcnkDAAAABGxpc3QJaGFzaHRhYmxlD2Nhc2VJbnNlbnNpdGl2ZQQDAC1TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkCAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUBAgAAAAoKAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkh5YnJpZERpY3Rpb25hcnkDAAAABGxpc3QJaGFzaHRhYmxlD2Nhc2VJbnNlbnNpdGl2ZQQDAC1TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkCAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUBAgAAAAoKAAs=" } };
+ yield return new object[] { new HybridDictionary(127, true), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkh5YnJpZERpY3Rpb25hcnkDAAAABGxpc3QJaGFzaHRhYmxlD2Nhc2VJbnNlbnNpdGl2ZQQDAC1TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkCAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUBAgAAAAoJAwAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyCOxROD8AAAAACQQAAADFAAAACQUAAAAJBgAAAAQEAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBEAUAAAAAAAAAEAYAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkh5YnJpZERpY3Rpb25hcnkDAAAABGxpc3QJaGFzaHRhYmxlD2Nhc2VJbnNlbnNpdGl2ZQQDAC1TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkCAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUBAgAAAAoJAwAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyCOxROD8AAAAACQQAAADFAAAACQUAAAAJBgAAAAQEAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBEAUAAAAAAAAAEAYAAAAAAAAACw==" } };
+
+ yield return new object[] { new ObservableCollection<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAAAAAAAAAAAAA8FAAAAAAAAAAgL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAAAAAAAAAAAAA8FAAAAAAAAAAgL" } };
+ yield return new object[] { new ObservableCollection<int>(Enumerable.Range(0, 123)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAB7AAAAAQAAAA8FAAAAgAAAAAgAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAB7AAAAewAAAA8FAAAAgAAAAAgAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs=" } };
+ yield return new object[] { new ObservableCollection<int>(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAADAAAAAAAAAA8FAAAAAwAAAAgFAAAABwAAAAkAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAADAAAAAwAAAA8FAAAABAAAAAgFAAAABwAAAAkAAAAAAAAACw==" } };
+ yield return new object[] { new ObservableCollection<Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA+wBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACQQAAAAFAwAAAOwBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQEAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAA1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10FAAAACAgJBgAAAAAAAAAAAAAABwYAAAAAAQAAAAAAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAUAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA+wBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACQQAAAAFAwAAAOwBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQEAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAA1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10FAAAACAgJBgAAAAAAAAAAAAAABwYAAAAAAQAAAAAAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAUAAAAL" } };
+ yield return new object[] { new ObservableCollection<Point>(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA+wBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACQQAAAAFAwAAAOwBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQEAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAA1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10FAAAACAgJBgAAAAIAAAAAAAAABwYAAAAAAQAAAAIAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAUAAAAJBwAAAAkIAAAABQcAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBQAAAAEAAAACAAAAAQgAAAAHAAAABAAAAAMAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAN4BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA+wBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACQQAAAAFAwAAAOwBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQEAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAA1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10FAAAACAgJBgAAAAIAAAACAAAABwYAAAAAAQAAAAQAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAUAAAAJBwAAAAkIAAAADQIFBwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgFAAAAAQAAAAIAAAABCAAAAAcAAAAEAAAAAwAAAAs=" } };
+ yield return new object[] { new ObservableCollection<Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAPgDU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA4YEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAA5ANTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkDAAAACQQAAAAFAwAAAIYEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAABAQAAADkA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgMAAPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCAgJBQAAAAAAAAAAAAAABwUAAAAAAQAAAAAAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAPgDU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA4YEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAA5ANTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkDAAAACQQAAAAFAwAAAIYEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAABAQAAADkA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgMAAPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCAgJBQAAAAAAAAAAAAAABwUAAAAAAQAAAAAAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCw==" } };
+ yield return new object[] { new ObservableCollection<Tuple<int, Graph<int>>>(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAPgDU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA4YEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAA5ANTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkDAAAACQQAAAAFAwAAAIYEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAABAQAAADkA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgMAAPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCAgJBQAAAAIAAAAAAAAABwUAAAAAAQAAAAIAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCQYAAAAJBwAAAAwIAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIEBgAAAPICU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAAHbV9JdGVtMQdtX0l0ZW0yAAQIkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgAAAABAAAACQkAAAABBwAAAAYAAAAFAAAACQoAAAAFCQAAAJIBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABVZhbHVlBUxpbmtzAAQIlAFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdCAAAAAgAAAAAAAAACgEKAAAACQAAAAAAAAAKCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAPgDU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAhfbW9uaXRvchJDb2xsZWN0aW9uYDEraXRlbXMEA4YEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAA5ANTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkDAAAACQQAAAAFAwAAAIYEU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAABAQAAADkA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgMAAPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCAgJBQAAAAIAAAACAAAABwUAAAAAAQAAAAQAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCQYAAAAJBwAAAA0CDAgAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQGAAAA8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAdtX0l0ZW0xB21fSXRlbTIABAiSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAEAAAAJCQAAAAEHAAAABgAAAAUAAAAJCgAAAAUJAAAAkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFVmFsdWUFTGlua3MABAiUAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10IAAAACAAAAAAAAAAKAQoAAAAJAAAAAAAAAAoL" } };
+
+ yield return new object[] { new SimpleKeyedCollection(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABDU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlNpbXBsZUtleWVkQ29sbGVjdGlvbgUAAAAaS2V5ZWRDb2xsZWN0aW9uYDIrY29tcGFyZXIWS2V5ZWRDb2xsZWN0aW9uYDIrZGljdBpLZXllZENvbGxlY3Rpb25gMitrZXlDb3VudBtLZXllZENvbGxlY3Rpb25gMit0aHJlc2hvbGQSQ29sbGVjdGlvbmAxK2l0ZW1zAwMAAAORAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV2sAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgIygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACgAAAAAAAAAACQQAAAAEAwAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAEBAAAAMoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAANVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAgAAAAgICQUAAAAAAAAAAAAAAAcFAAAAAAEAAAAAAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABDU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlNpbXBsZUtleWVkQ29sbGVjdGlvbgUAAAAaS2V5ZWRDb2xsZWN0aW9uYDIrY29tcGFyZXIWS2V5ZWRDb2xsZWN0aW9uYDIrZGljdBpLZXllZENvbGxlY3Rpb25gMitrZXlDb3VudBtLZXllZENvbGxlY3Rpb25gMit0aHJlc2hvbGQSQ29sbGVjdGlvbmAxK2l0ZW1zAwMAAAORAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV2sAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgIygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACgAAAAAAAAAACQQAAAAEAwAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAEBAAAAMoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAANVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAgAAAAgICQUAAAAAAAAAAAAAAAcFAAAAAAEAAAAAAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAACw==" } };
+
+ yield return new object[] { new Collection<int>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkCAAAABAIAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJAwAAAAAAAAAAAAAADwMAAAAAAAAACAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkCAAAABAIAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJAwAAAAAAAAAAAAAADwMAAAAAAAAACAs=" } };
+ yield return new object[] { new Collection<int>(Enumerable.Range(0, 123).ToArray()), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDDlN5c3RlbS5JbnQzMltdCQIAAAAPAgAAAHsAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDDlN5c3RlbS5JbnQzMltdCQIAAAAPAgAAAHsAAAAIAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAACw==" } };
+ yield return new object[] { new Collection<int>(new int[] { 5, 7, 9 }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDDlN5c3RlbS5JbnQzMltdCQIAAAAPAgAAAAMAAAAIBQAAAAcAAAAJAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDDlN5c3RlbS5JbnQzMltdCQIAAAAPAgAAAAMAAAAIBQAAAAcAAAAJAAAACw==" } };
+ yield return new object[] { new Collection<Point>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAANQBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAABWl0ZW1zA8oBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkCAAAADAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQCAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAA1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAACAgJBAAAAAAAAAAAAAAABwQAAAAAAQAAAAAAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAMAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAANQBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0BAAAABWl0ZW1zA8oBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQkCAAAADAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQCAAAAygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAA1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAACAgJBAAAAAAAAAAAAAAABwQAAAAAAQAAAAAAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAMAAAAL" } };
+ yield return new object[] { new Collection<Point>(new Point[] { new Point(1, 2), new Point(4, 3) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAADUAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5Db2xsZWN0aW9uYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAQAAAAVpdGVtcwQ1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10CAAAACQMAAAAHAwAAAAABAAAAAgAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAkEAAAACQUAAAAFBAAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgCAAAAAQAAAAIAAAABBQAAAAQAAAAEAAAAAwAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBAEAAADUAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5Db2xsZWN0aW9uYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAQAAAAVpdGVtcwQ1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10CAAAACQMAAAAHAwAAAAABAAAAAgAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAkEAAAACQUAAAAFBAAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgCAAAAAQAAAAIAAAABBQAAAAQAAAAEAAAAAwAAAAs=" } };
+ yield return new object[] { new Collection<Tuple<int, Graph<int>>>(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAO4DU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABWl0ZW1zA+QDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkCAAAABAIAAADkA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgMAAPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCAgJAwAAAAAAAAAAAAAABwMAAAAAAQAAAAAAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAO4DU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABWl0ZW1zA+QDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkCAAAABAIAAADkA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgMAAPQCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCAgJAwAAAAAAAAAAAAAABwMAAAAAAQAAAAAAAAAD8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCw==" } };
+ yield return new object[] { new Collection<Tuple<int, Graph<int>>>(new Tuple<int, Graph<int>>[] { Tuple.Create(1, new Graph<int>()), Tuple.Create(5, new Graph<int>()) }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAO4DU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABWl0ZW1zA/QCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCQIAAAAHAgAAAAABAAAAAgAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0JAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQDAAAA8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAdtX0l0ZW0xB21fSXRlbTIABAiSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAEAAAAJBgAAAAEEAAAAAwAAAAUAAAAJBwAAAAUGAAAAkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFVmFsdWUFTGlua3MABAiUAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10FAAAABQAAAAAAAAAKAQcAAAAGAAAAAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAEAQAAAO4DU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABWl0ZW1zA/QCU3lzdGVtLlR1cGxlYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkdyYXBoYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdCQIAAAAHAgAAAAABAAAAAgAAAAPyAlN5c3RlbS5UdXBsZWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0JAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgQDAAAA8gJTeXN0ZW0uVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAdtX0l0ZW0xB21fSXRlbTIABAiSAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAEAAAAJBgAAAAEEAAAAAwAAAAUAAAAJBwAAAAUGAAAAkgFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuR3JhcGhgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFVmFsdWUFTGlua3MABAiUAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5HcmFwaGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10FAAAABQAAAAAAAAAKAQcAAAAGAAAAAAAAAAoL" } };
// .NET Native bug 445667 causes a crash in reflecting over multidimensional arrays
if (!PlatformDetection.IsNetNative)
{
- yield return new object[] { new object[] { new int[,] { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 } } }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAAAEAAAAJAwAAAAcDAAAAAgIAAAADAAAABQAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAACw==", "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgIAAAADAAAABQAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAACw==" } };
- yield return new object[] { new object[] { new int[,,] { { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 } } } }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAAAEAAAAJAwAAAAcDAAAAAgMAAAABAAAAAwAAAAUAAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAAAs=", "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgMAAAABAAAAAwAAAAUAAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAAAs=" } };
- yield return new object[] { new object[] { new int[,,,] { { { { 1 } } } } }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAAAEAAAAJAwAAAAcDAAAAAgQAAAABAAAAAQAAAAEAAAABAAAAAAgBAAAACw==", "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgQAAAABAAAAAQAAAAEAAAABAAAAAAgBAAAACw==" } };
+ yield return new object[] { new object[] { new int[,] { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 } } }, new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgIAAAADAAAABQAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAACw==", "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgIAAAADAAAABQAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAACw==" } };
+ yield return new object[] { new object[] { new int[,,] { { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 } } } }, new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgMAAAABAAAAAwAAAAUAAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAAAs=", "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgMAAAABAAAAAwAAAAUAAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAAAs=" } };
+ yield return new object[] { new object[] { new int[,,,] { { { { 1 } } } } }, new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgQAAAABAAAAAQAAAAEAAAABAAAAAAgBAAAACw==", "AAEAAAD/////AQAAAAAAAAAQAQAAAAEAAAAJAgAAAAcCAAAAAgQAAAABAAAAAQAAAAEAAAABAAAAAAgBAAAACw==" } };
}
- yield return new object[] { new ArraySegment<int>(new int[] { 1, 2, 3, 4, 5 }, 1, 2), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAIAAAAJAwAAAAEAAAACAAAADwMAAAAFAAAACAEAAAACAAAAAwAAAAQAAAAFAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAkCAAAAAQAAAAIAAAAPAgAAAAUAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAL" } };
- yield return new object[] { Enumerable.Range(0, 10000).Select(i => (object)i).ToArray(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAABAnAAAICAAAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAICCkAAAAICCoAAAAICCsAAAAICCwAAAAICC0AAAAICC4AAAAICC8AAAAICDAAAAAICDEAAAAICDIAAAAICDMAAAAICDQAAAAICDUAAAAICDYAAAAICDcAAAAICDgAAAAICDkAAAAICDoAAAAICDsAAAAICDwAAAAICD0AAAAICD4AAAAICD8AAAAICEAAAAAICEEAAAAICEIAAAAICEMAAAAICEQAAAAICEUAAAAICEYAAAAICEcAAAAICEgAAAAICEkAAAAICEoAAAAICEsAAAAICEwAAAAICE0AAAAICE4AAAAICE8AAAAICFAAAAAICFEAAAAICFIAAAAICFMAAAAICFQAAAAICFUAAAAICFYAAAAICFcAAAAICFgAAAAICFkAAAAICFoAAAAICFsAAAAICFwAAAAICF0AAAAICF4AAAAICF8AAAAICGAAAAAICGEAAAAICGIAAAAICGMAAAAICGQAAAAICGUAAAAICGYAAAAICGcAAAAICGgAAAAICGkAAAAICGoAAAAICGsAAAAICGwAAAAICG0AAAAICG4AAAAICG8AAAAICHAAAAAICHEAAAAICHIAAAAICHMAAAAICHQAAAAICHUAAAAICHYAAAAICHcAAAAICHgAAAAICHkAAAAICHoAAAAICHsAAAAICHwAAAAICH0AAAAICH4AAAAICH8AAAAICIAAAAAICIEAAAAICIIAAAAICIMAAAAICIQAAAAICIUAAAAICIYAAAAICIcAAAAICIgAAAAICIkAAAAICIoAAAAICIsAAAAICIwAAAAICI0AAAAICI4AAAAICI8AAAAICJAAAAAICJEAAAAICJIAAAAICJMAAAAICJQAAAAICJUAAAAICJYAAAAICJcAAAAICJgAAAAICJkAAAAICJoAAAAICJsAAAAICJwAAAAICJ0AAAAICJ4AAAAICJ8AAAAICKAAAAAICKEAAAAICKIAAAAICKMAAAAICKQAAAAICKUAAAAICKYAAAAICKcAAAAICKgAAAAICKkAAAAICKoAAAAICKsAAAAICKwAAAAICK0AAAAICK4AAAAICK8AAAAICLAAAAAICLEAAAAICLIAAAAICLMAAAAICLQAAAAICLUAAAAICLYAAAAICLcAAAAICLgAAAAICLkAAAAICLoAAAAICLsAAAAICLwAAAAICL0AAAAICL4AAAAICL8AAAAICMAAAAAICMEAAAAICMIAAAAICMMAAAAICMQAAAAICMUAAAAICMYAAAAICMcAAAAICMgAAAAICMkAAAAICMoAAAAICMsAAAAICMwAAAAICM0AAAAICM4AAAAICM8AAAAICNAAAAAICNEAAAAICNIAAAAICNMAAAAICNQAAAAICNUAAAAICNYAAAAICNcAAAAICNgAAAAICNkAAAAICNoAAAAICNsAAAAICNwAAAAICN0AAAAICN4AAAAICN8AAAAICOAAAAAICOEAAAAICOIAAAAICOMAAAAICOQAAAAICOUAAAAICOYAAAAICOcAAAAICOgAAAAICOkAAAAICOoAAAAICOsAAAAICOwAAAAICO0AAAAICO4AAAAICO8AAAAICPAAAAAICPEAAAAICPIAAAAICPMAAAAICPQAAAAICPUAAAAICPYAAAAICPcAAAAICPgAAAAICPkAAAAICPoAAAAICPsAAAAICPwAAAAICP0AAAAICP4AAAAICP8AAAAICAABAAAICAEBAAAICAIBAAAICAMBAAAICAQBAAAICAUBAAAICAYBAAAICAcBAAAICAgBAAAICAkBAAAICAoBAAAICAsBAAAICAwBAAAICA0BAAAICA4BAAAICA8BAAAICBABAAAICBEBAAAICBIBAAAICBMBAAAICBQBAAAICBUBAAAICBYBAAAICBcBAAAICBgBAAAICBkBAAAICBoBAAAICBsBAAAICBwBAAAICB0BAAAICB4BAAAICB8BAAAICCABAAAICCEBAAAICCIBAAAICCMBAAAICCQBAAAICCUBAAAICCYBAAAICCcBAAAICCgBAAAICCkBAAAICCoBAAAICCsBAAAICCwBAAAICC0BAAAICC4BAAAICC8BAAAICDABAAAICDEBAAAICDIBAAAICDMBAAAICDQBAAAICDUBAAAICDYBAAAICDcBAAAICDgBAAAICDkBAAAICDoBAAAICDsBAAAICDwBAAAICD0BAAAICD4BAAAICD8BAAAICEABAAAICEEBAAAICEIBAAAICEMBAAAICEQBAAAICEUBAAAICEYBAAAICEcBAAAICEgBAAAICEkBAAAICEoBAAAICEsBAAAICEwBAAAICE0BAAAICE4BAAAICE8BAAAICFABAAAICFEBAAAICFIBAAAICFMBAAAICFQBAAAICFUBAAAICFYBAAAICFcBAAAICFgBAAAICFkBAAAICFoBAAAICFsBAAAICFwBAAAICF0BAAAICF4BAAAICF8BAAAICGABAAAICGEBAAAICGIBAAAICGMBAAAICGQBAAAICGUBAAAICGYBAAAICGcBAAAICGgBAAAICGkBAAAICGoBAAAICGsBAAAICGwBAAAICG0BAAAICG4BAAAICG8BAAAICHABAAAICHEBAAAICHIBAAAICHMBAAAICHQBAAAICHUBAAAICHYBAAAICHcBAAAICHgBAAAICHkBAAAICHoBAAAICHsBAAAICHwBAAAICH0BAAAICH4BAAAICH8BAAAICIABAAAICIEBAAAICIIBAAAICIMBAAAICIQBAAAICIUBAAAICIYBAAAICIcBAAAICIgBAAAICIkBAAAICIoBAAAICIsBAAAICIwBAAAICI0BAAAICI4BAAAICI8BAAAICJABAAAICJEBAAAICJIBAAAICJMBAAAICJQBAAAICJUBAAAICJYBAAAICJcBAAAICJgBAAAICJkBAAAICJoBAAAICJsBAAAICJwBAAAICJ0BAAAICJ4BAAAICJ8BAAAICKABAAAICKEBAAAICKIBAAAICKMBAAAICKQBAAAICKUBAAAICKYBAAAICKcBAAAICKgBAAAICKkBAAAICKoBAAAICKsBAAAICKwBAAAICK0BAAAICK4BAAAICK8BAAAICLABAAAICLEBAAAICLIBAAAICLMBAAAICLQBAAAICLUBAAAICLYBAAAICLcBAAAICLgBAAAICLkBAAAICLoBAAAICLsBAAAICLwBAAAICL0BAAAICL4BAAAICL8BAAAICMABAAAICMEBAAAICMIBAAAICMMBAAAICMQBAAAICMUBAAAICMYBAAAICMcBAAAICMgBAAAICMkBAAAICMoBAAAICMsBAAAICMwBAAAICM0BAAAICM4BAAAICM8BAAAICNABAAAICNEBAAAICNIBAAAICNMBAAAICNQBAAAICNUBAAAICNYBAAAICNcBAAAICNgBAAAICNkBAAAICNoBAAAICNsBAAAICNwBAAAICN0BAAAICN4BAAAICN8BAAAICOABAAAICOEBAAAICOIBAAAICOMBAAAICOQBAAAICOUBAAAICOYBAAAICOcBAAAICOgBAAAICOkBAAAICOoBAAAICOsBAAAICOwBAAAICO0BAAAICO4BAAAICO8BAAAICPABAAAICPEBAAAICPIBAAAICPMBAAAICPQBAAAICPUBAAAICPYBAAAICPcBAAAICPgBAAAICPkBAAAICPoBAAAICPsBAAAICPwBAAAICP0BAAAICP4BAAAICP8BAAAICAACAAAICAECAAAICAICAAAICAMCAAAICAQCAAAICAUCAAAICAYCAAAICAcCAAAICAgCAAAICAkCAAAICAoCAAAICAsCAAAICAwCAAAICA0CAAAICA4CAAAICA8CAAAICBACAAAICBECAAAICBICAAAICBMCAAAICBQCAAAICBUCAAAICBYCAAAICBcCAAAICBgCAAAICBkCAAAICBoCAAAICBsCAAAICBwCAAAICB0CAAAICB4CAAAICB8CAAAICCACAAAICCECAAAICCICAAAICCMCAAAICCQCAAAICCUCAAAICCYCAAAICCcCAAAICCgCAAAICCkCAAAICCoCAAAICCsCAAAICCwCAAAICC0CAAAICC4CAAAICC8CAAAICDACAAAICDECAAAICDICAAAICDMCAAAICDQCAAAICDUCAAAICDYCAAAICDcCAAAICDgCAAAICDkCAAAICDoCAAAICDsCAAAICDwCAAAICD0CAAAICD4CAAAICD8CAAAICEACAAAICEECAAAICEICAAAICEMCAAAICEQCAAAICEUCAAAICEYCAAAICEcCAAAICEgCAAAICEkCAAAICEoCAAAICEsCAAAICEwCAAAICE0CAAAICE4CAAAICE8CAAAICFACAAAICFECAAAICFICAAAICFMCAAAICFQCAAAICFUCAAAICFYCAAAICFcCAAAICFgCAAAICFkCAAAICFoCAAAICFsCAAAICFwCAAAICF0CAAAICF4CAAAICF8CAAAICGACAAAICGECAAAICGICAAAICGMCAAAICGQCAAAICGUCAAAICGYCAAAICGcCAAAICGgCAAAICGkCAAAICGoCAAAICGsCAAAICGwCAAAICG0CAAAICG4CAAAICG8CAAAICHACAAAICHECAAAICHICAAAICHMCAAAICHQCAAAICHUCAAAICHYCAAAICHcCAAAICHgCAAAICHkCAAAICHoCAAAICHsCAAAICHwCAAAICH0CAAAICH4CAAAICH8CAAAICIACAAAICIECAAAICIICAAAICIMCAAAICIQCAAAICIUCAAAICIYCAAAICIcCAAAICIgCAAAICIkCAAAICIoCAAAICIsCAAAICIwCAAAICI0CAAAICI4CAAAICI8CAAAICJACAAAICJECAAAICJICAAAICJMCAAAICJQCAAAICJUCAAAICJYCAAAICJcCAAAICJgCAAAICJkCAAAICJoCAAAICJsCAAAICJwCAAAICJ0CAAAICJ4CAAAICJ8CAAAICKACAAAICKECAAAICKICAAAICKMCAAAICKQCAAAICKUCAAAICKYCAAAICKcCAAAICKgCAAAICKkCAAAICKoCAAAICKsCAAAICKwCAAAICK0CAAAICK4CAAAICK8CAAAICLACAAAICLECAAAICLICAAAICLMCAAAICLQCAAAICLUCAAAICLYCAAAICLcCAAAICLgCAAAICLkCAAAICLoCAAAICLsCAAAICLwCAAAICL0CAAAICL4CAAAICL8CAAAICMACAAAICMECAAAICMICAAAICMMCAAAICMQCAAAICMUCAAAICMYCAAAICMcCAAAICMgCAAAICMkCAAAICMoCAAAICMsCAAAICMwCAAAICM0CAAAICM4CAAAICM8CAAAICNACAAAICNECAAAICNICAAAICNMCAAAICNQCAAAICNUCAAAICNYCAAAICNcCAAAICNgCAAAICNkCAAAICNoCAAAICNsCAAAICNwCAAAICN0CAAAICN4CAAAICN8CAAAICOACAAAICOECAAAICOICAAAICOMCAAAICOQCAAAICOUCAAAICOYCAAAICOcCAAAICOgCAAAICOkCAAAICOoCAAAICOsCAAAICOwCAAAICO0CAAAICO4CAAAICO8CAAAICPACAAAICPECAAAICPICAAAICPMCAAAICPQCAAAICPUCAAAICPYCAAAICPcCAAAICPgCAAAICPkCAAAICPoCAAAICPsCAAAICPwCAAAICP0CAAAICP4CAAAICP8CAAAICAADAAAICAEDAAAICAIDAAAICAMDAAAICAQDAAAICAUDAAAICAYDAAAICAcDAAAICAgDAAAICAkDAAAICAoDAAAICAsDAAAICAwDAAAICA0DAAAICA4DAAAICA8DAAAICBADAAAICBEDAAAICBIDAAAICBMDAAAICBQDAAAICBUDAAAICBYDAAAICBcDAAAICBgDAAAICBkDAAAICBoDAAAICBsDAAAICBwDAAAICB0DAAAICB4DAAAICB8DAAAICCADAAAICCEDAAAICCIDAAAICCMDAAAICCQDAAAICCUDAAAICCYDAAAICCcDAAAICCgDAAAICCkDAAAICCoDAAAICCsDAAAICCwDAAAICC0DAAAICC4DAAAICC8DAAAICDADAAAICDEDAAAICDIDAAAICDMDAAAICDQDAAAICDUDAAAICDYDAAAICDcDAAAICDgDAAAICDkDAAAICDoDAAAICDsDAAAICDwDAAAICD0DAAAICD4DAAAICD8DAAAICEADAAAICEEDAAAICEIDAAAICEMDAAAICEQDAAAICEUDAAAICEYDAAAICEcDAAAICEgDAAAICEkDAAAICEoDAAAICEsDAAAICEwDAAAICE0DAAAICE4DAAAICE8DAAAICFADAAAICFEDAAAICFIDAAAICFMDAAAICFQDAAAICFUDAAAICFYDAAAICFcDAAAICFgDAAAICFkDAAAICFoDAAAICFsDAAAICFwDAAAICF0DAAAICF4DAAAICF8DAAAICGADAAAICGEDAAAICGIDAAAICGMDAAAICGQDAAAICGUDAAAICGYDAAAICGcDAAAICGgDAAAICGkDAAAICGoDAAAICGsDAAAICGwDAAAICG0DAAAICG4DAAAICG8DAAAICHADAAAICHEDAAAICHIDAAAICHMDAAAICHQDAAAICHUDAAAICHYDAAAICHcDAAAICHgDAAAICHkDAAAICHoDAAAICHsDAAAICHwDAAAICH0DAAAICH4DAAAICH8DAAAICIADAAAICIEDAAAICIIDAAAICIMDAAAICIQDAAAICIUDAAAICIYDAAAICIcDAAAICIgDAAAICIkDAAAICIoDAAAICIsDAAAICIwDAAAICI0DAAAICI4DAAAICI8DAAAICJADAAAICJEDAAAICJIDAAAICJMDAAAICJQDAAAICJUDAAAICJYDAAAICJcDAAAICJgDAAAICJkDAAAICJoDAAAICJsDAAAICJwDAAAICJ0DAAAICJ4DAAAICJ8DAAAICKADAAAICKEDAAAICKIDAAAICKMDAAAICKQDAAAICKUDAAAICKYDAAAICKcDAAAICKgDAAAICKkDAAAICKoDAAAICKsDAAAICKwDAAAICK0DAAAICK4DAAAICK8DAAAICLADAAAICLEDAAAICLIDAAAICLMDAAAICLQDAAAICLUDAAAICLYDAAAICLcDAAAICLgDAAAICLkDAAAICLoDAAAICLsDAAAICLwDAAAICL0DAAAICL4DAAAICL8DAAAICMADAAAICMEDAAAICMIDAAAICMMDAAAICMQDAAAICMUDAAAICMYDAAAICMcDAAAICMgDAAAICMkDAAAICMoDAAAICMsDAAAICMwDAAAICM0DAAAICM4DAAAICM8DAAAICNADAAAICNEDAAAICNIDAAAICNMDAAAICNQDAAAICNUDAAAICNYDAAAICNcDAAAICNgDAAAICNkDAAAICNoDAAAICNsDAAAICNwDAAAICN0DAAAICN4DAAAICN8DAAAICOADAAAICOEDAAAICOIDAAAICOMDAAAICOQDAAAICOUDAAAICOYDAAAICOcDAAAICOgDAAAICOkDAAAICOoDAAAICOsDAAAICOwDAAAICO0DAAAICO4DAAAICO8DAAAICPADAAAICPEDAAAICPIDAAAICPMDAAAICPQDAAAICPUDAAAICPYDAAAICPcDAAAICPgDAAAICPkDAAAICPoDAAAICPsDAAAICPwDAAAICP0DAAAICP4DAAAICP8DAAAICAAEAAAICAEEAAAICAIEAAAICAMEAAAICAQEAAAICAUEAAAICAYEAAAICAcEAAAICAgEAAAICAkEAAAICAoEAAAICAsEAAAICAwEAAAICA0EAAAICA4EAAAICA8EAAAICBAEAAAICBEEAAAICBIEAAAICBMEAAAICBQEAAAICBUEAAAICBYEAAAICBcEAAAICBgEAAAICBkEAAAICBoEAAAICBsEAAAICBwEAAAICB0EAAAICB4EAAAICB8EAAAICCAEAAAICCEEAAAICCIEAAAICCMEAAAICCQEAAAICCUEAAAICCYEAAAICCcEAAAICCgEAAAICCkEAAAICCoEAAAICCsEAAAICCwEAAAICC0EAAAICC4EAAAICC8EAAAICDAEAAAICDEEAAAICDIEAAAICDMEAAAICDQEAAAICDUEAAAICDYEAAAICDcEAAAICDgEAAAICDkEAAAICDoEAAAICDsEAAAICDwEAAAICD0EAAAICD4EAAAICD8EAAAICEAEAAAICEEEAAAICEIEAAAICEMEAAAICEQEAAAICEUEAAAICEYEAAAICEcEAAAICEgEAAAICEkEAAAICEoEAAAICEsEAAAICEwEAAAICE0EAAAICE4EAAAICE8EAAAICFAEAAAICFEEAAAICFIEAAAICFMEAAAICFQEAAAICFUEAAAICFYEAAAICFcEAAAICFgEAAAICFkEAAAICFoEAAAICFsEAAAICFwEAAAICF0EAAAICF4EAAAICF8EAAAICGAEAAAICGEEAAAICGIEAAAICGMEAAAICGQEAAAICGUEAAAICGYEAAAICGcEAAAICGgEAAAICGkEAAAICGoEAAAICGsEAAAICGwEAAAICG0EAAAICG4EAAAICG8EAAAICHAEAAAICHEEAAAICHIEAAAICHMEAAAICHQEAAAICHUEAAAICHYEAAAICHcEAAAICHgEAAAICHkEAAAICHoEAAAICHsEAAAICHwEAAAICH0EAAAICH4EAAAICH8EAAAICIAEAAAICIEEAAAICIIEAAAICIMEAAAICIQEAAAICIUEAAAICIYEAAAICIcEAAAICIgEAAAICIkEAAAICIoEAAAICIsEAAAICIwEAAAICI0EAAAICI4EAAAICI8EAAAICJAEAAAICJEEAAAICJIEAAAICJMEAAAICJQEAAAICJUEAAAICJYEAAAICJcEAAAICJgEAAAICJkEAAAICJoEAAAICJsEAAAICJwEAAAICJ0EAAAICJ4EAAAICJ8EAAAICKAEAAAICKEEAAAICKIEAAAICKMEAAAICKQEAAAICKUEAAAICKYEAAAICKcEAAAICKgEAAAICKkEAAAICKoEAAAICKsEAAAICKwEAAAICK0EAAAICK4EAAAICK8EAAAICLAEAAAICLEEAAAICLIEAAAICLMEAAAICLQEAAAICLUEAAAICLYEAAAICLcEAAAICLgEAAAICLkEAAAICLoEAAAICLsEAAAICLwEAAAICL0EAAAICL4EAAAICL8EAAAICMAEAAAICMEEAAAICMIEAAAICMMEAAAICMQEAAAICMUEAAAICMYEAAAICMcEAAAICMgEAAAICMkEAAAICMoEAAAICMsEAAAICMwEAAAICM0EAAAICM4EAAAICM8EAAAICNAEAAAICNEEAAAICNIEAAAICNMEAAAICNQEAAAICNUEAAAICNYEAAAICNcEAAAICNgEAAAICNkEAAAICNoEAAAICNsEAAAICNwEAAAICN0EAAAICN4EAAAICN8EAAAICOAEAAAICOEEAAAICOIEAAAICOMEAAAICOQEAAAICOUEAAAICOYEAAAICOcEAAAICOgEAAAICOkEAAAICOoEAAAICOsEAAAICOwEAAAICO0EAAAICO4EAAAICO8EAAAICPAEAAAICPEEAAAICPIEAAAICPMEAAAICPQEAAAICPUEAAAICPYEAAAICPcEAAAICPgEAAAICPkEAAAICPoEAAAICPsEAAAICPwEAAAICP0EAAAICP4EAAAICP8EAAAICAAFAAAICAEFAAAICAIFAAAICAMFAAAICAQFAAAICAUFAAAICAYFAAAICAcFAAAICAgFAAAICAkFAAAICAoFAAAICAsFAAAICAwFAAAICA0FAAAICA4FAAAICA8FAAAICBAFAAAICBEFAAAICBIFAAAICBMFAAAICBQFAAAICBUFAAAICBYFAAAICBcFAAAICBgFAAAICBkFAAAICBoFAAAICBsFAAAICBwFAAAICB0FAAAICB4FAAAICB8FAAAICCAFAAAICCEFAAAICCIFAAAICCMFAAAICCQFAAAICCUFAAAICCYFAAAICCcFAAAICCgFAAAICCkFAAAICCoFAAAICCsFAAAICCwFAAAICC0FAAAICC4FAAAICC8FAAAICDAFAAAICDEFAAAICDIFAAAICDMFAAAICDQFAAAICDUFAAAICDYFAAAICDcFAAAICDgFAAAICDkFAAAICDoFAAAICDsFAAAICDwFAAAICD0FAAAICD4FAAAICD8FAAAICEAFAAAICEEFAAAICEIFAAAICEMFAAAICEQFAAAICEUFAAAICEYFAAAICEcFAAAICEgFAAAICEkFAAAICEoFAAAICEsFAAAICEwFAAAICE0FAAAICE4FAAAICE8FAAAICFAFAAAICFEFAAAICFIFAAAICFMFAAAICFQFAAAICFUFAAAICFYFAAAICFcFAAAICFgFAAAICFkFAAAICFoFAAAICFsFAAAICFwFAAAICF0FAAAICF4FAAAICF8FAAAICGAFAAAICGEFAAAICGIFAAAICGMFAAAICGQFAAAICGUFAAAICGYFAAAICGcFAAAICGgFAAAICGkFAAAICGoFAAAICGsFAAAICGwFAAAICG0FAAAICG4FAAAICG8FAAAICHAFAAAICHEFAAAICHIFAAAICHMFAAAICHQFAAAICHUFAAAICHYFAAAICHcFAAAICHgFAAAICHkFAAAICHoFAAAICHsFAAAICHwFAAAICH0FAAAICH4FAAAICH8FAAAICIAFAAAICIEFAAAICIIFAAAICIMFAAAICIQFAAAICIUFAAAICIYFAAAICIcFAAAICIgFAAAICIkFAAAICIoFAAAICIsFAAAICIwFAAAICI0FAAAICI4FAAAICI8FAAAICJAFAAAICJEFAAAICJIFAAAICJMFAAAICJQFAAAICJUFAAAICJYFAAAICJcFAAAICJgFAAAICJkFAAAICJoFAAAICJsFAAAICJwFAAAICJ0FAAAICJ4FAAAICJ8FAAAICKAFAAAICKEFAAAICKIFAAAICKMFAAAICKQFAAAICKUFAAAICKYFAAAICKcFAAAICKgFAAAICKkFAAAICKoFAAAICKsFAAAICKwFAAAICK0FAAAICK4FAAAICK8FAAAICLAFAAAICLEFAAAICLIFAAAICLMFAAAICLQFAAAICLUFAAAICLYFAAAICLcFAAAICLgFAAAICLkFAAAICLoFAAAICLsFAAAICLwFAAAICL0FAAAICL4FAAAICL8FAAAICMAFAAAICMEFAAAICMIFAAAICMMFAAAICMQFAAAICMUFAAAICMYFAAAICMcFAAAICMgFAAAICMkFAAAICMoFAAAICMsFAAAICMwFAAAICM0FAAAICM4FAAAICM8FAAAICNAFAAAICNEFAAAICNIFAAAICNMFAAAICNQFAAAICNUFAAAICNYFAAAICNcFAAAICNgFAAAICNkFAAAICNoFAAAICNsFAAAICNwFAAAICN0FAAAICN4FAAAICN8FAAAICOAFAAAICOEFAAAICOIFAAAICOMFAAAICOQFAAAICOUFAAAICOYFAAAICOcFAAAICOgFAAAICOkFAAAICOoFAAAICOsFAAAICOwFAAAICO0FAAAICO4FAAAICO8FAAAICPAFAAAICPEFAAAICPIFAAAICPMFAAAICPQFAAAICPUFAAAICPYFAAAICPcFAAAICPgFAAAICPkFAAAICPoFAAAICPsFAAAICPwFAAAICP0FAAAICP4FAAAICP8FAAAICAAGAAAICAEGAAAICAIGAAAICAMGAAAICAQGAAAICAUGAAAICAYGAAAICAcGAAAICAgGAAAICAkGAAAICAoGAAAICAsGAAAICAwGAAAICA0GAAAICA4GAAAICA8GAAAICBAGAAAICBEGAAAICBIGAAAICBMGAAAICBQGAAAICBUGAAAICBYGAAAICBcGAAAICBgGAAAICBkGAAAICBoGAAAICBsGAAAICBwGAAAICB0GAAAICB4GAAAICB8GAAAICCAGAAAICCEGAAAICCIGAAAICCMGAAAICCQGAAAICCUGAAAICCYGAAAICCcGAAAICCgGAAAICCkGAAAICCoGAAAICCsGAAAICCwGAAAICC0GAAAICC4GAAAICC8GAAAICDAGAAAICDEGAAAICDIGAAAICDMGAAAICDQGAAAICDUGAAAICDYGAAAICDcGAAAICDgGAAAICDkGAAAICDoGAAAICDsGAAAICDwGAAAICD0GAAAICD4GAAAICD8GAAAICEAGAAAICEEGAAAICEIGAAAICEMGAAAICEQGAAAICEUGAAAICEYGAAAICEcGAAAICEgGAAAICEkGAAAICEoGAAAICEsGAAAICEwGAAAICE0GAAAICE4GAAAICE8GAAAICFAGAAAICFEGAAAICFIGAAAICFMGAAAICFQGAAAICFUGAAAICFYGAAAICFcGAAAICFgGAAAICFkGAAAICFoGAAAICFsGAAAICFwGAAAICF0GAAAICF4GAAAICF8GAAAICGAGAAAICGEGAAAICGIGAAAICGMGAAAICGQGAAAICGUGAAAICGYGAAAICGcGAAAICGgGAAAICGkGAAAICGoGAAAICGsGAAAICGwGAAAICG0GAAAICG4GAAAICG8GAAAICHAGAAAICHEGAAAICHIGAAAICHMGAAAICHQGAAAICHUGAAAICHYGAAAICHcGAAAICHgGAAAICHkGAAAICHoGAAAICHsGAAAICHwGAAAICH0GAAAICH4GAAAICH8GAAAICIAGAAAICIEGAAAICIIGAAAICIMGAAAICIQGAAAICIUGAAAICIYGAAAICIcGAAAICIgGAAAICIkGAAAICIoGAAAICIsGAAAICIwGAAAICI0GAAAICI4GAAAICI8GAAAICJAGAAAICJEGAAAICJIGAAAICJMGAAAICJQGAAAICJUGAAAICJYGAAAICJcGAAAICJgGAAAICJkGAAAICJoGAAAICJsGAAAICJwGAAAICJ0GAAAICJ4GAAAICJ8GAAAICKAGAAAICKEGAAAICKIGAAAICKMGAAAICKQGAAAICKUGAAAICKYGAAAICKcGAAAICKgGAAAICKkGAAAICKoGAAAICKsGAAAICKwGAAAICK0GAAAICK4GAAAICK8GAAAICLAGAAAICLEGAAAICLIGAAAICLMGAAAICLQGAAAICLUGAAAICLYGAAAICLcGAAAICLgGAAAICLkGAAAICLoGAAAICLsGAAAICLwGAAAICL0GAAAICL4GAAAICL8GAAAICMAGAAAICMEGAAAICMIGAAAICMMGAAAICMQGAAAICMUGAAAICMYGAAAICMcGAAAICMgGAAAICMkGAAAICMoGAAAICMsGAAAICMwGAAAICM0GAAAICM4GAAAICM8GAAAICNAGAAAICNEGAAAICNIGAAAICNMGAAAICNQGAAAICNUGAAAICNYGAAAICNcGAAAICNgGAAAICNkGAAAICNoGAAAICNsGAAAICNwGAAAICN0GAAAICN4GAAAICN8GAAAICOAGAAAICOEGAAAICOIGAAAICOMGAAAICOQGAAAICOUGAAAICOYGAAAICOcGAAAICOgGAAAICOkGAAAICOoGAAAICOsGAAAICOwGAAAICO0GAAAICO4GAAAICO8GAAAICPAGAAAICPEGAAAICPIGAAAICPMGAAAICPQGAAAICPUGAAAICPYGAAAICPcGAAAICPgGAAAICPkGAAAICPoGAAAICPsGAAAICPwGAAAICP0GAAAICP4GAAAICP8GAAAICAAHAAAICAEHAAAICAIHAAAICAMHAAAICAQHAAAICAUHAAAICAYHAAAICAcHAAAICAgHAAAICAkHAAAICAoHAAAICAsHAAAICAwHAAAICA0HAAAICA4HAAAICA8HAAAICBAHAAAICBEHAAAICBIHAAAICBMHAAAICBQHAAAICBUHAAAICBYHAAAICBcHAAAICBgHAAAICBkHAAAICBoHAAAICBsHAAAICBwHAAAICB0HAAAICB4HAAAICB8HAAAICCAHAAAICCEHAAAICCIHAAAICCMHAAAICCQHAAAICCUHAAAICCYHAAAICCcHAAAICCgHAAAICCkHAAAICCoHAAAICCsHAAAICCwHAAAICC0HAAAICC4HAAAICC8HAAAICDAHAAAICDEHAAAICDIHAAAICDMHAAAICDQHAAAICDUHAAAICDYHAAAICDcHAAAICDgHAAAICDkHAAAICDoHAAAICDsHAAAICDwHAAAICD0HAAAICD4HAAAICD8HAAAICEAHAAAICEEHAAAICEIHAAAICEMHAAAICEQHAAAICEUHAAAICEYHAAAICEcHAAAICEgHAAAICEkHAAAICEoHAAAICEsHAAAICEwHAAAICE0HAAAICE4HAAAICE8HAAAICFAHAAAICFEHAAAICFIHAAAICFMHAAAICFQHAAAICFUHAAAICFYHAAAICFcHAAAICFgHAAAICFkHAAAICFoHAAAICFsHAAAICFwHAAAICF0HAAAICF4HAAAICF8HAAAICGAHAAAICGEHAAAICGIHAAAICGMHAAAICGQHAAAICGUHAAAICGYHAAAICGcHAAAICGgHAAAICGkHAAAICGoHAAAICGsHAAAICGwHAAAICG0HAAAICG4HAAAICG8HAAAICHAHAAAICHEHAAAICHIHAAAICHMHAAAICHQHAAAICHUHAAAICHYHAAAICHcHAAAICHgHAAAICHkHAAAICHoHAAAICHsHAAAICHwHAAAICH0HAAAICH4HAAAICH8HAAAICIAHAAAICIEHAAAICIIHAAAICIMHAAAICIQHAAAICIUHAAAICIYHAAAICIcHAAAICIgHAAAICIkHAAAICIoHAAAICIsHAAAICIwHAAAICI0HAAAICI4HAAAICI8HAAAICJAHAAAICJEHAAAICJIHAAAICJMHAAAICJQHAAAICJUHAAAICJYHAAAICJcHAAAICJgHAAAICJkHAAAICJoHAAAICJsHAAAICJwHAAAICJ0HAAAICJ4HAAAICJ8HAAAICKAHAAAICKEHAAAICKIHAAAICKMHAAAICKQHAAAICKUHAAAICKYHAAAICKcHAAAICKgHAAAICKkHAAAICKoHAAAICKsHAAAICKwHAAAICK0HAAAICK4HAAAICK8HAAAICLAHAAAICLEHAAAICLIHAAAICLMHAAAICLQHAAAICLUHAAAICLYHAAAICLcHAAAICLgHAAAICLkHAAAICLoHAAAICLsHAAAICLwHAAAICL0HAAAICL4HAAAICL8HAAAICMAHAAAICMEHAAAICMIHAAAICMMHAAAICMQHAAAICMUHAAAICMYHAAAICMcHAAAICMgHAAAICMkHAAAICMoHAAAICMsHAAAICMwHAAAICM0HAAAICM4HAAAICM8HAAAICNAHAAAICNEHAAAICNIHAAAICNMHAAAICNQHAAAICNUHAAAICNYHAAAICNcHAAAICNgHAAAICNkHAAAICNoHAAAICNsHAAAICNwHAAAICN0HAAAICN4HAAAICN8HAAAICOAHAAAICOEHAAAICOIHAAAICOMHAAAICOQHAAAICOUHAAAICOYHAAAICOcHAAAICOgHAAAICOkHAAAICOoHAAAICOsHAAAICOwHAAAICO0HAAAICO4HAAAICO8HAAAICPAHAAAICPEHAAAICPIHAAAICPMHAAAICPQHAAAICPUHAAAICPYHAAAICPcHAAAICPgHAAAICPkHAAAICPoHAAAICPsHAAAICPwHAAAICP0HAAAICP4HAAAICP8HAAAICAAIAAAICAEIAAAICAIIAAAICAMIAAAICAQIAAAICAUIAAAICAYIAAAICAcIAAAICAgIAAAICAkIAAAICAoIAAAICAsIAAAICAwIAAAICA0IAAAICA4IAAAICA8IAAAICBAIAAAICBEIAAAICBIIAAAICBMIAAAICBQIAAAICBUIAAAICBYIAAAICBcIAAAICBgIAAAICBkIAAAICBoIAAAICBsIAAAICBwIAAAICB0IAAAICB4IAAAICB8IAAAICCAIAAAICCEIAAAICCIIAAAICCMIAAAICCQIAAAICCUIAAAICCYIAAAICCcIAAAICCgIAAAICCkIAAAICCoIAAAICCsIAAAICCwIAAAICC0IAAAICC4IAAAICC8IAAAICDAIAAAICDEIAAAICDIIAAAICDMIAAAICDQIAAAICDUIAAAICDYIAAAICDcIAAAICDgIAAAICDkIAAAICDoIAAAICDsIAAAICDwIAAAICD0IAAAICD4IAAAICD8IAAAICEAIAAAICEEIAAAICEIIAAAICEMIAAAICEQIAAAICEUIAAAICEYIAAAICEcIAAAICEgIAAAICEkIAAAICEoIAAAICEsIAAAICEwIAAAICE0IAAAICE4IAAAICE8IAAAICFAIAAAICFEIAAAICFIIAAAICFMIAAAICFQIAAAICFUIAAAICFYIAAAICFcIAAAICFgIAAAICFkIAAAICFoIAAAICFsIAAAICFwIAAAICF0IAAAICF4IAAAICF8IAAAICGAIAAAICGEIAAAICGIIAAAICGMIAAAICGQIAAAICGUIAAAICGYIAAAICGcIAAAICGgIAAAICGkIAAAICGoIAAAICGsIAAAICGwIAAAICG0IAAAICG4IAAAICG8IAAAICHAIAAAICHEIAAAICHIIAAAICHMIAAAICHQIAAAICHUIAAAICHYIAAAICHcIAAAICHgIAAAICHkIAAAICHoIAAAICHsIAAAICHwIAAAICH0IAAAICH4IAAAICH8IAAAICIAIAAAICIEIAAAICIIIAAAICIMIAAAICIQIAAAICIUIAAAICIYIAAAICIcIAAAICIgIAAAICIkIAAAICIoIAAAICIsIAAAICIwIAAAICI0IAAAICI4IAAAICI8IAAAICJAIAAAICJEIAAAICJIIAAAICJMIAAAICJQIAAAICJUIAAAICJYIAAAICJcIAAAICJgIAAAICJkIAAAICJoIAAAICJsIAAAICJwIAAAICJ0IAAAICJ4IAAAICJ8IAAAICKAIAAAICKEIAAAICKIIAAAICKMIAAAICKQIAAAICKUIAAAICKYIAAAICKcIAAAICKgIAAAICKkIAAAICKoIAAAICKsIAAAICKwIAAAICK0IAAAICK4IAAAICK8IAAAICLAIAAAICLEIAAAICLIIAAAICLMIAAAICLQIAAAICLUIAAAICLYIAAAICLcIAAAICLgIAAAICLkIAAAICLoIAAAICLsIAAAICLwIAAAICL0IAAAICL4IAAAICL8IAAAICMAIAAAICMEIAAAICMIIAAAICMMIAAAICMQIAAAICMUIAAAICMYIAAAICMcIAAAICMgIAAAICMkIAAAICMoIAAAICMsIAAAICMwIAAAICM0IAAAICM4IAAAICM8IAAAICNAIAAAICNEIAAAICNIIAAAICNMIAAAICNQIAAAICNUIAAAICNYIAAAICNcIAAAICNgIAAAICNkIAAAICNoIAAAICNsIAAAICNwIAAAICN0IAAAICN4IAAAICN8IAAAICOAIAAAICOEIAAAICOIIAAAICOMIAAAICOQIAAAICOUIAAAICOYIAAAICOcIAAAICOgIAAAICOkIAAAICOoIAAAICOsIAAAICOwIAAAICO0IAAAICO4IAAAICO8IAAAICPAIAAAICPEIAAAICPIIAAAICPMIAAAICPQIAAAICPUIAAAICPYIAAAICPcIAAAICPgIAAAICPkIAAAICPoIAAAICPsIAAAICPwIAAAICP0IAAAICP4IAAAICP8IAAAICAAJAAAICAEJAAAICAIJAAAICAMJAAAICAQJAAAICAUJAAAICAYJAAAICAcJAAAICAgJAAAICAkJAAAICAoJAAAICAsJAAAICAwJAAAICA0JAAAICA4JAAAICA8JAAAICBAJAAAICBEJAAAICBIJAAAICBMJAAAICBQJAAAICBUJAAAICBYJAAAICBcJAAAICBgJAAAICBkJAAAICBoJAAAICBsJAAAICBwJAAAICB0JAAAICB4JAAAICB8JAAAICCAJAAAICCEJAAAICCIJAAAICCMJAAAICCQJAAAICCUJAAAICCYJAAAICCcJAAAICCgJAAAICCkJAAAICCoJAAAICCsJAAAICCwJAAAICC0JAAAICC4JAAAICC8JAAAICDAJAAAICDEJAAAICDIJAAAICDMJAAAICDQJAAAICDUJAAAICDYJAAAICDcJAAAICDgJAAAICDkJAAAICDoJAAAICDsJAAAICDwJAAAICD0JAAAICD4JAAAICD8JAAAICEAJAAAICEEJAAAICEIJAAAICEMJAAAICEQJAAAICEUJAAAICEYJAAAICEcJAAAICEgJAAAICEkJAAAICEoJAAAICEsJAAAICEwJAAAICE0JAAAICE4JAAAICE8JAAAICFAJAAAICFEJAAAICFIJAAAICFMJAAAICFQJAAAICFUJAAAICFYJAAAICFcJAAAICFgJAAAICFkJAAAICFoJAAAICFsJAAAICFwJAAAICF0JAAAICF4JAAAICF8JAAAICGAJAAAICGEJAAAICGIJAAAICGMJAAAICGQJAAAICGUJAAAICGYJAAAICGcJAAAICGgJAAAICGkJAAAICGoJAAAICGsJAAAICGwJAAAICG0JAAAICG4JAAAICG8JAAAICHAJAAAICHEJAAAICHIJAAAICHMJAAAICHQJAAAICHUJAAAICHYJAAAICHcJAAAICHgJAAAICHkJAAAICHoJAAAICHsJAAAICHwJAAAICH0JAAAICH4JAAAICH8JAAAICIAJAAAICIEJAAAICIIJAAAICIMJAAAICIQJAAAICIUJAAAICIYJAAAICIcJAAAICIgJAAAICIkJAAAICIoJAAAICIsJAAAICIwJAAAICI0JAAAICI4JAAAICI8JAAAICJAJAAAICJEJAAAICJIJAAAICJMJAAAICJQJAAAICJUJAAAICJYJAAAICJcJAAAICJgJAAAICJkJAAAICJoJAAAICJsJAAAICJwJAAAICJ0JAAAICJ4JAAAICJ8JAAAICKAJAAAICKEJAAAICKIJAAAICKMJAAAICKQJAAAICKUJAAAICKYJAAAICKcJAAAICKgJAAAICKkJAAAICKoJAAAICKsJAAAICKwJAAAICK0JAAAICK4JAAAICK8JAAAICLAJAAAICLEJAAAICLIJAAAICLMJAAAICLQJAAAICLUJAAAICLYJAAAICLcJAAAICLgJAAAICLkJAAAICLoJAAAICLsJAAAICLwJAAAICL0JAAAICL4JAAAICL8JAAAICMAJAAAICMEJAAAICMIJAAAICMMJAAAICMQJAAAICMUJAAAICMYJAAAICMcJAAAICMgJAAAICMkJAAAICMoJAAAICMsJAAAICMwJAAAICM0JAAAICM4JAAAICM8JAAAICNAJAAAICNEJAAAICNIJAAAICNMJAAAICNQJAAAICNUJAAAICNYJAAAICNcJAAAICNgJAAAICNkJAAAICNoJAAAICNsJAAAICNwJAAAICN0JAAAICN4JAAAICN8JAAAICOAJAAAICOEJAAAICOIJAAAICOMJAAAICOQJAAAICOUJAAAICOYJAAAICOcJAAAICOgJAAAICOkJAAAICOoJAAAICOsJAAAICOwJAAAICO0JAAAICO4JAAAICO8JAAAICPAJAAAICPEJAAAICPIJAAAICPMJAAAICPQJAAAICPUJAAAICPYJAAAICPcJAAAICPgJAAAICPkJAAAICPoJAAAICPsJAAAICPwJAAAICP0JAAAICP4JAAAICP8JAAAICAAKAAAICAEKAAAICAIKAAAICAMKAAAICAQKAAAICAUKAAAICAYKAAAICAcKAAAICAgKAAAICAkKAAAICAoKAAAICAsKAAAICAwKAAAICA0KAAAICA4KAAAICA8KAAAICBAKAAAICBEKAAAICBIKAAAICBMKAAAICBQKAAAICBUKAAAICBYKAAAICBcKAAAICBgKAAAICBkKAAAICBoKAAAICBsKAAAICBwKAAAICB0KAAAICB4KAAAICB8KAAAICCAKAAAICCEKAAAICCIKAAAICCMKAAAICCQKAAAICCUKAAAICCYKAAAICCcKAAAICCgKAAAICCkKAAAICCoKAAAICCsKAAAICCwKAAAICC0KAAAICC4KAAAICC8KAAAICDAKAAAICDEKAAAICDIKAAAICDMKAAAICDQKAAAICDUKAAAICDYKAAAICDcKAAAICDgKAAAICDkKAAAICDoKAAAICDsKAAAICDwKAAAICD0KAAAICD4KAAAICD8KAAAICEAKAAAICEEKAAAICEIKAAAICEMKAAAICEQKAAAICEUKAAAICEYKAAAICEcKAAAICEgKAAAICEkKAAAICEoKAAAICEsKAAAICEwKAAAICE0KAAAICE4KAAAICE8KAAAICFAKAAAICFEKAAAICFIKAAAICFMKAAAICFQKAAAICFUKAAAICFYKAAAICFcKAAAICFgKAAAICFkKAAAICFoKAAAICFsKAAAICFwKAAAICF0KAAAICF4KAAAICF8KAAAICGAKAAAICGEKAAAICGIKAAAICGMKAAAICGQKAAAICGUKAAAICGYKAAAICGcKAAAICGgKAAAICGkKAAAICGoKAAAICGsKAAAICGwKAAAICG0KAAAICG4KAAAICG8KAAAICHAKAAAICHEKAAAICHIKAAAICHMKAAAICHQKAAAICHUKAAAICHYKAAAICHcKAAAICHgKAAAICHkKAAAICHoKAAAICHsKAAAICHwKAAAICH0KAAAICH4KAAAICH8KAAAICIAKAAAICIEKAAAICIIKAAAICIMKAAAICIQKAAAICIUKAAAICIYKAAAICIcKAAAICIgKAAAICIkKAAAICIoKAAAICIsKAAAICIwKAAAICI0KAAAICI4KAAAICI8KAAAICJAKAAAICJEKAAAICJIKAAAICJMKAAAICJQKAAAICJUKAAAICJYKAAAICJcKAAAICJgKAAAICJkKAAAICJoKAAAICJsKAAAICJwKAAAICJ0KAAAICJ4KAAAICJ8KAAAICKAKAAAICKEKAAAICKIKAAAICKMKAAAICKQKAAAICKUKAAAICKYKAAAICKcKAAAICKgKAAAICKkKAAAICKoKAAAICKsKAAAICKwKAAAICK0KAAAICK4KAAAICK8KAAAICLAKAAAICLEKAAAICLIKAAAICLMKAAAICLQKAAAICLUKAAAICLYKAAAICLcKAAAICLgKAAAICLkKAAAICLoKAAAICLsKAAAICLwKAAAICL0KAAAICL4KAAAICL8KAAAICMAKAAAICMEKAAAICMIKAAAICMMKAAAICMQKAAAICMUKAAAICMYKAAAICMcKAAAICMgKAAAICMkKAAAICMoKAAAICMsKAAAICMwKAAAICM0KAAAICM4KAAAICM8KAAAICNAKAAAICNEKAAAICNIKAAAICNMKAAAICNQKAAAICNUKAAAICNYKAAAICNcKAAAICNgKAAAICNkKAAAICNoKAAAICNsKAAAICNwKAAAICN0KAAAICN4KAAAICN8KAAAICOAKAAAICOEKAAAICOIKAAAICOMKAAAICOQKAAAICOUKAAAICOYKAAAICOcKAAAICOgKAAAICOkKAAAICOoKAAAICOsKAAAICOwKAAAICO0KAAAICO4KAAAICO8KAAAICPAKAAAICPEKAAAICPIKAAAICPMKAAAICPQKAAAICPUKAAAICPYKAAAICPcKAAAICPgKAAAICPkKAAAICPoKAAAICPsKAAAICPwKAAAICP0KAAAICP4KAAAICP8KAAAICAALAAAICAELAAAICAILAAAICAMLAAAICAQLAAAICAULAAAICAYLAAAICAcLAAAICAgLAAAICAkLAAAICAoLAAAICAsLAAAICAwLAAAICA0LAAAICA4LAAAICA8LAAAICBALAAAICBELAAAICBILAAAICBMLAAAICBQLAAAICBULAAAICBYLAAAICBcLAAAICBgLAAAICBkLAAAICBoLAAAICBsLAAAICBwLAAAICB0LAAAICB4LAAAICB8LAAAICCALAAAICCELAAAICCILAAAICCMLAAAICCQLAAAICCULAAAICCYLAAAICCcLAAAICCgLAAAICCkLAAAICCoLAAAICCsLAAAICCwLAAAICC0LAAAICC4LAAAICC8LAAAICDALAAAICDELAAAICDILAAAICDMLAAAICDQLAAAICDULAAAICDYLAAAICDcLAAAICDgLAAAICDkLAAAICDoLAAAICDsLAAAICDwLAAAICD0LAAAICD4LAAAICD8LAAAICEALAAAICEELAAAICEILAAAICEMLAAAICEQLAAAICEULAAAICEYLAAAICEcLAAAICEgLAAAICEkLAAAICEoLAAAICEsLAAAICEwLAAAICE0LAAAICE4LAAAICE8LAAAICFALAAAICFELAAAICFILAAAICFMLAAAICFQLAAAICFULAAAICFYLAAAICFcLAAAICFgLAAAICFkLAAAICFoLAAAICFsLAAAICFwLAAAICF0LAAAICF4LAAAICF8LAAAICGALAAAICGELAAAICGILAAAICGMLAAAICGQLAAAICGULAAAICGYLAAAICGcLAAAICGgLAAAICGkLAAAICGoLAAAICGsLAAAICGwLAAAICG0LAAAICG4LAAAICG8LAAAICHALAAAICHELAAAICHILAAAICHMLAAAICHQLAAAICHULAAAICHYLAAAICHcLAAAICHgLAAAICHkLAAAICHoLAAAICHsLAAAICHwLAAAICH0LAAAICH4LAAAICH8LAAAICIALAAAICIELAAAICIILAAAICIMLAAAICIQLAAAICIULAAAICIYLAAAICIcLAAAICIgLAAAICIkLAAAICIoLAAAICIsLAAAICIwLAAAICI0LAAAICI4LAAAICI8LAAAICJALAAAICJELAAAICJILAAAICJMLAAAICJQLAAAICJULAAAICJYLAAAICJcLAAAICJgLAAAICJkLAAAICJoLAAAICJsLAAAICJwLAAAICJ0LAAAICJ4LAAAICJ8LAAAICKALAAAICKELAAAICKILAAAICKMLAAAICKQLAAAICKULAAAICKYLAAAICKcLAAAICKgLAAAICKkLAAAICKoLAAAICKsLAAAICKwLAAAICK0LAAAICK4LAAAICK8LAAAICLALAAAICLELAAAICLILAAAICLMLAAAICLQLAAAICLULAAAICLYLAAAICLcLAAAICLgLAAAICLkLAAAICLoLAAAICLsLAAAICLwLAAAICL0LAAAICL4LAAAICL8LAAAICMALAAAICMELAAAICMILAAAICMMLAAAICMQLAAAICMULAAAICMYLAAAICMcLAAAICMgLAAAICMkLAAAICMoLAAAICMsLAAAICMwLAAAICM0LAAAICM4LAAAICM8LAAAICNALAAAICNELAAAICNILAAAICNMLAAAICNQLAAAICNULAAAICNYLAAAICNcLAAAICNgLAAAICNkLAAAICNoLAAAICNsLAAAICNwLAAAICN0LAAAICN4LAAAICN8LAAAICOALAAAICOELAAAICOILAAAICOMLAAAICOQLAAAICOULAAAICOYLAAAICOcLAAAICOgLAAAICOkLAAAICOoLAAAICOsLAAAICOwLAAAICO0LAAAICO4LAAAICO8LAAAICPALAAAICPELAAAICPILAAAICPMLAAAICPQLAAAICPULAAAICPYLAAAICPcLAAAICPgLAAAICPkLAAAICPoLAAAICPsLAAAICPwLAAAICP0LAAAICP4LAAAICP8LAAAICAAMAAAICAEMAAAICAIMAAAICAMMAAAICAQMAAAICAUMAAAICAYMAAAICAcMAAAICAgMAAAICAkMAAAICAoMAAAICAsMAAAICAwMAAAICA0MAAAICA4MAAAICA8MAAAICBAMAAAICBEMAAAICBIMAAAICBMMAAAICBQMAAAICBUMAAAICBYMAAAICBcMAAAICBgMAAAICBkMAAAICBoMAAAICBsMAAAICBwMAAAICB0MAAAICB4MAAAICB8MAAAICCAMAAAICCEMAAAICCIMAAAICCMMAAAICCQMAAAICCUMAAAICCYMAAAICCcMAAAICCgMAAAICCkMAAAICCoMAAAICCsMAAAICCwMAAAICC0MAAAICC4MAAAICC8MAAAICDAMAAAICDEMAAAICDIMAAAICDMMAAAICDQMAAAICDUMAAAICDYMAAAICDcMAAAICDgMAAAICDkMAAAICDoMAAAICDsMAAAICDwMAAAICD0MAAAICD4MAAAICD8MAAAICEAMAAAICEEMAAAICEIMAAAICEMMAAAICEQMAAAICEUMAAAICEYMAAAICEcMAAAICEgMAAAICEkMAAAICEoMAAAICEsMAAAICEwMAAAICE0MAAAICE4MAAAICE8MAAAICFAMAAAICFEMAAAICFIMAAAICFMMAAAICFQMAAAICFUMAAAICFYMAAAICFcMAAAICFgMAAAICFkMAAAICFoMAAAICFsMAAAICFwMAAAICF0MAAAICF4MAAAICF8MAAAICGAMAAAICGEMAAAICGIMAAAICGMMAAAICGQMAAAICGUMAAAICGYMAAAICGcMAAAICGgMAAAICGkMAAAICGoMAAAICGsMAAAICGwMAAAICG0MAAAICG4MAAAICG8MAAAICHAMAAAICHEMAAAICHIMAAAICHMMAAAICHQMAAAICHUMAAAICHYMAAAICHcMAAAICHgMAAAICHkMAAAICHoMAAAICHsMAAAICHwMAAAICH0MAAAICH4MAAAICH8MAAAICIAMAAAICIEMAAAICIIMAAAICIMMAAAICIQMAAAICIUMAAAICIYMAAAICIcMAAAICIgMAAAICIkMAAAICIoMAAAICIsMAAAICIwMAAAICI0MAAAICI4MAAAICI8MAAAICJAMAAAICJEMAAAICJIMAAAICJMMAAAICJQMAAAICJUMAAAICJYMAAAICJcMAAAICJgMAAAICJkMAAAICJoMAAAICJsMAAAICJwMAAAICJ0MAAAICJ4MAAAICJ8MAAAICKAMAAAICKEMAAAICKIMAAAICKMMAAAICKQMAAAICKUMAAAICKYMAAAICKcMAAAICKgMAAAICKkMAAAICKoMAAAICKsMAAAICKwMAAAICK0MAAAICK4MAAAICK8MAAAICLAMAAAICLEMAAAICLIMAAAICLMMAAAICLQMAAAICLUMAAAICLYMAAAICLcMAAAICLgMAAAICLkMAAAICLoMAAAICLsMAAAICLwMAAAICL0MAAAICL4MAAAICL8MAAAICMAMAAAICMEMAAAICMIMAAAICMMMAAAICMQMAAAICMUMAAAICMYMAAAICMcMAAAICMgMAAAICMkMAAAICMoMAAAICMsMAAAICMwMAAAICM0MAAAICM4MAAAICM8MAAAICNAMAAAICNEMAAAICNIMAAAICNMMAAAICNQMAAAICNUMAAAICNYMAAAICNcMAAAICNgMAAAICNkMAAAICNoMAAAICNsMAAAICNwMAAAICN0MAAAICN4MAAAICN8MAAAICOAMAAAICOEMAAAICOIMAAAICOMMAAAICOQMAAAICOUMAAAICOYMAAAICOcMAAAICOgMAAAICOkMAAAICOoMAAAICOsMAAAICOwMAAAICO0MAAAICO4MAAAICO8MAAAICPAMAAAICPEMAAAICPIMAAAICPMMAAAICPQMAAAICPUMAAAICPYMAAAICPcMAAAICPgMAAAICPkMAAAICPoMAAAICPsMAAAICPwMAAAICP0MAAAICP4MAAAICP8MAAAICAANAAAICAENAAAICAINAAAICAMNAAAICAQNAAAICAUNAAAICAYNAAAICAcNAAAICAgNAAAICAkNAAAICAoNAAAICAsNAAAICAwNAAAICA0NAAAICA4NAAAICA8NAAAICBANAAAICBENAAAICBINAAAICBMNAAAICBQNAAAICBUNAAAICBYNAAAICBcNAAAICBgNAAAICBkNAAAICBoNAAAICBsNAAAICBwNAAAICB0NAAAICB4NAAAICB8NAAAICCANAAAICCENAAAICCINAAAICCMNAAAICCQNAAAICCUNAAAICCYNAAAICCcNAAAICCgNAAAICCkNAAAICCoNAAAICCsNAAAICCwNAAAICC0NAAAICC4NAAAICC8NAAAICDANAAAICDENAAAICDINAAAICDMNAAAICDQNAAAICDUNAAAICDYNAAAICDcNAAAICDgNAAAICDkNAAAICDoNAAAICDsNAAAICDwNAAAICD0NAAAICD4NAAAICD8NAAAICEANAAAICEENAAAICEINAAAICEMNAAAICEQNAAAICEUNAAAICEYNAAAICEcNAAAICEgNAAAICEkNAAAICEoNAAAICEsNAAAICEwNAAAICE0NAAAICE4NAAAICE8NAAAICFANAAAICFENAAAICFINAAAICFMNAAAICFQNAAAICFUNAAAICFYNAAAICFcNAAAICFgNAAAICFkNAAAICFoNAAAICFsNAAAICFwNAAAICF0NAAAICF4NAAAICF8NAAAICGANAAAICGENAAAICGINAAAICGMNAAAICGQNAAAICGUNAAAICGYNAAAICGcNAAAICGgNAAAICGkNAAAICGoNAAAICGsNAAAICGwNAAAICG0NAAAICG4NAAAICG8NAAAICHANAAAICHENAAAICHINAAAICHMNAAAICHQNAAAICHUNAAAICHYNAAAICHcNAAAICHgNAAAICHkNAAAICHoNAAAICHsNAAAICHwNAAAICH0NAAAICH4NAAAICH8NAAAICIANAAAICIENAAAICIINAAAICIMNAAAICIQNAAAICIUNAAAICIYNAAAICIcNAAAICIgNAAAICIkNAAAICIoNAAAICIsNAAAICIwNAAAICI0NAAAICI4NAAAICI8NAAAICJANAAAICJENAAAICJINAAAICJMNAAAICJQNAAAICJUNAAAICJYNAAAICJcNAAAICJgNAAAICJkNAAAICJoNAAAICJsNAAAICJwNAAAICJ0NAAAICJ4NAAAICJ8NAAAICKANAAAICKENAAAICKINAAAICKMNAAAICKQNAAAICKUNAAAICKYNAAAICKcNAAAICKgNAAAICKkNAAAICKoNAAAICKsNAAAICKwNAAAICK0NAAAICK4NAAAICK8NAAAICLANAAAICLENAAAICLINAAAICLMNAAAICLQNAAAICLUNAAAICLYNAAAICLcNAAAICLgNAAAICLkNAAAICLoNAAAICLsNAAAICLwNAAAICL0NAAAICL4NAAAICL8NAAAICMANAAAICMENAAAICMINAAAICMMNAAAICMQNAAAICMUNAAAICMYNAAAICMcNAAAICMgNAAAICMkNAAAICMoNAAAICMsNAAAICMwNAAAICM0NAAAICM4NAAAICM8NAAAICNANAAAICNENAAAICNINAAAICNMNAAAICNQNAAAICNUNAAAICNYNAAAICNcNAAAICNgNAAAICNkNAAAICNoNAAAICNsNAAAICNwNAAAICN0NAAAICN4NAAAICN8NAAAICOANAAAICOENAAAICOINAAAICOMNAAAICOQNAAAICOUNAAAICOYNAAAICOcNAAAICOgNAAAICOkNAAAICOoNAAAICOsNAAAICOwNAAAICO0NAAAICO4NAAAICO8NAAAICPANAAAICPENAAAICPINAAAICPMNAAAICPQNAAAICPUNAAAICPYNAAAICPcNAAAICPgNAAAICPkNAAAICPoNAAAICPsNAAAICPwNAAAICP0NAAAICP4NAAAICP8NAAAICAAOAAAICAEOAAAICAIOAAAICAMOAAAICAQOAAAICAUOAAAICAYOAAAICAcOAAAICAgOAAAICAkOAAAICAoOAAAICAsOAAAICAwOAAAICA0OAAAICA4OAAAICA8OAAAICBAOAAAICBEOAAAICBIOAAAICBMOAAAICBQOAAAICBUOAAAICBYOAAAICBcOAAAICBgOAAAICBkOAAAICBoOAAAICBsOAAAICBwOAAAICB0OAAAICB4OAAAICB8OAAAICCAOAAAICCEOAAAICCIOAAAICCMOAAAICCQOAAAICCUOAAAICCYOAAAICCcOAAAICCgOAAAICCkOAAAICCoOAAAICCsOAAAICCwOAAAICC0OAAAICC4OAAAICC8OAAAICDAOAAAICDEOAAAICDIOAAAICDMOAAAICDQOAAAICDUOAAAICDYOAAAICDcOAAAICDgOAAAICDkOAAAICDoOAAAICDsOAAAICDwOAAAICD0OAAAICD4OAAAICD8OAAAICEAOAAAICEEOAAAICEIOAAAICEMOAAAICEQOAAAICEUOAAAICEYOAAAICEcOAAAICEgOAAAICEkOAAAICEoOAAAICEsOAAAICEwOAAAICE0OAAAICE4OAAAICE8OAAAICFAOAAAICFEOAAAICFIOAAAICFMOAAAICFQOAAAICFUOAAAICFYOAAAICFcOAAAICFgOAAAICFkOAAAICFoOAAAICFsOAAAICFwOAAAICF0OAAAICF4OAAAICF8OAAAICGAOAAAICGEOAAAICGIOAAAICGMOAAAICGQOAAAICGUOAAAICGYOAAAICGcOAAAICGgOAAAICGkOAAAICGoOAAAICGsOAAAICGwOAAAICG0OAAAICG4OAAAICG8OAAAICHAOAAAICHEOAAAICHIOAAAICHMOAAAICHQOAAAICHUOAAAICHYOAAAICHcOAAAICHgOAAAICHkOAAAICHoOAAAICHsOAAAICHwOAAAICH0OAAAICH4OAAAICH8OAAAICIAOAAAICIEOAAAICIIOAAAICIMOAAAICIQOAAAICIUOAAAICIYOAAAICIcOAAAICIgOAAAICIkOAAAICIoOAAAICIsOAAAICIwOAAAICI0OAAAICI4OAAAICI8OAAAICJAOAAAICJEOAAAICJIOAAAICJMOAAAICJQOAAAICJUOAAAICJYOAAAICJcOAAAICJgOAAAICJkOAAAICJoOAAAICJsOAAAICJwOAAAICJ0OAAAICJ4OAAAICJ8OAAAICKAOAAAICKEOAAAICKIOAAAICKMOAAAICKQOAAAICKUOAAAICKYOAAAICKcOAAAICKgOAAAICKkOAAAICKoOAAAICKsOAAAICKwOAAAICK0OAAAICK4OAAAICK8OAAAICLAOAAAICLEOAAAICLIOAAAICLMOAAAICLQOAAAICLUOAAAICLYOAAAICLcOAAAICLgOAAAICLkOAAAICLoOAAAICLsOAAAICLwOAAAICL0OAAAICL4OAAAICL8OAAAICMAOAAAICMEOAAAICMIOAAAICMMOAAAICMQOAAAICMUOAAAICMYOAAAICMcOAAAICMgOAAAICMkOAAAICMoOAAAICMsOAAAICMwOAAAICM0OAAAICM4OAAAICM8OAAAICNAOAAAICNEOAAAICNIOAAAICNMOAAAICNQOAAAICNUOAAAICNYOAAAICNcOAAAICNgOAAAICNkOAAAICNoOAAAICNsOAAAICNwOAAAICN0OAAAICN4OAAAICN8OAAAICOAOAAAICOEOAAAICOIOAAAICOMOAAAICOQOAAAICOUOAAAICOYOAAAICOcOAAAICOgOAAAICOkOAAAICOoOAAAICOsOAAAICOwOAAAICO0OAAAICO4OAAAICO8OAAAICPAOAAAICPEOAAAICPIOAAAICPMOAAAICPQOAAAICPUOAAAICPYOAAAICPcOAAAICPgOAAAICPkOAAAICPoOAAAICPsOAAAICPwOAAAICP0OAAAICP4OAAAICP8OAAAICAAPAAAICAEPAAAICAIPAAAICAMPAAAICAQPAAAICAUPAAAICAYPAAAICAcPAAAICAgPAAAICAkPAAAICAoPAAAICAsPAAAICAwPAAAICA0PAAAICA4PAAAICA8PAAAICBAPAAAICBEPAAAICBIPAAAICBMPAAAICBQPAAAICBUPAAAICBYPAAAICBcPAAAICBgPAAAICBkPAAAICBoPAAAICBsPAAAICBwPAAAICB0PAAAICB4PAAAICB8PAAAICCAPAAAICCEPAAAICCIPAAAICCMPAAAICCQPAAAICCUPAAAICCYPAAAICCcPAAAICCgPAAAICCkPAAAICCoPAAAICCsPAAAICCwPAAAICC0PAAAICC4PAAAICC8PAAAICDAPAAAICDEPAAAICDIPAAAICDMPAAAICDQPAAAICDUPAAAICDYPAAAICDcPAAAICDgPAAAICDkPAAAICDoPAAAICDsPAAAICDwPAAAICD0PAAAICD4PAAAICD8PAAAICEAPAAAICEEPAAAICEIPAAAICEMPAAAICEQPAAAICEUPAAAICEYPAAAICEcPAAAICEgPAAAICEkPAAAICEoPAAAICEsPAAAICEwPAAAICE0PAAAICE4PAAAICE8PAAAICFAPAAAICFEPAAAICFIPAAAICFMPAAAICFQPAAAICFUPAAAICFYPAAAICFcPAAAICFgPAAAICFkPAAAICFoPAAAICFsPAAAICFwPAAAICF0PAAAICF4PAAAICF8PAAAICGAPAAAICGEPAAAICGIPAAAICGMPAAAICGQPAAAICGUPAAAICGYPAAAICGcPAAAICGgPAAAICGkPAAAICGoPAAAICGsPAAAICGwPAAAICG0PAAAICG4PAAAICG8PAAAICHAPAAAICHEPAAAICHIPAAAICHMPAAAICHQPAAAICHUPAAAICHYPAAAICHcPAAAICHgPAAAICHkPAAAICHoPAAAICHsPAAAICHwPAAAICH0PAAAICH4PAAAICH8PAAAICIAPAAAICIEPAAAICIIPAAAICIMPAAAICIQPAAAICIUPAAAICIYPAAAICIcPAAAICIgPAAAICIkPAAAICIoPAAAICIsPAAAICIwPAAAICI0PAAAICI4PAAAICI8PAAAICJAPAAAICJEPAAAICJIPAAAICJMPAAAICJQPAAAICJUPAAAICJYPAAAICJcPAAAICJgPAAAICJkPAAAICJoPAAAICJsPAAAICJwPAAAICJ0PAAAICJ4PAAAICJ8PAAAICKAPAAAICKEPAAAICKIPAAAICKMPAAAICKQPAAAICKUPAAAICKYPAAAICKcPAAAICKgPAAAICKkPAAAICKoPAAAICKsPAAAICKwPAAAICK0PAAAICK4PAAAICK8PAAAICLAPAAAICLEPAAAICLIPAAAICLMPAAAICLQPAAAICLUPAAAICLYPAAAICLcPAAAICLgPAAAICLkPAAAICLoPAAAICLsPAAAICLwPAAAICL0PAAAICL4PAAAICL8PAAAICMAPAAAICMEPAAAICMIPAAAICMMPAAAICMQPAAAICMUPAAAICMYPAAAICMcPAAAICMgPAAAICMkPAAAICMoPAAAICMsPAAAICMwPAAAICM0PAAAICM4PAAAICM8PAAAICNAPAAAICNEPAAAICNIPAAAICNMPAAAICNQPAAAICNUPAAAICNYPAAAICNcPAAAICNgPAAAICNkPAAAICNoPAAAICNsPAAAICNwPAAAICN0PAAAICN4PAAAICN8PAAAICOAPAAAICOEPAAAICOIPAAAICOMPAAAICOQPAAAICOUPAAAICOYPAAAICOcPAAAICOgPAAAICOkPAAAICOoPAAAICOsPAAAICOwPAAAICO0PAAAICO4PAAAICO8PAAAICPAPAAAICPEPAAAICPIPAAAICPMPAAAICPQPAAAICPUPAAAICPYPAAAICPcPAAAICPgPAAAICPkPAAAICPoPAAAICPsPAAAICPwPAAAICP0PAAAICP4PAAAICP8PAAAICAAQAAAICAEQAAAICAIQAAAICAMQAAAICAQQAAAICAUQAAAICAYQAAAICAcQAAAICAgQAAAICAkQAAAICAoQAAAICAsQAAAICAwQAAAICA0QAAAICA4QAAAICA8QAAAICBAQAAAICBEQAAAICBIQAAAICBMQAAAICBQQAAAICBUQAAAICBYQAAAICBcQAAAICBgQAAAICBkQAAAICBoQAAAICBsQAAAICBwQAAAICB0QAAAICB4QAAAICB8QAAAICCAQAAAICCEQAAAICCIQAAAICCMQAAAICCQQAAAICCUQAAAICCYQAAAICCcQAAAICCgQAAAICCkQAAAICCoQAAAICCsQAAAICCwQAAAICC0QAAAICC4QAAAICC8QAAAICDAQAAAICDEQAAAICDIQAAAICDMQAAAICDQQAAAICDUQAAAICDYQAAAICDcQAAAICDgQAAAICDkQAAAICDoQAAAICDsQAAAICDwQAAAICD0QAAAICD4QAAAICD8QAAAICEAQAAAICEEQAAAICEIQAAAICEMQAAAICEQQAAAICEUQAAAICEYQAAAICEcQAAAICEgQAAAICEkQAAAICEoQAAAICEsQAAAICEwQAAAICE0QAAAICE4QAAAICE8QAAAICFAQAAAICFEQAAAICFIQAAAICFMQAAAICFQQAAAICFUQAAAICFYQAAAICFcQAAAICFgQAAAICFkQAAAICFoQAAAICFsQAAAICFwQAAAICF0QAAAICF4QAAAICF8QAAAICGAQAAAICGEQAAAICGIQAAAICGMQAAAICGQQAAAICGUQAAAICGYQAAAICGcQAAAICGgQAAAICGkQAAAICGoQAAAICGsQAAAICGwQAAAICG0QAAAICG4QAAAICG8QAAAICHAQAAAICHEQAAAICHIQAAAICHMQAAAICHQQAAAICHUQAAAICHYQAAAICHcQAAAICHgQAAAICHkQAAAICHoQAAAICHsQAAAICHwQAAAICH0QAAAICH4QAAAICH8QAAAICIAQAAAICIEQAAAICIIQAAAICIMQAAAICIQQAAAICIUQAAAICIYQAAAICIcQAAAICIgQAAAICIkQAAAICIoQAAAICIsQAAAICIwQAAAICI0QAAAICI4QAAAICI8QAAAICJAQAAAICJEQAAAICJIQAAAICJMQAAAICJQQAAAICJUQAAAICJYQAAAICJcQAAAICJgQAAAICJkQAAAICJoQAAAICJsQAAAICJwQAAAICJ0QAAAICJ4QAAAICJ8QAAAICKAQAAAICKEQAAAICKIQAAAICKMQAAAICKQQAAAICKUQAAAICKYQAAAICKcQAAAICKgQAAAICKkQAAAICKoQAAAICKsQAAAICKwQAAAICK0QAAAICK4QAAAICK8QAAAICLAQAAAICLEQAAAICLIQAAAICLMQAAAICLQQAAAICLUQAAAICLYQAAAICLcQAAAICLgQAAAICLkQAAAICLoQAAAICLsQAAAICLwQAAAICL0QAAAICL4QAAAICL8QAAAICMAQAAAICMEQAAAICMIQAAAICMMQAAAICMQQAAAICMUQAAAICMYQAAAICMcQAAAICMgQAAAICMkQAAAICMoQAAAICMsQAAAICMwQAAAICM0QAAAICM4QAAAICM8QAAAICNAQAAAICNEQAAAICNIQAAAICNMQAAAICNQQAAAICNUQAAAICNYQAAAICNcQAAAICNgQAAAICNkQAAAICNoQAAAICNsQAAAICNwQAAAICN0QAAAICN4QAAAICN8QAAAICOAQAAAICOEQAAAICOIQAAAICOMQAAAICOQQAAAICOUQAAAICOYQAAAICOcQAAAICOgQAAAICOkQAAAICOoQAAAICOsQAAAICOwQAAAICO0QAAAICO4QAAAICO8QAAAICPAQAAAICPEQAAAICPIQAAAICPMQAAAICPQQAAAICPUQAAAICPYQAAAICPcQAAAICPgQAAAICPkQAAAICPoQAAAICPsQAAAICPwQAAAICP0QAAAICP4QAAAICP8QAAAICAARAAAICAERAAAICAIRAAAICAMRAAAICAQRAAAICAURAAAICAYRAAAICAcRAAAICAgRAAAICAkRAAAICAoRAAAICAsRAAAICAwRAAAICA0RAAAICA4RAAAICA8RAAAICBARAAAICBERAAAICBIRAAAICBMRAAAICBQRAAAICBURAAAICBYRAAAICBcRAAAICBgRAAAICBkRAAAICBoRAAAICBsRAAAICBwRAAAICB0RAAAICB4RAAAICB8RAAAICCARAAAICCERAAAICCIRAAAICCMRAAAICCQRAAAICCURAAAICCYRAAAICCcRAAAICCgRAAAICCkRAAAICCoRAAAICCsRAAAICCwRAAAICC0RAAAICC4RAAAICC8RAAAICDARAAAICDERAAAICDIRAAAICDMRAAAICDQRAAAICDURAAAICDYRAAAICDcRAAAICDgRAAAICDkRAAAICDoRAAAICDsRAAAICDwRAAAICD0RAAAICD4RAAAICD8RAAAICEARAAAICEERAAAICEIRAAAICEMRAAAICEQRAAAICEURAAAICEYRAAAICEcRAAAICEgRAAAICEkRAAAICEoRAAAICEsRAAAICEwRAAAICE0RAAAICE4RAAAICE8RAAAICFARAAAICFERAAAICFIRAAAICFMRAAAICFQRAAAICFURAAAICFYRAAAICFcRAAAICFgRAAAICFkRAAAICFoRAAAICFsRAAAICFwRAAAICF0RAAAICF4RAAAICF8RAAAICGARAAAICGERAAAICGIRAAAICGMRAAAICGQRAAAICGURAAAICGYRAAAICGcRAAAICGgRAAAICGkRAAAICGoRAAAICGsRAAAICGwRAAAICG0RAAAICG4RAAAICG8RAAAICHARAAAICHERAAAICHIRAAAICHMRAAAICHQRAAAICHURAAAICHYRAAAICHcRAAAICHgRAAAICHkRAAAICHoRAAAICHsRAAAICHwRAAAICH0RAAAICH4RAAAICH8RAAAICIARAAAICIERAAAICIIRAAAICIMRAAAICIQRAAAICIURAAAICIYRAAAICIcRAAAICIgRAAAICIkRAAAICIoRAAAICIsRAAAICIwRAAAICI0RAAAICI4RAAAICI8RAAAICJARAAAICJERAAAICJIRAAAICJMRAAAICJQRAAAICJURAAAICJYRAAAICJcRAAAICJgRAAAICJkRAAAICJoRAAAICJsRAAAICJwRAAAICJ0RAAAICJ4RAAAICJ8RAAAICKARAAAICKERAAAICKIRAAAICKMRAAAICKQRAAAICKURAAAICKYRAAAICKcRAAAICKgRAAAICKkRAAAICKoRAAAICKsRAAAICKwRAAAICK0RAAAICK4RAAAICK8RAAAICLARAAAICLERAAAICLIRAAAICLMRAAAICLQRAAAICLURAAAICLYRAAAICLcRAAAICLgRAAAICLkRAAAICLoRAAAICLsRAAAICLwRAAAICL0RAAAICL4RAAAICL8RAAAICMARAAAICMERAAAICMIRAAAICMMRAAAICMQRAAAICMURAAAICMYRAAAICMcRAAAICMgRAAAICMkRAAAICMoRAAAICMsRAAAICMwRAAAICM0RAAAICM4RAAAICM8RAAAICNARAAAICNERAAAICNIRAAAICNMRAAAICNQRAAAICNURAAAICNYRAAAICNcRAAAICNgRAAAICNkRAAAICNoRAAAICNsRAAAICNwRAAAICN0RAAAICN4RAAAICN8RAAAICOARAAAICOERAAAICOIRAAAICOMRAAAICOQRAAAICOURAAAICOYRAAAICOcRAAAICOgRAAAICOkRAAAICOoRAAAICOsRAAAICOwRAAAICO0RAAAICO4RAAAICO8RAAAICPARAAAICPERAAAICPIRAAAICPMRAAAICPQRAAAICPURAAAICPYRAAAICPcRAAAICPgRAAAICPkRAAAICPoRAAAICPsRAAAICPwRAAAICP0RAAAICP4RAAAICP8RAAAICAASAAAICAESAAAICAISAAAICAMSAAAICAQSAAAICAUSAAAICAYSAAAICAcSAAAICAgSAAAICAkSAAAICAoSAAAICAsSAAAICAwSAAAICA0SAAAICA4SAAAICA8SAAAICBASAAAICBESAAAICBISAAAICBMSAAAICBQSAAAICBUSAAAICBYSAAAICBcSAAAICBgSAAAICBkSAAAICBoSAAAICBsSAAAICBwSAAAICB0SAAAICB4SAAAICB8SAAAICCASAAAICCESAAAICCISAAAICCMSAAAICCQSAAAICCUSAAAICCYSAAAICCcSAAAICCgSAAAICCkSAAAICCoSAAAICCsSAAAICCwSAAAICC0SAAAICC4SAAAICC8SAAAICDASAAAICDESAAAICDISAAAICDMSAAAICDQSAAAICDUSAAAICDYSAAAICDcSAAAICDgSAAAICDkSAAAICDoSAAAICDsSAAAICDwSAAAICD0SAAAICD4SAAAICD8SAAAICEASAAAICEESAAAICEISAAAICEMSAAAICEQSAAAICEUSAAAICEYSAAAICEcSAAAICEgSAAAICEkSAAAICEoSAAAICEsSAAAICEwSAAAICE0SAAAICE4SAAAICE8SAAAICFASAAAICFESAAAICFISAAAICFMSAAAICFQSAAAICFUSAAAICFYSAAAICFcSAAAICFgSAAAICFkSAAAICFoSAAAICFsSAAAICFwSAAAICF0SAAAICF4SAAAICF8SAAAICGASAAAICGESAAAICGISAAAICGMSAAAICGQSAAAICGUSAAAICGYSAAAICGcSAAAICGgSAAAICGkSAAAICGoSAAAICGsSAAAICGwSAAAICG0SAAAICG4SAAAICG8SAAAICHASAAAICHESAAAICHISAAAICHMSAAAICHQSAAAICHUSAAAICHYSAAAICHcSAAAICHgSAAAICHkSAAAICHoSAAAICHsSAAAICHwSAAAICH0SAAAICH4SAAAICH8SAAAICIASAAAICIESAAAICIISAAAICIMSAAAICIQSAAAICIUSAAAICIYSAAAICIcSAAAICIgSAAAICIkSAAAICIoSAAAICIsSAAAICIwSAAAICI0SAAAICI4SAAAICI8SAAAICJASAAAICJESAAAICJISAAAICJMSAAAICJQSAAAICJUSAAAICJYSAAAICJcSAAAICJgSAAAICJkSAAAICJoSAAAICJsSAAAICJwSAAAICJ0SAAAICJ4SAAAICJ8SAAAICKASAAAICKESAAAICKISAAAICKMSAAAICKQSAAAICKUSAAAICKYSAAAICKcSAAAICKgSAAAICKkSAAAICKoSAAAICKsSAAAICKwSAAAICK0SAAAICK4SAAAICK8SAAAICLASAAAICLESAAAICLISAAAICLMSAAAICLQSAAAICLUSAAAICLYSAAAICLcSAAAICLgSAAAICLkSAAAICLoSAAAICLsSAAAICLwSAAAICL0SAAAICL4SAAAICL8SAAAICMASAAAICMESAAAICMISAAAICMMSAAAICMQSAAAICMUSAAAICMYSAAAICMcSAAAICMgSAAAICMkSAAAICMoSAAAICMsSAAAICMwSAAAICM0SAAAICM4SAAAICM8SAAAICNASAAAICNESAAAICNISAAAICNMSAAAICNQSAAAICNUSAAAICNYSAAAICNcSAAAICNgSAAAICNkSAAAICNoSAAAICNsSAAAICNwSAAAICN0SAAAICN4SAAAICN8SAAAICOASAAAICOESAAAICOISAAAICOMSAAAICOQSAAAICOUSAAAICOYSAAAICOcSAAAICOgSAAAICOkSAAAICOoSAAAICOsSAAAICOwSAAAICO0SAAAICO4SAAAICO8SAAAICPASAAAICPESAAAICPISAAAICPMSAAAICPQSAAAICPUSAAAICPYSAAAICPcSAAAICPgSAAAICPkSAAAICPoSAAAICPsSAAAICPwSAAAICP0SAAAICP4SAAAICP8SAAAICAATAAAICAETAAAICAITAAAICAMTAAAICAQTAAAICAUTAAAICAYTAAAICAcTAAAICAgTAAAICAkTAAAICAoTAAAICAsTAAAICAwTAAAICA0TAAAICA4TAAAICA8TAAAICBATAAAICBETAAAICBITAAAICBMTAAAICBQTAAAICBUTAAAICBYTAAAICBcTAAAICBgTAAAICBkTAAAICBoTAAAICBsTAAAICBwTAAAICB0TAAAICB4TAAAICB8TAAAICCATAAAICCETAAAICCITAAAICCMTAAAICCQTAAAICCUTAAAICCYTAAAICCcTAAAICCgTAAAICCkTAAAICCoTAAAICCsTAAAICCwTAAAICC0TAAAICC4TAAAICC8TAAAICDATAAAICDETAAAICDITAAAICDMTAAAICDQTAAAICDUTAAAICDYTAAAICDcTAAAICDgTAAAICDkTAAAICDoTAAAICDsTAAAICDwTAAAICD0TAAAICD4TAAAICD8TAAAICEATAAAICEETAAAICEITAAAICEMTAAAICEQTAAAICEUTAAAICEYTAAAICEcTAAAICEgTAAAICEkTAAAICEoTAAAICEsTAAAICEwTAAAICE0TAAAICE4TAAAICE8TAAAICFATAAAICFETAAAICFITAAAICFMTAAAICFQTAAAICFUTAAAICFYTAAAICFcTAAAICFgTAAAICFkTAAAICFoTAAAICFsTAAAICFwTAAAICF0TAAAICF4TAAAICF8TAAAICGATAAAICGETAAAICGITAAAICGMTAAAICGQTAAAICGUTAAAICGYTAAAICGcTAAAICGgTAAAICGkTAAAICGoTAAAICGsTAAAICGwTAAAICG0TAAAICG4TAAAICG8TAAAICHATAAAICHETAAAICHITAAAICHMTAAAICHQTAAAICHUTAAAICHYTAAAICHcTAAAICHgTAAAICHkTAAAICHoTAAAICHsTAAAICHwTAAAICH0TAAAICH4TAAAICH8TAAAICIATAAAICIETAAAICIITAAAICIMTAAAICIQTAAAICIUTAAAICIYTAAAICIcTAAAICIgTAAAICIkTAAAICIoTAAAICIsTAAAICIwTAAAICI0TAAAICI4TAAAICI8TAAAICJATAAAICJETAAAICJITAAAICJMTAAAICJQTAAAICJUTAAAICJYTAAAICJcTAAAICJgTAAAICJkTAAAICJoTAAAICJsTAAAICJwTAAAICJ0TAAAICJ4TAAAICJ8TAAAICKATAAAICKETAAAICKITAAAICKMTAAAICKQTAAAICKUTAAAICKYTAAAICKcTAAAICKgTAAAICKkTAAAICKoTAAAICKsTAAAICKwTAAAICK0TAAAICK4TAAAICK8TAAAICLATAAAICLETAAAICLITAAAICLMTAAAICLQTAAAICLUTAAAICLYTAAAICLcTAAAICLgTAAAICLkTAAAICLoTAAAICLsTAAAICLwTAAAICL0TAAAICL4TAAAICL8TAAAICMATAAAICMETAAAICMITAAAICMMTAAAICMQTAAAICMUTAAAICMYTAAAICMcTAAAICMgTAAAICMkTAAAICMoTAAAICMsTAAAICMwTAAAICM0TAAAICM4TAAAICM8TAAAICNATAAAICNETAAAICNITAAAICNMTAAAICNQTAAAICNUTAAAICNYTAAAICNcTAAAICNgTAAAICNkTAAAICNoTAAAICNsTAAAICNwTAAAICN0TAAAICN4TAAAICN8TAAAICOATAAAICOETAAAICOITAAAICOMTAAAICOQTAAAICOUTAAAICOYTAAAICOcTAAAICOgTAAAICOkTAAAICOoTAAAICOsTAAAICOwTAAAICO0TAAAICO4TAAAICO8TAAAICPATAAAICPETAAAICPITAAAICPMTAAAICPQTAAAICPUTAAAICPYTAAAICPcTAAAICPgTAAAICPkTAAAICPoTAAAICPsTAAAICPwTAAAICP0TAAAICP4TAAAICP8TAAAICAAUAAAICAEUAAAICAIUAAAICAMUAAAICAQUAAAICAUUAAAICAYUAAAICAcUAAAICAgUAAAICAkUAAAICAoUAAAICAsUAAAICAwUAAAICA0UAAAICA4UAAAICA8UAAAICBAUAAAICBEUAAAICBIUAAAICBMUAAAICBQUAAAICBUUAAAICBYUAAAICBcUAAAICBgUAAAICBkUAAAICBoUAAAICBsUAAAICBwUAAAICB0UAAAICB4UAAAICB8UAAAICCAUAAAICCEUAAAICCIUAAAICCMUAAAICCQUAAAICCUUAAAICCYUAAAICCcUAAAICCgUAAAICCkUAAAICCoUAAAICCsUAAAICCwUAAAICC0UAAAICC4UAAAICC8UAAAICDAUAAAICDEUAAAICDIUAAAICDMUAAAICDQUAAAICDUUAAAICDYUAAAICDcUAAAICDgUAAAICDkUAAAICDoUAAAICDsUAAAICDwUAAAICD0UAAAICD4UAAAICD8UAAAICEAUAAAICEEUAAAICEIUAAAICEMUAAAICEQUAAAICEUUAAAICEYUAAAICEcUAAAICEgUAAAICEkUAAAICEoUAAAICEsUAAAICEwUAAAICE0UAAAICE4UAAAICE8UAAAICFAUAAAICFEUAAAICFIUAAAICFMUAAAICFQUAAAICFUUAAAICFYUAAAICFcUAAAICFgUAAAICFkUAAAICFoUAAAICFsUAAAICFwUAAAICF0UAAAICF4UAAAICF8UAAAICGAUAAAICGEUAAAICGIUAAAICGMUAAAICGQUAAAICGUUAAAICGYUAAAICGcUAAAICGgUAAAICGkUAAAICGoUAAAICGsUAAAICGwUAAAICG0UAAAICG4UAAAICG8UAAAICHAUAAAICHEUAAAICHIUAAAICHMUAAAICHQUAAAICHUUAAAICHYUAAAICHcUAAAICHgUAAAICHkUAAAICHoUAAAICHsUAAAICHwUAAAICH0UAAAICH4UAAAICH8UAAAICIAUAAAICIEUAAAICIIUAAAICIMUAAAICIQUAAAICIUUAAAICIYUAAAICIcUAAAICIgUAAAICIkUAAAICIoUAAAICIsUAAAICIwUAAAICI0UAAAICI4UAAAICI8UAAAICJAUAAAICJEUAAAICJIUAAAICJMUAAAICJQUAAAICJUUAAAICJYUAAAICJcUAAAICJgUAAAICJkUAAAICJoUAAAICJsUAAAICJwUAAAICJ0UAAAICJ4UAAAICJ8UAAAICKAUAAAICKEUAAAICKIUAAAICKMUAAAICKQUAAAICKUUAAAICKYUAAAICKcUAAAICKgUAAAICKkUAAAICKoUAAAICKsUAAAICKwUAAAICK0UAAAICK4UAAAICK8UAAAICLAUAAAICLEUAAAICLIUAAAICLMUAAAICLQUAAAICLUUAAAICLYUAAAICLcUAAAICLgUAAAICLkUAAAICLoUAAAICLsUAAAICLwUAAAICL0UAAAICL4UAAAICL8UAAAICMAUAAAICMEUAAAICMIUAAAICMMUAAAICMQUAAAICMUUAAAICMYUAAAICMcUAAAICMgUAAAICMkUAAAICMoUAAAICMsUAAAICMwUAAAICM0UAAAICM4UAAAICM8UAAAICNAUAAAICNEUAAAICNIUAAAICNMUAAAICNQUAAAICNUUAAAICNYUAAAICNcUAAAICNgUAAAICNkUAAAICNoUAAAICNsUAAAICNwUAAAICN0UAAAICN4UAAAICN8UAAAICOAUAAAICOEUAAAICOIUAAAICOMUAAAICOQUAAAICOUUAAAICOYUAAAICOcUAAAICOgUAAAICOkUAAAICOoUAAAICOsUAAAICOwUAAAICO0UAAAICO4UAAAICO8UAAAICPAUAAAICPEUAAAICPIUAAAICPMUAAAICPQUAAAICPUUAAAICPYUAAAICPcUAAAICPgUAAAICPkUAAAICPoUAAAICPsUAAAICPwUAAAICP0UAAAICP4UAAAICP8UAAAICAAVAAAICAEVAAAICAIVAAAICAMVAAAICAQVAAAICAUVAAAICAYVAAAICAcVAAAICAgVAAAICAkVAAAICAoVAAAICAsVAAAICAwVAAAICA0VAAAICA4VAAAICA8VAAAICBAVAAAICBEVAAAICBIVAAAICBMVAAAICBQVAAAICBUVAAAICBYVAAAICBcVAAAICBgVAAAICBkVAAAICBoVAAAICBsVAAAICBwVAAAICB0VAAAICB4VAAAICB8VAAAICCAVAAAICCEVAAAICCIVAAAICCMVAAAICCQVAAAICCUVAAAICCYVAAAICCcVAAAICCgVAAAICCkVAAAICCoVAAAICCsVAAAICCwVAAAICC0VAAAICC4VAAAICC8VAAAICDAVAAAICDEVAAAICDIVAAAICDMVAAAICDQVAAAICDUVAAAICDYVAAAICDcVAAAICDgVAAAICDkVAAAICDoVAAAICDsVAAAICDwVAAAICD0VAAAICD4VAAAICD8VAAAICEAVAAAICEEVAAAICEIVAAAICEMVAAAICEQVAAAICEUVAAAICEYVAAAICEcVAAAICEgVAAAICEkVAAAICEoVAAAICEsVAAAICEwVAAAICE0VAAAICE4VAAAICE8VAAAICFAVAAAICFEVAAAICFIVAAAICFMVAAAICFQVAAAICFUVAAAICFYVAAAICFcVAAAICFgVAAAICFkVAAAICFoVAAAICFsVAAAICFwVAAAICF0VAAAICF4VAAAICF8VAAAICGAVAAAICGEVAAAICGIVAAAICGMVAAAICGQVAAAICGUVAAAICGYVAAAICGcVAAAICGgVAAAICGkVAAAICGoVAAAICGsVAAAICGwVAAAICG0VAAAICG4VAAAICG8VAAAICHAVAAAICHEVAAAICHIVAAAICHMVAAAICHQVAAAICHUVAAAICHYVAAAICHcVAAAICHgVAAAICHkVAAAICHoVAAAICHsVAAAICHwVAAAICH0VAAAICH4VAAAICH8VAAAICIAVAAAICIEVAAAICIIVAAAICIMVAAAICIQVAAAICIUVAAAICIYVAAAICIcVAAAICIgVAAAICIkVAAAICIoVAAAICIsVAAAICIwVAAAICI0VAAAICI4VAAAICI8VAAAICJAVAAAICJEVAAAICJIVAAAICJMVAAAICJQVAAAICJUVAAAICJYVAAAICJcVAAAICJgVAAAICJkVAAAICJoVAAAICJsVAAAICJwVAAAICJ0VAAAICJ4VAAAICJ8VAAAICKAVAAAICKEVAAAICKIVAAAICKMVAAAICKQVAAAICKUVAAAICKYVAAAICKcVAAAICKgVAAAICKkVAAAICKoVAAAICKsVAAAICKwVAAAICK0VAAAICK4VAAAICK8VAAAICLAVAAAICLEVAAAICLIVAAAICLMVAAAICLQVAAAICLUVAAAICLYVAAAICLcVAAAICLgVAAAICLkVAAAICLoVAAAICLsVAAAICLwVAAAICL0VAAAICL4VAAAICL8VAAAICMAVAAAICMEVAAAICMIVAAAICMMVAAAICMQVAAAICMUVAAAICMYVAAAICMcVAAAICMgVAAAICMkVAAAICMoVAAAICMsVAAAICMwVAAAICM0VAAAICM4VAAAICM8VAAAICNAVAAAICNEVAAAICNIVAAAICNMVAAAICNQVAAAICNUVAAAICNYVAAAICNcVAAAICNgVAAAICNkVAAAICNoVAAAICNsVAAAICNwVAAAICN0VAAAICN4VAAAICN8VAAAICOAVAAAICOEVAAAICOIVAAAICOMVAAAICOQVAAAICOUVAAAICOYVAAAICOcVAAAICOgVAAAICOkVAAAICOoVAAAICOsVAAAICOwVAAAICO0VAAAICO4VAAAICO8VAAAICPAVAAAICPEVAAAICPIVAAAICPMVAAAICPQVAAAICPUVAAAICPYVAAAICPcVAAAICPgVAAAICPkVAAAICPoVAAAICPsVAAAICPwVAAAICP0VAAAICP4VAAAICP8VAAAICAAWAAAICAEWAAAICAIWAAAICAMWAAAICAQWAAAICAUWAAAICAYWAAAICAcWAAAICAgWAAAICAkWAAAICAoWAAAICAsWAAAICAwWAAAICA0WAAAICA4WAAAICA8WAAAICBAWAAAICBEWAAAICBIWAAAICBMWAAAICBQWAAAICBUWAAAICBYWAAAICBcWAAAICBgWAAAICBkWAAAICBoWAAAICBsWAAAICBwWAAAICB0WAAAICB4WAAAICB8WAAAICCAWAAAICCEWAAAICCIWAAAICCMWAAAICCQWAAAICCUWAAAICCYWAAAICCcWAAAICCgWAAAICCkWAAAICCoWAAAICCsWAAAICCwWAAAICC0WAAAICC4WAAAICC8WAAAICDAWAAAICDEWAAAICDIWAAAICDMWAAAICDQWAAAICDUWAAAICDYWAAAICDcWAAAICDgWAAAICDkWAAAICDoWAAAICDsWAAAICDwWAAAICD0WAAAICD4WAAAICD8WAAAICEAWAAAICEEWAAAICEIWAAAICEMWAAAICEQWAAAICEUWAAAICEYWAAAICEcWAAAICEgWAAAICEkWAAAICEoWAAAICEsWAAAICEwWAAAICE0WAAAICE4WAAAICE8WAAAICFAWAAAICFEWAAAICFIWAAAICFMWAAAICFQWAAAICFUWAAAICFYWAAAICFcWAAAICFgWAAAICFkWAAAICFoWAAAICFsWAAAICFwWAAAICF0WAAAICF4WAAAICF8WAAAICGAWAAAICGEWAAAICGIWAAAICGMWAAAICGQWAAAICGUWAAAICGYWAAAICGcWAAAICGgWAAAICGkWAAAICGoWAAAICGsWAAAICGwWAAAICG0WAAAICG4WAAAICG8WAAAICHAWAAAICHEWAAAICHIWAAAICHMWAAAICHQWAAAICHUWAAAICHYWAAAICHcWAAAICHgWAAAICHkWAAAICHoWAAAICHsWAAAICHwWAAAICH0WAAAICH4WAAAICH8WAAAICIAWAAAICIEWAAAICIIWAAAICIMWAAAICIQWAAAICIUWAAAICIYWAAAICIcWAAAICIgWAAAICIkWAAAICIoWAAAICIsWAAAICIwWAAAICI0WAAAICI4WAAAICI8WAAAICJAWAAAICJEWAAAICJIWAAAICJMWAAAICJQWAAAICJUWAAAICJYWAAAICJcWAAAICJgWAAAICJkWAAAICJoWAAAICJsWAAAICJwWAAAICJ0WAAAICJ4WAAAICJ8WAAAICKAWAAAICKEWAAAICKIWAAAICKMWAAAICKQWAAAICKUWAAAICKYWAAAICKcWAAAICKgWAAAICKkWAAAICKoWAAAICKsWAAAICKwWAAAICK0WAAAICK4WAAAICK8WAAAICLAWAAAICLEWAAAICLIWAAAICLMWAAAICLQWAAAICLUWAAAICLYWAAAICLcWAAAICLgWAAAICLkWAAAICLoWAAAICLsWAAAICLwWAAAICL0WAAAICL4WAAAICL8WAAAICMAWAAAICMEWAAAICMIWAAAICMMWAAAICMQWAAAICMUWAAAICMYWAAAICMcWAAAICMgWAAAICMkWAAAICMoWAAAICMsWAAAICMwWAAAICM0WAAAICM4WAAAICM8WAAAICNAWAAAICNEWAAAICNIWAAAICNMWAAAICNQWAAAICNUWAAAICNYWAAAICNcWAAAICNgWAAAICNkWAAAICNoWAAAICNsWAAAICNwWAAAICN0WAAAICN4WAAAICN8WAAAICOAWAAAICOEWAAAICOIWAAAICOMWAAAICOQWAAAICOUWAAAICOYWAAAICOcWAAAICOgWAAAICOkWAAAICOoWAAAICOsWAAAICOwWAAAICO0WAAAICO4WAAAICO8WAAAICPAWAAAICPEWAAAICPIWAAAICPMWAAAICPQWAAAICPUWAAAICPYWAAAICPcWAAAICPgWAAAICPkWAAAICPoWAAAICPsWAAAICPwWAAAICP0WAAAICP4WAAAICP8WAAAICAAXAAAICAEXAAAICAIXAAAICAMXAAAICAQXAAAICAUXAAAICAYXAAAICAcXAAAICAgXAAAICAkXAAAICAoXAAAICAsXAAAICAwXAAAICA0XAAAICA4XAAAICA8XAAAICBAXAAAICBEXAAAICBIXAAAICBMXAAAICBQXAAAICBUXAAAICBYXAAAICBcXAAAICBgXAAAICBkXAAAICBoXAAAICBsXAAAICBwXAAAICB0XAAAICB4XAAAICB8XAAAICCAXAAAICCEXAAAICCIXAAAICCMXAAAICCQXAAAICCUXAAAICCYXAAAICCcXAAAICCgXAAAICCkXAAAICCoXAAAICCsXAAAICCwXAAAICC0XAAAICC4XAAAICC8XAAAICDAXAAAICDEXAAAICDIXAAAICDMXAAAICDQXAAAICDUXAAAICDYXAAAICDcXAAAICDgXAAAICDkXAAAICDoXAAAICDsXAAAICDwXAAAICD0XAAAICD4XAAAICD8XAAAICEAXAAAICEEXAAAICEIXAAAICEMXAAAICEQXAAAICEUXAAAICEYXAAAICEcXAAAICEgXAAAICEkXAAAICEoXAAAICEsXAAAICEwXAAAICE0XAAAICE4XAAAICE8XAAAICFAXAAAICFEXAAAICFIXAAAICFMXAAAICFQXAAAICFUXAAAICFYXAAAICFcXAAAICFgXAAAICFkXAAAICFoXAAAICFsXAAAICFwXAAAICF0XAAAICF4XAAAICF8XAAAICGAXAAAICGEXAAAICGIXAAAICGMXAAAICGQXAAAICGUXAAAICGYXAAAICGcXAAAICGgXAAAICGkXAAAICGoXAAAICGsXAAAICGwXAAAICG0XAAAICG4XAAAICG8XAAAICHAXAAAICHEXAAAICHIXAAAICHMXAAAICHQXAAAICHUXAAAICHYXAAAICHcXAAAICHgXAAAICHkXAAAICHoXAAAICHsXAAAICHwXAAAICH0XAAAICH4XAAAICH8XAAAICIAXAAAICIEXAAAICIIXAAAICIMXAAAICIQXAAAICIUXAAAICIYXAAAICIcXAAAICIgXAAAICIkXAAAICIoXAAAICIsXAAAICIwXAAAICI0XAAAICI4XAAAICI8XAAAICJAXAAAICJEXAAAICJIXAAAICJMXAAAICJQXAAAICJUXAAAICJYXAAAICJcXAAAICJgXAAAICJkXAAAICJoXAAAICJsXAAAICJwXAAAICJ0XAAAICJ4XAAAICJ8XAAAICKAXAAAICKEXAAAICKIXAAAICKMXAAAICKQXAAAICKUXAAAICKYXAAAICKcXAAAICKgXAAAICKkXAAAICKoXAAAICKsXAAAICKwXAAAICK0XAAAICK4XAAAICK8XAAAICLAXAAAICLEXAAAICLIXAAAICLMXAAAICLQXAAAICLUXAAAICLYXAAAICLcXAAAICLgXAAAICLkXAAAICLoXAAAICLsXAAAICLwXAAAICL0XAAAICL4XAAAICL8XAAAICMAXAAAICMEXAAAICMIXAAAICMMXAAAICMQXAAAICMUXAAAICMYXAAAICMcXAAAICMgXAAAICMkXAAAICMoXAAAICMsXAAAICMwXAAAICM0XAAAICM4XAAAICM8XAAAICNAXAAAICNEXAAAICNIXAAAICNMXAAAICNQXAAAICNUXAAAICNYXAAAICNcXAAAICNgXAAAICNkXAAAICNoXAAAICNsXAAAICNwXAAAICN0XAAAICN4XAAAICN8XAAAICOAXAAAICOEXAAAICOIXAAAICOMXAAAICOQXAAAICOUXAAAICOYXAAAICOcXAAAICOgXAAAICOkXAAAICOoXAAAICOsXAAAICOwXAAAICO0XAAAICO4XAAAICO8XAAAICPAXAAAICPEXAAAICPIXAAAICPMXAAAICPQXAAAICPUXAAAICPYXAAAICPcXAAAICPgXAAAICPkXAAAICPoXAAAICPsXAAAICPwXAAAICP0XAAAICP4XAAAICP8XAAAICAAYAAAICAEYAAAICAIYAAAICAMYAAAICAQYAAAICAUYAAAICAYYAAAICAcYAAAICAgYAAAICAkYAAAICAoYAAAICAsYAAAICAwYAAAICA0YAAAICA4YAAAICA8YAAAICBAYAAAICBEYAAAICBIYAAAICBMYAAAICBQYAAAICBUYAAAICBYYAAAICBcYAAAICBgYAAAICBkYAAAICBoYAAAICBsYAAAICBwYAAAICB0YAAAICB4YAAAICB8YAAAICCAYAAAICCEYAAAICCIYAAAICCMYAAAICCQYAAAICCUYAAAICCYYAAAICCcYAAAICCgYAAAICCkYAAAICCoYAAAICCsYAAAICCwYAAAICC0YAAAICC4YAAAICC8YAAAICDAYAAAICDEYAAAICDIYAAAICDMYAAAICDQYAAAICDUYAAAICDYYAAAICDcYAAAICDgYAAAICDkYAAAICDoYAAAICDsYAAAICDwYAAAICD0YAAAICD4YAAAICD8YAAAICEAYAAAICEEYAAAICEIYAAAICEMYAAAICEQYAAAICEUYAAAICEYYAAAICEcYAAAICEgYAAAICEkYAAAICEoYAAAICEsYAAAICEwYAAAICE0YAAAICE4YAAAICE8YAAAICFAYAAAICFEYAAAICFIYAAAICFMYAAAICFQYAAAICFUYAAAICFYYAAAICFcYAAAICFgYAAAICFkYAAAICFoYAAAICFsYAAAICFwYAAAICF0YAAAICF4YAAAICF8YAAAICGAYAAAICGEYAAAICGIYAAAICGMYAAAICGQYAAAICGUYAAAICGYYAAAICGcYAAAICGgYAAAICGkYAAAICGoYAAAICGsYAAAICGwYAAAICG0YAAAICG4YAAAICG8YAAAICHAYAAAICHEYAAAICHIYAAAICHMYAAAICHQYAAAICHUYAAAICHYYAAAICHcYAAAICHgYAAAICHkYAAAICHoYAAAICHsYAAAICHwYAAAICH0YAAAICH4YAAAICH8YAAAICIAYAAAICIEYAAAICIIYAAAICIMYAAAICIQYAAAICIUYAAAICIYYAAAICIcYAAAICIgYAAAICIkYAAAICIoYAAAICIsYAAAICIwYAAAICI0YAAAICI4YAAAICI8YAAAICJAYAAAICJEYAAAICJIYAAAICJMYAAAICJQYAAAICJUYAAAICJYYAAAICJcYAAAICJgYAAAICJkYAAAICJoYAAAICJsYAAAICJwYAAAICJ0YAAAICJ4YAAAICJ8YAAAICKAYAAAICKEYAAAICKIYAAAICKMYAAAICKQYAAAICKUYAAAICKYYAAAICKcYAAAICKgYAAAICKkYAAAICKoYAAAICKsYAAAICKwYAAAICK0YAAAICK4YAAAICK8YAAAICLAYAAAICLEYAAAICLIYAAAICLMYAAAICLQYAAAICLUYAAAICLYYAAAICLcYAAAICLgYAAAICLkYAAAICLoYAAAICLsYAAAICLwYAAAICL0YAAAICL4YAAAICL8YAAAICMAYAAAICMEYAAAICMIYAAAICMMYAAAICMQYAAAICMUYAAAICMYYAAAICMcYAAAICMgYAAAICMkYAAAICMoYAAAICMsYAAAICMwYAAAICM0YAAAICM4YAAAICM8YAAAICNAYAAAICNEYAAAICNIYAAAICNMYAAAICNQYAAAICNUYAAAICNYYAAAICNcYAAAICNgYAAAICNkYAAAICNoYAAAICNsYAAAICNwYAAAICN0YAAAICN4YAAAICN8YAAAICOAYAAAICOEYAAAICOIYAAAICOMYAAAICOQYAAAICOUYAAAICOYYAAAICOcYAAAICOgYAAAICOkYAAAICOoYAAAICOsYAAAICOwYAAAICO0YAAAICO4YAAAICO8YAAAICPAYAAAICPEYAAAICPIYAAAICPMYAAAICPQYAAAICPUYAAAICPYYAAAICPcYAAAICPgYAAAICPkYAAAICPoYAAAICPsYAAAICPwYAAAICP0YAAAICP4YAAAICP8YAAAICAAZAAAICAEZAAAICAIZAAAICAMZAAAICAQZAAAICAUZAAAICAYZAAAICAcZAAAICAgZAAAICAkZAAAICAoZAAAICAsZAAAICAwZAAAICA0ZAAAICA4ZAAAICA8ZAAAICBAZAAAICBEZAAAICBIZAAAICBMZAAAICBQZAAAICBUZAAAICBYZAAAICBcZAAAICBgZAAAICBkZAAAICBoZAAAICBsZAAAICBwZAAAICB0ZAAAICB4ZAAAICB8ZAAAICCAZAAAICCEZAAAICCIZAAAICCMZAAAICCQZAAAICCUZAAAICCYZAAAICCcZAAAICCgZAAAICCkZAAAICCoZAAAICCsZAAAICCwZAAAICC0ZAAAICC4ZAAAICC8ZAAAICDAZAAAICDEZAAAICDIZAAAICDMZAAAICDQZAAAICDUZAAAICDYZAAAICDcZAAAICDgZAAAICDkZAAAICDoZAAAICDsZAAAICDwZAAAICD0ZAAAICD4ZAAAICD8ZAAAICEAZAAAICEEZAAAICEIZAAAICEMZAAAICEQZAAAICEUZAAAICEYZAAAICEcZAAAICEgZAAAICEkZAAAICEoZAAAICEsZAAAICEwZAAAICE0ZAAAICE4ZAAAICE8ZAAAICFAZAAAICFEZAAAICFIZAAAICFMZAAAICFQZAAAICFUZAAAICFYZAAAICFcZAAAICFgZAAAICFkZAAAICFoZAAAICFsZAAAICFwZAAAICF0ZAAAICF4ZAAAICF8ZAAAICGAZAAAICGEZAAAICGIZAAAICGMZAAAICGQZAAAICGUZAAAICGYZAAAICGcZAAAICGgZAAAICGkZAAAICGoZAAAICGsZAAAICGwZAAAICG0ZAAAICG4ZAAAICG8ZAAAICHAZAAAICHEZAAAICHIZAAAICHMZAAAICHQZAAAICHUZAAAICHYZAAAICHcZAAAICHgZAAAICHkZAAAICHoZAAAICHsZAAAICHwZAAAICH0ZAAAICH4ZAAAICH8ZAAAICIAZAAAICIEZAAAICIIZAAAICIMZAAAICIQZAAAICIUZAAAICIYZAAAICIcZAAAICIgZAAAICIkZAAAICIoZAAAICIsZAAAICIwZAAAICI0ZAAAICI4ZAAAICI8ZAAAICJAZAAAICJEZAAAICJIZAAAICJMZAAAICJQZAAAICJUZAAAICJYZAAAICJcZAAAICJgZAAAICJkZAAAICJoZAAAICJsZAAAICJwZAAAICJ0ZAAAICJ4ZAAAICJ8ZAAAICKAZAAAICKEZAAAICKIZAAAICKMZAAAICKQZAAAICKUZAAAICKYZAAAICKcZAAAICKgZAAAICKkZAAAICKoZAAAICKsZAAAICKwZAAAICK0ZAAAICK4ZAAAICK8ZAAAICLAZAAAICLEZAAAICLIZAAAICLMZAAAICLQZAAAICLUZAAAICLYZAAAICLcZAAAICLgZAAAICLkZAAAICLoZAAAICLsZAAAICLwZAAAICL0ZAAAICL4ZAAAICL8ZAAAICMAZAAAICMEZAAAICMIZAAAICMMZAAAICMQZAAAICMUZAAAICMYZAAAICMcZAAAICMgZAAAICMkZAAAICMoZAAAICMsZAAAICMwZAAAICM0ZAAAICM4ZAAAICM8ZAAAICNAZAAAICNEZAAAICNIZAAAICNMZAAAICNQZAAAICNUZAAAICNYZAAAICNcZAAAICNgZAAAICNkZAAAICNoZAAAICNsZAAAICNwZAAAICN0ZAAAICN4ZAAAICN8ZAAAICOAZAAAICOEZAAAICOIZAAAICOMZAAAICOQZAAAICOUZAAAICOYZAAAICOcZAAAICOgZAAAICOkZAAAICOoZAAAICOsZAAAICOwZAAAICO0ZAAAICO4ZAAAICO8ZAAAICPAZAAAICPEZAAAICPIZAAAICPMZAAAICPQZAAAICPUZAAAICPYZAAAICPcZAAAICPgZAAAICPkZAAAICPoZAAAICPsZAAAICPwZAAAICP0ZAAAICP4ZAAAICP8ZAAAICAAaAAAICAEaAAAICAIaAAAICAMaAAAICAQaAAAICAUaAAAICAYaAAAICAcaAAAICAgaAAAICAkaAAAICAoaAAAICAsaAAAICAwaAAAICA0aAAAICA4aAAAICA8aAAAICBAaAAAICBEaAAAICBIaAAAICBMaAAAICBQaAAAICBUaAAAICBYaAAAICBcaAAAICBgaAAAICBkaAAAICBoaAAAICBsaAAAICBwaAAAICB0aAAAICB4aAAAICB8aAAAICCAaAAAICCEaAAAICCIaAAAICCMaAAAICCQaAAAICCUaAAAICCYaAAAICCcaAAAICCgaAAAICCkaAAAICCoaAAAICCsaAAAICCwaAAAICC0aAAAICC4aAAAICC8aAAAICDAaAAAICDEaAAAICDIaAAAICDMaAAAICDQaAAAICDUaAAAICDYaAAAICDcaAAAICDgaAAAICDkaAAAICDoaAAAICDsaAAAICDwaAAAICD0aAAAICD4aAAAICD8aAAAICEAaAAAICEEaAAAICEIaAAAICEMaAAAICEQaAAAICEUaAAAICEYaAAAICEcaAAAICEgaAAAICEkaAAAICEoaAAAICEsaAAAICEwaAAAICE0aAAAICE4aAAAICE8aAAAICFAaAAAICFEaAAAICFIaAAAICFMaAAAICFQaAAAICFUaAAAICFYaAAAICFcaAAAICFgaAAAICFkaAAAICFoaAAAICFsaAAAICFwaAAAICF0aAAAICF4aAAAICF8aAAAICGAaAAAICGEaAAAICGIaAAAICGMaAAAICGQaAAAICGUaAAAICGYaAAAICGcaAAAICGgaAAAICGkaAAAICGoaAAAICGsaAAAICGwaAAAICG0aAAAICG4aAAAICG8aAAAICHAaAAAICHEaAAAICHIaAAAICHMaAAAICHQaAAAICHUaAAAICHYaAAAICHcaAAAICHgaAAAICHkaAAAICHoaAAAICHsaAAAICHwaAAAICH0aAAAICH4aAAAICH8aAAAICIAaAAAICIEaAAAICIIaAAAICIMaAAAICIQaAAAICIUaAAAICIYaAAAICIcaAAAICIgaAAAICIkaAAAICIoaAAAICIsaAAAICIwaAAAICI0aAAAICI4aAAAICI8aAAAICJAaAAAICJEaAAAICJIaAAAICJMaAAAICJQaAAAICJUaAAAICJYaAAAICJcaAAAICJgaAAAICJkaAAAICJoaAAAICJsaAAAICJwaAAAICJ0aAAAICJ4aAAAICJ8aAAAICKAaAAAICKEaAAAICKIaAAAICKMaAAAICKQaAAAICKUaAAAICKYaAAAICKcaAAAICKgaAAAICKkaAAAICKoaAAAICKsaAAAICKwaAAAICK0aAAAICK4aAAAICK8aAAAICLAaAAAICLEaAAAICLIaAAAICLMaAAAICLQaAAAICLUaAAAICLYaAAAICLcaAAAICLgaAAAICLkaAAAICLoaAAAICLsaAAAICLwaAAAICL0aAAAICL4aAAAICL8aAAAICMAaAAAICMEaAAAICMIaAAAICMMaAAAICMQaAAAICMUaAAAICMYaAAAICMcaAAAICMgaAAAICMkaAAAICMoaAAAICMsaAAAICMwaAAAICM0aAAAICM4aAAAICM8aAAAICNAaAAAICNEaAAAICNIaAAAICNMaAAAICNQaAAAICNUaAAAICNYaAAAICNcaAAAICNgaAAAICNkaAAAICNoaAAAICNsaAAAICNwaAAAICN0aAAAICN4aAAAICN8aAAAICOAaAAAICOEaAAAICOIaAAAICOMaAAAICOQaAAAICOUaAAAICOYaAAAICOcaAAAICOgaAAAICOkaAAAICOoaAAAICOsaAAAICOwaAAAICO0aAAAICO4aAAAICO8aAAAICPAaAAAICPEaAAAICPIaAAAICPMaAAAICPQaAAAICPUaAAAICPYaAAAICPcaAAAICPgaAAAICPkaAAAICPoaAAAICPsaAAAICPwaAAAICP0aAAAICP4aAAAICP8aAAAICAAbAAAICAEbAAAICAIbAAAICAMbAAAICAQbAAAICAUbAAAICAYbAAAICAcbAAAICAgbAAAICAkbAAAICAobAAAICAsbAAAICAwbAAAICA0bAAAICA4bAAAICA8bAAAICBAbAAAICBEbAAAICBIbAAAICBMbAAAICBQbAAAICBUbAAAICBYbAAAICBcbAAAICBgbAAAICBkbAAAICBobAAAICBsbAAAICBwbAAAICB0bAAAICB4bAAAICB8bAAAICCAbAAAICCEbAAAICCIbAAAICCMbAAAICCQbAAAICCUbAAAICCYbAAAICCcbAAAICCgbAAAICCkbAAAICCobAAAICCsbAAAICCwbAAAICC0bAAAICC4bAAAICC8bAAAICDAbAAAICDEbAAAICDIbAAAICDMbAAAICDQbAAAICDUbAAAICDYbAAAICDcbAAAICDgbAAAICDkbAAAICDobAAAICDsbAAAICDwbAAAICD0bAAAICD4bAAAICD8bAAAICEAbAAAICEEbAAAICEIbAAAICEMbAAAICEQbAAAICEUbAAAICEYbAAAICEcbAAAICEgbAAAICEkbAAAICEobAAAICEsbAAAICEwbAAAICE0bAAAICE4bAAAICE8bAAAICFAbAAAICFEbAAAICFIbAAAICFMbAAAICFQbAAAICFUbAAAICFYbAAAICFcbAAAICFgbAAAICFkbAAAICFobAAAICFsbAAAICFwbAAAICF0bAAAICF4bAAAICF8bAAAICGAbAAAICGEbAAAICGIbAAAICGMbAAAICGQbAAAICGUbAAAICGYbAAAICGcbAAAICGgbAAAICGkbAAAICGobAAAICGsbAAAICGwbAAAICG0bAAAICG4bAAAICG8bAAAICHAbAAAICHEbAAAICHIbAAAICHMbAAAICHQbAAAICHUbAAAICHYbAAAICHcbAAAICHgbAAAICHkbAAAICHobAAAICHsbAAAICHwbAAAICH0bAAAICH4bAAAICH8bAAAICIAbAAAICIEbAAAICIIbAAAICIMbAAAICIQbAAAICIUbAAAICIYbAAAICIcbAAAICIgbAAAICIkbAAAICIobAAAICIsbAAAICIwbAAAICI0bAAAICI4bAAAICI8bAAAICJAbAAAICJEbAAAICJIbAAAICJMbAAAICJQbAAAICJUbAAAICJYbAAAICJcbAAAICJgbAAAICJkbAAAICJobAAAICJsbAAAICJwbAAAICJ0bAAAICJ4bAAAICJ8bAAAICKAbAAAICKEbAAAICKIbAAAICKMbAAAICKQbAAAICKUbAAAICKYbAAAICKcbAAAICKgbAAAICKkbAAAICKobAAAICKsbAAAICKwbAAAICK0bAAAICK4bAAAICK8bAAAICLAbAAAICLEbAAAICLIbAAAICLMbAAAICLQbAAAICLUbAAAICLYbAAAICLcbAAAICLgbAAAICLkbAAAICLobAAAICLsbAAAICLwbAAAICL0bAAAICL4bAAAICL8bAAAICMAbAAAICMEbAAAICMIbAAAICMMbAAAICMQbAAAICMUbAAAICMYbAAAICMcbAAAICMgbAAAICMkbAAAICMobAAAICMsbAAAICMwbAAAICM0bAAAICM4bAAAICM8bAAAICNAbAAAICNEbAAAICNIbAAAICNMbAAAICNQbAAAICNUbAAAICNYbAAAICNcbAAAICNgbAAAICNkbAAAICNobAAAICNsbAAAICNwbAAAICN0bAAAICN4bAAAICN8bAAAICOAbAAAICOEbAAAICOIbAAAICOMbAAAICOQbAAAICOUbAAAICOYbAAAICOcbAAAICOgbAAAICOkbAAAICOobAAAICOsbAAAICOwbAAAICO0bAAAICO4bAAAICO8bAAAICPAbAAAICPEbAAAICPIbAAAICPMbAAAICPQbAAAICPUbAAAICPYbAAAICPcbAAAICPgbAAAICPkbAAAICPobAAAICPsbAAAICPwbAAAICP0bAAAICP4bAAAICP8bAAAICAAcAAAICAEcAAAICAIcAAAICAMcAAAICAQcAAAICAUcAAAICAYcAAAICAccAAAICAgcAAAICAkcAAAICAocAAAICAscAAAICAwcAAAICA0cAAAICA4cAAAICA8cAAAICBAcAAAICBEcAAAICBIcAAAICBMcAAAICBQcAAAICBUcAAAICBYcAAAICBccAAAICBgcAAAICBkcAAAICBocAAAICBscAAAICBwcAAAICB0cAAAICB4cAAAICB8cAAAICCAcAAAICCEcAAAICCIcAAAICCMcAAAICCQcAAAICCUcAAAICCYcAAAICCccAAAICCgcAAAICCkcAAAICCocAAAICCscAAAICCwcAAAICC0cAAAICC4cAAAICC8cAAAICDAcAAAICDEcAAAICDIcAAAICDMcAAAICDQcAAAICDUcAAAICDYcAAAICDccAAAICDgcAAAICDkcAAAICDocAAAICDscAAAICDwcAAAICD0cAAAICD4cAAAICD8cAAAICEAcAAAICEEcAAAICEIcAAAICEMcAAAICEQcAAAICEUcAAAICEYcAAAICEccAAAICEgcAAAICEkcAAAICEocAAAICEscAAAICEwcAAAICE0cAAAICE4cAAAICE8cAAAICFAcAAAICFEcAAAICFIcAAAICFMcAAAICFQcAAAICFUcAAAICFYcAAAICFccAAAICFgcAAAICFkcAAAICFocAAAICFscAAAICFwcAAAICF0cAAAICF4cAAAICF8cAAAICGAcAAAICGEcAAAICGIcAAAICGMcAAAICGQcAAAICGUcAAAICGYcAAAICGccAAAICGgcAAAICGkcAAAICGocAAAICGscAAAICGwcAAAICG0cAAAICG4cAAAICG8cAAAICHAcAAAICHEcAAAICHIcAAAICHMcAAAICHQcAAAICHUcAAAICHYcAAAICHccAAAICHgcAAAICHkcAAAICHocAAAICHscAAAICHwcAAAICH0cAAAICH4cAAAICH8cAAAICIAcAAAICIEcAAAICIIcAAAICIMcAAAICIQcAAAICIUcAAAICIYcAAAICIccAAAICIgcAAAICIkcAAAICIocAAAICIscAAAICIwcAAAICI0cAAAICI4cAAAICI8cAAAICJAcAAAICJEcAAAICJIcAAAICJMcAAAICJQcAAAICJUcAAAICJYcAAAICJccAAAICJgcAAAICJkcAAAICJocAAAICJscAAAICJwcAAAICJ0cAAAICJ4cAAAICJ8cAAAICKAcAAAICKEcAAAICKIcAAAICKMcAAAICKQcAAAICKUcAAAICKYcAAAICKccAAAICKgcAAAICKkcAAAICKocAAAICKscAAAICKwcAAAICK0cAAAICK4cAAAICK8cAAAICLAcAAAICLEcAAAICLIcAAAICLMcAAAICLQcAAAICLUcAAAICLYcAAAICLccAAAICLgcAAAICLkcAAAICLocAAAICLscAAAICLwcAAAICL0cAAAICL4cAAAICL8cAAAICMAcAAAICMEcAAAICMIcAAAICMMcAAAICMQcAAAICMUcAAAICMYcAAAICMccAAAICMgcAAAICMkcAAAICMocAAAICMscAAAICMwcAAAICM0cAAAICM4cAAAICM8cAAAICNAcAAAICNEcAAAICNIcAAAICNMcAAAICNQcAAAICNUcAAAICNYcAAAICNccAAAICNgcAAAICNkcAAAICNocAAAICNscAAAICNwcAAAICN0cAAAICN4cAAAICN8cAAAICOAcAAAICOEcAAAICOIcAAAICOMcAAAICOQcAAAICOUcAAAICOYcAAAICOccAAAICOgcAAAICOkcAAAICOocAAAICOscAAAICOwcAAAICO0cAAAICO4cAAAICO8cAAAICPAcAAAICPEcAAAICPIcAAAICPMcAAAICPQcAAAICPUcAAAICPYcAAAICPccAAAICPgcAAAICPkcAAAICPocAAAICPscAAAICPwcAAAICP0cAAAICP4cAAAICP8cAAAICAAdAAAICAEdAAAICAIdAAAICAMdAAAICAQdAAAICAUdAAAICAYdAAAICAcdAAAICAgdAAAICAkdAAAICAodAAAICAsdAAAICAwdAAAICA0dAAAICA4dAAAICA8dAAAICBAdAAAICBEdAAAICBIdAAAICBMdAAAICBQdAAAICBUdAAAICBYdAAAICBcdAAAICBgdAAAICBkdAAAICBodAAAICBsdAAAICBwdAAAICB0dAAAICB4dAAAICB8dAAAICCAdAAAICCEdAAAICCIdAAAICCMdAAAICCQdAAAICCUdAAAICCYdAAAICCcdAAAICCgdAAAICCkdAAAICCodAAAICCsdAAAICCwdAAAICC0dAAAICC4dAAAICC8dAAAICDAdAAAICDEdAAAICDIdAAAICDMdAAAICDQdAAAICDUdAAAICDYdAAAICDcdAAAICDgdAAAICDkdAAAICDodAAAICDsdAAAICDwdAAAICD0dAAAICD4dAAAICD8dAAAICEAdAAAICEEdAAAICEIdAAAICEMdAAAICEQdAAAICEUdAAAICEYdAAAICEcdAAAICEgdAAAICEkdAAAICEodAAAICEsdAAAICEwdAAAICE0dAAAICE4dAAAICE8dAAAICFAdAAAICFEdAAAICFIdAAAICFMdAAAICFQdAAAICFUdAAAICFYdAAAICFcdAAAICFgdAAAICFkdAAAICFodAAAICFsdAAAICFwdAAAICF0dAAAICF4dAAAICF8dAAAICGAdAAAICGEdAAAICGIdAAAICGMdAAAICGQdAAAICGUdAAAICGYdAAAICGcdAAAICGgdAAAICGkdAAAICGodAAAICGsdAAAICGwdAAAICG0dAAAICG4dAAAICG8dAAAICHAdAAAICHEdAAAICHIdAAAICHMdAAAICHQdAAAICHUdAAAICHYdAAAICHcdAAAICHgdAAAICHkdAAAICHodAAAICHsdAAAICHwdAAAICH0dAAAICH4dAAAICH8dAAAICIAdAAAICIEdAAAICIIdAAAICIMdAAAICIQdAAAICIUdAAAICIYdAAAICIcdAAAICIgdAAAICIkdAAAICIodAAAICIsdAAAICIwdAAAICI0dAAAICI4dAAAICI8dAAAICJAdAAAICJEdAAAICJIdAAAICJMdAAAICJQdAAAICJUdAAAICJYdAAAICJcdAAAICJgdAAAICJkdAAAICJodAAAICJsdAAAICJwdAAAICJ0dAAAICJ4dAAAICJ8dAAAICKAdAAAICKEdAAAICKIdAAAICKMdAAAICKQdAAAICKUdAAAICKYdAAAICKcdAAAICKgdAAAICKkdAAAICKodAAAICKsdAAAICKwdAAAICK0dAAAICK4dAAAICK8dAAAICLAdAAAICLEdAAAICLIdAAAICLMdAAAICLQdAAAICLUdAAAICLYdAAAICLcdAAAICLgdAAAICLkdAAAICLodAAAICLsdAAAICLwdAAAICL0dAAAICL4dAAAICL8dAAAICMAdAAAICMEdAAAICMIdAAAICMMdAAAICMQdAAAICMUdAAAICMYdAAAICMcdAAAICMgdAAAICMkdAAAICModAAAICMsdAAAICMwdAAAICM0dAAAICM4dAAAICM8dAAAICNAdAAAICNEdAAAICNIdAAAICNMdAAAICNQdAAAICNUdAAAICNYdAAAICNcdAAAICNgdAAAICNkdAAAICNodAAAICNsdAAAICNwdAAAICN0dAAAICN4dAAAICN8dAAAICOAdAAAICOEdAAAICOIdAAAICOMdAAAICOQdAAAICOUdAAAICOYdAAAICOcdAAAICOgdAAAICOkdAAAICOodAAAICOsdAAAICOwdAAAICO0dAAAICO4dAAAICO8dAAAICPAdAAAICPEdAAAICPIdAAAICPMdAAAICPQdAAAICPUdAAAICPYdAAAICPcdAAAICPgdAAAICPkdAAAICPodAAAICPsdAAAICPwdAAAICP0dAAAICP4dAAAICP8dAAAICAAeAAAICAEeAAAICAIeAAAICAMeAAAICAQeAAAICAUeAAAICAYeAAAICAceAAAICAgeAAAICAkeAAAICAoeAAAICAseAAAICAweAAAICA0eAAAICA4eAAAICA8eAAAICBAeAAAICBEeAAAICBIeAAAICBMeAAAICBQeAAAICBUeAAAICBYeAAAICBceAAAICBgeAAAICBkeAAAICBoeAAAICBseAAAICBweAAAICB0eAAAICB4eAAAICB8eAAAICCAeAAAICCEeAAAICCIeAAAICCMeAAAICCQeAAAICCUeAAAICCYeAAAICCceAAAICCgeAAAICCkeAAAICCoeAAAICCseAAAICCweAAAICC0eAAAICC4eAAAICC8eAAAICDAeAAAICDEeAAAICDIeAAAICDMeAAAICDQeAAAICDUeAAAICDYeAAAICDceAAAICDgeAAAICDkeAAAICDoeAAAICDseAAAICDweAAAICD0eAAAICD4eAAAICD8eAAAICEAeAAAICEEeAAAICEIeAAAICEMeAAAICEQeAAAICEUeAAAICEYeAAAICEceAAAICEgeAAAICEkeAAAICEoeAAAICEseAAAICEweAAAICE0eAAAICE4eAAAICE8eAAAICFAeAAAICFEeAAAICFIeAAAICFMeAAAICFQeAAAICFUeAAAICFYeAAAICFceAAAICFgeAAAICFkeAAAICFoeAAAICFseAAAICFweAAAICF0eAAAICF4eAAAICF8eAAAICGAeAAAICGEeAAAICGIeAAAICGMeAAAICGQeAAAICGUeAAAICGYeAAAICGceAAAICGgeAAAICGkeAAAICGoeAAAICGseAAAICGweAAAICG0eAAAICG4eAAAICG8eAAAICHAeAAAICHEeAAAICHIeAAAICHMeAAAICHQeAAAICHUeAAAICHYeAAAICHceAAAICHgeAAAICHkeAAAICHoeAAAICHseAAAICHweAAAICH0eAAAICH4eAAAICH8eAAAICIAeAAAICIEeAAAICIIeAAAICIMeAAAICIQeAAAICIUeAAAICIYeAAAICIceAAAICIgeAAAICIkeAAAICIoeAAAICIseAAAICIweAAAICI0eAAAICI4eAAAICI8eAAAICJAeAAAICJEeAAAICJIeAAAICJMeAAAICJQeAAAICJUeAAAICJYeAAAICJceAAAICJgeAAAICJkeAAAICJoeAAAICJseAAAICJweAAAICJ0eAAAICJ4eAAAICJ8eAAAICKAeAAAICKEeAAAICKIeAAAICKMeAAAICKQeAAAICKUeAAAICKYeAAAICKceAAAICKgeAAAICKkeAAAICKoeAAAICKseAAAICKweAAAICK0eAAAICK4eAAAICK8eAAAICLAeAAAICLEeAAAICLIeAAAICLMeAAAICLQeAAAICLUeAAAICLYeAAAICLceAAAICLgeAAAICLkeAAAICLoeAAAICLseAAAICLweAAAICL0eAAAICL4eAAAICL8eAAAICMAeAAAICMEeAAAICMIeAAAICMMeAAAICMQeAAAICMUeAAAICMYeAAAICMceAAAICMgeAAAICMkeAAAICMoeAAAICMseAAAICMweAAAICM0eAAAICM4eAAAICM8eAAAICNAeAAAICNEeAAAICNIeAAAICNMeAAAICNQeAAAICNUeAAAICNYeAAAICNceAAAICNgeAAAICNkeAAAICNoeAAAICNseAAAICNweAAAICN0eAAAICN4eAAAICN8eAAAICOAeAAAICOEeAAAICOIeAAAICOMeAAAICOQeAAAICOUeAAAICOYeAAAICOceAAAICOgeAAAICOkeAAAICOoeAAAICOseAAAICOweAAAICO0eAAAICO4eAAAICO8eAAAICPAeAAAICPEeAAAICPIeAAAICPMeAAAICPQeAAAICPUeAAAICPYeAAAICPceAAAICPgeAAAICPkeAAAICPoeAAAICPseAAAICPweAAAICP0eAAAICP4eAAAICP8eAAAICAAfAAAICAEfAAAICAIfAAAICAMfAAAICAQfAAAICAUfAAAICAYfAAAICAcfAAAICAgfAAAICAkfAAAICAofAAAICAsfAAAICAwfAAAICA0fAAAICA4fAAAICA8fAAAICBAfAAAICBEfAAAICBIfAAAICBMfAAAICBQfAAAICBUfAAAICBYfAAAICBcfAAAICBgfAAAICBkfAAAICBofAAAICBsfAAAICBwfAAAICB0fAAAICB4fAAAICB8fAAAICCAfAAAICCEfAAAICCIfAAAICCMfAAAICCQfAAAICCUfAAAICCYfAAAICCcfAAAICCgfAAAICCkfAAAICCofAAAICCsfAAAICCwfAAAICC0fAAAICC4fAAAICC8fAAAICDAfAAAICDEfAAAICDIfAAAICDMfAAAICDQfAAAICDUfAAAICDYfAAAICDcfAAAICDgfAAAICDkfAAAICDofAAAICDsfAAAICDwfAAAICD0fAAAICD4fAAAICD8fAAAICEAfAAAICEEfAAAICEIfAAAICEMfAAAICEQfAAAICEUfAAAICEYfAAAICEcfAAAICEgfAAAICEkfAAAICEofAAAICEsfAAAICEwfAAAICE0fAAAICE4fAAAICE8fAAAICFAfAAAICFEfAAAICFIfAAAICFMfAAAICFQfAAAICFUfAAAICFYfAAAICFcfAAAICFgfAAAICFkfAAAICFofAAAICFsfAAAICFwfAAAICF0fAAAICF4fAAAICF8fAAAICGAfAAAICGEfAAAICGIfAAAICGMfAAAICGQfAAAICGUfAAAICGYfAAAICGcfAAAICGgfAAAICGkfAAAICGofAAAICGsfAAAICGwfAAAICG0fAAAICG4fAAAICG8fAAAICHAfAAAICHEfAAAICHIfAAAICHMfAAAICHQfAAAICHUfAAAICHYfAAAICHcfAAAICHgfAAAICHkfAAAICHofAAAICHsfAAAICHwfAAAICH0fAAAICH4fAAAICH8fAAAICIAfAAAICIEfAAAICIIfAAAICIMfAAAICIQfAAAICIUfAAAICIYfAAAICIcfAAAICIgfAAAICIkfAAAICIofAAAICIsfAAAICIwfAAAICI0fAAAICI4fAAAICI8fAAAICJAfAAAICJEfAAAICJIfAAAICJMfAAAICJQfAAAICJUfAAAICJYfAAAICJcfAAAICJgfAAAICJkfAAAICJofAAAICJsfAAAICJwfAAAICJ0fAAAICJ4fAAAICJ8fAAAICKAfAAAICKEfAAAICKIfAAAICKMfAAAICKQfAAAICKUfAAAICKYfAAAICKcfAAAICKgfAAAICKkfAAAICKofAAAICKsfAAAICKwfAAAICK0fAAAICK4fAAAICK8fAAAICLAfAAAICLEfAAAICLIfAAAICLMfAAAICLQfAAAICLUfAAAICLYfAAAICLcfAAAICLgfAAAICLkfAAAICLofAAAICLsfAAAICLwfAAAICL0fAAAICL4fAAAICL8fAAAICMAfAAAICMEfAAAICMIfAAAICMMfAAAICMQfAAAICMUfAAAICMYfAAAICMcfAAAICMgfAAAICMkfAAAICMofAAAICMsfAAAICMwfAAAICM0fAAAICM4fAAAICM8fAAAICNAfAAAICNEfAAAICNIfAAAICNMfAAAICNQfAAAICNUfAAAICNYfAAAICNcfAAAICNgfAAAICNkfAAAICNofAAAICNsfAAAICNwfAAAICN0fAAAICN4fAAAICN8fAAAICOAfAAAICOEfAAAICOIfAAAICOMfAAAICOQfAAAICOUfAAAICOYfAAAICOcfAAAICOgfAAAICOkfAAAICOofAAAICOsfAAAICOwfAAAICO0fAAAICO4fAAAICO8fAAAICPAfAAAICPEfAAAICPIfAAAICPMfAAAICPQfAAAICPUfAAAICPYfAAAICPcfAAAICPgfAAAICPkfAAAICPofAAAICPsfAAAICPwfAAAICP0fAAAICP4fAAAICP8fAAAICAAgAAAICAEgAAAICAIgAAAICAMgAAAICAQgAAAICAUgAAAICAYgAAAICAcgAAAICAggAAAICAkgAAAICAogAAAICAsgAAAICAwgAAAICA0gAAAICA4gAAAICA8gAAAICBAgAAAICBEgAAAICBIgAAAICBMgAAAICBQgAAAICBUgAAAICBYgAAAICBcgAAAICBggAAAICBkgAAAICBogAAAICBsgAAAICBwgAAAICB0gAAAICB4gAAAICB8gAAAICCAgAAAICCEgAAAICCIgAAAICCMgAAAICCQgAAAICCUgAAAICCYgAAAICCcgAAAICCggAAAICCkgAAAICCogAAAICCsgAAAICCwgAAAICC0gAAAICC4gAAAICC8gAAAICDAgAAAICDEgAAAICDIgAAAICDMgAAAICDQgAAAICDUgAAAICDYgAAAICDcgAAAICDggAAAICDkgAAAICDogAAAICDsgAAAICDwgAAAICD0gAAAICD4gAAAICD8gAAAICEAgAAAICEEgAAAICEIgAAAICEMgAAAICEQgAAAICEUgAAAICEYgAAAICEcgAAAICEggAAAICEkgAAAICEogAAAICEsgAAAICEwgAAAICE0gAAAICE4gAAAICE8gAAAICFAgAAAICFEgAAAICFIgAAAICFMgAAAICFQgAAAICFUgAAAICFYgAAAICFcgAAAICFggAAAICFkgAAAICFogAAAICFsgAAAICFwgAAAICF0gAAAICF4gAAAICF8gAAAICGAgAAAICGEgAAAICGIgAAAICGMgAAAICGQgAAAICGUgAAAICGYgAAAICGcgAAAICGggAAAICGkgAAAICGogAAAICGsgAAAICGwgAAAICG0gAAAICG4gAAAICG8gAAAICHAgAAAICHEgAAAICHIgAAAICHMgAAAICHQgAAAICHUgAAAICHYgAAAICHcgAAAICHggAAAICHkgAAAICHogAAAICHsgAAAICHwgAAAICH0gAAAICH4gAAAICH8gAAAICIAgAAAICIEgAAAICIIgAAAICIMgAAAICIQgAAAICIUgAAAICIYgAAAICIcgAAAICIggAAAICIkgAAAICIogAAAICIsgAAAICIwgAAAICI0gAAAICI4gAAAICI8gAAAICJAgAAAICJEgAAAICJIgAAAICJMgAAAICJQgAAAICJUgAAAICJYgAAAICJcgAAAICJggAAAICJkgAAAICJogAAAICJsgAAAICJwgAAAICJ0gAAAICJ4gAAAICJ8gAAAICKAgAAAICKEgAAAICKIgAAAICKMgAAAICKQgAAAICKUgAAAICKYgAAAICKcgAAAICKggAAAICKkgAAAICKogAAAICKsgAAAICKwgAAAICK0gAAAICK4gAAAICK8gAAAICLAgAAAICLEgAAAICLIgAAAICLMgAAAICLQgAAAICLUgAAAICLYgAAAICLcgAAAICLggAAAICLkgAAAICLogAAAICLsgAAAICLwgAAAICL0gAAAICL4gAAAICL8gAAAICMAgAAAICMEgAAAICMIgAAAICMMgAAAICMQgAAAICMUgAAAICMYgAAAICMcgAAAICMggAAAICMkgAAAICMogAAAICMsgAAAICMwgAAAICM0gAAAICM4gAAAICM8gAAAICNAgAAAICNEgAAAICNIgAAAICNMgAAAICNQgAAAICNUgAAAICNYgAAAICNcgAAAICNggAAAICNkgAAAICNogAAAICNsgAAAICNwgAAAICN0gAAAICN4gAAAICN8gAAAICOAgAAAICOEgAAAICOIgAAAICOMgAAAICOQgAAAICOUgAAAICOYgAAAICOcgAAAICOggAAAICOkgAAAICOogAAAICOsgAAAICOwgAAAICO0gAAAICO4gAAAICO8gAAAICPAgAAAICPEgAAAICPIgAAAICPMgAAAICPQgAAAICPUgAAAICPYgAAAICPcgAAAICPggAAAICPkgAAAICPogAAAICPsgAAAICPwgAAAICP0gAAAICP4gAAAICP8gAAAICAAhAAAICAEhAAAICAIhAAAICAMhAAAICAQhAAAICAUhAAAICAYhAAAICAchAAAICAghAAAICAkhAAAICAohAAAICAshAAAICAwhAAAICA0hAAAICA4hAAAICA8hAAAICBAhAAAICBEhAAAICBIhAAAICBMhAAAICBQhAAAICBUhAAAICBYhAAAICBchAAAICBghAAAICBkhAAAICBohAAAICBshAAAICBwhAAAICB0hAAAICB4hAAAICB8hAAAICCAhAAAICCEhAAAICCIhAAAICCMhAAAICCQhAAAICCUhAAAICCYhAAAICCchAAAICCghAAAICCkhAAAICCohAAAICCshAAAICCwhAAAICC0hAAAICC4hAAAICC8hAAAICDAhAAAICDEhAAAICDIhAAAICDMhAAAICDQhAAAICDUhAAAICDYhAAAICDchAAAICDghAAAICDkhAAAICDohAAAICDshAAAICDwhAAAICD0hAAAICD4hAAAICD8hAAAICEAhAAAICEEhAAAICEIhAAAICEMhAAAICEQhAAAICEUhAAAICEYhAAAICEchAAAICEghAAAICEkhAAAICEohAAAICEshAAAICEwhAAAICE0hAAAICE4hAAAICE8hAAAICFAhAAAICFEhAAAICFIhAAAICFMhAAAICFQhAAAICFUhAAAICFYhAAAICFchAAAICFghAAAICFkhAAAICFohAAAICFshAAAICFwhAAAICF0hAAAICF4hAAAICF8hAAAICGAhAAAICGEhAAAICGIhAAAICGMhAAAICGQhAAAICGUhAAAICGYhAAAICGchAAAICGghAAAICGkhAAAICGohAAAICGshAAAICGwhAAAICG0hAAAICG4hAAAICG8hAAAICHAhAAAICHEhAAAICHIhAAAICHMhAAAICHQhAAAICHUhAAAICHYhAAAICHchAAAICHghAAAICHkhAAAICHohAAAICHshAAAICHwhAAAICH0hAAAICH4hAAAICH8hAAAICIAhAAAICIEhAAAICIIhAAAICIMhAAAICIQhAAAICIUhAAAICIYhAAAICIchAAAICIghAAAICIkhAAAICIohAAAICIshAAAICIwhAAAICI0hAAAICI4hAAAICI8hAAAICJAhAAAICJEhAAAICJIhAAAICJMhAAAICJQhAAAICJUhAAAICJYhAAAICJchAAAICJghAAAICJkhAAAICJohAAAICJshAAAICJwhAAAICJ0hAAAICJ4hAAAICJ8hAAAICKAhAAAICKEhAAAICKIhAAAICKMhAAAICKQhAAAICKUhAAAICKYhAAAICKchAAAICKghAAAICKkhAAAICKohAAAICKshAAAICKwhAAAICK0hAAAICK4hAAAICK8hAAAICLAhAAAICLEhAAAICLIhAAAICLMhAAAICLQhAAAICLUhAAAICLYhAAAICLchAAAICLghAAAICLkhAAAICLohAAAICLshAAAICLwhAAAICL0hAAAICL4hAAAICL8hAAAICMAhAAAICMEhAAAICMIhAAAICMMhAAAICMQhAAAICMUhAAAICMYhAAAICMchAAAICMghAAAICMkhAAAICMohAAAICMshAAAICMwhAAAICM0hAAAICM4hAAAICM8hAAAICNAhAAAICNEhAAAICNIhAAAICNMhAAAICNQhAAAICNUhAAAICNYhAAAICNchAAAICNghAAAICNkhAAAICNohAAAICNshAAAICNwhAAAICN0hAAAICN4hAAAICN8hAAAICOAhAAAICOEhAAAICOIhAAAICOMhAAAICOQhAAAICOUhAAAICOYhAAAICOchAAAICOghAAAICOkhAAAICOohAAAICOshAAAICOwhAAAICO0hAAAICO4hAAAICO8hAAAICPAhAAAICPEhAAAICPIhAAAICPMhAAAICPQhAAAICPUhAAAICPYhAAAICPchAAAICPghAAAICPkhAAAICPohAAAICPshAAAICPwhAAAICP0hAAAICP4hAAAICP8hAAAICAAiAAAICAEiAAAICAIiAAAICAMiAAAICAQiAAAICAUiAAAICAYiAAAICAciAAAICAgiAAAICAkiAAAICAoiAAAICAsiAAAICAwiAAAICA0iAAAICA4iAAAICA8iAAAICBAiAAAICBEiAAAICBIiAAAICBMiAAAICBQiAAAICBUiAAAICBYiAAAICBciAAAICBgiAAAICBkiAAAICBoiAAAICBsiAAAICBwiAAAICB0iAAAICB4iAAAICB8iAAAICCAiAAAICCEiAAAICCIiAAAICCMiAAAICCQiAAAICCUiAAAICCYiAAAICCciAAAICCgiAAAICCkiAAAICCoiAAAICCsiAAAICCwiAAAICC0iAAAICC4iAAAICC8iAAAICDAiAAAICDEiAAAICDIiAAAICDMiAAAICDQiAAAICDUiAAAICDYiAAAICDciAAAICDgiAAAICDkiAAAICDoiAAAICDsiAAAICDwiAAAICD0iAAAICD4iAAAICD8iAAAICEAiAAAICEEiAAAICEIiAAAICEMiAAAICEQiAAAICEUiAAAICEYiAAAICEciAAAICEgiAAAICEkiAAAICEoiAAAICEsiAAAICEwiAAAICE0iAAAICE4iAAAICE8iAAAICFAiAAAICFEiAAAICFIiAAAICFMiAAAICFQiAAAICFUiAAAICFYiAAAICFciAAAICFgiAAAICFkiAAAICFoiAAAICFsiAAAICFwiAAAICF0iAAAICF4iAAAICF8iAAAICGAiAAAICGEiAAAICGIiAAAICGMiAAAICGQiAAAICGUiAAAICGYiAAAICGciAAAICGgiAAAICGkiAAAICGoiAAAICGsiAAAICGwiAAAICG0iAAAICG4iAAAICG8iAAAICHAiAAAICHEiAAAICHIiAAAICHMiAAAICHQiAAAICHUiAAAICHYiAAAICHciAAAICHgiAAAICHkiAAAICHoiAAAICHsiAAAICHwiAAAICH0iAAAICH4iAAAICH8iAAAICIAiAAAICIEiAAAICIIiAAAICIMiAAAICIQiAAAICIUiAAAICIYiAAAICIciAAAICIgiAAAICIkiAAAICIoiAAAICIsiAAAICIwiAAAICI0iAAAICI4iAAAICI8iAAAICJAiAAAICJEiAAAICJIiAAAICJMiAAAICJQiAAAICJUiAAAICJYiAAAICJciAAAICJgiAAAICJkiAAAICJoiAAAICJsiAAAICJwiAAAICJ0iAAAICJ4iAAAICJ8iAAAICKAiAAAICKEiAAAICKIiAAAICKMiAAAICKQiAAAICKUiAAAICKYiAAAICKciAAAICKgiAAAICKkiAAAICKoiAAAICKsiAAAICKwiAAAICK0iAAAICK4iAAAICK8iAAAICLAiAAAICLEiAAAICLIiAAAICLMiAAAICLQiAAAICLUiAAAICLYiAAAICLciAAAICLgiAAAICLkiAAAICLoiAAAICLsiAAAICLwiAAAICL0iAAAICL4iAAAICL8iAAAICMAiAAAICMEiAAAICMIiAAAICMMiAAAICMQiAAAICMUiAAAICMYiAAAICMciAAAICMgiAAAICMkiAAAICMoiAAAICMsiAAAICMwiAAAICM0iAAAICM4iAAAICM8iAAAICNAiAAAICNEiAAAICNIiAAAICNMiAAAICNQiAAAICNUiAAAICNYiAAAICNciAAAICNgiAAAICNkiAAAICNoiAAAICNsiAAAICNwiAAAICN0iAAAICN4iAAAICN8iAAAICOAiAAAICOEiAAAICOIiAAAICOMiAAAICOQiAAAICOUiAAAICOYiAAAICOciAAAICOgiAAAICOkiAAAICOoiAAAICOsiAAAICOwiAAAICO0iAAAICO4iAAAICO8iAAAICPAiAAAICPEiAAAICPIiAAAICPMiAAAICPQiAAAICPUiAAAICPYiAAAICPciAAAICPgiAAAICPkiAAAICPoiAAAICPsiAAAICPwiAAAICP0iAAAICP4iAAAICP8iAAAICAAjAAAICAEjAAAICAIjAAAICAMjAAAICAQjAAAICAUjAAAICAYjAAAICAcjAAAICAgjAAAICAkjAAAICAojAAAICAsjAAAICAwjAAAICA0jAAAICA4jAAAICA8jAAAICBAjAAAICBEjAAAICBIjAAAICBMjAAAICBQjAAAICBUjAAAICBYjAAAICBcjAAAICBgjAAAICBkjAAAICBojAAAICBsjAAAICBwjAAAICB0jAAAICB4jAAAICB8jAAAICCAjAAAICCEjAAAICCIjAAAICCMjAAAICCQjAAAICCUjAAAICCYjAAAICCcjAAAICCgjAAAICCkjAAAICCojAAAICCsjAAAICCwjAAAICC0jAAAICC4jAAAICC8jAAAICDAjAAAICDEjAAAICDIjAAAICDMjAAAICDQjAAAICDUjAAAICDYjAAAICDcjAAAICDgjAAAICDkjAAAICDojAAAICDsjAAAICDwjAAAICD0jAAAICD4jAAAICD8jAAAICEAjAAAICEEjAAAICEIjAAAICEMjAAAICEQjAAAICEUjAAAICEYjAAAICEcjAAAICEgjAAAICEkjAAAICEojAAAICEsjAAAICEwjAAAICE0jAAAICE4jAAAICE8jAAAICFAjAAAICFEjAAAICFIjAAAICFMjAAAICFQjAAAICFUjAAAICFYjAAAICFcjAAAICFgjAAAICFkjAAAICFojAAAICFsjAAAICFwjAAAICF0jAAAICF4jAAAICF8jAAAICGAjAAAICGEjAAAICGIjAAAICGMjAAAICGQjAAAICGUjAAAICGYjAAAICGcjAAAICGgjAAAICGkjAAAICGojAAAICGsjAAAICGwjAAAICG0jAAAICG4jAAAICG8jAAAICHAjAAAICHEjAAAICHIjAAAICHMjAAAICHQjAAAICHUjAAAICHYjAAAICHcjAAAICHgjAAAICHkjAAAICHojAAAICHsjAAAICHwjAAAICH0jAAAICH4jAAAICH8jAAAICIAjAAAICIEjAAAICIIjAAAICIMjAAAICIQjAAAICIUjAAAICIYjAAAICIcjAAAICIgjAAAICIkjAAAICIojAAAICIsjAAAICIwjAAAICI0jAAAICI4jAAAICI8jAAAICJAjAAAICJEjAAAICJIjAAAICJMjAAAICJQjAAAICJUjAAAICJYjAAAICJcjAAAICJgjAAAICJkjAAAICJojAAAICJsjAAAICJwjAAAICJ0jAAAICJ4jAAAICJ8jAAAICKAjAAAICKEjAAAICKIjAAAICKMjAAAICKQjAAAICKUjAAAICKYjAAAICKcjAAAICKgjAAAICKkjAAAICKojAAAICKsjAAAICKwjAAAICK0jAAAICK4jAAAICK8jAAAICLAjAAAICLEjAAAICLIjAAAICLMjAAAICLQjAAAICLUjAAAICLYjAAAICLcjAAAICLgjAAAICLkjAAAICLojAAAICLsjAAAICLwjAAAICL0jAAAICL4jAAAICL8jAAAICMAjAAAICMEjAAAICMIjAAAICMMjAAAICMQjAAAICMUjAAAICMYjAAAICMcjAAAICMgjAAAICMkjAAAICMojAAAICMsjAAAICMwjAAAICM0jAAAICM4jAAAICM8jAAAICNAjAAAICNEjAAAICNIjAAAICNMjAAAICNQjAAAICNUjAAAICNYjAAAICNcjAAAICNgjAAAICNkjAAAICNojAAAICNsjAAAICNwjAAAICN0jAAAICN4jAAAICN8jAAAICOAjAAAICOEjAAAICOIjAAAICOMjAAAICOQjAAAICOUjAAAICOYjAAAICOcjAAAICOgjAAAICOkjAAAICOojAAAICOsjAAAICOwjAAAICO0jAAAICO4jAAAICO8jAAAICPAjAAAICPEjAAAICPIjAAAICPMjAAAICPQjAAAICPUjAAAICPYjAAAICPcjAAAICPgjAAAICPkjAAAICPojAAAICPsjAAAICPwjAAAICP0jAAAICP4jAAAICP8jAAAICAAkAAAICAEkAAAICAIkAAAICAMkAAAICAQkAAAICAUkAAAICAYkAAAICAckAAAICAgkAAAICAkkAAAICAokAAAICAskAAAICAwkAAAICA0kAAAICA4kAAAICA8kAAAICBAkAAAICBEkAAAICBIkAAAICBMkAAAICBQkAAAICBUkAAAICBYkAAAICBckAAAICBgkAAAICBkkAAAICBokAAAICBskAAAICBwkAAAICB0kAAAICB4kAAAICB8kAAAICCAkAAAICCEkAAAICCIkAAAICCMkAAAICCQkAAAICCUkAAAICCYkAAAICCckAAAICCgkAAAICCkkAAAICCokAAAICCskAAAICCwkAAAICC0kAAAICC4kAAAICC8kAAAICDAkAAAICDEkAAAICDIkAAAICDMkAAAICDQkAAAICDUkAAAICDYkAAAICDckAAAICDgkAAAICDkkAAAICDokAAAICDskAAAICDwkAAAICD0kAAAICD4kAAAICD8kAAAICEAkAAAICEEkAAAICEIkAAAICEMkAAAICEQkAAAICEUkAAAICEYkAAAICEckAAAICEgkAAAICEkkAAAICEokAAAICEskAAAICEwkAAAICE0kAAAICE4kAAAICE8kAAAICFAkAAAICFEkAAAICFIkAAAICFMkAAAICFQkAAAICFUkAAAICFYkAAAICFckAAAICFgkAAAICFkkAAAICFokAAAICFskAAAICFwkAAAICF0kAAAICF4kAAAICF8kAAAICGAkAAAICGEkAAAICGIkAAAICGMkAAAICGQkAAAICGUkAAAICGYkAAAICGckAAAICGgkAAAICGkkAAAICGokAAAICGskAAAICGwkAAAICG0kAAAICG4kAAAICG8kAAAICHAkAAAICHEkAAAICHIkAAAICHMkAAAICHQkAAAICHUkAAAICHYkAAAICHckAAAICHgkAAAICHkkAAAICHokAAAICHskAAAICHwkAAAICH0kAAAICH4kAAAICH8kAAAICIAkAAAICIEkAAAICIIkAAAICIMkAAAICIQkAAAICIUkAAAICIYkAAAICIckAAAICIgkAAAICIkkAAAICIokAAAICIskAAAICIwkAAAICI0kAAAICI4kAAAICI8kAAAICJAkAAAICJEkAAAICJIkAAAICJMkAAAICJQkAAAICJUkAAAICJYkAAAICJckAAAICJgkAAAICJkkAAAICJokAAAICJskAAAICJwkAAAICJ0kAAAICJ4kAAAICJ8kAAAICKAkAAAICKEkAAAICKIkAAAICKMkAAAICKQkAAAICKUkAAAICKYkAAAICKckAAAICKgkAAAICKkkAAAICKokAAAICKskAAAICKwkAAAICK0kAAAICK4kAAAICK8kAAAICLAkAAAICLEkAAAICLIkAAAICLMkAAAICLQkAAAICLUkAAAICLYkAAAICLckAAAICLgkAAAICLkkAAAICLokAAAICLskAAAICLwkAAAICL0kAAAICL4kAAAICL8kAAAICMAkAAAICMEkAAAICMIkAAAICMMkAAAICMQkAAAICMUkAAAICMYkAAAICMckAAAICMgkAAAICMkkAAAICMokAAAICMskAAAICMwkAAAICM0kAAAICM4kAAAICM8kAAAICNAkAAAICNEkAAAICNIkAAAICNMkAAAICNQkAAAICNUkAAAICNYkAAAICNckAAAICNgkAAAICNkkAAAICNokAAAICNskAAAICNwkAAAICN0kAAAICN4kAAAICN8kAAAICOAkAAAICOEkAAAICOIkAAAICOMkAAAICOQkAAAICOUkAAAICOYkAAAICOckAAAICOgkAAAICOkkAAAICOokAAAICOskAAAICOwkAAAICO0kAAAICO4kAAAICO8kAAAICPAkAAAICPEkAAAICPIkAAAICPMkAAAICPQkAAAICPUkAAAICPYkAAAICPckAAAICPgkAAAICPkkAAAICPokAAAICPskAAAICPwkAAAICP0kAAAICP4kAAAICP8kAAAICAAlAAAICAElAAAICAIlAAAICAMlAAAICAQlAAAICAUlAAAICAYlAAAICAclAAAICAglAAAICAklAAAICAolAAAICAslAAAICAwlAAAICA0lAAAICA4lAAAICA8lAAAICBAlAAAICBElAAAICBIlAAAICBMlAAAICBQlAAAICBUlAAAICBYlAAAICBclAAAICBglAAAICBklAAAICBolAAAICBslAAAICBwlAAAICB0lAAAICB4lAAAICB8lAAAICCAlAAAICCElAAAICCIlAAAICCMlAAAICCQlAAAICCUlAAAICCYlAAAICCclAAAICCglAAAICCklAAAICColAAAICCslAAAICCwlAAAICC0lAAAICC4lAAAICC8lAAAICDAlAAAICDElAAAICDIlAAAICDMlAAAICDQlAAAICDUlAAAICDYlAAAICDclAAAICDglAAAICDklAAAICDolAAAICDslAAAICDwlAAAICD0lAAAICD4lAAAICD8lAAAICEAlAAAICEElAAAICEIlAAAICEMlAAAICEQlAAAICEUlAAAICEYlAAAICEclAAAICEglAAAICEklAAAICEolAAAICEslAAAICEwlAAAICE0lAAAICE4lAAAICE8lAAAICFAlAAAICFElAAAICFIlAAAICFMlAAAICFQlAAAICFUlAAAICFYlAAAICFclAAAICFglAAAICFklAAAICFolAAAICFslAAAICFwlAAAICF0lAAAICF4lAAAICF8lAAAICGAlAAAICGElAAAICGIlAAAICGMlAAAICGQlAAAICGUlAAAICGYlAAAICGclAAAICGglAAAICGklAAAICGolAAAICGslAAAICGwlAAAICG0lAAAICG4lAAAICG8lAAAICHAlAAAICHElAAAICHIlAAAICHMlAAAICHQlAAAICHUlAAAICHYlAAAICHclAAAICHglAAAICHklAAAICHolAAAICHslAAAICHwlAAAICH0lAAAICH4lAAAICH8lAAAICIAlAAAICIElAAAICIIlAAAICIMlAAAICIQlAAAICIUlAAAICIYlAAAICIclAAAICIglAAAICIklAAAICIolAAAICIslAAAICIwlAAAICI0lAAAICI4lAAAICI8lAAAICJAlAAAICJElAAAICJIlAAAICJMlAAAICJQlAAAICJUlAAAICJYlAAAICJclAAAICJglAAAICJklAAAICJolAAAICJslAAAICJwlAAAICJ0lAAAICJ4lAAAICJ8lAAAICKAlAAAICKElAAAICKIlAAAICKMlAAAICKQlAAAICKUlAAAICKYlAAAICKclAAAICKglAAAICKklAAAICKolAAAICKslAAAICKwlAAAICK0lAAAICK4lAAAICK8lAAAICLAlAAAICLElAAAICLIlAAAICLMlAAAICLQlAAAICLUlAAAICLYlAAAICLclAAAICLglAAAICLklAAAICLolAAAICLslAAAICLwlAAAICL0lAAAICL4lAAAICL8lAAAICMAlAAAICMElAAAICMIlAAAICMMlAAAICMQlAAAICMUlAAAICMYlAAAICMclAAAICMglAAAICMklAAAICMolAAAICMslAAAICMwlAAAICM0lAAAICM4lAAAICM8lAAAICNAlAAAICNElAAAICNIlAAAICNMlAAAICNQlAAAICNUlAAAICNYlAAAICNclAAAICNglAAAICNklAAAICNolAAAICNslAAAICNwlAAAICN0lAAAICN4lAAAICN8lAAAICOAlAAAICOElAAAICOIlAAAICOMlAAAICOQlAAAICOUlAAAICOYlAAAICOclAAAICOglAAAICOklAAAICOolAAAICOslAAAICOwlAAAICO0lAAAICO4lAAAICO8lAAAICPAlAAAICPElAAAICPIlAAAICPMlAAAICPQlAAAICPUlAAAICPYlAAAICPclAAAICPglAAAICPklAAAICPolAAAICPslAAAICPwlAAAICP0lAAAICP4lAAAICP8lAAAICAAmAAAICAEmAAAICAImAAAICAMmAAAICAQmAAAICAUmAAAICAYmAAAICAcmAAAICAgmAAAICAkmAAAICAomAAAICAsmAAAICAwmAAAICA0mAAAICA4mAAAICA8mAAAICBAmAAAICBEmAAAICBImAAAICBMmAAAICBQmAAAICBUmAAAICBYmAAAICBcmAAAICBgmAAAICBkmAAAICBomAAAICBsmAAAICBwmAAAICB0mAAAICB4mAAAICB8mAAAICCAmAAAICCEmAAAICCImAAAICCMmAAAICCQmAAAICCUmAAAICCYmAAAICCcmAAAICCgmAAAICCkmAAAICComAAAICCsmAAAICCwmAAAICC0mAAAICC4mAAAICC8mAAAICDAmAAAICDEmAAAICDImAAAICDMmAAAICDQmAAAICDUmAAAICDYmAAAICDcmAAAICDgmAAAICDkmAAAICDomAAAICDsmAAAICDwmAAAICD0mAAAICD4mAAAICD8mAAAICEAmAAAICEEmAAAICEImAAAICEMmAAAICEQmAAAICEUmAAAICEYmAAAICEcmAAAICEgmAAAICEkmAAAICEomAAAICEsmAAAICEwmAAAICE0mAAAICE4mAAAICE8mAAAICFAmAAAICFEmAAAICFImAAAICFMmAAAICFQmAAAICFUmAAAICFYmAAAICFcmAAAICFgmAAAICFkmAAAICFomAAAICFsmAAAICFwmAAAICF0mAAAICF4mAAAICF8mAAAICGAmAAAICGEmAAAICGImAAAICGMmAAAICGQmAAAICGUmAAAICGYmAAAICGcmAAAICGgmAAAICGkmAAAICGomAAAICGsmAAAICGwmAAAICG0mAAAICG4mAAAICG8mAAAICHAmAAAICHEmAAAICHImAAAICHMmAAAICHQmAAAICHUmAAAICHYmAAAICHcmAAAICHgmAAAICHkmAAAICHomAAAICHsmAAAICHwmAAAICH0mAAAICH4mAAAICH8mAAAICIAmAAAICIEmAAAICIImAAAICIMmAAAICIQmAAAICIUmAAAICIYmAAAICIcmAAAICIgmAAAICIkmAAAICIomAAAICIsmAAAICIwmAAAICI0mAAAICI4mAAAICI8mAAAICJAmAAAICJEmAAAICJImAAAICJMmAAAICJQmAAAICJUmAAAICJYmAAAICJcmAAAICJgmAAAICJkmAAAICJomAAAICJsmAAAICJwmAAAICJ0mAAAICJ4mAAAICJ8mAAAICKAmAAAICKEmAAAICKImAAAICKMmAAAICKQmAAAICKUmAAAICKYmAAAICKcmAAAICKgmAAAICKkmAAAICKomAAAICKsmAAAICKwmAAAICK0mAAAICK4mAAAICK8mAAAICLAmAAAICLEmAAAICLImAAAICLMmAAAICLQmAAAICLUmAAAICLYmAAAICLcmAAAICLgmAAAICLkmAAAICLomAAAICLsmAAAICLwmAAAICL0mAAAICL4mAAAICL8mAAAICMAmAAAICMEmAAAICMImAAAICMMmAAAICMQmAAAICMUmAAAICMYmAAAICMcmAAAICMgmAAAICMkmAAAICMomAAAICMsmAAAICMwmAAAICM0mAAAICM4mAAAICM8mAAAICNAmAAAICNEmAAAICNImAAAICNMmAAAICNQmAAAICNUmAAAICNYmAAAICNcmAAAICNgmAAAICNkmAAAICNomAAAICNsmAAAICNwmAAAICN0mAAAICN4mAAAICN8mAAAICOAmAAAICOEmAAAICOImAAAICOMmAAAICOQmAAAICOUmAAAICOYmAAAICOcmAAAICOgmAAAICOkmAAAICOomAAAICOsmAAAICOwmAAAICO0mAAAICO4mAAAICO8mAAAICPAmAAAICPEmAAAICPImAAAICPMmAAAICPQmAAAICPUmAAAICPYmAAAICPcmAAAICPgmAAAICPkmAAAICPomAAAICPsmAAAICPwmAAAICP0mAAAICP4mAAAICP8mAAAICAAnAAAICAEnAAAICAInAAAICAMnAAAICAQnAAAICAUnAAAICAYnAAAICAcnAAAICAgnAAAICAknAAAICAonAAAICAsnAAAICAwnAAAICA0nAAAICA4nAAAICA8nAAAL", "AAEAAAD/////AQAAAAAAAAAQAQAAABAnAAAICAAAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAICCkAAAAICCoAAAAICCsAAAAICCwAAAAICC0AAAAICC4AAAAICC8AAAAICDAAAAAICDEAAAAICDIAAAAICDMAAAAICDQAAAAICDUAAAAICDYAAAAICDcAAAAICDgAAAAICDkAAAAICDoAAAAICDsAAAAICDwAAAAICD0AAAAICD4AAAAICD8AAAAICEAAAAAICEEAAAAICEIAAAAICEMAAAAICEQAAAAICEUAAAAICEYAAAAICEcAAAAICEgAAAAICEkAAAAICEoAAAAICEsAAAAICEwAAAAICE0AAAAICE4AAAAICE8AAAAICFAAAAAICFEAAAAICFIAAAAICFMAAAAICFQAAAAICFUAAAAICFYAAAAICFcAAAAICFgAAAAICFkAAAAICFoAAAAICFsAAAAICFwAAAAICF0AAAAICF4AAAAICF8AAAAICGAAAAAICGEAAAAICGIAAAAICGMAAAAICGQAAAAICGUAAAAICGYAAAAICGcAAAAICGgAAAAICGkAAAAICGoAAAAICGsAAAAICGwAAAAICG0AAAAICG4AAAAICG8AAAAICHAAAAAICHEAAAAICHIAAAAICHMAAAAICHQAAAAICHUAAAAICHYAAAAICHcAAAAICHgAAAAICHkAAAAICHoAAAAICHsAAAAICHwAAAAICH0AAAAICH4AAAAICH8AAAAICIAAAAAICIEAAAAICIIAAAAICIMAAAAICIQAAAAICIUAAAAICIYAAAAICIcAAAAICIgAAAAICIkAAAAICIoAAAAICIsAAAAICIwAAAAICI0AAAAICI4AAAAICI8AAAAICJAAAAAICJEAAAAICJIAAAAICJMAAAAICJQAAAAICJUAAAAICJYAAAAICJcAAAAICJgAAAAICJkAAAAICJoAAAAICJsAAAAICJwAAAAICJ0AAAAICJ4AAAAICJ8AAAAICKAAAAAICKEAAAAICKIAAAAICKMAAAAICKQAAAAICKUAAAAICKYAAAAICKcAAAAICKgAAAAICKkAAAAICKoAAAAICKsAAAAICKwAAAAICK0AAAAICK4AAAAICK8AAAAICLAAAAAICLEAAAAICLIAAAAICLMAAAAICLQAAAAICLUAAAAICLYAAAAICLcAAAAICLgAAAAICLkAAAAICLoAAAAICLsAAAAICLwAAAAICL0AAAAICL4AAAAICL8AAAAICMAAAAAICMEAAAAICMIAAAAICMMAAAAICMQAAAAICMUAAAAICMYAAAAICMcAAAAICMgAAAAICMkAAAAICMoAAAAICMsAAAAICMwAAAAICM0AAAAICM4AAAAICM8AAAAICNAAAAAICNEAAAAICNIAAAAICNMAAAAICNQAAAAICNUAAAAICNYAAAAICNcAAAAICNgAAAAICNkAAAAICNoAAAAICNsAAAAICNwAAAAICN0AAAAICN4AAAAICN8AAAAICOAAAAAICOEAAAAICOIAAAAICOMAAAAICOQAAAAICOUAAAAICOYAAAAICOcAAAAICOgAAAAICOkAAAAICOoAAAAICOsAAAAICOwAAAAICO0AAAAICO4AAAAICO8AAAAICPAAAAAICPEAAAAICPIAAAAICPMAAAAICPQAAAAICPUAAAAICPYAAAAICPcAAAAICPgAAAAICPkAAAAICPoAAAAICPsAAAAICPwAAAAICP0AAAAICP4AAAAICP8AAAAICAABAAAICAEBAAAICAIBAAAICAMBAAAICAQBAAAICAUBAAAICAYBAAAICAcBAAAICAgBAAAICAkBAAAICAoBAAAICAsBAAAICAwBAAAICA0BAAAICA4BAAAICA8BAAAICBABAAAICBEBAAAICBIBAAAICBMBAAAICBQBAAAICBUBAAAICBYBAAAICBcBAAAICBgBAAAICBkBAAAICBoBAAAICBsBAAAICBwBAAAICB0BAAAICB4BAAAICB8BAAAICCABAAAICCEBAAAICCIBAAAICCMBAAAICCQBAAAICCUBAAAICCYBAAAICCcBAAAICCgBAAAICCkBAAAICCoBAAAICCsBAAAICCwBAAAICC0BAAAICC4BAAAICC8BAAAICDABAAAICDEBAAAICDIBAAAICDMBAAAICDQBAAAICDUBAAAICDYBAAAICDcBAAAICDgBAAAICDkBAAAICDoBAAAICDsBAAAICDwBAAAICD0BAAAICD4BAAAICD8BAAAICEABAAAICEEBAAAICEIBAAAICEMBAAAICEQBAAAICEUBAAAICEYBAAAICEcBAAAICEgBAAAICEkBAAAICEoBAAAICEsBAAAICEwBAAAICE0BAAAICE4BAAAICE8BAAAICFABAAAICFEBAAAICFIBAAAICFMBAAAICFQBAAAICFUBAAAICFYBAAAICFcBAAAICFgBAAAICFkBAAAICFoBAAAICFsBAAAICFwBAAAICF0BAAAICF4BAAAICF8BAAAICGABAAAICGEBAAAICGIBAAAICGMBAAAICGQBAAAICGUBAAAICGYBAAAICGcBAAAICGgBAAAICGkBAAAICGoBAAAICGsBAAAICGwBAAAICG0BAAAICG4BAAAICG8BAAAICHABAAAICHEBAAAICHIBAAAICHMBAAAICHQBAAAICHUBAAAICHYBAAAICHcBAAAICHgBAAAICHkBAAAICHoBAAAICHsBAAAICHwBAAAICH0BAAAICH4BAAAICH8BAAAICIABAAAICIEBAAAICIIBAAAICIMBAAAICIQBAAAICIUBAAAICIYBAAAICIcBAAAICIgBAAAICIkBAAAICIoBAAAICIsBAAAICIwBAAAICI0BAAAICI4BAAAICI8BAAAICJABAAAICJEBAAAICJIBAAAICJMBAAAICJQBAAAICJUBAAAICJYBAAAICJcBAAAICJgBAAAICJkBAAAICJoBAAAICJsBAAAICJwBAAAICJ0BAAAICJ4BAAAICJ8BAAAICKABAAAICKEBAAAICKIBAAAICKMBAAAICKQBAAAICKUBAAAICKYBAAAICKcBAAAICKgBAAAICKkBAAAICKoBAAAICKsBAAAICKwBAAAICK0BAAAICK4BAAAICK8BAAAICLABAAAICLEBAAAICLIBAAAICLMBAAAICLQBAAAICLUBAAAICLYBAAAICLcBAAAICLgBAAAICLkBAAAICLoBAAAICLsBAAAICLwBAAAICL0BAAAICL4BAAAICL8BAAAICMABAAAICMEBAAAICMIBAAAICMMBAAAICMQBAAAICMUBAAAICMYBAAAICMcBAAAICMgBAAAICMkBAAAICMoBAAAICMsBAAAICMwBAAAICM0BAAAICM4BAAAICM8BAAAICNABAAAICNEBAAAICNIBAAAICNMBAAAICNQBAAAICNUBAAAICNYBAAAICNcBAAAICNgBAAAICNkBAAAICNoBAAAICNsBAAAICNwBAAAICN0BAAAICN4BAAAICN8BAAAICOABAAAICOEBAAAICOIBAAAICOMBAAAICOQBAAAICOUBAAAICOYBAAAICOcBAAAICOgBAAAICOkBAAAICOoBAAAICOsBAAAICOwBAAAICO0BAAAICO4BAAAICO8BAAAICPABAAAICPEBAAAICPIBAAAICPMBAAAICPQBAAAICPUBAAAICPYBAAAICPcBAAAICPgBAAAICPkBAAAICPoBAAAICPsBAAAICPwBAAAICP0BAAAICP4BAAAICP8BAAAICAACAAAICAECAAAICAICAAAICAMCAAAICAQCAAAICAUCAAAICAYCAAAICAcCAAAICAgCAAAICAkCAAAICAoCAAAICAsCAAAICAwCAAAICA0CAAAICA4CAAAICA8CAAAICBACAAAICBECAAAICBICAAAICBMCAAAICBQCAAAICBUCAAAICBYCAAAICBcCAAAICBgCAAAICBkCAAAICBoCAAAICBsCAAAICBwCAAAICB0CAAAICB4CAAAICB8CAAAICCACAAAICCECAAAICCICAAAICCMCAAAICCQCAAAICCUCAAAICCYCAAAICCcCAAAICCgCAAAICCkCAAAICCoCAAAICCsCAAAICCwCAAAICC0CAAAICC4CAAAICC8CAAAICDACAAAICDECAAAICDICAAAICDMCAAAICDQCAAAICDUCAAAICDYCAAAICDcCAAAICDgCAAAICDkCAAAICDoCAAAICDsCAAAICDwCAAAICD0CAAAICD4CAAAICD8CAAAICEACAAAICEECAAAICEICAAAICEMCAAAICEQCAAAICEUCAAAICEYCAAAICEcCAAAICEgCAAAICEkCAAAICEoCAAAICEsCAAAICEwCAAAICE0CAAAICE4CAAAICE8CAAAICFACAAAICFECAAAICFICAAAICFMCAAAICFQCAAAICFUCAAAICFYCAAAICFcCAAAICFgCAAAICFkCAAAICFoCAAAICFsCAAAICFwCAAAICF0CAAAICF4CAAAICF8CAAAICGACAAAICGECAAAICGICAAAICGMCAAAICGQCAAAICGUCAAAICGYCAAAICGcCAAAICGgCAAAICGkCAAAICGoCAAAICGsCAAAICGwCAAAICG0CAAAICG4CAAAICG8CAAAICHACAAAICHECAAAICHICAAAICHMCAAAICHQCAAAICHUCAAAICHYCAAAICHcCAAAICHgCAAAICHkCAAAICHoCAAAICHsCAAAICHwCAAAICH0CAAAICH4CAAAICH8CAAAICIACAAAICIECAAAICIICAAAICIMCAAAICIQCAAAICIUCAAAICIYCAAAICIcCAAAICIgCAAAICIkCAAAICIoCAAAICIsCAAAICIwCAAAICI0CAAAICI4CAAAICI8CAAAICJACAAAICJECAAAICJICAAAICJMCAAAICJQCAAAICJUCAAAICJYCAAAICJcCAAAICJgCAAAICJkCAAAICJoCAAAICJsCAAAICJwCAAAICJ0CAAAICJ4CAAAICJ8CAAAICKACAAAICKECAAAICKICAAAICKMCAAAICKQCAAAICKUCAAAICKYCAAAICKcCAAAICKgCAAAICKkCAAAICKoCAAAICKsCAAAICKwCAAAICK0CAAAICK4CAAAICK8CAAAICLACAAAICLECAAAICLICAAAICLMCAAAICLQCAAAICLUCAAAICLYCAAAICLcCAAAICLgCAAAICLkCAAAICLoCAAAICLsCAAAICLwCAAAICL0CAAAICL4CAAAICL8CAAAICMACAAAICMECAAAICMICAAAICMMCAAAICMQCAAAICMUCAAAICMYCAAAICMcCAAAICMgCAAAICMkCAAAICMoCAAAICMsCAAAICMwCAAAICM0CAAAICM4CAAAICM8CAAAICNACAAAICNECAAAICNICAAAICNMCAAAICNQCAAAICNUCAAAICNYCAAAICNcCAAAICNgCAAAICNkCAAAICNoCAAAICNsCAAAICNwCAAAICN0CAAAICN4CAAAICN8CAAAICOACAAAICOECAAAICOICAAAICOMCAAAICOQCAAAICOUCAAAICOYCAAAICOcCAAAICOgCAAAICOkCAAAICOoCAAAICOsCAAAICOwCAAAICO0CAAAICO4CAAAICO8CAAAICPACAAAICPECAAAICPICAAAICPMCAAAICPQCAAAICPUCAAAICPYCAAAICPcCAAAICPgCAAAICPkCAAAICPoCAAAICPsCAAAICPwCAAAICP0CAAAICP4CAAAICP8CAAAICAADAAAICAEDAAAICAIDAAAICAMDAAAICAQDAAAICAUDAAAICAYDAAAICAcDAAAICAgDAAAICAkDAAAICAoDAAAICAsDAAAICAwDAAAICA0DAAAICA4DAAAICA8DAAAICBADAAAICBEDAAAICBIDAAAICBMDAAAICBQDAAAICBUDAAAICBYDAAAICBcDAAAICBgDAAAICBkDAAAICBoDAAAICBsDAAAICBwDAAAICB0DAAAICB4DAAAICB8DAAAICCADAAAICCEDAAAICCIDAAAICCMDAAAICCQDAAAICCUDAAAICCYDAAAICCcDAAAICCgDAAAICCkDAAAICCoDAAAICCsDAAAICCwDAAAICC0DAAAICC4DAAAICC8DAAAICDADAAAICDEDAAAICDIDAAAICDMDAAAICDQDAAAICDUDAAAICDYDAAAICDcDAAAICDgDAAAICDkDAAAICDoDAAAICDsDAAAICDwDAAAICD0DAAAICD4DAAAICD8DAAAICEADAAAICEEDAAAICEIDAAAICEMDAAAICEQDAAAICEUDAAAICEYDAAAICEcDAAAICEgDAAAICEkDAAAICEoDAAAICEsDAAAICEwDAAAICE0DAAAICE4DAAAICE8DAAAICFADAAAICFEDAAAICFIDAAAICFMDAAAICFQDAAAICFUDAAAICFYDAAAICFcDAAAICFgDAAAICFkDAAAICFoDAAAICFsDAAAICFwDAAAICF0DAAAICF4DAAAICF8DAAAICGADAAAICGEDAAAICGIDAAAICGMDAAAICGQDAAAICGUDAAAICGYDAAAICGcDAAAICGgDAAAICGkDAAAICGoDAAAICGsDAAAICGwDAAAICG0DAAAICG4DAAAICG8DAAAICHADAAAICHEDAAAICHIDAAAICHMDAAAICHQDAAAICHUDAAAICHYDAAAICHcDAAAICHgDAAAICHkDAAAICHoDAAAICHsDAAAICHwDAAAICH0DAAAICH4DAAAICH8DAAAICIADAAAICIEDAAAICIIDAAAICIMDAAAICIQDAAAICIUDAAAICIYDAAAICIcDAAAICIgDAAAICIkDAAAICIoDAAAICIsDAAAICIwDAAAICI0DAAAICI4DAAAICI8DAAAICJADAAAICJEDAAAICJIDAAAICJMDAAAICJQDAAAICJUDAAAICJYDAAAICJcDAAAICJgDAAAICJkDAAAICJoDAAAICJsDAAAICJwDAAAICJ0DAAAICJ4DAAAICJ8DAAAICKADAAAICKEDAAAICKIDAAAICKMDAAAICKQDAAAICKUDAAAICKYDAAAICKcDAAAICKgDAAAICKkDAAAICKoDAAAICKsDAAAICKwDAAAICK0DAAAICK4DAAAICK8DAAAICLADAAAICLEDAAAICLIDAAAICLMDAAAICLQDAAAICLUDAAAICLYDAAAICLcDAAAICLgDAAAICLkDAAAICLoDAAAICLsDAAAICLwDAAAICL0DAAAICL4DAAAICL8DAAAICMADAAAICMEDAAAICMIDAAAICMMDAAAICMQDAAAICMUDAAAICMYDAAAICMcDAAAICMgDAAAICMkDAAAICMoDAAAICMsDAAAICMwDAAAICM0DAAAICM4DAAAICM8DAAAICNADAAAICNEDAAAICNIDAAAICNMDAAAICNQDAAAICNUDAAAICNYDAAAICNcDAAAICNgDAAAICNkDAAAICNoDAAAICNsDAAAICNwDAAAICN0DAAAICN4DAAAICN8DAAAICOADAAAICOEDAAAICOIDAAAICOMDAAAICOQDAAAICOUDAAAICOYDAAAICOcDAAAICOgDAAAICOkDAAAICOoDAAAICOsDAAAICOwDAAAICO0DAAAICO4DAAAICO8DAAAICPADAAAICPEDAAAICPIDAAAICPMDAAAICPQDAAAICPUDAAAICPYDAAAICPcDAAAICPgDAAAICPkDAAAICPoDAAAICPsDAAAICPwDAAAICP0DAAAICP4DAAAICP8DAAAICAAEAAAICAEEAAAICAIEAAAICAMEAAAICAQEAAAICAUEAAAICAYEAAAICAcEAAAICAgEAAAICAkEAAAICAoEAAAICAsEAAAICAwEAAAICA0EAAAICA4EAAAICA8EAAAICBAEAAAICBEEAAAICBIEAAAICBMEAAAICBQEAAAICBUEAAAICBYEAAAICBcEAAAICBgEAAAICBkEAAAICBoEAAAICBsEAAAICBwEAAAICB0EAAAICB4EAAAICB8EAAAICCAEAAAICCEEAAAICCIEAAAICCMEAAAICCQEAAAICCUEAAAICCYEAAAICCcEAAAICCgEAAAICCkEAAAICCoEAAAICCsEAAAICCwEAAAICC0EAAAICC4EAAAICC8EAAAICDAEAAAICDEEAAAICDIEAAAICDMEAAAICDQEAAAICDUEAAAICDYEAAAICDcEAAAICDgEAAAICDkEAAAICDoEAAAICDsEAAAICDwEAAAICD0EAAAICD4EAAAICD8EAAAICEAEAAAICEEEAAAICEIEAAAICEMEAAAICEQEAAAICEUEAAAICEYEAAAICEcEAAAICEgEAAAICEkEAAAICEoEAAAICEsEAAAICEwEAAAICE0EAAAICE4EAAAICE8EAAAICFAEAAAICFEEAAAICFIEAAAICFMEAAAICFQEAAAICFUEAAAICFYEAAAICFcEAAAICFgEAAAICFkEAAAICFoEAAAICFsEAAAICFwEAAAICF0EAAAICF4EAAAICF8EAAAICGAEAAAICGEEAAAICGIEAAAICGMEAAAICGQEAAAICGUEAAAICGYEAAAICGcEAAAICGgEAAAICGkEAAAICGoEAAAICGsEAAAICGwEAAAICG0EAAAICG4EAAAICG8EAAAICHAEAAAICHEEAAAICHIEAAAICHMEAAAICHQEAAAICHUEAAAICHYEAAAICHcEAAAICHgEAAAICHkEAAAICHoEAAAICHsEAAAICHwEAAAICH0EAAAICH4EAAAICH8EAAAICIAEAAAICIEEAAAICIIEAAAICIMEAAAICIQEAAAICIUEAAAICIYEAAAICIcEAAAICIgEAAAICIkEAAAICIoEAAAICIsEAAAICIwEAAAICI0EAAAICI4EAAAICI8EAAAICJAEAAAICJEEAAAICJIEAAAICJMEAAAICJQEAAAICJUEAAAICJYEAAAICJcEAAAICJgEAAAICJkEAAAICJoEAAAICJsEAAAICJwEAAAICJ0EAAAICJ4EAAAICJ8EAAAICKAEAAAICKEEAAAICKIEAAAICKMEAAAICKQEAAAICKUEAAAICKYEAAAICKcEAAAICKgEAAAICKkEAAAICKoEAAAICKsEAAAICKwEAAAICK0EAAAICK4EAAAICK8EAAAICLAEAAAICLEEAAAICLIEAAAICLMEAAAICLQEAAAICLUEAAAICLYEAAAICLcEAAAICLgEAAAICLkEAAAICLoEAAAICLsEAAAICLwEAAAICL0EAAAICL4EAAAICL8EAAAICMAEAAAICMEEAAAICMIEAAAICMMEAAAICMQEAAAICMUEAAAICMYEAAAICMcEAAAICMgEAAAICMkEAAAICMoEAAAICMsEAAAICMwEAAAICM0EAAAICM4EAAAICM8EAAAICNAEAAAICNEEAAAICNIEAAAICNMEAAAICNQEAAAICNUEAAAICNYEAAAICNcEAAAICNgEAAAICNkEAAAICNoEAAAICNsEAAAICNwEAAAICN0EAAAICN4EAAAICN8EAAAICOAEAAAICOEEAAAICOIEAAAICOMEAAAICOQEAAAICOUEAAAICOYEAAAICOcEAAAICOgEAAAICOkEAAAICOoEAAAICOsEAAAICOwEAAAICO0EAAAICO4EAAAICO8EAAAICPAEAAAICPEEAAAICPIEAAAICPMEAAAICPQEAAAICPUEAAAICPYEAAAICPcEAAAICPgEAAAICPkEAAAICPoEAAAICPsEAAAICPwEAAAICP0EAAAICP4EAAAICP8EAAAICAAFAAAICAEFAAAICAIFAAAICAMFAAAICAQFAAAICAUFAAAICAYFAAAICAcFAAAICAgFAAAICAkFAAAICAoFAAAICAsFAAAICAwFAAAICA0FAAAICA4FAAAICA8FAAAICBAFAAAICBEFAAAICBIFAAAICBMFAAAICBQFAAAICBUFAAAICBYFAAAICBcFAAAICBgFAAAICBkFAAAICBoFAAAICBsFAAAICBwFAAAICB0FAAAICB4FAAAICB8FAAAICCAFAAAICCEFAAAICCIFAAAICCMFAAAICCQFAAAICCUFAAAICCYFAAAICCcFAAAICCgFAAAICCkFAAAICCoFAAAICCsFAAAICCwFAAAICC0FAAAICC4FAAAICC8FAAAICDAFAAAICDEFAAAICDIFAAAICDMFAAAICDQFAAAICDUFAAAICDYFAAAICDcFAAAICDgFAAAICDkFAAAICDoFAAAICDsFAAAICDwFAAAICD0FAAAICD4FAAAICD8FAAAICEAFAAAICEEFAAAICEIFAAAICEMFAAAICEQFAAAICEUFAAAICEYFAAAICEcFAAAICEgFAAAICEkFAAAICEoFAAAICEsFAAAICEwFAAAICE0FAAAICE4FAAAICE8FAAAICFAFAAAICFEFAAAICFIFAAAICFMFAAAICFQFAAAICFUFAAAICFYFAAAICFcFAAAICFgFAAAICFkFAAAICFoFAAAICFsFAAAICFwFAAAICF0FAAAICF4FAAAICF8FAAAICGAFAAAICGEFAAAICGIFAAAICGMFAAAICGQFAAAICGUFAAAICGYFAAAICGcFAAAICGgFAAAICGkFAAAICGoFAAAICGsFAAAICGwFAAAICG0FAAAICG4FAAAICG8FAAAICHAFAAAICHEFAAAICHIFAAAICHMFAAAICHQFAAAICHUFAAAICHYFAAAICHcFAAAICHgFAAAICHkFAAAICHoFAAAICHsFAAAICHwFAAAICH0FAAAICH4FAAAICH8FAAAICIAFAAAICIEFAAAICIIFAAAICIMFAAAICIQFAAAICIUFAAAICIYFAAAICIcFAAAICIgFAAAICIkFAAAICIoFAAAICIsFAAAICIwFAAAICI0FAAAICI4FAAAICI8FAAAICJAFAAAICJEFAAAICJIFAAAICJMFAAAICJQFAAAICJUFAAAICJYFAAAICJcFAAAICJgFAAAICJkFAAAICJoFAAAICJsFAAAICJwFAAAICJ0FAAAICJ4FAAAICJ8FAAAICKAFAAAICKEFAAAICKIFAAAICKMFAAAICKQFAAAICKUFAAAICKYFAAAICKcFAAAICKgFAAAICKkFAAAICKoFAAAICKsFAAAICKwFAAAICK0FAAAICK4FAAAICK8FAAAICLAFAAAICLEFAAAICLIFAAAICLMFAAAICLQFAAAICLUFAAAICLYFAAAICLcFAAAICLgFAAAICLkFAAAICLoFAAAICLsFAAAICLwFAAAICL0FAAAICL4FAAAICL8FAAAICMAFAAAICMEFAAAICMIFAAAICMMFAAAICMQFAAAICMUFAAAICMYFAAAICMcFAAAICMgFAAAICMkFAAAICMoFAAAICMsFAAAICMwFAAAICM0FAAAICM4FAAAICM8FAAAICNAFAAAICNEFAAAICNIFAAAICNMFAAAICNQFAAAICNUFAAAICNYFAAAICNcFAAAICNgFAAAICNkFAAAICNoFAAAICNsFAAAICNwFAAAICN0FAAAICN4FAAAICN8FAAAICOAFAAAICOEFAAAICOIFAAAICOMFAAAICOQFAAAICOUFAAAICOYFAAAICOcFAAAICOgFAAAICOkFAAAICOoFAAAICOsFAAAICOwFAAAICO0FAAAICO4FAAAICO8FAAAICPAFAAAICPEFAAAICPIFAAAICPMFAAAICPQFAAAICPUFAAAICPYFAAAICPcFAAAICPgFAAAICPkFAAAICPoFAAAICPsFAAAICPwFAAAICP0FAAAICP4FAAAICP8FAAAICAAGAAAICAEGAAAICAIGAAAICAMGAAAICAQGAAAICAUGAAAICAYGAAAICAcGAAAICAgGAAAICAkGAAAICAoGAAAICAsGAAAICAwGAAAICA0GAAAICA4GAAAICA8GAAAICBAGAAAICBEGAAAICBIGAAAICBMGAAAICBQGAAAICBUGAAAICBYGAAAICBcGAAAICBgGAAAICBkGAAAICBoGAAAICBsGAAAICBwGAAAICB0GAAAICB4GAAAICB8GAAAICCAGAAAICCEGAAAICCIGAAAICCMGAAAICCQGAAAICCUGAAAICCYGAAAICCcGAAAICCgGAAAICCkGAAAICCoGAAAICCsGAAAICCwGAAAICC0GAAAICC4GAAAICC8GAAAICDAGAAAICDEGAAAICDIGAAAICDMGAAAICDQGAAAICDUGAAAICDYGAAAICDcGAAAICDgGAAAICDkGAAAICDoGAAAICDsGAAAICDwGAAAICD0GAAAICD4GAAAICD8GAAAICEAGAAAICEEGAAAICEIGAAAICEMGAAAICEQGAAAICEUGAAAICEYGAAAICEcGAAAICEgGAAAICEkGAAAICEoGAAAICEsGAAAICEwGAAAICE0GAAAICE4GAAAICE8GAAAICFAGAAAICFEGAAAICFIGAAAICFMGAAAICFQGAAAICFUGAAAICFYGAAAICFcGAAAICFgGAAAICFkGAAAICFoGAAAICFsGAAAICFwGAAAICF0GAAAICF4GAAAICF8GAAAICGAGAAAICGEGAAAICGIGAAAICGMGAAAICGQGAAAICGUGAAAICGYGAAAICGcGAAAICGgGAAAICGkGAAAICGoGAAAICGsGAAAICGwGAAAICG0GAAAICG4GAAAICG8GAAAICHAGAAAICHEGAAAICHIGAAAICHMGAAAICHQGAAAICHUGAAAICHYGAAAICHcGAAAICHgGAAAICHkGAAAICHoGAAAICHsGAAAICHwGAAAICH0GAAAICH4GAAAICH8GAAAICIAGAAAICIEGAAAICIIGAAAICIMGAAAICIQGAAAICIUGAAAICIYGAAAICIcGAAAICIgGAAAICIkGAAAICIoGAAAICIsGAAAICIwGAAAICI0GAAAICI4GAAAICI8GAAAICJAGAAAICJEGAAAICJIGAAAICJMGAAAICJQGAAAICJUGAAAICJYGAAAICJcGAAAICJgGAAAICJkGAAAICJoGAAAICJsGAAAICJwGAAAICJ0GAAAICJ4GAAAICJ8GAAAICKAGAAAICKEGAAAICKIGAAAICKMGAAAICKQGAAAICKUGAAAICKYGAAAICKcGAAAICKgGAAAICKkGAAAICKoGAAAICKsGAAAICKwGAAAICK0GAAAICK4GAAAICK8GAAAICLAGAAAICLEGAAAICLIGAAAICLMGAAAICLQGAAAICLUGAAAICLYGAAAICLcGAAAICLgGAAAICLkGAAAICLoGAAAICLsGAAAICLwGAAAICL0GAAAICL4GAAAICL8GAAAICMAGAAAICMEGAAAICMIGAAAICMMGAAAICMQGAAAICMUGAAAICMYGAAAICMcGAAAICMgGAAAICMkGAAAICMoGAAAICMsGAAAICMwGAAAICM0GAAAICM4GAAAICM8GAAAICNAGAAAICNEGAAAICNIGAAAICNMGAAAICNQGAAAICNUGAAAICNYGAAAICNcGAAAICNgGAAAICNkGAAAICNoGAAAICNsGAAAICNwGAAAICN0GAAAICN4GAAAICN8GAAAICOAGAAAICOEGAAAICOIGAAAICOMGAAAICOQGAAAICOUGAAAICOYGAAAICOcGAAAICOgGAAAICOkGAAAICOoGAAAICOsGAAAICOwGAAAICO0GAAAICO4GAAAICO8GAAAICPAGAAAICPEGAAAICPIGAAAICPMGAAAICPQGAAAICPUGAAAICPYGAAAICPcGAAAICPgGAAAICPkGAAAICPoGAAAICPsGAAAICPwGAAAICP0GAAAICP4GAAAICP8GAAAICAAHAAAICAEHAAAICAIHAAAICAMHAAAICAQHAAAICAUHAAAICAYHAAAICAcHAAAICAgHAAAICAkHAAAICAoHAAAICAsHAAAICAwHAAAICA0HAAAICA4HAAAICA8HAAAICBAHAAAICBEHAAAICBIHAAAICBMHAAAICBQHAAAICBUHAAAICBYHAAAICBcHAAAICBgHAAAICBkHAAAICBoHAAAICBsHAAAICBwHAAAICB0HAAAICB4HAAAICB8HAAAICCAHAAAICCEHAAAICCIHAAAICCMHAAAICCQHAAAICCUHAAAICCYHAAAICCcHAAAICCgHAAAICCkHAAAICCoHAAAICCsHAAAICCwHAAAICC0HAAAICC4HAAAICC8HAAAICDAHAAAICDEHAAAICDIHAAAICDMHAAAICDQHAAAICDUHAAAICDYHAAAICDcHAAAICDgHAAAICDkHAAAICDoHAAAICDsHAAAICDwHAAAICD0HAAAICD4HAAAICD8HAAAICEAHAAAICEEHAAAICEIHAAAICEMHAAAICEQHAAAICEUHAAAICEYHAAAICEcHAAAICEgHAAAICEkHAAAICEoHAAAICEsHAAAICEwHAAAICE0HAAAICE4HAAAICE8HAAAICFAHAAAICFEHAAAICFIHAAAICFMHAAAICFQHAAAICFUHAAAICFYHAAAICFcHAAAICFgHAAAICFkHAAAICFoHAAAICFsHAAAICFwHAAAICF0HAAAICF4HAAAICF8HAAAICGAHAAAICGEHAAAICGIHAAAICGMHAAAICGQHAAAICGUHAAAICGYHAAAICGcHAAAICGgHAAAICGkHAAAICGoHAAAICGsHAAAICGwHAAAICG0HAAAICG4HAAAICG8HAAAICHAHAAAICHEHAAAICHIHAAAICHMHAAAICHQHAAAICHUHAAAICHYHAAAICHcHAAAICHgHAAAICHkHAAAICHoHAAAICHsHAAAICHwHAAAICH0HAAAICH4HAAAICH8HAAAICIAHAAAICIEHAAAICIIHAAAICIMHAAAICIQHAAAICIUHAAAICIYHAAAICIcHAAAICIgHAAAICIkHAAAICIoHAAAICIsHAAAICIwHAAAICI0HAAAICI4HAAAICI8HAAAICJAHAAAICJEHAAAICJIHAAAICJMHAAAICJQHAAAICJUHAAAICJYHAAAICJcHAAAICJgHAAAICJkHAAAICJoHAAAICJsHAAAICJwHAAAICJ0HAAAICJ4HAAAICJ8HAAAICKAHAAAICKEHAAAICKIHAAAICKMHAAAICKQHAAAICKUHAAAICKYHAAAICKcHAAAICKgHAAAICKkHAAAICKoHAAAICKsHAAAICKwHAAAICK0HAAAICK4HAAAICK8HAAAICLAHAAAICLEHAAAICLIHAAAICLMHAAAICLQHAAAICLUHAAAICLYHAAAICLcHAAAICLgHAAAICLkHAAAICLoHAAAICLsHAAAICLwHAAAICL0HAAAICL4HAAAICL8HAAAICMAHAAAICMEHAAAICMIHAAAICMMHAAAICMQHAAAICMUHAAAICMYHAAAICMcHAAAICMgHAAAICMkHAAAICMoHAAAICMsHAAAICMwHAAAICM0HAAAICM4HAAAICM8HAAAICNAHAAAICNEHAAAICNIHAAAICNMHAAAICNQHAAAICNUHAAAICNYHAAAICNcHAAAICNgHAAAICNkHAAAICNoHAAAICNsHAAAICNwHAAAICN0HAAAICN4HAAAICN8HAAAICOAHAAAICOEHAAAICOIHAAAICOMHAAAICOQHAAAICOUHAAAICOYHAAAICOcHAAAICOgHAAAICOkHAAAICOoHAAAICOsHAAAICOwHAAAICO0HAAAICO4HAAAICO8HAAAICPAHAAAICPEHAAAICPIHAAAICPMHAAAICPQHAAAICPUHAAAICPYHAAAICPcHAAAICPgHAAAICPkHAAAICPoHAAAICPsHAAAICPwHAAAICP0HAAAICP4HAAAICP8HAAAICAAIAAAICAEIAAAICAIIAAAICAMIAAAICAQIAAAICAUIAAAICAYIAAAICAcIAAAICAgIAAAICAkIAAAICAoIAAAICAsIAAAICAwIAAAICA0IAAAICA4IAAAICA8IAAAICBAIAAAICBEIAAAICBIIAAAICBMIAAAICBQIAAAICBUIAAAICBYIAAAICBcIAAAICBgIAAAICBkIAAAICBoIAAAICBsIAAAICBwIAAAICB0IAAAICB4IAAAICB8IAAAICCAIAAAICCEIAAAICCIIAAAICCMIAAAICCQIAAAICCUIAAAICCYIAAAICCcIAAAICCgIAAAICCkIAAAICCoIAAAICCsIAAAICCwIAAAICC0IAAAICC4IAAAICC8IAAAICDAIAAAICDEIAAAICDIIAAAICDMIAAAICDQIAAAICDUIAAAICDYIAAAICDcIAAAICDgIAAAICDkIAAAICDoIAAAICDsIAAAICDwIAAAICD0IAAAICD4IAAAICD8IAAAICEAIAAAICEEIAAAICEIIAAAICEMIAAAICEQIAAAICEUIAAAICEYIAAAICEcIAAAICEgIAAAICEkIAAAICEoIAAAICEsIAAAICEwIAAAICE0IAAAICE4IAAAICE8IAAAICFAIAAAICFEIAAAICFIIAAAICFMIAAAICFQIAAAICFUIAAAICFYIAAAICFcIAAAICFgIAAAICFkIAAAICFoIAAAICFsIAAAICFwIAAAICF0IAAAICF4IAAAICF8IAAAICGAIAAAICGEIAAAICGIIAAAICGMIAAAICGQIAAAICGUIAAAICGYIAAAICGcIAAAICGgIAAAICGkIAAAICGoIAAAICGsIAAAICGwIAAAICG0IAAAICG4IAAAICG8IAAAICHAIAAAICHEIAAAICHIIAAAICHMIAAAICHQIAAAICHUIAAAICHYIAAAICHcIAAAICHgIAAAICHkIAAAICHoIAAAICHsIAAAICHwIAAAICH0IAAAICH4IAAAICH8IAAAICIAIAAAICIEIAAAICIIIAAAICIMIAAAICIQIAAAICIUIAAAICIYIAAAICIcIAAAICIgIAAAICIkIAAAICIoIAAAICIsIAAAICIwIAAAICI0IAAAICI4IAAAICI8IAAAICJAIAAAICJEIAAAICJIIAAAICJMIAAAICJQIAAAICJUIAAAICJYIAAAICJcIAAAICJgIAAAICJkIAAAICJoIAAAICJsIAAAICJwIAAAICJ0IAAAICJ4IAAAICJ8IAAAICKAIAAAICKEIAAAICKIIAAAICKMIAAAICKQIAAAICKUIAAAICKYIAAAICKcIAAAICKgIAAAICKkIAAAICKoIAAAICKsIAAAICKwIAAAICK0IAAAICK4IAAAICK8IAAAICLAIAAAICLEIAAAICLIIAAAICLMIAAAICLQIAAAICLUIAAAICLYIAAAICLcIAAAICLgIAAAICLkIAAAICLoIAAAICLsIAAAICLwIAAAICL0IAAAICL4IAAAICL8IAAAICMAIAAAICMEIAAAICMIIAAAICMMIAAAICMQIAAAICMUIAAAICMYIAAAICMcIAAAICMgIAAAICMkIAAAICMoIAAAICMsIAAAICMwIAAAICM0IAAAICM4IAAAICM8IAAAICNAIAAAICNEIAAAICNIIAAAICNMIAAAICNQIAAAICNUIAAAICNYIAAAICNcIAAAICNgIAAAICNkIAAAICNoIAAAICNsIAAAICNwIAAAICN0IAAAICN4IAAAICN8IAAAICOAIAAAICOEIAAAICOIIAAAICOMIAAAICOQIAAAICOUIAAAICOYIAAAICOcIAAAICOgIAAAICOkIAAAICOoIAAAICOsIAAAICOwIAAAICO0IAAAICO4IAAAICO8IAAAICPAIAAAICPEIAAAICPIIAAAICPMIAAAICPQIAAAICPUIAAAICPYIAAAICPcIAAAICPgIAAAICPkIAAAICPoIAAAICPsIAAAICPwIAAAICP0IAAAICP4IAAAICP8IAAAICAAJAAAICAEJAAAICAIJAAAICAMJAAAICAQJAAAICAUJAAAICAYJAAAICAcJAAAICAgJAAAICAkJAAAICAoJAAAICAsJAAAICAwJAAAICA0JAAAICA4JAAAICA8JAAAICBAJAAAICBEJAAAICBIJAAAICBMJAAAICBQJAAAICBUJAAAICBYJAAAICBcJAAAICBgJAAAICBkJAAAICBoJAAAICBsJAAAICBwJAAAICB0JAAAICB4JAAAICB8JAAAICCAJAAAICCEJAAAICCIJAAAICCMJAAAICCQJAAAICCUJAAAICCYJAAAICCcJAAAICCgJAAAICCkJAAAICCoJAAAICCsJAAAICCwJAAAICC0JAAAICC4JAAAICC8JAAAICDAJAAAICDEJAAAICDIJAAAICDMJAAAICDQJAAAICDUJAAAICDYJAAAICDcJAAAICDgJAAAICDkJAAAICDoJAAAICDsJAAAICDwJAAAICD0JAAAICD4JAAAICD8JAAAICEAJAAAICEEJAAAICEIJAAAICEMJAAAICEQJAAAICEUJAAAICEYJAAAICEcJAAAICEgJAAAICEkJAAAICEoJAAAICEsJAAAICEwJAAAICE0JAAAICE4JAAAICE8JAAAICFAJAAAICFEJAAAICFIJAAAICFMJAAAICFQJAAAICFUJAAAICFYJAAAICFcJAAAICFgJAAAICFkJAAAICFoJAAAICFsJAAAICFwJAAAICF0JAAAICF4JAAAICF8JAAAICGAJAAAICGEJAAAICGIJAAAICGMJAAAICGQJAAAICGUJAAAICGYJAAAICGcJAAAICGgJAAAICGkJAAAICGoJAAAICGsJAAAICGwJAAAICG0JAAAICG4JAAAICG8JAAAICHAJAAAICHEJAAAICHIJAAAICHMJAAAICHQJAAAICHUJAAAICHYJAAAICHcJAAAICHgJAAAICHkJAAAICHoJAAAICHsJAAAICHwJAAAICH0JAAAICH4JAAAICH8JAAAICIAJAAAICIEJAAAICIIJAAAICIMJAAAICIQJAAAICIUJAAAICIYJAAAICIcJAAAICIgJAAAICIkJAAAICIoJAAAICIsJAAAICIwJAAAICI0JAAAICI4JAAAICI8JAAAICJAJAAAICJEJAAAICJIJAAAICJMJAAAICJQJAAAICJUJAAAICJYJAAAICJcJAAAICJgJAAAICJkJAAAICJoJAAAICJsJAAAICJwJAAAICJ0JAAAICJ4JAAAICJ8JAAAICKAJAAAICKEJAAAICKIJAAAICKMJAAAICKQJAAAICKUJAAAICKYJAAAICKcJAAAICKgJAAAICKkJAAAICKoJAAAICKsJAAAICKwJAAAICK0JAAAICK4JAAAICK8JAAAICLAJAAAICLEJAAAICLIJAAAICLMJAAAICLQJAAAICLUJAAAICLYJAAAICLcJAAAICLgJAAAICLkJAAAICLoJAAAICLsJAAAICLwJAAAICL0JAAAICL4JAAAICL8JAAAICMAJAAAICMEJAAAICMIJAAAICMMJAAAICMQJAAAICMUJAAAICMYJAAAICMcJAAAICMgJAAAICMkJAAAICMoJAAAICMsJAAAICMwJAAAICM0JAAAICM4JAAAICM8JAAAICNAJAAAICNEJAAAICNIJAAAICNMJAAAICNQJAAAICNUJAAAICNYJAAAICNcJAAAICNgJAAAICNkJAAAICNoJAAAICNsJAAAICNwJAAAICN0JAAAICN4JAAAICN8JAAAICOAJAAAICOEJAAAICOIJAAAICOMJAAAICOQJAAAICOUJAAAICOYJAAAICOcJAAAICOgJAAAICOkJAAAICOoJAAAICOsJAAAICOwJAAAICO0JAAAICO4JAAAICO8JAAAICPAJAAAICPEJAAAICPIJAAAICPMJAAAICPQJAAAICPUJAAAICPYJAAAICPcJAAAICPgJAAAICPkJAAAICPoJAAAICPsJAAAICPwJAAAICP0JAAAICP4JAAAICP8JAAAICAAKAAAICAEKAAAICAIKAAAICAMKAAAICAQKAAAICAUKAAAICAYKAAAICAcKAAAICAgKAAAICAkKAAAICAoKAAAICAsKAAAICAwKAAAICA0KAAAICA4KAAAICA8KAAAICBAKAAAICBEKAAAICBIKAAAICBMKAAAICBQKAAAICBUKAAAICBYKAAAICBcKAAAICBgKAAAICBkKAAAICBoKAAAICBsKAAAICBwKAAAICB0KAAAICB4KAAAICB8KAAAICCAKAAAICCEKAAAICCIKAAAICCMKAAAICCQKAAAICCUKAAAICCYKAAAICCcKAAAICCgKAAAICCkKAAAICCoKAAAICCsKAAAICCwKAAAICC0KAAAICC4KAAAICC8KAAAICDAKAAAICDEKAAAICDIKAAAICDMKAAAICDQKAAAICDUKAAAICDYKAAAICDcKAAAICDgKAAAICDkKAAAICDoKAAAICDsKAAAICDwKAAAICD0KAAAICD4KAAAICD8KAAAICEAKAAAICEEKAAAICEIKAAAICEMKAAAICEQKAAAICEUKAAAICEYKAAAICEcKAAAICEgKAAAICEkKAAAICEoKAAAICEsKAAAICEwKAAAICE0KAAAICE4KAAAICE8KAAAICFAKAAAICFEKAAAICFIKAAAICFMKAAAICFQKAAAICFUKAAAICFYKAAAICFcKAAAICFgKAAAICFkKAAAICFoKAAAICFsKAAAICFwKAAAICF0KAAAICF4KAAAICF8KAAAICGAKAAAICGEKAAAICGIKAAAICGMKAAAICGQKAAAICGUKAAAICGYKAAAICGcKAAAICGgKAAAICGkKAAAICGoKAAAICGsKAAAICGwKAAAICG0KAAAICG4KAAAICG8KAAAICHAKAAAICHEKAAAICHIKAAAICHMKAAAICHQKAAAICHUKAAAICHYKAAAICHcKAAAICHgKAAAICHkKAAAICHoKAAAICHsKAAAICHwKAAAICH0KAAAICH4KAAAICH8KAAAICIAKAAAICIEKAAAICIIKAAAICIMKAAAICIQKAAAICIUKAAAICIYKAAAICIcKAAAICIgKAAAICIkKAAAICIoKAAAICIsKAAAICIwKAAAICI0KAAAICI4KAAAICI8KAAAICJAKAAAICJEKAAAICJIKAAAICJMKAAAICJQKAAAICJUKAAAICJYKAAAICJcKAAAICJgKAAAICJkKAAAICJoKAAAICJsKAAAICJwKAAAICJ0KAAAICJ4KAAAICJ8KAAAICKAKAAAICKEKAAAICKIKAAAICKMKAAAICKQKAAAICKUKAAAICKYKAAAICKcKAAAICKgKAAAICKkKAAAICKoKAAAICKsKAAAICKwKAAAICK0KAAAICK4KAAAICK8KAAAICLAKAAAICLEKAAAICLIKAAAICLMKAAAICLQKAAAICLUKAAAICLYKAAAICLcKAAAICLgKAAAICLkKAAAICLoKAAAICLsKAAAICLwKAAAICL0KAAAICL4KAAAICL8KAAAICMAKAAAICMEKAAAICMIKAAAICMMKAAAICMQKAAAICMUKAAAICMYKAAAICMcKAAAICMgKAAAICMkKAAAICMoKAAAICMsKAAAICMwKAAAICM0KAAAICM4KAAAICM8KAAAICNAKAAAICNEKAAAICNIKAAAICNMKAAAICNQKAAAICNUKAAAICNYKAAAICNcKAAAICNgKAAAICNkKAAAICNoKAAAICNsKAAAICNwKAAAICN0KAAAICN4KAAAICN8KAAAICOAKAAAICOEKAAAICOIKAAAICOMKAAAICOQKAAAICOUKAAAICOYKAAAICOcKAAAICOgKAAAICOkKAAAICOoKAAAICOsKAAAICOwKAAAICO0KAAAICO4KAAAICO8KAAAICPAKAAAICPEKAAAICPIKAAAICPMKAAAICPQKAAAICPUKAAAICPYKAAAICPcKAAAICPgKAAAICPkKAAAICPoKAAAICPsKAAAICPwKAAAICP0KAAAICP4KAAAICP8KAAAICAALAAAICAELAAAICAILAAAICAMLAAAICAQLAAAICAULAAAICAYLAAAICAcLAAAICAgLAAAICAkLAAAICAoLAAAICAsLAAAICAwLAAAICA0LAAAICA4LAAAICA8LAAAICBALAAAICBELAAAICBILAAAICBMLAAAICBQLAAAICBULAAAICBYLAAAICBcLAAAICBgLAAAICBkLAAAICBoLAAAICBsLAAAICBwLAAAICB0LAAAICB4LAAAICB8LAAAICCALAAAICCELAAAICCILAAAICCMLAAAICCQLAAAICCULAAAICCYLAAAICCcLAAAICCgLAAAICCkLAAAICCoLAAAICCsLAAAICCwLAAAICC0LAAAICC4LAAAICC8LAAAICDALAAAICDELAAAICDILAAAICDMLAAAICDQLAAAICDULAAAICDYLAAAICDcLAAAICDgLAAAICDkLAAAICDoLAAAICDsLAAAICDwLAAAICD0LAAAICD4LAAAICD8LAAAICEALAAAICEELAAAICEILAAAICEMLAAAICEQLAAAICEULAAAICEYLAAAICEcLAAAICEgLAAAICEkLAAAICEoLAAAICEsLAAAICEwLAAAICE0LAAAICE4LAAAICE8LAAAICFALAAAICFELAAAICFILAAAICFMLAAAICFQLAAAICFULAAAICFYLAAAICFcLAAAICFgLAAAICFkLAAAICFoLAAAICFsLAAAICFwLAAAICF0LAAAICF4LAAAICF8LAAAICGALAAAICGELAAAICGILAAAICGMLAAAICGQLAAAICGULAAAICGYLAAAICGcLAAAICGgLAAAICGkLAAAICGoLAAAICGsLAAAICGwLAAAICG0LAAAICG4LAAAICG8LAAAICHALAAAICHELAAAICHILAAAICHMLAAAICHQLAAAICHULAAAICHYLAAAICHcLAAAICHgLAAAICHkLAAAICHoLAAAICHsLAAAICHwLAAAICH0LAAAICH4LAAAICH8LAAAICIALAAAICIELAAAICIILAAAICIMLAAAICIQLAAAICIULAAAICIYLAAAICIcLAAAICIgLAAAICIkLAAAICIoLAAAICIsLAAAICIwLAAAICI0LAAAICI4LAAAICI8LAAAICJALAAAICJELAAAICJILAAAICJMLAAAICJQLAAAICJULAAAICJYLAAAICJcLAAAICJgLAAAICJkLAAAICJoLAAAICJsLAAAICJwLAAAICJ0LAAAICJ4LAAAICJ8LAAAICKALAAAICKELAAAICKILAAAICKMLAAAICKQLAAAICKULAAAICKYLAAAICKcLAAAICKgLAAAICKkLAAAICKoLAAAICKsLAAAICKwLAAAICK0LAAAICK4LAAAICK8LAAAICLALAAAICLELAAAICLILAAAICLMLAAAICLQLAAAICLULAAAICLYLAAAICLcLAAAICLgLAAAICLkLAAAICLoLAAAICLsLAAAICLwLAAAICL0LAAAICL4LAAAICL8LAAAICMALAAAICMELAAAICMILAAAICMMLAAAICMQLAAAICMULAAAICMYLAAAICMcLAAAICMgLAAAICMkLAAAICMoLAAAICMsLAAAICMwLAAAICM0LAAAICM4LAAAICM8LAAAICNALAAAICNELAAAICNILAAAICNMLAAAICNQLAAAICNULAAAICNYLAAAICNcLAAAICNgLAAAICNkLAAAICNoLAAAICNsLAAAICNwLAAAICN0LAAAICN4LAAAICN8LAAAICOALAAAICOELAAAICOILAAAICOMLAAAICOQLAAAICOULAAAICOYLAAAICOcLAAAICOgLAAAICOkLAAAICOoLAAAICOsLAAAICOwLAAAICO0LAAAICO4LAAAICO8LAAAICPALAAAICPELAAAICPILAAAICPMLAAAICPQLAAAICPULAAAICPYLAAAICPcLAAAICPgLAAAICPkLAAAICPoLAAAICPsLAAAICPwLAAAICP0LAAAICP4LAAAICP8LAAAICAAMAAAICAEMAAAICAIMAAAICAMMAAAICAQMAAAICAUMAAAICAYMAAAICAcMAAAICAgMAAAICAkMAAAICAoMAAAICAsMAAAICAwMAAAICA0MAAAICA4MAAAICA8MAAAICBAMAAAICBEMAAAICBIMAAAICBMMAAAICBQMAAAICBUMAAAICBYMAAAICBcMAAAICBgMAAAICBkMAAAICBoMAAAICBsMAAAICBwMAAAICB0MAAAICB4MAAAICB8MAAAICCAMAAAICCEMAAAICCIMAAAICCMMAAAICCQMAAAICCUMAAAICCYMAAAICCcMAAAICCgMAAAICCkMAAAICCoMAAAICCsMAAAICCwMAAAICC0MAAAICC4MAAAICC8MAAAICDAMAAAICDEMAAAICDIMAAAICDMMAAAICDQMAAAICDUMAAAICDYMAAAICDcMAAAICDgMAAAICDkMAAAICDoMAAAICDsMAAAICDwMAAAICD0MAAAICD4MAAAICD8MAAAICEAMAAAICEEMAAAICEIMAAAICEMMAAAICEQMAAAICEUMAAAICEYMAAAICEcMAAAICEgMAAAICEkMAAAICEoMAAAICEsMAAAICEwMAAAICE0MAAAICE4MAAAICE8MAAAICFAMAAAICFEMAAAICFIMAAAICFMMAAAICFQMAAAICFUMAAAICFYMAAAICFcMAAAICFgMAAAICFkMAAAICFoMAAAICFsMAAAICFwMAAAICF0MAAAICF4MAAAICF8MAAAICGAMAAAICGEMAAAICGIMAAAICGMMAAAICGQMAAAICGUMAAAICGYMAAAICGcMAAAICGgMAAAICGkMAAAICGoMAAAICGsMAAAICGwMAAAICG0MAAAICG4MAAAICG8MAAAICHAMAAAICHEMAAAICHIMAAAICHMMAAAICHQMAAAICHUMAAAICHYMAAAICHcMAAAICHgMAAAICHkMAAAICHoMAAAICHsMAAAICHwMAAAICH0MAAAICH4MAAAICH8MAAAICIAMAAAICIEMAAAICIIMAAAICIMMAAAICIQMAAAICIUMAAAICIYMAAAICIcMAAAICIgMAAAICIkMAAAICIoMAAAICIsMAAAICIwMAAAICI0MAAAICI4MAAAICI8MAAAICJAMAAAICJEMAAAICJIMAAAICJMMAAAICJQMAAAICJUMAAAICJYMAAAICJcMAAAICJgMAAAICJkMAAAICJoMAAAICJsMAAAICJwMAAAICJ0MAAAICJ4MAAAICJ8MAAAICKAMAAAICKEMAAAICKIMAAAICKMMAAAICKQMAAAICKUMAAAICKYMAAAICKcMAAAICKgMAAAICKkMAAAICKoMAAAICKsMAAAICKwMAAAICK0MAAAICK4MAAAICK8MAAAICLAMAAAICLEMAAAICLIMAAAICLMMAAAICLQMAAAICLUMAAAICLYMAAAICLcMAAAICLgMAAAICLkMAAAICLoMAAAICLsMAAAICLwMAAAICL0MAAAICL4MAAAICL8MAAAICMAMAAAICMEMAAAICMIMAAAICMMMAAAICMQMAAAICMUMAAAICMYMAAAICMcMAAAICMgMAAAICMkMAAAICMoMAAAICMsMAAAICMwMAAAICM0MAAAICM4MAAAICM8MAAAICNAMAAAICNEMAAAICNIMAAAICNMMAAAICNQMAAAICNUMAAAICNYMAAAICNcMAAAICNgMAAAICNkMAAAICNoMAAAICNsMAAAICNwMAAAICN0MAAAICN4MAAAICN8MAAAICOAMAAAICOEMAAAICOIMAAAICOMMAAAICOQMAAAICOUMAAAICOYMAAAICOcMAAAICOgMAAAICOkMAAAICOoMAAAICOsMAAAICOwMAAAICO0MAAAICO4MAAAICO8MAAAICPAMAAAICPEMAAAICPIMAAAICPMMAAAICPQMAAAICPUMAAAICPYMAAAICPcMAAAICPgMAAAICPkMAAAICPoMAAAICPsMAAAICPwMAAAICP0MAAAICP4MAAAICP8MAAAICAANAAAICAENAAAICAINAAAICAMNAAAICAQNAAAICAUNAAAICAYNAAAICAcNAAAICAgNAAAICAkNAAAICAoNAAAICAsNAAAICAwNAAAICA0NAAAICA4NAAAICA8NAAAICBANAAAICBENAAAICBINAAAICBMNAAAICBQNAAAICBUNAAAICBYNAAAICBcNAAAICBgNAAAICBkNAAAICBoNAAAICBsNAAAICBwNAAAICB0NAAAICB4NAAAICB8NAAAICCANAAAICCENAAAICCINAAAICCMNAAAICCQNAAAICCUNAAAICCYNAAAICCcNAAAICCgNAAAICCkNAAAICCoNAAAICCsNAAAICCwNAAAICC0NAAAICC4NAAAICC8NAAAICDANAAAICDENAAAICDINAAAICDMNAAAICDQNAAAICDUNAAAICDYNAAAICDcNAAAICDgNAAAICDkNAAAICDoNAAAICDsNAAAICDwNAAAICD0NAAAICD4NAAAICD8NAAAICEANAAAICEENAAAICEINAAAICEMNAAAICEQNAAAICEUNAAAICEYNAAAICEcNAAAICEgNAAAICEkNAAAICEoNAAAICEsNAAAICEwNAAAICE0NAAAICE4NAAAICE8NAAAICFANAAAICFENAAAICFINAAAICFMNAAAICFQNAAAICFUNAAAICFYNAAAICFcNAAAICFgNAAAICFkNAAAICFoNAAAICFsNAAAICFwNAAAICF0NAAAICF4NAAAICF8NAAAICGANAAAICGENAAAICGINAAAICGMNAAAICGQNAAAICGUNAAAICGYNAAAICGcNAAAICGgNAAAICGkNAAAICGoNAAAICGsNAAAICGwNAAAICG0NAAAICG4NAAAICG8NAAAICHANAAAICHENAAAICHINAAAICHMNAAAICHQNAAAICHUNAAAICHYNAAAICHcNAAAICHgNAAAICHkNAAAICHoNAAAICHsNAAAICHwNAAAICH0NAAAICH4NAAAICH8NAAAICIANAAAICIENAAAICIINAAAICIMNAAAICIQNAAAICIUNAAAICIYNAAAICIcNAAAICIgNAAAICIkNAAAICIoNAAAICIsNAAAICIwNAAAICI0NAAAICI4NAAAICI8NAAAICJANAAAICJENAAAICJINAAAICJMNAAAICJQNAAAICJUNAAAICJYNAAAICJcNAAAICJgNAAAICJkNAAAICJoNAAAICJsNAAAICJwNAAAICJ0NAAAICJ4NAAAICJ8NAAAICKANAAAICKENAAAICKINAAAICKMNAAAICKQNAAAICKUNAAAICKYNAAAICKcNAAAICKgNAAAICKkNAAAICKoNAAAICKsNAAAICKwNAAAICK0NAAAICK4NAAAICK8NAAAICLANAAAICLENAAAICLINAAAICLMNAAAICLQNAAAICLUNAAAICLYNAAAICLcNAAAICLgNAAAICLkNAAAICLoNAAAICLsNAAAICLwNAAAICL0NAAAICL4NAAAICL8NAAAICMANAAAICMENAAAICMINAAAICMMNAAAICMQNAAAICMUNAAAICMYNAAAICMcNAAAICMgNAAAICMkNAAAICMoNAAAICMsNAAAICMwNAAAICM0NAAAICM4NAAAICM8NAAAICNANAAAICNENAAAICNINAAAICNMNAAAICNQNAAAICNUNAAAICNYNAAAICNcNAAAICNgNAAAICNkNAAAICNoNAAAICNsNAAAICNwNAAAICN0NAAAICN4NAAAICN8NAAAICOANAAAICOENAAAICOINAAAICOMNAAAICOQNAAAICOUNAAAICOYNAAAICOcNAAAICOgNAAAICOkNAAAICOoNAAAICOsNAAAICOwNAAAICO0NAAAICO4NAAAICO8NAAAICPANAAAICPENAAAICPINAAAICPMNAAAICPQNAAAICPUNAAAICPYNAAAICPcNAAAICPgNAAAICPkNAAAICPoNAAAICPsNAAAICPwNAAAICP0NAAAICP4NAAAICP8NAAAICAAOAAAICAEOAAAICAIOAAAICAMOAAAICAQOAAAICAUOAAAICAYOAAAICAcOAAAICAgOAAAICAkOAAAICAoOAAAICAsOAAAICAwOAAAICA0OAAAICA4OAAAICA8OAAAICBAOAAAICBEOAAAICBIOAAAICBMOAAAICBQOAAAICBUOAAAICBYOAAAICBcOAAAICBgOAAAICBkOAAAICBoOAAAICBsOAAAICBwOAAAICB0OAAAICB4OAAAICB8OAAAICCAOAAAICCEOAAAICCIOAAAICCMOAAAICCQOAAAICCUOAAAICCYOAAAICCcOAAAICCgOAAAICCkOAAAICCoOAAAICCsOAAAICCwOAAAICC0OAAAICC4OAAAICC8OAAAICDAOAAAICDEOAAAICDIOAAAICDMOAAAICDQOAAAICDUOAAAICDYOAAAICDcOAAAICDgOAAAICDkOAAAICDoOAAAICDsOAAAICDwOAAAICD0OAAAICD4OAAAICD8OAAAICEAOAAAICEEOAAAICEIOAAAICEMOAAAICEQOAAAICEUOAAAICEYOAAAICEcOAAAICEgOAAAICEkOAAAICEoOAAAICEsOAAAICEwOAAAICE0OAAAICE4OAAAICE8OAAAICFAOAAAICFEOAAAICFIOAAAICFMOAAAICFQOAAAICFUOAAAICFYOAAAICFcOAAAICFgOAAAICFkOAAAICFoOAAAICFsOAAAICFwOAAAICF0OAAAICF4OAAAICF8OAAAICGAOAAAICGEOAAAICGIOAAAICGMOAAAICGQOAAAICGUOAAAICGYOAAAICGcOAAAICGgOAAAICGkOAAAICGoOAAAICGsOAAAICGwOAAAICG0OAAAICG4OAAAICG8OAAAICHAOAAAICHEOAAAICHIOAAAICHMOAAAICHQOAAAICHUOAAAICHYOAAAICHcOAAAICHgOAAAICHkOAAAICHoOAAAICHsOAAAICHwOAAAICH0OAAAICH4OAAAICH8OAAAICIAOAAAICIEOAAAICIIOAAAICIMOAAAICIQOAAAICIUOAAAICIYOAAAICIcOAAAICIgOAAAICIkOAAAICIoOAAAICIsOAAAICIwOAAAICI0OAAAICI4OAAAICI8OAAAICJAOAAAICJEOAAAICJIOAAAICJMOAAAICJQOAAAICJUOAAAICJYOAAAICJcOAAAICJgOAAAICJkOAAAICJoOAAAICJsOAAAICJwOAAAICJ0OAAAICJ4OAAAICJ8OAAAICKAOAAAICKEOAAAICKIOAAAICKMOAAAICKQOAAAICKUOAAAICKYOAAAICKcOAAAICKgOAAAICKkOAAAICKoOAAAICKsOAAAICKwOAAAICK0OAAAICK4OAAAICK8OAAAICLAOAAAICLEOAAAICLIOAAAICLMOAAAICLQOAAAICLUOAAAICLYOAAAICLcOAAAICLgOAAAICLkOAAAICLoOAAAICLsOAAAICLwOAAAICL0OAAAICL4OAAAICL8OAAAICMAOAAAICMEOAAAICMIOAAAICMMOAAAICMQOAAAICMUOAAAICMYOAAAICMcOAAAICMgOAAAICMkOAAAICMoOAAAICMsOAAAICMwOAAAICM0OAAAICM4OAAAICM8OAAAICNAOAAAICNEOAAAICNIOAAAICNMOAAAICNQOAAAICNUOAAAICNYOAAAICNcOAAAICNgOAAAICNkOAAAICNoOAAAICNsOAAAICNwOAAAICN0OAAAICN4OAAAICN8OAAAICOAOAAAICOEOAAAICOIOAAAICOMOAAAICOQOAAAICOUOAAAICOYOAAAICOcOAAAICOgOAAAICOkOAAAICOoOAAAICOsOAAAICOwOAAAICO0OAAAICO4OAAAICO8OAAAICPAOAAAICPEOAAAICPIOAAAICPMOAAAICPQOAAAICPUOAAAICPYOAAAICPcOAAAICPgOAAAICPkOAAAICPoOAAAICPsOAAAICPwOAAAICP0OAAAICP4OAAAICP8OAAAICAAPAAAICAEPAAAICAIPAAAICAMPAAAICAQPAAAICAUPAAAICAYPAAAICAcPAAAICAgPAAAICAkPAAAICAoPAAAICAsPAAAICAwPAAAICA0PAAAICA4PAAAICA8PAAAICBAPAAAICBEPAAAICBIPAAAICBMPAAAICBQPAAAICBUPAAAICBYPAAAICBcPAAAICBgPAAAICBkPAAAICBoPAAAICBsPAAAICBwPAAAICB0PAAAICB4PAAAICB8PAAAICCAPAAAICCEPAAAICCIPAAAICCMPAAAICCQPAAAICCUPAAAICCYPAAAICCcPAAAICCgPAAAICCkPAAAICCoPAAAICCsPAAAICCwPAAAICC0PAAAICC4PAAAICC8PAAAICDAPAAAICDEPAAAICDIPAAAICDMPAAAICDQPAAAICDUPAAAICDYPAAAICDcPAAAICDgPAAAICDkPAAAICDoPAAAICDsPAAAICDwPAAAICD0PAAAICD4PAAAICD8PAAAICEAPAAAICEEPAAAICEIPAAAICEMPAAAICEQPAAAICEUPAAAICEYPAAAICEcPAAAICEgPAAAICEkPAAAICEoPAAAICEsPAAAICEwPAAAICE0PAAAICE4PAAAICE8PAAAICFAPAAAICFEPAAAICFIPAAAICFMPAAAICFQPAAAICFUPAAAICFYPAAAICFcPAAAICFgPAAAICFkPAAAICFoPAAAICFsPAAAICFwPAAAICF0PAAAICF4PAAAICF8PAAAICGAPAAAICGEPAAAICGIPAAAICGMPAAAICGQPAAAICGUPAAAICGYPAAAICGcPAAAICGgPAAAICGkPAAAICGoPAAAICGsPAAAICGwPAAAICG0PAAAICG4PAAAICG8PAAAICHAPAAAICHEPAAAICHIPAAAICHMPAAAICHQPAAAICHUPAAAICHYPAAAICHcPAAAICHgPAAAICHkPAAAICHoPAAAICHsPAAAICHwPAAAICH0PAAAICH4PAAAICH8PAAAICIAPAAAICIEPAAAICIIPAAAICIMPAAAICIQPAAAICIUPAAAICIYPAAAICIcPAAAICIgPAAAICIkPAAAICIoPAAAICIsPAAAICIwPAAAICI0PAAAICI4PAAAICI8PAAAICJAPAAAICJEPAAAICJIPAAAICJMPAAAICJQPAAAICJUPAAAICJYPAAAICJcPAAAICJgPAAAICJkPAAAICJoPAAAICJsPAAAICJwPAAAICJ0PAAAICJ4PAAAICJ8PAAAICKAPAAAICKEPAAAICKIPAAAICKMPAAAICKQPAAAICKUPAAAICKYPAAAICKcPAAAICKgPAAAICKkPAAAICKoPAAAICKsPAAAICKwPAAAICK0PAAAICK4PAAAICK8PAAAICLAPAAAICLEPAAAICLIPAAAICLMPAAAICLQPAAAICLUPAAAICLYPAAAICLcPAAAICLgPAAAICLkPAAAICLoPAAAICLsPAAAICLwPAAAICL0PAAAICL4PAAAICL8PAAAICMAPAAAICMEPAAAICMIPAAAICMMPAAAICMQPAAAICMUPAAAICMYPAAAICMcPAAAICMgPAAAICMkPAAAICMoPAAAICMsPAAAICMwPAAAICM0PAAAICM4PAAAICM8PAAAICNAPAAAICNEPAAAICNIPAAAICNMPAAAICNQPAAAICNUPAAAICNYPAAAICNcPAAAICNgPAAAICNkPAAAICNoPAAAICNsPAAAICNwPAAAICN0PAAAICN4PAAAICN8PAAAICOAPAAAICOEPAAAICOIPAAAICOMPAAAICOQPAAAICOUPAAAICOYPAAAICOcPAAAICOgPAAAICOkPAAAICOoPAAAICOsPAAAICOwPAAAICO0PAAAICO4PAAAICO8PAAAICPAPAAAICPEPAAAICPIPAAAICPMPAAAICPQPAAAICPUPAAAICPYPAAAICPcPAAAICPgPAAAICPkPAAAICPoPAAAICPsPAAAICPwPAAAICP0PAAAICP4PAAAICP8PAAAICAAQAAAICAEQAAAICAIQAAAICAMQAAAICAQQAAAICAUQAAAICAYQAAAICAcQAAAICAgQAAAICAkQAAAICAoQAAAICAsQAAAICAwQAAAICA0QAAAICA4QAAAICA8QAAAICBAQAAAICBEQAAAICBIQAAAICBMQAAAICBQQAAAICBUQAAAICBYQAAAICBcQAAAICBgQAAAICBkQAAAICBoQAAAICBsQAAAICBwQAAAICB0QAAAICB4QAAAICB8QAAAICCAQAAAICCEQAAAICCIQAAAICCMQAAAICCQQAAAICCUQAAAICCYQAAAICCcQAAAICCgQAAAICCkQAAAICCoQAAAICCsQAAAICCwQAAAICC0QAAAICC4QAAAICC8QAAAICDAQAAAICDEQAAAICDIQAAAICDMQAAAICDQQAAAICDUQAAAICDYQAAAICDcQAAAICDgQAAAICDkQAAAICDoQAAAICDsQAAAICDwQAAAICD0QAAAICD4QAAAICD8QAAAICEAQAAAICEEQAAAICEIQAAAICEMQAAAICEQQAAAICEUQAAAICEYQAAAICEcQAAAICEgQAAAICEkQAAAICEoQAAAICEsQAAAICEwQAAAICE0QAAAICE4QAAAICE8QAAAICFAQAAAICFEQAAAICFIQAAAICFMQAAAICFQQAAAICFUQAAAICFYQAAAICFcQAAAICFgQAAAICFkQAAAICFoQAAAICFsQAAAICFwQAAAICF0QAAAICF4QAAAICF8QAAAICGAQAAAICGEQAAAICGIQAAAICGMQAAAICGQQAAAICGUQAAAICGYQAAAICGcQAAAICGgQAAAICGkQAAAICGoQAAAICGsQAAAICGwQAAAICG0QAAAICG4QAAAICG8QAAAICHAQAAAICHEQAAAICHIQAAAICHMQAAAICHQQAAAICHUQAAAICHYQAAAICHcQAAAICHgQAAAICHkQAAAICHoQAAAICHsQAAAICHwQAAAICH0QAAAICH4QAAAICH8QAAAICIAQAAAICIEQAAAICIIQAAAICIMQAAAICIQQAAAICIUQAAAICIYQAAAICIcQAAAICIgQAAAICIkQAAAICIoQAAAICIsQAAAICIwQAAAICI0QAAAICI4QAAAICI8QAAAICJAQAAAICJEQAAAICJIQAAAICJMQAAAICJQQAAAICJUQAAAICJYQAAAICJcQAAAICJgQAAAICJkQAAAICJoQAAAICJsQAAAICJwQAAAICJ0QAAAICJ4QAAAICJ8QAAAICKAQAAAICKEQAAAICKIQAAAICKMQAAAICKQQAAAICKUQAAAICKYQAAAICKcQAAAICKgQAAAICKkQAAAICKoQAAAICKsQAAAICKwQAAAICK0QAAAICK4QAAAICK8QAAAICLAQAAAICLEQAAAICLIQAAAICLMQAAAICLQQAAAICLUQAAAICLYQAAAICLcQAAAICLgQAAAICLkQAAAICLoQAAAICLsQAAAICLwQAAAICL0QAAAICL4QAAAICL8QAAAICMAQAAAICMEQAAAICMIQAAAICMMQAAAICMQQAAAICMUQAAAICMYQAAAICMcQAAAICMgQAAAICMkQAAAICMoQAAAICMsQAAAICMwQAAAICM0QAAAICM4QAAAICM8QAAAICNAQAAAICNEQAAAICNIQAAAICNMQAAAICNQQAAAICNUQAAAICNYQAAAICNcQAAAICNgQAAAICNkQAAAICNoQAAAICNsQAAAICNwQAAAICN0QAAAICN4QAAAICN8QAAAICOAQAAAICOEQAAAICOIQAAAICOMQAAAICOQQAAAICOUQAAAICOYQAAAICOcQAAAICOgQAAAICOkQAAAICOoQAAAICOsQAAAICOwQAAAICO0QAAAICO4QAAAICO8QAAAICPAQAAAICPEQAAAICPIQAAAICPMQAAAICPQQAAAICPUQAAAICPYQAAAICPcQAAAICPgQAAAICPkQAAAICPoQAAAICPsQAAAICPwQAAAICP0QAAAICP4QAAAICP8QAAAICAARAAAICAERAAAICAIRAAAICAMRAAAICAQRAAAICAURAAAICAYRAAAICAcRAAAICAgRAAAICAkRAAAICAoRAAAICAsRAAAICAwRAAAICA0RAAAICA4RAAAICA8RAAAICBARAAAICBERAAAICBIRAAAICBMRAAAICBQRAAAICBURAAAICBYRAAAICBcRAAAICBgRAAAICBkRAAAICBoRAAAICBsRAAAICBwRAAAICB0RAAAICB4RAAAICB8RAAAICCARAAAICCERAAAICCIRAAAICCMRAAAICCQRAAAICCURAAAICCYRAAAICCcRAAAICCgRAAAICCkRAAAICCoRAAAICCsRAAAICCwRAAAICC0RAAAICC4RAAAICC8RAAAICDARAAAICDERAAAICDIRAAAICDMRAAAICDQRAAAICDURAAAICDYRAAAICDcRAAAICDgRAAAICDkRAAAICDoRAAAICDsRAAAICDwRAAAICD0RAAAICD4RAAAICD8RAAAICEARAAAICEERAAAICEIRAAAICEMRAAAICEQRAAAICEURAAAICEYRAAAICEcRAAAICEgRAAAICEkRAAAICEoRAAAICEsRAAAICEwRAAAICE0RAAAICE4RAAAICE8RAAAICFARAAAICFERAAAICFIRAAAICFMRAAAICFQRAAAICFURAAAICFYRAAAICFcRAAAICFgRAAAICFkRAAAICFoRAAAICFsRAAAICFwRAAAICF0RAAAICF4RAAAICF8RAAAICGARAAAICGERAAAICGIRAAAICGMRAAAICGQRAAAICGURAAAICGYRAAAICGcRAAAICGgRAAAICGkRAAAICGoRAAAICGsRAAAICGwRAAAICG0RAAAICG4RAAAICG8RAAAICHARAAAICHERAAAICHIRAAAICHMRAAAICHQRAAAICHURAAAICHYRAAAICHcRAAAICHgRAAAICHkRAAAICHoRAAAICHsRAAAICHwRAAAICH0RAAAICH4RAAAICH8RAAAICIARAAAICIERAAAICIIRAAAICIMRAAAICIQRAAAICIURAAAICIYRAAAICIcRAAAICIgRAAAICIkRAAAICIoRAAAICIsRAAAICIwRAAAICI0RAAAICI4RAAAICI8RAAAICJARAAAICJERAAAICJIRAAAICJMRAAAICJQRAAAICJURAAAICJYRAAAICJcRAAAICJgRAAAICJkRAAAICJoRAAAICJsRAAAICJwRAAAICJ0RAAAICJ4RAAAICJ8RAAAICKARAAAICKERAAAICKIRAAAICKMRAAAICKQRAAAICKURAAAICKYRAAAICKcRAAAICKgRAAAICKkRAAAICKoRAAAICKsRAAAICKwRAAAICK0RAAAICK4RAAAICK8RAAAICLARAAAICLERAAAICLIRAAAICLMRAAAICLQRAAAICLURAAAICLYRAAAICLcRAAAICLgRAAAICLkRAAAICLoRAAAICLsRAAAICLwRAAAICL0RAAAICL4RAAAICL8RAAAICMARAAAICMERAAAICMIRAAAICMMRAAAICMQRAAAICMURAAAICMYRAAAICMcRAAAICMgRAAAICMkRAAAICMoRAAAICMsRAAAICMwRAAAICM0RAAAICM4RAAAICM8RAAAICNARAAAICNERAAAICNIRAAAICNMRAAAICNQRAAAICNURAAAICNYRAAAICNcRAAAICNgRAAAICNkRAAAICNoRAAAICNsRAAAICNwRAAAICN0RAAAICN4RAAAICN8RAAAICOARAAAICOERAAAICOIRAAAICOMRAAAICOQRAAAICOURAAAICOYRAAAICOcRAAAICOgRAAAICOkRAAAICOoRAAAICOsRAAAICOwRAAAICO0RAAAICO4RAAAICO8RAAAICPARAAAICPERAAAICPIRAAAICPMRAAAICPQRAAAICPURAAAICPYRAAAICPcRAAAICPgRAAAICPkRAAAICPoRAAAICPsRAAAICPwRAAAICP0RAAAICP4RAAAICP8RAAAICAASAAAICAESAAAICAISAAAICAMSAAAICAQSAAAICAUSAAAICAYSAAAICAcSAAAICAgSAAAICAkSAAAICAoSAAAICAsSAAAICAwSAAAICA0SAAAICA4SAAAICA8SAAAICBASAAAICBESAAAICBISAAAICBMSAAAICBQSAAAICBUSAAAICBYSAAAICBcSAAAICBgSAAAICBkSAAAICBoSAAAICBsSAAAICBwSAAAICB0SAAAICB4SAAAICB8SAAAICCASAAAICCESAAAICCISAAAICCMSAAAICCQSAAAICCUSAAAICCYSAAAICCcSAAAICCgSAAAICCkSAAAICCoSAAAICCsSAAAICCwSAAAICC0SAAAICC4SAAAICC8SAAAICDASAAAICDESAAAICDISAAAICDMSAAAICDQSAAAICDUSAAAICDYSAAAICDcSAAAICDgSAAAICDkSAAAICDoSAAAICDsSAAAICDwSAAAICD0SAAAICD4SAAAICD8SAAAICEASAAAICEESAAAICEISAAAICEMSAAAICEQSAAAICEUSAAAICEYSAAAICEcSAAAICEgSAAAICEkSAAAICEoSAAAICEsSAAAICEwSAAAICE0SAAAICE4SAAAICE8SAAAICFASAAAICFESAAAICFISAAAICFMSAAAICFQSAAAICFUSAAAICFYSAAAICFcSAAAICFgSAAAICFkSAAAICFoSAAAICFsSAAAICFwSAAAICF0SAAAICF4SAAAICF8SAAAICGASAAAICGESAAAICGISAAAICGMSAAAICGQSAAAICGUSAAAICGYSAAAICGcSAAAICGgSAAAICGkSAAAICGoSAAAICGsSAAAICGwSAAAICG0SAAAICG4SAAAICG8SAAAICHASAAAICHESAAAICHISAAAICHMSAAAICHQSAAAICHUSAAAICHYSAAAICHcSAAAICHgSAAAICHkSAAAICHoSAAAICHsSAAAICHwSAAAICH0SAAAICH4SAAAICH8SAAAICIASAAAICIESAAAICIISAAAICIMSAAAICIQSAAAICIUSAAAICIYSAAAICIcSAAAICIgSAAAICIkSAAAICIoSAAAICIsSAAAICIwSAAAICI0SAAAICI4SAAAICI8SAAAICJASAAAICJESAAAICJISAAAICJMSAAAICJQSAAAICJUSAAAICJYSAAAICJcSAAAICJgSAAAICJkSAAAICJoSAAAICJsSAAAICJwSAAAICJ0SAAAICJ4SAAAICJ8SAAAICKASAAAICKESAAAICKISAAAICKMSAAAICKQSAAAICKUSAAAICKYSAAAICKcSAAAICKgSAAAICKkSAAAICKoSAAAICKsSAAAICKwSAAAICK0SAAAICK4SAAAICK8SAAAICLASAAAICLESAAAICLISAAAICLMSAAAICLQSAAAICLUSAAAICLYSAAAICLcSAAAICLgSAAAICLkSAAAICLoSAAAICLsSAAAICLwSAAAICL0SAAAICL4SAAAICL8SAAAICMASAAAICMESAAAICMISAAAICMMSAAAICMQSAAAICMUSAAAICMYSAAAICMcSAAAICMgSAAAICMkSAAAICMoSAAAICMsSAAAICMwSAAAICM0SAAAICM4SAAAICM8SAAAICNASAAAICNESAAAICNISAAAICNMSAAAICNQSAAAICNUSAAAICNYSAAAICNcSAAAICNgSAAAICNkSAAAICNoSAAAICNsSAAAICNwSAAAICN0SAAAICN4SAAAICN8SAAAICOASAAAICOESAAAICOISAAAICOMSAAAICOQSAAAICOUSAAAICOYSAAAICOcSAAAICOgSAAAICOkSAAAICOoSAAAICOsSAAAICOwSAAAICO0SAAAICO4SAAAICO8SAAAICPASAAAICPESAAAICPISAAAICPMSAAAICPQSAAAICPUSAAAICPYSAAAICPcSAAAICPgSAAAICPkSAAAICPoSAAAICPsSAAAICPwSAAAICP0SAAAICP4SAAAICP8SAAAICAATAAAICAETAAAICAITAAAICAMTAAAICAQTAAAICAUTAAAICAYTAAAICAcTAAAICAgTAAAICAkTAAAICAoTAAAICAsTAAAICAwTAAAICA0TAAAICA4TAAAICA8TAAAICBATAAAICBETAAAICBITAAAICBMTAAAICBQTAAAICBUTAAAICBYTAAAICBcTAAAICBgTAAAICBkTAAAICBoTAAAICBsTAAAICBwTAAAICB0TAAAICB4TAAAICB8TAAAICCATAAAICCETAAAICCITAAAICCMTAAAICCQTAAAICCUTAAAICCYTAAAICCcTAAAICCgTAAAICCkTAAAICCoTAAAICCsTAAAICCwTAAAICC0TAAAICC4TAAAICC8TAAAICDATAAAICDETAAAICDITAAAICDMTAAAICDQTAAAICDUTAAAICDYTAAAICDcTAAAICDgTAAAICDkTAAAICDoTAAAICDsTAAAICDwTAAAICD0TAAAICD4TAAAICD8TAAAICEATAAAICEETAAAICEITAAAICEMTAAAICEQTAAAICEUTAAAICEYTAAAICEcTAAAICEgTAAAICEkTAAAICEoTAAAICEsTAAAICEwTAAAICE0TAAAICE4TAAAICE8TAAAICFATAAAICFETAAAICFITAAAICFMTAAAICFQTAAAICFUTAAAICFYTAAAICFcTAAAICFgTAAAICFkTAAAICFoTAAAICFsTAAAICFwTAAAICF0TAAAICF4TAAAICF8TAAAICGATAAAICGETAAAICGITAAAICGMTAAAICGQTAAAICGUTAAAICGYTAAAICGcTAAAICGgTAAAICGkTAAAICGoTAAAICGsTAAAICGwTAAAICG0TAAAICG4TAAAICG8TAAAICHATAAAICHETAAAICHITAAAICHMTAAAICHQTAAAICHUTAAAICHYTAAAICHcTAAAICHgTAAAICHkTAAAICHoTAAAICHsTAAAICHwTAAAICH0TAAAICH4TAAAICH8TAAAICIATAAAICIETAAAICIITAAAICIMTAAAICIQTAAAICIUTAAAICIYTAAAICIcTAAAICIgTAAAICIkTAAAICIoTAAAICIsTAAAICIwTAAAICI0TAAAICI4TAAAICI8TAAAICJATAAAICJETAAAICJITAAAICJMTAAAICJQTAAAICJUTAAAICJYTAAAICJcTAAAICJgTAAAICJkTAAAICJoTAAAICJsTAAAICJwTAAAICJ0TAAAICJ4TAAAICJ8TAAAICKATAAAICKETAAAICKITAAAICKMTAAAICKQTAAAICKUTAAAICKYTAAAICKcTAAAICKgTAAAICKkTAAAICKoTAAAICKsTAAAICKwTAAAICK0TAAAICK4TAAAICK8TAAAICLATAAAICLETAAAICLITAAAICLMTAAAICLQTAAAICLUTAAAICLYTAAAICLcTAAAICLgTAAAICLkTAAAICLoTAAAICLsTAAAICLwTAAAICL0TAAAICL4TAAAICL8TAAAICMATAAAICMETAAAICMITAAAICMMTAAAICMQTAAAICMUTAAAICMYTAAAICMcTAAAICMgTAAAICMkTAAAICMoTAAAICMsTAAAICMwTAAAICM0TAAAICM4TAAAICM8TAAAICNATAAAICNETAAAICNITAAAICNMTAAAICNQTAAAICNUTAAAICNYTAAAICNcTAAAICNgTAAAICNkTAAAICNoTAAAICNsTAAAICNwTAAAICN0TAAAICN4TAAAICN8TAAAICOATAAAICOETAAAICOITAAAICOMTAAAICOQTAAAICOUTAAAICOYTAAAICOcTAAAICOgTAAAICOkTAAAICOoTAAAICOsTAAAICOwTAAAICO0TAAAICO4TAAAICO8TAAAICPATAAAICPETAAAICPITAAAICPMTAAAICPQTAAAICPUTAAAICPYTAAAICPcTAAAICPgTAAAICPkTAAAICPoTAAAICPsTAAAICPwTAAAICP0TAAAICP4TAAAICP8TAAAICAAUAAAICAEUAAAICAIUAAAICAMUAAAICAQUAAAICAUUAAAICAYUAAAICAcUAAAICAgUAAAICAkUAAAICAoUAAAICAsUAAAICAwUAAAICA0UAAAICA4UAAAICA8UAAAICBAUAAAICBEUAAAICBIUAAAICBMUAAAICBQUAAAICBUUAAAICBYUAAAICBcUAAAICBgUAAAICBkUAAAICBoUAAAICBsUAAAICBwUAAAICB0UAAAICB4UAAAICB8UAAAICCAUAAAICCEUAAAICCIUAAAICCMUAAAICCQUAAAICCUUAAAICCYUAAAICCcUAAAICCgUAAAICCkUAAAICCoUAAAICCsUAAAICCwUAAAICC0UAAAICC4UAAAICC8UAAAICDAUAAAICDEUAAAICDIUAAAICDMUAAAICDQUAAAICDUUAAAICDYUAAAICDcUAAAICDgUAAAICDkUAAAICDoUAAAICDsUAAAICDwUAAAICD0UAAAICD4UAAAICD8UAAAICEAUAAAICEEUAAAICEIUAAAICEMUAAAICEQUAAAICEUUAAAICEYUAAAICEcUAAAICEgUAAAICEkUAAAICEoUAAAICEsUAAAICEwUAAAICE0UAAAICE4UAAAICE8UAAAICFAUAAAICFEUAAAICFIUAAAICFMUAAAICFQUAAAICFUUAAAICFYUAAAICFcUAAAICFgUAAAICFkUAAAICFoUAAAICFsUAAAICFwUAAAICF0UAAAICF4UAAAICF8UAAAICGAUAAAICGEUAAAICGIUAAAICGMUAAAICGQUAAAICGUUAAAICGYUAAAICGcUAAAICGgUAAAICGkUAAAICGoUAAAICGsUAAAICGwUAAAICG0UAAAICG4UAAAICG8UAAAICHAUAAAICHEUAAAICHIUAAAICHMUAAAICHQUAAAICHUUAAAICHYUAAAICHcUAAAICHgUAAAICHkUAAAICHoUAAAICHsUAAAICHwUAAAICH0UAAAICH4UAAAICH8UAAAICIAUAAAICIEUAAAICIIUAAAICIMUAAAICIQUAAAICIUUAAAICIYUAAAICIcUAAAICIgUAAAICIkUAAAICIoUAAAICIsUAAAICIwUAAAICI0UAAAICI4UAAAICI8UAAAICJAUAAAICJEUAAAICJIUAAAICJMUAAAICJQUAAAICJUUAAAICJYUAAAICJcUAAAICJgUAAAICJkUAAAICJoUAAAICJsUAAAICJwUAAAICJ0UAAAICJ4UAAAICJ8UAAAICKAUAAAICKEUAAAICKIUAAAICKMUAAAICKQUAAAICKUUAAAICKYUAAAICKcUAAAICKgUAAAICKkUAAAICKoUAAAICKsUAAAICKwUAAAICK0UAAAICK4UAAAICK8UAAAICLAUAAAICLEUAAAICLIUAAAICLMUAAAICLQUAAAICLUUAAAICLYUAAAICLcUAAAICLgUAAAICLkUAAAICLoUAAAICLsUAAAICLwUAAAICL0UAAAICL4UAAAICL8UAAAICMAUAAAICMEUAAAICMIUAAAICMMUAAAICMQUAAAICMUUAAAICMYUAAAICMcUAAAICMgUAAAICMkUAAAICMoUAAAICMsUAAAICMwUAAAICM0UAAAICM4UAAAICM8UAAAICNAUAAAICNEUAAAICNIUAAAICNMUAAAICNQUAAAICNUUAAAICNYUAAAICNcUAAAICNgUAAAICNkUAAAICNoUAAAICNsUAAAICNwUAAAICN0UAAAICN4UAAAICN8UAAAICOAUAAAICOEUAAAICOIUAAAICOMUAAAICOQUAAAICOUUAAAICOYUAAAICOcUAAAICOgUAAAICOkUAAAICOoUAAAICOsUAAAICOwUAAAICO0UAAAICO4UAAAICO8UAAAICPAUAAAICPEUAAAICPIUAAAICPMUAAAICPQUAAAICPUUAAAICPYUAAAICPcUAAAICPgUAAAICPkUAAAICPoUAAAICPsUAAAICPwUAAAICP0UAAAICP4UAAAICP8UAAAICAAVAAAICAEVAAAICAIVAAAICAMVAAAICAQVAAAICAUVAAAICAYVAAAICAcVAAAICAgVAAAICAkVAAAICAoVAAAICAsVAAAICAwVAAAICA0VAAAICA4VAAAICA8VAAAICBAVAAAICBEVAAAICBIVAAAICBMVAAAICBQVAAAICBUVAAAICBYVAAAICBcVAAAICBgVAAAICBkVAAAICBoVAAAICBsVAAAICBwVAAAICB0VAAAICB4VAAAICB8VAAAICCAVAAAICCEVAAAICCIVAAAICCMVAAAICCQVAAAICCUVAAAICCYVAAAICCcVAAAICCgVAAAICCkVAAAICCoVAAAICCsVAAAICCwVAAAICC0VAAAICC4VAAAICC8VAAAICDAVAAAICDEVAAAICDIVAAAICDMVAAAICDQVAAAICDUVAAAICDYVAAAICDcVAAAICDgVAAAICDkVAAAICDoVAAAICDsVAAAICDwVAAAICD0VAAAICD4VAAAICD8VAAAICEAVAAAICEEVAAAICEIVAAAICEMVAAAICEQVAAAICEUVAAAICEYVAAAICEcVAAAICEgVAAAICEkVAAAICEoVAAAICEsVAAAICEwVAAAICE0VAAAICE4VAAAICE8VAAAICFAVAAAICFEVAAAICFIVAAAICFMVAAAICFQVAAAICFUVAAAICFYVAAAICFcVAAAICFgVAAAICFkVAAAICFoVAAAICFsVAAAICFwVAAAICF0VAAAICF4VAAAICF8VAAAICGAVAAAICGEVAAAICGIVAAAICGMVAAAICGQVAAAICGUVAAAICGYVAAAICGcVAAAICGgVAAAICGkVAAAICGoVAAAICGsVAAAICGwVAAAICG0VAAAICG4VAAAICG8VAAAICHAVAAAICHEVAAAICHIVAAAICHMVAAAICHQVAAAICHUVAAAICHYVAAAICHcVAAAICHgVAAAICHkVAAAICHoVAAAICHsVAAAICHwVAAAICH0VAAAICH4VAAAICH8VAAAICIAVAAAICIEVAAAICIIVAAAICIMVAAAICIQVAAAICIUVAAAICIYVAAAICIcVAAAICIgVAAAICIkVAAAICIoVAAAICIsVAAAICIwVAAAICI0VAAAICI4VAAAICI8VAAAICJAVAAAICJEVAAAICJIVAAAICJMVAAAICJQVAAAICJUVAAAICJYVAAAICJcVAAAICJgVAAAICJkVAAAICJoVAAAICJsVAAAICJwVAAAICJ0VAAAICJ4VAAAICJ8VAAAICKAVAAAICKEVAAAICKIVAAAICKMVAAAICKQVAAAICKUVAAAICKYVAAAICKcVAAAICKgVAAAICKkVAAAICKoVAAAICKsVAAAICKwVAAAICK0VAAAICK4VAAAICK8VAAAICLAVAAAICLEVAAAICLIVAAAICLMVAAAICLQVAAAICLUVAAAICLYVAAAICLcVAAAICLgVAAAICLkVAAAICLoVAAAICLsVAAAICLwVAAAICL0VAAAICL4VAAAICL8VAAAICMAVAAAICMEVAAAICMIVAAAICMMVAAAICMQVAAAICMUVAAAICMYVAAAICMcVAAAICMgVAAAICMkVAAAICMoVAAAICMsVAAAICMwVAAAICM0VAAAICM4VAAAICM8VAAAICNAVAAAICNEVAAAICNIVAAAICNMVAAAICNQVAAAICNUVAAAICNYVAAAICNcVAAAICNgVAAAICNkVAAAICNoVAAAICNsVAAAICNwVAAAICN0VAAAICN4VAAAICN8VAAAICOAVAAAICOEVAAAICOIVAAAICOMVAAAICOQVAAAICOUVAAAICOYVAAAICOcVAAAICOgVAAAICOkVAAAICOoVAAAICOsVAAAICOwVAAAICO0VAAAICO4VAAAICO8VAAAICPAVAAAICPEVAAAICPIVAAAICPMVAAAICPQVAAAICPUVAAAICPYVAAAICPcVAAAICPgVAAAICPkVAAAICPoVAAAICPsVAAAICPwVAAAICP0VAAAICP4VAAAICP8VAAAICAAWAAAICAEWAAAICAIWAAAICAMWAAAICAQWAAAICAUWAAAICAYWAAAICAcWAAAICAgWAAAICAkWAAAICAoWAAAICAsWAAAICAwWAAAICA0WAAAICA4WAAAICA8WAAAICBAWAAAICBEWAAAICBIWAAAICBMWAAAICBQWAAAICBUWAAAICBYWAAAICBcWAAAICBgWAAAICBkWAAAICBoWAAAICBsWAAAICBwWAAAICB0WAAAICB4WAAAICB8WAAAICCAWAAAICCEWAAAICCIWAAAICCMWAAAICCQWAAAICCUWAAAICCYWAAAICCcWAAAICCgWAAAICCkWAAAICCoWAAAICCsWAAAICCwWAAAICC0WAAAICC4WAAAICC8WAAAICDAWAAAICDEWAAAICDIWAAAICDMWAAAICDQWAAAICDUWAAAICDYWAAAICDcWAAAICDgWAAAICDkWAAAICDoWAAAICDsWAAAICDwWAAAICD0WAAAICD4WAAAICD8WAAAICEAWAAAICEEWAAAICEIWAAAICEMWAAAICEQWAAAICEUWAAAICEYWAAAICEcWAAAICEgWAAAICEkWAAAICEoWAAAICEsWAAAICEwWAAAICE0WAAAICE4WAAAICE8WAAAICFAWAAAICFEWAAAICFIWAAAICFMWAAAICFQWAAAICFUWAAAICFYWAAAICFcWAAAICFgWAAAICFkWAAAICFoWAAAICFsWAAAICFwWAAAICF0WAAAICF4WAAAICF8WAAAICGAWAAAICGEWAAAICGIWAAAICGMWAAAICGQWAAAICGUWAAAICGYWAAAICGcWAAAICGgWAAAICGkWAAAICGoWAAAICGsWAAAICGwWAAAICG0WAAAICG4WAAAICG8WAAAICHAWAAAICHEWAAAICHIWAAAICHMWAAAICHQWAAAICHUWAAAICHYWAAAICHcWAAAICHgWAAAICHkWAAAICHoWAAAICHsWAAAICHwWAAAICH0WAAAICH4WAAAICH8WAAAICIAWAAAICIEWAAAICIIWAAAICIMWAAAICIQWAAAICIUWAAAICIYWAAAICIcWAAAICIgWAAAICIkWAAAICIoWAAAICIsWAAAICIwWAAAICI0WAAAICI4WAAAICI8WAAAICJAWAAAICJEWAAAICJIWAAAICJMWAAAICJQWAAAICJUWAAAICJYWAAAICJcWAAAICJgWAAAICJkWAAAICJoWAAAICJsWAAAICJwWAAAICJ0WAAAICJ4WAAAICJ8WAAAICKAWAAAICKEWAAAICKIWAAAICKMWAAAICKQWAAAICKUWAAAICKYWAAAICKcWAAAICKgWAAAICKkWAAAICKoWAAAICKsWAAAICKwWAAAICK0WAAAICK4WAAAICK8WAAAICLAWAAAICLEWAAAICLIWAAAICLMWAAAICLQWAAAICLUWAAAICLYWAAAICLcWAAAICLgWAAAICLkWAAAICLoWAAAICLsWAAAICLwWAAAICL0WAAAICL4WAAAICL8WAAAICMAWAAAICMEWAAAICMIWAAAICMMWAAAICMQWAAAICMUWAAAICMYWAAAICMcWAAAICMgWAAAICMkWAAAICMoWAAAICMsWAAAICMwWAAAICM0WAAAICM4WAAAICM8WAAAICNAWAAAICNEWAAAICNIWAAAICNMWAAAICNQWAAAICNUWAAAICNYWAAAICNcWAAAICNgWAAAICNkWAAAICNoWAAAICNsWAAAICNwWAAAICN0WAAAICN4WAAAICN8WAAAICOAWAAAICOEWAAAICOIWAAAICOMWAAAICOQWAAAICOUWAAAICOYWAAAICOcWAAAICOgWAAAICOkWAAAICOoWAAAICOsWAAAICOwWAAAICO0WAAAICO4WAAAICO8WAAAICPAWAAAICPEWAAAICPIWAAAICPMWAAAICPQWAAAICPUWAAAICPYWAAAICPcWAAAICPgWAAAICPkWAAAICPoWAAAICPsWAAAICPwWAAAICP0WAAAICP4WAAAICP8WAAAICAAXAAAICAEXAAAICAIXAAAICAMXAAAICAQXAAAICAUXAAAICAYXAAAICAcXAAAICAgXAAAICAkXAAAICAoXAAAICAsXAAAICAwXAAAICA0XAAAICA4XAAAICA8XAAAICBAXAAAICBEXAAAICBIXAAAICBMXAAAICBQXAAAICBUXAAAICBYXAAAICBcXAAAICBgXAAAICBkXAAAICBoXAAAICBsXAAAICBwXAAAICB0XAAAICB4XAAAICB8XAAAICCAXAAAICCEXAAAICCIXAAAICCMXAAAICCQXAAAICCUXAAAICCYXAAAICCcXAAAICCgXAAAICCkXAAAICCoXAAAICCsXAAAICCwXAAAICC0XAAAICC4XAAAICC8XAAAICDAXAAAICDEXAAAICDIXAAAICDMXAAAICDQXAAAICDUXAAAICDYXAAAICDcXAAAICDgXAAAICDkXAAAICDoXAAAICDsXAAAICDwXAAAICD0XAAAICD4XAAAICD8XAAAICEAXAAAICEEXAAAICEIXAAAICEMXAAAICEQXAAAICEUXAAAICEYXAAAICEcXAAAICEgXAAAICEkXAAAICEoXAAAICEsXAAAICEwXAAAICE0XAAAICE4XAAAICE8XAAAICFAXAAAICFEXAAAICFIXAAAICFMXAAAICFQXAAAICFUXAAAICFYXAAAICFcXAAAICFgXAAAICFkXAAAICFoXAAAICFsXAAAICFwXAAAICF0XAAAICF4XAAAICF8XAAAICGAXAAAICGEXAAAICGIXAAAICGMXAAAICGQXAAAICGUXAAAICGYXAAAICGcXAAAICGgXAAAICGkXAAAICGoXAAAICGsXAAAICGwXAAAICG0XAAAICG4XAAAICG8XAAAICHAXAAAICHEXAAAICHIXAAAICHMXAAAICHQXAAAICHUXAAAICHYXAAAICHcXAAAICHgXAAAICHkXAAAICHoXAAAICHsXAAAICHwXAAAICH0XAAAICH4XAAAICH8XAAAICIAXAAAICIEXAAAICIIXAAAICIMXAAAICIQXAAAICIUXAAAICIYXAAAICIcXAAAICIgXAAAICIkXAAAICIoXAAAICIsXAAAICIwXAAAICI0XAAAICI4XAAAICI8XAAAICJAXAAAICJEXAAAICJIXAAAICJMXAAAICJQXAAAICJUXAAAICJYXAAAICJcXAAAICJgXAAAICJkXAAAICJoXAAAICJsXAAAICJwXAAAICJ0XAAAICJ4XAAAICJ8XAAAICKAXAAAICKEXAAAICKIXAAAICKMXAAAICKQXAAAICKUXAAAICKYXAAAICKcXAAAICKgXAAAICKkXAAAICKoXAAAICKsXAAAICKwXAAAICK0XAAAICK4XAAAICK8XAAAICLAXAAAICLEXAAAICLIXAAAICLMXAAAICLQXAAAICLUXAAAICLYXAAAICLcXAAAICLgXAAAICLkXAAAICLoXAAAICLsXAAAICLwXAAAICL0XAAAICL4XAAAICL8XAAAICMAXAAAICMEXAAAICMIXAAAICMMXAAAICMQXAAAICMUXAAAICMYXAAAICMcXAAAICMgXAAAICMkXAAAICMoXAAAICMsXAAAICMwXAAAICM0XAAAICM4XAAAICM8XAAAICNAXAAAICNEXAAAICNIXAAAICNMXAAAICNQXAAAICNUXAAAICNYXAAAICNcXAAAICNgXAAAICNkXAAAICNoXAAAICNsXAAAICNwXAAAICN0XAAAICN4XAAAICN8XAAAICOAXAAAICOEXAAAICOIXAAAICOMXAAAICOQXAAAICOUXAAAICOYXAAAICOcXAAAICOgXAAAICOkXAAAICOoXAAAICOsXAAAICOwXAAAICO0XAAAICO4XAAAICO8XAAAICPAXAAAICPEXAAAICPIXAAAICPMXAAAICPQXAAAICPUXAAAICPYXAAAICPcXAAAICPgXAAAICPkXAAAICPoXAAAICPsXAAAICPwXAAAICP0XAAAICP4XAAAICP8XAAAICAAYAAAICAEYAAAICAIYAAAICAMYAAAICAQYAAAICAUYAAAICAYYAAAICAcYAAAICAgYAAAICAkYAAAICAoYAAAICAsYAAAICAwYAAAICA0YAAAICA4YAAAICA8YAAAICBAYAAAICBEYAAAICBIYAAAICBMYAAAICBQYAAAICBUYAAAICBYYAAAICBcYAAAICBgYAAAICBkYAAAICBoYAAAICBsYAAAICBwYAAAICB0YAAAICB4YAAAICB8YAAAICCAYAAAICCEYAAAICCIYAAAICCMYAAAICCQYAAAICCUYAAAICCYYAAAICCcYAAAICCgYAAAICCkYAAAICCoYAAAICCsYAAAICCwYAAAICC0YAAAICC4YAAAICC8YAAAICDAYAAAICDEYAAAICDIYAAAICDMYAAAICDQYAAAICDUYAAAICDYYAAAICDcYAAAICDgYAAAICDkYAAAICDoYAAAICDsYAAAICDwYAAAICD0YAAAICD4YAAAICD8YAAAICEAYAAAICEEYAAAICEIYAAAICEMYAAAICEQYAAAICEUYAAAICEYYAAAICEcYAAAICEgYAAAICEkYAAAICEoYAAAICEsYAAAICEwYAAAICE0YAAAICE4YAAAICE8YAAAICFAYAAAICFEYAAAICFIYAAAICFMYAAAICFQYAAAICFUYAAAICFYYAAAICFcYAAAICFgYAAAICFkYAAAICFoYAAAICFsYAAAICFwYAAAICF0YAAAICF4YAAAICF8YAAAICGAYAAAICGEYAAAICGIYAAAICGMYAAAICGQYAAAICGUYAAAICGYYAAAICGcYAAAICGgYAAAICGkYAAAICGoYAAAICGsYAAAICGwYAAAICG0YAAAICG4YAAAICG8YAAAICHAYAAAICHEYAAAICHIYAAAICHMYAAAICHQYAAAICHUYAAAICHYYAAAICHcYAAAICHgYAAAICHkYAAAICHoYAAAICHsYAAAICHwYAAAICH0YAAAICH4YAAAICH8YAAAICIAYAAAICIEYAAAICIIYAAAICIMYAAAICIQYAAAICIUYAAAICIYYAAAICIcYAAAICIgYAAAICIkYAAAICIoYAAAICIsYAAAICIwYAAAICI0YAAAICI4YAAAICI8YAAAICJAYAAAICJEYAAAICJIYAAAICJMYAAAICJQYAAAICJUYAAAICJYYAAAICJcYAAAICJgYAAAICJkYAAAICJoYAAAICJsYAAAICJwYAAAICJ0YAAAICJ4YAAAICJ8YAAAICKAYAAAICKEYAAAICKIYAAAICKMYAAAICKQYAAAICKUYAAAICKYYAAAICKcYAAAICKgYAAAICKkYAAAICKoYAAAICKsYAAAICKwYAAAICK0YAAAICK4YAAAICK8YAAAICLAYAAAICLEYAAAICLIYAAAICLMYAAAICLQYAAAICLUYAAAICLYYAAAICLcYAAAICLgYAAAICLkYAAAICLoYAAAICLsYAAAICLwYAAAICL0YAAAICL4YAAAICL8YAAAICMAYAAAICMEYAAAICMIYAAAICMMYAAAICMQYAAAICMUYAAAICMYYAAAICMcYAAAICMgYAAAICMkYAAAICMoYAAAICMsYAAAICMwYAAAICM0YAAAICM4YAAAICM8YAAAICNAYAAAICNEYAAAICNIYAAAICNMYAAAICNQYAAAICNUYAAAICNYYAAAICNcYAAAICNgYAAAICNkYAAAICNoYAAAICNsYAAAICNwYAAAICN0YAAAICN4YAAAICN8YAAAICOAYAAAICOEYAAAICOIYAAAICOMYAAAICOQYAAAICOUYAAAICOYYAAAICOcYAAAICOgYAAAICOkYAAAICOoYAAAICOsYAAAICOwYAAAICO0YAAAICO4YAAAICO8YAAAICPAYAAAICPEYAAAICPIYAAAICPMYAAAICPQYAAAICPUYAAAICPYYAAAICPcYAAAICPgYAAAICPkYAAAICPoYAAAICPsYAAAICPwYAAAICP0YAAAICP4YAAAICP8YAAAICAAZAAAICAEZAAAICAIZAAAICAMZAAAICAQZAAAICAUZAAAICAYZAAAICAcZAAAICAgZAAAICAkZAAAICAoZAAAICAsZAAAICAwZAAAICA0ZAAAICA4ZAAAICA8ZAAAICBAZAAAICBEZAAAICBIZAAAICBMZAAAICBQZAAAICBUZAAAICBYZAAAICBcZAAAICBgZAAAICBkZAAAICBoZAAAICBsZAAAICBwZAAAICB0ZAAAICB4ZAAAICB8ZAAAICCAZAAAICCEZAAAICCIZAAAICCMZAAAICCQZAAAICCUZAAAICCYZAAAICCcZAAAICCgZAAAICCkZAAAICCoZAAAICCsZAAAICCwZAAAICC0ZAAAICC4ZAAAICC8ZAAAICDAZAAAICDEZAAAICDIZAAAICDMZAAAICDQZAAAICDUZAAAICDYZAAAICDcZAAAICDgZAAAICDkZAAAICDoZAAAICDsZAAAICDwZAAAICD0ZAAAICD4ZAAAICD8ZAAAICEAZAAAICEEZAAAICEIZAAAICEMZAAAICEQZAAAICEUZAAAICEYZAAAICEcZAAAICEgZAAAICEkZAAAICEoZAAAICEsZAAAICEwZAAAICE0ZAAAICE4ZAAAICE8ZAAAICFAZAAAICFEZAAAICFIZAAAICFMZAAAICFQZAAAICFUZAAAICFYZAAAICFcZAAAICFgZAAAICFkZAAAICFoZAAAICFsZAAAICFwZAAAICF0ZAAAICF4ZAAAICF8ZAAAICGAZAAAICGEZAAAICGIZAAAICGMZAAAICGQZAAAICGUZAAAICGYZAAAICGcZAAAICGgZAAAICGkZAAAICGoZAAAICGsZAAAICGwZAAAICG0ZAAAICG4ZAAAICG8ZAAAICHAZAAAICHEZAAAICHIZAAAICHMZAAAICHQZAAAICHUZAAAICHYZAAAICHcZAAAICHgZAAAICHkZAAAICHoZAAAICHsZAAAICHwZAAAICH0ZAAAICH4ZAAAICH8ZAAAICIAZAAAICIEZAAAICIIZAAAICIMZAAAICIQZAAAICIUZAAAICIYZAAAICIcZAAAICIgZAAAICIkZAAAICIoZAAAICIsZAAAICIwZAAAICI0ZAAAICI4ZAAAICI8ZAAAICJAZAAAICJEZAAAICJIZAAAICJMZAAAICJQZAAAICJUZAAAICJYZAAAICJcZAAAICJgZAAAICJkZAAAICJoZAAAICJsZAAAICJwZAAAICJ0ZAAAICJ4ZAAAICJ8ZAAAICKAZAAAICKEZAAAICKIZAAAICKMZAAAICKQZAAAICKUZAAAICKYZAAAICKcZAAAICKgZAAAICKkZAAAICKoZAAAICKsZAAAICKwZAAAICK0ZAAAICK4ZAAAICK8ZAAAICLAZAAAICLEZAAAICLIZAAAICLMZAAAICLQZAAAICLUZAAAICLYZAAAICLcZAAAICLgZAAAICLkZAAAICLoZAAAICLsZAAAICLwZAAAICL0ZAAAICL4ZAAAICL8ZAAAICMAZAAAICMEZAAAICMIZAAAICMMZAAAICMQZAAAICMUZAAAICMYZAAAICMcZAAAICMgZAAAICMkZAAAICMoZAAAICMsZAAAICMwZAAAICM0ZAAAICM4ZAAAICM8ZAAAICNAZAAAICNEZAAAICNIZAAAICNMZAAAICNQZAAAICNUZAAAICNYZAAAICNcZAAAICNgZAAAICNkZAAAICNoZAAAICNsZAAAICNwZAAAICN0ZAAAICN4ZAAAICN8ZAAAICOAZAAAICOEZAAAICOIZAAAICOMZAAAICOQZAAAICOUZAAAICOYZAAAICOcZAAAICOgZAAAICOkZAAAICOoZAAAICOsZAAAICOwZAAAICO0ZAAAICO4ZAAAICO8ZAAAICPAZAAAICPEZAAAICPIZAAAICPMZAAAICPQZAAAICPUZAAAICPYZAAAICPcZAAAICPgZAAAICPkZAAAICPoZAAAICPsZAAAICPwZAAAICP0ZAAAICP4ZAAAICP8ZAAAICAAaAAAICAEaAAAICAIaAAAICAMaAAAICAQaAAAICAUaAAAICAYaAAAICAcaAAAICAgaAAAICAkaAAAICAoaAAAICAsaAAAICAwaAAAICA0aAAAICA4aAAAICA8aAAAICBAaAAAICBEaAAAICBIaAAAICBMaAAAICBQaAAAICBUaAAAICBYaAAAICBcaAAAICBgaAAAICBkaAAAICBoaAAAICBsaAAAICBwaAAAICB0aAAAICB4aAAAICB8aAAAICCAaAAAICCEaAAAICCIaAAAICCMaAAAICCQaAAAICCUaAAAICCYaAAAICCcaAAAICCgaAAAICCkaAAAICCoaAAAICCsaAAAICCwaAAAICC0aAAAICC4aAAAICC8aAAAICDAaAAAICDEaAAAICDIaAAAICDMaAAAICDQaAAAICDUaAAAICDYaAAAICDcaAAAICDgaAAAICDkaAAAICDoaAAAICDsaAAAICDwaAAAICD0aAAAICD4aAAAICD8aAAAICEAaAAAICEEaAAAICEIaAAAICEMaAAAICEQaAAAICEUaAAAICEYaAAAICEcaAAAICEgaAAAICEkaAAAICEoaAAAICEsaAAAICEwaAAAICE0aAAAICE4aAAAICE8aAAAICFAaAAAICFEaAAAICFIaAAAICFMaAAAICFQaAAAICFUaAAAICFYaAAAICFcaAAAICFgaAAAICFkaAAAICFoaAAAICFsaAAAICFwaAAAICF0aAAAICF4aAAAICF8aAAAICGAaAAAICGEaAAAICGIaAAAICGMaAAAICGQaAAAICGUaAAAICGYaAAAICGcaAAAICGgaAAAICGkaAAAICGoaAAAICGsaAAAICGwaAAAICG0aAAAICG4aAAAICG8aAAAICHAaAAAICHEaAAAICHIaAAAICHMaAAAICHQaAAAICHUaAAAICHYaAAAICHcaAAAICHgaAAAICHkaAAAICHoaAAAICHsaAAAICHwaAAAICH0aAAAICH4aAAAICH8aAAAICIAaAAAICIEaAAAICIIaAAAICIMaAAAICIQaAAAICIUaAAAICIYaAAAICIcaAAAICIgaAAAICIkaAAAICIoaAAAICIsaAAAICIwaAAAICI0aAAAICI4aAAAICI8aAAAICJAaAAAICJEaAAAICJIaAAAICJMaAAAICJQaAAAICJUaAAAICJYaAAAICJcaAAAICJgaAAAICJkaAAAICJoaAAAICJsaAAAICJwaAAAICJ0aAAAICJ4aAAAICJ8aAAAICKAaAAAICKEaAAAICKIaAAAICKMaAAAICKQaAAAICKUaAAAICKYaAAAICKcaAAAICKgaAAAICKkaAAAICKoaAAAICKsaAAAICKwaAAAICK0aAAAICK4aAAAICK8aAAAICLAaAAAICLEaAAAICLIaAAAICLMaAAAICLQaAAAICLUaAAAICLYaAAAICLcaAAAICLgaAAAICLkaAAAICLoaAAAICLsaAAAICLwaAAAICL0aAAAICL4aAAAICL8aAAAICMAaAAAICMEaAAAICMIaAAAICMMaAAAICMQaAAAICMUaAAAICMYaAAAICMcaAAAICMgaAAAICMkaAAAICMoaAAAICMsaAAAICMwaAAAICM0aAAAICM4aAAAICM8aAAAICNAaAAAICNEaAAAICNIaAAAICNMaAAAICNQaAAAICNUaAAAICNYaAAAICNcaAAAICNgaAAAICNkaAAAICNoaAAAICNsaAAAICNwaAAAICN0aAAAICN4aAAAICN8aAAAICOAaAAAICOEaAAAICOIaAAAICOMaAAAICOQaAAAICOUaAAAICOYaAAAICOcaAAAICOgaAAAICOkaAAAICOoaAAAICOsaAAAICOwaAAAICO0aAAAICO4aAAAICO8aAAAICPAaAAAICPEaAAAICPIaAAAICPMaAAAICPQaAAAICPUaAAAICPYaAAAICPcaAAAICPgaAAAICPkaAAAICPoaAAAICPsaAAAICPwaAAAICP0aAAAICP4aAAAICP8aAAAICAAbAAAICAEbAAAICAIbAAAICAMbAAAICAQbAAAICAUbAAAICAYbAAAICAcbAAAICAgbAAAICAkbAAAICAobAAAICAsbAAAICAwbAAAICA0bAAAICA4bAAAICA8bAAAICBAbAAAICBEbAAAICBIbAAAICBMbAAAICBQbAAAICBUbAAAICBYbAAAICBcbAAAICBgbAAAICBkbAAAICBobAAAICBsbAAAICBwbAAAICB0bAAAICB4bAAAICB8bAAAICCAbAAAICCEbAAAICCIbAAAICCMbAAAICCQbAAAICCUbAAAICCYbAAAICCcbAAAICCgbAAAICCkbAAAICCobAAAICCsbAAAICCwbAAAICC0bAAAICC4bAAAICC8bAAAICDAbAAAICDEbAAAICDIbAAAICDMbAAAICDQbAAAICDUbAAAICDYbAAAICDcbAAAICDgbAAAICDkbAAAICDobAAAICDsbAAAICDwbAAAICD0bAAAICD4bAAAICD8bAAAICEAbAAAICEEbAAAICEIbAAAICEMbAAAICEQbAAAICEUbAAAICEYbAAAICEcbAAAICEgbAAAICEkbAAAICEobAAAICEsbAAAICEwbAAAICE0bAAAICE4bAAAICE8bAAAICFAbAAAICFEbAAAICFIbAAAICFMbAAAICFQbAAAICFUbAAAICFYbAAAICFcbAAAICFgbAAAICFkbAAAICFobAAAICFsbAAAICFwbAAAICF0bAAAICF4bAAAICF8bAAAICGAbAAAICGEbAAAICGIbAAAICGMbAAAICGQbAAAICGUbAAAICGYbAAAICGcbAAAICGgbAAAICGkbAAAICGobAAAICGsbAAAICGwbAAAICG0bAAAICG4bAAAICG8bAAAICHAbAAAICHEbAAAICHIbAAAICHMbAAAICHQbAAAICHUbAAAICHYbAAAICHcbAAAICHgbAAAICHkbAAAICHobAAAICHsbAAAICHwbAAAICH0bAAAICH4bAAAICH8bAAAICIAbAAAICIEbAAAICIIbAAAICIMbAAAICIQbAAAICIUbAAAICIYbAAAICIcbAAAICIgbAAAICIkbAAAICIobAAAICIsbAAAICIwbAAAICI0bAAAICI4bAAAICI8bAAAICJAbAAAICJEbAAAICJIbAAAICJMbAAAICJQbAAAICJUbAAAICJYbAAAICJcbAAAICJgbAAAICJkbAAAICJobAAAICJsbAAAICJwbAAAICJ0bAAAICJ4bAAAICJ8bAAAICKAbAAAICKEbAAAICKIbAAAICKMbAAAICKQbAAAICKUbAAAICKYbAAAICKcbAAAICKgbAAAICKkbAAAICKobAAAICKsbAAAICKwbAAAICK0bAAAICK4bAAAICK8bAAAICLAbAAAICLEbAAAICLIbAAAICLMbAAAICLQbAAAICLUbAAAICLYbAAAICLcbAAAICLgbAAAICLkbAAAICLobAAAICLsbAAAICLwbAAAICL0bAAAICL4bAAAICL8bAAAICMAbAAAICMEbAAAICMIbAAAICMMbAAAICMQbAAAICMUbAAAICMYbAAAICMcbAAAICMgbAAAICMkbAAAICMobAAAICMsbAAAICMwbAAAICM0bAAAICM4bAAAICM8bAAAICNAbAAAICNEbAAAICNIbAAAICNMbAAAICNQbAAAICNUbAAAICNYbAAAICNcbAAAICNgbAAAICNkbAAAICNobAAAICNsbAAAICNwbAAAICN0bAAAICN4bAAAICN8bAAAICOAbAAAICOEbAAAICOIbAAAICOMbAAAICOQbAAAICOUbAAAICOYbAAAICOcbAAAICOgbAAAICOkbAAAICOobAAAICOsbAAAICOwbAAAICO0bAAAICO4bAAAICO8bAAAICPAbAAAICPEbAAAICPIbAAAICPMbAAAICPQbAAAICPUbAAAICPYbAAAICPcbAAAICPgbAAAICPkbAAAICPobAAAICPsbAAAICPwbAAAICP0bAAAICP4bAAAICP8bAAAICAAcAAAICAEcAAAICAIcAAAICAMcAAAICAQcAAAICAUcAAAICAYcAAAICAccAAAICAgcAAAICAkcAAAICAocAAAICAscAAAICAwcAAAICA0cAAAICA4cAAAICA8cAAAICBAcAAAICBEcAAAICBIcAAAICBMcAAAICBQcAAAICBUcAAAICBYcAAAICBccAAAICBgcAAAICBkcAAAICBocAAAICBscAAAICBwcAAAICB0cAAAICB4cAAAICB8cAAAICCAcAAAICCEcAAAICCIcAAAICCMcAAAICCQcAAAICCUcAAAICCYcAAAICCccAAAICCgcAAAICCkcAAAICCocAAAICCscAAAICCwcAAAICC0cAAAICC4cAAAICC8cAAAICDAcAAAICDEcAAAICDIcAAAICDMcAAAICDQcAAAICDUcAAAICDYcAAAICDccAAAICDgcAAAICDkcAAAICDocAAAICDscAAAICDwcAAAICD0cAAAICD4cAAAICD8cAAAICEAcAAAICEEcAAAICEIcAAAICEMcAAAICEQcAAAICEUcAAAICEYcAAAICEccAAAICEgcAAAICEkcAAAICEocAAAICEscAAAICEwcAAAICE0cAAAICE4cAAAICE8cAAAICFAcAAAICFEcAAAICFIcAAAICFMcAAAICFQcAAAICFUcAAAICFYcAAAICFccAAAICFgcAAAICFkcAAAICFocAAAICFscAAAICFwcAAAICF0cAAAICF4cAAAICF8cAAAICGAcAAAICGEcAAAICGIcAAAICGMcAAAICGQcAAAICGUcAAAICGYcAAAICGccAAAICGgcAAAICGkcAAAICGocAAAICGscAAAICGwcAAAICG0cAAAICG4cAAAICG8cAAAICHAcAAAICHEcAAAICHIcAAAICHMcAAAICHQcAAAICHUcAAAICHYcAAAICHccAAAICHgcAAAICHkcAAAICHocAAAICHscAAAICHwcAAAICH0cAAAICH4cAAAICH8cAAAICIAcAAAICIEcAAAICIIcAAAICIMcAAAICIQcAAAICIUcAAAICIYcAAAICIccAAAICIgcAAAICIkcAAAICIocAAAICIscAAAICIwcAAAICI0cAAAICI4cAAAICI8cAAAICJAcAAAICJEcAAAICJIcAAAICJMcAAAICJQcAAAICJUcAAAICJYcAAAICJccAAAICJgcAAAICJkcAAAICJocAAAICJscAAAICJwcAAAICJ0cAAAICJ4cAAAICJ8cAAAICKAcAAAICKEcAAAICKIcAAAICKMcAAAICKQcAAAICKUcAAAICKYcAAAICKccAAAICKgcAAAICKkcAAAICKocAAAICKscAAAICKwcAAAICK0cAAAICK4cAAAICK8cAAAICLAcAAAICLEcAAAICLIcAAAICLMcAAAICLQcAAAICLUcAAAICLYcAAAICLccAAAICLgcAAAICLkcAAAICLocAAAICLscAAAICLwcAAAICL0cAAAICL4cAAAICL8cAAAICMAcAAAICMEcAAAICMIcAAAICMMcAAAICMQcAAAICMUcAAAICMYcAAAICMccAAAICMgcAAAICMkcAAAICMocAAAICMscAAAICMwcAAAICM0cAAAICM4cAAAICM8cAAAICNAcAAAICNEcAAAICNIcAAAICNMcAAAICNQcAAAICNUcAAAICNYcAAAICNccAAAICNgcAAAICNkcAAAICNocAAAICNscAAAICNwcAAAICN0cAAAICN4cAAAICN8cAAAICOAcAAAICOEcAAAICOIcAAAICOMcAAAICOQcAAAICOUcAAAICOYcAAAICOccAAAICOgcAAAICOkcAAAICOocAAAICOscAAAICOwcAAAICO0cAAAICO4cAAAICO8cAAAICPAcAAAICPEcAAAICPIcAAAICPMcAAAICPQcAAAICPUcAAAICPYcAAAICPccAAAICPgcAAAICPkcAAAICPocAAAICPscAAAICPwcAAAICP0cAAAICP4cAAAICP8cAAAICAAdAAAICAEdAAAICAIdAAAICAMdAAAICAQdAAAICAUdAAAICAYdAAAICAcdAAAICAgdAAAICAkdAAAICAodAAAICAsdAAAICAwdAAAICA0dAAAICA4dAAAICA8dAAAICBAdAAAICBEdAAAICBIdAAAICBMdAAAICBQdAAAICBUdAAAICBYdAAAICBcdAAAICBgdAAAICBkdAAAICBodAAAICBsdAAAICBwdAAAICB0dAAAICB4dAAAICB8dAAAICCAdAAAICCEdAAAICCIdAAAICCMdAAAICCQdAAAICCUdAAAICCYdAAAICCcdAAAICCgdAAAICCkdAAAICCodAAAICCsdAAAICCwdAAAICC0dAAAICC4dAAAICC8dAAAICDAdAAAICDEdAAAICDIdAAAICDMdAAAICDQdAAAICDUdAAAICDYdAAAICDcdAAAICDgdAAAICDkdAAAICDodAAAICDsdAAAICDwdAAAICD0dAAAICD4dAAAICD8dAAAICEAdAAAICEEdAAAICEIdAAAICEMdAAAICEQdAAAICEUdAAAICEYdAAAICEcdAAAICEgdAAAICEkdAAAICEodAAAICEsdAAAICEwdAAAICE0dAAAICE4dAAAICE8dAAAICFAdAAAICFEdAAAICFIdAAAICFMdAAAICFQdAAAICFUdAAAICFYdAAAICFcdAAAICFgdAAAICFkdAAAICFodAAAICFsdAAAICFwdAAAICF0dAAAICF4dAAAICF8dAAAICGAdAAAICGEdAAAICGIdAAAICGMdAAAICGQdAAAICGUdAAAICGYdAAAICGcdAAAICGgdAAAICGkdAAAICGodAAAICGsdAAAICGwdAAAICG0dAAAICG4dAAAICG8dAAAICHAdAAAICHEdAAAICHIdAAAICHMdAAAICHQdAAAICHUdAAAICHYdAAAICHcdAAAICHgdAAAICHkdAAAICHodAAAICHsdAAAICHwdAAAICH0dAAAICH4dAAAICH8dAAAICIAdAAAICIEdAAAICIIdAAAICIMdAAAICIQdAAAICIUdAAAICIYdAAAICIcdAAAICIgdAAAICIkdAAAICIodAAAICIsdAAAICIwdAAAICI0dAAAICI4dAAAICI8dAAAICJAdAAAICJEdAAAICJIdAAAICJMdAAAICJQdAAAICJUdAAAICJYdAAAICJcdAAAICJgdAAAICJkdAAAICJodAAAICJsdAAAICJwdAAAICJ0dAAAICJ4dAAAICJ8dAAAICKAdAAAICKEdAAAICKIdAAAICKMdAAAICKQdAAAICKUdAAAICKYdAAAICKcdAAAICKgdAAAICKkdAAAICKodAAAICKsdAAAICKwdAAAICK0dAAAICK4dAAAICK8dAAAICLAdAAAICLEdAAAICLIdAAAICLMdAAAICLQdAAAICLUdAAAICLYdAAAICLcdAAAICLgdAAAICLkdAAAICLodAAAICLsdAAAICLwdAAAICL0dAAAICL4dAAAICL8dAAAICMAdAAAICMEdAAAICMIdAAAICMMdAAAICMQdAAAICMUdAAAICMYdAAAICMcdAAAICMgdAAAICMkdAAAICModAAAICMsdAAAICMwdAAAICM0dAAAICM4dAAAICM8dAAAICNAdAAAICNEdAAAICNIdAAAICNMdAAAICNQdAAAICNUdAAAICNYdAAAICNcdAAAICNgdAAAICNkdAAAICNodAAAICNsdAAAICNwdAAAICN0dAAAICN4dAAAICN8dAAAICOAdAAAICOEdAAAICOIdAAAICOMdAAAICOQdAAAICOUdAAAICOYdAAAICOcdAAAICOgdAAAICOkdAAAICOodAAAICOsdAAAICOwdAAAICO0dAAAICO4dAAAICO8dAAAICPAdAAAICPEdAAAICPIdAAAICPMdAAAICPQdAAAICPUdAAAICPYdAAAICPcdAAAICPgdAAAICPkdAAAICPodAAAICPsdAAAICPwdAAAICP0dAAAICP4dAAAICP8dAAAICAAeAAAICAEeAAAICAIeAAAICAMeAAAICAQeAAAICAUeAAAICAYeAAAICAceAAAICAgeAAAICAkeAAAICAoeAAAICAseAAAICAweAAAICA0eAAAICA4eAAAICA8eAAAICBAeAAAICBEeAAAICBIeAAAICBMeAAAICBQeAAAICBUeAAAICBYeAAAICBceAAAICBgeAAAICBkeAAAICBoeAAAICBseAAAICBweAAAICB0eAAAICB4eAAAICB8eAAAICCAeAAAICCEeAAAICCIeAAAICCMeAAAICCQeAAAICCUeAAAICCYeAAAICCceAAAICCgeAAAICCkeAAAICCoeAAAICCseAAAICCweAAAICC0eAAAICC4eAAAICC8eAAAICDAeAAAICDEeAAAICDIeAAAICDMeAAAICDQeAAAICDUeAAAICDYeAAAICDceAAAICDgeAAAICDkeAAAICDoeAAAICDseAAAICDweAAAICD0eAAAICD4eAAAICD8eAAAICEAeAAAICEEeAAAICEIeAAAICEMeAAAICEQeAAAICEUeAAAICEYeAAAICEceAAAICEgeAAAICEkeAAAICEoeAAAICEseAAAICEweAAAICE0eAAAICE4eAAAICE8eAAAICFAeAAAICFEeAAAICFIeAAAICFMeAAAICFQeAAAICFUeAAAICFYeAAAICFceAAAICFgeAAAICFkeAAAICFoeAAAICFseAAAICFweAAAICF0eAAAICF4eAAAICF8eAAAICGAeAAAICGEeAAAICGIeAAAICGMeAAAICGQeAAAICGUeAAAICGYeAAAICGceAAAICGgeAAAICGkeAAAICGoeAAAICGseAAAICGweAAAICG0eAAAICG4eAAAICG8eAAAICHAeAAAICHEeAAAICHIeAAAICHMeAAAICHQeAAAICHUeAAAICHYeAAAICHceAAAICHgeAAAICHkeAAAICHoeAAAICHseAAAICHweAAAICH0eAAAICH4eAAAICH8eAAAICIAeAAAICIEeAAAICIIeAAAICIMeAAAICIQeAAAICIUeAAAICIYeAAAICIceAAAICIgeAAAICIkeAAAICIoeAAAICIseAAAICIweAAAICI0eAAAICI4eAAAICI8eAAAICJAeAAAICJEeAAAICJIeAAAICJMeAAAICJQeAAAICJUeAAAICJYeAAAICJceAAAICJgeAAAICJkeAAAICJoeAAAICJseAAAICJweAAAICJ0eAAAICJ4eAAAICJ8eAAAICKAeAAAICKEeAAAICKIeAAAICKMeAAAICKQeAAAICKUeAAAICKYeAAAICKceAAAICKgeAAAICKkeAAAICKoeAAAICKseAAAICKweAAAICK0eAAAICK4eAAAICK8eAAAICLAeAAAICLEeAAAICLIeAAAICLMeAAAICLQeAAAICLUeAAAICLYeAAAICLceAAAICLgeAAAICLkeAAAICLoeAAAICLseAAAICLweAAAICL0eAAAICL4eAAAICL8eAAAICMAeAAAICMEeAAAICMIeAAAICMMeAAAICMQeAAAICMUeAAAICMYeAAAICMceAAAICMgeAAAICMkeAAAICMoeAAAICMseAAAICMweAAAICM0eAAAICM4eAAAICM8eAAAICNAeAAAICNEeAAAICNIeAAAICNMeAAAICNQeAAAICNUeAAAICNYeAAAICNceAAAICNgeAAAICNkeAAAICNoeAAAICNseAAAICNweAAAICN0eAAAICN4eAAAICN8eAAAICOAeAAAICOEeAAAICOIeAAAICOMeAAAICOQeAAAICOUeAAAICOYeAAAICOceAAAICOgeAAAICOkeAAAICOoeAAAICOseAAAICOweAAAICO0eAAAICO4eAAAICO8eAAAICPAeAAAICPEeAAAICPIeAAAICPMeAAAICPQeAAAICPUeAAAICPYeAAAICPceAAAICPgeAAAICPkeAAAICPoeAAAICPseAAAICPweAAAICP0eAAAICP4eAAAICP8eAAAICAAfAAAICAEfAAAICAIfAAAICAMfAAAICAQfAAAICAUfAAAICAYfAAAICAcfAAAICAgfAAAICAkfAAAICAofAAAICAsfAAAICAwfAAAICA0fAAAICA4fAAAICA8fAAAICBAfAAAICBEfAAAICBIfAAAICBMfAAAICBQfAAAICBUfAAAICBYfAAAICBcfAAAICBgfAAAICBkfAAAICBofAAAICBsfAAAICBwfAAAICB0fAAAICB4fAAAICB8fAAAICCAfAAAICCEfAAAICCIfAAAICCMfAAAICCQfAAAICCUfAAAICCYfAAAICCcfAAAICCgfAAAICCkfAAAICCofAAAICCsfAAAICCwfAAAICC0fAAAICC4fAAAICC8fAAAICDAfAAAICDEfAAAICDIfAAAICDMfAAAICDQfAAAICDUfAAAICDYfAAAICDcfAAAICDgfAAAICDkfAAAICDofAAAICDsfAAAICDwfAAAICD0fAAAICD4fAAAICD8fAAAICEAfAAAICEEfAAAICEIfAAAICEMfAAAICEQfAAAICEUfAAAICEYfAAAICEcfAAAICEgfAAAICEkfAAAICEofAAAICEsfAAAICEwfAAAICE0fAAAICE4fAAAICE8fAAAICFAfAAAICFEfAAAICFIfAAAICFMfAAAICFQfAAAICFUfAAAICFYfAAAICFcfAAAICFgfAAAICFkfAAAICFofAAAICFsfAAAICFwfAAAICF0fAAAICF4fAAAICF8fAAAICGAfAAAICGEfAAAICGIfAAAICGMfAAAICGQfAAAICGUfAAAICGYfAAAICGcfAAAICGgfAAAICGkfAAAICGofAAAICGsfAAAICGwfAAAICG0fAAAICG4fAAAICG8fAAAICHAfAAAICHEfAAAICHIfAAAICHMfAAAICHQfAAAICHUfAAAICHYfAAAICHcfAAAICHgfAAAICHkfAAAICHofAAAICHsfAAAICHwfAAAICH0fAAAICH4fAAAICH8fAAAICIAfAAAICIEfAAAICIIfAAAICIMfAAAICIQfAAAICIUfAAAICIYfAAAICIcfAAAICIgfAAAICIkfAAAICIofAAAICIsfAAAICIwfAAAICI0fAAAICI4fAAAICI8fAAAICJAfAAAICJEfAAAICJIfAAAICJMfAAAICJQfAAAICJUfAAAICJYfAAAICJcfAAAICJgfAAAICJkfAAAICJofAAAICJsfAAAICJwfAAAICJ0fAAAICJ4fAAAICJ8fAAAICKAfAAAICKEfAAAICKIfAAAICKMfAAAICKQfAAAICKUfAAAICKYfAAAICKcfAAAICKgfAAAICKkfAAAICKofAAAICKsfAAAICKwfAAAICK0fAAAICK4fAAAICK8fAAAICLAfAAAICLEfAAAICLIfAAAICLMfAAAICLQfAAAICLUfAAAICLYfAAAICLcfAAAICLgfAAAICLkfAAAICLofAAAICLsfAAAICLwfAAAICL0fAAAICL4fAAAICL8fAAAICMAfAAAICMEfAAAICMIfAAAICMMfAAAICMQfAAAICMUfAAAICMYfAAAICMcfAAAICMgfAAAICMkfAAAICMofAAAICMsfAAAICMwfAAAICM0fAAAICM4fAAAICM8fAAAICNAfAAAICNEfAAAICNIfAAAICNMfAAAICNQfAAAICNUfAAAICNYfAAAICNcfAAAICNgfAAAICNkfAAAICNofAAAICNsfAAAICNwfAAAICN0fAAAICN4fAAAICN8fAAAICOAfAAAICOEfAAAICOIfAAAICOMfAAAICOQfAAAICOUfAAAICOYfAAAICOcfAAAICOgfAAAICOkfAAAICOofAAAICOsfAAAICOwfAAAICO0fAAAICO4fAAAICO8fAAAICPAfAAAICPEfAAAICPIfAAAICPMfAAAICPQfAAAICPUfAAAICPYfAAAICPcfAAAICPgfAAAICPkfAAAICPofAAAICPsfAAAICPwfAAAICP0fAAAICP4fAAAICP8fAAAICAAgAAAICAEgAAAICAIgAAAICAMgAAAICAQgAAAICAUgAAAICAYgAAAICAcgAAAICAggAAAICAkgAAAICAogAAAICAsgAAAICAwgAAAICA0gAAAICA4gAAAICA8gAAAICBAgAAAICBEgAAAICBIgAAAICBMgAAAICBQgAAAICBUgAAAICBYgAAAICBcgAAAICBggAAAICBkgAAAICBogAAAICBsgAAAICBwgAAAICB0gAAAICB4gAAAICB8gAAAICCAgAAAICCEgAAAICCIgAAAICCMgAAAICCQgAAAICCUgAAAICCYgAAAICCcgAAAICCggAAAICCkgAAAICCogAAAICCsgAAAICCwgAAAICC0gAAAICC4gAAAICC8gAAAICDAgAAAICDEgAAAICDIgAAAICDMgAAAICDQgAAAICDUgAAAICDYgAAAICDcgAAAICDggAAAICDkgAAAICDogAAAICDsgAAAICDwgAAAICD0gAAAICD4gAAAICD8gAAAICEAgAAAICEEgAAAICEIgAAAICEMgAAAICEQgAAAICEUgAAAICEYgAAAICEcgAAAICEggAAAICEkgAAAICEogAAAICEsgAAAICEwgAAAICE0gAAAICE4gAAAICE8gAAAICFAgAAAICFEgAAAICFIgAAAICFMgAAAICFQgAAAICFUgAAAICFYgAAAICFcgAAAICFggAAAICFkgAAAICFogAAAICFsgAAAICFwgAAAICF0gAAAICF4gAAAICF8gAAAICGAgAAAICGEgAAAICGIgAAAICGMgAAAICGQgAAAICGUgAAAICGYgAAAICGcgAAAICGggAAAICGkgAAAICGogAAAICGsgAAAICGwgAAAICG0gAAAICG4gAAAICG8gAAAICHAgAAAICHEgAAAICHIgAAAICHMgAAAICHQgAAAICHUgAAAICHYgAAAICHcgAAAICHggAAAICHkgAAAICHogAAAICHsgAAAICHwgAAAICH0gAAAICH4gAAAICH8gAAAICIAgAAAICIEgAAAICIIgAAAICIMgAAAICIQgAAAICIUgAAAICIYgAAAICIcgAAAICIggAAAICIkgAAAICIogAAAICIsgAAAICIwgAAAICI0gAAAICI4gAAAICI8gAAAICJAgAAAICJEgAAAICJIgAAAICJMgAAAICJQgAAAICJUgAAAICJYgAAAICJcgAAAICJggAAAICJkgAAAICJogAAAICJsgAAAICJwgAAAICJ0gAAAICJ4gAAAICJ8gAAAICKAgAAAICKEgAAAICKIgAAAICKMgAAAICKQgAAAICKUgAAAICKYgAAAICKcgAAAICKggAAAICKkgAAAICKogAAAICKsgAAAICKwgAAAICK0gAAAICK4gAAAICK8gAAAICLAgAAAICLEgAAAICLIgAAAICLMgAAAICLQgAAAICLUgAAAICLYgAAAICLcgAAAICLggAAAICLkgAAAICLogAAAICLsgAAAICLwgAAAICL0gAAAICL4gAAAICL8gAAAICMAgAAAICMEgAAAICMIgAAAICMMgAAAICMQgAAAICMUgAAAICMYgAAAICMcgAAAICMggAAAICMkgAAAICMogAAAICMsgAAAICMwgAAAICM0gAAAICM4gAAAICM8gAAAICNAgAAAICNEgAAAICNIgAAAICNMgAAAICNQgAAAICNUgAAAICNYgAAAICNcgAAAICNggAAAICNkgAAAICNogAAAICNsgAAAICNwgAAAICN0gAAAICN4gAAAICN8gAAAICOAgAAAICOEgAAAICOIgAAAICOMgAAAICOQgAAAICOUgAAAICOYgAAAICOcgAAAICOggAAAICOkgAAAICOogAAAICOsgAAAICOwgAAAICO0gAAAICO4gAAAICO8gAAAICPAgAAAICPEgAAAICPIgAAAICPMgAAAICPQgAAAICPUgAAAICPYgAAAICPcgAAAICPggAAAICPkgAAAICPogAAAICPsgAAAICPwgAAAICP0gAAAICP4gAAAICP8gAAAICAAhAAAICAEhAAAICAIhAAAICAMhAAAICAQhAAAICAUhAAAICAYhAAAICAchAAAICAghAAAICAkhAAAICAohAAAICAshAAAICAwhAAAICA0hAAAICA4hAAAICA8hAAAICBAhAAAICBEhAAAICBIhAAAICBMhAAAICBQhAAAICBUhAAAICBYhAAAICBchAAAICBghAAAICBkhAAAICBohAAAICBshAAAICBwhAAAICB0hAAAICB4hAAAICB8hAAAICCAhAAAICCEhAAAICCIhAAAICCMhAAAICCQhAAAICCUhAAAICCYhAAAICCchAAAICCghAAAICCkhAAAICCohAAAICCshAAAICCwhAAAICC0hAAAICC4hAAAICC8hAAAICDAhAAAICDEhAAAICDIhAAAICDMhAAAICDQhAAAICDUhAAAICDYhAAAICDchAAAICDghAAAICDkhAAAICDohAAAICDshAAAICDwhAAAICD0hAAAICD4hAAAICD8hAAAICEAhAAAICEEhAAAICEIhAAAICEMhAAAICEQhAAAICEUhAAAICEYhAAAICEchAAAICEghAAAICEkhAAAICEohAAAICEshAAAICEwhAAAICE0hAAAICE4hAAAICE8hAAAICFAhAAAICFEhAAAICFIhAAAICFMhAAAICFQhAAAICFUhAAAICFYhAAAICFchAAAICFghAAAICFkhAAAICFohAAAICFshAAAICFwhAAAICF0hAAAICF4hAAAICF8hAAAICGAhAAAICGEhAAAICGIhAAAICGMhAAAICGQhAAAICGUhAAAICGYhAAAICGchAAAICGghAAAICGkhAAAICGohAAAICGshAAAICGwhAAAICG0hAAAICG4hAAAICG8hAAAICHAhAAAICHEhAAAICHIhAAAICHMhAAAICHQhAAAICHUhAAAICHYhAAAICHchAAAICHghAAAICHkhAAAICHohAAAICHshAAAICHwhAAAICH0hAAAICH4hAAAICH8hAAAICIAhAAAICIEhAAAICIIhAAAICIMhAAAICIQhAAAICIUhAAAICIYhAAAICIchAAAICIghAAAICIkhAAAICIohAAAICIshAAAICIwhAAAICI0hAAAICI4hAAAICI8hAAAICJAhAAAICJEhAAAICJIhAAAICJMhAAAICJQhAAAICJUhAAAICJYhAAAICJchAAAICJghAAAICJkhAAAICJohAAAICJshAAAICJwhAAAICJ0hAAAICJ4hAAAICJ8hAAAICKAhAAAICKEhAAAICKIhAAAICKMhAAAICKQhAAAICKUhAAAICKYhAAAICKchAAAICKghAAAICKkhAAAICKohAAAICKshAAAICKwhAAAICK0hAAAICK4hAAAICK8hAAAICLAhAAAICLEhAAAICLIhAAAICLMhAAAICLQhAAAICLUhAAAICLYhAAAICLchAAAICLghAAAICLkhAAAICLohAAAICLshAAAICLwhAAAICL0hAAAICL4hAAAICL8hAAAICMAhAAAICMEhAAAICMIhAAAICMMhAAAICMQhAAAICMUhAAAICMYhAAAICMchAAAICMghAAAICMkhAAAICMohAAAICMshAAAICMwhAAAICM0hAAAICM4hAAAICM8hAAAICNAhAAAICNEhAAAICNIhAAAICNMhAAAICNQhAAAICNUhAAAICNYhAAAICNchAAAICNghAAAICNkhAAAICNohAAAICNshAAAICNwhAAAICN0hAAAICN4hAAAICN8hAAAICOAhAAAICOEhAAAICOIhAAAICOMhAAAICOQhAAAICOUhAAAICOYhAAAICOchAAAICOghAAAICOkhAAAICOohAAAICOshAAAICOwhAAAICO0hAAAICO4hAAAICO8hAAAICPAhAAAICPEhAAAICPIhAAAICPMhAAAICPQhAAAICPUhAAAICPYhAAAICPchAAAICPghAAAICPkhAAAICPohAAAICPshAAAICPwhAAAICP0hAAAICP4hAAAICP8hAAAICAAiAAAICAEiAAAICAIiAAAICAMiAAAICAQiAAAICAUiAAAICAYiAAAICAciAAAICAgiAAAICAkiAAAICAoiAAAICAsiAAAICAwiAAAICA0iAAAICA4iAAAICA8iAAAICBAiAAAICBEiAAAICBIiAAAICBMiAAAICBQiAAAICBUiAAAICBYiAAAICBciAAAICBgiAAAICBkiAAAICBoiAAAICBsiAAAICBwiAAAICB0iAAAICB4iAAAICB8iAAAICCAiAAAICCEiAAAICCIiAAAICCMiAAAICCQiAAAICCUiAAAICCYiAAAICCciAAAICCgiAAAICCkiAAAICCoiAAAICCsiAAAICCwiAAAICC0iAAAICC4iAAAICC8iAAAICDAiAAAICDEiAAAICDIiAAAICDMiAAAICDQiAAAICDUiAAAICDYiAAAICDciAAAICDgiAAAICDkiAAAICDoiAAAICDsiAAAICDwiAAAICD0iAAAICD4iAAAICD8iAAAICEAiAAAICEEiAAAICEIiAAAICEMiAAAICEQiAAAICEUiAAAICEYiAAAICEciAAAICEgiAAAICEkiAAAICEoiAAAICEsiAAAICEwiAAAICE0iAAAICE4iAAAICE8iAAAICFAiAAAICFEiAAAICFIiAAAICFMiAAAICFQiAAAICFUiAAAICFYiAAAICFciAAAICFgiAAAICFkiAAAICFoiAAAICFsiAAAICFwiAAAICF0iAAAICF4iAAAICF8iAAAICGAiAAAICGEiAAAICGIiAAAICGMiAAAICGQiAAAICGUiAAAICGYiAAAICGciAAAICGgiAAAICGkiAAAICGoiAAAICGsiAAAICGwiAAAICG0iAAAICG4iAAAICG8iAAAICHAiAAAICHEiAAAICHIiAAAICHMiAAAICHQiAAAICHUiAAAICHYiAAAICHciAAAICHgiAAAICHkiAAAICHoiAAAICHsiAAAICHwiAAAICH0iAAAICH4iAAAICH8iAAAICIAiAAAICIEiAAAICIIiAAAICIMiAAAICIQiAAAICIUiAAAICIYiAAAICIciAAAICIgiAAAICIkiAAAICIoiAAAICIsiAAAICIwiAAAICI0iAAAICI4iAAAICI8iAAAICJAiAAAICJEiAAAICJIiAAAICJMiAAAICJQiAAAICJUiAAAICJYiAAAICJciAAAICJgiAAAICJkiAAAICJoiAAAICJsiAAAICJwiAAAICJ0iAAAICJ4iAAAICJ8iAAAICKAiAAAICKEiAAAICKIiAAAICKMiAAAICKQiAAAICKUiAAAICKYiAAAICKciAAAICKgiAAAICKkiAAAICKoiAAAICKsiAAAICKwiAAAICK0iAAAICK4iAAAICK8iAAAICLAiAAAICLEiAAAICLIiAAAICLMiAAAICLQiAAAICLUiAAAICLYiAAAICLciAAAICLgiAAAICLkiAAAICLoiAAAICLsiAAAICLwiAAAICL0iAAAICL4iAAAICL8iAAAICMAiAAAICMEiAAAICMIiAAAICMMiAAAICMQiAAAICMUiAAAICMYiAAAICMciAAAICMgiAAAICMkiAAAICMoiAAAICMsiAAAICMwiAAAICM0iAAAICM4iAAAICM8iAAAICNAiAAAICNEiAAAICNIiAAAICNMiAAAICNQiAAAICNUiAAAICNYiAAAICNciAAAICNgiAAAICNkiAAAICNoiAAAICNsiAAAICNwiAAAICN0iAAAICN4iAAAICN8iAAAICOAiAAAICOEiAAAICOIiAAAICOMiAAAICOQiAAAICOUiAAAICOYiAAAICOciAAAICOgiAAAICOkiAAAICOoiAAAICOsiAAAICOwiAAAICO0iAAAICO4iAAAICO8iAAAICPAiAAAICPEiAAAICPIiAAAICPMiAAAICPQiAAAICPUiAAAICPYiAAAICPciAAAICPgiAAAICPkiAAAICPoiAAAICPsiAAAICPwiAAAICP0iAAAICP4iAAAICP8iAAAICAAjAAAICAEjAAAICAIjAAAICAMjAAAICAQjAAAICAUjAAAICAYjAAAICAcjAAAICAgjAAAICAkjAAAICAojAAAICAsjAAAICAwjAAAICA0jAAAICA4jAAAICA8jAAAICBAjAAAICBEjAAAICBIjAAAICBMjAAAICBQjAAAICBUjAAAICBYjAAAICBcjAAAICBgjAAAICBkjAAAICBojAAAICBsjAAAICBwjAAAICB0jAAAICB4jAAAICB8jAAAICCAjAAAICCEjAAAICCIjAAAICCMjAAAICCQjAAAICCUjAAAICCYjAAAICCcjAAAICCgjAAAICCkjAAAICCojAAAICCsjAAAICCwjAAAICC0jAAAICC4jAAAICC8jAAAICDAjAAAICDEjAAAICDIjAAAICDMjAAAICDQjAAAICDUjAAAICDYjAAAICDcjAAAICDgjAAAICDkjAAAICDojAAAICDsjAAAICDwjAAAICD0jAAAICD4jAAAICD8jAAAICEAjAAAICEEjAAAICEIjAAAICEMjAAAICEQjAAAICEUjAAAICEYjAAAICEcjAAAICEgjAAAICEkjAAAICEojAAAICEsjAAAICEwjAAAICE0jAAAICE4jAAAICE8jAAAICFAjAAAICFEjAAAICFIjAAAICFMjAAAICFQjAAAICFUjAAAICFYjAAAICFcjAAAICFgjAAAICFkjAAAICFojAAAICFsjAAAICFwjAAAICF0jAAAICF4jAAAICF8jAAAICGAjAAAICGEjAAAICGIjAAAICGMjAAAICGQjAAAICGUjAAAICGYjAAAICGcjAAAICGgjAAAICGkjAAAICGojAAAICGsjAAAICGwjAAAICG0jAAAICG4jAAAICG8jAAAICHAjAAAICHEjAAAICHIjAAAICHMjAAAICHQjAAAICHUjAAAICHYjAAAICHcjAAAICHgjAAAICHkjAAAICHojAAAICHsjAAAICHwjAAAICH0jAAAICH4jAAAICH8jAAAICIAjAAAICIEjAAAICIIjAAAICIMjAAAICIQjAAAICIUjAAAICIYjAAAICIcjAAAICIgjAAAICIkjAAAICIojAAAICIsjAAAICIwjAAAICI0jAAAICI4jAAAICI8jAAAICJAjAAAICJEjAAAICJIjAAAICJMjAAAICJQjAAAICJUjAAAICJYjAAAICJcjAAAICJgjAAAICJkjAAAICJojAAAICJsjAAAICJwjAAAICJ0jAAAICJ4jAAAICJ8jAAAICKAjAAAICKEjAAAICKIjAAAICKMjAAAICKQjAAAICKUjAAAICKYjAAAICKcjAAAICKgjAAAICKkjAAAICKojAAAICKsjAAAICKwjAAAICK0jAAAICK4jAAAICK8jAAAICLAjAAAICLEjAAAICLIjAAAICLMjAAAICLQjAAAICLUjAAAICLYjAAAICLcjAAAICLgjAAAICLkjAAAICLojAAAICLsjAAAICLwjAAAICL0jAAAICL4jAAAICL8jAAAICMAjAAAICMEjAAAICMIjAAAICMMjAAAICMQjAAAICMUjAAAICMYjAAAICMcjAAAICMgjAAAICMkjAAAICMojAAAICMsjAAAICMwjAAAICM0jAAAICM4jAAAICM8jAAAICNAjAAAICNEjAAAICNIjAAAICNMjAAAICNQjAAAICNUjAAAICNYjAAAICNcjAAAICNgjAAAICNkjAAAICNojAAAICNsjAAAICNwjAAAICN0jAAAICN4jAAAICN8jAAAICOAjAAAICOEjAAAICOIjAAAICOMjAAAICOQjAAAICOUjAAAICOYjAAAICOcjAAAICOgjAAAICOkjAAAICOojAAAICOsjAAAICOwjAAAICO0jAAAICO4jAAAICO8jAAAICPAjAAAICPEjAAAICPIjAAAICPMjAAAICPQjAAAICPUjAAAICPYjAAAICPcjAAAICPgjAAAICPkjAAAICPojAAAICPsjAAAICPwjAAAICP0jAAAICP4jAAAICP8jAAAICAAkAAAICAEkAAAICAIkAAAICAMkAAAICAQkAAAICAUkAAAICAYkAAAICAckAAAICAgkAAAICAkkAAAICAokAAAICAskAAAICAwkAAAICA0kAAAICA4kAAAICA8kAAAICBAkAAAICBEkAAAICBIkAAAICBMkAAAICBQkAAAICBUkAAAICBYkAAAICBckAAAICBgkAAAICBkkAAAICBokAAAICBskAAAICBwkAAAICB0kAAAICB4kAAAICB8kAAAICCAkAAAICCEkAAAICCIkAAAICCMkAAAICCQkAAAICCUkAAAICCYkAAAICCckAAAICCgkAAAICCkkAAAICCokAAAICCskAAAICCwkAAAICC0kAAAICC4kAAAICC8kAAAICDAkAAAICDEkAAAICDIkAAAICDMkAAAICDQkAAAICDUkAAAICDYkAAAICDckAAAICDgkAAAICDkkAAAICDokAAAICDskAAAICDwkAAAICD0kAAAICD4kAAAICD8kAAAICEAkAAAICEEkAAAICEIkAAAICEMkAAAICEQkAAAICEUkAAAICEYkAAAICEckAAAICEgkAAAICEkkAAAICEokAAAICEskAAAICEwkAAAICE0kAAAICE4kAAAICE8kAAAICFAkAAAICFEkAAAICFIkAAAICFMkAAAICFQkAAAICFUkAAAICFYkAAAICFckAAAICFgkAAAICFkkAAAICFokAAAICFskAAAICFwkAAAICF0kAAAICF4kAAAICF8kAAAICGAkAAAICGEkAAAICGIkAAAICGMkAAAICGQkAAAICGUkAAAICGYkAAAICGckAAAICGgkAAAICGkkAAAICGokAAAICGskAAAICGwkAAAICG0kAAAICG4kAAAICG8kAAAICHAkAAAICHEkAAAICHIkAAAICHMkAAAICHQkAAAICHUkAAAICHYkAAAICHckAAAICHgkAAAICHkkAAAICHokAAAICHskAAAICHwkAAAICH0kAAAICH4kAAAICH8kAAAICIAkAAAICIEkAAAICIIkAAAICIMkAAAICIQkAAAICIUkAAAICIYkAAAICIckAAAICIgkAAAICIkkAAAICIokAAAICIskAAAICIwkAAAICI0kAAAICI4kAAAICI8kAAAICJAkAAAICJEkAAAICJIkAAAICJMkAAAICJQkAAAICJUkAAAICJYkAAAICJckAAAICJgkAAAICJkkAAAICJokAAAICJskAAAICJwkAAAICJ0kAAAICJ4kAAAICJ8kAAAICKAkAAAICKEkAAAICKIkAAAICKMkAAAICKQkAAAICKUkAAAICKYkAAAICKckAAAICKgkAAAICKkkAAAICKokAAAICKskAAAICKwkAAAICK0kAAAICK4kAAAICK8kAAAICLAkAAAICLEkAAAICLIkAAAICLMkAAAICLQkAAAICLUkAAAICLYkAAAICLckAAAICLgkAAAICLkkAAAICLokAAAICLskAAAICLwkAAAICL0kAAAICL4kAAAICL8kAAAICMAkAAAICMEkAAAICMIkAAAICMMkAAAICMQkAAAICMUkAAAICMYkAAAICMckAAAICMgkAAAICMkkAAAICMokAAAICMskAAAICMwkAAAICM0kAAAICM4kAAAICM8kAAAICNAkAAAICNEkAAAICNIkAAAICNMkAAAICNQkAAAICNUkAAAICNYkAAAICNckAAAICNgkAAAICNkkAAAICNokAAAICNskAAAICNwkAAAICN0kAAAICN4kAAAICN8kAAAICOAkAAAICOEkAAAICOIkAAAICOMkAAAICOQkAAAICOUkAAAICOYkAAAICOckAAAICOgkAAAICOkkAAAICOokAAAICOskAAAICOwkAAAICO0kAAAICO4kAAAICO8kAAAICPAkAAAICPEkAAAICPIkAAAICPMkAAAICPQkAAAICPUkAAAICPYkAAAICPckAAAICPgkAAAICPkkAAAICPokAAAICPskAAAICPwkAAAICP0kAAAICP4kAAAICP8kAAAICAAlAAAICAElAAAICAIlAAAICAMlAAAICAQlAAAICAUlAAAICAYlAAAICAclAAAICAglAAAICAklAAAICAolAAAICAslAAAICAwlAAAICA0lAAAICA4lAAAICA8lAAAICBAlAAAICBElAAAICBIlAAAICBMlAAAICBQlAAAICBUlAAAICBYlAAAICBclAAAICBglAAAICBklAAAICBolAAAICBslAAAICBwlAAAICB0lAAAICB4lAAAICB8lAAAICCAlAAAICCElAAAICCIlAAAICCMlAAAICCQlAAAICCUlAAAICCYlAAAICCclAAAICCglAAAICCklAAAICColAAAICCslAAAICCwlAAAICC0lAAAICC4lAAAICC8lAAAICDAlAAAICDElAAAICDIlAAAICDMlAAAICDQlAAAICDUlAAAICDYlAAAICDclAAAICDglAAAICDklAAAICDolAAAICDslAAAICDwlAAAICD0lAAAICD4lAAAICD8lAAAICEAlAAAICEElAAAICEIlAAAICEMlAAAICEQlAAAICEUlAAAICEYlAAAICEclAAAICEglAAAICEklAAAICEolAAAICEslAAAICEwlAAAICE0lAAAICE4lAAAICE8lAAAICFAlAAAICFElAAAICFIlAAAICFMlAAAICFQlAAAICFUlAAAICFYlAAAICFclAAAICFglAAAICFklAAAICFolAAAICFslAAAICFwlAAAICF0lAAAICF4lAAAICF8lAAAICGAlAAAICGElAAAICGIlAAAICGMlAAAICGQlAAAICGUlAAAICGYlAAAICGclAAAICGglAAAICGklAAAICGolAAAICGslAAAICGwlAAAICG0lAAAICG4lAAAICG8lAAAICHAlAAAICHElAAAICHIlAAAICHMlAAAICHQlAAAICHUlAAAICHYlAAAICHclAAAICHglAAAICHklAAAICHolAAAICHslAAAICHwlAAAICH0lAAAICH4lAAAICH8lAAAICIAlAAAICIElAAAICIIlAAAICIMlAAAICIQlAAAICIUlAAAICIYlAAAICIclAAAICIglAAAICIklAAAICIolAAAICIslAAAICIwlAAAICI0lAAAICI4lAAAICI8lAAAICJAlAAAICJElAAAICJIlAAAICJMlAAAICJQlAAAICJUlAAAICJYlAAAICJclAAAICJglAAAICJklAAAICJolAAAICJslAAAICJwlAAAICJ0lAAAICJ4lAAAICJ8lAAAICKAlAAAICKElAAAICKIlAAAICKMlAAAICKQlAAAICKUlAAAICKYlAAAICKclAAAICKglAAAICKklAAAICKolAAAICKslAAAICKwlAAAICK0lAAAICK4lAAAICK8lAAAICLAlAAAICLElAAAICLIlAAAICLMlAAAICLQlAAAICLUlAAAICLYlAAAICLclAAAICLglAAAICLklAAAICLolAAAICLslAAAICLwlAAAICL0lAAAICL4lAAAICL8lAAAICMAlAAAICMElAAAICMIlAAAICMMlAAAICMQlAAAICMUlAAAICMYlAAAICMclAAAICMglAAAICMklAAAICMolAAAICMslAAAICMwlAAAICM0lAAAICM4lAAAICM8lAAAICNAlAAAICNElAAAICNIlAAAICNMlAAAICNQlAAAICNUlAAAICNYlAAAICNclAAAICNglAAAICNklAAAICNolAAAICNslAAAICNwlAAAICN0lAAAICN4lAAAICN8lAAAICOAlAAAICOElAAAICOIlAAAICOMlAAAICOQlAAAICOUlAAAICOYlAAAICOclAAAICOglAAAICOklAAAICOolAAAICOslAAAICOwlAAAICO0lAAAICO4lAAAICO8lAAAICPAlAAAICPElAAAICPIlAAAICPMlAAAICPQlAAAICPUlAAAICPYlAAAICPclAAAICPglAAAICPklAAAICPolAAAICPslAAAICPwlAAAICP0lAAAICP4lAAAICP8lAAAICAAmAAAICAEmAAAICAImAAAICAMmAAAICAQmAAAICAUmAAAICAYmAAAICAcmAAAICAgmAAAICAkmAAAICAomAAAICAsmAAAICAwmAAAICA0mAAAICA4mAAAICA8mAAAICBAmAAAICBEmAAAICBImAAAICBMmAAAICBQmAAAICBUmAAAICBYmAAAICBcmAAAICBgmAAAICBkmAAAICBomAAAICBsmAAAICBwmAAAICB0mAAAICB4mAAAICB8mAAAICCAmAAAICCEmAAAICCImAAAICCMmAAAICCQmAAAICCUmAAAICCYmAAAICCcmAAAICCgmAAAICCkmAAAICComAAAICCsmAAAICCwmAAAICC0mAAAICC4mAAAICC8mAAAICDAmAAAICDEmAAAICDImAAAICDMmAAAICDQmAAAICDUmAAAICDYmAAAICDcmAAAICDgmAAAICDkmAAAICDomAAAICDsmAAAICDwmAAAICD0mAAAICD4mAAAICD8mAAAICEAmAAAICEEmAAAICEImAAAICEMmAAAICEQmAAAICEUmAAAICEYmAAAICEcmAAAICEgmAAAICEkmAAAICEomAAAICEsmAAAICEwmAAAICE0mAAAICE4mAAAICE8mAAAICFAmAAAICFEmAAAICFImAAAICFMmAAAICFQmAAAICFUmAAAICFYmAAAICFcmAAAICFgmAAAICFkmAAAICFomAAAICFsmAAAICFwmAAAICF0mAAAICF4mAAAICF8mAAAICGAmAAAICGEmAAAICGImAAAICGMmAAAICGQmAAAICGUmAAAICGYmAAAICGcmAAAICGgmAAAICGkmAAAICGomAAAICGsmAAAICGwmAAAICG0mAAAICG4mAAAICG8mAAAICHAmAAAICHEmAAAICHImAAAICHMmAAAICHQmAAAICHUmAAAICHYmAAAICHcmAAAICHgmAAAICHkmAAAICHomAAAICHsmAAAICHwmAAAICH0mAAAICH4mAAAICH8mAAAICIAmAAAICIEmAAAICIImAAAICIMmAAAICIQmAAAICIUmAAAICIYmAAAICIcmAAAICIgmAAAICIkmAAAICIomAAAICIsmAAAICIwmAAAICI0mAAAICI4mAAAICI8mAAAICJAmAAAICJEmAAAICJImAAAICJMmAAAICJQmAAAICJUmAAAICJYmAAAICJcmAAAICJgmAAAICJkmAAAICJomAAAICJsmAAAICJwmAAAICJ0mAAAICJ4mAAAICJ8mAAAICKAmAAAICKEmAAAICKImAAAICKMmAAAICKQmAAAICKUmAAAICKYmAAAICKcmAAAICKgmAAAICKkmAAAICKomAAAICKsmAAAICKwmAAAICK0mAAAICK4mAAAICK8mAAAICLAmAAAICLEmAAAICLImAAAICLMmAAAICLQmAAAICLUmAAAICLYmAAAICLcmAAAICLgmAAAICLkmAAAICLomAAAICLsmAAAICLwmAAAICL0mAAAICL4mAAAICL8mAAAICMAmAAAICMEmAAAICMImAAAICMMmAAAICMQmAAAICMUmAAAICMYmAAAICMcmAAAICMgmAAAICMkmAAAICMomAAAICMsmAAAICMwmAAAICM0mAAAICM4mAAAICM8mAAAICNAmAAAICNEmAAAICNImAAAICNMmAAAICNQmAAAICNUmAAAICNYmAAAICNcmAAAICNgmAAAICNkmAAAICNomAAAICNsmAAAICNwmAAAICN0mAAAICN4mAAAICN8mAAAICOAmAAAICOEmAAAICOImAAAICOMmAAAICOQmAAAICOUmAAAICOYmAAAICOcmAAAICOgmAAAICOkmAAAICOomAAAICOsmAAAICOwmAAAICO0mAAAICO4mAAAICO8mAAAICPAmAAAICPEmAAAICPImAAAICPMmAAAICPQmAAAICPUmAAAICPYmAAAICPcmAAAICPgmAAAICPkmAAAICPomAAAICPsmAAAICPwmAAAICP0mAAAICP4mAAAICP8mAAAICAAnAAAICAEnAAAICAInAAAICAMnAAAICAQnAAAICAUnAAAICAYnAAAICAcnAAAICAgnAAAICAknAAAICAonAAAICAsnAAAICAwnAAAICA0nAAAICA4nAAAICA8nAAAL" } };
+ yield return new object[] { new ArraySegment<int>(new int[] { 1, 2, 3, 4, 5 }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAkCAAAAAAAAAAUAAAAPAgAAAAUAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAkCAAAAAAAAAAUAAAAPAgAAAAUAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAL" } };
+ yield return new object[] { new ArraySegment<int>(new int[] { 1, 2, 3, 4, 5 }, 1, 2), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAkCAAAAAQAAAAIAAAAPAgAAAAUAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAkCAAAAAQAAAAIAAAAPAgAAAAUAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAL" } };
+ yield return new object[] { Enumerable.Range(0, 10000).Select(i => (object)i).ToArray(), new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAABAnAAAICAAAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAICCkAAAAICCoAAAAICCsAAAAICCwAAAAICC0AAAAICC4AAAAICC8AAAAICDAAAAAICDEAAAAICDIAAAAICDMAAAAICDQAAAAICDUAAAAICDYAAAAICDcAAAAICDgAAAAICDkAAAAICDoAAAAICDsAAAAICDwAAAAICD0AAAAICD4AAAAICD8AAAAICEAAAAAICEEAAAAICEIAAAAICEMAAAAICEQAAAAICEUAAAAICEYAAAAICEcAAAAICEgAAAAICEkAAAAICEoAAAAICEsAAAAICEwAAAAICE0AAAAICE4AAAAICE8AAAAICFAAAAAICFEAAAAICFIAAAAICFMAAAAICFQAAAAICFUAAAAICFYAAAAICFcAAAAICFgAAAAICFkAAAAICFoAAAAICFsAAAAICFwAAAAICF0AAAAICF4AAAAICF8AAAAICGAAAAAICGEAAAAICGIAAAAICGMAAAAICGQAAAAICGUAAAAICGYAAAAICGcAAAAICGgAAAAICGkAAAAICGoAAAAICGsAAAAICGwAAAAICG0AAAAICG4AAAAICG8AAAAICHAAAAAICHEAAAAICHIAAAAICHMAAAAICHQAAAAICHUAAAAICHYAAAAICHcAAAAICHgAAAAICHkAAAAICHoAAAAICHsAAAAICHwAAAAICH0AAAAICH4AAAAICH8AAAAICIAAAAAICIEAAAAICIIAAAAICIMAAAAICIQAAAAICIUAAAAICIYAAAAICIcAAAAICIgAAAAICIkAAAAICIoAAAAICIsAAAAICIwAAAAICI0AAAAICI4AAAAICI8AAAAICJAAAAAICJEAAAAICJIAAAAICJMAAAAICJQAAAAICJUAAAAICJYAAAAICJcAAAAICJgAAAAICJkAAAAICJoAAAAICJsAAAAICJwAAAAICJ0AAAAICJ4AAAAICJ8AAAAICKAAAAAICKEAAAAICKIAAAAICKMAAAAICKQAAAAICKUAAAAICKYAAAAICKcAAAAICKgAAAAICKkAAAAICKoAAAAICKsAAAAICKwAAAAICK0AAAAICK4AAAAICK8AAAAICLAAAAAICLEAAAAICLIAAAAICLMAAAAICLQAAAAICLUAAAAICLYAAAAICLcAAAAICLgAAAAICLkAAAAICLoAAAAICLsAAAAICLwAAAAICL0AAAAICL4AAAAICL8AAAAICMAAAAAICMEAAAAICMIAAAAICMMAAAAICMQAAAAICMUAAAAICMYAAAAICMcAAAAICMgAAAAICMkAAAAICMoAAAAICMsAAAAICMwAAAAICM0AAAAICM4AAAAICM8AAAAICNAAAAAICNEAAAAICNIAAAAICNMAAAAICNQAAAAICNUAAAAICNYAAAAICNcAAAAICNgAAAAICNkAAAAICNoAAAAICNsAAAAICNwAAAAICN0AAAAICN4AAAAICN8AAAAICOAAAAAICOEAAAAICOIAAAAICOMAAAAICOQAAAAICOUAAAAICOYAAAAICOcAAAAICOgAAAAICOkAAAAICOoAAAAICOsAAAAICOwAAAAICO0AAAAICO4AAAAICO8AAAAICPAAAAAICPEAAAAICPIAAAAICPMAAAAICPQAAAAICPUAAAAICPYAAAAICPcAAAAICPgAAAAICPkAAAAICPoAAAAICPsAAAAICPwAAAAICP0AAAAICP4AAAAICP8AAAAICAABAAAICAEBAAAICAIBAAAICAMBAAAICAQBAAAICAUBAAAICAYBAAAICAcBAAAICAgBAAAICAkBAAAICAoBAAAICAsBAAAICAwBAAAICA0BAAAICA4BAAAICA8BAAAICBABAAAICBEBAAAICBIBAAAICBMBAAAICBQBAAAICBUBAAAICBYBAAAICBcBAAAICBgBAAAICBkBAAAICBoBAAAICBsBAAAICBwBAAAICB0BAAAICB4BAAAICB8BAAAICCABAAAICCEBAAAICCIBAAAICCMBAAAICCQBAAAICCUBAAAICCYBAAAICCcBAAAICCgBAAAICCkBAAAICCoBAAAICCsBAAAICCwBAAAICC0BAAAICC4BAAAICC8BAAAICDABAAAICDEBAAAICDIBAAAICDMBAAAICDQBAAAICDUBAAAICDYBAAAICDcBAAAICDgBAAAICDkBAAAICDoBAAAICDsBAAAICDwBAAAICD0BAAAICD4BAAAICD8BAAAICEABAAAICEEBAAAICEIBAAAICEMBAAAICEQBAAAICEUBAAAICEYBAAAICEcBAAAICEgBAAAICEkBAAAICEoBAAAICEsBAAAICEwBAAAICE0BAAAICE4BAAAICE8BAAAICFABAAAICFEBAAAICFIBAAAICFMBAAAICFQBAAAICFUBAAAICFYBAAAICFcBAAAICFgBAAAICFkBAAAICFoBAAAICFsBAAAICFwBAAAICF0BAAAICF4BAAAICF8BAAAICGABAAAICGEBAAAICGIBAAAICGMBAAAICGQBAAAICGUBAAAICGYBAAAICGcBAAAICGgBAAAICGkBAAAICGoBAAAICGsBAAAICGwBAAAICG0BAAAICG4BAAAICG8BAAAICHABAAAICHEBAAAICHIBAAAICHMBAAAICHQBAAAICHUBAAAICHYBAAAICHcBAAAICHgBAAAICHkBAAAICHoBAAAICHsBAAAICHwBAAAICH0BAAAICH4BAAAICH8BAAAICIABAAAICIEBAAAICIIBAAAICIMBAAAICIQBAAAICIUBAAAICIYBAAAICIcBAAAICIgBAAAICIkBAAAICIoBAAAICIsBAAAICIwBAAAICI0BAAAICI4BAAAICI8BAAAICJABAAAICJEBAAAICJIBAAAICJMBAAAICJQBAAAICJUBAAAICJYBAAAICJcBAAAICJgBAAAICJkBAAAICJoBAAAICJsBAAAICJwBAAAICJ0BAAAICJ4BAAAICJ8BAAAICKABAAAICKEBAAAICKIBAAAICKMBAAAICKQBAAAICKUBAAAICKYBAAAICKcBAAAICKgBAAAICKkBAAAICKoBAAAICKsBAAAICKwBAAAICK0BAAAICK4BAAAICK8BAAAICLABAAAICLEBAAAICLIBAAAICLMBAAAICLQBAAAICLUBAAAICLYBAAAICLcBAAAICLgBAAAICLkBAAAICLoBAAAICLsBAAAICLwBAAAICL0BAAAICL4BAAAICL8BAAAICMABAAAICMEBAAAICMIBAAAICMMBAAAICMQBAAAICMUBAAAICMYBAAAICMcBAAAICMgBAAAICMkBAAAICMoBAAAICMsBAAAICMwBAAAICM0BAAAICM4BAAAICM8BAAAICNABAAAICNEBAAAICNIBAAAICNMBAAAICNQBAAAICNUBAAAICNYBAAAICNcBAAAICNgBAAAICNkBAAAICNoBAAAICNsBAAAICNwBAAAICN0BAAAICN4BAAAICN8BAAAICOABAAAICOEBAAAICOIBAAAICOMBAAAICOQBAAAICOUBAAAICOYBAAAICOcBAAAICOgBAAAICOkBAAAICOoBAAAICOsBAAAICOwBAAAICO0BAAAICO4BAAAICO8BAAAICPABAAAICPEBAAAICPIBAAAICPMBAAAICPQBAAAICPUBAAAICPYBAAAICPcBAAAICPgBAAAICPkBAAAICPoBAAAICPsBAAAICPwBAAAICP0BAAAICP4BAAAICP8BAAAICAACAAAICAECAAAICAICAAAICAMCAAAICAQCAAAICAUCAAAICAYCAAAICAcCAAAICAgCAAAICAkCAAAICAoCAAAICAsCAAAICAwCAAAICA0CAAAICA4CAAAICA8CAAAICBACAAAICBECAAAICBICAAAICBMCAAAICBQCAAAICBUCAAAICBYCAAAICBcCAAAICBgCAAAICBkCAAAICBoCAAAICBsCAAAICBwCAAAICB0CAAAICB4CAAAICB8CAAAICCACAAAICCECAAAICCICAAAICCMCAAAICCQCAAAICCUCAAAICCYCAAAICCcCAAAICCgCAAAICCkCAAAICCoCAAAICCsCAAAICCwCAAAICC0CAAAICC4CAAAICC8CAAAICDACAAAICDECAAAICDICAAAICDMCAAAICDQCAAAICDUCAAAICDYCAAAICDcCAAAICDgCAAAICDkCAAAICDoCAAAICDsCAAAICDwCAAAICD0CAAAICD4CAAAICD8CAAAICEACAAAICEECAAAICEICAAAICEMCAAAICEQCAAAICEUCAAAICEYCAAAICEcCAAAICEgCAAAICEkCAAAICEoCAAAICEsCAAAICEwCAAAICE0CAAAICE4CAAAICE8CAAAICFACAAAICFECAAAICFICAAAICFMCAAAICFQCAAAICFUCAAAICFYCAAAICFcCAAAICFgCAAAICFkCAAAICFoCAAAICFsCAAAICFwCAAAICF0CAAAICF4CAAAICF8CAAAICGACAAAICGECAAAICGICAAAICGMCAAAICGQCAAAICGUCAAAICGYCAAAICGcCAAAICGgCAAAICGkCAAAICGoCAAAICGsCAAAICGwCAAAICG0CAAAICG4CAAAICG8CAAAICHACAAAICHECAAAICHICAAAICHMCAAAICHQCAAAICHUCAAAICHYCAAAICHcCAAAICHgCAAAICHkCAAAICHoCAAAICHsCAAAICHwCAAAICH0CAAAICH4CAAAICH8CAAAICIACAAAICIECAAAICIICAAAICIMCAAAICIQCAAAICIUCAAAICIYCAAAICIcCAAAICIgCAAAICIkCAAAICIoCAAAICIsCAAAICIwCAAAICI0CAAAICI4CAAAICI8CAAAICJACAAAICJECAAAICJICAAAICJMCAAAICJQCAAAICJUCAAAICJYCAAAICJcCAAAICJgCAAAICJkCAAAICJoCAAAICJsCAAAICJwCAAAICJ0CAAAICJ4CAAAICJ8CAAAICKACAAAICKECAAAICKICAAAICKMCAAAICKQCAAAICKUCAAAICKYCAAAICKcCAAAICKgCAAAICKkCAAAICKoCAAAICKsCAAAICKwCAAAICK0CAAAICK4CAAAICK8CAAAICLACAAAICLECAAAICLICAAAICLMCAAAICLQCAAAICLUCAAAICLYCAAAICLcCAAAICLgCAAAICLkCAAAICLoCAAAICLsCAAAICLwCAAAICL0CAAAICL4CAAAICL8CAAAICMACAAAICMECAAAICMICAAAICMMCAAAICMQCAAAICMUCAAAICMYCAAAICMcCAAAICMgCAAAICMkCAAAICMoCAAAICMsCAAAICMwCAAAICM0CAAAICM4CAAAICM8CAAAICNACAAAICNECAAAICNICAAAICNMCAAAICNQCAAAICNUCAAAICNYCAAAICNcCAAAICNgCAAAICNkCAAAICNoCAAAICNsCAAAICNwCAAAICN0CAAAICN4CAAAICN8CAAAICOACAAAICOECAAAICOICAAAICOMCAAAICOQCAAAICOUCAAAICOYCAAAICOcCAAAICOgCAAAICOkCAAAICOoCAAAICOsCAAAICOwCAAAICO0CAAAICO4CAAAICO8CAAAICPACAAAICPECAAAICPICAAAICPMCAAAICPQCAAAICPUCAAAICPYCAAAICPcCAAAICPgCAAAICPkCAAAICPoCAAAICPsCAAAICPwCAAAICP0CAAAICP4CAAAICP8CAAAICAADAAAICAEDAAAICAIDAAAICAMDAAAICAQDAAAICAUDAAAICAYDAAAICAcDAAAICAgDAAAICAkDAAAICAoDAAAICAsDAAAICAwDAAAICA0DAAAICA4DAAAICA8DAAAICBADAAAICBEDAAAICBIDAAAICBMDAAAICBQDAAAICBUDAAAICBYDAAAICBcDAAAICBgDAAAICBkDAAAICBoDAAAICBsDAAAICBwDAAAICB0DAAAICB4DAAAICB8DAAAICCADAAAICCEDAAAICCIDAAAICCMDAAAICCQDAAAICCUDAAAICCYDAAAICCcDAAAICCgDAAAICCkDAAAICCoDAAAICCsDAAAICCwDAAAICC0DAAAICC4DAAAICC8DAAAICDADAAAICDEDAAAICDIDAAAICDMDAAAICDQDAAAICDUDAAAICDYDAAAICDcDAAAICDgDAAAICDkDAAAICDoDAAAICDsDAAAICDwDAAAICD0DAAAICD4DAAAICD8DAAAICEADAAAICEEDAAAICEIDAAAICEMDAAAICEQDAAAICEUDAAAICEYDAAAICEcDAAAICEgDAAAICEkDAAAICEoDAAAICEsDAAAICEwDAAAICE0DAAAICE4DAAAICE8DAAAICFADAAAICFEDAAAICFIDAAAICFMDAAAICFQDAAAICFUDAAAICFYDAAAICFcDAAAICFgDAAAICFkDAAAICFoDAAAICFsDAAAICFwDAAAICF0DAAAICF4DAAAICF8DAAAICGADAAAICGEDAAAICGIDAAAICGMDAAAICGQDAAAICGUDAAAICGYDAAAICGcDAAAICGgDAAAICGkDAAAICGoDAAAICGsDAAAICGwDAAAICG0DAAAICG4DAAAICG8DAAAICHADAAAICHEDAAAICHIDAAAICHMDAAAICHQDAAAICHUDAAAICHYDAAAICHcDAAAICHgDAAAICHkDAAAICHoDAAAICHsDAAAICHwDAAAICH0DAAAICH4DAAAICH8DAAAICIADAAAICIEDAAAICIIDAAAICIMDAAAICIQDAAAICIUDAAAICIYDAAAICIcDAAAICIgDAAAICIkDAAAICIoDAAAICIsDAAAICIwDAAAICI0DAAAICI4DAAAICI8DAAAICJADAAAICJEDAAAICJIDAAAICJMDAAAICJQDAAAICJUDAAAICJYDAAAICJcDAAAICJgDAAAICJkDAAAICJoDAAAICJsDAAAICJwDAAAICJ0DAAAICJ4DAAAICJ8DAAAICKADAAAICKEDAAAICKIDAAAICKMDAAAICKQDAAAICKUDAAAICKYDAAAICKcDAAAICKgDAAAICKkDAAAICKoDAAAICKsDAAAICKwDAAAICK0DAAAICK4DAAAICK8DAAAICLADAAAICLEDAAAICLIDAAAICLMDAAAICLQDAAAICLUDAAAICLYDAAAICLcDAAAICLgDAAAICLkDAAAICLoDAAAICLsDAAAICLwDAAAICL0DAAAICL4DAAAICL8DAAAICMADAAAICMEDAAAICMIDAAAICMMDAAAICMQDAAAICMUDAAAICMYDAAAICMcDAAAICMgDAAAICMkDAAAICMoDAAAICMsDAAAICMwDAAAICM0DAAAICM4DAAAICM8DAAAICNADAAAICNEDAAAICNIDAAAICNMDAAAICNQDAAAICNUDAAAICNYDAAAICNcDAAAICNgDAAAICNkDAAAICNoDAAAICNsDAAAICNwDAAAICN0DAAAICN4DAAAICN8DAAAICOADAAAICOEDAAAICOIDAAAICOMDAAAICOQDAAAICOUDAAAICOYDAAAICOcDAAAICOgDAAAICOkDAAAICOoDAAAICOsDAAAICOwDAAAICO0DAAAICO4DAAAICO8DAAAICPADAAAICPEDAAAICPIDAAAICPMDAAAICPQDAAAICPUDAAAICPYDAAAICPcDAAAICPgDAAAICPkDAAAICPoDAAAICPsDAAAICPwDAAAICP0DAAAICP4DAAAICP8DAAAICAAEAAAICAEEAAAICAIEAAAICAMEAAAICAQEAAAICAUEAAAICAYEAAAICAcEAAAICAgEAAAICAkEAAAICAoEAAAICAsEAAAICAwEAAAICA0EAAAICA4EAAAICA8EAAAICBAEAAAICBEEAAAICBIEAAAICBMEAAAICBQEAAAICBUEAAAICBYEAAAICBcEAAAICBgEAAAICBkEAAAICBoEAAAICBsEAAAICBwEAAAICB0EAAAICB4EAAAICB8EAAAICCAEAAAICCEEAAAICCIEAAAICCMEAAAICCQEAAAICCUEAAAICCYEAAAICCcEAAAICCgEAAAICCkEAAAICCoEAAAICCsEAAAICCwEAAAICC0EAAAICC4EAAAICC8EAAAICDAEAAAICDEEAAAICDIEAAAICDMEAAAICDQEAAAICDUEAAAICDYEAAAICDcEAAAICDgEAAAICDkEAAAICDoEAAAICDsEAAAICDwEAAAICD0EAAAICD4EAAAICD8EAAAICEAEAAAICEEEAAAICEIEAAAICEMEAAAICEQEAAAICEUEAAAICEYEAAAICEcEAAAICEgEAAAICEkEAAAICEoEAAAICEsEAAAICEwEAAAICE0EAAAICE4EAAAICE8EAAAICFAEAAAICFEEAAAICFIEAAAICFMEAAAICFQEAAAICFUEAAAICFYEAAAICFcEAAAICFgEAAAICFkEAAAICFoEAAAICFsEAAAICFwEAAAICF0EAAAICF4EAAAICF8EAAAICGAEAAAICGEEAAAICGIEAAAICGMEAAAICGQEAAAICGUEAAAICGYEAAAICGcEAAAICGgEAAAICGkEAAAICGoEAAAICGsEAAAICGwEAAAICG0EAAAICG4EAAAICG8EAAAICHAEAAAICHEEAAAICHIEAAAICHMEAAAICHQEAAAICHUEAAAICHYEAAAICHcEAAAICHgEAAAICHkEAAAICHoEAAAICHsEAAAICHwEAAAICH0EAAAICH4EAAAICH8EAAAICIAEAAAICIEEAAAICIIEAAAICIMEAAAICIQEAAAICIUEAAAICIYEAAAICIcEAAAICIgEAAAICIkEAAAICIoEAAAICIsEAAAICIwEAAAICI0EAAAICI4EAAAICI8EAAAICJAEAAAICJEEAAAICJIEAAAICJMEAAAICJQEAAAICJUEAAAICJYEAAAICJcEAAAICJgEAAAICJkEAAAICJoEAAAICJsEAAAICJwEAAAICJ0EAAAICJ4EAAAICJ8EAAAICKAEAAAICKEEAAAICKIEAAAICKMEAAAICKQEAAAICKUEAAAICKYEAAAICKcEAAAICKgEAAAICKkEAAAICKoEAAAICKsEAAAICKwEAAAICK0EAAAICK4EAAAICK8EAAAICLAEAAAICLEEAAAICLIEAAAICLMEAAAICLQEAAAICLUEAAAICLYEAAAICLcEAAAICLgEAAAICLkEAAAICLoEAAAICLsEAAAICLwEAAAICL0EAAAICL4EAAAICL8EAAAICMAEAAAICMEEAAAICMIEAAAICMMEAAAICMQEAAAICMUEAAAICMYEAAAICMcEAAAICMgEAAAICMkEAAAICMoEAAAICMsEAAAICMwEAAAICM0EAAAICM4EAAAICM8EAAAICNAEAAAICNEEAAAICNIEAAAICNMEAAAICNQEAAAICNUEAAAICNYEAAAICNcEAAAICNgEAAAICNkEAAAICNoEAAAICNsEAAAICNwEAAAICN0EAAAICN4EAAAICN8EAAAICOAEAAAICOEEAAAICOIEAAAICOMEAAAICOQEAAAICOUEAAAICOYEAAAICOcEAAAICOgEAAAICOkEAAAICOoEAAAICOsEAAAICOwEAAAICO0EAAAICO4EAAAICO8EAAAICPAEAAAICPEEAAAICPIEAAAICPMEAAAICPQEAAAICPUEAAAICPYEAAAICPcEAAAICPgEAAAICPkEAAAICPoEAAAICPsEAAAICPwEAAAICP0EAAAICP4EAAAICP8EAAAICAAFAAAICAEFAAAICAIFAAAICAMFAAAICAQFAAAICAUFAAAICAYFAAAICAcFAAAICAgFAAAICAkFAAAICAoFAAAICAsFAAAICAwFAAAICA0FAAAICA4FAAAICA8FAAAICBAFAAAICBEFAAAICBIFAAAICBMFAAAICBQFAAAICBUFAAAICBYFAAAICBcFAAAICBgFAAAICBkFAAAICBoFAAAICBsFAAAICBwFAAAICB0FAAAICB4FAAAICB8FAAAICCAFAAAICCEFAAAICCIFAAAICCMFAAAICCQFAAAICCUFAAAICCYFAAAICCcFAAAICCgFAAAICCkFAAAICCoFAAAICCsFAAAICCwFAAAICC0FAAAICC4FAAAICC8FAAAICDAFAAAICDEFAAAICDIFAAAICDMFAAAICDQFAAAICDUFAAAICDYFAAAICDcFAAAICDgFAAAICDkFAAAICDoFAAAICDsFAAAICDwFAAAICD0FAAAICD4FAAAICD8FAAAICEAFAAAICEEFAAAICEIFAAAICEMFAAAICEQFAAAICEUFAAAICEYFAAAICEcFAAAICEgFAAAICEkFAAAICEoFAAAICEsFAAAICEwFAAAICE0FAAAICE4FAAAICE8FAAAICFAFAAAICFEFAAAICFIFAAAICFMFAAAICFQFAAAICFUFAAAICFYFAAAICFcFAAAICFgFAAAICFkFAAAICFoFAAAICFsFAAAICFwFAAAICF0FAAAICF4FAAAICF8FAAAICGAFAAAICGEFAAAICGIFAAAICGMFAAAICGQFAAAICGUFAAAICGYFAAAICGcFAAAICGgFAAAICGkFAAAICGoFAAAICGsFAAAICGwFAAAICG0FAAAICG4FAAAICG8FAAAICHAFAAAICHEFAAAICHIFAAAICHMFAAAICHQFAAAICHUFAAAICHYFAAAICHcFAAAICHgFAAAICHkFAAAICHoFAAAICHsFAAAICHwFAAAICH0FAAAICH4FAAAICH8FAAAICIAFAAAICIEFAAAICIIFAAAICIMFAAAICIQFAAAICIUFAAAICIYFAAAICIcFAAAICIgFAAAICIkFAAAICIoFAAAICIsFAAAICIwFAAAICI0FAAAICI4FAAAICI8FAAAICJAFAAAICJEFAAAICJIFAAAICJMFAAAICJQFAAAICJUFAAAICJYFAAAICJcFAAAICJgFAAAICJkFAAAICJoFAAAICJsFAAAICJwFAAAICJ0FAAAICJ4FAAAICJ8FAAAICKAFAAAICKEFAAAICKIFAAAICKMFAAAICKQFAAAICKUFAAAICKYFAAAICKcFAAAICKgFAAAICKkFAAAICKoFAAAICKsFAAAICKwFAAAICK0FAAAICK4FAAAICK8FAAAICLAFAAAICLEFAAAICLIFAAAICLMFAAAICLQFAAAICLUFAAAICLYFAAAICLcFAAAICLgFAAAICLkFAAAICLoFAAAICLsFAAAICLwFAAAICL0FAAAICL4FAAAICL8FAAAICMAFAAAICMEFAAAICMIFAAAICMMFAAAICMQFAAAICMUFAAAICMYFAAAICMcFAAAICMgFAAAICMkFAAAICMoFAAAICMsFAAAICMwFAAAICM0FAAAICM4FAAAICM8FAAAICNAFAAAICNEFAAAICNIFAAAICNMFAAAICNQFAAAICNUFAAAICNYFAAAICNcFAAAICNgFAAAICNkFAAAICNoFAAAICNsFAAAICNwFAAAICN0FAAAICN4FAAAICN8FAAAICOAFAAAICOEFAAAICOIFAAAICOMFAAAICOQFAAAICOUFAAAICOYFAAAICOcFAAAICOgFAAAICOkFAAAICOoFAAAICOsFAAAICOwFAAAICO0FAAAICO4FAAAICO8FAAAICPAFAAAICPEFAAAICPIFAAAICPMFAAAICPQFAAAICPUFAAAICPYFAAAICPcFAAAICPgFAAAICPkFAAAICPoFAAAICPsFAAAICPwFAAAICP0FAAAICP4FAAAICP8FAAAICAAGAAAICAEGAAAICAIGAAAICAMGAAAICAQGAAAICAUGAAAICAYGAAAICAcGAAAICAgGAAAICAkGAAAICAoGAAAICAsGAAAICAwGAAAICA0GAAAICA4GAAAICA8GAAAICBAGAAAICBEGAAAICBIGAAAICBMGAAAICBQGAAAICBUGAAAICBYGAAAICBcGAAAICBgGAAAICBkGAAAICBoGAAAICBsGAAAICBwGAAAICB0GAAAICB4GAAAICB8GAAAICCAGAAAICCEGAAAICCIGAAAICCMGAAAICCQGAAAICCUGAAAICCYGAAAICCcGAAAICCgGAAAICCkGAAAICCoGAAAICCsGAAAICCwGAAAICC0GAAAICC4GAAAICC8GAAAICDAGAAAICDEGAAAICDIGAAAICDMGAAAICDQGAAAICDUGAAAICDYGAAAICDcGAAAICDgGAAAICDkGAAAICDoGAAAICDsGAAAICDwGAAAICD0GAAAICD4GAAAICD8GAAAICEAGAAAICEEGAAAICEIGAAAICEMGAAAICEQGAAAICEUGAAAICEYGAAAICEcGAAAICEgGAAAICEkGAAAICEoGAAAICEsGAAAICEwGAAAICE0GAAAICE4GAAAICE8GAAAICFAGAAAICFEGAAAICFIGAAAICFMGAAAICFQGAAAICFUGAAAICFYGAAAICFcGAAAICFgGAAAICFkGAAAICFoGAAAICFsGAAAICFwGAAAICF0GAAAICF4GAAAICF8GAAAICGAGAAAICGEGAAAICGIGAAAICGMGAAAICGQGAAAICGUGAAAICGYGAAAICGcGAAAICGgGAAAICGkGAAAICGoGAAAICGsGAAAICGwGAAAICG0GAAAICG4GAAAICG8GAAAICHAGAAAICHEGAAAICHIGAAAICHMGAAAICHQGAAAICHUGAAAICHYGAAAICHcGAAAICHgGAAAICHkGAAAICHoGAAAICHsGAAAICHwGAAAICH0GAAAICH4GAAAICH8GAAAICIAGAAAICIEGAAAICIIGAAAICIMGAAAICIQGAAAICIUGAAAICIYGAAAICIcGAAAICIgGAAAICIkGAAAICIoGAAAICIsGAAAICIwGAAAICI0GAAAICI4GAAAICI8GAAAICJAGAAAICJEGAAAICJIGAAAICJMGAAAICJQGAAAICJUGAAAICJYGAAAICJcGAAAICJgGAAAICJkGAAAICJoGAAAICJsGAAAICJwGAAAICJ0GAAAICJ4GAAAICJ8GAAAICKAGAAAICKEGAAAICKIGAAAICKMGAAAICKQGAAAICKUGAAAICKYGAAAICKcGAAAICKgGAAAICKkGAAAICKoGAAAICKsGAAAICKwGAAAICK0GAAAICK4GAAAICK8GAAAICLAGAAAICLEGAAAICLIGAAAICLMGAAAICLQGAAAICLUGAAAICLYGAAAICLcGAAAICLgGAAAICLkGAAAICLoGAAAICLsGAAAICLwGAAAICL0GAAAICL4GAAAICL8GAAAICMAGAAAICMEGAAAICMIGAAAICMMGAAAICMQGAAAICMUGAAAICMYGAAAICMcGAAAICMgGAAAICMkGAAAICMoGAAAICMsGAAAICMwGAAAICM0GAAAICM4GAAAICM8GAAAICNAGAAAICNEGAAAICNIGAAAICNMGAAAICNQGAAAICNUGAAAICNYGAAAICNcGAAAICNgGAAAICNkGAAAICNoGAAAICNsGAAAICNwGAAAICN0GAAAICN4GAAAICN8GAAAICOAGAAAICOEGAAAICOIGAAAICOMGAAAICOQGAAAICOUGAAAICOYGAAAICOcGAAAICOgGAAAICOkGAAAICOoGAAAICOsGAAAICOwGAAAICO0GAAAICO4GAAAICO8GAAAICPAGAAAICPEGAAAICPIGAAAICPMGAAAICPQGAAAICPUGAAAICPYGAAAICPcGAAAICPgGAAAICPkGAAAICPoGAAAICPsGAAAICPwGAAAICP0GAAAICP4GAAAICP8GAAAICAAHAAAICAEHAAAICAIHAAAICAMHAAAICAQHAAAICAUHAAAICAYHAAAICAcHAAAICAgHAAAICAkHAAAICAoHAAAICAsHAAAICAwHAAAICA0HAAAICA4HAAAICA8HAAAICBAHAAAICBEHAAAICBIHAAAICBMHAAAICBQHAAAICBUHAAAICBYHAAAICBcHAAAICBgHAAAICBkHAAAICBoHAAAICBsHAAAICBwHAAAICB0HAAAICB4HAAAICB8HAAAICCAHAAAICCEHAAAICCIHAAAICCMHAAAICCQHAAAICCUHAAAICCYHAAAICCcHAAAICCgHAAAICCkHAAAICCoHAAAICCsHAAAICCwHAAAICC0HAAAICC4HAAAICC8HAAAICDAHAAAICDEHAAAICDIHAAAICDMHAAAICDQHAAAICDUHAAAICDYHAAAICDcHAAAICDgHAAAICDkHAAAICDoHAAAICDsHAAAICDwHAAAICD0HAAAICD4HAAAICD8HAAAICEAHAAAICEEHAAAICEIHAAAICEMHAAAICEQHAAAICEUHAAAICEYHAAAICEcHAAAICEgHAAAICEkHAAAICEoHAAAICEsHAAAICEwHAAAICE0HAAAICE4HAAAICE8HAAAICFAHAAAICFEHAAAICFIHAAAICFMHAAAICFQHAAAICFUHAAAICFYHAAAICFcHAAAICFgHAAAICFkHAAAICFoHAAAICFsHAAAICFwHAAAICF0HAAAICF4HAAAICF8HAAAICGAHAAAICGEHAAAICGIHAAAICGMHAAAICGQHAAAICGUHAAAICGYHAAAICGcHAAAICGgHAAAICGkHAAAICGoHAAAICGsHAAAICGwHAAAICG0HAAAICG4HAAAICG8HAAAICHAHAAAICHEHAAAICHIHAAAICHMHAAAICHQHAAAICHUHAAAICHYHAAAICHcHAAAICHgHAAAICHkHAAAICHoHAAAICHsHAAAICHwHAAAICH0HAAAICH4HAAAICH8HAAAICIAHAAAICIEHAAAICIIHAAAICIMHAAAICIQHAAAICIUHAAAICIYHAAAICIcHAAAICIgHAAAICIkHAAAICIoHAAAICIsHAAAICIwHAAAICI0HAAAICI4HAAAICI8HAAAICJAHAAAICJEHAAAICJIHAAAICJMHAAAICJQHAAAICJUHAAAICJYHAAAICJcHAAAICJgHAAAICJkHAAAICJoHAAAICJsHAAAICJwHAAAICJ0HAAAICJ4HAAAICJ8HAAAICKAHAAAICKEHAAAICKIHAAAICKMHAAAICKQHAAAICKUHAAAICKYHAAAICKcHAAAICKgHAAAICKkHAAAICKoHAAAICKsHAAAICKwHAAAICK0HAAAICK4HAAAICK8HAAAICLAHAAAICLEHAAAICLIHAAAICLMHAAAICLQHAAAICLUHAAAICLYHAAAICLcHAAAICLgHAAAICLkHAAAICLoHAAAICLsHAAAICLwHAAAICL0HAAAICL4HAAAICL8HAAAICMAHAAAICMEHAAAICMIHAAAICMMHAAAICMQHAAAICMUHAAAICMYHAAAICMcHAAAICMgHAAAICMkHAAAICMoHAAAICMsHAAAICMwHAAAICM0HAAAICM4HAAAICM8HAAAICNAHAAAICNEHAAAICNIHAAAICNMHAAAICNQHAAAICNUHAAAICNYHAAAICNcHAAAICNgHAAAICNkHAAAICNoHAAAICNsHAAAICNwHAAAICN0HAAAICN4HAAAICN8HAAAICOAHAAAICOEHAAAICOIHAAAICOMHAAAICOQHAAAICOUHAAAICOYHAAAICOcHAAAICOgHAAAICOkHAAAICOoHAAAICOsHAAAICOwHAAAICO0HAAAICO4HAAAICO8HAAAICPAHAAAICPEHAAAICPIHAAAICPMHAAAICPQHAAAICPUHAAAICPYHAAAICPcHAAAICPgHAAAICPkHAAAICPoHAAAICPsHAAAICPwHAAAICP0HAAAICP4HAAAICP8HAAAICAAIAAAICAEIAAAICAIIAAAICAMIAAAICAQIAAAICAUIAAAICAYIAAAICAcIAAAICAgIAAAICAkIAAAICAoIAAAICAsIAAAICAwIAAAICA0IAAAICA4IAAAICA8IAAAICBAIAAAICBEIAAAICBIIAAAICBMIAAAICBQIAAAICBUIAAAICBYIAAAICBcIAAAICBgIAAAICBkIAAAICBoIAAAICBsIAAAICBwIAAAICB0IAAAICB4IAAAICB8IAAAICCAIAAAICCEIAAAICCIIAAAICCMIAAAICCQIAAAICCUIAAAICCYIAAAICCcIAAAICCgIAAAICCkIAAAICCoIAAAICCsIAAAICCwIAAAICC0IAAAICC4IAAAICC8IAAAICDAIAAAICDEIAAAICDIIAAAICDMIAAAICDQIAAAICDUIAAAICDYIAAAICDcIAAAICDgIAAAICDkIAAAICDoIAAAICDsIAAAICDwIAAAICD0IAAAICD4IAAAICD8IAAAICEAIAAAICEEIAAAICEIIAAAICEMIAAAICEQIAAAICEUIAAAICEYIAAAICEcIAAAICEgIAAAICEkIAAAICEoIAAAICEsIAAAICEwIAAAICE0IAAAICE4IAAAICE8IAAAICFAIAAAICFEIAAAICFIIAAAICFMIAAAICFQIAAAICFUIAAAICFYIAAAICFcIAAAICFgIAAAICFkIAAAICFoIAAAICFsIAAAICFwIAAAICF0IAAAICF4IAAAICF8IAAAICGAIAAAICGEIAAAICGIIAAAICGMIAAAICGQIAAAICGUIAAAICGYIAAAICGcIAAAICGgIAAAICGkIAAAICGoIAAAICGsIAAAICGwIAAAICG0IAAAICG4IAAAICG8IAAAICHAIAAAICHEIAAAICHIIAAAICHMIAAAICHQIAAAICHUIAAAICHYIAAAICHcIAAAICHgIAAAICHkIAAAICHoIAAAICHsIAAAICHwIAAAICH0IAAAICH4IAAAICH8IAAAICIAIAAAICIEIAAAICIIIAAAICIMIAAAICIQIAAAICIUIAAAICIYIAAAICIcIAAAICIgIAAAICIkIAAAICIoIAAAICIsIAAAICIwIAAAICI0IAAAICI4IAAAICI8IAAAICJAIAAAICJEIAAAICJIIAAAICJMIAAAICJQIAAAICJUIAAAICJYIAAAICJcIAAAICJgIAAAICJkIAAAICJoIAAAICJsIAAAICJwIAAAICJ0IAAAICJ4IAAAICJ8IAAAICKAIAAAICKEIAAAICKIIAAAICKMIAAAICKQIAAAICKUIAAAICKYIAAAICKcIAAAICKgIAAAICKkIAAAICKoIAAAICKsIAAAICKwIAAAICK0IAAAICK4IAAAICK8IAAAICLAIAAAICLEIAAAICLIIAAAICLMIAAAICLQIAAAICLUIAAAICLYIAAAICLcIAAAICLgIAAAICLkIAAAICLoIAAAICLsIAAAICLwIAAAICL0IAAAICL4IAAAICL8IAAAICMAIAAAICMEIAAAICMIIAAAICMMIAAAICMQIAAAICMUIAAAICMYIAAAICMcIAAAICMgIAAAICMkIAAAICMoIAAAICMsIAAAICMwIAAAICM0IAAAICM4IAAAICM8IAAAICNAIAAAICNEIAAAICNIIAAAICNMIAAAICNQIAAAICNUIAAAICNYIAAAICNcIAAAICNgIAAAICNkIAAAICNoIAAAICNsIAAAICNwIAAAICN0IAAAICN4IAAAICN8IAAAICOAIAAAICOEIAAAICOIIAAAICOMIAAAICOQIAAAICOUIAAAICOYIAAAICOcIAAAICOgIAAAICOkIAAAICOoIAAAICOsIAAAICOwIAAAICO0IAAAICO4IAAAICO8IAAAICPAIAAAICPEIAAAICPIIAAAICPMIAAAICPQIAAAICPUIAAAICPYIAAAICPcIAAAICPgIAAAICPkIAAAICPoIAAAICPsIAAAICPwIAAAICP0IAAAICP4IAAAICP8IAAAICAAJAAAICAEJAAAICAIJAAAICAMJAAAICAQJAAAICAUJAAAICAYJAAAICAcJAAAICAgJAAAICAkJAAAICAoJAAAICAsJAAAICAwJAAAICA0JAAAICA4JAAAICA8JAAAICBAJAAAICBEJAAAICBIJAAAICBMJAAAICBQJAAAICBUJAAAICBYJAAAICBcJAAAICBgJAAAICBkJAAAICBoJAAAICBsJAAAICBwJAAAICB0JAAAICB4JAAAICB8JAAAICCAJAAAICCEJAAAICCIJAAAICCMJAAAICCQJAAAICCUJAAAICCYJAAAICCcJAAAICCgJAAAICCkJAAAICCoJAAAICCsJAAAICCwJAAAICC0JAAAICC4JAAAICC8JAAAICDAJAAAICDEJAAAICDIJAAAICDMJAAAICDQJAAAICDUJAAAICDYJAAAICDcJAAAICDgJAAAICDkJAAAICDoJAAAICDsJAAAICDwJAAAICD0JAAAICD4JAAAICD8JAAAICEAJAAAICEEJAAAICEIJAAAICEMJAAAICEQJAAAICEUJAAAICEYJAAAICEcJAAAICEgJAAAICEkJAAAICEoJAAAICEsJAAAICEwJAAAICE0JAAAICE4JAAAICE8JAAAICFAJAAAICFEJAAAICFIJAAAICFMJAAAICFQJAAAICFUJAAAICFYJAAAICFcJAAAICFgJAAAICFkJAAAICFoJAAAICFsJAAAICFwJAAAICF0JAAAICF4JAAAICF8JAAAICGAJAAAICGEJAAAICGIJAAAICGMJAAAICGQJAAAICGUJAAAICGYJAAAICGcJAAAICGgJAAAICGkJAAAICGoJAAAICGsJAAAICGwJAAAICG0JAAAICG4JAAAICG8JAAAICHAJAAAICHEJAAAICHIJAAAICHMJAAAICHQJAAAICHUJAAAICHYJAAAICHcJAAAICHgJAAAICHkJAAAICHoJAAAICHsJAAAICHwJAAAICH0JAAAICH4JAAAICH8JAAAICIAJAAAICIEJAAAICIIJAAAICIMJAAAICIQJAAAICIUJAAAICIYJAAAICIcJAAAICIgJAAAICIkJAAAICIoJAAAICIsJAAAICIwJAAAICI0JAAAICI4JAAAICI8JAAAICJAJAAAICJEJAAAICJIJAAAICJMJAAAICJQJAAAICJUJAAAICJYJAAAICJcJAAAICJgJAAAICJkJAAAICJoJAAAICJsJAAAICJwJAAAICJ0JAAAICJ4JAAAICJ8JAAAICKAJAAAICKEJAAAICKIJAAAICKMJAAAICKQJAAAICKUJAAAICKYJAAAICKcJAAAICKgJAAAICKkJAAAICKoJAAAICKsJAAAICKwJAAAICK0JAAAICK4JAAAICK8JAAAICLAJAAAICLEJAAAICLIJAAAICLMJAAAICLQJAAAICLUJAAAICLYJAAAICLcJAAAICLgJAAAICLkJAAAICLoJAAAICLsJAAAICLwJAAAICL0JAAAICL4JAAAICL8JAAAICMAJAAAICMEJAAAICMIJAAAICMMJAAAICMQJAAAICMUJAAAICMYJAAAICMcJAAAICMgJAAAICMkJAAAICMoJAAAICMsJAAAICMwJAAAICM0JAAAICM4JAAAICM8JAAAICNAJAAAICNEJAAAICNIJAAAICNMJAAAICNQJAAAICNUJAAAICNYJAAAICNcJAAAICNgJAAAICNkJAAAICNoJAAAICNsJAAAICNwJAAAICN0JAAAICN4JAAAICN8JAAAICOAJAAAICOEJAAAICOIJAAAICOMJAAAICOQJAAAICOUJAAAICOYJAAAICOcJAAAICOgJAAAICOkJAAAICOoJAAAICOsJAAAICOwJAAAICO0JAAAICO4JAAAICO8JAAAICPAJAAAICPEJAAAICPIJAAAICPMJAAAICPQJAAAICPUJAAAICPYJAAAICPcJAAAICPgJAAAICPkJAAAICPoJAAAICPsJAAAICPwJAAAICP0JAAAICP4JAAAICP8JAAAICAAKAAAICAEKAAAICAIKAAAICAMKAAAICAQKAAAICAUKAAAICAYKAAAICAcKAAAICAgKAAAICAkKAAAICAoKAAAICAsKAAAICAwKAAAICA0KAAAICA4KAAAICA8KAAAICBAKAAAICBEKAAAICBIKAAAICBMKAAAICBQKAAAICBUKAAAICBYKAAAICBcKAAAICBgKAAAICBkKAAAICBoKAAAICBsKAAAICBwKAAAICB0KAAAICB4KAAAICB8KAAAICCAKAAAICCEKAAAICCIKAAAICCMKAAAICCQKAAAICCUKAAAICCYKAAAICCcKAAAICCgKAAAICCkKAAAICCoKAAAICCsKAAAICCwKAAAICC0KAAAICC4KAAAICC8KAAAICDAKAAAICDEKAAAICDIKAAAICDMKAAAICDQKAAAICDUKAAAICDYKAAAICDcKAAAICDgKAAAICDkKAAAICDoKAAAICDsKAAAICDwKAAAICD0KAAAICD4KAAAICD8KAAAICEAKAAAICEEKAAAICEIKAAAICEMKAAAICEQKAAAICEUKAAAICEYKAAAICEcKAAAICEgKAAAICEkKAAAICEoKAAAICEsKAAAICEwKAAAICE0KAAAICE4KAAAICE8KAAAICFAKAAAICFEKAAAICFIKAAAICFMKAAAICFQKAAAICFUKAAAICFYKAAAICFcKAAAICFgKAAAICFkKAAAICFoKAAAICFsKAAAICFwKAAAICF0KAAAICF4KAAAICF8KAAAICGAKAAAICGEKAAAICGIKAAAICGMKAAAICGQKAAAICGUKAAAICGYKAAAICGcKAAAICGgKAAAICGkKAAAICGoKAAAICGsKAAAICGwKAAAICG0KAAAICG4KAAAICG8KAAAICHAKAAAICHEKAAAICHIKAAAICHMKAAAICHQKAAAICHUKAAAICHYKAAAICHcKAAAICHgKAAAICHkKAAAICHoKAAAICHsKAAAICHwKAAAICH0KAAAICH4KAAAICH8KAAAICIAKAAAICIEKAAAICIIKAAAICIMKAAAICIQKAAAICIUKAAAICIYKAAAICIcKAAAICIgKAAAICIkKAAAICIoKAAAICIsKAAAICIwKAAAICI0KAAAICI4KAAAICI8KAAAICJAKAAAICJEKAAAICJIKAAAICJMKAAAICJQKAAAICJUKAAAICJYKAAAICJcKAAAICJgKAAAICJkKAAAICJoKAAAICJsKAAAICJwKAAAICJ0KAAAICJ4KAAAICJ8KAAAICKAKAAAICKEKAAAICKIKAAAICKMKAAAICKQKAAAICKUKAAAICKYKAAAICKcKAAAICKgKAAAICKkKAAAICKoKAAAICKsKAAAICKwKAAAICK0KAAAICK4KAAAICK8KAAAICLAKAAAICLEKAAAICLIKAAAICLMKAAAICLQKAAAICLUKAAAICLYKAAAICLcKAAAICLgKAAAICLkKAAAICLoKAAAICLsKAAAICLwKAAAICL0KAAAICL4KAAAICL8KAAAICMAKAAAICMEKAAAICMIKAAAICMMKAAAICMQKAAAICMUKAAAICMYKAAAICMcKAAAICMgKAAAICMkKAAAICMoKAAAICMsKAAAICMwKAAAICM0KAAAICM4KAAAICM8KAAAICNAKAAAICNEKAAAICNIKAAAICNMKAAAICNQKAAAICNUKAAAICNYKAAAICNcKAAAICNgKAAAICNkKAAAICNoKAAAICNsKAAAICNwKAAAICN0KAAAICN4KAAAICN8KAAAICOAKAAAICOEKAAAICOIKAAAICOMKAAAICOQKAAAICOUKAAAICOYKAAAICOcKAAAICOgKAAAICOkKAAAICOoKAAAICOsKAAAICOwKAAAICO0KAAAICO4KAAAICO8KAAAICPAKAAAICPEKAAAICPIKAAAICPMKAAAICPQKAAAICPUKAAAICPYKAAAICPcKAAAICPgKAAAICPkKAAAICPoKAAAICPsKAAAICPwKAAAICP0KAAAICP4KAAAICP8KAAAICAALAAAICAELAAAICAILAAAICAMLAAAICAQLAAAICAULAAAICAYLAAAICAcLAAAICAgLAAAICAkLAAAICAoLAAAICAsLAAAICAwLAAAICA0LAAAICA4LAAAICA8LAAAICBALAAAICBELAAAICBILAAAICBMLAAAICBQLAAAICBULAAAICBYLAAAICBcLAAAICBgLAAAICBkLAAAICBoLAAAICBsLAAAICBwLAAAICB0LAAAICB4LAAAICB8LAAAICCALAAAICCELAAAICCILAAAICCMLAAAICCQLAAAICCULAAAICCYLAAAICCcLAAAICCgLAAAICCkLAAAICCoLAAAICCsLAAAICCwLAAAICC0LAAAICC4LAAAICC8LAAAICDALAAAICDELAAAICDILAAAICDMLAAAICDQLAAAICDULAAAICDYLAAAICDcLAAAICDgLAAAICDkLAAAICDoLAAAICDsLAAAICDwLAAAICD0LAAAICD4LAAAICD8LAAAICEALAAAICEELAAAICEILAAAICEMLAAAICEQLAAAICEULAAAICEYLAAAICEcLAAAICEgLAAAICEkLAAAICEoLAAAICEsLAAAICEwLAAAICE0LAAAICE4LAAAICE8LAAAICFALAAAICFELAAAICFILAAAICFMLAAAICFQLAAAICFULAAAICFYLAAAICFcLAAAICFgLAAAICFkLAAAICFoLAAAICFsLAAAICFwLAAAICF0LAAAICF4LAAAICF8LAAAICGALAAAICGELAAAICGILAAAICGMLAAAICGQLAAAICGULAAAICGYLAAAICGcLAAAICGgLAAAICGkLAAAICGoLAAAICGsLAAAICGwLAAAICG0LAAAICG4LAAAICG8LAAAICHALAAAICHELAAAICHILAAAICHMLAAAICHQLAAAICHULAAAICHYLAAAICHcLAAAICHgLAAAICHkLAAAICHoLAAAICHsLAAAICHwLAAAICH0LAAAICH4LAAAICH8LAAAICIALAAAICIELAAAICIILAAAICIMLAAAICIQLAAAICIULAAAICIYLAAAICIcLAAAICIgLAAAICIkLAAAICIoLAAAICIsLAAAICIwLAAAICI0LAAAICI4LAAAICI8LAAAICJALAAAICJELAAAICJILAAAICJMLAAAICJQLAAAICJULAAAICJYLAAAICJcLAAAICJgLAAAICJkLAAAICJoLAAAICJsLAAAICJwLAAAICJ0LAAAICJ4LAAAICJ8LAAAICKALAAAICKELAAAICKILAAAICKMLAAAICKQLAAAICKULAAAICKYLAAAICKcLAAAICKgLAAAICKkLAAAICKoLAAAICKsLAAAICKwLAAAICK0LAAAICK4LAAAICK8LAAAICLALAAAICLELAAAICLILAAAICLMLAAAICLQLAAAICLULAAAICLYLAAAICLcLAAAICLgLAAAICLkLAAAICLoLAAAICLsLAAAICLwLAAAICL0LAAAICL4LAAAICL8LAAAICMALAAAICMELAAAICMILAAAICMMLAAAICMQLAAAICMULAAAICMYLAAAICMcLAAAICMgLAAAICMkLAAAICMoLAAAICMsLAAAICMwLAAAICM0LAAAICM4LAAAICM8LAAAICNALAAAICNELAAAICNILAAAICNMLAAAICNQLAAAICNULAAAICNYLAAAICNcLAAAICNgLAAAICNkLAAAICNoLAAAICNsLAAAICNwLAAAICN0LAAAICN4LAAAICN8LAAAICOALAAAICOELAAAICOILAAAICOMLAAAICOQLAAAICOULAAAICOYLAAAICOcLAAAICOgLAAAICOkLAAAICOoLAAAICOsLAAAICOwLAAAICO0LAAAICO4LAAAICO8LAAAICPALAAAICPELAAAICPILAAAICPMLAAAICPQLAAAICPULAAAICPYLAAAICPcLAAAICPgLAAAICPkLAAAICPoLAAAICPsLAAAICPwLAAAICP0LAAAICP4LAAAICP8LAAAICAAMAAAICAEMAAAICAIMAAAICAMMAAAICAQMAAAICAUMAAAICAYMAAAICAcMAAAICAgMAAAICAkMAAAICAoMAAAICAsMAAAICAwMAAAICA0MAAAICA4MAAAICA8MAAAICBAMAAAICBEMAAAICBIMAAAICBMMAAAICBQMAAAICBUMAAAICBYMAAAICBcMAAAICBgMAAAICBkMAAAICBoMAAAICBsMAAAICBwMAAAICB0MAAAICB4MAAAICB8MAAAICCAMAAAICCEMAAAICCIMAAAICCMMAAAICCQMAAAICCUMAAAICCYMAAAICCcMAAAICCgMAAAICCkMAAAICCoMAAAICCsMAAAICCwMAAAICC0MAAAICC4MAAAICC8MAAAICDAMAAAICDEMAAAICDIMAAAICDMMAAAICDQMAAAICDUMAAAICDYMAAAICDcMAAAICDgMAAAICDkMAAAICDoMAAAICDsMAAAICDwMAAAICD0MAAAICD4MAAAICD8MAAAICEAMAAAICEEMAAAICEIMAAAICEMMAAAICEQMAAAICEUMAAAICEYMAAAICEcMAAAICEgMAAAICEkMAAAICEoMAAAICEsMAAAICEwMAAAICE0MAAAICE4MAAAICE8MAAAICFAMAAAICFEMAAAICFIMAAAICFMMAAAICFQMAAAICFUMAAAICFYMAAAICFcMAAAICFgMAAAICFkMAAAICFoMAAAICFsMAAAICFwMAAAICF0MAAAICF4MAAAICF8MAAAICGAMAAAICGEMAAAICGIMAAAICGMMAAAICGQMAAAICGUMAAAICGYMAAAICGcMAAAICGgMAAAICGkMAAAICGoMAAAICGsMAAAICGwMAAAICG0MAAAICG4MAAAICG8MAAAICHAMAAAICHEMAAAICHIMAAAICHMMAAAICHQMAAAICHUMAAAICHYMAAAICHcMAAAICHgMAAAICHkMAAAICHoMAAAICHsMAAAICHwMAAAICH0MAAAICH4MAAAICH8MAAAICIAMAAAICIEMAAAICIIMAAAICIMMAAAICIQMAAAICIUMAAAICIYMAAAICIcMAAAICIgMAAAICIkMAAAICIoMAAAICIsMAAAICIwMAAAICI0MAAAICI4MAAAICI8MAAAICJAMAAAICJEMAAAICJIMAAAICJMMAAAICJQMAAAICJUMAAAICJYMAAAICJcMAAAICJgMAAAICJkMAAAICJoMAAAICJsMAAAICJwMAAAICJ0MAAAICJ4MAAAICJ8MAAAICKAMAAAICKEMAAAICKIMAAAICKMMAAAICKQMAAAICKUMAAAICKYMAAAICKcMAAAICKgMAAAICKkMAAAICKoMAAAICKsMAAAICKwMAAAICK0MAAAICK4MAAAICK8MAAAICLAMAAAICLEMAAAICLIMAAAICLMMAAAICLQMAAAICLUMAAAICLYMAAAICLcMAAAICLgMAAAICLkMAAAICLoMAAAICLsMAAAICLwMAAAICL0MAAAICL4MAAAICL8MAAAICMAMAAAICMEMAAAICMIMAAAICMMMAAAICMQMAAAICMUMAAAICMYMAAAICMcMAAAICMgMAAAICMkMAAAICMoMAAAICMsMAAAICMwMAAAICM0MAAAICM4MAAAICM8MAAAICNAMAAAICNEMAAAICNIMAAAICNMMAAAICNQMAAAICNUMAAAICNYMAAAICNcMAAAICNgMAAAICNkMAAAICNoMAAAICNsMAAAICNwMAAAICN0MAAAICN4MAAAICN8MAAAICOAMAAAICOEMAAAICOIMAAAICOMMAAAICOQMAAAICOUMAAAICOYMAAAICOcMAAAICOgMAAAICOkMAAAICOoMAAAICOsMAAAICOwMAAAICO0MAAAICO4MAAAICO8MAAAICPAMAAAICPEMAAAICPIMAAAICPMMAAAICPQMAAAICPUMAAAICPYMAAAICPcMAAAICPgMAAAICPkMAAAICPoMAAAICPsMAAAICPwMAAAICP0MAAAICP4MAAAICP8MAAAICAANAAAICAENAAAICAINAAAICAMNAAAICAQNAAAICAUNAAAICAYNAAAICAcNAAAICAgNAAAICAkNAAAICAoNAAAICAsNAAAICAwNAAAICA0NAAAICA4NAAAICA8NAAAICBANAAAICBENAAAICBINAAAICBMNAAAICBQNAAAICBUNAAAICBYNAAAICBcNAAAICBgNAAAICBkNAAAICBoNAAAICBsNAAAICBwNAAAICB0NAAAICB4NAAAICB8NAAAICCANAAAICCENAAAICCINAAAICCMNAAAICCQNAAAICCUNAAAICCYNAAAICCcNAAAICCgNAAAICCkNAAAICCoNAAAICCsNAAAICCwNAAAICC0NAAAICC4NAAAICC8NAAAICDANAAAICDENAAAICDINAAAICDMNAAAICDQNAAAICDUNAAAICDYNAAAICDcNAAAICDgNAAAICDkNAAAICDoNAAAICDsNAAAICDwNAAAICD0NAAAICD4NAAAICD8NAAAICEANAAAICEENAAAICEINAAAICEMNAAAICEQNAAAICEUNAAAICEYNAAAICEcNAAAICEgNAAAICEkNAAAICEoNAAAICEsNAAAICEwNAAAICE0NAAAICE4NAAAICE8NAAAICFANAAAICFENAAAICFINAAAICFMNAAAICFQNAAAICFUNAAAICFYNAAAICFcNAAAICFgNAAAICFkNAAAICFoNAAAICFsNAAAICFwNAAAICF0NAAAICF4NAAAICF8NAAAICGANAAAICGENAAAICGINAAAICGMNAAAICGQNAAAICGUNAAAICGYNAAAICGcNAAAICGgNAAAICGkNAAAICGoNAAAICGsNAAAICGwNAAAICG0NAAAICG4NAAAICG8NAAAICHANAAAICHENAAAICHINAAAICHMNAAAICHQNAAAICHUNAAAICHYNAAAICHcNAAAICHgNAAAICHkNAAAICHoNAAAICHsNAAAICHwNAAAICH0NAAAICH4NAAAICH8NAAAICIANAAAICIENAAAICIINAAAICIMNAAAICIQNAAAICIUNAAAICIYNAAAICIcNAAAICIgNAAAICIkNAAAICIoNAAAICIsNAAAICIwNAAAICI0NAAAICI4NAAAICI8NAAAICJANAAAICJENAAAICJINAAAICJMNAAAICJQNAAAICJUNAAAICJYNAAAICJcNAAAICJgNAAAICJkNAAAICJoNAAAICJsNAAAICJwNAAAICJ0NAAAICJ4NAAAICJ8NAAAICKANAAAICKENAAAICKINAAAICKMNAAAICKQNAAAICKUNAAAICKYNAAAICKcNAAAICKgNAAAICKkNAAAICKoNAAAICKsNAAAICKwNAAAICK0NAAAICK4NAAAICK8NAAAICLANAAAICLENAAAICLINAAAICLMNAAAICLQNAAAICLUNAAAICLYNAAAICLcNAAAICLgNAAAICLkNAAAICLoNAAAICLsNAAAICLwNAAAICL0NAAAICL4NAAAICL8NAAAICMANAAAICMENAAAICMINAAAICMMNAAAICMQNAAAICMUNAAAICMYNAAAICMcNAAAICMgNAAAICMkNAAAICMoNAAAICMsNAAAICMwNAAAICM0NAAAICM4NAAAICM8NAAAICNANAAAICNENAAAICNINAAAICNMNAAAICNQNAAAICNUNAAAICNYNAAAICNcNAAAICNgNAAAICNkNAAAICNoNAAAICNsNAAAICNwNAAAICN0NAAAICN4NAAAICN8NAAAICOANAAAICOENAAAICOINAAAICOMNAAAICOQNAAAICOUNAAAICOYNAAAICOcNAAAICOgNAAAICOkNAAAICOoNAAAICOsNAAAICOwNAAAICO0NAAAICO4NAAAICO8NAAAICPANAAAICPENAAAICPINAAAICPMNAAAICPQNAAAICPUNAAAICPYNAAAICPcNAAAICPgNAAAICPkNAAAICPoNAAAICPsNAAAICPwNAAAICP0NAAAICP4NAAAICP8NAAAICAAOAAAICAEOAAAICAIOAAAICAMOAAAICAQOAAAICAUOAAAICAYOAAAICAcOAAAICAgOAAAICAkOAAAICAoOAAAICAsOAAAICAwOAAAICA0OAAAICA4OAAAICA8OAAAICBAOAAAICBEOAAAICBIOAAAICBMOAAAICBQOAAAICBUOAAAICBYOAAAICBcOAAAICBgOAAAICBkOAAAICBoOAAAICBsOAAAICBwOAAAICB0OAAAICB4OAAAICB8OAAAICCAOAAAICCEOAAAICCIOAAAICCMOAAAICCQOAAAICCUOAAAICCYOAAAICCcOAAAICCgOAAAICCkOAAAICCoOAAAICCsOAAAICCwOAAAICC0OAAAICC4OAAAICC8OAAAICDAOAAAICDEOAAAICDIOAAAICDMOAAAICDQOAAAICDUOAAAICDYOAAAICDcOAAAICDgOAAAICDkOAAAICDoOAAAICDsOAAAICDwOAAAICD0OAAAICD4OAAAICD8OAAAICEAOAAAICEEOAAAICEIOAAAICEMOAAAICEQOAAAICEUOAAAICEYOAAAICEcOAAAICEgOAAAICEkOAAAICEoOAAAICEsOAAAICEwOAAAICE0OAAAICE4OAAAICE8OAAAICFAOAAAICFEOAAAICFIOAAAICFMOAAAICFQOAAAICFUOAAAICFYOAAAICFcOAAAICFgOAAAICFkOAAAICFoOAAAICFsOAAAICFwOAAAICF0OAAAICF4OAAAICF8OAAAICGAOAAAICGEOAAAICGIOAAAICGMOAAAICGQOAAAICGUOAAAICGYOAAAICGcOAAAICGgOAAAICGkOAAAICGoOAAAICGsOAAAICGwOAAAICG0OAAAICG4OAAAICG8OAAAICHAOAAAICHEOAAAICHIOAAAICHMOAAAICHQOAAAICHUOAAAICHYOAAAICHcOAAAICHgOAAAICHkOAAAICHoOAAAICHsOAAAICHwOAAAICH0OAAAICH4OAAAICH8OAAAICIAOAAAICIEOAAAICIIOAAAICIMOAAAICIQOAAAICIUOAAAICIYOAAAICIcOAAAICIgOAAAICIkOAAAICIoOAAAICIsOAAAICIwOAAAICI0OAAAICI4OAAAICI8OAAAICJAOAAAICJEOAAAICJIOAAAICJMOAAAICJQOAAAICJUOAAAICJYOAAAICJcOAAAICJgOAAAICJkOAAAICJoOAAAICJsOAAAICJwOAAAICJ0OAAAICJ4OAAAICJ8OAAAICKAOAAAICKEOAAAICKIOAAAICKMOAAAICKQOAAAICKUOAAAICKYOAAAICKcOAAAICKgOAAAICKkOAAAICKoOAAAICKsOAAAICKwOAAAICK0OAAAICK4OAAAICK8OAAAICLAOAAAICLEOAAAICLIOAAAICLMOAAAICLQOAAAICLUOAAAICLYOAAAICLcOAAAICLgOAAAICLkOAAAICLoOAAAICLsOAAAICLwOAAAICL0OAAAICL4OAAAICL8OAAAICMAOAAAICMEOAAAICMIOAAAICMMOAAAICMQOAAAICMUOAAAICMYOAAAICMcOAAAICMgOAAAICMkOAAAICMoOAAAICMsOAAAICMwOAAAICM0OAAAICM4OAAAICM8OAAAICNAOAAAICNEOAAAICNIOAAAICNMOAAAICNQOAAAICNUOAAAICNYOAAAICNcOAAAICNgOAAAICNkOAAAICNoOAAAICNsOAAAICNwOAAAICN0OAAAICN4OAAAICN8OAAAICOAOAAAICOEOAAAICOIOAAAICOMOAAAICOQOAAAICOUOAAAICOYOAAAICOcOAAAICOgOAAAICOkOAAAICOoOAAAICOsOAAAICOwOAAAICO0OAAAICO4OAAAICO8OAAAICPAOAAAICPEOAAAICPIOAAAICPMOAAAICPQOAAAICPUOAAAICPYOAAAICPcOAAAICPgOAAAICPkOAAAICPoOAAAICPsOAAAICPwOAAAICP0OAAAICP4OAAAICP8OAAAICAAPAAAICAEPAAAICAIPAAAICAMPAAAICAQPAAAICAUPAAAICAYPAAAICAcPAAAICAgPAAAICAkPAAAICAoPAAAICAsPAAAICAwPAAAICA0PAAAICA4PAAAICA8PAAAICBAPAAAICBEPAAAICBIPAAAICBMPAAAICBQPAAAICBUPAAAICBYPAAAICBcPAAAICBgPAAAICBkPAAAICBoPAAAICBsPAAAICBwPAAAICB0PAAAICB4PAAAICB8PAAAICCAPAAAICCEPAAAICCIPAAAICCMPAAAICCQPAAAICCUPAAAICCYPAAAICCcPAAAICCgPAAAICCkPAAAICCoPAAAICCsPAAAICCwPAAAICC0PAAAICC4PAAAICC8PAAAICDAPAAAICDEPAAAICDIPAAAICDMPAAAICDQPAAAICDUPAAAICDYPAAAICDcPAAAICDgPAAAICDkPAAAICDoPAAAICDsPAAAICDwPAAAICD0PAAAICD4PAAAICD8PAAAICEAPAAAICEEPAAAICEIPAAAICEMPAAAICEQPAAAICEUPAAAICEYPAAAICEcPAAAICEgPAAAICEkPAAAICEoPAAAICEsPAAAICEwPAAAICE0PAAAICE4PAAAICE8PAAAICFAPAAAICFEPAAAICFIPAAAICFMPAAAICFQPAAAICFUPAAAICFYPAAAICFcPAAAICFgPAAAICFkPAAAICFoPAAAICFsPAAAICFwPAAAICF0PAAAICF4PAAAICF8PAAAICGAPAAAICGEPAAAICGIPAAAICGMPAAAICGQPAAAICGUPAAAICGYPAAAICGcPAAAICGgPAAAICGkPAAAICGoPAAAICGsPAAAICGwPAAAICG0PAAAICG4PAAAICG8PAAAICHAPAAAICHEPAAAICHIPAAAICHMPAAAICHQPAAAICHUPAAAICHYPAAAICHcPAAAICHgPAAAICHkPAAAICHoPAAAICHsPAAAICHwPAAAICH0PAAAICH4PAAAICH8PAAAICIAPAAAICIEPAAAICIIPAAAICIMPAAAICIQPAAAICIUPAAAICIYPAAAICIcPAAAICIgPAAAICIkPAAAICIoPAAAICIsPAAAICIwPAAAICI0PAAAICI4PAAAICI8PAAAICJAPAAAICJEPAAAICJIPAAAICJMPAAAICJQPAAAICJUPAAAICJYPAAAICJcPAAAICJgPAAAICJkPAAAICJoPAAAICJsPAAAICJwPAAAICJ0PAAAICJ4PAAAICJ8PAAAICKAPAAAICKEPAAAICKIPAAAICKMPAAAICKQPAAAICKUPAAAICKYPAAAICKcPAAAICKgPAAAICKkPAAAICKoPAAAICKsPAAAICKwPAAAICK0PAAAICK4PAAAICK8PAAAICLAPAAAICLEPAAAICLIPAAAICLMPAAAICLQPAAAICLUPAAAICLYPAAAICLcPAAAICLgPAAAICLkPAAAICLoPAAAICLsPAAAICLwPAAAICL0PAAAICL4PAAAICL8PAAAICMAPAAAICMEPAAAICMIPAAAICMMPAAAICMQPAAAICMUPAAAICMYPAAAICMcPAAAICMgPAAAICMkPAAAICMoPAAAICMsPAAAICMwPAAAICM0PAAAICM4PAAAICM8PAAAICNAPAAAICNEPAAAICNIPAAAICNMPAAAICNQPAAAICNUPAAAICNYPAAAICNcPAAAICNgPAAAICNkPAAAICNoPAAAICNsPAAAICNwPAAAICN0PAAAICN4PAAAICN8PAAAICOAPAAAICOEPAAAICOIPAAAICOMPAAAICOQPAAAICOUPAAAICOYPAAAICOcPAAAICOgPAAAICOkPAAAICOoPAAAICOsPAAAICOwPAAAICO0PAAAICO4PAAAICO8PAAAICPAPAAAICPEPAAAICPIPAAAICPMPAAAICPQPAAAICPUPAAAICPYPAAAICPcPAAAICPgPAAAICPkPAAAICPoPAAAICPsPAAAICPwPAAAICP0PAAAICP4PAAAICP8PAAAICAAQAAAICAEQAAAICAIQAAAICAMQAAAICAQQAAAICAUQAAAICAYQAAAICAcQAAAICAgQAAAICAkQAAAICAoQAAAICAsQAAAICAwQAAAICA0QAAAICA4QAAAICA8QAAAICBAQAAAICBEQAAAICBIQAAAICBMQAAAICBQQAAAICBUQAAAICBYQAAAICBcQAAAICBgQAAAICBkQAAAICBoQAAAICBsQAAAICBwQAAAICB0QAAAICB4QAAAICB8QAAAICCAQAAAICCEQAAAICCIQAAAICCMQAAAICCQQAAAICCUQAAAICCYQAAAICCcQAAAICCgQAAAICCkQAAAICCoQAAAICCsQAAAICCwQAAAICC0QAAAICC4QAAAICC8QAAAICDAQAAAICDEQAAAICDIQAAAICDMQAAAICDQQAAAICDUQAAAICDYQAAAICDcQAAAICDgQAAAICDkQAAAICDoQAAAICDsQAAAICDwQAAAICD0QAAAICD4QAAAICD8QAAAICEAQAAAICEEQAAAICEIQAAAICEMQAAAICEQQAAAICEUQAAAICEYQAAAICEcQAAAICEgQAAAICEkQAAAICEoQAAAICEsQAAAICEwQAAAICE0QAAAICE4QAAAICE8QAAAICFAQAAAICFEQAAAICFIQAAAICFMQAAAICFQQAAAICFUQAAAICFYQAAAICFcQAAAICFgQAAAICFkQAAAICFoQAAAICFsQAAAICFwQAAAICF0QAAAICF4QAAAICF8QAAAICGAQAAAICGEQAAAICGIQAAAICGMQAAAICGQQAAAICGUQAAAICGYQAAAICGcQAAAICGgQAAAICGkQAAAICGoQAAAICGsQAAAICGwQAAAICG0QAAAICG4QAAAICG8QAAAICHAQAAAICHEQAAAICHIQAAAICHMQAAAICHQQAAAICHUQAAAICHYQAAAICHcQAAAICHgQAAAICHkQAAAICHoQAAAICHsQAAAICHwQAAAICH0QAAAICH4QAAAICH8QAAAICIAQAAAICIEQAAAICIIQAAAICIMQAAAICIQQAAAICIUQAAAICIYQAAAICIcQAAAICIgQAAAICIkQAAAICIoQAAAICIsQAAAICIwQAAAICI0QAAAICI4QAAAICI8QAAAICJAQAAAICJEQAAAICJIQAAAICJMQAAAICJQQAAAICJUQAAAICJYQAAAICJcQAAAICJgQAAAICJkQAAAICJoQAAAICJsQAAAICJwQAAAICJ0QAAAICJ4QAAAICJ8QAAAICKAQAAAICKEQAAAICKIQAAAICKMQAAAICKQQAAAICKUQAAAICKYQAAAICKcQAAAICKgQAAAICKkQAAAICKoQAAAICKsQAAAICKwQAAAICK0QAAAICK4QAAAICK8QAAAICLAQAAAICLEQAAAICLIQAAAICLMQAAAICLQQAAAICLUQAAAICLYQAAAICLcQAAAICLgQAAAICLkQAAAICLoQAAAICLsQAAAICLwQAAAICL0QAAAICL4QAAAICL8QAAAICMAQAAAICMEQAAAICMIQAAAICMMQAAAICMQQAAAICMUQAAAICMYQAAAICMcQAAAICMgQAAAICMkQAAAICMoQAAAICMsQAAAICMwQAAAICM0QAAAICM4QAAAICM8QAAAICNAQAAAICNEQAAAICNIQAAAICNMQAAAICNQQAAAICNUQAAAICNYQAAAICNcQAAAICNgQAAAICNkQAAAICNoQAAAICNsQAAAICNwQAAAICN0QAAAICN4QAAAICN8QAAAICOAQAAAICOEQAAAICOIQAAAICOMQAAAICOQQAAAICOUQAAAICOYQAAAICOcQAAAICOgQAAAICOkQAAAICOoQAAAICOsQAAAICOwQAAAICO0QAAAICO4QAAAICO8QAAAICPAQAAAICPEQAAAICPIQAAAICPMQAAAICPQQAAAICPUQAAAICPYQAAAICPcQAAAICPgQAAAICPkQAAAICPoQAAAICPsQAAAICPwQAAAICP0QAAAICP4QAAAICP8QAAAICAARAAAICAERAAAICAIRAAAICAMRAAAICAQRAAAICAURAAAICAYRAAAICAcRAAAICAgRAAAICAkRAAAICAoRAAAICAsRAAAICAwRAAAICA0RAAAICA4RAAAICA8RAAAICBARAAAICBERAAAICBIRAAAICBMRAAAICBQRAAAICBURAAAICBYRAAAICBcRAAAICBgRAAAICBkRAAAICBoRAAAICBsRAAAICBwRAAAICB0RAAAICB4RAAAICB8RAAAICCARAAAICCERAAAICCIRAAAICCMRAAAICCQRAAAICCURAAAICCYRAAAICCcRAAAICCgRAAAICCkRAAAICCoRAAAICCsRAAAICCwRAAAICC0RAAAICC4RAAAICC8RAAAICDARAAAICDERAAAICDIRAAAICDMRAAAICDQRAAAICDURAAAICDYRAAAICDcRAAAICDgRAAAICDkRAAAICDoRAAAICDsRAAAICDwRAAAICD0RAAAICD4RAAAICD8RAAAICEARAAAICEERAAAICEIRAAAICEMRAAAICEQRAAAICEURAAAICEYRAAAICEcRAAAICEgRAAAICEkRAAAICEoRAAAICEsRAAAICEwRAAAICE0RAAAICE4RAAAICE8RAAAICFARAAAICFERAAAICFIRAAAICFMRAAAICFQRAAAICFURAAAICFYRAAAICFcRAAAICFgRAAAICFkRAAAICFoRAAAICFsRAAAICFwRAAAICF0RAAAICF4RAAAICF8RAAAICGARAAAICGERAAAICGIRAAAICGMRAAAICGQRAAAICGURAAAICGYRAAAICGcRAAAICGgRAAAICGkRAAAICGoRAAAICGsRAAAICGwRAAAICG0RAAAICG4RAAAICG8RAAAICHARAAAICHERAAAICHIRAAAICHMRAAAICHQRAAAICHURAAAICHYRAAAICHcRAAAICHgRAAAICHkRAAAICHoRAAAICHsRAAAICHwRAAAICH0RAAAICH4RAAAICH8RAAAICIARAAAICIERAAAICIIRAAAICIMRAAAICIQRAAAICIURAAAICIYRAAAICIcRAAAICIgRAAAICIkRAAAICIoRAAAICIsRAAAICIwRAAAICI0RAAAICI4RAAAICI8RAAAICJARAAAICJERAAAICJIRAAAICJMRAAAICJQRAAAICJURAAAICJYRAAAICJcRAAAICJgRAAAICJkRAAAICJoRAAAICJsRAAAICJwRAAAICJ0RAAAICJ4RAAAICJ8RAAAICKARAAAICKERAAAICKIRAAAICKMRAAAICKQRAAAICKURAAAICKYRAAAICKcRAAAICKgRAAAICKkRAAAICKoRAAAICKsRAAAICKwRAAAICK0RAAAICK4RAAAICK8RAAAICLARAAAICLERAAAICLIRAAAICLMRAAAICLQRAAAICLURAAAICLYRAAAICLcRAAAICLgRAAAICLkRAAAICLoRAAAICLsRAAAICLwRAAAICL0RAAAICL4RAAAICL8RAAAICMARAAAICMERAAAICMIRAAAICMMRAAAICMQRAAAICMURAAAICMYRAAAICMcRAAAICMgRAAAICMkRAAAICMoRAAAICMsRAAAICMwRAAAICM0RAAAICM4RAAAICM8RAAAICNARAAAICNERAAAICNIRAAAICNMRAAAICNQRAAAICNURAAAICNYRAAAICNcRAAAICNgRAAAICNkRAAAICNoRAAAICNsRAAAICNwRAAAICN0RAAAICN4RAAAICN8RAAAICOARAAAICOERAAAICOIRAAAICOMRAAAICOQRAAAICOURAAAICOYRAAAICOcRAAAICOgRAAAICOkRAAAICOoRAAAICOsRAAAICOwRAAAICO0RAAAICO4RAAAICO8RAAAICPARAAAICPERAAAICPIRAAAICPMRAAAICPQRAAAICPURAAAICPYRAAAICPcRAAAICPgRAAAICPkRAAAICPoRAAAICPsRAAAICPwRAAAICP0RAAAICP4RAAAICP8RAAAICAASAAAICAESAAAICAISAAAICAMSAAAICAQSAAAICAUSAAAICAYSAAAICAcSAAAICAgSAAAICAkSAAAICAoSAAAICAsSAAAICAwSAAAICA0SAAAICA4SAAAICA8SAAAICBASAAAICBESAAAICBISAAAICBMSAAAICBQSAAAICBUSAAAICBYSAAAICBcSAAAICBgSAAAICBkSAAAICBoSAAAICBsSAAAICBwSAAAICB0SAAAICB4SAAAICB8SAAAICCASAAAICCESAAAICCISAAAICCMSAAAICCQSAAAICCUSAAAICCYSAAAICCcSAAAICCgSAAAICCkSAAAICCoSAAAICCsSAAAICCwSAAAICC0SAAAICC4SAAAICC8SAAAICDASAAAICDESAAAICDISAAAICDMSAAAICDQSAAAICDUSAAAICDYSAAAICDcSAAAICDgSAAAICDkSAAAICDoSAAAICDsSAAAICDwSAAAICD0SAAAICD4SAAAICD8SAAAICEASAAAICEESAAAICEISAAAICEMSAAAICEQSAAAICEUSAAAICEYSAAAICEcSAAAICEgSAAAICEkSAAAICEoSAAAICEsSAAAICEwSAAAICE0SAAAICE4SAAAICE8SAAAICFASAAAICFESAAAICFISAAAICFMSAAAICFQSAAAICFUSAAAICFYSAAAICFcSAAAICFgSAAAICFkSAAAICFoSAAAICFsSAAAICFwSAAAICF0SAAAICF4SAAAICF8SAAAICGASAAAICGESAAAICGISAAAICGMSAAAICGQSAAAICGUSAAAICGYSAAAICGcSAAAICGgSAAAICGkSAAAICGoSAAAICGsSAAAICGwSAAAICG0SAAAICG4SAAAICG8SAAAICHASAAAICHESAAAICHISAAAICHMSAAAICHQSAAAICHUSAAAICHYSAAAICHcSAAAICHgSAAAICHkSAAAICHoSAAAICHsSAAAICHwSAAAICH0SAAAICH4SAAAICH8SAAAICIASAAAICIESAAAICIISAAAICIMSAAAICIQSAAAICIUSAAAICIYSAAAICIcSAAAICIgSAAAICIkSAAAICIoSAAAICIsSAAAICIwSAAAICI0SAAAICI4SAAAICI8SAAAICJASAAAICJESAAAICJISAAAICJMSAAAICJQSAAAICJUSAAAICJYSAAAICJcSAAAICJgSAAAICJkSAAAICJoSAAAICJsSAAAICJwSAAAICJ0SAAAICJ4SAAAICJ8SAAAICKASAAAICKESAAAICKISAAAICKMSAAAICKQSAAAICKUSAAAICKYSAAAICKcSAAAICKgSAAAICKkSAAAICKoSAAAICKsSAAAICKwSAAAICK0SAAAICK4SAAAICK8SAAAICLASAAAICLESAAAICLISAAAICLMSAAAICLQSAAAICLUSAAAICLYSAAAICLcSAAAICLgSAAAICLkSAAAICLoSAAAICLsSAAAICLwSAAAICL0SAAAICL4SAAAICL8SAAAICMASAAAICMESAAAICMISAAAICMMSAAAICMQSAAAICMUSAAAICMYSAAAICMcSAAAICMgSAAAICMkSAAAICMoSAAAICMsSAAAICMwSAAAICM0SAAAICM4SAAAICM8SAAAICNASAAAICNESAAAICNISAAAICNMSAAAICNQSAAAICNUSAAAICNYSAAAICNcSAAAICNgSAAAICNkSAAAICNoSAAAICNsSAAAICNwSAAAICN0SAAAICN4SAAAICN8SAAAICOASAAAICOESAAAICOISAAAICOMSAAAICOQSAAAICOUSAAAICOYSAAAICOcSAAAICOgSAAAICOkSAAAICOoSAAAICOsSAAAICOwSAAAICO0SAAAICO4SAAAICO8SAAAICPASAAAICPESAAAICPISAAAICPMSAAAICPQSAAAICPUSAAAICPYSAAAICPcSAAAICPgSAAAICPkSAAAICPoSAAAICPsSAAAICPwSAAAICP0SAAAICP4SAAAICP8SAAAICAATAAAICAETAAAICAITAAAICAMTAAAICAQTAAAICAUTAAAICAYTAAAICAcTAAAICAgTAAAICAkTAAAICAoTAAAICAsTAAAICAwTAAAICA0TAAAICA4TAAAICA8TAAAICBATAAAICBETAAAICBITAAAICBMTAAAICBQTAAAICBUTAAAICBYTAAAICBcTAAAICBgTAAAICBkTAAAICBoTAAAICBsTAAAICBwTAAAICB0TAAAICB4TAAAICB8TAAAICCATAAAICCETAAAICCITAAAICCMTAAAICCQTAAAICCUTAAAICCYTAAAICCcTAAAICCgTAAAICCkTAAAICCoTAAAICCsTAAAICCwTAAAICC0TAAAICC4TAAAICC8TAAAICDATAAAICDETAAAICDITAAAICDMTAAAICDQTAAAICDUTAAAICDYTAAAICDcTAAAICDgTAAAICDkTAAAICDoTAAAICDsTAAAICDwTAAAICD0TAAAICD4TAAAICD8TAAAICEATAAAICEETAAAICEITAAAICEMTAAAICEQTAAAICEUTAAAICEYTAAAICEcTAAAICEgTAAAICEkTAAAICEoTAAAICEsTAAAICEwTAAAICE0TAAAICE4TAAAICE8TAAAICFATAAAICFETAAAICFITAAAICFMTAAAICFQTAAAICFUTAAAICFYTAAAICFcTAAAICFgTAAAICFkTAAAICFoTAAAICFsTAAAICFwTAAAICF0TAAAICF4TAAAICF8TAAAICGATAAAICGETAAAICGITAAAICGMTAAAICGQTAAAICGUTAAAICGYTAAAICGcTAAAICGgTAAAICGkTAAAICGoTAAAICGsTAAAICGwTAAAICG0TAAAICG4TAAAICG8TAAAICHATAAAICHETAAAICHITAAAICHMTAAAICHQTAAAICHUTAAAICHYTAAAICHcTAAAICHgTAAAICHkTAAAICHoTAAAICHsTAAAICHwTAAAICH0TAAAICH4TAAAICH8TAAAICIATAAAICIETAAAICIITAAAICIMTAAAICIQTAAAICIUTAAAICIYTAAAICIcTAAAICIgTAAAICIkTAAAICIoTAAAICIsTAAAICIwTAAAICI0TAAAICI4TAAAICI8TAAAICJATAAAICJETAAAICJITAAAICJMTAAAICJQTAAAICJUTAAAICJYTAAAICJcTAAAICJgTAAAICJkTAAAICJoTAAAICJsTAAAICJwTAAAICJ0TAAAICJ4TAAAICJ8TAAAICKATAAAICKETAAAICKITAAAICKMTAAAICKQTAAAICKUTAAAICKYTAAAICKcTAAAICKgTAAAICKkTAAAICKoTAAAICKsTAAAICKwTAAAICK0TAAAICK4TAAAICK8TAAAICLATAAAICLETAAAICLITAAAICLMTAAAICLQTAAAICLUTAAAICLYTAAAICLcTAAAICLgTAAAICLkTAAAICLoTAAAICLsTAAAICLwTAAAICL0TAAAICL4TAAAICL8TAAAICMATAAAICMETAAAICMITAAAICMMTAAAICMQTAAAICMUTAAAICMYTAAAICMcTAAAICMgTAAAICMkTAAAICMoTAAAICMsTAAAICMwTAAAICM0TAAAICM4TAAAICM8TAAAICNATAAAICNETAAAICNITAAAICNMTAAAICNQTAAAICNUTAAAICNYTAAAICNcTAAAICNgTAAAICNkTAAAICNoTAAAICNsTAAAICNwTAAAICN0TAAAICN4TAAAICN8TAAAICOATAAAICOETAAAICOITAAAICOMTAAAICOQTAAAICOUTAAAICOYTAAAICOcTAAAICOgTAAAICOkTAAAICOoTAAAICOsTAAAICOwTAAAICO0TAAAICO4TAAAICO8TAAAICPATAAAICPETAAAICPITAAAICPMTAAAICPQTAAAICPUTAAAICPYTAAAICPcTAAAICPgTAAAICPkTAAAICPoTAAAICPsTAAAICPwTAAAICP0TAAAICP4TAAAICP8TAAAICAAUAAAICAEUAAAICAIUAAAICAMUAAAICAQUAAAICAUUAAAICAYUAAAICAcUAAAICAgUAAAICAkUAAAICAoUAAAICAsUAAAICAwUAAAICA0UAAAICA4UAAAICA8UAAAICBAUAAAICBEUAAAICBIUAAAICBMUAAAICBQUAAAICBUUAAAICBYUAAAICBcUAAAICBgUAAAICBkUAAAICBoUAAAICBsUAAAICBwUAAAICB0UAAAICB4UAAAICB8UAAAICCAUAAAICCEUAAAICCIUAAAICCMUAAAICCQUAAAICCUUAAAICCYUAAAICCcUAAAICCgUAAAICCkUAAAICCoUAAAICCsUAAAICCwUAAAICC0UAAAICC4UAAAICC8UAAAICDAUAAAICDEUAAAICDIUAAAICDMUAAAICDQUAAAICDUUAAAICDYUAAAICDcUAAAICDgUAAAICDkUAAAICDoUAAAICDsUAAAICDwUAAAICD0UAAAICD4UAAAICD8UAAAICEAUAAAICEEUAAAICEIUAAAICEMUAAAICEQUAAAICEUUAAAICEYUAAAICEcUAAAICEgUAAAICEkUAAAICEoUAAAICEsUAAAICEwUAAAICE0UAAAICE4UAAAICE8UAAAICFAUAAAICFEUAAAICFIUAAAICFMUAAAICFQUAAAICFUUAAAICFYUAAAICFcUAAAICFgUAAAICFkUAAAICFoUAAAICFsUAAAICFwUAAAICF0UAAAICF4UAAAICF8UAAAICGAUAAAICGEUAAAICGIUAAAICGMUAAAICGQUAAAICGUUAAAICGYUAAAICGcUAAAICGgUAAAICGkUAAAICGoUAAAICGsUAAAICGwUAAAICG0UAAAICG4UAAAICG8UAAAICHAUAAAICHEUAAAICHIUAAAICHMUAAAICHQUAAAICHUUAAAICHYUAAAICHcUAAAICHgUAAAICHkUAAAICHoUAAAICHsUAAAICHwUAAAICH0UAAAICH4UAAAICH8UAAAICIAUAAAICIEUAAAICIIUAAAICIMUAAAICIQUAAAICIUUAAAICIYUAAAICIcUAAAICIgUAAAICIkUAAAICIoUAAAICIsUAAAICIwUAAAICI0UAAAICI4UAAAICI8UAAAICJAUAAAICJEUAAAICJIUAAAICJMUAAAICJQUAAAICJUUAAAICJYUAAAICJcUAAAICJgUAAAICJkUAAAICJoUAAAICJsUAAAICJwUAAAICJ0UAAAICJ4UAAAICJ8UAAAICKAUAAAICKEUAAAICKIUAAAICKMUAAAICKQUAAAICKUUAAAICKYUAAAICKcUAAAICKgUAAAICKkUAAAICKoUAAAICKsUAAAICKwUAAAICK0UAAAICK4UAAAICK8UAAAICLAUAAAICLEUAAAICLIUAAAICLMUAAAICLQUAAAICLUUAAAICLYUAAAICLcUAAAICLgUAAAICLkUAAAICLoUAAAICLsUAAAICLwUAAAICL0UAAAICL4UAAAICL8UAAAICMAUAAAICMEUAAAICMIUAAAICMMUAAAICMQUAAAICMUUAAAICMYUAAAICMcUAAAICMgUAAAICMkUAAAICMoUAAAICMsUAAAICMwUAAAICM0UAAAICM4UAAAICM8UAAAICNAUAAAICNEUAAAICNIUAAAICNMUAAAICNQUAAAICNUUAAAICNYUAAAICNcUAAAICNgUAAAICNkUAAAICNoUAAAICNsUAAAICNwUAAAICN0UAAAICN4UAAAICN8UAAAICOAUAAAICOEUAAAICOIUAAAICOMUAAAICOQUAAAICOUUAAAICOYUAAAICOcUAAAICOgUAAAICOkUAAAICOoUAAAICOsUAAAICOwUAAAICO0UAAAICO4UAAAICO8UAAAICPAUAAAICPEUAAAICPIUAAAICPMUAAAICPQUAAAICPUUAAAICPYUAAAICPcUAAAICPgUAAAICPkUAAAICPoUAAAICPsUAAAICPwUAAAICP0UAAAICP4UAAAICP8UAAAICAAVAAAICAEVAAAICAIVAAAICAMVAAAICAQVAAAICAUVAAAICAYVAAAICAcVAAAICAgVAAAICAkVAAAICAoVAAAICAsVAAAICAwVAAAICA0VAAAICA4VAAAICA8VAAAICBAVAAAICBEVAAAICBIVAAAICBMVAAAICBQVAAAICBUVAAAICBYVAAAICBcVAAAICBgVAAAICBkVAAAICBoVAAAICBsVAAAICBwVAAAICB0VAAAICB4VAAAICB8VAAAICCAVAAAICCEVAAAICCIVAAAICCMVAAAICCQVAAAICCUVAAAICCYVAAAICCcVAAAICCgVAAAICCkVAAAICCoVAAAICCsVAAAICCwVAAAICC0VAAAICC4VAAAICC8VAAAICDAVAAAICDEVAAAICDIVAAAICDMVAAAICDQVAAAICDUVAAAICDYVAAAICDcVAAAICDgVAAAICDkVAAAICDoVAAAICDsVAAAICDwVAAAICD0VAAAICD4VAAAICD8VAAAICEAVAAAICEEVAAAICEIVAAAICEMVAAAICEQVAAAICEUVAAAICEYVAAAICEcVAAAICEgVAAAICEkVAAAICEoVAAAICEsVAAAICEwVAAAICE0VAAAICE4VAAAICE8VAAAICFAVAAAICFEVAAAICFIVAAAICFMVAAAICFQVAAAICFUVAAAICFYVAAAICFcVAAAICFgVAAAICFkVAAAICFoVAAAICFsVAAAICFwVAAAICF0VAAAICF4VAAAICF8VAAAICGAVAAAICGEVAAAICGIVAAAICGMVAAAICGQVAAAICGUVAAAICGYVAAAICGcVAAAICGgVAAAICGkVAAAICGoVAAAICGsVAAAICGwVAAAICG0VAAAICG4VAAAICG8VAAAICHAVAAAICHEVAAAICHIVAAAICHMVAAAICHQVAAAICHUVAAAICHYVAAAICHcVAAAICHgVAAAICHkVAAAICHoVAAAICHsVAAAICHwVAAAICH0VAAAICH4VAAAICH8VAAAICIAVAAAICIEVAAAICIIVAAAICIMVAAAICIQVAAAICIUVAAAICIYVAAAICIcVAAAICIgVAAAICIkVAAAICIoVAAAICIsVAAAICIwVAAAICI0VAAAICI4VAAAICI8VAAAICJAVAAAICJEVAAAICJIVAAAICJMVAAAICJQVAAAICJUVAAAICJYVAAAICJcVAAAICJgVAAAICJkVAAAICJoVAAAICJsVAAAICJwVAAAICJ0VAAAICJ4VAAAICJ8VAAAICKAVAAAICKEVAAAICKIVAAAICKMVAAAICKQVAAAICKUVAAAICKYVAAAICKcVAAAICKgVAAAICKkVAAAICKoVAAAICKsVAAAICKwVAAAICK0VAAAICK4VAAAICK8VAAAICLAVAAAICLEVAAAICLIVAAAICLMVAAAICLQVAAAICLUVAAAICLYVAAAICLcVAAAICLgVAAAICLkVAAAICLoVAAAICLsVAAAICLwVAAAICL0VAAAICL4VAAAICL8VAAAICMAVAAAICMEVAAAICMIVAAAICMMVAAAICMQVAAAICMUVAAAICMYVAAAICMcVAAAICMgVAAAICMkVAAAICMoVAAAICMsVAAAICMwVAAAICM0VAAAICM4VAAAICM8VAAAICNAVAAAICNEVAAAICNIVAAAICNMVAAAICNQVAAAICNUVAAAICNYVAAAICNcVAAAICNgVAAAICNkVAAAICNoVAAAICNsVAAAICNwVAAAICN0VAAAICN4VAAAICN8VAAAICOAVAAAICOEVAAAICOIVAAAICOMVAAAICOQVAAAICOUVAAAICOYVAAAICOcVAAAICOgVAAAICOkVAAAICOoVAAAICOsVAAAICOwVAAAICO0VAAAICO4VAAAICO8VAAAICPAVAAAICPEVAAAICPIVAAAICPMVAAAICPQVAAAICPUVAAAICPYVAAAICPcVAAAICPgVAAAICPkVAAAICPoVAAAICPsVAAAICPwVAAAICP0VAAAICP4VAAAICP8VAAAICAAWAAAICAEWAAAICAIWAAAICAMWAAAICAQWAAAICAUWAAAICAYWAAAICAcWAAAICAgWAAAICAkWAAAICAoWAAAICAsWAAAICAwWAAAICA0WAAAICA4WAAAICA8WAAAICBAWAAAICBEWAAAICBIWAAAICBMWAAAICBQWAAAICBUWAAAICBYWAAAICBcWAAAICBgWAAAICBkWAAAICBoWAAAICBsWAAAICBwWAAAICB0WAAAICB4WAAAICB8WAAAICCAWAAAICCEWAAAICCIWAAAICCMWAAAICCQWAAAICCUWAAAICCYWAAAICCcWAAAICCgWAAAICCkWAAAICCoWAAAICCsWAAAICCwWAAAICC0WAAAICC4WAAAICC8WAAAICDAWAAAICDEWAAAICDIWAAAICDMWAAAICDQWAAAICDUWAAAICDYWAAAICDcWAAAICDgWAAAICDkWAAAICDoWAAAICDsWAAAICDwWAAAICD0WAAAICD4WAAAICD8WAAAICEAWAAAICEEWAAAICEIWAAAICEMWAAAICEQWAAAICEUWAAAICEYWAAAICEcWAAAICEgWAAAICEkWAAAICEoWAAAICEsWAAAICEwWAAAICE0WAAAICE4WAAAICE8WAAAICFAWAAAICFEWAAAICFIWAAAICFMWAAAICFQWAAAICFUWAAAICFYWAAAICFcWAAAICFgWAAAICFkWAAAICFoWAAAICFsWAAAICFwWAAAICF0WAAAICF4WAAAICF8WAAAICGAWAAAICGEWAAAICGIWAAAICGMWAAAICGQWAAAICGUWAAAICGYWAAAICGcWAAAICGgWAAAICGkWAAAICGoWAAAICGsWAAAICGwWAAAICG0WAAAICG4WAAAICG8WAAAICHAWAAAICHEWAAAICHIWAAAICHMWAAAICHQWAAAICHUWAAAICHYWAAAICHcWAAAICHgWAAAICHkWAAAICHoWAAAICHsWAAAICHwWAAAICH0WAAAICH4WAAAICH8WAAAICIAWAAAICIEWAAAICIIWAAAICIMWAAAICIQWAAAICIUWAAAICIYWAAAICIcWAAAICIgWAAAICIkWAAAICIoWAAAICIsWAAAICIwWAAAICI0WAAAICI4WAAAICI8WAAAICJAWAAAICJEWAAAICJIWAAAICJMWAAAICJQWAAAICJUWAAAICJYWAAAICJcWAAAICJgWAAAICJkWAAAICJoWAAAICJsWAAAICJwWAAAICJ0WAAAICJ4WAAAICJ8WAAAICKAWAAAICKEWAAAICKIWAAAICKMWAAAICKQWAAAICKUWAAAICKYWAAAICKcWAAAICKgWAAAICKkWAAAICKoWAAAICKsWAAAICKwWAAAICK0WAAAICK4WAAAICK8WAAAICLAWAAAICLEWAAAICLIWAAAICLMWAAAICLQWAAAICLUWAAAICLYWAAAICLcWAAAICLgWAAAICLkWAAAICLoWAAAICLsWAAAICLwWAAAICL0WAAAICL4WAAAICL8WAAAICMAWAAAICMEWAAAICMIWAAAICMMWAAAICMQWAAAICMUWAAAICMYWAAAICMcWAAAICMgWAAAICMkWAAAICMoWAAAICMsWAAAICMwWAAAICM0WAAAICM4WAAAICM8WAAAICNAWAAAICNEWAAAICNIWAAAICNMWAAAICNQWAAAICNUWAAAICNYWAAAICNcWAAAICNgWAAAICNkWAAAICNoWAAAICNsWAAAICNwWAAAICN0WAAAICN4WAAAICN8WAAAICOAWAAAICOEWAAAICOIWAAAICOMWAAAICOQWAAAICOUWAAAICOYWAAAICOcWAAAICOgWAAAICOkWAAAICOoWAAAICOsWAAAICOwWAAAICO0WAAAICO4WAAAICO8WAAAICPAWAAAICPEWAAAICPIWAAAICPMWAAAICPQWAAAICPUWAAAICPYWAAAICPcWAAAICPgWAAAICPkWAAAICPoWAAAICPsWAAAICPwWAAAICP0WAAAICP4WAAAICP8WAAAICAAXAAAICAEXAAAICAIXAAAICAMXAAAICAQXAAAICAUXAAAICAYXAAAICAcXAAAICAgXAAAICAkXAAAICAoXAAAICAsXAAAICAwXAAAICA0XAAAICA4XAAAICA8XAAAICBAXAAAICBEXAAAICBIXAAAICBMXAAAICBQXAAAICBUXAAAICBYXAAAICBcXAAAICBgXAAAICBkXAAAICBoXAAAICBsXAAAICBwXAAAICB0XAAAICB4XAAAICB8XAAAICCAXAAAICCEXAAAICCIXAAAICCMXAAAICCQXAAAICCUXAAAICCYXAAAICCcXAAAICCgXAAAICCkXAAAICCoXAAAICCsXAAAICCwXAAAICC0XAAAICC4XAAAICC8XAAAICDAXAAAICDEXAAAICDIXAAAICDMXAAAICDQXAAAICDUXAAAICDYXAAAICDcXAAAICDgXAAAICDkXAAAICDoXAAAICDsXAAAICDwXAAAICD0XAAAICD4XAAAICD8XAAAICEAXAAAICEEXAAAICEIXAAAICEMXAAAICEQXAAAICEUXAAAICEYXAAAICEcXAAAICEgXAAAICEkXAAAICEoXAAAICEsXAAAICEwXAAAICE0XAAAICE4XAAAICE8XAAAICFAXAAAICFEXAAAICFIXAAAICFMXAAAICFQXAAAICFUXAAAICFYXAAAICFcXAAAICFgXAAAICFkXAAAICFoXAAAICFsXAAAICFwXAAAICF0XAAAICF4XAAAICF8XAAAICGAXAAAICGEXAAAICGIXAAAICGMXAAAICGQXAAAICGUXAAAICGYXAAAICGcXAAAICGgXAAAICGkXAAAICGoXAAAICGsXAAAICGwXAAAICG0XAAAICG4XAAAICG8XAAAICHAXAAAICHEXAAAICHIXAAAICHMXAAAICHQXAAAICHUXAAAICHYXAAAICHcXAAAICHgXAAAICHkXAAAICHoXAAAICHsXAAAICHwXAAAICH0XAAAICH4XAAAICH8XAAAICIAXAAAICIEXAAAICIIXAAAICIMXAAAICIQXAAAICIUXAAAICIYXAAAICIcXAAAICIgXAAAICIkXAAAICIoXAAAICIsXAAAICIwXAAAICI0XAAAICI4XAAAICI8XAAAICJAXAAAICJEXAAAICJIXAAAICJMXAAAICJQXAAAICJUXAAAICJYXAAAICJcXAAAICJgXAAAICJkXAAAICJoXAAAICJsXAAAICJwXAAAICJ0XAAAICJ4XAAAICJ8XAAAICKAXAAAICKEXAAAICKIXAAAICKMXAAAICKQXAAAICKUXAAAICKYXAAAICKcXAAAICKgXAAAICKkXAAAICKoXAAAICKsXAAAICKwXAAAICK0XAAAICK4XAAAICK8XAAAICLAXAAAICLEXAAAICLIXAAAICLMXAAAICLQXAAAICLUXAAAICLYXAAAICLcXAAAICLgXAAAICLkXAAAICLoXAAAICLsXAAAICLwXAAAICL0XAAAICL4XAAAICL8XAAAICMAXAAAICMEXAAAICMIXAAAICMMXAAAICMQXAAAICMUXAAAICMYXAAAICMcXAAAICMgXAAAICMkXAAAICMoXAAAICMsXAAAICMwXAAAICM0XAAAICM4XAAAICM8XAAAICNAXAAAICNEXAAAICNIXAAAICNMXAAAICNQXAAAICNUXAAAICNYXAAAICNcXAAAICNgXAAAICNkXAAAICNoXAAAICNsXAAAICNwXAAAICN0XAAAICN4XAAAICN8XAAAICOAXAAAICOEXAAAICOIXAAAICOMXAAAICOQXAAAICOUXAAAICOYXAAAICOcXAAAICOgXAAAICOkXAAAICOoXAAAICOsXAAAICOwXAAAICO0XAAAICO4XAAAICO8XAAAICPAXAAAICPEXAAAICPIXAAAICPMXAAAICPQXAAAICPUXAAAICPYXAAAICPcXAAAICPgXAAAICPkXAAAICPoXAAAICPsXAAAICPwXAAAICP0XAAAICP4XAAAICP8XAAAICAAYAAAICAEYAAAICAIYAAAICAMYAAAICAQYAAAICAUYAAAICAYYAAAICAcYAAAICAgYAAAICAkYAAAICAoYAAAICAsYAAAICAwYAAAICA0YAAAICA4YAAAICA8YAAAICBAYAAAICBEYAAAICBIYAAAICBMYAAAICBQYAAAICBUYAAAICBYYAAAICBcYAAAICBgYAAAICBkYAAAICBoYAAAICBsYAAAICBwYAAAICB0YAAAICB4YAAAICB8YAAAICCAYAAAICCEYAAAICCIYAAAICCMYAAAICCQYAAAICCUYAAAICCYYAAAICCcYAAAICCgYAAAICCkYAAAICCoYAAAICCsYAAAICCwYAAAICC0YAAAICC4YAAAICC8YAAAICDAYAAAICDEYAAAICDIYAAAICDMYAAAICDQYAAAICDUYAAAICDYYAAAICDcYAAAICDgYAAAICDkYAAAICDoYAAAICDsYAAAICDwYAAAICD0YAAAICD4YAAAICD8YAAAICEAYAAAICEEYAAAICEIYAAAICEMYAAAICEQYAAAICEUYAAAICEYYAAAICEcYAAAICEgYAAAICEkYAAAICEoYAAAICEsYAAAICEwYAAAICE0YAAAICE4YAAAICE8YAAAICFAYAAAICFEYAAAICFIYAAAICFMYAAAICFQYAAAICFUYAAAICFYYAAAICFcYAAAICFgYAAAICFkYAAAICFoYAAAICFsYAAAICFwYAAAICF0YAAAICF4YAAAICF8YAAAICGAYAAAICGEYAAAICGIYAAAICGMYAAAICGQYAAAICGUYAAAICGYYAAAICGcYAAAICGgYAAAICGkYAAAICGoYAAAICGsYAAAICGwYAAAICG0YAAAICG4YAAAICG8YAAAICHAYAAAICHEYAAAICHIYAAAICHMYAAAICHQYAAAICHUYAAAICHYYAAAICHcYAAAICHgYAAAICHkYAAAICHoYAAAICHsYAAAICHwYAAAICH0YAAAICH4YAAAICH8YAAAICIAYAAAICIEYAAAICIIYAAAICIMYAAAICIQYAAAICIUYAAAICIYYAAAICIcYAAAICIgYAAAICIkYAAAICIoYAAAICIsYAAAICIwYAAAICI0YAAAICI4YAAAICI8YAAAICJAYAAAICJEYAAAICJIYAAAICJMYAAAICJQYAAAICJUYAAAICJYYAAAICJcYAAAICJgYAAAICJkYAAAICJoYAAAICJsYAAAICJwYAAAICJ0YAAAICJ4YAAAICJ8YAAAICKAYAAAICKEYAAAICKIYAAAICKMYAAAICKQYAAAICKUYAAAICKYYAAAICKcYAAAICKgYAAAICKkYAAAICKoYAAAICKsYAAAICKwYAAAICK0YAAAICK4YAAAICK8YAAAICLAYAAAICLEYAAAICLIYAAAICLMYAAAICLQYAAAICLUYAAAICLYYAAAICLcYAAAICLgYAAAICLkYAAAICLoYAAAICLsYAAAICLwYAAAICL0YAAAICL4YAAAICL8YAAAICMAYAAAICMEYAAAICMIYAAAICMMYAAAICMQYAAAICMUYAAAICMYYAAAICMcYAAAICMgYAAAICMkYAAAICMoYAAAICMsYAAAICMwYAAAICM0YAAAICM4YAAAICM8YAAAICNAYAAAICNEYAAAICNIYAAAICNMYAAAICNQYAAAICNUYAAAICNYYAAAICNcYAAAICNgYAAAICNkYAAAICNoYAAAICNsYAAAICNwYAAAICN0YAAAICN4YAAAICN8YAAAICOAYAAAICOEYAAAICOIYAAAICOMYAAAICOQYAAAICOUYAAAICOYYAAAICOcYAAAICOgYAAAICOkYAAAICOoYAAAICOsYAAAICOwYAAAICO0YAAAICO4YAAAICO8YAAAICPAYAAAICPEYAAAICPIYAAAICPMYAAAICPQYAAAICPUYAAAICPYYAAAICPcYAAAICPgYAAAICPkYAAAICPoYAAAICPsYAAAICPwYAAAICP0YAAAICP4YAAAICP8YAAAICAAZAAAICAEZAAAICAIZAAAICAMZAAAICAQZAAAICAUZAAAICAYZAAAICAcZAAAICAgZAAAICAkZAAAICAoZAAAICAsZAAAICAwZAAAICA0ZAAAICA4ZAAAICA8ZAAAICBAZAAAICBEZAAAICBIZAAAICBMZAAAICBQZAAAICBUZAAAICBYZAAAICBcZAAAICBgZAAAICBkZAAAICBoZAAAICBsZAAAICBwZAAAICB0ZAAAICB4ZAAAICB8ZAAAICCAZAAAICCEZAAAICCIZAAAICCMZAAAICCQZAAAICCUZAAAICCYZAAAICCcZAAAICCgZAAAICCkZAAAICCoZAAAICCsZAAAICCwZAAAICC0ZAAAICC4ZAAAICC8ZAAAICDAZAAAICDEZAAAICDIZAAAICDMZAAAICDQZAAAICDUZAAAICDYZAAAICDcZAAAICDgZAAAICDkZAAAICDoZAAAICDsZAAAICDwZAAAICD0ZAAAICD4ZAAAICD8ZAAAICEAZAAAICEEZAAAICEIZAAAICEMZAAAICEQZAAAICEUZAAAICEYZAAAICEcZAAAICEgZAAAICEkZAAAICEoZAAAICEsZAAAICEwZAAAICE0ZAAAICE4ZAAAICE8ZAAAICFAZAAAICFEZAAAICFIZAAAICFMZAAAICFQZAAAICFUZAAAICFYZAAAICFcZAAAICFgZAAAICFkZAAAICFoZAAAICFsZAAAICFwZAAAICF0ZAAAICF4ZAAAICF8ZAAAICGAZAAAICGEZAAAICGIZAAAICGMZAAAICGQZAAAICGUZAAAICGYZAAAICGcZAAAICGgZAAAICGkZAAAICGoZAAAICGsZAAAICGwZAAAICG0ZAAAICG4ZAAAICG8ZAAAICHAZAAAICHEZAAAICHIZAAAICHMZAAAICHQZAAAICHUZAAAICHYZAAAICHcZAAAICHgZAAAICHkZAAAICHoZAAAICHsZAAAICHwZAAAICH0ZAAAICH4ZAAAICH8ZAAAICIAZAAAICIEZAAAICIIZAAAICIMZAAAICIQZAAAICIUZAAAICIYZAAAICIcZAAAICIgZAAAICIkZAAAICIoZAAAICIsZAAAICIwZAAAICI0ZAAAICI4ZAAAICI8ZAAAICJAZAAAICJEZAAAICJIZAAAICJMZAAAICJQZAAAICJUZAAAICJYZAAAICJcZAAAICJgZAAAICJkZAAAICJoZAAAICJsZAAAICJwZAAAICJ0ZAAAICJ4ZAAAICJ8ZAAAICKAZAAAICKEZAAAICKIZAAAICKMZAAAICKQZAAAICKUZAAAICKYZAAAICKcZAAAICKgZAAAICKkZAAAICKoZAAAICKsZAAAICKwZAAAICK0ZAAAICK4ZAAAICK8ZAAAICLAZAAAICLEZAAAICLIZAAAICLMZAAAICLQZAAAICLUZAAAICLYZAAAICLcZAAAICLgZAAAICLkZAAAICLoZAAAICLsZAAAICLwZAAAICL0ZAAAICL4ZAAAICL8ZAAAICMAZAAAICMEZAAAICMIZAAAICMMZAAAICMQZAAAICMUZAAAICMYZAAAICMcZAAAICMgZAAAICMkZAAAICMoZAAAICMsZAAAICMwZAAAICM0ZAAAICM4ZAAAICM8ZAAAICNAZAAAICNEZAAAICNIZAAAICNMZAAAICNQZAAAICNUZAAAICNYZAAAICNcZAAAICNgZAAAICNkZAAAICNoZAAAICNsZAAAICNwZAAAICN0ZAAAICN4ZAAAICN8ZAAAICOAZAAAICOEZAAAICOIZAAAICOMZAAAICOQZAAAICOUZAAAICOYZAAAICOcZAAAICOgZAAAICOkZAAAICOoZAAAICOsZAAAICOwZAAAICO0ZAAAICO4ZAAAICO8ZAAAICPAZAAAICPEZAAAICPIZAAAICPMZAAAICPQZAAAICPUZAAAICPYZAAAICPcZAAAICPgZAAAICPkZAAAICPoZAAAICPsZAAAICPwZAAAICP0ZAAAICP4ZAAAICP8ZAAAICAAaAAAICAEaAAAICAIaAAAICAMaAAAICAQaAAAICAUaAAAICAYaAAAICAcaAAAICAgaAAAICAkaAAAICAoaAAAICAsaAAAICAwaAAAICA0aAAAICA4aAAAICA8aAAAICBAaAAAICBEaAAAICBIaAAAICBMaAAAICBQaAAAICBUaAAAICBYaAAAICBcaAAAICBgaAAAICBkaAAAICBoaAAAICBsaAAAICBwaAAAICB0aAAAICB4aAAAICB8aAAAICCAaAAAICCEaAAAICCIaAAAICCMaAAAICCQaAAAICCUaAAAICCYaAAAICCcaAAAICCgaAAAICCkaAAAICCoaAAAICCsaAAAICCwaAAAICC0aAAAICC4aAAAICC8aAAAICDAaAAAICDEaAAAICDIaAAAICDMaAAAICDQaAAAICDUaAAAICDYaAAAICDcaAAAICDgaAAAICDkaAAAICDoaAAAICDsaAAAICDwaAAAICD0aAAAICD4aAAAICD8aAAAICEAaAAAICEEaAAAICEIaAAAICEMaAAAICEQaAAAICEUaAAAICEYaAAAICEcaAAAICEgaAAAICEkaAAAICEoaAAAICEsaAAAICEwaAAAICE0aAAAICE4aAAAICE8aAAAICFAaAAAICFEaAAAICFIaAAAICFMaAAAICFQaAAAICFUaAAAICFYaAAAICFcaAAAICFgaAAAICFkaAAAICFoaAAAICFsaAAAICFwaAAAICF0aAAAICF4aAAAICF8aAAAICGAaAAAICGEaAAAICGIaAAAICGMaAAAICGQaAAAICGUaAAAICGYaAAAICGcaAAAICGgaAAAICGkaAAAICGoaAAAICGsaAAAICGwaAAAICG0aAAAICG4aAAAICG8aAAAICHAaAAAICHEaAAAICHIaAAAICHMaAAAICHQaAAAICHUaAAAICHYaAAAICHcaAAAICHgaAAAICHkaAAAICHoaAAAICHsaAAAICHwaAAAICH0aAAAICH4aAAAICH8aAAAICIAaAAAICIEaAAAICIIaAAAICIMaAAAICIQaAAAICIUaAAAICIYaAAAICIcaAAAICIgaAAAICIkaAAAICIoaAAAICIsaAAAICIwaAAAICI0aAAAICI4aAAAICI8aAAAICJAaAAAICJEaAAAICJIaAAAICJMaAAAICJQaAAAICJUaAAAICJYaAAAICJcaAAAICJgaAAAICJkaAAAICJoaAAAICJsaAAAICJwaAAAICJ0aAAAICJ4aAAAICJ8aAAAICKAaAAAICKEaAAAICKIaAAAICKMaAAAICKQaAAAICKUaAAAICKYaAAAICKcaAAAICKgaAAAICKkaAAAICKoaAAAICKsaAAAICKwaAAAICK0aAAAICK4aAAAICK8aAAAICLAaAAAICLEaAAAICLIaAAAICLMaAAAICLQaAAAICLUaAAAICLYaAAAICLcaAAAICLgaAAAICLkaAAAICLoaAAAICLsaAAAICLwaAAAICL0aAAAICL4aAAAICL8aAAAICMAaAAAICMEaAAAICMIaAAAICMMaAAAICMQaAAAICMUaAAAICMYaAAAICMcaAAAICMgaAAAICMkaAAAICMoaAAAICMsaAAAICMwaAAAICM0aAAAICM4aAAAICM8aAAAICNAaAAAICNEaAAAICNIaAAAICNMaAAAICNQaAAAICNUaAAAICNYaAAAICNcaAAAICNgaAAAICNkaAAAICNoaAAAICNsaAAAICNwaAAAICN0aAAAICN4aAAAICN8aAAAICOAaAAAICOEaAAAICOIaAAAICOMaAAAICOQaAAAICOUaAAAICOYaAAAICOcaAAAICOgaAAAICOkaAAAICOoaAAAICOsaAAAICOwaAAAICO0aAAAICO4aAAAICO8aAAAICPAaAAAICPEaAAAICPIaAAAICPMaAAAICPQaAAAICPUaAAAICPYaAAAICPcaAAAICPgaAAAICPkaAAAICPoaAAAICPsaAAAICPwaAAAICP0aAAAICP4aAAAICP8aAAAICAAbAAAICAEbAAAICAIbAAAICAMbAAAICAQbAAAICAUbAAAICAYbAAAICAcbAAAICAgbAAAICAkbAAAICAobAAAICAsbAAAICAwbAAAICA0bAAAICA4bAAAICA8bAAAICBAbAAAICBEbAAAICBIbAAAICBMbAAAICBQbAAAICBUbAAAICBYbAAAICBcbAAAICBgbAAAICBkbAAAICBobAAAICBsbAAAICBwbAAAICB0bAAAICB4bAAAICB8bAAAICCAbAAAICCEbAAAICCIbAAAICCMbAAAICCQbAAAICCUbAAAICCYbAAAICCcbAAAICCgbAAAICCkbAAAICCobAAAICCsbAAAICCwbAAAICC0bAAAICC4bAAAICC8bAAAICDAbAAAICDEbAAAICDIbAAAICDMbAAAICDQbAAAICDUbAAAICDYbAAAICDcbAAAICDgbAAAICDkbAAAICDobAAAICDsbAAAICDwbAAAICD0bAAAICD4bAAAICD8bAAAICEAbAAAICEEbAAAICEIbAAAICEMbAAAICEQbAAAICEUbAAAICEYbAAAICEcbAAAICEgbAAAICEkbAAAICEobAAAICEsbAAAICEwbAAAICE0bAAAICE4bAAAICE8bAAAICFAbAAAICFEbAAAICFIbAAAICFMbAAAICFQbAAAICFUbAAAICFYbAAAICFcbAAAICFgbAAAICFkbAAAICFobAAAICFsbAAAICFwbAAAICF0bAAAICF4bAAAICF8bAAAICGAbAAAICGEbAAAICGIbAAAICGMbAAAICGQbAAAICGUbAAAICGYbAAAICGcbAAAICGgbAAAICGkbAAAICGobAAAICGsbAAAICGwbAAAICG0bAAAICG4bAAAICG8bAAAICHAbAAAICHEbAAAICHIbAAAICHMbAAAICHQbAAAICHUbAAAICHYbAAAICHcbAAAICHgbAAAICHkbAAAICHobAAAICHsbAAAICHwbAAAICH0bAAAICH4bAAAICH8bAAAICIAbAAAICIEbAAAICIIbAAAICIMbAAAICIQbAAAICIUbAAAICIYbAAAICIcbAAAICIgbAAAICIkbAAAICIobAAAICIsbAAAICIwbAAAICI0bAAAICI4bAAAICI8bAAAICJAbAAAICJEbAAAICJIbAAAICJMbAAAICJQbAAAICJUbAAAICJYbAAAICJcbAAAICJgbAAAICJkbAAAICJobAAAICJsbAAAICJwbAAAICJ0bAAAICJ4bAAAICJ8bAAAICKAbAAAICKEbAAAICKIbAAAICKMbAAAICKQbAAAICKUbAAAICKYbAAAICKcbAAAICKgbAAAICKkbAAAICKobAAAICKsbAAAICKwbAAAICK0bAAAICK4bAAAICK8bAAAICLAbAAAICLEbAAAICLIbAAAICLMbAAAICLQbAAAICLUbAAAICLYbAAAICLcbAAAICLgbAAAICLkbAAAICLobAAAICLsbAAAICLwbAAAICL0bAAAICL4bAAAICL8bAAAICMAbAAAICMEbAAAICMIbAAAICMMbAAAICMQbAAAICMUbAAAICMYbAAAICMcbAAAICMgbAAAICMkbAAAICMobAAAICMsbAAAICMwbAAAICM0bAAAICM4bAAAICM8bAAAICNAbAAAICNEbAAAICNIbAAAICNMbAAAICNQbAAAICNUbAAAICNYbAAAICNcbAAAICNgbAAAICNkbAAAICNobAAAICNsbAAAICNwbAAAICN0bAAAICN4bAAAICN8bAAAICOAbAAAICOEbAAAICOIbAAAICOMbAAAICOQbAAAICOUbAAAICOYbAAAICOcbAAAICOgbAAAICOkbAAAICOobAAAICOsbAAAICOwbAAAICO0bAAAICO4bAAAICO8bAAAICPAbAAAICPEbAAAICPIbAAAICPMbAAAICPQbAAAICPUbAAAICPYbAAAICPcbAAAICPgbAAAICPkbAAAICPobAAAICPsbAAAICPwbAAAICP0bAAAICP4bAAAICP8bAAAICAAcAAAICAEcAAAICAIcAAAICAMcAAAICAQcAAAICAUcAAAICAYcAAAICAccAAAICAgcAAAICAkcAAAICAocAAAICAscAAAICAwcAAAICA0cAAAICA4cAAAICA8cAAAICBAcAAAICBEcAAAICBIcAAAICBMcAAAICBQcAAAICBUcAAAICBYcAAAICBccAAAICBgcAAAICBkcAAAICBocAAAICBscAAAICBwcAAAICB0cAAAICB4cAAAICB8cAAAICCAcAAAICCEcAAAICCIcAAAICCMcAAAICCQcAAAICCUcAAAICCYcAAAICCccAAAICCgcAAAICCkcAAAICCocAAAICCscAAAICCwcAAAICC0cAAAICC4cAAAICC8cAAAICDAcAAAICDEcAAAICDIcAAAICDMcAAAICDQcAAAICDUcAAAICDYcAAAICDccAAAICDgcAAAICDkcAAAICDocAAAICDscAAAICDwcAAAICD0cAAAICD4cAAAICD8cAAAICEAcAAAICEEcAAAICEIcAAAICEMcAAAICEQcAAAICEUcAAAICEYcAAAICEccAAAICEgcAAAICEkcAAAICEocAAAICEscAAAICEwcAAAICE0cAAAICE4cAAAICE8cAAAICFAcAAAICFEcAAAICFIcAAAICFMcAAAICFQcAAAICFUcAAAICFYcAAAICFccAAAICFgcAAAICFkcAAAICFocAAAICFscAAAICFwcAAAICF0cAAAICF4cAAAICF8cAAAICGAcAAAICGEcAAAICGIcAAAICGMcAAAICGQcAAAICGUcAAAICGYcAAAICGccAAAICGgcAAAICGkcAAAICGocAAAICGscAAAICGwcAAAICG0cAAAICG4cAAAICG8cAAAICHAcAAAICHEcAAAICHIcAAAICHMcAAAICHQcAAAICHUcAAAICHYcAAAICHccAAAICHgcAAAICHkcAAAICHocAAAICHscAAAICHwcAAAICH0cAAAICH4cAAAICH8cAAAICIAcAAAICIEcAAAICIIcAAAICIMcAAAICIQcAAAICIUcAAAICIYcAAAICIccAAAICIgcAAAICIkcAAAICIocAAAICIscAAAICIwcAAAICI0cAAAICI4cAAAICI8cAAAICJAcAAAICJEcAAAICJIcAAAICJMcAAAICJQcAAAICJUcAAAICJYcAAAICJccAAAICJgcAAAICJkcAAAICJocAAAICJscAAAICJwcAAAICJ0cAAAICJ4cAAAICJ8cAAAICKAcAAAICKEcAAAICKIcAAAICKMcAAAICKQcAAAICKUcAAAICKYcAAAICKccAAAICKgcAAAICKkcAAAICKocAAAICKscAAAICKwcAAAICK0cAAAICK4cAAAICK8cAAAICLAcAAAICLEcAAAICLIcAAAICLMcAAAICLQcAAAICLUcAAAICLYcAAAICLccAAAICLgcAAAICLkcAAAICLocAAAICLscAAAICLwcAAAICL0cAAAICL4cAAAICL8cAAAICMAcAAAICMEcAAAICMIcAAAICMMcAAAICMQcAAAICMUcAAAICMYcAAAICMccAAAICMgcAAAICMkcAAAICMocAAAICMscAAAICMwcAAAICM0cAAAICM4cAAAICM8cAAAICNAcAAAICNEcAAAICNIcAAAICNMcAAAICNQcAAAICNUcAAAICNYcAAAICNccAAAICNgcAAAICNkcAAAICNocAAAICNscAAAICNwcAAAICN0cAAAICN4cAAAICN8cAAAICOAcAAAICOEcAAAICOIcAAAICOMcAAAICOQcAAAICOUcAAAICOYcAAAICOccAAAICOgcAAAICOkcAAAICOocAAAICOscAAAICOwcAAAICO0cAAAICO4cAAAICO8cAAAICPAcAAAICPEcAAAICPIcAAAICPMcAAAICPQcAAAICPUcAAAICPYcAAAICPccAAAICPgcAAAICPkcAAAICPocAAAICPscAAAICPwcAAAICP0cAAAICP4cAAAICP8cAAAICAAdAAAICAEdAAAICAIdAAAICAMdAAAICAQdAAAICAUdAAAICAYdAAAICAcdAAAICAgdAAAICAkdAAAICAodAAAICAsdAAAICAwdAAAICA0dAAAICA4dAAAICA8dAAAICBAdAAAICBEdAAAICBIdAAAICBMdAAAICBQdAAAICBUdAAAICBYdAAAICBcdAAAICBgdAAAICBkdAAAICBodAAAICBsdAAAICBwdAAAICB0dAAAICB4dAAAICB8dAAAICCAdAAAICCEdAAAICCIdAAAICCMdAAAICCQdAAAICCUdAAAICCYdAAAICCcdAAAICCgdAAAICCkdAAAICCodAAAICCsdAAAICCwdAAAICC0dAAAICC4dAAAICC8dAAAICDAdAAAICDEdAAAICDIdAAAICDMdAAAICDQdAAAICDUdAAAICDYdAAAICDcdAAAICDgdAAAICDkdAAAICDodAAAICDsdAAAICDwdAAAICD0dAAAICD4dAAAICD8dAAAICEAdAAAICEEdAAAICEIdAAAICEMdAAAICEQdAAAICEUdAAAICEYdAAAICEcdAAAICEgdAAAICEkdAAAICEodAAAICEsdAAAICEwdAAAICE0dAAAICE4dAAAICE8dAAAICFAdAAAICFEdAAAICFIdAAAICFMdAAAICFQdAAAICFUdAAAICFYdAAAICFcdAAAICFgdAAAICFkdAAAICFodAAAICFsdAAAICFwdAAAICF0dAAAICF4dAAAICF8dAAAICGAdAAAICGEdAAAICGIdAAAICGMdAAAICGQdAAAICGUdAAAICGYdAAAICGcdAAAICGgdAAAICGkdAAAICGodAAAICGsdAAAICGwdAAAICG0dAAAICG4dAAAICG8dAAAICHAdAAAICHEdAAAICHIdAAAICHMdAAAICHQdAAAICHUdAAAICHYdAAAICHcdAAAICHgdAAAICHkdAAAICHodAAAICHsdAAAICHwdAAAICH0dAAAICH4dAAAICH8dAAAICIAdAAAICIEdAAAICIIdAAAICIMdAAAICIQdAAAICIUdAAAICIYdAAAICIcdAAAICIgdAAAICIkdAAAICIodAAAICIsdAAAICIwdAAAICI0dAAAICI4dAAAICI8dAAAICJAdAAAICJEdAAAICJIdAAAICJMdAAAICJQdAAAICJUdAAAICJYdAAAICJcdAAAICJgdAAAICJkdAAAICJodAAAICJsdAAAICJwdAAAICJ0dAAAICJ4dAAAICJ8dAAAICKAdAAAICKEdAAAICKIdAAAICKMdAAAICKQdAAAICKUdAAAICKYdAAAICKcdAAAICKgdAAAICKkdAAAICKodAAAICKsdAAAICKwdAAAICK0dAAAICK4dAAAICK8dAAAICLAdAAAICLEdAAAICLIdAAAICLMdAAAICLQdAAAICLUdAAAICLYdAAAICLcdAAAICLgdAAAICLkdAAAICLodAAAICLsdAAAICLwdAAAICL0dAAAICL4dAAAICL8dAAAICMAdAAAICMEdAAAICMIdAAAICMMdAAAICMQdAAAICMUdAAAICMYdAAAICMcdAAAICMgdAAAICMkdAAAICModAAAICMsdAAAICMwdAAAICM0dAAAICM4dAAAICM8dAAAICNAdAAAICNEdAAAICNIdAAAICNMdAAAICNQdAAAICNUdAAAICNYdAAAICNcdAAAICNgdAAAICNkdAAAICNodAAAICNsdAAAICNwdAAAICN0dAAAICN4dAAAICN8dAAAICOAdAAAICOEdAAAICOIdAAAICOMdAAAICOQdAAAICOUdAAAICOYdAAAICOcdAAAICOgdAAAICOkdAAAICOodAAAICOsdAAAICOwdAAAICO0dAAAICO4dAAAICO8dAAAICPAdAAAICPEdAAAICPIdAAAICPMdAAAICPQdAAAICPUdAAAICPYdAAAICPcdAAAICPgdAAAICPkdAAAICPodAAAICPsdAAAICPwdAAAICP0dAAAICP4dAAAICP8dAAAICAAeAAAICAEeAAAICAIeAAAICAMeAAAICAQeAAAICAUeAAAICAYeAAAICAceAAAICAgeAAAICAkeAAAICAoeAAAICAseAAAICAweAAAICA0eAAAICA4eAAAICA8eAAAICBAeAAAICBEeAAAICBIeAAAICBMeAAAICBQeAAAICBUeAAAICBYeAAAICBceAAAICBgeAAAICBkeAAAICBoeAAAICBseAAAICBweAAAICB0eAAAICB4eAAAICB8eAAAICCAeAAAICCEeAAAICCIeAAAICCMeAAAICCQeAAAICCUeAAAICCYeAAAICCceAAAICCgeAAAICCkeAAAICCoeAAAICCseAAAICCweAAAICC0eAAAICC4eAAAICC8eAAAICDAeAAAICDEeAAAICDIeAAAICDMeAAAICDQeAAAICDUeAAAICDYeAAAICDceAAAICDgeAAAICDkeAAAICDoeAAAICDseAAAICDweAAAICD0eAAAICD4eAAAICD8eAAAICEAeAAAICEEeAAAICEIeAAAICEMeAAAICEQeAAAICEUeAAAICEYeAAAICEceAAAICEgeAAAICEkeAAAICEoeAAAICEseAAAICEweAAAICE0eAAAICE4eAAAICE8eAAAICFAeAAAICFEeAAAICFIeAAAICFMeAAAICFQeAAAICFUeAAAICFYeAAAICFceAAAICFgeAAAICFkeAAAICFoeAAAICFseAAAICFweAAAICF0eAAAICF4eAAAICF8eAAAICGAeAAAICGEeAAAICGIeAAAICGMeAAAICGQeAAAICGUeAAAICGYeAAAICGceAAAICGgeAAAICGkeAAAICGoeAAAICGseAAAICGweAAAICG0eAAAICG4eAAAICG8eAAAICHAeAAAICHEeAAAICHIeAAAICHMeAAAICHQeAAAICHUeAAAICHYeAAAICHceAAAICHgeAAAICHkeAAAICHoeAAAICHseAAAICHweAAAICH0eAAAICH4eAAAICH8eAAAICIAeAAAICIEeAAAICIIeAAAICIMeAAAICIQeAAAICIUeAAAICIYeAAAICIceAAAICIgeAAAICIkeAAAICIoeAAAICIseAAAICIweAAAICI0eAAAICI4eAAAICI8eAAAICJAeAAAICJEeAAAICJIeAAAICJMeAAAICJQeAAAICJUeAAAICJYeAAAICJceAAAICJgeAAAICJkeAAAICJoeAAAICJseAAAICJweAAAICJ0eAAAICJ4eAAAICJ8eAAAICKAeAAAICKEeAAAICKIeAAAICKMeAAAICKQeAAAICKUeAAAICKYeAAAICKceAAAICKgeAAAICKkeAAAICKoeAAAICKseAAAICKweAAAICK0eAAAICK4eAAAICK8eAAAICLAeAAAICLEeAAAICLIeAAAICLMeAAAICLQeAAAICLUeAAAICLYeAAAICLceAAAICLgeAAAICLkeAAAICLoeAAAICLseAAAICLweAAAICL0eAAAICL4eAAAICL8eAAAICMAeAAAICMEeAAAICMIeAAAICMMeAAAICMQeAAAICMUeAAAICMYeAAAICMceAAAICMgeAAAICMkeAAAICMoeAAAICMseAAAICMweAAAICM0eAAAICM4eAAAICM8eAAAICNAeAAAICNEeAAAICNIeAAAICNMeAAAICNQeAAAICNUeAAAICNYeAAAICNceAAAICNgeAAAICNkeAAAICNoeAAAICNseAAAICNweAAAICN0eAAAICN4eAAAICN8eAAAICOAeAAAICOEeAAAICOIeAAAICOMeAAAICOQeAAAICOUeAAAICOYeAAAICOceAAAICOgeAAAICOkeAAAICOoeAAAICOseAAAICOweAAAICO0eAAAICO4eAAAICO8eAAAICPAeAAAICPEeAAAICPIeAAAICPMeAAAICPQeAAAICPUeAAAICPYeAAAICPceAAAICPgeAAAICPkeAAAICPoeAAAICPseAAAICPweAAAICP0eAAAICP4eAAAICP8eAAAICAAfAAAICAEfAAAICAIfAAAICAMfAAAICAQfAAAICAUfAAAICAYfAAAICAcfAAAICAgfAAAICAkfAAAICAofAAAICAsfAAAICAwfAAAICA0fAAAICA4fAAAICA8fAAAICBAfAAAICBEfAAAICBIfAAAICBMfAAAICBQfAAAICBUfAAAICBYfAAAICBcfAAAICBgfAAAICBkfAAAICBofAAAICBsfAAAICBwfAAAICB0fAAAICB4fAAAICB8fAAAICCAfAAAICCEfAAAICCIfAAAICCMfAAAICCQfAAAICCUfAAAICCYfAAAICCcfAAAICCgfAAAICCkfAAAICCofAAAICCsfAAAICCwfAAAICC0fAAAICC4fAAAICC8fAAAICDAfAAAICDEfAAAICDIfAAAICDMfAAAICDQfAAAICDUfAAAICDYfAAAICDcfAAAICDgfAAAICDkfAAAICDofAAAICDsfAAAICDwfAAAICD0fAAAICD4fAAAICD8fAAAICEAfAAAICEEfAAAICEIfAAAICEMfAAAICEQfAAAICEUfAAAICEYfAAAICEcfAAAICEgfAAAICEkfAAAICEofAAAICEsfAAAICEwfAAAICE0fAAAICE4fAAAICE8fAAAICFAfAAAICFEfAAAICFIfAAAICFMfAAAICFQfAAAICFUfAAAICFYfAAAICFcfAAAICFgfAAAICFkfAAAICFofAAAICFsfAAAICFwfAAAICF0fAAAICF4fAAAICF8fAAAICGAfAAAICGEfAAAICGIfAAAICGMfAAAICGQfAAAICGUfAAAICGYfAAAICGcfAAAICGgfAAAICGkfAAAICGofAAAICGsfAAAICGwfAAAICG0fAAAICG4fAAAICG8fAAAICHAfAAAICHEfAAAICHIfAAAICHMfAAAICHQfAAAICHUfAAAICHYfAAAICHcfAAAICHgfAAAICHkfAAAICHofAAAICHsfAAAICHwfAAAICH0fAAAICH4fAAAICH8fAAAICIAfAAAICIEfAAAICIIfAAAICIMfAAAICIQfAAAICIUfAAAICIYfAAAICIcfAAAICIgfAAAICIkfAAAICIofAAAICIsfAAAICIwfAAAICI0fAAAICI4fAAAICI8fAAAICJAfAAAICJEfAAAICJIfAAAICJMfAAAICJQfAAAICJUfAAAICJYfAAAICJcfAAAICJgfAAAICJkfAAAICJofAAAICJsfAAAICJwfAAAICJ0fAAAICJ4fAAAICJ8fAAAICKAfAAAICKEfAAAICKIfAAAICKMfAAAICKQfAAAICKUfAAAICKYfAAAICKcfAAAICKgfAAAICKkfAAAICKofAAAICKsfAAAICKwfAAAICK0fAAAICK4fAAAICK8fAAAICLAfAAAICLEfAAAICLIfAAAICLMfAAAICLQfAAAICLUfAAAICLYfAAAICLcfAAAICLgfAAAICLkfAAAICLofAAAICLsfAAAICLwfAAAICL0fAAAICL4fAAAICL8fAAAICMAfAAAICMEfAAAICMIfAAAICMMfAAAICMQfAAAICMUfAAAICMYfAAAICMcfAAAICMgfAAAICMkfAAAICMofAAAICMsfAAAICMwfAAAICM0fAAAICM4fAAAICM8fAAAICNAfAAAICNEfAAAICNIfAAAICNMfAAAICNQfAAAICNUfAAAICNYfAAAICNcfAAAICNgfAAAICNkfAAAICNofAAAICNsfAAAICNwfAAAICN0fAAAICN4fAAAICN8fAAAICOAfAAAICOEfAAAICOIfAAAICOMfAAAICOQfAAAICOUfAAAICOYfAAAICOcfAAAICOgfAAAICOkfAAAICOofAAAICOsfAAAICOwfAAAICO0fAAAICO4fAAAICO8fAAAICPAfAAAICPEfAAAICPIfAAAICPMfAAAICPQfAAAICPUfAAAICPYfAAAICPcfAAAICPgfAAAICPkfAAAICPofAAAICPsfAAAICPwfAAAICP0fAAAICP4fAAAICP8fAAAICAAgAAAICAEgAAAICAIgAAAICAMgAAAICAQgAAAICAUgAAAICAYgAAAICAcgAAAICAggAAAICAkgAAAICAogAAAICAsgAAAICAwgAAAICA0gAAAICA4gAAAICA8gAAAICBAgAAAICBEgAAAICBIgAAAICBMgAAAICBQgAAAICBUgAAAICBYgAAAICBcgAAAICBggAAAICBkgAAAICBogAAAICBsgAAAICBwgAAAICB0gAAAICB4gAAAICB8gAAAICCAgAAAICCEgAAAICCIgAAAICCMgAAAICCQgAAAICCUgAAAICCYgAAAICCcgAAAICCggAAAICCkgAAAICCogAAAICCsgAAAICCwgAAAICC0gAAAICC4gAAAICC8gAAAICDAgAAAICDEgAAAICDIgAAAICDMgAAAICDQgAAAICDUgAAAICDYgAAAICDcgAAAICDggAAAICDkgAAAICDogAAAICDsgAAAICDwgAAAICD0gAAAICD4gAAAICD8gAAAICEAgAAAICEEgAAAICEIgAAAICEMgAAAICEQgAAAICEUgAAAICEYgAAAICEcgAAAICEggAAAICEkgAAAICEogAAAICEsgAAAICEwgAAAICE0gAAAICE4gAAAICE8gAAAICFAgAAAICFEgAAAICFIgAAAICFMgAAAICFQgAAAICFUgAAAICFYgAAAICFcgAAAICFggAAAICFkgAAAICFogAAAICFsgAAAICFwgAAAICF0gAAAICF4gAAAICF8gAAAICGAgAAAICGEgAAAICGIgAAAICGMgAAAICGQgAAAICGUgAAAICGYgAAAICGcgAAAICGggAAAICGkgAAAICGogAAAICGsgAAAICGwgAAAICG0gAAAICG4gAAAICG8gAAAICHAgAAAICHEgAAAICHIgAAAICHMgAAAICHQgAAAICHUgAAAICHYgAAAICHcgAAAICHggAAAICHkgAAAICHogAAAICHsgAAAICHwgAAAICH0gAAAICH4gAAAICH8gAAAICIAgAAAICIEgAAAICIIgAAAICIMgAAAICIQgAAAICIUgAAAICIYgAAAICIcgAAAICIggAAAICIkgAAAICIogAAAICIsgAAAICIwgAAAICI0gAAAICI4gAAAICI8gAAAICJAgAAAICJEgAAAICJIgAAAICJMgAAAICJQgAAAICJUgAAAICJYgAAAICJcgAAAICJggAAAICJkgAAAICJogAAAICJsgAAAICJwgAAAICJ0gAAAICJ4gAAAICJ8gAAAICKAgAAAICKEgAAAICKIgAAAICKMgAAAICKQgAAAICKUgAAAICKYgAAAICKcgAAAICKggAAAICKkgAAAICKogAAAICKsgAAAICKwgAAAICK0gAAAICK4gAAAICK8gAAAICLAgAAAICLEgAAAICLIgAAAICLMgAAAICLQgAAAICLUgAAAICLYgAAAICLcgAAAICLggAAAICLkgAAAICLogAAAICLsgAAAICLwgAAAICL0gAAAICL4gAAAICL8gAAAICMAgAAAICMEgAAAICMIgAAAICMMgAAAICMQgAAAICMUgAAAICMYgAAAICMcgAAAICMggAAAICMkgAAAICMogAAAICMsgAAAICMwgAAAICM0gAAAICM4gAAAICM8gAAAICNAgAAAICNEgAAAICNIgAAAICNMgAAAICNQgAAAICNUgAAAICNYgAAAICNcgAAAICNggAAAICNkgAAAICNogAAAICNsgAAAICNwgAAAICN0gAAAICN4gAAAICN8gAAAICOAgAAAICOEgAAAICOIgAAAICOMgAAAICOQgAAAICOUgAAAICOYgAAAICOcgAAAICOggAAAICOkgAAAICOogAAAICOsgAAAICOwgAAAICO0gAAAICO4gAAAICO8gAAAICPAgAAAICPEgAAAICPIgAAAICPMgAAAICPQgAAAICPUgAAAICPYgAAAICPcgAAAICPggAAAICPkgAAAICPogAAAICPsgAAAICPwgAAAICP0gAAAICP4gAAAICP8gAAAICAAhAAAICAEhAAAICAIhAAAICAMhAAAICAQhAAAICAUhAAAICAYhAAAICAchAAAICAghAAAICAkhAAAICAohAAAICAshAAAICAwhAAAICA0hAAAICA4hAAAICA8hAAAICBAhAAAICBEhAAAICBIhAAAICBMhAAAICBQhAAAICBUhAAAICBYhAAAICBchAAAICBghAAAICBkhAAAICBohAAAICBshAAAICBwhAAAICB0hAAAICB4hAAAICB8hAAAICCAhAAAICCEhAAAICCIhAAAICCMhAAAICCQhAAAICCUhAAAICCYhAAAICCchAAAICCghAAAICCkhAAAICCohAAAICCshAAAICCwhAAAICC0hAAAICC4hAAAICC8hAAAICDAhAAAICDEhAAAICDIhAAAICDMhAAAICDQhAAAICDUhAAAICDYhAAAICDchAAAICDghAAAICDkhAAAICDohAAAICDshAAAICDwhAAAICD0hAAAICD4hAAAICD8hAAAICEAhAAAICEEhAAAICEIhAAAICEMhAAAICEQhAAAICEUhAAAICEYhAAAICEchAAAICEghAAAICEkhAAAICEohAAAICEshAAAICEwhAAAICE0hAAAICE4hAAAICE8hAAAICFAhAAAICFEhAAAICFIhAAAICFMhAAAICFQhAAAICFUhAAAICFYhAAAICFchAAAICFghAAAICFkhAAAICFohAAAICFshAAAICFwhAAAICF0hAAAICF4hAAAICF8hAAAICGAhAAAICGEhAAAICGIhAAAICGMhAAAICGQhAAAICGUhAAAICGYhAAAICGchAAAICGghAAAICGkhAAAICGohAAAICGshAAAICGwhAAAICG0hAAAICG4hAAAICG8hAAAICHAhAAAICHEhAAAICHIhAAAICHMhAAAICHQhAAAICHUhAAAICHYhAAAICHchAAAICHghAAAICHkhAAAICHohAAAICHshAAAICHwhAAAICH0hAAAICH4hAAAICH8hAAAICIAhAAAICIEhAAAICIIhAAAICIMhAAAICIQhAAAICIUhAAAICIYhAAAICIchAAAICIghAAAICIkhAAAICIohAAAICIshAAAICIwhAAAICI0hAAAICI4hAAAICI8hAAAICJAhAAAICJEhAAAICJIhAAAICJMhAAAICJQhAAAICJUhAAAICJYhAAAICJchAAAICJghAAAICJkhAAAICJohAAAICJshAAAICJwhAAAICJ0hAAAICJ4hAAAICJ8hAAAICKAhAAAICKEhAAAICKIhAAAICKMhAAAICKQhAAAICKUhAAAICKYhAAAICKchAAAICKghAAAICKkhAAAICKohAAAICKshAAAICKwhAAAICK0hAAAICK4hAAAICK8hAAAICLAhAAAICLEhAAAICLIhAAAICLMhAAAICLQhAAAICLUhAAAICLYhAAAICLchAAAICLghAAAICLkhAAAICLohAAAICLshAAAICLwhAAAICL0hAAAICL4hAAAICL8hAAAICMAhAAAICMEhAAAICMIhAAAICMMhAAAICMQhAAAICMUhAAAICMYhAAAICMchAAAICMghAAAICMkhAAAICMohAAAICMshAAAICMwhAAAICM0hAAAICM4hAAAICM8hAAAICNAhAAAICNEhAAAICNIhAAAICNMhAAAICNQhAAAICNUhAAAICNYhAAAICNchAAAICNghAAAICNkhAAAICNohAAAICNshAAAICNwhAAAICN0hAAAICN4hAAAICN8hAAAICOAhAAAICOEhAAAICOIhAAAICOMhAAAICOQhAAAICOUhAAAICOYhAAAICOchAAAICOghAAAICOkhAAAICOohAAAICOshAAAICOwhAAAICO0hAAAICO4hAAAICO8hAAAICPAhAAAICPEhAAAICPIhAAAICPMhAAAICPQhAAAICPUhAAAICPYhAAAICPchAAAICPghAAAICPkhAAAICPohAAAICPshAAAICPwhAAAICP0hAAAICP4hAAAICP8hAAAICAAiAAAICAEiAAAICAIiAAAICAMiAAAICAQiAAAICAUiAAAICAYiAAAICAciAAAICAgiAAAICAkiAAAICAoiAAAICAsiAAAICAwiAAAICA0iAAAICA4iAAAICA8iAAAICBAiAAAICBEiAAAICBIiAAAICBMiAAAICBQiAAAICBUiAAAICBYiAAAICBciAAAICBgiAAAICBkiAAAICBoiAAAICBsiAAAICBwiAAAICB0iAAAICB4iAAAICB8iAAAICCAiAAAICCEiAAAICCIiAAAICCMiAAAICCQiAAAICCUiAAAICCYiAAAICCciAAAICCgiAAAICCkiAAAICCoiAAAICCsiAAAICCwiAAAICC0iAAAICC4iAAAICC8iAAAICDAiAAAICDEiAAAICDIiAAAICDMiAAAICDQiAAAICDUiAAAICDYiAAAICDciAAAICDgiAAAICDkiAAAICDoiAAAICDsiAAAICDwiAAAICD0iAAAICD4iAAAICD8iAAAICEAiAAAICEEiAAAICEIiAAAICEMiAAAICEQiAAAICEUiAAAICEYiAAAICEciAAAICEgiAAAICEkiAAAICEoiAAAICEsiAAAICEwiAAAICE0iAAAICE4iAAAICE8iAAAICFAiAAAICFEiAAAICFIiAAAICFMiAAAICFQiAAAICFUiAAAICFYiAAAICFciAAAICFgiAAAICFkiAAAICFoiAAAICFsiAAAICFwiAAAICF0iAAAICF4iAAAICF8iAAAICGAiAAAICGEiAAAICGIiAAAICGMiAAAICGQiAAAICGUiAAAICGYiAAAICGciAAAICGgiAAAICGkiAAAICGoiAAAICGsiAAAICGwiAAAICG0iAAAICG4iAAAICG8iAAAICHAiAAAICHEiAAAICHIiAAAICHMiAAAICHQiAAAICHUiAAAICHYiAAAICHciAAAICHgiAAAICHkiAAAICHoiAAAICHsiAAAICHwiAAAICH0iAAAICH4iAAAICH8iAAAICIAiAAAICIEiAAAICIIiAAAICIMiAAAICIQiAAAICIUiAAAICIYiAAAICIciAAAICIgiAAAICIkiAAAICIoiAAAICIsiAAAICIwiAAAICI0iAAAICI4iAAAICI8iAAAICJAiAAAICJEiAAAICJIiAAAICJMiAAAICJQiAAAICJUiAAAICJYiAAAICJciAAAICJgiAAAICJkiAAAICJoiAAAICJsiAAAICJwiAAAICJ0iAAAICJ4iAAAICJ8iAAAICKAiAAAICKEiAAAICKIiAAAICKMiAAAICKQiAAAICKUiAAAICKYiAAAICKciAAAICKgiAAAICKkiAAAICKoiAAAICKsiAAAICKwiAAAICK0iAAAICK4iAAAICK8iAAAICLAiAAAICLEiAAAICLIiAAAICLMiAAAICLQiAAAICLUiAAAICLYiAAAICLciAAAICLgiAAAICLkiAAAICLoiAAAICLsiAAAICLwiAAAICL0iAAAICL4iAAAICL8iAAAICMAiAAAICMEiAAAICMIiAAAICMMiAAAICMQiAAAICMUiAAAICMYiAAAICMciAAAICMgiAAAICMkiAAAICMoiAAAICMsiAAAICMwiAAAICM0iAAAICM4iAAAICM8iAAAICNAiAAAICNEiAAAICNIiAAAICNMiAAAICNQiAAAICNUiAAAICNYiAAAICNciAAAICNgiAAAICNkiAAAICNoiAAAICNsiAAAICNwiAAAICN0iAAAICN4iAAAICN8iAAAICOAiAAAICOEiAAAICOIiAAAICOMiAAAICOQiAAAICOUiAAAICOYiAAAICOciAAAICOgiAAAICOkiAAAICOoiAAAICOsiAAAICOwiAAAICO0iAAAICO4iAAAICO8iAAAICPAiAAAICPEiAAAICPIiAAAICPMiAAAICPQiAAAICPUiAAAICPYiAAAICPciAAAICPgiAAAICPkiAAAICPoiAAAICPsiAAAICPwiAAAICP0iAAAICP4iAAAICP8iAAAICAAjAAAICAEjAAAICAIjAAAICAMjAAAICAQjAAAICAUjAAAICAYjAAAICAcjAAAICAgjAAAICAkjAAAICAojAAAICAsjAAAICAwjAAAICA0jAAAICA4jAAAICA8jAAAICBAjAAAICBEjAAAICBIjAAAICBMjAAAICBQjAAAICBUjAAAICBYjAAAICBcjAAAICBgjAAAICBkjAAAICBojAAAICBsjAAAICBwjAAAICB0jAAAICB4jAAAICB8jAAAICCAjAAAICCEjAAAICCIjAAAICCMjAAAICCQjAAAICCUjAAAICCYjAAAICCcjAAAICCgjAAAICCkjAAAICCojAAAICCsjAAAICCwjAAAICC0jAAAICC4jAAAICC8jAAAICDAjAAAICDEjAAAICDIjAAAICDMjAAAICDQjAAAICDUjAAAICDYjAAAICDcjAAAICDgjAAAICDkjAAAICDojAAAICDsjAAAICDwjAAAICD0jAAAICD4jAAAICD8jAAAICEAjAAAICEEjAAAICEIjAAAICEMjAAAICEQjAAAICEUjAAAICEYjAAAICEcjAAAICEgjAAAICEkjAAAICEojAAAICEsjAAAICEwjAAAICE0jAAAICE4jAAAICE8jAAAICFAjAAAICFEjAAAICFIjAAAICFMjAAAICFQjAAAICFUjAAAICFYjAAAICFcjAAAICFgjAAAICFkjAAAICFojAAAICFsjAAAICFwjAAAICF0jAAAICF4jAAAICF8jAAAICGAjAAAICGEjAAAICGIjAAAICGMjAAAICGQjAAAICGUjAAAICGYjAAAICGcjAAAICGgjAAAICGkjAAAICGojAAAICGsjAAAICGwjAAAICG0jAAAICG4jAAAICG8jAAAICHAjAAAICHEjAAAICHIjAAAICHMjAAAICHQjAAAICHUjAAAICHYjAAAICHcjAAAICHgjAAAICHkjAAAICHojAAAICHsjAAAICHwjAAAICH0jAAAICH4jAAAICH8jAAAICIAjAAAICIEjAAAICIIjAAAICIMjAAAICIQjAAAICIUjAAAICIYjAAAICIcjAAAICIgjAAAICIkjAAAICIojAAAICIsjAAAICIwjAAAICI0jAAAICI4jAAAICI8jAAAICJAjAAAICJEjAAAICJIjAAAICJMjAAAICJQjAAAICJUjAAAICJYjAAAICJcjAAAICJgjAAAICJkjAAAICJojAAAICJsjAAAICJwjAAAICJ0jAAAICJ4jAAAICJ8jAAAICKAjAAAICKEjAAAICKIjAAAICKMjAAAICKQjAAAICKUjAAAICKYjAAAICKcjAAAICKgjAAAICKkjAAAICKojAAAICKsjAAAICKwjAAAICK0jAAAICK4jAAAICK8jAAAICLAjAAAICLEjAAAICLIjAAAICLMjAAAICLQjAAAICLUjAAAICLYjAAAICLcjAAAICLgjAAAICLkjAAAICLojAAAICLsjAAAICLwjAAAICL0jAAAICL4jAAAICL8jAAAICMAjAAAICMEjAAAICMIjAAAICMMjAAAICMQjAAAICMUjAAAICMYjAAAICMcjAAAICMgjAAAICMkjAAAICMojAAAICMsjAAAICMwjAAAICM0jAAAICM4jAAAICM8jAAAICNAjAAAICNEjAAAICNIjAAAICNMjAAAICNQjAAAICNUjAAAICNYjAAAICNcjAAAICNgjAAAICNkjAAAICNojAAAICNsjAAAICNwjAAAICN0jAAAICN4jAAAICN8jAAAICOAjAAAICOEjAAAICOIjAAAICOMjAAAICOQjAAAICOUjAAAICOYjAAAICOcjAAAICOgjAAAICOkjAAAICOojAAAICOsjAAAICOwjAAAICO0jAAAICO4jAAAICO8jAAAICPAjAAAICPEjAAAICPIjAAAICPMjAAAICPQjAAAICPUjAAAICPYjAAAICPcjAAAICPgjAAAICPkjAAAICPojAAAICPsjAAAICPwjAAAICP0jAAAICP4jAAAICP8jAAAICAAkAAAICAEkAAAICAIkAAAICAMkAAAICAQkAAAICAUkAAAICAYkAAAICAckAAAICAgkAAAICAkkAAAICAokAAAICAskAAAICAwkAAAICA0kAAAICA4kAAAICA8kAAAICBAkAAAICBEkAAAICBIkAAAICBMkAAAICBQkAAAICBUkAAAICBYkAAAICBckAAAICBgkAAAICBkkAAAICBokAAAICBskAAAICBwkAAAICB0kAAAICB4kAAAICB8kAAAICCAkAAAICCEkAAAICCIkAAAICCMkAAAICCQkAAAICCUkAAAICCYkAAAICCckAAAICCgkAAAICCkkAAAICCokAAAICCskAAAICCwkAAAICC0kAAAICC4kAAAICC8kAAAICDAkAAAICDEkAAAICDIkAAAICDMkAAAICDQkAAAICDUkAAAICDYkAAAICDckAAAICDgkAAAICDkkAAAICDokAAAICDskAAAICDwkAAAICD0kAAAICD4kAAAICD8kAAAICEAkAAAICEEkAAAICEIkAAAICEMkAAAICEQkAAAICEUkAAAICEYkAAAICEckAAAICEgkAAAICEkkAAAICEokAAAICEskAAAICEwkAAAICE0kAAAICE4kAAAICE8kAAAICFAkAAAICFEkAAAICFIkAAAICFMkAAAICFQkAAAICFUkAAAICFYkAAAICFckAAAICFgkAAAICFkkAAAICFokAAAICFskAAAICFwkAAAICF0kAAAICF4kAAAICF8kAAAICGAkAAAICGEkAAAICGIkAAAICGMkAAAICGQkAAAICGUkAAAICGYkAAAICGckAAAICGgkAAAICGkkAAAICGokAAAICGskAAAICGwkAAAICG0kAAAICG4kAAAICG8kAAAICHAkAAAICHEkAAAICHIkAAAICHMkAAAICHQkAAAICHUkAAAICHYkAAAICHckAAAICHgkAAAICHkkAAAICHokAAAICHskAAAICHwkAAAICH0kAAAICH4kAAAICH8kAAAICIAkAAAICIEkAAAICIIkAAAICIMkAAAICIQkAAAICIUkAAAICIYkAAAICIckAAAICIgkAAAICIkkAAAICIokAAAICIskAAAICIwkAAAICI0kAAAICI4kAAAICI8kAAAICJAkAAAICJEkAAAICJIkAAAICJMkAAAICJQkAAAICJUkAAAICJYkAAAICJckAAAICJgkAAAICJkkAAAICJokAAAICJskAAAICJwkAAAICJ0kAAAICJ4kAAAICJ8kAAAICKAkAAAICKEkAAAICKIkAAAICKMkAAAICKQkAAAICKUkAAAICKYkAAAICKckAAAICKgkAAAICKkkAAAICKokAAAICKskAAAICKwkAAAICK0kAAAICK4kAAAICK8kAAAICLAkAAAICLEkAAAICLIkAAAICLMkAAAICLQkAAAICLUkAAAICLYkAAAICLckAAAICLgkAAAICLkkAAAICLokAAAICLskAAAICLwkAAAICL0kAAAICL4kAAAICL8kAAAICMAkAAAICMEkAAAICMIkAAAICMMkAAAICMQkAAAICMUkAAAICMYkAAAICMckAAAICMgkAAAICMkkAAAICMokAAAICMskAAAICMwkAAAICM0kAAAICM4kAAAICM8kAAAICNAkAAAICNEkAAAICNIkAAAICNMkAAAICNQkAAAICNUkAAAICNYkAAAICNckAAAICNgkAAAICNkkAAAICNokAAAICNskAAAICNwkAAAICN0kAAAICN4kAAAICN8kAAAICOAkAAAICOEkAAAICOIkAAAICOMkAAAICOQkAAAICOUkAAAICOYkAAAICOckAAAICOgkAAAICOkkAAAICOokAAAICOskAAAICOwkAAAICO0kAAAICO4kAAAICO8kAAAICPAkAAAICPEkAAAICPIkAAAICPMkAAAICPQkAAAICPUkAAAICPYkAAAICPckAAAICPgkAAAICPkkAAAICPokAAAICPskAAAICPwkAAAICP0kAAAICP4kAAAICP8kAAAICAAlAAAICAElAAAICAIlAAAICAMlAAAICAQlAAAICAUlAAAICAYlAAAICAclAAAICAglAAAICAklAAAICAolAAAICAslAAAICAwlAAAICA0lAAAICA4lAAAICA8lAAAICBAlAAAICBElAAAICBIlAAAICBMlAAAICBQlAAAICBUlAAAICBYlAAAICBclAAAICBglAAAICBklAAAICBolAAAICBslAAAICBwlAAAICB0lAAAICB4lAAAICB8lAAAICCAlAAAICCElAAAICCIlAAAICCMlAAAICCQlAAAICCUlAAAICCYlAAAICCclAAAICCglAAAICCklAAAICColAAAICCslAAAICCwlAAAICC0lAAAICC4lAAAICC8lAAAICDAlAAAICDElAAAICDIlAAAICDMlAAAICDQlAAAICDUlAAAICDYlAAAICDclAAAICDglAAAICDklAAAICDolAAAICDslAAAICDwlAAAICD0lAAAICD4lAAAICD8lAAAICEAlAAAICEElAAAICEIlAAAICEMlAAAICEQlAAAICEUlAAAICEYlAAAICEclAAAICEglAAAICEklAAAICEolAAAICEslAAAICEwlAAAICE0lAAAICE4lAAAICE8lAAAICFAlAAAICFElAAAICFIlAAAICFMlAAAICFQlAAAICFUlAAAICFYlAAAICFclAAAICFglAAAICFklAAAICFolAAAICFslAAAICFwlAAAICF0lAAAICF4lAAAICF8lAAAICGAlAAAICGElAAAICGIlAAAICGMlAAAICGQlAAAICGUlAAAICGYlAAAICGclAAAICGglAAAICGklAAAICGolAAAICGslAAAICGwlAAAICG0lAAAICG4lAAAICG8lAAAICHAlAAAICHElAAAICHIlAAAICHMlAAAICHQlAAAICHUlAAAICHYlAAAICHclAAAICHglAAAICHklAAAICHolAAAICHslAAAICHwlAAAICH0lAAAICH4lAAAICH8lAAAICIAlAAAICIElAAAICIIlAAAICIMlAAAICIQlAAAICIUlAAAICIYlAAAICIclAAAICIglAAAICIklAAAICIolAAAICIslAAAICIwlAAAICI0lAAAICI4lAAAICI8lAAAICJAlAAAICJElAAAICJIlAAAICJMlAAAICJQlAAAICJUlAAAICJYlAAAICJclAAAICJglAAAICJklAAAICJolAAAICJslAAAICJwlAAAICJ0lAAAICJ4lAAAICJ8lAAAICKAlAAAICKElAAAICKIlAAAICKMlAAAICKQlAAAICKUlAAAICKYlAAAICKclAAAICKglAAAICKklAAAICKolAAAICKslAAAICKwlAAAICK0lAAAICK4lAAAICK8lAAAICLAlAAAICLElAAAICLIlAAAICLMlAAAICLQlAAAICLUlAAAICLYlAAAICLclAAAICLglAAAICLklAAAICLolAAAICLslAAAICLwlAAAICL0lAAAICL4lAAAICL8lAAAICMAlAAAICMElAAAICMIlAAAICMMlAAAICMQlAAAICMUlAAAICMYlAAAICMclAAAICMglAAAICMklAAAICMolAAAICMslAAAICMwlAAAICM0lAAAICM4lAAAICM8lAAAICNAlAAAICNElAAAICNIlAAAICNMlAAAICNQlAAAICNUlAAAICNYlAAAICNclAAAICNglAAAICNklAAAICNolAAAICNslAAAICNwlAAAICN0lAAAICN4lAAAICN8lAAAICOAlAAAICOElAAAICOIlAAAICOMlAAAICOQlAAAICOUlAAAICOYlAAAICOclAAAICOglAAAICOklAAAICOolAAAICOslAAAICOwlAAAICO0lAAAICO4lAAAICO8lAAAICPAlAAAICPElAAAICPIlAAAICPMlAAAICPQlAAAICPUlAAAICPYlAAAICPclAAAICPglAAAICPklAAAICPolAAAICPslAAAICPwlAAAICP0lAAAICP4lAAAICP8lAAAICAAmAAAICAEmAAAICAImAAAICAMmAAAICAQmAAAICAUmAAAICAYmAAAICAcmAAAICAgmAAAICAkmAAAICAomAAAICAsmAAAICAwmAAAICA0mAAAICA4mAAAICA8mAAAICBAmAAAICBEmAAAICBImAAAICBMmAAAICBQmAAAICBUmAAAICBYmAAAICBcmAAAICBgmAAAICBkmAAAICBomAAAICBsmAAAICBwmAAAICB0mAAAICB4mAAAICB8mAAAICCAmAAAICCEmAAAICCImAAAICCMmAAAICCQmAAAICCUmAAAICCYmAAAICCcmAAAICCgmAAAICCkmAAAICComAAAICCsmAAAICCwmAAAICC0mAAAICC4mAAAICC8mAAAICDAmAAAICDEmAAAICDImAAAICDMmAAAICDQmAAAICDUmAAAICDYmAAAICDcmAAAICDgmAAAICDkmAAAICDomAAAICDsmAAAICDwmAAAICD0mAAAICD4mAAAICD8mAAAICEAmAAAICEEmAAAICEImAAAICEMmAAAICEQmAAAICEUmAAAICEYmAAAICEcmAAAICEgmAAAICEkmAAAICEomAAAICEsmAAAICEwmAAAICE0mAAAICE4mAAAICE8mAAAICFAmAAAICFEmAAAICFImAAAICFMmAAAICFQmAAAICFUmAAAICFYmAAAICFcmAAAICFgmAAAICFkmAAAICFomAAAICFsmAAAICFwmAAAICF0mAAAICF4mAAAICF8mAAAICGAmAAAICGEmAAAICGImAAAICGMmAAAICGQmAAAICGUmAAAICGYmAAAICGcmAAAICGgmAAAICGkmAAAICGomAAAICGsmAAAICGwmAAAICG0mAAAICG4mAAAICG8mAAAICHAmAAAICHEmAAAICHImAAAICHMmAAAICHQmAAAICHUmAAAICHYmAAAICHcmAAAICHgmAAAICHkmAAAICHomAAAICHsmAAAICHwmAAAICH0mAAAICH4mAAAICH8mAAAICIAmAAAICIEmAAAICIImAAAICIMmAAAICIQmAAAICIUmAAAICIYmAAAICIcmAAAICIgmAAAICIkmAAAICIomAAAICIsmAAAICIwmAAAICI0mAAAICI4mAAAICI8mAAAICJAmAAAICJEmAAAICJImAAAICJMmAAAICJQmAAAICJUmAAAICJYmAAAICJcmAAAICJgmAAAICJkmAAAICJomAAAICJsmAAAICJwmAAAICJ0mAAAICJ4mAAAICJ8mAAAICKAmAAAICKEmAAAICKImAAAICKMmAAAICKQmAAAICKUmAAAICKYmAAAICKcmAAAICKgmAAAICKkmAAAICKomAAAICKsmAAAICKwmAAAICK0mAAAICK4mAAAICK8mAAAICLAmAAAICLEmAAAICLImAAAICLMmAAAICLQmAAAICLUmAAAICLYmAAAICLcmAAAICLgmAAAICLkmAAAICLomAAAICLsmAAAICLwmAAAICL0mAAAICL4mAAAICL8mAAAICMAmAAAICMEmAAAICMImAAAICMMmAAAICMQmAAAICMUmAAAICMYmAAAICMcmAAAICMgmAAAICMkmAAAICMomAAAICMsmAAAICMwmAAAICM0mAAAICM4mAAAICM8mAAAICNAmAAAICNEmAAAICNImAAAICNMmAAAICNQmAAAICNUmAAAICNYmAAAICNcmAAAICNgmAAAICNkmAAAICNomAAAICNsmAAAICNwmAAAICN0mAAAICN4mAAAICN8mAAAICOAmAAAICOEmAAAICOImAAAICOMmAAAICOQmAAAICOUmAAAICOYmAAAICOcmAAAICOgmAAAICOkmAAAICOomAAAICOsmAAAICOwmAAAICO0mAAAICO4mAAAICO8mAAAICPAmAAAICPEmAAAICPImAAAICPMmAAAICPQmAAAICPUmAAAICPYmAAAICPcmAAAICPgmAAAICPkmAAAICPomAAAICPsmAAAICPwmAAAICP0mAAAICP4mAAAICP8mAAAICAAnAAAICAEnAAAICAInAAAICAMnAAAICAQnAAAICAUnAAAICAYnAAAICAcnAAAICAgnAAAICAknAAAICAonAAAICAsnAAAICAwnAAAICA0nAAAICA4nAAAICA8nAAAL", "AAEAAAD/////AQAAAAAAAAAQAQAAABAnAAAICAAAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAICCkAAAAICCoAAAAICCsAAAAICCwAAAAICC0AAAAICC4AAAAICC8AAAAICDAAAAAICDEAAAAICDIAAAAICDMAAAAICDQAAAAICDUAAAAICDYAAAAICDcAAAAICDgAAAAICDkAAAAICDoAAAAICDsAAAAICDwAAAAICD0AAAAICD4AAAAICD8AAAAICEAAAAAICEEAAAAICEIAAAAICEMAAAAICEQAAAAICEUAAAAICEYAAAAICEcAAAAICEgAAAAICEkAAAAICEoAAAAICEsAAAAICEwAAAAICE0AAAAICE4AAAAICE8AAAAICFAAAAAICFEAAAAICFIAAAAICFMAAAAICFQAAAAICFUAAAAICFYAAAAICFcAAAAICFgAAAAICFkAAAAICFoAAAAICFsAAAAICFwAAAAICF0AAAAICF4AAAAICF8AAAAICGAAAAAICGEAAAAICGIAAAAICGMAAAAICGQAAAAICGUAAAAICGYAAAAICGcAAAAICGgAAAAICGkAAAAICGoAAAAICGsAAAAICGwAAAAICG0AAAAICG4AAAAICG8AAAAICHAAAAAICHEAAAAICHIAAAAICHMAAAAICHQAAAAICHUAAAAICHYAAAAICHcAAAAICHgAAAAICHkAAAAICHoAAAAICHsAAAAICHwAAAAICH0AAAAICH4AAAAICH8AAAAICIAAAAAICIEAAAAICIIAAAAICIMAAAAICIQAAAAICIUAAAAICIYAAAAICIcAAAAICIgAAAAICIkAAAAICIoAAAAICIsAAAAICIwAAAAICI0AAAAICI4AAAAICI8AAAAICJAAAAAICJEAAAAICJIAAAAICJMAAAAICJQAAAAICJUAAAAICJYAAAAICJcAAAAICJgAAAAICJkAAAAICJoAAAAICJsAAAAICJwAAAAICJ0AAAAICJ4AAAAICJ8AAAAICKAAAAAICKEAAAAICKIAAAAICKMAAAAICKQAAAAICKUAAAAICKYAAAAICKcAAAAICKgAAAAICKkAAAAICKoAAAAICKsAAAAICKwAAAAICK0AAAAICK4AAAAICK8AAAAICLAAAAAICLEAAAAICLIAAAAICLMAAAAICLQAAAAICLUAAAAICLYAAAAICLcAAAAICLgAAAAICLkAAAAICLoAAAAICLsAAAAICLwAAAAICL0AAAAICL4AAAAICL8AAAAICMAAAAAICMEAAAAICMIAAAAICMMAAAAICMQAAAAICMUAAAAICMYAAAAICMcAAAAICMgAAAAICMkAAAAICMoAAAAICMsAAAAICMwAAAAICM0AAAAICM4AAAAICM8AAAAICNAAAAAICNEAAAAICNIAAAAICNMAAAAICNQAAAAICNUAAAAICNYAAAAICNcAAAAICNgAAAAICNkAAAAICNoAAAAICNsAAAAICNwAAAAICN0AAAAICN4AAAAICN8AAAAICOAAAAAICOEAAAAICOIAAAAICOMAAAAICOQAAAAICOUAAAAICOYAAAAICOcAAAAICOgAAAAICOkAAAAICOoAAAAICOsAAAAICOwAAAAICO0AAAAICO4AAAAICO8AAAAICPAAAAAICPEAAAAICPIAAAAICPMAAAAICPQAAAAICPUAAAAICPYAAAAICPcAAAAICPgAAAAICPkAAAAICPoAAAAICPsAAAAICPwAAAAICP0AAAAICP4AAAAICP8AAAAICAABAAAICAEBAAAICAIBAAAICAMBAAAICAQBAAAICAUBAAAICAYBAAAICAcBAAAICAgBAAAICAkBAAAICAoBAAAICAsBAAAICAwBAAAICA0BAAAICA4BAAAICA8BAAAICBABAAAICBEBAAAICBIBAAAICBMBAAAICBQBAAAICBUBAAAICBYBAAAICBcBAAAICBgBAAAICBkBAAAICBoBAAAICBsBAAAICBwBAAAICB0BAAAICB4BAAAICB8BAAAICCABAAAICCEBAAAICCIBAAAICCMBAAAICCQBAAAICCUBAAAICCYBAAAICCcBAAAICCgBAAAICCkBAAAICCoBAAAICCsBAAAICCwBAAAICC0BAAAICC4BAAAICC8BAAAICDABAAAICDEBAAAICDIBAAAICDMBAAAICDQBAAAICDUBAAAICDYBAAAICDcBAAAICDgBAAAICDkBAAAICDoBAAAICDsBAAAICDwBAAAICD0BAAAICD4BAAAICD8BAAAICEABAAAICEEBAAAICEIBAAAICEMBAAAICEQBAAAICEUBAAAICEYBAAAICEcBAAAICEgBAAAICEkBAAAICEoBAAAICEsBAAAICEwBAAAICE0BAAAICE4BAAAICE8BAAAICFABAAAICFEBAAAICFIBAAAICFMBAAAICFQBAAAICFUBAAAICFYBAAAICFcBAAAICFgBAAAICFkBAAAICFoBAAAICFsBAAAICFwBAAAICF0BAAAICF4BAAAICF8BAAAICGABAAAICGEBAAAICGIBAAAICGMBAAAICGQBAAAICGUBAAAICGYBAAAICGcBAAAICGgBAAAICGkBAAAICGoBAAAICGsBAAAICGwBAAAICG0BAAAICG4BAAAICG8BAAAICHABAAAICHEBAAAICHIBAAAICHMBAAAICHQBAAAICHUBAAAICHYBAAAICHcBAAAICHgBAAAICHkBAAAICHoBAAAICHsBAAAICHwBAAAICH0BAAAICH4BAAAICH8BAAAICIABAAAICIEBAAAICIIBAAAICIMBAAAICIQBAAAICIUBAAAICIYBAAAICIcBAAAICIgBAAAICIkBAAAICIoBAAAICIsBAAAICIwBAAAICI0BAAAICI4BAAAICI8BAAAICJABAAAICJEBAAAICJIBAAAICJMBAAAICJQBAAAICJUBAAAICJYBAAAICJcBAAAICJgBAAAICJkBAAAICJoBAAAICJsBAAAICJwBAAAICJ0BAAAICJ4BAAAICJ8BAAAICKABAAAICKEBAAAICKIBAAAICKMBAAAICKQBAAAICKUBAAAICKYBAAAICKcBAAAICKgBAAAICKkBAAAICKoBAAAICKsBAAAICKwBAAAICK0BAAAICK4BAAAICK8BAAAICLABAAAICLEBAAAICLIBAAAICLMBAAAICLQBAAAICLUBAAAICLYBAAAICLcBAAAICLgBAAAICLkBAAAICLoBAAAICLsBAAAICLwBAAAICL0BAAAICL4BAAAICL8BAAAICMABAAAICMEBAAAICMIBAAAICMMBAAAICMQBAAAICMUBAAAICMYBAAAICMcBAAAICMgBAAAICMkBAAAICMoBAAAICMsBAAAICMwBAAAICM0BAAAICM4BAAAICM8BAAAICNABAAAICNEBAAAICNIBAAAICNMBAAAICNQBAAAICNUBAAAICNYBAAAICNcBAAAICNgBAAAICNkBAAAICNoBAAAICNsBAAAICNwBAAAICN0BAAAICN4BAAAICN8BAAAICOABAAAICOEBAAAICOIBAAAICOMBAAAICOQBAAAICOUBAAAICOYBAAAICOcBAAAICOgBAAAICOkBAAAICOoBAAAICOsBAAAICOwBAAAICO0BAAAICO4BAAAICO8BAAAICPABAAAICPEBAAAICPIBAAAICPMBAAAICPQBAAAICPUBAAAICPYBAAAICPcBAAAICPgBAAAICPkBAAAICPoBAAAICPsBAAAICPwBAAAICP0BAAAICP4BAAAICP8BAAAICAACAAAICAECAAAICAICAAAICAMCAAAICAQCAAAICAUCAAAICAYCAAAICAcCAAAICAgCAAAICAkCAAAICAoCAAAICAsCAAAICAwCAAAICA0CAAAICA4CAAAICA8CAAAICBACAAAICBECAAAICBICAAAICBMCAAAICBQCAAAICBUCAAAICBYCAAAICBcCAAAICBgCAAAICBkCAAAICBoCAAAICBsCAAAICBwCAAAICB0CAAAICB4CAAAICB8CAAAICCACAAAICCECAAAICCICAAAICCMCAAAICCQCAAAICCUCAAAICCYCAAAICCcCAAAICCgCAAAICCkCAAAICCoCAAAICCsCAAAICCwCAAAICC0CAAAICC4CAAAICC8CAAAICDACAAAICDECAAAICDICAAAICDMCAAAICDQCAAAICDUCAAAICDYCAAAICDcCAAAICDgCAAAICDkCAAAICDoCAAAICDsCAAAICDwCAAAICD0CAAAICD4CAAAICD8CAAAICEACAAAICEECAAAICEICAAAICEMCAAAICEQCAAAICEUCAAAICEYCAAAICEcCAAAICEgCAAAICEkCAAAICEoCAAAICEsCAAAICEwCAAAICE0CAAAICE4CAAAICE8CAAAICFACAAAICFECAAAICFICAAAICFMCAAAICFQCAAAICFUCAAAICFYCAAAICFcCAAAICFgCAAAICFkCAAAICFoCAAAICFsCAAAICFwCAAAICF0CAAAICF4CAAAICF8CAAAICGACAAAICGECAAAICGICAAAICGMCAAAICGQCAAAICGUCAAAICGYCAAAICGcCAAAICGgCAAAICGkCAAAICGoCAAAICGsCAAAICGwCAAAICG0CAAAICG4CAAAICG8CAAAICHACAAAICHECAAAICHICAAAICHMCAAAICHQCAAAICHUCAAAICHYCAAAICHcCAAAICHgCAAAICHkCAAAICHoCAAAICHsCAAAICHwCAAAICH0CAAAICH4CAAAICH8CAAAICIACAAAICIECAAAICIICAAAICIMCAAAICIQCAAAICIUCAAAICIYCAAAICIcCAAAICIgCAAAICIkCAAAICIoCAAAICIsCAAAICIwCAAAICI0CAAAICI4CAAAICI8CAAAICJACAAAICJECAAAICJICAAAICJMCAAAICJQCAAAICJUCAAAICJYCAAAICJcCAAAICJgCAAAICJkCAAAICJoCAAAICJsCAAAICJwCAAAICJ0CAAAICJ4CAAAICJ8CAAAICKACAAAICKECAAAICKICAAAICKMCAAAICKQCAAAICKUCAAAICKYCAAAICKcCAAAICKgCAAAICKkCAAAICKoCAAAICKsCAAAICKwCAAAICK0CAAAICK4CAAAICK8CAAAICLACAAAICLECAAAICLICAAAICLMCAAAICLQCAAAICLUCAAAICLYCAAAICLcCAAAICLgCAAAICLkCAAAICLoCAAAICLsCAAAICLwCAAAICL0CAAAICL4CAAAICL8CAAAICMACAAAICMECAAAICMICAAAICMMCAAAICMQCAAAICMUCAAAICMYCAAAICMcCAAAICMgCAAAICMkCAAAICMoCAAAICMsCAAAICMwCAAAICM0CAAAICM4CAAAICM8CAAAICNACAAAICNECAAAICNICAAAICNMCAAAICNQCAAAICNUCAAAICNYCAAAICNcCAAAICNgCAAAICNkCAAAICNoCAAAICNsCAAAICNwCAAAICN0CAAAICN4CAAAICN8CAAAICOACAAAICOECAAAICOICAAAICOMCAAAICOQCAAAICOUCAAAICOYCAAAICOcCAAAICOgCAAAICOkCAAAICOoCAAAICOsCAAAICOwCAAAICO0CAAAICO4CAAAICO8CAAAICPACAAAICPECAAAICPICAAAICPMCAAAICPQCAAAICPUCAAAICPYCAAAICPcCAAAICPgCAAAICPkCAAAICPoCAAAICPsCAAAICPwCAAAICP0CAAAICP4CAAAICP8CAAAICAADAAAICAEDAAAICAIDAAAICAMDAAAICAQDAAAICAUDAAAICAYDAAAICAcDAAAICAgDAAAICAkDAAAICAoDAAAICAsDAAAICAwDAAAICA0DAAAICA4DAAAICA8DAAAICBADAAAICBEDAAAICBIDAAAICBMDAAAICBQDAAAICBUDAAAICBYDAAAICBcDAAAICBgDAAAICBkDAAAICBoDAAAICBsDAAAICBwDAAAICB0DAAAICB4DAAAICB8DAAAICCADAAAICCEDAAAICCIDAAAICCMDAAAICCQDAAAICCUDAAAICCYDAAAICCcDAAAICCgDAAAICCkDAAAICCoDAAAICCsDAAAICCwDAAAICC0DAAAICC4DAAAICC8DAAAICDADAAAICDEDAAAICDIDAAAICDMDAAAICDQDAAAICDUDAAAICDYDAAAICDcDAAAICDgDAAAICDkDAAAICDoDAAAICDsDAAAICDwDAAAICD0DAAAICD4DAAAICD8DAAAICEADAAAICEEDAAAICEIDAAAICEMDAAAICEQDAAAICEUDAAAICEYDAAAICEcDAAAICEgDAAAICEkDAAAICEoDAAAICEsDAAAICEwDAAAICE0DAAAICE4DAAAICE8DAAAICFADAAAICFEDAAAICFIDAAAICFMDAAAICFQDAAAICFUDAAAICFYDAAAICFcDAAAICFgDAAAICFkDAAAICFoDAAAICFsDAAAICFwDAAAICF0DAAAICF4DAAAICF8DAAAICGADAAAICGEDAAAICGIDAAAICGMDAAAICGQDAAAICGUDAAAICGYDAAAICGcDAAAICGgDAAAICGkDAAAICGoDAAAICGsDAAAICGwDAAAICG0DAAAICG4DAAAICG8DAAAICHADAAAICHEDAAAICHIDAAAICHMDAAAICHQDAAAICHUDAAAICHYDAAAICHcDAAAICHgDAAAICHkDAAAICHoDAAAICHsDAAAICHwDAAAICH0DAAAICH4DAAAICH8DAAAICIADAAAICIEDAAAICIIDAAAICIMDAAAICIQDAAAICIUDAAAICIYDAAAICIcDAAAICIgDAAAICIkDAAAICIoDAAAICIsDAAAICIwDAAAICI0DAAAICI4DAAAICI8DAAAICJADAAAICJEDAAAICJIDAAAICJMDAAAICJQDAAAICJUDAAAICJYDAAAICJcDAAAICJgDAAAICJkDAAAICJoDAAAICJsDAAAICJwDAAAICJ0DAAAICJ4DAAAICJ8DAAAICKADAAAICKEDAAAICKIDAAAICKMDAAAICKQDAAAICKUDAAAICKYDAAAICKcDAAAICKgDAAAICKkDAAAICKoDAAAICKsDAAAICKwDAAAICK0DAAAICK4DAAAICK8DAAAICLADAAAICLEDAAAICLIDAAAICLMDAAAICLQDAAAICLUDAAAICLYDAAAICLcDAAAICLgDAAAICLkDAAAICLoDAAAICLsDAAAICLwDAAAICL0DAAAICL4DAAAICL8DAAAICMADAAAICMEDAAAICMIDAAAICMMDAAAICMQDAAAICMUDAAAICMYDAAAICMcDAAAICMgDAAAICMkDAAAICMoDAAAICMsDAAAICMwDAAAICM0DAAAICM4DAAAICM8DAAAICNADAAAICNEDAAAICNIDAAAICNMDAAAICNQDAAAICNUDAAAICNYDAAAICNcDAAAICNgDAAAICNkDAAAICNoDAAAICNsDAAAICNwDAAAICN0DAAAICN4DAAAICN8DAAAICOADAAAICOEDAAAICOIDAAAICOMDAAAICOQDAAAICOUDAAAICOYDAAAICOcDAAAICOgDAAAICOkDAAAICOoDAAAICOsDAAAICOwDAAAICO0DAAAICO4DAAAICO8DAAAICPADAAAICPEDAAAICPIDAAAICPMDAAAICPQDAAAICPUDAAAICPYDAAAICPcDAAAICPgDAAAICPkDAAAICPoDAAAICPsDAAAICPwDAAAICP0DAAAICP4DAAAICP8DAAAICAAEAAAICAEEAAAICAIEAAAICAMEAAAICAQEAAAICAUEAAAICAYEAAAICAcEAAAICAgEAAAICAkEAAAICAoEAAAICAsEAAAICAwEAAAICA0EAAAICA4EAAAICA8EAAAICBAEAAAICBEEAAAICBIEAAAICBMEAAAICBQEAAAICBUEAAAICBYEAAAICBcEAAAICBgEAAAICBkEAAAICBoEAAAICBsEAAAICBwEAAAICB0EAAAICB4EAAAICB8EAAAICCAEAAAICCEEAAAICCIEAAAICCMEAAAICCQEAAAICCUEAAAICCYEAAAICCcEAAAICCgEAAAICCkEAAAICCoEAAAICCsEAAAICCwEAAAICC0EAAAICC4EAAAICC8EAAAICDAEAAAICDEEAAAICDIEAAAICDMEAAAICDQEAAAICDUEAAAICDYEAAAICDcEAAAICDgEAAAICDkEAAAICDoEAAAICDsEAAAICDwEAAAICD0EAAAICD4EAAAICD8EAAAICEAEAAAICEEEAAAICEIEAAAICEMEAAAICEQEAAAICEUEAAAICEYEAAAICEcEAAAICEgEAAAICEkEAAAICEoEAAAICEsEAAAICEwEAAAICE0EAAAICE4EAAAICE8EAAAICFAEAAAICFEEAAAICFIEAAAICFMEAAAICFQEAAAICFUEAAAICFYEAAAICFcEAAAICFgEAAAICFkEAAAICFoEAAAICFsEAAAICFwEAAAICF0EAAAICF4EAAAICF8EAAAICGAEAAAICGEEAAAICGIEAAAICGMEAAAICGQEAAAICGUEAAAICGYEAAAICGcEAAAICGgEAAAICGkEAAAICGoEAAAICGsEAAAICGwEAAAICG0EAAAICG4EAAAICG8EAAAICHAEAAAICHEEAAAICHIEAAAICHMEAAAICHQEAAAICHUEAAAICHYEAAAICHcEAAAICHgEAAAICHkEAAAICHoEAAAICHsEAAAICHwEAAAICH0EAAAICH4EAAAICH8EAAAICIAEAAAICIEEAAAICIIEAAAICIMEAAAICIQEAAAICIUEAAAICIYEAAAICIcEAAAICIgEAAAICIkEAAAICIoEAAAICIsEAAAICIwEAAAICI0EAAAICI4EAAAICI8EAAAICJAEAAAICJEEAAAICJIEAAAICJMEAAAICJQEAAAICJUEAAAICJYEAAAICJcEAAAICJgEAAAICJkEAAAICJoEAAAICJsEAAAICJwEAAAICJ0EAAAICJ4EAAAICJ8EAAAICKAEAAAICKEEAAAICKIEAAAICKMEAAAICKQEAAAICKUEAAAICKYEAAAICKcEAAAICKgEAAAICKkEAAAICKoEAAAICKsEAAAICKwEAAAICK0EAAAICK4EAAAICK8EAAAICLAEAAAICLEEAAAICLIEAAAICLMEAAAICLQEAAAICLUEAAAICLYEAAAICLcEAAAICLgEAAAICLkEAAAICLoEAAAICLsEAAAICLwEAAAICL0EAAAICL4EAAAICL8EAAAICMAEAAAICMEEAAAICMIEAAAICMMEAAAICMQEAAAICMUEAAAICMYEAAAICMcEAAAICMgEAAAICMkEAAAICMoEAAAICMsEAAAICMwEAAAICM0EAAAICM4EAAAICM8EAAAICNAEAAAICNEEAAAICNIEAAAICNMEAAAICNQEAAAICNUEAAAICNYEAAAICNcEAAAICNgEAAAICNkEAAAICNoEAAAICNsEAAAICNwEAAAICN0EAAAICN4EAAAICN8EAAAICOAEAAAICOEEAAAICOIEAAAICOMEAAAICOQEAAAICOUEAAAICOYEAAAICOcEAAAICOgEAAAICOkEAAAICOoEAAAICOsEAAAICOwEAAAICO0EAAAICO4EAAAICO8EAAAICPAEAAAICPEEAAAICPIEAAAICPMEAAAICPQEAAAICPUEAAAICPYEAAAICPcEAAAICPgEAAAICPkEAAAICPoEAAAICPsEAAAICPwEAAAICP0EAAAICP4EAAAICP8EAAAICAAFAAAICAEFAAAICAIFAAAICAMFAAAICAQFAAAICAUFAAAICAYFAAAICAcFAAAICAgFAAAICAkFAAAICAoFAAAICAsFAAAICAwFAAAICA0FAAAICA4FAAAICA8FAAAICBAFAAAICBEFAAAICBIFAAAICBMFAAAICBQFAAAICBUFAAAICBYFAAAICBcFAAAICBgFAAAICBkFAAAICBoFAAAICBsFAAAICBwFAAAICB0FAAAICB4FAAAICB8FAAAICCAFAAAICCEFAAAICCIFAAAICCMFAAAICCQFAAAICCUFAAAICCYFAAAICCcFAAAICCgFAAAICCkFAAAICCoFAAAICCsFAAAICCwFAAAICC0FAAAICC4FAAAICC8FAAAICDAFAAAICDEFAAAICDIFAAAICDMFAAAICDQFAAAICDUFAAAICDYFAAAICDcFAAAICDgFAAAICDkFAAAICDoFAAAICDsFAAAICDwFAAAICD0FAAAICD4FAAAICD8FAAAICEAFAAAICEEFAAAICEIFAAAICEMFAAAICEQFAAAICEUFAAAICEYFAAAICEcFAAAICEgFAAAICEkFAAAICEoFAAAICEsFAAAICEwFAAAICE0FAAAICE4FAAAICE8FAAAICFAFAAAICFEFAAAICFIFAAAICFMFAAAICFQFAAAICFUFAAAICFYFAAAICFcFAAAICFgFAAAICFkFAAAICFoFAAAICFsFAAAICFwFAAAICF0FAAAICF4FAAAICF8FAAAICGAFAAAICGEFAAAICGIFAAAICGMFAAAICGQFAAAICGUFAAAICGYFAAAICGcFAAAICGgFAAAICGkFAAAICGoFAAAICGsFAAAICGwFAAAICG0FAAAICG4FAAAICG8FAAAICHAFAAAICHEFAAAICHIFAAAICHMFAAAICHQFAAAICHUFAAAICHYFAAAICHcFAAAICHgFAAAICHkFAAAICHoFAAAICHsFAAAICHwFAAAICH0FAAAICH4FAAAICH8FAAAICIAFAAAICIEFAAAICIIFAAAICIMFAAAICIQFAAAICIUFAAAICIYFAAAICIcFAAAICIgFAAAICIkFAAAICIoFAAAICIsFAAAICIwFAAAICI0FAAAICI4FAAAICI8FAAAICJAFAAAICJEFAAAICJIFAAAICJMFAAAICJQFAAAICJUFAAAICJYFAAAICJcFAAAICJgFAAAICJkFAAAICJoFAAAICJsFAAAICJwFAAAICJ0FAAAICJ4FAAAICJ8FAAAICKAFAAAICKEFAAAICKIFAAAICKMFAAAICKQFAAAICKUFAAAICKYFAAAICKcFAAAICKgFAAAICKkFAAAICKoFAAAICKsFAAAICKwFAAAICK0FAAAICK4FAAAICK8FAAAICLAFAAAICLEFAAAICLIFAAAICLMFAAAICLQFAAAICLUFAAAICLYFAAAICLcFAAAICLgFAAAICLkFAAAICLoFAAAICLsFAAAICLwFAAAICL0FAAAICL4FAAAICL8FAAAICMAFAAAICMEFAAAICMIFAAAICMMFAAAICMQFAAAICMUFAAAICMYFAAAICMcFAAAICMgFAAAICMkFAAAICMoFAAAICMsFAAAICMwFAAAICM0FAAAICM4FAAAICM8FAAAICNAFAAAICNEFAAAICNIFAAAICNMFAAAICNQFAAAICNUFAAAICNYFAAAICNcFAAAICNgFAAAICNkFAAAICNoFAAAICNsFAAAICNwFAAAICN0FAAAICN4FAAAICN8FAAAICOAFAAAICOEFAAAICOIFAAAICOMFAAAICOQFAAAICOUFAAAICOYFAAAICOcFAAAICOgFAAAICOkFAAAICOoFAAAICOsFAAAICOwFAAAICO0FAAAICO4FAAAICO8FAAAICPAFAAAICPEFAAAICPIFAAAICPMFAAAICPQFAAAICPUFAAAICPYFAAAICPcFAAAICPgFAAAICPkFAAAICPoFAAAICPsFAAAICPwFAAAICP0FAAAICP4FAAAICP8FAAAICAAGAAAICAEGAAAICAIGAAAICAMGAAAICAQGAAAICAUGAAAICAYGAAAICAcGAAAICAgGAAAICAkGAAAICAoGAAAICAsGAAAICAwGAAAICA0GAAAICA4GAAAICA8GAAAICBAGAAAICBEGAAAICBIGAAAICBMGAAAICBQGAAAICBUGAAAICBYGAAAICBcGAAAICBgGAAAICBkGAAAICBoGAAAICBsGAAAICBwGAAAICB0GAAAICB4GAAAICB8GAAAICCAGAAAICCEGAAAICCIGAAAICCMGAAAICCQGAAAICCUGAAAICCYGAAAICCcGAAAICCgGAAAICCkGAAAICCoGAAAICCsGAAAICCwGAAAICC0GAAAICC4GAAAICC8GAAAICDAGAAAICDEGAAAICDIGAAAICDMGAAAICDQGAAAICDUGAAAICDYGAAAICDcGAAAICDgGAAAICDkGAAAICDoGAAAICDsGAAAICDwGAAAICD0GAAAICD4GAAAICD8GAAAICEAGAAAICEEGAAAICEIGAAAICEMGAAAICEQGAAAICEUGAAAICEYGAAAICEcGAAAICEgGAAAICEkGAAAICEoGAAAICEsGAAAICEwGAAAICE0GAAAICE4GAAAICE8GAAAICFAGAAAICFEGAAAICFIGAAAICFMGAAAICFQGAAAICFUGAAAICFYGAAAICFcGAAAICFgGAAAICFkGAAAICFoGAAAICFsGAAAICFwGAAAICF0GAAAICF4GAAAICF8GAAAICGAGAAAICGEGAAAICGIGAAAICGMGAAAICGQGAAAICGUGAAAICGYGAAAICGcGAAAICGgGAAAICGkGAAAICGoGAAAICGsGAAAICGwGAAAICG0GAAAICG4GAAAICG8GAAAICHAGAAAICHEGAAAICHIGAAAICHMGAAAICHQGAAAICHUGAAAICHYGAAAICHcGAAAICHgGAAAICHkGAAAICHoGAAAICHsGAAAICHwGAAAICH0GAAAICH4GAAAICH8GAAAICIAGAAAICIEGAAAICIIGAAAICIMGAAAICIQGAAAICIUGAAAICIYGAAAICIcGAAAICIgGAAAICIkGAAAICIoGAAAICIsGAAAICIwGAAAICI0GAAAICI4GAAAICI8GAAAICJAGAAAICJEGAAAICJIGAAAICJMGAAAICJQGAAAICJUGAAAICJYGAAAICJcGAAAICJgGAAAICJkGAAAICJoGAAAICJsGAAAICJwGAAAICJ0GAAAICJ4GAAAICJ8GAAAICKAGAAAICKEGAAAICKIGAAAICKMGAAAICKQGAAAICKUGAAAICKYGAAAICKcGAAAICKgGAAAICKkGAAAICKoGAAAICKsGAAAICKwGAAAICK0GAAAICK4GAAAICK8GAAAICLAGAAAICLEGAAAICLIGAAAICLMGAAAICLQGAAAICLUGAAAICLYGAAAICLcGAAAICLgGAAAICLkGAAAICLoGAAAICLsGAAAICLwGAAAICL0GAAAICL4GAAAICL8GAAAICMAGAAAICMEGAAAICMIGAAAICMMGAAAICMQGAAAICMUGAAAICMYGAAAICMcGAAAICMgGAAAICMkGAAAICMoGAAAICMsGAAAICMwGAAAICM0GAAAICM4GAAAICM8GAAAICNAGAAAICNEGAAAICNIGAAAICNMGAAAICNQGAAAICNUGAAAICNYGAAAICNcGAAAICNgGAAAICNkGAAAICNoGAAAICNsGAAAICNwGAAAICN0GAAAICN4GAAAICN8GAAAICOAGAAAICOEGAAAICOIGAAAICOMGAAAICOQGAAAICOUGAAAICOYGAAAICOcGAAAICOgGAAAICOkGAAAICOoGAAAICOsGAAAICOwGAAAICO0GAAAICO4GAAAICO8GAAAICPAGAAAICPEGAAAICPIGAAAICPMGAAAICPQGAAAICPUGAAAICPYGAAAICPcGAAAICPgGAAAICPkGAAAICPoGAAAICPsGAAAICPwGAAAICP0GAAAICP4GAAAICP8GAAAICAAHAAAICAEHAAAICAIHAAAICAMHAAAICAQHAAAICAUHAAAICAYHAAAICAcHAAAICAgHAAAICAkHAAAICAoHAAAICAsHAAAICAwHAAAICA0HAAAICA4HAAAICA8HAAAICBAHAAAICBEHAAAICBIHAAAICBMHAAAICBQHAAAICBUHAAAICBYHAAAICBcHAAAICBgHAAAICBkHAAAICBoHAAAICBsHAAAICBwHAAAICB0HAAAICB4HAAAICB8HAAAICCAHAAAICCEHAAAICCIHAAAICCMHAAAICCQHAAAICCUHAAAICCYHAAAICCcHAAAICCgHAAAICCkHAAAICCoHAAAICCsHAAAICCwHAAAICC0HAAAICC4HAAAICC8HAAAICDAHAAAICDEHAAAICDIHAAAICDMHAAAICDQHAAAICDUHAAAICDYHAAAICDcHAAAICDgHAAAICDkHAAAICDoHAAAICDsHAAAICDwHAAAICD0HAAAICD4HAAAICD8HAAAICEAHAAAICEEHAAAICEIHAAAICEMHAAAICEQHAAAICEUHAAAICEYHAAAICEcHAAAICEgHAAAICEkHAAAICEoHAAAICEsHAAAICEwHAAAICE0HAAAICE4HAAAICE8HAAAICFAHAAAICFEHAAAICFIHAAAICFMHAAAICFQHAAAICFUHAAAICFYHAAAICFcHAAAICFgHAAAICFkHAAAICFoHAAAICFsHAAAICFwHAAAICF0HAAAICF4HAAAICF8HAAAICGAHAAAICGEHAAAICGIHAAAICGMHAAAICGQHAAAICGUHAAAICGYHAAAICGcHAAAICGgHAAAICGkHAAAICGoHAAAICGsHAAAICGwHAAAICG0HAAAICG4HAAAICG8HAAAICHAHAAAICHEHAAAICHIHAAAICHMHAAAICHQHAAAICHUHAAAICHYHAAAICHcHAAAICHgHAAAICHkHAAAICHoHAAAICHsHAAAICHwHAAAICH0HAAAICH4HAAAICH8HAAAICIAHAAAICIEHAAAICIIHAAAICIMHAAAICIQHAAAICIUHAAAICIYHAAAICIcHAAAICIgHAAAICIkHAAAICIoHAAAICIsHAAAICIwHAAAICI0HAAAICI4HAAAICI8HAAAICJAHAAAICJEHAAAICJIHAAAICJMHAAAICJQHAAAICJUHAAAICJYHAAAICJcHAAAICJgHAAAICJkHAAAICJoHAAAICJsHAAAICJwHAAAICJ0HAAAICJ4HAAAICJ8HAAAICKAHAAAICKEHAAAICKIHAAAICKMHAAAICKQHAAAICKUHAAAICKYHAAAICKcHAAAICKgHAAAICKkHAAAICKoHAAAICKsHAAAICKwHAAAICK0HAAAICK4HAAAICK8HAAAICLAHAAAICLEHAAAICLIHAAAICLMHAAAICLQHAAAICLUHAAAICLYHAAAICLcHAAAICLgHAAAICLkHAAAICLoHAAAICLsHAAAICLwHAAAICL0HAAAICL4HAAAICL8HAAAICMAHAAAICMEHAAAICMIHAAAICMMHAAAICMQHAAAICMUHAAAICMYHAAAICMcHAAAICMgHAAAICMkHAAAICMoHAAAICMsHAAAICMwHAAAICM0HAAAICM4HAAAICM8HAAAICNAHAAAICNEHAAAICNIHAAAICNMHAAAICNQHAAAICNUHAAAICNYHAAAICNcHAAAICNgHAAAICNkHAAAICNoHAAAICNsHAAAICNwHAAAICN0HAAAICN4HAAAICN8HAAAICOAHAAAICOEHAAAICOIHAAAICOMHAAAICOQHAAAICOUHAAAICOYHAAAICOcHAAAICOgHAAAICOkHAAAICOoHAAAICOsHAAAICOwHAAAICO0HAAAICO4HAAAICO8HAAAICPAHAAAICPEHAAAICPIHAAAICPMHAAAICPQHAAAICPUHAAAICPYHAAAICPcHAAAICPgHAAAICPkHAAAICPoHAAAICPsHAAAICPwHAAAICP0HAAAICP4HAAAICP8HAAAICAAIAAAICAEIAAAICAIIAAAICAMIAAAICAQIAAAICAUIAAAICAYIAAAICAcIAAAICAgIAAAICAkIAAAICAoIAAAICAsIAAAICAwIAAAICA0IAAAICA4IAAAICA8IAAAICBAIAAAICBEIAAAICBIIAAAICBMIAAAICBQIAAAICBUIAAAICBYIAAAICBcIAAAICBgIAAAICBkIAAAICBoIAAAICBsIAAAICBwIAAAICB0IAAAICB4IAAAICB8IAAAICCAIAAAICCEIAAAICCIIAAAICCMIAAAICCQIAAAICCUIAAAICCYIAAAICCcIAAAICCgIAAAICCkIAAAICCoIAAAICCsIAAAICCwIAAAICC0IAAAICC4IAAAICC8IAAAICDAIAAAICDEIAAAICDIIAAAICDMIAAAICDQIAAAICDUIAAAICDYIAAAICDcIAAAICDgIAAAICDkIAAAICDoIAAAICDsIAAAICDwIAAAICD0IAAAICD4IAAAICD8IAAAICEAIAAAICEEIAAAICEIIAAAICEMIAAAICEQIAAAICEUIAAAICEYIAAAICEcIAAAICEgIAAAICEkIAAAICEoIAAAICEsIAAAICEwIAAAICE0IAAAICE4IAAAICE8IAAAICFAIAAAICFEIAAAICFIIAAAICFMIAAAICFQIAAAICFUIAAAICFYIAAAICFcIAAAICFgIAAAICFkIAAAICFoIAAAICFsIAAAICFwIAAAICF0IAAAICF4IAAAICF8IAAAICGAIAAAICGEIAAAICGIIAAAICGMIAAAICGQIAAAICGUIAAAICGYIAAAICGcIAAAICGgIAAAICGkIAAAICGoIAAAICGsIAAAICGwIAAAICG0IAAAICG4IAAAICG8IAAAICHAIAAAICHEIAAAICHIIAAAICHMIAAAICHQIAAAICHUIAAAICHYIAAAICHcIAAAICHgIAAAICHkIAAAICHoIAAAICHsIAAAICHwIAAAICH0IAAAICH4IAAAICH8IAAAICIAIAAAICIEIAAAICIIIAAAICIMIAAAICIQIAAAICIUIAAAICIYIAAAICIcIAAAICIgIAAAICIkIAAAICIoIAAAICIsIAAAICIwIAAAICI0IAAAICI4IAAAICI8IAAAICJAIAAAICJEIAAAICJIIAAAICJMIAAAICJQIAAAICJUIAAAICJYIAAAICJcIAAAICJgIAAAICJkIAAAICJoIAAAICJsIAAAICJwIAAAICJ0IAAAICJ4IAAAICJ8IAAAICKAIAAAICKEIAAAICKIIAAAICKMIAAAICKQIAAAICKUIAAAICKYIAAAICKcIAAAICKgIAAAICKkIAAAICKoIAAAICKsIAAAICKwIAAAICK0IAAAICK4IAAAICK8IAAAICLAIAAAICLEIAAAICLIIAAAICLMIAAAICLQIAAAICLUIAAAICLYIAAAICLcIAAAICLgIAAAICLkIAAAICLoIAAAICLsIAAAICLwIAAAICL0IAAAICL4IAAAICL8IAAAICMAIAAAICMEIAAAICMIIAAAICMMIAAAICMQIAAAICMUIAAAICMYIAAAICMcIAAAICMgIAAAICMkIAAAICMoIAAAICMsIAAAICMwIAAAICM0IAAAICM4IAAAICM8IAAAICNAIAAAICNEIAAAICNIIAAAICNMIAAAICNQIAAAICNUIAAAICNYIAAAICNcIAAAICNgIAAAICNkIAAAICNoIAAAICNsIAAAICNwIAAAICN0IAAAICN4IAAAICN8IAAAICOAIAAAICOEIAAAICOIIAAAICOMIAAAICOQIAAAICOUIAAAICOYIAAAICOcIAAAICOgIAAAICOkIAAAICOoIAAAICOsIAAAICOwIAAAICO0IAAAICO4IAAAICO8IAAAICPAIAAAICPEIAAAICPIIAAAICPMIAAAICPQIAAAICPUIAAAICPYIAAAICPcIAAAICPgIAAAICPkIAAAICPoIAAAICPsIAAAICPwIAAAICP0IAAAICP4IAAAICP8IAAAICAAJAAAICAEJAAAICAIJAAAICAMJAAAICAQJAAAICAUJAAAICAYJAAAICAcJAAAICAgJAAAICAkJAAAICAoJAAAICAsJAAAICAwJAAAICA0JAAAICA4JAAAICA8JAAAICBAJAAAICBEJAAAICBIJAAAICBMJAAAICBQJAAAICBUJAAAICBYJAAAICBcJAAAICBgJAAAICBkJAAAICBoJAAAICBsJAAAICBwJAAAICB0JAAAICB4JAAAICB8JAAAICCAJAAAICCEJAAAICCIJAAAICCMJAAAICCQJAAAICCUJAAAICCYJAAAICCcJAAAICCgJAAAICCkJAAAICCoJAAAICCsJAAAICCwJAAAICC0JAAAICC4JAAAICC8JAAAICDAJAAAICDEJAAAICDIJAAAICDMJAAAICDQJAAAICDUJAAAICDYJAAAICDcJAAAICDgJAAAICDkJAAAICDoJAAAICDsJAAAICDwJAAAICD0JAAAICD4JAAAICD8JAAAICEAJAAAICEEJAAAICEIJAAAICEMJAAAICEQJAAAICEUJAAAICEYJAAAICEcJAAAICEgJAAAICEkJAAAICEoJAAAICEsJAAAICEwJAAAICE0JAAAICE4JAAAICE8JAAAICFAJAAAICFEJAAAICFIJAAAICFMJAAAICFQJAAAICFUJAAAICFYJAAAICFcJAAAICFgJAAAICFkJAAAICFoJAAAICFsJAAAICFwJAAAICF0JAAAICF4JAAAICF8JAAAICGAJAAAICGEJAAAICGIJAAAICGMJAAAICGQJAAAICGUJAAAICGYJAAAICGcJAAAICGgJAAAICGkJAAAICGoJAAAICGsJAAAICGwJAAAICG0JAAAICG4JAAAICG8JAAAICHAJAAAICHEJAAAICHIJAAAICHMJAAAICHQJAAAICHUJAAAICHYJAAAICHcJAAAICHgJAAAICHkJAAAICHoJAAAICHsJAAAICHwJAAAICH0JAAAICH4JAAAICH8JAAAICIAJAAAICIEJAAAICIIJAAAICIMJAAAICIQJAAAICIUJAAAICIYJAAAICIcJAAAICIgJAAAICIkJAAAICIoJAAAICIsJAAAICIwJAAAICI0JAAAICI4JAAAICI8JAAAICJAJAAAICJEJAAAICJIJAAAICJMJAAAICJQJAAAICJUJAAAICJYJAAAICJcJAAAICJgJAAAICJkJAAAICJoJAAAICJsJAAAICJwJAAAICJ0JAAAICJ4JAAAICJ8JAAAICKAJAAAICKEJAAAICKIJAAAICKMJAAAICKQJAAAICKUJAAAICKYJAAAICKcJAAAICKgJAAAICKkJAAAICKoJAAAICKsJAAAICKwJAAAICK0JAAAICK4JAAAICK8JAAAICLAJAAAICLEJAAAICLIJAAAICLMJAAAICLQJAAAICLUJAAAICLYJAAAICLcJAAAICLgJAAAICLkJAAAICLoJAAAICLsJAAAICLwJAAAICL0JAAAICL4JAAAICL8JAAAICMAJAAAICMEJAAAICMIJAAAICMMJAAAICMQJAAAICMUJAAAICMYJAAAICMcJAAAICMgJAAAICMkJAAAICMoJAAAICMsJAAAICMwJAAAICM0JAAAICM4JAAAICM8JAAAICNAJAAAICNEJAAAICNIJAAAICNMJAAAICNQJAAAICNUJAAAICNYJAAAICNcJAAAICNgJAAAICNkJAAAICNoJAAAICNsJAAAICNwJAAAICN0JAAAICN4JAAAICN8JAAAICOAJAAAICOEJAAAICOIJAAAICOMJAAAICOQJAAAICOUJAAAICOYJAAAICOcJAAAICOgJAAAICOkJAAAICOoJAAAICOsJAAAICOwJAAAICO0JAAAICO4JAAAICO8JAAAICPAJAAAICPEJAAAICPIJAAAICPMJAAAICPQJAAAICPUJAAAICPYJAAAICPcJAAAICPgJAAAICPkJAAAICPoJAAAICPsJAAAICPwJAAAICP0JAAAICP4JAAAICP8JAAAICAAKAAAICAEKAAAICAIKAAAICAMKAAAICAQKAAAICAUKAAAICAYKAAAICAcKAAAICAgKAAAICAkKAAAICAoKAAAICAsKAAAICAwKAAAICA0KAAAICA4KAAAICA8KAAAICBAKAAAICBEKAAAICBIKAAAICBMKAAAICBQKAAAICBUKAAAICBYKAAAICBcKAAAICBgKAAAICBkKAAAICBoKAAAICBsKAAAICBwKAAAICB0KAAAICB4KAAAICB8KAAAICCAKAAAICCEKAAAICCIKAAAICCMKAAAICCQKAAAICCUKAAAICCYKAAAICCcKAAAICCgKAAAICCkKAAAICCoKAAAICCsKAAAICCwKAAAICC0KAAAICC4KAAAICC8KAAAICDAKAAAICDEKAAAICDIKAAAICDMKAAAICDQKAAAICDUKAAAICDYKAAAICDcKAAAICDgKAAAICDkKAAAICDoKAAAICDsKAAAICDwKAAAICD0KAAAICD4KAAAICD8KAAAICEAKAAAICEEKAAAICEIKAAAICEMKAAAICEQKAAAICEUKAAAICEYKAAAICEcKAAAICEgKAAAICEkKAAAICEoKAAAICEsKAAAICEwKAAAICE0KAAAICE4KAAAICE8KAAAICFAKAAAICFEKAAAICFIKAAAICFMKAAAICFQKAAAICFUKAAAICFYKAAAICFcKAAAICFgKAAAICFkKAAAICFoKAAAICFsKAAAICFwKAAAICF0KAAAICF4KAAAICF8KAAAICGAKAAAICGEKAAAICGIKAAAICGMKAAAICGQKAAAICGUKAAAICGYKAAAICGcKAAAICGgKAAAICGkKAAAICGoKAAAICGsKAAAICGwKAAAICG0KAAAICG4KAAAICG8KAAAICHAKAAAICHEKAAAICHIKAAAICHMKAAAICHQKAAAICHUKAAAICHYKAAAICHcKAAAICHgKAAAICHkKAAAICHoKAAAICHsKAAAICHwKAAAICH0KAAAICH4KAAAICH8KAAAICIAKAAAICIEKAAAICIIKAAAICIMKAAAICIQKAAAICIUKAAAICIYKAAAICIcKAAAICIgKAAAICIkKAAAICIoKAAAICIsKAAAICIwKAAAICI0KAAAICI4KAAAICI8KAAAICJAKAAAICJEKAAAICJIKAAAICJMKAAAICJQKAAAICJUKAAAICJYKAAAICJcKAAAICJgKAAAICJkKAAAICJoKAAAICJsKAAAICJwKAAAICJ0KAAAICJ4KAAAICJ8KAAAICKAKAAAICKEKAAAICKIKAAAICKMKAAAICKQKAAAICKUKAAAICKYKAAAICKcKAAAICKgKAAAICKkKAAAICKoKAAAICKsKAAAICKwKAAAICK0KAAAICK4KAAAICK8KAAAICLAKAAAICLEKAAAICLIKAAAICLMKAAAICLQKAAAICLUKAAAICLYKAAAICLcKAAAICLgKAAAICLkKAAAICLoKAAAICLsKAAAICLwKAAAICL0KAAAICL4KAAAICL8KAAAICMAKAAAICMEKAAAICMIKAAAICMMKAAAICMQKAAAICMUKAAAICMYKAAAICMcKAAAICMgKAAAICMkKAAAICMoKAAAICMsKAAAICMwKAAAICM0KAAAICM4KAAAICM8KAAAICNAKAAAICNEKAAAICNIKAAAICNMKAAAICNQKAAAICNUKAAAICNYKAAAICNcKAAAICNgKAAAICNkKAAAICNoKAAAICNsKAAAICNwKAAAICN0KAAAICN4KAAAICN8KAAAICOAKAAAICOEKAAAICOIKAAAICOMKAAAICOQKAAAICOUKAAAICOYKAAAICOcKAAAICOgKAAAICOkKAAAICOoKAAAICOsKAAAICOwKAAAICO0KAAAICO4KAAAICO8KAAAICPAKAAAICPEKAAAICPIKAAAICPMKAAAICPQKAAAICPUKAAAICPYKAAAICPcKAAAICPgKAAAICPkKAAAICPoKAAAICPsKAAAICPwKAAAICP0KAAAICP4KAAAICP8KAAAICAALAAAICAELAAAICAILAAAICAMLAAAICAQLAAAICAULAAAICAYLAAAICAcLAAAICAgLAAAICAkLAAAICAoLAAAICAsLAAAICAwLAAAICA0LAAAICA4LAAAICA8LAAAICBALAAAICBELAAAICBILAAAICBMLAAAICBQLAAAICBULAAAICBYLAAAICBcLAAAICBgLAAAICBkLAAAICBoLAAAICBsLAAAICBwLAAAICB0LAAAICB4LAAAICB8LAAAICCALAAAICCELAAAICCILAAAICCMLAAAICCQLAAAICCULAAAICCYLAAAICCcLAAAICCgLAAAICCkLAAAICCoLAAAICCsLAAAICCwLAAAICC0LAAAICC4LAAAICC8LAAAICDALAAAICDELAAAICDILAAAICDMLAAAICDQLAAAICDULAAAICDYLAAAICDcLAAAICDgLAAAICDkLAAAICDoLAAAICDsLAAAICDwLAAAICD0LAAAICD4LAAAICD8LAAAICEALAAAICEELAAAICEILAAAICEMLAAAICEQLAAAICEULAAAICEYLAAAICEcLAAAICEgLAAAICEkLAAAICEoLAAAICEsLAAAICEwLAAAICE0LAAAICE4LAAAICE8LAAAICFALAAAICFELAAAICFILAAAICFMLAAAICFQLAAAICFULAAAICFYLAAAICFcLAAAICFgLAAAICFkLAAAICFoLAAAICFsLAAAICFwLAAAICF0LAAAICF4LAAAICF8LAAAICGALAAAICGELAAAICGILAAAICGMLAAAICGQLAAAICGULAAAICGYLAAAICGcLAAAICGgLAAAICGkLAAAICGoLAAAICGsLAAAICGwLAAAICG0LAAAICG4LAAAICG8LAAAICHALAAAICHELAAAICHILAAAICHMLAAAICHQLAAAICHULAAAICHYLAAAICHcLAAAICHgLAAAICHkLAAAICHoLAAAICHsLAAAICHwLAAAICH0LAAAICH4LAAAICH8LAAAICIALAAAICIELAAAICIILAAAICIMLAAAICIQLAAAICIULAAAICIYLAAAICIcLAAAICIgLAAAICIkLAAAICIoLAAAICIsLAAAICIwLAAAICI0LAAAICI4LAAAICI8LAAAICJALAAAICJELAAAICJILAAAICJMLAAAICJQLAAAICJULAAAICJYLAAAICJcLAAAICJgLAAAICJkLAAAICJoLAAAICJsLAAAICJwLAAAICJ0LAAAICJ4LAAAICJ8LAAAICKALAAAICKELAAAICKILAAAICKMLAAAICKQLAAAICKULAAAICKYLAAAICKcLAAAICKgLAAAICKkLAAAICKoLAAAICKsLAAAICKwLAAAICK0LAAAICK4LAAAICK8LAAAICLALAAAICLELAAAICLILAAAICLMLAAAICLQLAAAICLULAAAICLYLAAAICLcLAAAICLgLAAAICLkLAAAICLoLAAAICLsLAAAICLwLAAAICL0LAAAICL4LAAAICL8LAAAICMALAAAICMELAAAICMILAAAICMMLAAAICMQLAAAICMULAAAICMYLAAAICMcLAAAICMgLAAAICMkLAAAICMoLAAAICMsLAAAICMwLAAAICM0LAAAICM4LAAAICM8LAAAICNALAAAICNELAAAICNILAAAICNMLAAAICNQLAAAICNULAAAICNYLAAAICNcLAAAICNgLAAAICNkLAAAICNoLAAAICNsLAAAICNwLAAAICN0LAAAICN4LAAAICN8LAAAICOALAAAICOELAAAICOILAAAICOMLAAAICOQLAAAICOULAAAICOYLAAAICOcLAAAICOgLAAAICOkLAAAICOoLAAAICOsLAAAICOwLAAAICO0LAAAICO4LAAAICO8LAAAICPALAAAICPELAAAICPILAAAICPMLAAAICPQLAAAICPULAAAICPYLAAAICPcLAAAICPgLAAAICPkLAAAICPoLAAAICPsLAAAICPwLAAAICP0LAAAICP4LAAAICP8LAAAICAAMAAAICAEMAAAICAIMAAAICAMMAAAICAQMAAAICAUMAAAICAYMAAAICAcMAAAICAgMAAAICAkMAAAICAoMAAAICAsMAAAICAwMAAAICA0MAAAICA4MAAAICA8MAAAICBAMAAAICBEMAAAICBIMAAAICBMMAAAICBQMAAAICBUMAAAICBYMAAAICBcMAAAICBgMAAAICBkMAAAICBoMAAAICBsMAAAICBwMAAAICB0MAAAICB4MAAAICB8MAAAICCAMAAAICCEMAAAICCIMAAAICCMMAAAICCQMAAAICCUMAAAICCYMAAAICCcMAAAICCgMAAAICCkMAAAICCoMAAAICCsMAAAICCwMAAAICC0MAAAICC4MAAAICC8MAAAICDAMAAAICDEMAAAICDIMAAAICDMMAAAICDQMAAAICDUMAAAICDYMAAAICDcMAAAICDgMAAAICDkMAAAICDoMAAAICDsMAAAICDwMAAAICD0MAAAICD4MAAAICD8MAAAICEAMAAAICEEMAAAICEIMAAAICEMMAAAICEQMAAAICEUMAAAICEYMAAAICEcMAAAICEgMAAAICEkMAAAICEoMAAAICEsMAAAICEwMAAAICE0MAAAICE4MAAAICE8MAAAICFAMAAAICFEMAAAICFIMAAAICFMMAAAICFQMAAAICFUMAAAICFYMAAAICFcMAAAICFgMAAAICFkMAAAICFoMAAAICFsMAAAICFwMAAAICF0MAAAICF4MAAAICF8MAAAICGAMAAAICGEMAAAICGIMAAAICGMMAAAICGQMAAAICGUMAAAICGYMAAAICGcMAAAICGgMAAAICGkMAAAICGoMAAAICGsMAAAICGwMAAAICG0MAAAICG4MAAAICG8MAAAICHAMAAAICHEMAAAICHIMAAAICHMMAAAICHQMAAAICHUMAAAICHYMAAAICHcMAAAICHgMAAAICHkMAAAICHoMAAAICHsMAAAICHwMAAAICH0MAAAICH4MAAAICH8MAAAICIAMAAAICIEMAAAICIIMAAAICIMMAAAICIQMAAAICIUMAAAICIYMAAAICIcMAAAICIgMAAAICIkMAAAICIoMAAAICIsMAAAICIwMAAAICI0MAAAICI4MAAAICI8MAAAICJAMAAAICJEMAAAICJIMAAAICJMMAAAICJQMAAAICJUMAAAICJYMAAAICJcMAAAICJgMAAAICJkMAAAICJoMAAAICJsMAAAICJwMAAAICJ0MAAAICJ4MAAAICJ8MAAAICKAMAAAICKEMAAAICKIMAAAICKMMAAAICKQMAAAICKUMAAAICKYMAAAICKcMAAAICKgMAAAICKkMAAAICKoMAAAICKsMAAAICKwMAAAICK0MAAAICK4MAAAICK8MAAAICLAMAAAICLEMAAAICLIMAAAICLMMAAAICLQMAAAICLUMAAAICLYMAAAICLcMAAAICLgMAAAICLkMAAAICLoMAAAICLsMAAAICLwMAAAICL0MAAAICL4MAAAICL8MAAAICMAMAAAICMEMAAAICMIMAAAICMMMAAAICMQMAAAICMUMAAAICMYMAAAICMcMAAAICMgMAAAICMkMAAAICMoMAAAICMsMAAAICMwMAAAICM0MAAAICM4MAAAICM8MAAAICNAMAAAICNEMAAAICNIMAAAICNMMAAAICNQMAAAICNUMAAAICNYMAAAICNcMAAAICNgMAAAICNkMAAAICNoMAAAICNsMAAAICNwMAAAICN0MAAAICN4MAAAICN8MAAAICOAMAAAICOEMAAAICOIMAAAICOMMAAAICOQMAAAICOUMAAAICOYMAAAICOcMAAAICOgMAAAICOkMAAAICOoMAAAICOsMAAAICOwMAAAICO0MAAAICO4MAAAICO8MAAAICPAMAAAICPEMAAAICPIMAAAICPMMAAAICPQMAAAICPUMAAAICPYMAAAICPcMAAAICPgMAAAICPkMAAAICPoMAAAICPsMAAAICPwMAAAICP0MAAAICP4MAAAICP8MAAAICAANAAAICAENAAAICAINAAAICAMNAAAICAQNAAAICAUNAAAICAYNAAAICAcNAAAICAgNAAAICAkNAAAICAoNAAAICAsNAAAICAwNAAAICA0NAAAICA4NAAAICA8NAAAICBANAAAICBENAAAICBINAAAICBMNAAAICBQNAAAICBUNAAAICBYNAAAICBcNAAAICBgNAAAICBkNAAAICBoNAAAICBsNAAAICBwNAAAICB0NAAAICB4NAAAICB8NAAAICCANAAAICCENAAAICCINAAAICCMNAAAICCQNAAAICCUNAAAICCYNAAAICCcNAAAICCgNAAAICCkNAAAICCoNAAAICCsNAAAICCwNAAAICC0NAAAICC4NAAAICC8NAAAICDANAAAICDENAAAICDINAAAICDMNAAAICDQNAAAICDUNAAAICDYNAAAICDcNAAAICDgNAAAICDkNAAAICDoNAAAICDsNAAAICDwNAAAICD0NAAAICD4NAAAICD8NAAAICEANAAAICEENAAAICEINAAAICEMNAAAICEQNAAAICEUNAAAICEYNAAAICEcNAAAICEgNAAAICEkNAAAICEoNAAAICEsNAAAICEwNAAAICE0NAAAICE4NAAAICE8NAAAICFANAAAICFENAAAICFINAAAICFMNAAAICFQNAAAICFUNAAAICFYNAAAICFcNAAAICFgNAAAICFkNAAAICFoNAAAICFsNAAAICFwNAAAICF0NAAAICF4NAAAICF8NAAAICGANAAAICGENAAAICGINAAAICGMNAAAICGQNAAAICGUNAAAICGYNAAAICGcNAAAICGgNAAAICGkNAAAICGoNAAAICGsNAAAICGwNAAAICG0NAAAICG4NAAAICG8NAAAICHANAAAICHENAAAICHINAAAICHMNAAAICHQNAAAICHUNAAAICHYNAAAICHcNAAAICHgNAAAICHkNAAAICHoNAAAICHsNAAAICHwNAAAICH0NAAAICH4NAAAICH8NAAAICIANAAAICIENAAAICIINAAAICIMNAAAICIQNAAAICIUNAAAICIYNAAAICIcNAAAICIgNAAAICIkNAAAICIoNAAAICIsNAAAICIwNAAAICI0NAAAICI4NAAAICI8NAAAICJANAAAICJENAAAICJINAAAICJMNAAAICJQNAAAICJUNAAAICJYNAAAICJcNAAAICJgNAAAICJkNAAAICJoNAAAICJsNAAAICJwNAAAICJ0NAAAICJ4NAAAICJ8NAAAICKANAAAICKENAAAICKINAAAICKMNAAAICKQNAAAICKUNAAAICKYNAAAICKcNAAAICKgNAAAICKkNAAAICKoNAAAICKsNAAAICKwNAAAICK0NAAAICK4NAAAICK8NAAAICLANAAAICLENAAAICLINAAAICLMNAAAICLQNAAAICLUNAAAICLYNAAAICLcNAAAICLgNAAAICLkNAAAICLoNAAAICLsNAAAICLwNAAAICL0NAAAICL4NAAAICL8NAAAICMANAAAICMENAAAICMINAAAICMMNAAAICMQNAAAICMUNAAAICMYNAAAICMcNAAAICMgNAAAICMkNAAAICMoNAAAICMsNAAAICMwNAAAICM0NAAAICM4NAAAICM8NAAAICNANAAAICNENAAAICNINAAAICNMNAAAICNQNAAAICNUNAAAICNYNAAAICNcNAAAICNgNAAAICNkNAAAICNoNAAAICNsNAAAICNwNAAAICN0NAAAICN4NAAAICN8NAAAICOANAAAICOENAAAICOINAAAICOMNAAAICOQNAAAICOUNAAAICOYNAAAICOcNAAAICOgNAAAICOkNAAAICOoNAAAICOsNAAAICOwNAAAICO0NAAAICO4NAAAICO8NAAAICPANAAAICPENAAAICPINAAAICPMNAAAICPQNAAAICPUNAAAICPYNAAAICPcNAAAICPgNAAAICPkNAAAICPoNAAAICPsNAAAICPwNAAAICP0NAAAICP4NAAAICP8NAAAICAAOAAAICAEOAAAICAIOAAAICAMOAAAICAQOAAAICAUOAAAICAYOAAAICAcOAAAICAgOAAAICAkOAAAICAoOAAAICAsOAAAICAwOAAAICA0OAAAICA4OAAAICA8OAAAICBAOAAAICBEOAAAICBIOAAAICBMOAAAICBQOAAAICBUOAAAICBYOAAAICBcOAAAICBgOAAAICBkOAAAICBoOAAAICBsOAAAICBwOAAAICB0OAAAICB4OAAAICB8OAAAICCAOAAAICCEOAAAICCIOAAAICCMOAAAICCQOAAAICCUOAAAICCYOAAAICCcOAAAICCgOAAAICCkOAAAICCoOAAAICCsOAAAICCwOAAAICC0OAAAICC4OAAAICC8OAAAICDAOAAAICDEOAAAICDIOAAAICDMOAAAICDQOAAAICDUOAAAICDYOAAAICDcOAAAICDgOAAAICDkOAAAICDoOAAAICDsOAAAICDwOAAAICD0OAAAICD4OAAAICD8OAAAICEAOAAAICEEOAAAICEIOAAAICEMOAAAICEQOAAAICEUOAAAICEYOAAAICEcOAAAICEgOAAAICEkOAAAICEoOAAAICEsOAAAICEwOAAAICE0OAAAICE4OAAAICE8OAAAICFAOAAAICFEOAAAICFIOAAAICFMOAAAICFQOAAAICFUOAAAICFYOAAAICFcOAAAICFgOAAAICFkOAAAICFoOAAAICFsOAAAICFwOAAAICF0OAAAICF4OAAAICF8OAAAICGAOAAAICGEOAAAICGIOAAAICGMOAAAICGQOAAAICGUOAAAICGYOAAAICGcOAAAICGgOAAAICGkOAAAICGoOAAAICGsOAAAICGwOAAAICG0OAAAICG4OAAAICG8OAAAICHAOAAAICHEOAAAICHIOAAAICHMOAAAICHQOAAAICHUOAAAICHYOAAAICHcOAAAICHgOAAAICHkOAAAICHoOAAAICHsOAAAICHwOAAAICH0OAAAICH4OAAAICH8OAAAICIAOAAAICIEOAAAICIIOAAAICIMOAAAICIQOAAAICIUOAAAICIYOAAAICIcOAAAICIgOAAAICIkOAAAICIoOAAAICIsOAAAICIwOAAAICI0OAAAICI4OAAAICI8OAAAICJAOAAAICJEOAAAICJIOAAAICJMOAAAICJQOAAAICJUOAAAICJYOAAAICJcOAAAICJgOAAAICJkOAAAICJoOAAAICJsOAAAICJwOAAAICJ0OAAAICJ4OAAAICJ8OAAAICKAOAAAICKEOAAAICKIOAAAICKMOAAAICKQOAAAICKUOAAAICKYOAAAICKcOAAAICKgOAAAICKkOAAAICKoOAAAICKsOAAAICKwOAAAICK0OAAAICK4OAAAICK8OAAAICLAOAAAICLEOAAAICLIOAAAICLMOAAAICLQOAAAICLUOAAAICLYOAAAICLcOAAAICLgOAAAICLkOAAAICLoOAAAICLsOAAAICLwOAAAICL0OAAAICL4OAAAICL8OAAAICMAOAAAICMEOAAAICMIOAAAICMMOAAAICMQOAAAICMUOAAAICMYOAAAICMcOAAAICMgOAAAICMkOAAAICMoOAAAICMsOAAAICMwOAAAICM0OAAAICM4OAAAICM8OAAAICNAOAAAICNEOAAAICNIOAAAICNMOAAAICNQOAAAICNUOAAAICNYOAAAICNcOAAAICNgOAAAICNkOAAAICNoOAAAICNsOAAAICNwOAAAICN0OAAAICN4OAAAICN8OAAAICOAOAAAICOEOAAAICOIOAAAICOMOAAAICOQOAAAICOUOAAAICOYOAAAICOcOAAAICOgOAAAICOkOAAAICOoOAAAICOsOAAAICOwOAAAICO0OAAAICO4OAAAICO8OAAAICPAOAAAICPEOAAAICPIOAAAICPMOAAAICPQOAAAICPUOAAAICPYOAAAICPcOAAAICPgOAAAICPkOAAAICPoOAAAICPsOAAAICPwOAAAICP0OAAAICP4OAAAICP8OAAAICAAPAAAICAEPAAAICAIPAAAICAMPAAAICAQPAAAICAUPAAAICAYPAAAICAcPAAAICAgPAAAICAkPAAAICAoPAAAICAsPAAAICAwPAAAICA0PAAAICA4PAAAICA8PAAAICBAPAAAICBEPAAAICBIPAAAICBMPAAAICBQPAAAICBUPAAAICBYPAAAICBcPAAAICBgPAAAICBkPAAAICBoPAAAICBsPAAAICBwPAAAICB0PAAAICB4PAAAICB8PAAAICCAPAAAICCEPAAAICCIPAAAICCMPAAAICCQPAAAICCUPAAAICCYPAAAICCcPAAAICCgPAAAICCkPAAAICCoPAAAICCsPAAAICCwPAAAICC0PAAAICC4PAAAICC8PAAAICDAPAAAICDEPAAAICDIPAAAICDMPAAAICDQPAAAICDUPAAAICDYPAAAICDcPAAAICDgPAAAICDkPAAAICDoPAAAICDsPAAAICDwPAAAICD0PAAAICD4PAAAICD8PAAAICEAPAAAICEEPAAAICEIPAAAICEMPAAAICEQPAAAICEUPAAAICEYPAAAICEcPAAAICEgPAAAICEkPAAAICEoPAAAICEsPAAAICEwPAAAICE0PAAAICE4PAAAICE8PAAAICFAPAAAICFEPAAAICFIPAAAICFMPAAAICFQPAAAICFUPAAAICFYPAAAICFcPAAAICFgPAAAICFkPAAAICFoPAAAICFsPAAAICFwPAAAICF0PAAAICF4PAAAICF8PAAAICGAPAAAICGEPAAAICGIPAAAICGMPAAAICGQPAAAICGUPAAAICGYPAAAICGcPAAAICGgPAAAICGkPAAAICGoPAAAICGsPAAAICGwPAAAICG0PAAAICG4PAAAICG8PAAAICHAPAAAICHEPAAAICHIPAAAICHMPAAAICHQPAAAICHUPAAAICHYPAAAICHcPAAAICHgPAAAICHkPAAAICHoPAAAICHsPAAAICHwPAAAICH0PAAAICH4PAAAICH8PAAAICIAPAAAICIEPAAAICIIPAAAICIMPAAAICIQPAAAICIUPAAAICIYPAAAICIcPAAAICIgPAAAICIkPAAAICIoPAAAICIsPAAAICIwPAAAICI0PAAAICI4PAAAICI8PAAAICJAPAAAICJEPAAAICJIPAAAICJMPAAAICJQPAAAICJUPAAAICJYPAAAICJcPAAAICJgPAAAICJkPAAAICJoPAAAICJsPAAAICJwPAAAICJ0PAAAICJ4PAAAICJ8PAAAICKAPAAAICKEPAAAICKIPAAAICKMPAAAICKQPAAAICKUPAAAICKYPAAAICKcPAAAICKgPAAAICKkPAAAICKoPAAAICKsPAAAICKwPAAAICK0PAAAICK4PAAAICK8PAAAICLAPAAAICLEPAAAICLIPAAAICLMPAAAICLQPAAAICLUPAAAICLYPAAAICLcPAAAICLgPAAAICLkPAAAICLoPAAAICLsPAAAICLwPAAAICL0PAAAICL4PAAAICL8PAAAICMAPAAAICMEPAAAICMIPAAAICMMPAAAICMQPAAAICMUPAAAICMYPAAAICMcPAAAICMgPAAAICMkPAAAICMoPAAAICMsPAAAICMwPAAAICM0PAAAICM4PAAAICM8PAAAICNAPAAAICNEPAAAICNIPAAAICNMPAAAICNQPAAAICNUPAAAICNYPAAAICNcPAAAICNgPAAAICNkPAAAICNoPAAAICNsPAAAICNwPAAAICN0PAAAICN4PAAAICN8PAAAICOAPAAAICOEPAAAICOIPAAAICOMPAAAICOQPAAAICOUPAAAICOYPAAAICOcPAAAICOgPAAAICOkPAAAICOoPAAAICOsPAAAICOwPAAAICO0PAAAICO4PAAAICO8PAAAICPAPAAAICPEPAAAICPIPAAAICPMPAAAICPQPAAAICPUPAAAICPYPAAAICPcPAAAICPgPAAAICPkPAAAICPoPAAAICPsPAAAICPwPAAAICP0PAAAICP4PAAAICP8PAAAICAAQAAAICAEQAAAICAIQAAAICAMQAAAICAQQAAAICAUQAAAICAYQAAAICAcQAAAICAgQAAAICAkQAAAICAoQAAAICAsQAAAICAwQAAAICA0QAAAICA4QAAAICA8QAAAICBAQAAAICBEQAAAICBIQAAAICBMQAAAICBQQAAAICBUQAAAICBYQAAAICBcQAAAICBgQAAAICBkQAAAICBoQAAAICBsQAAAICBwQAAAICB0QAAAICB4QAAAICB8QAAAICCAQAAAICCEQAAAICCIQAAAICCMQAAAICCQQAAAICCUQAAAICCYQAAAICCcQAAAICCgQAAAICCkQAAAICCoQAAAICCsQAAAICCwQAAAICC0QAAAICC4QAAAICC8QAAAICDAQAAAICDEQAAAICDIQAAAICDMQAAAICDQQAAAICDUQAAAICDYQAAAICDcQAAAICDgQAAAICDkQAAAICDoQAAAICDsQAAAICDwQAAAICD0QAAAICD4QAAAICD8QAAAICEAQAAAICEEQAAAICEIQAAAICEMQAAAICEQQAAAICEUQAAAICEYQAAAICEcQAAAICEgQAAAICEkQAAAICEoQAAAICEsQAAAICEwQAAAICE0QAAAICE4QAAAICE8QAAAICFAQAAAICFEQAAAICFIQAAAICFMQAAAICFQQAAAICFUQAAAICFYQAAAICFcQAAAICFgQAAAICFkQAAAICFoQAAAICFsQAAAICFwQAAAICF0QAAAICF4QAAAICF8QAAAICGAQAAAICGEQAAAICGIQAAAICGMQAAAICGQQAAAICGUQAAAICGYQAAAICGcQAAAICGgQAAAICGkQAAAICGoQAAAICGsQAAAICGwQAAAICG0QAAAICG4QAAAICG8QAAAICHAQAAAICHEQAAAICHIQAAAICHMQAAAICHQQAAAICHUQAAAICHYQAAAICHcQAAAICHgQAAAICHkQAAAICHoQAAAICHsQAAAICHwQAAAICH0QAAAICH4QAAAICH8QAAAICIAQAAAICIEQAAAICIIQAAAICIMQAAAICIQQAAAICIUQAAAICIYQAAAICIcQAAAICIgQAAAICIkQAAAICIoQAAAICIsQAAAICIwQAAAICI0QAAAICI4QAAAICI8QAAAICJAQAAAICJEQAAAICJIQAAAICJMQAAAICJQQAAAICJUQAAAICJYQAAAICJcQAAAICJgQAAAICJkQAAAICJoQAAAICJsQAAAICJwQAAAICJ0QAAAICJ4QAAAICJ8QAAAICKAQAAAICKEQAAAICKIQAAAICKMQAAAICKQQAAAICKUQAAAICKYQAAAICKcQAAAICKgQAAAICKkQAAAICKoQAAAICKsQAAAICKwQAAAICK0QAAAICK4QAAAICK8QAAAICLAQAAAICLEQAAAICLIQAAAICLMQAAAICLQQAAAICLUQAAAICLYQAAAICLcQAAAICLgQAAAICLkQAAAICLoQAAAICLsQAAAICLwQAAAICL0QAAAICL4QAAAICL8QAAAICMAQAAAICMEQAAAICMIQAAAICMMQAAAICMQQAAAICMUQAAAICMYQAAAICMcQAAAICMgQAAAICMkQAAAICMoQAAAICMsQAAAICMwQAAAICM0QAAAICM4QAAAICM8QAAAICNAQAAAICNEQAAAICNIQAAAICNMQAAAICNQQAAAICNUQAAAICNYQAAAICNcQAAAICNgQAAAICNkQAAAICNoQAAAICNsQAAAICNwQAAAICN0QAAAICN4QAAAICN8QAAAICOAQAAAICOEQAAAICOIQAAAICOMQAAAICOQQAAAICOUQAAAICOYQAAAICOcQAAAICOgQAAAICOkQAAAICOoQAAAICOsQAAAICOwQAAAICO0QAAAICO4QAAAICO8QAAAICPAQAAAICPEQAAAICPIQAAAICPMQAAAICPQQAAAICPUQAAAICPYQAAAICPcQAAAICPgQAAAICPkQAAAICPoQAAAICPsQAAAICPwQAAAICP0QAAAICP4QAAAICP8QAAAICAARAAAICAERAAAICAIRAAAICAMRAAAICAQRAAAICAURAAAICAYRAAAICAcRAAAICAgRAAAICAkRAAAICAoRAAAICAsRAAAICAwRAAAICA0RAAAICA4RAAAICA8RAAAICBARAAAICBERAAAICBIRAAAICBMRAAAICBQRAAAICBURAAAICBYRAAAICBcRAAAICBgRAAAICBkRAAAICBoRAAAICBsRAAAICBwRAAAICB0RAAAICB4RAAAICB8RAAAICCARAAAICCERAAAICCIRAAAICCMRAAAICCQRAAAICCURAAAICCYRAAAICCcRAAAICCgRAAAICCkRAAAICCoRAAAICCsRAAAICCwRAAAICC0RAAAICC4RAAAICC8RAAAICDARAAAICDERAAAICDIRAAAICDMRAAAICDQRAAAICDURAAAICDYRAAAICDcRAAAICDgRAAAICDkRAAAICDoRAAAICDsRAAAICDwRAAAICD0RAAAICD4RAAAICD8RAAAICEARAAAICEERAAAICEIRAAAICEMRAAAICEQRAAAICEURAAAICEYRAAAICEcRAAAICEgRAAAICEkRAAAICEoRAAAICEsRAAAICEwRAAAICE0RAAAICE4RAAAICE8RAAAICFARAAAICFERAAAICFIRAAAICFMRAAAICFQRAAAICFURAAAICFYRAAAICFcRAAAICFgRAAAICFkRAAAICFoRAAAICFsRAAAICFwRAAAICF0RAAAICF4RAAAICF8RAAAICGARAAAICGERAAAICGIRAAAICGMRAAAICGQRAAAICGURAAAICGYRAAAICGcRAAAICGgRAAAICGkRAAAICGoRAAAICGsRAAAICGwRAAAICG0RAAAICG4RAAAICG8RAAAICHARAAAICHERAAAICHIRAAAICHMRAAAICHQRAAAICHURAAAICHYRAAAICHcRAAAICHgRAAAICHkRAAAICHoRAAAICHsRAAAICHwRAAAICH0RAAAICH4RAAAICH8RAAAICIARAAAICIERAAAICIIRAAAICIMRAAAICIQRAAAICIURAAAICIYRAAAICIcRAAAICIgRAAAICIkRAAAICIoRAAAICIsRAAAICIwRAAAICI0RAAAICI4RAAAICI8RAAAICJARAAAICJERAAAICJIRAAAICJMRAAAICJQRAAAICJURAAAICJYRAAAICJcRAAAICJgRAAAICJkRAAAICJoRAAAICJsRAAAICJwRAAAICJ0RAAAICJ4RAAAICJ8RAAAICKARAAAICKERAAAICKIRAAAICKMRAAAICKQRAAAICKURAAAICKYRAAAICKcRAAAICKgRAAAICKkRAAAICKoRAAAICKsRAAAICKwRAAAICK0RAAAICK4RAAAICK8RAAAICLARAAAICLERAAAICLIRAAAICLMRAAAICLQRAAAICLURAAAICLYRAAAICLcRAAAICLgRAAAICLkRAAAICLoRAAAICLsRAAAICLwRAAAICL0RAAAICL4RAAAICL8RAAAICMARAAAICMERAAAICMIRAAAICMMRAAAICMQRAAAICMURAAAICMYRAAAICMcRAAAICMgRAAAICMkRAAAICMoRAAAICMsRAAAICMwRAAAICM0RAAAICM4RAAAICM8RAAAICNARAAAICNERAAAICNIRAAAICNMRAAAICNQRAAAICNURAAAICNYRAAAICNcRAAAICNgRAAAICNkRAAAICNoRAAAICNsRAAAICNwRAAAICN0RAAAICN4RAAAICN8RAAAICOARAAAICOERAAAICOIRAAAICOMRAAAICOQRAAAICOURAAAICOYRAAAICOcRAAAICOgRAAAICOkRAAAICOoRAAAICOsRAAAICOwRAAAICO0RAAAICO4RAAAICO8RAAAICPARAAAICPERAAAICPIRAAAICPMRAAAICPQRAAAICPURAAAICPYRAAAICPcRAAAICPgRAAAICPkRAAAICPoRAAAICPsRAAAICPwRAAAICP0RAAAICP4RAAAICP8RAAAICAASAAAICAESAAAICAISAAAICAMSAAAICAQSAAAICAUSAAAICAYSAAAICAcSAAAICAgSAAAICAkSAAAICAoSAAAICAsSAAAICAwSAAAICA0SAAAICA4SAAAICA8SAAAICBASAAAICBESAAAICBISAAAICBMSAAAICBQSAAAICBUSAAAICBYSAAAICBcSAAAICBgSAAAICBkSAAAICBoSAAAICBsSAAAICBwSAAAICB0SAAAICB4SAAAICB8SAAAICCASAAAICCESAAAICCISAAAICCMSAAAICCQSAAAICCUSAAAICCYSAAAICCcSAAAICCgSAAAICCkSAAAICCoSAAAICCsSAAAICCwSAAAICC0SAAAICC4SAAAICC8SAAAICDASAAAICDESAAAICDISAAAICDMSAAAICDQSAAAICDUSAAAICDYSAAAICDcSAAAICDgSAAAICDkSAAAICDoSAAAICDsSAAAICDwSAAAICD0SAAAICD4SAAAICD8SAAAICEASAAAICEESAAAICEISAAAICEMSAAAICEQSAAAICEUSAAAICEYSAAAICEcSAAAICEgSAAAICEkSAAAICEoSAAAICEsSAAAICEwSAAAICE0SAAAICE4SAAAICE8SAAAICFASAAAICFESAAAICFISAAAICFMSAAAICFQSAAAICFUSAAAICFYSAAAICFcSAAAICFgSAAAICFkSAAAICFoSAAAICFsSAAAICFwSAAAICF0SAAAICF4SAAAICF8SAAAICGASAAAICGESAAAICGISAAAICGMSAAAICGQSAAAICGUSAAAICGYSAAAICGcSAAAICGgSAAAICGkSAAAICGoSAAAICGsSAAAICGwSAAAICG0SAAAICG4SAAAICG8SAAAICHASAAAICHESAAAICHISAAAICHMSAAAICHQSAAAICHUSAAAICHYSAAAICHcSAAAICHgSAAAICHkSAAAICHoSAAAICHsSAAAICHwSAAAICH0SAAAICH4SAAAICH8SAAAICIASAAAICIESAAAICIISAAAICIMSAAAICIQSAAAICIUSAAAICIYSAAAICIcSAAAICIgSAAAICIkSAAAICIoSAAAICIsSAAAICIwSAAAICI0SAAAICI4SAAAICI8SAAAICJASAAAICJESAAAICJISAAAICJMSAAAICJQSAAAICJUSAAAICJYSAAAICJcSAAAICJgSAAAICJkSAAAICJoSAAAICJsSAAAICJwSAAAICJ0SAAAICJ4SAAAICJ8SAAAICKASAAAICKESAAAICKISAAAICKMSAAAICKQSAAAICKUSAAAICKYSAAAICKcSAAAICKgSAAAICKkSAAAICKoSAAAICKsSAAAICKwSAAAICK0SAAAICK4SAAAICK8SAAAICLASAAAICLESAAAICLISAAAICLMSAAAICLQSAAAICLUSAAAICLYSAAAICLcSAAAICLgSAAAICLkSAAAICLoSAAAICLsSAAAICLwSAAAICL0SAAAICL4SAAAICL8SAAAICMASAAAICMESAAAICMISAAAICMMSAAAICMQSAAAICMUSAAAICMYSAAAICMcSAAAICMgSAAAICMkSAAAICMoSAAAICMsSAAAICMwSAAAICM0SAAAICM4SAAAICM8SAAAICNASAAAICNESAAAICNISAAAICNMSAAAICNQSAAAICNUSAAAICNYSAAAICNcSAAAICNgSAAAICNkSAAAICNoSAAAICNsSAAAICNwSAAAICN0SAAAICN4SAAAICN8SAAAICOASAAAICOESAAAICOISAAAICOMSAAAICOQSAAAICOUSAAAICOYSAAAICOcSAAAICOgSAAAICOkSAAAICOoSAAAICOsSAAAICOwSAAAICO0SAAAICO4SAAAICO8SAAAICPASAAAICPESAAAICPISAAAICPMSAAAICPQSAAAICPUSAAAICPYSAAAICPcSAAAICPgSAAAICPkSAAAICPoSAAAICPsSAAAICPwSAAAICP0SAAAICP4SAAAICP8SAAAICAATAAAICAETAAAICAITAAAICAMTAAAICAQTAAAICAUTAAAICAYTAAAICAcTAAAICAgTAAAICAkTAAAICAoTAAAICAsTAAAICAwTAAAICA0TAAAICA4TAAAICA8TAAAICBATAAAICBETAAAICBITAAAICBMTAAAICBQTAAAICBUTAAAICBYTAAAICBcTAAAICBgTAAAICBkTAAAICBoTAAAICBsTAAAICBwTAAAICB0TAAAICB4TAAAICB8TAAAICCATAAAICCETAAAICCITAAAICCMTAAAICCQTAAAICCUTAAAICCYTAAAICCcTAAAICCgTAAAICCkTAAAICCoTAAAICCsTAAAICCwTAAAICC0TAAAICC4TAAAICC8TAAAICDATAAAICDETAAAICDITAAAICDMTAAAICDQTAAAICDUTAAAICDYTAAAICDcTAAAICDgTAAAICDkTAAAICDoTAAAICDsTAAAICDwTAAAICD0TAAAICD4TAAAICD8TAAAICEATAAAICEETAAAICEITAAAICEMTAAAICEQTAAAICEUTAAAICEYTAAAICEcTAAAICEgTAAAICEkTAAAICEoTAAAICEsTAAAICEwTAAAICE0TAAAICE4TAAAICE8TAAAICFATAAAICFETAAAICFITAAAICFMTAAAICFQTAAAICFUTAAAICFYTAAAICFcTAAAICFgTAAAICFkTAAAICFoTAAAICFsTAAAICFwTAAAICF0TAAAICF4TAAAICF8TAAAICGATAAAICGETAAAICGITAAAICGMTAAAICGQTAAAICGUTAAAICGYTAAAICGcTAAAICGgTAAAICGkTAAAICGoTAAAICGsTAAAICGwTAAAICG0TAAAICG4TAAAICG8TAAAICHATAAAICHETAAAICHITAAAICHMTAAAICHQTAAAICHUTAAAICHYTAAAICHcTAAAICHgTAAAICHkTAAAICHoTAAAICHsTAAAICHwTAAAICH0TAAAICH4TAAAICH8TAAAICIATAAAICIETAAAICIITAAAICIMTAAAICIQTAAAICIUTAAAICIYTAAAICIcTAAAICIgTAAAICIkTAAAICIoTAAAICIsTAAAICIwTAAAICI0TAAAICI4TAAAICI8TAAAICJATAAAICJETAAAICJITAAAICJMTAAAICJQTAAAICJUTAAAICJYTAAAICJcTAAAICJgTAAAICJkTAAAICJoTAAAICJsTAAAICJwTAAAICJ0TAAAICJ4TAAAICJ8TAAAICKATAAAICKETAAAICKITAAAICKMTAAAICKQTAAAICKUTAAAICKYTAAAICKcTAAAICKgTAAAICKkTAAAICKoTAAAICKsTAAAICKwTAAAICK0TAAAICK4TAAAICK8TAAAICLATAAAICLETAAAICLITAAAICLMTAAAICLQTAAAICLUTAAAICLYTAAAICLcTAAAICLgTAAAICLkTAAAICLoTAAAICLsTAAAICLwTAAAICL0TAAAICL4TAAAICL8TAAAICMATAAAICMETAAAICMITAAAICMMTAAAICMQTAAAICMUTAAAICMYTAAAICMcTAAAICMgTAAAICMkTAAAICMoTAAAICMsTAAAICMwTAAAICM0TAAAICM4TAAAICM8TAAAICNATAAAICNETAAAICNITAAAICNMTAAAICNQTAAAICNUTAAAICNYTAAAICNcTAAAICNgTAAAICNkTAAAICNoTAAAICNsTAAAICNwTAAAICN0TAAAICN4TAAAICN8TAAAICOATAAAICOETAAAICOITAAAICOMTAAAICOQTAAAICOUTAAAICOYTAAAICOcTAAAICOgTAAAICOkTAAAICOoTAAAICOsTAAAICOwTAAAICO0TAAAICO4TAAAICO8TAAAICPATAAAICPETAAAICPITAAAICPMTAAAICPQTAAAICPUTAAAICPYTAAAICPcTAAAICPgTAAAICPkTAAAICPoTAAAICPsTAAAICPwTAAAICP0TAAAICP4TAAAICP8TAAAICAAUAAAICAEUAAAICAIUAAAICAMUAAAICAQUAAAICAUUAAAICAYUAAAICAcUAAAICAgUAAAICAkUAAAICAoUAAAICAsUAAAICAwUAAAICA0UAAAICA4UAAAICA8UAAAICBAUAAAICBEUAAAICBIUAAAICBMUAAAICBQUAAAICBUUAAAICBYUAAAICBcUAAAICBgUAAAICBkUAAAICBoUAAAICBsUAAAICBwUAAAICB0UAAAICB4UAAAICB8UAAAICCAUAAAICCEUAAAICCIUAAAICCMUAAAICCQUAAAICCUUAAAICCYUAAAICCcUAAAICCgUAAAICCkUAAAICCoUAAAICCsUAAAICCwUAAAICC0UAAAICC4UAAAICC8UAAAICDAUAAAICDEUAAAICDIUAAAICDMUAAAICDQUAAAICDUUAAAICDYUAAAICDcUAAAICDgUAAAICDkUAAAICDoUAAAICDsUAAAICDwUAAAICD0UAAAICD4UAAAICD8UAAAICEAUAAAICEEUAAAICEIUAAAICEMUAAAICEQUAAAICEUUAAAICEYUAAAICEcUAAAICEgUAAAICEkUAAAICEoUAAAICEsUAAAICEwUAAAICE0UAAAICE4UAAAICE8UAAAICFAUAAAICFEUAAAICFIUAAAICFMUAAAICFQUAAAICFUUAAAICFYUAAAICFcUAAAICFgUAAAICFkUAAAICFoUAAAICFsUAAAICFwUAAAICF0UAAAICF4UAAAICF8UAAAICGAUAAAICGEUAAAICGIUAAAICGMUAAAICGQUAAAICGUUAAAICGYUAAAICGcUAAAICGgUAAAICGkUAAAICGoUAAAICGsUAAAICGwUAAAICG0UAAAICG4UAAAICG8UAAAICHAUAAAICHEUAAAICHIUAAAICHMUAAAICHQUAAAICHUUAAAICHYUAAAICHcUAAAICHgUAAAICHkUAAAICHoUAAAICHsUAAAICHwUAAAICH0UAAAICH4UAAAICH8UAAAICIAUAAAICIEUAAAICIIUAAAICIMUAAAICIQUAAAICIUUAAAICIYUAAAICIcUAAAICIgUAAAICIkUAAAICIoUAAAICIsUAAAICIwUAAAICI0UAAAICI4UAAAICI8UAAAICJAUAAAICJEUAAAICJIUAAAICJMUAAAICJQUAAAICJUUAAAICJYUAAAICJcUAAAICJgUAAAICJkUAAAICJoUAAAICJsUAAAICJwUAAAICJ0UAAAICJ4UAAAICJ8UAAAICKAUAAAICKEUAAAICKIUAAAICKMUAAAICKQUAAAICKUUAAAICKYUAAAICKcUAAAICKgUAAAICKkUAAAICKoUAAAICKsUAAAICKwUAAAICK0UAAAICK4UAAAICK8UAAAICLAUAAAICLEUAAAICLIUAAAICLMUAAAICLQUAAAICLUUAAAICLYUAAAICLcUAAAICLgUAAAICLkUAAAICLoUAAAICLsUAAAICLwUAAAICL0UAAAICL4UAAAICL8UAAAICMAUAAAICMEUAAAICMIUAAAICMMUAAAICMQUAAAICMUUAAAICMYUAAAICMcUAAAICMgUAAAICMkUAAAICMoUAAAICMsUAAAICMwUAAAICM0UAAAICM4UAAAICM8UAAAICNAUAAAICNEUAAAICNIUAAAICNMUAAAICNQUAAAICNUUAAAICNYUAAAICNcUAAAICNgUAAAICNkUAAAICNoUAAAICNsUAAAICNwUAAAICN0UAAAICN4UAAAICN8UAAAICOAUAAAICOEUAAAICOIUAAAICOMUAAAICOQUAAAICOUUAAAICOYUAAAICOcUAAAICOgUAAAICOkUAAAICOoUAAAICOsUAAAICOwUAAAICO0UAAAICO4UAAAICO8UAAAICPAUAAAICPEUAAAICPIUAAAICPMUAAAICPQUAAAICPUUAAAICPYUAAAICPcUAAAICPgUAAAICPkUAAAICPoUAAAICPsUAAAICPwUAAAICP0UAAAICP4UAAAICP8UAAAICAAVAAAICAEVAAAICAIVAAAICAMVAAAICAQVAAAICAUVAAAICAYVAAAICAcVAAAICAgVAAAICAkVAAAICAoVAAAICAsVAAAICAwVAAAICA0VAAAICA4VAAAICA8VAAAICBAVAAAICBEVAAAICBIVAAAICBMVAAAICBQVAAAICBUVAAAICBYVAAAICBcVAAAICBgVAAAICBkVAAAICBoVAAAICBsVAAAICBwVAAAICB0VAAAICB4VAAAICB8VAAAICCAVAAAICCEVAAAICCIVAAAICCMVAAAICCQVAAAICCUVAAAICCYVAAAICCcVAAAICCgVAAAICCkVAAAICCoVAAAICCsVAAAICCwVAAAICC0VAAAICC4VAAAICC8VAAAICDAVAAAICDEVAAAICDIVAAAICDMVAAAICDQVAAAICDUVAAAICDYVAAAICDcVAAAICDgVAAAICDkVAAAICDoVAAAICDsVAAAICDwVAAAICD0VAAAICD4VAAAICD8VAAAICEAVAAAICEEVAAAICEIVAAAICEMVAAAICEQVAAAICEUVAAAICEYVAAAICEcVAAAICEgVAAAICEkVAAAICEoVAAAICEsVAAAICEwVAAAICE0VAAAICE4VAAAICE8VAAAICFAVAAAICFEVAAAICFIVAAAICFMVAAAICFQVAAAICFUVAAAICFYVAAAICFcVAAAICFgVAAAICFkVAAAICFoVAAAICFsVAAAICFwVAAAICF0VAAAICF4VAAAICF8VAAAICGAVAAAICGEVAAAICGIVAAAICGMVAAAICGQVAAAICGUVAAAICGYVAAAICGcVAAAICGgVAAAICGkVAAAICGoVAAAICGsVAAAICGwVAAAICG0VAAAICG4VAAAICG8VAAAICHAVAAAICHEVAAAICHIVAAAICHMVAAAICHQVAAAICHUVAAAICHYVAAAICHcVAAAICHgVAAAICHkVAAAICHoVAAAICHsVAAAICHwVAAAICH0VAAAICH4VAAAICH8VAAAICIAVAAAICIEVAAAICIIVAAAICIMVAAAICIQVAAAICIUVAAAICIYVAAAICIcVAAAICIgVAAAICIkVAAAICIoVAAAICIsVAAAICIwVAAAICI0VAAAICI4VAAAICI8VAAAICJAVAAAICJEVAAAICJIVAAAICJMVAAAICJQVAAAICJUVAAAICJYVAAAICJcVAAAICJgVAAAICJkVAAAICJoVAAAICJsVAAAICJwVAAAICJ0VAAAICJ4VAAAICJ8VAAAICKAVAAAICKEVAAAICKIVAAAICKMVAAAICKQVAAAICKUVAAAICKYVAAAICKcVAAAICKgVAAAICKkVAAAICKoVAAAICKsVAAAICKwVAAAICK0VAAAICK4VAAAICK8VAAAICLAVAAAICLEVAAAICLIVAAAICLMVAAAICLQVAAAICLUVAAAICLYVAAAICLcVAAAICLgVAAAICLkVAAAICLoVAAAICLsVAAAICLwVAAAICL0VAAAICL4VAAAICL8VAAAICMAVAAAICMEVAAAICMIVAAAICMMVAAAICMQVAAAICMUVAAAICMYVAAAICMcVAAAICMgVAAAICMkVAAAICMoVAAAICMsVAAAICMwVAAAICM0VAAAICM4VAAAICM8VAAAICNAVAAAICNEVAAAICNIVAAAICNMVAAAICNQVAAAICNUVAAAICNYVAAAICNcVAAAICNgVAAAICNkVAAAICNoVAAAICNsVAAAICNwVAAAICN0VAAAICN4VAAAICN8VAAAICOAVAAAICOEVAAAICOIVAAAICOMVAAAICOQVAAAICOUVAAAICOYVAAAICOcVAAAICOgVAAAICOkVAAAICOoVAAAICOsVAAAICOwVAAAICO0VAAAICO4VAAAICO8VAAAICPAVAAAICPEVAAAICPIVAAAICPMVAAAICPQVAAAICPUVAAAICPYVAAAICPcVAAAICPgVAAAICPkVAAAICPoVAAAICPsVAAAICPwVAAAICP0VAAAICP4VAAAICP8VAAAICAAWAAAICAEWAAAICAIWAAAICAMWAAAICAQWAAAICAUWAAAICAYWAAAICAcWAAAICAgWAAAICAkWAAAICAoWAAAICAsWAAAICAwWAAAICA0WAAAICA4WAAAICA8WAAAICBAWAAAICBEWAAAICBIWAAAICBMWAAAICBQWAAAICBUWAAAICBYWAAAICBcWAAAICBgWAAAICBkWAAAICBoWAAAICBsWAAAICBwWAAAICB0WAAAICB4WAAAICB8WAAAICCAWAAAICCEWAAAICCIWAAAICCMWAAAICCQWAAAICCUWAAAICCYWAAAICCcWAAAICCgWAAAICCkWAAAICCoWAAAICCsWAAAICCwWAAAICC0WAAAICC4WAAAICC8WAAAICDAWAAAICDEWAAAICDIWAAAICDMWAAAICDQWAAAICDUWAAAICDYWAAAICDcWAAAICDgWAAAICDkWAAAICDoWAAAICDsWAAAICDwWAAAICD0WAAAICD4WAAAICD8WAAAICEAWAAAICEEWAAAICEIWAAAICEMWAAAICEQWAAAICEUWAAAICEYWAAAICEcWAAAICEgWAAAICEkWAAAICEoWAAAICEsWAAAICEwWAAAICE0WAAAICE4WAAAICE8WAAAICFAWAAAICFEWAAAICFIWAAAICFMWAAAICFQWAAAICFUWAAAICFYWAAAICFcWAAAICFgWAAAICFkWAAAICFoWAAAICFsWAAAICFwWAAAICF0WAAAICF4WAAAICF8WAAAICGAWAAAICGEWAAAICGIWAAAICGMWAAAICGQWAAAICGUWAAAICGYWAAAICGcWAAAICGgWAAAICGkWAAAICGoWAAAICGsWAAAICGwWAAAICG0WAAAICG4WAAAICG8WAAAICHAWAAAICHEWAAAICHIWAAAICHMWAAAICHQWAAAICHUWAAAICHYWAAAICHcWAAAICHgWAAAICHkWAAAICHoWAAAICHsWAAAICHwWAAAICH0WAAAICH4WAAAICH8WAAAICIAWAAAICIEWAAAICIIWAAAICIMWAAAICIQWAAAICIUWAAAICIYWAAAICIcWAAAICIgWAAAICIkWAAAICIoWAAAICIsWAAAICIwWAAAICI0WAAAICI4WAAAICI8WAAAICJAWAAAICJEWAAAICJIWAAAICJMWAAAICJQWAAAICJUWAAAICJYWAAAICJcWAAAICJgWAAAICJkWAAAICJoWAAAICJsWAAAICJwWAAAICJ0WAAAICJ4WAAAICJ8WAAAICKAWAAAICKEWAAAICKIWAAAICKMWAAAICKQWAAAICKUWAAAICKYWAAAICKcWAAAICKgWAAAICKkWAAAICKoWAAAICKsWAAAICKwWAAAICK0WAAAICK4WAAAICK8WAAAICLAWAAAICLEWAAAICLIWAAAICLMWAAAICLQWAAAICLUWAAAICLYWAAAICLcWAAAICLgWAAAICLkWAAAICLoWAAAICLsWAAAICLwWAAAICL0WAAAICL4WAAAICL8WAAAICMAWAAAICMEWAAAICMIWAAAICMMWAAAICMQWAAAICMUWAAAICMYWAAAICMcWAAAICMgWAAAICMkWAAAICMoWAAAICMsWAAAICMwWAAAICM0WAAAICM4WAAAICM8WAAAICNAWAAAICNEWAAAICNIWAAAICNMWAAAICNQWAAAICNUWAAAICNYWAAAICNcWAAAICNgWAAAICNkWAAAICNoWAAAICNsWAAAICNwWAAAICN0WAAAICN4WAAAICN8WAAAICOAWAAAICOEWAAAICOIWAAAICOMWAAAICOQWAAAICOUWAAAICOYWAAAICOcWAAAICOgWAAAICOkWAAAICOoWAAAICOsWAAAICOwWAAAICO0WAAAICO4WAAAICO8WAAAICPAWAAAICPEWAAAICPIWAAAICPMWAAAICPQWAAAICPUWAAAICPYWAAAICPcWAAAICPgWAAAICPkWAAAICPoWAAAICPsWAAAICPwWAAAICP0WAAAICP4WAAAICP8WAAAICAAXAAAICAEXAAAICAIXAAAICAMXAAAICAQXAAAICAUXAAAICAYXAAAICAcXAAAICAgXAAAICAkXAAAICAoXAAAICAsXAAAICAwXAAAICA0XAAAICA4XAAAICA8XAAAICBAXAAAICBEXAAAICBIXAAAICBMXAAAICBQXAAAICBUXAAAICBYXAAAICBcXAAAICBgXAAAICBkXAAAICBoXAAAICBsXAAAICBwXAAAICB0XAAAICB4XAAAICB8XAAAICCAXAAAICCEXAAAICCIXAAAICCMXAAAICCQXAAAICCUXAAAICCYXAAAICCcXAAAICCgXAAAICCkXAAAICCoXAAAICCsXAAAICCwXAAAICC0XAAAICC4XAAAICC8XAAAICDAXAAAICDEXAAAICDIXAAAICDMXAAAICDQXAAAICDUXAAAICDYXAAAICDcXAAAICDgXAAAICDkXAAAICDoXAAAICDsXAAAICDwXAAAICD0XAAAICD4XAAAICD8XAAAICEAXAAAICEEXAAAICEIXAAAICEMXAAAICEQXAAAICEUXAAAICEYXAAAICEcXAAAICEgXAAAICEkXAAAICEoXAAAICEsXAAAICEwXAAAICE0XAAAICE4XAAAICE8XAAAICFAXAAAICFEXAAAICFIXAAAICFMXAAAICFQXAAAICFUXAAAICFYXAAAICFcXAAAICFgXAAAICFkXAAAICFoXAAAICFsXAAAICFwXAAAICF0XAAAICF4XAAAICF8XAAAICGAXAAAICGEXAAAICGIXAAAICGMXAAAICGQXAAAICGUXAAAICGYXAAAICGcXAAAICGgXAAAICGkXAAAICGoXAAAICGsXAAAICGwXAAAICG0XAAAICG4XAAAICG8XAAAICHAXAAAICHEXAAAICHIXAAAICHMXAAAICHQXAAAICHUXAAAICHYXAAAICHcXAAAICHgXAAAICHkXAAAICHoXAAAICHsXAAAICHwXAAAICH0XAAAICH4XAAAICH8XAAAICIAXAAAICIEXAAAICIIXAAAICIMXAAAICIQXAAAICIUXAAAICIYXAAAICIcXAAAICIgXAAAICIkXAAAICIoXAAAICIsXAAAICIwXAAAICI0XAAAICI4XAAAICI8XAAAICJAXAAAICJEXAAAICJIXAAAICJMXAAAICJQXAAAICJUXAAAICJYXAAAICJcXAAAICJgXAAAICJkXAAAICJoXAAAICJsXAAAICJwXAAAICJ0XAAAICJ4XAAAICJ8XAAAICKAXAAAICKEXAAAICKIXAAAICKMXAAAICKQXAAAICKUXAAAICKYXAAAICKcXAAAICKgXAAAICKkXAAAICKoXAAAICKsXAAAICKwXAAAICK0XAAAICK4XAAAICK8XAAAICLAXAAAICLEXAAAICLIXAAAICLMXAAAICLQXAAAICLUXAAAICLYXAAAICLcXAAAICLgXAAAICLkXAAAICLoXAAAICLsXAAAICLwXAAAICL0XAAAICL4XAAAICL8XAAAICMAXAAAICMEXAAAICMIXAAAICMMXAAAICMQXAAAICMUXAAAICMYXAAAICMcXAAAICMgXAAAICMkXAAAICMoXAAAICMsXAAAICMwXAAAICM0XAAAICM4XAAAICM8XAAAICNAXAAAICNEXAAAICNIXAAAICNMXAAAICNQXAAAICNUXAAAICNYXAAAICNcXAAAICNgXAAAICNkXAAAICNoXAAAICNsXAAAICNwXAAAICN0XAAAICN4XAAAICN8XAAAICOAXAAAICOEXAAAICOIXAAAICOMXAAAICOQXAAAICOUXAAAICOYXAAAICOcXAAAICOgXAAAICOkXAAAICOoXAAAICOsXAAAICOwXAAAICO0XAAAICO4XAAAICO8XAAAICPAXAAAICPEXAAAICPIXAAAICPMXAAAICPQXAAAICPUXAAAICPYXAAAICPcXAAAICPgXAAAICPkXAAAICPoXAAAICPsXAAAICPwXAAAICP0XAAAICP4XAAAICP8XAAAICAAYAAAICAEYAAAICAIYAAAICAMYAAAICAQYAAAICAUYAAAICAYYAAAICAcYAAAICAgYAAAICAkYAAAICAoYAAAICAsYAAAICAwYAAAICA0YAAAICA4YAAAICA8YAAAICBAYAAAICBEYAAAICBIYAAAICBMYAAAICBQYAAAICBUYAAAICBYYAAAICBcYAAAICBgYAAAICBkYAAAICBoYAAAICBsYAAAICBwYAAAICB0YAAAICB4YAAAICB8YAAAICCAYAAAICCEYAAAICCIYAAAICCMYAAAICCQYAAAICCUYAAAICCYYAAAICCcYAAAICCgYAAAICCkYAAAICCoYAAAICCsYAAAICCwYAAAICC0YAAAICC4YAAAICC8YAAAICDAYAAAICDEYAAAICDIYAAAICDMYAAAICDQYAAAICDUYAAAICDYYAAAICDcYAAAICDgYAAAICDkYAAAICDoYAAAICDsYAAAICDwYAAAICD0YAAAICD4YAAAICD8YAAAICEAYAAAICEEYAAAICEIYAAAICEMYAAAICEQYAAAICEUYAAAICEYYAAAICEcYAAAICEgYAAAICEkYAAAICEoYAAAICEsYAAAICEwYAAAICE0YAAAICE4YAAAICE8YAAAICFAYAAAICFEYAAAICFIYAAAICFMYAAAICFQYAAAICFUYAAAICFYYAAAICFcYAAAICFgYAAAICFkYAAAICFoYAAAICFsYAAAICFwYAAAICF0YAAAICF4YAAAICF8YAAAICGAYAAAICGEYAAAICGIYAAAICGMYAAAICGQYAAAICGUYAAAICGYYAAAICGcYAAAICGgYAAAICGkYAAAICGoYAAAICGsYAAAICGwYAAAICG0YAAAICG4YAAAICG8YAAAICHAYAAAICHEYAAAICHIYAAAICHMYAAAICHQYAAAICHUYAAAICHYYAAAICHcYAAAICHgYAAAICHkYAAAICHoYAAAICHsYAAAICHwYAAAICH0YAAAICH4YAAAICH8YAAAICIAYAAAICIEYAAAICIIYAAAICIMYAAAICIQYAAAICIUYAAAICIYYAAAICIcYAAAICIgYAAAICIkYAAAICIoYAAAICIsYAAAICIwYAAAICI0YAAAICI4YAAAICI8YAAAICJAYAAAICJEYAAAICJIYAAAICJMYAAAICJQYAAAICJUYAAAICJYYAAAICJcYAAAICJgYAAAICJkYAAAICJoYAAAICJsYAAAICJwYAAAICJ0YAAAICJ4YAAAICJ8YAAAICKAYAAAICKEYAAAICKIYAAAICKMYAAAICKQYAAAICKUYAAAICKYYAAAICKcYAAAICKgYAAAICKkYAAAICKoYAAAICKsYAAAICKwYAAAICK0YAAAICK4YAAAICK8YAAAICLAYAAAICLEYAAAICLIYAAAICLMYAAAICLQYAAAICLUYAAAICLYYAAAICLcYAAAICLgYAAAICLkYAAAICLoYAAAICLsYAAAICLwYAAAICL0YAAAICL4YAAAICL8YAAAICMAYAAAICMEYAAAICMIYAAAICMMYAAAICMQYAAAICMUYAAAICMYYAAAICMcYAAAICMgYAAAICMkYAAAICMoYAAAICMsYAAAICMwYAAAICM0YAAAICM4YAAAICM8YAAAICNAYAAAICNEYAAAICNIYAAAICNMYAAAICNQYAAAICNUYAAAICNYYAAAICNcYAAAICNgYAAAICNkYAAAICNoYAAAICNsYAAAICNwYAAAICN0YAAAICN4YAAAICN8YAAAICOAYAAAICOEYAAAICOIYAAAICOMYAAAICOQYAAAICOUYAAAICOYYAAAICOcYAAAICOgYAAAICOkYAAAICOoYAAAICOsYAAAICOwYAAAICO0YAAAICO4YAAAICO8YAAAICPAYAAAICPEYAAAICPIYAAAICPMYAAAICPQYAAAICPUYAAAICPYYAAAICPcYAAAICPgYAAAICPkYAAAICPoYAAAICPsYAAAICPwYAAAICP0YAAAICP4YAAAICP8YAAAICAAZAAAICAEZAAAICAIZAAAICAMZAAAICAQZAAAICAUZAAAICAYZAAAICAcZAAAICAgZAAAICAkZAAAICAoZAAAICAsZAAAICAwZAAAICA0ZAAAICA4ZAAAICA8ZAAAICBAZAAAICBEZAAAICBIZAAAICBMZAAAICBQZAAAICBUZAAAICBYZAAAICBcZAAAICBgZAAAICBkZAAAICBoZAAAICBsZAAAICBwZAAAICB0ZAAAICB4ZAAAICB8ZAAAICCAZAAAICCEZAAAICCIZAAAICCMZAAAICCQZAAAICCUZAAAICCYZAAAICCcZAAAICCgZAAAICCkZAAAICCoZAAAICCsZAAAICCwZAAAICC0ZAAAICC4ZAAAICC8ZAAAICDAZAAAICDEZAAAICDIZAAAICDMZAAAICDQZAAAICDUZAAAICDYZAAAICDcZAAAICDgZAAAICDkZAAAICDoZAAAICDsZAAAICDwZAAAICD0ZAAAICD4ZAAAICD8ZAAAICEAZAAAICEEZAAAICEIZAAAICEMZAAAICEQZAAAICEUZAAAICEYZAAAICEcZAAAICEgZAAAICEkZAAAICEoZAAAICEsZAAAICEwZAAAICE0ZAAAICE4ZAAAICE8ZAAAICFAZAAAICFEZAAAICFIZAAAICFMZAAAICFQZAAAICFUZAAAICFYZAAAICFcZAAAICFgZAAAICFkZAAAICFoZAAAICFsZAAAICFwZAAAICF0ZAAAICF4ZAAAICF8ZAAAICGAZAAAICGEZAAAICGIZAAAICGMZAAAICGQZAAAICGUZAAAICGYZAAAICGcZAAAICGgZAAAICGkZAAAICGoZAAAICGsZAAAICGwZAAAICG0ZAAAICG4ZAAAICG8ZAAAICHAZAAAICHEZAAAICHIZAAAICHMZAAAICHQZAAAICHUZAAAICHYZAAAICHcZAAAICHgZAAAICHkZAAAICHoZAAAICHsZAAAICHwZAAAICH0ZAAAICH4ZAAAICH8ZAAAICIAZAAAICIEZAAAICIIZAAAICIMZAAAICIQZAAAICIUZAAAICIYZAAAICIcZAAAICIgZAAAICIkZAAAICIoZAAAICIsZAAAICIwZAAAICI0ZAAAICI4ZAAAICI8ZAAAICJAZAAAICJEZAAAICJIZAAAICJMZAAAICJQZAAAICJUZAAAICJYZAAAICJcZAAAICJgZAAAICJkZAAAICJoZAAAICJsZAAAICJwZAAAICJ0ZAAAICJ4ZAAAICJ8ZAAAICKAZAAAICKEZAAAICKIZAAAICKMZAAAICKQZAAAICKUZAAAICKYZAAAICKcZAAAICKgZAAAICKkZAAAICKoZAAAICKsZAAAICKwZAAAICK0ZAAAICK4ZAAAICK8ZAAAICLAZAAAICLEZAAAICLIZAAAICLMZAAAICLQZAAAICLUZAAAICLYZAAAICLcZAAAICLgZAAAICLkZAAAICLoZAAAICLsZAAAICLwZAAAICL0ZAAAICL4ZAAAICL8ZAAAICMAZAAAICMEZAAAICMIZAAAICMMZAAAICMQZAAAICMUZAAAICMYZAAAICMcZAAAICMgZAAAICMkZAAAICMoZAAAICMsZAAAICMwZAAAICM0ZAAAICM4ZAAAICM8ZAAAICNAZAAAICNEZAAAICNIZAAAICNMZAAAICNQZAAAICNUZAAAICNYZAAAICNcZAAAICNgZAAAICNkZAAAICNoZAAAICNsZAAAICNwZAAAICN0ZAAAICN4ZAAAICN8ZAAAICOAZAAAICOEZAAAICOIZAAAICOMZAAAICOQZAAAICOUZAAAICOYZAAAICOcZAAAICOgZAAAICOkZAAAICOoZAAAICOsZAAAICOwZAAAICO0ZAAAICO4ZAAAICO8ZAAAICPAZAAAICPEZAAAICPIZAAAICPMZAAAICPQZAAAICPUZAAAICPYZAAAICPcZAAAICPgZAAAICPkZAAAICPoZAAAICPsZAAAICPwZAAAICP0ZAAAICP4ZAAAICP8ZAAAICAAaAAAICAEaAAAICAIaAAAICAMaAAAICAQaAAAICAUaAAAICAYaAAAICAcaAAAICAgaAAAICAkaAAAICAoaAAAICAsaAAAICAwaAAAICA0aAAAICA4aAAAICA8aAAAICBAaAAAICBEaAAAICBIaAAAICBMaAAAICBQaAAAICBUaAAAICBYaAAAICBcaAAAICBgaAAAICBkaAAAICBoaAAAICBsaAAAICBwaAAAICB0aAAAICB4aAAAICB8aAAAICCAaAAAICCEaAAAICCIaAAAICCMaAAAICCQaAAAICCUaAAAICCYaAAAICCcaAAAICCgaAAAICCkaAAAICCoaAAAICCsaAAAICCwaAAAICC0aAAAICC4aAAAICC8aAAAICDAaAAAICDEaAAAICDIaAAAICDMaAAAICDQaAAAICDUaAAAICDYaAAAICDcaAAAICDgaAAAICDkaAAAICDoaAAAICDsaAAAICDwaAAAICD0aAAAICD4aAAAICD8aAAAICEAaAAAICEEaAAAICEIaAAAICEMaAAAICEQaAAAICEUaAAAICEYaAAAICEcaAAAICEgaAAAICEkaAAAICEoaAAAICEsaAAAICEwaAAAICE0aAAAICE4aAAAICE8aAAAICFAaAAAICFEaAAAICFIaAAAICFMaAAAICFQaAAAICFUaAAAICFYaAAAICFcaAAAICFgaAAAICFkaAAAICFoaAAAICFsaAAAICFwaAAAICF0aAAAICF4aAAAICF8aAAAICGAaAAAICGEaAAAICGIaAAAICGMaAAAICGQaAAAICGUaAAAICGYaAAAICGcaAAAICGgaAAAICGkaAAAICGoaAAAICGsaAAAICGwaAAAICG0aAAAICG4aAAAICG8aAAAICHAaAAAICHEaAAAICHIaAAAICHMaAAAICHQaAAAICHUaAAAICHYaAAAICHcaAAAICHgaAAAICHkaAAAICHoaAAAICHsaAAAICHwaAAAICH0aAAAICH4aAAAICH8aAAAICIAaAAAICIEaAAAICIIaAAAICIMaAAAICIQaAAAICIUaAAAICIYaAAAICIcaAAAICIgaAAAICIkaAAAICIoaAAAICIsaAAAICIwaAAAICI0aAAAICI4aAAAICI8aAAAICJAaAAAICJEaAAAICJIaAAAICJMaAAAICJQaAAAICJUaAAAICJYaAAAICJcaAAAICJgaAAAICJkaAAAICJoaAAAICJsaAAAICJwaAAAICJ0aAAAICJ4aAAAICJ8aAAAICKAaAAAICKEaAAAICKIaAAAICKMaAAAICKQaAAAICKUaAAAICKYaAAAICKcaAAAICKgaAAAICKkaAAAICKoaAAAICKsaAAAICKwaAAAICK0aAAAICK4aAAAICK8aAAAICLAaAAAICLEaAAAICLIaAAAICLMaAAAICLQaAAAICLUaAAAICLYaAAAICLcaAAAICLgaAAAICLkaAAAICLoaAAAICLsaAAAICLwaAAAICL0aAAAICL4aAAAICL8aAAAICMAaAAAICMEaAAAICMIaAAAICMMaAAAICMQaAAAICMUaAAAICMYaAAAICMcaAAAICMgaAAAICMkaAAAICMoaAAAICMsaAAAICMwaAAAICM0aAAAICM4aAAAICM8aAAAICNAaAAAICNEaAAAICNIaAAAICNMaAAAICNQaAAAICNUaAAAICNYaAAAICNcaAAAICNgaAAAICNkaAAAICNoaAAAICNsaAAAICNwaAAAICN0aAAAICN4aAAAICN8aAAAICOAaAAAICOEaAAAICOIaAAAICOMaAAAICOQaAAAICOUaAAAICOYaAAAICOcaAAAICOgaAAAICOkaAAAICOoaAAAICOsaAAAICOwaAAAICO0aAAAICO4aAAAICO8aAAAICPAaAAAICPEaAAAICPIaAAAICPMaAAAICPQaAAAICPUaAAAICPYaAAAICPcaAAAICPgaAAAICPkaAAAICPoaAAAICPsaAAAICPwaAAAICP0aAAAICP4aAAAICP8aAAAICAAbAAAICAEbAAAICAIbAAAICAMbAAAICAQbAAAICAUbAAAICAYbAAAICAcbAAAICAgbAAAICAkbAAAICAobAAAICAsbAAAICAwbAAAICA0bAAAICA4bAAAICA8bAAAICBAbAAAICBEbAAAICBIbAAAICBMbAAAICBQbAAAICBUbAAAICBYbAAAICBcbAAAICBgbAAAICBkbAAAICBobAAAICBsbAAAICBwbAAAICB0bAAAICB4bAAAICB8bAAAICCAbAAAICCEbAAAICCIbAAAICCMbAAAICCQbAAAICCUbAAAICCYbAAAICCcbAAAICCgbAAAICCkbAAAICCobAAAICCsbAAAICCwbAAAICC0bAAAICC4bAAAICC8bAAAICDAbAAAICDEbAAAICDIbAAAICDMbAAAICDQbAAAICDUbAAAICDYbAAAICDcbAAAICDgbAAAICDkbAAAICDobAAAICDsbAAAICDwbAAAICD0bAAAICD4bAAAICD8bAAAICEAbAAAICEEbAAAICEIbAAAICEMbAAAICEQbAAAICEUbAAAICEYbAAAICEcbAAAICEgbAAAICEkbAAAICEobAAAICEsbAAAICEwbAAAICE0bAAAICE4bAAAICE8bAAAICFAbAAAICFEbAAAICFIbAAAICFMbAAAICFQbAAAICFUbAAAICFYbAAAICFcbAAAICFgbAAAICFkbAAAICFobAAAICFsbAAAICFwbAAAICF0bAAAICF4bAAAICF8bAAAICGAbAAAICGEbAAAICGIbAAAICGMbAAAICGQbAAAICGUbAAAICGYbAAAICGcbAAAICGgbAAAICGkbAAAICGobAAAICGsbAAAICGwbAAAICG0bAAAICG4bAAAICG8bAAAICHAbAAAICHEbAAAICHIbAAAICHMbAAAICHQbAAAICHUbAAAICHYbAAAICHcbAAAICHgbAAAICHkbAAAICHobAAAICHsbAAAICHwbAAAICH0bAAAICH4bAAAICH8bAAAICIAbAAAICIEbAAAICIIbAAAICIMbAAAICIQbAAAICIUbAAAICIYbAAAICIcbAAAICIgbAAAICIkbAAAICIobAAAICIsbAAAICIwbAAAICI0bAAAICI4bAAAICI8bAAAICJAbAAAICJEbAAAICJIbAAAICJMbAAAICJQbAAAICJUbAAAICJYbAAAICJcbAAAICJgbAAAICJkbAAAICJobAAAICJsbAAAICJwbAAAICJ0bAAAICJ4bAAAICJ8bAAAICKAbAAAICKEbAAAICKIbAAAICKMbAAAICKQbAAAICKUbAAAICKYbAAAICKcbAAAICKgbAAAICKkbAAAICKobAAAICKsbAAAICKwbAAAICK0bAAAICK4bAAAICK8bAAAICLAbAAAICLEbAAAICLIbAAAICLMbAAAICLQbAAAICLUbAAAICLYbAAAICLcbAAAICLgbAAAICLkbAAAICLobAAAICLsbAAAICLwbAAAICL0bAAAICL4bAAAICL8bAAAICMAbAAAICMEbAAAICMIbAAAICMMbAAAICMQbAAAICMUbAAAICMYbAAAICMcbAAAICMgbAAAICMkbAAAICMobAAAICMsbAAAICMwbAAAICM0bAAAICM4bAAAICM8bAAAICNAbAAAICNEbAAAICNIbAAAICNMbAAAICNQbAAAICNUbAAAICNYbAAAICNcbAAAICNgbAAAICNkbAAAICNobAAAICNsbAAAICNwbAAAICN0bAAAICN4bAAAICN8bAAAICOAbAAAICOEbAAAICOIbAAAICOMbAAAICOQbAAAICOUbAAAICOYbAAAICOcbAAAICOgbAAAICOkbAAAICOobAAAICOsbAAAICOwbAAAICO0bAAAICO4bAAAICO8bAAAICPAbAAAICPEbAAAICPIbAAAICPMbAAAICPQbAAAICPUbAAAICPYbAAAICPcbAAAICPgbAAAICPkbAAAICPobAAAICPsbAAAICPwbAAAICP0bAAAICP4bAAAICP8bAAAICAAcAAAICAEcAAAICAIcAAAICAMcAAAICAQcAAAICAUcAAAICAYcAAAICAccAAAICAgcAAAICAkcAAAICAocAAAICAscAAAICAwcAAAICA0cAAAICA4cAAAICA8cAAAICBAcAAAICBEcAAAICBIcAAAICBMcAAAICBQcAAAICBUcAAAICBYcAAAICBccAAAICBgcAAAICBkcAAAICBocAAAICBscAAAICBwcAAAICB0cAAAICB4cAAAICB8cAAAICCAcAAAICCEcAAAICCIcAAAICCMcAAAICCQcAAAICCUcAAAICCYcAAAICCccAAAICCgcAAAICCkcAAAICCocAAAICCscAAAICCwcAAAICC0cAAAICC4cAAAICC8cAAAICDAcAAAICDEcAAAICDIcAAAICDMcAAAICDQcAAAICDUcAAAICDYcAAAICDccAAAICDgcAAAICDkcAAAICDocAAAICDscAAAICDwcAAAICD0cAAAICD4cAAAICD8cAAAICEAcAAAICEEcAAAICEIcAAAICEMcAAAICEQcAAAICEUcAAAICEYcAAAICEccAAAICEgcAAAICEkcAAAICEocAAAICEscAAAICEwcAAAICE0cAAAICE4cAAAICE8cAAAICFAcAAAICFEcAAAICFIcAAAICFMcAAAICFQcAAAICFUcAAAICFYcAAAICFccAAAICFgcAAAICFkcAAAICFocAAAICFscAAAICFwcAAAICF0cAAAICF4cAAAICF8cAAAICGAcAAAICGEcAAAICGIcAAAICGMcAAAICGQcAAAICGUcAAAICGYcAAAICGccAAAICGgcAAAICGkcAAAICGocAAAICGscAAAICGwcAAAICG0cAAAICG4cAAAICG8cAAAICHAcAAAICHEcAAAICHIcAAAICHMcAAAICHQcAAAICHUcAAAICHYcAAAICHccAAAICHgcAAAICHkcAAAICHocAAAICHscAAAICHwcAAAICH0cAAAICH4cAAAICH8cAAAICIAcAAAICIEcAAAICIIcAAAICIMcAAAICIQcAAAICIUcAAAICIYcAAAICIccAAAICIgcAAAICIkcAAAICIocAAAICIscAAAICIwcAAAICI0cAAAICI4cAAAICI8cAAAICJAcAAAICJEcAAAICJIcAAAICJMcAAAICJQcAAAICJUcAAAICJYcAAAICJccAAAICJgcAAAICJkcAAAICJocAAAICJscAAAICJwcAAAICJ0cAAAICJ4cAAAICJ8cAAAICKAcAAAICKEcAAAICKIcAAAICKMcAAAICKQcAAAICKUcAAAICKYcAAAICKccAAAICKgcAAAICKkcAAAICKocAAAICKscAAAICKwcAAAICK0cAAAICK4cAAAICK8cAAAICLAcAAAICLEcAAAICLIcAAAICLMcAAAICLQcAAAICLUcAAAICLYcAAAICLccAAAICLgcAAAICLkcAAAICLocAAAICLscAAAICLwcAAAICL0cAAAICL4cAAAICL8cAAAICMAcAAAICMEcAAAICMIcAAAICMMcAAAICMQcAAAICMUcAAAICMYcAAAICMccAAAICMgcAAAICMkcAAAICMocAAAICMscAAAICMwcAAAICM0cAAAICM4cAAAICM8cAAAICNAcAAAICNEcAAAICNIcAAAICNMcAAAICNQcAAAICNUcAAAICNYcAAAICNccAAAICNgcAAAICNkcAAAICNocAAAICNscAAAICNwcAAAICN0cAAAICN4cAAAICN8cAAAICOAcAAAICOEcAAAICOIcAAAICOMcAAAICOQcAAAICOUcAAAICOYcAAAICOccAAAICOgcAAAICOkcAAAICOocAAAICOscAAAICOwcAAAICO0cAAAICO4cAAAICO8cAAAICPAcAAAICPEcAAAICPIcAAAICPMcAAAICPQcAAAICPUcAAAICPYcAAAICPccAAAICPgcAAAICPkcAAAICPocAAAICPscAAAICPwcAAAICP0cAAAICP4cAAAICP8cAAAICAAdAAAICAEdAAAICAIdAAAICAMdAAAICAQdAAAICAUdAAAICAYdAAAICAcdAAAICAgdAAAICAkdAAAICAodAAAICAsdAAAICAwdAAAICA0dAAAICA4dAAAICA8dAAAICBAdAAAICBEdAAAICBIdAAAICBMdAAAICBQdAAAICBUdAAAICBYdAAAICBcdAAAICBgdAAAICBkdAAAICBodAAAICBsdAAAICBwdAAAICB0dAAAICB4dAAAICB8dAAAICCAdAAAICCEdAAAICCIdAAAICCMdAAAICCQdAAAICCUdAAAICCYdAAAICCcdAAAICCgdAAAICCkdAAAICCodAAAICCsdAAAICCwdAAAICC0dAAAICC4dAAAICC8dAAAICDAdAAAICDEdAAAICDIdAAAICDMdAAAICDQdAAAICDUdAAAICDYdAAAICDcdAAAICDgdAAAICDkdAAAICDodAAAICDsdAAAICDwdAAAICD0dAAAICD4dAAAICD8dAAAICEAdAAAICEEdAAAICEIdAAAICEMdAAAICEQdAAAICEUdAAAICEYdAAAICEcdAAAICEgdAAAICEkdAAAICEodAAAICEsdAAAICEwdAAAICE0dAAAICE4dAAAICE8dAAAICFAdAAAICFEdAAAICFIdAAAICFMdAAAICFQdAAAICFUdAAAICFYdAAAICFcdAAAICFgdAAAICFkdAAAICFodAAAICFsdAAAICFwdAAAICF0dAAAICF4dAAAICF8dAAAICGAdAAAICGEdAAAICGIdAAAICGMdAAAICGQdAAAICGUdAAAICGYdAAAICGcdAAAICGgdAAAICGkdAAAICGodAAAICGsdAAAICGwdAAAICG0dAAAICG4dAAAICG8dAAAICHAdAAAICHEdAAAICHIdAAAICHMdAAAICHQdAAAICHUdAAAICHYdAAAICHcdAAAICHgdAAAICHkdAAAICHodAAAICHsdAAAICHwdAAAICH0dAAAICH4dAAAICH8dAAAICIAdAAAICIEdAAAICIIdAAAICIMdAAAICIQdAAAICIUdAAAICIYdAAAICIcdAAAICIgdAAAICIkdAAAICIodAAAICIsdAAAICIwdAAAICI0dAAAICI4dAAAICI8dAAAICJAdAAAICJEdAAAICJIdAAAICJMdAAAICJQdAAAICJUdAAAICJYdAAAICJcdAAAICJgdAAAICJkdAAAICJodAAAICJsdAAAICJwdAAAICJ0dAAAICJ4dAAAICJ8dAAAICKAdAAAICKEdAAAICKIdAAAICKMdAAAICKQdAAAICKUdAAAICKYdAAAICKcdAAAICKgdAAAICKkdAAAICKodAAAICKsdAAAICKwdAAAICK0dAAAICK4dAAAICK8dAAAICLAdAAAICLEdAAAICLIdAAAICLMdAAAICLQdAAAICLUdAAAICLYdAAAICLcdAAAICLgdAAAICLkdAAAICLodAAAICLsdAAAICLwdAAAICL0dAAAICL4dAAAICL8dAAAICMAdAAAICMEdAAAICMIdAAAICMMdAAAICMQdAAAICMUdAAAICMYdAAAICMcdAAAICMgdAAAICMkdAAAICModAAAICMsdAAAICMwdAAAICM0dAAAICM4dAAAICM8dAAAICNAdAAAICNEdAAAICNIdAAAICNMdAAAICNQdAAAICNUdAAAICNYdAAAICNcdAAAICNgdAAAICNkdAAAICNodAAAICNsdAAAICNwdAAAICN0dAAAICN4dAAAICN8dAAAICOAdAAAICOEdAAAICOIdAAAICOMdAAAICOQdAAAICOUdAAAICOYdAAAICOcdAAAICOgdAAAICOkdAAAICOodAAAICOsdAAAICOwdAAAICO0dAAAICO4dAAAICO8dAAAICPAdAAAICPEdAAAICPIdAAAICPMdAAAICPQdAAAICPUdAAAICPYdAAAICPcdAAAICPgdAAAICPkdAAAICPodAAAICPsdAAAICPwdAAAICP0dAAAICP4dAAAICP8dAAAICAAeAAAICAEeAAAICAIeAAAICAMeAAAICAQeAAAICAUeAAAICAYeAAAICAceAAAICAgeAAAICAkeAAAICAoeAAAICAseAAAICAweAAAICA0eAAAICA4eAAAICA8eAAAICBAeAAAICBEeAAAICBIeAAAICBMeAAAICBQeAAAICBUeAAAICBYeAAAICBceAAAICBgeAAAICBkeAAAICBoeAAAICBseAAAICBweAAAICB0eAAAICB4eAAAICB8eAAAICCAeAAAICCEeAAAICCIeAAAICCMeAAAICCQeAAAICCUeAAAICCYeAAAICCceAAAICCgeAAAICCkeAAAICCoeAAAICCseAAAICCweAAAICC0eAAAICC4eAAAICC8eAAAICDAeAAAICDEeAAAICDIeAAAICDMeAAAICDQeAAAICDUeAAAICDYeAAAICDceAAAICDgeAAAICDkeAAAICDoeAAAICDseAAAICDweAAAICD0eAAAICD4eAAAICD8eAAAICEAeAAAICEEeAAAICEIeAAAICEMeAAAICEQeAAAICEUeAAAICEYeAAAICEceAAAICEgeAAAICEkeAAAICEoeAAAICEseAAAICEweAAAICE0eAAAICE4eAAAICE8eAAAICFAeAAAICFEeAAAICFIeAAAICFMeAAAICFQeAAAICFUeAAAICFYeAAAICFceAAAICFgeAAAICFkeAAAICFoeAAAICFseAAAICFweAAAICF0eAAAICF4eAAAICF8eAAAICGAeAAAICGEeAAAICGIeAAAICGMeAAAICGQeAAAICGUeAAAICGYeAAAICGceAAAICGgeAAAICGkeAAAICGoeAAAICGseAAAICGweAAAICG0eAAAICG4eAAAICG8eAAAICHAeAAAICHEeAAAICHIeAAAICHMeAAAICHQeAAAICHUeAAAICHYeAAAICHceAAAICHgeAAAICHkeAAAICHoeAAAICHseAAAICHweAAAICH0eAAAICH4eAAAICH8eAAAICIAeAAAICIEeAAAICIIeAAAICIMeAAAICIQeAAAICIUeAAAICIYeAAAICIceAAAICIgeAAAICIkeAAAICIoeAAAICIseAAAICIweAAAICI0eAAAICI4eAAAICI8eAAAICJAeAAAICJEeAAAICJIeAAAICJMeAAAICJQeAAAICJUeAAAICJYeAAAICJceAAAICJgeAAAICJkeAAAICJoeAAAICJseAAAICJweAAAICJ0eAAAICJ4eAAAICJ8eAAAICKAeAAAICKEeAAAICKIeAAAICKMeAAAICKQeAAAICKUeAAAICKYeAAAICKceAAAICKgeAAAICKkeAAAICKoeAAAICKseAAAICKweAAAICK0eAAAICK4eAAAICK8eAAAICLAeAAAICLEeAAAICLIeAAAICLMeAAAICLQeAAAICLUeAAAICLYeAAAICLceAAAICLgeAAAICLkeAAAICLoeAAAICLseAAAICLweAAAICL0eAAAICL4eAAAICL8eAAAICMAeAAAICMEeAAAICMIeAAAICMMeAAAICMQeAAAICMUeAAAICMYeAAAICMceAAAICMgeAAAICMkeAAAICMoeAAAICMseAAAICMweAAAICM0eAAAICM4eAAAICM8eAAAICNAeAAAICNEeAAAICNIeAAAICNMeAAAICNQeAAAICNUeAAAICNYeAAAICNceAAAICNgeAAAICNkeAAAICNoeAAAICNseAAAICNweAAAICN0eAAAICN4eAAAICN8eAAAICOAeAAAICOEeAAAICOIeAAAICOMeAAAICOQeAAAICOUeAAAICOYeAAAICOceAAAICOgeAAAICOkeAAAICOoeAAAICOseAAAICOweAAAICO0eAAAICO4eAAAICO8eAAAICPAeAAAICPEeAAAICPIeAAAICPMeAAAICPQeAAAICPUeAAAICPYeAAAICPceAAAICPgeAAAICPkeAAAICPoeAAAICPseAAAICPweAAAICP0eAAAICP4eAAAICP8eAAAICAAfAAAICAEfAAAICAIfAAAICAMfAAAICAQfAAAICAUfAAAICAYfAAAICAcfAAAICAgfAAAICAkfAAAICAofAAAICAsfAAAICAwfAAAICA0fAAAICA4fAAAICA8fAAAICBAfAAAICBEfAAAICBIfAAAICBMfAAAICBQfAAAICBUfAAAICBYfAAAICBcfAAAICBgfAAAICBkfAAAICBofAAAICBsfAAAICBwfAAAICB0fAAAICB4fAAAICB8fAAAICCAfAAAICCEfAAAICCIfAAAICCMfAAAICCQfAAAICCUfAAAICCYfAAAICCcfAAAICCgfAAAICCkfAAAICCofAAAICCsfAAAICCwfAAAICC0fAAAICC4fAAAICC8fAAAICDAfAAAICDEfAAAICDIfAAAICDMfAAAICDQfAAAICDUfAAAICDYfAAAICDcfAAAICDgfAAAICDkfAAAICDofAAAICDsfAAAICDwfAAAICD0fAAAICD4fAAAICD8fAAAICEAfAAAICEEfAAAICEIfAAAICEMfAAAICEQfAAAICEUfAAAICEYfAAAICEcfAAAICEgfAAAICEkfAAAICEofAAAICEsfAAAICEwfAAAICE0fAAAICE4fAAAICE8fAAAICFAfAAAICFEfAAAICFIfAAAICFMfAAAICFQfAAAICFUfAAAICFYfAAAICFcfAAAICFgfAAAICFkfAAAICFofAAAICFsfAAAICFwfAAAICF0fAAAICF4fAAAICF8fAAAICGAfAAAICGEfAAAICGIfAAAICGMfAAAICGQfAAAICGUfAAAICGYfAAAICGcfAAAICGgfAAAICGkfAAAICGofAAAICGsfAAAICGwfAAAICG0fAAAICG4fAAAICG8fAAAICHAfAAAICHEfAAAICHIfAAAICHMfAAAICHQfAAAICHUfAAAICHYfAAAICHcfAAAICHgfAAAICHkfAAAICHofAAAICHsfAAAICHwfAAAICH0fAAAICH4fAAAICH8fAAAICIAfAAAICIEfAAAICIIfAAAICIMfAAAICIQfAAAICIUfAAAICIYfAAAICIcfAAAICIgfAAAICIkfAAAICIofAAAICIsfAAAICIwfAAAICI0fAAAICI4fAAAICI8fAAAICJAfAAAICJEfAAAICJIfAAAICJMfAAAICJQfAAAICJUfAAAICJYfAAAICJcfAAAICJgfAAAICJkfAAAICJofAAAICJsfAAAICJwfAAAICJ0fAAAICJ4fAAAICJ8fAAAICKAfAAAICKEfAAAICKIfAAAICKMfAAAICKQfAAAICKUfAAAICKYfAAAICKcfAAAICKgfAAAICKkfAAAICKofAAAICKsfAAAICKwfAAAICK0fAAAICK4fAAAICK8fAAAICLAfAAAICLEfAAAICLIfAAAICLMfAAAICLQfAAAICLUfAAAICLYfAAAICLcfAAAICLgfAAAICLkfAAAICLofAAAICLsfAAAICLwfAAAICL0fAAAICL4fAAAICL8fAAAICMAfAAAICMEfAAAICMIfAAAICMMfAAAICMQfAAAICMUfAAAICMYfAAAICMcfAAAICMgfAAAICMkfAAAICMofAAAICMsfAAAICMwfAAAICM0fAAAICM4fAAAICM8fAAAICNAfAAAICNEfAAAICNIfAAAICNMfAAAICNQfAAAICNUfAAAICNYfAAAICNcfAAAICNgfAAAICNkfAAAICNofAAAICNsfAAAICNwfAAAICN0fAAAICN4fAAAICN8fAAAICOAfAAAICOEfAAAICOIfAAAICOMfAAAICOQfAAAICOUfAAAICOYfAAAICOcfAAAICOgfAAAICOkfAAAICOofAAAICOsfAAAICOwfAAAICO0fAAAICO4fAAAICO8fAAAICPAfAAAICPEfAAAICPIfAAAICPMfAAAICPQfAAAICPUfAAAICPYfAAAICPcfAAAICPgfAAAICPkfAAAICPofAAAICPsfAAAICPwfAAAICP0fAAAICP4fAAAICP8fAAAICAAgAAAICAEgAAAICAIgAAAICAMgAAAICAQgAAAICAUgAAAICAYgAAAICAcgAAAICAggAAAICAkgAAAICAogAAAICAsgAAAICAwgAAAICA0gAAAICA4gAAAICA8gAAAICBAgAAAICBEgAAAICBIgAAAICBMgAAAICBQgAAAICBUgAAAICBYgAAAICBcgAAAICBggAAAICBkgAAAICBogAAAICBsgAAAICBwgAAAICB0gAAAICB4gAAAICB8gAAAICCAgAAAICCEgAAAICCIgAAAICCMgAAAICCQgAAAICCUgAAAICCYgAAAICCcgAAAICCggAAAICCkgAAAICCogAAAICCsgAAAICCwgAAAICC0gAAAICC4gAAAICC8gAAAICDAgAAAICDEgAAAICDIgAAAICDMgAAAICDQgAAAICDUgAAAICDYgAAAICDcgAAAICDggAAAICDkgAAAICDogAAAICDsgAAAICDwgAAAICD0gAAAICD4gAAAICD8gAAAICEAgAAAICEEgAAAICEIgAAAICEMgAAAICEQgAAAICEUgAAAICEYgAAAICEcgAAAICEggAAAICEkgAAAICEogAAAICEsgAAAICEwgAAAICE0gAAAICE4gAAAICE8gAAAICFAgAAAICFEgAAAICFIgAAAICFMgAAAICFQgAAAICFUgAAAICFYgAAAICFcgAAAICFggAAAICFkgAAAICFogAAAICFsgAAAICFwgAAAICF0gAAAICF4gAAAICF8gAAAICGAgAAAICGEgAAAICGIgAAAICGMgAAAICGQgAAAICGUgAAAICGYgAAAICGcgAAAICGggAAAICGkgAAAICGogAAAICGsgAAAICGwgAAAICG0gAAAICG4gAAAICG8gAAAICHAgAAAICHEgAAAICHIgAAAICHMgAAAICHQgAAAICHUgAAAICHYgAAAICHcgAAAICHggAAAICHkgAAAICHogAAAICHsgAAAICHwgAAAICH0gAAAICH4gAAAICH8gAAAICIAgAAAICIEgAAAICIIgAAAICIMgAAAICIQgAAAICIUgAAAICIYgAAAICIcgAAAICIggAAAICIkgAAAICIogAAAICIsgAAAICIwgAAAICI0gAAAICI4gAAAICI8gAAAICJAgAAAICJEgAAAICJIgAAAICJMgAAAICJQgAAAICJUgAAAICJYgAAAICJcgAAAICJggAAAICJkgAAAICJogAAAICJsgAAAICJwgAAAICJ0gAAAICJ4gAAAICJ8gAAAICKAgAAAICKEgAAAICKIgAAAICKMgAAAICKQgAAAICKUgAAAICKYgAAAICKcgAAAICKggAAAICKkgAAAICKogAAAICKsgAAAICKwgAAAICK0gAAAICK4gAAAICK8gAAAICLAgAAAICLEgAAAICLIgAAAICLMgAAAICLQgAAAICLUgAAAICLYgAAAICLcgAAAICLggAAAICLkgAAAICLogAAAICLsgAAAICLwgAAAICL0gAAAICL4gAAAICL8gAAAICMAgAAAICMEgAAAICMIgAAAICMMgAAAICMQgAAAICMUgAAAICMYgAAAICMcgAAAICMggAAAICMkgAAAICMogAAAICMsgAAAICMwgAAAICM0gAAAICM4gAAAICM8gAAAICNAgAAAICNEgAAAICNIgAAAICNMgAAAICNQgAAAICNUgAAAICNYgAAAICNcgAAAICNggAAAICNkgAAAICNogAAAICNsgAAAICNwgAAAICN0gAAAICN4gAAAICN8gAAAICOAgAAAICOEgAAAICOIgAAAICOMgAAAICOQgAAAICOUgAAAICOYgAAAICOcgAAAICOggAAAICOkgAAAICOogAAAICOsgAAAICOwgAAAICO0gAAAICO4gAAAICO8gAAAICPAgAAAICPEgAAAICPIgAAAICPMgAAAICPQgAAAICPUgAAAICPYgAAAICPcgAAAICPggAAAICPkgAAAICPogAAAICPsgAAAICPwgAAAICP0gAAAICP4gAAAICP8gAAAICAAhAAAICAEhAAAICAIhAAAICAMhAAAICAQhAAAICAUhAAAICAYhAAAICAchAAAICAghAAAICAkhAAAICAohAAAICAshAAAICAwhAAAICA0hAAAICA4hAAAICA8hAAAICBAhAAAICBEhAAAICBIhAAAICBMhAAAICBQhAAAICBUhAAAICBYhAAAICBchAAAICBghAAAICBkhAAAICBohAAAICBshAAAICBwhAAAICB0hAAAICB4hAAAICB8hAAAICCAhAAAICCEhAAAICCIhAAAICCMhAAAICCQhAAAICCUhAAAICCYhAAAICCchAAAICCghAAAICCkhAAAICCohAAAICCshAAAICCwhAAAICC0hAAAICC4hAAAICC8hAAAICDAhAAAICDEhAAAICDIhAAAICDMhAAAICDQhAAAICDUhAAAICDYhAAAICDchAAAICDghAAAICDkhAAAICDohAAAICDshAAAICDwhAAAICD0hAAAICD4hAAAICD8hAAAICEAhAAAICEEhAAAICEIhAAAICEMhAAAICEQhAAAICEUhAAAICEYhAAAICEchAAAICEghAAAICEkhAAAICEohAAAICEshAAAICEwhAAAICE0hAAAICE4hAAAICE8hAAAICFAhAAAICFEhAAAICFIhAAAICFMhAAAICFQhAAAICFUhAAAICFYhAAAICFchAAAICFghAAAICFkhAAAICFohAAAICFshAAAICFwhAAAICF0hAAAICF4hAAAICF8hAAAICGAhAAAICGEhAAAICGIhAAAICGMhAAAICGQhAAAICGUhAAAICGYhAAAICGchAAAICGghAAAICGkhAAAICGohAAAICGshAAAICGwhAAAICG0hAAAICG4hAAAICG8hAAAICHAhAAAICHEhAAAICHIhAAAICHMhAAAICHQhAAAICHUhAAAICHYhAAAICHchAAAICHghAAAICHkhAAAICHohAAAICHshAAAICHwhAAAICH0hAAAICH4hAAAICH8hAAAICIAhAAAICIEhAAAICIIhAAAICIMhAAAICIQhAAAICIUhAAAICIYhAAAICIchAAAICIghAAAICIkhAAAICIohAAAICIshAAAICIwhAAAICI0hAAAICI4hAAAICI8hAAAICJAhAAAICJEhAAAICJIhAAAICJMhAAAICJQhAAAICJUhAAAICJYhAAAICJchAAAICJghAAAICJkhAAAICJohAAAICJshAAAICJwhAAAICJ0hAAAICJ4hAAAICJ8hAAAICKAhAAAICKEhAAAICKIhAAAICKMhAAAICKQhAAAICKUhAAAICKYhAAAICKchAAAICKghAAAICKkhAAAICKohAAAICKshAAAICKwhAAAICK0hAAAICK4hAAAICK8hAAAICLAhAAAICLEhAAAICLIhAAAICLMhAAAICLQhAAAICLUhAAAICLYhAAAICLchAAAICLghAAAICLkhAAAICLohAAAICLshAAAICLwhAAAICL0hAAAICL4hAAAICL8hAAAICMAhAAAICMEhAAAICMIhAAAICMMhAAAICMQhAAAICMUhAAAICMYhAAAICMchAAAICMghAAAICMkhAAAICMohAAAICMshAAAICMwhAAAICM0hAAAICM4hAAAICM8hAAAICNAhAAAICNEhAAAICNIhAAAICNMhAAAICNQhAAAICNUhAAAICNYhAAAICNchAAAICNghAAAICNkhAAAICNohAAAICNshAAAICNwhAAAICN0hAAAICN4hAAAICN8hAAAICOAhAAAICOEhAAAICOIhAAAICOMhAAAICOQhAAAICOUhAAAICOYhAAAICOchAAAICOghAAAICOkhAAAICOohAAAICOshAAAICOwhAAAICO0hAAAICO4hAAAICO8hAAAICPAhAAAICPEhAAAICPIhAAAICPMhAAAICPQhAAAICPUhAAAICPYhAAAICPchAAAICPghAAAICPkhAAAICPohAAAICPshAAAICPwhAAAICP0hAAAICP4hAAAICP8hAAAICAAiAAAICAEiAAAICAIiAAAICAMiAAAICAQiAAAICAUiAAAICAYiAAAICAciAAAICAgiAAAICAkiAAAICAoiAAAICAsiAAAICAwiAAAICA0iAAAICA4iAAAICA8iAAAICBAiAAAICBEiAAAICBIiAAAICBMiAAAICBQiAAAICBUiAAAICBYiAAAICBciAAAICBgiAAAICBkiAAAICBoiAAAICBsiAAAICBwiAAAICB0iAAAICB4iAAAICB8iAAAICCAiAAAICCEiAAAICCIiAAAICCMiAAAICCQiAAAICCUiAAAICCYiAAAICCciAAAICCgiAAAICCkiAAAICCoiAAAICCsiAAAICCwiAAAICC0iAAAICC4iAAAICC8iAAAICDAiAAAICDEiAAAICDIiAAAICDMiAAAICDQiAAAICDUiAAAICDYiAAAICDciAAAICDgiAAAICDkiAAAICDoiAAAICDsiAAAICDwiAAAICD0iAAAICD4iAAAICD8iAAAICEAiAAAICEEiAAAICEIiAAAICEMiAAAICEQiAAAICEUiAAAICEYiAAAICEciAAAICEgiAAAICEkiAAAICEoiAAAICEsiAAAICEwiAAAICE0iAAAICE4iAAAICE8iAAAICFAiAAAICFEiAAAICFIiAAAICFMiAAAICFQiAAAICFUiAAAICFYiAAAICFciAAAICFgiAAAICFkiAAAICFoiAAAICFsiAAAICFwiAAAICF0iAAAICF4iAAAICF8iAAAICGAiAAAICGEiAAAICGIiAAAICGMiAAAICGQiAAAICGUiAAAICGYiAAAICGciAAAICGgiAAAICGkiAAAICGoiAAAICGsiAAAICGwiAAAICG0iAAAICG4iAAAICG8iAAAICHAiAAAICHEiAAAICHIiAAAICHMiAAAICHQiAAAICHUiAAAICHYiAAAICHciAAAICHgiAAAICHkiAAAICHoiAAAICHsiAAAICHwiAAAICH0iAAAICH4iAAAICH8iAAAICIAiAAAICIEiAAAICIIiAAAICIMiAAAICIQiAAAICIUiAAAICIYiAAAICIciAAAICIgiAAAICIkiAAAICIoiAAAICIsiAAAICIwiAAAICI0iAAAICI4iAAAICI8iAAAICJAiAAAICJEiAAAICJIiAAAICJMiAAAICJQiAAAICJUiAAAICJYiAAAICJciAAAICJgiAAAICJkiAAAICJoiAAAICJsiAAAICJwiAAAICJ0iAAAICJ4iAAAICJ8iAAAICKAiAAAICKEiAAAICKIiAAAICKMiAAAICKQiAAAICKUiAAAICKYiAAAICKciAAAICKgiAAAICKkiAAAICKoiAAAICKsiAAAICKwiAAAICK0iAAAICK4iAAAICK8iAAAICLAiAAAICLEiAAAICLIiAAAICLMiAAAICLQiAAAICLUiAAAICLYiAAAICLciAAAICLgiAAAICLkiAAAICLoiAAAICLsiAAAICLwiAAAICL0iAAAICL4iAAAICL8iAAAICMAiAAAICMEiAAAICMIiAAAICMMiAAAICMQiAAAICMUiAAAICMYiAAAICMciAAAICMgiAAAICMkiAAAICMoiAAAICMsiAAAICMwiAAAICM0iAAAICM4iAAAICM8iAAAICNAiAAAICNEiAAAICNIiAAAICNMiAAAICNQiAAAICNUiAAAICNYiAAAICNciAAAICNgiAAAICNkiAAAICNoiAAAICNsiAAAICNwiAAAICN0iAAAICN4iAAAICN8iAAAICOAiAAAICOEiAAAICOIiAAAICOMiAAAICOQiAAAICOUiAAAICOYiAAAICOciAAAICOgiAAAICOkiAAAICOoiAAAICOsiAAAICOwiAAAICO0iAAAICO4iAAAICO8iAAAICPAiAAAICPEiAAAICPIiAAAICPMiAAAICPQiAAAICPUiAAAICPYiAAAICPciAAAICPgiAAAICPkiAAAICPoiAAAICPsiAAAICPwiAAAICP0iAAAICP4iAAAICP8iAAAICAAjAAAICAEjAAAICAIjAAAICAMjAAAICAQjAAAICAUjAAAICAYjAAAICAcjAAAICAgjAAAICAkjAAAICAojAAAICAsjAAAICAwjAAAICA0jAAAICA4jAAAICA8jAAAICBAjAAAICBEjAAAICBIjAAAICBMjAAAICBQjAAAICBUjAAAICBYjAAAICBcjAAAICBgjAAAICBkjAAAICBojAAAICBsjAAAICBwjAAAICB0jAAAICB4jAAAICB8jAAAICCAjAAAICCEjAAAICCIjAAAICCMjAAAICCQjAAAICCUjAAAICCYjAAAICCcjAAAICCgjAAAICCkjAAAICCojAAAICCsjAAAICCwjAAAICC0jAAAICC4jAAAICC8jAAAICDAjAAAICDEjAAAICDIjAAAICDMjAAAICDQjAAAICDUjAAAICDYjAAAICDcjAAAICDgjAAAICDkjAAAICDojAAAICDsjAAAICDwjAAAICD0jAAAICD4jAAAICD8jAAAICEAjAAAICEEjAAAICEIjAAAICEMjAAAICEQjAAAICEUjAAAICEYjAAAICEcjAAAICEgjAAAICEkjAAAICEojAAAICEsjAAAICEwjAAAICE0jAAAICE4jAAAICE8jAAAICFAjAAAICFEjAAAICFIjAAAICFMjAAAICFQjAAAICFUjAAAICFYjAAAICFcjAAAICFgjAAAICFkjAAAICFojAAAICFsjAAAICFwjAAAICF0jAAAICF4jAAAICF8jAAAICGAjAAAICGEjAAAICGIjAAAICGMjAAAICGQjAAAICGUjAAAICGYjAAAICGcjAAAICGgjAAAICGkjAAAICGojAAAICGsjAAAICGwjAAAICG0jAAAICG4jAAAICG8jAAAICHAjAAAICHEjAAAICHIjAAAICHMjAAAICHQjAAAICHUjAAAICHYjAAAICHcjAAAICHgjAAAICHkjAAAICHojAAAICHsjAAAICHwjAAAICH0jAAAICH4jAAAICH8jAAAICIAjAAAICIEjAAAICIIjAAAICIMjAAAICIQjAAAICIUjAAAICIYjAAAICIcjAAAICIgjAAAICIkjAAAICIojAAAICIsjAAAICIwjAAAICI0jAAAICI4jAAAICI8jAAAICJAjAAAICJEjAAAICJIjAAAICJMjAAAICJQjAAAICJUjAAAICJYjAAAICJcjAAAICJgjAAAICJkjAAAICJojAAAICJsjAAAICJwjAAAICJ0jAAAICJ4jAAAICJ8jAAAICKAjAAAICKEjAAAICKIjAAAICKMjAAAICKQjAAAICKUjAAAICKYjAAAICKcjAAAICKgjAAAICKkjAAAICKojAAAICKsjAAAICKwjAAAICK0jAAAICK4jAAAICK8jAAAICLAjAAAICLEjAAAICLIjAAAICLMjAAAICLQjAAAICLUjAAAICLYjAAAICLcjAAAICLgjAAAICLkjAAAICLojAAAICLsjAAAICLwjAAAICL0jAAAICL4jAAAICL8jAAAICMAjAAAICMEjAAAICMIjAAAICMMjAAAICMQjAAAICMUjAAAICMYjAAAICMcjAAAICMgjAAAICMkjAAAICMojAAAICMsjAAAICMwjAAAICM0jAAAICM4jAAAICM8jAAAICNAjAAAICNEjAAAICNIjAAAICNMjAAAICNQjAAAICNUjAAAICNYjAAAICNcjAAAICNgjAAAICNkjAAAICNojAAAICNsjAAAICNwjAAAICN0jAAAICN4jAAAICN8jAAAICOAjAAAICOEjAAAICOIjAAAICOMjAAAICOQjAAAICOUjAAAICOYjAAAICOcjAAAICOgjAAAICOkjAAAICOojAAAICOsjAAAICOwjAAAICO0jAAAICO4jAAAICO8jAAAICPAjAAAICPEjAAAICPIjAAAICPMjAAAICPQjAAAICPUjAAAICPYjAAAICPcjAAAICPgjAAAICPkjAAAICPojAAAICPsjAAAICPwjAAAICP0jAAAICP4jAAAICP8jAAAICAAkAAAICAEkAAAICAIkAAAICAMkAAAICAQkAAAICAUkAAAICAYkAAAICAckAAAICAgkAAAICAkkAAAICAokAAAICAskAAAICAwkAAAICA0kAAAICA4kAAAICA8kAAAICBAkAAAICBEkAAAICBIkAAAICBMkAAAICBQkAAAICBUkAAAICBYkAAAICBckAAAICBgkAAAICBkkAAAICBokAAAICBskAAAICBwkAAAICB0kAAAICB4kAAAICB8kAAAICCAkAAAICCEkAAAICCIkAAAICCMkAAAICCQkAAAICCUkAAAICCYkAAAICCckAAAICCgkAAAICCkkAAAICCokAAAICCskAAAICCwkAAAICC0kAAAICC4kAAAICC8kAAAICDAkAAAICDEkAAAICDIkAAAICDMkAAAICDQkAAAICDUkAAAICDYkAAAICDckAAAICDgkAAAICDkkAAAICDokAAAICDskAAAICDwkAAAICD0kAAAICD4kAAAICD8kAAAICEAkAAAICEEkAAAICEIkAAAICEMkAAAICEQkAAAICEUkAAAICEYkAAAICEckAAAICEgkAAAICEkkAAAICEokAAAICEskAAAICEwkAAAICE0kAAAICE4kAAAICE8kAAAICFAkAAAICFEkAAAICFIkAAAICFMkAAAICFQkAAAICFUkAAAICFYkAAAICFckAAAICFgkAAAICFkkAAAICFokAAAICFskAAAICFwkAAAICF0kAAAICF4kAAAICF8kAAAICGAkAAAICGEkAAAICGIkAAAICGMkAAAICGQkAAAICGUkAAAICGYkAAAICGckAAAICGgkAAAICGkkAAAICGokAAAICGskAAAICGwkAAAICG0kAAAICG4kAAAICG8kAAAICHAkAAAICHEkAAAICHIkAAAICHMkAAAICHQkAAAICHUkAAAICHYkAAAICHckAAAICHgkAAAICHkkAAAICHokAAAICHskAAAICHwkAAAICH0kAAAICH4kAAAICH8kAAAICIAkAAAICIEkAAAICIIkAAAICIMkAAAICIQkAAAICIUkAAAICIYkAAAICIckAAAICIgkAAAICIkkAAAICIokAAAICIskAAAICIwkAAAICI0kAAAICI4kAAAICI8kAAAICJAkAAAICJEkAAAICJIkAAAICJMkAAAICJQkAAAICJUkAAAICJYkAAAICJckAAAICJgkAAAICJkkAAAICJokAAAICJskAAAICJwkAAAICJ0kAAAICJ4kAAAICJ8kAAAICKAkAAAICKEkAAAICKIkAAAICKMkAAAICKQkAAAICKUkAAAICKYkAAAICKckAAAICKgkAAAICKkkAAAICKokAAAICKskAAAICKwkAAAICK0kAAAICK4kAAAICK8kAAAICLAkAAAICLEkAAAICLIkAAAICLMkAAAICLQkAAAICLUkAAAICLYkAAAICLckAAAICLgkAAAICLkkAAAICLokAAAICLskAAAICLwkAAAICL0kAAAICL4kAAAICL8kAAAICMAkAAAICMEkAAAICMIkAAAICMMkAAAICMQkAAAICMUkAAAICMYkAAAICMckAAAICMgkAAAICMkkAAAICMokAAAICMskAAAICMwkAAAICM0kAAAICM4kAAAICM8kAAAICNAkAAAICNEkAAAICNIkAAAICNMkAAAICNQkAAAICNUkAAAICNYkAAAICNckAAAICNgkAAAICNkkAAAICNokAAAICNskAAAICNwkAAAICN0kAAAICN4kAAAICN8kAAAICOAkAAAICOEkAAAICOIkAAAICOMkAAAICOQkAAAICOUkAAAICOYkAAAICOckAAAICOgkAAAICOkkAAAICOokAAAICOskAAAICOwkAAAICO0kAAAICO4kAAAICO8kAAAICPAkAAAICPEkAAAICPIkAAAICPMkAAAICPQkAAAICPUkAAAICPYkAAAICPckAAAICPgkAAAICPkkAAAICPokAAAICPskAAAICPwkAAAICP0kAAAICP4kAAAICP8kAAAICAAlAAAICAElAAAICAIlAAAICAMlAAAICAQlAAAICAUlAAAICAYlAAAICAclAAAICAglAAAICAklAAAICAolAAAICAslAAAICAwlAAAICA0lAAAICA4lAAAICA8lAAAICBAlAAAICBElAAAICBIlAAAICBMlAAAICBQlAAAICBUlAAAICBYlAAAICBclAAAICBglAAAICBklAAAICBolAAAICBslAAAICBwlAAAICB0lAAAICB4lAAAICB8lAAAICCAlAAAICCElAAAICCIlAAAICCMlAAAICCQlAAAICCUlAAAICCYlAAAICCclAAAICCglAAAICCklAAAICColAAAICCslAAAICCwlAAAICC0lAAAICC4lAAAICC8lAAAICDAlAAAICDElAAAICDIlAAAICDMlAAAICDQlAAAICDUlAAAICDYlAAAICDclAAAICDglAAAICDklAAAICDolAAAICDslAAAICDwlAAAICD0lAAAICD4lAAAICD8lAAAICEAlAAAICEElAAAICEIlAAAICEMlAAAICEQlAAAICEUlAAAICEYlAAAICEclAAAICEglAAAICEklAAAICEolAAAICEslAAAICEwlAAAICE0lAAAICE4lAAAICE8lAAAICFAlAAAICFElAAAICFIlAAAICFMlAAAICFQlAAAICFUlAAAICFYlAAAICFclAAAICFglAAAICFklAAAICFolAAAICFslAAAICFwlAAAICF0lAAAICF4lAAAICF8lAAAICGAlAAAICGElAAAICGIlAAAICGMlAAAICGQlAAAICGUlAAAICGYlAAAICGclAAAICGglAAAICGklAAAICGolAAAICGslAAAICGwlAAAICG0lAAAICG4lAAAICG8lAAAICHAlAAAICHElAAAICHIlAAAICHMlAAAICHQlAAAICHUlAAAICHYlAAAICHclAAAICHglAAAICHklAAAICHolAAAICHslAAAICHwlAAAICH0lAAAICH4lAAAICH8lAAAICIAlAAAICIElAAAICIIlAAAICIMlAAAICIQlAAAICIUlAAAICIYlAAAICIclAAAICIglAAAICIklAAAICIolAAAICIslAAAICIwlAAAICI0lAAAICI4lAAAICI8lAAAICJAlAAAICJElAAAICJIlAAAICJMlAAAICJQlAAAICJUlAAAICJYlAAAICJclAAAICJglAAAICJklAAAICJolAAAICJslAAAICJwlAAAICJ0lAAAICJ4lAAAICJ8lAAAICKAlAAAICKElAAAICKIlAAAICKMlAAAICKQlAAAICKUlAAAICKYlAAAICKclAAAICKglAAAICKklAAAICKolAAAICKslAAAICKwlAAAICK0lAAAICK4lAAAICK8lAAAICLAlAAAICLElAAAICLIlAAAICLMlAAAICLQlAAAICLUlAAAICLYlAAAICLclAAAICLglAAAICLklAAAICLolAAAICLslAAAICLwlAAAICL0lAAAICL4lAAAICL8lAAAICMAlAAAICMElAAAICMIlAAAICMMlAAAICMQlAAAICMUlAAAICMYlAAAICMclAAAICMglAAAICMklAAAICMolAAAICMslAAAICMwlAAAICM0lAAAICM4lAAAICM8lAAAICNAlAAAICNElAAAICNIlAAAICNMlAAAICNQlAAAICNUlAAAICNYlAAAICNclAAAICNglAAAICNklAAAICNolAAAICNslAAAICNwlAAAICN0lAAAICN4lAAAICN8lAAAICOAlAAAICOElAAAICOIlAAAICOMlAAAICOQlAAAICOUlAAAICOYlAAAICOclAAAICOglAAAICOklAAAICOolAAAICOslAAAICOwlAAAICO0lAAAICO4lAAAICO8lAAAICPAlAAAICPElAAAICPIlAAAICPMlAAAICPQlAAAICPUlAAAICPYlAAAICPclAAAICPglAAAICPklAAAICPolAAAICPslAAAICPwlAAAICP0lAAAICP4lAAAICP8lAAAICAAmAAAICAEmAAAICAImAAAICAMmAAAICAQmAAAICAUmAAAICAYmAAAICAcmAAAICAgmAAAICAkmAAAICAomAAAICAsmAAAICAwmAAAICA0mAAAICA4mAAAICA8mAAAICBAmAAAICBEmAAAICBImAAAICBMmAAAICBQmAAAICBUmAAAICBYmAAAICBcmAAAICBgmAAAICBkmAAAICBomAAAICBsmAAAICBwmAAAICB0mAAAICB4mAAAICB8mAAAICCAmAAAICCEmAAAICCImAAAICCMmAAAICCQmAAAICCUmAAAICCYmAAAICCcmAAAICCgmAAAICCkmAAAICComAAAICCsmAAAICCwmAAAICC0mAAAICC4mAAAICC8mAAAICDAmAAAICDEmAAAICDImAAAICDMmAAAICDQmAAAICDUmAAAICDYmAAAICDcmAAAICDgmAAAICDkmAAAICDomAAAICDsmAAAICDwmAAAICD0mAAAICD4mAAAICD8mAAAICEAmAAAICEEmAAAICEImAAAICEMmAAAICEQmAAAICEUmAAAICEYmAAAICEcmAAAICEgmAAAICEkmAAAICEomAAAICEsmAAAICEwmAAAICE0mAAAICE4mAAAICE8mAAAICFAmAAAICFEmAAAICFImAAAICFMmAAAICFQmAAAICFUmAAAICFYmAAAICFcmAAAICFgmAAAICFkmAAAICFomAAAICFsmAAAICFwmAAAICF0mAAAICF4mAAAICF8mAAAICGAmAAAICGEmAAAICGImAAAICGMmAAAICGQmAAAICGUmAAAICGYmAAAICGcmAAAICGgmAAAICGkmAAAICGomAAAICGsmAAAICGwmAAAICG0mAAAICG4mAAAICG8mAAAICHAmAAAICHEmAAAICHImAAAICHMmAAAICHQmAAAICHUmAAAICHYmAAAICHcmAAAICHgmAAAICHkmAAAICHomAAAICHsmAAAICHwmAAAICH0mAAAICH4mAAAICH8mAAAICIAmAAAICIEmAAAICIImAAAICIMmAAAICIQmAAAICIUmAAAICIYmAAAICIcmAAAICIgmAAAICIkmAAAICIomAAAICIsmAAAICIwmAAAICI0mAAAICI4mAAAICI8mAAAICJAmAAAICJEmAAAICJImAAAICJMmAAAICJQmAAAICJUmAAAICJYmAAAICJcmAAAICJgmAAAICJkmAAAICJomAAAICJsmAAAICJwmAAAICJ0mAAAICJ4mAAAICJ8mAAAICKAmAAAICKEmAAAICKImAAAICKMmAAAICKQmAAAICKUmAAAICKYmAAAICKcmAAAICKgmAAAICKkmAAAICKomAAAICKsmAAAICKwmAAAICK0mAAAICK4mAAAICK8mAAAICLAmAAAICLEmAAAICLImAAAICLMmAAAICLQmAAAICLUmAAAICLYmAAAICLcmAAAICLgmAAAICLkmAAAICLomAAAICLsmAAAICLwmAAAICL0mAAAICL4mAAAICL8mAAAICMAmAAAICMEmAAAICMImAAAICMMmAAAICMQmAAAICMUmAAAICMYmAAAICMcmAAAICMgmAAAICMkmAAAICMomAAAICMsmAAAICMwmAAAICM0mAAAICM4mAAAICM8mAAAICNAmAAAICNEmAAAICNImAAAICNMmAAAICNQmAAAICNUmAAAICNYmAAAICNcmAAAICNgmAAAICNkmAAAICNomAAAICNsmAAAICNwmAAAICN0mAAAICN4mAAAICN8mAAAICOAmAAAICOEmAAAICOImAAAICOMmAAAICOQmAAAICOUmAAAICOYmAAAICOcmAAAICOgmAAAICOkmAAAICOomAAAICOsmAAAICOwmAAAICO0mAAAICO4mAAAICO8mAAAICPAmAAAICPEmAAAICPImAAAICPMmAAAICPQmAAAICPUmAAAICPYmAAAICPcmAAAICPgmAAAICPkmAAAICPomAAAICPsmAAAICPwmAAAICP0mAAAICP4mAAAICP8mAAAICAAnAAAICAEnAAAICAInAAAICAMnAAAICAQnAAAICAUnAAAICAYnAAAICAcnAAAICAgnAAAICAknAAAICAonAAAICAsnAAAICAwnAAAICA0nAAAICA4nAAAICA8nAAAL" } };
// fewer than 256 nulls
- yield return new object[] { new object[200], new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAAMgAAAANyAs=", "AAEAAAD/////AQAAAAAAAAAQAQAAAMgAAAANyAs=" } };
+ yield return new object[] { new object[200], new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAAMgAAAANyAs=", "AAEAAAD/////AQAAAAAAAAAQAQAAAMgAAAANyAs=" } };
// more than 256 nulls
- yield return new object[] { new object[300], new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAACwBAAAOLAEAAAs=", "AAEAAAD/////AQAAAAAAAAAQAQAAACwBAAAOLAEAAAs=" } };
+ yield return new object[] { new object[300], new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAACwBAAAOLAEAAAs=", "AAEAAAD/////AQAAAAAAAAAQAQAAACwBAAAOLAEAAAs=" } };
// Non-vector arrays
if (PlatformDetection.IsNonZeroLowerBoundArraySupported)
@@ -226,21 +409,32 @@ namespace System.Runtime.Serialization.Formatters.Tests
{
var arr = Array.CreateInstance(typeof(string), new[] { 1, 2 }, new[] { 3, 4 });
arr.SetValue("hello", new[] { 3, 5 });
- yield return new object[] { arr, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkHAQAAAAUCAAAAAQAAAAIAAAADAAAABAAAAAEKBgMAAAAFaGVsbG8L", "AAEAAAD/////AQAAAAAAAAAHAQAAAAUCAAAAAQAAAAIAAAADAAAABAAAAAEKBgIAAAAFaGVsbG8L" } };
+ yield return new object[] { arr, new string[] { "AAEAAAD/////AQAAAAAAAAAHAQAAAAUCAAAAAQAAAAIAAAADAAAABAAAAAEKBgIAAAAFaGVsbG8L", "AAEAAAD/////AQAAAAAAAAAHAQAAAAUCAAAAAQAAAAIAAAADAAAABAAAAAEKBgIAAAAFaGVsbG8L" } };
}
// Globalization types
- yield return new object[] { CultureInfo.InvariantCulture.CompareInfo, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwIAAAAGbV9uYW1lDW1fc29ydFZlcnNpb24BBCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgIAAAACAAAABgMAAAAACgs=", "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GAgAAAAAAAAAAfwAAAAoL" } };
- yield return new object[] { new SortVersion(12345, Guid.Parse("9fac6fbb-f683-42f5-a593-0d4a5e34b257")), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgIAAAAMbV9ObHNWZXJzaW9uCG1fU29ydElkAAQIC1N5c3RlbS5HdWlkAgAAAAIAAAA5MAAABf3///8LU3lzdGVtLkd1aWQLAAAAAl9hAl9iAl9jAl9kAl9lAl9mAl9nAl9oAl9pAl9qAl9rAAAAAAAAAAAAAAAIBwcCAgICAgICAgIAAAC7b6yfg/b1QqWTDUpeNLJXCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgIAAAAMbV9ObHNWZXJzaW9uCG1fU29ydElkAAMIC1N5c3RlbS5HdWlkOTAAAAT+////C1N5c3RlbS5HdWlkCwAAAAJfYQJfYgJfYwJfZAJfZQJfZgJfZwJfaAJfaQJfagJfawAAAAAAAAAAAAAACAcHAgICAgICAgK7b6yfg/b1QqWTDUpeNLJXCw==" } };
+
+ // CultureInfo.InvariantCulture.CompareInfo has fields which get lazy initialized
+ var invariantCultureCompareInfoNoVersion = new CultureInfo("").CompareInfo;
+ var invariantCultureCompareInfoWithVersion = new CultureInfo("").CompareInfo;
+
+ // Do not remove this check. This will cause the field to get initialized
+ Assert.NotNull(invariantCultureCompareInfoWithVersion.Version);
+
+ yield return new object[] { invariantCultureCompareInfoNoVersion, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwIAAAAGbV9uYW1lDW1fU29ydFZlcnNpb24BAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYCAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GAgAAAAAAAAAAfwAAAAoL" } };
+ yield return new object[] { invariantCultureCompareInfoWithVersion, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwIAAAAGbV9uYW1lDW1fU29ydFZlcnNpb24BAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYCAAAAAAkDAAAABAMAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24CAAAADG1fTmxzVmVyc2lvbghtX1NvcnRJZAADCAtTeXN0ZW0uR3VpZAAAAAAE/P///wtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICAAAAAAAAAAAAAAAAAAAAfws=", "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GAgAAAAAAAAAAfwAAAAkDAAAABAMAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24CAAAADG1fTmxzVmVyc2lvbghtX1NvcnRJZAADCAtTeXN0ZW0uR3VpZA4CBgAE/P///wtTeXN0ZW0uR3VpZAsAAAACX2ECX2ICX2MCX2QCX2UCX2YCX2cCX2gCX2kCX2oCX2sAAAAAAAAAAAAAAAgHBwICAgICAgICAQAAAO5XXB4AtNAAC7HhHgs=" } };
+
+ yield return new object[] { new SortVersion(12345, Guid.Parse("9fac6fbb-f683-42f5-a593-0d4a5e34b257")), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgIAAAAMbV9ObHNWZXJzaW9uCG1fU29ydElkAAMIC1N5c3RlbS5HdWlkOTAAAAT+////C1N5c3RlbS5HdWlkCwAAAAJfYQJfYgJfYwJfZAJfZQJfZgJfZwJfaAJfaQJfagJfawAAAAAAAAAAAAAACAcHAgICAgICAgK7b6yfg/b1QqWTDUpeNLJXCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgIAAAAMbV9ObHNWZXJzaW9uCG1fU29ydElkAAMIC1N5c3RlbS5HdWlkOTAAAAT+////C1N5c3RlbS5HdWlkCwAAAAJfYQJfYgJfYwJfZAJfZQJfZgJfZwJfaAJfaQJfagJfawAAAAAAAAAAAAAACAcHAgICAgICAgK7b6yfg/b1QqWTDUpeNLJXCw==" } };
// Drawing types
- yield return new object[] { new System.Drawing.Point(10, 10), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAUU3lzdGVtLkRyYXdpbmcuUG9pbnQCAAAAAXgBeQAACAgCAAAACgAAAAoAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Qb2ludAIAAAABeAF5AAAICAIAAAAKAAAACgAAAAs=" } };
- yield return new object[] { System.Drawing.Color.FromArgb(255, 100, 55, 255), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcCAAAACv83ZP8AAAAAAAACAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgQAAAAEbmFtZQV2YWx1ZQprbm93bkNvbG9yBXN0YXRlAQAAAAkHBwIAAAAK/zdk/wAAAAAAAAIACw==" } };
- yield return new object[] { new System.Drawing.PointF(10.5f, 10.25f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAVU3lzdGVtLkRyYXdpbmcuUG9pbnRGAgAAAAF4AXkAAAsLAgAAAAAAKEEAACRBCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJhd2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAoQQAAJEEL" } };
- yield return new object[] { new System.Drawing.Rectangle(10, 10, 100, 50), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAYU3lzdGVtLkRyYXdpbmcuUmVjdGFuZ2xlBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAgICAgCAAAACgAAAAoAAABkAAAAMgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABhTeXN0ZW0uRHJhd2luZy5SZWN0YW5nbGUEAAAAAXgBeQV3aWR0aAZoZWlnaHQAAAAACAgICAIAAAAKAAAACgAAAGQAAAAyAAAACw==" } };
- yield return new object[] { new System.Drawing.RectangleF(10.5f, 10.5f, 52.3f, 69.4f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAZU3lzdGVtLkRyYXdpbmcuUmVjdGFuZ2xlRgQAAAABeAF5BXdpZHRoBmhlaWdodAAAAAALCwsLAgAAAAAAKEEAAChBMzNRQs3MikIL", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJhd2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAoQQAAKEEzM1FCzcyKQgs=" } };
- yield return new object[] { new System.Drawing.Size(10, 45), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAATU3lzdGVtLkRyYXdpbmcuU2l6ZQIAAAAFd2lkdGgGaGVpZ2h0AAAICAIAAAAKAAAALQAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAgAAAAoAAAAtAAAACw==" } };
- yield return new object[] { new System.Drawing.SizeF(10.2f, 45.8f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAUU3lzdGVtLkRyYXdpbmcuU2l6ZUYCAAAABXdpZHRoBmhlaWdodAAACwsCAAAAMzMjQTMzN0IL", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5TaXplRgIAAAAFd2lkdGgGaGVpZ2h0AAALCwIAAAAzMyNBMzM3Qgs=" } };
+ yield return new object[] { new System.Drawing.Point(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Qb2ludAIAAAABeAF5AAAICAIAAAAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Qb2ludAIAAAABeAF5AAAICAIAAAAAAAAAAAAAAAs=" } };
+ yield return new object[] { new System.Drawing.Point(10, 10), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Qb2ludAIAAAABeAF5AAAICAIAAAAKAAAACgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Qb2ludAIAAAABeAF5AAAICAIAAAAKAAAACgAAAAs=" } };
+ yield return new object[] { System.Drawing.Color.FromArgb(255, 100, 55, 255), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgQAAAAEbmFtZQV2YWx1ZQprbm93bkNvbG9yBXN0YXRlAQAAAAkHBwIAAAAK/zdk/wAAAAAAAAIACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgQAAAAEbmFtZQV2YWx1ZQprbm93bkNvbG9yBXN0YXRlAQAAAAkHBwIAAAAK/zdk/wAAAAAAAAIACw==" } };
+ yield return new object[] { new System.Drawing.PointF(10.5f, 10.25f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJhd2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAoQQAAJEEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJhd2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAoQQAAJEEL" } };
+ yield return new object[] { new System.Drawing.Rectangle(10, 10, 100, 50), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABhTeXN0ZW0uRHJhd2luZy5SZWN0YW5nbGUEAAAAAXgBeQV3aWR0aAZoZWlnaHQAAAAACAgICAIAAAAKAAAACgAAAGQAAAAyAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABhTeXN0ZW0uRHJhd2luZy5SZWN0YW5nbGUEAAAAAXgBeQV3aWR0aAZoZWlnaHQAAAAACAgICAIAAAAKAAAACgAAAGQAAAAyAAAACw==" } };
+ yield return new object[] { new System.Drawing.RectangleF(10.5f, 10.5f, 52.3f, 69.4f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJhd2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAoQQAAKEEzM1FCzcyKQgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJhd2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAoQQAAKEEzM1FCzcyKQgs=" } };
+ yield return new object[] { new System.Drawing.Size(10, 45), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAgAAAAoAAAAtAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAgAAAAoAAAAtAAAACw==" } };
+ yield return new object[] { new System.Drawing.SizeF(10.2f, 45.8f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABRTeXN0ZW0uRHJhd2luZy5TaXplRgIAAAAFd2lkdGgGaGVpZ2h0AAALCwIAAAAzMyNBMzM3Qgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABRTeXN0ZW0uRHJhd2luZy5TaXplRgIAAAAFd2lkdGgGaGVpZ2h0AAALCwIAAAAzMyNBMzM3Qgs=" } };
// Custom object
var sealedObjectWithIntStringFields = new SealedObjectWithIntStringFields();
@@ -272,34 +466,35 @@ namespace System.Runtime.Serialization.Formatters.Tests
yield return new object[] { point, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAgAAAAEAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAgAAAAEAAAACAAAACw==" } };
// Collections
- yield return new object[] { new System.Collections.BitArray(5, true), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQml0QXJyYXkDAAAAB21fYXJyYXkIbV9sZW5ndGgIX3ZlcnNpb24HAAAICAgCAAAACQMAAAAFAAAAAAAAAA8DAAAAAQAAAAj/////Cw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQml0QXJyYXkDAAAAB21fYXJyYXkIbV9sZW5ndGgIX3ZlcnNpb24HAAAICAgJAgAAAAUAAAAAAAAADwIAAAABAAAACP////8L" } };
- yield return new object[] { new System.Collections.ArrayList(Enumerable.Range(1, 40).ToList()), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAIAAAAJAwAAACgAAAABAAAAEAMAAAAoAAAACAgBAAAACAgCAAAACAgDAAAACAgEAAAACAgFAAAACAgGAAAACAgHAAAACAgIAAAACAgJAAAACAgKAAAACAgLAAAACAgMAAAACAgNAAAACAgOAAAACAgPAAAACAgQAAAACAgRAAAACAgSAAAACAgTAAAACAgUAAAACAgVAAAACAgWAAAACAgXAAAACAgYAAAACAgZAAAACAgaAAAACAgbAAAACAgcAAAACAgdAAAACAgeAAAACAgfAAAACAggAAAACAghAAAACAgiAAAACAgjAAAACAgkAAAACAglAAAACAgmAAAACAgnAAAACAgoAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAKAAAAAEAAAAQAgAAACgAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAL" } };
- yield return new object[] { new System.Collections.ArrayList(10), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAIAAAAJAwAAAAAAAAAAAAAAEAMAAAAKAAAADQoL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAoAAAANCgs=" } };
- yield return new object[] { new System.Collections.Comparer(CultureInfo.InvariantCulture), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADptc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAbU3lzdGVtLkNvbGxlY3Rpb25zLkNvbXBhcmVyAQAAAAtDb21wYXJlSW5mbwQgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8DAAAAAgAAAAkEAAAABQQAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8CAAAABm1fbmFtZQ1tX3NvcnRWZXJzaW9uAQQgU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24DAAAAAwAAAAYFAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAEAQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIBAAAAC0NvbXBhcmVJbmZvAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwkCAAAABAIAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8EAAAABm1fbmFtZQl3aW4zMkxDSUQHY3VsdHVyZQ1tX1NvcnRWZXJzaW9uAQAAAwgIIFN5c3RlbS5HbG9iYWxpemF0aW9uLlNvcnRWZXJzaW9uBgMAAAAAAAAAAH8AAAAKCw==" } };
- yield return new object[] { new System.Collections.DictionaryEntry("key", 5), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACJTeXN0ZW0uQ29sbGVjdGlvbnMuRGljdGlvbmFyeUVudHJ5AgAAAARfa2V5Bl92YWx1ZQICAgAAAAYDAAAAA2tleQgIBQAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uQ29sbGVjdGlvbnMuRGljdGlvbmFyeUVudHJ5AgAAAARfa2V5Bl92YWx1ZQICBgIAAAADa2V5CAgFAAAACw==" } };
- yield return new object[] { Comparer<int>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
- yield return new object[] { new HashSet<Point>(new[] { point }, new PointEqualityComparer()), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAD1TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCENhcGFjaXR5CEVsZW1lbnRzAAQABAhDU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50RXF1YWxpdHlDb21wYXJlcgMAAAAINVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAwAAAAIAAAABAAAACQQAAAADAAAACQUAAAAFBAAAAENTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRFcXVhbGl0eUNvbXBhcmVyAAAAAAMAAAAHBQAAAAABAAAAAQAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkGAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAADNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIIQ2FwYWNpdHkIRWxlbWVudHMABAAECENTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRFcXVhbGl0eUNvbXBhcmVyAwAAAAg1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAAAgAAAAEAAAAJBAAAAAMAAAAJBQAAAAUEAAAAQ1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludEVxdWFsaXR5Q29tcGFyZXIAAAAAAwAAAAcFAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQYAAAAFBgAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL" } };
- yield return new object[] { new KeyValuePair<int, string>(5, "five"), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAIAAAAFAAAABgMAAAAEZml2ZQs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAOMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAUAAAAGAgAAAARmaXZlCw==" } };
- yield return new object[] { new LinkedList<Point>(new[] { point }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADlTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OSAMAwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAADQAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAAB1ZlcnNpb24FQ291bnQERGF0YQAABAgINVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAwAAAAIAAAABAAAAAQAAAAkEAAAABwQAAAAAAQAAAAEAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAMAAAAJBQAAAAUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAMAAAABAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAA0AFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaW5rZWRMaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAdWZXJzaW9uBUNvdW50BERhdGEAAAQICDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAEAAAAJBAAAAAcEAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAFBQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL" } };
- yield return new object[] { new Queue<int>(Enumerable.Range(1, 25)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADhTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlF1ZXVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0FAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQhfdmVyc2lvbgcAAAAACAgICAgCAAAACQMAAAAAAAAAGQAAABkAAAAAAAAADwMAAAAgAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuUXVldWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAGX2FycmF5BV9oZWFkBV90YWlsBV9zaXplCF92ZXJzaW9uBwAAAAAICAgICAIAAAAJAwAAAAAAAAAZAAAAGQAAABwAAAAPAwAAACAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL" } };
- yield return new object[] { new Collections.Queue(50, 5.6f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgIAgAAAAkDAAAAAAAAAAAAAAAAAAAAMAIAAAAAAAAQAwAAADIAAAANMgs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAAAwAgAAAAAAABACAAAAMgAAAA0yCw==" } };
- //yield return new object[] { new SortedDictionary<int, Point>(pointDictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACyAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAAEX3NldASjA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAwEAAAAVVN5c3RlbS5Db2xsZWN0aW9ucywgVmVyc2lvbj00LjEuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAwAAAKMDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMABAADCMcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBAAAAAiwAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10CAAAAAgAAAAkFAAAAAgAAAAkGAAAADAcAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQUAAADHAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAALa2V5Q29tcGFyZXIEiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAAEAAAACQgAAAAHBgAAAAABAAAAAgAAAASuAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBwAAAAwKAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIF9////64CU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAA2tleQV2YWx1ZQAECDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQKAAAABwAAAAEAAAAJCwAAAAH0////9////wIAAAAJDQAAAAUIAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAHAAAABQsAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgICgAAAAEAAAABAAAAAQ0AAAALAAAAAgAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACyAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAAEX3NldASjA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAUDAAAAowNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5UcmVlU2V0YDFbW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgVJdGVtcwAEAAMIxwJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAACLACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV1bXQIAAAACAAAACQQAAAACAAAACQUAAAAFBAAAAMcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAQAAAAtrZXlDb21wYXJlcgOJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkGAAAABwUAAAAAAQAAAAIAAAADrgJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQwIAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIE+f///64CU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAA2tleQV2YWx1ZQAECDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQIAAAAAQAAAAkJAAAAAfb////5////AgAAAAkLAAAABAYAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAUJAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAgAAAABAAAAAQAAAAELAAAACQAAAAIAAAACAAAACw==" } };
- yield return new object[] { new SortedList<int, Point>(pointDictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgwEAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQwFAAAAVVN5c3RlbS5Db2xsZWN0aW9ucywgVmVyc2lvbj00LjEuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAKwCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkTGlzdGAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBwAAAARrZXlzBnZhbHVlcwVfc2l6ZQd2ZXJzaW9uCGNvbXBhcmVyB2tleUxpc3QJdmFsdWVMaXN0BwQAAAQEBAg1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAACAiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAALQCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkTGlzdGAyK0tleUxpc3RbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0FAAAAtgJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDIrVmFsdWVMaXN0W1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBQAAAAIAAAAJBgAAAAkHAAAAAgAAAAAAAAAJCAAAAAoKDwYAAAACAAAACAEAAAACAAAABwcAAAAAAQAAAAIAAAAEM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAMAAAAJCQAAAAkKAAAABQgAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAQAAAAFCQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAEAAAABCgAAAAkAAAACAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAArAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0HAAAABGtleXMGdmFsdWVzBV9zaXplB3ZlcnNpb24IY29tcGFyZXIHa2V5TGlzdAl2YWx1ZUxpc3QHBAAAAwQECDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAAICIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV20AlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMitLZXlMaXN0W1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAALYCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkTGlzdGAyK1ZhbHVlTGlzdFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAACAAAACQQAAAAJBQAAAAIAAAAAAAAACQYAAAAKCg8EAAAAAgAAAAgBAAAAAgAAAAcFAAAAAAEAAAACAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQcAAAAJCAAAAAQGAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAFBwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAEAAAABCAAAAAcAAAACAAAAAgAAAAs=" } };
- yield return new object[] { new Collections.SortedList(pointDictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAGBTeXN0ZW0uQ29sbGVjdGlvbnMuTm9uR2VuZXJpYywgVmVyc2lvbj00LjEuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAFX2tleXMHX3ZhbHVlcwVfc2l6ZQhfdmVyc2lvbglfY29tcGFyZXIIX2tleUxpc3QKX3ZhbHVlTGlzdAUFAAAEBAQICIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAJVN5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K0tleUxpc3QDAAAAJ1N5c3RlbS5Db2xsZWN0aW9ucy5Tb3J0ZWRMaXN0K1ZhbHVlTGlzdAMAAAACAAAACQQAAAAJBQAAAAIAAAAAAAAACQYAAAAKChAEAAAAAgAAAAgIAQAAAAgIAgAAABAFAAAAAgAAAAkHAAAACQgAAAAFBgAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAAAgAAAAwJAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIFBwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgJAAAAAQAAAAEAAAABCAAAAAcAAAACAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0lU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkDAAAAAgAAAAAAAAAJBAAAAAoKEAIAAAACAAAACAgBAAAACAgCAAAAEAMAAAACAAAACQUAAAAJBgAAAAQEAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAMBwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQUAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBwAAAAEAAAABAAAAAQYAAAAFAAAAAgAAAAIAAAAL" } };
- yield return new object[] { new SortedSet<Point>(new[] { point, new Point(3, 5) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAQAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzwFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMABAAECNUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAg1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10EAAAAAgAAAAEAAAAJBQAAAAAAAAAJBgAAAAUFAAAA1QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0AAAAAAwAAAAcGAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQEAAAACQcAAAAFBwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgEAAAAAQAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzwFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwAECNUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAkEAAAAAAAAAAkFAAAABAQAAADVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQAAAAAHBQAAAAABAAAAAQAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkGAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAACw==" } };
- yield return new object[] { new SortedSet<int?>(new int?[] { 2, 4, 6, null }, Comparer<int?>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADlAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMABAADCIoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAhwU3lzdGVtLk51bGxhYmxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQIAAAAEAAAACQQAAAAAAAAACQUAAAAFBAAAAIoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAMAAAAHBQAAAAABAAAABAAAAARuU3lzdGVtLk51bGxhYmxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAACggIAgAAAAgIBAAAAAgIBgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADlAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwADCIoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCHBTeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAQAAAAJAwAAAAAAAAAJBAAAAAQDAAAAigFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5OdWxsYWJsZUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwQAAAAAAQAAAAQAAAADblN5c3RlbS5OdWxsYWJsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCggIAgAAAAgIBAAAAAgIBgAAAAs=" } };
+ yield return new object[] { new System.Collections.BitArray(5, true), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQml0QXJyYXkDAAAAB21fYXJyYXkIbV9sZW5ndGgIX3ZlcnNpb24HAAAICAgJAgAAAAUAAAAAAAAADwIAAAABAAAACP////8L", "AAEAAAD/////AQAAAAAAAAAEAQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQml0QXJyYXkDAAAAB21fYXJyYXkIbV9sZW5ndGgIX3ZlcnNpb24HAAAICAgJAgAAAAUAAAAAAAAADwIAAAABAAAACP////8L" } };
+ yield return new object[] { new System.Collections.ArrayList(Enumerable.Range(1, 40).ToList()), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAKAAAAAEAAAAQAgAAACgAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAKAAAAAEAAAAQAgAAACgAAAAICAEAAAAICAIAAAAICAMAAAAICAQAAAAICAUAAAAICAYAAAAICAcAAAAICAgAAAAICAkAAAAICAoAAAAICAsAAAAICAwAAAAICA0AAAAICA4AAAAICA8AAAAICBAAAAAICBEAAAAICBIAAAAICBMAAAAICBQAAAAICBUAAAAICBYAAAAICBcAAAAICBgAAAAICBkAAAAICBoAAAAICBsAAAAICBwAAAAICB0AAAAICB4AAAAICB8AAAAICCAAAAAICCEAAAAICCIAAAAICCMAAAAICCQAAAAICCUAAAAICCYAAAAICCcAAAAICCgAAAAL" } };
+ yield return new object[] { new System.Collections.ArrayList(10), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAoAAAANCgs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAoAAAANCgs=" } };
+ yield return new object[] { new System.Collections.Comparer(new CultureInfo("")), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIBAAAAC0NvbXBhcmVJbmZvAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwkCAAAABAIAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8CAAAABm1fbmFtZQ1tX1NvcnRWZXJzaW9uAQMgU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GAwAAAAAKCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABtTeXN0ZW0uQ29sbGVjdGlvbnMuQ29tcGFyZXIBAAAAC0NvbXBhcmVJbmZvAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwkCAAAABAIAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8EAAAABm1fbmFtZQl3aW4zMkxDSUQHY3VsdHVyZQ1tX1NvcnRWZXJzaW9uAQAAAwgIIFN5c3RlbS5HbG9iYWxpemF0aW9uLlNvcnRWZXJzaW9uBgMAAAAAAAAAAH8AAAAKCw==" } };
+ yield return new object[] { new System.Collections.DictionaryEntry("key", 5), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uQ29sbGVjdGlvbnMuRGljdGlvbmFyeUVudHJ5AgAAAARfa2V5Bl92YWx1ZQICBgIAAAADa2V5CAgFAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uQ29sbGVjdGlvbnMuRGljdGlvbmFyeUVudHJ5AgAAAARfa2V5Bl92YWx1ZQICBgIAAAADa2V5CAgFAAAACw==" } };
+ yield return new object[] { Comparer<int>.Default, new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAACw==" } };
+ yield return new object[] { new HashSet<Point>(new[] { point }, new PointEqualityComparer()), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAADNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIIQ2FwYWNpdHkIRWxlbWVudHMABAAECENTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRFcXVhbGl0eUNvbXBhcmVyAwAAAAg1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAAAgAAAAEAAAAJBAAAAAMAAAAJBQAAAAUEAAAAQ1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludEVxdWFsaXR5Q29tcGFyZXIAAAAAAwAAAAcFAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQYAAAAFBgAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uQ29yZSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAADNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIIQ2FwYWNpdHkIRWxlbWVudHMABAAECENTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRFcXVhbGl0eUNvbXBhcmVyAwAAAAg1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAAAgAAAAEAAAAJBAAAAAMAAAAJBQAAAAUEAAAAQ1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludEVxdWFsaXR5Q29tcGFyZXIAAAAAAwAAAAcFAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQYAAAAFBgAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL" } };
+ yield return new object[] { new KeyValuePair<int, string>(5, "five"), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAUAAAAGAgAAAARmaXZlCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAOMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAUAAAAGAgAAAARmaXZlCw==" } };
+ yield return new object[] { new LinkedList<Point>(new[] { point }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAA0AFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaW5rZWRMaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAdWZXJzaW9uBUNvdW50BERhdGEAAAQICDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAEAAAAJBAAAAAcEAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAFBQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAA0AFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaW5rZWRMaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAwAAAAdWZXJzaW9uBUNvdW50BERhdGEAAAQICDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAEAAAAJBAAAAAcEAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAFBQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL" } };
+ yield return new object[] { new Queue<int>(Enumerable.Range(1, 25)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuUXVldWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAGX2FycmF5BV9oZWFkBV90YWlsBV9zaXplCF92ZXJzaW9uBwAAAAAICAgICAIAAAAJAwAAAAAAAAAZAAAAGQAAAAAAAAAPAwAAACAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuUXVldWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAGX2FycmF5BV9oZWFkBV90YWlsBV9zaXplCF92ZXJzaW9uBwAAAAAICAgICAIAAAAJAwAAAAAAAAAZAAAAGQAAABwAAAAPAwAAACAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL" } };
+ yield return new object[] { new Collections.Queue(50, 5.6f), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAAAwAgAAAAAAABACAAAAMgAAAA0yCw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuUXVldWUGAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQtfZ3Jvd0ZhY3RvcghfdmVyc2lvbgUAAAAAAAgICAgICQIAAAAAAAAAAAAAAAAAAAAwAgAAAAAAABACAAAAMgAAAA0yCw==" } };
+ yield return new object[] { new SortedDictionary<int, Point>(pointDictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACyAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAAEX3NldASjA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAwEAAAAVVN5c3RlbS5Db2xsZWN0aW9ucywgVmVyc2lvbj00LjEuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAwAAAKMDU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuVHJlZVNldGAxW1tTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMABAADCMcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBAAAAAiwAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10CAAAAAgAAAAkFAAAAAgAAAAkGAAAABQUAAADHAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMitLZXlWYWx1ZVBhaXJDb21wYXJlcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAALa2V5Q29tcGFyZXIDiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAJBwAAAAcGAAAAAAEAAAACAAAAA64CU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0MCQAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBPj///+uAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAANrZXkFdmFsdWUABAgzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50CQAAAAEAAAAJCgAAAAH1////+P///wIAAAAJDAAAAAQHAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAFCgAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgJAAAAAQAAAAEAAAABDAAAAAoAAAACAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACyAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZERpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQEAAAAEX3NldASjA1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlRyZWVTZXRgMVtbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAUDAAAAowNTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5UcmVlU2V0YDFbW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgVJdGVtcwAEAAMIxwJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWREaWN0aW9uYXJ5YDIrS2V5VmFsdWVQYWlyQ29tcGFyZXJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAACLACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV1bXQIAAAACAAAACQQAAAACAAAACQUAAAAFBAAAAMcCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkRGljdGlvbmFyeWAyK0tleVZhbHVlUGFpckNvbXBhcmVyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAQAAAAtrZXlDb21wYXJlcgOJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkGAAAABwUAAAAAAQAAAAIAAAADrgJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQwIAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIE+f///64CU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAA2tleQV2YWx1ZQAECDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQIAAAAAQAAAAkJAAAAAfb////5////AgAAAAkLAAAABAYAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAUJAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAgAAAABAAAAAQAAAAELAAAACQAAAAIAAAACAAAACw==" } };
+ yield return new object[] { new SortedList<int, Point>(pointDictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgwEAAAAVVN5c3RlbS5Db2xsZWN0aW9ucywgVmVyc2lvbj00LjEuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAKwCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkTGlzdGAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBwAAAARrZXlzBnZhbHVlcwVfc2l6ZQd2ZXJzaW9uCGNvbXBhcmVyB2tleUxpc3QJdmFsdWVMaXN0BwQAAAMEBAg1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAACAiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dtAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDIrS2V5TGlzdFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQQAAAC2AlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMitWYWx1ZUxpc3RbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAAAgAAAAkFAAAACQYAAAACAAAAAAAAAAkHAAAACgoPBQAAAAIAAAAIAQAAAAIAAAAHBgAAAAABAAAAAgAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkIAAAACQkAAAAEBwAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABQgAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAABAAAAAQkAAAAIAAAAAgAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAArAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0HAAAABGtleXMGdmFsdWVzBV9zaXplB3ZlcnNpb24IY29tcGFyZXIHa2V5TGlzdAl2YWx1ZUxpc3QHBAAAAwQECDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAAICIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV20AlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMitLZXlMaXN0W1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAALYCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkTGlzdGAyK1ZhbHVlTGlzdFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQIAAAACAAAACQQAAAAJBQAAAAIAAAAAAAAACQYAAAAKCg8EAAAAAgAAAAgBAAAAAgAAAAcFAAAAAAEAAAACAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQcAAAAJCAAAAAQGAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAFBwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAEAAAABCAAAAAcAAAACAAAAAgAAAAs=" } };
+ yield return new object[] { new Collections.SortedList(pointDictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0lU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkDAAAAAgAAAAAAAAAJBAAAAAoKEAIAAAACAAAACAgBAAAACAgCAAAAEAMAAAACAAAACQUAAAAJBgAAAAQEAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAMBwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQUAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBwAAAAEAAAABAAAAAQYAAAAFAAAAAgAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAB1TeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdAcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAUFAAADAwMICIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0lU3lzdGVtLkNvbGxlY3Rpb25zLlNvcnRlZExpc3QrS2V5TGlzdCdTeXN0ZW0uQ29sbGVjdGlvbnMuU29ydGVkTGlzdCtWYWx1ZUxpc3QJAgAAAAkDAAAAAgAAAAAAAAAJBAAAAAoKEAIAAAACAAAACAgBAAAACAgCAAAAEAMAAAACAAAACQUAAAAJBgAAAAQEAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAMBwAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQUAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBwAAAAEAAAABAAAAAQYAAAAFAAAAAgAAAAIAAAAL" } };
+ yield return new object[] { new SortedSet<Point>(new[] { point, new Point(3, 5) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzwFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwAECNUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAkEAAAAAAAAAAkFAAAABAQAAADVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQAAAAAHBQAAAAABAAAAAQAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkGAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzwFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRTZXRgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwAECNUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dCDVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQMAAAACAAAAAQAAAAkEAAAAAAAAAAkFAAAABAQAAADVAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQAAAAAHBQAAAAABAAAAAQAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkGAAAABQYAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIAwAAAAEAAAACAAAACw==" } };
+ yield return new object[] { new SortedSet<int?>(new int?[] { 2, 4, 6, null }, Comparer<int?>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADlAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwADCIoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCHBTeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAQAAAAJAwAAAAAAAAAJBAAAAAQDAAAAigFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5OdWxsYWJsZUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwQAAAAAAQAAAAQAAAADblN5c3RlbS5OdWxsYWJsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCggIAgAAAAgIBAAAAAgIBgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADlAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAABUNvdW50CENvbXBhcmVyB1ZlcnNpb24FSXRlbXMAAwADCIoBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTnVsbGFibGVDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCHBTeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAQAAAAJAwAAAAAAAAAJBAAAAAQDAAAAigFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5OdWxsYWJsZUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwQAAAAAAQAAAAQAAAADblN5c3RlbS5OdWxsYWJsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCggIAgAAAAgIBAAAAAgIBgAAAAs=" } };
yield return new object[] { new Stack<Point>(new[] { point, new Point(2, 2) }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAywFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5TdGFja2AxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAGX2FycmF5BV9zaXplCF92ZXJzaW9uBAAANVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAwAAAAgIAgAAAAkEAAAAAgAAAAAAAAAHBAAAAAABAAAAAgAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkFAAAACQYAAAAFBQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAABBgAAAAUAAAACAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAywFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5TdGFja2AxW1tTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAGX2FycmF5BV9zaXplCF92ZXJzaW9uBAAANVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludFtdAwAAAAgIAgAAAAkEAAAAAgAAAAAAAAAHBAAAAAABAAAAAgAAAAQzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AwAAAAkFAAAACQYAAAAFBQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAABBgAAAAUAAAACAAAAAgAAAAs=" } };
- yield return new object[] { new System.Collections.Hashtable(pointDictionary, 0.3f, EqualityComparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADptc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQYAAAAKTG9hZEZhY3RvcgdWZXJzaW9uC0tleUNvbXBhcmVyCEhhc2hTaXplBEtleXMGVmFsdWVzAAAEAAUFCwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAACAIAAAAcL10+AgAAAAkEAAAACwAAAAkFAAAACQYAAAAFBAAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAADAAAAEAUAAAACAAAACAgCAAAACAgBAAAAEAYAAAACAAAACQcAAAAJCAAAAAwJAAAAcFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWIFBwAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgJAAAAAgAAAAIAAAABCAAAAAcAAAABAAAAAQAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgcL10+AgAAAAkCAAAACwAAAAkDAAAACQQAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAQAwAAAAIAAAAICAIAAAAICAEAAAAQBAAAAAIAAAAJBQAAAAkGAAAADAcAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAcAAAACAAAAAgAAAAEGAAAABQAAAAEAAAABAAAACw==" } };
+ yield return new object[] { new System.Collections.Hashtable(255), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKrwEAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKrwEAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL" } };
+ yield return new object[] { new System.Collections.Hashtable(pointDictionary, 0.3f, EqualityComparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgcL10+AgAAAAkCAAAACwAAAAkDAAAACQQAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAQAwAAAAIAAAAICAIAAAAICAEAAAAQBAAAAAIAAAAJBQAAAAkGAAAADAcAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAcAAAACAAAAAgAAAAEGAAAABQAAAAEAAAABAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgcL10+AgAAAAkCAAAACwAAAAkDAAAACQQAAAAEAgAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAQAwAAAAIAAAAICAIAAAAICAEAAAAQBAAAAAIAAAAJBQAAAAkGAAAADAcAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUFAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAcAAAACAAAAAgAAAAEGAAAABQAAAAEAAAABAAAACw==" } };
yield return new object[] { new System.ComponentModel.BindingList<int>(new[] { 34, 52 }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBDlN5c3RlbS5JbnQzMltdAgAAAP////8BAAEBAQAJAwAAAA8DAAAAAgAAAAgiAAAANAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACAAVN5c3RlbS5Db21wb25lbnRNb2RlbC5CaW5kaW5nTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAlhZGROZXdQb3MWcmFpc2VMaXN0Q2hhbmdlZEV2ZW50cxZyYWlzZUl0ZW1DaGFuZ2VkRXZlbnRzCGFsbG93TmV3CWFsbG93RWRpdAthbGxvd1JlbW92ZQ91c2VyU2V0QWxsb3dOZXcSQ29sbGVjdGlvbmAxK2l0ZW1zAAAAAAAAAAMIAQEBAQEBDlN5c3RlbS5JbnQzMltdAgAAAP////8BAAEBAQAJAwAAAA8DAAAAAgAAAAgiAAAANAAAAAs=" } };
yield return new object[] { new System.ComponentModel.BindingList<Point>(new[] { point }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzAFTeXN0ZW0uQ29tcG9uZW50TW9kZWwuQmluZGluZ0xpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0IAAAACWFkZE5ld1BvcxZyYWlzZUxpc3RDaGFuZ2VkRXZlbnRzFnJhaXNlSXRlbUNoYW5nZWRFdmVudHMIYWxsb3dOZXcJYWxsb3dFZGl0C2FsbG93UmVtb3ZlD3VzZXJTZXRBbGxvd05ldxJDb2xsZWN0aW9uYDEraXRlbXMAAAAAAAAABAgBAQEBAQE1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAAAgAAAP////8BAAABAQAJBAAAAAcEAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAFBQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUBAAAAzAFTeXN0ZW0uQ29tcG9uZW50TW9kZWwuQmluZGluZ0xpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0IAAAACWFkZE5ld1BvcxZyYWlzZUxpc3RDaGFuZ2VkRXZlbnRzFnJhaXNlSXRlbUNoYW5nZWRFdmVudHMIYWxsb3dOZXcJYWxsb3dFZGl0C2FsbG93UmVtb3ZlD3VzZXJTZXRBbGxvd05ldxJDb2xsZWN0aW9uYDEraXRlbXMAAAAAAAAABAgBAQEBAQE1U3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50W10DAAAAAgAAAP////8BAAABAQAJBAAAAAcEAAAAAAEAAAABAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQDAAAACQUAAAAFBQAAADNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAVgBWQAACAgDAAAAAQAAAAIAAAAL" } };
- yield return new object[] { new Collections.Stack(new[] { point }), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgIAgAAAAkDAAAAAQAAAAEAAAAQAwAAAAoAAAAJBAAAAA0JDAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUEAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAUAAAABAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAABAAAAAQAAABACAAAACgAAAAkDAAAADQkMBAAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQMAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBAAAAAEAAAACAAAACw==" } };
+ yield return new object[] { new Collections.Stack(new[] { point }), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAABAAAAAQAAABACAAAACgAAAAkDAAAADQkMBAAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQMAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBAAAAAEAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABhTeXN0ZW0uQ29sbGVjdGlvbnMuU3RhY2sDAAAABl9hcnJheQVfc2l6ZQhfdmVyc2lvbgUAAAgICQIAAAABAAAAAQAAABACAAAACgAAAAkDAAAADQkMBAAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQMAAAAzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAFYAVkAAAgIBAAAAAEAAAACAAAACw==" } };
var stringDictionary = new System.Collections.Specialized.StringDictionary
{
{ "key1", "val1" },
{ "keyx", "valx" }
};
- yield return new object[] { stringDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAAA6bXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAL1N5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5TdHJpbmdEaWN0aW9uYXJ5AQAAAAlfY29udGVudHMEHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUDAAAAAgAAAAkEAAAADAUAAABcU3lzdGVtLlJ1bnRpbWUuRXh0ZW5zaW9ucywgVmVyc2lvbj00LjIuMS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFBAAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwQABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgUAAAAIAwAAAOxROD8CAAAACgoDAAAACQYAAAAJBwAAAAwIAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4ORAGAAAAAgAAAAYJAAAABGtleXgGCgAAAARrZXkxEAcAAAACAAAABgsAAAAEdmFseAYMAAAABHZhbDEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0RpY3Rpb25hcnkBAAAACGNvbnRlbnRzAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkDAAAABAMAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMDAAUFCwgcU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlciRTeXN0ZW0uQ29sbGVjdGlvbnMuSUhhc2hDb2RlUHJvdmlkZXII7FE4PwIAAAAKCgMAAAAJBAAAAAkFAAAAEAQAAAACAAAABgYAAAAEa2V5MQYHAAAABGtleXgQBQAAAAIAAAAGCAAAAAR2YWwxBgkAAAAEdmFseAs=" } };
+ yield return new object[] { stringDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0RpY3Rpb25hcnkBAAAACGNvbnRlbnRzAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkDAAAABAMAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMDAAUFCwgcU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlciRTeXN0ZW0uQ29sbGVjdGlvbnMuSUhhc2hDb2RlUHJvdmlkZXII7FE4PwIAAAAKCgMAAAAJBAAAAAkFAAAAEAQAAAACAAAABgYAAAAEa2V5MQYHAAAABGtleXgQBQAAAAIAAAAGCAAAAAR2YWwxBgkAAAAEdmFseAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0RpY3Rpb25hcnkBAAAACGNvbnRlbnRzAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkDAAAABAMAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQcAAAAKTG9hZEZhY3RvcgdWZXJzaW9uCENvbXBhcmVyEEhhc2hDb2RlUHJvdmlkZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMDAAUFCwgcU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlciRTeXN0ZW0uQ29sbGVjdGlvbnMuSUhhc2hDb2RlUHJvdmlkZXII7FE4PwIAAAAKCgMAAAAJBAAAAAkFAAAAEAQAAAACAAAABgYAAAAEa2V5MQYHAAAABGtleXgQBQAAAAIAAAAGCAAAAAR2YWwxBgkAAAAEdmFseAs=" } };
var stringCollection = new System.Collections.Specialized.StringCollection()
{
@@ -307,7 +502,7 @@ namespace System.Runtime.Serialization.Formatters.Tests
"bdes",
"Abd"
};
- yield return new object[] { stringCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0NvbGxlY3Rpb24BAAAABGRhdGEEHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QDAAAAAgAAAAkEAAAABQQAAAAcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdAMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBQAACAgDAAAACQUAAAADAAAAAwAAABAFAAAABAAAAAYGAAAABGFzZGYGBwAAAARiZGVzBggAAAADQWJkCgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0NvbGxlY3Rpb24BAAAABGRhdGEDHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAACQMAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAwAAAAMAAAAQBAAAAAQAAAAGBQAAAARhc2RmBgYAAAAEYmRlcwYHAAAAA0FiZAoL" } };
+ yield return new object[] { stringCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0NvbGxlY3Rpb24BAAAABGRhdGEDHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAACQMAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAwAAAAMAAAAQBAAAAAQAAAAGBQAAAARhc2RmBgYAAAAEYmRlcwYHAAAAA0FiZAoL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLlN0cmluZ0NvbGxlY3Rpb24BAAAABGRhdGEDHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAACQMAAAAEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkEAAAAAwAAAAMAAAAQBAAAAAQAAAAGBQAAAARhc2RmBgYAAAAEYmRlcwYHAAAAA0FiZAoL" } };
var orderedDictionary = new System.Collections.Specialized.OrderedDictionary(7)
{
@@ -315,44 +510,37 @@ namespace System.Runtime.Serialization.Formatters.Tests
{ "keyx", "s2" },
{ 22, "sample" }
};
- yield return new object[] { orderedDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABSRTeXN0ZW0uQ29sbGVjdGlvbnMuSUVxdWFsaXR5Q29tcGFyZXIBCAIAAAAKAAcAAAAJAwAAAAwEAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4ORADAAAAAwAAAAkFAAAACQYAAAAJBwAAAAUFAAAAIlN5c3RlbS5Db2xsZWN0aW9ucy5EaWN0aW9uYXJ5RW50cnkCAAAABF9rZXkGX3ZhbHVlAgIEAAAABggAAAAEa2V5MQgIIgAAAAEGAAAABQAAAAYJAAAABGtleXgGCgAAAAJzMgEHAAAABQAAAAgIFgAAAAYLAAAABnNhbXBsZQs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABSRTeXN0ZW0uQ29sbGVjdGlvbnMuSUVxdWFsaXR5Q29tcGFyZXIBCAIAAAAKAAcAAAAJAwAAABADAAAAAwAAAAkEAAAACQUAAAAJBgAAAAQEAAAAIlN5c3RlbS5Db2xsZWN0aW9ucy5EaWN0aW9uYXJ5RW50cnkCAAAABF9rZXkGX3ZhbHVlAgIGBwAAAARrZXkxCAgiAAAAAQUAAAAEAAAABggAAAAEa2V5eAYJAAAAAnMyAQYAAAAEAAAACAgWAAAABgoAAAAGc2FtcGxlCw==" } };
-
- var nvCollectionIgnoreCase = new System.Collections.Specialized.NameValueCollection(10, StringComparer.Create(CultureInfo.InvariantCulture, true))
- {
- { "name1", "value1" },
- { "name2", "value2" }
- };
- yield return new object[] { nvCollectionIgnoreCase, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAyU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk5hbWVWYWx1ZUNvbGxlY3Rpb24GAAAACFJlYWRPbmx5C0tleUNvbXBhcmVyBUNvdW50BEtleXMGVmFsdWVzB1ZlcnNpb24ABAAGBQABG1N5c3RlbS5DdWx0dXJlQXdhcmVDb21wYXJlcgMAAAAICAIAAAAACQQAAAACAAAACQUAAAAJBgAAAAQAAAAFBAAAABtTeXN0ZW0uQ3VsdHVyZUF3YXJlQ29tcGFyZXICAAAADF9jb21wYXJlSW5mbwtfaWdub3JlQ2FzZQQAIFN5c3RlbS5HbG9iYWxpemF0aW9uLkNvbXBhcmVJbmZvAwAAAAEDAAAACQcAAAABEQUAAAACAAAABggAAAAFbmFtZTEGCQAAAAVuYW1lMhAGAAAAAgAAAAkKAAAACQsAAAAFBwAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwIAAAAGbV9uYW1lDW1fc29ydFZlcnNpb24BBCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgMAAAADAAAABgwAAAAACgUKAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QDAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgUAAAgIAwAAAAkNAAAAAQAAAAEAAAABCwAAAAoAAAAJDgAAAAEAAAABAAAAEA0AAAABAAAABg8AAAAGdmFsdWUxEA4AAAABAAAABhAAAAAGdmFsdWUyCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAyU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk5hbWVWYWx1ZUNvbGxlY3Rpb24GAAAACFJlYWRPbmx5C0tleUNvbXBhcmVyBUNvdW50BEtleXMGVmFsdWVzB1ZlcnNpb24AAwAGBQABG1N5c3RlbS5DdWx0dXJlQXdhcmVDb21wYXJlcggIAgAAAAAJAwAAAAIAAAAJBAAAAAkFAAAABAAAAAQDAAAAG1N5c3RlbS5DdWx0dXJlQXdhcmVDb21wYXJlcgIAAAAMX2NvbXBhcmVJbmZvC19pZ25vcmVDYXNlAwAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8BCQYAAAABEQQAAAACAAAABgcAAAAFbmFtZTEGCAAAAAVuYW1lMhAFAAAAAgAAAAkJAAAACQoAAAAEBgAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GCwAAAAAAAAAAfwAAAAoECQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24FAAAICAkMAAAAAQAAAAEAAAABCgAAAAkAAAAJDQAAAAEAAAABAAAAEAwAAAABAAAABg4AAAAGdmFsdWUxEA0AAAABAAAABg8AAAAGdmFsdWUyCw==" } };
+ yield return new object[] { orderedDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABSRTeXN0ZW0uQ29sbGVjdGlvbnMuSUVxdWFsaXR5Q29tcGFyZXIBCAIAAAAKAAcAAAAJAwAAABADAAAAAwAAAAkEAAAACQUAAAAJBgAAAAQEAAAAIlN5c3RlbS5Db2xsZWN0aW9ucy5EaWN0aW9uYXJ5RW50cnkCAAAABF9rZXkGX3ZhbHVlAgIGBwAAAARrZXkxCAgiAAAAAQUAAAAEAAAABggAAAAEa2V5eAYJAAAAAnMyAQYAAAAEAAAACAgWAAAABgoAAAAGc2FtcGxlCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAwU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk9yZGVyZWREaWN0aW9uYXJ5BAAAAAtLZXlDb21wYXJlcghSZWFkT25seQ9Jbml0aWFsQ2FwYWNpdHkJQXJyYXlMaXN0AwAABSRTeXN0ZW0uQ29sbGVjdGlvbnMuSUVxdWFsaXR5Q29tcGFyZXIBCAIAAAAKAAcAAAAJAwAAABADAAAAAwAAAAkEAAAACQUAAAAJBgAAAAQEAAAAIlN5c3RlbS5Db2xsZWN0aW9ucy5EaWN0aW9uYXJ5RW50cnkCAAAABF9rZXkGX3ZhbHVlAgIGBwAAAARrZXkxCAgiAAAAAQUAAAAEAAAABggAAAAEa2V5eAYJAAAAAnMyAQYAAAAEAAAACAgWAAAABgoAAAAGc2FtcGxlCw==" } };
var listDictionary = new System.Collections.Specialized.ListDictionary(StringComparer.Create(CultureInfo.InvariantCulture, false))
{
{ "key1", "value1" },
{ "keyx", "valuex" }
};
- yield return new object[] { listDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABhU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLCBWZXJzaW9uPTQuMS4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQwEAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAALVN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeQQAAAAEaGVhZAd2ZXJzaW9uBWNvdW50CGNvbXBhcmVyBAAABDxTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkrRGljdGlvbmFyeU5vZGUDAAAACAgbU3lzdGVtLkN1bHR1cmVBd2FyZUNvbXBhcmVyBAAAAAIAAAAJBQAAAAIAAAACAAAACQYAAAAFBQAAADxTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkrRGljdGlvbmFyeU5vZGUDAAAAA2tleQV2YWx1ZQRuZXh0AgIEPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQMAAAADAAAABgcAAAAEa2V5MQYIAAAABnZhbHVlMQkJAAAABQYAAAAbU3lzdGVtLkN1bHR1cmVBd2FyZUNvbXBhcmVyAgAAAAxfY29tcGFyZUluZm8LX2lnbm9yZUNhc2UEACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAABBAAAAAkKAAAAAAEJAAAABQAAAAYLAAAABGtleXgGDAAAAAZ2YWx1ZXgKBQoAAAAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8CAAAABm1fbmFtZQ1tX3NvcnRWZXJzaW9uAQQgU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24EAAAABAAAAAYNAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBtTeXN0ZW0uQ3VsdHVyZUF3YXJlQ29tcGFyZXICAAAACQMAAAACAAAAAgAAAAkEAAAABQMAAAA8U3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5K0RpY3Rpb25hcnlOb2RlAwAAAANrZXkFdmFsdWUEbmV4dAICBDxTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkrRGljdGlvbmFyeU5vZGUCAAAAAgAAAAYFAAAABGtleTEGBgAAAAZ2YWx1ZTEJBwAAAAQEAAAAG1N5c3RlbS5DdWx0dXJlQXdhcmVDb21wYXJlcgIAAAAMX2NvbXBhcmVJbmZvC19pZ25vcmVDYXNlAwAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8BCQgAAAAAAQcAAAADAAAABgkAAAAEa2V5eAYKAAAABnZhbHVleAoECAAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GCwAAAAAAAAAAfwAAAAoL" } };
- yield return new object[] { new System.Collections.Specialized.ListDictionary(StringComparer.Ordinal), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABhU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLCBWZXJzaW9uPTQuMS4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQwEAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAALVN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeQQAAAAEaGVhZAd2ZXJzaW9uBWNvdW50CGNvbXBhcmVyBAAABDxTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkrRGljdGlvbmFyeU5vZGUDAAAACAgWU3lzdGVtLk9yZGluYWxDb21wYXJlcgQAAAACAAAACgAAAAAAAAAACQUAAAAFBQAAABZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAAAAAAQAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAgAAAAoAAAAAAAAAAAkDAAAABAMAAAAWU3lzdGVtLk9yZGluYWxDb21wYXJlcgEAAAALX2lnbm9yZUNhc2UAAQAL" } };
- yield return new object[] { new System.Collections.Specialized.ListDictionary(StringComparer.OrdinalIgnoreCase), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABhU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLCBWZXJzaW9uPTQuMS4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQwEAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAALVN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeQQAAAAEaGVhZAd2ZXJzaW9uBWNvdW50CGNvbXBhcmVyBAAABDxTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkrRGljdGlvbmFyeU5vZGUDAAAACAggU3lzdGVtLk9yZGluYWxJZ25vcmVDYXNlQ29tcGFyZXIEAAAAAgAAAAoAAAAAAAAAAAkFAAAABQUAAAAgU3lzdGVtLk9yZGluYWxJZ25vcmVDYXNlQ29tcGFyZXIAAAAABAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAgAAAAoAAAAAAAAAAAkDAAAABAMAAAAWU3lzdGVtLk9yZGluYWxDb21wYXJlcgEAAAALX2lnbm9yZUNhc2UAAQEL" } };
+ yield return new object[] { listDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBtTeXN0ZW0uQ3VsdHVyZUF3YXJlQ29tcGFyZXICAAAACQMAAAACAAAAAgAAAAkEAAAABQMAAAA8U3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5K0RpY3Rpb25hcnlOb2RlAwAAAANrZXkFdmFsdWUEbmV4dAICBDxTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkrRGljdGlvbmFyeU5vZGUCAAAAAgAAAAYFAAAABGtleTEGBgAAAAZ2YWx1ZTEJBwAAAAQEAAAAG1N5c3RlbS5DdWx0dXJlQXdhcmVDb21wYXJlcgIAAAAMX2NvbXBhcmVJbmZvC19pZ25vcmVDYXNlAwAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8BCQgAAAAAAQcAAAADAAAABgkAAAAEa2V5eAYKAAAABnZhbHVleAoECAAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwIAAAAGbV9uYW1lDW1fU29ydFZlcnNpb24BAyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Tb3J0VmVyc2lvbgYLAAAAAAoL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBtTeXN0ZW0uQ3VsdHVyZUF3YXJlQ29tcGFyZXICAAAACQMAAAACAAAAAgAAAAkEAAAABQMAAAA8U3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5K0RpY3Rpb25hcnlOb2RlAwAAAANrZXkFdmFsdWUEbmV4dAICBDxTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkrRGljdGlvbmFyeU5vZGUCAAAAAgAAAAYFAAAABGtleTEGBgAAAAZ2YWx1ZTEJBwAAAAQEAAAAG1N5c3RlbS5DdWx0dXJlQXdhcmVDb21wYXJlcgIAAAAMX2NvbXBhcmVJbmZvC19pZ25vcmVDYXNlAwAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29tcGFyZUluZm8BCQgAAAAAAQcAAAADAAAABgkAAAAEa2V5eAYKAAAABnZhbHVleAoECAAAACBTeXN0ZW0uR2xvYmFsaXphdGlvbi5Db21wYXJlSW5mbwQAAAAGbV9uYW1lCXdpbjMyTENJRAdjdWx0dXJlDW1fU29ydFZlcnNpb24BAAADCAggU3lzdGVtLkdsb2JhbGl6YXRpb24uU29ydFZlcnNpb24GCwAAAAAAAAAAfwAAAAoL" } };
+ yield return new object[] { new System.Collections.Specialized.ListDictionary(StringComparer.Ordinal), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAgAAAAoAAAAAAAAAAAkDAAAABAMAAAAWU3lzdGVtLk9yZGluYWxDb21wYXJlcgEAAAALX2lnbm9yZUNhc2UAAQAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAgAAAAoAAAAAAAAAAAkDAAAABAMAAAAWU3lzdGVtLk9yZGluYWxDb21wYXJlcgEAAAALX2lnbm9yZUNhc2UAAQAL" } };
+ yield return new object[] { new System.Collections.Specialized.ListDictionary(StringComparer.OrdinalIgnoreCase), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAgAAAAoAAAAAAAAAAAkDAAAABAMAAAAWU3lzdGVtLk9yZGluYWxDb21wYXJlcgEAAAALX2lnbm9yZUNhc2UAAQEL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5BAAAAARoZWFkB3ZlcnNpb24FY291bnQIY29tcGFyZXIEAAADPFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5MaXN0RGljdGlvbmFyeStEaWN0aW9uYXJ5Tm9kZQIAAAAICBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAgAAAAoAAAAAAAAAAAkDAAAABAMAAAAWU3lzdGVtLk9yZGluYWxDb21wYXJlcgEAAAALX2lnbm9yZUNhc2UAAQEL" } };
var hybridDictionary = new System.Collections.Specialized.HybridDictionary(10, true)
{
{ 32, "5d" },
{ "5d", 32 }
};
- yield return new object[] { hybridDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAAA6bXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAL1N5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5IeWJyaWREaWN0aW9uYXJ5AwAAAAVfbGlzdApfaGFzaHRhYmxlEF9jYXNlSW5zZW5zaXRpdmUEBAAtU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkxpc3REaWN0aW9uYXJ5AgAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAwAAAAECAAAACgkEAAAAAQwFAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUEAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUGAAAACkxvYWRGYWN0b3IHVmVyc2lvbgtLZXlDb21wYXJlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAABAAFBQsIIFN5c3RlbS5PcmRpbmFsSWdub3JlQ2FzZUNvbXBhcmVyBQAAAAgDAAAA7FE4PwIAAAAJBgAAABEAAAAJBwAAAAkIAAAABQYAAAAgU3lzdGVtLk9yZGluYWxJZ25vcmVDYXNlQ29tcGFyZXIAAAAABQAAABAHAAAAAgAAAAgIIAAAAAYJAAAAAjVkEAgAAAACAAAACQkAAAAICCAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkh5YnJpZERpY3Rpb25hcnkDAAAABGxpc3QJaGFzaHRhYmxlD2Nhc2VJbnNlbnNpdGl2ZQQDAC1TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkCAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUBAgAAAAoJAwAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyCOxROD8CAAAACQQAAAARAAAACQUAAAAJBgAAAAQEAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBEAUAAAACAAAACAggAAAABgcAAAACNWQQBgAAAAIAAAAJBwAAAAgIIAAAAAs=" } };
- yield return new object[] { new SortedList<int, string>(dictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAQAAABVU3lzdGVtLkNvbGxlY3Rpb25zLCBWZXJzaW9uPTQuMS4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUBAAAA4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAABGtleXMGdmFsdWVzBV9zaXplB3ZlcnNpb24IY29tcGFyZXIHa2V5TGlzdAl2YWx1ZUxpc3QHBgAABAQECAgIiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAADpAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMitLZXlMaXN0W1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAOsBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkTGlzdGAyK1ZhbHVlTGlzdFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAACAAAACQUAAAAJBgAAAAIAAAAAAAAACQcAAAAKCg8FAAAAAgAAAAgBAAAAAgAAABEGAAAAAgAAAAYIAAAABHRlc3QGCQAAAAxhbm90aGVyIHRlc3QFBwAAAIkBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0NvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAAAwAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADhAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAcGAAADBAQICAiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1d6QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDIrS2V5TGlzdFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAADrAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMitWYWx1ZUxpc3RbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAAgAAAAkDAAAACQQAAAACAAAAAAAAAAkFAAAACgoPAwAAAAIAAAAIAQAAAAIAAAARBAAAAAIAAAAGBgAAAAR0ZXN0BgcAAAAMYW5vdGhlciB0ZXN0BAUAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
- yield return new object[] { new Queue<int>(Enumerable.Range(1, 10)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAADhTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlF1ZXVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0FAAAABl9hcnJheQVfaGVhZAVfdGFpbAVfc2l6ZQhfdmVyc2lvbgcAAAAACAgICAgCAAAACQMAAAAAAAAACgAAAAoAAAAAAAAADwMAAAAQAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuUXVldWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAGX2FycmF5BV9oZWFkBV90YWlsBV9zaXplCF92ZXJzaW9uBwAAAAAICAgICAIAAAAJAwAAAAAAAAAKAAAACgAAAAwAAAAPAwAAABAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs=" } };
+ yield return new object[] { hybridDictionary, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkh5YnJpZERpY3Rpb25hcnkDAAAABGxpc3QJaGFzaHRhYmxlD2Nhc2VJbnNlbnNpdGl2ZQQDAC1TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkCAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUBAgAAAAoJAwAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyCOxROD8CAAAACQQAAAARAAAACQUAAAAJBgAAAAQEAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBEAUAAAACAAAACAggAAAABgcAAAACNWQQBgAAAAIAAAAJBwAAAAgIIAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLkh5YnJpZERpY3Rpb25hcnkDAAAABGxpc3QJaGFzaHRhYmxlD2Nhc2VJbnNlbnNpdGl2ZQQDAC1TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTGlzdERpY3Rpb25hcnkCAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUBAgAAAAoJAwAAAAEEAwAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBgAAAApMb2FkRmFjdG9yB1ZlcnNpb24LS2V5Q29tcGFyZXIISGFzaFNpemUES2V5cwZWYWx1ZXMAAAMABQULCBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyCOxROD8CAAAACQQAAAARAAAACQUAAAAJBgAAAAQEAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBEAUAAAACAAAACAggAAAABgcAAAACNWQQBgAAAAIAAAAJBwAAAAgIIAAAAAs=" } };
+ yield return new object[] { new SortedList<int, string>(dictionary, Comparer<int>.Default), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5DAMAAABVU3lzdGVtLkNvbGxlY3Rpb25zLCBWZXJzaW9uPTQuMS4xLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUBAAAA4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0HAAAABGtleXMGdmFsdWVzBV9zaXplB3ZlcnNpb24IY29tcGFyZXIHa2V5TGlzdAl2YWx1ZUxpc3QHBgAAAwQECAgIiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXekBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkTGlzdGAyK0tleUxpc3RbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAA6wFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDIrVmFsdWVMaXN0W1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAIAAAAJBAAAAAkFAAAAAgAAAAAAAAAJBgAAAAoKDwQAAAACAAAACAEAAAACAAAAEQUAAAACAAAABgcAAAAEdGVzdAYIAAAADGFub3RoZXIgdGVzdAQGAAAAiQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljQ29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAADhAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAAEa2V5cwZ2YWx1ZXMFX3NpemUHdmVyc2lvbghjb21wYXJlcgdrZXlMaXN0CXZhbHVlTGlzdAcGAAADBAQICAiJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1d6QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Tb3J0ZWRMaXN0YDIrS2V5TGlzdFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAADrAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZExpc3RgMitWYWx1ZUxpc3RbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAAgAAAAkDAAAACQQAAAACAAAAAAAAAAkFAAAACgoPAwAAAAIAAAAIAQAAAAIAAAARBAAAAAIAAAAGBgAAAAR0ZXN0BgcAAAAMYW5vdGhlciB0ZXN0BAUAAACJAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAs=" } };
+ yield return new object[] { new Queue<int>(Enumerable.Range(1, 10)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuUXVldWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAGX2FycmF5BV9oZWFkBV90YWlsBV9zaXplCF92ZXJzaW9uBwAAAAAICAgICAIAAAAJAwAAAAAAAAAKAAAACgAAAAAAAAAPAwAAABAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuUXVldWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQUAAAAGX2FycmF5BV9oZWFkBV90YWlsBV9zaXplCF92ZXJzaW9uBwAAAAAICAgICAIAAAAJAwAAAAAAAAAKAAAACgAAAAwAAAAPAwAAABAAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs=" } };
var observableCollection = new System.Collections.ObjectModel.ObservableCollection<int>(Enumerable.Range(1, 5));
- yield return new object[] { observableCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUMAwAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQEoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAAgAAAAkEAAAACQUAAAAFBAAAAKABU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDErU2ltcGxlTW9uaXRvcltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAKX2J1c3lDb3VudAAIAgAAAAAAAAAFBQAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAMAAAAJBgAAAAUAAAABAAAADwYAAAAIAAAACAEAAAACAAAAAwAAAAQAAAAFAAAAAAAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAAFAAAABQAAAA8FAAAACAAAAAgBAAAAAgAAAAMAAAAEAAAABQAAAAAAAAAAAAAAAAAAAAs=" } };
- yield return new object[] { new System.Collections.ObjectModel.ReadOnlyObservableCollection<int>(observableCollection), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJoBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5T2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAZUmVhZE9ubHlDb2xsZWN0aW9uYDErbGlzdASSAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAwEAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUDAAAAkgFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAIX21vbml0b3ISQ29sbGVjdGlvbmAxK2l0ZW1zBASgAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxK1NpbXBsZU1vbml0b3JbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAACAAAACQUAAAAJBgAAAAUFAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAUGAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgIBAAAAAkHAAAABQAAAAEAAAAPBwAAAAgAAAAIAQAAAAIAAAADAAAABAAAAAUAAAAAAAAAAAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJoBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5T2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAZUmVhZE9ubHlDb2xsZWN0aW9uYDErbGlzdASSAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAUDAAAAkgFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAIX21vbml0b3ISQ29sbGVjdGlvbmAxK2l0ZW1zBAOgAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxK1NpbXBsZU1vbml0b3JbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJBAAAAAkFAAAABQQAAACgAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxK1NpbXBsZU1vbml0b3JbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAABAUAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJBgAAAAUAAAAFAAAADwYAAAAIAAAACAEAAAACAAAAAwAAAAQAAAAFAAAAAAAAAAAAAAAAAAAACw==" } };
- yield return new object[] { new System.Collections.ObjectModel.ReadOnlyCollection<int>(Enumerable.Range(1, 15).ToList()), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJABU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5Q29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARsaXN0BH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAAgAAAAkDAAAABQMAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgCAAAACQQAAAAPAAAADwAAAA8EAAAADwAAAAgBAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJABU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5Q29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARsaXN0A35TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JAgAAAAQCAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQMAAAAPAAAADwAAAA8DAAAAEAAAAAgBAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAAAAAACw==" } };
- yield return new object[] { new System.Collections.ObjectModel.ReadOnlyDictionary<int, string>(dictionary), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAO0BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5RGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAxtX2RpY3Rpb25hcnkE4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAAgAAAAkDAAAABQMAAADhAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlWYWx1ZVBhaXJzAAQAAwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACOUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQIAAAACAAAACQQAAAADAAAACQUAAAAFBAAAAJEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAACAAAABwUAAAAAAQAAAAIAAAAE4wFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAF+v///+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAIAAAABAAAABgcAAAAEdGVzdAH4////+v///wIAAAAGCQAAAAxhbm90aGVyIHRlc3QL", "AAEAAAD/////AQAAAAAAAAAEAQAAAO0BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5RGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAxtX2RpY3Rpb25hcnkD4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JAgAAAAQCAAAA4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwADAAMIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCOUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQIAAAAJAwAAAAMAAAAJBAAAAAQDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAcEAAAAAAEAAAACAAAAA+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0E+////+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAEAAAAGBgAAAAR0ZXN0Afn////7////AgAAAAYIAAAADGFub3RoZXIgdGVzdAs=" } };
+ yield return new object[] { observableCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAAFAAAAAQAAAA8FAAAACAAAAAgBAAAAAgAAAAMAAAAEAAAABQAAAAAAAAAAAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLk9ic2VydmFibGVDb2xsZWN0aW9uYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACF9tb25pdG9yEkNvbGxlY3Rpb25gMStpdGVtcwQDoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAACQMAAAAJBAAAAAUDAAAAoAFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMStTaW1wbGVNb25pdG9yW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAApfYnVzeUNvdW50AAgCAAAAAAAAAAQEAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQUAAAAFAAAABQAAAA8FAAAACAAAAAgBAAAAAgAAAAMAAAAEAAAABQAAAAAAAAAAAAAAAAAAAAs=" } };
+ yield return new object[] { new System.Collections.ObjectModel.ReadOnlyObservableCollection<int>(observableCollection), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJoBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5T2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAZUmVhZE9ubHlDb2xsZWN0aW9uYDErbGlzdASSAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAUDAAAAkgFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAIX21vbml0b3ISQ29sbGVjdGlvbmAxK2l0ZW1zBAOgAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxK1NpbXBsZU1vbml0b3JbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJBAAAAAkFAAAABQQAAACgAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxK1NpbXBsZU1vbml0b3JbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAABAUAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJBgAAAAUAAAABAAAADwYAAAAIAAAACAEAAAACAAAAAwAAAAQAAAAFAAAAAAAAAAAAAAAAAAAACw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAE5XaW5kb3dzQmFzZSwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPU5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFAQAAAJoBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5T2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAZUmVhZE9ubHlDb2xsZWN0aW9uYDErbGlzdASSAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAIAAAAJAwAAAAUDAAAAkgFTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuT2JzZXJ2YWJsZUNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAIX21vbml0b3ISQ29sbGVjdGlvbmAxK2l0ZW1zBAOgAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxK1NpbXBsZU1vbml0b3JbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJBAAAAAkFAAAABQQAAACgAVN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5PYnNlcnZhYmxlQ29sbGVjdGlvbmAxK1NpbXBsZU1vbml0b3JbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAACl9idXN5Q291bnQACAIAAAAAAAAABAUAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJBgAAAAUAAAAFAAAADwYAAAAIAAAACAEAAAACAAAAAwAAAAQAAAAFAAAAAAAAAAAAAAAAAAAACw==" } };
+ yield return new object[] { new System.Collections.ObjectModel.ReadOnlyCollection<int>(Enumerable.Range(1, 15).ToList()), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJABU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5Q29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARsaXN0A35TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JAgAAAAQCAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQMAAAAPAAAADwAAAA8DAAAADwAAAAgBAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJABU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5Q29sbGVjdGlvbmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAARsaXN0A35TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JAgAAAAQCAAAAflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBwAACAgICQMAAAAPAAAADwAAAA8DAAAAEAAAAAgBAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAAAAAACw==" } };
+ yield return new object[] { new System.Collections.ObjectModel.ReadOnlyDictionary<int, string>(dictionary), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAO0BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5RGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAxtX2RpY3Rpb25hcnkD4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JAgAAAAQCAAAA4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwADAAMIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCOUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQIAAAAJAwAAAAMAAAAJBAAAAAQDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAcEAAAAAAEAAAACAAAAA+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0E+////+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAEAAAAGBgAAAAR0ZXN0Afn////7////AgAAAAYIAAAADGFub3RoZXIgdGVzdAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAO0BU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5RGljdGlvbmFyeWAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAxtX2RpY3Rpb25hcnkD4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JAgAAAAQCAAAA4QFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwADAAMIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCOUBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1bXQIAAAAJAwAAAAMAAAAJBAAAAAQDAAAAkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAcEAAAAAAEAAAACAAAAA+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0E+////+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQABCAEAAAAGBgAAAAR0ZXN0Afn////7////AgAAAAYIAAAADGFub3RoZXIgdGVzdAs=" } };
var simpleKeyedCollection = new SimpleKeyedCollection
{
point
};
- yield return new object[] { simpleKeyedCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViDAMAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAABDU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlNpbXBsZUtleWVkQ29sbGVjdGlvbgUAAAAaS2V5ZWRDb2xsZWN0aW9uYDIrY29tcGFyZXIWS2V5ZWRDb2xsZWN0aW9uYDIrZGljdBpLZXllZENvbGxlY3Rpb25gMitrZXlDb3VudBtLZXllZENvbGxlY3Rpb25gMit0aHJlc2hvbGQSQ29sbGVjdGlvbmAxK2l0ZW1zBAQAAASRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAArAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAACAjKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAAAgAAAAkEAAAACQUAAAAAAAAAAAAAAAkGAAAABQQAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAAAwAAAAUFAAAArAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwAEAAMIkQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAiwAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dW10DAAAAAQAAAAkEAAAAAwAAAAkIAAAABQYAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAMAAAAJCQAAAAEAAAABAAAABwgAAAAAAQAAAAEAAAAErgJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQMAAAAF9v///64CU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0CAAAAA2tleQV2YWx1ZQAECDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAAAwAAAAIAAAAJCwAAAAcJAAAAAAEAAAAEAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAACQsAAAANAwULAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAIAAAABAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABDU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlNpbXBsZUtleWVkQ29sbGVjdGlvbgUAAAAaS2V5ZWRDb2xsZWN0aW9uYDIrY29tcGFyZXIWS2V5ZWRDb2xsZWN0aW9uYDIrZGljdBpLZXllZENvbGxlY3Rpb25gMitrZXlDb3VudBtLZXllZENvbGxlY3Rpb25gMit0aHJlc2hvbGQSQ29sbGVjdGlvbmAxK2l0ZW1zAwMAAAORAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV2sAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgIygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACQQAAAAAAAAAAAAAAAkFAAAABAMAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABAQAAACsAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlWYWx1ZVBhaXJzAAMAAwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IsAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdAQAAAAkDAAAAAwAAAAkHAAAABAUAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAkIAAAAAQAAAAEAAAAHBwAAAAABAAAAAQAAAAOuAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBPf///+uAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAANrZXkFdmFsdWUABAgzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAIAAAAJCgAAAAcIAAAAAAEAAAAEAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAACQoAAAANAwUKAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAIAAAABAAAAAgAAAAs=" } };
- yield return new object[] { new System.Collections.ObjectModel.Collection<int>(Enumerable.Range(1, 20).ToList()), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMEflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAACQMAAAAFAwAAAH5TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgcAAAgICAIAAAAJBAAAABQAAAAUAAAADwQAAAAUAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkCAAAABAIAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJAwAAABQAAAAUAAAADwMAAAAgAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACw==" } };
+ yield return new object[] { simpleKeyedCollection, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABDU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlNpbXBsZUtleWVkQ29sbGVjdGlvbgUAAAAaS2V5ZWRDb2xsZWN0aW9uYDIrY29tcGFyZXIWS2V5ZWRDb2xsZWN0aW9uYDIrZGljdBpLZXllZENvbGxlY3Rpb25gMitrZXlDb3VudBtLZXllZENvbGxlY3Rpb25gMit0aHJlc2hvbGQSQ29sbGVjdGlvbmAxK2l0ZW1zAwMAAAORAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV2sAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgIygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACQQAAAAAAAAAAAAAAAkFAAAABAMAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABAQAAACsAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlWYWx1ZVBhaXJzAAMAAwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IsAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdAQAAAAkDAAAAAwAAAAkHAAAABAUAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAkIAAAAAQAAAAEAAAAHBwAAAAABAAAAAQAAAAOuAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBPf///+uAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAANrZXkFdmFsdWUABAgzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAIAAAAJCgAAAAcIAAAAAAEAAAAEAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAACQoAAAANAwUKAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAIAAAABAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABDU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlNpbXBsZUtleWVkQ29sbGVjdGlvbgUAAAAaS2V5ZWRDb2xsZWN0aW9uYDIrY29tcGFyZXIWS2V5ZWRDb2xsZWN0aW9uYDIrZGljdBpLZXllZENvbGxlY3Rpb25gMitrZXlDb3VudBtLZXllZENvbGxlY3Rpb25gMit0aHJlc2hvbGQSQ29sbGVjdGlvbmAxK2l0ZW1zAwMAAAORAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV2sAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQgIygFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAAkDAAAACQQAAAAAAAAAAAAAAAkFAAAABAMAAACRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABAQAAACsAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlWYWx1ZVBhaXJzAAMAAwiRAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IsAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQsIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cywgVmVyc2lvbj00LjAuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTlkNzdjYzdhZDM5YjY4ZWJdXVtdAQAAAAkDAAAAAwAAAAkHAAAABAUAAADKAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50LCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAADVTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnRbXQIAAAAICAkIAAAAAQAAAAEAAAAHBwAAAAABAAAAAQAAAAOuAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dBPf///+uAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludCwgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYl1dAgAAAANrZXkFdmFsdWUABAgzU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlBvaW50AgAAAAIAAAAJCgAAAAcIAAAAAAEAAAAEAAAABDNTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuUG9pbnQCAAAACQoAAAANAwUKAAAAM1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5Qb2ludAIAAAABWAFZAAAICAIAAAABAAAAAgAAAAs=" } };
+ yield return new object[] { new System.Collections.ObjectModel.Collection<int>(Enumerable.Range(1, 20).ToList()), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkCAAAABAIAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJAwAAABQAAAAUAAAADwMAAAAUAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAIgBU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAFaXRlbXMDflN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkCAAAABAIAAAB+U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24HAAAICAgJAwAAABQAAAAUAAAADwMAAAAgAAAACAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACw==" } };
// Graph without cycles
yield return new object[] { new Tree<int>(42, null, null), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAACRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAFjxWYWx1ZT5rX19CYWNraW5nRmllbGQVPExlZnQ+a19fQmFja2luZ0ZpZWxkFjxSaWdodD5rX19CYWNraW5nRmllbGQABAQIkQFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAJEBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAAKgAAAAoKCw==", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAACRAVN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5UcmVlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAAFjxWYWx1ZT5rX19CYWNraW5nRmllbGQVPExlZnQ+a19fQmFja2luZ0ZpZWxkFjxSaWdodD5rX19CYWNraW5nRmllbGQABAQIkQFTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuVHJlZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAJEBU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlRyZWVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAAKgAAAAoKCw==" } };
@@ -387,7 +575,7 @@ namespace System.Runtime.Serialization.Formatters.Tests
}
};
yield return new object[] { s, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABSU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdENvbnRhaW5pbmdBcnJheXNPZk90aGVyU3RydWN0cwEAAAAGTmVzdGVkBExTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0c1tdAgAAAAIAAAAJAwAAAAcDAAAAAAEAAAACAAAABEpTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAF/P///0pTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAHTmVzdGVkMQdOZXN0ZWQyBAREU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhTdHJpbmdGaWVsZHMCAAAARFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RXaXRoU3RyaW5nRmllbGRzAgAAAAIAAAAF+////0RTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0V2l0aFN0cmluZ0ZpZWxkcwIAAAAHU3RyaW5nMQdTdHJpbmcyAQECAAAABgYAAAABYQYHAAAAAWIB+P////v///8GCQAAAAEzBgoAAAABNAH1/////P///wH0////+////wYNAAAAAWUGDgAAAAFmAfH////7////BhAAAAABNwYRAAAAATgL", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABSU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdENvbnRhaW5pbmdBcnJheXNPZk90aGVyU3RydWN0cwEAAAAGTmVzdGVkBExTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0c1tdAgAAAAIAAAAJAwAAAAcDAAAAAAEAAAACAAAABEpTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAF/P///0pTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAHTmVzdGVkMQdOZXN0ZWQyBAREU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhTdHJpbmdGaWVsZHMCAAAARFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RXaXRoU3RyaW5nRmllbGRzAgAAAAIAAAAF+////0RTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0V2l0aFN0cmluZ0ZpZWxkcwIAAAAHU3RyaW5nMQdTdHJpbmcyAQECAAAABgYAAAABYQYHAAAAAWIB+P////v///8GCQAAAAEzBgoAAAABNAH1/////P///wH0////+////wYNAAAAAWUGDgAAAAFmAfH////7////BhAAAAABNwYRAAAAATgL" } };
- yield return new object[] { new object[] { s, new StructContainingArraysOfOtherStructs?(s) }, new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkQAQAAAAIAAAAJAwAAAAkEAAAADAUAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUDAAAAUlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RDb250YWluaW5nQXJyYXlzT2ZPdGhlclN0cnVjdHMBAAAABk5lc3RlZARMU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdENvbnRhaW5pbmdPdGhlclN0cnVjdHNbXQUAAAAFAAAACQYAAAABBAAAAAMAAAAJBgAAAAcGAAAAAAEAAAACAAAABEpTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwUAAAAF+f///0pTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAHTmVzdGVkMQdOZXN0ZWQyBAREU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhTdHJpbmdGaWVsZHMFAAAARFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RXaXRoU3RyaW5nRmllbGRzBQAAAAUAAAAF+P///0RTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0V2l0aFN0cmluZ0ZpZWxkcwIAAAAHU3RyaW5nMQdTdHJpbmcyAQEFAAAABgkAAAABYQYKAAAAAWIB9f////j///8GDAAAAAEzBg0AAAABNAHy////+f///wHx////+P///wYQAAAAAWUGEQAAAAFmAe7////4////BhMAAAABNwYUAAAAATgL", "AAEAAAD/////AQAAAAAAAAAQAQAAAAIAAAAJAgAAAAkDAAAADAQAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUCAAAAUlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RDb250YWluaW5nQXJyYXlzT2ZPdGhlclN0cnVjdHMBAAAABk5lc3RlZARMU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdENvbnRhaW5pbmdPdGhlclN0cnVjdHNbXQQAAAAEAAAACQUAAAABAwAAAAIAAAAJBQAAAAcFAAAAAAEAAAACAAAABEpTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwQAAAAF+v///0pTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAHTmVzdGVkMQdOZXN0ZWQyBAREU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhTdHJpbmdGaWVsZHMEAAAARFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RXaXRoU3RyaW5nRmllbGRzBAAAAAQAAAAF+f///0RTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0V2l0aFN0cmluZ0ZpZWxkcwIAAAAHU3RyaW5nMQdTdHJpbmcyAQEEAAAABggAAAABYQYJAAAAAWIB9v////n///8GCwAAAAEzBgwAAAABNAHz////+v///wHy////+f///wYPAAAAAWUGEAAAAAFmAe/////5////BhIAAAABNwYTAAAAATgL" } };
+ yield return new object[] { new object[] { s, new StructContainingArraysOfOtherStructs?(s) }, new string[] { "AAEAAAD/////AQAAAAAAAAAQAQAAAAIAAAAJAgAAAAkDAAAADAQAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUCAAAAUlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RDb250YWluaW5nQXJyYXlzT2ZPdGhlclN0cnVjdHMBAAAABk5lc3RlZARMU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdENvbnRhaW5pbmdPdGhlclN0cnVjdHNbXQQAAAAEAAAACQUAAAABAwAAAAIAAAAJBQAAAAcFAAAAAAEAAAACAAAABEpTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwQAAAAF+v///0pTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAHTmVzdGVkMQdOZXN0ZWQyBAREU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhTdHJpbmdGaWVsZHMEAAAARFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RXaXRoU3RyaW5nRmllbGRzBAAAAAQAAAAF+f///0RTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0V2l0aFN0cmluZ0ZpZWxkcwIAAAAHU3RyaW5nMQdTdHJpbmcyAQEEAAAABggAAAABYQYJAAAAAWIB9v////n///8GCwAAAAEzBgwAAAABNAHz////+v///wHy////+f///wYPAAAAAWUGEAAAAAFmAe/////5////BhIAAAABNwYTAAAAATgL", "AAEAAAD/////AQAAAAAAAAAQAQAAAAIAAAAJAgAAAAkDAAAADAQAAABwU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLCBWZXJzaW9uPTQuMC4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OWQ3N2NjN2FkMzliNjhlYgUCAAAAUlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RDb250YWluaW5nQXJyYXlzT2ZPdGhlclN0cnVjdHMBAAAABk5lc3RlZARMU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdENvbnRhaW5pbmdPdGhlclN0cnVjdHNbXQQAAAAEAAAACQUAAAABAwAAAAIAAAAJBQAAAAcFAAAAAAEAAAACAAAABEpTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwQAAAAF+v///0pTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0Q29udGFpbmluZ090aGVyU3RydWN0cwIAAAAHTmVzdGVkMQdOZXN0ZWQyBAREU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLlN0cnVjdFdpdGhTdHJpbmdGaWVsZHMEAAAARFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5UZXN0cy5TdHJ1Y3RXaXRoU3RyaW5nRmllbGRzBAAAAAQAAAAF+f///0RTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMuU3RydWN0V2l0aFN0cmluZ0ZpZWxkcwIAAAAHU3RyaW5nMQdTdHJpbmcyAQEEAAAABggAAAABYQYJAAAAAWIB9v////n///8GCwAAAAEzBgwAAAABNAHz////+v///wHy////+f///wYPAAAAAWUGEAAAAAFmAe/////5////BhIAAAABNwYTAAAAATgL" } };
// ISerializable
yield return new object[] { new BasicISerializableObject(1, "2"), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABGU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkJhc2ljSVNlcmlhbGl6YWJsZU9iamVjdAIAAAAGVmFsdWUxBlZhbHVlMgABCAIAAAABAAAABgMAAAABMgs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAABGU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlRlc3RzLkJhc2ljSVNlcmlhbGl6YWJsZU9iamVjdAIAAAAGVmFsdWUxBlZhbHVlMgABCAIAAAABAAAABgMAAAABMgs=" } };
@@ -397,18 +585,18 @@ namespace System.Runtime.Serialization.Formatters.Tests
yield return new object[] { new TypeWithoutNamespace(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAAUVHlwZVdpdGhvdXROYW1lc3BhY2UAAAAAAgAAAAs=", "AAEAAAD/////AQAAAAAAAAAMAgAAAHBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuVGVzdHMsIFZlcnNpb249NC4wLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05ZDc3Y2M3YWQzOWI2OGViBQEAAAAUVHlwZVdpdGhvdXROYW1lc3BhY2UAAAAAAgAAAAs=" } };
// Extension of core serializable types
- if (!PlatformDetection.IsNetfxBelow471())
+ if (PlatformDetection.IsNetfx471OrNewer())
{
// ValueType isn't serializable before ntfx471.
- yield return new object[] { new ValueTuple(), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAABFTeXN0ZW0uVmFsdWVUdXBsZQAAAAACAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAABFTeXN0ZW0uVmFsdWVUdXBsZQAAAAAL" } };
- yield return new object[] { ValueTuple.Create(1), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAHBTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAVJdGVtMQAIAgAAAAEAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAHBTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAVJdGVtMQAIAQAAAAs=" } };
- yield return new object[] { ValueTuple.Create(1, "2"), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAM0BU3lzdGVtLlZhbHVlVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFSXRlbTEFSXRlbTIAAQgCAAAAAQAAAAYDAAAAATIL", "AAEAAAD/////AQAAAAAAAAAEAQAAAM0BU3lzdGVtLlZhbHVlVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFSXRlbTEFSXRlbTIAAQgBAAAABgIAAAABMgs=" } };
- yield return new object[] { ValueTuple.Create(1, "2", 3u), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAKoCU3lzdGVtLlZhbHVlVHVwbGVgM1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFSXRlbTEFSXRlbTIFSXRlbTMAAQAIDwIAAAABAAAABgMAAAABMgMAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAKoCU3lzdGVtLlZhbHVlVHVwbGVgM1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFSXRlbTEFSXRlbTIFSXRlbTMAAQAIDwEAAAAGAgAAAAEyAwAAAAs=" } };
- yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIYDU3lzdGVtLlZhbHVlVHVwbGVgNFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAABAAAIDwkCAAAAAQAAAAYDAAAAATIDAAAABAAAAAAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAIYDU3lzdGVtLlZhbHVlVHVwbGVgNFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAABAAAIDwkBAAAABgIAAAABMgMAAAAEAAAAAAAAAAs=" } };
- yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAOMDU3lzdGVtLlZhbHVlVHVwbGVgNVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQABAAAACA8JBgIAAAABAAAABgMAAAABMgMAAAAEAAAAAAAAAGZmZmZmZhZACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAOMDU3lzdGVtLlZhbHVlVHVwbGVgNVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQABAAAACA8JBgEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkAL" } };
- yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6, 7.8f), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAMAEU3lzdGVtLlZhbHVlVHVwbGVgNltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBgAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgABAAAAAAgPCQYLAgAAAAEAAAAGAwAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAMAEU3lzdGVtLlZhbHVlVHVwbGVgNltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBgAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgABAAAAAAgPCQYLAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UAL" } };
- yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAJ4FU3lzdGVtLlZhbHVlVHVwbGVgN1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAAFSXRlbTEFSXRlbTIFSXRlbTMFSXRlbTQFSXRlbTUFSXRlbTYFSXRlbTcAAQAAAAAACA8JBgsFAgAAAAEAAAAGAwAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflAATkL", "AAEAAAD/////AQAAAAAAAAAEAQAAAJ4FU3lzdGVtLlZhbHVlVHVwbGVgN1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAAFSXRlbTEFSXRlbTIFSXRlbTMFSXRlbTQFSXRlbTUFSXRlbTYFSXRlbTcAAQAAAAAACA8JBgsFAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UABOQs=" } };
- yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m, Tuple.Create(10)), new string[] { "AAEAAAD/////AQAAAAAAAAAMAgAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAL0HU3lzdGVtLlZhbHVlVHVwbGVgOFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgVJdGVtNwRSZXN0AAEAAAAAAAQIDwkGCwXPAVN5c3RlbS5WYWx1ZVR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAAAQAAAAYDAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UABOQX8////zwFTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAABUl0ZW0xBGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAACAAAACQUAAAAFBQAAAGtTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAHbV9JdGVtMQAIAgAAAAoAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAL0HU3lzdGVtLlZhbHVlVHVwbGVgOFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgVJdGVtNwRSZXN0AAEAAAAAAAMIDwkGCwXPAVN5c3RlbS5WYWx1ZVR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflAATkE/f///88BU3lzdGVtLlZhbHVlVHVwbGVgMVtbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAVJdGVtMQNrU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JBAAAAAQEAAAAa1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAdtX0l0ZW0xAAgKAAAACw==" } };
+ yield return new object[] { new ValueTuple(), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAABFTeXN0ZW0uVmFsdWVUdXBsZQAAAAAL", "AAEAAAD/////AQAAAAAAAAAEAQAAABFTeXN0ZW0uVmFsdWVUdXBsZQAAAAAL" } };
+ yield return new object[] { ValueTuple.Create(1), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAHBTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAVJdGVtMQAIAQAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAHBTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAVJdGVtMQAIAQAAAAs=" } };
+ yield return new object[] { ValueTuple.Create(1, "2"), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAM0BU3lzdGVtLlZhbHVlVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFSXRlbTEFSXRlbTIAAQgBAAAABgIAAAABMgs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAM0BU3lzdGVtLlZhbHVlVHVwbGVgMltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAFSXRlbTEFSXRlbTIAAQgBAAAABgIAAAABMgs=" } };
+ yield return new object[] { ValueTuple.Create(1, "2", 3u), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAKoCU3lzdGVtLlZhbHVlVHVwbGVgM1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFSXRlbTEFSXRlbTIFSXRlbTMAAQAIDwEAAAAGAgAAAAEyAwAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAKoCU3lzdGVtLlZhbHVlVHVwbGVgM1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAFSXRlbTEFSXRlbTIFSXRlbTMAAQAIDwEAAAAGAgAAAAEyAwAAAAs=" } };
+ yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAIYDU3lzdGVtLlZhbHVlVHVwbGVgNFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAABAAAIDwkBAAAABgIAAAABMgMAAAAEAAAAAAAAAAs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAIYDU3lzdGVtLlZhbHVlVHVwbGVgNFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAABAAAIDwkBAAAABgIAAAABMgMAAAAEAAAAAAAAAAs=" } };
+ yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAOMDU3lzdGVtLlZhbHVlVHVwbGVgNVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQABAAAACA8JBgEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAOMDU3lzdGVtLlZhbHVlVHVwbGVgNVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBQAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQABAAAACA8JBgEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkAL" } };
+ yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6, 7.8f), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAMAEU3lzdGVtLlZhbHVlVHVwbGVgNltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBgAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgABAAAAAAgPCQYLAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UAL", "AAEAAAD/////AQAAAAAAAAAEAQAAAMAEU3lzdGVtLlZhbHVlVHVwbGVgNltbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBgAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgABAAAAAAgPCQYLAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UAL" } };
+ yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAJ4FU3lzdGVtLlZhbHVlVHVwbGVgN1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAAFSXRlbTEFSXRlbTIFSXRlbTMFSXRlbTQFSXRlbTUFSXRlbTYFSXRlbTcAAQAAAAAACA8JBgsFAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UABOQs=", "AAEAAAD/////AQAAAAAAAAAEAQAAAJ4FU3lzdGVtLlZhbHVlVHVwbGVgN1tbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQcAAAAFSXRlbTEFSXRlbTIFSXRlbTMFSXRlbTQFSXRlbTUFSXRlbTYFSXRlbTcAAQAAAAAACA8JBgsFAQAAAAYCAAAAATIDAAAABAAAAAAAAABmZmZmZmYWQJqZ+UABOQs=" } };
+ yield return new object[] { ValueTuple.Create(1, "2", 3u, 4L, 5.6, 7.8f, 9m, Tuple.Create(10)), new string[] { "AAEAAAD/////AQAAAAAAAAAEAQAAAL0HU3lzdGVtLlZhbHVlVHVwbGVgOFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgVJdGVtNwRSZXN0AAEAAAAAAAMIDwkGCwXPAVN5c3RlbS5WYWx1ZVR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflAATkE/f///88BU3lzdGVtLlZhbHVlVHVwbGVgMVtbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAVJdGVtMQNrU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JBAAAAAQEAAAAa1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAdtX0l0ZW0xAAgKAAAACw==", "AAEAAAD/////AQAAAAAAAAAEAQAAAL0HU3lzdGVtLlZhbHVlVHVwbGVgOFtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVUludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50NjQsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5Eb3VibGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TaW5nbGUsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EZWNpbWFsLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uVmFsdWVUdXBsZWAxW1tTeXN0ZW0uVHVwbGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCAAAAAVJdGVtMQVJdGVtMgVJdGVtMwVJdGVtNAVJdGVtNQVJdGVtNgVJdGVtNwRSZXN0AAEAAAAAAAMIDwkGCwXPAVN5c3RlbS5WYWx1ZVR1cGxlYDFbW1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAAGAgAAAAEyAwAAAAQAAAAAAAAAZmZmZmZmFkCamflAATkE/f///88BU3lzdGVtLlZhbHVlVHVwbGVgMVtbU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAVJdGVtMQNrU3lzdGVtLlR1cGxlYDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JBAAAAAQEAAAAa1N5c3RlbS5UdXBsZWAxW1tTeXN0ZW0uSW50MzIsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAQAAAAdtX0l0ZW0xAAgKAAAACw==" } };
}
}
diff --git a/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTests.cs b/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTests.cs
index bbf0f732b5..3ebb0b59ba 100644
--- a/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTests.cs
+++ b/src/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTests.cs
@@ -17,7 +17,6 @@ namespace System.Runtime.Serialization.Formatters.Tests
{
[Theory]
[MemberData(nameof(BasicObjectsRoundtrip_MemberData))]
- [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
public void ValidateBasicObjectsRoundtrip(object obj, FormatterAssemblyStyle assemblyFormat, TypeFilterLevel filterLevel, FormatterTypeStyle typeFormat)
{
object clone = FormatterClone(obj, null, assemblyFormat, filterLevel, typeFormat);
@@ -42,7 +41,6 @@ namespace System.Runtime.Serialization.Formatters.Tests
[Theory]
[MemberData(nameof(SerializableObjects_MemberData))]
- [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
public void ValidateAgainstBlobs(object obj, string[] blobs)
{
if (blobs == null || blobs.Length == 0)
@@ -51,13 +49,25 @@ namespace System.Runtime.Serialization.Formatters.Tests
SerializeObjectToBlob(obj));
}
- foreach (string blob in blobs.Take(1))
+ foreach (string blob in blobs)
{
CheckForAnyEquals(obj, DeserializeBlobToObject(blob));
}
}
[Fact]
+ public void ArraySegmentDefaultCtor()
+ {
+ // This is workaround for Xunit bug which tries to pretty print test case name and enumerate this object.
+ // When inner array is not initialized it throws an exception when this happens.
+ object obj = new ArraySegment<int>();
+ string corefxBlob = "AAEAAAD/////AQAAAAAAAAAEAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAoAAAAAAAAAAAs=";
+ string netfxBlob = "AAEAAAD/////AQAAAAAAAAAEAQAAAHJTeXN0ZW0uQXJyYXlTZWdtZW50YDFbW1N5c3RlbS5JbnQzMiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9hcnJheQdfb2Zmc2V0Bl9jb3VudAcAAAgICAoAAAAAAAAAAAs=";
+ CheckForAnyEquals(obj, DeserializeBlobToObject(corefxBlob));
+ CheckForAnyEquals(obj, DeserializeBlobToObject(netfxBlob));
+ }
+
+ [Fact]
public void ValidateDeserializationOfObjectWithDifferentAssemblyVersion()
{
// To generate this properly, change AssemblyVersion to a value which is unlikely to happen in production and generate base64(serialized-data)
@@ -102,7 +112,6 @@ namespace System.Runtime.Serialization.Formatters.Tests
}
[Fact]
- [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
public void RoundtripManyObjectsInOneStream()
{
object[][] objects = SerializableObjects_MemberData().ToArray();
@@ -354,9 +363,11 @@ namespace System.Runtime.Serialization.Formatters.Tests
Assert.Equal(42, real);
}
- [OuterLoop]
- [Theory]
- [MemberData(nameof(FuzzInputs_MemberData))]
+ // Test is disabled becaues it can cause improbable memory allocations leading to interminable paging.
+ // We're keeping the code because it could be useful to a dev making local changes to binary formatter code.
+ //[OuterLoop]
+ //[Theory]
+ //[MemberData(nameof(FuzzInputs_MemberData))]
public void Deserialize_FuzzInput(object obj, Random rand)
{
// Get the serialized data for the object
diff --git a/src/System.Runtime.Serialization.Formatters/tests/EqualityExtensions.cs b/src/System.Runtime.Serialization.Formatters/tests/EqualityExtensions.cs
index a2d435f9e2..162d0f8ddf 100644
--- a/src/System.Runtime.Serialization.Formatters/tests/EqualityExtensions.cs
+++ b/src/System.Runtime.Serialization.Formatters/tests/EqualityExtensions.cs
@@ -3,11 +3,17 @@
// See the LICENSE file in the project root for more information.
using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Collections.Specialized;
+using System.ComponentModel;
using System.Data;
+using System.Data.SqlTypes;
using System.Globalization;
using System.Linq;
using System.Net;
+using System.Runtime.CompilerServices;
+using Xunit;
namespace System.Runtime.Serialization.Formatters.Tests
{
@@ -83,13 +89,16 @@ namespace System.Runtime.Serialization.Formatters.Tests
@this.CaseSensitive == other.CaseSensitive &&
@this.Locale.LCID == other.Locale.LCID &&
@this.EnforceConstraints == other.EnforceConstraints &&
- @this.ExtendedProperties?.Count == other.ExtendedProperties?.Count;
+ @this.ExtendedProperties?.Count == other.ExtendedProperties?.Count &&
+ BinaryFormatterTests.CheckEquals(@this.ExtendedProperties, other.ExtendedProperties);
}
public static bool IsEqual(this DataTable @this, DataTable other)
{
+ Assert.Equal(@this.TableName, other.TableName);
return @this != null &&
other != null &&
+ @this.RemotingFormat == other.RemotingFormat &&
@this.TableName == other.TableName &&
@this.Namespace == other.Namespace &&
@this.Prefix == other.Prefix &&
@@ -130,5 +139,781 @@ namespace System.Runtime.Serialization.Formatters.Tests
other != null &&
@this.Count == other.Count;
}
+
+ public static bool IsEqual(this ArrayList @this, ArrayList other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Capacity == other.Capacity &&
+ @this.Count == other.Count &&
+ @this.IsFixedSize == other.IsFixedSize &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsSynchronized == other.IsSynchronized))
+ return false;
+
+ for (int i = 0; i < @this.Count; i++)
+ {
+ if (!BinaryFormatterTests.CheckEquals(@this[i], other[i]))
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this BitArray @this, BitArray other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Length == other.Length &&
+ @this.Count == other.Count &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsSynchronized == other.IsSynchronized))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this Dictionary<int, string> @this, Dictionary<int, string> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ BinaryFormatterTests.CheckEquals(@this.Comparer, other.Comparer) &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values)))
+ return false;
+
+ foreach (var kv in @this)
+ {
+ if (@this[kv.Key] != other[kv.Key])
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this PointEqualityComparer @this, PointEqualityComparer other)
+ {
+ return @this != null &&
+ other != null;
+ }
+
+ public static bool IsEqual(this HashSet<Point> @this, HashSet<Point> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckEquals(@this.Comparer, other.Comparer)))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this LinkedListNode<Point> @this, LinkedListNode<Point> other)
+ {
+ if (@this == null && other == null)
+ return true;
+
+ return @this != null
+ && other != null &&
+ BinaryFormatterTests.CheckEquals(@this.Value, other.Value);
+ }
+
+ public static bool IsEqual(this LinkedList<Point> @this, LinkedList<Point> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ IsEqual(@this.First, other.First) &&
+ IsEqual(@this.Last, other.Last)))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this List<int> @this, List<int> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Capacity == other.Capacity &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this Queue<int> @this, Queue<int> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this SortedList<int, Point> @this, SortedList<int, Point> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Capacity == other.Capacity &&
+ BinaryFormatterTests.CheckEquals(@this.Comparer, other.Comparer) &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values)))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this SortedSet<Point> @this, SortedSet<Point> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckEquals(@this.Comparer, other.Comparer) &&
+ BinaryFormatterTests.CheckEquals(@this.Min, other.Min) &&
+ BinaryFormatterTests.CheckEquals(@this.Max, other.Max)))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this Stack<Point> @this, Stack<Point> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this Hashtable @this, Hashtable other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsFixedSize == other.IsFixedSize &&
+ @this.IsSynchronized == other.IsSynchronized &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values) &&
+ @this.Count == other.Count))
+ return false;
+
+ foreach (var key in @this.Keys)
+ {
+ if (!BinaryFormatterTests.CheckEquals(@this[key], other[key]))
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this Collection<int> @this, Collection<int> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this ObservableCollection<int> @this, ObservableCollection<int> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this ReadOnlyCollection<int> @this, ReadOnlyCollection<int> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this ReadOnlyDictionary<int, string> @this, ReadOnlyDictionary<int, string> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values) &&
+ @this.Count == other.Count))
+ return false;
+
+ foreach (var kv in @this)
+ {
+ if (kv.Value != other[kv.Key])
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this ReadOnlyObservableCollection<int> @this, ReadOnlyObservableCollection<int> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this Queue @this, Queue other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ @this.IsSynchronized == other.IsSynchronized))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this SortedList @this, SortedList other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Capacity == other.Capacity &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values) &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsFixedSize == other.IsFixedSize &&
+ @this.IsSynchronized == other.IsSynchronized))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this HybridDictionary @this, HybridDictionary other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsFixedSize == other.IsFixedSize &&
+ @this.IsSynchronized == other.IsSynchronized &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values)))
+ return false;
+
+ foreach (var key in @this.Keys)
+ {
+ if (!BinaryFormatterTests.CheckEquals(@this[key], other[key]))
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this ListDictionary @this, ListDictionary other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsFixedSize == other.IsFixedSize &&
+ @this.IsSynchronized == other.IsSynchronized &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values)))
+ return false;
+
+ foreach (var key in @this.Keys)
+ {
+ if (!BinaryFormatterTests.CheckEquals(@this[key], other[key]))
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this NameValueCollection @this, NameValueCollection other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.AllKeys, other.AllKeys) &&
+ @this.Count == other.Count &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys)))
+ return false;
+
+ foreach (var key in @this.AllKeys)
+ {
+ if (!BinaryFormatterTests.CheckEquals(@this[key], other[key]))
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this OrderedDictionary @this, OrderedDictionary other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ BinaryFormatterTests.CheckEquals(@this.Keys, other.Keys) &&
+ BinaryFormatterTests.CheckEquals(@this.Values, other.Values)))
+ return false;
+
+ foreach (var key in @this.Keys)
+ {
+ if (!BinaryFormatterTests.CheckEquals(@this[key], other[key]))
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool IsEqual(this StringCollection @this, StringCollection other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsSynchronized == other.IsSynchronized))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this Stack @this, Stack other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count &&
+ @this.IsSynchronized == other.IsSynchronized))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this BindingList<int> @this, BindingList<int> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.RaiseListChangedEvents == other.RaiseListChangedEvents &&
+ @this.AllowNew == other.AllowNew &&
+ @this.AllowEdit == other.AllowEdit &&
+ @this.AllowRemove == other.AllowRemove &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this BindingList<Point> @this, BindingList<Point> other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.RaiseListChangedEvents == other.RaiseListChangedEvents &&
+ @this.AllowNew == other.AllowNew &&
+ @this.AllowEdit == other.AllowEdit &&
+ @this.AllowRemove == other.AllowRemove &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this PropertyCollection @this, PropertyCollection other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.IsReadOnly == other.IsReadOnly &&
+ @this.IsFixedSize == other.IsFixedSize &&
+ @this.IsSynchronized == other.IsSynchronized &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Keys, other.Keys) &&
+ BinaryFormatterTests.CheckSequenceEquals(@this.Values, other.Values) &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this CompareInfo @this, CompareInfo other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Name == other.Name &&
+ @this.LCID == other.LCID &&
+ // we do not want to compare Version because it can change when changing OS
+ // we do want to make sure that they are either both null or both not null
+ (@this.Version != null) == (other.Version != null);
+ }
+
+ public static bool IsEqual(this SortVersion @this, SortVersion other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.FullVersion == other.FullVersion &&
+ @this.SortId == other.SortId;
+ }
+
+ public static bool IsEqual(this Cookie @this, Cookie other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Comment == other.Comment &&
+ IsEqual(@this.CommentUri, other.CommentUri) &&
+ @this.HttpOnly == other.HttpOnly &&
+ @this.Discard == other.Discard &&
+ @this.Domain == other.Domain &&
+ @this.Expired == other.Expired &&
+ BinaryFormatterTests.CheckEquals(@this.Expires, other.Expires) &&
+ @this.Name == other.Name &&
+ @this.Path == other.Path &&
+ @this.Port == other.Port &&
+ @this.Secure == other.Secure &&
+ // This needs to have m_Timestamp set by reflection in order to roundtrip correctly
+ // otherwise this field will change each time you create an object and cause this to fail
+ BinaryFormatterTests.CheckEquals(@this.TimeStamp, other.TimeStamp) &&
+ @this.Value == other.Value &&
+ @this.Version == other.Version;
+ }
+
+ public static bool IsEqual(this CookieCollection @this, CookieCollection other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this BasicISerializableObject @this, BasicISerializableObject other)
+ {
+ return @this != null &&
+ other != null;
+ }
+
+ public static bool IsEqual(this DerivedISerializableWithNonPublicDeserializationCtor @this, DerivedISerializableWithNonPublicDeserializationCtor other)
+ {
+ return @this != null &&
+ other != null;
+ }
+
+ private static void GetIdsForGraphDFS(Graph<int> n, Dictionary<Graph<int>, int> ids)
+ {
+ if (!ids.ContainsKey(n))
+ {
+ ids[n] = ids.Count;
+ foreach (var link in n.Links)
+ {
+ GetIdsForGraphDFS(link, ids);
+ }
+ }
+ }
+
+ private static Dictionary<int, Graph<int>> InvertDictionary(Dictionary<Graph<int>, int> dict)
+ {
+ var ret = new Dictionary<int, Graph<int>>();
+ foreach (var kv in dict)
+ {
+ Assert.False(ret.ContainsKey(kv.Value));
+ ret[kv.Value] = kv.Key;
+ }
+
+ return ret;
+ }
+
+ /// <summary>
+ /// Flattens the graph
+ /// </summary>
+ /// <param name="n">node of a graph</param>
+ /// <returns>returns ((id -> node), (node -> node[]))</returns>
+ private static Tuple<Dictionary<int, Graph<int>>, List<List<int>>> FlattenGraph(Graph<int> n)
+ {
+ // ref -> id
+ var nodes = new Dictionary<Graph<int>, int>(new ReferenceComparer<Graph<int>>());
+ GetIdsForGraphDFS(n, nodes);
+
+ // id -> list of ids
+ var edges = new List<List<int>>();
+ for (int i = 0; i < nodes.Count; i++)
+ {
+ edges.Add(new List<int>());
+ }
+
+ foreach (var kv in nodes)
+ {
+ List<int> links = edges[kv.Value];
+ foreach (var link in kv.Key.Links)
+ {
+ links.Add(nodes[link]);
+ }
+ }
+
+ return new Tuple<Dictionary<int, Graph<int>>, List<List<int>>>(InvertDictionary(nodes), edges);
+ }
+
+ public static bool IsEqual(this Graph<int> @this, Graph<int> other)
+ {
+ var thisFlattened = FlattenGraph(@this);
+ var otherFlattened = FlattenGraph(other);
+
+ if (thisFlattened.Item1.Count != otherFlattened.Item1.Count ||
+ thisFlattened.Item2.Count != otherFlattened.Item2.Count)
+ return false;
+
+ for (int i = 0; i < thisFlattened.Item1.Count; i++)
+ {
+ if (thisFlattened.Item1[i].Value != otherFlattened.Item1[i].Value)
+ return false;
+ }
+
+ return BinaryFormatterTests.CheckEquals(thisFlattened.Item2, otherFlattened.Item2);
+ }
+
+ public static bool IsEqual(this ArraySegment<int> @this, ArraySegment<int> other)
+ {
+ if (!((@this.Array != null) == (other.Array != null) &&
+ @this.Count == other.Count &&
+ @this.Offset == other.Offset))
+ return false;
+
+ return @this.Array == null || BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this ObjectWithArrays @this, ObjectWithArrays other)
+ {
+ return @this != null &&
+ other != null &&
+ BinaryFormatterTests.CheckEquals(@this.IntArray, other.IntArray) &&
+ BinaryFormatterTests.CheckEquals(@this.StringArray, other.StringArray) &&
+ BinaryFormatterTests.CheckEquals(@this.TreeArray, other.TreeArray) &&
+ BinaryFormatterTests.CheckEquals(@this.ByteArray, other.ByteArray) &&
+ BinaryFormatterTests.CheckEquals(@this.JaggedArray, other.JaggedArray) &&
+ BinaryFormatterTests.CheckEquals(@this.MultiDimensionalArray, other.MultiDimensionalArray);
+ }
+
+ public static bool IsEqual(this ObjectWithIntStringUShortUIntULongAndCustomObjectFields @this, ObjectWithIntStringUShortUIntULongAndCustomObjectFields other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Member1 == other.Member1 &&
+ @this.Member2 == other.Member2 &&
+ @this._member3 == other._member3 &&
+ IsEqual(@this.Member4, other.Member4) &&
+ IsEqual(@this.Member4shared, other.Member4shared) &&
+ IsEqual(@this.Member5, other.Member5) &&
+ @this.Member6 == other.Member6 &&
+ @this.str1 == other.str1 &&
+ @this.str2 == other.str2 &&
+ @this.str3 == other.str3 &&
+ @this.str4 == other.str4 &&
+ @this.u16 == other.u16 &&
+ @this.u32 == other.u32 &&
+ @this.u64 == other.u64;
+ }
+
+ public static bool IsEqual(this Point @this, Point other)
+ {
+ if (@this == null && other == null)
+ return true;
+
+ return @this != null &&
+ other != null &&
+ @this.X == other.X &&
+ @this.Y == other.Y;
+ }
+
+ public static bool IsEqual(this SqlGuid @this, SqlGuid other)
+ {
+ return @this.IsNull == other.IsNull && (@this.IsNull || @this.Value == other.Value);
+ }
+
+ public static bool IsEqual(this SealedObjectWithIntStringFields @this, SealedObjectWithIntStringFields other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Member1 == other.Member1 &&
+ @this.Member2 == other.Member2 &&
+ @this.Member3 == other.Member3;
+ }
+
+ public static bool IsEqual(this SimpleKeyedCollection @this, SimpleKeyedCollection other)
+ {
+ if (!(@this != null &&
+ other != null &&
+ @this.Comparer.Equals(other.Comparer) &&
+ @this.Count == other.Count))
+ return false;
+
+ return BinaryFormatterTests.CheckSequenceEquals(@this, other);
+ }
+
+ public static bool IsEqual(this Tree<Colors> @this, Tree<Colors> other)
+ {
+ if (@this == null && other == null)
+ return true;
+
+ return @this != null &&
+ other != null &&
+ @this.Value == other.Value &&
+ IsEqual(@this.Left, other.Left) &&
+ IsEqual(@this.Right, other.Right);
+ }
+
+ public static bool IsEqual(this TimeZoneInfo @this, TimeZoneInfo other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Id == other.Id &&
+ @this.DisplayName == other.DisplayName &&
+ @this.StandardName == other.StandardName &&
+ @this.DaylightName == other.DaylightName &&
+ @this.BaseUtcOffset == other.BaseUtcOffset &&
+ @this.SupportsDaylightSavingTime == other.SupportsDaylightSavingTime;
+ }
+
+ public static bool IsEqual(this Tuple<int> @this, Tuple<int> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1;
+ }
+
+ public static bool IsEqual(this Tuple<int, string> @this, Tuple<int, string> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1 &&
+ @this.Item2 == other.Item2;
+ }
+
+ public static bool IsEqual(this Tuple<int, string, uint> @this, Tuple<int, string, uint> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1 &&
+ @this.Item2 == other.Item2 &&
+ @this.Item3 == other.Item3;
+ }
+
+ public static bool IsEqual(this Tuple<int, string, uint, long> @this, Tuple<int, string, uint, long> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1 &&
+ @this.Item2 == other.Item2 &&
+ @this.Item3 == other.Item3 &&
+ @this.Item4 == other.Item4;
+ }
+
+ public static bool IsEqual(this Tuple<int, string, uint, long, double> @this, Tuple<int, string, uint, long, double> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1 &&
+ @this.Item2 == other.Item2 &&
+ @this.Item3 == other.Item3 &&
+ @this.Item4 == other.Item4 &&
+ @this.Item5 == other.Item5;
+ }
+
+ public static bool IsEqual(this Tuple<int, string, uint, long, double, float> @this, Tuple<int, string, uint, long, double, float> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1 &&
+ @this.Item2 == other.Item2 &&
+ @this.Item3 == other.Item3 &&
+ @this.Item4 == other.Item4 &&
+ @this.Item5 == other.Item5 &&
+ @this.Item6 == other.Item6;
+ }
+
+ public static bool IsEqual(this Tuple<int, string, uint, long, double, float, decimal> @this, Tuple<int, string, uint, long, double, float, decimal> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1 &&
+ @this.Item2 == other.Item2 &&
+ @this.Item3 == other.Item3 &&
+ @this.Item4 == other.Item4 &&
+ @this.Item5 == other.Item5 &&
+ @this.Item6 == other.Item6 &&
+ @this.Item7 == other.Item7;
+ }
+
+ public static bool IsEqual(this Tuple<int, string, uint, long, double, float, decimal, Tuple<Tuple<int>>> @this, Tuple<int, string, uint, long, double, float, decimal, Tuple<Tuple<int>>> other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Item1 == other.Item1 &&
+ @this.Item2 == other.Item2 &&
+ @this.Item3 == other.Item3 &&
+ @this.Item4 == other.Item4 &&
+ @this.Item5 == other.Item5 &&
+ @this.Item6 == other.Item6 &&
+ @this.Item7 == other.Item7 &&
+ @this.Rest.Item1.Item1 == other.Rest.Item1.Item1;
+ }
+
+ public static bool IsEqual(this Uri @this, Uri other)
+ {
+ if (@this == null && other == null)
+ return true;
+
+ return @this != null &&
+ other != null &&
+ @this.AbsolutePath == other.AbsolutePath &&
+ @this.AbsoluteUri == other.AbsoluteUri &&
+ @this.LocalPath == other.LocalPath &&
+ @this.Authority == other.Authority &&
+ @this.HostNameType == other.HostNameType &&
+ @this.IsDefaultPort == other.IsDefaultPort &&
+ @this.IsFile == other.IsFile &&
+ @this.IsLoopback == other.IsLoopback &&
+ @this.PathAndQuery == other.PathAndQuery &&
+ @this.Segments.SequenceEqual(other.Segments) &&
+ @this.IsUnc == other.IsUnc &&
+ @this.Host == other.Host &&
+ @this.Port == other.Port &&
+ @this.Query == other.Query &&
+ @this.Fragment == other.Fragment &&
+ @this.Scheme == other.Scheme &&
+ @this.DnsSafeHost == other.DnsSafeHost &&
+ @this.IdnHost == other.IdnHost &&
+ @this.IsAbsoluteUri == other.IsAbsoluteUri &&
+ @this.UserEscaped == other.UserEscaped &&
+ @this.UserInfo == other.UserInfo;
+ }
+
+ public static bool IsEqual(this Version @this, Version other)
+ {
+ return @this != null &&
+ other != null &&
+ @this.Major == other.Major &&
+ @this.Minor == other.Minor &&
+ @this.Build == other.Build &&
+ @this.Revision == other.Revision &&
+ @this.MajorRevision == other.MajorRevision &&
+ @this.MinorRevision == other.MinorRevision;
+ }
+
+ public class ReferenceComparer<T> : IEqualityComparer<T> where T: class
+ {
+ public bool Equals(T x, T y)
+ {
+ return ReferenceEquals(x, y);
+ }
+
+ public int GetHashCode(T x)
+ {
+ return RuntimeHelpers.GetHashCode(x);
+ }
+ }
}
}
diff --git a/src/System.Runtime.Serialization.Formatters/tests/SerializationTypes.cs b/src/System.Runtime.Serialization.Formatters/tests/SerializationTypes.cs
index 7b2642e655..beeb65038b 100644
--- a/src/System.Runtime.Serialization.Formatters/tests/SerializationTypes.cs
+++ b/src/System.Runtime.Serialization.Formatters/tests/SerializationTypes.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
@@ -199,7 +200,7 @@ namespace System.Runtime.Serialization.Formatters.Tests
}
[Serializable]
- internal sealed class ObjectWithArrays
+ public sealed class ObjectWithArrays
{
public int[] IntArray;
public string[] StringArray;
@@ -456,7 +457,7 @@ namespace System.Runtime.Serialization.Formatters.Tests
}
[Serializable]
- internal sealed class PointEqualityComparer : IEqualityComparer<Point>
+ public sealed class PointEqualityComparer : IEqualityComparer<Point>
{
public bool Equals(Point x, Point y) => (x.X == y.X) && (x.Y == y.Y);
@@ -464,7 +465,7 @@ namespace System.Runtime.Serialization.Formatters.Tests
}
[Serializable]
- internal class SimpleKeyedCollection : System.Collections.ObjectModel.KeyedCollection<int, Point>
+ public class SimpleKeyedCollection : System.Collections.ObjectModel.KeyedCollection<int, Point>
{
protected override int GetKeyForItem(Point item)
{
@@ -582,4 +583,15 @@ namespace System.Runtime.Serialization.Formatters.Tests
return true;
}
}
+
+#pragma warning disable 0618 // obsolete warning
+ [Serializable]
+ internal class HashCodeProvider : IHashCodeProvider
+ {
+ public int GetHashCode(object obj)
+ {
+ return 8;
+ }
+ }
+#pragma warning restore 0618
}
diff --git a/src/System.Runtime.Serialization.Formatters/tests/System.Runtime.Serialization.Formatters.Tests.csproj b/src/System.Runtime.Serialization.Formatters/tests/System.Runtime.Serialization.Formatters.Tests.csproj
index 29c663616c..9eb51250ba 100644
--- a/src/System.Runtime.Serialization.Formatters/tests/System.Runtime.Serialization.Formatters.Tests.csproj
+++ b/src/System.Runtime.Serialization.Formatters/tests/System.Runtime.Serialization.Formatters.Tests.csproj
@@ -29,12 +29,6 @@
<Compile Include="$(CommonTestPath)\System\NonRuntimeType.cs">
<Link>Common\System\NonRuntimeType.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>CommonTest\System\PlatformDetection.cs</Link>
</Compile>
diff --git a/src/System.Runtime.Serialization.Json/tests/DataContractJsonSerializer.cs b/src/System.Runtime.Serialization.Json/tests/DataContractJsonSerializer.cs
index cf1f4a1705..5b1f937cc8 100644
--- a/src/System.Runtime.Serialization.Json/tests/DataContractJsonSerializer.cs
+++ b/src/System.Runtime.Serialization.Json/tests/DataContractJsonSerializer.cs
@@ -444,7 +444,9 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
+#if ReflectionOnly
+ [ActiveIssue("dotnet/corefx #21143", TargetFrameworkMonikers.UapAot)]
+#endif
public static void DCJS_GetOonlyDictionary_UseSimpleDictionaryFormat()
{
var x = new TypeWithDictionaryGenericMembers();
@@ -1504,7 +1506,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_GenericQueue()
{
Queue<int> value = new Queue<int>();
@@ -1518,7 +1519,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_GenericStack()
{
var value = new Stack<int>();
@@ -1534,7 +1534,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_Queue()
{
var value = new Queue();
@@ -1549,7 +1548,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_Stack()
{
var value = new Stack();
@@ -1565,7 +1563,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_SortedList()
{
var value = new SortedList();
@@ -1578,7 +1575,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_SystemVersion()
{
Version value = new Version(1, 2, 3, 4);
@@ -1689,7 +1685,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_ReadOnlyCollection()
{
List<string> list = new List<string>() { "Foo", "Bar" };
@@ -1701,7 +1696,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_ReadOnlyDictionary()
{
var dict = new Dictionary<string, int>();
@@ -2702,7 +2696,6 @@ public static partial class DataContractJsonSerializerTests
Assert.Equal(4, actual2["a4"]);
}
- [ActiveIssue("dotnet/corefx #20481", TargetFrameworkMonikers.UapAot)]
[Fact]
public static void DCJS_VerifyDictionaryFormat()
{
@@ -2857,7 +2850,6 @@ public static partial class DataContractJsonSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCJS_ReadOnlyDictionaryCausingDuplicateInvalidDataContract()
{
var dict = new Dictionary<string, int>();
diff --git a/src/System.Runtime.Serialization.Json/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Json.ReflectionOnly.Tests.rd.xml b/src/System.Runtime.Serialization.Json/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Json.ReflectionOnly.Tests.rd.xml
new file mode 100644
index 0000000000..f4d3e425d7
--- /dev/null
+++ b/src/System.Runtime.Serialization.Json/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Json.ReflectionOnly.Tests.rd.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
+ <Library Name="*System.Runtime.Serialization.Json.ReflectionOnly.Tests*">
+ <Namespace Name="System.Collections">
+ <Type Name="ArrayList" Dynamic="Required All" />
+ <Type Name="IList" Dynamic="Required All" />
+ <Type Name="List" Dynamic="Required All" />
+ <Type Name="Queue" Dynamic="Required All" />
+ <Type Name="Stack" Dynamic="Required All" />
+ <Type Name="SortedList" Dynamic="Required All" />
+ </Namespace>
+ <Namespace Name="System.Collections.Generic">
+ <Type Name="Queue`1" Dynamic="Required All" />
+ <Type Name="Stack`1" Dynamic="Required All" />
+ </Namespace>
+ <Namespace Name="System.Collections.ObjectModel">
+ <Type Name="ReadOnlyCollection`1" Dynamic="Required All" />
+ <Type Name="ReadOnlyDictionary`2" Dynamic="Required All" />
+ </Namespace>
+ <Type Name="System.Version" Dynamic="Required All" />
+ </Library>
+</Directives>
diff --git a/src/System.Runtime.Serialization.Json/tests/ReflectionOnly/System.Runtime.Serialization.Json.ReflectionOnly.Tests.csproj b/src/System.Runtime.Serialization.Json/tests/ReflectionOnly/System.Runtime.Serialization.Json.ReflectionOnly.Tests.csproj
index cef0e3d74b..b5b20ca402 100644
--- a/src/System.Runtime.Serialization.Json/tests/ReflectionOnly/System.Runtime.Serialization.Json.ReflectionOnly.Tests.csproj
+++ b/src/System.Runtime.Serialization.Json/tests/ReflectionOnly/System.Runtime.Serialization.Json.ReflectionOnly.Tests.csproj
@@ -21,5 +21,8 @@
<Compile Include="$(TestSourceFolder)..\DataContractJsonSerializer.CoreCLR.cs" />
<Compile Include="$(TestSourceFolder)..\..\..\System.Runtime.Serialization.Xml\tests\SerializationTypes.CoreCLR.cs" />
</ItemGroup>
+ <ItemGroup Condition="'$(TargetGroup)'=='uapaot'">
+ <EmbeddedResource Include="$(MsBuildThisFileDirectory)Resources\$(AssemblyName).rd.xml" />
+ </ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Runtime.Serialization.Xml/tests/DataContractSerializer.cs b/src/System.Runtime.Serialization.Xml/tests/DataContractSerializer.cs
index bdc51a872a..8726aa249f 100644
--- a/src/System.Runtime.Serialization.Xml/tests/DataContractSerializer.cs
+++ b/src/System.Runtime.Serialization.Xml/tests/DataContractSerializer.cs
@@ -628,7 +628,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_ListMembers()
{
TypeWithListMembers x = new TypeWithListMembers
@@ -1599,7 +1598,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_GenericQueue()
{
Queue<int> value = new Queue<int>();
@@ -1613,7 +1611,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_GenericStack()
{
var value = new Stack<int>();
@@ -1629,7 +1626,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_Queue()
{
var value = new Queue();
@@ -1644,7 +1640,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_Stack()
{
var value = new Stack();
@@ -1660,7 +1655,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_SortedList()
{
var value = new SortedList();
@@ -1673,7 +1667,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_SystemVersion()
{
Version value = new Version(1, 2, 3, 4);
@@ -1879,7 +1872,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_ReadOnlyCollection()
{
List<string> list = new List<string>() { "Foo", "Bar" };
@@ -1891,7 +1883,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_ReadOnlyDictionary()
{
var dict = new Dictionary<string, int>();
@@ -3050,7 +3041,6 @@ public static partial class DataContractSerializerTests
}
[Fact]
- [ActiveIssue("dotnet/corefx #20478", TargetFrameworkMonikers.UapAot)]
public static void DCS_BasicRoundtripDCRDefaultCollections()
{
var defaultCollections = new SerializationTestTypes.DefaultCollections();
diff --git a/src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.rd.xml b/src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.rd.xml
new file mode 100644
index 0000000000..fda8079424
--- /dev/null
+++ b/src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/Resources/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.rd.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
+ <Library Name="*System.Runtime.Serialization.Xml.ReflectionOnly.Tests*">
+ <Namespace Name="System.Collections">
+ <Type Name="ArrayList" Dynamic="Required All" />
+ <Type Name="IList" Dynamic="Required All" />
+ <Type Name="List" Dynamic="Required All" />
+ <Type Name="Queue" Dynamic="Required All" />
+ <Type Name="Stack" Dynamic="Required All" />
+ <Type Name="SortedList" Dynamic="Required All" />
+ </Namespace>
+ <Namespace Name="System.Collections.Generic">
+ <Type Name="Queue`1" Dynamic="Required All" />
+ <Type Name="Stack`1" Dynamic="Required All" />
+ </Namespace>
+ <Namespace Name="System.Collections.ObjectModel">
+ <Type Name="ReadOnlyCollection`1" Dynamic="Required All" />
+ <Type Name="ReadOnlyDictionary`2" Dynamic="Required All" />
+ </Namespace>
+ <Type Name="System.Version" Dynamic="Required All" />
+ </Library>
+</Directives>
diff --git a/src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.csproj b/src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.csproj
index da0bc6bc7a..23090ab9b4 100644
--- a/src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.csproj
+++ b/src/System.Runtime.Serialization.Xml/tests/ReflectionOnly/System.Runtime.Serialization.Xml.ReflectionOnly.Tests.csproj
@@ -38,5 +38,8 @@
<Compile Include="$(TestSourceFolder)..\SerializationTypes.CoreCLR.cs" />
<Compile Include="$(TestSourceFolder)..\DataContractSerializer.CoreCLR.cs" />
</ItemGroup>
+ <ItemGroup Condition="'$(TargetGroup)'=='uapaot'">
+ <EmbeddedResource Include="$(MsBuildThisFileDirectory)Resources\$(AssemblyName).rd.xml" />
+ </ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Runtime.WindowsRuntime/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeBuffer.cs b/src/System.Runtime.WindowsRuntime/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeBuffer.cs
index 7eb927f7be..0c01d7ebd8 100644
--- a/src/System.Runtime.WindowsRuntime/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeBuffer.cs
+++ b/src/System.Runtime.WindowsRuntime/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeBuffer.cs
@@ -76,18 +76,18 @@ namespace System.Runtime.InteropServices.WindowsRuntime
// This object handles IMarshal calls for us:
[ThreadStatic]
- private static IMarshal s_winRtMarshalProxy = null;
+ private static IMarshal t_winRtMarshalProxy = null;
private static void EnsureHasMarshalProxy()
{
- if (s_winRtMarshalProxy != null)
+ if (t_winRtMarshalProxy != null)
return;
try
{
IMarshal proxy;
Int32 hr = Interop.mincore.RoGetBufferMarshaler(out proxy);
- s_winRtMarshalProxy = proxy;
+ t_winRtMarshalProxy = proxy;
if (hr != HResults.S_OK)
{
@@ -278,42 +278,42 @@ namespace System.Runtime.InteropServices.WindowsRuntime
void IMarshal.DisconnectObject(UInt32 dwReserved)
{
EnsureHasMarshalProxy();
- s_winRtMarshalProxy.DisconnectObject(dwReserved);
+ t_winRtMarshalProxy.DisconnectObject(dwReserved);
}
void IMarshal.GetMarshalSizeMax(ref Guid riid, IntPtr pv, UInt32 dwDestContext, IntPtr pvDestContext, UInt32 mshlflags, out UInt32 pSize)
{
EnsureHasMarshalProxy();
- s_winRtMarshalProxy.GetMarshalSizeMax(ref riid, pv, dwDestContext, pvDestContext, mshlflags, out pSize);
+ t_winRtMarshalProxy.GetMarshalSizeMax(ref riid, pv, dwDestContext, pvDestContext, mshlflags, out pSize);
}
void IMarshal.GetUnmarshalClass(ref Guid riid, IntPtr pv, UInt32 dwDestContext, IntPtr pvDestContext, UInt32 mshlFlags, out Guid pCid)
{
EnsureHasMarshalProxy();
- s_winRtMarshalProxy.GetUnmarshalClass(ref riid, pv, dwDestContext, pvDestContext, mshlFlags, out pCid);
+ t_winRtMarshalProxy.GetUnmarshalClass(ref riid, pv, dwDestContext, pvDestContext, mshlFlags, out pCid);
}
void IMarshal.MarshalInterface(IntPtr pStm, ref Guid riid, IntPtr pv, UInt32 dwDestContext, IntPtr pvDestContext, UInt32 mshlflags)
{
EnsureHasMarshalProxy();
- s_winRtMarshalProxy.MarshalInterface(pStm, ref riid, pv, dwDestContext, pvDestContext, mshlflags);
+ t_winRtMarshalProxy.MarshalInterface(pStm, ref riid, pv, dwDestContext, pvDestContext, mshlflags);
}
void IMarshal.ReleaseMarshalData(IntPtr pStm)
{
EnsureHasMarshalProxy();
- s_winRtMarshalProxy.ReleaseMarshalData(pStm);
+ t_winRtMarshalProxy.ReleaseMarshalData(pStm);
}
void IMarshal.UnmarshalInterface(IntPtr pStm, ref Guid riid, out IntPtr ppv)
{
EnsureHasMarshalProxy();
- s_winRtMarshalProxy.UnmarshalInterface(pStm, ref riid, out ppv);
+ t_winRtMarshalProxy.UnmarshalInterface(pStm, ref riid, out ppv);
}
#endregion Implementation of IMarshal
diff --git a/src/System.Runtime.WindowsRuntime/tests/System.Runtime.WindowsRuntime.Tests.csproj b/src/System.Runtime.WindowsRuntime/tests/System.Runtime.WindowsRuntime.Tests.csproj
index c11d5e9a18..17597dbc61 100644
--- a/src/System.Runtime.WindowsRuntime/tests/System.Runtime.WindowsRuntime.Tests.csproj
+++ b/src/System.Runtime.WindowsRuntime/tests/System.Runtime.WindowsRuntime.Tests.csproj
@@ -8,9 +8,15 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Windows_NT-Release|AnyCPU'" />
<ItemGroup>
+ <Compile Include="..\..\Common\tests\System\AssertExtensions.cs">
+ <Link>AssertExtensions.cs</Link>
+ </Compile>
+ <Compile Include="System\IO\AsWinRTStreamTests.cs" />
+ <Compile Include="System\IO\TestStreamProvider.cs" />
<Compile Include="System\IO\StorageFileMock.cs" />
<Compile Include="System\IO\CreateSafeFileHandleTests.cs" />
<Compile Include="System\IO\StorageFolderMock.cs" />
+ <Compile Include="System\IO\WriteOnlyStream.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="Windows" />
diff --git a/src/System.Runtime.WindowsRuntime/tests/System/IO/AsWinRTStreamTests.cs b/src/System.Runtime.WindowsRuntime/tests/System/IO/AsWinRTStreamTests.cs
new file mode 100644
index 0000000000..582f1348ca
--- /dev/null
+++ b/src/System.Runtime.WindowsRuntime/tests/System/IO/AsWinRTStreamTests.cs
@@ -0,0 +1,396 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.InteropServices.WindowsRuntime;
+using System.Threading;
+using Windows.Foundation;
+using Windows.Storage.Streams;
+using Xunit;
+
+namespace System.IO
+{
+ public class AsWinRTStreamTests
+ {
+ [Fact]
+ public static void AsInputStream_FromReadOnlyStream()
+ {
+ Stream managedStream = TestStreamProvider.CreateReadOnlyStream();
+ using (IInputStream ins = managedStream.AsInputStream())
+ {
+ Assert.NotNull(ins);
+
+ // Adapting a read-only managed Stream to IOutputStream must throw a NotSupportedException
+ Assert.Throws<NotSupportedException>(() => { IOutputStream outs = managedStream.AsOutputStream(); });
+ }
+ }
+
+ [Fact]
+ public static void AsOutputStream_FromWriteOnlyStream()
+ {
+ Stream managedStream = TestStreamProvider.CreateWriteOnlyStream();
+ using (IOutputStream outs = managedStream.AsOutputStream())
+ {
+ Assert.NotNull(outs);
+
+ // Adapting a write-only managed Stream to IInputStream must throw a NotSupportedException
+ Assert.Throws<NotSupportedException>(() => { IInputStream ins = managedStream.AsInputStream(); });
+ }
+ }
+
+ [Fact]
+ public static void AsInputStream_WrapsToSameInstance()
+ {
+ Stream managedStream = TestStreamProvider.CreateReadOnlyStream();
+ using (IInputStream ins = managedStream.AsInputStream())
+ {
+ Assert.NotNull(ins);
+ Assert.Same(ins, managedStream.AsInputStream());
+ }
+ }
+
+ [Fact]
+ public static void AsOutputStream_WrapsToSameInstance()
+ {
+ Stream managedStream = TestStreamProvider.CreateWriteOnlyStream();
+ using (IOutputStream outs = managedStream.AsOutputStream())
+ {
+ Assert.NotNull(outs);
+ Assert.Same(outs, managedStream.AsOutputStream());
+ }
+ }
+
+ [Fact]
+ public static void AsInputStream_RoundtripUnwrap()
+ {
+ // NetFx Stream -> IInputStream -> NetFx Stream -> roundtrip reference equality is preserved
+ Stream managedStream = TestStreamProvider.CreateReadOnlyStream();
+ using (IInputStream ins = managedStream.AsInputStream())
+ {
+ Assert.Same(managedStream, ins.AsStreamForRead());
+ }
+ }
+
+ [Fact]
+ public static void AsOutputStream_RoundtripUnwrap()
+ {
+ // NetFx Stream -> IOutputStream -> NetFx Stream -> roundtrip reference equality is preserved
+ Stream managedStream = TestStreamProvider.CreateWriteOnlyStream();
+ using (IOutputStream outs = managedStream.AsOutputStream())
+ {
+ Assert.Same(managedStream, outs.AsStreamForWrite());
+ }
+ }
+
+ [Fact]
+ public static void AsInputStream_Equal()
+ {
+ Stream stream = TestStreamProvider.CreateReadOnlyStream();
+
+ using (IInputStream insOne = stream.AsInputStream())
+ using (IInputStream insTwo = stream.AsInputStream())
+ {
+ Assert.Equal(insOne, insTwo);
+ }
+ }
+
+ [Fact]
+ public static void AsInputStream_NotEqual()
+ {
+ Stream streamOne = TestStreamProvider.CreateReadOnlyStream();
+ Stream streamTwo = TestStreamProvider.CreateReadOnlyStream();
+
+ Assert.NotEqual(streamOne, streamTwo);
+
+ using (IInputStream insOne = streamOne.AsInputStream())
+ using (IInputStream insTwo = streamTwo.AsInputStream())
+ {
+ Assert.NotEqual(insOne, insTwo);
+ }
+ }
+
+ [Fact]
+ public static void AsOutputStream_Equal()
+ {
+ Stream stream = TestStreamProvider.CreateWriteOnlyStream();
+
+ using (IOutputStream outsOne = stream.AsOutputStream())
+ using (IOutputStream outsTwo = stream.AsOutputStream())
+ {
+ Assert.Equal(outsOne, outsOne);
+ }
+ }
+
+ [Fact]
+ public static void AsOutputStream_NotEqual()
+ {
+ Stream streamOne = TestStreamProvider.CreateWriteOnlyStream();
+ Stream streamTwo = TestStreamProvider.CreateWriteOnlyStream();
+
+ Assert.NotEqual(streamOne, streamTwo);
+
+ using (IOutputStream outsOne = streamOne.AsOutputStream())
+ using (IOutputStream outsTwo = streamTwo.AsOutputStream())
+ {
+ Assert.NotEqual(outsOne, outsTwo);
+ }
+ }
+
+ [Fact]
+ public static void TestRead_MemoryStream_None()
+ {
+ DoTestRead(TestStreamProvider.CreateMemoryStreamAsInputStream, InputStreamOptions.None, mustInvokeProgressHandler: false, completesSynchronously: true);
+ }
+
+ [Fact]
+ public static void TestRead_MemoryStream_Partial()
+ {
+ DoTestRead(TestStreamProvider.CreateMemoryStreamAsInputStream, InputStreamOptions.Partial, mustInvokeProgressHandler: false, completesSynchronously: true);
+ }
+
+ [Fact]
+ public static void TestWrite_MemoryStream()
+ {
+ DoTestWrite(TestStreamProvider.CreateMemoryStream, mustInvokeProgressHandler: false);
+ }
+
+ private static void DoTestRead(Func<IInputStream> createStreamFunc, InputStreamOptions inputStreamOptions, bool mustInvokeProgressHandler, bool completesSynchronously)
+ {
+
+ IInputStream stream = createStreamFunc();
+ IBuffer buffer = WindowsRuntimeBuffer.Create(TestStreamProvider.ModelStreamLength);
+
+ IAsyncOperationWithProgress<IBuffer, uint> readOp = stream.ReadAsync(buffer, (uint)TestStreamProvider.ModelStreamLength, inputStreamOptions);
+
+ if (completesSynchronously)
+ {
+ // New readOp for a stream where we know that reading is sycnhronous must have Status = Completed
+ Assert.Equal(AsyncStatus.Completed, readOp.Status);
+ }
+ else
+ {
+ // Note the race. By the tie we get here, the status of the op may be started or already completed.
+ AsyncStatus readOpStatus = readOp.Status;
+ Assert.True(readOpStatus == AsyncStatus.Completed || readOpStatus == AsyncStatus.Started, "New readOp must have Status = Started or Completed (race)");
+ }
+
+ bool progressCallbackInvoked = false;
+ bool completedCallbackInvoked = false;
+
+ uint readOpId = readOp.Id;
+ EventWaitHandle waitHandle = new ManualResetEvent(false);
+
+ readOp.Progress = (asyncReadOp, bytesCompleted) =>
+ {
+ progressCallbackInvoked = true;
+
+ // asyncReadOp.Id in a progress callback must match the ID of the asyncReadOp to which the callback was assigned
+ Assert.Equal(readOpId, asyncReadOp.Id);
+
+ // asyncReadOp.Status must be 'Started' for a asyncReadOp in progress
+ Assert.Equal(AsyncStatus.Started, asyncReadOp.Status);
+
+ // bytesCompleted must be in range [0, maxBytesToRead] asyncReadOp in progress
+ Assert.InRange(bytesCompleted, 0u, (uint)TestStreamProvider.ModelStreamLength);
+ };
+
+ readOp.Completed = (asyncReadOp, passedStatus) =>
+ {
+ try
+ {
+ completedCallbackInvoked = true;
+
+ // asyncReadOp.Id in a completion callback must match the ID of the asyncReadOp to which the callback was assigned
+ Assert.Equal(readOpId, asyncReadOp.Id);
+
+ // asyncReadOp.Status must match passedStatus for a completed asyncReadOp
+ Assert.Equal(passedStatus, asyncReadOp.Status);
+
+ // asyncReadOp.Status must be 'Completed' for a completed asyncReadOp
+ Assert.Equal(AsyncStatus.Completed, asyncReadOp.Status);
+
+ IBuffer resultBuffer = asyncReadOp.GetResults();
+
+ // asyncReadOp.GetResults() must not return null for a completed asyncReadOp
+ Assert.NotNull(resultBuffer);
+
+ AssertExtensions.GreaterThan(resultBuffer.Capacity, 0u, "resultBuffer.Capacity should be more than zero in completed callback");
+ AssertExtensions.GreaterThan(resultBuffer.Length, 0u, "resultBuffer.Length should be more than zero in completed callback");
+ AssertExtensions.LessThanOrEqualTo(resultBuffer.Length, resultBuffer.Capacity, "resultBuffer.Length should be <= Capacity in completed callback");
+
+ if (inputStreamOptions == InputStreamOptions.None)
+ {
+ // resultBuffer.Length must be equal to requested number of bytes when an asyncReadOp with
+ // InputStreamOptions.None completes successfully
+ Assert.Equal(resultBuffer.Length, (uint)TestStreamProvider.ModelStreamLength);
+ }
+
+ if (inputStreamOptions == InputStreamOptions.Partial)
+ {
+ AssertExtensions.LessThanOrEqualTo(resultBuffer.Length, (uint)TestStreamProvider.ModelStreamLength,
+ "resultBuffer.Length must be <= requested number of bytes with InputStreamOptions.Partial in completed callback");
+ }
+ buffer = resultBuffer;
+ }
+ finally
+ {
+ waitHandle.Set();
+ }
+ };
+
+ // Now, let's block until the read op is complete.
+ // We speculate that it will complete within 3500 msec, although under high load it may not be.
+ // If the test fails we should use a better way to determine if callback is really not invoked, or if it's just too slow.
+ waitHandle.WaitOne(500);
+ waitHandle.WaitOne(1000);
+ waitHandle.WaitOne(2000);
+
+ if (mustInvokeProgressHandler)
+ {
+ Assert.True(progressCallbackInvoked,
+ "Progress callback specified to ReadAsync callback must be invoked when reading from this kind of stream");
+ }
+
+ Assert.True(completedCallbackInvoked,
+ "Completion callback specified to ReadAsync callback must be invoked");
+
+ // readOp.Status must be 'Completed' for a completed async readOp
+ Assert.Equal(AsyncStatus.Completed, readOp.Status);
+
+ AssertExtensions.GreaterThan(buffer.Capacity, 0u, "buffer.Capacity should be greater than zero bytes");
+ AssertExtensions.GreaterThan(buffer.Length, 0u, "buffer.Length should be greater than zero bytes");
+ AssertExtensions.LessThanOrEqualTo(buffer.Length, buffer.Capacity, "buffer.Length <= buffer.Capacity is required for a completed async readOp");
+
+ if (inputStreamOptions == InputStreamOptions.None)
+ {
+ // buffer.Length must be equal to requested number of bytes when an async readOp with
+ // InputStreamOptions.None completes successfully
+ Assert.Equal((uint)TestStreamProvider.ModelStreamLength, buffer.Length);
+ }
+
+ if (inputStreamOptions == InputStreamOptions.Partial)
+ {
+ AssertExtensions.LessThanOrEqualTo(buffer.Length, (uint)TestStreamProvider.ModelStreamLength,
+ "resultBuffer.Length must be <= requested number of bytes with InputStreamOptions.Partial");
+ }
+
+ byte[] results = new byte[buffer.Length];
+ buffer.CopyTo(0, results, 0, (int)buffer.Length);
+
+ Assert.True(TestStreamProvider.CheckContent(results, 0, (int)buffer.Length),
+ "Result data returned from AsyncRead must be the same as expected from the test data source");
+ }
+
+ private static void DoTestWrite(Func<Stream> createStreamFunc, bool mustInvokeProgressHandler)
+ {
+ Stream backingStream = createStreamFunc();
+ using (IOutputStream stream = backingStream.AsOutputStream())
+ {
+ // Create test data
+ Random rnd = new Random(20100720); // Must be a different seed than used for TestStreamProvider.ModelStreamContents
+ byte[] modelWriteData = new byte[0xA000];
+ rnd.NextBytes(modelWriteData);
+
+ // Start test
+
+ IBuffer buffer = modelWriteData.AsBuffer();
+
+ // ibuffer.Length for IBuffer created by Array.ToBuffer(void) must equal to array.Length
+ Assert.Equal((uint)modelWriteData.Length, buffer.Length);
+
+ // ibuffer.Capacity for IBuffer created by Array.ToBuffer(void) must equal to array.Length
+ Assert.Equal((uint)modelWriteData.Length, buffer.Capacity);
+
+ IAsyncOperationWithProgress<uint, uint> writeOp = stream.WriteAsync(buffer);
+
+ // Note the race. By the tie we get here, the status of the op may be started or already completed.
+ AsyncStatus writeOpStatus = writeOp.Status;
+ Assert.True(writeOpStatus == AsyncStatus.Completed || writeOpStatus == AsyncStatus.Started, "New writeOp must have Status = Started or Completed (race)");
+
+ uint writeOpId = writeOp.Id;
+ bool progressCallbackInvoked = false;
+ bool completedCallbackInvoked = false;
+ uint resultBytesWritten = 0;
+
+ EventWaitHandle waitHandle = new ManualResetEvent(false);
+
+ writeOp.Progress = (asyncWriteOp, bytesCompleted) =>
+ {
+ progressCallbackInvoked = true;
+
+ // asyncWriteOp.Id in a progress callback must match the ID of the asyncWriteOp to which the callback was assigned
+ Assert.Equal(writeOpId, asyncWriteOp.Id);
+
+ // asyncWriteOp.Status must be 'Started' for a asyncWriteOp in progress
+ Assert.Equal(AsyncStatus.Started, asyncWriteOp.Status);
+
+ // bytesCompleted must be in range [0, maxBytesToWrite] asyncWriteOp in progress
+ Assert.InRange(bytesCompleted, 0u, (uint)TestStreamProvider.ModelStreamLength);
+ };
+
+ writeOp.Completed = (asyncWriteOp, passedStatus) =>
+ {
+ try
+ {
+ completedCallbackInvoked = true;
+
+ // asyncWriteOp.Id in a completion callback must match the ID of the asyncWriteOp to which the callback was assigned
+ Assert.Equal(writeOpId, asyncWriteOp.Id);
+
+ // asyncWriteOp.Status must match passedStatus for a completed asyncWriteOp
+ Assert.Equal(passedStatus, asyncWriteOp.Status);
+
+ // asyncWriteOp.Status must be 'Completed' for a completed asyncWriteOp
+ Assert.Equal(AsyncStatus.Completed, asyncWriteOp.Status);
+
+ uint bytesWritten = asyncWriteOp.GetResults();
+
+ // asyncWriteOp.GetResults() must return that all required bytes were written for a completed asyncWriteOp
+ Assert.Equal((uint)modelWriteData.Length, bytesWritten);
+
+ resultBytesWritten = bytesWritten;
+ }
+ finally
+ {
+ waitHandle.Set();
+ }
+ };
+
+ // Now, let's block until the write op is complete.
+ // We speculate that it will complete within 3500 msec, although under high load it may not be.
+ // If the test fails we should use a better way to determine if callback is really not invoked, or if it's just too slow.
+ waitHandle.WaitOne(500);
+ waitHandle.WaitOne(1000);
+ waitHandle.WaitOne(2000);
+
+ if (mustInvokeProgressHandler)
+ {
+ Assert.True(progressCallbackInvoked,
+ "Progress callback specified to WriteAsync callback must be invoked when reading from this kind of stream");
+ }
+
+ Assert.True(completedCallbackInvoked, "Completion callback specified to WriteAsync callback must be invoked");
+
+ // writeOp.Status must be 'Completed' for a completed async writeOp
+ Assert.Equal(AsyncStatus.Completed, writeOp.Status);
+
+ // writeOp.GetResults() must return that all required bytes were written for a completed async writeOp
+ Assert.Equal((uint)modelWriteData.Length, resultBytesWritten);
+
+ // Check contents
+
+ backingStream.Seek(0, SeekOrigin.Begin);
+ byte[] verifyBuff = new byte[modelWriteData.Length + 1024];
+
+ int r = backingStream.Read(verifyBuff, 0, verifyBuff.Length);
+
+ for (int i = 0; i < modelWriteData.Length; i++)
+ {
+ Assert.Equal(modelWriteData[i], verifyBuff[i]);
+ }
+ }
+ }
+ }
+}
+
diff --git a/src/System.Runtime.WindowsRuntime/tests/System/IO/TestStreamProvider.cs b/src/System.Runtime.WindowsRuntime/tests/System/IO/TestStreamProvider.cs
new file mode 100644
index 0000000000..43c0320102
--- /dev/null
+++ b/src/System.Runtime.WindowsRuntime/tests/System/IO/TestStreamProvider.cs
@@ -0,0 +1,112 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Windows.Storage.Streams;
+
+namespace System.IO
+{
+ public class TestStreamProvider
+ {
+ private const string TempFileNameBase = @"WinRT.Testing.IO.Streams.NetFxStreamProvider.DataFile";
+ private const string TempFileNameExt = @".tmp";
+ private const string TempFileName = TempFileNameBase + TempFileNameExt;
+
+ private static byte[] s_modelStreamContents = null;
+ private static int s_modelStreamLength = 0x100000;
+
+ private static readonly string s_tempFileFolder;
+ private static readonly string s_tempFilePath;
+
+ static TestStreamProvider()
+ {
+ s_tempFileFolder = ".";
+ s_tempFilePath = Path.Combine(s_tempFileFolder, TempFileName);
+ }
+
+ public static byte[] ModelStreamContents
+ {
+ get
+ {
+ if (s_modelStreamContents != null)
+ return s_modelStreamContents;
+
+ const int randomSeed = 20090918;
+
+ Random rnd = new Random(randomSeed);
+ s_modelStreamContents = new byte[ModelStreamLength];
+ rnd.NextBytes(s_modelStreamContents);
+
+ return s_modelStreamContents;
+ }
+ }
+
+ public static int ModelStreamLength
+ {
+ get
+ {
+ return s_modelStreamLength;
+ }
+ set
+ {
+ s_modelStreamContents = null;
+ s_modelStreamLength = value;
+ }
+ }
+
+ public static bool CheckContent(byte[] values, int offsInModelContents, int count)
+ {
+ for (int i = 0; i < count; i++)
+ {
+
+ if (!CheckContent(values[i], i + offsInModelContents))
+ {
+
+ Console.WriteLine("Fail on {0}, {1}, {2}, {3}", i, i + offsInModelContents, values[i], ModelStreamContents[i + offsInModelContents]);
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public static bool CheckContent(byte value, int index)
+ {
+ return value == ModelStreamContents[index];
+ }
+
+ public static MemoryStream CreateMemoryStream()
+ {
+ byte[] data = new byte[ModelStreamLength];
+ Array.Copy(ModelStreamContents, data, data.Length);
+
+ MemoryStream stream = new MemoryStream(data, 0, data.Length, true);
+ return stream;
+ }
+
+ public static Stream CreateReadOnlyStream()
+ {
+ byte[] data = new byte[ModelStreamLength];
+ Array.Copy(ModelStreamContents, data, data.Length);
+
+ MemoryStream stream = new MemoryStream(data, 0, data.Length, false);
+ return stream;
+ }
+
+ public static Stream CreateWriteOnlyStream()
+ {
+ byte[] data = new byte[ModelStreamLength];
+ Array.Copy(ModelStreamContents, data, data.Length);
+
+ MemoryStream stream = new WriteOnlyStream(data);
+ return stream;
+ }
+
+ public static IInputStream CreateMemoryStreamAsInputStream()
+ {
+ MemoryStream memStream = CreateMemoryStream();
+ return memStream.AsInputStream();
+ }
+ }
+}
diff --git a/src/System.Runtime.WindowsRuntime/tests/System/IO/WriteOnlyStream.cs b/src/System.Runtime.WindowsRuntime/tests/System/IO/WriteOnlyStream.cs
new file mode 100644
index 0000000000..6eef14915a
--- /dev/null
+++ b/src/System.Runtime.WindowsRuntime/tests/System/IO/WriteOnlyStream.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace System.IO
+{
+ public class WriteOnlyStream : MemoryStream
+ {
+ internal WriteOnlyStream(byte[] data) : base(data, 0, data.Length, true) { }
+ public override bool CanRead { get { return false; } }
+ public override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException("This is a write-only stream"); }
+ public override int ReadByte() { throw new NotSupportedException("This is a write-only stream"); }
+ public override byte[] ToArray() { throw new NotSupportedException("This is a write-only stream"); }
+ public override void WriteTo(Stream stream) { throw new NotSupportedException("This is a write-only stream"); }
+ }
+}
diff --git a/src/System.Runtime/tests/System.Runtime.Tests.csproj b/src/System.Runtime/tests/System.Runtime.Tests.csproj
index 23234b7eab..8687ad8fc3 100644
--- a/src/System.Runtime/tests/System.Runtime.Tests.csproj
+++ b/src/System.Runtime/tests/System.Runtime.Tests.csproj
@@ -228,12 +228,6 @@
<Compile Include="System\AppContext\AppContext.Switch.Validation.cs" />
<Compile Include="System\Reflection\StrongNameKeyPairTests.cs" />
<Compile Include="System\Runtime\Tests.netstandard.1.7.cs" />
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<ProjectReference Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorConsoleApp\RemoteExecutorConsoleApp.csproj">
<Project>{69e46a6f-9966-45a5-8945-2559fe337827}</Project>
<Name>RemoteExecutorConsoleApp</Name>
diff --git a/src/System.Runtime/tests/System/ArrayTests.cs b/src/System.Runtime/tests/System/ArrayTests.cs
index 9a170cbff6..787ba977e3 100644
--- a/src/System.Runtime/tests/System/ArrayTests.cs
+++ b/src/System.Runtime/tests/System/ArrayTests.cs
@@ -2955,7 +2955,6 @@ namespace System.Tests
[Theory]
[MemberData(nameof(Sort_Array_Array_NonGeneric_TestData))]
[MemberData(nameof(Sort_Array_Array_Generic_TestData))]
- [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "Issue https://github.com/dotnet/corefx/issues/17450")]
public static void Sort_Array_Array_NonGeneric(Array keys, Array items, int index, int length, IComparer comparer, Array expectedKeys, Array expectedItems)
{
Array sortedKeysArray = null;
diff --git a/src/System.Runtime/tests/System/Reflection/MemberInfoTests.cs b/src/System.Runtime/tests/System/Reflection/MemberInfoTests.cs
index 2f78214965..78a7deb8d3 100644
--- a/src/System.Runtime/tests/System/Reflection/MemberInfoTests.cs
+++ b/src/System.Runtime/tests/System/Reflection/MemberInfoTests.cs
@@ -175,27 +175,31 @@ namespace System.Reflection.Tests
Assert.True(false, "Expected to find ComVisibleAttribute");
}
- [ActiveIssue("https://github.com/dotnet/corefx/issues/19852")]
- [Fact]
- public void TestEquality_Multiple()
+ public static IEnumerable<object[]> EqualityOperator_TestData()
{
- CheckIsAllEqual(GetMembers(typeof(SampleClass)), GetMembers(typeof(SampleClass)));
- CheckIsAllEqual(GetMembers(new MemberInfoTests().GetType()), GetMembers(new MemberInfoTests().GetType()));
- CheckIsAllEqual(GetMembers(typeof(int)), GetMembers(typeof(int)));
- CheckIsAllEqual(GetMembers(typeof(Dictionary<,>)), GetMembers(typeof(Dictionary<,>)));
+ yield return new object[] { typeof(SampleClass) };
+ yield return new object[] { new MemberInfoTests().GetType() };
+ yield return new object[] { typeof(int) };
+ yield return new object[] { typeof(Dictionary<,>) };
}
- //Helpers
- private static void CheckIsAllEqual(MemberInfo[] mi1, MemberInfo[] mi2)
+ [Theory]
+ [MemberData(nameof(EqualityOperator_TestData))]
+ public void EqualityOperator_Equal_ReturnsTrue(Type type)
{
- Assert.Equal(mi1.Count(), mi2.Count());
+ MemberInfo[] members1 = GetOrderedMembers(type);
+ MemberInfo[] members2 = GetOrderedMembers(type);
- for (int i = 0; i < mi1.Count(); i++)
+ Assert.Equal(members1.Length, members2.Length);
+ for (int i = 0; i < members1.Length; i++)
{
- Assert.True(mi1[i] == mi2[i]);
+ Assert.True(members1[i] == members2[i]);
+ Assert.False(members1[i] != members2[i]);
}
}
+ private MemberInfo[] GetOrderedMembers(Type type) => GetMembers(type).OrderBy(member => member.Name).ToArray();
+
private MemberInfo[] GetMembers(Type type)
{
return type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
diff --git a/src/System.Runtime/tests/System/Uri.CreateStringTests.cs b/src/System.Runtime/tests/System/Uri.CreateStringTests.cs
index a4c363ae54..8483b38983 100644
--- a/src/System.Runtime/tests/System/Uri.CreateStringTests.cs
+++ b/src/System.Runtime/tests/System/Uri.CreateStringTests.cs
@@ -549,8 +549,20 @@ namespace System.Tests
// File with host
yield return new object[] { "file://path1/path2", "/path2", "", "" };
yield return new object[] { "file:///path1/path2", "/path1/path2", "", "" };
- yield return new object[] { @"file:///path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
- yield return new object[] { @"file:///path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
+ if (s_isWindowsSystem)
+ {
+ yield return new object[] { @"file:///path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
+ yield return new object[] { @"file:///path1\path2/path3%5Cpath4\", "/path1/path2/path3/path4/", "", "" };
+ yield return new object[] { @"file://localhost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
+ yield return new object[] { @"file://localhost/path1%5Cpath2", "/path1/path2", "", ""};
+ }
+ else // Unix paths preserve backslash
+ {
+ yield return new object[] { @"file:///path1\path2/path3\path4", @"/path1\path2/path3\path4", "", "" };
+ yield return new object[] { @"file:///path1%5Cpath2\path3", @"/path1%5Cpath2%5Cpath3", "", ""};
+ yield return new object[] { @"file://localhost/path1\path2/path3\path4\", @"/path1\path2/path3\path4\", "", "" };
+ yield return new object[] { @"file://localhost/path1%5Cpath2\path3", @"/path1%5Cpath2%5Cpath3", "", ""};
+ }
// Implicit file with empty path
yield return new object[] { "C:/", "C:/", "", "" };
yield return new object[] { "C|/", "C:/", "", "" };
@@ -643,16 +655,6 @@ namespace System.Tests
yield return new object[] { "file:////unchost/path1/path2?query#fragment", "/path1/path2", "?query", "#fragment" };
yield return new object[] { @"file:///\unchost/path1/path2?query#fragment", "/path1/path2", "?query", "#fragment" };
yield return new object[] { @"file://\/unchost/path1/path2?query#fragment", "/path1/path2", "?query", "#fragment" };
- // Explicit UNC with backslash in path
- yield return new object[] { @"file://\\unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
- yield return new object[] { @"file:////unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
- yield return new object[] { @"file:///\unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
- yield return new object[] { @"file://\/unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
- // Explicit UNC ending with backslash
- yield return new object[] { @"file://\\unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
- yield return new object[] { @"file:////unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
- yield return new object[] { @"file:///\unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
- yield return new object[] { @"file://\/unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
// Explicit UNC with a windows drive as host
yield return new object[] { @"file://\\C:/path1/path2", "C:/path1/path2", "", "" };
yield return new object[] { "file:////C:/path1/path2", "C:/path1/path2", "", "" };
@@ -662,8 +664,20 @@ namespace System.Tests
yield return new object[] { "C|/path|path/path2", "C:/path%7Cpath/path2", "", "" };
yield return new object[] { "file://host/path?query#fragment", "/path", "?query", "#fragment" };
- // Unix path
- if (!s_isWindowsSystem)
+ if (s_isWindowsSystem)
+ {
+ // Explicit UNC with backslash in path
+ yield return new object[] { @"file://\\unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
+ yield return new object[] { @"file:////unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
+ yield return new object[] { @"file:///\unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
+ yield return new object[] { @"file://\/unchost/path1\path2/path3\path4", "/path1/path2/path3/path4", "", "" };
+ // Explicit UNC ending with backslash
+ yield return new object[] { @"file://\\unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
+ yield return new object[] { @"file:////unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
+ yield return new object[] { @"file:///\unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
+ yield return new object[] { @"file://\/unchost/path1\path2/path3\path4\", "/path1/path2/path3/path4/", "", "" };
+ }
+ else if(!s_isWindowsSystem)
{
// Implicit file with path
yield return new object[] { "/", "/", "", "" };
@@ -672,6 +686,16 @@ namespace System.Tests
yield return new object[] { @"/path1\path2/path3\path4", "/path1%5Cpath2/path3%5Cpath4", "", "" };
// Implicit file ending with backlash
yield return new object[] { @"/path1\path2/path3\path4\", "/path1%5Cpath2/path3%5Cpath4%5C", "", "" };
+ // Explicit UNC with backslash in path
+ yield return new object[] { @"file://\\unchost/path1\path2/path3\path4", @"/path1\path2/path3\path4", "", "" };
+ yield return new object[] { @"file:////unchost/path1\path2/path3\path4", @"/path1\path2/path3\path4", "", "" };
+ yield return new object[] { @"file:///\unchost/path1\path2/path3\path4", @"/path1\path2/path3\path4", "", "" };
+ yield return new object[] { @"file://\/unchost/path1\path2/path3\path4", @"/path1\path2/path3\path4", "", "" };
+ // Explicit UNC ending with backslash
+ yield return new object[] { @"file://\\unchost/path1\path2/path3\path4\", @"/path1\path2/path3\path4\", "", "" };
+ yield return new object[] { @"file:////unchost/path1\path2/path3\path4\", @"/path1\path2/path3\path4\", "", "" };
+ yield return new object[] { @"file:///\unchost/path1\path2/path3\path4\", @"/path1\path2/path3\path4\", "", "" };
+ yield return new object[] { @"file://\/unchost/path1\path2/path3\path4\", @"/path1\path2/path3\path4\", "", "" };
}
// Mailto
@@ -796,6 +820,8 @@ namespace System.Tests
{
localPath = @"\\" + uri.Host + path;
localPath = localPath.Replace('/', '\\');
+ // Unescape '\\'
+ localPath = localPath.Replace("%5C", "\\");
if (path == "/")
{
localPath = localPath.Substring(0, localPath.Length - 1);
diff --git a/src/System.Security.AccessControl/dir.props b/src/System.Security.AccessControl/dir.props
index b51f23eaab..0b90c056e3 100644
--- a/src/System.Security.AccessControl/dir.props
+++ b/src/System.Security.AccessControl/dir.props
@@ -6,7 +6,5 @@
<AssemblyKey>MSFT</AssemblyKey>
<IsNETCoreApp>true</IsNETCoreApp>
<IsNETCoreAppRef>false</IsNETCoreAppRef>
- <IsUAP>true</IsUAP>
- <ISUAPRef>false</ISUAPRef>
</PropertyGroup>
</Project> \ No newline at end of file
diff --git a/src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 897dbec063..0000000000
--- a/src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,4 +0,0 @@
-advapi32.dll!OpenProcessToken
-advapi32.dll!OpenThreadToken
-advapi32.dll!RevertToSelf
-advapi32.dll!SetThreadToken
diff --git a/src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata.uap b/src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
new file mode 100644
index 0000000000..48869872a9
--- /dev/null
+++ b/src/System.Security.AccessControl/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -0,0 +1,6 @@
+# No longer in UAP package, so this is harmless, still need to remove UAP configuration and add this to project
+# <!-- Although we have a netstandard configuration, we know we are not currently UAP compatible-->
+# <UWPCompatible>false</UWPCompatible>
+# then remove this baseline
+# https://github.com/dotnet/corefx/issues/21023
+advapi32.dll!OpenProcessToken
diff --git a/src/System.Security.AccessControl/src/System/Security/AccessControl/Privilege.cs b/src/System.Security.AccessControl/src/System/Security/AccessControl/Privilege.cs
index 8a65b91d47..2f40bc147c 100644
--- a/src/System.Security.AccessControl/src/System/Security/AccessControl/Privilege.cs
+++ b/src/System.Security.AccessControl/src/System/Security/AccessControl/Privilege.cs
@@ -36,7 +36,7 @@ namespace System.Security.AccessControl
internal sealed class Privilege
{
[ThreadStatic]
- private static TlsContents tlsSlotData;
+ private static TlsContents t_tlsSlotData;
private static Dictionary<Luid, string> privileges = new Dictionary<Luid, string>();
private static Dictionary<string, Luid> luids = new Dictionary<string, Luid>();
private static ReaderWriterLockSlim privilegeLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
@@ -463,12 +463,12 @@ namespace System.Security.AccessControl
// Retrieve TLS state
//
- this.tlsContents = tlsSlotData;
+ this.tlsContents = t_tlsSlotData;
if (this.tlsContents == null)
{
this.tlsContents = new TlsContents();
- tlsSlotData = this.tlsContents;
+ t_tlsSlotData = this.tlsContents;
}
else
{
@@ -685,7 +685,7 @@ namespace System.Security.AccessControl
if (0 == this.tlsContents.DecrementReferenceCount())
{
this.tlsContents = null;
- tlsSlotData = null;
+ t_tlsSlotData = null;
}
}
}
diff --git a/src/System.Security.AccessControl/tests/AccessRule.Tests.cs b/src/System.Security.AccessControl/tests/AccessRule.Tests.cs
index 6114e61e7d..2e94ce45fb 100644
--- a/src/System.Security.AccessControl/tests/AccessRule.Tests.cs
+++ b/src/System.Security.AccessControl/tests/AccessRule.Tests.cs
@@ -39,6 +39,7 @@ namespace System.Security.AccessControl.Tests
[Theory]
[MemberData(nameof(AccessRule_TestData))]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.Uap, "FileSystemAccessRule is not supported on UAP")]
public void AccessRule_Constructor(string sid, int accessMask, bool isInherited, int inheritanceFlags, int propagationFlags, int accessControlType)
{
IdentityReference identityReference = new SecurityIdentifier(sid);
@@ -59,6 +60,7 @@ namespace System.Security.AccessControl.Tests
}
[Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.Uap, "FileSystemAccessRule is not supported on UAP")]
public override void AccessRule_Constructor_Invalid()
{
AssertExtensions.Throws<ArgumentNullException>("identity", () => Constructor(null, 1, true, (InheritanceFlags)1, (PropagationFlags)1, (AccessControlType)0));
diff --git a/src/System.Security.AccessControl/tests/AuditRule.Tests.cs b/src/System.Security.AccessControl/tests/AuditRule.Tests.cs
index 2ae81ce08b..f4fe8e1677 100644
--- a/src/System.Security.AccessControl/tests/AuditRule.Tests.cs
+++ b/src/System.Security.AccessControl/tests/AuditRule.Tests.cs
@@ -40,6 +40,7 @@ namespace System.Security.AccessControl.Tests
[Theory]
[MemberData(nameof(AuditRule_TestData))]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.Uap, "FileSystemAuditRule is not supported on UAP")]
public void AuditRule_Constructor(string sid, int accessMask, bool isInherited, int inheritanceFlags, int propagationFlags, int AuditFlags)
{
IdentityReference identityReference = new SecurityIdentifier(sid);
@@ -60,6 +61,7 @@ namespace System.Security.AccessControl.Tests
}
[Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.Uap, "FileSystemAuditRule is not supported on UAP")]
public override void AuditRule_Constructor_Invalid()
{
AssertExtensions.Throws<ArgumentNullException>("identity", () => Constructor(null, 1, true, (InheritanceFlags)1, (PropagationFlags)1, (AuditFlags)0));
diff --git a/src/System.Security.AccessControl/tests/Resources/System.Security.AccessControl.Tests.rd.xml b/src/System.Security.AccessControl/tests/Resources/System.Security.AccessControl.Tests.rd.xml
new file mode 100644
index 0000000000..8652e3b53f
--- /dev/null
+++ b/src/System.Security.AccessControl/tests/Resources/System.Security.AccessControl.Tests.rd.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
+ <Library Name="System.Security.AccessControl.Tests">
+ <Assembly Name="System.Security.AccessControl">
+ <!-- Needed for 2 CustomAce tests that require constructor metadata -->
+ <Namespace Name="System.Security.AccessControl" Dynamic="Required All" />
+ </Assembly>
+ </Library>
+</Directives>
diff --git a/src/System.Security.AccessControl/tests/System.Security.AccessControl.Tests.csproj b/src/System.Security.AccessControl/tests/System.Security.AccessControl.Tests.csproj
index 10f3a586b9..63ea73063f 100644
--- a/src/System.Security.AccessControl/tests/System.Security.AccessControl.Tests.csproj
+++ b/src/System.Security.AccessControl/tests/System.Security.AccessControl.Tests.csproj
@@ -76,5 +76,8 @@
<Link>Common\System\AssertExtensions.cs</Link>
</Compile>
</ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Resources\$(AssemblyName).rd.xml" />
+ </ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project> \ No newline at end of file
diff --git a/src/System.Security.Cryptography.Csp/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Security.Cryptography.Csp/src/PinvokeAnalyzerExceptionList.analyzerdata
deleted file mode 100644
index 31cd158b19..0000000000
--- a/src/System.Security.Cryptography.Csp/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ /dev/null
@@ -1,21 +0,0 @@
-advapi32.dll!CryptAcquireContextW
-advapi32.dll!CryptCreateHash
-advapi32.dll!CryptDecrypt
-advapi32.dll!CryptDeriveKey
-advapi32.dll!CryptDestroyHash
-advapi32.dll!CryptDestroyKey
-advapi32.dll!CryptEncrypt
-advapi32.dll!CryptExportKey
-advapi32.dll!CryptGenKey
-advapi32.dll!CryptGetDefaultProviderW
-advapi32.dll!CryptGetHashParam
-advapi32.dll!CryptGetKeyParam
-advapi32.dll!CryptGetProvParam
-advapi32.dll!CryptGetUserKey
-advapi32.dll!CryptHashData
-advapi32.dll!CryptImportKey
-advapi32.dll!CryptSetHashParam
-advapi32.dll!CryptSetKeyParam
-advapi32.dll!CryptSetProvParam
-advapi32.dll!CryptSignHashW
-advapi32.dll!CryptVerifySignatureW
diff --git a/src/System.Security.Cryptography.X509Certificates/tests/ChainTests.cs b/src/System.Security.Cryptography.X509Certificates/tests/ChainTests.cs
index f68770ec97..0e3af9905d 100644
--- a/src/System.Security.Cryptography.X509Certificates/tests/ChainTests.cs
+++ b/src/System.Security.Cryptography.X509Certificates/tests/ChainTests.cs
@@ -574,7 +574,14 @@ namespace System.Security.Cryptography.X509Certificates.Tests
Thread.Sleep(1000); // For network flakiness
}
- Assert.True(valid, $"Online Chain Built Validly within {RetryLimit} tries");
+ if (TestEnvironmentConfiguration.RunManualTests)
+ {
+ Assert.True(valid, $"Online Chain Built Validly within {RetryLimit} tries");
+ }
+ else if (!valid)
+ {
+ Console.WriteLine($"SKIP [{nameof(VerifyWithRevocation)}]: Chain failed to build within {RetryLimit} tries.");
+ }
// Since the network was enabled, we should get the whole chain.
Assert.Equal(3, onlineChain.ChainElements.Count);
diff --git a/src/System.Security.Principal.Windows/src/PinvokeAnalyzerExceptionList.analyzerdata b/src/System.Security.Principal.Windows/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
index f3f83f0173..7d214fce2d 100644
--- a/src/System.Security.Principal.Windows/src/PinvokeAnalyzerExceptionList.analyzerdata
+++ b/src/System.Security.Principal.Windows/src/PinvokeAnalyzerExceptionList.analyzerdata.uap
@@ -1,16 +1,14 @@
-advapi32.dll!ImpersonateLoggedOnUser
+# Discussing with networking team
advapi32.dll!LsaClose
advapi32.dll!LsaFreeMemory
advapi32.dll!LsaLookupNames2
advapi32.dll!LsaLookupSids
advapi32.dll!LsaOpenPolicy
advapi32.dll!OpenProcessToken
-advapi32.dll!OpenThreadToken
-advapi32.dll!RevertToSelf
ntdll.dll!RtlNtStatusToDosError
sspicli.dll!LsaConnectUntrusted
sspicli.dll!LsaDeregisterLogonProcess
sspicli.dll!LsaFreeReturnBuffer
sspicli.dll!LsaGetLogonSessionData
sspicli.dll!LsaLogonUser
-sspicli.dll!LsaLookupAuthenticationPackage
+sspicli.dll!LsaLookupAuthenticationPackage \ No newline at end of file
diff --git a/src/System.Text.RegularExpressions/tests/System.Text.RegularExpressions.Tests.csproj b/src/System.Text.RegularExpressions/tests/System.Text.RegularExpressions.Tests.csproj
index 57bc161acb..4eb57a57b5 100644
--- a/src/System.Text.RegularExpressions/tests/System.Text.RegularExpressions.Tests.csproj
+++ b/src/System.Text.RegularExpressions/tests/System.Text.RegularExpressions.Tests.csproj
@@ -15,12 +15,6 @@
<Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
<Link>Common\tests\System\PlatformDetection.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="CaptureCollectionTests.cs" />
<Compile Include="GroupCollectionTests.cs" />
<Compile Include="MatchCollectionTests.cs" />
diff --git a/src/System.Threading.Overlapped/tests/HandleFactory.cs b/src/System.Threading.Overlapped/tests/HandleFactory.cs
index e179f019e9..69a2facf25 100644
--- a/src/System.Threading.Overlapped/tests/HandleFactory.cs
+++ b/src/System.Threading.Overlapped/tests/HandleFactory.cs
@@ -12,9 +12,9 @@ internal static partial class HandleFactory
return new Win32Handle(handle);
}
- public static Win32Handle CreateSyncFileHandleFoWrite()
+ public static Win32Handle CreateSyncFileHandleForWrite(string fileName = null)
{
- return CreateHandle(async: false);
+ return CreateHandle(async:false, fileName:fileName);
}
public static Win32Handle CreateAsyncFileHandleForWrite(string fileName = null)
diff --git a/src/System.Threading.Overlapped/tests/OverlappedTests.cs b/src/System.Threading.Overlapped/tests/OverlappedTests.cs
index 718ed9e2d8..fb3949365a 100644
--- a/src/System.Threading.Overlapped/tests/OverlappedTests.cs
+++ b/src/System.Threading.Overlapped/tests/OverlappedTests.cs
@@ -146,7 +146,6 @@ public static partial class OverlappedTests
[Fact]
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPool.UnsafeQueueNativeOverlapped is not supported on Unix
- [ActiveIssue("https://github.com/dotnet/corefx/issues/20365", TargetFrameworkMonikers.UapAot)]
public static unsafe void PackPosTest()
{
#pragma warning disable 618
@@ -172,7 +171,6 @@ public static partial class OverlappedTests
[Fact]
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPool.UnsafeQueueNativeOverlapped is not supported on Unix
- [ActiveIssue("https://github.com/dotnet/corefx/issues/20365", TargetFrameworkMonikers.UapAot)]
public static unsafe void PackPosTest1()
{
Overlapped ov = new Overlapped();
diff --git a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_BindHandleTests.cs b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_BindHandleTests.cs
index 6a8d7e4e92..7038617ae1 100644
--- a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_BindHandleTests.cs
+++ b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_BindHandleTests.cs
@@ -53,8 +53,7 @@ public partial class ThreadPoolBoundHandleTests
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void BindHandle_SyncHandleAsHandle_ThrowsArgumentException()
{ // Can't bind a handle that was not opened for overlapped I/O
-
- using(SafeHandle handle = HandleFactory.CreateSyncFileHandleFoWrite())
+ using(SafeHandle handle = HandleFactory.CreateSyncFileHandleForWrite(GetTestFilePath()))
{
AssertExtensions.Throws<ArgumentException>("handle", () =>
{
@@ -64,10 +63,11 @@ public partial class ThreadPoolBoundHandleTests
}
[Fact]
+ [ActiveIssue(21066, TargetFrameworkMonikers.Uap)]
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void BindHandle_ClosedSyncHandleAsHandle_ThrowsArgumentException()
{
- using(Win32Handle handle = HandleFactory.CreateSyncFileHandleFoWrite())
+ using(Win32Handle handle = HandleFactory.CreateSyncFileHandleForWrite(GetTestFilePath()))
{
handle.CloseWithoutDisposing();
@@ -79,10 +79,11 @@ public partial class ThreadPoolBoundHandleTests
}
[Fact]
+ [ActiveIssue(21066, TargetFrameworkMonikers.Uap)]
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void BindHandle_ClosedAsyncHandleAsHandle_ThrowsArgumentException()
{
- using(Win32Handle handle = HandleFactory.CreateAsyncFileHandleForWrite())
+ using(Win32Handle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath()))
{
handle.CloseWithoutDisposing();
@@ -97,7 +98,7 @@ public partial class ThreadPoolBoundHandleTests
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void BindHandle_DisposedSyncHandleAsHandle_ThrowsArgumentException()
{
- Win32Handle handle = HandleFactory.CreateSyncFileHandleFoWrite();
+ Win32Handle handle = HandleFactory.CreateSyncFileHandleForWrite();
handle.Dispose();
AssertExtensions.Throws<ArgumentException>("handle", () =>
@@ -111,7 +112,7 @@ public partial class ThreadPoolBoundHandleTests
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void BindHandle_DisposedAsyncHandleAsHandle_ThrowsArgumentException()
{
- Win32Handle handle = HandleFactory.CreateAsyncFileHandleForWrite();
+ Win32Handle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath());
handle.Dispose();
AssertExtensions.Throws<ArgumentException>("handle", () =>
@@ -124,7 +125,7 @@ public partial class ThreadPoolBoundHandleTests
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void BindHandle_AlreadyBoundHandleAsHandle_ThrowsArgumentException()
{
- using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite())
+ using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath()))
{
// Once
ThreadPoolBoundHandle.BindHandle(handle);
diff --git a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_GetNativeOverlappedStateTests.cs b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_GetNativeOverlappedStateTests.cs
index 59c3efdbb7..8ff5479d91 100644
--- a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_GetNativeOverlappedStateTests.cs
+++ b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_GetNativeOverlappedStateTests.cs
@@ -22,7 +22,7 @@ public partial class ThreadPoolBoundHandleTests
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public unsafe void GetNativeOverlappedState_WhenUnderlyingStateIsNull_ReturnsNull()
{
- using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite())
+ using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath()))
{
using(ThreadPoolBoundHandle boundHandle = ThreadPoolBoundHandle.BindHandle(handle))
{
@@ -43,7 +43,7 @@ public partial class ThreadPoolBoundHandleTests
{
object context = new object();
- using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite())
+ using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath()))
{
using(ThreadPoolBoundHandle boundHandle = ThreadPoolBoundHandle.BindHandle(handle))
{
@@ -66,7 +66,7 @@ public partial class ThreadPoolBoundHandleTests
AsyncResult context = new AsyncResult();
- using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite())
+ using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath()))
{
using(ThreadPoolBoundHandle boundHandle = ThreadPoolBoundHandle.BindHandle(handle))
{
diff --git a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_HandleTests.cs b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_HandleTests.cs
index 5643a40591..eb06dd9815 100644
--- a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_HandleTests.cs
+++ b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_HandleTests.cs
@@ -12,7 +12,7 @@ public partial class ThreadPoolBoundHandleTests
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void Handle_ReturnsHandle()
{
- using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite())
+ using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath()))
{
using(ThreadPoolBoundHandle boundHandle = CreateThreadPoolBoundHandle(handle))
{
@@ -25,7 +25,7 @@ public partial class ThreadPoolBoundHandleTests
[PlatformSpecific(TestPlatforms.Windows)] // ThreadPoolBoundHandle.BindHandle is not supported on Unix
public void Handle_AfterDisposed_DoesNotThrow()
{
- using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite())
+ using(SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath()))
{
ThreadPoolBoundHandle boundHandle = CreateThreadPoolBoundHandle(handle);
boundHandle.Dispose();
diff --git a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_Helpers.cs b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_Helpers.cs
index 05b9c8611b..159dedd0d0 100644
--- a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_Helpers.cs
+++ b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_Helpers.cs
@@ -3,11 +3,13 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.IO;
+using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Threading;
using Xunit;
-public partial class ThreadPoolBoundHandleTests
+public partial class ThreadPoolBoundHandleTests : FileCleanupTestBase
{
struct BlittableType
{
@@ -19,14 +21,14 @@ public partial class ThreadPoolBoundHandleTests
public string s;
}
- private static ThreadPoolBoundHandle CreateThreadPoolBoundHandle()
+ private ThreadPoolBoundHandle CreateThreadPoolBoundHandle([CallerMemberName] string memberName = null, [CallerLineNumber] int lineNumber = 0)
{
- return CreateThreadPoolBoundHandle((SafeHandle)null);
+ return CreateThreadPoolBoundHandle((SafeHandle)null, memberName, lineNumber);
}
- private static ThreadPoolBoundHandle CreateThreadPoolBoundHandle(SafeHandle handle)
+ private ThreadPoolBoundHandle CreateThreadPoolBoundHandle(SafeHandle handle, [CallerMemberName] string memberName = null, [CallerLineNumber] int lineNumber = 0)
{
- handle = handle ?? HandleFactory.CreateAsyncFileHandleForWrite();
+ handle = handle ?? HandleFactory.CreateAsyncFileHandleForWrite(GetTestFilePath(null, memberName, lineNumber));
return ThreadPoolBoundHandle.BindHandle(handle);
}
diff --git a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_IntegrationTests.cs b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_IntegrationTests.cs
index d57b773f2f..8c006501b3 100644
--- a/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_IntegrationTests.cs
+++ b/src/System.Threading.Overlapped/tests/ThreadPoolBoundHandle_IntegrationTests.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using Xunit;
@@ -15,7 +16,7 @@ public partial class ThreadPoolBoundHandleTests
{
const int DATA_SIZE = 2;
- SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(@"SingleOverlappedOverSingleHandle.tmp");
+ SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(Path.Combine(TestDirectory, @"SingleOverlappedOverSingleHandle.tmp"));
ThreadPoolBoundHandle boundHandle = ThreadPoolBoundHandle.BindHandle(handle);
OverlappedContext result = new OverlappedContext();
@@ -53,7 +54,7 @@ public partial class ThreadPoolBoundHandleTests
{
const int DATA_SIZE = 2;
- SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(@"MultipleOperationsOverSingleHandle.tmp");
+ SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(Path.Combine(TestDirectory, @"MultipleOperationsOverSingleHandle.tmp"));
ThreadPoolBoundHandle boundHandle = ThreadPoolBoundHandle.BindHandle(handle);
OverlappedContext result1 = new OverlappedContext();
@@ -111,8 +112,8 @@ public partial class ThreadPoolBoundHandleTests
{
const int DATA_SIZE = 2;
- SafeHandle handle1 = HandleFactory.CreateAsyncFileHandleForWrite(@"MultipleOperationsOverMultipleHandle1.tmp");
- SafeHandle handle2 = HandleFactory.CreateAsyncFileHandleForWrite(@"MultipleOperationsOverMultipleHandle2.tmp");
+ SafeHandle handle1 = HandleFactory.CreateAsyncFileHandleForWrite(Path.Combine(TestDirectory, @"MultipleOperationsOverMultipleHandle1.tmp"));
+ SafeHandle handle2 = HandleFactory.CreateAsyncFileHandleForWrite(Path.Combine(TestDirectory, @"MultipleOperationsOverMultipleHandle2.tmp"));
ThreadPoolBoundHandle boundHandle1 = ThreadPoolBoundHandle.BindHandle(handle1);
ThreadPoolBoundHandle boundHandle2 = ThreadPoolBoundHandle.BindHandle(handle2);
@@ -185,7 +186,7 @@ public partial class ThreadPoolBoundHandleTests
const int DATA_SIZE = 2;
- SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(@"AsyncLocal.tmp");
+ SafeHandle handle = HandleFactory.CreateAsyncFileHandleForWrite(Path.Combine(TestDirectory, @"AsyncLocal.tmp"));
ThreadPoolBoundHandle boundHandle = ThreadPoolBoundHandle.BindHandle(handle);
OverlappedContext context = new OverlappedContext();
diff --git a/src/System.Threading.Tasks.Dataflow/tests/Dataflow/EtwTests.cs b/src/System.Threading.Tasks.Dataflow/tests/Dataflow/EtwTests.cs
index 9ccbc0b8fa..65b2f8f8c9 100644
--- a/src/System.Threading.Tasks.Dataflow/tests/Dataflow/EtwTests.cs
+++ b/src/System.Threading.Tasks.Dataflow/tests/Dataflow/EtwTests.cs
@@ -11,6 +11,7 @@ namespace System.Threading.Tasks.Dataflow.Tests
public class EtwTests : RemoteExecutorTestBase
{
[Fact]
+ [ActiveIssue("https://github.com/dotnet/corefx/issues/20592", TargetFrameworkMonikers.UapAot)]
public void TestEtw()
{
RemoteInvoke(() =>
diff --git a/src/System.Threading.Tasks.Dataflow/tests/System.Threading.Tasks.Dataflow.Tests.csproj b/src/System.Threading.Tasks.Dataflow/tests/System.Threading.Tasks.Dataflow.Tests.csproj
index ef9b10eda3..1c8adef64f 100644
--- a/src/System.Threading.Tasks.Dataflow/tests/System.Threading.Tasks.Dataflow.Tests.csproj
+++ b/src/System.Threading.Tasks.Dataflow/tests/System.Threading.Tasks.Dataflow.Tests.csproj
@@ -24,12 +24,6 @@
<Compile Include="Dataflow\TransformBlockTests.cs" />
<Compile Include="Dataflow\TransformManyBlockTests.cs" />
<Compile Include="Dataflow\WriteOnceBlockTests.cs" />
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>Common\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>Common\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\Diagnostics\Tracing\TestEventListener.cs">
<Link>Common\System\Diagnostics\Tracing\TestEventListener.cs</Link>
</Compile>
diff --git a/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/AsyncTaskMethodBuilderTests.cs b/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/AsyncTaskMethodBuilderTests.cs
index 3098c64ec3..c61e8f5e75 100644
--- a/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/AsyncTaskMethodBuilderTests.cs
+++ b/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/AsyncTaskMethodBuilderTests.cs
@@ -345,6 +345,7 @@ namespace System.Threading.Tasks.Tests
}
[Fact]
+ [ActiveIssue("TFS 450361 - Codegen optimization issue", TargetFrameworkMonikers.UapAot)]
public static void TaskMethodBuilder_UsesCompletedCache()
{
var atmb1 = new AsyncTaskMethodBuilder();
@@ -357,6 +358,7 @@ namespace System.Threading.Tasks.Tests
[Theory]
[InlineData(true)]
[InlineData(false)]
+ [ActiveIssue("TFS 450361 - Codegen optimization issue", TargetFrameworkMonikers.UapAot)]
public static void TaskMethodBuilderBoolean_UsesCompletedCache(bool result)
{
TaskMethodBuilderT_UsesCompletedCache(result, true);
@@ -367,6 +369,7 @@ namespace System.Threading.Tasks.Tests
[InlineData(5, true)]
[InlineData(-5, false)]
[InlineData(42, false)]
+ [ActiveIssue("TFS 450361 - Codegen optimization issue", TargetFrameworkMonikers.UapAot)]
public static void TaskMethodBuilderInt32_UsesCompletedCache(int result, bool shouldBeCached)
{
TaskMethodBuilderT_UsesCompletedCache(result, shouldBeCached);
@@ -375,6 +378,7 @@ namespace System.Threading.Tasks.Tests
[Theory]
[InlineData((string)null, true)]
[InlineData("test", false)]
+ [ActiveIssue("TFS 450361 - Codegen optimization issue", TargetFrameworkMonikers.UapAot)]
public static void TaskMethodBuilderRef_UsesCompletedCache(string result, bool shouldBeCached)
{
TaskMethodBuilderT_UsesCompletedCache(result, shouldBeCached);
diff --git a/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/TaskAwaiterTests.cs b/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/TaskAwaiterTests.cs
index 39a5623f9b..efea704f3b 100644
--- a/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/TaskAwaiterTests.cs
+++ b/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/TaskAwaiterTests.cs
@@ -35,7 +35,7 @@ namespace System.Threading.Tasks.Tests
bool postedInContext = false;
Action callback = () =>
{
- postedInContext = ValidateCorrectContextSynchronizationContext.IsPostedInContext;
+ postedInContext = ValidateCorrectContextSynchronizationContext.t_isPostedInContext;
mres.Set();
};
if (generic)
@@ -330,7 +330,7 @@ namespace System.Threading.Tasks.Tests
private class ValidateCorrectContextSynchronizationContext : SynchronizationContext
{
[ThreadStatic]
- internal static bool IsPostedInContext;
+ internal static bool t_isPostedInContext;
internal int PostCount;
internal int SendCount;
@@ -342,12 +342,12 @@ namespace System.Threading.Tasks.Tests
{
try
{
- IsPostedInContext = true;
+ t_isPostedInContext = true;
d(state);
}
finally
{
- IsPostedInContext = false;
+ t_isPostedInContext = false;
}
});
}
diff --git a/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/YieldAwaitableTests.cs b/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/YieldAwaitableTests.cs
index 3cf7825ff1..852de99779 100644
--- a/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/YieldAwaitableTests.cs
+++ b/src/System.Threading.Tasks/tests/System.Runtime.CompilerServices/YieldAwaitableTests.cs
@@ -28,7 +28,7 @@ namespace System.Threading.Tasks.Tests
Assert.False(ya.IsCompleted, "RunAsyncYieldAwaiterTests > FAILURE. YieldAwaiter.IsCompleted should always be false.");
ya.OnCompleted(() =>
{
- Assert.True(ValidateCorrectContextSynchronizationContext.IsPostedInContext, "RunAsyncYieldAwaiterTests > FAILURE. Expected to post in target context.");
+ Assert.True(ValidateCorrectContextSynchronizationContext.t_isPostedInContext, "RunAsyncYieldAwaiterTests > FAILURE. Expected to post in target context.");
mres.Set();
});
mres.Wait();
@@ -50,7 +50,7 @@ namespace System.Threading.Tasks.Tests
Assert.False(ya.IsCompleted, "RunAsyncYieldAwaiterTests > FAILURE. YieldAwaiter.IsCompleted should always be false.");
ya.OnCompleted(() =>
{
- Assert.True(ValidateCorrectContextSynchronizationContext.IsPostedInContext, " > FAILURE. Expected to post in target context.");
+ Assert.True(ValidateCorrectContextSynchronizationContext.t_isPostedInContext, " > FAILURE. Expected to post in target context.");
mres.Set();
});
mres.Wait();
@@ -126,7 +126,7 @@ namespace System.Threading.Tasks.Tests
Assert.False(ya.IsCompleted, " > FAILURE. YieldAwaiter.IsCompleted should always be false.");
ya.OnCompleted(() =>
{
- Assert.True(ValidateCorrectContextSynchronizationContext.IsPostedInContext, " > FAILURE. Expected to post in target context.");
+ Assert.True(ValidateCorrectContextSynchronizationContext.t_isPostedInContext, " > FAILURE. Expected to post in target context.");
mres.Set();
});
mres.Wait();
@@ -150,7 +150,7 @@ namespace System.Threading.Tasks.Tests
private class ValidateCorrectContextSynchronizationContext : SynchronizationContext
{
[ThreadStatic]
- internal static bool IsPostedInContext;
+ internal static bool t_isPostedInContext;
internal int PostCount;
internal int SendCount;
@@ -160,9 +160,9 @@ namespace System.Threading.Tasks.Tests
Interlocked.Increment(ref PostCount);
Task.Run(() =>
{
- IsPostedInContext = true;
+ t_isPostedInContext = true;
d(state);
- IsPostedInContext = false;
+ t_isPostedInContext = false;
});
}
diff --git a/src/System.Threading.Tasks/tests/Task/TaskRtTests.cs b/src/System.Threading.Tasks/tests/Task/TaskRtTests.cs
index 15758543b3..a92d1eb924 100644
--- a/src/System.Threading.Tasks/tests/Task/TaskRtTests.cs
+++ b/src/System.Threading.Tasks/tests/Task/TaskRtTests.cs
@@ -463,37 +463,42 @@ namespace System.Threading.Tasks.Tests
// Make sure we throw from waiting on a faulted task
Assert.Throws<AggregateException>(() => { var result = Task.FromException<object>(new InvalidOperationException()).Result; });
+ }
+ }
- // Make sure faulted tasks are actually faulted. We have little choice for this test but to use reflection,
- // as the harness will crash by throwing from the unobserved event if a task goes unhandled (everywhere
- // other than here it's a bad thing for an exception to go unobserved)
- var faultedTask = Task.FromException<object>(new InvalidOperationException("uh oh"));
- object holderObject = null;
- FieldInfo isHandledField = null;
- var contingentPropertiesField = typeof(Task).GetField("m_contingentProperties", BindingFlags.NonPublic | BindingFlags.Instance);
- if (contingentPropertiesField != null)
+ [Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "Uses reflection to access internal fields of the Task class.")]
+ public static void RunFromResult_FaultedTask()
+ {
+ // Make sure faulted tasks are actually faulted. We have little choice for this test but to use reflection,
+ // as the harness will crash by throwing from the unobserved event if a task goes unhandled (everywhere
+ // other than here it's a bad thing for an exception to go unobserved)
+ var faultedTask = Task.FromException<object>(new InvalidOperationException("uh oh"));
+ object holderObject = null;
+ FieldInfo isHandledField = null;
+ var contingentPropertiesField = typeof(Task).GetField("m_contingentProperties", BindingFlags.NonPublic | BindingFlags.Instance);
+ if (contingentPropertiesField != null)
+ {
+ var contingentProperties = contingentPropertiesField.GetValue(faultedTask);
+ if (contingentProperties != null)
{
- var contingentProperties = contingentPropertiesField.GetValue(faultedTask);
- if (contingentProperties != null)
+ var exceptionsHolderField = contingentProperties.GetType().GetField("m_exceptionsHolder", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+ if (exceptionsHolderField != null)
{
- var exceptionsHolderField = contingentProperties.GetType().GetField("m_exceptionsHolder", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
- if (exceptionsHolderField != null)
+ holderObject = exceptionsHolderField.GetValue(contingentProperties);
+ if (holderObject != null)
{
- holderObject = exceptionsHolderField.GetValue(contingentProperties);
- if (holderObject != null)
- {
- isHandledField = holderObject.GetType().GetField("m_isHandled", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
- }
+ isHandledField = holderObject.GetType().GetField("m_isHandled", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
}
}
}
- Assert.NotNull(holderObject);
- Assert.NotNull(isHandledField);
-
- Assert.False((bool)isHandledField.GetValue(holderObject), "Expected FromException task to be unobserved before accessing Exception");
- var ignored = faultedTask.Exception;
- Assert.True((bool)isHandledField.GetValue(holderObject), "Expected FromException task to be observed after accessing Exception");
}
+ Assert.NotNull(holderObject);
+ Assert.NotNull(isHandledField);
+
+ Assert.False((bool)isHandledField.GetValue(holderObject), "Expected FromException task to be unobserved before accessing Exception");
+ var ignored = faultedTask.Exception;
+ Assert.True((bool)isHandledField.GetValue(holderObject), "Expected FromException task to be observed after accessing Exception");
}
[Fact]
diff --git a/src/System.Threading.Tasks/tests/TaskScheduler/TaskSchedulerTests.cs b/src/System.Threading.Tasks/tests/TaskScheduler/TaskSchedulerTests.cs
index 6098dca5e1..2c4f75a42c 100644
--- a/src/System.Threading.Tasks/tests/TaskScheduler/TaskSchedulerTests.cs
+++ b/src/System.Threading.Tasks/tests/TaskScheduler/TaskSchedulerTests.cs
@@ -291,6 +291,7 @@ namespace System.Threading.Tasks.Tests
}
[Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "Uses reflection to access an internal method of the TaskScheduler class.")]
public static void GetTaskSchedulersForDebugger_ReturnsDefaultScheduler()
{
MethodInfo getTaskSchedulersForDebuggerMethod = typeof(TaskScheduler).GetTypeInfo().GetDeclaredMethod("GetTaskSchedulersForDebugger");
@@ -300,6 +301,7 @@ namespace System.Threading.Tasks.Tests
}
[ConditionalFact(nameof(DebuggerIsAttached))]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "Uses reflection to access an internal method of the TaskScheduler class.")]
public static void GetTaskSchedulersForDebugger_DebuggerAttached_ReturnsAllSchedulers()
{
MethodInfo getTaskSchedulersForDebuggerMethod = typeof(TaskScheduler).GetTypeInfo().GetDeclaredMethod("GetTaskSchedulersForDebugger");
@@ -315,6 +317,7 @@ namespace System.Threading.Tasks.Tests
}
[ConditionalFact(nameof(DebuggerIsAttached))]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "Uses reflection to access an internal method of the TaskScheduler class.")]
public static void GetScheduledTasksForDebugger_DebuggerAttached_ReturnsTasksFromCustomSchedulers()
{
var nonExecutingScheduler = new BuggyTaskScheduler(faultQueues: false);
diff --git a/src/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj b/src/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj
index c64fef1780..7af5a70b52 100644
--- a/src/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj
+++ b/src/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj
@@ -11,6 +11,9 @@
<Compile Include="ThreadPoolTests.cs" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="$(CommonTestPath)\System\PlatformDetection.cs">
+ <Link>CommonTest\System\PlatformDetection.cs</Link>
+ </Compile>
<Compile Include="$(CommonTestPath)\System\Threading\ThreadTestHelpers.cs">
<Link>CommonTest\System\Threading\ThreadTestHelpers.cs</Link>
</Compile>
diff --git a/src/System.Threading.ThreadPool/tests/ThreadPoolTests.cs b/src/System.Threading.ThreadPool/tests/ThreadPoolTests.cs
index 6dd31c3896..f6a2fe8f17 100644
--- a/src/System.Threading.ThreadPool/tests/ThreadPoolTests.cs
+++ b/src/System.Threading.ThreadPool/tests/ThreadPoolTests.cs
@@ -17,10 +17,15 @@ namespace System.Threading.ThreadPools.Tests
static ThreadPoolTests()
{
// Run the following tests before any others
- ConcurrentInitializeTest();
+ if (!PlatformDetection.IsNetNative)
+ {
+ ConcurrentInitializeTest();
+ }
}
+ // Tests concurrent calls to ThreadPool.SetMinThreads
[Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "ThreadPool.SetMinThreads is not supported on UapAot.")]
public static void ConcurrentInitializeTest()
{
int processorCount = Environment.ProcessorCount;
@@ -52,8 +57,8 @@ namespace System.Threading.ThreadPools.Tests
{
int minw, minc;
ThreadPool.GetMinThreads(out minw, out minc);
- Assert.True(minw > 0);
- Assert.True(minc > 0);
+ Assert.True(minw >= 0);
+ Assert.True(minc >= 0);
int maxw, maxc;
ThreadPool.GetMaxThreads(out maxw, out maxc);
@@ -76,6 +81,7 @@ namespace System.Threading.ThreadPools.Tests
}
[Fact]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "ThreadPool.SetMinThreads and SetMaxThreads are not supported on UapAot.")]
public static void SetMinMaxThreadsTest()
{
int minw, minc, maxw, maxc;
@@ -144,6 +150,7 @@ namespace System.Threading.ThreadPools.Tests
[Fact]
// Desktop framework doesn't check for this and instead, hits an assertion failure
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.UapAot, "ThreadPool.SetMinThreads and SetMaxThreads are not supported on UapAot.")]
public static void SetMinMaxThreadsTest_ChangedInDotNetCore()
{
int minw, minc, maxw, maxc;
diff --git a/src/System.Threading/tests/MutexTests.cs b/src/System.Threading/tests/MutexTests.cs
index 6bf3a92c3c..a6b1a06074 100644
--- a/src/System.Threading/tests/MutexTests.cs
+++ b/src/System.Threading/tests/MutexTests.cs
@@ -141,6 +141,7 @@ namespace System.Threading.Tests
[Theory]
[MemberData(nameof(AbandonExisting_MemberData))]
+ [ActiveIssue(21151, TargetFrameworkMonikers.Uap)]
public void AbandonExisting(string name, int waitType)
{
using (var m = new Mutex(false, name))
@@ -171,6 +172,7 @@ namespace System.Threading.Tests
[InlineData("")]
[InlineData("Local\\")]
[InlineData("Global\\")]
+ [ActiveIssue(21151, TargetFrameworkMonikers.Uap)]
public void CrossProcess_NamedMutex_ProtectedFileAccessAtomic(string prefix)
{
string mutexName = prefix + Guid.NewGuid().ToString("N");
diff --git a/src/System.Threading/tests/System.Threading.Tests.csproj b/src/System.Threading/tests/System.Threading.Tests.csproj
index d7c76321b3..6e437a3437 100644
--- a/src/System.Threading/tests/System.Threading.Tests.csproj
+++ b/src/System.Threading/tests/System.Threading.Tests.csproj
@@ -43,12 +43,6 @@
<Compile Include="$(CommonTestPath)\System\Diagnostics\Tracing\TestEventListener.cs">
<Link>CommonTest\System\Diagnostics\Tracing\TestEventListener.cs</Link>
</Compile>
- <Compile Include="$(CommonTestPath)\System\Diagnostics\RemoteExecutorTestBase.cs">
- <Link>CommonTest\System\Diagnostics\RemoteExecutorTestBase.cs</Link>
- </Compile>
- <Compile Include="$(CommonTestPath)\System\IO\FileCleanupTestBase.cs">
- <Link>CommonTest\System\IO\FileCleanupTestBase.cs</Link>
- </Compile>
<Compile Include="$(CommonTestPath)\System\Threading\ThreadTestHelpers.cs">
<Link>CommonTest\System\Threading\ThreadTestHelpers.cs</Link>
</Compile>
diff --git a/src/System.Transactions.Local/src/System/Transactions/Transaction.cs b/src/System.Transactions.Local/src/System/Transactions/Transaction.cs
index 170960f1ad..0454614b84 100644
--- a/src/System.Transactions.Local/src/System/Transactions/Transaction.cs
+++ b/src/System.Transactions.Local/src/System/Transactions/Transaction.cs
@@ -1236,7 +1236,7 @@ namespace System.Transactions
internal bool _asyncFlow;
[ThreadStatic]
- private static ContextData s_staticData;
+ private static ContextData t_staticData;
internal ContextData(bool asyncFlow)
{
@@ -1247,28 +1247,28 @@ namespace System.Transactions
{
get
{
- ContextData data = s_staticData;
+ ContextData data = t_staticData;
if (data == null)
{
data = new ContextData(false);
- s_staticData = data;
+ t_staticData = data;
}
return data;
}
set
{
- if (value == null && s_staticData != null)
+ if (value == null && t_staticData != null)
{
// set each property to null to retain one TLS ContextData copy.
- s_staticData.CurrentScope = null;
- s_staticData.CurrentTransaction = null;
- s_staticData.DefaultComContextState = DefaultComContextState.Unknown;
- s_staticData.WeakDefaultComContext = null;
+ t_staticData.CurrentScope = null;
+ t_staticData.CurrentTransaction = null;
+ t_staticData.DefaultComContextState = DefaultComContextState.Unknown;
+ t_staticData.WeakDefaultComContext = null;
}
else
{
- s_staticData = value;
+ t_staticData = value;
}
}
}
diff --git a/src/dirs.proj b/src/dirs.proj
index f8a5ab30c3..d8ccbd9633 100644
--- a/src/dirs.proj
+++ b/src/dirs.proj
@@ -6,7 +6,7 @@
<SerializeProjects>true</SerializeProjects>
</PropertyGroup>
- <ItemGroup>
+ <ItemGroup Condition="'$(DirectoryToBuild)' == ''">
<Project Include="ref.builds" />
<Project Include="shims\shims.proj" />
<Project Include="Native\native-binplace.proj" />
@@ -15,6 +15,10 @@
<Project Include="shims\ApiCompat.proj" />
</ItemGroup>
+ <ItemGroup Condition="'$(DirectoryToBuild)' != ''">
+ <Project Include="$(DirectoryToBuild)/**/*.csproj" />
+ </ItemGroup>
+
<Import Project="..\dir.targets" />
<Import Project="..\dir.traversal.targets" />
diff --git a/src/shims/manual/System.csproj b/src/shims/manual/System.csproj
new file mode 100644
index 0000000000..57db5d992f
--- /dev/null
+++ b/src/shims/manual/System.csproj
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <BuildConfigurations>
+ netcoreapp;
+ uap;
+ </BuildConfigurations>
+ <IsNETCoreApp>true</IsNETCoreApp>
+ <IsUAP>true</IsUAP>
+ </PropertyGroup>
+ <!-- need to by-pass the dir.props in the shims directory for this project -->
+ <Import Project="..\..\..\dir.props" />
+ <PropertyGroup>
+ <AssemblyVersion>4.0.0.0</AssemblyVersion>
+ <AssemblyKey>ECMA</AssemblyKey>
+ <IsPartialFacadeAssembly>true</IsPartialFacadeAssembly>
+ <HasMatchingContract>true</HasMatchingContract>
+ <ContractAssemblyPath>$(NetFxRefPath)System.dll</ContractAssemblyPath>
+ <GenFacadesIgnoreMissingTypes>true</GenFacadesIgnoreMissingTypes>
+ <IsRuntimeAssembly>true</IsRuntimeAssembly>
+ <DefineConstants Condition="'$(TargetGroup)' == 'netcoreapp'">$(DefineConstants);netcoreapp</DefineConstants>
+ <ProjectGuid>{1FB7650D-7165-49B9-98B0-E345D56983DB}</ProjectGuid>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'" />
+ <ItemGroup>
+ <Compile Include="System.forwards.cs" />
+ <ReferencePath Include="$(RuntimePath)System.*.dll;$(RuntimePath)Microsoft.*.dll" Exclude="$(RuntimePath)Microsoft.Diagnostics.Tracing.TraceEvent.dll" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project> \ No newline at end of file
diff --git a/src/shims/manual/System.forwards.cs b/src/shims/manual/System.forwards.cs
new file mode 100644
index 0000000000..caf47dac74
--- /dev/null
+++ b/src/shims/manual/System.forwards.cs
@@ -0,0 +1,10 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Add any internal types that we need to forward from System.
+
+// These types are required for Desktop <--> Core serialization as they are not covered by GenAPI because they are not exposed.
+[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.TreeSet<>))]
+[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Net.CookieVariant))]
+[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Net.PathList))]
diff --git a/src/shims/manual/mscorlib.csproj b/src/shims/manual/mscorlib.csproj
index f6dd71cb18..3a319db727 100644
--- a/src/shims/manual/mscorlib.csproj
+++ b/src/shims/manual/mscorlib.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildConfigurations>
@@ -19,10 +19,13 @@
<GenFacadesIgnoreMissingTypes>true</GenFacadesIgnoreMissingTypes>
<IsRuntimeAssembly>true</IsRuntimeAssembly>
<DefineConstants Condition="'$(TargetGroup)' == 'netcoreapp'">$(DefineConstants);netcoreapp</DefineConstants>
+ <ProjectGuid>{CEAE2042-461E-490A-974C-AD7FBD4E294E}</ProjectGuid>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'" />
<ItemGroup>
<Compile Include="mscorlib.forwards.cs" />
<ReferencePath Include="$(RuntimePath)System.*.dll;$(RuntimePath)Microsoft.*.dll" Exclude="$(RuntimePath)Microsoft.Diagnostics.Tracing.TraceEvent.dll" />
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
+</Project> \ No newline at end of file
diff --git a/src/shims/manual/mscorlib.forwards.cs b/src/shims/manual/mscorlib.forwards.cs
index 990aed8e2f..6494ab6d1c 100644
--- a/src/shims/manual/mscorlib.forwards.cs
+++ b/src/shims/manual/mscorlib.forwards.cs
@@ -5,17 +5,11 @@
// Add any internal types that we need to forward from mscorlib.
// These types are required for Desktop to Core serialization as they are not covered by GenAPI because they are marked as internal.
-#if netcoreapp
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.CultureAwareComparer))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.OrdinalComparer))]
-[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.OrdinalIgnoreCaseComparer))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.GenericComparer<>))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.NullableComparer<>))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.ObjectComparer<>))]
-[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.Int32EnumComparer<>))]
-[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.UInt32EnumComparer<>))]
-[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.Int64EnumComparer<>))]
-[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.UInt64EnumComparer<>))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.GenericEqualityComparer<>))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.NullableEqualityComparer<>))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Collections.Generic.ObjectEqualityComparer<>))]
@@ -37,4 +31,3 @@
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.ValueTuple<,,,,,>))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.ValueTuple<,,,,,,>))]
[assembly:System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.ValueTuple<,,,,,,,>))]
-#endif
diff --git a/src/shims/netfxreference.props b/src/shims/netfxreference.props
index fbb61bfc22..c7cb3ea2ab 100644
--- a/src/shims/netfxreference.props
+++ b/src/shims/netfxreference.props
@@ -3,7 +3,9 @@
<NetFxReference Include="mscorlib">
<ExcludeFromRuntime>true</ExcludeFromRuntime>
</NetFxReference>
- <NetFxReference Include="System" />
+ <NetFxReference Include="System">
+ <ExcludeFromRuntime>true</ExcludeFromRuntime>
+ </NetFxReference>
<NetFxReference Include="System.ComponentModel.Composition" />
<NetFxReference Include="System.ComponentModel.DataAnnotations">
<StrongNameSig>MSSharedLib</StrongNameSig>