Classes/Classes.ps1

class Constants
{
    static [System.String] $ConfigurationDirectoryName = ".aztoolsmigration"
    static [System.String] $ConfigurationFileName = "module-preferences.json"
    static [System.String] $NewFileBaseNameSuffix = "_az_upgraded"
    static [System.String] $PublicTelemetryInstrumentationKey = "7df6ff70-8353-4672-80d6-568517fed090"
    static [System.String] $CurrentSessionId = [System.GUID]::NewGuid().ToString()
    static [Microsoft.ApplicationInsights.TelemetryClient] $TelemetryClient = $null
    static [System.String] $HashMacAddress = $null
}

class ModulePreferences
{
    [System.Boolean] $DataCollectionEnabled
}

class AliasMapping
{
    [System.String] $Name
    [System.String] $ResolvedCommand
}

class CommandDefinitionParameter
{
    [System.String] $Name
    [System.String[]] $Aliases
}

class CommandDefinition
{
    [System.String] $Command
    [System.Boolean] $IsAlias
    [System.Boolean] $SupportsDynamicParameters
    [System.String] $SourceModule
    [System.String] $Version
    [System.Collections.Generic.List[CommandDefinitionParameter]] $Parameters
}

class CommandReferenceParameter
{
    [System.String] $FileName
    [System.String] $FullPath
    [System.String] $Name
    [System.Int32] $StartLine
    [System.Int32] $StartColumn
    [System.Int32] $EndLine
    [System.Int32] $EndPosition
    [System.Int32] $StartOffset
    [System.Int32] $EndOffset
    [System.String] $Location
}

class CommandReference
{
    [System.String] $FileName
    [System.String] $FullPath
    [System.Int32] $StartLine
    [System.Int32] $StartColumn
    [System.Int32] $EndLine
    [System.Int32] $EndPosition
    [System.Int32] $StartOffset
    [System.Int32] $EndOffset
    [System.String] $Location
    [System.Boolean] $HasSplattedArguments
    [System.String] $CommandName
    [System.Collections.Generic.List[CommandReferenceParameter]] $Parameters

    CommandReference()
    {
        $this.Parameters = New-Object -TypeName 'System.Collections.Generic.List[CommandReferenceParameter]'
    }
}

Enum EditMode
{
    ModifyExistingFiles
    SaveChangesToNewFiles
}

Enum UpgradeStepType
{
    Cmdlet
    CmdletParameter
}

Enum PlanResultReasonCode
{
    ReadyToUpgrade = 0
    WarningSplattedParameters = 1 # deprecated
    ErrorNoUpgradeAlias = 2
    ErrorNoModuleSpecMatch = 3
    ErrorParameterNotFound = 4
    WarningDynamicParameter = 5
}

Enum UpgradeResultReasonCode
{
    UpgradeCompleted = 0
    UpgradedWithWarnings = 1
    UnableToUpgrade = 2
    UpgradeActionFailed = 3
}

Enum DiagnosticSeverity
{
    Error = 1
    Warning = 2
    Information = 3
    Hint = 4
}

class UpgradePlan
{
    [System.Int32] $Order
    [UpgradeStepType] $UpgradeType
    [PlanResultReasonCode] $PlanResult
    [DiagnosticSeverity] $PlanSeverity
    [System.String] $PlanResultReason
    [CommandReference] $SourceCommand
    [CommandReferenceParameter] $SourceCommandParameter
    [System.String] $Location
    [System.String] $FullPath
    [System.Int32] $StartOffset
    [System.String] $Original
    [System.String] $Replacement
}

class UpgradeResult
{
    [System.Int32] $Order
    [UpgradeStepType] $UpgradeType
    [UpgradeResultReasonCode] $UpgradeResult
    [DiagnosticSeverity] $UpgradeSeverity
    [System.String] $UpgradeResultReason
    [CommandReference] $SourceCommand
    [CommandReferenceParameter] $SourceCommandParameter
    [System.String] $Location
    [System.String] $FullPath
    [System.Int32] $StartOffset
    [System.String] $Original
    [System.String] $Replacement

    UpgradeResult ([UpgradePlan] $Plan)
    {
        $this.Order = $Plan.Order
        $this.UpgradeType = $Plan.UpgradeType
        $this.SourceCommand = $Plan.SourceCommand
        $this.SourceCommandParameter = $Plan.SourceCommandParameter
        $this.Location = $Plan.Location
        $this.FullPath = $Plan.FullPath
        $this.StartOffset = $Plan.StartOffset
        $this.Original = $Plan.Original
        $this.Replacement = $Plan.Replacement

        # pre-stage the default results.
        # these will be used automatically unless the file fails to write.

        if ($Plan.PlanSeverity -eq [DiagnosticSeverity]::Warning)
        {
            $this.UpgradeResult = [UpgradeResultReasonCode]::UnableToUpgrade
            $this.UpgradeResultReason = $Plan.PlanResultReason
            $this.UpgradeSeverity = [DiagnosticSeverity]::Warning
        }
        elseif ($Plan.PlanSeverity -eq [DiagnosticSeverity]::Error)
        {
            $this.UpgradeResult = [UpgradeResultReasonCode]::UnableToUpgrade
            $this.UpgradeResultReason = $Plan.PlanResultReason
            $this.UpgradeSeverity = [DiagnosticSeverity]::Error
        }
        else
        {
            $this.UpgradeResultReason = "Automatic upgrade completed successfully."
            $this.UpgradeSeverity = [DiagnosticSeverity]::Information
        }
    }
}
# SIG # Begin signature block
# MIIoKAYJKoZIhvcNAQcCoIIoGTCCKBUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAtk/4UBqBfm9VW
# 3rkkWGzS1KfAuxSTTsp7ms7TlT0MY6CCDXYwggX0MIID3KADAgECAhMzAAADrzBA
# DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA
# hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG
# 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN
# xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL
# go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB
# tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd
# mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ
# 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY
# 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp
# XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn
# TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT
# e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG
# OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O
# PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk
# ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx
# HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt
# CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
# /Xmfwb1tbWrJUnMTDXpQzTGCGggwghoEAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGgdZWozgYtqGH07uSL0Wz1E
# WLTr/IVvcWZENq7AqSKLMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAlSQn3tdpkq3cLzgYR5fwG4r7JPhyg5OKKniwjfgCGoqI7F5rbkOYVutj
# kfJ5zSWZZa43UCiph9tHTGTpPnhx06jQ2fzAKC1mG+SryvpT+XbItRE9NwNVmuEe
# Be3FfBqXWLpPs2o6EBU1vMrhsRVe3SjWr6UgUJO73ym/nfHIe0IWZXZEaBqjJN28
# 8VTUSiLc/S194VXQQCCNBZrWklIFD3iBCPtb50aonMxyG/BBEOblXRLtZf4EqC/U
# J4f2H7USnsja0SeIDJDvb2dE6/o4zHuuwJbmOukZrhPOAsljLjRpHWgOUj/K2FP5
# oQEEaNyg/wXxiHhEV0u+StnRD2bUfqGCF5IwgheOBgorBgEEAYI3AwMBMYIXfjCC
# F3oGCSqGSIb3DQEHAqCCF2swghdnAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFQBgsq
# hkiG9w0BCRABBKCCAT8EggE7MIIBNwIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCAo9h6QLp88sGtFd1GnaHo7bYGdkRoF4fb833YqbIYKFQIGZc45eoyG
# GBEyMDI0MDIyNzA4NDQwOS4zWjAEgAIB9KCB0aSBzjCByzELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJp
# Y2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjk2MDAtMDVF
# MC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR
# 6jCCByAwggUIoAMCAQICEzMAAAHviT9WoVjMqNoAAQAAAe8wDQYJKoZIhvcNAQEL
# BQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE
# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjMxMjA2MTg0NTQ4
# WhcNMjUwMzA1MTg0NTQ4WjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjk2MDAtMDVFMC1EOTQ3MSUwIwYDVQQD
# ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEF
# AAOCAg8AMIICCgKCAgEAowtY4p8M4B8ITmpGaste6BOASASrJuZF+A1JggViNJRV
# aRIiuZmdioefbKC+J7OdqYRTEGBhuZMqQoqbp4MD/TaG+FRlROmqDKOYWfTcrV0e
# WUYG/WfDUehJiyiAkYQ+LKIzzIP0ZxkU3HX+/02L8jNdIy45i8ihHoDB37yMD5jP
# gD+4c0C3xMQ3agidruuBneV5Z6xTpLuVPYyzipNcu9HPk8LdOP0S6q7r9Xxj/C5m
# JrR76weE3AbAA10pnBY4dFYEJF+M1xcKpyBvK4GPsw6iWEDWT/DtWKOJEnJB0+N1
# wtKDONMntvvZf602IgxTN55WXto4bTpBgjuhqok6edMSPSE6SV4tLxHpPAHo0+Dy
# jBDtmz8VOt6et7mW43TeS/pYCHAjTAjSNEiKKUuIGlUeEsvyKA79bw1qXviNvPys
# vI1k3nndDtx8TyTGal+EAdyOg58Gax4ip+qBN/LYAUwggCrxKGDk4O69pRdCLm7f
# 9/lT7yrUwlG2TxThvI2bfaugBaHZb0J7YqJWCGLakqy8lwECJVxoWeIDXL+Hb9WA
# IpZ21gPQrJ2IfjihBa/+MODOvZSPsmqGdy/7f1H16U//snO4UvxaJXJqxhSUwWJU
# uJxNXLim5cGf1Dhtuki4QzjVlxmQyjCSjed6Di0kpOJXUdB5bG0+IXi5VpThJSUC
# AwEAAaOCAUkwggFFMB0GA1UdDgQWBBTtTFqihcKwm7a8PT/AOt2wFUicyzAfBgNV
# HSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5o
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBU
# aW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwG
# CCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRz
# L01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNV
# HRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIH
# gDANBgkqhkiG9w0BAQsFAAOCAgEAGBmWt2gg7nW5PRFXZD/MXEBmbiACD0cfStQg
# O7kcwbfNHwtGlpLmGIUDLxxyUR1KG0jOFMN8ze3xxDfIYWgQ2/TUWhpxVnbR8Zif
# XjM+iaZ+ioiMovVOToO0Ak2TJde59sOHnXaub7ZOK0Vjlb6YgwRiQESol1gfbtos
# dFh9hDBRh6oyIY1lF4T4EeAujShTVx71r13nCdll6yZ770BlwHzSRhEyWRqUeNZ1
# Dd4o34gkoxQ8Wphj7MuYmLvdOB7/brkl2HeZtCcX9ljSUl5DxpTYaztu6T8YE9dd
# ZsgEetUt0toXOe9szfcqCRDmxPfFcuShDN2V+d3C3nzfNRdQvaf3ACpBOrvVeq8s
# pf6koMbtVKnjmQrRv4mh0ijKMTOzKuEjBbD0//InjncApWKXMNAo2XuSgcdsS2uA
# dZ3hYm/CfP4EqLIzHRd5x4sh8dWHnWQ7cUkoHoHibItH21IHc7FTCWL6lcOdlqkD
# btBkQu/Wbla3lFSnQiZlDARwaU6elRaKS9CX+Eq4IPs0Q/YsG3Pbma5/vPaHaSJ2
# 852K5zyh4jtuqntXpDcJf3e66NiLT/5YIc9A6A+5BBnopCiVh3baO3lSaCYZK1HG
# p07lB9PIPjWMBukvj4wUgfzcjRemx2v8UfnHgGIXI8dIgYr/dDJ9CYhn5wNv4S4+
# Xr4U3AIwggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3
# DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIw
# MAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAx
# MDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVT
# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l
# LVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# 5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/
# XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1
# hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7
# M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3K
# Ni1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy
# 1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF80
# 3RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQc
# NIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahha
# YQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkL
# iWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV
# 2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIG
# CSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUp
# zxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBT
# MFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYI
# KwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGG
# MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186a
# GMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
# aS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsG
# AQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcN
# AQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1
# OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYA
# A7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbz
# aN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6L
# GYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3m
# Sj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0
# SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxko
# JLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFm
# PWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC482
# 2rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7
# vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDTTCC
# AjUCAQEwgfmhgdGkgc4wgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAl
# BgNVBAsTHm5TaGllbGQgVFNTIEVTTjo5NjAwLTA1RTAtRDk0NzElMCMGA1UEAxMc
# TWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAS3CP
# NYMW3mtRMdphW18e3JPtIP+ggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ
# Q0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAOmH4PIwIhgPMjAyNDAyMjcwNDE3NTRa
# GA8yMDI0MDIyODA0MTc1NFowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA6Yfg8gIB
# ADAHAgEAAgIHazAHAgEAAgIS9DAKAgUA6YkycgIBADA2BgorBgEEAYRZCgQCMSgw
# JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3
# DQEBCwUAA4IBAQClZ6RTw/rywl51pMWAXOUJLbpTpgg+HV7BEKQq2/RF+IQdFiQr
# 8JkpeQ87Iy7Y5PN1UGZgpbO2YMNBZxjtKKTRkY+0j5UH6gtsry1rjB/0sRANsQoz
# 0SCjEtlfaTmZhAvXdToyG9QjLDyOIZYzC3nma2hTeYuUHOYdmPd6ay8I1x7h5dZA
# Yxz7BRQ1mG+SY4y4aeregH2VabLz5xYM3ykgU+bpME/FKWqAJHbg+JUCUrAQkiZ0
# DQopOQg4eyqbf/bR829KlN4q/J8IRNZLJpy5Ecywtz34AQbTspfZOsihcE81pxcL
# WXn+0AkRfL67s04wEJKWDSqIJFXQbO0/y/VFMYIEDTCCBAkCAQEwgZMwfDELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z
# b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAHviT9WoVjMqNoAAQAAAe8wDQYJ
# YIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkq
# hkiG9w0BCQQxIgQgaoRqLRaKRAN5NwFaBJ8zd3LdXYWM/a8Iw55RJsso9OkwgfoG
# CyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCDwYShFuBaN8FM9PTUMdmtA23HbF/I6
# LzOS4sx5p8l/ozCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
# AhMzAAAB74k/VqFYzKjaAAEAAAHvMCIEIOl7W4uTz4x4Fw3Ytr2n3KAG3TinuXr7
# ayP5wUxUafB7MA0GCSqGSIb3DQEBCwUABIICAEryY9fn5HGETP5Krfpf7v3QN6gK
# 6PDhsVGDIBY2Q0pzNBVb79//TtH9X5Wr8ZBtbGo3ILiMDjE/zOrSwGAWMUkvruU4
# OETQczMrzER1gTRDJygX4aH8qCF5VyiumDP8vt/1ddqdzH+0w0V+UGZXEx4Qqcc/
# HxX/Ohx12vnf7lxwvFpP9343Pv4hoKixpLEPm0IT7x3hO20yyPJV7BzIelHmLD7X
# W7FKnm3TivfZlmMzJ6Mj+KvqXwD+eULLkYFh+OmsfpHeqPE2tsoCVIg5QfmedaIs
# oqhkuNSJ9CoX9jt/gtzNSfdPkpEqXh8jBIYrhYUdeBsylhZYo8nGTK0nSbgL0StS
# tbBbZn8kTGuAVa3U40D5OC2eDf62dLKd7eWqn3Ge31vvamNaUiscjXy7Avb84BoL
# kGFFJ8NiMARkryDLV6hw3wUKqNGCnuY1YoEIcz+xOGoAT8H3viv75mjhaTnQigfy
# mRx2S6UWXlf+DZQOp2TOg2y6XQDpy8R3VVDuJHY/UjynXVqopAU8oUOeRGwrOFr/
# oazOfxR/Yst5FFs36iitG/bQvzci9ApNi8XLIq/DcK1eLv+Av2i5Kl9qc/CF/k/3
# 1hQvEuCQcD9B9TcWzG7IvZmYJ/AQ3yJYO4wp6grMO7PbBoqJ0aZkgsPoxbnPnzfS
# 77Y68m2jmsKQTDZb
# SIG # End signature block