' Windows Installer utility to list registered products and product info
' For use with Windows Scripting Host, CScript.exe or WScript.exe
' Copyright (c) Microsoft Corporation. All rights reserved.
' Demonstrates the use of the product enumeration and ProductInfo methods and underlying APIs
'
Option Explicit

Const msiInstallStateNotUsed      = -7
Const msiInstallStateBadConfig    = -6
Const msiInstallStateIncomplete   = -5
Const msiInstallStateSourceAbsent = -4
Const msiInstallStateInvalidArg   = -2
Const msiInstallStateUnknown      = -1
Const msiInstallStateBroken       =  0
Const msiInstallStateAdvertised   =  1
Const msiInstallStateRemoved      =  1
Const msiInstallStateAbsent       =  2
Const msiInstallStateLocal        =  3
Const msiInstallStateSource       =  4
Const msiInstallStateDefault      =  5

' Connect to Windows Installer object
On Error Resume Next
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError

' If no arguments supplied, then list all installed or advertised products
Dim argCount:argCount = Wscript.Arguments.Count
If (argCount = 0) Then
	Dim product, products, info, productList, version
	On Error Resume Next
	Set products = installer.Products : CheckError
	For Each product In products
		version = DecodeVersion(installer.ProductInfo(product, "Version")) : CheckError
		info = product & " = " & installer.ProductInfo(product, "ProductName") & " " & version : CheckError
		If productList <> Empty Then productList = productList & vbNewLine & info Else productList = info
	Next
	If productList = Empty Then productList = "No products installed or advertised"
	Wscript.Echo productList
	Set products = Nothing
	Wscript.Quit 0
End If

' Check for ?, and show help message if found
Dim productName:productName = Wscript.Arguments(0)
If InStr(1, productName, "?", vbTextCompare) > 0 Then
	Wscript.Echo "Windows Installer utility to list registered products and product information" &_
		vbNewLine & " Lists all installed and advertised products if no arguments are specified" &_
		vbNewLine & " Else 1st argument is a product name (case-insensitive) or product ID (GUID)" &_
		vbNewLine & " If 2nd argument is missing or contains 'p', then product properties are listed" &_
		vbNewLine & " If 2nd argument contains 'f', features, parents, & installed states are listed" &_
		vbNewLine & " If 2nd argument contains 'c', installed components for that product are listed" &_
		vbNewLine & " If 2nd argument contains 'd', HKLM ""SharedDlls"" count for key files are listed" &_
		vbNewLine &_
		vbNewLine & "Copyright (C) Microsoft Corporation.  All rights reserved."
	Wscript.Quit 1
End If

' If Product name supplied, need to search for product code
Dim productCode, property, value, message
If Left(productName, 1) = "{" And Right(productName, 1) = "}" Then
	If installer.ProductState(productName) <> msiInstallStateUnknown Then productCode = UCase(productName)
Else
	For Each productCode In installer.Products : CheckError
		If LCase(installer.ProductInfo(productCode, "ProductName")) = LCase(productName) Then Exit For
	Next
End If
If IsEmpty(productCode) Then Wscript.Echo "Product is not registered: " & productName : Wscript.Quit 2

' Check option argument for type of information to display, default is properties
Dim optionFlag : If argcount > 1 Then optionFlag = LCase(Wscript.Arguments(1)) Else optionFlag = "p"
If InStr(1, optionFlag, "*", vbTextCompare) > 0 Then optionFlag = "pfcd"

If InStr(1, optionFlag, "p", vbTextCompare) > 0 Then
	message = "ProductCode = " & productCode
	For Each property In Array(_
			"Language",_
			"ProductName",_
			"PackageCode",_
			"Transforms",_
			"AssignmentType",_
			"PackageName",_
			"InstalledProductName",_
			"VersionString",_
			"RegCompany",_
			"RegOwner",_
			"ProductID",_
			"ProductIcon",_
			"InstallLocation",_
			"InstallSource",_
			"InstallDate",_
			"Publisher",_
			"LocalPackage",_
			"HelpLink",_
			"HelpTelephone",_
			"URLInfoAbout",_
			"URLUpdateInfo") : CheckError
		value = installer.ProductInfo(productCode, property) ': CheckError
		If Err <> 0 Then Err.Clear : value = Empty
		If (property = "Version") Then value = DecodeVersion(value)
		If value <> Empty Then message = message & vbNewLine & property & " = " & value
	Next
	Wscript.Echo message
End If

If InStr(1, optionFlag, "f", vbTextCompare) > 0 Then
	Dim feature, features, parent, state, featureInfo
	Set features = installer.Features(productCode)
	message = "---Features in product " & productCode & "---"
	For Each feature In features
		parent = installer.FeatureParent(productCode, feature) : CheckError
		If Len(parent) Then parent = " {" & parent & "}"
		state = installer.FeatureState(productCode, feature)
		Select Case(state)
			Case msiInstallStateBadConfig:    state = "Corrupt"
			Case msiInstallStateIncomplete:   state = "InProgress"
			Case msiInstallStateSourceAbsent: state = "SourceAbsent"
			Case msiInstallStateBroken:       state = "Broken"
			Case msiInstallStateAdvertised:   state = "Advertised"
			Case msiInstallStateAbsent:       state = "Uninstalled"
			Case msiInstallStateLocal:        state = "Local"
			Case msiInstallStateSource:       state = "Source"
			Case msiInstallStateDefault:      state = "Default"
			Case Else:                        state = "Unknown"
		End Select
		message = message & vbNewLine & feature & parent & " = " & state
	Next
	Set features = Nothing
	Wscript.Echo message
End If 

If InStr(1, optionFlag, "c", vbTextCompare) > 0 Then
	Dim component, components, client, clients, path
	Set components = installer.Components : CheckError
	message = "---Components in product " & productCode & "---"
	For Each component In components
		Set clients = installer.ComponentClients(component) : CheckError
		For Each client In Clients
			If client = productCode Then
				path = installer.ComponentPath(productCode, component) : CheckError
				message = message & vbNewLine & component & " = " & path
				Exit For
			End If
		Next
		Set clients = Nothing
	Next
	Set components = Nothing
	Wscript.Echo message
End If

If InStr(1, optionFlag, "d", vbTextCompare) > 0 Then
	Set components = installer.Components : CheckError
	message = "---Shared DLL counts for key files of " & productCode & "---"
	For Each component In components
		Set clients = installer.ComponentClients(component) : CheckError
		For Each client In Clients
			If client = productCode Then
				path = installer.ComponentPath(productCode, component) : CheckError
				If Len(path) = 0 Then path = "0"
				If AscW(path) >= 65 Then  ' ignore registry key paths
					value = installer.RegistryValue(2, "SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls", path)
					If Err <> 0 Then value = 0 : Err.Clear
					message = message & vbNewLine & value & " = " & path
				End If
				Exit For
			End If
		Next
		Set clients = Nothing
	Next
	Set components = Nothing
	Wscript.Echo message
End If

Function DecodeVersion(version)
	version = CLng(version)
	DecodeVersion = version\65536\256 & "." & (version\65535 MOD 256) & "." & (version Mod 65536)
End Function

Sub CheckError
	Dim message, errRec
	If Err = 0 Then Exit Sub
	message = Err.Source & " " & Hex(Err) & ": " & Err.Description
	If Not installer Is Nothing Then
		Set errRec = installer.LastErrorRecord
		If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText
	End If
	Wscript.Echo message
	Wscript.Quit 2
End Sub

'' SIG '' Begin signature block
'' SIG '' MIIpZQYJKoZIhvcNAQcCoIIpVjCCKVICAQExDzANBglg
'' SIG '' hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
'' SIG '' BgEEAYI3AgEeMCQCAQEEEE7wKRaZJ7VNj+Ws4Q8X66sC
'' SIG '' AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
'' SIG '' +TYCWFk7lUqBMQntWKZoHVk2tbD50YMJse1NdDP1q+Gg
'' SIG '' gg3WMIIGvTCCBKWgAwIBAgITMwAAABxIn4HfobC3dwAA
'' SIG '' AAAAHDANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMC
'' SIG '' VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
'' SIG '' B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
'' SIG '' b3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3Qg
'' SIG '' Q2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMjQw
'' SIG '' ODA4MjEzNjIzWhcNMzUwNjIzMjIwNDAxWjBfMQswCQYD
'' SIG '' VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
'' SIG '' cmF0aW9uMTAwLgYDVQQDEydNaWNyb3NvZnQgV2luZG93
'' SIG '' cyBDb2RlIFNpZ25pbmcgUENBIDIwMjQwggIiMA0GCSqG
'' SIG '' SIb3DQEBAQUAA4ICDwAwggIKAoICAQCafWt9J8F2Ki6u
'' SIG '' 49U0/8wrbe78VPggo/uwZIn0vwdoFyhlOzlfUl0SRj9c
'' SIG '' hbOaeo6bGIuHGMxeegFdABJphI1fME9pbz1OQYTd8Fd9
'' SIG '' B6mDyGBI+T91l39JFw/X741H9RgLVxK4ifMOwCzWlRJv
'' SIG '' UbOHjwNGbGB2gm1OZAVCUA17++oWnznEIHRQgNyN82LX
'' SIG '' 819rzsMfO7gzmgrsijkWYofXN803/kywuUGC8oVTAZw1
'' SIG '' xBwzq72sPdg0siKqXYEVqbn86gxctXoFY5KF2YW/vaWf
'' SIG '' YXlMzV014TqF83sYemMwC+H5QVpvgXNYUMhEnpxLwSc5
'' SIG '' 1ftubt4e+444DFGOOPll0OLvanXQ3v1OUngGikb74m5o
'' SIG '' uM+0EaS72bJWtAj4jlBs9NA6ObH5AtBMJbEs3zN/vAPa
'' SIG '' 7MhVToFg1T87ffDiT9hKGhDqvBhPRgqDdou/+AthQsH3
'' SIG '' 9QUgkyVmTtVnK9jLXiROlMRlfooQPJzedWDyg9nWBqHs
'' SIG '' K170cwv9R6FHkr5WX9Jn/RhxLb75GyVUUaOjwX9Jnebf
'' SIG '' O1W9ZjP3yKdXsqcmsZl5IKXAcLspbDqtpElTiecAT6Gh
'' SIG '' LLCZHjHCpxLrrvvlCnQx5UtA7bGIzdEJzrnL03UrHb4c
'' SIG '' yjkoyRd11aq/X9gveOS10+a8SiB1CBAwXDWFOgSgwx+q
'' SIG '' 36SjjgkopQIDAQABo4IBRjCCAUIwDgYDVR0PAQH/BAQD
'' SIG '' AgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBQe
'' SIG '' gt8O14yz1wI0gw7aq61lua+47DAZBgkrBgEEAYI3FAIE
'' SIG '' DB4KAFMAdQBiAEMAQTAPBgNVHRMBAf8EBTADAQH/MB8G
'' SIG '' A1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYG
'' SIG '' A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9z
'' SIG '' b2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0Nl
'' SIG '' ckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQRO
'' SIG '' MEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9z
'' SIG '' b2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIw
'' SIG '' MTAtMDYtMjMuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBD
'' SIG '' X/jfP7vplIw7XPW7aAOdkQXNF1Q0gTEATKsbueoVxwcL
'' SIG '' nLVFrNVwagwzCBQh7vXOmP1BfkzfBCII57owKSmJhz+H
'' SIG '' +BDNwEUppc66ReaMzicdAQORVL9Y5qXX/9mW6qbwsZcb
'' SIG '' /xtUeCo60ppqjx87OooMN2+0U24+wcSEvHziJMGFkIQd
'' SIG '' ny45YPtx0qwxjxSIaSCVlWpjCEe2u9jhqJ43X+Oa7KcK
'' SIG '' iB7sp2VOGr8va7gf0YYW8JvnzG/ATHnCGk5pKIcfxGWe
'' SIG '' RjVnDeqE2FtxtgTNwd2M51pJfbeLIT+tHzLnvtpLHRxl
'' SIG '' khPBFU3UphlHY9I61HOOpRlRSSEhd/zMXMZ5TXj9Socq
'' SIG '' /mc0+BLbPyO5rn6Wi5y2pczEdsyLoRjgFlrMHrG47Rc5
'' SIG '' FVBYA0dklvdNyNFypWzxAOqvHqRxifa6MYfOZ7BCnATV
'' SIG '' MOEnKevCgqkqRQWiosldbJHfpfFOdFjXjzG/Qc89DnwE
'' SIG '' mpfL+bEBvg1tNZDfiPkSlCGzOSOdMCY4h8pkBTQ7G6Gx
'' SIG '' cfSPeZghBD1O31Gd1U/xzlFW5Jl+5bSAv3kALuRjvH7v
'' SIG '' nHhEzMm726MVDOHWDQvj86KFMX5gtA7ikcAdtW1/fmnL
'' SIG '' iAZMSJuBHdztfcNVS6AO1DTlLie8+jUNlv/qu3J3zj5d
'' SIG '' kFS+KpYAm5VE9r5kKZZVdzCCBxEwggT5oAMCAQICEzMA
'' SIG '' AACHvIJuhaGuU6gAAAAAAIcwDQYJKoZIhvcNAQEMBQAw
'' SIG '' XzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m
'' SIG '' dCBDb3Jwb3JhdGlvbjEwMC4GA1UEAxMnTWljcm9zb2Z0
'' SIG '' IFdpbmRvd3MgQ29kZSBTaWduaW5nIFBDQSAyMDI0MB4X
'' SIG '' DTI1MDUwODE4MjQ1NFoXDTI2MDUwNjE4MjQ1NFowdDEL
'' SIG '' MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
'' SIG '' EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
'' SIG '' c29mdCBDb3Jwb3JhdGlvbjEeMBwGA1UEAxMVTWljcm9z
'' SIG '' b2Z0IENvcnBvcmF0aW9uMIICIjANBgkqhkiG9w0BAQEF
'' SIG '' AAOCAg8AMIICCgKCAgEAtCb7zQqvXhNLC7dFnQK7CLbh
'' SIG '' GaW7kyNFtxFTEouj05GNcZ4mYbJvK7BM6/zYKu+x5Jyl
'' SIG '' fBmGDZFcYaacHaEIpYf0dChC12YttkKouIxFLDmIJAxz
'' SIG '' yG51BHEL22htUdoozpnv7hhPQ190QcfT5G4vE2HnNXdo
'' SIG '' g4cxf8aH8qGRz1E7y9j8w2nu53AI40QoRu5As6G0oZHD
'' SIG '' KVGT8mDFyragjAMeDgWHXgRejxn37eGdenK1gJkhBjAn
'' SIG '' F0OxFcVo9Vu0ebDqOE4pVkAUKfcmMrymFDm6YkMFIzWW
'' SIG '' +MAC3mOprJiaIKeywuTesGqy2E24cCSW5ZoWUCIWg/FA
'' SIG '' Abj9N9J1KH1ZBg6iusQv0RJzhCk57BPimkW/CQzgV1kr
'' SIG '' HDTEEke8G19jRfoSv0uHYOjVB869KdJNtMmPC2YNDjzn
'' SIG '' mx4OVnV1KpBRzQeApNmjk+K4bu2GImAXsH1WVxeP1xfw
'' SIG '' XppDCoJ0E6CbxSWCzD2TN7aLDdSFtDsNzct0b8EHxzxk
'' SIG '' NZEqqazpdeCRUyPQjvwmc4WW4HkQfWd3VnF7dUWKbjSA
'' SIG '' JDFpe4A00WMuIFoZIJsxNcdXM9YQPISmSLw9FZjYsKjd
'' SIG '' Rx0Qx59q8sZi4GYC4ZLYeCv4twkfsUoqbTZ2J6TJBNEa
'' SIG '' 3vPa+OTClB8rc9M9MqkrHsvwbCfUYZ076oja1wMtEwcC
'' SIG '' AwEAAaOCAa8wggGrMA4GA1UdDwEB/wQEAwIHgDAfBgNV
'' SIG '' HSUEGDAWBgorBgEEAYI3PQYBBggrBgEFBQcDAzAMBgNV
'' SIG '' HRMBAf8EAjAAMB0GA1UdDgQWBBQmBkeooj1VeFa1e/hy
'' SIG '' jZGQTX+kqDBFBgNVHREEPjA8pDowODEeMBwGA1UECxMV
'' SIG '' TWljcm9zb2Z0IENvcnBvcmF0aW9uMRYwFAYDVQQFEw0y
'' SIG '' MzA4NjUrNTA0NTgxMB8GA1UdIwQYMBaAFB6C3w7XjLPX
'' SIG '' AjSDDtqrrWW5r7jsMGoGA1UdHwRjMGEwX6BdoFuGWWh0
'' SIG '' dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js
'' SIG '' L01pY3Jvc29mdCUyMFdpbmRvd3MlMjBDb2RlJTIwU2ln
'' SIG '' bmluZyUyMFBDQSUyMDIwMjQuY3JsMHcGCCsGAQUFBwEB
'' SIG '' BGswaTBnBggrBgEFBQcwAoZbaHR0cDovL3d3dy5taWNy
'' SIG '' b3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQl
'' SIG '' MjBXaW5kb3dzJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0El
'' SIG '' MjAyMDI0LmNydDANBgkqhkiG9w0BAQwFAAOCAgEAfsvy
'' SIG '' zZE4Anv72F4x8SK0v+9/hU7oLTDhu5f37olRcN6aC2hh
'' SIG '' rXJ+yxebPP4erKM+Ek/NkHmQN8vwA75eVV3jteZkTnBC
'' SIG '' 5BWfJG3c6l058rlqQzk05ueA19l1cMUHxSMWCagYo/Kc
'' SIG '' L5TQAea9yTgTgH3oDmndTbgqD9P2gOYYLuHIt3dIvi2g
'' SIG '' VR5tkZRzOOLItSshIPEbPYP0kD0oo8ETLQ2u07Fps+xd
'' SIG '' SfT/lFd+sjpsEOI3qReYfIRVEqwid8e7RKgNK7ostsgk
'' SIG '' 9eRXGiXZ0N7WfEUVHaAif6cbQyN2MkjCwNl2C7OKh86B
'' SIG '' f0zzzbWlg076+GvqwW1GZufKVfkteI4bZEAKDvtu+f2v
'' SIG '' hEnkUhHj/fh3XtxM9OlNTESrvronEz3w4VIIEl83GgyJ
'' SIG '' p0UuohYxK8iRh4UcmWKDKYQoy5/jwSXufJ7y/x1rj+5A
'' SIG '' jG0iTmM9YIVVP5OXIE2Kqv1dxMsyKNitDLcKFEHGcoJE
'' SIG '' 3QkVL+hLahVm8bSun8jOpmwqEYLNrSnTJfBDeZ0jEV2R
'' SIG '' K7MemxujOwYE4kj+ehf/x73S8hinwEduOzbuP9Z8YHAw
'' SIG '' WVXLwico+hZmCp70BFosW2lxZabwjL2oVBVdW/9RSpNh
'' SIG '' BeJ7TEnAo8kylF0k7fHIJlX0vBQdWJGZuyLAowZLmhlm
'' SIG '' xmQSypcC8rO8KRYarzsxghrnMIIa4wIBATB2MF8xCzAJ
'' SIG '' BgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
'' SIG '' cG9yYXRpb24xMDAuBgNVBAMTJ01pY3Jvc29mdCBXaW5k
'' SIG '' b3dzIENvZGUgU2lnbmluZyBQQ0EgMjAyNAITMwAAAIe8
'' SIG '' gm6Foa5TqAAAAAAAhzANBglghkgBZQMEAgEFAKCBqDAZ
'' SIG '' BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG
'' SIG '' 9w0BCQQxIgQgV38KrmksrNZmRe2PIRhB+jOdW9FWVWoy
'' SIG '' VJi61CV/fDAwWgYKKwYBBAGCNwIBDDFMMEqgJIAiAE0A
'' SIG '' aQBjAHIAbwBzAG8AZgB0ACAAVwBpAG4AZABvAHcAc6Ei
'' SIG '' gCBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93
'' SIG '' czANBgkqhkiG9w0BAQEFAASCAgBtjQC8OhzpsGhMsZVn
'' SIG '' kLdax82a80MqQ70HbFognwmEPsp68VASDGBKaQv+5uzO
'' SIG '' xwnqK3iVUGhM7mTeUd0cL4D4Q4YAplK9G3/kP76UonVe
'' SIG '' rjfgKcTq+X/wsjphmuQH0NOu7M1PoL5cMRhpuYKn4tze
'' SIG '' cxa18+TZoW3/sYkfLI7Yo9mk6z88fSkysOvvQ+tDmoIC
'' SIG '' ez7TnmqCBROvSpr3ip0NYsC4XwUhoYdP3eb3wPOHFedF
'' SIG '' wuNLY/qsspG0/cVmWfUO3HOiykXXT17lFOxJDWssCAnI
'' SIG '' rGyPP3kSMSemombWtZ/4d0dFCYGjCV9UfEVdtmUYwj/z
'' SIG '' 7tWqarxJengnq+aGyNM82FEs2Zgxa6hO0b3HZgcJxLCu
'' SIG '' WrEDO2KKbYCbRMJTaXew1PYJgpQ0akBGeAkXysGiFoAK
'' SIG '' EfuPtZuzN8JUSPC18s5e+5gUOzwu6go0D+tNzudCA3F6
'' SIG '' LuHDvc+QH3ixjU02I1yKNTuZEJwcj0qJmi4k9EpuaNfR
'' SIG '' QQ/4mH/IP3dYLiMO7JpceAjGmbj1EQT7opWY+vWTzhBW
'' SIG '' WA8ZLbTNW1WPWkz37xYdjl8Dkq2LCQR/1IFa6TD4oy0z
'' SIG '' trT4gQCF+24vqDsMmxpxeHLqj5sXdGNAScjOfgmaPUc8
'' SIG '' hi4HzKJRg3SIvAf04gM1BaPE5pcmGUC5+W2GEnPEbhdy
'' SIG '' z+zD06GCF5cwgheTBgorBgEEAYI3AwMBMYIXgzCCF38G
'' SIG '' CSqGSIb3DQEHAqCCF3AwghdsAgEDMQ8wDQYJYIZIAWUD
'' SIG '' BAIBBQAwggFSBgsqhkiG9w0BCRABBKCCAUEEggE9MIIB
'' SIG '' OQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUA
'' SIG '' BCCwoTb0l78GBcgzJzhkrUC00OnZGS6DvG/nkXIRKi3R
'' SIG '' QgIGaWkUK4YJGBMyMDI2MDEyNzAxMjEwMy45NDZaMASA
'' SIG '' AgH0oIHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UE
'' SIG '' CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
'' SIG '' MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUw
'' SIG '' IwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRp
'' SIG '' b25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTAw
'' SIG '' MC0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBU
'' SIG '' aW1lLVN0YW1wIFNlcnZpY2WgghHtMIIHIDCCBQigAwIB
'' SIG '' AgITMwAAAgh4nVhdksfZUgABAAACCDANBgkqhkiG9w0B
'' SIG '' AQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
'' SIG '' aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
'' SIG '' ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
'' SIG '' Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAe
'' SIG '' Fw0yNTAxMzAxOTQyNTNaFw0yNjA0MjIxOTQyNTNaMIHL
'' SIG '' MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
'' SIG '' bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
'' SIG '' cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNy
'' SIG '' b3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQL
'' SIG '' Ex5uU2hpZWxkIFRTUyBFU046QTAwMC0wNUUwLUQ5NDcx
'' SIG '' JTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNl
'' SIG '' cnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
'' SIG '' AoICAQC1y3AI5lIz3Ip1nK5BMUUbGRsjSnCz/VGs33zv
'' SIG '' Y0NeshsPgfld3/Z3/3dS8WKBLlDlosmXJOZlFSiNXUd6
'' SIG '' DTJxA9ik/ZbCdWJ78LKjbN3tFkX2c6RRpRMpA8sq/oBb
'' SIG '' RryP3c8Q/gxpJAKHHz8cuSn7ewfCLznNmxqliTk3Q5LH
'' SIG '' qz2PjeYKD/dbKMBT2TAAWAvum4z/HXIJ6tFdGoNV4WUR
'' SIG '' ZswCSt6ROwaqQ1oAYGvEndH+DXZq1+bHsgvcPNCdTSIp
'' SIG '' WobQiJS/UKLiR02KNCqB4I9yajFTSlnMIEMz/Ni538oG
'' SIG '' I64phcvNpUe2+qaKWHZ8d4T1KghvRmSSF4YF5DNEJbxa
'' SIG '' CUwsy7nULmsFnTaOjVOoTFWWfWXvBuOKkBcQKWGKvrki
'' SIG '' 976j4x+5ezAP36fq3u6dHRJTLZAu4dEuOooU3+kMZr+R
'' SIG '' BYWjTHQCKV+yZ1ST0eGkbHXoA2lyyRDlNjBQcoeZIxWC
'' SIG '' Zts/d3+nf1jiSLN6f6wdHaUz0ADwOTQ/aEo1IC85eFeP
'' SIG '' vyIKaxFJkGU2Mqa6Xzq3qCq5tokIHtjhogsrEgfDKTeF
'' SIG '' XTtdhl1IPtLcCfMcWOGGAXosVUU7G948F6W96424f2VH
'' SIG '' D8L3FoyAI9+r4zyIQUmqiESzuQWeWpTTjFYwCmgXaGOu
'' SIG '' SDV8cNOVQB6IPzPneZhVTjwxbAZlaQIDAQABo4IBSTCC
'' SIG '' AUUwHQYDVR0OBBYEFKMx4vfOqcUTgYOVB9f18/mhegFN
'' SIG '' MB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1Gely
'' SIG '' MF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWlj
'' SIG '' cm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUy
'' SIG '' MFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBs
'' SIG '' BggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6
'' SIG '' Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMv
'' SIG '' TWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIw
'' SIG '' MTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/
'' SIG '' BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0G
'' SIG '' CSqGSIb3DQEBCwUAA4ICAQBRszKJKwAfswqdaQPFiaYB
'' SIG '' /ZNAYWDa040XTcQsCaCua5nsG1IslYaSpH7miTLr6eQE
'' SIG '' qXczZoqeOa/xvDnMGifGNda0CHbQwtpnIhsutrKO2jhj
'' SIG '' EaGwlJgOMql21r7Ik6XnBza0e3hBOu4UBkMl/LEX+AUR
'' SIG '' t7i7+RTNsGN0cXPwPSbTFE+9z7WagGbY9pwUo/NxkGJs
'' SIG '' eqGCQ/9K2VMU74bw5e7+8IGUhM2xspJPqnSeHPhYmcB0
'' SIG '' WclOxcVIfj/ZuQvworPbTEEYDVCzSN37c0yChPMY7FJ+
'' SIG '' HGFBNJxwd5lKIr7GYfq8a0gOiC2ljGYlc4rt4cCed1XK
'' SIG '' g83f0l9aUVimWBYXtfNebhpfr6Lc3jD8NgsrDhzt0Wgn
'' SIG '' IdnTZCi7jxjsIBilH99pY5/h6bQcLKK/E6KCP9E1YN78
'' SIG '' fLaOXkXMyO6xLrvQZ+uCSi1hdTufFC7oSB/CU5RbfIVH
'' SIG '' XG0j1o2n1tne4eCbNfKqUPTE31tNbWBR23Yiy0r3kQmH
'' SIG '' eYE1GLbL4pwknqaip1BRn6WIUMJtgncawEN33f8AYGZ4
'' SIG '' a3NnHopzGVV6neffGVag4Tduy+oy1YF+shChoXdMqfhP
'' SIG '' WFpHe3uJGT4GJEiNs4+28a/wHUuF+aRaR0cN5P7XlOwU
'' SIG '' 1360iUCJtQdvKQaNAwGI29KOwS3QGriR9F2jOGPUAlpe
'' SIG '' EzCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAA
'' SIG '' ABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVT
'' SIG '' MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
'' SIG '' ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
'' SIG '' YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENl
'' SIG '' cnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIxMDkz
'' SIG '' MDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UE
'' SIG '' BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
'' SIG '' BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
'' SIG '' b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
'' SIG '' bWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEB
'' SIG '' AQUAA4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9
'' SIG '' DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9c
'' SIG '' T8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1q
'' SIG '' UoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP
'' SIG '' 2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBb
'' SIG '' fowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOOR
'' SIG '' j7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361VI/c
'' SIG '' +gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s
'' SIG '' 4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9
'' SIG '' QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+
'' SIG '' Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjt
'' SIG '' p+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi
'' SIG '' 0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJ
'' SIG '' NmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR
'' SIG '' /bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PA
'' SIG '' PBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIu
'' SIG '' rQIDAQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEA
'' SIG '' ATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnP
'' SIG '' EP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1
'' SIG '' GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEw
'' SIG '' PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0
'' SIG '' LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAT
'' SIG '' BgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIE
'' SIG '' DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0T
'' SIG '' AQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo
'' SIG '' 0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRw
'' SIG '' Oi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9k
'' SIG '' dWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmww
'' SIG '' WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRw
'' SIG '' Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01p
'' SIG '' Y1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG
'' SIG '' 9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv
'' SIG '' 6lwUtj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsP
'' SIG '' MeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgAD
'' SIG '' sAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU
'' SIG '' 5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/
'' SIG '' GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefw
'' SIG '' C2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvf
'' SIG '' SaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT9
'' SIG '' 9kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3B
'' SIG '' FARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFr
'' SIG '' DZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I6IleT53S
'' SIG '' 0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJfn6T
'' SIG '' vsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAo
'' SIG '' GokLjzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9
'' SIG '' JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoI
'' SIG '' Yn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNQ
'' SIG '' MIICOAIBATCB+aGB0aSBzjCByzELMAkGA1UEBhMCVVMx
'' SIG '' EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
'' SIG '' ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
'' SIG '' dGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg
'' SIG '' T3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1Mg
'' SIG '' RVNOOkEwMDAtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNy
'' SIG '' b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYF
'' SIG '' Kw4DAhoDFQCNkvu0NKcSjdYKyrhJZcsyXOUTNKCBgzCB
'' SIG '' gKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
'' SIG '' aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
'' SIG '' ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
'' SIG '' HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0G
'' SIG '' CSqGSIb3DQEBCwUAAgUA7SISDzAiGA8yMDI2MDEyNjE2
'' SIG '' MTcxOVoYDzIwMjYwMTI3MTYxNzE5WjB3MD0GCisGAQQB
'' SIG '' hFkKBAExLzAtMAoCBQDtIhIPAgEAMAoCAQACAgcUAgH/
'' SIG '' MAcCAQACAhMMMAoCBQDtI2OPAgEAMDYGCisGAQQBhFkK
'' SIG '' BAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSCh
'' SIG '' CjAIAgEAAgMBhqAwDQYJKoZIhvcNAQELBQADggEBAIjP
'' SIG '' SWnHlJGyuYr4sbFERDYY8aICpcKUFvJTP6IhA8+U8nNl
'' SIG '' UmyiN5/uyGFuMb7wmzep7vPudoGxVzoXMuSuqNU9Y3ab
'' SIG '' 1WE87mMwQibDaVdkDYLuMs5fp3GiMWcm0TJsRikxVyit
'' SIG '' J62gyV1auniBZWQQXNVAslG9qJS7eqcJZNNb76r5D8lw
'' SIG '' d6vN/peRifUXK/oqDLas+uJRs5TaixwxP6iXZqhla2GH
'' SIG '' +gdRCt89M8ENKJ4emHe2yjaJIKowzmaDgnoCw5YSu+RE
'' SIG '' 2K/fJ9n1K2TjQhoxBERjdgarxVnLHuomBm5gszAeXFYN
'' SIG '' LQyDqWE6BOsaqAlKHrTlVzA3dGQU+BIxggQNMIIECQIB
'' SIG '' ATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
'' SIG '' aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
'' SIG '' ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
'' SIG '' Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAIT
'' SIG '' MwAAAgh4nVhdksfZUgABAAACCDANBglghkgBZQMEAgEF
'' SIG '' AKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE
'' SIG '' MC8GCSqGSIb3DQEJBDEiBCDLTxFNUQSalXHFYje5S8N8
'' SIG '' pHhvNRUo8bpla3iNvJT3sTCB+gYLKoZIhvcNAQkQAi8x
'' SIG '' geowgecwgeQwgb0EII//jm8JHa2W1O9778t9+Ft2Z5Nm
'' SIG '' KqttPk6Q+9RRpmepMIGYMIGApH4wfDELMAkGA1UEBhMC
'' SIG '' VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
'' SIG '' B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
'' SIG '' b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt
'' SIG '' U3RhbXAgUENBIDIwMTACEzMAAAIIeJ1YXZLH2VIAAQAA
'' SIG '' AggwIgQguFj4iZnpHurF9y4Lt/bnf59OxFc1ESgO/bsJ
'' SIG '' 5o05V/IwDQYJKoZIhvcNAQELBQAEggIAk+CYEL76NsC0
'' SIG '' wiqQrP/jA02YbJSu9e4QYyHZq7/kND3IDsxX6l6OdEar
'' SIG '' xHGlj3+/EaPogVASBcduXTM/C0HexeVgrdwRKv6O6OVP
'' SIG '' dfD39iIoYL6528iloyQhZfwp5J3PyJoMoINK71R6aKCO
'' SIG '' e3tKDWT4Cny726xN6Q9PCL4+agr43FhSIE8Vhl347O7c
'' SIG '' 724y+Cm7ewAfxLnCnFhRtRZKbr5X9cWXPohgiCdu5f+R
'' SIG '' g9CS4StGwe3NoiqHJc+3HEtqMHgUZM7IaHL0pf9Ln2wh
'' SIG '' sOBKjJcmgveWqpbrHLPlc4MAQgwPGN0QKv4ULYRjEiwU
'' SIG '' lboFJ1xdUL8N6dKWRVhQhM2YXLa+2TeIkTW/PTlv6Yjw
'' SIG '' IW2t4JtnlaWpdRqWzXLfYoIJPhCsGUYb8rRrjeY/YCMi
'' SIG '' sXriUilazV6fcseGqDt1WxJlNsPL9w1/ovOcW7RauBZK
'' SIG '' IH2xXcKpb6QFs80xiuCnf2Ricx3N4FNJi+1ktgPv/Jm4
'' SIG '' 7xstjSUhBVf7HHiCtQp7Wet+jkBJ9zTg64QU5YmO8Thu
'' SIG '' 9X8G4G9eYSBYKGOvo3tmU2KlD31fdKIz4LPh64974lBq
'' SIG '' d82I1LlFmMGSO+Kn4pWnCCWXubV99S+6Bwjv5u21bKUb
'' SIG '' sFJHSx5svUM1eDHOA4rCjIkyHkmvd+bR2JyrUwXYtBIH
'' SIG '' cgdfqb3I+U4=
'' SIG '' End signature block
