Spaces:
Running
Running
Upload 25 files
Browse files- MLPY/Scripts/Activate.ps1 +437 -0
- MLPY/Scripts/__pycache__/pywin32_postinstall.cpython-39.pyc +0 -0
- MLPY/Scripts/__pycache__/pywin32_testall.cpython-39.pyc +0 -0
- MLPY/Scripts/activate +66 -0
- MLPY/Scripts/activate.bat +33 -0
- MLPY/Scripts/backend-test-tools.exe +0 -0
- MLPY/Scripts/check-model.exe +0 -0
- MLPY/Scripts/check-node.exe +0 -0
- MLPY/Scripts/convert-caffe2-to-onnx.exe +0 -0
- MLPY/Scripts/convert-onnx-to-caffe2.exe +0 -0
- MLPY/Scripts/deactivate.bat +21 -0
- MLPY/Scripts/f2py.exe +0 -0
- MLPY/Scripts/isympy.exe +0 -0
- MLPY/Scripts/markdown_py.exe +0 -0
- MLPY/Scripts/mlagents-learn.exe +0 -0
- MLPY/Scripts/mlagents-run-experiment.exe +0 -0
- MLPY/Scripts/pip.exe +0 -0
- MLPY/Scripts/pip3.9.exe +0 -0
- MLPY/Scripts/pip3.exe +0 -0
- MLPY/Scripts/python.exe +0 -0
- MLPY/Scripts/pythonw.exe +0 -0
- MLPY/Scripts/pywin32_postinstall.py +783 -0
- MLPY/Scripts/pywin32_testall.py +124 -0
- MLPY/Scripts/tensorboard.exe +0 -0
- MLPY/Scripts/torchrun.exe +0 -0
MLPY/Scripts/Activate.ps1
ADDED
@@ -0,0 +1,437 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<#
|
2 |
+
.Synopsis
|
3 |
+
Activate a Python virtual environment for the current PowerShell session.
|
4 |
+
|
5 |
+
.Description
|
6 |
+
Pushes the python executable for a virtual environment to the front of the
|
7 |
+
$Env:PATH environment variable and sets the prompt to signify that you are
|
8 |
+
in a Python virtual environment. Makes use of the command line switches as
|
9 |
+
well as the `pyvenv.cfg` file values present in the virtual environment.
|
10 |
+
|
11 |
+
.Parameter VenvDir
|
12 |
+
Path to the directory that contains the virtual environment to activate. The
|
13 |
+
default value for this is the parent of the directory that the Activate.ps1
|
14 |
+
script is located within.
|
15 |
+
|
16 |
+
.Parameter Prompt
|
17 |
+
The prompt prefix to display when this virtual environment is activated. By
|
18 |
+
default, this prompt is the name of the virtual environment folder (VenvDir)
|
19 |
+
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
20 |
+
|
21 |
+
.Example
|
22 |
+
Activate.ps1
|
23 |
+
Activates the Python virtual environment that contains the Activate.ps1 script.
|
24 |
+
|
25 |
+
.Example
|
26 |
+
Activate.ps1 -Verbose
|
27 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
28 |
+
and shows extra information about the activation as it executes.
|
29 |
+
|
30 |
+
.Example
|
31 |
+
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
32 |
+
Activates the Python virtual environment located in the specified location.
|
33 |
+
|
34 |
+
.Example
|
35 |
+
Activate.ps1 -Prompt "MyPython"
|
36 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
37 |
+
and prefixes the current prompt with the specified string (surrounded in
|
38 |
+
parentheses) while the virtual environment is active.
|
39 |
+
|
40 |
+
.Notes
|
41 |
+
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
42 |
+
execution policy for the user. You can do this by issuing the following PowerShell
|
43 |
+
command:
|
44 |
+
|
45 |
+
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
46 |
+
|
47 |
+
For more information on Execution Policies:
|
48 |
+
https://go.microsoft.com/fwlink/?LinkID=135170
|
49 |
+
|
50 |
+
#>
|
51 |
+
Param(
|
52 |
+
[Parameter(Mandatory = $false)]
|
53 |
+
[String]
|
54 |
+
$VenvDir,
|
55 |
+
[Parameter(Mandatory = $false)]
|
56 |
+
[String]
|
57 |
+
$Prompt
|
58 |
+
)
|
59 |
+
|
60 |
+
<# Function declarations --------------------------------------------------- #>
|
61 |
+
|
62 |
+
<#
|
63 |
+
.Synopsis
|
64 |
+
Remove all shell session elements added by the Activate script, including the
|
65 |
+
addition of the virtual environment's Python executable from the beginning of
|
66 |
+
the PATH variable.
|
67 |
+
|
68 |
+
.Parameter NonDestructive
|
69 |
+
If present, do not remove this function from the global namespace for the
|
70 |
+
session.
|
71 |
+
|
72 |
+
#>
|
73 |
+
function global:deactivate ([switch]$NonDestructive) {
|
74 |
+
# Revert to original values
|
75 |
+
|
76 |
+
# The prior prompt:
|
77 |
+
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
78 |
+
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
79 |
+
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
80 |
+
}
|
81 |
+
|
82 |
+
# The prior PYTHONHOME:
|
83 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
84 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
85 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
86 |
+
}
|
87 |
+
|
88 |
+
# The prior PATH:
|
89 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
90 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
91 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
92 |
+
}
|
93 |
+
|
94 |
+
# Just remove the VIRTUAL_ENV altogether:
|
95 |
+
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
96 |
+
Remove-Item -Path env:VIRTUAL_ENV
|
97 |
+
}
|
98 |
+
|
99 |
+
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
100 |
+
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
101 |
+
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
102 |
+
}
|
103 |
+
|
104 |
+
# Leave deactivate function in the global namespace if requested:
|
105 |
+
if (-not $NonDestructive) {
|
106 |
+
Remove-Item -Path function:deactivate
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
<#
|
111 |
+
.Description
|
112 |
+
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
113 |
+
given folder, and returns them in a map.
|
114 |
+
|
115 |
+
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
116 |
+
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
117 |
+
then it is considered a `key = value` line. The left hand string is the key,
|
118 |
+
the right hand is the value.
|
119 |
+
|
120 |
+
If the value starts with a `'` or a `"` then the first and last character is
|
121 |
+
stripped from the value before being captured.
|
122 |
+
|
123 |
+
.Parameter ConfigDir
|
124 |
+
Path to the directory that contains the `pyvenv.cfg` file.
|
125 |
+
#>
|
126 |
+
function Get-PyVenvConfig(
|
127 |
+
[String]
|
128 |
+
$ConfigDir
|
129 |
+
) {
|
130 |
+
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
131 |
+
|
132 |
+
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
133 |
+
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
134 |
+
|
135 |
+
# An empty map will be returned if no config file is found.
|
136 |
+
$pyvenvConfig = @{ }
|
137 |
+
|
138 |
+
if ($pyvenvConfigPath) {
|
139 |
+
|
140 |
+
Write-Verbose "File exists, parse `key = value` lines"
|
141 |
+
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
142 |
+
|
143 |
+
$pyvenvConfigContent | ForEach-Object {
|
144 |
+
$keyval = $PSItem -split "\s*=\s*", 2
|
145 |
+
if ($keyval[0] -and $keyval[1]) {
|
146 |
+
$val = $keyval[1]
|
147 |
+
|
148 |
+
# Remove extraneous quotations around a string value.
|
149 |
+
if ("'""".Contains($val.Substring(0, 1))) {
|
150 |
+
$val = $val.Substring(1, $val.Length - 2)
|
151 |
+
}
|
152 |
+
|
153 |
+
$pyvenvConfig[$keyval[0]] = $val
|
154 |
+
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
155 |
+
}
|
156 |
+
}
|
157 |
+
}
|
158 |
+
return $pyvenvConfig
|
159 |
+
}
|
160 |
+
|
161 |
+
|
162 |
+
<# Begin Activate script --------------------------------------------------- #>
|
163 |
+
|
164 |
+
# Determine the containing directory of this script
|
165 |
+
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
166 |
+
$VenvExecDir = Get-Item -Path $VenvExecPath
|
167 |
+
|
168 |
+
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
169 |
+
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
170 |
+
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
171 |
+
|
172 |
+
# Set values required in priority: CmdLine, ConfigFile, Default
|
173 |
+
# First, get the location of the virtual environment, it might not be
|
174 |
+
# VenvExecDir if specified on the command line.
|
175 |
+
if ($VenvDir) {
|
176 |
+
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
177 |
+
}
|
178 |
+
else {
|
179 |
+
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
180 |
+
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
181 |
+
Write-Verbose "VenvDir=$VenvDir"
|
182 |
+
}
|
183 |
+
|
184 |
+
# Next, read the `pyvenv.cfg` file to determine any required value such
|
185 |
+
# as `prompt`.
|
186 |
+
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
187 |
+
|
188 |
+
# Next, set the prompt from the command line, or the config file, or
|
189 |
+
# just use the name of the virtual environment folder.
|
190 |
+
if ($Prompt) {
|
191 |
+
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
192 |
+
}
|
193 |
+
else {
|
194 |
+
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
195 |
+
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
196 |
+
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
197 |
+
$Prompt = $pyvenvCfg['prompt'];
|
198 |
+
}
|
199 |
+
else {
|
200 |
+
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
|
201 |
+
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
202 |
+
$Prompt = Split-Path -Path $venvDir -Leaf
|
203 |
+
}
|
204 |
+
}
|
205 |
+
|
206 |
+
Write-Verbose "Prompt = '$Prompt'"
|
207 |
+
Write-Verbose "VenvDir='$VenvDir'"
|
208 |
+
|
209 |
+
# Deactivate any currently active virtual environment, but leave the
|
210 |
+
# deactivate function in place.
|
211 |
+
deactivate -nondestructive
|
212 |
+
|
213 |
+
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
214 |
+
# that there is an activated venv.
|
215 |
+
$env:VIRTUAL_ENV = $VenvDir
|
216 |
+
|
217 |
+
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
218 |
+
|
219 |
+
Write-Verbose "Setting prompt to '$Prompt'"
|
220 |
+
|
221 |
+
# Set the prompt to include the env name
|
222 |
+
# Make sure _OLD_VIRTUAL_PROMPT is global
|
223 |
+
function global:_OLD_VIRTUAL_PROMPT { "" }
|
224 |
+
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
225 |
+
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
226 |
+
|
227 |
+
function global:prompt {
|
228 |
+
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
229 |
+
_OLD_VIRTUAL_PROMPT
|
230 |
+
}
|
231 |
+
}
|
232 |
+
|
233 |
+
# Clear PYTHONHOME
|
234 |
+
if (Test-Path -Path Env:PYTHONHOME) {
|
235 |
+
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
236 |
+
Remove-Item -Path Env:PYTHONHOME
|
237 |
+
}
|
238 |
+
|
239 |
+
# Add the venv to the PATH
|
240 |
+
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
241 |
+
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
242 |
+
|
243 |
+
# SIG # Begin signature block
|
244 |
+
# MIIkCQYJKoZIhvcNAQcCoIIj+jCCI/YCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
245 |
+
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
246 |
+
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD50itNqbOCCDp6
|
247 |
+
# 9ZnhKce5X7vV6KL67iKMbGTUZ4nf36CCDi8wggawMIIEmKADAgECAhAIrUCyYNKc
|
248 |
+
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
249 |
+
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
|
250 |
+
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
|
251 |
+
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
|
252 |
+
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
|
253 |
+
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
|
254 |
+
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
|
255 |
+
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
|
256 |
+
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
|
257 |
+
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
|
258 |
+
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
|
259 |
+
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
|
260 |
+
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
|
261 |
+
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
|
262 |
+
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
|
263 |
+
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
|
264 |
+
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
|
265 |
+
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
|
266 |
+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
|
267 |
+
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
|
268 |
+
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
|
269 |
+
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
|
270 |
+
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
|
271 |
+
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
|
272 |
+
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
|
273 |
+
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
|
274 |
+
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
|
275 |
+
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
|
276 |
+
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
|
277 |
+
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
|
278 |
+
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
|
279 |
+
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
|
280 |
+
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
|
281 |
+
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
|
282 |
+
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
|
283 |
+
# yK+p/pQd52MbOoZWeE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0G
|
284 |
+
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
|
285 |
+
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
|
286 |
+
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1
|
287 |
+
# MjM1OTU5WjB8MQswCQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQH
|
288 |
+
# EwlCZWF2ZXJ0b24xIzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9u
|
289 |
+
# MSMwIQYDVQQDExpQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZI
|
290 |
+
# hvcNAQEBBQADggIPADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiS
|
291 |
+
# YgDFfwhjQy89koM7uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi
|
292 |
+
# 0GGAZUegEAeRlSXxxhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN1
|
293 |
+
# 6yS8skFa3IHyvWdbD9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGu
|
294 |
+
# ppxcia6a7xCyKoOAGjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu35
|
295 |
+
# 2diDY+iCMpk9ZanmSjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0
|
296 |
+
# ZFYKeb6BLA66d2GALwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oE
|
297 |
+
# RzTzEiV6nCO1M3U1HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZ
|
298 |
+
# I7IWe7JKhHohqKuceQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16x
|
299 |
+
# ot2KVPdfyPAWd81wtZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapP
|
300 |
+
# Unwo8ygflJJ74J+BYxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3Z
|
301 |
+
# Ily+qIqDAgMBAAGjggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiI
|
302 |
+
# ZfROQjAdBgNVHQ4EFgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQD
|
303 |
+
# AgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0
|
304 |
+
# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
|
305 |
+
# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5k
|
306 |
+
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZT
|
307 |
+
# SEEzODQyMDIxQ0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUF
|
308 |
+
# BwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGH
|
309 |
+
# MIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYB
|
310 |
+
# BQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0
|
311 |
+
# ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB
|
312 |
+
# /wQCMAAwDQYJKoZIhvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcW
|
313 |
+
# TiNc2rskrNLrfH1Ns0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+
|
314 |
+
# VVzxC88pOEvz68nA82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfL
|
315 |
+
# IJQsAHBla0i7QRF2de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izW
|
316 |
+
# OXM95BSkFSKdE45Oq3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86
|
317 |
+
# WmjRUqbrnvdyR2ydI5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+
|
318 |
+
# W1scCpnA8YTs2d50jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM5
|
319 |
+
# 8WEDkbeoriDk3hxU8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMf
|
320 |
+
# ZOm5cuclMnUHs2uqrRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw
|
321 |
+
# /TKqVL4Oaz3bkMSsM46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3
|
322 |
+
# r7bjyHTxOgqxRCVa18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VH
|
323 |
+
# xaZg2unjHY3rMYIVMDCCFSwCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
|
324 |
+
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29k
|
325 |
+
# ZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM
|
326 |
+
# 0NHdMA0GCWCGSAFlAwQCAQUAoIHOMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEE
|
327 |
+
# MBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBW
|
328 |
+
# STMEpY5oTqEtnhE8rXHTfUpY7MZMEfDbBKbS1J0cLTBiBgorBgEEAYI3AgEMMVQw
|
329 |
+
# UqBQgE4AQgB1AGkAbAB0ADoAIABSAGUAbABlAGEAcwBlAF8AbQBhAGkAbgBfAHYA
|
330 |
+
# MwAuADkALgAxADMAXwAyADAAMgAyADAANQAxADcALgAwADIwDQYJKoZIhvcNAQEB
|
331 |
+
# BQAEggIAZ20aZkGkTuZACtVG89TVf+3Nw7cpJO4pkpM71AFEX7/TZ4NjeFMHCrEr
|
332 |
+
# g8kNhN1UNcf0FGKplenCcykaIYUTlYgT3VCOeRGINOmySIotyEfYw4HapwNhj8/G
|
333 |
+
# CK/XOKJvIZ96yHHkpaiCOx3JDVtX5UjkChX1IJNECy0RyzALQA9U/EQl7v8oNEs6
|
334 |
+
# mCHRfPflHgkPYUPYUJXAGk3tD0ZgeeomUR0zm6Zmvqar2RJaZADtCF5OxOcFbdui
|
335 |
+
# 9yrlbSlkxv6gSW60W372FRCIoy1BML7Okjv7QJnhJkPIAs4sb0ZCV3rB6ZjKBXx3
|
336 |
+
# WzeQ5yjpJ3O1ZsZKPP4XVayPJCv2PSRd8dlDgmJtMbN2gvjsLtOkDKN03jnEsiiX
|
337 |
+
# 9IeYu7AaDdDeMDW8U5A0HYStrVX7OYpLqojtWOdeIz3/thj9ncWDio4KqEZTud37
|
338 |
+
# kfhDQPks9zWHoeI8MnjWMgBCEMskNFQnEhgGNlxWRW8bzypODhlrUGB271/6tFCE
|
339 |
+
# UW24irgtfCvNVmQh5E7V+GNplFujgCa7O4wQvYBb1i2OnQ+igJkfWx2N+wmb8QYE
|
340 |
+
# mN4RM/bk/SOc1b3MnU/ztqscOPPllmQsqMe/8LW77Ww2fy3i88RlcjweWiTs+3AK
|
341 |
+
# akFenQ/OzGPTrG8+mMKEjRKuxKyL2uZRKUoZ2zVlmjEddgnIVCWhghGzMIIRrwYK
|
342 |
+
# KwYBBAGCNwMDATGCEZ8wghGbBgkqhkiG9w0BBwKgghGMMIIRiAIBAzEPMA0GCWCG
|
343 |
+
# SAFlAwQCAQUAMHgGCyqGSIb3DQEJEAEEoGkEZzBlAgEBBglghkgBhv1sBwEwMTAN
|
344 |
+
# BglghkgBZQMEAgEFAAQgnT/1Hedipjs4jpirOCgW93RhvoYu0jJ5WKO7Y0LYfrYC
|
345 |
+
# EQDwVmhL49/+ciLQ3plX3i8KGA8yMDIyMDUxNzE2NDQyNVqggg18MIIGxjCCBK6g
|
346 |
+
# AwIBAgIQCnpKiJ7JmUKQBmM4TYaXnTANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQG
|
347 |
+
# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0
|
348 |
+
# IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIy
|
349 |
+
# MDMyOTAwMDAwMFoXDTMzMDMxNDIzNTk1OVowTDELMAkGA1UEBhMCVVMxFzAVBgNV
|
350 |
+
# BAoTDkRpZ2lDZXJ0LCBJbmMuMSQwIgYDVQQDExtEaWdpQ2VydCBUaW1lc3RhbXAg
|
351 |
+
# MjAyMiAtIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC5KpYjply8
|
352 |
+
# X9ZJ8BWCGPQz7sxcbOPgJS7SMeQ8QK77q8TjeF1+XDbq9SWNQ6OB6zhj+TyIad48
|
353 |
+
# 0jBRDTEHukZu6aNLSOiJQX8Nstb5hPGYPgu/CoQScWyhYiYB087DbP2sO37cKhyp
|
354 |
+
# vTDGFtjavOuy8YPRn80JxblBakVCI0Fa+GDTZSw+fl69lqfw/LH09CjPQnkfO8eT
|
355 |
+
# B2ho5UQ0Ul8PUN7UWSxEdMAyRxlb4pguj9DKP//GZ888k5VOhOl2GJiZERTFKwyg
|
356 |
+
# M9tNJIXogpThLwPuf4UCyYbh1RgUtwRF8+A4vaK9enGY7BXn/S7s0psAiqwdjTuA
|
357 |
+
# aP7QWZgmzuDtrn8oLsKe4AtLyAjRMruD+iM82f/SjLv3QyPf58NaBWJ+cCzlK7I9
|
358 |
+
# Y+rIroEga0OJyH5fsBrdGb2fdEEKr7mOCdN0oS+wVHbBkE+U7IZh/9sRL5IDMM4w
|
359 |
+
# t4sPXUSzQx0jUM2R1y+d+/zNscGnxA7E70A+GToC1DGpaaBJ+XXhm+ho5GoMj+vk
|
360 |
+
# sSF7hmdYfn8f6CvkFLIW1oGhytowkGvub3XAsDYmsgg7/72+f2wTGN/GbaR5Sa2L
|
361 |
+
# f2GHBWj31HDjQpXonrubS7LitkE956+nGijJrWGwoEEYGU7tR5thle0+C2Fa6j56
|
362 |
+
# mJJRzT/JROeAiylCcvd5st2E6ifu/n16awIDAQABo4IBizCCAYcwDgYDVR0PAQH/
|
363 |
+
# BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwIAYD
|
364 |
+
# VR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMB8GA1UdIwQYMBaAFLoW2W1N
|
365 |
+
# hS9zKXaaL3WMaiCPnshvMB0GA1UdDgQWBBSNZLeJIf5WWESEYafqbxw2j92vDTBa
|
366 |
+
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl
|
367 |
+
# cnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3JsMIGQBggr
|
368 |
+
# BgEFBQcBAQSBgzCBgDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu
|
369 |
+
# Y29tMFgGCCsGAQUFBzAChkxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln
|
370 |
+
# aUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3J0MA0G
|
371 |
+
# CSqGSIb3DQEBCwUAA4ICAQANLSN0ptH1+OpLmT8B5PYM5K8WndmzjJeCKZxDbwEt
|
372 |
+
# qzi1cBG/hBmLP13lhk++kzreKjlaOU7YhFmlvBuYquhs79FIaRk4W8+JOR1wcNlO
|
373 |
+
# 3yMibNXf9lnLocLqTHbKodyhK5a4m1WpGmt90fUCCU+C1qVziMSYgN/uSZW3s8zF
|
374 |
+
# p+4O4e8eOIqf7xHJMUpYtt84fMv6XPfkU79uCnx+196Y1SlliQ+inMBl9AEiZcfq
|
375 |
+
# XnSmWzWSUHz0F6aHZE8+RokWYyBry/J70DXjSnBIqbbnHWC9BCIVJXAGcqlEO2lH
|
376 |
+
# EdPu6cegPk8QuTA25POqaQmoi35komWUEftuMvH1uzitzcCTEdUyeEpLNypM81zc
|
377 |
+
# toXAu3AwVXjWmP5UbX9xqUgaeN1Gdy4besAzivhKKIwSqHPPLfnTI/KeGeANlCig
|
378 |
+
# 69saUaCVgo4oa6TOnXbeqXOqSGpZQ65f6vgPBkKd3wZolv4qoHRbY2beayy4eKpN
|
379 |
+
# cG3wLPEHFX41tOa1DKKZpdcVazUOhdbgLMzgDCS4fFILHpl878jIxYxYaa+rPeHP
|
380 |
+
# zH0VrhS/inHfypex2EfqHIXgRU4SHBQpWMxv03/LvsEOSm8gnK7ZczJZCOctkqEa
|
381 |
+
# Ef4ymKZdK5fgi9OczG21Da5HYzhHF1tvE9pqEG4fSbdEW7QICodaWQR2EaGndwIT
|
382 |
+
# HDCCBq4wggSWoAMCAQICEAc2N7ckVHzYR6z9KGYqXlswDQYJKoZIhvcNAQELBQAw
|
383 |
+
# YjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ
|
384 |
+
# d3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290
|
385 |
+
# IEc0MB4XDTIyMDMyMzAwMDAwMFoXDTM3MDMyMjIzNTk1OVowYzELMAkGA1UEBhMC
|
386 |
+
# VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBU
|
387 |
+
# cnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTCCAiIwDQYJ
|
388 |
+
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMaGNQZJs8E9cklRVcclA8TykTepl1Gh
|
389 |
+
# 1tKD0Z5Mom2gsMyD+Vr2EaFEFUJfpIjzaPp985yJC3+dH54PMx9QEwsmc5Zt+Feo
|
390 |
+
# An39Q7SE2hHxc7Gz7iuAhIoiGN/r2j3EF3+rGSs+QtxnjupRPfDWVtTnKC3r07G1
|
391 |
+
# decfBmWNlCnT2exp39mQh0YAe9tEQYncfGpXevA3eZ9drMvohGS0UvJ2R/dhgxnd
|
392 |
+
# X7RUCyFobjchu0CsX7LeSn3O9TkSZ+8OpWNs5KbFHc02DVzV5huowWR0QKfAcsW6
|
393 |
+
# Th+xtVhNef7Xj3OTrCw54qVI1vCwMROpVymWJy71h6aPTnYVVSZwmCZ/oBpHIEPj
|
394 |
+
# Q2OAe3VuJyWQmDo4EbP29p7mO1vsgd4iFNmCKseSv6De4z6ic/rnH1pslPJSlREr
|
395 |
+
# WHRAKKtzQ87fSqEcazjFKfPKqpZzQmiftkaznTqj1QPgv/CiPMpC3BhIfxQ0z9JM
|
396 |
+
# q++bPf4OuGQq+nUoJEHtQr8FnGZJUlD0UfM2SU2LINIsVzV5K6jzRWC8I41Y99xh
|
397 |
+
# 3pP+OcD5sjClTNfpmEpYPtMDiP6zj9NeS3YSUZPJjAw7W4oiqMEmCPkUEBIDfV8j
|
398 |
+
# u2TjY+Cm4T72wnSyPx4JduyrXUZ14mCjWAkBKAAOhFTuzuldyF4wEr1GnrXTdrnS
|
399 |
+
# DmuZDNIztM2xAgMBAAGjggFdMIIBWTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1Ud
|
400 |
+
# DgQWBBS6FtltTYUvcyl2mi91jGogj57IbzAfBgNVHSMEGDAWgBTs1+OC0nFdZEzf
|
401 |
+
# Lmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgw
|
402 |
+
# dwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
|
403 |
+
# dC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
|
404 |
+
# aWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6
|
405 |
+
# Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMCAG
|
406 |
+
# A1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOC
|
407 |
+
# AgEAfVmOwJO2b5ipRCIBfmbW2CFC4bAYLhBNE88wU86/GPvHUF3iSyn7cIoNqilp
|
408 |
+
# /GnBzx0H6T5gyNgL5Vxb122H+oQgJTQxZ822EpZvxFBMYh0MCIKoFr2pVs8Vc40B
|
409 |
+
# IiXOlWk/R3f7cnQU1/+rT4osequFzUNf7WC2qk+RZp4snuCKrOX9jLxkJodskr2d
|
410 |
+
# fNBwCnzvqLx1T7pa96kQsl3p/yhUifDVinF2ZdrM8HKjI/rAJ4JErpknG6skHibB
|
411 |
+
# t94q6/aesXmZgaNWhqsKRcnfxI2g55j7+6adcq/Ex8HBanHZxhOACcS2n82HhyS7
|
412 |
+
# T6NJuXdmkfFynOlLAlKnN36TU6w7HQhJD5TNOXrd/yVjmScsPT9rp/Fmw0HNT7ZA
|
413 |
+
# myEhQNC3EyTN3B14OuSereU0cZLXJmvkOHOrpgFPvT87eK1MrfvElXvtCl8zOYdB
|
414 |
+
# eHo46Zzh3SP9HSjTx/no8Zhf+yvYfvJGnXUsHicsJttvFXseGYs2uJPU5vIXmVnK
|
415 |
+
# cPA3v5gA3yAWTyf7YGcWoWa63VXAOimGsJigK+2VQbc61RWYMbRiCQ8KvYHZE/6/
|
416 |
+
# pNHzV9m8BPqC3jLfBInwAM1dwvnQI38AC+R2AibZ8GV2QqYphwlHK+Z/GqSFD/yY
|
417 |
+
# lvZVVCsfgPrA8g4r5db7qS9EFUrnEw4d2zc4GqEr9u3WfPwxggN2MIIDcgIBATB3
|
418 |
+
# MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UE
|
419 |
+
# AxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBp
|
420 |
+
# bmcgQ0ECEAp6SoieyZlCkAZjOE2Gl50wDQYJYIZIAWUDBAIBBQCggdEwGgYJKoZI
|
421 |
+
# hvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yMjA1MTcxNjQ0
|
422 |
+
# MjVaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYEFIUI84ZRXLPTB322tLfAfxtKXkHe
|
423 |
+
# MC8GCSqGSIb3DQEJBDEiBCD6nFFQEG6P9dJgqwYWRs4qcIuEc8WzVzP/ANrLjNw9
|
424 |
+
# 9DA3BgsqhkiG9w0BCRACLzEoMCYwJDAiBCCdppAVw0nGwYl4Rbo1gq1wyI+kKTvb
|
425 |
+
# ar6cK9JTknnmOzANBgkqhkiG9w0BAQEFAASCAgAw6wjOhvvgNacByXWLXEcHuoRB
|
426 |
+
# hCB6I/ZNStOapAzlidSg0ccPO4QsS5L78/ff+DCa4ZFu//T2wfORd9wCt9NpL0XT
|
427 |
+
# 7/zVF3zw16aNIn1W9gbJkjPfHGLImV30M/PzMnzlj3m9ybK0W/vvu8SmNpMrsSKI
|
428 |
+
# sR1/nSzaA+Y0FmOOy2jtf7MtZeVh8o4ZkgBVPgVLpRSr4SJXzadMjQjshWII2ujM
|
429 |
+
# v2YPK7qczQmXaonfN+rAkPxLS+3MVDgoUKAGvQBpm686eDkImZ0qTG+Qi6+Z+2id
|
430 |
+
# QXv8h4V4L7Ln37RNsm4j5carTNxTx6b0SZPreswMEFfUwtHeaSWvUIKRzyY0t3O/
|
431 |
+
# NT5G8RSxtJLqTMVFWcmlbgaXo7/PDsA7hs1XQJE3UJnfRNrcznnHgYJPuW737A9Q
|
432 |
+
# v4sFjmov5/F4qUbYIh5yE8ec4IhOuR0rTEgDJLcU67KdrLjcePMlIlbPaArw1vn3
|
433 |
+
# On862t4jYz5aj3YaaHYzXB6VxiMp9JN5B3e4gmix/8TgN9kNmvbVwODfK5hfaPcY
|
434 |
+
# QXkTBySKKoRz+eyz67IBXPCHDYXtiXdaqvhWPFn+YbFH9jlEqPP2ATzqEz/ibgDZ
|
435 |
+
# 0YyvPy8vnItbUwPuGTVjwU0VmF0m5pSHm/pPALd1xKiMF+eZq580lbrIoUeyZ5mP
|
436 |
+
# 0XyrSEj88tBJMxcKZA==
|
437 |
+
# SIG # End signature block
|
MLPY/Scripts/__pycache__/pywin32_postinstall.cpython-39.pyc
ADDED
Binary file (16.6 kB). View file
|
|
MLPY/Scripts/__pycache__/pywin32_testall.cpython-39.pyc
ADDED
Binary file (2.99 kB). View file
|
|
MLPY/Scripts/activate
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file must be used with "source bin/activate" *from bash*
|
2 |
+
# you cannot run it directly
|
3 |
+
|
4 |
+
deactivate () {
|
5 |
+
# reset old environment variables
|
6 |
+
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
|
7 |
+
PATH="${_OLD_VIRTUAL_PATH:-}"
|
8 |
+
export PATH
|
9 |
+
unset _OLD_VIRTUAL_PATH
|
10 |
+
fi
|
11 |
+
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
|
12 |
+
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
|
13 |
+
export PYTHONHOME
|
14 |
+
unset _OLD_VIRTUAL_PYTHONHOME
|
15 |
+
fi
|
16 |
+
|
17 |
+
# This should detect bash and zsh, which have a hash command that must
|
18 |
+
# be called to get it to forget past commands. Without forgetting
|
19 |
+
# past commands the $PATH changes we made may not be respected
|
20 |
+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
21 |
+
hash -r 2> /dev/null
|
22 |
+
fi
|
23 |
+
|
24 |
+
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
25 |
+
PS1="${_OLD_VIRTUAL_PS1:-}"
|
26 |
+
export PS1
|
27 |
+
unset _OLD_VIRTUAL_PS1
|
28 |
+
fi
|
29 |
+
|
30 |
+
unset VIRTUAL_ENV
|
31 |
+
if [ ! "${1:-}" = "nondestructive" ] ; then
|
32 |
+
# Self destruct!
|
33 |
+
unset -f deactivate
|
34 |
+
fi
|
35 |
+
}
|
36 |
+
|
37 |
+
# unset irrelevant variables
|
38 |
+
deactivate nondestructive
|
39 |
+
|
40 |
+
VIRTUAL_ENV="D:\DoorMan\MLPY"
|
41 |
+
export VIRTUAL_ENV
|
42 |
+
|
43 |
+
_OLD_VIRTUAL_PATH="$PATH"
|
44 |
+
PATH="$VIRTUAL_ENV/Scripts:$PATH"
|
45 |
+
export PATH
|
46 |
+
|
47 |
+
# unset PYTHONHOME if set
|
48 |
+
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
49 |
+
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
50 |
+
if [ -n "${PYTHONHOME:-}" ] ; then
|
51 |
+
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
52 |
+
unset PYTHONHOME
|
53 |
+
fi
|
54 |
+
|
55 |
+
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
56 |
+
_OLD_VIRTUAL_PS1="${PS1:-}"
|
57 |
+
PS1="(MLPY) ${PS1:-}"
|
58 |
+
export PS1
|
59 |
+
fi
|
60 |
+
|
61 |
+
# This should detect bash and zsh, which have a hash command that must
|
62 |
+
# be called to get it to forget past commands. Without forgetting
|
63 |
+
# past commands the $PATH changes we made may not be respected
|
64 |
+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
65 |
+
hash -r 2> /dev/null
|
66 |
+
fi
|
MLPY/Scripts/activate.bat
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@echo off
|
2 |
+
|
3 |
+
rem This file is UTF-8 encoded, so we need to update the current code page while executing it
|
4 |
+
for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do (
|
5 |
+
set _OLD_CODEPAGE=%%a
|
6 |
+
)
|
7 |
+
if defined _OLD_CODEPAGE (
|
8 |
+
"%SystemRoot%\System32\chcp.com" 65001 > nul
|
9 |
+
)
|
10 |
+
|
11 |
+
set VIRTUAL_ENV=D:\DoorMan\MLPY
|
12 |
+
|
13 |
+
if not defined PROMPT set PROMPT=$P$G
|
14 |
+
|
15 |
+
if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT%
|
16 |
+
if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
|
17 |
+
|
18 |
+
set _OLD_VIRTUAL_PROMPT=%PROMPT%
|
19 |
+
set PROMPT=(MLPY) %PROMPT%
|
20 |
+
|
21 |
+
if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
|
22 |
+
set PYTHONHOME=
|
23 |
+
|
24 |
+
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
|
25 |
+
if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%
|
26 |
+
|
27 |
+
set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
|
28 |
+
|
29 |
+
:END
|
30 |
+
if defined _OLD_CODEPAGE (
|
31 |
+
"%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
|
32 |
+
set _OLD_CODEPAGE=
|
33 |
+
)
|
MLPY/Scripts/backend-test-tools.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/check-model.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/check-node.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/convert-caffe2-to-onnx.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/convert-onnx-to-caffe2.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/deactivate.bat
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@echo off
|
2 |
+
|
3 |
+
if defined _OLD_VIRTUAL_PROMPT (
|
4 |
+
set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
|
5 |
+
)
|
6 |
+
set _OLD_VIRTUAL_PROMPT=
|
7 |
+
|
8 |
+
if defined _OLD_VIRTUAL_PYTHONHOME (
|
9 |
+
set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
|
10 |
+
set _OLD_VIRTUAL_PYTHONHOME=
|
11 |
+
)
|
12 |
+
|
13 |
+
if defined _OLD_VIRTUAL_PATH (
|
14 |
+
set "PATH=%_OLD_VIRTUAL_PATH%"
|
15 |
+
)
|
16 |
+
|
17 |
+
set _OLD_VIRTUAL_PATH=
|
18 |
+
|
19 |
+
set VIRTUAL_ENV=
|
20 |
+
|
21 |
+
:END
|
MLPY/Scripts/f2py.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/isympy.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/markdown_py.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/mlagents-learn.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/mlagents-run-experiment.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/pip.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/pip3.9.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/pip3.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/python.exe
ADDED
Binary file (599 kB). View file
|
|
MLPY/Scripts/pythonw.exe
ADDED
Binary file (599 kB). View file
|
|
MLPY/Scripts/pywin32_postinstall.py
ADDED
@@ -0,0 +1,783 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# postinstall script for pywin32
|
2 |
+
#
|
3 |
+
# copies PyWinTypesxx.dll and PythonCOMxx.dll into the system directory,
|
4 |
+
# and creates a pth file
|
5 |
+
import glob
|
6 |
+
import os
|
7 |
+
import shutil
|
8 |
+
import sys
|
9 |
+
import sysconfig
|
10 |
+
|
11 |
+
try:
|
12 |
+
import winreg as winreg
|
13 |
+
except:
|
14 |
+
import winreg
|
15 |
+
|
16 |
+
# Send output somewhere so it can be found if necessary...
|
17 |
+
import tempfile
|
18 |
+
|
19 |
+
tee_f = open(os.path.join(tempfile.gettempdir(), "pywin32_postinstall.log"), "w")
|
20 |
+
|
21 |
+
|
22 |
+
class Tee:
|
23 |
+
def __init__(self, file):
|
24 |
+
self.f = file
|
25 |
+
|
26 |
+
def write(self, what):
|
27 |
+
if self.f is not None:
|
28 |
+
try:
|
29 |
+
self.f.write(what.replace("\n", "\r\n"))
|
30 |
+
except IOError:
|
31 |
+
pass
|
32 |
+
tee_f.write(what)
|
33 |
+
|
34 |
+
def flush(self):
|
35 |
+
if self.f is not None:
|
36 |
+
try:
|
37 |
+
self.f.flush()
|
38 |
+
except IOError:
|
39 |
+
pass
|
40 |
+
tee_f.flush()
|
41 |
+
|
42 |
+
|
43 |
+
# For some unknown reason, when running under bdist_wininst we will start up
|
44 |
+
# with sys.stdout as None but stderr is hooked up. This work-around allows
|
45 |
+
# bdist_wininst to see the output we write and display it at the end of
|
46 |
+
# the install.
|
47 |
+
if sys.stdout is None:
|
48 |
+
sys.stdout = sys.stderr
|
49 |
+
|
50 |
+
sys.stderr = Tee(sys.stderr)
|
51 |
+
sys.stdout = Tee(sys.stdout)
|
52 |
+
|
53 |
+
com_modules = [
|
54 |
+
# module_name, class_names
|
55 |
+
("win32com.servers.interp", "Interpreter"),
|
56 |
+
("win32com.servers.dictionary", "DictionaryPolicy"),
|
57 |
+
("win32com.axscript.client.pyscript", "PyScript"),
|
58 |
+
]
|
59 |
+
|
60 |
+
# Is this a 'silent' install - ie, avoid all dialogs.
|
61 |
+
# Different than 'verbose'
|
62 |
+
silent = 0
|
63 |
+
|
64 |
+
# Verbosity of output messages.
|
65 |
+
verbose = 1
|
66 |
+
|
67 |
+
root_key_name = "Software\\Python\\PythonCore\\" + sys.winver
|
68 |
+
|
69 |
+
try:
|
70 |
+
# When this script is run from inside the bdist_wininst installer,
|
71 |
+
# file_created() and directory_created() are additional builtin
|
72 |
+
# functions which write lines to Python23\pywin32-install.log. This is
|
73 |
+
# a list of actions for the uninstaller, the format is inspired by what
|
74 |
+
# the Wise installer also creates.
|
75 |
+
file_created
|
76 |
+
is_bdist_wininst = True
|
77 |
+
except NameError:
|
78 |
+
is_bdist_wininst = False # we know what it is not - but not what it is :)
|
79 |
+
|
80 |
+
def file_created(file):
|
81 |
+
pass
|
82 |
+
|
83 |
+
def directory_created(directory):
|
84 |
+
pass
|
85 |
+
|
86 |
+
def get_root_hkey():
|
87 |
+
try:
|
88 |
+
winreg.OpenKey(
|
89 |
+
winreg.HKEY_LOCAL_MACHINE, root_key_name, 0, winreg.KEY_CREATE_SUB_KEY
|
90 |
+
)
|
91 |
+
return winreg.HKEY_LOCAL_MACHINE
|
92 |
+
except OSError:
|
93 |
+
# Either not exist, or no permissions to create subkey means
|
94 |
+
# must be HKCU
|
95 |
+
return winreg.HKEY_CURRENT_USER
|
96 |
+
|
97 |
+
|
98 |
+
try:
|
99 |
+
create_shortcut
|
100 |
+
except NameError:
|
101 |
+
# Create a function with the same signature as create_shortcut provided
|
102 |
+
# by bdist_wininst
|
103 |
+
def create_shortcut(
|
104 |
+
path, description, filename, arguments="", workdir="", iconpath="", iconindex=0
|
105 |
+
):
|
106 |
+
import pythoncom
|
107 |
+
from win32com.shell import shell
|
108 |
+
|
109 |
+
ilink = pythoncom.CoCreateInstance(
|
110 |
+
shell.CLSID_ShellLink,
|
111 |
+
None,
|
112 |
+
pythoncom.CLSCTX_INPROC_SERVER,
|
113 |
+
shell.IID_IShellLink,
|
114 |
+
)
|
115 |
+
ilink.SetPath(path)
|
116 |
+
ilink.SetDescription(description)
|
117 |
+
if arguments:
|
118 |
+
ilink.SetArguments(arguments)
|
119 |
+
if workdir:
|
120 |
+
ilink.SetWorkingDirectory(workdir)
|
121 |
+
if iconpath or iconindex:
|
122 |
+
ilink.SetIconLocation(iconpath, iconindex)
|
123 |
+
# now save it.
|
124 |
+
ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile)
|
125 |
+
ipf.Save(filename, 0)
|
126 |
+
|
127 |
+
# Support the same list of "path names" as bdist_wininst.
|
128 |
+
def get_special_folder_path(path_name):
|
129 |
+
from win32com.shell import shell, shellcon
|
130 |
+
|
131 |
+
for maybe in """
|
132 |
+
CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA
|
133 |
+
CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY
|
134 |
+
CSIDL_DESKTOPDIRECTORY CSIDL_COMMON_STARTUP CSIDL_STARTUP
|
135 |
+
CSIDL_COMMON_PROGRAMS CSIDL_PROGRAMS CSIDL_PROGRAM_FILES_COMMON
|
136 |
+
CSIDL_PROGRAM_FILES CSIDL_FONTS""".split():
|
137 |
+
if maybe == path_name:
|
138 |
+
csidl = getattr(shellcon, maybe)
|
139 |
+
return shell.SHGetSpecialFolderPath(0, csidl, False)
|
140 |
+
raise ValueError("%s is an unknown path ID" % (path_name,))
|
141 |
+
|
142 |
+
|
143 |
+
def CopyTo(desc, src, dest):
|
144 |
+
import win32api
|
145 |
+
import win32con
|
146 |
+
|
147 |
+
while 1:
|
148 |
+
try:
|
149 |
+
win32api.CopyFile(src, dest, 0)
|
150 |
+
return
|
151 |
+
except win32api.error as details:
|
152 |
+
if details.winerror == 5: # access denied - user not admin.
|
153 |
+
raise
|
154 |
+
if silent:
|
155 |
+
# Running silent mode - just re-raise the error.
|
156 |
+
raise
|
157 |
+
full_desc = (
|
158 |
+
"Error %s\n\n"
|
159 |
+
"If you have any Python applications running, "
|
160 |
+
"please close them now\nand select 'Retry'\n\n%s"
|
161 |
+
% (desc, details.strerror)
|
162 |
+
)
|
163 |
+
rc = win32api.MessageBox(
|
164 |
+
0, full_desc, "Installation Error", win32con.MB_ABORTRETRYIGNORE
|
165 |
+
)
|
166 |
+
if rc == win32con.IDABORT:
|
167 |
+
raise
|
168 |
+
elif rc == win32con.IDIGNORE:
|
169 |
+
return
|
170 |
+
# else retry - around we go again.
|
171 |
+
|
172 |
+
|
173 |
+
# We need to import win32api to determine the Windows system directory,
|
174 |
+
# so we can copy our system files there - but importing win32api will
|
175 |
+
# load the pywintypes.dll already in the system directory preventing us
|
176 |
+
# from updating them!
|
177 |
+
# So, we pull the same trick pywintypes.py does, but it loads from
|
178 |
+
# our pywintypes_system32 directory.
|
179 |
+
def LoadSystemModule(lib_dir, modname):
|
180 |
+
# See if this is a debug build.
|
181 |
+
import importlib.machinery
|
182 |
+
import importlib.util
|
183 |
+
|
184 |
+
suffix = "_d" if "_d.pyd" in importlib.machinery.EXTENSION_SUFFIXES else ""
|
185 |
+
filename = "%s%d%d%s.dll" % (
|
186 |
+
modname,
|
187 |
+
sys.version_info[0],
|
188 |
+
sys.version_info[1],
|
189 |
+
suffix,
|
190 |
+
)
|
191 |
+
filename = os.path.join(lib_dir, "pywin32_system32", filename)
|
192 |
+
loader = importlib.machinery.ExtensionFileLoader(modname, filename)
|
193 |
+
spec = importlib.machinery.ModuleSpec(name=modname, loader=loader, origin=filename)
|
194 |
+
mod = importlib.util.module_from_spec(spec)
|
195 |
+
spec.loader.exec_module(mod)
|
196 |
+
|
197 |
+
|
198 |
+
def SetPyKeyVal(key_name, value_name, value):
|
199 |
+
root_hkey = get_root_hkey()
|
200 |
+
root_key = winreg.OpenKey(root_hkey, root_key_name)
|
201 |
+
try:
|
202 |
+
my_key = winreg.CreateKey(root_key, key_name)
|
203 |
+
try:
|
204 |
+
winreg.SetValueEx(my_key, value_name, 0, winreg.REG_SZ, value)
|
205 |
+
if verbose:
|
206 |
+
print("-> %s\\%s[%s]=%r" % (root_key_name, key_name, value_name, value))
|
207 |
+
finally:
|
208 |
+
my_key.Close()
|
209 |
+
finally:
|
210 |
+
root_key.Close()
|
211 |
+
|
212 |
+
|
213 |
+
def UnsetPyKeyVal(key_name, value_name, delete_key=False):
|
214 |
+
root_hkey = get_root_hkey()
|
215 |
+
root_key = winreg.OpenKey(root_hkey, root_key_name)
|
216 |
+
try:
|
217 |
+
my_key = winreg.OpenKey(root_key, key_name, 0, winreg.KEY_SET_VALUE)
|
218 |
+
try:
|
219 |
+
winreg.DeleteValue(my_key, value_name)
|
220 |
+
if verbose:
|
221 |
+
print("-> DELETE %s\\%s[%s]" % (root_key_name, key_name, value_name))
|
222 |
+
finally:
|
223 |
+
my_key.Close()
|
224 |
+
if delete_key:
|
225 |
+
winreg.DeleteKey(root_key, key_name)
|
226 |
+
if verbose:
|
227 |
+
print("-> DELETE %s\\%s" % (root_key_name, key_name))
|
228 |
+
except OSError as why:
|
229 |
+
winerror = getattr(why, "winerror", why.errno)
|
230 |
+
if winerror != 2: # file not found
|
231 |
+
raise
|
232 |
+
finally:
|
233 |
+
root_key.Close()
|
234 |
+
|
235 |
+
|
236 |
+
def RegisterCOMObjects(register=True):
|
237 |
+
import win32com.server.register
|
238 |
+
|
239 |
+
if register:
|
240 |
+
func = win32com.server.register.RegisterClasses
|
241 |
+
else:
|
242 |
+
func = win32com.server.register.UnregisterClasses
|
243 |
+
flags = {}
|
244 |
+
if not verbose:
|
245 |
+
flags["quiet"] = 1
|
246 |
+
for module, klass_name in com_modules:
|
247 |
+
__import__(module)
|
248 |
+
mod = sys.modules[module]
|
249 |
+
flags["finalize_register"] = getattr(mod, "DllRegisterServer", None)
|
250 |
+
flags["finalize_unregister"] = getattr(mod, "DllUnregisterServer", None)
|
251 |
+
klass = getattr(mod, klass_name)
|
252 |
+
func(klass, **flags)
|
253 |
+
|
254 |
+
|
255 |
+
def RegisterHelpFile(register=True, lib_dir=None):
|
256 |
+
if lib_dir is None:
|
257 |
+
lib_dir = sysconfig.get_paths()["platlib"]
|
258 |
+
if register:
|
259 |
+
# Register the .chm help file.
|
260 |
+
chm_file = os.path.join(lib_dir, "PyWin32.chm")
|
261 |
+
if os.path.isfile(chm_file):
|
262 |
+
# This isn't recursive, so if 'Help' doesn't exist, we croak
|
263 |
+
SetPyKeyVal("Help", None, None)
|
264 |
+
SetPyKeyVal("Help\\Pythonwin Reference", None, chm_file)
|
265 |
+
return chm_file
|
266 |
+
else:
|
267 |
+
print("NOTE: PyWin32.chm can not be located, so has not " "been registered")
|
268 |
+
else:
|
269 |
+
UnsetPyKeyVal("Help\\Pythonwin Reference", None, delete_key=True)
|
270 |
+
return None
|
271 |
+
|
272 |
+
|
273 |
+
def RegisterPythonwin(register=True, lib_dir=None):
|
274 |
+
"""Add (or remove) Pythonwin to context menu for python scripts.
|
275 |
+
??? Should probably also add Edit command for pys files also.
|
276 |
+
Also need to remove these keys on uninstall, but there's no function
|
277 |
+
like file_created to add registry entries to uninstall log ???
|
278 |
+
"""
|
279 |
+
import os
|
280 |
+
|
281 |
+
if lib_dir is None:
|
282 |
+
lib_dir = sysconfig.get_paths()["platlib"]
|
283 |
+
classes_root = get_root_hkey()
|
284 |
+
## Installer executable doesn't seem to pass anything to postinstall script indicating if it's a debug build,
|
285 |
+
pythonwin_exe = os.path.join(lib_dir, "Pythonwin", "Pythonwin.exe")
|
286 |
+
pythonwin_edit_command = pythonwin_exe + ' -edit "%1"'
|
287 |
+
|
288 |
+
keys_vals = [
|
289 |
+
(
|
290 |
+
"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Pythonwin.exe",
|
291 |
+
"",
|
292 |
+
pythonwin_exe,
|
293 |
+
),
|
294 |
+
(
|
295 |
+
"Software\\Classes\\Python.File\\shell\\Edit with Pythonwin",
|
296 |
+
"command",
|
297 |
+
pythonwin_edit_command,
|
298 |
+
),
|
299 |
+
(
|
300 |
+
"Software\\Classes\\Python.NoConFile\\shell\\Edit with Pythonwin",
|
301 |
+
"command",
|
302 |
+
pythonwin_edit_command,
|
303 |
+
),
|
304 |
+
]
|
305 |
+
|
306 |
+
try:
|
307 |
+
if register:
|
308 |
+
for key, sub_key, val in keys_vals:
|
309 |
+
## Since winreg only uses the character Api functions, this can fail if Python
|
310 |
+
## is installed to a path containing non-ascii characters
|
311 |
+
hkey = winreg.CreateKey(classes_root, key)
|
312 |
+
if sub_key:
|
313 |
+
hkey = winreg.CreateKey(hkey, sub_key)
|
314 |
+
winreg.SetValueEx(hkey, None, 0, winreg.REG_SZ, val)
|
315 |
+
hkey.Close()
|
316 |
+
else:
|
317 |
+
for key, sub_key, val in keys_vals:
|
318 |
+
try:
|
319 |
+
if sub_key:
|
320 |
+
hkey = winreg.OpenKey(classes_root, key)
|
321 |
+
winreg.DeleteKey(hkey, sub_key)
|
322 |
+
hkey.Close()
|
323 |
+
winreg.DeleteKey(classes_root, key)
|
324 |
+
except OSError as why:
|
325 |
+
winerror = getattr(why, "winerror", why.errno)
|
326 |
+
if winerror != 2: # file not found
|
327 |
+
raise
|
328 |
+
finally:
|
329 |
+
# tell windows about the change
|
330 |
+
from win32com.shell import shell, shellcon
|
331 |
+
|
332 |
+
shell.SHChangeNotify(
|
333 |
+
shellcon.SHCNE_ASSOCCHANGED, shellcon.SHCNF_IDLIST, None, None
|
334 |
+
)
|
335 |
+
|
336 |
+
|
337 |
+
def get_shortcuts_folder():
|
338 |
+
if get_root_hkey() == winreg.HKEY_LOCAL_MACHINE:
|
339 |
+
try:
|
340 |
+
fldr = get_special_folder_path("CSIDL_COMMON_PROGRAMS")
|
341 |
+
except OSError:
|
342 |
+
# No CSIDL_COMMON_PROGRAMS on this platform
|
343 |
+
fldr = get_special_folder_path("CSIDL_PROGRAMS")
|
344 |
+
else:
|
345 |
+
# non-admin install - always goes in this user's start menu.
|
346 |
+
fldr = get_special_folder_path("CSIDL_PROGRAMS")
|
347 |
+
|
348 |
+
try:
|
349 |
+
install_group = winreg.QueryValue(
|
350 |
+
get_root_hkey(), root_key_name + "\\InstallPath\\InstallGroup"
|
351 |
+
)
|
352 |
+
except OSError:
|
353 |
+
vi = sys.version_info
|
354 |
+
install_group = "Python %d.%d" % (vi[0], vi[1])
|
355 |
+
return os.path.join(fldr, install_group)
|
356 |
+
|
357 |
+
|
358 |
+
# Get the system directory, which may be the Wow64 directory if we are a 32bit
|
359 |
+
# python on a 64bit OS.
|
360 |
+
def get_system_dir():
|
361 |
+
import win32api # we assume this exists.
|
362 |
+
|
363 |
+
try:
|
364 |
+
import pythoncom
|
365 |
+
import win32process
|
366 |
+
from win32com.shell import shell, shellcon
|
367 |
+
|
368 |
+
try:
|
369 |
+
if win32process.IsWow64Process():
|
370 |
+
return shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_SYSTEMX86)
|
371 |
+
return shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_SYSTEM)
|
372 |
+
except (pythoncom.com_error, win32process.error):
|
373 |
+
return win32api.GetSystemDirectory()
|
374 |
+
except ImportError:
|
375 |
+
return win32api.GetSystemDirectory()
|
376 |
+
|
377 |
+
|
378 |
+
def fixup_dbi():
|
379 |
+
# We used to have a dbi.pyd with our .pyd files, but now have a .py file.
|
380 |
+
# If the user didn't uninstall, they will find the .pyd which will cause
|
381 |
+
# problems - so handle that.
|
382 |
+
import win32api
|
383 |
+
import win32con
|
384 |
+
|
385 |
+
pyd_name = os.path.join(os.path.dirname(win32api.__file__), "dbi.pyd")
|
386 |
+
pyd_d_name = os.path.join(os.path.dirname(win32api.__file__), "dbi_d.pyd")
|
387 |
+
py_name = os.path.join(os.path.dirname(win32con.__file__), "dbi.py")
|
388 |
+
for this_pyd in (pyd_name, pyd_d_name):
|
389 |
+
this_dest = this_pyd + ".old"
|
390 |
+
if os.path.isfile(this_pyd) and os.path.isfile(py_name):
|
391 |
+
try:
|
392 |
+
if os.path.isfile(this_dest):
|
393 |
+
print(
|
394 |
+
"Old dbi '%s' already exists - deleting '%s'"
|
395 |
+
% (this_dest, this_pyd)
|
396 |
+
)
|
397 |
+
os.remove(this_pyd)
|
398 |
+
else:
|
399 |
+
os.rename(this_pyd, this_dest)
|
400 |
+
print("renamed '%s'->'%s.old'" % (this_pyd, this_pyd))
|
401 |
+
file_created(this_pyd + ".old")
|
402 |
+
except os.error as exc:
|
403 |
+
print("FAILED to rename '%s': %s" % (this_pyd, exc))
|
404 |
+
|
405 |
+
|
406 |
+
def install(lib_dir):
|
407 |
+
import traceback
|
408 |
+
|
409 |
+
# The .pth file is now installed as a regular file.
|
410 |
+
# Create the .pth file in the site-packages dir, and use only relative paths
|
411 |
+
# We used to write a .pth directly to sys.prefix - clobber it.
|
412 |
+
if os.path.isfile(os.path.join(sys.prefix, "pywin32.pth")):
|
413 |
+
os.unlink(os.path.join(sys.prefix, "pywin32.pth"))
|
414 |
+
# The .pth may be new and therefore not loaded in this session.
|
415 |
+
# Setup the paths just in case.
|
416 |
+
for name in "win32 win32\\lib Pythonwin".split():
|
417 |
+
sys.path.append(os.path.join(lib_dir, name))
|
418 |
+
# It is possible people with old versions installed with still have
|
419 |
+
# pywintypes and pythoncom registered. We no longer need this, and stale
|
420 |
+
# entries hurt us.
|
421 |
+
for name in "pythoncom pywintypes".split():
|
422 |
+
keyname = "Software\\Python\\PythonCore\\" + sys.winver + "\\Modules\\" + name
|
423 |
+
for root in winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER:
|
424 |
+
try:
|
425 |
+
winreg.DeleteKey(root, keyname + "\\Debug")
|
426 |
+
except WindowsError:
|
427 |
+
pass
|
428 |
+
try:
|
429 |
+
winreg.DeleteKey(root, keyname)
|
430 |
+
except WindowsError:
|
431 |
+
pass
|
432 |
+
LoadSystemModule(lib_dir, "pywintypes")
|
433 |
+
LoadSystemModule(lib_dir, "pythoncom")
|
434 |
+
import win32api
|
435 |
+
|
436 |
+
# and now we can get the system directory:
|
437 |
+
files = glob.glob(os.path.join(lib_dir, "pywin32_system32\\*.*"))
|
438 |
+
if not files:
|
439 |
+
raise RuntimeError("No system files to copy!!")
|
440 |
+
# Try the system32 directory first - if that fails due to "access denied",
|
441 |
+
# it implies a non-admin user, and we use sys.prefix
|
442 |
+
for dest_dir in [get_system_dir(), sys.prefix]:
|
443 |
+
# and copy some files over there
|
444 |
+
worked = 0
|
445 |
+
try:
|
446 |
+
for fname in files:
|
447 |
+
base = os.path.basename(fname)
|
448 |
+
dst = os.path.join(dest_dir, base)
|
449 |
+
CopyTo("installing %s" % base, fname, dst)
|
450 |
+
if verbose:
|
451 |
+
print("Copied %s to %s" % (base, dst))
|
452 |
+
# Register the files with the uninstaller
|
453 |
+
file_created(dst)
|
454 |
+
worked = 1
|
455 |
+
# Nuke any other versions that may exist - having
|
456 |
+
# duplicates causes major headaches.
|
457 |
+
bad_dest_dirs = [
|
458 |
+
os.path.join(sys.prefix, "Library\\bin"),
|
459 |
+
os.path.join(sys.prefix, "Lib\\site-packages\\win32"),
|
460 |
+
]
|
461 |
+
if dest_dir != sys.prefix:
|
462 |
+
bad_dest_dirs.append(sys.prefix)
|
463 |
+
for bad_dest_dir in bad_dest_dirs:
|
464 |
+
bad_fname = os.path.join(bad_dest_dir, base)
|
465 |
+
if os.path.exists(bad_fname):
|
466 |
+
# let exceptions go here - delete must succeed
|
467 |
+
os.unlink(bad_fname)
|
468 |
+
if worked:
|
469 |
+
break
|
470 |
+
except win32api.error as details:
|
471 |
+
if details.winerror == 5:
|
472 |
+
# access denied - user not admin - try sys.prefix dir,
|
473 |
+
# but first check that a version doesn't already exist
|
474 |
+
# in that place - otherwise that one will still get used!
|
475 |
+
if os.path.exists(dst):
|
476 |
+
msg = (
|
477 |
+
"The file '%s' exists, but can not be replaced "
|
478 |
+
"due to insufficient permissions. You must "
|
479 |
+
"reinstall this software as an Administrator" % dst
|
480 |
+
)
|
481 |
+
print(msg)
|
482 |
+
raise RuntimeError(msg)
|
483 |
+
continue
|
484 |
+
raise
|
485 |
+
else:
|
486 |
+
raise RuntimeError(
|
487 |
+
"You don't have enough permissions to install the system files"
|
488 |
+
)
|
489 |
+
|
490 |
+
# Pythonwin 'compiles' config files - record them for uninstall.
|
491 |
+
pywin_dir = os.path.join(lib_dir, "Pythonwin", "pywin")
|
492 |
+
for fname in glob.glob(os.path.join(pywin_dir, "*.cfg")):
|
493 |
+
file_created(fname[:-1] + "c") # .cfg->.cfc
|
494 |
+
|
495 |
+
# Register our demo COM objects.
|
496 |
+
try:
|
497 |
+
try:
|
498 |
+
RegisterCOMObjects()
|
499 |
+
except win32api.error as details:
|
500 |
+
if details.winerror != 5: # ERROR_ACCESS_DENIED
|
501 |
+
raise
|
502 |
+
print("You do not have the permissions to install COM objects.")
|
503 |
+
print("The sample COM objects were not registered.")
|
504 |
+
except Exception:
|
505 |
+
print("FAILED to register the Python COM objects")
|
506 |
+
traceback.print_exc()
|
507 |
+
|
508 |
+
# There may be no main Python key in HKCU if, eg, an admin installed
|
509 |
+
# python itself.
|
510 |
+
winreg.CreateKey(get_root_hkey(), root_key_name)
|
511 |
+
|
512 |
+
chm_file = None
|
513 |
+
try:
|
514 |
+
chm_file = RegisterHelpFile(True, lib_dir)
|
515 |
+
except Exception:
|
516 |
+
print("Failed to register help file")
|
517 |
+
traceback.print_exc()
|
518 |
+
else:
|
519 |
+
if verbose:
|
520 |
+
print("Registered help file")
|
521 |
+
|
522 |
+
# misc other fixups.
|
523 |
+
fixup_dbi()
|
524 |
+
|
525 |
+
# Register Pythonwin in context menu
|
526 |
+
try:
|
527 |
+
RegisterPythonwin(True, lib_dir)
|
528 |
+
except Exception:
|
529 |
+
print("Failed to register pythonwin as editor")
|
530 |
+
traceback.print_exc()
|
531 |
+
else:
|
532 |
+
if verbose:
|
533 |
+
print("Pythonwin has been registered in context menu")
|
534 |
+
|
535 |
+
# Create the win32com\gen_py directory.
|
536 |
+
make_dir = os.path.join(lib_dir, "win32com", "gen_py")
|
537 |
+
if not os.path.isdir(make_dir):
|
538 |
+
if verbose:
|
539 |
+
print("Creating directory %s" % (make_dir,))
|
540 |
+
directory_created(make_dir)
|
541 |
+
os.mkdir(make_dir)
|
542 |
+
|
543 |
+
try:
|
544 |
+
# create shortcuts
|
545 |
+
# CSIDL_COMMON_PROGRAMS only available works on NT/2000/XP, and
|
546 |
+
# will fail there if the user has no admin rights.
|
547 |
+
fldr = get_shortcuts_folder()
|
548 |
+
# If the group doesn't exist, then we don't make shortcuts - its
|
549 |
+
# possible that this isn't a "normal" install.
|
550 |
+
if os.path.isdir(fldr):
|
551 |
+
dst = os.path.join(fldr, "PythonWin.lnk")
|
552 |
+
create_shortcut(
|
553 |
+
os.path.join(lib_dir, "Pythonwin\\Pythonwin.exe"),
|
554 |
+
"The Pythonwin IDE",
|
555 |
+
dst,
|
556 |
+
"",
|
557 |
+
sys.prefix,
|
558 |
+
)
|
559 |
+
file_created(dst)
|
560 |
+
if verbose:
|
561 |
+
print("Shortcut for Pythonwin created")
|
562 |
+
# And the docs.
|
563 |
+
if chm_file:
|
564 |
+
dst = os.path.join(fldr, "Python for Windows Documentation.lnk")
|
565 |
+
doc = "Documentation for the PyWin32 extensions"
|
566 |
+
create_shortcut(chm_file, doc, dst)
|
567 |
+
file_created(dst)
|
568 |
+
if verbose:
|
569 |
+
print("Shortcut to documentation created")
|
570 |
+
else:
|
571 |
+
if verbose:
|
572 |
+
print("Can't install shortcuts - %r is not a folder" % (fldr,))
|
573 |
+
except Exception as details:
|
574 |
+
print(details)
|
575 |
+
|
576 |
+
# importing win32com.client ensures the gen_py dir created - not strictly
|
577 |
+
# necessary to do now, but this makes the installation "complete"
|
578 |
+
try:
|
579 |
+
import win32com.client # noqa
|
580 |
+
except ImportError:
|
581 |
+
# Don't let this error sound fatal
|
582 |
+
pass
|
583 |
+
print("The pywin32 extensions were successfully installed.")
|
584 |
+
|
585 |
+
if is_bdist_wininst:
|
586 |
+
# Open a web page with info about the .exe installers being deprecated.
|
587 |
+
import webbrowser
|
588 |
+
|
589 |
+
try:
|
590 |
+
webbrowser.open("https://mhammond.github.io/pywin32_installers.html")
|
591 |
+
except webbrowser.Error:
|
592 |
+
print("Please visit https://mhammond.github.io/pywin32_installers.html")
|
593 |
+
|
594 |
+
|
595 |
+
def uninstall(lib_dir):
|
596 |
+
# First ensure our system modules are loaded from pywin32_system, so
|
597 |
+
# we can remove the ones we copied...
|
598 |
+
LoadSystemModule(lib_dir, "pywintypes")
|
599 |
+
LoadSystemModule(lib_dir, "pythoncom")
|
600 |
+
|
601 |
+
try:
|
602 |
+
RegisterCOMObjects(False)
|
603 |
+
except Exception as why:
|
604 |
+
print("Failed to unregister COM objects: %s" % (why,))
|
605 |
+
|
606 |
+
try:
|
607 |
+
RegisterHelpFile(False, lib_dir)
|
608 |
+
except Exception as why:
|
609 |
+
print("Failed to unregister help file: %s" % (why,))
|
610 |
+
else:
|
611 |
+
if verbose:
|
612 |
+
print("Unregistered help file")
|
613 |
+
|
614 |
+
try:
|
615 |
+
RegisterPythonwin(False, lib_dir)
|
616 |
+
except Exception as why:
|
617 |
+
print("Failed to unregister Pythonwin: %s" % (why,))
|
618 |
+
else:
|
619 |
+
if verbose:
|
620 |
+
print("Unregistered Pythonwin")
|
621 |
+
|
622 |
+
try:
|
623 |
+
# remove gen_py directory.
|
624 |
+
gen_dir = os.path.join(lib_dir, "win32com", "gen_py")
|
625 |
+
if os.path.isdir(gen_dir):
|
626 |
+
shutil.rmtree(gen_dir)
|
627 |
+
if verbose:
|
628 |
+
print("Removed directory %s" % (gen_dir,))
|
629 |
+
|
630 |
+
# Remove pythonwin compiled "config" files.
|
631 |
+
pywin_dir = os.path.join(lib_dir, "Pythonwin", "pywin")
|
632 |
+
for fname in glob.glob(os.path.join(pywin_dir, "*.cfc")):
|
633 |
+
os.remove(fname)
|
634 |
+
|
635 |
+
# The dbi.pyd.old files we may have created.
|
636 |
+
try:
|
637 |
+
os.remove(os.path.join(lib_dir, "win32", "dbi.pyd.old"))
|
638 |
+
except os.error:
|
639 |
+
pass
|
640 |
+
try:
|
641 |
+
os.remove(os.path.join(lib_dir, "win32", "dbi_d.pyd.old"))
|
642 |
+
except os.error:
|
643 |
+
pass
|
644 |
+
|
645 |
+
except Exception as why:
|
646 |
+
print("Failed to remove misc files: %s" % (why,))
|
647 |
+
|
648 |
+
try:
|
649 |
+
fldr = get_shortcuts_folder()
|
650 |
+
for link in ("PythonWin.lnk", "Python for Windows Documentation.lnk"):
|
651 |
+
fqlink = os.path.join(fldr, link)
|
652 |
+
if os.path.isfile(fqlink):
|
653 |
+
os.remove(fqlink)
|
654 |
+
if verbose:
|
655 |
+
print("Removed %s" % (link,))
|
656 |
+
except Exception as why:
|
657 |
+
print("Failed to remove shortcuts: %s" % (why,))
|
658 |
+
# Now remove the system32 files.
|
659 |
+
files = glob.glob(os.path.join(lib_dir, "pywin32_system32\\*.*"))
|
660 |
+
# Try the system32 directory first - if that fails due to "access denied",
|
661 |
+
# it implies a non-admin user, and we use sys.prefix
|
662 |
+
try:
|
663 |
+
for dest_dir in [get_system_dir(), sys.prefix]:
|
664 |
+
# and copy some files over there
|
665 |
+
worked = 0
|
666 |
+
for fname in files:
|
667 |
+
base = os.path.basename(fname)
|
668 |
+
dst = os.path.join(dest_dir, base)
|
669 |
+
if os.path.isfile(dst):
|
670 |
+
try:
|
671 |
+
os.remove(dst)
|
672 |
+
worked = 1
|
673 |
+
if verbose:
|
674 |
+
print("Removed file %s" % (dst))
|
675 |
+
except Exception:
|
676 |
+
print("FAILED to remove %s" % (dst,))
|
677 |
+
if worked:
|
678 |
+
break
|
679 |
+
except Exception as why:
|
680 |
+
print("FAILED to remove system files: %s" % (why,))
|
681 |
+
|
682 |
+
|
683 |
+
# NOTE: If this script is run from inside the bdist_wininst created
|
684 |
+
# binary installer or uninstaller, the command line args are either
|
685 |
+
# '-install' or '-remove'.
|
686 |
+
|
687 |
+
# Important: From inside the binary installer this script MUST NOT
|
688 |
+
# call sys.exit() or raise SystemExit, otherwise not only this script
|
689 |
+
# but also the installer will terminate! (Is there a way to prevent
|
690 |
+
# this from the bdist_wininst C code?)
|
691 |
+
|
692 |
+
|
693 |
+
def verify_destination(location):
|
694 |
+
if not os.path.isdir(location):
|
695 |
+
raise argparse.ArgumentTypeError('Path "{}" does not exist!'.format(location))
|
696 |
+
return location
|
697 |
+
|
698 |
+
|
699 |
+
def main():
|
700 |
+
import argparse
|
701 |
+
|
702 |
+
parser = argparse.ArgumentParser(
|
703 |
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
704 |
+
description="""A post-install script for the pywin32 extensions.
|
705 |
+
|
706 |
+
* Typical usage:
|
707 |
+
|
708 |
+
> python pywin32_postinstall.py -install
|
709 |
+
|
710 |
+
If you installed pywin32 via a .exe installer, this should be run
|
711 |
+
automatically after installation, but if it fails you can run it again.
|
712 |
+
|
713 |
+
If you installed pywin32 via PIP, you almost certainly need to run this to
|
714 |
+
setup the environment correctly.
|
715 |
+
|
716 |
+
Execute with script with a '-install' parameter, to ensure the environment
|
717 |
+
is setup correctly.
|
718 |
+
""",
|
719 |
+
)
|
720 |
+
parser.add_argument(
|
721 |
+
"-install",
|
722 |
+
default=False,
|
723 |
+
action="store_true",
|
724 |
+
help="Configure the Python environment correctly for pywin32.",
|
725 |
+
)
|
726 |
+
parser.add_argument(
|
727 |
+
"-remove",
|
728 |
+
default=False,
|
729 |
+
action="store_true",
|
730 |
+
help="Try and remove everything that was installed or copied.",
|
731 |
+
)
|
732 |
+
parser.add_argument(
|
733 |
+
"-wait",
|
734 |
+
type=int,
|
735 |
+
help="Wait for the specified process to terminate before starting.",
|
736 |
+
)
|
737 |
+
parser.add_argument(
|
738 |
+
"-silent",
|
739 |
+
default=False,
|
740 |
+
action="store_true",
|
741 |
+
help='Don\'t display the "Abort/Retry/Ignore" dialog for files in use.',
|
742 |
+
)
|
743 |
+
parser.add_argument(
|
744 |
+
"-quiet",
|
745 |
+
default=False,
|
746 |
+
action="store_true",
|
747 |
+
help="Don't display progress messages.",
|
748 |
+
)
|
749 |
+
parser.add_argument(
|
750 |
+
"-destination",
|
751 |
+
default=sysconfig.get_paths()["platlib"],
|
752 |
+
type=verify_destination,
|
753 |
+
help="Location of the PyWin32 installation",
|
754 |
+
)
|
755 |
+
|
756 |
+
args = parser.parse_args()
|
757 |
+
|
758 |
+
if not args.quiet:
|
759 |
+
print("Parsed arguments are: {}".format(args))
|
760 |
+
|
761 |
+
if not args.install ^ args.remove:
|
762 |
+
parser.error("You need to either choose to -install or -remove!")
|
763 |
+
|
764 |
+
if args.wait is not None:
|
765 |
+
try:
|
766 |
+
os.waitpid(args.wait, 0)
|
767 |
+
except os.error:
|
768 |
+
# child already dead
|
769 |
+
pass
|
770 |
+
|
771 |
+
silent = args.silent
|
772 |
+
verbose = not args.quiet
|
773 |
+
|
774 |
+
if args.install:
|
775 |
+
install(args.destination)
|
776 |
+
|
777 |
+
if args.remove:
|
778 |
+
if not is_bdist_wininst:
|
779 |
+
uninstall(args.destination)
|
780 |
+
|
781 |
+
|
782 |
+
if __name__ == "__main__":
|
783 |
+
main()
|
MLPY/Scripts/pywin32_testall.py
ADDED
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""A test runner for pywin32"""
|
2 |
+
import os
|
3 |
+
import site
|
4 |
+
import subprocess
|
5 |
+
import sys
|
6 |
+
|
7 |
+
# locate the dirs based on where this script is - it may be either in the
|
8 |
+
# source tree, or in an installed Python 'Scripts' tree.
|
9 |
+
this_dir = os.path.dirname(__file__)
|
10 |
+
site_packages = [
|
11 |
+
site.getusersitepackages(),
|
12 |
+
] + site.getsitepackages()
|
13 |
+
|
14 |
+
failures = []
|
15 |
+
|
16 |
+
|
17 |
+
# Run a test using subprocess and wait for the result.
|
18 |
+
# If we get an returncode != 0, we know that there was an error, but we don't
|
19 |
+
# abort immediately - we run as many tests as we can.
|
20 |
+
def run_test(script, cmdline_extras):
|
21 |
+
dirname, scriptname = os.path.split(script)
|
22 |
+
# some tests prefer to be run from their directory.
|
23 |
+
cmd = [sys.executable, "-u", scriptname] + cmdline_extras
|
24 |
+
print("--- Running '%s' ---" % script)
|
25 |
+
sys.stdout.flush()
|
26 |
+
result = subprocess.run(cmd, check=False, cwd=dirname)
|
27 |
+
print("*** Test script '%s' exited with %s" % (script, result.returncode))
|
28 |
+
sys.stdout.flush()
|
29 |
+
if result.returncode:
|
30 |
+
failures.append(script)
|
31 |
+
|
32 |
+
|
33 |
+
def find_and_run(possible_locations, extras):
|
34 |
+
for maybe in possible_locations:
|
35 |
+
if os.path.isfile(maybe):
|
36 |
+
run_test(maybe, extras)
|
37 |
+
break
|
38 |
+
else:
|
39 |
+
raise RuntimeError(
|
40 |
+
"Failed to locate a test script in one of %s" % possible_locations
|
41 |
+
)
|
42 |
+
|
43 |
+
|
44 |
+
def main():
|
45 |
+
import argparse
|
46 |
+
|
47 |
+
code_directories = [this_dir] + site_packages
|
48 |
+
|
49 |
+
parser = argparse.ArgumentParser(
|
50 |
+
description="A script to trigger tests in all subprojects of PyWin32."
|
51 |
+
)
|
52 |
+
parser.add_argument(
|
53 |
+
"-no-user-interaction",
|
54 |
+
default=False,
|
55 |
+
action="store_true",
|
56 |
+
help="(This is now the default - use `-user-interaction` to include them)",
|
57 |
+
)
|
58 |
+
|
59 |
+
parser.add_argument(
|
60 |
+
"-user-interaction",
|
61 |
+
action="store_true",
|
62 |
+
help="Include tests which require user interaction",
|
63 |
+
)
|
64 |
+
|
65 |
+
parser.add_argument(
|
66 |
+
"-skip-adodbapi",
|
67 |
+
default=False,
|
68 |
+
action="store_true",
|
69 |
+
help="Skip the adodbapi tests; useful for CI where there's no provider",
|
70 |
+
)
|
71 |
+
|
72 |
+
args, remains = parser.parse_known_args()
|
73 |
+
|
74 |
+
# win32, win32ui / Pythonwin
|
75 |
+
|
76 |
+
extras = []
|
77 |
+
if args.user_interaction:
|
78 |
+
extras += ["-user-interaction"]
|
79 |
+
extras.extend(remains)
|
80 |
+
scripts = [
|
81 |
+
"win32/test/testall.py",
|
82 |
+
"Pythonwin/pywin/test/all.py",
|
83 |
+
]
|
84 |
+
for script in scripts:
|
85 |
+
maybes = [os.path.join(directory, script) for directory in code_directories]
|
86 |
+
find_and_run(maybes, extras)
|
87 |
+
|
88 |
+
# win32com
|
89 |
+
maybes = [
|
90 |
+
os.path.join(directory, "win32com", "test", "testall.py")
|
91 |
+
for directory in [
|
92 |
+
os.path.join(this_dir, "com"),
|
93 |
+
]
|
94 |
+
+ site_packages
|
95 |
+
]
|
96 |
+
extras = remains + ["1"] # only run "level 1" tests in CI
|
97 |
+
find_and_run(maybes, extras)
|
98 |
+
|
99 |
+
# adodbapi
|
100 |
+
if not args.skip_adodbapi:
|
101 |
+
maybes = [
|
102 |
+
os.path.join(directory, "adodbapi", "test", "adodbapitest.py")
|
103 |
+
for directory in code_directories
|
104 |
+
]
|
105 |
+
find_and_run(maybes, remains)
|
106 |
+
# This script has a hard-coded sql server name in it, (and markh typically
|
107 |
+
# doesn't have a different server to test on) but there is now supposed to be a server out there on the Internet
|
108 |
+
# just to run these tests, so try it...
|
109 |
+
maybes = [
|
110 |
+
os.path.join(directory, "adodbapi", "test", "test_adodbapi_dbapi20.py")
|
111 |
+
for directory in code_directories
|
112 |
+
]
|
113 |
+
find_and_run(maybes, remains)
|
114 |
+
|
115 |
+
if failures:
|
116 |
+
print("The following scripts failed")
|
117 |
+
for failure in failures:
|
118 |
+
print(">", failure)
|
119 |
+
sys.exit(1)
|
120 |
+
print("All tests passed \\o/")
|
121 |
+
|
122 |
+
|
123 |
+
if __name__ == "__main__":
|
124 |
+
main()
|
MLPY/Scripts/tensorboard.exe
ADDED
Binary file (108 kB). View file
|
|
MLPY/Scripts/torchrun.exe
ADDED
Binary file (108 kB). View file
|
|