AppSource/Get-AppSourceProduct.ps1

<#
 .Synopsis
  Get information about AppSource products from the authenticated account
 .Description
  Returns one or more PSCustomObject with information about your AppSource products
 .Parameter authContext
  Authentication Context from New-BcAuthContext
 .Parameter productId
  Id of the product for which you want to get information
 .Parameter productName
  Name of the product for which you want to get information (supports wildcards)
 .Parameter includeProperty
  Include this switch if you want do include the properties of the product
 .Parameter includeListing
  Include this switch if you want do include the listings of the product
 .Parameter includeSetup
  Include this switch if you want do include the setup of the product
 .Parameter includeProductAvailability
  Include this switch if you want do include the productavailability of the product
 .Parameter includeFeatureAvailability
  Include this switch if you want do include the featureavailability of the product (including markets)
 .Parameter includeListingAsset
  Include this switch if you want do include the assets of the listings of the product (including FileSasUri)
 .Parameter includeListingImage
  Include this switch if you want do include the images of the listings of the product (including FileSasUri)
 .Parameter includeListingVideo
  Include this switch if you want do include the videos of the listings of the product (including FileSasUri)
 .Parameter includePackage
  Include this switch if you want do include the packages of the product
 .Parameter includeAll
  Include this switch if you want to include all additional information about the product
 .Parameter silent
  Include this switch if you do not want the method to display URLs etc.
 .Example
  @(Get-AppSourceProduct -authContext $authcontext -silent)
 
  resourceType : AzureDynamics365BusinessCentral
  name : C5 2012 Data Migration
  externalIDs : {@{type=AzureOfferId; value=c5-2012-data-migration}}
  isModularPublishing : True
  id : bc09759f-4d41-4d56-a57a-2f7e4cfad4a2
   
  resourceType : AzureDynamics365BusinessCentral
  name : ELSTER VAT Localization for Germany
  externalIDs : {@{type=AzureOfferId; value=elster-vat-file-de}}
  isModularPublishing : True
  id : 29cb661d-ea77-4415-ac43-b0f7a90cd9b5
   
  resourceType : AzureDynamics365BusinessCentral
  name : PayPal Payments Standard
  externalIDs : {@{type=AzureOfferId; value=fb310c16-0b22-4569-a5f0-8f9a01571cee}}
  isModularPublishing : True
  id : 193aec22-a99f-4024-8aba-c01ec540c0b7
 
  ...
 .Example
  Get-AppSourceProduct -authContext $authcontext -productId $productId -silent
   
  resourceType : AzureDynamics365BusinessCentral
  name : BingMaps.AppSource
  externalIDs : {@{type=AzureOfferId; value=bingmapsintegration}}
  isModularPublishing : True
  id : 5fbe0803-a545-4504-b41a-d9d158112360
 
 .Example
  Get-AppSourceProduct -authContext $authcontext -productName 'BingMaps.*' -silent
   
  resourceType : AzureDynamics365BusinessCentral
  name : BingMaps.AppSource
  externalIDs : {@{type=AzureOfferId; value=bingmapsintegration}}
  isModularPublishing : True
  id : 5fbe0803-a545-4504-b41a-d9d158112360
 
 .Example
  $product = Get-AppSourceProduct -authContext $authcontext -productId $productId -includeFeatureAvailability -silent
  $product.FeatureAvailability[0].marketStates | Where-Object { $_.state -eq "Enabled" }
   
  marketCode state
  ---------- -----
  DK Enabled
  IT Enabled
  US Enabled
 
 .Example
  $product = Get-AppSourceProduct -authContext $authcontext -productId $productId -includepackage -silent
  $product
  $product.packageConfigurations
   
  resourceType : AzureDynamics365BusinessCentral
  name : BingMaps.AppSource
  externalIDs : {@{type=AzureOfferId; value=bingmapsintegration}}
  isModularPublishing : True
  id : 5fbe0803-a545-4504-b41a-d9d158112360
  PackageConfigurations : {@{resourceType=Dynamics365BusinessCentralPackageConfiguration; packageType=AddOn; packageReferences=System.Object[];
                          @odata.etag="0000d552-0000-0800-0000-62eba1680000"; id=2c3eb741-7421-40b7-870b-1caea05f017e; Dynamics365BusinessCentralAddOnExtensionPackage=}}
 
  resourceType : Dynamics365BusinessCentralPackageConfiguration
  packageType : AddOn
  packageReferences : {@{type=Dynamics365BusinessCentralAddOnExtensionPackage; value=7cb9f83f-96a7-4e71-a782-6edcaf6a26e4}}
  @odata.etag : "0000d552-0000-0800-0000-62eba1680000"
  id : 2c3eb741-7421-40b7-870b-1caea05f017e
  Dynamics365BusinessCentralAddOnExtensionPackage : @{resourceType=; fileName=Freddy Kristiansen_BingMaps.AppSource_3.0.163.0.app; state=Processed;
                                                    @odata.etag="40001820-0000-0800-0000-62eba15f0000"; id=7cb9f83f-96a7-4e71-a782-6edcaf6a26e4}
   
#>

function Get-AppSourceProduct {
     [CmdletBinding(DefaultParameterSetName = 'ProductId')]
     Param(
        [Parameter(Mandatory=$true)]
        [HashTable] $authContext,
        [Parameter(Mandatory=$false, ParameterSetName = 'ProductId')]
        [string] $productId = '',
        [Parameter(Mandatory=$false, ParameterSetName = 'ProductName')]
        [string] $productName = '',
        [switch] $includeSetup,
        [switch] $includeProperty,
        [switch] $includeListing,
        [switch] $includePackage,
        [switch] $includeProductAvailability,
        [switch] $includeFeatureAvailability,
        [switch] $includeListingAsset,
        [switch] $includeListingImage,
        [switch] $includeListingVideo,
        [switch] $includeAll,
        [switch] $silent
    )

$telemetryScope = InitTelemetryScope -name $MyInvocation.InvocationName -parameterValues $PSBoundParameters -includeParameters @()
try {
    $authContext = Renew-BcAuthContext -bcAuthContext $authContext
    if ($productId) {
        $product = Invoke-IngestionApiGet -authContext $authContext -path "/products/$productId" -silent:($silent.IsPresent)
        if (-not $product) {
            throw "Product with ID $productId cannot be found"
        }
        $products = @($product)
    }
    elseif ($productName) {
        $product = Invoke-IngestionApiGetCollection -authContext $authContext -path '/products' -silent:($silent.IsPresent) | Where-Object { $_.Name -like $productName }
        if (-not $product) {
            throw "Product with Name $productName cannot be found"
        }
        $products = @($product)
    }
    else {
        $products = @(Invoke-IngestionApiGetCollection -authContext $authContext -path '/products' -silent:($silent.IsPresent))
    }
    $products | ForEach-Object {
        $product = $_
        #$product | ConvertTo-Json -Depth 99 | Out-Host
        $variantID = ''
        if ($includeSetup -or $includeAll) {
            $product | Add-Member -MemberType NoteProperty -Name 'Setup' -Value (Invoke-IngestionApiGet -authContext $authContext -path "/products/$($product.Id)/setup" -silent:($silent.IsPresent))
        }
        if ($includeFeatureAvailability -or $includeProductAvailability -or $includeAll) {
            $branchesAvailability = @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/branches/getByModule(module=Availability)" -silent:($silent.IsPresent) | Where-Object { 
                $thisVariantID = ''
                if ($_.PSObject.Properties.name -eq "variantID") { $thisVariantID = $_.variantID }
                $variantID -eq $thisVariantID
            })
            if ($branchesAvailability.Count -ne 1) {
                throw "Unable to find branchesAvailability for product $($product.Id)"
            }
            if ($includeProductAvailability -or $includeAll) {
                $product | Add-Member -MemberType NoteProperty -Name "ProductAvailability" -Value @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/productavailabilities/getByInstanceID(instanceID=$($branchesAvailability[0].currentDraftInstanceID))" -silent:($silent.IsPresent))
            }
            if ($includeFeatureAvailability -or $includeAll) {
                $product | Add-Member -MemberType NoteProperty -Name "FeatureAvailability" -Value @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/featureavailabilities/getByInstanceID(instanceID=$($branchesAvailability[0].currentDraftInstanceID))" -query '$expand=MarketStates' -silent:($silent.IsPresent))
            }
        }
        if ($includeProperty -or $includeAll) {
            $branchesProperty = @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/branches/getByModule(module=Property)" -silent:($silent.IsPresent) | Where-Object { 
                $thisVariantID = ''
                if ($_.PSObject.Properties.name -eq "variantID") { $thisVariantID = $_.variantID }
                $variantID -eq $thisVariantID
            })
            if ($branchesProperty.Count -ne 1) {
                throw "Unable to find branchesProperty for product $($product.Id)"
            }
            $product | Add-Member -MemberType NoteProperty -Name "Property" -Value @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/properties/getByInstanceID(instanceID=$($branchesProperty[0].currentDraftInstanceID))" -silent:($silent.IsPresent))
        }
        if ($includeListing -or $includeAll) {
            $branchesListing = @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/branches/getByModule(module=Listing)" -silent:($silent.IsPresent) | Where-Object { 
                $thisVariantID = ''
                if ($_.PSObject.Properties.name -eq "variantID") { $thisVariantID = $_.variantID }
                $variantID -eq $thisVariantID
            })
            if ($branchesListing.Count -ne 1) {
                throw "Unable to find branchesListing for product $($product.Id)"
            }
            $product | Add-Member -MemberType NoteProperty -Name "Listing" -Value @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/listings/getByInstanceID(instanceID=$($branchesListing[0].currentDraftInstanceID))" -silent:($silent.IsPresent))
            $product.Listing | ForEach-Object {
                $listing = $_
                if ($includeListingAsset -or $includeAll) {
                    $listing | Add-Member -MemberType NoteProperty -Name "Asset" -Value @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/listings/$($listing.id)/assets" -query '$expand=FileSasUri' -silent:($silent.IsPresent))
                }
                if ($includeListingImage -or $includeAll) {
                    $listing | Add-Member -MemberType NoteProperty -Name "Image" -Value @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/listings/$($listing.id)/images" -query '$expand=FileSasUri' -silent:($silent.IsPresent))
                }
                if ($includeListingVideo -or $includeAll) {
                    $listing | Add-Member -MemberType NoteProperty -Name "Video" -Value @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/listings/$($listing.id)/videos" -query '$expand=FileSasUri' -silent:($silent.IsPresent))
                }
            }
        }
        if ($includePackage -or $includeAll) {
            $variantID = ''
            $branchesPackage = @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/branches/getByModule(module=Package)" -silent:($silent.IsPresent) | Where-Object { 
                $thisVariantID = ''
                if ($_.PSObject.Properties.name -eq "variantID") { $thisVariantID = $_.variantID }
                $variantID -eq $thisVariantID
            })
            $branchesPackage | ForEach-Object {
                $packageConfigurations = @(Invoke-IngestionApiGetCollection -authContext $authContext -path "/products/$($product.Id)/packageconfigurations/getByInstanceID(instanceID=$($_.currentDraftInstanceID))" -silent:($silent.IsPresent))
                $packageConfigurations | ForEach-Object {
                    $addOnExtensionPackageId = $_.packageReferences | Where-Object { $_.type -eq 'Dynamics365BusinessCentralAddOnExtensionPackage' } | ForEach-Object { $_.Value }
                    if ($addOnExtensionPackageId) {
                        $_ | Add-Member -MemberType NoteProperty -Name 'Dynamics365BusinessCentralAddOnExtensionPackage' -value (Invoke-IngestionApiGet -authContext $authContext -path "/products/$($product.Id)/packages/$addOnExtensionPackageId" -silent:($silent.IsPresent))
                    }
                    $addOnLibraryExtensionPackageId = $_.packageReferences | Where-Object { $_.type -eq 'Dynamics365BusinessCentralAddOnLibraryExtensionPackage' } | ForEach-Object { $_.Value }
                    if ($addOnLibraryExtensionPackageId) {
                        $_ | Add-Member -MemberType NoteProperty -Name 'Dynamics365BusinessCentralAddOnLibraryExtensionPackage' -value (Invoke-IngestionApiGet -authContext $authContext -path "/products/$($product.Id)/packages/$addOnLibraryExtensionPackageId" -silent:($silent.IsPresent))
                    }
                }
                $product | Add-Member -MemberType NoteProperty -Name 'PackageConfigurations' -Value $packageConfigurations
            }
        }
        $product
    }
}
catch {
    TrackException -telemetryScope $telemetryScope -errorRecord $_
    throw
}
finally {
    TrackTrace -telemetryScope $telemetryScope
}
}
Export-ModuleMember -Function Get-AppSourceProduct
# SIG # Begin signature block
# MIIr3wYJKoZIhvcNAQcCoIIr0DCCK8wCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAqJi4iWqhcp3o/
# yXRMG4VCmZclornTWD3E6fdYN0FuMqCCJPcwggVvMIIEV6ADAgECAhBI/JO0YFWU
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
# dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG
# EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv
# IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s
# hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD
# J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7
# P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme
# me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz
# T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q
# RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz
# mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc
# QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T
# OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/
# AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID
# AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD
# VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV
# HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE
# VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v
# ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE
# KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI
# hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF
# OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC
# J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ
# pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl
# d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH
# +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggWNMIIEdaADAgECAhAOmxiO
# +dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYD
# VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAi
# BgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAw
# MDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERp
# Z2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsb
# hA3EMB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iT
# cMKyunWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGb
# NOsFxl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclP
# XuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCr
# VYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFP
# ObURWBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTv
# kpI6nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWM
# cCxBYKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls
# 5Q5SUUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBR
# a2+xq4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6
# MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qY
# rhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8E
# BAMCAYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5k
# aWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDig
# NoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v
# dENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCg
# v0NcVec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQT
# SnovLbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh
# 65ZyoUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSw
# uKFWjuyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAO
# QGPFmCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjD
# TZ9ztwGpn1eqXijiuZQwggYaMIIEAqADAgECAhBiHW0MUgGeO5B5FSCJIRwKMA0G
# CSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExp
# bWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBSb290
# IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5NTlaMFQxCzAJBgNVBAYT
# AkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28g
# UHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0GCSqGSIb3DQEBAQUAA4IB
# jwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjIztNsfvxYB5UXeWUzCxEe
# AEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NVDgFigOMYzB2OKhdqfWGV
# oYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/36F09fy1tsB8je/RV0mIk
# 8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05ZwmRmTnAO5/arnY83jeNzh
# P06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm+qxp4VqpB3MV/h53yl41
# aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUedyz8rNyfQJy/aOs5b4s+
# ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz44MPZ1f9+YEQIQty/NQd/
# 2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBMdlyh2n5HirY4jKnFH/9g
# Rvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFDLrkpr/NZZILyhA
# QnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritUpimqF6TNDDAOBgNVHQ8B
# Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcD
# AzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsGA1UdHwREMEIwQKA+oDyG
# Omh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5n
# Um9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsGAQUFBzAChjpodHRwOi8v
# Y3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RSNDYu
# cDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG
# 9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURhw1aVcdGRP4Wh60BAscjW
# 4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0ZdOaWTsyNyBBsMLHqafvIh
# rCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajjcw5+w/KeFvPYfLF/ldYp
# mlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNcWbWDRF/3sBp6fWXhz7Dc
# ML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalOhOfCipnx8CaLZeVme5yE
# Lg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJszkyeiaerlphwoKx1uHRz
# NyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z76mKnzAfZxCl/3dq3dUNw
# 4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5JKdGvspbOrTfOXyXvmPL6
# E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHHj95Ejza63zdrEcxWLDX6
# xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2Bev6SivBBOHY+uqiirZt
# g0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/L9Uo2bC5a4CH2RwwggZZ
# MIIEwaADAgECAhANIM3qwHRbWKHw+Zq6JhzlMA0GCSqGSIb3DQEBDAUAMFQxCzAJ
# BgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNl
# Y3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjExMDIyMDAwMDAw
# WhcNMjQxMDIxMjM1OTU5WjBdMQswCQYDVQQGEwJESzEUMBIGA1UECAwLSG92ZWRz
# dGFkZW4xGzAZBgNVBAoMEkZyZWRkeSBLcmlzdGlhbnNlbjEbMBkGA1UEAwwSRnJl
# ZGR5IEtyaXN0aWFuc2VuMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# gYC5tlg+VRktRRkahxxaV8+DAd6vHoDpcO6w7yT24lnSoMuA6nR7kgy90Y/sHIwK
# E9Wwt/px/GAY8eBePWjJrFpG8fBtJbXadRTVd/470Hs/q9t+kh6A/0ELj7wYsKSN
# OyuFPoy4rtClOv9ZmrRpoDVnh8Epwg2DpklX2BNzykzBQxIbkpp+xVo2mhPNWDIe
# sntc4/BnSebLGw1Vkxmu2acKkIjYrne/7lsuyL9ue0vk8TGk9JBPNPbGKJvHu9sz
# P9oGoH36fU1sEZ+AacXrp+onsyPf/hkkpAMHAhzQHl+5Ikvcus/cDm06twm7Vywm
# Zcas2rFAV5MyE6WMEaYAolwAHiPz9WAs2GDhFtZZg1tzbRjJIIgPpR+doTIcpcDB
# cHnNdSdgWKrTkr2f339oT5bnJfo7oVzc/2HGWvb8Fom6LQAqSC11vWmznHYsCm72
# g+foTKqW8lLDfLF0+aFvToLosrtW9l6Z+l+RQ8MtJ9EHOm2Ny8cFLzZCDZYw32By
# dwcLV5rKdy4Ica9on5xZvyMOLiFwuL4v2V4pjEgKJaGSS/IVSMEGjrM9DHT6YS4/
# oq9q20rQUmMZZQmGmEyyKQ8t11si8VHtScN5m0Li8peoWfCU9mRFxSESwTWow8d4
# 62+o9/SzmDxCACdFwzvfKx4JqDMm55cL+beunIvc0NsCAwEAAaOCAZwwggGYMB8G
# A1UdIwQYMBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0GA1UdDgQWBBTZD6uy9ZWI
# IqQh3srYu1FlUhdM0TAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNV
# HSUEDDAKBggrBgEFBQcDAzARBglghkgBhvhCAQEEBAMCBBAwSgYDVR0gBEMwQTA1
# BgwrBgEEAbIxAQIBAwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNv
# bS9DUFMwCAYGZ4EMAQQBMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2Vj
# dGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsG
# AQUFBwEBBG0wazBEBggrBgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9T
# ZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0
# dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQASEbZACurQ
# eQN8WDTR+YyNpoQ29YAbbdBRhhzHkT/1ao7LE0QIOgGR4GwKRzufCAwu8pCBiMOU
# TDHTezkh0rQrG6khxBX2nSTBL5i4LwKMR08HgZBsbECciABy15yexYWoB/D0H8Wu
# Ge63PhGWueR4IFPbIz+jEVxfW0Nyyr7bXTecpKd1iprm+TOmzc2E6ab95dkcXdJV
# x6Zys++QrrOfQ+a57qEXkS/wnjjbN9hukL0zg+g8L4DHLKTodzfiQOampvV8Qzbn
# B7Y8YjNcxR9s/nptnlQH3jorNFhktiBXvD62jc8pAIg6wyH6NxSMjtTsn7QhkIp2
# kuswIQwD8hN/fZ/m6gkXZhRJWFr2WRZOz+edZ62Jf25C/NYWscwfBwn2hzRZf1Hg
# yxkXAl88dvvUA3kw1T6uo8aAB9IcL6Owiy7q4T+RLRF7oqx0vcw0193Yhq/gPOaU
# FlqzExP6TQ5TR9XWVPQk+a1B1ATKMLi1JShO6KWTmNkFkgkgpkW69BEwggauMIIE
# lqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
# BAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp
# Y2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0y
# MjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYD
# VQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBH
# NCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJt
# oLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR
# 8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp
# 09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43
# IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+
# 149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1bicl
# kJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO
# 30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+Drhk
# Kvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIw
# pUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+
# 9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TN
# sQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZ
# bU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4c
# D08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUF
# BwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEG
# CCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
# cnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAX
# MAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCT
# tm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+
# YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3
# +3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8
# dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5
# mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHx
# cpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMk
# zdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j
# /R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8g
# Fk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6
# gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6
# wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIGwjCCBKqgAwIBAgIQBUSv85Sd
# CDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UE
# ChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQg
# UlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAwMDAwMFoX
# DTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0
# LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X5dLnXaEO
# CdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uUUI8cIOrH
# mjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa2mq62DvK
# Xd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgtXkV1lnX+
# 3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60pCFkcOvV
# 5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17cz4y7lI0
# +9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BYQfvYsSzh
# Ua+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9c33u3Qr/
# eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw9/sqhux7
# UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2ckpMEtGlw
# Jw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhRB8qUt+JQ
# ofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/
# BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEE
# AjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8w
# HQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEwT6BNoEuG
# SWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQw
# OTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQG
# CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKG
# TGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJT
# QTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIB
# AIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF7SaCinEv
# GN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrCQDifXcig
# LiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFcjGnRuSvE
# xnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8wWkZus8W
# 8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbFKNOt50MA
# cN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP4xeR0arA
# VeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VPNTwAvb6c
# Kmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvrmoI1VygW
# y2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2obhDLN9O
# TH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJuEbTbDJ8
# WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMYIGPjCCBjoCAQEwaDBU
# MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQD
# EyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2AhANIM3qwHRbWKHw
# +Zq6JhzlMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKEC
# gAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwG
# CisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAHhOS2oeFqXdNPc9zsIVqWrT/8s
# ku6fv4yEyj9jDRfOMA0GCSqGSIb3DQEBAQUABIICAG2ElFPaUwgKwuozK27jAnKg
# 88So2LMxsdnzQPoagXdqOtBUngL9Ls1Py0zW31t0ILWPIPNeN5lg46x6YcvdtgRJ
# 898S7CVoqV0JQuepc42n55+uiF4kpGO7YnXeK5QtldtcXnYTouSG7FfheSXU31FL
# jkWveDmsbj33DjKu3qoNuuq4nufIGWp80Gz3KtE6bKwogNozI7pDB1dsrO7u9Phg
# YqS1WjZU4BQvVTqH4dWRdmSVPzGCols5SpHXWg+IKVrAyzYae32jqFvrWaGjOOx5
# 8VpJb88DtnkTnYEu6wTJYBxQhAJvintA/21qbZ5OwoGsKA0plZeIsLFE5k6UfSJk
# gA5NIeBCehnVDXrBF/RWF2fRq4afzpbZgCFkrW/V6w8HouO1XOId+nWxiyWTIRV5
# Q5yyDVGf3kk0Bk9CWAsxzgxfAUecLpdOIZIgb2F2k0771oap7KzpM8RqMLuYWrfF
# dxboG4YtYsUE19wVpjUjoh974UzpfukF4ohyUc6k4t/Wv7F4RsTLMAaGkklSPLb6
# vebc+ERr2wrOxNBVW+wljQsTqGB9YDk5Vq42eqayT/IWwEBXb2027eQx2peIkm78
# 67mD3a5XcmdNBN+gQkk7w7HJBEXjIiFVFBZnzLbpq5ldK3NTPNXFO+fWX0JL5fmf
# orj6voCC08/ppUp1IgWOoYIDIDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcw
# YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD
# EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu
# ZyBDQQIQBUSv85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3
# DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI0MDMxMzEyNTMzM1ow
# LwYJKoZIhvcNAQkEMSIEICOAu2rtsZHHjZcNmbsalSV6hmEZshLTdLvaDIPTrjSt
# MA0GCSqGSIb3DQEBAQUABIICADHDukmo2Pq707OuYV/+8cwoejRt8W7c16iSvpO4
# 8sKBQO5F1IeWX9+Z4L/5UB6Cx9CIRvfbDqbprDLVDkRg+ZDxZlmcGGRbgOHlkKag
# wOE+WLV0LusRikc3mj1jN5k8n6S8o3gcl/+aqfnkzoJywnY7x49uk1wJIJ4yrDh7
# EB8i+yR2EGTSFgUbPER+PeNRsak60tX4OjpWwUFJkY2xHIL+o09NDX0dJfe3Z9Td
# 6IOCPoNPGNsBoSEbe2VbvllegiZ+Mv3XDfKQXzGnTrbu9XtQRxxEDqlbQc/fpR8B
# Qq7mS4QIhjpQS5zgrpUZikQI1mPB1bvJ+OzBKsJA0WEVqcvPPaCjqsrsv3XRtjJc
# tSyUPLASn5Lr95Ed64vH11FJes2OvwHP+X5qJqkk5TDmAJ5NrMSTS321/Q7a26cb
# HxLDaCS6Asj9KsED1hZrH49oJQ6fJQJo4gY1FBCJr+K0WdkkMj22cjUO3WkBRoLN
# VFsE0rPPQWkMQYaSJzvpPjpzqUbMkRNLp2FqsfwG4BHrIKHibRg3bu1CHYd2V/NR
# /DsdmYOjNpDoin2exsP2Hv0Ujbi5ufv4iM8p/F6qOQfQRQzVn6+o17D8SkXwSeQM
# 0N2ROiRT67gapoxoHppQB3UXe0oWTmUv+qBop9IojDmxnApGMQqm+52mrYBwygsD
# k47J
# SIG # End signature block