# 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 | ```