DSCResources/VE_XD7StoreFrontStore/VE_XD7StoreFrontStore.psm1
<#
=========================================================================== Created with: SAPIEN Technologies, Inc., PowerShell Studio 2019 v5.6.157 Created on: 2/8/2019 12:12 PM Created by: CERBDM Organization: Filename: VE_XD7StoreFrontStore.psm1 ------------------------------------------------------------------------- Module Name: VE_XD7StoreFrontStore =========================================================================== #> #TODO: Test switching auth - See TODOs below Import-LocalizedData -BindingVariable localizedData -FileName VE_XD7StoreFrontStore.Resources.psd1; function Get-TargetResource { [CmdletBinding()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCUseVerboseMessageInDSCResource', '')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingEmptyCatchBlock', '')] [OutputType([System.Collections.Hashtable])] param ( [Parameter(Mandatory = $true)] [System.String] $StoreName, [Parameter(Mandatory = $true)] [ValidateSet('Explicit','Anonymous')] [System.String] $AuthType, [Parameter(Mandatory = $true)] [System.String[]] $Servers ) process { Import-Module Citrix.StoreFront -ErrorAction Stop -Verbose:$false; $StoreService = Get-STFStoreService -Verbose | Where-Object { $_.friendlyname -eq $StoreName }; if ($StoreService) { ## This is a hack, as Get-STFStoreFarm throws an error if run twice in quick succession?! $null = Get-STFStoreFarm -StoreService $StoreService -Verbose -OutVariable StoreFarm } switch ($StoreService.service.Anonymous) { $True { $CurrentAuthType = 'Anonymous' } $False { $CurrentAuthType = 'Explicit' } } $targetResource = @{ StoreName = $StoreService.FriendlyName FarmName = $StoreFarm.FarmName Port = $StoreFarm.Port TransportType = $StoreFarm.TransportType Servers = [System.String[]]$StoreFarm.Servers LoadBalance = $StoreFarm.LoadBalance FarmType = $StoreFarm.FarmType AuthType = $CurrentAuthType AuthVirtualPath = $StoreService.AuthenticationServiceVirtualPath StoreVirtualPath = $StoreService.VirtualPath SiteId = $StoreService.SiteId ServiceUrls = [System.String[]]$StoreFarm.ServiceUrls SSLRelayPort = $StoreFarm.SSLRelayPort AllFailedBypassDuration = $StoreFarm.AllFailedBypassDuration BypassDuration = $StoreFarm.BypassDuration Zones = $StoreFarm.Zones LockedDown = $storeservice.service.LockedDown }; return $targetResource; } #end process } #end function Get-TargetResource function Test-TargetResource { [CmdletBinding()] [OutputType([System.Boolean])] param ( [Parameter(Mandatory = $true)] [System.String] $StoreName, [Parameter(Mandatory = $true)] [ValidateSet("Explicit","Anonymous")] [System.String] $AuthType, [Parameter(Mandatory = $true)] [System.String[]] $Servers, [Parameter()] [System.String] $FarmName, [Parameter()] [System.UInt32] $Port, [Parameter()] [ValidateSet('HTTP','HTTPS','SSL')] [System.String] $TransportType, [Parameter()] [System.Boolean] $LoadBalance, [Parameter()] [ValidateSet('XenApp','XenDesktop','AppController')] [System.String] $FarmType, [Parameter()] [System.String] $AuthVirtualPath = "/Citrix/$($StoreName)auth", [Parameter()] [System.String] $StoreVirtualPath = "/Citrix/$($StoreName)", [Parameter()] [System.UInt64] $SiteId = 1, [Parameter()] [System.String[]] $ServiceUrls, [Parameter()] [System.UInt32] $SSLRelayPort, [Parameter()] [System.UInt32] $AllFailedBypassDuration, [Parameter()] [System.UInt32] $BypassDuration, [Parameter()] [System.String[]] $Zones, [Parameter()] [System.Boolean] $LockedDown, [Parameter()] [ValidateSet('Present','Absent')] [System.String] $Ensure = 'Present' ) process { $targetResource = Get-TargetResource -StoreName $StoreName -AuthType $AuthType -Servers $Servers if ($Ensure -eq 'Present') { $inCompliance = $true; foreach ($property in $PSBoundParameters.Keys) { if ($targetResource.ContainsKey($property)) { $expected = $PSBoundParameters[$property]; $actual = $targetResource[$property]; if ($PSBoundParameters[$property] -is [System.String[]]) { if ($actual) { if (Compare-Object -ReferenceObject $expected -DifferenceObject $actual -ErrorAction silentlycontinue) { Write-Verbose ($localizedData.ResourcePropertyMismatch -f $property, ($expected -join ','), ($actual -join ',')); $inCompliance = $false; } } else { Write-Verbose ($localizedData.ResourcePropertyMismatch -f $property, ($expected -join ','), ($actual -join ',')); $inCompliance = $false; } } elseif ($expected -ne $actual) { Write-Verbose ($localizedData.ResourcePropertyMismatch -f $property, $expected, $actual); $inCompliance = $false; } } } } else { if ($targetResource.StoreName) { $inCompliance = $false } else { $inCompliance = $true } } if ($inCompliance) { Write-Verbose ($localizedData.ResourceInDesiredState -f $DeliveryGroup); } else { Write-Verbose ($localizedData.ResourceNotInDesiredState -f $DeliveryGroup); } return $inCompliance; } #end process } #end function Test-TargetResource function Set-TargetResource { [CmdletBinding()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingEmptyCatchBlock', '')] param ( [Parameter(Mandatory = $true)] [System.String] $StoreName, [Parameter(Mandatory = $true)] [ValidateSet('Explicit','Anonymous')] [System.String] $AuthType, [Parameter(Mandatory = $true)] [System.String[]] $Servers, [Parameter()] [System.String] $FarmName, [Parameter()] [System.UInt32] $Port, [Parameter()] [ValidateSet('HTTP','HTTPS','SSL')] [System.String] $TransportType, [parameter()] [System.Boolean] $LoadBalance, [Parameter()] [ValidateSet('XenApp','XenDesktop','AppController')] [System.String] $FarmType, [Parameter()] [System.String] $AuthVirtualPath = "/Citrix/$($StoreName)auth", [Parameter()] [System.String] $StoreVirtualPath = "/Citrix/$($StoreName)", [Parameter()] [System.UInt64] $SiteId = 1, [Parameter()] [System.String[]] $ServiceUrls, [Parameter()] [System.UInt32] $SSLRelayPort, [Parameter()] [System.UInt32] $AllFailedBypassDuration, [Parameter()] [System.UInt32] $BypassDuration, [Parameter()] [System.String[]] $Zones, [Parameter()] [System.Boolean] $LockedDown, [Parameter()] [ValidateSet('Present','Absent')] [System.String] $Ensure = 'Present' ) process { Import-Module Citrix.StoreFront -ErrorAction Stop -Verbose:$false $StoreService = Get-STFStoreService | Where-Object { $_.friendlyname -eq $StoreName } if ($StoreService) { ## This is a hack, as Get-STFStoreFarm throws an error if run twice in quick succession?! $null = Get-STFStoreFarm -StoreService $StoreService -Verbose -OutVariable StoreFarm } if ($Ensure -eq 'Present') { #Region Create Params hashtable $AllParams = @{} $ChangedParams = @{} $targetResource = Get-TargetResource -StoreName $StoreName -AuthType $AuthType -Servers $Servers foreach ($property in $PSBoundParameters.Keys) { if ($targetResource.ContainsKey($property)) { if (!($AllParams.ContainsKey($property))) { $AllParams.Add($property, $PSBoundParameters[$property]) } $expected = $PSBoundParameters[$property]; $actual = $targetResource[$property]; if ($PSBoundParameters[$property] -is [System.String[]]) { if ($actual) { if (Compare-Object -ReferenceObject $expected -DifferenceObject $actual) { if (!($ChangedParams.ContainsKey($property))) { Write-Verbose -Message ($localizedData.SettingResourceProperty -f $property) $ChangedParams.Add($property, $PSBoundParameters[$property]) } } } Else { Write-Verbose -Message ($localizedData.SettingResourceProperty -f $property) $ChangedParams.Add($property, $PSBoundParameters[$property]) } } elseif ($expected -ne $actual) { if (!($ChangedParams.ContainsKey($property))) { Write-Verbose -Message ($localizedData.SettingResourceProperty -f $property) $ChangedParams.Add($property, $PSBoundParameters[$property]) } } } } $AllParams.Remove('StoreName') $ChangedParams.Remove('StoreName') $AllParams.Remove('LockedDown') if ($FarmName.Length -gt 0) { $FarmNameParam = $FarmName } elseif ($StoreFarm.FarmName.length -gt 0) { $FarmNameParam = $StoreFarm.FarmName } else { $FarmNameParam = "$($StoreName)farm" } if (!($AllParams.ContainsKey('FarmName'))) { $AllParams.Add('FarmName', $FarmNameParam) } if (!($ChangedParams.ContainsKey('FarmName'))) { $ChangedParams.Add('FarmName', $FarmNameParam) } #endregion #Region Check for Authentication service - create if needed $AllParams.Remove('AuthType') if ($AuthType -eq 'Anonymous') { $AllParams.Add('Anonymous', $true) $ChangedAuth = 'Anonymous' } else { $Auth = Get-STFAuthenticationService -VirtualPath $AuthVirtualPath -SiteID $SiteId if ($Auth.VirtualPath -ne $AuthVirtualPath) { Write-Verbose -Message $localizedData.RunningAddSTFAuthenicationService $Auth = Add-STFAuthenticationService -VirtualPath $AuthVirtualPath -SiteID $SiteId -confirm:$false } $AllParams.Add('AuthenticationService', $Auth) $ChangedAuth = $Auth } #endregion #Region Add Servers value if not exist if (!($ChangedParams.ContainsKey('Servers'))) { $ChangedParams.Add('Servers', $Servers) } #endregion if ($StoreService.friendlyName -eq $StoreName) { if ($ChangedParams.ContainsKey('AuthType')) { $ChangedParams.Remove('AuthType') if ($ChangedAuth -eq 'Anonymous') { $Auth = Get-STFAuthenticationService -VirtualPath $StoreService.AuthenticationServiceVirtualPath -SiteID $StoreService.SiteId if ($Auth) { #TODO: What do you do here? The following doesn't work since it's in use #Write-Verbose "Running Remove-STFAuthenticationService" #$Auth | Remove-STFAuthenticationService -confirm:$false } } else { #TODO: Fix this. It gets following error #set-stfstoreservice : An error occurred while updating the Store service: # System.NullReferenceException: Object reference not set to an instance of an object. # at #Citrix.StoreFront.Model.Store.StoreService.Citrix.StoreFront.Model.IAuthenticatedService.RemoveAuthenticationService(AuthenticationServiceauthenticationService) # at Citrix.StoreFront.Stores.Cmdlets.SetStoreService.ProcessRecord(). #At line:1 char:1 #Write-Verbose "Running Set-STFStoreService" #Set-STFStoreService -StoreService $StoreService -AuthenticationService $Auth -Confirm:$false } } if ($ChangedParams.ContainsKey('LockedDown')) { Write-Verbose -Message $localizedData.RunningSetSTFStoreService Set-STFStoreService -StoreService $StoreService -LockedDown $LockedDown -confirm:$false $ChangedParams.Remove('LockedDown') } if ($StoreFarm) { #update params $ChangedParams.Add('StoreService', $StoreService) #Update settings Write-Verbose -Message $localizedData.RunningSetSTFStoreFarm Set-STFStoreFarm @ChangedParams -confirm:$false } else { #update params $KeysToRemove = 'AuthenticationService','Anonymous' $KeysToRemove | ForEach-Object { $AllParams.Remove($_) } #Create farm Write-Verbose -Message $localizedData.RunningNewSTFStoreFarm New-STFStoreFarm @AllParams -confirm:$false #Add farm to storeservice Write-Verbose -Message $localizedData.RunningAddSTFStoreFarm $StoreService = Get-STFStoreService | Where-Object { $_.friendlyname -eq $StoreName } Add-STFStoreFarm -Farm $AllParams.FarmName -StoreService $StoreService } } else { #update params $AllParams.Add('FriendlyName', $StoreName) $AllParams.Add('VirtualPath', $StoreVirtualPath) $AllParams.Add('SiteId', $SiteId) #Create Write-Verbose -Message $localizedData.RunningAddSTFStoreService Add-STFStoreService @AllParams -confirm:$false if ($ChangedParams.ContainsKey('LockedDown')) { #This setting isn't available to be set via the Add-STFStoreService Write-Verbose -Message $localizedData.RunningSetSTFStoreFarmLockedDown $StoreService = Get-STFStoreService | Where-Object { $_.friendlyname -eq $StoreName } Set-STFStoreService -StoreService $StoreService -LockedDown $LockedDown -confirm:$false } } } else { #Uninstall Write-Verbose -Message $localizedData.RunningRemoveSTFStoreService $AuthVirtPath = $StoreService.AuthenticationServiceVirtualPath $SiteId = $StoreService.SiteId $StoreService | Remove-STFStoreService -confirm:$false Write-Verbose -Message ($localizedData.RunningGetSTFAuthenticationService -f $AuthVirtPath) $Auth = Get-STFAuthenticationService -VirtualPath $AuthVirtPath -SiteID $SiteId if ($Auth) { Write-Verbose -Message $localizedData.RunningRemoveSTFAuthenicationService $Auth | Remove-STFAuthenticationService -confirm:$false } } } #end process } #end function Set-TargetResource Export-ModuleMember -Function *-TargetResource; # SIG # Begin signature block # MIIX1gYJKoZIhvcNAQcCoIIXxzCCF8MCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUbvXQH4wH9cU/IgmDPlLHD5EH # lWOgghMJMIID7jCCA1egAwIBAgIQfpPr+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 # ggUwMIIEGKADAgECAhAECRgbX9W7ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9v # dCBDQTAeFw0xMzEwMjIxMjAwMDBaFw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYT # AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy # dC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNp # Z25pbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4R # r2d3B9MLMUkZz9D7RZmxOttE9X/lqJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrw # nIal2CWsDnkoOn7p0WfTxvspJ8fTeyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnC # wlLyFGeKiUXULaGj6YgsIJWuHEqHCN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8 # y5Kh5TsxHM/q8grkV7tKtel05iv+bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM # 0SAlI+sIZD5SlsHyDxL0xY4PwaLoLFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6f # pjOp/RnfJZPRAgMBAAGjggHNMIIByTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1Ud # DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGsw # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcw # AoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElE # Um9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNl # cnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDov # L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBP # BgNVHSAESDBGMDgGCmCGSAGG/WwAAgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93 # d3cuZGlnaWNlcnQuY29tL0NQUzAKBghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoK # o6XqcQPAYPkt9mV1DlgwHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8w # DQYJKoZIhvcNAQELBQADggEBAD7sDVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+ # C2D9wz0PxK+L/e8q3yBVN7Dh9tGSdQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119E # efM2FAaK95xGTlz/kLEbBw6RFfu6r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR # 4pwUR6F6aGivm6dcIFzZcbEMj7uo+MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4v # cn4c10lFluhZHen6dGRrsutmQ9qzsIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwH # gfqL2vmCSfdibqFT+hKUGIUukpHqaGxEMrJmoecYpJpkUe8wggU4MIIEIKADAgEC # AhAPxQCJrE9ObGzkCRS7EwyyMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVT # MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j # b20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25p # bmcgQ0EwHhcNMTcwNTI2MDAwMDAwWhcNMTkwOTI3MTIwMDAwWjB1MQswCQYDVQQG # EwJHQjETMBEGA1UECBMKR2Fyc2luZ3RvbjEPMA0GA1UEBxMGT3hmb3JkMR8wHQYD # VQQKExZWaXJ0dWFsIEVuZ2luZSBMaW1pdGVkMR8wHQYDVQQDExZWaXJ0dWFsIEVu # Z2luZSBMaW1pdGVkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnB1O # DV2jw/aMIUWnD9f9RCbAoiJ8LQcznYo42P22YEi6g7QY+kKmAzGgEhbsE4UVuGWS # el4y6FxGWq51SK5P/gqgZgzyP8FkIUzLxsCrtx9OBnsPPeL+/An5CpcsKsl2lCSz # NMwcz16hjcE0vCLio1NOcwvfO65qdNT2gRIEnIYhRX88dG3V30BH2aKWG5X9t1IW # RmozjZ8I7iLEoWFJWQSuICSGyvyiPqnXF3nxdroE8O4fc1U90x5qefX0RlwKeq47 # UFuI0Y/59pB3/jss5BYvAXp3g+6EKlDwgW1a/MLVsLQbdzlALFUv5YxEqkXA8IEM # xpwgBjm117SmyZ98QQIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoKo6Xq # cQPAYPkt9mV1DlgwHQYDVR0OBBYEFL5NkOqMm0S8AyuXI1EZIdoK9DD/MA4GA1Ud # DwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWgM6Ax # hi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNy # bDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1j # cy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcCARYc # aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsGAQUF # BwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME4G # CCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRT # SEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADANBgkq # hkiG9w0BAQsFAAOCAQEAQC8qzSz1bIoEqbjDx3VtYDjtUjuFEVDFYi9+vREl6jM+ # iqOiNiwCXUkbxGTuDrWW9I1YOn8a7SCCYapZ+T0G3RMa+rQHXFYKbYTmXC3C41Cd # MQzZn4wTuGRNQLTgNSuclwMnNmFVe7K5S/0Dv+GaLSKuRLAxpcPxeTtmRZIIBXF7 # wwRS0+V28jB9VyeSOdqsPIFYf5GSfu7KcIhmNQ/DUroulaS5JIrPUhwkf1LZMm0B # /0adpaPbFy95M1emij96rrgy2hX8N/FrWBh13/81V6NO3b8mhCfjqb632dG4EUTi # FXDvqP2hpWw0nO/pFZsMsEK88eiV93XDDEG/MjAApzGCBDcwggQzAgEBMIGGMHIx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJ # RCBDb2RlIFNpZ25pbmcgQ0ECEA/FAImsT05sbOQJFLsTDLIwCQYFKw4DAhoFAKB4 # MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQB # gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkE # MRYEFB4nFBdrC0ZbbqrP4dU7JXpJZOT1MA0GCSqGSIb3DQEBAQUABIIBAAITah/o # TsRqregXN6jHXB4rBUH4WEwaJ0OL7rauE/b3XYibJnL5iCimDMXJF4iI9QMkTmyQ # q5J5MthKrTa4a0+dJKj+HjSjPDwp+zSXcGYSccdrKibcJHRs+ttbg9EoqOYRyYtr # YHCkwj0Np5OW7Ry5tUgFqnRsjZtvj/cd/hgu+JGrdnf8fs6lIGJ8BthsUoK7JUxN # cMr35kCRWyn+SeCBt2yZw+taE+xUp9NB3tH5BgU0+AbKuTCqblI7Cm5AbmjGeVIF # bzTbuvgmnAZANd+iPh6h92GUYCM/NPjqiMrsZ1izepqhhYF4/g49E4wMJpO8pjms # RbOLfr8ts1UuzIqhggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQsw # CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNV # BAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0 # OMj+vzVuBNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3 # DQEHATAcBgkqhkiG9w0BCQUxDxcNMTkwNDEzMTgzMTI1WjAjBgkqhkiG9w0BCQQx # FgQUFc0xqYl1bmkUYz58YSh1bbprGZwwDQYJKoZIhvcNAQEBBQAEggEAPg0GKbbx # rFtH35vZG6YuTqjDCyryHmWa2WS0r9w/eZUGd/gtltmsrJhrPkywOBsdbnKPT/+S # UBaLwj1xgWc3aWcc/i5UlUshVwozcHZKZMW3WX3G5yoeRwPXBEE82HT595v4PxtE # +uvcpXha95Nzjack13PCgelbwVhZYor+ZCIRVXQoUtwysUnjuVBOph5EiqX7UGpW # IzEkqXtnAJZBWixsKfU2VU4udE+gldh3zdgzcJAB04mW8dgPtpIsbzrmwa52m2gh # llPyl/vUKHodu8RGwqHNWHPjT9jwATy+KH5KxPw3TC8RNNBYv+8397uZwImiB4sd # hJfdYdRCeI3lDA== # SIG # End signature block |