functions/Add-DoPxDnsRecord.ps1
<#############################################################################
The DoPx module provides a rich set of commands that extend the automation capabilities of the Digital Ocean (DO) cloud service. These commands make it easier to manage your Digital Ocean environment from Windows PowerShell. When used with the LinuxPx module, you can manage all aspects of your environment from one shell. Copyright (c) 2014 Kirk Munro. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in the license folder that is included in the SmaPx module. If not, see <https://www.gnu.org/licenses/gpl.html>. #############################################################################> <# .SYNOPSIS Creates a new DNS record in your DigitalOcean environment. .DESCRIPTION The Add-DoPxDnsRecord command creates a new DNS record in your DigitalOcean environment. You can create A, AAAA, CNAME, MX, TXT, SRV, and NS records with this command. Select the appropriate switch to identify the type of record that you want to create. .INPUTS None .OUTPUTS digitalocean.domainrecord .NOTES This command sends an HTTP POST request that includes your access token to a DigitalOcean REST API v2 endpoint. To learn more about the DigitalOcean REST API, consult the DigitalOcean API documentation online at https://developers.digitalocean.com. .EXAMPLE PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken PS C:\> Add-DoPxDnsRecord -DomainName example.com -A -HostName subdomain -IPv4Address 127.0.0.1 This command creates a new A record for domain example.com, with the subdomain "subdomain" routed to IP address 127.0.0.1. .EXAMPLE PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken PS C:\> Add-DoPxDnsRecord -DomainName example.com -AAAA -HostName subdomain -IPv6Address 2001:db8::ff00:42:8329 This command creates a new AAAA record for domain example.com, with the subdomain "subdomain" routed to IP address 2001:db8::ff00:42:8329. .EXAMPLE PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken PS C:\> Add-DoPxDnsRecord -DomainName example.com -CNAME -AliasName newalias -HostName hosttarget This command creates a new CNAME record for domain example.com, with the "newalias" alias routed to host "hosttarget". .EXAMPLE PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken PS C:\> Add-DoPxDnsRecord -DomainName example.com -MX -HostName 127.0.0.1 -Priority 5 This command creates a new MX record for domain example.com, routing mail traffic to host 127.0.0.1 with a priority of 5. .EXAMPLE PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken PS C:\> Add-DoPxDnsRecord -DomainName example.com -TXT -RecordName recordname -Message 'arbitrary data here' This command creates a new TXT record for domain example.com, with the record named "recordname" containing the message "arbitrary data here". .EXAMPLE PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken PS C:\> Add-DoPxDnsRecord -DomainName example.com -SRV -ServiceName servicename -HostName targethost -Priority 0 -Port 1 -Weight 2 This command creates a new SRV record for domain example.com, directing service requests for service "servicename" to host "targethost" on port 1 with a priority of 0 and a weight of 2. .EXAMPLE PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken PS C:\> Add-DoPxDnsRecord -DomainName example.com -NS -NameServer ns1.digitalocean.com This command creates a new NS record for domain example.com, identifying name server ns1.digitalocean.com as authoritative for the domain. .LINK Get-DoPxDomain .LINK Get-DoPxDnsRecord .LINK Remove-DoPxDnsRecord .LINK Rename-DoPxDnsRecord #> function Add-DoPxDnsRecord { [CmdletBinding(SupportsShouldProcess=$true, DefaultParameterSetName='A')] [OutputType('digitalocean.domainrecord')] param( # The name of the domain to which this DNS record will be added. [Parameter(Position=0, Mandatory=$true, ValueFromPipelineByPropertyName=$true)] [ValidateNotNullOrEmpty()] [Alias('Name')] [System.String] $DomainName, # Creates an A record. [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='A')] [ValidateNotNull()] [ValidateScript({ if (-not $_.IsPresent) { throw 'Passing false into the A parameter is not supported.' } $true })] [System.Management.Automation.SwitchParameter] $A, # Creates an AAAA record. [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='AAAA')] [ValidateNotNull()] [ValidateScript({ if (-not $_.IsPresent) { throw 'Passing false into the AAAA parameter is not supported.' } $true })] [System.Management.Automation.SwitchParameter] $AAAA, # Creates a CNAME record. [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='CNAME')] [ValidateNotNull()] [ValidateScript({ if (-not $_.IsPresent) { throw 'Passing false into the CNAME parameter is not supported.' } $true })] [System.Management.Automation.SwitchParameter] $CNAME, # Creates a MX record. [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='MX')] [ValidateNotNull()] [ValidateScript({ if (-not $_.IsPresent) { throw 'Passing false into the MX parameter is not supported.' } $true })] [System.Management.Automation.SwitchParameter] $MX, # Creates a TXT record. [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='TXT')] [ValidateNotNull()] [ValidateScript({ if (-not $_.IsPresent) { throw 'Passing false into the TXT parameter is not supported.' } $true })] [System.Management.Automation.SwitchParameter] $TXT, # Creates a SRV record. [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')] [ValidateNotNull()] [ValidateScript({ if (-not $_.IsPresent) { throw 'Passing false into the SRV parameter is not supported.' } $true })] [System.Management.Automation.SwitchParameter] $SRV, # Creates a NS record. [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='NS')] [ValidateNotNull()] [ValidateScript({ if (-not $_.IsPresent) { throw 'Passing false into the NS parameter is not supported.' } $true })] [System.Management.Automation.SwitchParameter] $NS, # The name of the new alias. [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='CNAME')] [ValidateNotNullOrEmpty()] [System.String] $AliasName, # The name of the record. [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='TXT')] [ValidateNotNullOrEmpty()] [System.String] $RecordName, # The name for the service being configured. [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')] [ValidateNotNullOrEmpty()] [System.String] $ServiceName, # This parameter has different meanings for different DNS record types, as follows: # # -- A: The host name, or subdomain, to configure. # # -- AAAA: The host name, or subdomain, to configure. # # -- CNAME: The host name that will be given to clients requesting the alias. # # -- MX: The host name or IP address that mail should be routed to. # # -- SRV: The host name to direct requests for the service to. [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='A')] [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='AAAA')] [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='CNAME')] [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='MX')] [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')] [ValidateNotNullOrEmpty()] [System.String] $HostName, # The IPv4 IP address to route requests to. [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='A')] [ValidateNotNullOrEmpty()] [System.String] $IPv4Address, # The IPv6 IP address to route requests to. [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='AAAA')] [ValidateNotNullOrEmpty()] [System.String] $IPv6Address, # The arbitrary text message. [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='TXT')] [ValidateNotNullOrEmpty()] [System.String] $Message, # The name of a name server that is authoritative for the domain. [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='NS')] [ValidateNotNullOrEmpty()] [System.String] $NameServer, # The priority of the target host. Lower values have higher priority. Valid priorities are numbers between 0 and 65535. [Parameter(Position=4, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='MX')] [Parameter(Position=4, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')] [ValidateNotNull()] [ValidateRange(0,65535)] [System.Int32] $Priority, # The port where the service is found on the target host. A valid port is an number between 1 and 65535. [Parameter(Position=5, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')] [ValidateNotNull()] [ValidateRange(1,65535)] [System.Int32] $Port, # The relative weight of targets for the service that have the same priority. A larger value has a higher priority. Valid weights are between 0 and 65535. [Parameter(Position=6, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')] [ValidateNotNull()] [ValidateRange(0,65535)] [System.Int32] $Weight, # The access token for your DigitalOcean environment, in secure string format. [Parameter()] [ValidateNotNull()] [System.Security.SecureString] $AccessToken ) process { try { switch ($PSCmdlet.ParameterSetName) { 'A' { Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{ CommandName = 'New-DoPxObject' CommandType = 'Function' PreProcessScriptBlock = { #region Identify the endpoint that is used when creating a DNS record. $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains' $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records' #endregion #region Identify the properties that will be assigned to the new DNS record. $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{ type = 'A' name = $HostName data = $IPv4Address } $PSCmdlet.MyInvocation.BoundParameters.Remove('A') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('IPv4Address') > $null #endregion } } break } 'AAAA' { Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{ CommandName = 'New-DoPxObject' CommandType = 'Function' PreProcessScriptBlock = { #region Identify the endpoint that is used when creating a DNS record. $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains' $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records' #endregion #region Identify the properties that will be assigned to the new DNS record. $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{ type = 'AAAA' name = $HostName data = $IPv6Address } $PSCmdlet.MyInvocation.BoundParameters.Remove('AAAA') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('IPv6Address') > $null #endregion } } break } 'CNAME' { Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{ CommandName = 'New-DoPxObject' CommandType = 'Function' PreProcessScriptBlock = { #region Identify the endpoint that is used when creating a DNS record. $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains' $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records' #endregion #region Identify the properties that will be assigned to the new DNS record. $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{ type = 'CNAME' name = $AliasName data = $HostName } $PSCmdlet.MyInvocation.BoundParameters.Remove('CNAME') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('AliasName') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null #endregion } } break } 'MX' { Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{ CommandName = 'New-DoPxObject' CommandType = 'Function' PreProcessScriptBlock = { #region Identify the endpoint that is used when creating a DNS record. $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains' $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records' #endregion #region Identify the properties that will be assigned to the new DNS record. $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{ type = 'MX' data = $HostName priority = $Priority } $PSCmdlet.MyInvocation.BoundParameters.Remove('MX') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('Priority') > $null #endregion } } break } 'TXT' { Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{ CommandName = 'New-DoPxObject' CommandType = 'Function' PreProcessScriptBlock = { #region Identify the endpoint that is used when creating a DNS record. $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains' $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records' #endregion #region Identify the properties that will be assigned to the new DNS record. $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{ type = 'TXT' name = $RecordName data = $Message } $PSCmdlet.MyInvocation.BoundParameters.Remove('TXT') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('RecordName') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('Message') > $null #endregion } } break } 'SRV' { Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{ CommandName = 'New-DoPxObject' CommandType = 'Function' PreProcessScriptBlock = { #region Identify the endpoint that is used when creating a DNS record. $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains' $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records' #endregion #region Identify the properties that will be assigned to the new DNS record. $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{ type = 'SRV' name = $ServiceName data = $HostName port = $Port priority = $Priority weight = $Weight } $PSCmdlet.MyInvocation.BoundParameters.Remove('SRV') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('ServiceName') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('Port') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('Priority') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('Weight') > $null #endregion } } break } 'NS' { Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{ CommandName = 'New-DoPxObject' CommandType = 'Function' PreProcessScriptBlock = { #region Identify the endpoint that is used when creating a DNS record. $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains' $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records' #endregion #region Identify the properties that will be assigned to the new DNS record. $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{ type = 'NS' data = $NameServer -replace '([^\.])$','$1.' } $PSCmdlet.MyInvocation.BoundParameters.Remove('NS') > $null $PSCmdlet.MyInvocation.BoundParameters.Remove('NameServer') > $null #endregion } } break } } Invoke-Snippet -Name ProxyFunction.Process.NoPipeline Invoke-Snippet -Name ProxyFunction.End } catch { $PSCmdlet.ThrowTerminatingError($_) } } } Export-ModuleMember -Function Add-DoPxDnsRecord # SIG # Begin signature block # MIIZIAYJKoZIhvcNAQcCoIIZETCCGQ0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUZ+pOZx1YpTrDDatPX+e6cQgM # AYugghRWMIID7jCCA1egAwIBAgIQfpPr+3zGTlnqS5p31Ab8OzANBgkqhkiG9w0B # AQUFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIG # A1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhh # d3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg # Q0EwHhcNMTIxMjIxMDAwMDAwWhcNMjAxMjMwMjM1OTU5WjBeMQswCQYDVQQGEwJV # UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFu # dGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMjCCASIwDQYJKoZIhvcN # AQEBBQADggEPADCCAQoCggEBALGss0lUS5ccEgrYJXmRIlcqb9y4JsRDc2vCvy5Q # WvsUwnaOQwElQ7Sh4kX06Ld7w3TMIte0lAAC903tv7S3RCRrzV9FO9FEzkMScxeC # i2m0K8uZHqxyGyZNcR+xMd37UWECU6aq9UksBXhFpS+JzueZ5/6M4lc/PcaS3Er4 # ezPkeQr78HWIQZz/xQNRmarXbJ+TaYdlKYOFwmAUxMjJOxTawIHwHw103pIiq8r3 # +3R8J+b3Sht/p8OeLa6K6qbmqicWfWH3mHERvOJQoUvlXfrlDqcsn6plINPYlujI # fKVOSET/GeJEB5IL12iEgF1qeGRFzWBGflTBE3zFefHJwXECAwEAAaOB+jCB9zAd # BgNVHQ4EFgQUX5r1blzMzHSa1N197z/b7EyALt0wMgYIKwYBBQUHAQEEJjAkMCIG # CCsGAQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMBIGA1UdEwEB/wQIMAYB # Af8CAQAwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC50aGF3dGUuY29tL1Ro # YXd0ZVRpbWVzdGFtcGluZ0NBLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNV # HQ8BAf8EBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0y # MDQ4LTEwDQYJKoZIhvcNAQEFBQADgYEAAwmbj3nvf1kwqu9otfrjCR27T4IGXTdf # plKfFo3qHJIJRG71betYfDDo+WmNI3MLEm9Hqa45EfgqsZuwGsOO61mWAK3ODE2y # 0DGmCFwqevzieh1XTKhlGOl5QGIllm7HxzdqgyEIjkHq3dlXPx13SYcqFgZepjhq # IhKjURmDfrYwggSjMIIDi6ADAgECAhAOz/Q4yP6/NW4E2GqYGxpQMA0GCSqGSIb3 # DQEBBQUAMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3Jh # dGlvbjEwMC4GA1UEAxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD # QSAtIEcyMB4XDTEyMTAxODAwMDAwMFoXDTIwMTIyOTIzNTk1OVowYjELMAkGA1UE # BhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTQwMgYDVQQDEytT # eW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIFNpZ25lciAtIEc0MIIBIjAN # BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomMLOUS4uyOnREm7Dv+h8GEKU5Ow # mNutLA9KxW7/hjxTVQ8VzgQ/K/2plpbZvmF5C1vJTIZ25eBDSyKV7sIrQ8Gf2Gi0 # jkBP7oU4uRHFI/JkWPAVMm9OV6GuiKQC1yoezUvh3WPVF4kyW7BemVqonShQDhfu # ltthO0VRHc8SVguSR/yrrvZmPUescHLnkudfzRC5xINklBm9JYDh6NIipdC6Anqh # d5NbZcPuF3S8QYYq3AhMjJKMkS2ed0QfaNaodHfbDlsyi1aLM73ZY8hJnTrFxeoz # C9Lxoxv0i77Zs1eLO94Ep3oisiSuLsdwxb5OgyYI+wu9qU+ZCOEQKHKqzQIDAQAB # o4IBVzCCAVMwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAO # BgNVHQ8BAf8EBAMCB4AwcwYIKwYBBQUHAQEEZzBlMCoGCCsGAQUFBzABhh5odHRw # Oi8vdHMtb2NzcC53cy5zeW1hbnRlYy5jb20wNwYIKwYBBQUHMAKGK2h0dHA6Ly90 # cy1haWEud3Muc3ltYW50ZWMuY29tL3Rzcy1jYS1nMi5jZXIwPAYDVR0fBDUwMzAx # oC+gLYYraHR0cDovL3RzLWNybC53cy5zeW1hbnRlYy5jb20vdHNzLWNhLWcyLmNy # bDAoBgNVHREEITAfpB0wGzEZMBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMjAdBgNV # HQ4EFgQURsZpow5KFB7VTNpSYxc/Xja8DeYwHwYDVR0jBBgwFoAUX5r1blzMzHSa # 1N197z/b7EyALt0wDQYJKoZIhvcNAQEFBQADggEBAHg7tJEqAEzwj2IwN3ijhCcH # bxiy3iXcoNSUA6qGTiWfmkADHN3O43nLIWgG2rYytG2/9CwmYzPkSWRtDebDZw73 # BaQ1bHyJFsbpst+y6d0gxnEPzZV03LZc3r03H0N45ni1zSgEIKOq8UvEiCmRDoDR # EfzdXHZuT14ORUZBbg2w6jiasTraCXEQ/Bx5tIB7rGn0/Zy2DBYr8X9bCT2bW+IW # yhOBbQAuOA2oKY8s4bL0WqkBrxWcLC9JG9siu8P+eJRRw4axgohd8D20UaF5Mysu # e7ncIAkTcetqGVvP6KUwVyyJST+5z3/Jvz4iaGNTmr1pdKzFHTx/kuDDvBzYBHUw # ggUSMIID+qADAgECAhAN//fSWE4vjemplVn1wnAjMA0GCSqGSIb3DQEBBQUAMG8x # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQgSUQgQ29k # ZSBTaWduaW5nIENBLTEwHhcNMTQxMDAzMDAwMDAwWhcNMTUxMDA3MTIwMDAwWjBo # MQswCQYDVQQGEwJDQTEQMA4GA1UECBMHT250YXJpbzEPMA0GA1UEBxMGT3R0YXdh # MRowGAYDVQQKExFLaXJrIEFuZHJldyBNdW5ybzEaMBgGA1UEAxMRS2lyayBBbmRy # ZXcgTXVucm8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIANwog4/2 # JUJCJ1PKeXu8S+eBp1F8fHaVFVgMToGhyNz+UptqDVBIsOu21AXNd4s/3WqhOnOt # yBvyn5thWNGCMB/XcX6/SdV8lSyg0swreiiR7ksJc1jK75aDJV2UE/mOiMtcWo01 # SQGddbF4FpK3LxbzjKGMPP7uI1TUFTxmdR8t8HaRlI7KcsZkckGffkboAm5CWDhZ # d4f9YhVzZ8uV0jAN9i+mtmIOHTMMskQ7tZy17GkgyjiGrnMxy6VZ18hya062ZLcV # 20LUqsUkjr0oNvf54KrhZrPQhULagcpKwmxw3hzDfvWov4yVLWdgWT6a+TUG8D39 # HUuVCpXG+OgZAgMBAAGjggGvMIIBqzAfBgNVHSMEGDAWgBR7aM4pqsAXvkl64eU/ # 1qf3RY81MjAdBgNVHQ4EFgQUG+clmaBur2rhO4i38pTJHCFSya0wDgYDVR0PAQH/ # BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMG0GA1UdHwRmMGQwMKAuoCyGKmh0 # dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9hc3N1cmVkLWNzLWcxLmNybDAwoC6gLIYq # aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL2Fzc3VyZWQtY3MtZzEuY3JsMEIGA1Ud # IAQ7MDkwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRp # Z2ljZXJ0LmNvbS9DUFMwgYIGCCsGAQUFBwEBBHYwdDAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuZGlnaWNlcnQuY29tMEwGCCsGAQUFBzAChkBodHRwOi8vY2FjZXJ0 # cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURDb2RlU2lnbmluZ0NBLTEu # Y3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEFBQADggEBACJI6tx95+XcEC6X # EAxbRZjIXJ085IDdqWXImnfQ8To+yAeHM5kP506ddtzlztW9esOxqnhnfIAClB1e # 1f/FAlgpxrEQ2IRCuUHuMfy4AxqRkD9jePVZ7NYKcKxJZ87iu32iuGT+phFip+ZP # O9GkqDYkvzQmB74b7hQ3knn6qFLqUZ8njpSceIeC8PHINZmSx+v+KVkEavN/z0hF # T9xYR2VPPjIIk3MnwtkyHhTWWxNoKGCg+BZV2mApwR9EsWJHVpiGru6DNfNwSQpB # oIvMGOOL919XgE4J1B022xnAcnCCxoGjjSmBPb1TWemijGsGD2Je8/EALw9geBB9 # vbJvwn8wggajMIIFi6ADAgECAhAPqEkGFdcAoL4hdv3F7G29MA0GCSqGSIb3DQEB # BQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNV # BAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQg # SUQgUm9vdCBDQTAeFw0xMTAyMTExMjAwMDBaFw0yNjAyMTAxMjAwMDBaMG8xCzAJ # BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k # aWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQgSUQgQ29kZSBT # aWduaW5nIENBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCcfPmg # jwrKiUtTmjzsGSJ/DMv3SETQPyJumk/6zt/G0ySR/6hSk+dy+PFGhpTFqxf0eH/L # er6QJhx8Uy/lg+e7agUozKAXEUsYIPO3vfLcy7iGQEUfT/k5mNM7629ppFwBLrFm # 6aa43Abero1i/kQngqkDw/7mJguTSXHlOG1O/oBcZ3e11W9mZJRru4hJaNjR9H4h # webFHsnglrgJlflLnq7MMb1qWkKnxAVHfWAr2aFdvftWk+8b/HL53z4y/d0qLDJG # 2l5jvNC4y0wQNfxQX6xDRHz+hERQtIwqPXQM9HqLckvgVrUTtmPpP05JI+cGFvAl # qwH4KEHmx9RkO12rAgMBAAGjggNDMIIDPzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0l # BAwwCgYIKwYBBQUHAwMwggHDBgNVHSAEggG6MIIBtjCCAbIGCGCGSAGG/WwDMIIB # pDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20vc3NsLWNwcy1y # ZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBuAHkAIAB1AHMA # ZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0AGUAIABjAG8A # bgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBlACAAbwBmACAA # dABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAgAGEAbgBkACAA # dABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBnAHIAZQBlAG0A # ZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBiAGkAbABpAHQA # eQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGgA # ZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjASBgNVHRMBAf8E # CDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29j # c3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8EejB4 # MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVk # SURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGln # aUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQWBBR7aM4pqsAXvkl64eU/ # 1qf3RY81MjAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG # 9w0BAQUFAAOCAQEAe3IdZP+IyDrBt+nnqcSHu9uUkteQWTP6K4feqFuAJT8Tj5uD # G3xDxOaM3zk+wxXssNo7ISV7JMFyXbhHkYETRvqcP2pRON60Jcvwq9/FKAFUeRBG # JNE4DyahYZBNur0o5j/xxKqb9to1U0/J8j3TbNwj7aqgTWcJ8zqAPTz7NkyQ53ak # 3fI6v1Y1L6JMZejg1NrRx8iRai0jTzc7GZQY1NWcEDzVsRwZ/4/Ia5ue+K6cmZZ4 # 0c2cURVbQiZyWo0KSiOSQOiG3iLCkzrUm2im3yl/Brk8Dr2fxIacgkdCcTKGCZly # CXlLnXFp9UH/fzl3ZPGEjb6LHrJ9aKOlkLEM/zGCBDQwggQwAgEBMIGDMG8xCzAJ # BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k # aWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQgSUQgQ29kZSBT # aWduaW5nIENBLTECEA3/99JYTi+N6amVWfXCcCMwCQYFKw4DAhoFAKB4MBgGCisG # AQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFORh # ye1YjEC6+fdachXyyXW48GSPMA0GCSqGSIb3DQEBAQUABIIBAJNs38VW/KWaZl2h # SBcwL/Xl/AGmyuWwqFd5AwWaO7+PXBbT4KmLFHh8JDLuWKdVzwLuMe7DXqhji/dH # yNd7j02VhiC1/EQ4pGfvSqgIwA0T4zyQOjcusHkiTQv08reYyRcSjc3w2gsipFS3 # C/MWfSQ6M5MWxodieB+b96JgQ8o9jYF0sZ5YJKZ2yRB9/Q4Lyq5wtFb27xijkAGb # 63CB4qb1TUtzpXYZKXR4zskCCy7JHGhxBUWTnddQMi6ablpCeVxyqug1HgZTAm1K # ylt1AiiT1JQqb5HGdo6Ki2L1aPpyoQsIZCCDJRTAaN1K0EPiNCa1RHalcdw5jc+l # w8dxxuOhggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQswCQYDVQQG # EwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5 # bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0OMj+vzVu # BNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc # BgkqhkiG9w0BCQUxDxcNMTQxMDA2MDI1MzA0WjAjBgkqhkiG9w0BCQQxFgQUgyOf # THeSph7tUTQxYSEDg3n2lfgwDQYJKoZIhvcNAQEBBQAEggEANBheINXsmPT/iT0q # 5to7J68kuXkmiOQC1UzAgRUgYF4KPewJKQfgEueRHHh9X3PyxB6a+eZ8QTbyqn3l # ClN7x+c9Rxe9nOXh/wBEAaSmCjUn0sMUFT1fCnjRiVk7nQS/y0N8HCSySbEVDtBq # onVrKlc+1UVM8hRcsyAcmhdf/ACpY2oie2YSLkoXj0WaQAt/W7BBtqMIbE2nieBW # RHUN/hvxGrZ9d3JYddTNaJPUV7RNkYdPSAlXVEU9kl/3LQvx8iQffP+n5C/rfhJs # idtPezwxbp3MgelI5cdkS0Mt7fFaUossIN5CSWZNZ5QFhysIMv9f1HgdOOHwMudn # BzwqKQ== # SIG # End signature block |