OfflinePowerShellGetSetup.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
# Requires -RunAsAdministrator
Function Save-PowerShellGetForOffline {
    <#
.SYNOPSIS
    Acquire PowerShellGet and related modules for offline use
.DESCRIPTION
    This function acquires all the items needed to do a disconnnected setup of PowerShellGet, PackageManagement, and Nuget.exe.
    The resultant folders are prepped to be deployed directly to target devices using Install-PowerShellGetOffline
    This module currently only supports Windows PowerShell.
     
    The script sequence assumes that you are installing everything as though these steps were performed by an administrator.
    One implication is that you must run the script as admin, which will ensure that the modules work for all users.
    For details on how to do this for non-admin users, review the documentation at:
    https://docs.microsoft.com/en-us/powershell/gallery/psget/repository/bootstrapping_nuget_proivder_and_exe
 
.EXAMPLE
     
    PS C:\> Save-PowerShellGetForOffline -LocalFolder c:\temp\PowerShellGetStuff
     
.PARAMETER LocalFolder
    Required, is the path to a folder where PowerShellGet, Package Management, and NuGet.Exe will be placed.
.PARAMETER NuGetSource
    Optional, is the path to NuGetv2.exe, which is accessible from the system where this is executed
 
#>
    
   

    [CmdletBinding()]
    Param (
        # Need a local folder to store things in, temporarily
        [Parameter(Mandatory = $true)]
        [string] $LocalFolder,
  

        [Parameter(Mandatory = $false)]
        [string] $NuGetSource = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
    )
    
    <#
        Validate the folder exists.
        If not, create it.
        If not possible, error.
    #>



    If (-not (test-path -path $LocalFolder)) {
        write-verbose "Creating folder $LocalFolder"
        new-item $LocalFolder -itemtype Directory
    }
    
    
    <#
        Acquire NuGet.exe and place it on the local system.
 
        NOTE that this step is ONLY needed to publish items to the "repository" you will use for your offline systems.
        It is not needed for systems where you are only acquiring things from the local repository.
    #>

    
    write-verbose "Acquiring Nuget.exe"
    $destination = Join-path (Resolve-Path $LocalFolder) 'nuget.exe'
    $wc = New-Object system.net.webclient
    $wc.downloadFile($NuGetSource, $destination)
     
    <#
        Save the current PackageManagement and PowerShellGet modules to the current folder
    #>

    write-verbose "Saving Packagemanagement module locally"
    Save-Module PackageManagement -Repository psgallery -path $LocalFolder 
    
    write-verbose "Saving PowerShellGet module locally"
    Save-Module PowerShellGet -Repository PsGallery -path $LocalFolder 
    
    <#
        Unblock the files just acquired from the web
    #>

    Get-ChildItem -Path $LocalFolder -recurse | Unblock-File
    
    <#
        Delete the PSGetModuleInfo.xml file from each module folder.
        This file is created during save-module, but if it is present, test-filecatalog for these modules will fail.
    #>

    
    Get-ChildItem -Path $LocalFolder -Filter psgetmoduleinfo.xml -force -Recurse | Remove-Item -force -Verbose
    
    <#
        The contents of this folder may now be copied to a file share for use with the script OfflinePowerShellGetSetup.ps1
    #>

}


Function Install-PowerShellGetOffline {
    <#
.SYNOPSIS
    Install PowerShellGet and related modules to a disconnected system
.DESCRIPTION
    This performs the steps needed for internet-disconnected systems to use PowerShellGet
    It takes a path (folder name) that has a copy of
        NuGet.Exe and
        The PowerShellGet module, unpacked and
        The PackageManagement modules, unpacked
     
    This will copy the PowerShellGet components from the LocalFolder into the proper locations for the local machine
 
    The script assumes that the installation will be done as an administrator on the target device, so that all users can use PowerShellGet after this.
    To find details on how to change the scope to the current user, see the documentation
.EXAMPLE
     
    PS C:\> Install-PowerShellGetOffline -LocalFolder \\testshare\temp\PowerShellGetStuff
     
.PARAMETER LocalFolder
    Required, is the path to a folder where PowerShellGet, Package Management, and NuGet.Exe have been placed using Save-PowerShellGetForOffline.
 
#>
    
   

[CmdletBinding()]

    Param (
        # Local folder containing NuGet, PackageManagement, and PowerShellGet
        [Parameter(Mandatory = $true)]
        [string] $LocalFolder = "C:\temp\demo"        
    )

    <#
    Confirm the LocalFolder has something resembling Nuget & the 2 modules
#>


    If ((-not(get-item $LocalFolder\nuget.exe)) -or (-not (get-item $LocalFolder\packagemanagement)) -or (-not (get-item $LocalFolder\powershellget))) {
        Throw "Error: The local folder must contain nuget.exe, the PackageManagement module, and the PowerShellGet module"
    }



    <#
 
    NuGet.exe is only required on systems used to publish to a PowerShellGet repository.
 
    Put NuGet.exe in the required location for the local system.
    Create the folder for Nuget.exe, if necessary
#>


    If (-not (Test-Path -Path "$env:ProgramData\Microsoft\Windows\PowerShell\PowerShellGet")) {

        New-Item "$env:ProgramData\Microsoft\Windows\PowerShell\PowerShellGet" -itemtype directory

    }

    
    If (-not (Test-Path -Path "$env:ProgramData\Microsoft\Windows\PowerShell\packagemanagement")) {

        New-Item "$env:ProgramData\Microsoft\Windows\PowerShell\PackageManagement" -itemtype directory

    }

    Copy-Item -Path @"
$($LocalFolder)\Nuget.exe
"@
 -Destination "$env:ProgramData\Microsoft\Windows\PowerShell\PowerShellGet"

    <#
 
    Copy the module folders for PackageManagement and PowerShellGet to the default installation location
    This script assumes that the current user is an administrator, to support copying to ProgramFiles.
     
#>


    Copy-Item -Path @"
$($LocalFolder)\PackageManagement\*.*
"@
 `
        -Recurse `
        -Destination "$env:ProgramFiles\WindowsPowerShell\modules\PackageManagement\" `
        -Force

    Copy-Item -Path @"
$($LocalFolder)\PowerShellGet\*.*
"@
 `
        -Recurse `
        -Destination "$env:ProgramFiles\WindowsPowerShell\modules\PowerShellGet\" `
        -Force

}


# SIG # Begin signature block
# MIIdoAYJKoZIhvcNAQcCoIIdkTCCHY0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUIMPe0jZ7YdGR87w9XIIvfacQ
# mtugghhuMIIE3jCCA8agAwIBAgITMwAAAP3H8MlqaaHITAAAAAAA/TANBgkqhkiG
# 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw
# HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTgwODIzMjAyMDEx
# WhcNMTkxMTIzMjAyMDExWjCBzjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEpMCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJp
# Y28xJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjU4NDctRjc2MS00RjcwMSUwIwYD
# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEAugmBPajBpzY0ZHXjUDiC9AfAkIV0Ha8AtmxzF9Jl
# V8sCiW6p+ICqQqBMZrPJP+ZpkhPZhYh5Ht7GgatuRrQCri7ofVWq7zTrUAuw2KMx
# PAMM3WCRR/EzDiJbM3szZuINNP7x1iRViw3a/k4hhsmrg8fxA99YfH/jJZTG2dyh
# VKQpKCniPj0UJBfn7NHr3pGsz9baz1/GLfcauWULHRrF5oX6KuLRRaTW0a2XncHe
# DWhb51jOGf0FPKJy9C3BZOnI1sBSt+F/3ktGWxB1X1VMOdlGUnTp7MPla3lX8Eyj
# TEHFfDHopomafcuVGywZrO2D3bYASSmgWdm4zPDJ3/OR8wIDAQABo4IBCTCCAQUw
# HQYDVR0OBBYEFCz7qm2AX+EztWS4EhA0Q9v96Q7YMB8GA1UdIwQYMBaAFCM0+NlS
# RnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwubWlj
# cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdFRpbWVTdGFtcFBD
# QS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcnQw
# EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggEBAE9ar13BCEvN
# IdYrQaKP/I2CllhWlBlgHzchX7N8UPIEQA1LwYo6SQNL7RY8oTmSaRqd7/EEUeUv
# ubwpmq3b065FKeikFnD3B1ynMJkQR7exsn6nJN+CGeBwff7T0GPTjqtrzYuZO1ZM
# 5/MjJVRNdg9l2lM0X3XtYXXyIC04fCprvomiAoAMPgK3q5khoQNldzjj+u61cEo+
# 04bcXaIRs9qw15f42XWsMcN6EWtJImEYAbTV0iYt+KC1ZG5aSls6ytrEML56uN9K
# iqeXz7hUSzw/YlPyhjTOCZX+/JMhwMmkBC/ZPbCqJ9ZGK4ZGzWsM99+tUK2ZuOl8
# 5tTL0CTU1Y8wggX/MIID56ADAgECAhMzAAABA14lHJkfox64AAAAAAEDMA0GCSqG
# SIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# KDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwHhcNMTgw
# NzEyMjAwODQ4WhcNMTkwNzI2MjAwODQ4WjB0MQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24w
# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRlHY25oarNv5p+UZ8i4hQ
# y5Bwf7BVqSQdfjnnBZ8PrHuXss5zCvvUmyRcFrU53Rt+M2wR/Dsm85iqXVNrqsPs
# E7jS789Xf8xly69NLjKxVitONAeJ/mkhvT5E+94SnYW/fHaGfXKxdpth5opkTEbO
# ttU6jHeTd2chnLZaBl5HhvU80QnKDT3NsumhUHjRhIjiATwi/K+WCMxdmcDt66Va
# mJL1yEBOanOv3uN0etNfRpe84mcod5mswQ4xFo8ADwH+S15UD8rEZT8K46NG2/Ys
# AzoZvmgFFpzmfzS/p4eNZTkmyWPU78XdvSX+/Sj0NIZ5rCrVXzCRO+QUauuxygQj
# AgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEEAYI3TAgBBggrBgEFBQcDAzAd
# BgNVHQ4EFgQUR77Ay+GmP/1l1jjyA123r3f3QP8wUAYDVR0RBEkwR6RFMEMxKTAn
# BgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMRYwFAYDVQQF
# Ew0yMzAwMTIrNDM3OTY1MB8GA1UdIwQYMBaAFEhuZOVQBdOCqhc3NyK1bajKdQKV
# MFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv
# cHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcmwwYQYIKwYBBQUH
# AQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcnQwDAYDVR0T
# AQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAn/XJUw0/DSbsokTYDdGfY5YGSz8e
# XMUzo6TDbK8fwAG662XsnjMQD6esW9S9kGEX5zHnwya0rPUn00iThoj+EjWRZCLR
# ay07qCwVlCnSN5bmNf8MzsgGFhaeJLHiOfluDnjYDBu2KWAndjQkm925l3XLATut
# ghIWIoCJFYS7mFAgsBcmhkmvzn1FFUM0ls+BXBgs1JPyZ6vic8g9o838Mh5gHOmw
# GzD7LLsHLpaEk0UoVFzNlv2g24HYtjDKQ7HzSMCyRhxdXnYqWJ/U7vL0+khMtWGL
# sIxB6aq4nZD0/2pCD7k+6Q7slPyNgLt44yOneFuybR/5WcF9ttE5yXnggxxgCto9
# sNHtNr9FB+kbNm7lPTsFA6fUpyUSj+Z2oxOzRVpDMYLa2ISuubAfdfX2HX1RETcn
# 6LU1hHH3V6qu+olxyZjSnlpkdr6Mw30VapHxFPTy2TUxuNty+rR1yIibar+YRcdm
# stf/zpKQdeTr5obSyBvbJ8BblW9Jb1hdaSreU0v46Mp79mwV+QMZDxGFqk+av6pX
# 3WDG9XEg9FGomsrp0es0Rz11+iLsVT9qGTlrEOlaP470I3gwsvKmOMs1jaqYWSRA
# uDpnpAdfoP7YO0kT+wzh7Qttg1DO8H8+4NkI6IwhSkHC3uuOW+4Dwx1ubuZUNWZn
# cnwa6lL2IsRyP64wggYHMIID76ADAgECAgphFmg0AAAAAAAcMA0GCSqGSIb3DQEB
# BQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNy
# b3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv
# cml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMxMzAzMDlaMHcxCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBU
# aW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ+h
# bLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn0UytdDAgEesH1VSVFUmUG0KS
# rphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0Zxws/HvniB3q506jocEjU8qN
# +kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4nrIZPVVIM5AMs+2qQkDBuh/NZ
# MJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YRJylmqJfk0waBSqL5hKcRRxQJ
# gp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54QTF3zJvfO4OToWECtR0Nsfz3
# m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8GA1UdEwEB/wQFMAMBAf8wHQYD
# VR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsGA1UdDwQEAwIBhjAQBgkrBgEE
# AYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJgQFYnl+UlE/wq4QpTlVnkpKFj
# pGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jv
# c29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9y
# aXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9j
# cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3Rj
# ZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cu
# bWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MBMG
# A1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBBQUAA4ICAQAQl4rDXANENt3p
# tK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1iuFcCy04gE1CZ3XpA4le7r1ia
# HOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+rkuTnjWrVgMHmlPIGL4UD6ZEq
# JCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGctxVEO6mJcPxaYiyA/4gcaMvnM
# MUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/FNSteo7/rvH0LQnvUU3Ih7jDK
# u3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbonXCUbKw5TNT2eb+qGHpiKe+i
# myk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0NbhOxXEjEiZ2CzxSjHFaRkMU
# vLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPpK+m79EjMLNTYMoBMJipIJF9a
# 6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2JoXZhtG6hE6a/qkfwEm/9ijJs
# sv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0eFQF1EEuUKyUsKV4q7OglnUa
# 2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng9wFlb4kLfchpyOZu6qeXzjEp
# /w7FW1zYTRuh2Povnj8uVRZryROj/TCCB3owggVioAMCAQICCmEOkNIAAAAAAAMw
# DQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv
# cml0eSAyMDExMB4XDTExMDcwODIwNTkwOVoXDTI2MDcwODIxMDkwOVowfjELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z
# b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
# ADCCAgoCggIBAKvw+nIQHC6t2G6qghBNNLrytlghn0IbKmvpWlCquAY4GgRJun/D
# DB7dN2vGEtgL8DjCmQawyDnVARQxQtOJDXlkh36UYCRsr55JnOloXtLfm1OyCizD
# r9mpK656Ca/XllnKYBoF6WZ26DJSJhIv56sIUM+zRLdd2MQuA3WraPPLbfM6XKEW
# 9Ea64DhkrG5kNXimoGMPLdNAk/jj3gcN1Vx5pUkp5w2+oBN3vpQ97/vjK1oQH01W
# KKJ6cuASOrdJXtjt7UORg9l7snuGG9k+sYxd6IlPhBryoS9Z5JA7La4zWMW3Pv4y
# 07MDPbGyr5I4ftKdgCz1TlaRITUlwzluZH9TupwPrRkjhMv0ugOGjfdf8NBSv4yU
# h7zAIXQlXxgotswnKDglmDlKNs98sZKuHCOnqWbsYR9q4ShJnV+I4iVd0yFLPlLE
# tVc/JAPw0XpbL9Uj43BdD1FGd7P4AOG8rAKCX9vAFbO9G9RVS+c5oQ/pI0m8GLhE
# fEXkwcNyeuBy5yTfv0aZxe/CHFfbg43sTUkwp6uO3+xbn6/83bBm4sGXgXvt1u1L
# 50kppxMopqd9Z4DmimJ4X7IvhNdXnFy/dygo8e1twyiPLI9AN0/B4YVEicQJTMXU
# pUMvdJX3bvh4IFgsE11glZo+TzOE2rCIF96eTvSWsLxGoGyY0uDWiIwLAgMBAAGj
# ggHtMIIB6TAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUSG5k5VAF04KqFzc3
# IrVtqMp1ApUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGG
# MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEj
# iTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
# aS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBe
# BggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDCB
# nwYDVR0gBIGXMIGUMIGRBgkrBgEEAYI3LgMwgYMwPwYIKwYBBQUHAgEWM2h0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvZG9jcy9wcmltYXJ5Y3BzLmh0bTBA
# BggrBgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBwAG8AbABpAGMAeQBfAHMAdABh
# AHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAZ/KGpZjgVHkaLtPY
# dGcimwuWEeFjkplCln3SeQyQwWVfLiw++MNy0W2D/r4/6ArKO79HqaPzadtjvyI1
# pZddZYSQfYtGUFXYDJJ80hpLHPM8QotS0LD9a+M+By4pm+Y9G6XUtR13lDni6WTJ
# RD14eiPzE32mkHSDjfTLJgJGKsKKELukqQUMm+1o+mgulaAqPyprWEljHwlpblqY
# luSD9MCP80Yr3vw70L01724lruWvJ+3Q3fMOr5kol5hNDj0L8giJ1h/DMhji8MUt
# zluetEk5CsYKwsatruWy2dsViFFFWDgycScaf7H0J/jeLDogaZiyWYlobm+nt3TD
# QAUGpgEqKD6CPxNNZgvAs0314Y9/HG8VfUWnduVAKmWjw11SYobDHWM2l4bf2vP4
# 8hahmifhzaWX0O5dY0HjWwechz4GdwbRBrF1HxS+YWG18NzGGwS+30HHDiju3mUv
# 7Jf2oVyW2ADWoUa9WfOXpQlLSBCZgB/QACnFsZulP0V3HjXG0qKin3p6IvpIlR+r
# +0cjgPWe+L9rt0uX4ut1eBrs6jeZeRhL/9azI2h15q/6/IvrC4DqaTuv/DDtBEyO
# 3991bWORPdGdVk5Pv4BXIqF4ETIheu9BCrE/+6jMpF3BoYibV3FWTkhFwELJm3Zb
# CoBIa/15n8G9bW1qyVJzEw16UM0xggScMIIEmAIBATCBlTB+MQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29k
# ZSBTaWduaW5nIFBDQSAyMDExAhMzAAABA14lHJkfox64AAAAAAEDMAkGBSsOAwIa
# BQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFJMv4j4v6leELi0o4bNDi5Ra
# Db27MFAGCisGAQQBgjcCAQwxQjBAoBaAFABQAG8AdwBlAHIAUwBoAGUAbABsoSaA
# JGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9Qb3dlclNoZWxsIDANBgkqhkiG9w0B
# AQEFAASCAQCNqfQSXgJ1xfIWoZSJvL5ytbBHs7BVOv2rH6ZbstZcis16FE7sBvWc
# ooXC/DEcni80eyQwLoeNcaN+rO+CcFReF7i707NBRsYUf5qF3QBcYYh3bZ+7Z0Mb
# ntMPzLMb5vQb9IokXD5xtD1T7olscBE1thzRL6E8BgC/9FSlfZHIG24olu7iumO0
# X6t0455Ga/t5ScvSZGjFHAC07ib0szObwz4jISv3rXIA3A975CrR0YZruObyQayr
# Utcw79NfcMD0vAZHpO3U2M5cfIDhrbSkRAJDvAeVggoyDNyTzjjlg8hKyAxKEqFp
# w4luu+bdWlV8KUNDAdvvXwGvmgsrsYipoYICKDCCAiQGCSqGSIb3DQEJBjGCAhUw
# ggIRAgEBMIGOMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# ITAfBgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQQITMwAAAP3H8MlqaaHI
# TAAAAAAA/TAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMTgxMTA2MTcxNDI3WjAjBgkqhkiG9w0BCQQxFgQUHm40
# lhGdK3Hmqt3wMUrQVUXpKy8wDQYJKoZIhvcNAQEFBQAEggEAPmt/fMN91BdSxR2b
# +uwY+fpy43wKP40+XLHmLyXuBDiVF2iGCrXMc0Wml+aDI11PKLpUlAdqY/lTPg+z
# j79LqTfRBEdxe0LKdIpl/dfGcvobncgq25zTKclP2XCQ02wE5RGsJzroNzyV0tsY
# FUwGsSrv5FyagHTFXrLMfVtGq3QDTyaZOv6RQ8FKnbk2GCAI/7+JUxYWOjnj+95M
# Q9kBNKwXTTJs4JpbAiYqPni0cJmUuXp8uEpfj5iAEfBSTTVPD/q90v1fWnvHd/8+
# Zkha/NgdzyqdU0RZtDeTqOR26K/j75IYc6/Zcogwxtepv2oA3B4MUMJgoTzAXMG7
# ypMJqQ==
# SIG # End signature block