Workers/Get-SharedMailboxDeletions.Worker.ps1

<#
.SYNOPSIS
    Query shared mailbox deletion activity from the Unified Audit Log.
 
.DESCRIPTION
    Resolves the target mailbox, searches UAL using the mailbox SMTP address as
    FreeText, and returns normalized deletion records.
 
    Behavior:
    - Converts StartDate/EndDate to UTC before querying.
    - Paginates through UAL via Invoke-UnifiedAuditLogPaged.
    - Handles multiple AuditData shapes for Operation, Subject, Actor, and Time.
    - Supports optional SubjectContains (literal) and SubjectRegex filtering.
 
.PARAMETER Mailbox
    Mailbox identity to resolve (alias, UPN, SMTP, etc.).
 
.PARAMETER StartDate
    Query window start (local or UTC). Converted to UTC before search.
 
.PARAMETER EndDate
    Query window end (local or UTC). Converted to UTC before search.
 
.PARAMETER SubjectContains
    Optional case-insensitive literal subject fragments. Any match is included.
 
.PARAMETER SubjectRegex
    Optional regex patterns matched against Subject. Any match is included.
 
.PARAMETER Operations
    UAL operations to include. Defaults to MoveToDeletedItems, SoftDelete, and
    HardDelete.
 
.OUTPUTS
    PSCustomObject with:
    - TimeUtc
    - Operation
    - Actor
    - Mailbox
    - Subject
    - ClientIP
    - RecordId
 
.NOTES
    Expected runtime dependencies:
    - Resolve-Mailbox
    - Invoke-UnifiedAuditLogPaged
#>


[CmdletBinding()]
param(
    [Parameter(Mandatory)][string]$Mailbox,
    [Parameter(Mandatory)][datetime]$StartDate,
    [Parameter(Mandatory)][datetime]$EndDate,

    [string[]]$SubjectContains,
    [string[]]$SubjectRegex,

    # Expected: SoftDelete / HardDelete / MoveToDeletedItems (optionally Move)
    [string[]]$Operations = @('MoveToDeletedItems', 'SoftDelete', 'HardDelete')
)

# -------------------- Guards --------------------

if ($StartDate -gt $EndDate) {
    throw "StartDate cannot be later than EndDate."
}

# Normalize dates to UTC for UAL search
$startUtc = $StartDate.ToUniversalTime()
$endUtc = $EndDate.ToUniversalTime()

# Default ops defensively
if (-not $Operations -or $Operations.Count -eq 0) {
    $Operations = @('MoveToDeletedItems', 'SoftDelete', 'HardDelete')
}
else {
    $Operations = $Operations | Where-Object { $_ -and $_.Trim() } | ForEach-Object { $_.Trim() } | Select-Object -Unique
}

# -------------------- Resolve mailbox + FreeText (SMTP ONLY) --------------------

$mbx = Resolve-Mailbox -Identity $Mailbox

$freeText = if ($mbx -and $mbx.PSObject.Properties['PrimarySmtpAddress'] -and $mbx.PrimarySmtpAddress) {
    $mbx.PrimarySmtpAddress.ToString()
}
else {
    # fallback if resolve returns something unexpected
    $Mailbox
}

if ([string]::IsNullOrWhiteSpace($freeText)) {
    throw "Unable to resolve SMTP FreeText token for mailbox [$Mailbox]."
}

# -------------------- Query audit logs --------------------

$raw = Invoke-UnifiedAuditLogPaged `
    -StartDate $startUtc `
    -EndDate   $endUtc `
    -FreeText  $freeText `
    -Operations $Operations

if (-not $raw) { $raw = @() }

# -------------------- Local helpers --------------------

function Get-Prop {
    param($Object, [string]$Name)
    if ($Object -and $Object.PSObject.Properties[$Name]) {
        return $Object.$Name
    }
    return $null
}

function Get-NestedProp {
    param(
        $Object,
        [object[]]$Path
    )

    $cur = $Object

    foreach ($p in $Path) {

        if ($null -eq $cur) { return $null }

        if ($p -is [int]) {
            # Array index
            if ($cur -isnot [System.Collections.IList]) { return $null }
            if ($p -ge $cur.Count) { return $null }
            $cur = $cur[$p]
            continue
        }

        # Property name
        if (-not $cur.PSObject.Properties[$p]) { return $null }
        $cur = $cur.$p
    }

    return $cur
}

function Get-FirstNonEmpty {
    param([object[]]$Values)
    foreach ($v in $Values) {
        if ($null -ne $v -and -not [string]::IsNullOrWhiteSpace([string]$v)) {
            return [string]$v
        }
    }
    return $null
}

# -------------------- Transform + (light) scope --------------------

$records = foreach ($r in $raw) {

    # Parse JSON safely
    $auditJson = Get-Prop $r 'AuditData'
    if (-not $auditJson) { continue }

    try { $data = $auditJson | ConvertFrom-Json -ErrorAction Stop }
    catch { continue }

    # --- Resolve operation safely ---
    $operation = Get-FirstNonEmpty @(
        (Get-Prop $r 'Operation')
        (Get-Prop $r 'Operations')
        (Get-Prop $data 'Operation')
    )

    # --- Resolve time safely ---
    $timeUtc = Get-FirstNonEmpty @(
        (Get-Prop $r 'CreationDate')
        (Get-Prop $r 'CreationTime')
    )

    # --- Resolve mailbox owner safely ---
    $mailboxOwner = Get-FirstNonEmpty @(
        (Get-Prop $data 'MailboxOwnerUPN')
        (Get-Prop $data 'MailboxOwner')
        (Get-Prop $data 'Mailbox')
    )

    # --- Resolve subject safely ---
    $subject = Get-FirstNonEmpty @(
        (Get-NestedProp $data @('Item', 'Subject'))
        (Get-NestedProp $data @('AffectedItems', 0, 'Subject'))
        (Get-Prop $data 'Subject')
        (Get-NestedProp $data @('Item', 'SubjectTitle'))
    )

    # --- Resolve actor safely ---
    $actor = Get-FirstNonEmpty @(
        (Get-Prop $r 'UserId')
        (Get-Prop $data 'UserId')
        (Get-NestedProp $data @('Actor', 0, 'UserId'))
        (Get-NestedProp $data @('Actor', 0, 'ID'))
    )

    if ($subject -like 'IPM.Configuration.*') { continue }

    [pscustomobject]@{
        TimeUtc   = $timeUtc
        Operation = $operation
        Actor     = $actor
        Mailbox   = $mailboxOwner
        Subject   = $subject ?? '<not recorded>'
        ClientIP  = (Get-Prop $data 'ClientIP')
        RecordId  = (Get-Prop $r 'Id')
    }
}

# -------------------- Subject filters --------------------

$results = $records

if ($SubjectContains) {
    $needles = @(
        $SubjectContains |
        Where-Object { $_ -and $_.Trim() } |
        ForEach-Object { $_.Trim() } |
        Select-Object -Unique
    )

    if ($needles.Count -gt 0) {
        $results = $results | Where-Object {
            $sub = $_.Subject
            if (-not $sub) { return $false }
            foreach ($n in $needles) {
                if ($sub -like "*$n*") { return $true }
            }
            return $false
        }
    }
}

if ($SubjectRegex) {
    $regexes = $SubjectRegex |
    Where-Object { $_ -and $_.Trim() } |
    ForEach-Object { $_.Trim() } |
    Select-Object -Unique

    if ($regexes.Count -gt 0) {
        $results = $results | Where-Object {
            $sub = $_.Subject
            if (-not $sub) { return $false }
            foreach ($rx in $regexes) {
                if ($sub -match $rx) { return $true }
            }
            return $false
        }
    }
}

Write-Log -level Ok -Message ("Matched {0} record(s) for mailbox [{1}]" -f @($results).Count, $freeText)

# -------------------- Output --------------------

$results | Sort-Object TimeUtc -Descending

# SIG # Begin signature block
# MIIfAgYJKoZIhvcNAQcCoIIe8zCCHu8CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD8u992fy8QvIX7
# Ao40EWHwPl5Yv3z0R/lIgyRV4aXEfKCCGEowggUMMIIC9KADAgECAhAR+U4xG7FH
# qkyqS9NIt7l5MA0GCSqGSIb3DQEBCwUAMB4xHDAaBgNVBAMME1ZBRFRFSyBDb2Rl
# IFNpZ25pbmcwHhcNMjUxMjE5MTk1NDIxWhcNMjYxMjE5MjAwNDIxWjAeMRwwGgYD
# VQQDDBNWQURURUsgQ29kZSBTaWduaW5nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEA3pzzZIUEY92GDldMWuzvbLeivHOuMupgpwbezoG5v90KeuN03S5d
# nM/eom/PcIz08+fGZF04ueuCS6b48q1qFnylwg/C/TkcVRo0WFcKoFGT8yGxdfXi
# caHtapZfbSRh73r7qR7w0CioVveNBVgfMsTgE0WKcuwxemvIe/ptmkfzwAiw/IAC
# Ib0E0BjiX4PySbwWy/QKy/qMXYY19xpRItVTKNBtXzADUtzPzUcFqJU83vM2gZFs
# Or0MhPvM7xEVkOWZFBAWAubbMCJ3rmwyVv9keVDJChhCeLSz2XR11VGDOEA2OO90
# Y30WfY9aOI2sCfQcKMeJ9ypkHl0xORdhUwZ3Wz48d3yJDXGkduPm2vl05RvnA4T6
# 29HVZTmMdvP2475/8nLxCte9IB7TobAOGl6P1NuwplAMKM8qyZh62Br23vcx1fXZ
# TJlKCxBFx1nTa6VlIJk+UbM4ZPm954peB/fIqEacm8LkZ0cPwmLE5ckW7hfK4Trs
# o+RaudU1sKeA+FvpOWgsPccVRWcEYyGkwbyTB3xrIBXA+YckbANZ0XL7fv7x29hn
# gXbZipGu3DnTISiFB43V4MhNDKZYfbWdxze0SwLe8KzIaKnwlwRgvXDMwXgk99Mi
# EbYa3DvA/5ZWikLW9PxBFD7Vdr8ZiG/tRC9I2Y6fnb+PVoZKc/2xsW0CAwEAAaNG
# MEQwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQW
# BBRfYLVE8caSc990rnrIHUjoB7X/KjANBgkqhkiG9w0BAQsFAAOCAgEAiGB2Wmk3
# QBtd1LcynmxHzmu+X4Y5DIpMMNC2ahsqZtPUVcGqmb5IFbVuAdQphL6PSrDjaAR8
# 1S8uTfUnMa119LmIb7di7TlH2F5K3530h5x8JMj5EErl0xmZyJtSg7BTiBA/UrMz
# 6WCf8wWIG2/4NbV6aAyFwIojfAcKoO8ng44Dal/oLGzLO3FDE5AWhcda/FbqVjSJ
# 1zMfiW8odd4LgbmoyEI024KkwOkkPyJQ2Ugn6HMqlFLazAmBBpyS7wxdaAGrl18n
# 6bS7QuAwCd9hitdMMitG8YyWL6tKeRSbuTP5E+ASbu0Ga8/fxRO5ZSQhO6/5ro1j
# PGe1/Kr49Uyuf9VSCZdNIZAyjjeVAoxmV0IfxQLKz6VOG0kGDYkFGskvllIpQbQg
# WLuPLJxoskJsoJllk7MjZJwrpr08+3FQnLkRuisjDOc3l4VxFUsUe4fnJhMUONXT
# Sk7vdspgxirNbLmXU4yYWdsizz3nMUR0zebUW29A+HYme16hzrMPOeyoQjy4I5XX
# 3wXAFdworfPEr/ozDFrdXKgbLwZopymKbBwv6wtT7+1zVhJXr+jGVQ1TWr6R+8ea
# tIOFnY7HqGaxe5XB7HzOwJKdj+bpHAfXft1vUoiKr16VajLigcYCG8MdwC3sngO3
# JDyv2V+YMfsYBmItMGBwvizlQ6557NbK95EwggWNMIIEdaADAgECAhAOmxiO+dAt
# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa
# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E
# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy
# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF
# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1
# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB
# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR
# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6
# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB
# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S
# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x
# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB
# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP
# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC
# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv
# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB
# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc
# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov
# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy
# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW
# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF
# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z
# twGpn1eqXijiuZQwgga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIMOkmGMA0GCSqG
# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy
# dXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQyMzU5NTlaMGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYg
# MjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0eDHTCphB
# cr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq+RuwOnPhof6p
# vF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyFQ/4Bt0mAxAHe
# HYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOECS1UkxBvMgEd
# gkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdglTcaarps0wjU
# jsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZa/zbCclF83bR
# VFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLrfxnGpTXiUOeS
# LsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy3tW/AMOMCZIV
# NSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJWnY0v5ydPpOjL
# 6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdgJMoiwOrUG2Zd
# SoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJSjNm2qA+sdFU
# eEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkwEgYDVR0TAQH/
# BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ensy04wHwYDVR0j
# BBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0
# cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8E
# PDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz
# dGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEw
# DQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSmf83Qh8WIGjB/
# T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83afsl3YTj+IQhQ
# E7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5nWMQwr8Myb9r
# EVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ2iA/wdG2th9y
# 1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu4y81hjajV/gx
# dEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgcGV00TYr2Lr3t
# y9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+qNNjqFzeGxcy
# tL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll38F0cuJG7uEB
# YTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66RzIg9sC+NJpud
# /v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDpMPx0LckTetiS
# uEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8WhbaM2tszWkPZP
# ubdcMIIG7TCCBNWgAwIBAgIQCoDvGEuN8QWC0cR2p5V0aDANBgkqhkiG9w0BAQsF
# ADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV
# BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hB
# MjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkwMzIzNTk1OVowYzEL
# MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJE
# aWdpQ2VydCBTSEEyNTYgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIwMjUg
# MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANBGrC0Sxp7Q6q5gVrMr
# V7pvUf+GcAoB38o3zBlCMGMyqJnfFNZx+wvA69HFTBdwbHwBSOeLpvPnZ8ZN+vo8
# dE2/pPvOx/Vj8TchTySA2R4QKpVD7dvNZh6wW2R6kSu9RJt/4QhguSssp3qome7M
# rxVyfQO9sMx6ZAWjFDYOzDi8SOhPUWlLnh00Cll8pjrUcCV3K3E0zz09ldQ//nBZ
# ZREr4h/GI6Dxb2UoyrN0ijtUDVHRXdmncOOMA3CoB/iUSROUINDT98oksouTMYFO
# nHoRh6+86Ltc5zjPKHW5KqCvpSduSwhwUmotuQhcg9tw2YD3w6ySSSu+3qU8DD+n
# igNJFmt6LAHvH3KSuNLoZLc1Hf2JNMVL4Q1OpbybpMe46YceNA0LfNsnqcnpJeIt
# K/DhKbPxTTuGoX7wJNdoRORVbPR1VVnDuSeHVZlc4seAO+6d2sC26/PQPdP51ho1
# zBp+xUIZkpSFA8vWdoUoHLWnqWU3dCCyFG1roSrgHjSHlq8xymLnjCbSLZ49kPmk
# 8iyyizNDIXj//cOgrY7rlRyTlaCCfw7aSUROwnu7zER6EaJ+AliL7ojTdS5PWPsW
# eupWs7NpChUk555K096V1hE0yZIXe+giAwW00aHzrDchIc2bQhpp0IoKRR7YufAk
# prxMiXAJQ1XCmnCfgPf8+3mnAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAAMB0G
# A1UdDgQWBBTkO/zyMe39/dfzkXFjGVBDz2GM6DAfBgNVHSMEGDAWgBTvb1NK6eQG
# fHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYIKwYB
# BQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
# cC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRpZ2lj
# ZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEy
# NTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5kaWdp
# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2U0hB
# MjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcB
# MA0GCSqGSIb3DQEBCwUAA4ICAQBlKq3xHCcEua5gQezRCESeY0ByIfjk9iJP2zWL
# pQq1b4URGnwWBdEZD9gBq9fNaNmFj6Eh8/YmRDfxT7C0k8FUFqNh+tshgb4O6Lgj
# g8K8elC4+oWCqnU/ML9lFfim8/9yJmZSe2F8AQ/UdKFOtj7YMTmqPO9mzskgiC3Q
# YIUP2S3HQvHG1FDu+WUqW4daIqToXFE/JQ/EABgfZXLWU0ziTN6R3ygQBHMUBaB5
# bdrPbF6MRYs03h4obEMnxYOX8VBRKe1uNnzQVTeLni2nHkX/QqvXnNb+YkDFkxUG
# tMTaiLR9wjxUxu2hECZpqyU1d0IbX6Wq8/gVutDojBIFeRlqAcuEVT0cKsb+zJNE
# suEB7O7/cuvTQasnM9AWcIQfVjnzrvwiCZ85EE8LUkqRhoS3Y50OHgaY7T/lwd6U
# Arb+BOVAkg2oOvol/DJgddJ35XTxfUlQ+8Hggt8l2Yv7roancJIFcbojBcxlRcGG
# 0LIhp6GvReQGgMgYxQbV1S3CrWqZzBt1R9xJgKf47CdxVRd/ndUlQ05oxYy2zRWV
# FjF7mcr4C34Mj3ocCVccAvlKV9jEnstrniLvUxxVZE/rptb7IRE2lskKPIJgbaP5
# t2nGj/ULLi49xTcBZU8atufk+EMF/cWuiC7POGT75qaL6vdCvHlshtjdNXOCIUjs
# arfNZzGCBg4wggYKAgEBMDIwHjEcMBoGA1UEAwwTVkFEVEVLIENvZGUgU2lnbmlu
# ZwIQEflOMRuxR6pMqkvTSLe5eTANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3
# AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
# AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCDl+9lB6yww
# vba54QacGHBHw5P0V7mpfuuZ5Ve8Duj+djANBgkqhkiG9w0BAQEFAASCAgDL/NuB
# g0mhdfnBFuBUQILtc+drCQ1MY+ww/S2WnmD6EUxg4mPMTGFCDiKDM5/cLvvOzHkZ
# KT9dGuJlZ0gG1XpMwxhP+eEgG29FjaYQ3Y9wNI5/GV3DOi77psOeQjES6gMogyUE
# luDTJ4JksPiklkiw4I5NNYZd5HXysaVW+vWR1YU3Xj+jNGl/mYRtfigYhWuNw9cN
# nEiRU8s0pmJ9oZjiVl67l/tbi2PZKlpe9hi5B9EyWlNHQ8wG/G5/0GIQ6JjlGvms
# OGiYvN4ihGz7KvCEQCKRBGhFFI4Engaxeb+nO//IDM88pp50BdfOeUj2yfhzir/R
# rxDIQYAHiMcGvcVQdlfI59Btus/InTQFVij56EQNM2EaWe50xSuxFzc5APYjoitd
# 0e7KKRd4ARc+msuryhaBaqy3pciVxT0gQDaX/wcNPbmPzxB7rcXxDHNWSwkQv2yh
# XV3BuFg4DDUFqR0R7vzVnPpEp+0uUN5eLlgP1uuWxxMIk4J5fBpa8+eU26RXXL7K
# PvsRCWKDw0ovCde4mbDrqs3PyBG0+VP9Js4+oyyXxBWkoTpKhIm+9mxJ+KcWjJZk
# nZEyKUwkE/S6pJXxsANddwZXFhKKxCfl+zmAtbgpaTA3Tp2H7E2kWrxnIzOocdMU
# FDsrNK16AD1kcyUqlXzmGvABiBu2PTuNmMLrUqGCAyYwggMiBgkqhkiG9w0BCQYx
# ggMTMIIDDwIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcg
# UlNBNDA5NiBTSEEyNTYgMjAyNSBDQTECEAqA7xhLjfEFgtHEdqeVdGgwDQYJYIZI
# AWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJ
# BTEPFw0yNjAzMzEyMzMyMjJaMC8GCSqGSIb3DQEJBDEiBCA/sFSkaYUWCdufswin
# 3RVdeL+WJfXrcdS/88973rQGzTANBgkqhkiG9w0BAQEFAASCAgA/8ja6wyv1A4Pm
# TnTh9s0BSsc/Moyec7U1juuDxa5sqVs8azwUKZ4ZqdEL2oQ2G/EupRP0pfdKGoE6
# 9vlZ/DGL63A+jKgc2mg3b3VXh2OtvGMHcQdympmL91Bcos7HAL1zepGEVtOEkuMq
# tZa6gPzYOODSPUn66oCdauVEZiJvfDKCaLRqcImrfeBRr0peP9r5ivV1QqaJvecL
# eJrEXJ3kSWyupdnXhufOLvZra5GAWS4ZF/rz+03oO+8hr7ZnQD18GGfVmhOIVA1h
# dPojCZunbzYa1rEvhos8CEO/RolkgSxPEOSIMSa2n8tL8AVd8LhfjkcOsr22X4O1
# Ok8k3Xxp6eR0sE7jo6bKsFVWKMNbNvlLVQXnEzvcpVkMpCu+e+wtLBTEDQ9dEIRk
# bPp3p5werqvQnW5Im5zDg6ifNVMgGRguzV+hxQoagqJ9o5rlTWPN0R1TgSzqeSRl
# MzfHzOtAm0ND6a3i1x0emE06eH1nbj6UaJg19vgYOUzYk0XubwOVSI3t1XlmT2VZ
# aVFbZ7Yu9QAv69zin5ir2TB1N65VLWfyR5Ko0lZWTvlFX/YeXYAHmtHcZj3cLPwu
# eiiPiFgoi+isfhN0ffBCCmHxXIPXVq4MtCyq+tzNz08UqtKB+TDrlwLNdiwu4tEJ
# sR41Y1AJz5feEUFnz+oUEqzKSukKdw==
# SIG # End signature block