#
tokens: 18891/50000 18/18 files
lines: on (toggle) GitHub
raw markdown copy reset
# Directory Structure

```
├── .gitignore
├── .idea
│   ├── .gitignore
│   ├── .name
│   ├── git_toolbox_blame.xml
│   ├── inspectionProfiles
│   │   ├── profiles_settings.xml
│   │   └── Project_Default.xml
│   ├── misc.xml
│   ├── modules.xml
│   ├── server-litellm.iml
│   └── vcs.xml
├── .venv
│   ├── .lock
│   ├── pyvenv.cfg
│   └── Scripts
│       ├── activate
│       ├── activate.bat
│       ├── Activate.ps1
│       ├── deactivate.bat
│       ├── distro.exe
│       ├── dotenv.exe
│       ├── httpx.exe
│       ├── huggingface-cli.exe
│       ├── jsonschema.exe
│       ├── litellm.exe
│       ├── mcp-server-litellm.exe
│       ├── nodeenv.exe
│       ├── normalizer.exe
│       ├── openai.exe
│       ├── pip.exe
│       ├── pip3.11.exe
│       ├── pip3.exe
│       ├── pyright-langserver.exe
│       ├── pyright-python-langserver.exe
│       ├── pyright-python.exe
│       ├── pyright.exe
│       ├── python.exe
│       ├── pythonw.exe
│       ├── ruff.exe
│       ├── tqdm.exe
│       └── uvicorn.exe
├── pyproject.toml
├── README.md
├── src
│   └── server_litellm
│       ├── __init__.py
│       ├── __main__.py
│       └── server.py
└── uv.lock
```

# Files

--------------------------------------------------------------------------------
/.venv/.lock:
--------------------------------------------------------------------------------

```
1 | 
```

--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------

```
1 | server-litellm
```

--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------

```
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 | 
```

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
 1 | # Python
 2 | __pycache__/
 3 | *.py[cod]
 4 | *$py.class
 5 | *.so
 6 | .Python
 7 | build/
 8 | develop-eggs/
 9 | dist/
10 | downloads/
11 | eggs/
12 | .eggs/
13 | lib/
14 | lib64/
15 | parts/
16 | sdist/
17 | var/
18 | wheels/
19 | *.egg-info/
20 | .installed.cfg
21 | *.egg
22 | venv/
23 | env/
24 | 
25 | # IDE
26 | ../../Desktop/Anthropic/MCP/mcp-server-litellm/.idea/
27 | .vscode/
28 | *.swp
29 | *.swo
30 | 
31 | # Environment
32 | .env
```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # LiteLLM MCP Server
 2 | 
 3 | An MCP server that integrates LiteLLM to handle text completions using OpenAI models.
 4 | 
 5 | ## Installation
 6 | 
 7 | Install the package:
 8 | ```bash
 9 | pip install mcp-server-litellm
10 | 
```

--------------------------------------------------------------------------------
/.idea/git_toolbox_blame.xml:
--------------------------------------------------------------------------------

```
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <project version="4">
3 |   <component name="GitToolBoxBlameSettings">
4 |     <option name="version" value="2" />
5 |   </component>
6 | </project>
```

--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------

```
1 | <component name="InspectionProjectProfileManager">
2 |   <settings>
3 |     <option name="USE_PROJECT_PROFILE" value="false" />
4 |     <version value="1.0" />
5 |   </settings>
6 | </component>
```

--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------

```
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <project version="4">
3 |   <component name="VcsDirectoryMappings">
4 |     <mapping directory="$PROJECT_DIR$" vcs="Git" />
5 |   </component>
6 | </project>
```

--------------------------------------------------------------------------------
/src/server_litellm/__main__.py:
--------------------------------------------------------------------------------

```python
1 | """
2 | Main entry point for the LiteLLM MCP server.
3 | """
4 | import asyncio
5 | from server_litellm.server import main
6 | 
7 | if __name__ == "__main__":
8 | 	# Run the async main function with asyncio
9 | 	asyncio.run(main())
```

--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------

```
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <project version="4">
3 |   <component name="ProjectModuleManager">
4 |     <modules>
5 |       <module fileurl="file://$PROJECT_DIR$/.idea/server-litellm.iml" filepath="$PROJECT_DIR$/.idea/server-litellm.iml" />
6 |     </modules>
7 |   </component>
8 | </project>
```

--------------------------------------------------------------------------------
/src/server_litellm/__init__.py:
--------------------------------------------------------------------------------

```python
 1 | """
 2 | LiteLLM MCP Server package initialization.
 3 | """
 4 | from . import server
 5 | import asyncio
 6 | 
 7 | def main():
 8 | 	"""Main entry point for the package."""
 9 | 	# Run the async main function properly with asyncio
10 | 	return asyncio.run(server.main())
11 | 
12 | # Expose important items at package level
13 | __all__ = ['main', 'server']
```

--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------

```
1 | <?xml version="1.0" encoding="UTF-8"?>
2 | <project version="4">
3 |   <component name="Black">
4 |     <option name="sdkName" value="Python 3.12 (mcp-server-litellm)" />
5 |   </component>
6 |   <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (server-litellm)" project-jdk-type="Python SDK" />
7 | </project>
```

--------------------------------------------------------------------------------
/.venv/Scripts/deactivate.bat:
--------------------------------------------------------------------------------

```
 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 | set VIRTUAL_ENV_PROMPT=
21 | 
22 | :END
23 | 
```

--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------

```toml
 1 | [project]
 2 | name = "mcp-server-litellm"
 3 | version = "0.1.0"
 4 | description = "An MCP server for LiteLLM integration"
 5 | readme = "README.md"
 6 | requires-python = ">=3.10"
 7 | 
 8 | [project.dependencies]
 9 | mcp = ">=1.0.0"
10 | litellm = ">=0.1.0"
11 | pydantic = ">=2.0.0"
12 | python-dotenv = ">=0.21.0"
13 | 
14 | [build-system]
15 | requires = ["hatchling"]
16 | build-backend = "hatchling.build"
17 | 
18 | [project.scripts]
19 | mcp-server-litellm = "server_litellm"
20 | 
```

--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------

```
 1 | <component name="InspectionProjectProfileManager">
 2 |   <profile version="1.0">
 3 |     <option name="myName" value="Project Default" />
 4 |     <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
 5 |     <inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
 6 |       <option name="ignoredErrors">
 7 |         <list>
 8 |           <option value="N812" />
 9 |         </list>
10 |       </option>
11 |     </inspection_tool>
12 |   </profile>
13 | </component>
```

--------------------------------------------------------------------------------
/.venv/Scripts/activate.bat:
--------------------------------------------------------------------------------

```
 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=C:\Users\Darian\PycharmProjects\server-litellm\.venv
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=(.venv) %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 | set VIRTUAL_ENV_PROMPT=(.venv) 
29 | 
30 | :END
31 | if defined _OLD_CODEPAGE (
32 |     "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
33 |     set _OLD_CODEPAGE=
34 | )
35 | 
```

--------------------------------------------------------------------------------
/src/server_litellm/server.py:
--------------------------------------------------------------------------------

```python
  1 | # src/server_litellm/server.py
  2 | import os
  3 | import logging
  4 | from typing import List
  5 | from mcp.server import Server
  6 | from mcp.server.stdio import stdio_server
  7 | from mcp.types import TextContent, Tool
  8 | from litellm import completion
  9 | from dotenv import load_dotenv
 10 | 
 11 | # Load environment variables from .env file or system
 12 | load_dotenv()
 13 | 
 14 | # Configure logging
 15 | logging.basicConfig(level=logging.INFO)
 16 | logger = logging.getLogger("litellm-server")
 17 | 
 18 | # Initialize the server
 19 | app = Server("litellm-server")
 20 | 
 21 | # Ensure the OPENAI_API_KEY is set
 22 | OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
 23 | if not OPENAI_API_KEY:
 24 | 	raise EnvironmentError("Missing OpenAI API Key. Ensure it is set in the .env file or environment variables.")
 25 | 
 26 | @app.list_tools()
 27 | async def list_tools() -> List[Tool]:
 28 | 	"""
 29 | 	List available tools for LiteLLM server.
 30 | 	"""
 31 | 	return [
 32 | 		Tool(
 33 | 			name="complete",
 34 | 			description="Send a completion request to a specified LLM model.",
 35 | 			inputSchema={
 36 | 				"type": "object",
 37 | 				"properties": {
 38 | 					"model": {
 39 | 						"type": "string",
 40 | 						"description": "The LLM model to use (e.g., 'gpt-3.5-turbo', 'gpt-4')."
 41 | 					},
 42 | 					"messages": {
 43 | 						"type": "array",
 44 | 						"description": "An array of conversation messages, each with 'role' and 'content'.",
 45 | 						"items": {
 46 | 							"type": "object",
 47 | 							"properties": {
 48 | 								"role": {"type": "string", "description": "The role in the conversation (e.g., 'user', 'assistant')."},
 49 | 								"content": {"type": "string", "description": "The content of the message."}
 50 | 							},
 51 | 							"required": ["role", "content"]
 52 | 						}
 53 | 					}
 54 | 				},
 55 | 				"required": ["model", "messages"]
 56 | 			}
 57 | 		)
 58 | 	]
 59 | 
 60 | @app.call_tool()
 61 | async def call_tool(name: str, arguments: dict) -> List[TextContent]:
 62 | 	"""
 63 | 	Handle the 'complete' tool calls.
 64 | 	"""
 65 | 	if name != "complete":
 66 | 		raise ValueError(f"Unknown tool: {name}")
 67 | 
 68 | 	try:
 69 | 		# Extract and validate arguments
 70 | 		model = arguments.get("model")
 71 | 		messages = arguments.get("messages", [])
 72 | 
 73 | 		if not isinstance(messages, list):
 74 | 			raise ValueError("The 'messages' argument must be a list of objects with 'role' and 'content' fields.")
 75 | 
 76 | 		# Ensure all messages have 'role' and 'content'
 77 | 		for message in messages:
 78 | 			if not isinstance(message, dict) or "role" not in message or "content" not in message:
 79 | 				raise ValueError(f"Each message must have 'role' and 'content'. Invalid message: {message}")
 80 | 
 81 | 		# Log the input arguments for debugging
 82 | 		logger.debug(f"Model: {model}, Messages: {messages}")
 83 | 
 84 | 		# Call LiteLLM's completion function
 85 | 		response = completion(
 86 | 			model=model,
 87 | 			messages=messages
 88 | 		)
 89 | 
 90 | 		# Extract the response text
 91 | 		text = response.get("choices", [{}])[0].get("message", {}).get("content", "Error: No response content.")
 92 | 
 93 | 		# Return the response in MCP format
 94 | 		return [TextContent(type="text", text=text)]
 95 | 
 96 | 	except Exception as e:
 97 | 		logger.error(f"Error during LiteLLM completion: {e}")
 98 | 		raise RuntimeError(f"LLM API error: {e}")
 99 | 
100 | async def run_server():
101 | 	"""
102 | 	Run the LiteLLM MCP server.
103 | 	"""
104 | 	async with stdio_server() as (read_stream, write_stream):
105 | 		await app.run(read_stream, write_stream, app.create_initialization_options())
106 | 
107 | def main():
108 | 	"""
109 | 	Main entry point for the server.
110 | 	"""
111 | 	import asyncio
112 | 	asyncio.run(run_server())
113 | 
```

--------------------------------------------------------------------------------
/.venv/Scripts/Activate.ps1:
--------------------------------------------------------------------------------

```
  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 VIRTUAL_ENV_PROMPT altogether.
100 |     if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
101 |         Remove-Item -Path env:VIRTUAL_ENV_PROMPT
102 |     }
103 | 
104 |     # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
105 |     if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
106 |         Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
107 |     }
108 | 
109 |     # Leave deactivate function in the global namespace if requested:
110 |     if (-not $NonDestructive) {
111 |         Remove-Item -Path function:deactivate
112 |     }
113 | }
114 | 
115 | <#
116 | .Description
117 | Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
118 | given folder, and returns them in a map.
119 | 
120 | For each line in the pyvenv.cfg file, if that line can be parsed into exactly
121 | two strings separated by `=` (with any amount of whitespace surrounding the =)
122 | then it is considered a `key = value` line. The left hand string is the key,
123 | the right hand is the value.
124 | 
125 | If the value starts with a `'` or a `"` then the first and last character is
126 | stripped from the value before being captured.
127 | 
128 | .Parameter ConfigDir
129 | Path to the directory that contains the `pyvenv.cfg` file.
130 | #>
131 | function Get-PyVenvConfig(
132 |     [String]
133 |     $ConfigDir
134 | ) {
135 |     Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
136 | 
137 |     # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
138 |     $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
139 | 
140 |     # An empty map will be returned if no config file is found.
141 |     $pyvenvConfig = @{ }
142 | 
143 |     if ($pyvenvConfigPath) {
144 | 
145 |         Write-Verbose "File exists, parse `key = value` lines"
146 |         $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
147 | 
148 |         $pyvenvConfigContent | ForEach-Object {
149 |             $keyval = $PSItem -split "\s*=\s*", 2
150 |             if ($keyval[0] -and $keyval[1]) {
151 |                 $val = $keyval[1]
152 | 
153 |                 # Remove extraneous quotations around a string value.
154 |                 if ("'""".Contains($val.Substring(0, 1))) {
155 |                     $val = $val.Substring(1, $val.Length - 2)
156 |                 }
157 | 
158 |                 $pyvenvConfig[$keyval[0]] = $val
159 |                 Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
160 |             }
161 |         }
162 |     }
163 |     return $pyvenvConfig
164 | }
165 | 
166 | 
167 | <# Begin Activate script --------------------------------------------------- #>
168 | 
169 | # Determine the containing directory of this script
170 | $VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
171 | $VenvExecDir = Get-Item -Path $VenvExecPath
172 | 
173 | Write-Verbose "Activation script is located in path: '$VenvExecPath'"
174 | Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
175 | Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
176 | 
177 | # Set values required in priority: CmdLine, ConfigFile, Default
178 | # First, get the location of the virtual environment, it might not be
179 | # VenvExecDir if specified on the command line.
180 | if ($VenvDir) {
181 |     Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
182 | }
183 | else {
184 |     Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
185 |     $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
186 |     Write-Verbose "VenvDir=$VenvDir"
187 | }
188 | 
189 | # Next, read the `pyvenv.cfg` file to determine any required value such
190 | # as `prompt`.
191 | $pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
192 | 
193 | # Next, set the prompt from the command line, or the config file, or
194 | # just use the name of the virtual environment folder.
195 | if ($Prompt) {
196 |     Write-Verbose "Prompt specified as argument, using '$Prompt'"
197 | }
198 | else {
199 |     Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
200 |     if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
201 |         Write-Verbose "  Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
202 |         $Prompt = $pyvenvCfg['prompt'];
203 |     }
204 |     else {
205 |         Write-Verbose "  Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
206 |         Write-Verbose "  Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
207 |         $Prompt = Split-Path -Path $venvDir -Leaf
208 |     }
209 | }
210 | 
211 | Write-Verbose "Prompt = '$Prompt'"
212 | Write-Verbose "VenvDir='$VenvDir'"
213 | 
214 | # Deactivate any currently active virtual environment, but leave the
215 | # deactivate function in place.
216 | deactivate -nondestructive
217 | 
218 | # Now set the environment variable VIRTUAL_ENV, used by many tools to determine
219 | # that there is an activated venv.
220 | $env:VIRTUAL_ENV = $VenvDir
221 | 
222 | if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
223 | 
224 |     Write-Verbose "Setting prompt to '$Prompt'"
225 | 
226 |     # Set the prompt to include the env name
227 |     # Make sure _OLD_VIRTUAL_PROMPT is global
228 |     function global:_OLD_VIRTUAL_PROMPT { "" }
229 |     Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
230 |     New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
231 | 
232 |     function global:prompt {
233 |         Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
234 |         _OLD_VIRTUAL_PROMPT
235 |     }
236 |     $env:VIRTUAL_ENV_PROMPT = $Prompt
237 | }
238 | 
239 | # Clear PYTHONHOME
240 | if (Test-Path -Path Env:PYTHONHOME) {
241 |     Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
242 |     Remove-Item -Path Env:PYTHONHOME
243 | }
244 | 
245 | # Add the venv to the PATH
246 | Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
247 | $Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
248 | 
249 | # SIG # Begin signature block
250 | # MIIvIQYJKoZIhvcNAQcCoIIvEjCCLw4CAQExDzANBglghkgBZQMEAgEFADB5Bgor
251 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
252 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBnL745ElCYk8vk
253 | # dBtMuQhLeWJ3ZGfzKW4DHCYzAn+QB6CCE8MwggWQMIIDeKADAgECAhAFmxtXno4h
254 | # MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
255 | # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
256 | # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z
257 | # ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
258 | # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
259 | # IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
260 | # AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z
261 | # G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ
262 | # anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s
263 | # Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL
264 | # 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb
265 | # BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3
266 | # JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c
267 | # AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx
268 | # YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0
269 | # viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL
270 | # T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud
271 | # EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf
272 | # Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk
273 | # aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS
274 | # PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK
275 | # 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB
276 | # cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp
277 | # 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg
278 | # dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri
279 | # RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7
280 | # 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5
281 | # nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3
282 | # i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H
283 | # EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G
284 | # CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
285 | # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
286 | # IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla
287 | # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
288 | # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
289 | # ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C
290 | # 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce
291 | # 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da
292 | # E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T
293 | # SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA
294 | # FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh
295 | # D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM
296 | # 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z
297 | # 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05
298 | # huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY
299 | # mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP
300 | # /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T
301 | # AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD
302 | # VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG
303 | # A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY
304 | # aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj
305 | # ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV
306 | # HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
307 | # cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN
308 | # BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry
309 | # sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL
310 | # IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf
311 | # Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh
312 | # OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh
313 | # dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV
314 | # 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j
315 | # wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH
316 | # Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC
317 | # XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l
318 | # /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW
319 | # eE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0GCSqGSIb3DQEBCwUA
320 | # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
321 | # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
322 | # ODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1MjM1OTU5WjB8MQsw
323 | # CQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQHEwlCZWF2ZXJ0b24x
324 | # IzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQDExpQ
325 | # eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
326 | # ADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiSYgDFfwhjQy89koM7
327 | # uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi0GGAZUegEAeRlSXx
328 | # xhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN16yS8skFa3IHyvWdb
329 | # D9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGuppxcia6a7xCyKoOA
330 | # GjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu352diDY+iCMpk9Zanm
331 | # SjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0ZFYKeb6BLA66d2GA
332 | # LwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oERzTzEiV6nCO1M3U1
333 | # HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZI7IWe7JKhHohqKuc
334 | # eQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16xot2KVPdfyPAWd81w
335 | # tZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapPUnwo8ygflJJ74J+B
336 | # Yxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3ZIly+qIqDAgMBAAGj
337 | # ggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4E
338 | # FgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQM
339 | # MAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwzLmRp
340 | # Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNI
341 | # QTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20v
342 | # RGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0Ex
343 | # LmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8v
344 | # d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUF
345 | # BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6
346 | # Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
347 | # aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZI
348 | # hvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcWTiNc2rskrNLrfH1N
349 | # s0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+VVzxC88pOEvz68nA
350 | # 82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfLIJQsAHBla0i7QRF2
351 | # de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izWOXM95BSkFSKdE45O
352 | # q3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86WmjRUqbrnvdyR2yd
353 | # I5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+W1scCpnA8YTs2d50
354 | # jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM58WEDkbeoriDk3hxU
355 | # 8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMfZOm5cuclMnUHs2uq
356 | # rRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw/TKqVL4Oaz3bkMSs
357 | # M46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3r7bjyHTxOgqxRCVa
358 | # 18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VHxaZg2unjHY3rMYIa
359 | # tDCCGrACAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
360 | # Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT
361 | # QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM0NHdMA0GCWCGSAFl
362 | # AwQCAQUAoIHIMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
363 | # AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBnAZ6P7YvTwq0fbF62
364 | # o7E75R0LxsW5OtyYiFESQckLhjBcBgorBgEEAYI3AgEMMU4wTKBGgEQAQgB1AGkA
365 | # bAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAxAC4AMwBfADIAMAAyADMA
366 | # MAA0ADAANAAuADAAMaECgAAwDQYJKoZIhvcNAQEBBQAEggIAbmsoeVnvqR4l7EsR
367 | # nUNDQhIoOsioPo5dRYtGRoY3gWX6NnIWzyYo3nlX//xY6JbfZ8oyaqLZULFMkLWm
368 | # +c70FKdQS5yI9auu/DOqmZ0AcPsLXEc7rJZagpBDgi6xCvAyvpAHj1FUcGGzWsE+
369 | # Qp8LkKU5AApLcHpBci3eZYUpiwoTNvDCQLYIv5j5mh8Fb8j2D/sUt2coONsqLllY
370 | # BB1Cpko4g9CEfJKtXKb8g0U8+giDAxt/0r6AMdeqlx9ysFB0Nil+tneagBTQ4vQl
371 | # pl5mztf7JVkzasgDNvNcFMo04crUW5g5oErl3e/bO63v1duN7ZuJBJvKs9aDrogI
372 | # KOLwYbTYa1Y5wHCsz8HCgd3pfRxQgwWL0+zx7+MKpqlvo20JmFG5H8wj3tcdc1FW
373 | # QeOVYzVijkeGqRb21HTNHKuTfV4Gw3cLdT4oOENY3JdkJ+oqnAiSwC1p/Fm3pizG
374 | # wkc3D+JjNYg6UT+9PdWqLtsjaBODM1lB22Bpx/nnPCnUG8WEx9cwi39zJdV+atcZ
375 | # eTKc+Ahpyxot3az6yv9w83+7wIdnSWBWQwAHonjwx1jjMiiDpLyHblqxt/jgejkV
376 | # VQEam7XX3KOKI3CHDC8k3M4V6QTnCTIX/WLslIO57hwUGtOAGmww6/q2NOqKeqpH
377 | # 1B6f/CLtXwSh0d4raerISKVQjYChghc9MIIXOQYKKwYBBAGCNwMDATGCFykwghcl
378 | # BgkqhkiG9w0BBwKgghcWMIIXEgIBAzEPMA0GCWCGSAFlAwQCAQUAMHcGCyqGSIb3
379 | # DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQgkIZK
380 | # LoYk5fC9ubz0LiZd/QHnskSNa7ucOHGD7CWySe4CEHn5OnRbrbmQtyWnJjmOhREY
381 | # DzIwMjMwNDA1MDAwMjQ1WqCCEwcwggbAMIIEqKADAgECAhAMTWlyS5T6PCpKPSkH
382 | # gD1aMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp
383 | # Q2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2
384 | # IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwHhcNMjIwOTIxMDAwMDAwWhcNMzMxMTIx
385 | # MjM1OTU5WjBGMQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxJDAiBgNV
386 | # BAMTG0RpZ2lDZXJ0IFRpbWVzdGFtcCAyMDIyIC0gMjCCAiIwDQYJKoZIhvcNAQEB
387 | # BQADggIPADCCAgoCggIBAM/spSY6xqnya7uNwQ2a26HoFIV0MxomrNAcVR4eNm28
388 | # klUMYfSdCXc9FZYIL2tkpP0GgxbXkZI4HDEClvtysZc6Va8z7GGK6aYo25BjXL2J
389 | # U+A6LYyHQq4mpOS7eHi5ehbhVsbAumRTuyoW51BIu4hpDIjG8b7gL307scpTjUCD
390 | # HufLckkoHkyAHoVW54Xt8mG8qjoHffarbuVm3eJc9S/tjdRNlYRo44DLannR0hCR
391 | # RinrPibytIzNTLlmyLuqUDgN5YyUXRlav/V7QG5vFqianJVHhoV5PgxeZowaCiS+
392 | # nKrSnLb3T254xCg/oxwPUAY3ugjZNaa1Htp4WB056PhMkRCWfk3h3cKtpX74LRsf
393 | # 7CtGGKMZ9jn39cFPcS6JAxGiS7uYv/pP5Hs27wZE5FX/NurlfDHn88JSxOYWe1p+
394 | # pSVz28BqmSEtY+VZ9U0vkB8nt9KrFOU4ZodRCGv7U0M50GT6Vs/g9ArmFG1keLuY
395 | # /ZTDcyHzL8IuINeBrNPxB9ThvdldS24xlCmL5kGkZZTAWOXlLimQprdhZPrZIGwY
396 | # UWC6poEPCSVT8b876asHDmoHOWIZydaFfxPZjXnPYsXs4Xu5zGcTB5rBeO3GiMiw
397 | # bjJ5xwtZg43G7vUsfHuOy2SJ8bHEuOdTXl9V0n0ZKVkDTvpd6kVzHIR+187i1Dp3
398 | # AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNV
399 | # HSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgB
400 | # hv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYE
401 | # FGKK3tBh/I8xFO2XC809KpQU31KcMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9j
402 | # cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZU
403 | # aW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzAB
404 | # hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9j
405 | # YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEy
406 | # NTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAFWqKhrzRvN4
407 | # Vzcw/HXjT9aFI/H8+ZU5myXm93KKmMN31GT8Ffs2wklRLHiIY1UJRjkA/GnUypsp
408 | # +6M/wMkAmxMdsJiJ3HjyzXyFzVOdr2LiYWajFCpFh0qYQitQ/Bu1nggwCfrkLdcJ
409 | # iXn5CeaIzn0buGqim8FTYAnoo7id160fHLjsmEHw9g6A++T/350Qp+sAul9Kjxo6
410 | # UrTqvwlJFTU2WZoPVNKyG39+XgmtdlSKdG3K0gVnK3br/5iyJpU4GYhEFOUKWaJr
411 | # 5yI+RCHSPxzAm+18SLLYkgyRTzxmlK9dAlPrnuKe5NMfhgFknADC6Vp0dQ094XmI
412 | # vxwBl8kZI4DXNlpflhaxYwzGRkA7zl011Fk+Q5oYrsPJy8P7mxNfarXH4PMFw1nf
413 | # J2Ir3kHJU7n/NBBn9iYymHv+XEKUgZSCnawKi8ZLFUrTmJBFYDOA4CPe+AOk9kVH
414 | # 5c64A0JH6EE2cXet/aLol3ROLtoeHYxayB6a1cLwxiKoT5u92ByaUcQvmvZfpyeX
415 | # upYuhVfAYOd4Vn9q78KVmksRAsiCnMkaBXy6cbVOepls9Oie1FqYyJ+/jbsYXEP1
416 | # 0Cro4mLueATbvdH7WwqocH7wl4R44wgDXUcsY6glOJcB0j862uXl9uab3H4szP8X
417 | # TE0AotjWAQ64i+7m4HJViSwnGWH2dwGMMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhH
418 | # rP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
419 | # RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD
420 | # ExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcw
421 | # MzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
422 | # Yy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYg
423 | # VGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
424 | # xoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo
425 | # +n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQX
426 | # f6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8
427 | # ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6l
428 | # Y2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lX
429 | # KZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU
430 | # 2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2
431 | # RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR
432 | # 8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015L
433 | # dhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNY
434 | # CQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIG
435 | # A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshv
436 | # MB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIB
437 | # hjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUH
438 | # MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDov
439 | # L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQw
440 | # QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lD
441 | # ZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZI
442 | # AYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBgu
443 | # EE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFn
444 | # zbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/t
445 | # YLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWK
446 | # cXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7
447 | # pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkP
448 | # lM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4
449 | # c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kad
450 | # dSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYaw
451 | # mKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL
452 | # 5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3b
453 | # NzgaoSv27dZ8/DCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZI
454 | # hvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
455 | # MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNz
456 | # dXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVow
457 | # YjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ
458 | # d3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290
459 | # IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjww
460 | # IjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J5
461 | # 8soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMH
462 | # hOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6
463 | # Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQ
464 | # ecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4b
465 | # A3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9
466 | # WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCU
467 | # tNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvo
468 | # ZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/J
469 | # vNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCP
470 | # orF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMB
471 | # Af8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXr
472 | # oq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRt
473 | # MGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEF
474 | # BQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl
475 | # ZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdp
476 | # Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgw
477 | # BgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cH
478 | # vZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8
479 | # UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTn
480 | # f+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxU
481 | # jG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8j
482 | # LfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3Yw
483 | # ggNyAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
484 | # MTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRp
485 | # bWVTdGFtcGluZyBDQQIQDE1pckuU+jwqSj0pB4A9WjANBglghkgBZQMEAgEFAKCB
486 | # 0TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIz
487 | # MDQwNTAwMDI0NVowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQU84ciTYYzgpI1qZS8
488 | # vY+W6f4cfHMwLwYJKoZIhvcNAQkEMSIEIJBlriw3QJw5qq5ADo60uCRAA2a3vjKn
489 | # zaGl8ppJqVo5MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIMf04b4yKIkgq+ImOr4a
490 | # xPxP5ngcLWTQTIB1V6Ajtbb6MA0GCSqGSIb3DQEBAQUABIICADC4cqKeH7lb0Ll+
491 | # iZIDw+mU6vcA3C8vUPR4KdqQmVlEkjfKdHBpHOI1eRkXwesD+BkrXpRX/NMNKm5w
492 | # eKlymuuS70/NOX03BgnP4A9p4TqSZJcLvrP5VUc7VlMaVwkNj47vft4OF9A7PFs4
493 | # 3e8BJmhhkXDh1j+MdQ5URPGsla8uYm74Cn/T2WPNZ5FFQ8nkoVz93x1c5wUYEruB
494 | # uIyFKwZshDnsYsHetZoBMpWDspcXj0kKAplBW0hUw6kgX7qBKX7doTcZPXP00VM8
495 | # vYnpQkJPGrTZ4S/cN0D5k0ZTXTCTDtOpFaZLbG29OgSFxD/TslfXkf1t8GiuzXvk
496 | # u6xLEPxBW9N4yrun+jUjXr0921HEg7BKRr77bGS9v9b4mfzThomjtdcL3bweU5RE
497 | # 3Bg4qVrgNF9Io8L/n39U7Zd5LG4Nacd+Uv+B1x6sfyQP+vGvY0UEiJUhkGy0ymzm
498 | # RBtsPmJanvIovpkYebSccueoeC08/AUf2LxZ6lfGxkJp95vNj4pWToYRXY2dj5JE
499 | # 6nX7mLYn3mWMbXniPhtpnYJeDahE2cuB3pqbhZSlGpOtF7fEPSCBq9P3YMnuyRun
500 | # thsRTf8xc30muj6bRejnUJj0bNQaByZKAhEENnqH0TXBF7yasT1H3/PyC1pgyzx8
501 | # swIsvJFXCqG2u9lftpHuQYmHPDoq
502 | # SIG # End signature block
503 | 
```