Microsoft.PowerApps.RestClientModule.psm1
$local:ErrorActionPreference = "Stop" #Import-Module "$(Split-Path $script:MyInvocation.MyCommand.Path)\Microsoft.PowerApps.AuthModule.psm1" # -Force function Get-AudienceForHostName { [CmdletBinding()] Param( [string] $Uri ) $hostMapping = @{ "management.azure.com" = "https://management.azure.com/"; "api.powerapps.com" = "https://service.powerapps.com/"; "tip1.api.powerapps.com" = "https://service.powerapps.com/"; "tip2.api.powerapps.com" = "https://service.powerapps.com/"; "graph.windows.net" = "https://graph.windows.net/"; "api.bap.microsoft.com" = "https://service.powerapps.com/"; "tip1.api.bap.microsoft.com" = "https://service.powerapps.com/"; "tip2.api.bap.microsoft.com" = "https://service.powerapps.com/"; "api.flow.microsoft.com" = "https://service.flow.microsoft.com/"; "tip1.api.flow.microsoft.com" = "https://service.flow.microsoft.com/"; "tip2.api.flow.microsoft.com" = "https://service.flow.microsoft.com/"; "gov.api.bap.microsoft.us" = "https://gov.service.powerapps.us/"; "high.api.bap.microsoft.us" = "https://high.service.powerapps.us/"; "gov.api.powerapps.us" = "https://gov.service.powerapps.us/"; "high.api.powerapps.us" = "https://high.service.powerapps.us/"; "gov.api.flow.microsoft.us" = "https://gov.service.flow.microsoft.us/"; "high.api.flow.microsoft.us" = "https://high.service.flow.microsoft.us/"; } $uriObject = New-Object System.Uri($Uri) $host = $uriObject.Host if ($hostMapping[$host] -ne $null) { return $hostMapping[$host]; } Write-Verbose "Unknown host $host. Using https://management.azure.com/ as a default"; return "https://management.azure.com/"; } function Invoke-Request( [CmdletBinding()] [Parameter(Mandatory=$True)] [string] $Uri, [Parameter(Mandatory=$True)] [string] $Method, [object] $Body = $null, [Hashtable] $Headers = @{}, [switch] $ParseContent, [switch] $ThrowOnFailure ) { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $audience = Get-AudienceForHostName -Uri $Uri $token = Get-JwtToken -Audience $audience $Headers["Authorization"] = "Bearer $token"; $Headers["User-Agent"] = "PowerShell cmdlets 1.0"; try { if ($Body -eq $null -or $Body -eq "") { $response = Invoke-WebRequest -Uri $Uri -Headers $Headers -Method $Method -UseBasicParsing } else { $jsonBody = ConvertTo-Json $Body -Depth 20 $response = Invoke-WebRequest -Uri $Uri -Headers $Headers -Method $Method -ContentType "application/json; charset=utf-8" -Body $jsonBody -UseBasicParsing } if ($ParseContent) { if ($response.Content) { return ConvertFrom-Json $response.Content; } } return $response } catch { $response = $_.Exception.Response if ($_.ErrorDetails) { $errorResponse = ConvertFrom-Json $_.ErrorDetails; $code = $response.StatusCode $message = $errorResponse.Error.Message Write-Verbose "Status Code: '$code'. Message: '$message'" } if ($ThrowOnFailure) { throw; } else { return $response } } } function InvokeApi { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$Method, [Parameter(Mandatory = $true)] [string]$Route, [Parameter(Mandatory = $false)] [object]$Body = $null, [Parameter(Mandatory = $false)] [switch]$ThrowOnFailure, [Parameter(Mandatory = $false)] [string]$ApiVersion = "2016-11-01" ) Test-PowerAppsAccount; $uri = $Route ` | ReplaceMacro -Macro "{apiVersion}" -Value $ApiVersion ` | ReplaceMacro -Macro "{flowEndpoint}" -Value $global:currentSession.flowEndpoint ` | ReplaceMacro -Macro "{powerAppsEndpoint}" -Value $global:currentSession.powerAppsEndpoint ` | ReplaceMacro -Macro "{bapEndpoint}" -Value $global:currentSession.bapEndpoint ` | ReplaceMacro -Macro "{graphEndpoint}" -Value $global:currentSession.graphEndpoint ` | ReplaceMacro -Macro "{cdsOneEndpoint}" -Value $global:currentSession.cdsOneEndpoint; Write-Verbose $uri If($ThrowOnFailure) { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -ParseContent ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -ParseContent ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } if($result.nextLink) { $nextLink = $result.nextLink $resultValue = $result.value while($nextLink) { If($ThrowOnFailure) { $nextResult = Invoke-Request ` -Uri $nextLinkuri ` -Method $Method ` -Body $body ` -ParseContent ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $nextResult = Invoke-Request ` -Uri $nextLink ` -Method $Method ` -Body $body ` -ParseContent ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } $nextLink = $nextResult.nextLink $resultValue = $resultValue + $nextResult.value } return New-Object -TypeName PSObject ` | Add-Member -PassThru -MemberType NoteProperty -Name value -Value $resultValue ` } return $result; } function InvokeApiNoParseContent { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$Method, [Parameter(Mandatory = $true)] [string]$Route, [Parameter(Mandatory = $false)] [object]$Body = $null, [Parameter(Mandatory = $false)] [switch]$ThrowOnFailure, [Parameter(Mandatory = $false)] [string]$ApiVersion = "2016-11-01" ) Test-PowerAppsAccount; $uri = $Route ` | ReplaceMacro -Macro "{apiVersion}" -Value $ApiVersion ` | ReplaceMacro -Macro "{flowEndpoint}" -Value $global:currentSession.flowEndpoint ` | ReplaceMacro -Macro "{powerAppsEndpoint}" -Value $global:currentSession.powerAppsEndpoint ` | ReplaceMacro -Macro "{bapEndpoint}" -Value $global:currentSession.bapEndpoint ` | ReplaceMacro -Macro "{graphEndpoint}" -Value $global:currentSession.graphEndpoint ` | ReplaceMacro -Macro "{cdsOneEndpoint}" -Value $global:currentSession.cdsOneEndpoint; Write-Verbose $uri If($ThrowOnFailure) { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true) } if($result.nextLink) { $nextLink = $result.nextLink $resultValue = $result.value while($nextLink) { If($ThrowOnFailure) { $nextResult = Invoke-Request ` -Uri $nextLinkuri ` -Method $Method ` -Body $body ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $nextResult = Invoke-Request ` -Uri $nextLink ` -Method $Method ` -Body $body ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } $nextLink = $nextResult.nextLink $resultValue = $resultValue + $nextResult.value } return New-Object -TypeName PSObject ` | Add-Member -PassThru -MemberType NoteProperty -Name value -Value $resultValue ` } return $result; } function ReplaceMacro { param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [string]$Input, [Parameter(Mandatory = $true)] [string]$Macro, [Parameter(Mandatory = $false)] [string]$Value ) return $Input.Replace($Macro, $Value) } function BuildFilterPattern { param ( [Parameter(Mandatory = $false)] [object]$Filter ) if ($Filter -eq $null -or $Filter.Length -eq 0) { return New-Object System.Management.Automation.WildcardPattern "*" } else { return New-Object System.Management.Automation.WildcardPattern @($Filter,"IgnoreCase") } } function ResolveEnvironment { param ( [Parameter(Mandatory = $false)] [string]$OverrideId ) if (-not [string]::IsNullOrWhiteSpace($OverrideId)) { return $OverrideId; } elseif ($global:currentSession.selectedEnvironment) { return $global:currentSession.selectedEnvironment; } return "~default"; } function Select-CurrentEnvironment { <# .SYNOPSIS Sets the current environment for listing powerapps, flows, and other environment resources .DESCRIPTION The Select-CurrentEnvironment cmdlet sets the current environment in which commands will execute when an environment is not specified. Use Get-Help Select-CurrentEnvironment -Examples for more detail. .PARAMETER EnvironmentName Environment identifier (not display name). .PARAMETER Default Shortcut to specify the default tenant environment .EXAMPLE Select-CurrentEnvironment -EnvironmentName 3c2f7648-ad60-4871-91cb-b77d7ef3c239 Select environment 3c2f7648-ad60-4871-91cb-b77d7ef3c239 as the current environment. Cmdlets invoked after running this command will operate against this environment. .EXAMPLE Select-CurrentEnvironment ~default Select the default environment. Cmdlets invoked after running this will operate against the default environment. #> param ( [Parameter(Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName=$true, ParameterSetName = "Name")] [String]$EnvironmentName, [Parameter(Mandatory = $true, ParameterSetName = "Default")] [Switch]$Default ) Test-PowerAppsAccount; if ($Default) { $global:currentSession.selectedEnvironment = "~default"; } else { $global:currentSession.selectedEnvironment = $EnvironmentName; } } # SIG # Begin signature block # MIIdgAYJKoZIhvcNAQcCoIIdcTCCHW0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUsmykoI6TRRG53XqO7EuqwTzf # +BmgghhqMIIE2jCCA8KgAwIBAgITMwAAASMwQ40kSDyg1wAAAAABIzANBgkqhkiG # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTgxMDI0MjEwNzQw # WhcNMjAwMTEwMjEwNzQwWjCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEm # MCQGA1UECxMdVGhhbGVzIFRTUyBFU046MUE4Ri1FM0MzLUQ2OUQxJTAjBgNVBAMT # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQCyYt3Mdjll12pYYKRUadMqDK0tJrlPK1MhEo75C/BI1y2i # r4HnxDl/BSAvi44lI4IKUFDS40WJPlnCHfEuwgvEUNuFrseh7bDkaWezo6W/F7i9 # PO7GAxmM139zh5p2a1XwfzqYpZE2hEucIkiOR82fg7I0s8itzwl1jWQmdAI4XAZN # LeeXXof9Qm80uuUfEn6x/pANst2N+WKLRLnCqWLR7o6ZKqofshoYFpPukVLPsvU/ # ik/ch1kj2Ja53Zb+KHctMCk/CpN2p7fNArpLcUA3H7/mdJjlaUFYLY9yy5TBndFF # I1kBbZEB/Z1kYVnjRsIsV8W2CCp1RCxiIkx6AhIzAgMBAAGjggEJMIIBBTAdBgNV # HQ4EFgQU2zl1LgtoHHcQXPImRhW0WL0hxPAwHwYDVR0jBBgwFoAUIzT42VJGcArt # QPt2+7MrsMM1sw8wVAYDVR0fBE0wSzBJoEegRYZDaHR0cDovL2NybC5taWNyb3Nv # ZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljcm9zb2Z0VGltZVN0YW1wUENBLmNy # bDBYBggrBgEFBQcBAQRMMEowSAYIKwYBBQUHMAKGPGh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0VGltZVN0YW1wUENBLmNydDATBgNV # HSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQUFAAOCAQEAauzxVwcRLuLSItcW # CHqZFtDSR5Ci4pgS+WrhLSmhfKXQRJekrOwZR7keC/bS7lyqai7y4NK9+ZHc2+F7 # dG3Ngym/92H45M/fRYtP63ObzWY9SNXBxEaZ1l8UP/hvv3uJnPf5/92mws50THX8 # tlvKAkBMWikcuA5y4s6yYy2GBFZIypm+ChZGtswTCst+uZhG8SBeE+U342Tbb3fG # 5MLS+xuHrvSWdRqVHrWHpPKESBTStNPzR/dJ7pgtmF7RFKAWYLcEpPhr9hjUcf9q # SJa7D5aghTY2UNFmn3BvKBSON+Dy5nDJA81RyZ/lU9iCOG+hGdpsGsJfvKT5WxsJ # vEwdjzCCBf8wggPnoAMCAQICEzMAAAFRno2PQHGjDkEAAAAAAVEwDQYJKoZIhvcN # AQELBQAwfjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYG # A1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMTAeFw0xOTA1MDIy # MTM3NDZaFw0yMDA1MDIyMTM3NDZaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xHjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIw # DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJVaxoZpRx00HvFVw2Z19mJUGFgU # ZyfwoyrGA0i85lY0f0lhAu6EeGYnlFYhLLWh7LfNO7GotuQcB2Zt5Tw0Uyjj0+/v # UyAhL0gb8S2rA4fu6lqf6Uiro05zDl87o6z7XZHRDbwzMaf7fLsXaYoOeilW7SwS # 5/LjneDHPXozxsDDj5Be6/v59H1bNEnYKlTrbBApiIVAx97DpWHl+4+heWg3eTr5 # CXPvOBxPhhGbHPHuMxWk/+68rqxlwHFDdaAH9aTJceDFpjX0gDMurZCI+JfZivKJ # HkSxgGrfkE/tTXkOVm2lKzbAhhOSQMHGE8kgMmCjBm7kbKEd2quy3c6ORJECAwEA # AaOCAX4wggF6MB8GA1UdJQQYMBYGCisGAQQBgjdMCAEGCCsGAQUFBwMDMB0GA1Ud # DgQWBBRXghquSrnt6xqC7oVQFvbvRmKNzzBQBgNVHREESTBHpEUwQzEpMCcGA1UE # CxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xFjAUBgNVBAUTDTIz # MDAxMis0NTQxMzUwHwYDVR0jBBgwFoAUSG5k5VAF04KqFzc3IrVtqMp1ApUwVAYD # VR0fBE0wSzBJoEegRYZDaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # cmwvTWljQ29kU2lnUENBMjAxMV8yMDExLTA3LTA4LmNybDBhBggrBgEFBQcBAQRV # MFMwUQYIKwYBBQUHMAKGRWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv # Y2VydHMvTWljQ29kU2lnUENBMjAxMV8yMDExLTA3LTA4LmNydDAMBgNVHRMBAf8E # AjAAMA0GCSqGSIb3DQEBCwUAA4ICAQBaD4CtLgCersquiCyUhCegwdJdQ+v9Go4i # Elf7fY5u5jcwW92VESVtKxInGtHL84IJl1Kx75/YCpD4X/ZpjAEOZRBt4wHyfSlg # tmc4+J+p7vxEEfZ9Vmy9fHJ+LNse5tZahR81b8UmVmUtfAmYXcGgvwTanT0reFqD # DP+i1wq1DX5Dj4No5hdaV6omslSycez1SItytUXSV4v9DVXluyGhvY5OVmrSrNJ2 # swMtZ2HKtQ7Gdn6iNntR1NjhWcK6iBtn1mz2zIluDtlRL1JWBiSjBGxa/mNXiVup # MP60bgXOE7BxFDB1voDzOnY2d36ztV0K5gWwaAjjW5wPyjFV9wAyMX1hfk3aziaW # 2SqdR7f+G1WufEooMDBJiWJq7HYvuArD5sPWQRn/mjMtGcneOMOSiZOs9y2iRj8p # pnWq5vQ1SeY4of7fFQr+mVYkrwE5Bi5TuApgftjL1ZIo2U/ukqPqLjXv7c1r9+si # eOcGQpEIn95hO8Ef6zmC57Ol9Ba1Ths2j+PxDDa+lND3Dt+WEfvxGbB3fX35hOaG # /tNzENtaXK15qPhErbCTeljWhLPYk8Tk8242Z30aZ/qh49mDLsiL0ksurxKdQtXt # v4g/RRdFj2r4Z1GMzYARfqaxm+88IigbRpgdC73BmwoQraOq9aLz/F1555Ij0U3o # rXDihVAzgzCCBgcwggPvoAMCAQICCmEWaDQAAAAAABwwDQYJKoZIhvcNAQEFBQAw # XzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29m # dDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # MB4XDTA3MDQwMzEyNTMwOVoXDTIxMDQwMzEzMDMwOVowdzELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn6Fssd/b # SJIqfGsuGeG94uPFmVEjUK3O3RhOJA/u0afRTK10MCAR6wfVVJUVSZQbQpKumFww # JtoAa+h7veyJBw/3DgSY8InMH8szJIed8vRnHCz8e+eIHernTqOhwSNTyo36Rc8J # 0F6v0LBCBKL5pmyTZ9co3EZTsIbQ5ShGLieshk9VUgzkAyz7apCQMG6H81kwnfp+ # 1pez6CGXfvjSE/MIt1NtUrRFkJ9IAEpHZhEnKWaol+TTBoFKovmEpxFHFAmCn4Tt # VXj+AZodUAiFABAwRu233iNGu8QtVJ+vHnhBMXfMm987g5OhYQK1HQ2x/PebsgHO # IktU//kFw8IgCwIDAQABo4IBqzCCAacwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E # FgQUIzT42VJGcArtQPt2+7MrsMM1sw8wCwYDVR0PBAQDAgGGMBAGCSsGAQQBgjcV # AQQDAgEAMIGYBgNVHSMEgZAwgY2AFA6sgmBAVieX5SUT/CrhClOVWeSkoWOkYTBf # MRMwEQYKCZImiZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0 # MS0wKwYDVQQDEyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmC # EHmtFqFKoKWtTHNY9AcTLmUwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5t # aWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvbWljcm9zb2Z0cm9vdGNlcnQu # Y3JsMFQGCCsGAQUFBwEBBEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraS9jZXJ0cy9NaWNyb3NvZnRSb290Q2VydC5jcnQwEwYDVR0l # BAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggIBABCXisNcA0Q23em0rXfb # znlRTQGxLnRxW20ME6vOvnuPuC7UEqKMbWK4VwLLTiATUJndekDiV7uvWJoc4R0B # hqy7ePKL0Ow7Ae7ivo8KBciNSOLwUxXdT6uS5OeNatWAweaU8gYvhQPpkSokInD7 # 9vzkeJkuDfcH4nC8GE6djmsKcpW4oTmcZy3FUQ7qYlw/FpiLID/iBxoy+cwxSnYx # PStyC8jqcD3/hQoT38IKYY7w17gX606Lf8U1K16jv+u8fQtCe9RTciHuMMq7eGVc # WwEXChQO0toUmPU8uWZYsy0v5/mFhsxRVuidcJRsrDlM1PZ5v6oYemIp76KbKTQG # dxpiyT0ebR+C8AvHLLvPQ7Pl+ex9teOkqHQ1uE7FcSMSJnYLPFKMcVpGQxS8s7Ow # TWfIn0L/gHkhgJ4VMGboQhJeGsieIiHQQ+kr6bv0SMws1NgygEwmKkgkX1rqVu+m # 3pmdyjpvvYEndAYR7nYhv5uCwSdUtrFqPYmhdmG0bqETpr+qR/ASb/2KMmyy/t9R # yIwjyWa9nR2HEmQCPS2vWY+45CHltbDKY7R4VAXUQS5QrJSwpXirs6CWdRrZkocT # dSIvMqgIbqBbjCW/oO+EyiHW6x5PyZruSeD3AWVviQt9yGnI5m7qp5fOMSn/DsVb # XNhNG6HY+i+ePy5VFmvJE6P9MIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCBIAwggR8AgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAFRno2PQHGjDkEAAAAAAVEwCQYFKw4DAhoFAKCB # lDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYK # KwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUIto9ZG3v8wDXIW3yVx6gDU2YrYow # NAYKKwYBBAGCNwIBDDEmMCSgEoAQAFQAZQBzAHQAUwBpAGcAbqEOgAxodHRwOi8v # dGVzdCAwDQYJKoZIhvcNAQEBBQAEggEAIRmpLjFHOq4hFBh/R39/ypn4BcyENgEG # OmLx9uASSRtnE+z2e2r6VPv1t3mpUupmR2E739l2W4yHB4bcprwFW2LomU7jK3V2 # Q16mZEml23b5Iy39WY+i8c7Fk0rU3Utn+VL8wXB9yNBo2mHF3iDHvEUCtwMHGvEK # ZyHaPAo6Hv/7EA7OYORo29WcKfi74auxfQwhe1KnMlfF4vvNhXsSo03AHQUy6KmI # HeBq+erNKLw62IP/UQojmtJp+Q0NOlD2FvRlXOdLVf9ZLuZoy2PyylpTobtIlXwn # 5JYZCVFbXZoCq9yPBq9JPe15QPxgGX+bNcxw64QbZNebWn/8SPWbkKGCAigwggIk # BgkqhkiG9w0BCQYxggIVMIICEQIBATCBjjB3MQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQ # Q0ECEzMAAAEjMEONJEg8oNcAAAAAASMwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJ # AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE5MDgzMDIyNTg1NFowIwYJ # KoZIhvcNAQkEMRYEFIloq7BHrsioRV19GeADu2hZSRJoMA0GCSqGSIb3DQEBBQUA # BIIBAIW/ozEGDeHunh3h+9pzz8vYEOWgJafd/r/c8+ME+TLpEX4bIWCNytQcUGPQ # W7k0rcneAurxAEiGJSbruzUKNV5y062p5OYtt77axBcvvy/NTJUpzhroUaSLYUbM # YXvfuU4fxCXeoofepoJdsoTVwMHbKk5gAzGZmYtAd99HGbgo075XZ7LOYRqWFpil # fopsQibmkOksSK6jZ4UkxoUiSk7WmIx5qhWFJXt3gDTgE4vz7wfUkXH8JPsBUWnb # tYOoLZ92ZudxiiKnx7X18BQV/nKqGhTLIH3V31E7aBhDUcOMONcrXzfcplAg9jaK # qNmRxDtGbSOP5w5LrxP0JKoIzOg= # SIG # End signature block |