InlineMailAttachments.psm1
#requires -Version 2.0 function Send-InlineMailMessage { <# .Synopsis PowerShell version of the Send-MailMessage cmdlet with support for displaying attachments inline. .DESCRIPTION PowerShell version of the Send-MailMessage cmdlet with support for displaying attachments inline. Also adds a -Port parameter, which did not exist in the Send-MailMessage cmdlet until PowerShell 3.0. .PARAMETER InlineAttachments Hashtable of ContentID to FilePath mappings. The files referenced by the hashtables values will be attached to the email, and may be displayed inline in the HTML body by using URIs of "cid:ContentID". .EXAMPLE In this example, the two ContentIDs are "image1" and "image2". Those two attachments (test.jpg and test2.png) can be displayed inline. The rest of the parameters to this function are used the same way they would be used in PowerShell 3.0's Send-MailMessage cmdlet (and in PowerShell 2.0's version as well, except for the -Port parameter.) To keep the code readable, splatting is used to send the parameters to the function via a hashtable. $images = @{ image1 = 'c:\temp\test.jpg' image2 = 'C:\temp\test2.png' } $body = '<html> <body> <img src="cid:image1"><br> <img src="cid:image2"> </body> </html>' $params = @{ InlineAttachments = $images Attachments = 'C:\temp\attachment1.txt', 'C:\temp\attachment2.txt' Body = $body BodyAsHtml = $true Subject = 'Test email' From = 'username@gmail.com' To = 'recipient@domain.com' Cc = 'recipient2@domain.com', 'recipient3@domain.com' SmtpServer = 'smtp.gmail.com' Port = 587 Credential = (Get-Credential) UseSsl = $true } Send-InlineMailMessage @params .INPUTS String. The -Attachments parameter accepts pipeline input, as it does in the built-in Send-MailMessage cmdlet. .OUTPUTS None. This command does not generate pipeline output. .NOTES Refer to the Send-MailMessage cmdlet's .LINK Send-MailMessage #> [CmdletBinding()] param( [Parameter(ValueFromPipeline=$true)] [Alias('PsPath')] [ValidateNotNullOrEmpty()] [string[]] ${Attachments}, [ValidateNotNullOrEmpty()] [Collections.HashTable] ${InlineAttachments}, [ValidateNotNullOrEmpty()] [Net.Mail.MailAddress[]] ${Bcc}, [Parameter(Position=2)] [ValidateNotNullOrEmpty()] [string] ${Body}, [Alias('BAH')] [switch] ${BodyAsHtml}, [ValidateNotNullOrEmpty()] [Net.Mail.MailAddress[]] ${Cc}, [Alias('DNO')] [ValidateNotNullOrEmpty()] [Net.Mail.DeliveryNotificationOptions] ${DeliveryNotificationOption}, [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [Net.Mail.MailAddress] ${From}, [Parameter(Position = 3)] [Alias('ComputerName')] [string] ${SmtpServer}, [ValidateNotNullOrEmpty()] [Net.Mail.MailPriority] ${Priority}, [Parameter(Mandatory=$true, Position=1)] [Alias('sub')] [ValidateNotNullOrEmpty()] [string] ${Subject}, [Parameter(Mandatory=$true, Position=0)] [Net.Mail.MailAddress[]] ${To}, [ValidateNotNullOrEmpty()] [Management.Automation.PSCredential] ${Credential}, [switch] ${UseSsl}, [ValidateRange(0, 2147483647)] [int] ${Port} = 25 ) begin { if ([string]::IsNullOrEmpty($SmtpServer)) { if ($null -eq $PSEmailServer) { $errorRecord = New-Object System.Management.Automation.ErrorRecord( (New-Object System.InvalidOperationException('The email cannot be sent because no SMTP server was specified. You must specify an SMTP server by using either the SmtpServer parameter or the $PSEmailServer variable.')), $null, [System.Management.Automation.ErrorCategory]::InvalidArgument, $null ) $PSCmdlet.ThrowTerminatingError($errorRecord) } else { $_smtpServer = [System.Convert]::ToString($PSEmailServer, [System.Globalization.CultureInfo]::InvariantCulture) } } else { $_smtpServer = $SmtpServer } try { $_smtpClient = New-Object Net.Mail.SmtpClient $_smtpClient.Host = $_smtpServer $_smtpClient.Port = $Port $_smtpClient.EnableSsl = $UseSsl if ($null -ne $Credential) { # In PowerShell 2.0, assigning the results of GetNetworkCredential() to the SMTP client sometimes fails (with gmail, in testing), but # building a new NetworkCredential object containing only the UserName and Password works okay. $_tempCred = $Credential.GetNetworkCredential() $_smtpClient.Credentials = New-Object Net.NetworkCredential($Credential.UserName, $_tempCred.Password) } else { $_smtpClient.UseDefaultCredentials = $true } $_message = New-Object Net.Mail.MailMessage $_message.From = $From $_message.Subject = $Subject if ($BodyAsHtml) { $_bodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, 'text/html') } else { $_bodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, 'text/plain') } $_message.AlternateViews.Add($_bodyPart) if ($PSBoundParameters.ContainsKey('DeliveryNotificationOption')) { $_message.DeliveryNotificationOptions = $DeliveryNotificationOption } if ($PSBoundParameters.ContainsKey('Priority')) { $_message.Priority = $Priority } foreach ($_address in $To) { if (-not $_message.To.Contains($_address)) { $_message.To.Add($_address) } } if ($null -ne $Cc) { foreach ($_address in $Cc) { if (-not $_message.CC.Contains($_address)) { $_message.CC.Add($_address) } } } if ($null -ne $Bcc) { foreach ($_address in $Bcc) { if (-not $_message.Bcc.Contains($_address)) { $_message.Bcc.Add($_address) } } } } catch { $_message.Dispose() throw } if ($PSBoundParameters.ContainsKey('InlineAttachments')) { foreach ($_entry in $InlineAttachments.GetEnumerator()) { $_file = $_entry.Value.ToString() if ([string]::IsNullOrEmpty($_file)) { $_message.Dispose() throw "Send-MailMessage: Values in the InlineAttachments table cannot be null." } try { $_contentType = FileNameToContentType -FileName $_file $_attachment = New-Object Net.Mail.LinkedResource($_file, $_contentType) $_attachment.ContentId = $_entry.Key $_bodyPart.LinkedResources.Add($_attachment) } catch { $_message.Dispose() throw } } } } process { if ($null -ne $Attachments) { foreach ($_file in $Attachments) { try { $_contentType = FileNameToContentType -FileName $_file $_message.Attachments.Add((New-Object Net.Mail.Attachment($_file, $_contentType))) } catch { $_message.Dispose() throw } } } } end { try { $_smtpClient.Send($_message) } catch { throw } finally { $_message.Dispose() } } } # function Send-InlineMailMessage function FileNameToContentType { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string] $FileName ) $mimeMappings = @{ '.323' = 'text/h323' '.aaf' = 'application/octet-stream' '.aca' = 'application/octet-stream' '.accdb' = 'application/msaccess' '.accde' = 'application/msaccess' '.accdt' = 'application/msaccess' '.acx' = 'application/internet-property-stream' '.afm' = 'application/octet-stream' '.ai' = 'application/postscript' '.aif' = 'audio/x-aiff' '.aifc' = 'audio/aiff' '.aiff' = 'audio/aiff' '.application' = 'application/x-ms-application' '.art' = 'image/x-jg' '.asd' = 'application/octet-stream' '.asf' = 'video/x-ms-asf' '.asi' = 'application/octet-stream' '.asm' = 'text/plain' '.asr' = 'video/x-ms-asf' '.asx' = 'video/x-ms-asf' '.atom' = 'application/atom+xml' '.au' = 'audio/basic' '.avi' = 'video/x-msvideo' '.axs' = 'application/olescript' '.bas' = 'text/plain' '.bcpio' = 'application/x-bcpio' '.bin' = 'application/octet-stream' '.bmp' = 'image/bmp' '.c' = 'text/plain' '.cab' = 'application/octet-stream' '.calx' = 'application/vnd.ms-office.calx' '.cat' = 'application/vnd.ms-pki.seccat' '.cdf' = 'application/x-cdf' '.chm' = 'application/octet-stream' '.class' = 'application/x-java-applet' '.clp' = 'application/x-msclip' '.cmx' = 'image/x-cmx' '.cnf' = 'text/plain' '.cod' = 'image/cis-cod' '.cpio' = 'application/x-cpio' '.cpp' = 'text/plain' '.crd' = 'application/x-mscardfile' '.crl' = 'application/pkix-crl' '.crt' = 'application/x-x509-ca-cert' '.csh' = 'application/x-csh' '.css' = 'text/css' '.csv' = 'application/octet-stream' '.cur' = 'application/octet-stream' '.dcr' = 'application/x-director' '.deploy' = 'application/octet-stream' '.der' = 'application/x-x509-ca-cert' '.dib' = 'image/bmp' '.dir' = 'application/x-director' '.disco' = 'text/xml' '.dll' = 'application/x-msdownload' '.dll.config' = 'text/xml' '.dlm' = 'text/dlm' '.doc' = 'application/msword' '.docm' = 'application/vnd.ms-word.document.macroEnabled.12' '.docx' = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' '.dot' = 'application/msword' '.dotm' = 'application/vnd.ms-word.template.macroEnabled.12' '.dotx' = 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' '.dsp' = 'application/octet-stream' '.dtd' = 'text/xml' '.dvi' = 'application/x-dvi' '.dwf' = 'drawing/x-dwf' '.dwp' = 'application/octet-stream' '.dxr' = 'application/x-director' '.eml' = 'message/rfc822' '.emz' = 'application/octet-stream' '.eot' = 'application/octet-stream' '.eps' = 'application/postscript' '.etx' = 'text/x-setext' '.evy' = 'application/envoy' '.exe' = 'application/octet-stream' '.exe.config' = 'text/xml' '.fdf' = 'application/vnd.fdf' '.fif' = 'application/fractals' '.fla' = 'application/octet-stream' '.flr' = 'x-world/x-vrml' '.flv' = 'video/x-flv' '.gif' = 'image/gif' '.gtar' = 'application/x-gtar' '.gz' = 'application/x-gzip' '.h' = 'text/plain' '.hdf' = 'application/x-hdf' '.hdml' = 'text/x-hdml' '.hhc' = 'application/x-oleobject' '.hhk' = 'application/octet-stream' '.hhp' = 'application/octet-stream' '.hlp' = 'application/winhlp' '.hqx' = 'application/mac-binhex40' '.hta' = 'application/hta' '.htc' = 'text/x-component' '.htm' = 'text/html' '.html' = 'text/html' '.htt' = 'text/webviewhtml' '.hxt' = 'text/html' '.ico' = 'image/x-icon' '.ics' = 'application/octet-stream' '.ief' = 'image/ief' '.iii' = 'application/x-iphone' '.inf' = 'application/octet-stream' '.ins' = 'application/x-internet-signup' '.isp' = 'application/x-internet-signup' '.IVF' = 'video/x-ivf' '.jar' = 'application/java-archive' '.java' = 'application/octet-stream' '.jck' = 'application/liquidmotion' '.jcz' = 'application/liquidmotion' '.jfif' = 'image/pjpeg' '.jpb' = 'application/octet-stream' '.jpe' = 'image/jpeg' '.jpeg' = 'image/jpeg' '.jpg' = 'image/jpeg' '.js' = 'application/x-javascript' '.jsx' = 'text/jscript' '.latex' = 'application/x-latex' '.lit' = 'application/x-ms-reader' '.lpk' = 'application/octet-stream' '.lsf' = 'video/x-la-asf' '.lsx' = 'video/x-la-asf' '.lzh' = 'application/octet-stream' '.m13' = 'application/x-msmediaview' '.m14' = 'application/x-msmediaview' '.m1v' = 'video/mpeg' '.m3u' = 'audio/x-mpegurl' '.man' = 'application/x-troff-man' '.manifest' = 'application/x-ms-manifest' '.map' = 'text/plain' '.mdb' = 'application/x-msaccess' '.mdp' = 'application/octet-stream' '.me' = 'application/x-troff-me' '.mht' = 'message/rfc822' '.mhtml' = 'message/rfc822' '.mid' = 'audio/mid' '.midi' = 'audio/mid' '.mix' = 'application/octet-stream' '.mmf' = 'application/x-smaf' '.mno' = 'text/xml' '.mny' = 'application/x-msmoney' '.mov' = 'video/quicktime' '.movie' = 'video/x-sgi-movie' '.mp2' = 'video/mpeg' '.mp3' = 'audio/mpeg' '.mpa' = 'video/mpeg' '.mpe' = 'video/mpeg' '.mpeg' = 'video/mpeg' '.mpg' = 'video/mpeg' '.mpp' = 'application/vnd.ms-project' '.mpv2' = 'video/mpeg' '.ms' = 'application/x-troff-ms' '.msi' = 'application/octet-stream' '.mso' = 'application/octet-stream' '.mvb' = 'application/x-msmediaview' '.mvc' = 'application/x-miva-compiled' '.nc' = 'application/x-netcdf' '.nsc' = 'video/x-ms-asf' '.nws' = 'message/rfc822' '.ocx' = 'application/octet-stream' '.oda' = 'application/oda' '.odc' = 'text/x-ms-odc' '.ods' = 'application/oleobject' '.one' = 'application/onenote' '.onea' = 'application/onenote' '.onetoc' = 'application/onenote' '.onetoc2' = 'application/onenote' '.onetmp' = 'application/onenote' '.onepkg' = 'application/onenote' '.osdx' = 'application/opensearchdescription+xml' '.p10' = 'application/pkcs10' '.p12' = 'application/x-pkcs12' '.p7b' = 'application/x-pkcs7-certificates' '.p7c' = 'application/pkcs7-mime' '.p7m' = 'application/pkcs7-mime' '.p7r' = 'application/x-pkcs7-certreqresp' '.p7s' = 'application/pkcs7-signature' '.pbm' = 'image/x-portable-bitmap' '.pcx' = 'application/octet-stream' '.pcz' = 'application/octet-stream' '.pdf' = 'application/pdf' '.pfb' = 'application/octet-stream' '.pfm' = 'application/octet-stream' '.pfx' = 'application/x-pkcs12' '.pgm' = 'image/x-portable-graymap' '.pko' = 'application/vnd.ms-pki.pko' '.pma' = 'application/x-perfmon' '.pmc' = 'application/x-perfmon' '.pml' = 'application/x-perfmon' '.pmr' = 'application/x-perfmon' '.pmw' = 'application/x-perfmon' '.png' = 'image/png' '.pnm' = 'image/x-portable-anymap' '.pnz' = 'image/png' '.pot' = 'application/vnd.ms-powerpoint' '.potm' = 'application/vnd.ms-powerpoint.template.macroEnabled.12' '.potx' = 'application/vnd.openxmlformats-officedocument.presentationml.template' '.ppam' = 'application/vnd.ms-powerpoint.addin.macroEnabled.12' '.ppm' = 'image/x-portable-pixmap' '.pps' = 'application/vnd.ms-powerpoint' '.ppsm' = 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12' '.ppsx' = 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' '.ppt' = 'application/vnd.ms-powerpoint' '.pptm' = 'application/vnd.ms-powerpoint.presentation.macroEnabled.12' '.pptx' = 'application/vnd.openxmlformats-officedocument.presentationml.presentation' '.prf' = 'application/pics-rules' '.prm' = 'application/octet-stream' '.prx' = 'application/octet-stream' '.ps' = 'application/postscript' '.psd' = 'application/octet-stream' '.psm' = 'application/octet-stream' '.psp' = 'application/octet-stream' '.pub' = 'application/x-mspublisher' '.qt' = 'video/quicktime' '.qtl' = 'application/x-quicktimeplayer' '.qxd' = 'application/octet-stream' '.ra' = 'audio/x-pn-realaudio' '.ram' = 'audio/x-pn-realaudio' '.rar' = 'application/octet-stream' '.ras' = 'image/x-cmu-raster' '.rf' = 'image/vnd.rn-realflash' '.rgb' = 'image/x-rgb' '.rm' = 'application/vnd.rn-realmedia' '.rmi' = 'audio/mid' '.roff' = 'application/x-troff' '.rpm' = 'audio/x-pn-realaudio-plugin' '.rtf' = 'application/rtf' '.rtx' = 'text/richtext' '.scd' = 'application/x-msschedule' '.sct' = 'text/scriptlet' '.sea' = 'application/octet-stream' '.setpay' = 'application/set-payment-initiation' '.setreg' = 'application/set-registration-initiation' '.sgml' = 'text/sgml' '.sh' = 'application/x-sh' '.shar' = 'application/x-shar' '.sit' = 'application/x-stuffit' '.sldm' = 'application/vnd.ms-powerpoint.slide.macroEnabled.12' '.sldx' = 'application/vnd.openxmlformats-officedocument.presentationml.slide' '.smd' = 'audio/x-smd' '.smi' = 'application/octet-stream' '.smx' = 'audio/x-smd' '.smz' = 'audio/x-smd' '.snd' = 'audio/basic' '.snp' = 'application/octet-stream' '.spc' = 'application/x-pkcs7-certificates' '.spl' = 'application/futuresplash' '.src' = 'application/x-wais-source' '.ssm' = 'application/streamingmedia' '.sst' = 'application/vnd.ms-pki.certstore' '.stl' = 'application/vnd.ms-pki.stl' '.sv4cpio' = 'application/x-sv4cpio' '.sv4crc' = 'application/x-sv4crc' '.swf' = 'application/x-shockwave-flash' '.t' = 'application/x-troff' '.tar' = 'application/x-tar' '.tcl' = 'application/x-tcl' '.tex' = 'application/x-tex' '.texi' = 'application/x-texinfo' '.texinfo' = 'application/x-texinfo' '.tgz' = 'application/x-compressed' '.thmx' = 'application/vnd.ms-officetheme' '.thn' = 'application/octet-stream' '.tif' = 'image/tiff' '.tiff' = 'image/tiff' '.toc' = 'application/octet-stream' '.tr' = 'application/x-troff' '.trm' = 'application/x-msterminal' '.tsv' = 'text/tab-separated-values' '.ttf' = 'application/octet-stream' '.txt' = 'text/plain' '.u32' = 'application/octet-stream' '.uls' = 'text/iuls' '.ustar' = 'application/x-ustar' '.vbs' = 'text/vbscript' '.vcf' = 'text/x-vcard' '.vcs' = 'text/plain' '.vdx' = 'application/vnd.ms-visio.viewer' '.vml' = 'text/xml' '.vsd' = 'application/vnd.visio' '.vss' = 'application/vnd.visio' '.vst' = 'application/vnd.visio' '.vsto' = 'application/x-ms-vsto' '.vsw' = 'application/vnd.visio' '.vsx' = 'application/vnd.visio' '.vtx' = 'application/vnd.visio' '.wav' = 'audio/wav' '.wax' = 'audio/x-ms-wax' '.wbmp' = 'image/vnd.wap.wbmp' '.wcm' = 'application/vnd.ms-works' '.wdb' = 'application/vnd.ms-works' '.wks' = 'application/vnd.ms-works' '.wm' = 'video/x-ms-wm' '.wma' = 'audio/x-ms-wma' '.wmd' = 'application/x-ms-wmd' '.wmf' = 'application/x-msmetafile' '.wml' = 'text/vnd.wap.wml' '.wmlc' = 'application/vnd.wap.wmlc' '.wmls' = 'text/vnd.wap.wmlscript' '.wmlsc' = 'application/vnd.wap.wmlscriptc' '.wmp' = 'video/x-ms-wmp' '.wmv' = 'video/x-ms-wmv' '.wmx' = 'video/x-ms-wmx' '.wmz' = 'application/x-ms-wmz' '.wps' = 'application/vnd.ms-works' '.wri' = 'application/x-mswrite' '.wrl' = 'x-world/x-vrml' '.wrz' = 'x-world/x-vrml' '.wsdl' = 'text/xml' '.wvx' = 'video/x-ms-wvx' '.x' = 'application/directx' '.xaf' = 'x-world/x-vrml' '.xaml' = 'application/xaml+xml' '.xap' = 'application/x-silverlight-app' '.xbap' = 'application/x-ms-xbap' '.xbm' = 'image/x-xbitmap' '.xdr' = 'text/plain' '.xla' = 'application/vnd.ms-excel' '.xlam' = 'application/vnd.ms-excel.addin.macroEnabled.12' '.xlc' = 'application/vnd.ms-excel' '.xlm' = 'application/vnd.ms-excel' '.xls' = 'application/vnd.ms-excel' '.xlsb' = 'application/vnd.ms-excel.sheet.binary.macroEnabled.12' '.xlsm' = 'application/vnd.ms-excel.sheet.macroEnabled.12' '.xlsx' = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' '.xlt' = 'application/vnd.ms-excel' '.xltm' = 'application/vnd.ms-excel.template.macroEnabled.12' '.xltx' = 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' '.xlw' = 'application/vnd.ms-excel' '.xml' = 'text/xml' '.xof' = 'x-world/x-vrml' '.xpm' = 'image/x-xpixmap' '.xps' = 'application/vnd.ms-xpsdocument' '.xsd' = 'text/xml' '.xsf' = 'text/xml' '.xsl' = 'text/xml' '.xslt' = 'text/xml' '.xsn' = 'application/octet-stream' '.xtp' = 'application/octet-stream' '.xwd' = 'image/x-xwindowdump' '.z' = 'application/x-compress' '.zip' = 'application/x-zip-compressed' } $extension = [System.IO.Path]::GetExtension($FileName) $contentType = $mimeMappings[$extension] if ([string]::IsNullOrEmpty($contentType)) { return New-Object System.Net.Mime.ContentType } else { return New-Object System.Net.Mime.ContentType($contentType) } } # function FileNameToContentType Export-ModuleMember -Function Send-InlineMailMessage # SIG # Begin signature block # MIIhfgYJKoZIhvcNAQcCoIIhbzCCIWsCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUoz1/01kR+lQc9rn32pRokwzh # pyGgghywMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0B # AQUFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg # Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg # +XESpa7cJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lT # XDGEKvYPmDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5 # a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g # 0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1 # roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf # GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0G # A1UdDgQWBBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLL # gjEtUYunpyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3 # cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmr # EthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+ # fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5Q # Z7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu # 838fYxAe+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw # 8jCCBQswggPzoAMCAQICEAOiV15N2F/TLPzy+oVrWjMwDQYJKoZIhvcNAQEFBQAw # bzELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ # d3d3LmRpZ2ljZXJ0LmNvbTEuMCwGA1UEAxMlRGlnaUNlcnQgQXNzdXJlZCBJRCBD # b2RlIFNpZ25pbmcgQ0EtMTAeFw0xNDA1MDUwMDAwMDBaFw0xNTA1MTMxMjAwMDBa # MGExCzAJBgNVBAYTAkNBMQswCQYDVQQIEwJPTjERMA8GA1UEBxMIQnJhbXB0b24x # GDAWBgNVBAoTD0RhdmlkIExlZSBXeWF0dDEYMBYGA1UEAxMPRGF2aWQgTGVlIFd5 # YXR0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvcX51YAyViQE16mg # +IVQCQ0O8QC/wXBzTMPirnoGK9TThmxQIYgtcekZ5Xa/dWpW0xKKjaS6dRwYYXET # pzozoMWZbFDVrgKaqtuZNu9TD6rqK/QKf4iL/eikr0NIUL4CoSEQDeGLXDw7ntzZ # XKM86RuPw6MlDapfFQQFIMjsT7YaoqQNTOxhbiFoHVHqP7xL3JTS7TApa/RnNYyl # O7SQ7TSNsekiXGwUNxPqt6UGuOP0nyR+GtNiBcPfeUi+XaqjjBmpqgDbkEIMLDuf # fDO54VKvDLl8D2TxTFOcKZv61IcToOs+8z1sWTpMWI2MBuLhRR3A6iIhvilTYRBI # iX5FZQIDAQABo4IBrzCCAaswHwYDVR0jBBgwFoAUe2jOKarAF75JeuHlP9an90WP # NTIwHQYDVR0OBBYEFDS4+PmyUp+SmK2GR+NCMiLd+DpvMA4GA1UdDwEB/wQEAwIH # gDATBgNVHSUEDDAKBggrBgEFBQcDAzBtBgNVHR8EZjBkMDCgLqAshipodHRwOi8v # Y3JsMy5kaWdpY2VydC5jb20vYXNzdXJlZC1jcy1nMS5jcmwwMKAuoCyGKmh0dHA6 # Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9hc3N1cmVkLWNzLWcxLmNybDBCBgNVHSAEOzA5 # MDcGCWCGSAGG/WwDATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2Vy # dC5jb20vQ1BTMIGCBggrBgEFBQcBAQR2MHQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v # Y3NwLmRpZ2ljZXJ0LmNvbTBMBggrBgEFBQcwAoZAaHR0cDovL2NhY2VydHMuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEQ29kZVNpZ25pbmdDQS0xLmNydDAM # BgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBBQUAA4IBAQBbzAp8wys0A5LcuENslW0E # oz7rc0A8h+XgjJWdJOFRohE1mZRFpdkVxM0SRqw7IzlSFtTMCsVVPNwU6O7y9rCY # x5agx3CJBkJVDR/Y7DcOQTmmHy1zpcrKAgTznZuKUQZLpoYz/bA+Uh+bvXB9woCA # IRbchos1oxC+7/gjuxBMKh4NM+9NIvWs6qpnH5JeBidQDQXp3flPkla+MKrPTL/T # /amgna5E+9WHWnXbMFCpZ5n1bI1OvgNVZlYC/JTa4fjPEk8d16jYVP4GlRz/QUYI # y6IAGc/z6xpkdtpXWVCbW0dCd5ybfUYTaeCJumGpS/HSJ7JcTZj694QDOKNvhfrm # MIIGajCCBVKgAwIBAgIQA5/t7ct5W43tMgyJGfA2iTANBgkqhkiG9w0BAQUFADBi # MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 # d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBBc3N1cmVkIElEIENB # LTEwHhcNMTMwNTIxMDAwMDAwWhcNMTQwNjA0MDAwMDAwWjBHMQswCQYDVQQGEwJV # UzERMA8GA1UEChMIRGlnaUNlcnQxJTAjBgNVBAMTHERpZ2lDZXJ0IFRpbWVzdGFt # cCBSZXNwb25kZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6aUqB # TW+lFBaqis1nvku/xmmPWBzgeegenVgmmNpc1Hyj+dsrjBI2w/z5ZAaxu8KomAoX # DeGV60C065ZtmL+mj3nPvIqSe22cGAZR2KUYUzIBJxlh6IRB38bw6Mr+d61f2J57 # jGBvhVxGvWvnD4DO5wPDfDHPt2VVxvvgmQjkc1r7l9rQTL60tsYPfyaSqbj8OO60 # 5DqkSNBM6qlGJ1vPkhGTnBan/tKtHyLFHqzBce+8StsBCUTfmBwtZ7qoigMzyVG1 # 9wJNCaRN/oBexddFw30IqgEzzDPYTzAW5P8iMi7rfjvw+R4y65Ul0vL+bVSEutXl # 1NHdG6+9WXuUhTABAgMBAAGjggM1MIIDMTAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0T # AQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCCAb8GA1UdIASCAbYwggGy # MIIBoQYJYIZIAYb9bAcBMIIBkjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGln # aWNlcnQuY29tL0NQUzCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBuAHkAIAB1AHMA # ZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0AGUAIABjAG8A # bgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBlACAAbwBmACAA # dABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAgAGEAbgBkACAA # dABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBnAHIAZQBlAG0A # ZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBiAGkAbABpAHQA # eQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGgA # ZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjALBglghkgBhv1s # AxUwHwYDVR0jBBgwFoAUFQASKxOYspkH7R7for5XDStnAs0wHQYDVR0OBBYEFGMv # yd95knu1I8q74aTuM37j4p36MH0GA1UdHwR2MHQwOKA2oDSGMmh0dHA6Ly9jcmwz # LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3JsMDigNqA0hjJo # dHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURDQS0xLmNy # bDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj # ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t # L0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcnQwDQYJKoZIhvcNAQEFBQADggEBAKt0 # vUAATHYVJVc90xwD/31FyEUSZucoZWDY3zuz+g3BrDOP9IG5YfGd+5hV195HQ7qA # PfFIzD9nMFYfzvTQTIS9h6SexeEPqAZd0C9uXtwZ6PCH6uBOrz1sII5zb37Whxjg # htOa/J7qjHLpQQ+4cbU4LPgpstUcop0b7F8quNw3IOHLu/DQbGyls8ufSvZU4yY0 # PS64wSsct/bDPf7RLR5Q9JTI+P3uc9tJtRv09f+lkME5FBvY7XEbapj7+kCaRKkp # DlVeeLi3pIPDcAHwZkDlrnk04StNA6Et5ttUYhjt1QmLoqrWDMhPGr6ZJXhpmYnU # WYne34jw02dedKWdpkQwggajMIIFi6ADAgECAhAPqEkGFdcAoL4hdv3F7G29MA0G # CSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0 # IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMTAyMTExMjAwMDBaFw0yNjAyMTAxMjAw # MDBaMG8xCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNV # BAsTEHd3dy5kaWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQg # SUQgQ29kZSBTaWduaW5nIENBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK # AoIBAQCcfPmgjwrKiUtTmjzsGSJ/DMv3SETQPyJumk/6zt/G0ySR/6hSk+dy+PFG # hpTFqxf0eH/Ler6QJhx8Uy/lg+e7agUozKAXEUsYIPO3vfLcy7iGQEUfT/k5mNM7 # 629ppFwBLrFm6aa43Abero1i/kQngqkDw/7mJguTSXHlOG1O/oBcZ3e11W9mZJRr # u4hJaNjR9H4hwebFHsnglrgJlflLnq7MMb1qWkKnxAVHfWAr2aFdvftWk+8b/HL5 # 3z4y/d0qLDJG2l5jvNC4y0wQNfxQX6xDRHz+hERQtIwqPXQM9HqLckvgVrUTtmPp # P05JI+cGFvAlqwH4KEHmx9RkO12rAgMBAAGjggNDMIIDPzAOBgNVHQ8BAf8EBAMC # AYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMwggHDBgNVHSAEggG6MIIBtjCCAbIGCGCG # SAGG/WwDMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20v # c3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBu # AHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0 # AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBl # ACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAg # AGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBn # AHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBi # AGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0 # AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjAS # BgNVHRMBAf8ECDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYY # aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2Fj # ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGB # BgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl # cnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2Vy # dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQWBBR7aM4p # qsAXvkl64eU/1qf3RY81MjAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823I # DzANBgkqhkiG9w0BAQUFAAOCAQEAe3IdZP+IyDrBt+nnqcSHu9uUkteQWTP6K4fe # qFuAJT8Tj5uDG3xDxOaM3zk+wxXssNo7ISV7JMFyXbhHkYETRvqcP2pRON60Jcvw # q9/FKAFUeRBGJNE4DyahYZBNur0o5j/xxKqb9to1U0/J8j3TbNwj7aqgTWcJ8zqA # PTz7NkyQ53ak3fI6v1Y1L6JMZejg1NrRx8iRai0jTzc7GZQY1NWcEDzVsRwZ/4/I # a5ue+K6cmZZ40c2cURVbQiZyWo0KSiOSQOiG3iLCkzrUm2im3yl/Brk8Dr2fxIac # gkdCcTKGCZlyCXlLnXFp9UH/fzl3ZPGEjb6LHrJ9aKOlkLEM/zCCBs0wggW1oAMC # AQICEAb9+QOWA63qAArrPye7uhswDQYJKoZIhvcNAQEFBQAwZTELMAkGA1UEBhMC # VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0 # LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTA2 # MTExMDAwMDAwMFoXDTIxMTExMDAwMDAwMFowYjELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8G # A1UEAxMYRGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMIIBIjANBgkqhkiG9w0BAQEF # AAOCAQ8AMIIBCgKCAQEA6IItmfnKwkKVpYBzQHDSnlZUXKnE0kEGj8kz/E1FkVyB # n+0snPgWWd+etSQVwpi5tHdJ3InECtqvy15r7a2wcTHrzzpADEZNk+yLejYIA6sM # NP4YSYL+x8cxSIB8HqIPkg5QycaH6zY/2DDD/6b3+6LNb3Mj/qxWBZDwMiEWicZw # iPkFl32jx0PdAug7Pe2xQaPtP77blUjE7h6z8rwMK5nQxl0SQoHhg26Ccz8mSxSQ # rllmCsSNvtLOBq6thG9IhJtPQLnxTPKvmPv2zkBdXPao8S+v7Iki8msYZbHBc63X # 8djPHgp0XEK4aH631XcKJ1Z8D2KkPzIUYJX9BwSiCQIDAQABo4IDejCCA3YwDgYD # VR0PAQH/BAQDAgGGMDsGA1UdJQQ0MDIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB # BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCDCCAdIGA1UdIASCAckwggHFMIIBtAYK # YIZIAYb9bAABBDCCAaQwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQu # Y29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0wggFkBggrBgEFBQcCAjCCAVYeggFS # AEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABpAGYAaQBj # AGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBu # AGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQAC8AQwBQ # AFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQByAHQAeQAg # AEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0ACAAbABp # AGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwByAHAAbwBy # AGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBl # AC4wCwYJYIZIAYb9bAMVMBIGA1UdEwEB/wQIMAYBAf8CAQAweQYIKwYBBQUHAQEE # bTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYB # BQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3Vy # ZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmwzLmRp # Z2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaGNGh0 # dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5j # cmwwHQYDVR0OBBYEFBUAEisTmLKZB+0e36K+Vw0rZwLNMB8GA1UdIwQYMBaAFEXr # oq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBBQUAA4IBAQBGUD7Jtygkpzgd # tlspr1LPUukxR6tWXHvVDQtBs+/sdR90OPKyXGGinJXDUOSCuSPRujqGcq04eKx1 # XRcXNHJHhZRW0eu7NoR3zCSl8wQZVann4+erYs37iy2QwsDStZS9Xk+xBdIOPRqp # FFumhjFiqKgz5Js5p8T1zh14dpQlc+Qqq8+cdkvtX8JLFuRLcEwAiR78xXm8TBJX # /l/hHrwCXaj++wc4Tw3GXZG5D2dFzdaD7eeSDY2xaYxP+1ngIw/Sqq4AfO6cQg7P # kdcntxbuD8O9fAqg7iwIVYUiuOsYGk38KiGtSTGDR5V3cdyxG0tLHBCcdxTBnU8v # WpUIKRAmMYIEODCCBDQCAQEwgYMwbzELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp # Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEuMCwGA1UEAxMl # RGlnaUNlcnQgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EtMQIQA6JXXk3YX9Ms # /PL6hWtaMzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZ # BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB # BAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUho58ryrtRd5Z3aczjdJadRyfXYYwDQYJ # KoZIhvcNAQEBBQAEggEAbtjRJd8A7HxgajFECqjBToHsDKEKcZWpU7Pob2BSpRPS # 7LNJPLvOpMmsbMIgNTkPqzjm9Skw3PXvo/ZVHPtqJZMWOPX1tO6Hze9p1/B7wkL7 # ziPPJkP+06t43An6iL3xKPQbrxYO9BEVZfVikbvqtr4p+w0CXi/03RlgF/oakoeb # 3JjxHu50cZvjST+cFAXTB6FYCeyJ1xNq7tAxqk3S7QxSNw+93PHvfbVPq1qOLwEj # jR3DRTNPWsGp8Hchd9fmjJn1tfayjCHKYYnovDOXbDHRtRCUA/qL6AysbwUUhZHH # Q8gVeAoUZhQUiTQ6KIpLGDAJUePN9EDVD52M+D1zJ6GCAg8wggILBgkqhkiG9w0B # CQYxggH8MIIB+AIBATB2MGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD # ZXJ0IEFzc3VyZWQgSUQgQ0EtMQIQA5/t7ct5W43tMgyJGfA2iTAJBgUrDgMCGgUA # oF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQw # NTA4MTczMjM4WjAjBgkqhkiG9w0BCQQxFgQURDyVbKCOWqFC3EwxF+w1j0zp7Mow # DQYJKoZIhvcNAQEBBQAEggEAqDzBetYly7qsn7cXqht8IkDbk83sgm2KoPXDQK6L # Oydctou9P9ktk9szCPwAXkxB+t2gZAAoItrPWVKzd1+wdG5pWYza+3HOnmIrBShr # bycQhUlhX4S4RryMKoQ3X3CT1fHM+LfI6Qonas5F1EVafHKMVjrkpYjQCXGTN8PK # vNtjaM+PCFWw0ImglcWIWB/cACLlItep2ou5G7/q1762vgurhY8O5UPwBo1CZ6Se # U28g09maQIWCYSCr/Ta9AnczbNvSwb2D7HZu4U9Tj5Cj8Rum5lwX5PBfAbPUys/P # Zz6U8tGpwpQpxxSxdZKwo30tBASoaQIAKYwycjmGa65n7w== # SIG # End signature block |