123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735 |
- # Copyright (c) Microsoft Corporation. All rights reserved.
- $ErrorActionPreference = 'Stop'
- $InitialDatabase = '0'
- $UpdatePowerShell = 'The Entity Framework Package Manager Console Tools require Windows PowerShell 3.0 or higher. ' +
- 'Install Windows Management Framework 3.0, restart Visual Studio, and try again. https://aka.ms/wmf3download'
- <#
- .SYNOPSIS
- Adds or updates an Entity Framework provider entry in the project config
- file.
- .DESCRIPTION
- Adds an entry into the 'entityFramework' section of the project config
- file for the specified provider invariant name and provider type. If an
- entry for the given invariant name already exists, then that entry is
- updated with the given type name, unless the given type name already
- matches, in which case no action is taken. The 'entityFramework'
- section is added if it does not exist. The config file is automatically
- saved if and only if a change was made.
- This command is typically used only by Entity Framework provider NuGet
- packages and is run from the 'install.ps1' script.
- .PARAMETER Project
- The Visual Studio project to update. When running in the NuGet install.ps1
- script the '$project' variable provided as part of that script should be
- used.
- .PARAMETER InvariantName
- The provider invariant name that uniquely identifies this provider. For
- example, the Microsoft SQL Server provider is registered with the invariant
- name 'System.Data.SqlClient'.
- .PARAMETER TypeName
- The assembly-qualified type name of the provider-specific type that
- inherits from 'System.Data.Entity.Core.Common.DbProviderServices'. For
- example, for the Microsoft SQL Server provider, this type is
- 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'.
- #>
- function Add-EFProvider
- {
- [CmdletBinding(PositionalBinding = $false)]
- param(
- [parameter(Position = 0, Mandatory = $true)]
- $Project,
- [parameter(Position = 1, Mandatory = $true)]
- [string] $InvariantName,
- [parameter(Position = 2, Mandatory = $true)]
- [string] $TypeName)
- $configPath = GetConfigPath($Project)
- if (!$configPath)
- {
- return
- }
- [xml] $configXml = Get-Content $configPath
- $providers = $configXml.configuration.entityFramework.providers
- $providers.provider |
- where invariantName -eq $InvariantName |
- %{ $providers.RemoveChild($_) | Out-Null }
- $provider = $providers.AppendChild($configXml.CreateElement('provider'))
- $provider.SetAttribute('invariantName', $InvariantName)
- $provider.SetAttribute('type', $TypeName)
- $configXml.Save($configPath)
- }
- <#
- .SYNOPSIS
- Adds or updates an Entity Framework default connection factory in the
- project config file.
- .DESCRIPTION
- Adds an entry into the 'entityFramework' section of the project config
- file for the connection factory that Entity Framework will use by default
- when creating new connections by convention. Any existing entry will be
- overridden if it does not match. The 'entityFramework' section is added if
- it does not exist. The config file is automatically saved if and only if
- a change was made.
- This command is typically used only by Entity Framework provider NuGet
- packages and is run from the 'install.ps1' script.
- .PARAMETER Project
- The Visual Studio project to update. When running in the NuGet install.ps1
- script the '$project' variable provided as part of that script should be
- used.
- .PARAMETER TypeName
- The assembly-qualified type name of the connection factory type that
- implements the 'System.Data.Entity.Infrastructure.IDbConnectionFactory'
- interface. For example, for the Microsoft SQL Server Express provider
- connection factory, this type is
- 'System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework'.
- .PARAMETER ConstructorArguments
- An optional array of strings that will be passed as arguments to the
- connection factory type constructor.
- #>
- function Add-EFDefaultConnectionFactory
- {
- [CmdletBinding(PositionalBinding = $false)]
- param(
- [parameter(Position = 0, Mandatory = $true)]
- $Project,
- [parameter(Position = 1, Mandatory = $true)]
- [string] $TypeName,
- [string[]] $ConstructorArguments)
- $configPath = GetConfigPath($Project)
- if (!$configPath)
- {
- return
- }
- [xml] $configXml = Get-Content $configPath
- $entityFramework = $configXml.configuration.entityFramework
- $defaultConnectionFactory = $entityFramework.defaultConnectionFactory
- if ($defaultConnectionFactory)
- {
- $entityFramework.RemoveChild($defaultConnectionFactory) | Out-Null
- }
- $defaultConnectionFactory = $entityFramework.AppendChild($configXml.CreateElement('defaultConnectionFactory'))
- $defaultConnectionFactory.SetAttribute('type', $TypeName)
- if ($ConstructorArguments)
- {
- $parameters = $defaultConnectionFactory.AppendChild($configXml.CreateElement('parameters'))
- foreach ($constructorArgument in $ConstructorArguments)
- {
- $parameter = $parameters.AppendChild($configXml.CreateElement('parameter'))
- $parameter.SetAttribute('value', $constructorArgument)
- }
- }
- $configXml.Save($configPath)
- }
- <#
- .SYNOPSIS
- Enables Code First Migrations in a project.
- .DESCRIPTION
- Enables Migrations by scaffolding a migrations configuration class in the project. If the
- target database was created by an initializer, an initial migration will be created (unless
- automatic migrations are enabled via the EnableAutomaticMigrations parameter).
- .PARAMETER ContextTypeName
- Specifies the context to use. If omitted, migrations will attempt to locate a
- single context type in the target project.
- .PARAMETER EnableAutomaticMigrations
- Specifies whether automatic migrations will be enabled in the scaffolded migrations configuration.
- If omitted, automatic migrations will be disabled.
- .PARAMETER MigrationsDirectory
- Specifies the name of the directory that will contain migrations code files.
- If omitted, the directory will be named "Migrations".
- .PARAMETER ProjectName
- Specifies the project that the scaffolded migrations configuration class will
- be added to. If omitted, the default project selected in package manager
- console is used.
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
- .PARAMETER ContextProjectName
- Specifies the project which contains the DbContext class to use. If omitted,
- the context is assumed to be in the same project used for migrations.
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
- .PARAMETER ConnectionString
- Specifies the connection string to use. If omitted, the context's
- default connection will be used.
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
- .PARAMETER Force
- Specifies that the migrations configuration be overwritten when running more
- than once for a given project.
- .PARAMETER ContextAssemblyName
- Specifies the name of the assembly which contains the DbContext class to use. Use this
- parameter instead of ContextProjectName when the context is contained in a referenced
- assembly rather than in a project of the solution.
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
- .EXAMPLE
- Enable-Migrations
- # Scaffold a migrations configuration in a project with only one context
- .EXAMPLE
- Enable-Migrations -Auto
- # Scaffold a migrations configuration with automatic migrations enabled for a project
- # with only one context
- .EXAMPLE
- Enable-Migrations -ContextTypeName MyContext -MigrationsDirectory DirectoryName
- # Scaffold a migrations configuration for a project with multiple contexts
- # This scaffolds a migrations configuration for MyContext and will put the configuration
- # and subsequent configurations in a new directory called "DirectoryName"
- #>
- function Enable-Migrations(
- $ContextTypeName,
- [alias('Auto')]
- [switch] $EnableAutomaticMigrations,
- $MigrationsDirectory,
- $ProjectName,
- $StartUpProjectName,
- $ContextProjectName,
- $ConnectionStringName,
- $ConnectionString,
- $ConnectionProviderName,
- [switch] $Force,
- $ContextAssemblyName,
- $AppDomainBaseDirectory)
- WarnIfOtherEFs 'Enable-Migrations'
- throw $UpdatePowerShell
- }
- <#
- .SYNOPSIS
- Scaffolds a migration script for any pending model changes.
- .DESCRIPTION
- Scaffolds a new migration script and adds it to the project.
- .PARAMETER Name
- Specifies the name of the custom script.
- .PARAMETER Force
- Specifies that the migration user code be overwritten when re-scaffolding an
- existing migration.
- .PARAMETER ProjectName
- Specifies the project that contains the migration configuration type to be
- used. If omitted, the default project selected in package manager console
- is used.
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
- .PARAMETER ConfigurationTypeName
- Specifies the migrations configuration to use. If omitted, migrations will
- attempt to locate a single migrations configuration type in the target
- project.
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
- .PARAMETER ConnectionString
- Specifies the connection string to use. If omitted, the context's
- default connection will be used.
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
- .PARAMETER IgnoreChanges
- Scaffolds an empty migration ignoring any pending changes detected in the current model.
- This can be used to create an initial, empty migration to enable Migrations for an existing
- database. N.B. Doing this assumes that the target database schema is compatible with the
- current model.
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
- .EXAMPLE
- Add-Migration First
- # Scaffold a new migration named "First"
- .EXAMPLE
- Add-Migration First -IgnoreChanges
- # Scaffold an empty migration ignoring any pending changes detected in the current model.
- # This can be used to create an initial, empty migration to enable Migrations for an existing
- # database. N.B. Doing this assumes that the target database schema is compatible with the
- # current model.
- #>
- function Add-Migration(
- $Name,
- [switch] $Force,
- $ProjectName,
- $StartUpProjectName,
- $ConfigurationTypeName,
- $ConnectionStringName,
- $ConnectionString,
- $ConnectionProviderName,
- [switch] $IgnoreChanges,
- $AppDomainBaseDirectory)
- WarnIfOtherEFs 'Add-Migration'
- throw $UpdatePowerShell
- }
- <#
- .SYNOPSIS
- Applies any pending migrations to the database.
- .DESCRIPTION
- Updates the database to the current model by applying pending migrations.
- .PARAMETER SourceMigration
- Only valid with -Script. Specifies the name of a particular migration to use
- as the update's starting point. If omitted, the last applied migration in
- the database will be used.
- .PARAMETER TargetMigration
- Specifies the name of a particular migration to update the database to. If
- omitted, the current model will be used.
- .PARAMETER Script
- Generate a SQL script rather than executing the pending changes directly.
- .PARAMETER Force
- Specifies that data loss is acceptable during automatic migration of the
- database.
- .PARAMETER ProjectName
- Specifies the project that contains the migration configuration type to be
- used. If omitted, the default project selected in package manager console
- is used.
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
- .PARAMETER ConfigurationTypeName
- Specifies the migrations configuration to use. If omitted, migrations will
- attempt to locate a single migrations configuration type in the target
- project.
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
- .PARAMETER ConnectionString
- Specifies the connection string to use. If omitted, the context's
- default connection will be used.
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
- .EXAMPLE
- Update-Database
- # Update the database to the latest migration
- .EXAMPLE
- Update-Database -TargetMigration Second
- # Update database to a migration named "Second"
- # This will apply migrations if the target hasn't been applied or roll back migrations
- # if it has
- .EXAMPLE
- Update-Database -Script
- # Generate a script to update the database from its current state to the latest migration
- .EXAMPLE
- Update-Database -Script -SourceMigration Second -TargetMigration First
- # Generate a script to migrate the database from a specified start migration
- # named "Second" to a specified target migration named "First"
- .EXAMPLE
- Update-Database -Script -SourceMigration $InitialDatabase
- # Generate a script that can upgrade a database currently at any version to the latest version.
- # The generated script includes logic to check the __MigrationsHistory table and only apply changes
- # that haven't been previously applied.
- .EXAMPLE
- Update-Database -TargetMigration $InitialDatabase
- # Runs the Down method to roll-back any migrations that have been applied to the database
- #>
- function Update-Database(
- $SourceMigration,
- $TargetMigration,
- [switch] $Script,
- [switch] $Force,
- $ProjectName,
- $StartUpProjectName,
- $ConfigurationTypeName,
- $ConnectionStringName,
- $ConnectionString,
- $ConnectionProviderName,
- $AppDomainBaseDirectory)
- WarnIfOtherEFs 'Update-Database'
- throw $UpdatePowerShell
- }
- <#
- .SYNOPSIS
- Displays the migrations that have been applied to the target database.
- .DESCRIPTION
- Displays the migrations that have been applied to the target database.
- .PARAMETER ProjectName
- Specifies the project that contains the migration configuration type to be
- used. If omitted, the default project selected in package manager console
- is used.
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
- .PARAMETER ConfigurationTypeName
- Specifies the migrations configuration to use. If omitted, migrations will
- attempt to locate a single migrations configuration type in the target
- project.
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
- .PARAMETER ConnectionString
- Specifies the connection string to use. If omitted, the context's
- default connection will be used.
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
- #>
- function Get-Migrations(
- $ProjectName,
- $StartUpProjectName,
- $ConfigurationTypeName,
- $ConnectionStringName,
- $ConnectionString,
- $ConnectionProviderName,
- $AppDomainBaseDirectory)
- WarnIfOtherEFs 'Get-Migrations'
- throw $UpdatePowerShell
- }
- function GetConfigPath($project)
- {
- $solution = Get-VSService 'Microsoft.VisualStudio.Shell.Interop.SVsSolution' 'Microsoft.VisualStudio.Shell.Interop.IVsSolution'
- $hierarchy = $null
- $hr = $solution.GetProjectOfUniqueName($project.UniqueName, [ref] $hierarchy)
- [Runtime.InteropServices.Marshal]::ThrowExceptionForHR($hr)
- $aggregatableProject = Get-Interface $hierarchy 'Microsoft.VisualStudio.Shell.Interop.IVsAggregatableProject'
- if (!$aggregatableProject)
- {
- $projectTypes = $project.Kind
- }
- else
- {
- $projectTypeGuids = $null
- $hr = $aggregatableProject.GetAggregateProjectTypeGuids([ref] $projectTypeGuids)
- [Runtime.InteropServices.Marshal]::ThrowExceptionForHR($hr)
- $projectTypes = $projectTypeGuids.Split(';')
- }
- $configFileName = 'app.config'
- foreach ($projectType in $projectTypes)
- {
- if ($projectType -in '{349C5851-65DF-11DA-9384-00065B846F21}', '{E24C65DC-7377-472B-9ABA-BC803B73C61A}')
- {
- $configFileName = 'web.config'
- break
- }
- }
- try
- {
- return $project.ProjectItems.Item($configFileName).Properties.Item('FullPath').Value
- }
- catch
- {
- return $null
- }
- }
- function WarnIfOtherEFs($cmdlet)
- {
- if (Get-Module 'EntityFrameworkCore')
- {
- Write-Warning "Both Entity Framework 6 and Entity Framework Core are installed. The Entity Framework 6 tools are running. Use 'EntityFrameworkCore\$cmdlet' for Entity Framework Core."
- }
- if (Get-Module 'EntityFramework')
- {
- Write-Warning "A version of Entity Framework older than 6.3 is also installed. The newer tools are running. Use 'EntityFramework\$cmdlet' for the older version."
- }
- }
- Export-ModuleMember 'Add-EFDefaultConnectionFactory', 'Add-EFProvider', 'Add-Migration', 'Enable-Migrations', 'Get-Migrations', 'Update-Database' -Variable 'InitialDatabase'
- # SIG # Begin signature block
- # MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
- # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
- # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBCukGtqR95vOzB
- # mTRxRgJFbcuurrr/NN2TQIASywaOO6CCDYEwggX/MIID56ADAgECAhMzAAABUZ6N
- # j0Bxow5BAAAAAAFRMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
- # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
- # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
- # bmcgUENBIDIwMTEwHhcNMTkwNTAyMjEzNzQ2WhcNMjAwNTAyMjEzNzQ2WjB0MQsw
- # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
- # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
- # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
- # AQCVWsaGaUcdNB7xVcNmdfZiVBhYFGcn8KMqxgNIvOZWNH9JYQLuhHhmJ5RWISy1
- # oey3zTuxqLbkHAdmbeU8NFMo49Pv71MgIS9IG/EtqwOH7upan+lIq6NOcw5fO6Os
- # +12R0Q28MzGn+3y7F2mKDnopVu0sEufy453gxz16M8bAw4+QXuv7+fR9WzRJ2CpU
- # 62wQKYiFQMfew6Vh5fuPoXloN3k6+Qlz7zgcT4YRmxzx7jMVpP/uvK6sZcBxQ3Wg
- # B/WkyXHgxaY19IAzLq2QiPiX2YryiR5EsYBq35BP7U15DlZtpSs2wIYTkkDBxhPJ
- # IDJgowZu5GyhHdqrst3OjkSRAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE
- # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUV4Iarkq57esagu6FUBb270Zijc8w
- # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1
- # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDU0MTM1MB8GA1UdIwQYMBaAFEhu
- # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu
- # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w
- # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3
- # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx
- # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAWg+A
- # rS4Anq7KrogslIQnoMHSXUPr/RqOIhJX+32ObuY3MFvdlRElbSsSJxrRy/OCCZdS
- # se+f2AqQ+F/2aYwBDmUQbeMB8n0pYLZnOPifqe78RBH2fVZsvXxyfizbHubWWoUf
- # NW/FJlZlLXwJmF3BoL8E2p09K3hagwz/otcKtQ1+Q4+DaOYXWleqJrJUsnHs9UiL
- # crVF0leL/Q1V5bshob2OTlZq0qzSdrMDLWdhyrUOxnZ+ojZ7UdTY4VnCuogbZ9Zs
- # 9syJbg7ZUS9SVgYkowRsWv5jV4lbqTD+tG4FzhOwcRQwdb6A8zp2Nnd+s7VdCuYF
- # sGgI41ucD8oxVfcAMjF9YX5N2s4mltkqnUe3/htVrnxKKDAwSYliaux2L7gKw+bD
- # 1kEZ/5ozLRnJ3jjDkomTrPctokY/KaZ1qub0NUnmOKH+3xUK/plWJK8BOQYuU7gK
- # YH7Yy9WSKNlP7pKj6i417+3Na/frInjnBkKRCJ/eYTvBH+s5guezpfQWtU4bNo/j
- # 8Qw2vpTQ9w7flhH78Rmwd319+YTmhv7TcxDbWlyteaj4RK2wk3pY1oSz2JPE5PNu
- # Nmd9Gmf6oePZgy7Ii9JLLq8SnULV7b+IP0UXRY9q+GdRjM2AEX6msZvvPCIoG0aY
- # HQu9wZsKEK2jqvWi8/xdeeeSI9FN6K1w4oVQM4Mwggd6MIIFYqADAgECAgphDpDS
- # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
- # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
- # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0
- # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla
- # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
- # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT
- # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB
- # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG
- # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S
- # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz
- # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7
- # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u
- # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33
- # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl
- # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP
- # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB
- # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF
- # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM
- # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ
- # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud
- # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO
- # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0
- # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
- # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p
- # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
- # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB
- # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw
- # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA
- # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY
- # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj
- # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd
- # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ
- # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf
- # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ
- # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j
- # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B
- # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96
- # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7
- # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I
- # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIWLTCCFikCAQEwgZUwfjELMAkG
- # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
- # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z
- # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAVGejY9AcaMOQQAAAAABUTAN
- # BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
- # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgEOrBKmRV
- # F3fgcAWFQjTYlsuOkm9g/FqiwqXthrzk3zcwQgYKKwYBBAGCNwIBDDE0MDKgFIAS
- # AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN
- # BgkqhkiG9w0BAQEFAASCAQB+MwuBzQDZmdbK3JQ+8GWCL4EY9+BQIGRqkMIaDfCr
- # kZc8Mnt2p210Qb9x8k88a5ZMn4YjzyoBUtIis2FpTZqBlDHa9r8o0vTwk7JMVp5w
- # 0Cpc/J73YC7NVz70V4dzer7bpZsXol23thjwlPLxLHjbkI2waGHVJL7mFBXVLSMm
- # SDSMGLja1jrbFoGH0uriXJk5GnIHCJ4jlmyisUCr8UbTlR1RCfgQowyp7CF8UYRL
- # jAX2nPjXpig8qVN1TNjaFJm4LtDx+pOT4cBuvJ+e94aify9iiFOjIUvhXfkB8049
- # fHj0CB9/JTuAp0qHXvgg0Gsf8tfQF9lCBvrwXBl/XeHfoYITtzCCE7MGCisGAQQB
- # gjcDAwExghOjMIITnwYJKoZIhvcNAQcCoIITkDCCE4wCAQMxDzANBglghkgBZQME
- # AgEFADCCAVgGCyqGSIb3DQEJEAEEoIIBRwSCAUMwggE/AgEBBgorBgEEAYRZCgMB
- # MDEwDQYJYIZIAWUDBAIBBQAEIOikt6sGT/Fpa1w5oFLAXISbIcKfPXhM92lj9ACv
- # RIkeAgZdr3dJ9PcYEzIwMTkxMTE2MDQ1MjM5LjkwMVowBwIBAYACAfSggdSkgdEw
- # gc4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
- # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsT
- # IE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFs
- # ZXMgVFNTIEVTTjo3MjhELUM0NUYtRjlFQjElMCMGA1UEAxMcTWljcm9zb2Z0IFRp
- # bWUtU3RhbXAgU2VydmljZaCCDx8wggT1MIID3aADAgECAhMzAAABBAkBdQhYhy0p
- # AAAAAAEEMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
- # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
- # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
- # MDEwMB4XDTE5MDkwNjIwNDExOFoXDTIwMTIwNDIwNDExOFowgc4xCzAJBgNVBAYT
- # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
- # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBP
- # cGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo3
- # MjhELUM0NUYtRjlFQjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
- # dmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMgtB6ARuhhmlpTh
- # YPwWgmtO2oNVTTZyHgYQBc3GH/J1w6bhgTcgpNiZnGZe2kv1Abyg7ABSP6ekgpRh
- # WpByx5gOeOxpllPXkCxpiMlKFFx++Rnxg0N1YFN2aAsVj9GRMWc3R6hPKtgFMHXU
- # LPxji3fu6DTgjfOi2pih5r/O+cp1Oi8KvdT+8p5JlROk1/85nsTggE80CudP/Nhu
- # iIrSvmDNKVmOMF3afUWUswVP6v6t9cGjSWG3GMGNZe8FB3VVOL+pNtCbRV83qhQt
- # kyIyA8HvGaciAfrXZi/QD5C/vK7XcvoeHbizh7j5lXUD3PiH0ffqHvMp58lsU/Aj
- # pqr5ZGcCAwEAAaOCARswggEXMB0GA1UdDgQWBBSY1V7fwkQaDhcBi/GZ08MisOia
- # 6jAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEug
- # SaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N
- # aWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG
- # AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rp
- # bVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG
- # CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IBAQA9FdSzd2l8NAMX17RFeWLhOqnO
- # AgyXIjH8tdW1yA94Zdzyn8NeukcjyIL7/Pkj8R7KEtEUL0cfRnds6KITaPBXxlos
- # z1i+kMhfd6d4kSgnPWm0qoA14fqxJUM6P5fZfWRGUrtkNJha6N8Id1Ciuyibq7K0
- # 3EnTLgli3EX1LXlzBOyyyjM3hDGVxgPk9D7Bw5ikgVju+Yql+tXjjgG/oFw+WJvw
- # BN7YunaRV06JKZwsYGPsOYA1qyc8VXBoyeKGFKhI2oThT/P7IM3hCxLNc4fix3sL
- # aKe4NZta0rjdssY8Kz+Z4sr8T9daXSFa7kUpKVw5277+0QFCc6bkrHjlKB/lMIIG
- # cTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE
- # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
- # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0
- # IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1
- # WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
- # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
- # cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCC
- # ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkdDbx3EYo6IOz8E5f1+n9p
- # lGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEw
- # WbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNFDdDq9UeBzb8kYDJYYEbyWEeG
- # MoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJ
- # UGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9buWayrGo8noqCjHw
- # 2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0C
- # AwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTVYzpcijGQ
- # 80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E
- # BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2U
- # kFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j
- # b20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmww
- # WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m
- # dC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYD
- # VR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6
- # Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYI
- # KwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0
- # AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9
- # naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj+bzta1RXCCtR
- # gkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzy
- # mXlKkVIArzgPF/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8tv0E4XCf
- # Mkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/amJ/3cVKC5Em4jnsGUpxY517IW3D
- # nKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl5WTs
- # 9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5HmoDF0M2n0O99g/DhO3EJ3110
- # mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL
- # 2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI5pgt6o3gMy4SKfXAL1QnIffI
- # rE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxE
- # PJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9YBS7vDaBQNdrvCScc
- # 1bN+NR4Iuto229Nfj950iEkSoYIDrTCCApUCAQEwgf6hgdSkgdEwgc4xCzAJBgNV
- # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
- # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29m
- # dCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVT
- # Tjo3MjhELUM0NUYtRjlFQjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
- # U2VydmljZaIlCgEBMAkGBSsOAwIaBQADFQCzRh5/R0jzKEyIVLZzGHgW3BUKfaCB
- # 3jCB26SB2DCB1TELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
- # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEp
- # MCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xJzAlBgNV
- # BAsTHm5DaXBoZXIgTlRTIEVTTjo0REU5LTBDNUUtM0UwOTErMCkGA1UEAxMiTWlj
- # cm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIF
- # AOF5V0QwIhgPMjAxOTExMTYwMDU2MzZaGA8yMDE5MTExNzAwNTYzNlowdDA6Bgor
- # BgEEAYRZCgQBMSwwKjAKAgUA4XlXRAIBADAHAgEAAgIE8TAHAgEAAgIZUjAKAgUA
- # 4XqoxAIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIBAAID
- # FuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQB0x7X5y62kB/NeAyuK
- # BnkojBstF12/I3Jr+2BMkGCkGtwUU5HcF81fWz76nIBmCLAMTyKK+QtlNEz4YJ98
- # IJSed4O2SqCrvwksPUnmQlHXEKbJtzxbAT65AVQjWWVhplFAdYz0yWkEFWQAFha/
- # hJcb4zxxkKs+J1P666ZzeIpnGYZmoLweIp+XUMpY5oA1ynJK+N6jb7kiIO04GJ1O
- # Nqv2O31CVMFeCgmyJVOuIJXW++z1BsWtEXtQe00RpjGiONt1ok4yGijIw9pQ2Mkf
- # ScM9sGWqKjy4jTvOmXajW+TXB7umD+cCMT/iQ3cSZLxBVVUkD/dDpZW0VvzUQ3oB
- # pvXNMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
- # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
- # b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC
- # EzMAAAEECQF1CFiHLSkAAAAAAQQwDQYJYIZIAWUDBAIBBQCgggEyMBoGCSqGSIb3
- # DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgSwH0nbK6cUwIwS+u
- # zmcD7hWXC0rhvEkaRTNS5qLOAEAwgeIGCyqGSIb3DQEJEAIMMYHSMIHPMIHMMIGx
- # BBSzRh5/R0jzKEyIVLZzGHgW3BUKfTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw
- # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
- # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0
- # YW1wIFBDQSAyMDEwAhMzAAABBAkBdQhYhy0pAAAAAAEEMBYEFEOkqefIaPkY6NZ7
- # MMR+JuaycJA7MA0GCSqGSIb3DQEBCwUABIIBACLmDtiex3OHtwSV5fk0vOmTunZl
- # StZ0d+saz7tdl3/UnyER9h2o8TZyeOKPSfPMzed2hYhWAiyCEZJkF0x6IuTzm8D3
- # wLXJLguieUy3QAY68TNw6bGVjYrQE1AXbhmXyKrak1TcQgoH7MYWzWnPNanlQcMl
- # ly3hRnz/d5ukbV4KXjke7w9IWXbDZzglU/iODI1VgpIiIBx55mx15FZ4BMMhjiuX
- # XazlFo+Ri7jjRR4TSd7hnuw0SIP1zLb1q1U4+rTO1Hc3NNVUQ4kbWHxc1s+0InmF
- # 4XihNXnS8XIYJsg0bo31wOCSy+D7HpvXZI3sCM+a5f8S/mN/sCpCzpfZSQM=
- # SIG # End signature block
|