Doing some project cleanup to untangle our reference mess. (#168)

This commit is contained in:
Steve Molloy 2022-01-28 20:58:40 -08:00 коммит произвёл GitHub
Родитель 7321dd9b35
Коммит 4b94a0f7d1
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
7 изменённых файлов: 225 добавлений и 244 удалений

Просмотреть файл

@ -39,6 +39,18 @@ To build the project and run tests, you need to register the public key token fo
2. Run `sn -Vr *,31bf3856ad364e35
3. Run `build.cmd` to restore NuGet packages, build the solution, and run tests.
**MSB3276 -or- Updating binding redirects in SampleWebApp**
These projects are not SDK-style projects. The sample web application will not be able to load all the dependent assemblies for it's project references without a
complete set of binding redirects, and you might see a 'MSB3276' warning in the build output. Visual Studio can generate this list automatically, but it has no affect
when running the sample site because the bindings are placed in a *.dll.config file instead of web.config.
To update the bindings in web.config, set the `UpdateBindingRedirectsAfterBuild` property in the
[SampleWebApp.csproj](https://github.com/aspnet/MicrosoftConfigurationBuilders/blob/main/samples/SampleWebApp/SampleWebApp.csproj#L21)
file to `'true'`, then rebuild the web site. You will still see the build warning when you first build because the bindings are not updated until after the build.
Subsequent builds should no longer see the warning. This step only needs to be done once after updating any dependencies, so don't forget to unset the
`UpdateBindingRedirectsAfterBuild` property when you're done.
**Submitting a pull request**
You will need to sign a [Contributor License Agreement](https://cla.opensource.microsoft.com//) when submitting your pull request. To complete the Contributor License Agreement (CLA), you will need to follow the instructions provided by the CLA bot when you send the pull request. This needs to only be done once for any Microsoft OSS project.

Просмотреть файл

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 17
VisualStudioVersion = 17.0.32014.148
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure", "src\Azure\Azure.csproj", "{345C5437-4990-45DC-BE34-6E37AA05D8D2}"
ProjectSection(ProjectDependencies) = postProject
@ -16,6 +16,8 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "packages", "src\packages\packages.csproj", "{7EC5863F-7FF1-41C7-A384-8FFF81531E7A}"
ProjectSection(ProjectDependencies) = postProject
{345C5437-4990-45DC-BE34-6E37AA05D8D2} = {345C5437-4990-45DC-BE34-6E37AA05D8D2}
{60C31149-44ED-4789-B5C3-AAA5D3B2FCF1} = {60C31149-44ED-4789-B5C3-AAA5D3B2FCF1}
{3F1BB24A-355F-49E7-B396-6AA2EB5DDA0E} = {3F1BB24A-355F-49E7-B396-6AA2EB5DDA0E}
{84E0CE5D-4AF2-414F-A940-22B3F93FC727} = {84E0CE5D-4AF2-414F-A940-22B3F93FC727}
{C6530E81-D8D8-47A8-912E-D2939F801835} = {C6530E81-D8D8-47A8-912E-D2939F801835}
{C60D6CBB-D513-4692-81A6-0BE5D45E4702} = {C60D6CBB-D513-4692-81A6-0BE5D45E4702}
@ -25,6 +27,7 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "test\Microsoft.Configuration.ConfigurationBuilders.Test\Test.csproj", "{9371A23F-BCB8-4429-8652-0A12D43F14F3}"
ProjectSection(ProjectDependencies) = postProject
{345C5437-4990-45DC-BE34-6E37AA05D8D2} = {345C5437-4990-45DC-BE34-6E37AA05D8D2}
{3F1BB24A-355F-49E7-B396-6AA2EB5DDA0E} = {3F1BB24A-355F-49E7-B396-6AA2EB5DDA0E}
{84E0CE5D-4AF2-414F-A940-22B3F93FC727} = {84E0CE5D-4AF2-414F-A940-22B3F93FC727}
{C6530E81-D8D8-47A8-912E-D2939F801835} = {C6530E81-D8D8-47A8-912E-D2939F801835}
{C60D6CBB-D513-4692-81A6-0BE5D45E4702} = {C60D6CBB-D513-4692-81A6-0BE5D45E4702}
@ -57,6 +60,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeyPerFile", "src\KeyPerFil
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWebApp", "samples\SampleWebApp\SampleWebApp.csproj", "{590892DD-F842-4E7C-9400-4C6451C16B1A}"
ProjectSection(ProjectDependencies) = postProject
{84E0CE5D-4AF2-414F-A940-22B3F93FC727} = {84E0CE5D-4AF2-414F-A940-22B3F93FC727}
{F382FBF8-146D-4968-A199-90D37F9EF9A7} = {F382FBF8-146D-4968-A199-90D37F9EF9A7}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureAppConfig", "src\AzureAppConfig\AzureAppConfig.csproj", "{3F1BB24A-355F-49E7-B396-6AA2EB5DDA0E}"
EndProject

Просмотреть файл

@ -421,15 +421,18 @@ their orchestrated windows containers in this key-per-file manner.
```
Because .Net Core projects can rely heavily on json files for configuration, it makes some sense to allow those same files to be used in full-framework
configuration as well. You can imagine that the heirarchical nature of json might enable some fantastic capabilities for building complex configuration sections.
But this config builders is meant to be a simple mapping from a flat key/value source into specific key/value areas of full-framework configuration. Thus its name
begins with 'Simple.' Think of the backing json file as a basic dictionary, rather than a comlex heirarchical object.
But this config builder is meant to be just a simple mapping from a flat key/value source into specific key/value areas of full-framework configuration. Thus its name
begins with 'Simple.' Think of the backing json file as a basic dictionary, rather than a complex heirarchical object.
(A multi-level heirarchical file can be used. This provider will simply 'flatten' the depth by appending the property name at each level using ':' as a delimiter.)
There are three additional attributes that can be used to configure this builder:
* `jsonFile` - A required attribute specifying the json file to draw from. The '~' character can be used at the start to reference the app root.
* `jsonMode` - `[Flat|Sectional]`. 'Flat' is the default.
- This attribute requires a little more explanation. It says above to think of the json file as a single flat key/value source. This is the usual that applies to other key/value config builders like `EnvironmentConfigBuilder` and `AzureKeyVaultConfigBuilder` because those sources provide no other option. If the `SimpleJsonConfigBuilder` is configured in 'Sectional' mode, then the json file is conceptually divided just at the top level into multiple simple dictionaries. Each one of those dictionaries will only be applied to the config section that matches the top-level property name attached to them. For example:
- This attribute requires a little more explanation. It says above to think of the json file as a single flat key/value source. This is the usual that applies to
other key/value config builders like `EnvironmentConfigBuilder` and `AzureKeyVaultConfigBuilder` because those sources provide no other option. If the
`SimpleJsonConfigBuilder` is configured in 'Sectional' mode, then the json file is conceptually divided - at the top level only - into multiple simple dictionaries.
Each one of those dictionaries will only be applied to the config section that matches the top-level property name attached to them. For example:
```json
{
"appSettings" : {

Просмотреть файл

@ -3,8 +3,6 @@
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{590892DD-F842-4E7C-9400-4C6451C16B1A}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
@ -13,6 +11,16 @@
<RootNamespace>SampleWebApp</RootNamespace>
<AssemblyName>SampleWebApp</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<ProductVersion />
<NuGetPackageImportStamp />
</PropertyGroup>
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
<UpdateBindingRedirectsAfterBuild>false</UpdateBindingRedirectsAfterBuild>
</PropertyGroup>
<PropertyGroup>
<UseIISExpress>true</UseIISExpress>
<Use64BitIISExpress />
<IISExpressSSLPort />
@ -20,8 +28,6 @@
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
<UseGlobalApplicationHostFile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@ -41,6 +47,16 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Content Include="App_Data\settings.json" />
<Content Include="App_Data\expandTest.json" />
<Content Include="App_Data\secrets.xml" />
<Content Include="default.aspx" />
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Web" />
@ -50,67 +66,37 @@
<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform">
<Version>2.0.1</Version>
</PackageReference>
<PackageReference Include="Azure.Data.AppConfiguration">
<Version>1.0.0</Version>
</PackageReference>
<PackageReference Include="Azure.Identity">
<Version>1.1.1</Version>
</PackageReference>
<PackageReference Include="Azure.Security.KeyVault.Secrets">
<Version>4.0.0</Version>
</PackageReference>
<PackageReference Include="Newtonsoft.Json">
<Version>11.0.1</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Content Include="App_Data\settings.json" />
<Content Include="App_Data\expandTest.json" />
<None Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</None>
<None Include="Web.Release.config">
<DependentUpon>Web.config</DependentUpon>
</None>
</ItemGroup>
<ItemGroup>
<Content Include="App_Data\secrets.xml" />
<Content Include="default.aspx" />
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\AzureAppConfig\AzureAppConfig.csproj">
<Project>{3f1bb24a-355f-49e7-b396-6aa2eb5dda0e}</Project>
<Name>AzureAppConfig</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
<ProjectReference Include="..\..\src\Azure\Azure.csproj">
<Project>{345c5437-4990-45dc-be34-6e37aa05d8d2}</Project>
<Name>Azure</Name>
</ProjectReference>
<ProjectReference Include="..\..\src\Base\Base.csproj">
<Project>{f382fbf8-146d-4968-a199-90d37f9ef9a7}</Project>
<Name>Base</Name>
</ProjectReference>
<ProjectReference Include="..\..\src\Environment\Environment.csproj">
<Project>{c6530e81-d8d8-47a8-912e-d2939f801835}</Project>
<Name>Environment</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
<ProjectReference Include="..\..\src\Json\Json.csproj">
<Project>{84e0ce5d-4af2-414f-a940-22b3f93fc727}</Project>
<Name>Json</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
<ProjectReference Include="..\..\src\Environment\Environment.csproj">
<Project>{c6530e81-d8d8-47a8-912e-d2939f801835}</Project>
<Name>Environment</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
<ProjectReference Include="..\..\src\KeyPerFile\KeyPerFile.csproj">
<Project>{60c31149-44ed-4789-b5c3-aaa5d3b2fcf1}</Project>
<Name>KeyPerFile</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
<ProjectReference Include="..\..\src\UserSecrets\UserSecrets.csproj">
<Project>{c60d6cbb-d513-4692-81a6-0be5d45e4702}</Project>
<Name>UserSecrets</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
</ItemGroup>
<PropertyGroup>
@ -138,6 +124,11 @@
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<Target Name="UpdateBindingRedirects" AfterTargets="AfterBuild" Condition="$(UpdateBindingRedirectsAfterBuild)=='true'">
<Copy SourceFiles="$(OutDir)$(AssemblyName).dll.config" DestinationFiles="web.config" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

Просмотреть файл

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

Просмотреть файл

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

Просмотреть файл

@ -5,10 +5,9 @@
-->
<configuration>
<configSections>
<section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false"/>
<section name="appConfigTest" type="System.Configuration.AppSettingsSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false"/>
<section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
<section name="appConfigTest" type="System.Configuration.AppSettingsSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<!-- For the KeyVault builders, imagine this is the vault:
Key Version Current Value
@ -38,171 +37,201 @@
acKVTest2 beta V2 from KeyVault
-->
<configBuilders>
<builders>
<add name="Environment" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="Secrets" userSecretsFile="~/App_Data/secrets.xml" mode="Greedy" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="Json" jsonFile="${JSONConfigFile}" optional="true" type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="KeyPerFile" directoryPath="~/../KeyPerFileSampleRoot" mode="Strict" keyDelimiter="--" type="Microsoft.Configuration.ConfigurationBuilders.KeyPerFileConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.KeyPerFile, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="KV1" vaultName="${ConfigBuilderTestKeyVaultName}" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="KV2" vaultName="${ConfigBuilderTestKeyVaultName}" preloadSecretNames="false" version="d14197de791c4ffe8e79bc7fc0f766b0" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="KV3" vaultName="${ConfigBuilderTestKeyVaultName}" mode="Greedy" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="KV4" vaultName="${ConfigBuilderTestKeyVaultName}" mode="Greedy" version="0de51928e49144ce86eb1de9056ac937" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="AS_Sub_Test" optional="${Boolean}" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="AS_Sub_Test2" optional="${app~Settings_Colon-and$friends@super+duper,awesome#cool:Test.}" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="ExpTest" mode="Expand" escapeExpandedValues="true" jsonFile="~/App_Data/expandTest.json" jsonMode="Flat" type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="appconfig1" endpoint="${AppConfigTestEndpoint}" keyFilter="acTes*" type="Microsoft.Configuration.ConfigurationBuilders.AzureAppConfigurationBuilder, Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="appconfig2" optional="false" endpoint="${AppConfigTestEndpoint}" mode="Greedy" labelFilter="beta" useAzureKeyVault="true" type="Microsoft.Configuration.ConfigurationBuilders.AzureAppConfigurationBuilder, Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="appconfig3" endpoint="${AppConfigTestEndpoint}" mode="Greedy" keyFilter="acLM*" acceptDateTime="December 1, 2019" type="Microsoft.Configuration.ConfigurationBuilders.AzureAppConfigurationBuilder, Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="Environment" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment" />
<add name="Secrets" userSecretsFile="~/App_Data/secrets.xml" mode="Greedy" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets" />
<add name="Json" jsonFile="${JSONConfigFile}" optional="true" type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Json" />
<add name="KeyPerFile" directoryPath="~/../KeyPerFileSampleRoot" mode="Strict" keyDelimiter="--" type="Microsoft.Configuration.ConfigurationBuilders.KeyPerFileConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.KeyPerFile" />
<add name="KV1" vaultName="${ConfigBuilderTestKeyVaultName}" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure" />
<add name="KV2" vaultName="${ConfigBuilderTestKeyVaultName}" preloadSecretNames="false" version="d14197de791c4ffe8e79bc7fc0f766b0" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure" />
<add name="KV3" vaultName="${ConfigBuilderTestKeyVaultName}" mode="Greedy" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure" />
<add name="KV4" vaultName="${ConfigBuilderTestKeyVaultName}" mode="Greedy" version="0de51928e49144ce86eb1de9056ac937" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure" />
<add name="AS_Sub_Test" optional="${Boolean}" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment" />
<add name="AS_Sub_Test2" optional="${app~Settings_Colon-and$friends@super+duper,awesome#cool:Test.}" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment" />
<add name="ExpTest" mode="Expand" escapeExpandedValues="true" jsonFile="~/App_Data/expandTest.json" jsonMode="Flat" type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Json" />
<add name="appconfig1" endpoint="${AppConfigTestEndpoint}" keyFilter="acTes*" type="Microsoft.Configuration.ConfigurationBuilders.AzureAppConfigurationBuilder, Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration" />
<add name="appconfig2" optional="false" endpoint="${AppConfigTestEndpoint}" mode="Greedy" labelFilter="beta" useAzureKeyVault="true" type="Microsoft.Configuration.ConfigurationBuilders.AzureAppConfigurationBuilder, Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration" />
<add name="appconfig3" endpoint="${AppConfigTestEndpoint}" mode="Greedy" keyFilter="acLM*" acceptDateTime="December 1, 2019" type="Microsoft.Configuration.ConfigurationBuilders.AzureAppConfigurationBuilder, Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration" />
</builders>
</configBuilders>
<appSettings configBuilders="Environment,Secrets,Json,KeyPerFile,KV1,KV2,KV3,KV4">
<add key="app~Settings_Colon-and$friends@super+duper,awesome#cool:Test." value="true"/>
<add key="WINDIR" value="Will be replaced by 'Environment' in Strict and Greedy modes."/>
<add key="SYSTEMDRIVE" value="Will initally be replaced by 'Environment' in Strict and Greedy modes... but then superceded by 'Secrets' in the same modes."/>
<add key="Value_Replaced_By_Environment_In_Expand_Mode" value="${WINDIR}"/>
<add key="ARCHITECTURE" value="Will be replaced by 'Environment' in Strict/Greedy modes IFF prefix='PROCESSOR_' AND stripPrefix='true'"/>
<add key="PROCESSOR_ARCHITECTURE" value="Will be left untouched by 'Environment' in Strict/Greedy modes if IFF prefix='PROCESSOR_' AND stripPrefix='true'"/>
<add key="jsonSetting1" value="Will be replaced by 'Json' in Strict and Greedy modes."/>
<add key="Value_Replaced_By_Json_In_Expand_Mode" value="${jsonSetting1}"/>
<add key="appSettings:jsonSubSetting2" value="Will be replaced by 'Json' in Strict and Greedy modes."/>
<add key="jsonSubSetting2" value="Will be replaced by 'Json' in 'Sectional' jsonMode."/>
<add key="jsonSub:subSetting3" value="Will be replaced by 'Json' in 'Sectional' jsonMode."/>
<add key="jsonConnectionString1" value="WILL be replaced by 'Json' in 'Flat' jsonMode."/>
<add key="jsonConnectionString2" value="WILL NOT be replaced by 'Json' in 'Sectional' jsonMode."/>
<add key="jsonCustomSetting1" value="Will be replaced by 'Json' with prefix='customSettings:' and stripPrefix='true'."/>
<add key="SecretFromFile1" value="This will be replaced by KeyPerFile."/>
<add key="SECRETFROMFILE2" value="As will this one."/>
<add key="SubFeature--FeatureSecretA" value="This will be replaced by KeyPerFile if keyDelimiter is set to '--'."/>
<add key="ignore.secretfromfile3" value="This value should be left alone."/>
<add key="Secret1" value="Last writer wins. KV1:Latest1, KV2:First1, KV3:Latest1, (KV4-untouched because it's version doesn't exist for this secret.)"/>
<add key="Secret2/63e11b20b386418d81618da23482534e" value="KV1 and KV3 get one chance to update this to 'Secret2:First2'. KV2 and KV4 don't touch ever due to mismatched versions."/>
<add key="app~Settings_Colon-and$friends@super+duper,awesome#cool:Test." value="true" />
<add key="WINDIR" value="Will be replaced by 'Environment' in Strict and Greedy modes." />
<add key="SYSTEMDRIVE" value="Will initally be replaced by 'Environment' in Strict and Greedy modes... but then superceded by 'Secrets' in the same modes." />
<add key="Value_Replaced_By_Environment_In_Expand_Mode" value="${WINDIR}" />
<add key="ARCHITECTURE" value="Will be replaced by 'Environment' in Strict/Greedy modes IFF prefix='PROCESSOR_' AND stripPrefix='true'" />
<add key="PROCESSOR_ARCHITECTURE" value="Will be left untouched by 'Environment' in Strict/Greedy modes if IFF prefix='PROCESSOR_' AND stripPrefix='true'" />
<add key="jsonSetting1" value="Will be replaced by 'Json' in Strict and Greedy modes." />
<add key="Value_Replaced_By_Json_In_Expand_Mode" value="${jsonSetting1}" />
<add key="appSettings:jsonSubSetting2" value="Will be replaced by 'Json' in Strict and Greedy modes." />
<add key="jsonSubSetting2" value="Will be replaced by 'Json' in 'Sectional' jsonMode." />
<add key="jsonSub:subSetting3" value="Will be replaced by 'Json' in 'Sectional' jsonMode." />
<add key="jsonConnectionString1" value="WILL be replaced by 'Json' in 'Flat' jsonMode." />
<add key="jsonConnectionString2" value="WILL NOT be replaced by 'Json' in 'Sectional' jsonMode." />
<add key="jsonCustomSetting1" value="Will be replaced by 'Json' with prefix='customSettings:' and stripPrefix='true'." />
<add key="SecretFromFile1" value="This will be replaced by KeyPerFile." />
<add key="SECRETFROMFILE2" value="As will this one." />
<add key="SubFeature--FeatureSecretA" value="This will be replaced by KeyPerFile if keyDelimiter is set to '--'." />
<add key="ignore.secretfromfile3" value="This value should be left alone." />
<add key="Secret1" value="Last writer wins. KV1:Latest1, KV2:First1, KV3:Latest1, (KV4-untouched because it's version doesn't exist for this secret.)" />
<add key="Secret2/63e11b20b386418d81618da23482534e" value="KV1 and KV3 get one chance to update this to 'Secret2:First2'. KV2 and KV4 don't touch ever due to mismatched versions." />
<!-- key="Secret2" value="However, if the above does get updated to 'Secret2' with no version attached, it is then fair game for updates. KV1:Latest2,KV3:Latest2,KV4:Second2. KV2 won't update because its version doesn't exist for this secret." -->
<!-- key="Secret2" value=" If the above does NOT get renamed to 'Secret2' though, then 'Secret2' will still get added IN ADDITION to the above by KV3:Latest2 or KV4:Second2." -->
<!-- key="Secret3" value="Will be added by KV3:Latest3. IFF already added, will be "updated" by KV1 to Latest3. KV2 and KV4 don't have versions matching this secret." -->
<!-- These are needed to supply connection information for KeyVault and AppConfig, since the Environment builder is in strict mode. -->
<add key="ConfigBuilderTestKeyVaultName"/>
<add key="AppConfigTestEndpoint"/>
<add key="ConfigBuilderTestKeyVaultName" />
<add key="AppConfigTestEndpoint" />
</appSettings>
<appConfigTest configBuilders="appconfig1,appconfig2,appconfig3">
<add key="acTest" value="Will be replaced by appconfig1. Should be 'test1'"/>
<add key="acTEST2" value="Should be case-insensitive-and-preserve replaced by appconfig1, and again by appconfig2. Should be 'test2b'"/>
<add key="acTest" value="Will be replaced by appconfig1. Should be 'test1'" />
<add key="acTEST2" value="Should be case-insensitive-and-preserve replaced by appconfig1, and again by appconfig2. Should be 'test2b'" />
<!-- <add key="acTest3" value="Will be added by appconfig2. Should be 'test3b'" /> -->
<!-- <add key="acTest4" value="Will not exist." /> -->
<add key="acLMTest" value="Will be replaced by appconfig3. Should be 'oldest'"/>
<add key="acLMTest" value="Will be replaced by appconfig3. Should be 'oldest'" />
<!-- <add key="acLMTest2" value="Will be added by appconfig3. Should be 'older'" /> -->
<add key="acLMTest3" value="Should be this. This will be left alone, as the config store entry is too new for appconfig3."/>
<add key="acLMTest3" value="Should be this. This will be left alone, as the config store entry is too new for appconfig3." />
<add key="acKVTest1" value="Should be replaced with 'V1 from KeyVault' by appconfig2." />
<!-- <add key="acKVTest2" value="Will be added by appconfig2. Should be 'V2 from KeyVault'" /> -->
</appConfigTest>
<connectionStrings configBuilders="Json,ExpTest,AS_Sub_Test2">
<add name="expansionTest" connectionString="${expandTestCS}"/>
<add name="expandTestCS" connectionString="Only replaced in Strict/Greedy modes. Not Expand."/>
<add name="jsonConnectionString1" connectionString="Will be replaced by 'Json' in 'Flat' AND 'Sectional' jsonModes, but with different values."/>
<add name="connectionStrings:jsonConnectionString1" connectionString="Will only be replaced by 'Json' in 'Flat' jsonMode."/>
<add name="jsonConnectionString2" connectionString="Will only be replaced by 'Json' in 'Sectional' jsonMode."/>
<add name="customSettings:jsonConnectionString2" connectionString="Will be replaced by 'Json' in 'Flat' jsonMode."/>
<add name="expansionTest" connectionString="${expandTestCS}" />
<add name="expandTestCS" connectionString="Only replaced in Strict/Greedy modes. Not Expand." />
<add name="jsonConnectionString1" connectionString="Will be replaced by 'Json' in 'Flat' AND 'Sectional' jsonModes, but with different values." />
<add name="connectionStrings:jsonConnectionString1" connectionString="Will only be replaced by 'Json' in 'Flat' jsonMode." />
<add name="jsonConnectionString2" connectionString="Will only be replaced by 'Json' in 'Sectional' jsonMode." />
<add name="customSettings:jsonConnectionString2" connectionString="Will be replaced by 'Json' in 'Flat' jsonMode." />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.7.1"/>
<httpRuntime targetFramework="4.7.1"/>
<compilation debug="true" targetFramework="4.7.1" />
<httpRuntime targetFramework="4.7.1" />
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
</compilers>
</system.codedom>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
</compilers>
</system.codedom>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.SecureString" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="B77A5C561934E089" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Globalization.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Data.Common" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="CC7B13FFCD2DDD51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
<assemblyIdentity name="Azure.Core" publicKeyToken="92742159e12e44c8" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.2.0" newVersion="1.0.2.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Azure.Core" publicKeyToken="92742159e12e44c8" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-1.0.2.0" newVersion="1.0.2.0"/>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0"/>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1"/>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Data.Common" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Globalization.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.SecureString" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
</configuration>