custom/New-AzFunctionApp.ps1
function New-AzFunctionApp { [OutputType([Microsoft.Azure.PowerShell.Cmdlets.Functions.Models.Api20190801.ISite])] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Description('Creates a function app.')] [CmdletBinding(SupportsShouldProcess=$true, DefaultParametersetname="Consumption")] param( [Parameter(ParameterSetName="Consumption", HelpMessage='The Azure subscription ID.')] [Parameter(ParameterSetName="ByAppServicePlan")] [Parameter(ParameterSetName="CustomDockerImage")] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Runtime.DefaultInfo(Script='(Get-AzContext).Subscription.Id')] [ValidateNotNullOrEmpty()] [System.String] ${SubscriptionId}, [Parameter(Mandatory=$true, ParameterSetName="Consumption", HelpMessage='The name of the resource group.')] [Parameter(Mandatory=$true, ParameterSetName="ByAppServicePlan")] [Parameter(Mandatory=$true, ParameterSetName="CustomDockerImage")] [ValidateNotNullOrEmpty()] [System.String] ${ResourceGroupName}, [Parameter(Mandatory=$true, ParameterSetName="Consumption", HelpMessage='The name of the function app.')] [Parameter(Mandatory=$true, ParameterSetName="ByAppServicePlan")] [Parameter(Mandatory=$true, ParameterSetName="CustomDockerImage")] [ValidateNotNullOrEmpty()] [System.String] ${Name}, [Parameter(Mandatory=$true, ParameterSetName="Consumption", HelpMessage='The name of the storage account.')] [Parameter(Mandatory=$true, ParameterSetName="ByAppServicePlan")] [Parameter(Mandatory=$true, ParameterSetName="CustomDockerImage")] [ValidateNotNullOrEmpty()] [System.String] ${StorageAccountName}, [Parameter(ParameterSetName="Consumption", HelpMessage='Name of the existing App Insights project to be added to the function app.')] [Parameter(ParameterSetName="ByAppServicePlan")] [Parameter(ParameterSetName="CustomDockerImage")] [ValidateNotNullOrEmpty()] [System.String] [Alias("AppInsightsName")] ${ApplicationInsightsName}, [Parameter(ParameterSetName="Consumption", HelpMessage='Instrumentation key of App Insights to be added.')] [Parameter(ParameterSetName="ByAppServicePlan")] [Parameter(ParameterSetName="CustomDockerImage")] [ValidateNotNullOrEmpty()] [System.String] [System.String] [Alias("AppInsightsKey")] ${ApplicationInsightsKey}, [Parameter(Mandatory=$true, ParameterSetName="Consumption", HelpMessage='The location for the consumption plan.')] [ValidateNotNullOrEmpty()] [System.String] ${Location}, [Parameter(Mandatory=$true, ParameterSetName="ByAppServicePlan", HelpMessage='The name of the service plan.')] [Parameter(Mandatory=$true, ParameterSetName="CustomDockerImage")] [ValidateNotNullOrEmpty()] [System.String] ${PlanName}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='The OS to host the function app.')] [Parameter(ParameterSetName="Consumption")] [ArgumentCompleter([Microsoft.Azure.PowerShell.Cmdlets.Functions.Support.WorkerType])] [ValidateSet("Linux", "Windows")] [ValidateNotNullOrEmpty()] [System.String] # OS type (Linux or Windows) ${OSType}, [Parameter(Mandatory=$true, ParameterSetName="ByAppServicePlan", HelpMessage='The function runtime.')] [Parameter(Mandatory=$true, ParameterSetName="Consumption")] [ArgumentCompleter([Microsoft.Azure.PowerShell.Cmdlets.Functions.Support.RuntimeType])] [ValidateNotNullOrEmpty()] [System.String] # Runtime type (DotNet, Node, Java, PowerShell or Python) ${Runtime}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='The function runtime.')] [Parameter(ParameterSetName="Consumption")] [ValidateNotNullOrEmpty()] [System.String] ${RuntimeVersion}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='The Functions version.')] [Parameter(ParameterSetName="Consumption")] [ArgumentCompleter([Microsoft.Azure.PowerShell.Cmdlets.Functions.Support.FunctionsVersionType])] [ValidateNotNullOrEmpty()] [System.String] # FunctionsVersion type (3 or 4). Default Functions version is defined in HelperFunctions.ps1 ${FunctionsVersion}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='Disable creating application insights resource during the function app creation. No logs will be available.')] [Parameter(ParameterSetName="Consumption")] [Parameter(ParameterSetName="CustomDockerImage")] [System.Management.Automation.SwitchParameter] [Alias("DisableAppInsights")] ${DisableApplicationInsights}, [Parameter(Mandatory=$true, ParameterSetName="CustomDockerImage", HelpMessage='Linux only. Container image name from Docker Registry, e.g. publisher/image-name:tag.')] [ValidateNotNullOrEmpty()] [System.String] ${DockerImageName}, [Parameter(ParameterSetName="CustomDockerImage", HelpMessage='The container registry user name and password. Required for private registries.')] [ValidateNotNullOrEmpty()] [PSCredential] ${DockerRegistryCredential}, [Parameter(HelpMessage='Returns true when the command succeeds.')] [System.Management.Automation.SwitchParameter] ${PassThru}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='Starts the operation and returns immediately, before the operation is completed. In order to determine if the operation has successfully been completed, use some other mechanism.')] [Parameter(ParameterSetName="Consumption")] [Parameter(ParameterSetName="CustomDockerImage")] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [System.Management.Automation.SwitchParameter] ${NoWait}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='Runs the cmdlet as a background job.')] [Parameter(ParameterSetName="Consumption")] [Parameter(ParameterSetName="CustomDockerImage")] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [System.Management.Automation.SwitchParameter] ${AsJob}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='Resource tags.')] [Parameter(ParameterSetName="Consumption")] [Parameter(ParameterSetName="CustomDockerImage")] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Body')] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Runtime.Info(PossibleTypes=([Microsoft.Azure.PowerShell.Cmdlets.Functions.Models.Api20190801.IResourceTags]))] [System.Collections.Hashtable] [ValidateNotNull()] ${Tag}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage='Function app settings.')] [Parameter(ParameterSetName="Consumption")] [Parameter(ParameterSetName="CustomDockerImage")] [ValidateNotNullOrEmpty()] [Hashtable] ${AppSetting}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage="Specifies the type of identity used for the function app. The acceptable values for this parameter are: - SystemAssigned - UserAssigned ")] [Parameter(ParameterSetName="Consumption")] [Parameter(ParameterSetName="CustomDockerImage")] [ArgumentCompleter([Microsoft.Azure.PowerShell.Cmdlets.Functions.Support.FunctionAppManagedServiceIdentityCreateType])] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Body')] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Support.ManagedServiceIdentityType] ${IdentityType}, [Parameter(ParameterSetName="ByAppServicePlan", HelpMessage="Specifies the list of user identities associated with the function app. The user identity references will be ARM resource ids in the form: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/identities/{identityName}'")] [Parameter(ParameterSetName="Consumption")] [Parameter(ParameterSetName="CustomDockerImage")] [ValidateNotNull()] [System.String[]] ${IdentityID}, [Alias('AzureRMContext', 'AzureCredential')] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Azure')] [System.Management.Automation.PSObject] ${DefaultProfile}, [Parameter(DontShow)] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [System.Management.Automation.SwitchParameter] # Wait for .NET debugger to attach ${Break}, [Parameter(DontShow)] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Runtime.SendAsyncStep[]] # SendAsync Pipeline Steps to be appended to the front of the pipeline ${HttpPipelineAppend}, [Parameter(DontShow)] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Runtime.SendAsyncStep[]] # SendAsync Pipeline Steps to be prepended to the front of the pipeline ${HttpPipelinePrepend}, [Parameter(DontShow)] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [System.Uri] # The URI for the proxy server to use ${Proxy}, [Parameter(DontShow)] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [System.Management.Automation.PSCredential] # Credentials for a proxy server to use for the remote call ${ProxyCredential}, [Parameter(DontShow)] [Microsoft.Azure.PowerShell.Cmdlets.Functions.Category('Runtime')] [System.Management.Automation.SwitchParameter] # Use the default credentials for the proxy ${ProxyUseDefaultCredentials} ) process { # Remove bound parameters from the dictionary that cannot be process by the intenal cmdlets. $paramsToRemove = @( "StorageAccountName", "ApplicationInsightsName", "ApplicationInsightsKey", "Location", "PlanName", "OSType", "Runtime", "DisableApplicationInsights", "DockerImageName", "DockerRegistryCredential", "FunctionsVersion", "RuntimeVersion", "AppSetting", "IdentityType", "IdentityID", "Tag" ) foreach ($paramName in $paramsToRemove) { if ($PSBoundParameters.ContainsKey($paramName)) { $PSBoundParameters.Remove($paramName) | Out-Null } } $functionAppIsCustomDockerImage = $PsCmdlet.ParameterSetName -eq "CustomDockerImage" $appSettings = New-Object -TypeName System.Collections.Generic.List[System.Object] $siteCofig = New-Object -TypeName Microsoft.Azure.PowerShell.Cmdlets.Functions.Models.Api20190801.SiteConfig $functionAppDef = New-Object -TypeName Microsoft.Azure.PowerShell.Cmdlets.Functions.Models.Api20190801.Site $params = GetParameterKeyValues -PSBoundParametersDictionary $PSBoundParameters ` -ParameterList @("SubscriptionId", "HttpPipelineAppend", "HttpPipelinePrepend") $runtimeJsonDefintion = $null ValidateFunctionName -Name $Name @params if (-not $functionAppIsCustomDockerImage) { if (-not $FunctionsVersion) { if ($Runtime -eq "DotNet") { $errorId = "MissingFunctionsVersionValue" $message += "For 'DotNet' function apps, the runtime version is specified by the FunctionsVersion parameter. Please specify this value and try again." $exception = [System.InvalidOperationException]::New($message) ThrowTerminatingError -ErrorId $errorId ` -ErrorMessage $message ` -ErrorCategory ([System.Management.Automation.ErrorCategory]::InvalidOperation) ` -Exception $exception } $FunctionsVersion = $DefaultFunctionsVersion Write-Warning "FunctionsVersion not specified. Setting default value to '$FunctionsVersion'. $SetDefaultValueParameterWarningMessage" } ValidateFunctionsVersion -FunctionsVersion $FunctionsVersion if ($FunctionsVersion -eq "3") { # In Functions V3, RuntimeVersion matches FunctionsVersion. However, this is no longer the case for Functions V4 or higher if (($Runtime -eq "DotNet") -and ($RuntimeVersion -ne $FunctionsVersion)) { Write-Verbose "'DotNet' runtime version is specified by FunctionsVersion. The value of the -RuntimeVersion will be set to '$FunctionsVersion'." -Verbose $RuntimeVersion = $FunctionsVersion } } if (-not $OSType) { $OSType = GetDefaultOSType -Runtime $Runtime Write-Warning "OSType not specified. Setting default value to '$OSType'. $SetDefaultValueParameterWarningMessage" } $runtimeJsonDefintion = GetRuntimeJsonDefinition -FunctionsVersion $FunctionsVersion -Runtime $Runtime -RuntimeVersion $RuntimeVersion -OSType $OSType if (-not $runtimeJsonDefintion) { $errorId = "FailedToGetRuntimeDefinition" $message += "Failed to get runtime definition for '$Runtime' version '$RuntimeVersion' in Functions version '$FunctionsVersion' on '$OSType'." $exception = [System.InvalidOperationException]::New($message) ThrowTerminatingError -ErrorId $errorId ` -ErrorMessage $message ` -ErrorCategory ([System.Management.Automation.ErrorCategory]::InvalidOperation) ` -Exception $exception } # Add app settings if ($runtimeJsonDefintion.AppSettingsDictionary.Count -gt 0) { foreach ($keyName in $runtimeJsonDefintion.AppSettingsDictionary.Keys) { $value = $runtimeJsonDefintion.AppSettingsDictionary[$keyName] $appSettings.Add((NewAppSetting -Name $keyName -Value $value)) } } # Add site config properties if ($runtimeJsonDefintion.SiteConfigPropertiesDictionary.Count -gt 0) { foreach ($PropertyName in $runtimeJsonDefintion.SiteConfigPropertiesDictionary.Keys) { $value = $runtimeJsonDefintion.SiteConfigPropertiesDictionary[$PropertyName] if (($OSType -eq "Windows") -and ($FunctionsVersion -eq "3") -and ($PropertyName -eq "netFrameworkVersion")) { # For Functions V3 apps, do not set netFrameworkVersion. continue } $siteCofig.$PropertyName = $value } } } $servicePlan = $null $consumptionPlan = $PsCmdlet.ParameterSetName -eq "Consumption" $OSIsLinux = $OSType -eq "Linux" if ($consumptionPlan) { ValidateConsumptionPlanLocation -Location $Location -OSIsLinux:$OSIsLinux @params $functionAppDef.Location = $Location } else { # Host function app in Elastic Premium or app service plan $servicePlan = GetServicePlan $PlanName @params if ($null -ne $servicePlan.Location) { $Location = $servicePlan.Location } if ($null -ne $servicePlan.Reserved) { $OSIsLinux = $servicePlan.Reserved } $functionAppDef.ServerFarmId = $servicePlan.Id $functionAppDef.Location = $Location } ValidateFunctionsV2NotAvailableLocation -Location $functionAppDef.Location if ($OSIsLinux) { # These are the scenarios we currently support when creating a Docker container: # 1) In Consumption, we only support images created by Functions with a predefine runtime name and version, e.g., Python 3.7 # 2) For App Service and Premium plans, a customer can specify a customer container image # Linux function app $functionAppDef.Kind = 'functionapp,linux' $functionAppDef.Reserved = $true # Bring your own container is only supported on App Service and Premium plans if ($DockerImageName) { $functionAppDef.Kind = 'functionapp,linux,container' $imageName = $DockerImageName.Trim().ToLower() $appSettings.Add((NewAppSetting -Name 'DOCKER_CUSTOM_IMAGE_NAME' -Value $imageName)) $appSettings.Add((NewAppSetting -Name 'FUNCTION_APP_EDIT_MODE' -Value 'readOnly')) $appSettings.Add((NewAppSetting -Name 'WEBSITES_ENABLE_APP_SERVICE_STORAGE' -Value 'false')) $siteCofig.LinuxFxVersion = "DOCKER|$imageName" # Parse the docker registry url, user name and password $dockerRegistryServerUrl = ParseDockerImage -DockerImageName $DockerImageName if ($dockerRegistryServerUrl) { $appSettings.Add((NewAppSetting -Name 'DOCKER_REGISTRY_SERVER_URL' -Value $dockerRegistryServerUrl)) if ($DockerRegistryCredential) { $appSettings.Add((NewAppSetting -Name 'DOCKER_REGISTRY_SERVER_USERNAME' -Value $DockerRegistryCredential.GetNetworkCredential().UserName)) $appSettings.Add((NewAppSetting -Name 'DOCKER_REGISTRY_SERVER_PASSWORD' -Value $DockerRegistryCredential.GetNetworkCredential().Password)) } } } else { $appSettings.Add((NewAppSetting -Name 'WEBSITES_ENABLE_APP_SERVICE_STORAGE' -Value 'true')) } } else { # Windows function app $functionAppDef.Kind = 'functionapp' } # Validate storage account and get connection string $connectionString = GetConnectionString -StorageAccountName $StorageAccountName @params $appSettings.Add((NewAppSetting -Name 'AzureWebJobsStorage' -Value $connectionString)) $appSettings.Add((NewAppSetting -Name 'AzureWebJobsDashboard' -Value $connectionString)) if (-not $functionAppIsCustomDockerImage) { $appSettings.Add((NewAppSetting -Name 'FUNCTIONS_EXTENSION_VERSION' -Value "~$FunctionsVersion")) } # If plan is not consumption or elastic premium, set always on $planIsElasticPremium = $servicePlan.SkuTier -eq 'ElasticPremium' if ((-not $consumptionPlan) -and (-not $planIsElasticPremium)) { $siteCofig.AlwaysOn = $true } # If plan is Elastic Premium or Consumption (Windows or Linux), we need these app settings if ($planIsElasticPremium -or $consumptionPlan) { $appSettings.Add((NewAppSetting -Name 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING' -Value $connectionString)) $shareName = GetShareName -FunctionAppName $Name $appSettings.Add((NewAppSetting -Name 'WEBSITE_CONTENTSHARE' -Value $shareName)) } if (-not $DisableApplicationInsights) { if ($ApplicationInsightsKey) { $appSettings.Add((NewAppSetting -Name 'APPINSIGHTS_INSTRUMENTATIONKEY' -Value $ApplicationInsightsKey)) } elseif ($ApplicationInsightsName) { $appInsightsProject = GetApplicationInsightsProject -Name $ApplicationInsightsName @params if (-not $appInsightsProject) { $errorMessage = "Failed to get application insights key for project name '$ApplicationInsightsName'. Please make sure the project exist." $exception = [System.InvalidOperationException]::New($errorMessage) ThrowTerminatingError -ErrorId "ApplicationInsightsProjectNotFound" ` -ErrorMessage $errorMessage ` -ErrorCategory ([System.Management.Automation.ErrorCategory]::InvalidOperation) ` -Exception $exception } $appSettings.Add((NewAppSetting -Name 'APPINSIGHTS_INSTRUMENTATIONKEY' -Value $appInsightsProject.InstrumentationKey)) } else { $newAppInsightsProject = CreateApplicationInsightsProject -ResourceGroupName $resourceGroupName ` -ResourceName $Name ` -Location $functionAppDef.Location ` @params if ($newAppInsightsProject) { $appSettings.Add((NewAppSetting -Name 'APPINSIGHTS_INSTRUMENTATIONKEY' -Value $newAppInsightsProject.InstrumentationKey)) } else { $warningMessage = "Unable to create the Application Insights for the function app. Creation of Application Insights will help you monitor and diagnose your function apps in the Azure Portal. `r`n" $warningMessage += "Use the 'New-AzApplicationInsights' cmdlet or the Azure Portal to create a new Application Insights project. After that, use the 'Update-AzFunctionApp' cmdlet to update Application Insights for your function app." Write-Warning $warningMessage } } } if ($Tag.Count -gt 0) { $resourceTag = NewResourceTag -Tag $Tag $functionAppDef.Tag = $resourceTag } # Add user app settings if ($appSetting.Count -gt 0) { foreach ($keyName in $appSetting.Keys) { $appSettings.Add((NewAppSetting -Name $keyName -Value $appSetting[$keyName])) } } # Set function app managed identity if ($IdentityType) { $functionAppDef.IdentityType = $IdentityType if ($IdentityType -eq "UserAssigned") { # Set UserAssigned managed identiy if (-not $IdentityID) { $errorMessage = "IdentityID is required for UserAssigned identity" $exception = [System.InvalidOperationException]::New($errorMessage) ThrowTerminatingError -ErrorId "IdentityIDIsRequiredForUserAssignedIdentity" ` -ErrorMessage $errorMessage ` -ErrorCategory ([System.Management.Automation.ErrorCategory]::InvalidOperation) ` -Exception $exception } $identityUserAssignedIdentity = NewIdentityUserAssignedIdentity -IdentityID $IdentityID $functionAppDef.IdentityUserAssignedIdentity = $identityUserAssignedIdentity } } # Set app settings and site configuration $siteCofig.AppSetting = $appSettings $functionAppDef.Config = $siteCofig $PSBoundParameters.Add("SiteEnvelope", $functionAppDef) | Out-Null if ($PsCmdlet.ShouldProcess($Name, "Creating function app")) { # Save the ErrorActionPreference $currentErrorActionPreference = $ErrorActionPreference $ErrorActionPreference = 'Stop' $exceptionThrown = $false try { Az.Functions.internal\New-AzFunctionApp @PSBoundParameters } catch { $exceptionThrown = $true $errorMessage = GetErrorMessage -Response $_ if ($errorMessage) { $exception = [System.InvalidOperationException]::New($errorMessage) ThrowTerminatingError -ErrorId "FailedToCreateFunctionApp" ` -ErrorMessage $errorMessage ` -ErrorCategory ([System.Management.Automation.ErrorCategory]::InvalidOperation) ` -Exception $exception } throw $_ } finally { # Reset the ErrorActionPreference $ErrorActionPreference = $currentErrorActionPreference } if (-not $exceptionThrown) { if ($consumptionPlan -and $OSIsLinux) { $message = "Your Linux function app '$Name', that uses a consumption plan has been successfully created but is not active until content is published using Azure Portal or the Functions Core Tools." Write-Verbose $message -Verbose } } } } } # SIG # Begin signature block # MIInuwYJKoZIhvcNAQcCoIInrDCCJ6gCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB7+lGFrQvD/O21 # APAIvVUdtRQrYFT3UB2d8cgl9b0j5qCCDYUwggYDMIID66ADAgECAhMzAAACzfNk # v/jUTF1RAAAAAALNMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjIwNTEyMjA0NjAyWhcNMjMwNTExMjA0NjAyWjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDrIzsY62MmKrzergm7Ucnu+DuSHdgzRZVCIGi9CalFrhwtiK+3FIDzlOYbs/zz # HwuLC3hir55wVgHoaC4liQwQ60wVyR17EZPa4BQ28C5ARlxqftdp3H8RrXWbVyvQ # aUnBQVZM73XDyGV1oUPZGHGWtgdqtBUd60VjnFPICSf8pnFiit6hvSxH5IVWI0iO # nfqdXYoPWUtVUMmVqW1yBX0NtbQlSHIU6hlPvo9/uqKvkjFUFA2LbC9AWQbJmH+1 # uM0l4nDSKfCqccvdI5l3zjEk9yUSUmh1IQhDFn+5SL2JmnCF0jZEZ4f5HE7ykDP+ # oiA3Q+fhKCseg+0aEHi+DRPZAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU0WymH4CP7s1+yQktEwbcLQuR9Zww # VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzQ3MDUzMDAfBgNVHSMEGDAW # gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw # MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx # XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB # AE7LSuuNObCBWYuttxJAgilXJ92GpyV/fTiyXHZ/9LbzXs/MfKnPwRydlmA2ak0r # GWLDFh89zAWHFI8t9JLwpd/VRoVE3+WyzTIskdbBnHbf1yjo/+0tpHlnroFJdcDS # MIsH+T7z3ClY+6WnjSTetpg1Y/pLOLXZpZjYeXQiFwo9G5lzUcSd8YVQNPQAGICl # 2JRSaCNlzAdIFCF5PNKoXbJtEqDcPZ8oDrM9KdO7TqUE5VqeBe6DggY1sZYnQD+/ # LWlz5D0wCriNgGQ/TWWexMwwnEqlIwfkIcNFxo0QND/6Ya9DTAUykk2SKGSPt0kL # tHxNEn2GJvcNtfohVY/b0tuyF05eXE3cdtYZbeGoU1xQixPZAlTdtLmeFNly82uB # VbybAZ4Ut18F//UrugVQ9UUdK1uYmc+2SdRQQCccKwXGOuYgZ1ULW2u5PyfWxzo4 # BR++53OB/tZXQpz4OkgBZeqs9YaYLFfKRlQHVtmQghFHzB5v/WFonxDVlvPxy2go # a0u9Z+ZlIpvooZRvm6OtXxdAjMBcWBAsnBRr/Oj5s356EDdf2l/sLwLFYE61t+ME # iNYdy0pXL6gN3DxTVf2qjJxXFkFfjjTisndudHsguEMk8mEtnvwo9fOSKT6oRHhM # 9sZ4HTg/TTMjUljmN3mBYWAWI5ExdC1inuog0xrKmOWVMIIHejCCBWKgAwIBAgIK # YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw # OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD # VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la # UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc # 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D # dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+ # lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk # kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6 # A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd # X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL # 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd # sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3 # T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS # 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI # bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL # BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD # uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF # BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h # cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA # YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn # 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7 # v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b # pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/ # KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy # CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp # mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi # hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb # BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS # oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL # gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX # cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGYwwghmIAgEBMIGVMH4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p # Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAALN82S/+NRMXVEAAAAA # As0wDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINvh # 6IxnA1v7j1FDYWkktchxYvlfbi1/tBSwmu/brv/hMEIGCisGAQQBgjcCAQwxNDAy # oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20wDQYJKoZIhvcNAQEBBQAEggEA4SGjPA7Qkn1nexzXoberFLZ5HSf7Cp8YPj38 # WTo3RT6DVlDBAOKKsgt3QHZ/XzRRhIYhHbC938+Uw/0TU0rB1YDhlvnLTi5hmWJ5 # nYLAfdPMe2JD033OWm/F4v10h154bvhhr5gY2huAXfMCowfOTtONZyk22Rn+QN6X # YGPjBn78/AV8sBKCza3GrLX1U+b5aUXLj+b2pSHcM/HwnzZbrm6vjUbuui3BKaRS # Ed1WKbX6OGhk8WGwtlWAuqfgwHre1dy6MHLV48M2SMUD6SWQJ1b/NMLpfdfeBOcs # i4bkkge/rd2OdZZocQtpEQpyM6Jf7K8OA0mrBbduiLLV+FDF66GCFxYwghcSBgor # BgEEAYI3AwMBMYIXAjCCFv4GCSqGSIb3DQEHAqCCFu8wghbrAgEDMQ8wDQYJYIZI # AWUDBAIBBQAwggFZBgsqhkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYBBAGE # WQoDATAxMA0GCWCGSAFlAwQCAQUABCC/QY/M/FqF4j+2RyaZXzRqb1raBtIxKaZR # D9NkfuHRqwIGYv6xn3IvGBMyMDIyMDkwMjA0MTQ1NS42MTlaMASAAgH0oIHYpIHV # MIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQL # EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsT # HVRoYWxlcyBUU1MgRVNOOjE3OUUtNEJCMC04MjQ2MSUwIwYDVQQDExxNaWNyb3Nv # ZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIRZTCCBxQwggT8oAMCAQICEzMAAAGKPjiN # 0g4C+ugAAQAAAYowDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTAwHhcNMjExMDI4MTkyNzQyWhcNMjMwMTI2MTkyNzQyWjCB0jELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9z # b2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMg # VFNTIEVTTjoxNzlFLTRCQjAtODI0NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt # U3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALf/ # rrehgwMgGb3oAYWoFndBqKk/JRRzHqaFjTizzxBKC7smuF95/iteBb5WcBZisKmq # egfuhJCE0o5HnE0gekEQOJIr3ScnZS7yq4PLnbQbuuyyso0KsEcw0E0YRAsaVN9L # XQRPwHsj/eZO6p3YSLvzqU+EBshiVIjA5ZmQIgz2ORSZIrVIBr8DAR8KICc/BVRA # RZ1YgFEUyeJAQ4lOqaW7+DyPe/r0IabKQyvvN4GsmokQt4DUxst4jonuj7JdN3L2 # CIhXACUT+DtEZHhZb/0kKKJs9ybbDHfaKEv1ztL0jfYdg1SjjTI2hToJzeUZOYgq # sJp+qrJnvoWqEf06wgUtM1417Fk4JJY1Abbde1AW1vES/vSzcN3IzyfBGEYJTDVw # mCzOhswg1xLxPU//7AL/pNXPOLZqImQ2QagYK/0ry/oFbDs9xKA2UNuqk2tWxJ/5 # 6cTJl3LaGUnvEkQ6oCtCVFoYyl4J8mjgAxAfhbXyIvo3XFCW6T7QC+JFr1UkSoqV # b/DBLmES3sVxAxAYvleLXygKWYROIGtKfkAomsBywWTaI91EDczOUFZhmotzJ0BW # 2ZIam1A8qaPb2lhHlXjt+SX3S1o8EYLzF91SmS+e3e45kY4lZZbl42RS8fq4SS+y # WFabTj7RdTALTGJaejroJzqRvuFuDBh6o+2GHz9FAgMBAAGjggE2MIIBMjAdBgNV # HQ4EFgQUI9pD2P1sGdSXrqdJR4Q+MZBpJAMwHwYDVR0jBBgwFoAUn6cVXQBeYl2D # 9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUy # MDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1l # LVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUE # DDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAgEAxfTBErD1w3kbXxaNX+e+ # Yj3xfQEVm3rrjXzOfNyH08X82X9nb/5ntwzYvynDTRJ0dUym2bRuy7INHMv6SiBE # DiRtn2GlsCCCmMLsgySNkOJFYuZs21f9Aufr0ELEHAr37DPCuV9n34nyYu7anhtK # +fAo4MHu8QWL4Lj5o1DccE1rxI2SD36Y1VKGjwpeqqrNHhVG+23C4c0xBGAZwI/D # BDYYj+SCXeD6eZRah07aXnOu2BZhrjv7iAP04zwX3LTOZFCPrs38of8iHbQzbZCM # /nv8Zl0hYYkBEdLgY0aG0GVenPtEzbb0TS2slOLuxHpHezmg180EdEblhmkosLTe # l3Pz6DT9K3sxujr3MqMNajKFJFBEO6qg9EKvEBcCtAygnWUibcgSjAaY1GApzVGW # 2L001puA1yuUWIH9t21QSVuF6OcOPdBx6OE41jas9ez6j8jAk5zPB3AKk5z3jBNH # T2L23cMwzIG7psnWyWqv9OhSJpCeyl7PY8ag4hNj03mJ2o/Np+kP/z6mx7scSZsE # DuH83ToFagBJBtVw5qaVSlv6ycQTdyMcla+kD/XIWNjGFWtG2wAiNnb1PkdkCZRO # QI6DCsuvFiNaZhU9ySga62nKcuh1Ixq7Vfv9VOdm66xJQpVcuRW/PlGVmS6fNnLg # s7STDEqlvpD+c8lQUryzPuAwggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAA # AAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz # aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv # cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBB # dXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YB # f2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKD # RLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus # 9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTj # kY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56 # KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39 # IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHo # vwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJo # LhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMh # XV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREd # cu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEA # AaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqn # Uv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnp # cjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # EwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEw # CwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/o # olxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNy # b3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt # MjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5t # aWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5j # cnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+ # TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2Y # urYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4 # U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJ # w7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb # 30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ # /gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGO # WhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFE # fnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJ # jXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rR # nj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUz # WLOhcGbyoYIC1DCCAj0CAQEwggEAoYHYpIHVMIHSMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBP # cGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjE3OUUt # NEJCMC04MjQ2MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl # oiMKAQEwBwYFKw4DAhoDFQCA8PNjrxtTBQQdp/+MHlaqc1fEoaCBgzCBgKR+MHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBBQUAAgUA5ruk # uTAiGA8yMDIyMDkwMjA1MzgwMVoYDzIwMjIwOTAzMDUzODAxWjB0MDoGCisGAQQB # hFkKBAExLDAqMAoCBQDmu6S5AgEAMAcCAQACAhKEMAcCAQACAhFaMAoCBQDmvPY5 # AgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSCh # CjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEFBQADgYEAAOxnjpO8aPp3KfqfqJo8NbpH # l7MXYZpB2b3szLLcnh3HT0YdLwM36WbyO3UhySTwAM9T0L/M5fkcNQDNIvTQbK1z # gnOJ/6Ae1lzbZ+JAo0WaigErjy/3rbvdG0OE3qSKQqa4P2lW/7zohn2PoF5e2U43 # PAgdgE/f4hB78j91QvwxggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt # cCBQQ0EgMjAxMAITMwAAAYo+OI3SDgL66AABAAABijANBglghkgBZQMEAgEFAKCC # AUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCC/ # mQDEwu51AGtU+/iVjgWrCCHa3hbONj5k58daFUWLXjCB+gYLKoZIhvcNAQkQAi8x # geowgecwgeQwgb0EIPS94Kt130q+fvO/fzD4MbWQhQaE7RHkOH6AkjlNVCm9MIGY # MIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG # A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAGKPjiN0g4C # +ugAAQAAAYowIgQg3+JxPDxQkicqWvmPUHAYy8AAGy6UQRTnVHzL/CXi4PQwDQYJ # KoZIhvcNAQELBQAEggIArK6vBFrSqGPajDSTlqOxkQlztu2UBM5mE8SBxwiDSnlA # 21y/bBQMB1HiBO17Bm7aRDtCzuYH23LU1/Co4wjEp+Zo24OnMydnqT5YHVAs9AIl # RbqyZ7cL9nnZr0Qh8Aa4I/BHysoxrmZYD702IBVpJaMZ+9OXQsOg0fiic8p8WkY5 # DswciKrnM+nm2DOgX1VJFKQYSyX8oFYIyOoIU+AIU+FVg6FH8w+LyAAjYWFLt9r0 # PqNgeJeX3tYG7vm+y5MozxEDY+DO4tLXeFobW0HAXl9KToMEkJ3b2TW3tbfS2ptp # Ei2yVdkuA97DwShR2LMXwaGlntBMZMoK/NIB2ER6v/9a05OvnTcekqGXhUfH2IC1 # 6QKJCAv9FOGG4WXzGkVEHreNL3MnwSoulFpRst++z0lX1y4k+IJv6Xtox+1lYmwE # LGvSo3miDYgq5/0IAg2yEldM7/jwHw0Jgo4/v8IidHNN7HsCQISlvQtcqh1gPWct # CIjhxVMo6RS76IsVkbcPRNprIn2wfCUKSLUbVf5oGHCKS79dFoqxjTCSIPRFA8lk # JmARHug7dgYQBOv+hvf1fkOFJ9ZmvoOyN/c3O81ROVLwRjmOjb5g3HXykJRLQd30 # nYfofcGCkjpcaJUUzMGAJsBwEwRjMMKqHNwZRLAHNQli7YRSpfAdGHgaWqg4sAA= # SIG # End signature block |