MSTeams.psm1
#Function 1 Function New-TeamsFromCSV { <# .SYNOPSIS Create MS Teams from CSV file. .DESCRIPTION Using this script, you can create Mirosoft Teams by importing details from csv file and this function use the MicrosoftTeams PowerShell Module. .EXAMPLE New-TeamsFromCSV -Path "C:\temp\TeamsDetails.CSV" Create Teams from CSV file. Sample CSV file format "TeamsName","TeamType","ChannelName","Owners","Members" "Testteam","Private","TestChannel;TestChanne2","admin@Tenantname.com","alexw@Tenantname.com" "Testteam2","Private","TestChanne3","alexw@Tenantname.com","admin@Tenantname.com" "Testteam3","Private","TestChanne2","alland@Tenantname.com","admin@Tenantname.com;AlexW@Tenantname.com;LeeG@Tenantname.com" Note: CSV Header: "TeamsName","TeamType","ChannelName","Owners","Members" You need to use ";" for multiple ChannelName,Owners and Members in the CSV file #> [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string] # Provide the CSV file path of the new Teams details. $Path ) function Create-Channel { param ( $ChannelName,$GroupId ) Process { try { $teamchannels = $ChannelName -split ";" if($teamchannels) { for($i =0; $i -le ($teamchannels.count - 1) ; $i++) { New-TeamChannel -GroupId $GroupId -DisplayName $teamchannels[$i] } } } Catch { } } } function Add-Users { param( $Users,$GroupId,$CurrentUsername,$Role ) Process { try{ $teamusers = $Users -split ";" if($teamusers) { for($j =0; $j -le ($teamusers.count - 1) ; $j++) { if($teamusers[$j] -ne $CurrentUsername) { Add-TeamUser -GroupId $GroupId -User $teamusers[$j] -Role $Role } } } } Catch { } } } function Create-NewTeam { param ( $ImportPath ) Process { Import-Module MicrosoftTeams $cred = Get-Credential $username = $cred.UserName Connect-MicrosoftTeams -Credential $cred $teams = Import-Csv -Path $ImportPath foreach($team in $teams) { $getteam= get-team |where-object { $_.displayname -eq $team.TeamsName} If($getteam -eq $null) { Write-Host "Start creating the team: " $team.TeamsName $group = New-Team -alias $team.TeamsName -displayname $team.TeamsName -AccessType $team.TeamType Write-Host "Creating channels..." Create-Channel -ChannelName $team.ChannelName -GroupId $group.GroupId Write-Host "Adding team members..." Add-Users -Users $team.Members -GroupId $group.GroupId -CurrentUsername $username -Role Member Write-Host "Adding team owners..." Add-Users -Users $team.Owners -GroupId $group.GroupId -CurrentUsername $username -Role Owner Write-Host "Completed creating the team: " $team.TeamsName $team=$null } } } } Create-NewTeam -ImportPath $Path } #function 2 Function Export-ArchivedTeams { <# .SYNOPSIS Export Archived Teams into CSV file. .DESCRIPTION Using this script, you can Export archived Mirosoft Teams into csv file and this function use the SharePointPnPPowerShellOnline Module. .EXAMPLE Export-ArchivedTeams -ExportPath "C:\temp\ArchivedTeamsDetails.CSV" Export Archived Teams into CSV file. #> [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string] # Provide the CSV file path to export Archived Teams details. $ExportPath ) process{ Connect-PnPOnline -Scopes "Group.Read.All","Group.ReadWrite.All" $accesstoken =Get-PnPAccessToken $group = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri "https://graph.microsoft.com/beta/groups?`$filter=resourceProvisioningOptions/any(c:c+eq+`'Team`')" -Method Get $TeamsList = @() $i=1 do { foreach($value in $group.value) { Write-Progress -Activity "Get All Groups" -status "Found Group $i" -percentComplete ($i / $group.value.count*100) $id= $value.id Try { $team = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri https://graph.microsoft.com/beta/teams/$id -Method Get if($team -ne $null -and $team.isArchived -eq $true) { $Teams = "" | Select "TeamsName","TeamType" $Teams.TeamsName = $value.displayname $Teams.TeamType = $value.visibility $TeamsList+= $Teams $Teams=$null } } Catch { $team = $null } $i++ } if ($group.'@odata.nextLink' -eq $null ) { break } else { $group = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri $group.'@odata.nextLink' -Method Get } }while($true); $TeamsList $TeamsList |Export-csv $ExportPath -NoTypeInformation } } #Function 3 function Export-TeamsList { <# .SYNOPSIS Export Microsoft Teams into CSV file. .DESCRIPTION Using this script, you can Export Mirosoft Teams into csv file and this function use the SharePointPnPPowerShellOnline Module. .EXAMPLE Export-TeamsList -ExportPath "C:\temp\TeamsList.CSV" Export Microsoft Teams into CSV file. #> [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string] # Provide the CSV file path to export Teams details. $ExportPath ) process{ Connect-PnPOnline -Scopes "Group.Read.All","User.ReadBasic.All" $accesstoken =Get-PnPAccessToken $MTeams = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri "https://graph.microsoft.com/beta/groups?`$filter=resourceProvisioningOptions/any(c:c+eq+`'Team`')" -Method Get $TeamsList = @() $i=1 do { foreach($value in $MTeams.value) { Write-Progress -Activity "Get All Teams" -status "Found Teams $i" $id= $value.id Try { $team = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri https://graph.microsoft.com/beta/Groups/$id/channels -Method Get } Catch { } $Owner = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri https://graph.microsoft.com/v1.0/Groups/$id/owners -Method Get $Members = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri https://graph.microsoft.com/v1.0/Groups/$id/Members -Method Get $Teams = "" | Select "TeamsName","TeamType","Channelcount","ChannelName","Owners","MembersCount","Members" $Teams.TeamsName = $value.displayname $Teams.TeamType = $value.visibility $Teams.ChannelCount = $team.value.id.count $Teams.ChannelName = $team.value.displayName -join ";" $Teams.Owners = $Owner.value.userPrincipalName -join ";" $Teams.MembersCount = $Members.value.userPrincipalName.count $Teams.Members = $Members.value.userPrincipalName -join ";" $TeamsList+= $Teams $teamaccesstype=$null $errorMessage =$null $Teams=$null $team =$null $i++ } if ($MTeams.'@odata.nextLink' -eq $null ) { break } else { $MTeams = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri $MTeams.'@odata.nextLink' -Method Get } }while($true); $TeamsList $TeamsList | Export-csv $ExportPath -NoTypeInformation } } #Function 4 Function Apply-TeamsPolicyFromCSV { <# .SYNOPSIS Apply teams policy to user accounts from CSV file. .DESCRIPTION Using this script, you can Apply teams policy to user accounts and this function use the SkypeOnlineConnector Module. .EXAMPLE Apply-TeamsPolicyFromCSV -Path "C:\temp\TeamsPolicy.CSV" Apply teams policy to user account from CSV file. Sample CSV file format Ex: UserPricipalName,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy admin@tenantname.com,Tag:AllowCalling,Tag:AllOn,Tag:Default,Tag:SfBWithTeamsCollabWithNotify alexw@tenantname.com,Tag:DisallowCalling,Global,Tag:EduFaculty,Global alland@tenantname.com,Global,Global,Global,Global Note: CSV Header: UserPricipalName,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy #> [CmdletBinding()] param( [Parameter(Mandatory=$True)] [string]$Path # Provide the CSV file path of the teams policy details. ) #connect Csonline $credential = Get-Credential $session = New-CsOnlineSession -Credential $credential Import-PSSession $session # Importing policy from csv file $Users=Import-Csv $Path foreach($User in $Users) { $UserPrincipalName=$User.UserPricipalName $CallingPolicy=$User.TeamsCallingPolicy $MeetingPolicy=$User.TeamsMeetingPolicy $MessagingPolicy=$User.TeamsMessagingPolicy $UpgradePolicy=$User.TeamsUpgradePolicy Get-CsOnlineUser|ForEach-Object{ $OnlineUser=$_ #Apply teams policy if($userprincipalname -eq $OnlineUser.userprincipalname){ if($CallingPolicy -eq 'Global'){ Grant-CsTeamsCallingPolicy -Identity $UserPrincipalName -PolicyName $null } else{ Grant-CsTeamsCallingPolicy -Identity $UserPrincipalName -PolicyName $CallingPolicy } if($MeetingPolicy -eq 'Global'){ Grant-CsTeamsMeetingPolicy -Identity $UserPrincipalName -PolicyName $null } else{ Grant-CsTeamsMeetingPolicy -Identity $UserPrincipalName -PolicyName $MeetingPolicy } if($MessagingPolicy -eq 'Global'){ Grant-CsTeamsMessagingPolicy -Identity $UserPrincipalName -PolicyName $null } else{ Grant-CsTeamsMessagingPolicy -Identity $UserPrincipalName -PolicyName $MessagingPolicy } if($UpgradePolicy -eq 'Global'){ Grant-CsTeamsUpgradePolicy -Identity $UserPrincipalName -PolicyName $null } else{ Grant-CsTeamsUpgradePolicy -Identity $UserPrincipalName -PolicyName $UpgradePolicy } } Else { Write-Host $UserPrincipalName "user is not available in the Azure Active directory" } } } #Creating some delay Start-Sleep -Seconds 90 #Checking given policy is applied or not. foreach($User in $Users){ $UserPrincipalName=$User.UserPricipalName Get-CsOnlineUser|ForEach-Object{ $OnlineUser=$_ if($userprincipalname -eq $OnlineUser.userprincipalname){ New-Object -TypeName PSObject -Property @{ UserPrincipalname = $OnlineUser.userprincipalname TeamsCallingPolicy = $OnlineUser.TeamsCallingPolicy TeamsMeetingPolicy = $OnlineUser.TeamsMeetingPolicy TeamsMessagingPolicy = $OnlineUser.TeamsMessagingPolicy TeamsUpgradePolicy = $OnlineUser.TeamsUpgradePolicy} } }|Select-Object userprincipalname,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy } } #Function 5 Function Export-TeamsPolicy { <# ..SYNOPSIS Export Microsoft Teams policy from the user accounts into CSV file. .DESCRIPTION Using this script, you can Export Mirosoft Teams policy into csv file and this function use the SkypeOnlineConnector Module. .EXAMPLE Export-TeamsPolicy -Path "C:\temp\TeamsPolicyDetails.CSV" Export Microsoft Teams policy from the user accounts into CSV file. #> [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string] # Provide the CSV file path to export Teams policy details. $Path ) #Connect Csonline $credential = Get-Credential $session = New-CsOnlineSession -Credential $credential Import-PSSession $session #Get CsOnline User $GetTeams = Get-CsOnlineUser|ForEach-Object{ $OnlineUser=$_ New-Object -TypeName PSObject -Property @{ UserPrincipalname = $OnlineUser.userprincipalname TeamsCallingPolicy = If($OnlineUser.TeamsCallingPolicy -eq $null){ "Global" } else {$OnlineUser.TeamsCallingPolicy} TeamsMeetingPolicy = If($OnlineUser.TeamsMeetingPolicy -eq $null){ "Global" } else {$OnlineUser.TeamsMeetingPolicy} TeamsMessagingPolicy = If($OnlineUser.TeamsMessagingPolicy-eq $null){ "Global" } else {$OnlineUser.TeamsMessagingPolicy} TeamsUpgradePolicy = If($OnlineUser.TeamsUpgradePolicy-eq $null){ "Global" } else {$OnlineUser.TeamsUpgradePolicy} } }|Select-Object userprincipalname,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy $GetTeamsPolicy $GetTeamsPolicy |Export-Csv -Path $Path -NoTypeInformation } # SIG # Begin signature block # MIIVHwYJKoZIhvcNAQcCoIIVEDCCFQwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU9pRcI9vrKa96Dd8MDTxmaKwd # g6agghAPMIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggWKMIIEcqADAgEC # AhARdWBE0+bdVK7ZFcy3SRIpMA0GCSqGSIb3DQEBCwUAMH0xCzAJBgNVBAYTAkdC # MRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQx # GjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMwIQYDVQQDExpDT01PRE8gUlNB # IENvZGUgU2lnbmluZyBDQTAeFw0xNzA3MjYwMDAwMDBaFw0yMDA3MjUyMzU5NTla # MIHKMQswCQYDVQQGEwJJTjEPMA0GA1UEEQwGNjI3MDA3MRMwEQYDVQQIDApUQU1J # TCBOQURVMRQwEgYDVQQHDAtUSVJVTkVMVkVMSTEaMBgGA1UECQwRQjI0NyBOR08g # QiBDT0xPTlkxKjAoBgNVBAoMIUpJSkkgVEVDSE5PTE9HSUVTIFBSSVZBVEUgTElN # SVRFRDELMAkGA1UECwwCSVQxKjAoBgNVBAMMIUpJSkkgVEVDSE5PTE9HSUVTIFBS # SVZBVEUgTElNSVRFRDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKfu # a/Kh5t7t8PBAdZWuNwFy/TEwj6kctrQGgMyg9CuK96almy7SyHmsFc/dcESxTzg6 # DirwrO9hZdfAup4RyblXSF7KqHlAd4o5MAb/+9jpHhcz0T10QKPUTXX7Wk1ZqJ+g # PVvlER9OiKcxC4PP+xQ8Ej2bbGvBO74HQxD3fM7VLvqXPuPSFt2j+O7QTATfjJ/S # xFUaulzB2vUza57PIetJ8QZolA/hpMGmaIX9dwWs+q/Og7MTO2/cC+NQIBUieKfO # vahw3D+KMmpPJHyA6LkNIXD/TqW5Zql6MJebgyH2gs8x8IPT6ZlgEK8OTXWSwI0o # JVai/xtyaeLEKn4WbNECAwEAAaOCAbYwggGyMB8GA1UdIwQYMBaAFCmRYP+KTfrr # +aZquM/55ku9Sc4SMB0GA1UdDgQWBBS9vYgyTH/kBe9uOfi3EV3eCgzppzAOBgNV # HQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzAR # BglghkgBhvhCAQEEBAMCBBAwRgYDVR0gBD8wPTA7BgwrBgEEAbIxAQIBAwIwKzAp # BggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLm5ldC9DUFMwQwYDVR0f # BDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29k # ZVNpZ25pbmdDQS5jcmwwdAYIKwYBBQUHAQEEaDBmMD4GCCsGAQUFBzAChjJodHRw # Oi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9SU0FDb2RlU2lnbmluZ0NBLmNydDAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMCcGA1UdEQQgMB6B # HHBlcnVtYWxAamlqaXRlY2hub2xvZ2llcy5jb20wDQYJKoZIhvcNAQELBQADggEB # ADyAXEEZ43JAzNpmMUPX+uKnWkI4ftxoOYrfAjPRPrNYVpVQNXiiYAk4NLVV0x7u # Gdu08rAzrH9zYqSf3TLIxYFr1ZRf5N/sgYOkgSbaNICs+W9iyJs6n+05fx346y96 # UgVv1ZPzuKkRTXTf5lXvPPwsA8cuHl36mzazMe1Y44zG1yfI+xW7Hj7LTdbW5Stp # Arbab1zvwUsJV+Bwi3Btc44YeeRW0awXaCdYxgln3Nvmbe95Nfa5B+EPyTnIcMaF # vFBSuJhx4knsXgTAtkuRm8yJSWly1KK24xzfBMLXxKpNMfJHjC1R+MYkEp/O61TR # EWm0dBeUBVjGU5Ip+4DKEvowggXgMIIDyKADAgECAhAufIfMDpNKUv6U/Ry3zTSv # MA0GCSqGSIb3DQEBDAUAMIGFMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRl # ciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8g # Q0EgTGltaXRlZDErMCkGA1UEAxMiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1 # dGhvcml0eTAeFw0xMzA1MDkwMDAwMDBaFw0yODA1MDgyMzU5NTlaMH0xCzAJBgNV # BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh # bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMwIQYDVQQDExpDT01P # RE8gUlNBIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC # AQoCggEBAKaYkGN3kTR/itHd6WcxEevMHv0xHbO5Ylc/k7xb458eJDIRJ2u8UZGn # z56eJbNfgagYDx0eIDAO+2F7hgmz4/2iaJ0cLJ2/cuPkdaDlNSOOyYruGgxkx9hC # oXu1UgNLOrCOI0tLY+AilDd71XmQChQYUSzm/sES8Bw/YWEKjKLc9sMwqs0oGHVI # wXlaCM27jFWM99R2kDozRlBzmFz0hUprD4DdXta9/akvwCX1+XjXjV8QwkRVPJA8 # MUbLcK4HqQrjr8EBb5AaI+JfONvGCF1Hs4NB8C4ANxS5Eqp5klLNhw972GIppH4w # vRu1jHK0SPLj6CH5XkxieYsCBp9/1QsCAwEAAaOCAVEwggFNMB8GA1UdIwQYMBaA # FLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBQpkWD/ik366/mmarjP+eZL # vUnOEjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUE # DDAKBggrBgEFBQcDAzARBgNVHSAECjAIMAYGBFUdIAAwTAYDVR0fBEUwQzBBoD+g # PYY7aHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ2VydGlmaWNhdGlv # bkF1dGhvcml0eS5jcmwwcQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRw # Oi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9SU0FBZGRUcnVzdENBLmNydDAkBggr # BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA # A4ICAQACPwI5w+74yjuJ3gxtTbHxTpJPr8I4LATMxWMRqwljr6ui1wI/zG8Zwz3W # GgiU/yXYqYinKxAa4JuxByIaURw61OHpCb/mJHSvHnsWMW4j71RRLVIC4nUIBUzx # t1HhUQDGh/Zs7hBEdldq8d9YayGqSdR8N069/7Z1VEAYNldnEc1PAuT+89r8dRfb # 7Lf3ZQkjSR9DV4PqfiB3YchN8rtlTaj3hUUHr3ppJ2WQKUCL33s6UTmMqB9wea1t # QiCizwxsA4xMzXMHlOdajjoEuqKhfB/LYzoVp9QVG6dSRzKp9L9kR9GqH1NOMjBz # wm+3eIKdXP9Gu2siHYgL+BuqNKb8jPXdf2WMjDFXMdA27Eehz8uLqO8cGFjFBnfK # S5tRr0wISnqP4qNS4o6OzCbkstjlOMKo7caBnDVrqVhhSgqXtEtCtlWdvpnncG1Z # +G0qDH8ZYF8MmohsMKxSCZAWG/8rndvQIMqJ6ih+Mo4Z33tIMx7XZfiuyfiDFJN2 # fWTQjs6+NX3/cjFNn569HmwvqI8MBlD7jCezdsn05tfDNOKMhyGGYf6/VXThIXcD # Cmhsu+TJqebPWSXrfOxFDnlmaOgizbjvmIVNlhE8CYrQf7woKBP7aspUjZJczcJl # mAaezkhb1LU3k0ZBfAfdz/pD77pnYf99SeC7MH1cgOPmFjlLpzGCBHowggR2AgEB # MIGRMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIx # EDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMw # IQYDVQQDExpDT01PRE8gUlNBIENvZGUgU2lnbmluZyBDQQIQEXVgRNPm3VSu2RXM # t0kSKTAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkq # hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGC # NwIBFTAjBgkqhkiG9w0BCQQxFgQUk4zAOe6LSmFxYm3emziFQCv6pDEwDQYJKoZI # hvcNAQEBBQAEggEAbaaTjrY1OInpibZp7sTpvGUFzR9uFMF5FUrkj4VozqJfJxUi # cVH9VYXT5CV8jNj4bVkAMr1q5IRltz7LPc1MmaVt3/q67LtZzuvjhlyKTQcwQ9ET # e/digReg8aDXpe+3gc7saG9DAtsfxmEAStjS29maAx1qjf7SKf3xbHWm0S+5e4+U # Uz+7yna0NWK3R6uuvd4h1KNr+FOjcsgMPkzKVDPD5uQxEr50a8iLYS7y+hBkn3sR # Vap7C20qNjvC77GZdqY3OsA1Z1WOWc1zVGubnhNKQd9NhPT522t6shNDpZ0MsFGm # uy+LynthAhXXigQ94dpR5JPxawIcNbT2T1jrb6GCAkMwggI/BgkqhkiG9w0BCQYx # ggIwMIICLAIBATCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYD # VQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 # b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMT # FFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfmMwswCQYFKw4DAhoF # AKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE4 # MDkxNzA2NTcyNFowIwYJKoZIhvcNAQkEMRYEFHRnAF7b9bEjy+EvaKUMICrU3Qjf # MA0GCSqGSIb3DQEBAQUABIIBAD+gB6+46PVRT7HcFvYnTmYDnvQ1rWHnWdQpIBJ+ # NCTXFPTN8stX7ji/NHAYlcxBJj/juLYEzFh6eusaBqO3VOzixQxWMFevXRf+UaUO # 0fSUmiB9mS2K1ePuoqpD2CjJCUFSAr/xP83TKOnCXAUHb6qJQ1NbOL+atNoWDNnb # JQzX6apEyoHYXJgbay6GueRONTn5E1OnvPryM4s50/lAIcZHuBBpneS66HYPlUgJ # BEDfnc8QlCjsEJpkBGg/+OXL+MqNYWOcotxCTRAuiEpPRRXaBGx6zpqDGafpSI82 # 0iszw38/DHaFShJp26Y1fBo/0Ns7QW5l+V8hzf3lcSYH4b8= # SIG # End signature block |