From c1e8468c69bf8be2e6f8d20358d107f497df99f0 Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Tue, 13 Feb 2024 17:18:05 -0800 Subject: [PATCH 01/19] Robch/2402 feb13 aistudio copilot test script and bug fix main merged (#211) * add initial aistudio-copilot-sample-repo test script * wip * be more explicit about how RunShellCommand w/ scriptOrFileName / scriptIsBash works * updates * fixes * dev shell run scripts "more correctly" * better output * update tests to work when using bash * test now run on both windows and linux * better output; java and python now work cross platform without use of `py` now too * fix a couple bugs and ensure correct toolset on cloud build for running tests * make sure expectations are checking from correct working directory * fix filenames * update simulate tests to tag: skip * refactor into parser context to reduce parameters on stack, and ensure workingDirectory is cummulative * updates to testing aistudio repo * fix expectations to get more tests passing * fix couple bugs * fix bug and make tests better... * fix dark gray problem in docker * per hanchi --- .azure/pipelines/test_execute_and_report.yaml | 25 +++ scripts/InstallAzureAICLIDeb.sh | 2 +- src/ai/commands/chat_command.cs | 11 +- src/ai/commands/dev_command.cs | 73 ++----- src/ai/commands/parsers/dev_command_parser.cs | 3 +- src/ai/commands/search_command.cs | 6 +- src/ai/helpers/config_environment_helpers.cs | 1 + .../python_sdk_wrapper.cs | 4 +- src/common/details/console/ColorHelpers.cs | 35 ++++ src/common/details/helpers/process_helpers.cs | 81 +++++++- src/common/details/helpers/value_helpers.cs | 2 +- .../tokens/run_bash_script_token.cs | 18 ++ tests/test-aistudio-copilot-sample-repo.yaml | 191 ++++++++++++++++++ tests/test.yaml | 2 + tests/test3.yaml | 124 ++++++++---- tests/testframework/Logger.cs | 76 +++---- tests/testframework/YamlHelpers.cs | 1 - .../testframework/YamlTestCaseParseContext.cs | 17 ++ tests/testframework/YamlTestCaseParser.cs | 112 ++++++---- tests/testframework/YamlTestCaseRunner.cs | 68 ++++--- tests/testframework/YamlTestFramework.cs | 2 +- .../YamlTestFrameworkConsoleHost.cs | 96 ++++++--- 22 files changed, 690 insertions(+), 260 deletions(-) create mode 100644 src/common/details/named_values/tokens/run_bash_script_token.cs create mode 100644 tests/test-aistudio-copilot-sample-repo.yaml create mode 100644 tests/testframework/YamlTestCaseParseContext.cs diff --git a/.azure/pipelines/test_execute_and_report.yaml b/.azure/pipelines/test_execute_and_report.yaml index 2247e136..d8d2f1c0 100644 --- a/.azure/pipelines/test_execute_and_report.yaml +++ b/.azure/pipelines/test_execute_and_report.yaml @@ -3,6 +3,31 @@ parameters: TestFilter: 'TestCategory!=SkipOnVSTS' envToSet: '' steps: + +# ----------------------------------------------------------------------------- +# Ensure we can use the appropriate Java, Go, and NodeJs tools +# ----------------------------------------------------------------------------- +- bash: | + sudo apt update + sudo apt install -y msopenjdk-21 + displayName: 'Install msopenjdk-21' + continueOnError: true +# Equivalent to: sudo apt-get install -y golang-go +- task: GoTool@0 + displayName: 'Use Go 1.18' + inputs: + version: '1.18' + continueOnError: true + +# Equivalent to: +# curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash - &&\ +# sudo apt-get install -y nodejs +- task: NodeTool@0 + displayName: 'Use Node.js 21.x' + inputs: + versionSpec: '21.x' + continueOnError: true + # ----------------------------------------------------------------------------- # Run the tests # ----------------------------------------------------------------------------- diff --git a/scripts/InstallAzureAICLIDeb.sh b/scripts/InstallAzureAICLIDeb.sh index f948c04e..566de709 100644 --- a/scripts/InstallAzureAICLIDeb.sh +++ b/scripts/InstallAzureAICLIDeb.sh @@ -60,7 +60,7 @@ else sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb elif [[ "$CHECK_VERSION" == "22.04" ]]; then - # Install the Microsoft package signing key for Ubuntu 20.04 + # Install the Microsoft package signing key for Ubuntu 22.04 wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb diff --git a/src/ai/commands/chat_command.cs b/src/ai/commands/chat_command.cs index 3338d274..a6f3ecdf 100644 --- a/src/ai/commands/chat_command.cs +++ b/src/ai/commands/chat_command.cs @@ -481,7 +481,7 @@ private async Task GetSpeechInputAsync() { Console.Write("\r"); DisplayUserChatPromptLabel(); - Console.ForegroundColor = ConsoleColor.DarkGray; + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); var text = "(listening)"; Console.Write($"{text} ..."); @@ -493,7 +493,7 @@ private async Task GetSpeechInputAsync() { Console.Write("\r"); DisplayUserChatPromptLabel(); - Console.ForegroundColor = ConsoleColor.DarkGray; + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); Console.Write($"{e.Result.Text} ..."); if (e.Result.Text.Length < lastTextDisplayed.Length) Console.Write(new string(' ', lastTextDisplayed.Length - e.Result.Text.Length)); @@ -590,11 +590,11 @@ private void DisplayAssistantFunctionCall(HelperFunctionCallContext context, str Console.Write("\rassistant-function"); Console.ForegroundColor = ConsoleColor.White; Console.Write(": "); - Console.ForegroundColor = ConsoleColor.DarkGray; + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); Console.WriteLine($"{context.FunctionName}({context.Arguments}) = {result}"); DisplayAssistantPromptLabel(); - Console.ForegroundColor = ConsoleColor.Gray; + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); } } @@ -972,6 +972,7 @@ private static string ConvertMessagesToJson(IList messages) var system = message as ChatRequestSystemMessage; var assistant = message as ChatRequestAssistantMessage; var content = system?.Content ?? user?.Content ?? assistant?.Content; + content = content.Replace("\\", "\u005C").Replace("\"", ""); var ok = !string.IsNullOrEmpty(content); if (!ok) continue; @@ -1134,7 +1135,7 @@ await kernel.Memory.SaveReferenceAsync( var result = i > 0 ? sb.ToString().Trim() : null; - // Console.ForegroundColor = ConsoleColor.DarkGray; + // Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); // Console.WriteLine("Relevant?\n" + result + "\n"); // Console.ResetColor(); diff --git a/src/ai/commands/dev_command.cs b/src/ai/commands/dev_command.cs index cda027cb..7435641f 100644 --- a/src/ai/commands/dev_command.cs +++ b/src/ai/commands/dev_command.cs @@ -104,37 +104,33 @@ private void DoNewList() private void DoDevShell() { - DisplayBanner("dev.shell"); + var genericScript = RunCommandScriptToken.Data().GetOrDefault(_values); + var bashScript = RunBashScriptToken.Data().GetOrDefault(_values); + + var genericScriptOk = !string.IsNullOrEmpty(genericScript) ; + var bashScriptOk = !string.IsNullOrEmpty(bashScript); - var fileName = !OS.IsWindows() ? "bash" : "cmd.exe"; - var arguments = !OS.IsWindows() ? "-li" : "/k PROMPT (ai dev shell) %PROMPT%& title (ai dev shell)"; + var providedBothScripts = genericScriptOk && bashScriptOk; + if (providedBothScripts) + { + _values.AddThrowError("ERROR:", "Cannot specify both --script and --bash"); + } + DisplayBanner("dev.shell"); Console.WriteLine("Environment populated:\n"); var env = ConfigEnvironmentHelpers.GetEnvironment(_values); ConfigEnvironmentHelpers.PrintEnvironment(env); - ConfigEnvironmentHelpers.SetEnvironment(env); Console.WriteLine(); - var runCommand = RunCommandScriptToken.Data().GetOrDefault(_values); - - // var processOutput = string.IsNullOrEmpty(runCommand) - // ? ProcessHelpers.RunShellCommandAsync(fileName, arguments, env, null, null, null, false).Result - // : ProcessHelpers.RunShellCommandAsync(runCommand, env, null, null, null, false).Result; - - // var exitCode = processOutput.ExitCode; + var runScript = genericScriptOk || bashScriptOk; + var script = genericScriptOk ? genericScript : bashScript; - UpdateFileNameArguments(runCommand, ref fileName, ref arguments, out var deleteWhenDone); + var task = runScript + ? ProcessHelpers.RunShellScriptAsync(script, scriptIsBash: bashScriptOk, env, null, null, null, false) + : ProcessHelpers.RunShellInteractiveAsync(env, null, null, null, false); - var process = ProcessHelpers.StartProcess(fileName, arguments, env, false); - process.WaitForExit(); - - if (!string.IsNullOrEmpty(deleteWhenDone)) - { - File.Delete(deleteWhenDone); - } - - var exitCode = process.ExitCode; + var exitCode = task.Result.ExitCode; if (exitCode != 0) { Console.WriteLine("\n(ai dev shell) FAILED!\n"); @@ -146,41 +142,6 @@ private void DoDevShell() } } - private static void UpdateFileNameArguments(string runCommand, ref string fileName, ref string arguments, out string? deleteTempFileWhenDone) - { - deleteTempFileWhenDone = null; - - if (!string.IsNullOrEmpty(runCommand)) - { - var isSingleLine = !runCommand.Contains('\n') && !runCommand.Contains('\r'); - if (isSingleLine) - { - var parts = runCommand.Split(new char[] { ' ' }, 2); - var inPath = FileHelpers.FileExistsInOsPath(parts[0]) || (OS.IsWindows() && FileHelpers.FileExistsInOsPath(parts[0] + ".exe")); - - var filePart = parts[0]; - var argsPart = parts.Length == 2 ? parts[1] : null; - - fileName = inPath ? filePart : fileName; - arguments = inPath ? argsPart : (OS.IsLinux() - ? $"-lic \"{runCommand}\"" - : $"/c \"{runCommand}\""); - - Console.WriteLine($"Running command: {runCommand}\n"); - } - else - { - deleteTempFileWhenDone = Path.GetTempFileName() + (OS.IsWindows() ? ".cmd" : ".sh"); - File.WriteAllText(deleteTempFileWhenDone, runCommand); - - fileName = OS.IsLinux() ? "bash" : "cmd.exe"; - arguments = OS.IsLinux() ? $"-lic \"{deleteTempFileWhenDone}\"" : $"/c \"{deleteTempFileWhenDone}\""; - - Console.WriteLine($"Running script:\n\n{runCommand}\n"); - } - } - } - private void DisplayBanner(string which) { if (_quiet) return; diff --git a/src/ai/commands/parsers/dev_command_parser.cs b/src/ai/commands/parsers/dev_command_parser.cs index 5ddc0ab4..c4152b4e 100644 --- a/src/ai/commands/parsers/dev_command_parser.cs +++ b/src/ai/commands/parsers/dev_command_parser.cs @@ -84,7 +84,8 @@ public CommonDevNamedValueTokenParsers() : base( private static INamedValueTokenParser[] _devShellParsers = { new CommonDevNamedValueTokenParsers(), - RunCommandScriptToken.Parser() + RunCommandScriptToken.Parser(), + RunBashScriptToken.Parser() }; } } diff --git a/src/ai/commands/search_command.cs b/src/ai/commands/search_command.cs index 445e216d..572e3b74 100644 --- a/src/ai/commands/search_command.cs +++ b/src/ai/commands/search_command.cs @@ -161,7 +161,11 @@ private void DoIndexUpdate() private string DoIndexUpdateWithGenAi(string subscription, string groupName, string projectName, string indexName, string embeddingModelDeployment, string embeddingModelName, string dataFiles, string externalSourceUrl) { - return PythonSDKWrapper.UpdateMLIndex(_values, subscription, groupName, projectName, indexName, embeddingModelDeployment, embeddingModelName, dataFiles, externalSourceUrl); + // work around issue with Py GenAI SDK needing this var to be set; do not set any additional values... See Hanchi Wang for more info. + var env = ConfigEnvironmentHelpers.GetEnvironment(_values); + env = new Dictionary(env.Where(x => x.Key == "AZURE_OPENAI_KEY")); + + return PythonSDKWrapper.UpdateMLIndex(_values, subscription, groupName, projectName, indexName, embeddingModelDeployment, embeddingModelName, dataFiles, externalSourceUrl, env); } private async Task DoIndexUpdateWithAISearch(string aiServicesApiKey, string searchEndpoint, string searchApiKey, string embeddingsEndpoint, string embeddingsDeployment, string embeddingsApiKey, string searchIndexName, string dataSourceConnectionName, string blobContainer, string pattern, string skillsetName, string indexerName, string idFieldName, string contentFieldName, string vectorFieldName) diff --git a/src/ai/helpers/config_environment_helpers.cs b/src/ai/helpers/config_environment_helpers.cs index f2d0efe1..cd77b4c2 100644 --- a/src/ai/helpers/config_environment_helpers.cs +++ b/src/ai/helpers/config_environment_helpers.cs @@ -24,6 +24,7 @@ public static Dictionary GetEnvironment(INamedValues values) env.Add("AZURE_OPENAI_ENDPOINT", ReadConfig(values, "chat.endpoint")); env.Add("AZURE_OPENAI_KEY", ReadConfig(values, "chat.key")); + env.Add("AZURE_OPENAI_API_KEY", ReadConfig(values, "chat.key")); env.Add("AZURE_OPENAI_API_VERSION", ChatCommand.GetOpenAIClientVersionNumber()); env.Add("AZURE_OPENAI_CHAT_DEPLOYMENT", ReadConfig(values, "chat.deployment")); diff --git a/src/common/details/ai_python_generative_sdk/python_sdk_wrapper.cs b/src/common/details/ai_python_generative_sdk/python_sdk_wrapper.cs index d74cfdb0..54c0b0d6 100644 --- a/src/common/details/ai_python_generative_sdk/python_sdk_wrapper.cs +++ b/src/common/details/ai_python_generative_sdk/python_sdk_wrapper.cs @@ -71,7 +71,7 @@ static public string GetConnection(ICommandValues values, string subscription, s return DoGetConnectionViaPython(values, subscription, group, projectName, connectionName); } - static public string UpdateMLIndex(ICommandValues values, string subscription, string group, string projectName, string indexName, string embeddingModelDeployment, string embeddingModelName, string dataFiles, string externalSourceUrl) + static public string UpdateMLIndex(ICommandValues values, string subscription, string group, string projectName, string indexName, string embeddingModelDeployment, string embeddingModelName, string dataFiles, string externalSourceUrl, Dictionary addToEnvironment) { Action stdErrVerbose = x => Console.Error.WriteLine(x); Action stdErrStandard = x => { @@ -93,7 +93,7 @@ static public string UpdateMLIndex(ICommandValues values, string subscription, s "--embedding-model-name", embeddingModelName, "--data-files", dataFiles, "--external-source-url", externalSourceUrl), - null, null, stdErr); + addToEnvironment, null, stdErr); } private static string DoCreateResourceViaPython(ICommandValues values, string subscription, string group, string name, string location, string displayName, string description, string openAiResourceId, string openAiResourceKind) diff --git a/src/common/details/console/ColorHelpers.cs b/src/common/details/console/ColorHelpers.cs index 4c7c6553..35ea2663 100644 --- a/src/common/details/console/ColorHelpers.cs +++ b/src/common/details/console/ColorHelpers.cs @@ -17,6 +17,11 @@ public static void ResetColor() Console.ResetColor(); } + public static ConsoleColor MapColor(ConsoleColor color) + { + return colorMap[color]; + } + public static void SetHighlightColors() { Console.BackgroundColor = colors[0]; @@ -234,7 +239,37 @@ private static ConsoleColor[] InitBestColors() return GetBestColors(); } + private static Dictionary InitColorMap() + { + var map = new Dictionary(); + + var xterm = Environment.GetEnvironmentVariable("TERM"); + var is256 = xterm != null && xterm.Contains("256"); + var isWindows = OS.IsWindows(); + + map[ConsoleColor.Black] = ConsoleColor.Black; + map[ConsoleColor.DarkBlue] = ConsoleColor.DarkBlue; + map[ConsoleColor.DarkGreen] = ConsoleColor.DarkGreen; + map[ConsoleColor.DarkCyan] = ConsoleColor.DarkCyan; + map[ConsoleColor.DarkRed] = ConsoleColor.DarkRed; + map[ConsoleColor.DarkMagenta] = ConsoleColor.DarkMagenta; + map[ConsoleColor.DarkYellow] = ConsoleColor.DarkYellow; + map[ConsoleColor.Gray] = ConsoleColor.Gray; + map[ConsoleColor.DarkGray] = is256 || isWindows ? ConsoleColor.DarkGray : ConsoleColor.Gray; + map[ConsoleColor.Blue] = ConsoleColor.Blue; + map[ConsoleColor.Green] = ConsoleColor.Green; + map[ConsoleColor.Cyan] = ConsoleColor.Cyan; + map[ConsoleColor.Red] = ConsoleColor.Red; + map[ConsoleColor.Magenta] = ConsoleColor.Magenta; + map[ConsoleColor.Yellow] = ConsoleColor.Yellow; + map[ConsoleColor.White] = ConsoleColor.White; + + return map; + } + private static ConsoleColor[] colors = InitBestColors(); + private static Dictionary colorMap = InitColorMap(); + } } diff --git a/src/common/details/helpers/process_helpers.cs b/src/common/details/helpers/process_helpers.cs index 4f866452..66bf5b9e 100644 --- a/src/common/details/helpers/process_helpers.cs +++ b/src/common/details/helpers/process_helpers.cs @@ -66,12 +66,51 @@ public static Process StartProcess(string fileName, string arguments, Dictionary return Process.Start(start); } - public static async Task RunShellCommandAsync(string commandLine, Dictionary addToEnvironment = null, Action stdOutHandler = null, Action stdErrHandler = null, Action mergedOutputHandler = null, bool captureOutput = true) + public static async Task RunShellScriptAsync(string inlineScriptOrFileName, bool scriptIsBash = false, Dictionary addToEnvironment = null, Action stdOutHandler = null, Action stdErrHandler = null, Action mergedOutputHandler = null, bool captureOutput = true, bool interactive = false) { - var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - var command = isWindows ? "cmd" : "bash"; - var arguments = isWindows ? $"/c \"{commandLine}\"" : $"-li \"{commandLine}\""; - return await RunShellCommandAsync(command, arguments, addToEnvironment, stdOutHandler, stdErrHandler, mergedOutputHandler, captureOutput); + ProcessOutput processOutput; + var useBinBash = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + if (useBinBash) + { + var binBashArguments = interactive + ? $"-lic \"{inlineScriptOrFileName}\"" + : $"-lc \"{inlineScriptOrFileName}\""; + processOutput = await RunShellCommandAsync("/bin/bash", binBashArguments, addToEnvironment, stdOutHandler, stdErrHandler, mergedOutputHandler, captureOutput); + } + else if (scriptIsBash) + { + var cmdFile = Path.GetTempFileName() + ".cmd"; + File.WriteAllText(cmdFile, inlineScriptOrFileName); + + var git = FindCacheGitBashExe(); + var gitBashCommand = interactive + ? $"@\"{git}\" -li \"{cmdFile}\"" + : $"@\"{git}\" -l \"{cmdFile}\""; + var gitBashCmdFile = Path.GetTempFileName() + ".cmd"; + File.WriteAllText(gitBashCmdFile, gitBashCommand); + + processOutput = await RunShellCommandAsync(gitBashCmdFile, "", addToEnvironment, stdOutHandler, stdErrHandler, mergedOutputHandler, captureOutput); + File.Delete(gitBashCmdFile); + File.Delete(cmdFile); + } + else + { + var cmdFile = Path.GetTempFileName() + ".cmd"; + File.WriteAllText(cmdFile, inlineScriptOrFileName); + + processOutput = await RunShellCommandAsync(cmdFile, "", addToEnvironment, stdOutHandler, stdErrHandler, mergedOutputHandler, captureOutput); + File.Delete(cmdFile); + } + + return processOutput; + } + + public static async Task RunShellInteractiveAsync(Dictionary addToEnvironment = null, Action stdOutHandler = null, Action stdErrHandler = null, Action mergedOutputHandler = null, bool captureOutput = true) + { + var interactiveShellFileName = !OS.IsWindows() ? "bash" : "cmd.exe"; + var interactiveShellArguments = !OS.IsWindows() ? "-li" : "/k PROMPT (ai dev shell) %PROMPT%& title (ai dev shell)"; + + return await RunShellCommandAsync(interactiveShellFileName, interactiveShellArguments, addToEnvironment, stdOutHandler, stdErrHandler, mergedOutputHandler, captureOutput); } public static async Task RunShellCommandAsync(string command, string arguments, Dictionary addToEnvironment = null, Action stdOutHandler = null, Action stdErrHandler = null, Action mergedOutputHandler = null, bool captureOutput = true) @@ -189,5 +228,37 @@ private static string DictionaryToString(Dictionary dictionary) } return string.Join(' ', kvps); } + + private static string EnsureFindCacheGetBashExe() + { + var gitBash = FindCacheGitBashExe(); + if (gitBash == null || gitBash == "bash.exe") + { + throw new Exception("Could not Git for Windows bash.exe in PATH!"); + } + return gitBash; + } + + private static string FindCacheGitBashExe() + { + var bashExe = "bash.exe"; + if (_cliCache.ContainsKey(bashExe)) + { + return _cliCache[bashExe]; + } + + var found = FindGitBashExe(); + _cliCache[bashExe] = found; + + return found; + } + + private static string FindGitBashExe() + { + var found = FileHelpers.FindFilesInOsPath("bash.exe"); + return found.Where(x => x.ToLower().Contains("git")).FirstOrDefault() ?? "bash.exe"; + } + + private static Dictionary _cliCache = new Dictionary(); } } diff --git a/src/common/details/helpers/value_helpers.cs b/src/common/details/helpers/value_helpers.cs index d24a685f..42bd08a8 100644 --- a/src/common/details/helpers/value_helpers.cs +++ b/src/common/details/helpers/value_helpers.cs @@ -43,7 +43,7 @@ public static string ReplaceValues(this string text, ICommandValues values, bool private static int Interpolate(int cchPrefix, StringBuilder sb, int start, ICommandValues values, bool deleteUnresolved, int level = 0) { - if (sb[start] != '{') throw new InvalidOperationException($"Interpolate() '{{' not found; pos={start}"); + if (sb[start + cchPrefix - 1] != '{') throw new InvalidOperationException($"Interpolate() '{{' not found; pos={start}"); var i = cchPrefix; diff --git a/src/common/details/named_values/tokens/run_bash_script_token.cs b/src/common/details/named_values/tokens/run_bash_script_token.cs new file mode 100644 index 00000000..a06bf88b --- /dev/null +++ b/src/common/details/named_values/tokens/run_bash_script_token.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class RunBashScriptToken + { + public static NamedValueTokenData Data() => new NamedValueTokenData(_optionName, _fullName, _optionExample, _requiredDisplayName); + public static INamedValueTokenParser Parser() => new NamedValueTokenParser(_optionName, _fullName, "010", "1"); + + private const string _requiredDisplayName = "run bash script"; + private const string _optionName = "--bash"; + private const string _optionExample = "BASH SCRIPT"; + private const string _fullName = "run.bash.script"; + } +} diff --git a/tests/test-aistudio-copilot-sample-repo.yaml b/tests/test-aistudio-copilot-sample-repo.yaml new file mode 100644 index 00000000..fbf3034f --- /dev/null +++ b/tests/test-aistudio-copilot-sample-repo.yaml @@ -0,0 +1,191 @@ +workingDirectory: aistudio-copilot-sample +tests: + +- area: setup + tags: [before] + tests: + - name: clone the aistudio-copilot-sample repo + bash: | + if [ ! -d ".git/" ]; then + echo "Cloning the aistudio-copilot-sample repo..." + git clone https://github.com/Azure/aistudio-copilot-sample.git --depth 1 --no-single-branch . + else + echo "Pulling the latest changes from the aistudio-copilot-sample repo..." + git pull + fi + ls -la + git log -n 1 + + - name: install python dependencies + bash: pip install -r requirements.txt + + - name: check cli is installed + command: ai + expect: | + ^AI - Azure AI CLI, Version [01]\.0\..*\r?$\n + ^Copyright \(c\) 2024 Microsoft Corporation\. All Rights Reserved\.\r?$\n + tag: skip + + - name: check az is installed and we're logged in + bash: | + az account show + expect: | + "id": "[-a-z0-9-]{36}", + tag: skip + + - name: ai init openai + command: ai init openai + arguments: + subscription: e72e5254-f265-4e95-9bd2-9ee8e7329051 + name: robch-oai-eastus2 + chat-deployment-name: gpt-4-32k-0613 + embeddings-deployment-name: text-embedding-ada-002-2 + evaluation-deployment-name: gpt-4-32k-0613 + interactive: false + + - name: check ai config for chat + bash: | + ai config chat @key + ai config chat @endpoint + ai config chat @deployment + ai config chat @model + expect: | + (?# ---------- CHAT KEY) + chat.key \(found at '.*[/\\]\.ai[/\\]data'\) + [a-z0-9]{32} + + (?# ---------- CHAT ENDPOINT) + chat.endpoint \(found at '.*[/\\]\.ai[/\\]data'\) + https://.*openai.azure.com/ + + (?# ---------- CHAT DEPLOYMENT) + chat.deployment \(found at '.*[/\\]\.ai[/\\]data'\) + + (?# ---------- CHAT MODEL) + chat.model \(found at '.*[/\\]\.ai[/\\]data'\) + (gpt-4|gpt-35) + tag: skip + +- name: test ai search index update + command: ai search index update --files "./data/3-product-info/*.md" --index-name "product-info" + expect: | + Updating search index 'product-info' ... + Updating search index 'product-info' ... Done! + search.index.name \(saved at .*[/\\]\.ai[/\\]data[/\\]?\) + product-info + tag: skip + +- name: check search index name + command: ai config @search.index.name + expect: product-info + tag: skip + +- name: test ai dev new .env + command: ai dev new .env + expect: | + .env \(saved at .*aistudio-copilot-sample.*\) + AZURE_AI_SEARCH_ENDPOINT = + AZURE_AI_SEARCH_INDEX_NAME = + AZURE_AI_SEARCH_KEY = + AZURE_AI_SPEECH_ENDPOINT = + AZURE_AI_SPEECH_KEY = + AZURE_AI_SPEECH_REGION = + AZURE_COGNITIVE_SEARCH_KEY = + AZURE_COGNITIVE_SEARCH_TARGET = + AZURE_OPENAI_API_VERSION = + AZURE_OPENAI_CHAT_DEPLOYMENT = + AZURE_OPENAI_CHAT_MODEL = + AZURE_OPENAI_EMBEDDING_DEPLOYMENT = + AZURE_OPENAI_EMBEDDING_MODEL = + AZURE_OPENAI_ENDPOINT = + AZURE_OPENAI_EVALUATION_DEPLOYMENT = + AZURE_OPENAI_EVALUATION_MODEL = + AZURE_OPENAI_KEY = + OPENAI_API_BASE = + OPENAI_API_KEY = + OPENAI_API_TYPE = + OPENAI_API_VERSION = + OPENAI_ENDPOINT = + tag: skip + +- name: test python src/run.py --question "which tent is the most waterproof?" + command: ai dev shell + arguments: + bash: | + if [ -f /etc/os-release ]; then + python3 src/run.py --question "which tent is the most waterproof?" + else + python src/run.py --question "which tent is the most waterproof?" + fi + tag: skip + +- name: test python src/run.py --question "which tent is the most waterproof?" --implementation promptflow + command: ai dev shell + arguments: + bash: | + if [ -f /etc/os-release ]; then + python3 src/run.py --question "which tent is the most waterproof?" --implementation promptflow + else + python src/run.py --question "which tent is the most waterproof?" --implementation promptflow + fi + tag: skip # doesn't work currently + +- name: test ai chat --interactive + command: ai chat --interactive + input: | + which tent is the most waterproof? + tag: skip + +- name: test ai chat --interactive --function src/copilot_aisdk/chat:chat_completion + command: ai chat --interactive --function src/copilot_aisdk/chat:chat_completion + input: | + which tent is the most waterproof? + tag: skip + +- name: test python src/run.py --evaluate --implementation aisdk + command: ai dev shell + arguments: + bash: | + if [ -f /etc/os-release ]; then + python3 src/run.py --evaluate --implementation aisdk + else + python src/run.py --evaluate --implementation aisdk + fi + expect: | + ('(gpt_coherence|gpt_groundedness|gpt_relevance)': .*){3} + tag: skip + +- name: test ai chat evaluate --input-data src/tests/evaluation_dataset.jsonl + command: ai chat evaluate --input-data src/tests/evaluation_dataset.jsonl + expect: | + Evaluating chats ... + ("(gpt_coherence|gpt_groundedness|gpt_relevance)": .*){1} + ("(gpt_coherence|gpt_groundedness|gpt_relevance)": .*){1} + ("(gpt_coherence|gpt_groundedness|gpt_relevance)": .*){1} + tag: skip + +- name: test ai chat evaluate --input-data src/tests/evaluation_dataset.jsonl --function src/copilot_aisdk/chat:chat_completion + command: ai chat evaluate --input-data src/tests/evaluation_dataset.jsonl --function src/copilot_aisdk/chat:chat_completion + expect: | + Evaluating chats ... + ("(gpt_coherence|gpt_groundedness|gpt_relevance)": .*){1} + ("(gpt_coherence|gpt_groundedness|gpt_relevance)": .*){1} + ("(gpt_coherence|gpt_groundedness|gpt_relevance)": .*){1} + tag: skip + +- name: test pytest + command: ai dev shell + arguments: + run: pytest + tag: skip # doesn't work currently + +- name: test python src/run.py --deploy + command: ai dev shell + arguments: + bash: | + if [ -f /etc/os-release ]; then + python3 src/run.py --deploy + else + python src/run.py --deploy + fi + tag: skip # doesn't work currently (returns exit code 1) diff --git a/tests/test.yaml b/tests/test.yaml index d7b1bac3..667b8929 100644 --- a/tests/test.yaml +++ b/tests/test.yaml @@ -1,8 +1,10 @@ - name: simulate pass simulate: Passed + tag: skip - name: simulate skipped simulate: Skipped + tag: skip - test1: run --script "echo hello" - test2: run --script "echo oh yeah?" diff --git a/tests/test3.yaml b/tests/test3.yaml index 842cadc0..a20b00e2 100644 --- a/tests/test3.yaml +++ b/tests/test3.yaml @@ -27,6 +27,7 @@ Create a file named "test.txt" with the following content: "Hello, World!" What files are in the current directory? Show me what's in the file "test.txt" + exit expect: | assistant-function: CreateFileAndSaveText assistant-function: FindAllFilesInCurrentDirectory @@ -51,6 +52,7 @@ How old is John? How old is Jane? How old is Bob? + exit expect: | assistant-function: GetUsersName\({}\) = assistant-function: GetPersonsAge\({ @@ -75,13 +77,13 @@ cd openai-chat-cs dotnet build - name: run template - command: ai dev shell --run "openai-chat-cs\bin\Debug\net8.0\OpenAIChatCompletions" + command: ai dev shell --bash "openai-chat-cs/bin/Debug/net8.0/OpenAIChatCompletions" input: |- Tell me a joke Tell me another joke + exit expect-gpt: | The output should contain exactly two jokes. - tag: skip - class: dev new openai-chat (go) steps: @@ -93,11 +95,11 @@ go mod tidy go build - name: run template - command: ai dev shell --run "openai-chat-go\openai_chat_completions_hello_world" + command: ai dev shell --bash "openai-chat-go/openai_chat_completions_hello_world" input: |- Tell me a joke Tell me another joke - tag: skip + exit - class: dev new openai-chat (java) steps: @@ -112,11 +114,19 @@ cd openai-chat-java javac -cp "target/lib/*" src/OpenAIChatCompletionsClass.java src/Main.java -d out - name: run template - command: ai dev shell --run "cd openai-chat-java && java -cp \"out;target/lib/*\" Main" + command: ai dev shell + arguments: + bash: | + cd openai-chat-java + if [ -f /etc/os-release ]; then + java -cp "out:target/lib/*" Main + else + java -cp "out;target/lib/*" Main + fi input: |- Tell me a joke Tell me another joke - tag: skip + exit - class: dev new openai-chat (javascript) steps: @@ -127,11 +137,11 @@ cd openai-chat-js npm install - name: run template - command: ai dev shell --run "cd openai-chat-js && node main.js" + command: ai dev shell --bash "cd openai-chat-js;node Main.js" input: |- Tell me a joke Tell me another joke - tag: skip + exit - class: dev new openai-chat (python) steps: @@ -141,13 +151,20 @@ bash: | cd openai-chat-py pip install -r requirements.txt - tag: skip - name: run template - command: ai dev shell --run "cd openai-chat-py && python openai_chat_completions.py" + command: ai dev shell + arguments: + bash: | + cd openai-chat-py + if [ -f /etc/os-release ]; then + python3 openai_chat_completions.py + else + python openai_chat_completions.py + fi input: |- Tell me a joke Tell me another joke - tag: skip + exit - area: ai dev new openai-chat-streaming tests: @@ -161,11 +178,11 @@ cd openai-chat-streaming-cs dotnet build - name: run template - command: ai dev shell --run "openai-chat-streaming-cs\bin\Debug\net8.0\OpenAIChatCompletionsStreaming" + command: ai dev shell --bash "openai-chat-streaming-cs/bin/Debug/net8.0/OpenAIChatCompletionsStreaming" input: |- Tell me a joke Tell me another joke - tag: skip + exit - class: dev new openai-chat-streaming (go) steps: @@ -177,11 +194,11 @@ go mod tidy go build - name: run template - command: ai dev shell --run "openai-chat-streaming-go\openai_chat_completions_streaming_hello_world" + command: ai dev shell --bash "openai-chat-streaming-go/openai_chat_completions_streaming_hello_world" input: |- Tell me a joke Tell me another joke - tag: skip + exit - class: dev new openai-chat-streaming (java) steps: @@ -196,11 +213,19 @@ cd openai-chat-streaming-java javac -cp "target/lib/*" src/OpenAIChatCompletionsStreamingClass.java src/Main.java -d out - name: run template - command: ai dev shell --run "cd openai-chat-streaming-java && java -cp \"out;target/lib/*\" Main" + command: ai dev shell + arguments: + bash: | + cd openai-chat-streaming-java + if [ -f /etc/os-release ]; then + java -cp "out:target/lib/*" Main + else + java -cp "out;target/lib/*" Main + fi input: |- Tell me a joke Tell me another joke - tag: skip + exit command: ai dev new openai-chat-streaming --java @@ -213,11 +238,11 @@ cd openai-chat-streaming-js npm install - name: run template - command: ai dev shell --run "cd openai-chat-streaming-js && node main.js" + command: ai dev shell --bash "cd openai-chat-streaming-js;node Main.js" input: |- Tell me a joke Tell me another joke - tag: skip + exit - class: dev new openai-chat-streaming (python) steps: @@ -227,13 +252,20 @@ bash: | cd openai-chat-streaming-py pip install -r requirements.txt - tag: skip - name: run template - command: ai dev shell --run "cd openai-chat-streaming-py && python main.py" + command: ai dev shell + arguments: + bash: | + cd openai-chat-streaming-py + if [ -f /etc/os-release ]; then + python3 main.py + else + python main.py + fi input: |- Tell me a joke Tell me another joke - tag: skip + exit - area: ai dev new openai-chat-streaming-with-data tests: @@ -247,9 +279,10 @@ cd openai-chat-streaming-with-data-cs dotnet build - name: run template - command: ai dev shell --run "openai-chat-streaming-with-data-cs\bin\Debug\net8.0\OpenAIChatCompletionsWithDataStreaming" + command: ai dev shell --bash "openai-chat-streaming-with-data-cs/bin/Debug/net8.0/OpenAIChatCompletionsWithDataStreaming" input: |- What parameter should i use to select my resources? + exit tag: skip - class: dev new openai-chat-streaming-with-data (javascript) @@ -261,9 +294,10 @@ cd openai-chat-streaming-with-data-js npm install - name: run template - command: ai dev shell --run "cd openai-chat-streaming-with-data-js && node main.js" + command: ai dev shell --bash "cd openai-chat-streaming-with-data-js;node Main.js" input: |- What parameter should i use to select my resources? + exit tag: skip - class: dev new openai-chat-streaming-with-data (python) @@ -274,11 +308,19 @@ bash: | cd openai-chat-streaming-with-data-py pip install -r requirements.txt - tag: skip - name: run template - command: ai dev shell --run "cd openai-chat-streaming-with-data-py && python main.py" + command: ai dev shell + arguments: + bash: | + cd openai-chat-streaming-with-data-py + if [ -f /etc/os-release ]; then + python3 main.py + else + python main.py + fi input: |- What parameter should i use to select my resources? + exit tag: skip - class: dev new openai-chat-streaming-with-data (go) @@ -290,9 +332,10 @@ cd openai-chat-streaming-with-data-go go mod tidy - name: run template - command: ai dev shell --run "cd openai-chat-streaming-with-data-go && go run .\main.go .\openai_chat_completions_streaming_with_data_hello_world.go" + command: ai dev shell --bash "cd openai-chat-streaming-with-data-go;go run ./main.go ./openai_chat_completions_streaming_with_data_hello_world.go" input: |- - What parameter should i use to initialize? + What parameter should i use to select my resources? + exit tag: skip - area: ai dev new openai-chat-streaming-with-functions @@ -307,11 +350,11 @@ cd openai-chat-streaming-with-functions-cs dotnet build - name: run template - command: ai dev shell --run "cd openai-chat-streaming-with-functions-cs && bin\Debug\net8.0\OpenAIChatCompletionsFunctionsStreaming" + command: ai dev shell --bash "cd openai-chat-streaming-with-functions-cs;./bin/Debug/net8.0/OpenAIChatCompletionsFunctionsStreaming" input: |- What is the date? What is the time? - tag: skip + exit - class: dev new openai-chat-streaming-with-functions (go) steps: @@ -323,11 +366,11 @@ go mod tidy go build - name: run template - command: ai dev shell --run "cd openai-chat-streaming-with-functions-go && openai_chat_completions_functions_streaming_hello_world" + command: ai dev shell --bash "cd openai-chat-streaming-with-functions-go;./openai_chat_completions_functions_streaming_hello_world" input: |- What is the date? What is the time? - tag: skip + exit - class: dev new openai-chat-streaming-with-functions (javascript) steps: @@ -338,11 +381,11 @@ cd openai-chat-streaming-with-functions-js npm install - name: run template - command: ai dev shell --run "cd openai-chat-streaming-with-functions-js && node main.js" + command: ai dev shell --bash "cd openai-chat-streaming-with-functions-js;node Main.js" input: |- What is the date? What is the time? - tag: skip + exit - class: dev new openai-chat-streaming-with-functions (python) steps: @@ -352,13 +395,20 @@ bash: | cd openai-chat-streaming-with-functions-py pip install -r requirements.txt - tag: skip - name: run template - command: ai dev shell --run "cd openai-chat-streaming-with-functions-py && python main.py" + command: ai dev shell + arguments: + bash: | + cd openai-chat-streaming-with-functions-py + if [ -f /etc/os-release ]; then + python3 main.py + else + python main.py + fi input: |- What is the date? What is the time? - tag: skip + exit - area: ai dev new openai-webpage tests: diff --git a/tests/testframework/Logger.cs b/tests/testframework/Logger.cs index 6b6822ec..c19acf90 100644 --- a/tests/testframework/Logger.cs +++ b/tests/testframework/Logger.cs @@ -21,8 +21,18 @@ public static void Log(IMessageLogger logger) public static void Log(string text) { - LogInfo(text); - Logger.DbgTraceInfo(text); + var dt = $"{DateTime.Now}"; + using (var mutex = new Mutex(false, "Logger Mutex")) + { + mutex.WaitOne(); + +#if DEBUG + logger?.SendMessage(TestMessageLevel.Informational, $"{dt}: {text}"); +#endif + File.AppendAllText(_logPath, $"{dt}: INFO: {text}\n"); + + mutex.ReleaseMutex(); + } } public static void LogIf(bool log, string text) @@ -34,76 +44,44 @@ public static void LogIf(bool log, string text) public static void LogInfo(string text) { + var dt = $"{DateTime.Now}"; using (var mutex = new Mutex(false, "Logger Mutex")) { mutex.WaitOne(); - File.AppendAllText(_logPath, $"{DateTime.Now}: INFO: {text}\n"); + + logger?.SendMessage(TestMessageLevel.Informational, $"{dt}: {text}"); + File.AppendAllText(_logPath, $"{dt}: INFO: {text}\n"); + mutex.ReleaseMutex(); } } public static void LogWarning(string text) { + var dt = $"{DateTime.Now}"; using (var mutex = new Mutex(false, "Logger Mutex")) { mutex.WaitOne(); - File.AppendAllText(_logPath, $"{DateTime.Now}: WARNING: {text}\n"); + + logger?.SendMessage(TestMessageLevel.Warning, $"{dt}: {text}"); + File.AppendAllText(_logPath, $"{dt}: WARNING: {text}\n"); + mutex.ReleaseMutex(); } } public static void LogError(string text) { + var dt = $"{DateTime.Now}"; using (var mutex = new Mutex(false, "Logger Mutex")) { mutex.WaitOne(); - File.AppendAllText(_logPath, $"{DateTime.Now}: ERROR: {text}\n"); - mutex.ReleaseMutex(); - } - } - - #endregion - #region dbg trace methods - - public static void DbgTraceInfo(string text) - { -#if DEBUG - TraceInfo(text); -#endif - } + logger?.SendMessage(TestMessageLevel.Error, $"{dt}: {text}"); + File.AppendAllText(_logPath, $"{dt}: ERROR: {text}\n"); - public static void DbgTraceWarning(string text) - { -#if DEBUG - TraceWarning(text); -#endif - } - - public static void DbgTraceError(string text) - { -#if DEBUG - TraceError(text); -#endif - } - - #endregion - - #region trace methods - - public static void TraceInfo(string text) - { - logger?.SendMessage(TestMessageLevel.Informational, $"{DateTime.Now}: {text}"); - } - - public static void TraceWarning(string text) - { - logger?.SendMessage(TestMessageLevel.Warning, $"{DateTime.Now}: {text}"); - } - - public static void TraceError(string text) - { - logger?.SendMessage(TestMessageLevel.Error, $"{DateTime.Now}: {text}"); + mutex.ReleaseMutex(); + } } #endregion diff --git a/tests/testframework/YamlHelpers.cs b/tests/testframework/YamlHelpers.cs index 33ce53b7..58bfa6f0 100644 --- a/tests/testframework/YamlHelpers.cs +++ b/tests/testframework/YamlHelpers.cs @@ -31,7 +31,6 @@ public static YamlStream ParseYamlStream(string fullName) if (!string.IsNullOrEmpty(error)) { Logger.LogError(error); - Logger.TraceError(error); } return stream; diff --git a/tests/testframework/YamlTestCaseParseContext.cs b/tests/testframework/YamlTestCaseParseContext.cs new file mode 100644 index 00000000..2ac6ddf8 --- /dev/null +++ b/tests/testframework/YamlTestCaseParseContext.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.IO; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public struct YamlTestCaseParseContext + { + public string Source; + public FileInfo File; + + public string Area; + public string Class; + public Dictionary> Tags; + + public string WorkingDirectory; + } +} diff --git a/tests/testframework/YamlTestCaseParser.cs b/tests/testframework/YamlTestCaseParser.cs index 2b65ccb6..770315cb 100644 --- a/tests/testframework/YamlTestCaseParser.cs +++ b/tests/testframework/YamlTestCaseParser.cs @@ -10,24 +10,36 @@ namespace Azure.AI.Details.Common.CLI.TestFramework { - public class YamlTestCaseParser + public partial class YamlTestCaseParser { public static IEnumerable TestCasesFromYaml(string source, FileInfo file) { - var area = GetRootArea(file); + var defaultTags = YamlTagHelpers.GetDefaultTags(file.Directory); + + var workingDirectory = GetScalarString(null, defaultTags, "workingDirectory"); + workingDirectory = UpdateWorkingDirectory(file.Directory.FullName, workingDirectory); + + var context = new YamlTestCaseParseContext() { + Source = source, + File = file, + Area = GetRootArea(file), + Class = GetScalarString(null, defaultTags, "class", defaultClassName), + Tags = defaultTags, + WorkingDirectory = workingDirectory + }; + var parsed = YamlHelpers.ParseYamlStream(file.FullName); - return TestCasesFromYamlStream(source, file, area, parsed).ToList(); + return TestCasesFromYamlStream(context, parsed).ToList(); } #region private methods - private static IEnumerable TestCasesFromYamlStream(string source, FileInfo file, string area, YamlStream parsed) + private static IEnumerable TestCasesFromYamlStream(YamlTestCaseParseContext context, YamlStream parsed) { var tests = new List(); - var defaultTags = YamlTagHelpers.GetDefaultTags(file.Directory); foreach (var document in parsed?.Documents) { - var fromDocument = TestCasesFromYamlDocumentRootNode(source, file, document.RootNode, area, defaultClassName, defaultTags); + var fromDocument = TestCasesFromYamlDocumentRootNode(context, document.RootNode); if (fromDocument != null) { tests.AddRange(fromDocument); @@ -36,22 +48,22 @@ private static IEnumerable TestCasesFromYamlStream(string source, File return tests; } - private static IEnumerable TestCasesFromYamlDocumentRootNode(string source, FileInfo file, YamlNode node, string area, string @class, Dictionary> tags) + private static IEnumerable TestCasesFromYamlDocumentRootNode(YamlTestCaseParseContext context, YamlNode node) { return node is YamlMappingNode - ? TestCasesFromYamlMapping(source, file, node as YamlMappingNode, area, @class, tags) - : TestCasesFromYamlSequence(source, file, node as YamlSequenceNode, area, @class, tags); + ? TestCasesFromYamlMapping(context, node as YamlMappingNode) + : TestCasesFromYamlSequence(context, node as YamlSequenceNode); } - private static IEnumerable TestCasesFromYamlMapping(string source, FileInfo file, YamlMappingNode mapping, string area, string @class, Dictionary> tags) + private static IEnumerable TestCasesFromYamlMapping(YamlTestCaseParseContext context, YamlMappingNode mapping) { - var children = CheckForChildren(source, file, mapping, area, @class, tags); + var children = CheckForChildren(context, mapping); if (children != null) { return children; } - var test = GetTestFromNode(source, file, mapping, area, @class, tags); + var test = GetTestFromNode(context, mapping); if (test != null) { return new[] { test }; @@ -60,14 +72,14 @@ private static IEnumerable TestCasesFromYamlMapping(string source, Fil return null; } - private static IEnumerable TestCasesFromYamlSequence(string source, FileInfo file, YamlSequenceNode sequence, string area, string @class, Dictionary> tags) + private static IEnumerable TestCasesFromYamlSequence(YamlTestCaseParseContext context, YamlSequenceNode sequence) { var tests = new List(); if (sequence == null) return tests; foreach (YamlMappingNode mapping in sequence.Children) { - var fromMapping = TestCasesFromYamlMapping(source, file, mapping, area, @class, tags); + var fromMapping = TestCasesFromYamlMapping(context, mapping); if (fromMapping != null) { tests.AddRange(fromMapping); @@ -77,11 +89,12 @@ private static IEnumerable TestCasesFromYamlSequence(string source, Fi return tests; } - private static TestCase GetTestFromNode(string source, FileInfo file, YamlMappingNode mapping, string area, string @class, Dictionary> tags, int stepNumber = 0) + private static TestCase GetTestFromNode(YamlTestCaseParseContext context, YamlMappingNode mapping, int stepNumber = 0) { - string cli = GetScalarString(mapping, tags, "cli"); - string parallelize = GetScalarString(mapping, tags, "parallelize"); - string skipOnFailure = GetScalarString(mapping, tags, "skipOnFailure"); + string cli = GetScalarString(mapping, context.Tags, "cli"); + string parallelize = GetScalarString(mapping, context.Tags, "parallelize"); + string skipOnFailure = GetScalarString(mapping, context.Tags, "skipOnFailure"); + string workingDirectory = UpdateWorkingDirectory(mapping, context.WorkingDirectory); string simulate = GetScalarString(mapping, "simulate"); string command = GetScalarString(mapping, "command"); @@ -89,24 +102,23 @@ private static TestCase GetTestFromNode(string source, FileInfo file, YamlMappin string bash = GetScalarString(mapping, "bash"); string fullyQualifiedName = command == null && script == null && bash == null - ? GetFullyQualifiedNameAndCommandFromShortForm(mapping, area, @class, ref command, stepNumber) - : GetFullyQualifiedName(mapping, area, @class, stepNumber); - fullyQualifiedName ??= GetFullyQualifiedName(area, @class, $"Expected YAML node ('name') at {file.FullName}({mapping.Start.Line})", 0); + ? GetFullyQualifiedNameAndCommandFromShortForm(mapping, context.Area, context.Class, ref command, stepNumber) + : GetFullyQualifiedName(mapping, context.Area, context.Class, stepNumber); + fullyQualifiedName ??= GetFullyQualifiedName(context.Area, context.Class, $"Expected YAML node ('name') at {context.File.FullName}({mapping.Start.Line})", 0); var simulating = !string.IsNullOrEmpty(simulate); var neitherOrBoth = (command == null) == (script == null && bash == null); if (neitherOrBoth && !simulating) { - var message = $"Error parsing YAML: expected/unexpected key ('name', 'command', 'script', 'bash', 'arguments') at {file.FullName}({mapping.Start.Line})"; + var message = $"Error parsing YAML: expected/unexpected key ('name', 'command', 'script', 'bash', 'arguments') at {context.File.FullName}({mapping.Start.Line})"; Logger.LogError(message); - Logger.TraceError(message); return null; } Logger.Log($"YamlTestCaseParser.GetTests(): new TestCase('{fullyQualifiedName}')"); - var test = new TestCase(fullyQualifiedName, new Uri(YamlTestFramework.FakeExecutor), source) + var test = new TestCase(fullyQualifiedName, new Uri(YamlTestFramework.FakeExecutor), context.Source) { - CodeFilePath = file.FullName, + CodeFilePath = context.File.FullName, LineNumber = mapping.Start.Line }; @@ -118,10 +130,9 @@ private static TestCase GetTestFromNode(string source, FileInfo file, YamlMappin SetTestCaseProperty(test, "parallelize", parallelize); SetTestCaseProperty(test, "skipOnFailure", skipOnFailure); - var timeout = GetScalarString(mapping, tags, "timeout", YamlTestFramework.DefaultTimeout); + var timeout = GetScalarString(mapping, context.Tags, "timeout", YamlTestFramework.DefaultTimeout); SetTestCaseProperty(test, "timeout", timeout); - var workingDirectory = GetScalarString(mapping, tags, "workingDirectory", file.Directory.FullName); SetTestCaseProperty(test, "working-directory", workingDirectory); SetTestCasePropertyMap(test, "foreach", mapping, "foreach", workingDirectory); @@ -132,42 +143,44 @@ private static TestCase GetTestFromNode(string source, FileInfo file, YamlMappin SetTestCaseProperty(test, "expect-gpt", mapping, "expect-gpt"); SetTestCaseProperty(test, "not-expect", mapping, "not-expect"); - SetTestCaseTagsAsTraits(test, YamlTagHelpers.UpdateCopyTags(tags, mapping)); + SetTestCaseTagsAsTraits(test, YamlTagHelpers.UpdateCopyTags(context.Tags, mapping)); - CheckInvalidTestCaseNodes(file, mapping, test); + CheckInvalidTestCaseNodes(context, mapping, test); return test; } - private static IEnumerable CheckForChildren(string source, FileInfo file, YamlMappingNode mapping, string area, string @class, Dictionary> tags) + private static IEnumerable CheckForChildren(YamlTestCaseParseContext context, YamlMappingNode mapping) { if (mapping.Children.ContainsKey("steps") && mapping.Children["steps"] is YamlSequenceNode stepsSequence) { - @class = GetScalarString(mapping, "class", @class); - area = UpdateArea(mapping, area); - tags = YamlTagHelpers.UpdateCopyTags(tags, mapping); + context.Class = GetScalarString(mapping, "class", context.Class); + context.Area = UpdateArea(mapping, context.Area); + context.Tags = YamlTagHelpers.UpdateCopyTags(context.Tags, mapping); + context.WorkingDirectory = UpdateWorkingDirectory(mapping, context.WorkingDirectory); - return TestCasesFromYamlSequenceOfSteps(source, file, stepsSequence, area, @class, tags); + return TestCasesFromYamlSequenceOfSteps(context, stepsSequence); } if (mapping.Children.ContainsKey("tests") && mapping.Children["tests"] is YamlSequenceNode testsSequence) { - @class = GetScalarString(mapping, "class", @class); - area = UpdateArea(mapping, area); - tags = YamlTagHelpers.UpdateCopyTags(tags, mapping); + context.Class = GetScalarString(mapping, "class", context.Class); + context.Area = UpdateArea(mapping, context.Area); + context.Tags = YamlTagHelpers.UpdateCopyTags(context.Tags, mapping); + context.WorkingDirectory = UpdateWorkingDirectory(mapping, context.WorkingDirectory); - return TestCasesFromYamlSequence(source, file, testsSequence, area, @class, tags).ToList(); + return TestCasesFromYamlSequence(context, testsSequence).ToList(); } return null; } - private static IEnumerable TestCasesFromYamlSequenceOfSteps(string source, FileInfo file, YamlSequenceNode sequence, string area, string @class, Dictionary> tags) + private static IEnumerable TestCasesFromYamlSequenceOfSteps(YamlTestCaseParseContext context, YamlSequenceNode sequence) { var tests = new List(); for (int i = 0; i < sequence.Children.Count; i++) { var mapping = sequence.Children[i] as YamlMappingNode; - var test = GetTestFromNode(source, file, mapping, area, @class, tags, i + 1); + var test = GetTestFromNode(context, mapping, i + 1); if (test != null) { tests.Add(test); @@ -188,16 +201,15 @@ private static IEnumerable TestCasesFromYamlSequenceOfSteps(string sou return tests; } - private static void CheckInvalidTestCaseNodes(FileInfo file, YamlMappingNode mapping, TestCase test) + private static void CheckInvalidTestCaseNodes(YamlTestCaseParseContext context, YamlMappingNode mapping, TestCase test) { foreach (YamlScalarNode key in mapping.Children.Keys) { if (!IsValidTestCaseNode(key.Value) && !test.DisplayName.EndsWith(key.Value)) { - var error = $"Error parsing YAML: Unexpected YAML key/value ('{key.Value}', '{test.DisplayName}') in {file.FullName}({mapping[key].Start.Line})"; + var error = $"Error parsing YAML: Unexpected YAML key/value ('{key.Value}', '{test.DisplayName}') in {context.File.FullName}({mapping[key].Start.Line})"; test.DisplayName = error; Logger.LogError(error); - Logger.TraceError(error); } } } @@ -370,7 +382,7 @@ private static string GetScalarString(YamlMappingNode mapping, Dictionary cli var message = string.Join(" or ", clis.Select(cli => $"`cli: {cli}`")); message = $"PickCli: CLI not specified; please create/update {YamlTestFramework.YamlDefaultTagsFileName} with one of: {message}"; Logger.LogWarning(message); - Logger.TraceWarning(message); } private static string PickCliFound(IEnumerable clis, string cli) @@ -539,7 +537,6 @@ private static string PickCliFound(IEnumerable clis, string cli) var message = $"PickCliFound: CLI not specified; found 1 CLI; using {cli}"; Logger.LogInfo(message); - Logger.TraceInfo(message); return cli; } @@ -549,7 +546,6 @@ private static string PickCliNotFound(IEnumerable clis, string cli) var message = $"PickCliNotFound: CLI not specified; tried searching PATH and working directory; found 0 or >1 CLIs; using {cli}"; Logger.LogInfo(message); - Logger.TraceInfo(message); return cli; } @@ -624,31 +620,39 @@ private static bool WaitForExit(Process process, int timeout) var name = process.ProcessName; var message = $"Timedout! Stopping process ({name})..."; Logger.LogWarning(message); - Logger.TraceWarning(message); - process.StandardInput.WriteLine("\x3"); // try ctrl-c first - process.StandardInput.Close(); - completed = process.WaitForExit(200); + var softKillFunc = new Func(() => { + var message = $"Timedout! Sending ..."; + Logger.LogWarning(message); + + process.StandardInput.WriteLine("\x3"); // try ctrl-c first + process.StandardInput.Close(); + + Logger.LogWarning($"{message} Sent!"); + + return process.WaitForExit(200); + }); + completed = TryCatchHelpers.TryCatchNoThrow(softKillFunc, false, out var _); message = "Timedout! Sent " + (completed ? "; stopped" : "; trying Kill()"); Logger.LogWarning(message); - Logger.TraceWarning(message); if (!completed) { + message = $"Timedout! Killing process ({name})..."; + Logger.LogWarning(message); + process.Kill(); - var killed = process.HasExited ? "Done." : "Failed!"; - message = $"Timedout! Killing process ({name})... {killed}"; + message = process.HasExited ? $"{message} Done." : $"{message} Failed!"; Logger.LogWarning(message); - Logger.TraceWarning(message); } } return completed; } - private static string GetStartInfo(out string startProcess, string cli, string command, string script, bool scriptIsBash, List> kvs, string expect, string notExpect, ref List files) + private static void GetStartInfoArgs(out string startProcess, out string startArgs,string cli, string command, string script, bool scriptIsBash, List> kvs, string expect, string notExpect, ref List files) { startProcess = FindCacheCli(cli); @@ -657,14 +661,19 @@ private static string GetStartInfo(out string startProcess, string cli, string c { command = $"{command} {GetKeyValueArgs(kvs)}"; - var expectLess = string.IsNullOrEmpty(expect) && string.IsNullOrEmpty(notExpect); - if (expectLess) return command; + var hasExpectations = !string.IsNullOrEmpty(expect) || !string.IsNullOrEmpty(notExpect); + if (hasExpectations) + { + command = WriteTextToTempFile(command); + files ??= new List(); + files.Add(command); - command = WriteTextToTempFile(command); - files ??= new List(); - files.Add(command); + startArgs = $"run --command @{command} {GetAtArgs(expect, notExpect)}"; + return; + } - return $"run --command @{command} {GetAtArgs(expect, notExpect)}"; + startArgs = command; + return; } if (scriptIsBash) @@ -672,10 +681,12 @@ private static string GetStartInfo(out string startProcess, string cli, string c var bash = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? EnsureFindCacheGetBashExe() : "/bin/bash"; - return $"run --process \"{bash}\" --pre.script -l --script \"{script}\" {GetKeyValueArgs(kvs)} {GetAtArgs(expect, notExpect)}"; + startArgs = $"run --process \"{bash}\" --pre.script -l --script \"{script}\" {GetKeyValueArgs(kvs)} {GetAtArgs(expect, notExpect)}"; + return; } - return $"run --cmd --script \"{script}\" {GetKeyValueArgs(kvs)} {GetAtArgs(expect, notExpect)}"; + startArgs = $"run --cmd --script \"{script}\" {GetKeyValueArgs(kvs)} {GetAtArgs(expect, notExpect)}"; + return; } private static string EnsureFindCacheGetBashExe() @@ -860,9 +871,9 @@ private static string ExtraDebugInfo() return sb.ToString(); } - private static TestOutcome CheckExpectGptOutcome(string output, string expectGpt, ref string stdOut, ref string stdErr) + private static TestOutcome CheckExpectGptOutcome(string output, string expectGpt, string workingDirectory, ref string stdOut, ref string stdErr) { - var outcome = ExpectGptOutcome(output, expectGpt, out var gptStdOut, out var gptStdErr, out var gptMerged); + var outcome = ExpectGptOutcome(output, expectGpt, workingDirectory, out var gptStdOut, out var gptStdErr, out var gptMerged); if (outcome == TestOutcome.Failed) { if (!string.IsNullOrEmpty(gptStdOut)) stdOut = $"{stdOut}\n--expect-gpt--\n{gptStdOut}\n".Trim('\n'); @@ -871,8 +882,10 @@ private static TestOutcome CheckExpectGptOutcome(string output, string expectGpt return outcome; } - private static TestOutcome ExpectGptOutcome(string output, string expect, out string gptStdOut, out string gptStdErr, out string gptMerged) + private static TestOutcome ExpectGptOutcome(string output, string expect, string workingDirectory, out string gptStdOut, out string gptStdErr, out string gptMerged) { + Logger.Log($"ExpectGptOutcome: Checking for {expect} in '{output}'"); + var outcome = TestOutcome.None; var sbOut = new StringBuilder(); @@ -896,7 +909,8 @@ private static TestOutcome ExpectGptOutcome(string output, string expect, out st UseShellExecute = false, RedirectStandardInput = true, RedirectStandardError = true, - RedirectStandardOutput = true + RedirectStandardOutput = true, + WorkingDirectory = workingDirectory }; Logger.Log($"ExpectGptOutcome: Process.Start('{startProcess} {startArgs}')"); diff --git a/tests/testframework/YamlTestFramework.cs b/tests/testframework/YamlTestFramework.cs index ee60b57a..ecc0ad89 100644 --- a/tests/testframework/YamlTestFramework.cs +++ b/tests/testframework/YamlTestFramework.cs @@ -137,7 +137,7 @@ private static void RunAndRecordTestCaseSteps(IYamlTestFrameworkHost host, Dicti var nextStepId = YamlTestProperties.Get(checkTest, "nextStepId"); if (string.IsNullOrEmpty(nextStepId)) { - Logger.LogInfo($"YamlTestFramework.RunAndRecordTestCaseSteps() ==> No nextStepId for test '{checkTest.DisplayName}'"); + // Logger.LogInfo($"YamlTestFramework.RunAndRecordTestCaseSteps() ==> No nextStepId for test '{checkTest.DisplayName}'", trace: false); break; } diff --git a/tests/testrunner/YamlTestFrameworkConsoleHost.cs b/tests/testrunner/YamlTestFrameworkConsoleHost.cs index 2494002e..211553ae 100644 --- a/tests/testrunner/YamlTestFrameworkConsoleHost.cs +++ b/tests/testrunner/YamlTestFrameworkConsoleHost.cs @@ -23,7 +23,7 @@ public void RecordStart(TestCase testCase) lock (this) { - Console.ForegroundColor = ConsoleColor.DarkGray; + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); Console.WriteLine("Starting test: " + testCase.FullyQualifiedName); Console.ResetColor(); } @@ -69,44 +69,47 @@ public bool Finish(IDictionary> resultsByTestCaseId) Console.BackgroundColor = ConsoleColor.Blue; Console.ForegroundColor = ConsoleColor.White; Console.Write("TEST RESULT SUMMARY:"); - Console.ResetColor(); - Console.Write("\nTests: "); - Console.ForegroundColor = ConsoleColor.Blue; - Console.Write($"{count}"); - Console.ForegroundColor = ConsoleColor.DarkGray; - Console.WriteLine($" ({duration})"); - - var resultsFile = WriteResultFile(); - var fi = new FileInfo(resultsFile); Console.ResetColor(); - Console.Write("Results: "); - Console.ForegroundColor = ConsoleColor.Blue; - Console.Write(fi.FullName); - Console.ResetColor(); - Console.WriteLine("\n"); + Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Green; - Console.Write($"Passed: {passedResults.Count}"); + Console.Write($"\nPassed: {passedResults.Count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({100f * passedResults.Count / count:0.0}%)"); if (failedResults.Count > 0) { - Console.ForegroundColor = ConsoleColor.DarkGray; - Console.Write(", "); Console.ForegroundColor = ConsoleColor.Red; Console.Write($"Failed: {failedResults.Count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({100f * failedResults.Count / count:0.0}%)"); } if (skippedResults.Count > 0) { - Console.ForegroundColor = ConsoleColor.DarkGray; - Console.Write(", "); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write($"Skipped: {skippedResults.Count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({100f * skippedResults.Count / count:0.0}%)"); } Console.ResetColor(); - Console.WriteLine("\n"); + Console.Write("\nTests: "); + Console.ForegroundColor = ConsoleColor.Blue; + Console.Write($"{count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({duration})"); + + var resultsFile = WriteResultFile(); + + var fi = new FileInfo(resultsFile); + Console.ResetColor(); + Console.Write("Results: "); + Console.ForegroundColor = ConsoleColor.Blue; + Console.Write(fi.FullName); + Console.ResetColor(); + Console.WriteLine(); return passed; } @@ -299,7 +302,7 @@ private void PrintResult(TestResult testResult) { lock (this) { - Console.ForegroundColor = ConsoleColor.DarkGray; + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); if (testResult.Outcome == TestOutcome.Passed) Console.ForegroundColor = ConsoleColor.Green; if (testResult.Outcome == TestOutcome.Skipped) Console.ForegroundColor = ConsoleColor.Yellow; if (testResult.Outcome == TestOutcome.Failed) Console.ForegroundColor = ConsoleColor.Red; @@ -310,13 +313,48 @@ private void PrintResult(TestResult testResult) if (testResult.Outcome == TestOutcome.Failed) { - var hasStack = !string.IsNullOrEmpty(testResult.ErrorStackTrace); - if (hasStack) Console.WriteLine(testResult.ErrorStackTrace.Trim('\r', '\n')); - - var hasErr = !string.IsNullOrEmpty(testResult.ErrorMessage); - if (hasErr) Console.WriteLine(testResult.ErrorMessage.Trim('\r', '\n')); - - if (hasErr || hasStack) Console.WriteLine(); + var codeFilePath = testResult.TestCase.CodeFilePath; + var hasCodeFilePath = !string.IsNullOrEmpty(codeFilePath); + if (hasCodeFilePath) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine($"at {codeFilePath}({testResult.TestCase.LineNumber})"); + } + + var stack = testResult.ErrorStackTrace; + var hasStack = !string.IsNullOrEmpty(stack); + if (hasStack) + { + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine(stack.TrimEnd('\r', '\n', ' ')); + } + + var stdErr = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardErrorCategory)?.Text; + var hasStdErr = !string.IsNullOrEmpty(stdErr); + if (hasStdErr) + { + var lines = stdErr.Split('\n'); + if (lines.Length > 10) + { + var first5 = lines.Take(5); + var last5 = lines.Skip(lines.Length - 5); + lines = first5.Concat(new[] { $"[ ******* ------- TRIMMED +{lines.Length - 10} LINE(s) ------- ******* ]" }).Concat(last5).ToArray(); + stdErr = string.Join("\n", lines) + "\n..."; + } + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine(stdErr.TrimEnd('\r', '\n', ' ')); + } + + var err = testResult.ErrorMessage; + var hasErr = !string.IsNullOrEmpty(err); + if (hasErr) + { + Console.ResetColor(); + Console.WriteLine(err.TrimEnd('\r', '\n', ' ')); + } + + Console.ResetColor(); + if (hasStack || hasStdErr || hasErr || hasCodeFilePath) Console.WriteLine(); } } } From 5e8db81be44d01354a9e4df8ea4625134f2198f8 Mon Sep 17 00:00:00 2001 From: pankopon <55108151+pankopon@users.noreply.github.com> Date: Tue, 13 Feb 2024 18:57:27 -0800 Subject: [PATCH 02/19] Update installer UI (#216) Add Windows installer UI customization files to make some messages clearer. Also allow the Repair option after installation and update the .NET 8 version to the latest. --- scripts/Azure-AI-CLI-Setup.wxl | 58 ++++++++++++++ ...-CLI-Bundle.wxs => Azure-AI-CLI-Setup.wxs} | 15 ++-- scripts/Azure-AI-CLI-Setup.xml | 79 +++++++++++++++++++ scripts/Azure-AI-CLI.wxs | 5 -- scripts/WixBuildInstaller.cmd | 6 +- 5 files changed, 147 insertions(+), 16 deletions(-) create mode 100644 scripts/Azure-AI-CLI-Setup.wxl rename scripts/{Azure-AI-CLI-Bundle.wxs => Azure-AI-CLI-Setup.wxs} (88%) create mode 100644 scripts/Azure-AI-CLI-Setup.xml diff --git a/scripts/Azure-AI-CLI-Setup.wxl b/scripts/Azure-AI-CLI-Setup.wxl new file mode 100644 index 00000000..5816ed15 --- /dev/null +++ b/scripts/Azure-AI-CLI-Setup.wxl @@ -0,0 +1,58 @@ + + + [WixBundleName] Setup + [WixBundleName] + Version [WixBundleVersion] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or + creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and + no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + I &agree to the license terms and conditions + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Repair Successfully Completed + Uninstall Successfully Completed + Installation successfully completed. Please close and reopen any active terminal window to use Azure AI CLI. You can invoke the tool using the following command: ai + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Setup Failed + Uninstall Failed + Repair Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + No action was taken as a system reboot is required. + diff --git a/scripts/Azure-AI-CLI-Bundle.wxs b/scripts/Azure-AI-CLI-Setup.wxs similarity index 88% rename from scripts/Azure-AI-CLI-Bundle.wxs rename to scripts/Azure-AI-CLI-Setup.wxs index 13ed5ffb..eea49385 100644 --- a/scripts/Azure-AI-CLI-Bundle.wxs +++ b/scripts/Azure-AI-CLI-Setup.wxs @@ -6,28 +6,27 @@ + UpgradeCode="BF9A65EF-7D5A-4DC4-90E4-CDC44F042E96"> + ThemeFile="Azure-AI-CLI-Setup.xml"/> - - + + NOT WixBundleAction = 5 OR NOT AlreadyInstalledVersion >= v$(var.productVersion) diff --git a/scripts/Azure-AI-CLI-Setup.xml b/scripts/Azure-AI-CLI-Setup.xml new file mode 100644 index 00000000..47a7aa7a --- /dev/null +++ b/scripts/Azure-AI-CLI-Setup.xml @@ -0,0 +1,79 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + + + #(loc.HelpHeader) + #(loc.HelpText) + + + + + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + #(loc.FilesInUseHeader) + #(loc.FilesInUseLabel) + + + + + + + + + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.ModifyHeader) + + + + + + #(loc.SuccessHeader) + #(loc.SuccessInstallHeader) + #(loc.SuccessRepairHeader) + #(loc.SuccessUninstallHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.FailureHeader) + #(loc.FailureInstallHeader) + #(loc.FailureUninstallHeader) + #(loc.FailureRepairHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + diff --git a/scripts/Azure-AI-CLI.wxs b/scripts/Azure-AI-CLI.wxs index 31fada63..ccced70a 100644 --- a/scripts/Azure-AI-CLI.wxs +++ b/scripts/Azure-AI-CLI.wxs @@ -3,11 +3,6 @@ - - - diff --git a/scripts/WixBuildInstaller.cmd b/scripts/WixBuildInstaller.cmd index d39a2469..e253066f 100644 --- a/scripts/WixBuildInstaller.cmd +++ b/scripts/WixBuildInstaller.cmd @@ -26,7 +26,7 @@ REM Dependencies set AZURE_CLI_VERSION=2.57.0 set AZURE_CLI_INSTALLER=azure-cli-%AZURE_CLI_VERSION%-%TARGET_PLATFORM%.msi set AZURE_CLI_URL=https://azcliprod.blob.core.windows.net/msi/%AZURE_CLI_INSTALLER% -set DOTNET_VERSION=8.0.101 +set DOTNET_VERSION=8.0.200 set DOTNET_INSTALLER=dotnet-sdk-%DOTNET_VERSION%-win-%TARGET_PLATFORM%.exe set DOTNET_URL=https://dotnetcli.azureedge.net/dotnet/Sdk/%DOTNET_VERSION%/%DOTNET_INSTALLER% @@ -74,7 +74,7 @@ if %ERRORLEVEL% neq 0 ( ) REM Build installation bundle .exe -candle.exe Azure-AI-CLI-Bundle.wxs -ext WixBalExtension -ext WixUtilExtension ^ +candle.exe Azure-AI-CLI-Setup.wxs -ext WixBalExtension -ext WixUtilExtension ^ -dproductVersion=%PRODUCT_VERSION% -dtargetPlatform=%TARGET_PLATFORM% ^ -dazureCliVersion=%AZURE_CLI_VERSION% -dazureCliUrl=%AZURE_CLI_URL% ^ -ddotNetVersion=%DOTNET_VERSION% -ddotNetUrl=%DOTNET_URL% @@ -83,7 +83,7 @@ if %ERRORLEVEL% neq 0 ( exit /b 9 ) -light.exe Azure-AI-CLI-Bundle.wixobj -ext WixBalExtension -ext WixUtilExtension -out %INSTALLER_FILE% +light.exe Azure-AI-CLI-Setup.wixobj -ext WixBalExtension -ext WixUtilExtension -out %INSTALLER_FILE% if %ERRORLEVEL% neq 0 ( echo Error from light.exe 1>&2 exit /b 10 From 4f82550c8064b5ee11aa2f1e4223ee686df9e802 Mon Sep 17 00:00:00 2001 From: pankopon <55108151+pankopon@users.noreply.github.com> Date: Wed, 14 Feb 2024 15:02:34 -0800 Subject: [PATCH 03/19] Fix installer upgrades (#220) Re-add a condition to prevent removal of the CLI tool at the end of a bundle upgrade, and include a reference to the original issue as a reminder. --- scripts/Azure-AI-CLI.wxs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/Azure-AI-CLI.wxs b/scripts/Azure-AI-CLI.wxs index ccced70a..2fe1edad 100644 --- a/scripts/Azure-AI-CLI.wxs +++ b/scripts/Azure-AI-CLI.wxs @@ -3,6 +3,12 @@ + + + From 255347884f2f0147eb49fbdabef4e7153dc37232 Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Wed, 14 Feb 2024 16:36:30 -0800 Subject: [PATCH 04/19] updates to openai version in templates and better printing (#221) --- .../templates/openai-chat-py/requirements.txt | 2 +- .../openai-chat-streaming-py/requirements.txt | 2 +- .../requirements.txt | 2 +- .../requirements.txt | 2 +- tests/testframework/YamlTestCaseRunner.cs | 36 ++++++++++++++++--- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/ai/.x/templates/openai-chat-py/requirements.txt b/src/ai/.x/templates/openai-chat-py/requirements.txt index 7a06be70..97b18c6d 100644 --- a/src/ai/.x/templates/openai-chat-py/requirements.txt +++ b/src/ai/.x/templates/openai-chat-py/requirements.txt @@ -1 +1 @@ -openai==1.0.0 +openai>1.0 \ No newline at end of file diff --git a/src/ai/.x/templates/openai-chat-streaming-py/requirements.txt b/src/ai/.x/templates/openai-chat-streaming-py/requirements.txt index 7a06be70..97b18c6d 100644 --- a/src/ai/.x/templates/openai-chat-streaming-py/requirements.txt +++ b/src/ai/.x/templates/openai-chat-streaming-py/requirements.txt @@ -1 +1 @@ -openai==1.0.0 +openai>1.0 \ No newline at end of file diff --git a/src/ai/.x/templates/openai-chat-streaming-with-data-py/requirements.txt b/src/ai/.x/templates/openai-chat-streaming-with-data-py/requirements.txt index 7a06be70..97b18c6d 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-data-py/requirements.txt +++ b/src/ai/.x/templates/openai-chat-streaming-with-data-py/requirements.txt @@ -1 +1 @@ -openai==1.0.0 +openai>1.0 \ No newline at end of file diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-py/requirements.txt b/src/ai/.x/templates/openai-chat-streaming-with-functions-py/requirements.txt index 7a06be70..97b18c6d 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-py/requirements.txt +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-py/requirements.txt @@ -1 +1 @@ -openai==1.0.0 +openai>1.0 \ No newline at end of file diff --git a/tests/testframework/YamlTestCaseRunner.cs b/tests/testframework/YamlTestCaseRunner.cs index 5714739c..765d0891 100644 --- a/tests/testframework/YamlTestCaseRunner.cs +++ b/tests/testframework/YamlTestCaseRunner.cs @@ -228,16 +228,17 @@ private static TestOutcome RunTestCase(TestCase test, bool skipOnFailure, string try { + var kvs = KeyValuePairsFromJson(arguments, true); + kvs.AddRange(KeyValuePairsFromJson(@foreach, false)); + stackTrace = UpdateStackTrace(stackTrace, command, kvs); + kvs = ConvertValuesToAtArgs(kvs, ref filesToDelete); + var useCmd = !scriptIsBash; script = WriteTextToTempFile(script, useCmd ? "cmd" : null); expect = WriteTextToTempFile(expect); notExpect = WriteTextToTempFile(notExpect); - var kvs = KeyValuePairsFromJson(arguments, true); - kvs.AddRange(KeyValuePairsFromJson(@foreach, false)); - kvs = ConvertValuesToAtArgs(kvs, ref filesToDelete); - GetStartInfoArgs(out var startProcess, out var startArgs, cli, command, script, scriptIsBash, kvs, expect, notExpect, ref filesToDelete); stackTrace = $"{startProcess} {startArgs}\n{stackTrace ?? string.Empty}"; @@ -359,6 +360,33 @@ private static List> KeyValuePairsFromJson(string j return kvs; } + private static string UpdateStackTrace(string stackTrace, string command, List> kvs) + { + if (command?.EndsWith("dev shell") ?? false) + { + var devShellRunBashScriptArguments = string.Join("\n", kvs + .Where(kv => kv.Key switch { "run" => true, "bash" => true, "script" => true, _ => false }) + .Select(kv => !string.IsNullOrEmpty(kv.Key) + ? $"{kv.Key}:\n{kv.Value.Replace("\n", "\n ")}" + : kv.Value)); + if (!string.IsNullOrEmpty(devShellRunBashScriptArguments)) + { + stackTrace = $"{stackTrace ?? string.Empty}\n{devShellRunBashScriptArguments}".Trim('\r', '\n', ' '); + } + } + else if (command != null) + { + var commandArguments = string.Join("\n", kvs + .Where(kv => !string.IsNullOrEmpty(kv.Key)) + .Select(kv => $"{kv.Key}:\n{kv.Value.Replace("\n", "\n ")}")); + stackTrace = !string.IsNullOrEmpty(commandArguments) + ? $"{stackTrace ?? string.Empty}\nCOMMAND: {command}\n{commandArguments}".Trim('\r', '\n', ' ') + : $"{stackTrace ?? string.Empty}\nCOMMAND: {command}".Trim('\r', '\n', ' '); + } + + return stackTrace; + } + private static string WriteMultilineTsvToTempFile(string text, ref List files) { files ??= new List(); From 5e538ac93d81263211fd816db6c95e17a6152779 Mon Sep 17 00:00:00 2001 From: Ryan Hurey Date: Wed, 14 Feb 2024 16:51:13 -0800 Subject: [PATCH 05/19] Fix the pipeline file for automatically building the base container. (#222) * version fix * Change docker file path * Tag=buildid --- .../nginx-docker-build-and-push.yaml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.azure/pipelines/nginx-docker-build-and-push.yaml b/.azure/pipelines/nginx-docker-build-and-push.yaml index 264269ca..ca28cfc0 100644 --- a/.azure/pipelines/nginx-docker-build-and-push.yaml +++ b/.azure/pipelines/nginx-docker-build-and-push.yaml @@ -47,14 +47,13 @@ stages: inputs: containerRegistry: 'acrbn-acr' command: 'login' - - task: Docker@2 - displayName: Build ($(dockerfile) - $(version)) - inputs: - command: 'build' - containerRegistry: 'acrbn-acr' - repository: $[variables.repositorydocker] - Dockerfile: $(dockerfile) - buildContext: '.' + - task: Docker@2 + displayName: Build ($(dockerfile) - $(version)) + inputs: + command: 'build' + containerRegistry: 'acrbn-acr' + repository: $(repositorydocker) + Dockerfile: $(dockerfile) ################################################################################ ## SBOM @@ -110,6 +109,4 @@ stages: command: 'push' containerRegistry: 'acrbn-acr' repository: '$(repositorydocker)' - tags: | - ${{ variables.repositorydocker }} - ${{ variables.repositorydocker }}-$(Build.BuildId) + tags: $(Build.BuildId) From 4ccbf7038e0ee0990f277f76459a1c5736d3775f Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Fri, 16 Feb 2024 11:50:45 -0800 Subject: [PATCH 06/19] moved stuff around: (#223) src/extensions/test_helper_functions_extension/ -> src/testing/samples/helper_functions_sample_project/ tests/recordingadapter/ -> src/testing/adapters/recordingadapter/ tests/recordproxy/ -> src/testing/adapters/recordproxy/ tests/testadapter/ -> src/testing/adapters/testadapter/ tests/testframework/ -> src/extensions/testframework/ tests/testrunner/ -> src/testing/runner/ src/spx/ -> src/clis/spx/ src/vz/ -> src/clis/vz/ --- .azure/pipelines/docker_proxy_setup.yaml | 2 +- .../nginx-docker-build-and-push.yaml | 2 +- .gitignore | 1 + ai-cli.sln | 10 ++++---- .../spx/.x/config/batch.default.config | 0 .../spx/.x/config/batch.default.connection | 0 .../spx/.x/config/batch.default.output | 0 src/{ => clis}/spx/.x/config/connection | 0 .../spx/.x/config/connection.from.endpoint | 0 .../spx/.x/config/connection.from.host | 0 .../spx/.x/config/connection.from.region | 0 .../spx/.x/config/csr.default.config | 0 .../spx/.x/config/csr.default.connection | 0 .../spx/.x/config/csr.default.output | 0 src/{ => clis}/spx/.x/config/default.log | 0 src/{ => clis}/spx/.x/config/default.path | 0 src/{ => clis}/spx/.x/config/defaults | 0 .../spx/.x/config/dialog.default.config | 0 .../spx/.x/config/dialog.default.connection | 0 .../spx/.x/config/dialog.default.output | 0 src/{ => clis}/spx/.x/config/endpoint | 0 src/{ => clis}/spx/.x/config/fiddler | 0 src/{ => clis}/spx/.x/config/host | 0 .../spx/.x/config/identify.default.config | 0 .../spx/.x/config/identify.default.connection | 0 .../spx/.x/config/identify.default.output | 0 .../spx/.x/config/init.default.config | 0 .../spx/.x/config/init.default.output | 0 src/{ => clis}/spx/.x/config/input.path | 0 .../spx/.x/config/intent.default.config | 0 .../spx/.x/config/intent.default.connection | 0 .../spx/.x/config/intent.default.output | 0 src/{ => clis}/spx/.x/config/key | 0 src/{ => clis}/spx/.x/config/language | 0 src/{ => clis}/spx/.x/config/log.pid | 0 src/{ => clis}/spx/.x/config/log.time | 0 src/{ => clis}/spx/.x/config/log.time.pid | 0 src/{ => clis}/spx/.x/config/my.defaults | 0 src/{ => clis}/spx/.x/config/none | 0 src/{ => clis}/spx/.x/config/output | 0 .../spx/.x/config/output.all.detailed | 0 .../spx/.x/config/output.all.latency | 0 .../spx/.x/config/output.all.standard | 0 .../.x/config/output.all.transcript.display | 0 .../.x/config/output.all.transcript.lexical | 0 .../spx/.x/config/output.each.detailed | 0 .../spx/.x/config/output.each.event | 0 .../spx/.x/config/output.each.latency | 0 .../spx/.x/config/profile.default.config | 0 .../spx/.x/config/profile.default.connection | 0 .../spx/.x/config/profile.default.output | 0 .../spx/.x/config/recognize.default.config | 0 .../.x/config/recognize.default.connection | 0 .../spx/.x/config/recognize.default.output | 0 src/{ => clis}/spx/.x/config/region | 0 .../spx/.x/config/run.default.config | 0 .../spx/.x/config/speaker.default.config | 0 .../spx/.x/config/speaker.default.connection | 0 .../spx/.x/config/speaker.default.output | 0 src/{ => clis}/spx/.x/config/spx.defaults | 0 .../spx/.x/config/synthesize.default.config | 0 .../.x/config/synthesize.default.connection | 0 .../spx/.x/config/synthesize.default.output | 0 .../.x/config/synthesize.output.all.standard | 0 .../spx/.x/config/transcribe.default.config | 0 .../.x/config/transcribe.default.connection | 0 .../spx/.x/config/transcribe.default.output | 0 .../spx/.x/config/translate.default.config | 0 .../.x/config/translate.default.connection | 0 .../spx/.x/config/translate.default.output | 0 .../translate.output.all.translated.text | 0 .../translate.output.each.translated.text | 0 .../spx/.x/config/webjob.default.config | 0 .../spx/.x/config/webjob.default.connection | 0 src/{ => clis}/spx/.x/config/webjob.endpoint | 0 src/{ => clis}/spx/.x/config/webjob.password | 0 src/{ => clis}/spx/.x/help/advanced.setup | 0 src/{ => clis}/spx/.x/help/batch | 0 src/{ => clis}/spx/.x/help/batch.connection | 0 src/{ => clis}/spx/.x/help/batch.download | 0 .../spx/.x/help/batch.download.advanced | 0 .../spx/.x/help/batch.download.file | 0 .../spx/.x/help/batch.download.output.file | 0 src/{ => clis}/spx/.x/help/batch.download.url | 0 src/{ => clis}/spx/.x/help/batch.examples | 0 src/{ => clis}/spx/.x/help/batch.foreach | 0 src/{ => clis}/spx/.x/help/batch.input.path | 0 src/{ => clis}/spx/.x/help/batch.key | 0 src/{ => clis}/spx/.x/help/batch.list | 0 .../spx/.x/help/batch.list.advanced | 0 src/{ => clis}/spx/.x/help/batch.output | 0 src/{ => clis}/spx/.x/help/batch.output.id | 0 src/{ => clis}/spx/.x/help/batch.output.ids | 0 src/{ => clis}/spx/.x/help/batch.output.json | 0 src/{ => clis}/spx/.x/help/batch.output.path | 0 .../spx/.x/help/batch.output.request | 0 src/{ => clis}/spx/.x/help/batch.output.url | 0 src/{ => clis}/spx/.x/help/batch.output.urls | 0 src/{ => clis}/spx/.x/help/batch.processes | 0 src/{ => clis}/spx/.x/help/batch.region | 0 src/{ => clis}/spx/.x/help/batch.save | 0 src/{ => clis}/spx/.x/help/batch.threads | 0 .../spx/.x/help/batch.transcription | 0 .../spx/.x/help/batch.transcription.create | 0 .../help/batch.transcription.create.advanced | 0 .../help/batch.transcription.create.content | 0 .../help/batch.transcription.create.dataset | 0 .../batch.transcription.create.diarization | 0 .../help/batch.transcription.create.language | 0 .../.x/help/batch.transcription.create.model | 0 ...atch.transcription.create.profanity.filter | 0 .../batch.transcription.create.properties | 0 ...atch.transcription.create.punctuation.mode | 0 ...tch.transcription.create.word.level.timing | 0 .../spx/.x/help/batch.transcription.delete | 0 .../help/batch.transcription.delete.advanced | 0 .../.x/help/batch.transcription.description | 0 .../spx/.x/help/batch.transcription.download | 0 .../batch.transcription.download.advanced | 0 .../spx/.x/help/batch.transcription.examples | 0 .../spx/.x/help/batch.transcription.list | 0 .../.x/help/batch.transcription.list.advanced | 0 .../.x/help/batch.transcription.list.files | 0 .../help/batch.transcription.list.languages | 0 .../batch.transcription.list.transcriptions | 0 .../.x/help/batch.transcription.more.examples | 0 .../spx/.x/help/batch.transcription.name | 0 .../spx/.x/help/batch.transcription.onprem | 0 .../.x/help/batch.transcription.onprem.create | 0 .../.x/help/batch.transcription.onprem.delete | 0 .../help/batch.transcription.onprem.endpoints | 0 .../.x/help/batch.transcription.onprem.list | 0 .../.x/help/batch.transcription.onprem.status | 0 .../spx/.x/help/batch.transcription.project | 0 .../spx/.x/help/batch.transcription.reference | 0 .../spx/.x/help/batch.transcription.status | 0 .../help/batch.transcription.status.advanced | 0 .../spx/.x/help/batch.transcription.update | 0 .../help/batch.transcription.update.advanced | 0 .../spx/.x/help/batch.transcription.wait | 0 src/{ => clis}/spx/.x/help/batch.zip | 0 src/{ => clis}/spx/.x/help/check | 0 src/{ => clis}/spx/.x/help/check.advanced | 0 src/{ => clis}/spx/.x/help/check.examples | 0 src/{ => clis}/spx/.x/help/check.result | 0 src/{ => clis}/spx/.x/help/config | 0 src/{ => clis}/spx/.x/help/config.add | 0 src/{ => clis}/spx/.x/help/config.advanced | 0 src/{ => clis}/spx/.x/help/config.clear | 0 src/{ => clis}/spx/.x/help/config.command | 0 src/{ => clis}/spx/.x/help/config.examples | 0 src/{ => clis}/spx/.x/help/config.find | 0 src/{ => clis}/spx/.x/help/config.hive | 0 src/{ => clis}/spx/.x/help/config.region | 0 src/{ => clis}/spx/.x/help/config.scope | 0 src/{ => clis}/spx/.x/help/config.set | 0 src/{ => clis}/spx/.x/help/connect | 0 src/{ => clis}/spx/.x/help/continuous | 0 src/{ => clis}/spx/.x/help/conversation | 0 src/{ => clis}/spx/.x/help/conversation.id | 0 src/{ => clis}/spx/.x/help/csr | 0 src/{ => clis}/spx/.x/help/csr.dataset | 0 src/{ => clis}/spx/.x/help/csr.dataset.create | 0 .../spx/.x/help/csr.dataset.create.content | 0 .../spx/.x/help/csr.dataset.create.kind | 0 .../spx/.x/help/csr.dataset.create.language | 0 src/{ => clis}/spx/.x/help/csr.dataset.delete | 0 .../spx/.x/help/csr.dataset.delete.dataset | 0 .../spx/.x/help/csr.dataset.description | 0 .../spx/.x/help/csr.dataset.download | 0 .../spx/.x/help/csr.dataset.download.file | 0 src/{ => clis}/spx/.x/help/csr.dataset.list | 0 .../spx/.x/help/csr.dataset.list.datasets | 0 .../spx/.x/help/csr.dataset.list.files | 0 .../spx/.x/help/csr.dataset.list.languages | 0 .../spx/.x/help/csr.dataset.list.project | 0 src/{ => clis}/spx/.x/help/csr.dataset.name | 0 .../spx/.x/help/csr.dataset.project | 0 src/{ => clis}/spx/.x/help/csr.dataset.status | 0 .../spx/.x/help/csr.dataset.status.dataset | 0 src/{ => clis}/spx/.x/help/csr.dataset.update | 0 .../spx/.x/help/csr.dataset.update.dataset | 0 src/{ => clis}/spx/.x/help/csr.dataset.upload | 0 .../spx/.x/help/csr.dataset.upload.data | 0 .../spx/.x/help/csr.dataset.upload.kind | 0 .../spx/.x/help/csr.dataset.upload.language | 0 src/{ => clis}/spx/.x/help/csr.download | 0 .../spx/.x/help/csr.download.dataset.file | 0 .../spx/.x/help/csr.download.endpoint.log | 0 src/{ => clis}/spx/.x/help/csr.download.file | 0 src/{ => clis}/spx/.x/help/csr.download.url | 0 src/{ => clis}/spx/.x/help/csr.endpoint | 0 .../spx/.x/help/csr.endpoint.create | 0 .../spx/.x/help/csr.endpoint.create.language | 0 .../spx/.x/help/csr.endpoint.create.model | 0 .../spx/.x/help/csr.endpoint.create.text | 0 .../spx/.x/help/csr.endpoint.delete | 0 .../spx/.x/help/csr.endpoint.delete.endpoint | 0 .../.x/help/csr.endpoint.delete.endpoint.log | 0 .../spx/.x/help/csr.endpoint.description | 0 .../spx/.x/help/csr.endpoint.download | 0 .../help/csr.endpoint.download.endpoint.log | 0 .../spx/.x/help/csr.endpoint.examples | 0 src/{ => clis}/spx/.x/help/csr.endpoint.list | 0 .../help/csr.endpoint.list.endpoint.languages | 0 .../.x/help/csr.endpoint.list.endpoint.logs | 0 .../spx/.x/help/csr.endpoint.list.endpoints | 0 .../spx/.x/help/csr.endpoint.list.project | 0 src/{ => clis}/spx/.x/help/csr.endpoint.name | 0 .../spx/.x/help/csr.endpoint.project | 0 .../spx/.x/help/csr.endpoint.status | 0 .../spx/.x/help/csr.endpoint.status.endpoint | 0 .../spx/.x/help/csr.endpoint.update | 0 .../spx/.x/help/csr.endpoint.update.endpoint | 0 src/{ => clis}/spx/.x/help/csr.evaluation | 0 .../spx/.x/help/csr.evaluation.create | 0 .../spx/.x/help/csr.evaluation.delete | 0 .../spx/.x/help/csr.evaluation.examples | 0 .../spx/.x/help/csr.evaluation.list | 0 .../spx/.x/help/csr.evaluation.status | 0 .../spx/.x/help/csr.evaluation.update | 0 src/{ => clis}/spx/.x/help/csr.examples | 0 src/{ => clis}/spx/.x/help/csr.foreach | 0 src/{ => clis}/spx/.x/help/csr.input.path | 0 src/{ => clis}/spx/.x/help/csr.key | 0 src/{ => clis}/spx/.x/help/csr.list | 0 .../spx/.x/help/csr.list.base.models | 0 .../spx/.x/help/csr.list.dataset.languages | 0 src/{ => clis}/spx/.x/help/csr.list.datasets | 0 .../spx/.x/help/csr.list.endpoint.languages | 0 src/{ => clis}/spx/.x/help/csr.list.endpoints | 0 .../spx/.x/help/csr.list.model.languages | 0 src/{ => clis}/spx/.x/help/csr.list.models | 0 .../spx/.x/help/csr.list.project.languages | 0 src/{ => clis}/spx/.x/help/csr.list.projects | 0 src/{ => clis}/spx/.x/help/csr.model | 0 src/{ => clis}/spx/.x/help/csr.model.copy | 0 .../spx/.x/help/csr.model.copy.target | 0 src/{ => clis}/spx/.x/help/csr.model.create | 0 .../spx/.x/help/csr.model.create.base | 0 .../spx/.x/help/csr.model.create.dataset | 0 .../spx/.x/help/csr.model.create.datasets | 0 .../spx/.x/help/csr.model.create.language | 0 .../spx/.x/help/csr.model.create.text | 0 src/{ => clis}/spx/.x/help/csr.model.delete | 0 .../spx/.x/help/csr.model.delete.model | 0 .../spx/.x/help/csr.model.description | 0 src/{ => clis}/spx/.x/help/csr.model.examples | 0 src/{ => clis}/spx/.x/help/csr.model.list | 0 .../spx/.x/help/csr.model.list.base.models | 0 .../.x/help/csr.model.list.model.languages | 0 .../spx/.x/help/csr.model.list.model.project | 0 .../spx/.x/help/csr.model.list.models | 0 src/{ => clis}/spx/.x/help/csr.model.name | 0 src/{ => clis}/spx/.x/help/csr.model.project | 0 src/{ => clis}/spx/.x/help/csr.model.status | 0 .../spx/.x/help/csr.model.status.model | 0 src/{ => clis}/spx/.x/help/csr.model.update | 0 .../spx/.x/help/csr.model.update.model | 0 src/{ => clis}/spx/.x/help/csr.more.examples | 0 src/{ => clis}/spx/.x/help/csr.output.file | 0 src/{ => clis}/spx/.x/help/csr.output.id | 0 src/{ => clis}/spx/.x/help/csr.output.json | 0 src/{ => clis}/spx/.x/help/csr.output.path | 0 src/{ => clis}/spx/.x/help/csr.output.url | 0 src/{ => clis}/spx/.x/help/csr.project | 0 src/{ => clis}/spx/.x/help/csr.project.create | 0 .../spx/.x/help/csr.project.create.language | 0 src/{ => clis}/spx/.x/help/csr.project.delete | 0 .../spx/.x/help/csr.project.delete.project | 0 .../spx/.x/help/csr.project.description | 0 .../spx/.x/help/csr.project.examples | 0 src/{ => clis}/spx/.x/help/csr.project.list | 0 .../help/csr.project.list.project.languages | 0 .../spx/.x/help/csr.project.list.projects | 0 src/{ => clis}/spx/.x/help/csr.project.name | 0 src/{ => clis}/spx/.x/help/csr.project.status | 0 .../spx/.x/help/csr.project.status.project | 0 src/{ => clis}/spx/.x/help/csr.project.update | 0 .../spx/.x/help/csr.project.update.project | 0 src/{ => clis}/spx/.x/help/csr.region | 0 src/{ => clis}/spx/.x/help/csr.save | 0 src/{ => clis}/spx/.x/help/csr.url | 0 src/{ => clis}/spx/.x/help/csr.wait | 0 src/{ => clis}/spx/.x/help/csr.zip | 0 src/{ => clis}/spx/.x/help/customization | 0 .../spx/.x/help/customize.categoryid | 0 .../spx/.x/help/customize.endpointid | 0 src/{ => clis}/spx/.x/help/defaults | 0 src/{ => clis}/spx/.x/help/dialog | 0 src/{ => clis}/spx/.x/help/dialog.advanced | 0 src/{ => clis}/spx/.x/help/dialog.bot | 0 .../spx/.x/help/dialog.bot.continuous | 0 src/{ => clis}/spx/.x/help/dialog.bot.id | 0 src/{ => clis}/spx/.x/help/dialog.bot.input | 0 src/{ => clis}/spx/.x/help/dialog.bot.keyword | 0 src/{ => clis}/spx/.x/help/dialog.bot.once | 0 src/{ => clis}/spx/.x/help/dialog.bot.output | 0 src/{ => clis}/spx/.x/help/dialog.cc | 0 .../spx/.x/help/dialog.customcommands | 0 .../spx/.x/help/dialog.customcommands.appid | 0 .../.x/help/dialog.customcommands.continuous | 0 .../spx/.x/help/dialog.customcommands.input | 0 .../spx/.x/help/dialog.customcommands.keyword | 0 .../spx/.x/help/dialog.customcommands.once | 0 .../spx/.x/help/dialog.customcommands.output | 0 src/{ => clis}/spx/.x/help/dialog.examples | 0 .../spx/.x/help/display.post.processing | 0 src/{ => clis}/spx/.x/help/documentation | 0 src/{ => clis}/spx/.x/help/endpoint | 0 src/{ => clis}/spx/.x/help/endpoint.examples | 0 src/{ => clis}/spx/.x/help/examples | 0 src/{ => clis}/spx/.x/help/foreach | 0 src/{ => clis}/spx/.x/help/help | 0 src/{ => clis}/spx/.x/help/hive | 0 .../spx/.x/help/include.create.resource | 0 .../spx/.x/help/include.create.resource.extra | 0 .../spx/.x/help/include.spx.ascii.logo | 0 .../spx/.x/help/include.spx.init.ascii.logo | 0 .../.x/help/include.the.azure.speech.service | 0 .../include.the.azure.speech.service.long | 0 .../spx/.x/help/include.the.config.command | 0 .../.x/help/include.the.csr.dataset.command | 0 .../include.the.csr.dataset.create.command | 0 .../include.the.csr.dataset.delete.command | 0 .../include.the.csr.dataset.download.command | 0 .../help/include.the.csr.dataset.list.command | 0 .../include.the.csr.dataset.status.command | 0 .../include.the.csr.dataset.update.command | 0 .../include.the.csr.dataset.upload.command | 0 .../.x/help/include.the.csr.endpoint.command | 0 .../include.the.csr.endpoint.create.command | 0 .../include.the.csr.endpoint.delete.command | 0 .../include.the.csr.endpoint.download.command | 0 .../include.the.csr.endpoint.list.command | 0 .../include.the.csr.endpoint.status.command | 0 .../include.the.csr.endpoint.update.command | 0 .../help/include.the.csr.evaluation.command | 0 .../include.the.csr.evaluation.create.command | 0 .../include.the.csr.evaluation.delete.command | 0 .../include.the.csr.evaluation.list.command | 0 .../include.the.csr.evaluation.status.command | 0 .../include.the.csr.evaluation.update.command | 0 .../spx/.x/help/include.the.csr.model.command | 0 .../help/include.the.csr.model.copy.command | 0 .../help/include.the.csr.model.create.command | 0 .../help/include.the.csr.model.delete.command | 0 .../help/include.the.csr.model.status.command | 0 .../help/include.the.csr.model.update.command | 0 .../.x/help/include.the.csr.project.command | 0 .../include.the.csr.project.create.command | 0 .../include.the.csr.project.delete.command | 0 .../help/include.the.csr.project.list.command | 0 .../include.the.csr.project.status.command | 0 .../include.the.csr.project.update.command | 0 .../spx/.x/help/include.the.dialog.command | 0 .../.x/help/include.the.dialog.command.long | 0 .../spx/.x/help/include.the.init.command.long | 0 .../spx/.x/help/include.the.intent.command | 0 .../.x/help/include.the.intent.command.long | 0 .../spx/.x/help/include.the.intent.method | 0 .../spx/.x/help/include.the.key.option | 0 .../spx/.x/help/include.the.key.option.where | 0 .../spx/.x/help/include.the.log.option | 0 .../spx/.x/help/include.the.luis.option | 0 .../.x/help/include.the.model.list.command | 0 .../spx/.x/help/include.the.profile.command | 0 .../.x/help/include.the.profile.command.long | 0 .../spx/.x/help/include.the.recognize.command | 0 .../help/include.the.recognize.command.long | 0 .../spx/.x/help/include.the.recognize.method | 0 .../spx/.x/help/include.the.region.option | 0 .../.x/help/include.the.region.option.where | 0 .../spx/.x/help/include.the.run.command | 0 .../spx/.x/help/include.the.save.option | 0 .../spx/.x/help/include.the.speaker.command | 0 .../.x/help/include.the.speaker.command.long | 0 .../.x/help/include.the.synthesize.command | 0 .../help/include.the.synthesize.command.long | 0 .../spx/.x/help/include.the.token.option | 0 .../.x/help/include.the.token.option.where | 0 .../spx/.x/help/include.the.translate.command | 0 .../help/include.the.translate.command.long | 0 .../spx/.x/help/include.the.webjob.command | 0 .../.x/help/include.the.webjob.command.long | 0 .../spx/.x/help/include.the.zip.option | 0 src/{ => clis}/spx/.x/help/init | 0 src/{ => clis}/spx/.x/help/init.advanced | 0 src/{ => clis}/spx/.x/help/init.examples | 0 src/{ => clis}/spx/.x/help/input | 0 src/{ => clis}/spx/.x/help/input.id | 0 src/{ => clis}/spx/.x/help/intent | 0 src/{ => clis}/spx/.x/help/intent.advanced | 0 src/{ => clis}/spx/.x/help/intent.connection | 0 src/{ => clis}/spx/.x/help/intent.continuous | 0 src/{ => clis}/spx/.x/help/intent.endpoint | 0 src/{ => clis}/spx/.x/help/intent.examples | 0 src/{ => clis}/spx/.x/help/intent.file | 0 src/{ => clis}/spx/.x/help/intent.files | 0 src/{ => clis}/spx/.x/help/intent.foreach | 0 src/{ => clis}/spx/.x/help/intent.format | 0 src/{ => clis}/spx/.x/help/intent.input | 0 src/{ => clis}/spx/.x/help/intent.key | 0 src/{ => clis}/spx/.x/help/intent.keyword | 0 src/{ => clis}/spx/.x/help/intent.language | 0 src/{ => clis}/spx/.x/help/intent.languages | 0 src/{ => clis}/spx/.x/help/intent.log | 0 src/{ => clis}/spx/.x/help/intent.luis | 0 .../spx/.x/help/intent.luis.allintents | 0 src/{ => clis}/spx/.x/help/intent.luis.intent | 0 src/{ => clis}/spx/.x/help/intent.luis.key | 0 src/{ => clis}/spx/.x/help/intent.luis.region | 0 src/{ => clis}/spx/.x/help/intent.microphone | 0 src/{ => clis}/spx/.x/help/intent.once | 0 src/{ => clis}/spx/.x/help/intent.output | 0 .../spx/.x/help/intent.output.accuracy | 0 src/{ => clis}/spx/.x/help/intent.output.all | 0 .../spx/.x/help/intent.output.all.example | 0 .../spx/.x/help/intent.output.all.file | 0 .../spx/.x/help/intent.output.all.files | 0 .../spx/.x/help/intent.output.all.json | 0 .../spx/.x/help/intent.output.all.timing | 0 .../spx/.x/help/intent.output.batch | 0 src/{ => clis}/spx/.x/help/intent.output.each | 0 .../spx/.x/help/intent.output.examples | 0 src/{ => clis}/spx/.x/help/intent.output.file | 0 src/{ => clis}/spx/.x/help/intent.output.text | 0 src/{ => clis}/spx/.x/help/intent.output.vtt | 0 src/{ => clis}/spx/.x/help/intent.output.wer | 0 src/{ => clis}/spx/.x/help/intent.pattern | 0 src/{ => clis}/spx/.x/help/intent.patterns | 0 src/{ => clis}/spx/.x/help/intent.phrases | 0 src/{ => clis}/spx/.x/help/intent.processes | 0 src/{ => clis}/spx/.x/help/intent.profanity | 0 src/{ => clis}/spx/.x/help/intent.proxy | 0 src/{ => clis}/spx/.x/help/intent.region | 0 src/{ => clis}/spx/.x/help/intent.save | 0 src/{ => clis}/spx/.x/help/intent.testing | 0 src/{ => clis}/spx/.x/help/intent.threads | 0 src/{ => clis}/spx/.x/help/intent.token | 0 src/{ => clis}/spx/.x/help/intent.transcript | 0 src/{ => clis}/spx/.x/help/intent.url | 0 src/{ => clis}/spx/.x/help/intent.urls | 0 src/{ => clis}/spx/.x/help/intent.wer | 0 src/{ => clis}/spx/.x/help/intent.zip | 0 src/{ => clis}/spx/.x/help/internal | 0 src/{ => clis}/spx/.x/help/key | 0 src/{ => clis}/spx/.x/help/key.overview | 0 src/{ => clis}/spx/.x/help/keyword | 0 src/{ => clis}/spx/.x/help/language | 0 src/{ => clis}/spx/.x/help/log | 0 src/{ => clis}/spx/.x/help/luis.documentation | 0 src/{ => clis}/spx/.x/help/microphone | 0 src/{ => clis}/spx/.x/help/once | 0 src/{ => clis}/spx/.x/help/output | 0 src/{ => clis}/spx/.x/help/output.all | 0 src/{ => clis}/spx/.x/help/output.each | 0 src/{ => clis}/spx/.x/help/phrases | 0 src/{ => clis}/spx/.x/help/profanity | 0 src/{ => clis}/spx/.x/help/profile | 0 src/{ => clis}/spx/.x/help/profile.connection | 0 src/{ => clis}/spx/.x/help/profile.create | 0 src/{ => clis}/spx/.x/help/profile.delete | 0 .../spx/.x/help/profile.documentation | 0 src/{ => clis}/spx/.x/help/profile.enroll | 0 src/{ => clis}/spx/.x/help/profile.examples | 0 src/{ => clis}/spx/.x/help/profile.file | 0 src/{ => clis}/spx/.x/help/profile.id | 0 src/{ => clis}/spx/.x/help/profile.key | 0 src/{ => clis}/spx/.x/help/profile.kind | 0 src/{ => clis}/spx/.x/help/profile.list | 0 src/{ => clis}/spx/.x/help/profile.output | 0 .../spx/.x/help/profile.output.file | 0 src/{ => clis}/spx/.x/help/profile.output.id | 0 .../spx/.x/help/profile.output.json | 0 src/{ => clis}/spx/.x/help/profile.region | 0 src/{ => clis}/spx/.x/help/profile.status | 0 src/{ => clis}/spx/.x/help/proxy | 0 src/{ => clis}/spx/.x/help/query.string | 0 src/{ => clis}/spx/.x/help/recognize | 0 src/{ => clis}/spx/.x/help/recognize.advanced | 0 .../spx/.x/help/recognize.check.text | 0 .../spx/.x/help/recognize.check.wer | 0 src/{ => clis}/spx/.x/help/recognize.connect | 0 .../spx/.x/help/recognize.connection | 0 .../spx/.x/help/recognize.continuous | 0 .../spx/.x/help/recognize.custom.speech | 0 .../help/recognize.default.connection.example | 0 .../spx/.x/help/recognize.disconnect | 0 src/{ => clis}/spx/.x/help/recognize.endpoint | 0 src/{ => clis}/spx/.x/help/recognize.examples | 0 src/{ => clis}/spx/.x/help/recognize.file | 0 src/{ => clis}/spx/.x/help/recognize.files | 0 src/{ => clis}/spx/.x/help/recognize.foreach | 0 src/{ => clis}/spx/.x/help/recognize.format | 0 .../spx/.x/help/recognize.improve.accuracy | 0 src/{ => clis}/spx/.x/help/recognize.input | 0 src/{ => clis}/spx/.x/help/recognize.key | 0 src/{ => clis}/spx/.x/help/recognize.keyword | 0 src/{ => clis}/spx/.x/help/recognize.language | 0 .../spx/.x/help/recognize.languages | 0 src/{ => clis}/spx/.x/help/recognize.log | 0 .../spx/.x/help/recognize.microphone | 0 src/{ => clis}/spx/.x/help/recognize.once | 0 src/{ => clis}/spx/.x/help/recognize.output | 0 .../spx/.x/help/recognize.output.all | 0 .../spx/.x/help/recognize.output.all.file | 0 .../spx/.x/help/recognize.output.batch | 0 .../spx/.x/help/recognize.output.batch.file | 0 .../spx/.x/help/recognize.output.batch.json | 0 .../spx/.x/help/recognize.output.each | 0 .../spx/.x/help/recognize.output.each.file | 0 .../spx/.x/help/recognize.output.examples | 0 .../spx/.x/help/recognize.output.vtt | 0 src/{ => clis}/spx/.x/help/recognize.phrases | 0 .../spx/.x/help/recognize.processes | 0 .../spx/.x/help/recognize.profanity | 0 src/{ => clis}/spx/.x/help/recognize.proxy | 0 src/{ => clis}/spx/.x/help/recognize.region | 0 src/{ => clis}/spx/.x/help/recognize.save | 0 src/{ => clis}/spx/.x/help/recognize.testing | 0 src/{ => clis}/spx/.x/help/recognize.threads | 0 src/{ => clis}/spx/.x/help/recognize.token | 0 .../spx/.x/help/recognize.transcript | 0 src/{ => clis}/spx/.x/help/recognize.url | 0 src/{ => clis}/spx/.x/help/recognize.urls | 0 src/{ => clis}/spx/.x/help/recognize.wer | 0 .../spx/.x/help/recognize.word.level.timing | 0 src/{ => clis}/spx/.x/help/recognize.zip | 0 src/{ => clis}/spx/.x/help/region | 0 src/{ => clis}/spx/.x/help/region.overview | 0 src/{ => clis}/spx/.x/help/run | 0 src/{ => clis}/spx/.x/help/run.advanced | 0 src/{ => clis}/spx/.x/help/run.csx | 0 src/{ => clis}/spx/.x/help/run.examples | 0 src/{ => clis}/spx/.x/help/setup | 0 src/{ => clis}/spx/.x/help/source | 0 src/{ => clis}/spx/.x/help/speaker | 0 src/{ => clis}/spx/.x/help/speaker.connection | 0 .../spx/.x/help/speaker.documentation | 0 src/{ => clis}/spx/.x/help/speaker.examples | 0 src/{ => clis}/spx/.x/help/speaker.file | 0 src/{ => clis}/spx/.x/help/speaker.id | 0 src/{ => clis}/spx/.x/help/speaker.identify | 0 src/{ => clis}/spx/.x/help/speaker.key | 0 src/{ => clis}/spx/.x/help/speaker.kind | 0 src/{ => clis}/spx/.x/help/speaker.language | 0 src/{ => clis}/spx/.x/help/speaker.region | 0 src/{ => clis}/spx/.x/help/speaker.verify | 0 src/{ => clis}/spx/.x/help/synthesize | 0 .../spx/.x/help/synthesize.advanced | 0 src/{ => clis}/spx/.x/help/synthesize.audio | 0 .../spx/.x/help/synthesize.audio.output | 0 .../spx/.x/help/synthesize.audio.speakers | 0 .../spx/.x/help/synthesize.connection | 0 .../spx/.x/help/synthesize.endpoint | 0 .../spx/.x/help/synthesize.examples | 0 src/{ => clis}/spx/.x/help/synthesize.file | 0 src/{ => clis}/spx/.x/help/synthesize.files | 0 src/{ => clis}/spx/.x/help/synthesize.foreach | 0 src/{ => clis}/spx/.x/help/synthesize.format | 0 .../spx/.x/help/synthesize.format.mp3 | 0 .../spx/.x/help/synthesize.format.ogg | 0 .../spx/.x/help/synthesize.format.opus | 0 .../spx/.x/help/synthesize.format.raw | 0 .../spx/.x/help/synthesize.format.siren | 0 .../spx/.x/help/synthesize.format.wav | 0 .../spx/.x/help/synthesize.format.webm | 0 src/{ => clis}/spx/.x/help/synthesize.input | 0 .../spx/.x/help/synthesize.interactive | 0 src/{ => clis}/spx/.x/help/synthesize.key | 0 .../spx/.x/help/synthesize.list.voices | 0 src/{ => clis}/spx/.x/help/synthesize.log | 0 src/{ => clis}/spx/.x/help/synthesize.mp3 | 0 src/{ => clis}/spx/.x/help/synthesize.ogg | 0 src/{ => clis}/spx/.x/help/synthesize.opus | 0 src/{ => clis}/spx/.x/help/synthesize.output | 0 .../spx/.x/help/synthesize.output.all | 0 .../spx/.x/help/synthesize.output.all.file | 0 .../spx/.x/help/synthesize.output.each | 0 .../spx/.x/help/synthesize.output.each.file | 0 .../spx/.x/help/synthesize.output.examples | 0 .../spx/.x/help/synthesize.processes | 0 src/{ => clis}/spx/.x/help/synthesize.proxy | 0 src/{ => clis}/spx/.x/help/synthesize.raw | 0 src/{ => clis}/spx/.x/help/synthesize.region | 0 src/{ => clis}/spx/.x/help/synthesize.save | 0 src/{ => clis}/spx/.x/help/synthesize.siren | 0 src/{ => clis}/spx/.x/help/synthesize.ssml | 0 src/{ => clis}/spx/.x/help/synthesize.text | 0 src/{ => clis}/spx/.x/help/synthesize.threads | 0 src/{ => clis}/spx/.x/help/synthesize.token | 0 src/{ => clis}/spx/.x/help/synthesize.url | 0 src/{ => clis}/spx/.x/help/synthesize.urls | 0 src/{ => clis}/spx/.x/help/synthesize.voice | 0 src/{ => clis}/spx/.x/help/synthesize.wav | 0 src/{ => clis}/spx/.x/help/synthesize.webm | 0 src/{ => clis}/spx/.x/help/synthesize.zip | 0 src/{ => clis}/spx/.x/help/target | 0 src/{ => clis}/spx/.x/help/token | 0 src/{ => clis}/spx/.x/help/traffic.type | 0 src/{ => clis}/spx/.x/help/transcribe | 0 .../spx/.x/help/transcribe.advanced | 0 src/{ => clis}/spx/.x/help/transcribe.connect | 0 .../spx/.x/help/transcribe.connection | 0 .../spx/.x/help/transcribe.conversation.id | 0 .../spx/.x/help/transcribe.endpoint | 0 .../spx/.x/help/transcribe.examples | 0 src/{ => clis}/spx/.x/help/transcribe.file | 0 src/{ => clis}/spx/.x/help/transcribe.files | 0 src/{ => clis}/spx/.x/help/transcribe.foreach | 0 src/{ => clis}/spx/.x/help/transcribe.input | 0 src/{ => clis}/spx/.x/help/transcribe.key | 0 .../spx/.x/help/transcribe.language | 0 src/{ => clis}/spx/.x/help/transcribe.log | 0 src/{ => clis}/spx/.x/help/transcribe.output | 0 .../spx/.x/help/transcribe.output.all | 0 .../spx/.x/help/transcribe.output.each | 0 src/{ => clis}/spx/.x/help/transcribe.phrases | 0 src/{ => clis}/spx/.x/help/transcribe.proxy | 0 src/{ => clis}/spx/.x/help/transcribe.region | 0 src/{ => clis}/spx/.x/help/transcribe.save | 0 src/{ => clis}/spx/.x/help/transcribe.source | 0 src/{ => clis}/spx/.x/help/transcribe.token | 0 src/{ => clis}/spx/.x/help/transcribe.zip | 0 src/{ => clis}/spx/.x/help/translate | 0 src/{ => clis}/spx/.x/help/translate.advanced | 0 .../spx/.x/help/translate.check.text | 0 .../spx/.x/help/translate.check.wer | 0 src/{ => clis}/spx/.x/help/translate.connect | 0 .../spx/.x/help/translate.connection | 0 .../spx/.x/help/translate.continuous | 0 .../spx/.x/help/translate.custom.speech | 0 .../spx/.x/help/translate.custom.translation | 0 .../spx/.x/help/translate.disconnect | 0 src/{ => clis}/spx/.x/help/translate.endpoint | 0 src/{ => clis}/spx/.x/help/translate.examples | 0 src/{ => clis}/spx/.x/help/translate.file | 0 src/{ => clis}/spx/.x/help/translate.files | 0 src/{ => clis}/spx/.x/help/translate.foreach | 0 src/{ => clis}/spx/.x/help/translate.format | 0 src/{ => clis}/spx/.x/help/translate.input | 0 src/{ => clis}/spx/.x/help/translate.key | 0 src/{ => clis}/spx/.x/help/translate.keyword | 0 src/{ => clis}/spx/.x/help/translate.language | 0 src/{ => clis}/spx/.x/help/translate.log | 0 .../spx/.x/help/translate.microphone | 0 src/{ => clis}/spx/.x/help/translate.once | 0 src/{ => clis}/spx/.x/help/translate.output | 0 .../spx/.x/help/translate.output.all | 0 .../spx/.x/help/translate.output.all.file | 0 .../spx/.x/help/translate.output.batch | 0 .../spx/.x/help/translate.output.batch.file | 0 .../spx/.x/help/translate.output.batch.json | 0 .../spx/.x/help/translate.output.each | 0 .../spx/.x/help/translate.output.each.file | 0 .../spx/.x/help/translate.output.examples | 0 src/{ => clis}/spx/.x/help/translate.phrases | 0 .../spx/.x/help/translate.processes | 0 .../spx/.x/help/translate.profanity | 0 src/{ => clis}/spx/.x/help/translate.proxy | 0 src/{ => clis}/spx/.x/help/translate.region | 0 src/{ => clis}/spx/.x/help/translate.save | 0 src/{ => clis}/spx/.x/help/translate.threads | 0 src/{ => clis}/spx/.x/help/translate.token | 0 .../spx/.x/help/translate.transcript | 0 src/{ => clis}/spx/.x/help/translate.url | 0 src/{ => clis}/spx/.x/help/translate.urls | 0 .../spx/.x/help/translate.word.level.timing | 0 src/{ => clis}/spx/.x/help/translate.zip | 0 src/{ => clis}/spx/.x/help/tutorials | 0 src/{ => clis}/spx/.x/help/usage | 0 src/{ => clis}/spx/.x/help/webjob | 0 src/{ => clis}/spx/.x/help/webjob.advanced | 0 src/{ => clis}/spx/.x/help/webjob.connection | 0 src/{ => clis}/spx/.x/help/webjob.delete | 0 src/{ => clis}/spx/.x/help/webjob.download | 0 src/{ => clis}/spx/.x/help/webjob.endpoint | 0 src/{ => clis}/spx/.x/help/webjob.examples | 0 src/{ => clis}/spx/.x/help/webjob.execution | 0 src/{ => clis}/spx/.x/help/webjob.foreach | 0 src/{ => clis}/spx/.x/help/webjob.list | 0 src/{ => clis}/spx/.x/help/webjob.list.jobs | 0 src/{ => clis}/spx/.x/help/webjob.password | 0 src/{ => clis}/spx/.x/help/webjob.resources | 0 src/{ => clis}/spx/.x/help/webjob.results | 0 src/{ => clis}/spx/.x/help/webjob.run | 0 src/{ => clis}/spx/.x/help/webjob.setup | 0 src/{ => clis}/spx/.x/help/webjob.status | 0 src/{ => clis}/spx/.x/help/webjob.upload | 0 src/{ => clis}/spx/.x/help/websocket.messages | 0 src/{ => clis}/spx/.x/help/zip | 0 src/{ => clis}/spx/BuildCommon.targets | 0 .../spx/HowToCompileWithInternalSpeechSDK.md | 0 .../spx/HowToCompileWithPrivateSpeechSDK.md | 0 src/{ => clis}/spx/HowToRunEmbeddedSpeech.md | 0 src/{ => clis}/spx/LICENSE.txt | 0 ...tiveServices.Speech.CLI-Dependency.targets | 0 src/{ => clis}/spx/NuGet.Config | 0 src/{ => clis}/spx/Program_SPX.cs | 0 ...r publish spx-cli debug (linux-x64).pubxml | 0 ...lder publish spx-cli debug (osx-64).pubxml | 0 ...der publish spx-cli debug (win-x64).pubxml | 0 ...publish spx-cli release (linux-x64).pubxml | 0 ...er publish spx-cli release (osx-64).pubxml | 0 ...r publish spx-cli release (win-x64).pubxml | 0 src/{ => clis}/spx/THIRD_PARTY_NOTICE.txt | 0 src/{ => clis}/spx/app.manifest | 0 src/{ => clis}/spx/ci/Dockerfile | 0 src/{ => clis}/spx/ci/build-all.sh | 0 .../spx/ci/build-local-from-cmake-output.cmd | 0 .../ci/build-local-from-nuget-download.cmd | 0 .../spx/ci/help-topic-crosscheck.sh | 0 src/{ => clis}/spx/ci/spx-build-pipeline.yml | 0 src/{ => clis}/spx/ci/spx-test-pipeline.yml | 0 .../commands/base/recognize_commands_base.cs | 0 src/{ => clis}/spx/commands/batch_command.cs | 0 .../custom_speech_recognition_command.cs | 0 src/{ => clis}/spx/commands/dialog_command.cs | 0 src/{ => clis}/spx/commands/intent_command.cs | 0 .../commands/parsers/batch_command_parser.cs | 0 .../commands/parsers/bot_command_parser.cs | 0 .../parsers/common_output_token_parsers.cs | 0 .../parsers/common_speech_token_parsers.cs | 0 ...ustom_speech_recognition_command_parser.cs | 0 .../commands/parsers/dialog_command_parser.cs | 0 .../commands/parsers/intent_command_parser.cs | 0 .../parsers/profile_command_parser.cs | 0 .../parsers/recognize_command_parser.cs | 0 .../parsers/synthesize_command_parser.cs | 0 .../transcribe_conversation_command_parser.cs | 0 .../parsers/translate_command_parser.cs | 0 .../commands/parsers/webjob_command_parser.cs | 0 .../spx/commands/profile_command.cs | 0 .../spx/commands/recognize_command.cs | 0 .../spx/commands/synthesize_command.cs | 0 .../transcribe_conversation_command.cs | 0 .../spx/commands/translate_command.cs | 0 src/{ => clis}/spx/commands/webjob_command.cs | 0 src/{ => clis}/spx/helpers/audio_helpers.cs | 0 src/{ => clis}/spx/helpers/caption_helper.cs | 0 src/{ => clis}/spx/helpers/config_helpers.cs | 0 .../spx/helpers/connection_helpers.cs | 0 src/{ => clis}/spx/helpers/display_helpers.cs | 0 .../spx/helpers/event_logger_helpers.cs | 0 src/{ => clis}/spx/helpers/output_helper.cs | 0 src/{ => clis}/spx/helpers/wer_helpers.cs | 0 .../spx/images/SPX_Build_Variables.jpg | Bin src/{ => clis}/spx/packages.lock.json | 0 src/{ => clis}/spx/spx-cli.csproj | 0 src/{ => clis}/spx/spx-cli.sln | 0 src/{ => clis}/spx/spx.dev.new.todo.md | 0 src/{ => clis}/spx/tests/audio_and_trans.zip | Bin src/{ => clis}/spx/tests/check-all.cmd | 0 src/{ => clis}/spx/tests/check-batch.cmd | 0 src/{ => clis}/spx/tests/check-cli.cmd | 0 src/{ => clis}/spx/tests/check-csr.cmd | 0 src/{ => clis}/spx/tests/check-help.cmd | 0 .../spx/tests/check-stress-test.cmd | 0 .../config/config.local.name227266.1.set.test | 0 ....name227266.1.set.test.run.output.expected | 0 .../config/config.local.name227266.2.get.test | 0 ....name227266.2.get.test.run.output.expected | 0 .../config.local.name227266.3.find.test | 0 ...name227266.3.find.test.run.output.expected | 0 .../config/config.local.name227266.4.add.test | 0 ....name227266.4.add.test.run.output.expected | 0 .../config.local.name227266.5.clear.test | 0 ...ame227266.5.clear.test.run.output.expected | 0 .../cli/commands/config/config.usage.test | 0 .../config.usage.test.run.output.expected | 0 .../webjob.download.name.id.request.test | 0 ...oad.name.id.request.test.run.output.expect | 0 .../webjob/webjob.download.name.request.test | 0 ...wnload.name.request.test.run.output.expect | 0 .../webjob/webjob.download.null.request.test | 0 ...wnload.null.request.test.run.output.expect | 0 .../webjob.list.job.run.files.request.test | 0 ...b.run.files.request.test.run.output.expect | 0 .../webjob/webjob.list.job.runs.request.test | 0 ...st.job.runs.request.test.run.output.expect | 0 .../webjob/webjob.list.jobs.request.test | 0 ...b.list.jobs.request.test.run.output.expect | 0 .../commands/webjob/webjob.run.request.test | 0 .../webjob.run.request.test.run.output.expect | 0 .../webjob/webjob.status.request.test | 0 ...bjob.status.request.test.run.output.expect | 0 ...pload.request.step1.test.run.output.expect | 0 .../webjob.upload.request.step1.test.skip | 0 ...pload.request.step2.test.run.output.expect | 0 .../webjob.upload.request.step2.test.skip | 0 .../recognize.hello.path.term.dtor.test | 0 ...or.test.x.command.diagnostics.log.expected | 0 .../translate.hello.path.term.dtor.test | 0 ...dtor.test.x.command.diagnostics.log.expect | 0 src/{ => clis}/spx/tests/pronunciation.txt | 0 src/{ => clis}/spx/tests/related_text.txt | 0 src/{ => clis}/spx/tests/sentences.txt | 0 src/{ => clis}/spx/tests/stress-text.txt | 0 src/{ => clis}/spx/tests/test | 0 src/{ => clis}/spx/tests/test.batch | 0 .../spx/tests/test.batch.transcription.1.job | 0 .../spx/tests/test.batch.transcription.2.job | 0 ...tch.transcription.2.job.foreach.0.tsv.file | 0 .../spx/tests/test.config.clear.test.1.job | 0 .../spx/tests/test.config.clear.test.2.job | 0 .../spx/tests/test.config.clear.test.3.job | 0 .../spx/tests/test.config.clear.test.4.job | 0 .../spx/tests/test.config.find.1.job | 0 .../spx/tests/test.config.find.2.job | 0 .../spx/tests/test.config.find.3.job | 0 .../spx/tests/test.config.find.4.job | 0 .../spx/tests/test.config.find.5.job | 0 .../spx/tests/test.config.find.6.job | 0 .../spx/tests/test.config.find.7.job | 0 .../spx/tests/test.foreach.stress.tsv.file | 0 src/{ => clis}/spx/tests/test.intent.1.job | 0 src/{ => clis}/spx/tests/test.intent.2.job | 0 src/{ => clis}/spx/tests/test.intent.3.job | 0 src/{ => clis}/spx/tests/test.intent.4.job | 0 .../spx/tests/test.intent.setup.ChangeReco | 0 src/{ => clis}/spx/tests/test.stress | 0 .../spx/tests/test.stress.recognize.1.job | 0 .../spx/tests/test.stress.synthesize.1.job | 0 ...stress.synthesize.1.job.foreach.0.tsv.file | 0 .../spx/tests/test.stress.translate.1.job | 0 src/{ => clis}/spx/tests/test.tsv | 0 ...test.of.the.emergency.broadcast.system.txt | 0 src/{ => clis}/spx/tests/this.is.a.test.txt | 0 src/{ => clis}/spx/todo.md | 0 src/{ => clis}/vz/.x/config/connection | 0 .../vz/.x/config/connection.from.endpoint | 0 .../vz/.x/config/connection.from.host | 0 .../vz/.x/config/connection.from.region | 0 src/{ => clis}/vz/.x/config/default.log | 0 src/{ => clis}/vz/.x/config/default.path | 0 src/{ => clis}/vz/.x/config/defaults | 0 src/{ => clis}/vz/.x/config/endpoint | 0 src/{ => clis}/vz/.x/config/fiddler | 0 src/{ => clis}/vz/.x/config/host | 0 .../vz/.x/config/image.default.config | 0 .../vz/.x/config/image.default.connection | 0 .../vz/.x/config/image.default.output | 0 .../vz/.x/config/image.output.all.standard | 0 src/{ => clis}/vz/.x/config/image.region | 0 .../vz/.x/config/init.default.config | 0 .../vz/.x/config/init.default.output | 0 src/{ => clis}/vz/.x/config/input.path | 0 src/{ => clis}/vz/.x/config/key | 0 src/{ => clis}/vz/.x/config/log.pid | 0 src/{ => clis}/vz/.x/config/log.time | 0 src/{ => clis}/vz/.x/config/log.time.pid | 0 src/{ => clis}/vz/.x/config/my.defaults | 0 src/{ => clis}/vz/.x/config/none | 0 src/{ => clis}/vz/.x/config/output | 0 .../vz/.x/config/output.all.standard | 0 .../vz/.x/config/person.default.config | 0 .../vz/.x/config/person.default.connection | 0 .../vz/.x/config/person.default.output | 0 .../vz/.x/config/person.output.all.standard | 0 src/{ => clis}/vz/.x/config/region | 0 .../vz/.x/config/run.default.config | 0 src/{ => clis}/vz/.x/config/vz.defaults | 0 src/{ => clis}/vz/.x/help/config | 0 src/{ => clis}/vz/.x/help/config.add | 0 src/{ => clis}/vz/.x/help/config.advanced | 0 src/{ => clis}/vz/.x/help/config.clear | 0 src/{ => clis}/vz/.x/help/config.command | 0 src/{ => clis}/vz/.x/help/config.examples | 0 src/{ => clis}/vz/.x/help/config.find | 0 src/{ => clis}/vz/.x/help/config.hive | 0 src/{ => clis}/vz/.x/help/config.region | 0 src/{ => clis}/vz/.x/help/config.scope | 0 src/{ => clis}/vz/.x/help/config.set | 0 src/{ => clis}/vz/.x/help/documentation | 0 src/{ => clis}/vz/.x/help/endpoint | 0 src/{ => clis}/vz/.x/help/examples | 0 src/{ => clis}/vz/.x/help/face | 0 src/{ => clis}/vz/.x/help/face.identify | 0 .../vz/.x/help/face.identify.examples | 0 src/{ => clis}/vz/.x/help/face.verify | 0 .../vz/.x/help/face.verify.examples | 0 src/{ => clis}/vz/.x/help/help | 0 src/{ => clis}/vz/.x/help/hive | 0 src/{ => clis}/vz/.x/help/image | 0 src/{ => clis}/vz/.x/help/image.analyze | 0 .../vz/.x/help/image.analyze.examples | 0 src/{ => clis}/vz/.x/help/image.read | 0 src/{ => clis}/vz/.x/help/image.read.examples | 0 .../vz/.x/help/include.create.resource | 0 .../vz/.x/help/include.create.resource.extra | 0 .../.x/help/include.the.azure.vision.service | 0 .../include.the.azure.vision.service.long | 0 .../vz/.x/help/include.the.config.command | 0 .../vz/.x/help/include.the.face.command.long | 0 .../.x/help/include.the.face.identify.command | 0 .../include.the.face.identify.command.long | 0 .../.x/help/include.the.face.verify.command | 0 .../help/include.the.face.verify.command.long | 0 .../.x/help/include.the.image.analyze.command | 0 .../include.the.image.analyze.command.long | 0 .../vz/.x/help/include.the.image.command.long | 0 .../vz/.x/help/include.the.image.read.command | 0 .../help/include.the.image.read.command.long | 0 .../vz/.x/help/include.the.init.command.long | 0 .../vz/.x/help/include.the.key.option | 0 .../vz/.x/help/include.the.key.option.where | 0 .../vz/.x/help/include.the.log.option | 0 .../.x/help/include.the.person.create.command | 0 .../.x/help/include.the.person.delete.command | 0 .../help/include.the.person.face.add.command | 0 .../include.the.person.face.delete.command | 0 .../help/include.the.person.face.list.command | 0 .../include.the.person.face.update.command | 0 .../include.the.person.group.create.command | 0 .../include.the.person.group.delete.command | 0 .../include.the.person.group.list.command | 0 .../include.the.person.group.status.command | 0 .../include.the.person.group.train.command | 0 .../include.the.person.group.update.command | 0 .../.x/help/include.the.person.list.command | 0 .../.x/help/include.the.person.update.command | 0 .../vz/.x/help/include.the.region.option | 0 .../.x/help/include.the.region.option.where | 0 .../vz/.x/help/include.the.run.command | 0 .../vz/.x/help/include.the.save.option | 0 .../vz/.x/help/include.the.token.option | 0 .../vz/.x/help/include.the.token.option.where | 0 .../vz/.x/help/include.the.zip.option | 0 .../vz/.x/help/include.vz.ascii.logo | 0 .../vz/.x/help/include.vz.init.ascii.logo | 0 src/{ => clis}/vz/.x/help/init | 0 src/{ => clis}/vz/.x/help/init.advanced | 0 src/{ => clis}/vz/.x/help/init.examples | 0 src/{ => clis}/vz/.x/help/key | 0 src/{ => clis}/vz/.x/help/key.overview | 0 src/{ => clis}/vz/.x/help/person | 0 src/{ => clis}/vz/.x/help/person.create | 0 .../vz/.x/help/person.create.advanced | 0 src/{ => clis}/vz/.x/help/person.delete | 0 .../vz/.x/help/person.delete.advanced | 0 src/{ => clis}/vz/.x/help/person.examples | 0 src/{ => clis}/vz/.x/help/person.face | 0 src/{ => clis}/vz/.x/help/person.face.add | 0 .../vz/.x/help/person.face.add.advanced | 0 src/{ => clis}/vz/.x/help/person.face.delete | 0 .../vz/.x/help/person.face.delete.advanced | 0 src/{ => clis}/vz/.x/help/person.face.list | 0 .../vz/.x/help/person.face.list.advanced | 0 src/{ => clis}/vz/.x/help/person.face.update | 0 .../vz/.x/help/person.face.update.advanced | 0 src/{ => clis}/vz/.x/help/person.group | 0 src/{ => clis}/vz/.x/help/person.group.create | 0 .../vz/.x/help/person.group.create.advanced | 0 src/{ => clis}/vz/.x/help/person.group.delete | 0 .../vz/.x/help/person.group.delete.advanced | 0 src/{ => clis}/vz/.x/help/person.group.list | 0 .../vz/.x/help/person.group.list.advanced | 0 src/{ => clis}/vz/.x/help/person.group.status | 0 .../vz/.x/help/person.group.status.advanced | 0 src/{ => clis}/vz/.x/help/person.group.train | 0 .../vz/.x/help/person.group.train.advanced | 0 src/{ => clis}/vz/.x/help/person.group.update | 0 .../vz/.x/help/person.group.update.advanced | 0 src/{ => clis}/vz/.x/help/person.list | 0 .../vz/.x/help/person.list.advanced | 0 src/{ => clis}/vz/.x/help/person.update | 0 .../vz/.x/help/person.update.advanced | 0 src/{ => clis}/vz/.x/help/region | 0 src/{ => clis}/vz/.x/help/region.overview | 0 src/{ => clis}/vz/.x/help/run | 0 src/{ => clis}/vz/.x/help/run.advanced | 0 src/{ => clis}/vz/.x/help/run.examples | 0 src/{ => clis}/vz/.x/help/setup | 0 src/{ => clis}/vz/.x/help/usage | 0 src/{ => clis}/vz/BuildCommon.targets | 0 src/{ => clis}/vz/LICENSE.txt | 0 src/{ => clis}/vz/NuGet.Config | 0 src/{ => clis}/vz/Program_VZ.cs | 0 ...er publish vz-cli debug (linux-x64).pubxml | 0 ...older publish vz-cli debug (osx-64).pubxml | 0 ...lder publish vz-cli debug (win-x64).pubxml | 0 ... publish vz-cli release (linux-x64).pubxml | 0 ...der publish vz-cli release (osx-64).pubxml | 0 ...er publish vz-cli release (win-x64).pubxml | 0 .../vz/Properties/launchSettings.json | 0 src/{ => clis}/vz/THIRD_PARTY_NOTICE.txt | 0 src/{ => clis}/vz/app.manifest | 0 src/{ => clis}/vz/ci/build-all.cmd | 0 src/{ => clis}/vz/ci/build-all.sh | 0 src/{ => clis}/vz/ci/build-linux-x64.cmd | 0 src/{ => clis}/vz/ci/build-win-x64.cmd | 0 src/{ => clis}/vz/ci/publish-linux-x64.cmd | 0 src/{ => clis}/vz/ci/publish-win-x64.cmd | 0 src/{ => clis}/vz/ci/vz-build-pipeline.yml | 0 src/{ => clis}/vz/ci/vz-test-pipeline.yml | 0 src/{ => clis}/vz/commands/face_command.cs | 0 src/{ => clis}/vz/commands/image_command.cs | 0 .../parsers/common_vision_token_parsers.cs | 0 .../commands/parsers/face_command_parser.cs | 0 .../commands/parsers/image_command_parser.cs | 0 .../commands/parsers/person_command_parser.cs | 0 src/{ => clis}/vz/commands/person_command.cs | 0 src/{ => clis}/vz/face.cli.person.ideas.md | 0 src/{ => clis}/vz/helpers/display_helpers.cs | 0 .../vz/helpers/event_logger_helpers.cs | 0 src/{ => clis}/vz/packages.lock.json | 0 src/{ => clis}/vz/tests/check-all.cmd | 0 src/{ => clis}/vz/tests/check-cli.cmd | 0 .../vz/tests/cli/base/help.documentation.test | 0 ...elp.documentation.test.run.output.expected | 0 .../vz/tests/cli/base/help.examples.test | 0 .../help.examples.test.run.output.expected | 0 .../vz/tests/cli/base/help.setup.test | 0 .../base/help.setup.test.run.output.expected | 0 src/{ => clis}/vz/tests/cli/base/help.test | 0 .../cli/base/help.test.run.output.expected | 0 src/{ => clis}/vz/tests/cli/base/usage.test | 0 .../cli/base/usage.test.run.output.expected | 0 .../config/config.local.name227266.1.set.test | 0 ....name227266.1.set.test.run.output.expected | 0 .../config/config.local.name227266.2.get.test | 0 ....name227266.2.get.test.run.output.expected | 0 .../config.local.name227266.3.find.test | 0 ...name227266.3.find.test.run.output.expected | 0 .../config/config.local.name227266.4.add.test | 0 ....name227266.4.add.test.run.output.expected | 0 .../config.local.name227266.5.clear.test | 0 ...ame227266.5.clear.test.run.output.expected | 0 .../cli/commands/config/config.usage.test | 0 .../config.usage.test.run.output.expected | 0 src/{ => clis}/vz/vz-cli.csproj | 0 .../testframework/IYamlTestFrameworkHost.cs | 0 .../extensions}/testframework/Logger.cs | 0 .../testframework/Properties/AssemblyInfo.cs | 0 .../testframework/TestResultHelpers.cs | 0 .../extensions}/testframework/YamlHelpers.cs | 0 .../testframework/YamlNodeExtensions.cs | 0 .../testframework/YamlTagHelpers.cs | 0 .../testframework/YamlTestCaseFilter.cs | 0 .../testframework/YamlTestCaseParseContext.cs | 0 .../testframework/YamlTestCaseParser.cs | 0 .../testframework/YamlTestCaseRunner.cs | 0 .../testframework/YamlTestFramework.cs | 0 .../testframework/YamlTestFramework.csproj | 2 +- .../YamlTestFrameworkCommon.targets | 0 .../testframework/YamlTestProperties.cs | 0 .../adapters}/recordingadapter/README.md | 4 +-- .../RecordedTestAdapterTest.runsettings | 0 .../RecordedTestDiscoverer.cs | 0 .../recordingadapter/RecordedTestExecutor.cs | 0 .../recordingadapter/RecordedTestMode.cs | 0 .../recordingadapter/RecordedTestObserver.cs | 0 .../RecordedYamlTestAdapter.cs | 0 .../RecordedYamlTestAdapter.csproj | 2 +- .../RecordedYamlTestAdapterCommon.targets | 0 .../RecordedYamlTestRunnerTriggerAttribute.cs | 0 .../recordingadapter/TestProxyClient.cs | 0 .../testing/adapters}/recordproxy/Dockerfile | 0 .../adapters}/recordproxy/Dockerfile.base | 0 .../adapters}/recordproxy/dev_insall.cmd | 0 .../testing/adapters}/recordproxy/headers.lua | 0 .../adapters}/recordproxy/issue_cert.sh | 0 .../testing/adapters}/recordproxy/nginx.conf | 0 .../adapters}/recordproxy/openssl-ca.conf | 0 .../testing/adapters}/recordproxy/storage.lua | 0 .../testadapter/Properties/AssemblyInfo.cs | 0 .../testing/adapters}/testadapter/README.md | 24 +++++++++--------- .../testadapter/TestAdapterTest.runsettings | 0 .../adapters}/testadapter/TestDiscoverer.cs | 0 .../adapters}/testadapter/TestExecutor.cs | 0 .../adapters}/testadapter/YamlTestAdapter.cs | 0 .../testadapter/YamlTestAdapter.csproj | 2 +- .../testadapter/YamlTestAdapterCommon.targets | 0 .../YamlTestFrameworkHandleHost.cs | 0 .../YamlTestRunnerTriggerAttribute.cs | 0 .../testing/runner}/Program.cs | 0 .../runner}/Properties/AssemblyInfo.cs | 0 .../runner}/Properties/launchSettings.json | 0 .../runner}/YamlTestFrameworkConsoleHost.cs | 0 .../testing/runner}/YamlTestRunner.csproj | 2 +- .../runner}/YamlTestRunnerCommon.targets | 0 .../BuildCommon.targets | 0 .../PersonAgeFunctionHelperTest.cs | 0 .../test_helper_functions_extension.csproj | 4 +-- 1085 files changed, 28 insertions(+), 27 deletions(-) rename src/{ => clis}/spx/.x/config/batch.default.config (100%) rename src/{ => clis}/spx/.x/config/batch.default.connection (100%) rename src/{ => clis}/spx/.x/config/batch.default.output (100%) rename src/{ => clis}/spx/.x/config/connection (100%) rename src/{ => clis}/spx/.x/config/connection.from.endpoint (100%) rename src/{ => clis}/spx/.x/config/connection.from.host (100%) rename src/{ => clis}/spx/.x/config/connection.from.region (100%) rename src/{ => clis}/spx/.x/config/csr.default.config (100%) rename src/{ => clis}/spx/.x/config/csr.default.connection (100%) rename src/{ => clis}/spx/.x/config/csr.default.output (100%) rename src/{ => clis}/spx/.x/config/default.log (100%) rename src/{ => clis}/spx/.x/config/default.path (100%) rename src/{ => clis}/spx/.x/config/defaults (100%) rename src/{ => clis}/spx/.x/config/dialog.default.config (100%) rename src/{ => clis}/spx/.x/config/dialog.default.connection (100%) rename src/{ => clis}/spx/.x/config/dialog.default.output (100%) rename src/{ => clis}/spx/.x/config/endpoint (100%) rename src/{ => clis}/spx/.x/config/fiddler (100%) rename src/{ => clis}/spx/.x/config/host (100%) rename src/{ => clis}/spx/.x/config/identify.default.config (100%) rename src/{ => clis}/spx/.x/config/identify.default.connection (100%) rename src/{ => clis}/spx/.x/config/identify.default.output (100%) rename src/{ => clis}/spx/.x/config/init.default.config (100%) rename src/{ => clis}/spx/.x/config/init.default.output (100%) rename src/{ => clis}/spx/.x/config/input.path (100%) rename src/{ => clis}/spx/.x/config/intent.default.config (100%) rename src/{ => clis}/spx/.x/config/intent.default.connection (100%) rename src/{ => clis}/spx/.x/config/intent.default.output (100%) rename src/{ => clis}/spx/.x/config/key (100%) rename src/{ => clis}/spx/.x/config/language (100%) rename src/{ => clis}/spx/.x/config/log.pid (100%) rename src/{ => clis}/spx/.x/config/log.time (100%) rename src/{ => clis}/spx/.x/config/log.time.pid (100%) rename src/{ => clis}/spx/.x/config/my.defaults (100%) rename src/{ => clis}/spx/.x/config/none (100%) rename src/{ => clis}/spx/.x/config/output (100%) rename src/{ => clis}/spx/.x/config/output.all.detailed (100%) rename src/{ => clis}/spx/.x/config/output.all.latency (100%) rename src/{ => clis}/spx/.x/config/output.all.standard (100%) rename src/{ => clis}/spx/.x/config/output.all.transcript.display (100%) rename src/{ => clis}/spx/.x/config/output.all.transcript.lexical (100%) rename src/{ => clis}/spx/.x/config/output.each.detailed (100%) rename src/{ => clis}/spx/.x/config/output.each.event (100%) rename src/{ => clis}/spx/.x/config/output.each.latency (100%) rename src/{ => clis}/spx/.x/config/profile.default.config (100%) rename src/{ => clis}/spx/.x/config/profile.default.connection (100%) rename src/{ => clis}/spx/.x/config/profile.default.output (100%) rename src/{ => clis}/spx/.x/config/recognize.default.config (100%) rename src/{ => clis}/spx/.x/config/recognize.default.connection (100%) rename src/{ => clis}/spx/.x/config/recognize.default.output (100%) rename src/{ => clis}/spx/.x/config/region (100%) rename src/{ => clis}/spx/.x/config/run.default.config (100%) rename src/{ => clis}/spx/.x/config/speaker.default.config (100%) rename src/{ => clis}/spx/.x/config/speaker.default.connection (100%) rename src/{ => clis}/spx/.x/config/speaker.default.output (100%) rename src/{ => clis}/spx/.x/config/spx.defaults (100%) rename src/{ => clis}/spx/.x/config/synthesize.default.config (100%) rename src/{ => clis}/spx/.x/config/synthesize.default.connection (100%) rename src/{ => clis}/spx/.x/config/synthesize.default.output (100%) rename src/{ => clis}/spx/.x/config/synthesize.output.all.standard (100%) rename src/{ => clis}/spx/.x/config/transcribe.default.config (100%) rename src/{ => clis}/spx/.x/config/transcribe.default.connection (100%) rename src/{ => clis}/spx/.x/config/transcribe.default.output (100%) rename src/{ => clis}/spx/.x/config/translate.default.config (100%) rename src/{ => clis}/spx/.x/config/translate.default.connection (100%) rename src/{ => clis}/spx/.x/config/translate.default.output (100%) rename src/{ => clis}/spx/.x/config/translate.output.all.translated.text (100%) rename src/{ => clis}/spx/.x/config/translate.output.each.translated.text (100%) rename src/{ => clis}/spx/.x/config/webjob.default.config (100%) rename src/{ => clis}/spx/.x/config/webjob.default.connection (100%) rename src/{ => clis}/spx/.x/config/webjob.endpoint (100%) rename src/{ => clis}/spx/.x/config/webjob.password (100%) rename src/{ => clis}/spx/.x/help/advanced.setup (100%) rename src/{ => clis}/spx/.x/help/batch (100%) rename src/{ => clis}/spx/.x/help/batch.connection (100%) rename src/{ => clis}/spx/.x/help/batch.download (100%) rename src/{ => clis}/spx/.x/help/batch.download.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.download.file (100%) rename src/{ => clis}/spx/.x/help/batch.download.output.file (100%) rename src/{ => clis}/spx/.x/help/batch.download.url (100%) rename src/{ => clis}/spx/.x/help/batch.examples (100%) rename src/{ => clis}/spx/.x/help/batch.foreach (100%) rename src/{ => clis}/spx/.x/help/batch.input.path (100%) rename src/{ => clis}/spx/.x/help/batch.key (100%) rename src/{ => clis}/spx/.x/help/batch.list (100%) rename src/{ => clis}/spx/.x/help/batch.list.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.output (100%) rename src/{ => clis}/spx/.x/help/batch.output.id (100%) rename src/{ => clis}/spx/.x/help/batch.output.ids (100%) rename src/{ => clis}/spx/.x/help/batch.output.json (100%) rename src/{ => clis}/spx/.x/help/batch.output.path (100%) rename src/{ => clis}/spx/.x/help/batch.output.request (100%) rename src/{ => clis}/spx/.x/help/batch.output.url (100%) rename src/{ => clis}/spx/.x/help/batch.output.urls (100%) rename src/{ => clis}/spx/.x/help/batch.processes (100%) rename src/{ => clis}/spx/.x/help/batch.region (100%) rename src/{ => clis}/spx/.x/help/batch.save (100%) rename src/{ => clis}/spx/.x/help/batch.threads (100%) rename src/{ => clis}/spx/.x/help/batch.transcription (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.content (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.dataset (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.diarization (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.language (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.model (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.profanity.filter (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.properties (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.punctuation.mode (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.create.word.level.timing (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.delete (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.delete.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.description (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.download (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.download.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.examples (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.list (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.list.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.list.files (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.list.languages (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.list.transcriptions (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.more.examples (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.name (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.onprem (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.onprem.create (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.onprem.delete (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.onprem.endpoints (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.onprem.list (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.onprem.status (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.project (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.reference (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.status (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.status.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.update (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.update.advanced (100%) rename src/{ => clis}/spx/.x/help/batch.transcription.wait (100%) rename src/{ => clis}/spx/.x/help/batch.zip (100%) rename src/{ => clis}/spx/.x/help/check (100%) rename src/{ => clis}/spx/.x/help/check.advanced (100%) rename src/{ => clis}/spx/.x/help/check.examples (100%) rename src/{ => clis}/spx/.x/help/check.result (100%) rename src/{ => clis}/spx/.x/help/config (100%) rename src/{ => clis}/spx/.x/help/config.add (100%) rename src/{ => clis}/spx/.x/help/config.advanced (100%) rename src/{ => clis}/spx/.x/help/config.clear (100%) rename src/{ => clis}/spx/.x/help/config.command (100%) rename src/{ => clis}/spx/.x/help/config.examples (100%) rename src/{ => clis}/spx/.x/help/config.find (100%) rename src/{ => clis}/spx/.x/help/config.hive (100%) rename src/{ => clis}/spx/.x/help/config.region (100%) rename src/{ => clis}/spx/.x/help/config.scope (100%) rename src/{ => clis}/spx/.x/help/config.set (100%) rename src/{ => clis}/spx/.x/help/connect (100%) rename src/{ => clis}/spx/.x/help/continuous (100%) rename src/{ => clis}/spx/.x/help/conversation (100%) rename src/{ => clis}/spx/.x/help/conversation.id (100%) rename src/{ => clis}/spx/.x/help/csr (100%) rename src/{ => clis}/spx/.x/help/csr.dataset (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.create (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.create.content (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.create.kind (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.create.language (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.delete (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.delete.dataset (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.description (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.download (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.download.file (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.list (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.list.datasets (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.list.files (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.list.languages (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.list.project (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.name (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.project (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.status (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.status.dataset (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.update (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.update.dataset (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.upload (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.upload.data (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.upload.kind (100%) rename src/{ => clis}/spx/.x/help/csr.dataset.upload.language (100%) rename src/{ => clis}/spx/.x/help/csr.download (100%) rename src/{ => clis}/spx/.x/help/csr.download.dataset.file (100%) rename src/{ => clis}/spx/.x/help/csr.download.endpoint.log (100%) rename src/{ => clis}/spx/.x/help/csr.download.file (100%) rename src/{ => clis}/spx/.x/help/csr.download.url (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.create (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.create.language (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.create.model (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.create.text (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.delete (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.delete.endpoint (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.delete.endpoint.log (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.description (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.download (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.download.endpoint.log (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.examples (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.list (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.list.endpoint.languages (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.list.endpoint.logs (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.list.endpoints (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.list.project (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.name (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.project (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.status (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.status.endpoint (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.update (100%) rename src/{ => clis}/spx/.x/help/csr.endpoint.update.endpoint (100%) rename src/{ => clis}/spx/.x/help/csr.evaluation (100%) rename src/{ => clis}/spx/.x/help/csr.evaluation.create (100%) rename src/{ => clis}/spx/.x/help/csr.evaluation.delete (100%) rename src/{ => clis}/spx/.x/help/csr.evaluation.examples (100%) rename src/{ => clis}/spx/.x/help/csr.evaluation.list (100%) rename src/{ => clis}/spx/.x/help/csr.evaluation.status (100%) rename src/{ => clis}/spx/.x/help/csr.evaluation.update (100%) rename src/{ => clis}/spx/.x/help/csr.examples (100%) rename src/{ => clis}/spx/.x/help/csr.foreach (100%) rename src/{ => clis}/spx/.x/help/csr.input.path (100%) rename src/{ => clis}/spx/.x/help/csr.key (100%) rename src/{ => clis}/spx/.x/help/csr.list (100%) rename src/{ => clis}/spx/.x/help/csr.list.base.models (100%) rename src/{ => clis}/spx/.x/help/csr.list.dataset.languages (100%) rename src/{ => clis}/spx/.x/help/csr.list.datasets (100%) rename src/{ => clis}/spx/.x/help/csr.list.endpoint.languages (100%) rename src/{ => clis}/spx/.x/help/csr.list.endpoints (100%) rename src/{ => clis}/spx/.x/help/csr.list.model.languages (100%) rename src/{ => clis}/spx/.x/help/csr.list.models (100%) rename src/{ => clis}/spx/.x/help/csr.list.project.languages (100%) rename src/{ => clis}/spx/.x/help/csr.list.projects (100%) rename src/{ => clis}/spx/.x/help/csr.model (100%) rename src/{ => clis}/spx/.x/help/csr.model.copy (100%) rename src/{ => clis}/spx/.x/help/csr.model.copy.target (100%) rename src/{ => clis}/spx/.x/help/csr.model.create (100%) rename src/{ => clis}/spx/.x/help/csr.model.create.base (100%) rename src/{ => clis}/spx/.x/help/csr.model.create.dataset (100%) rename src/{ => clis}/spx/.x/help/csr.model.create.datasets (100%) rename src/{ => clis}/spx/.x/help/csr.model.create.language (100%) rename src/{ => clis}/spx/.x/help/csr.model.create.text (100%) rename src/{ => clis}/spx/.x/help/csr.model.delete (100%) rename src/{ => clis}/spx/.x/help/csr.model.delete.model (100%) rename src/{ => clis}/spx/.x/help/csr.model.description (100%) rename src/{ => clis}/spx/.x/help/csr.model.examples (100%) rename src/{ => clis}/spx/.x/help/csr.model.list (100%) rename src/{ => clis}/spx/.x/help/csr.model.list.base.models (100%) rename src/{ => clis}/spx/.x/help/csr.model.list.model.languages (100%) rename src/{ => clis}/spx/.x/help/csr.model.list.model.project (100%) rename src/{ => clis}/spx/.x/help/csr.model.list.models (100%) rename src/{ => clis}/spx/.x/help/csr.model.name (100%) rename src/{ => clis}/spx/.x/help/csr.model.project (100%) rename src/{ => clis}/spx/.x/help/csr.model.status (100%) rename src/{ => clis}/spx/.x/help/csr.model.status.model (100%) rename src/{ => clis}/spx/.x/help/csr.model.update (100%) rename src/{ => clis}/spx/.x/help/csr.model.update.model (100%) rename src/{ => clis}/spx/.x/help/csr.more.examples (100%) rename src/{ => clis}/spx/.x/help/csr.output.file (100%) rename src/{ => clis}/spx/.x/help/csr.output.id (100%) rename src/{ => clis}/spx/.x/help/csr.output.json (100%) rename src/{ => clis}/spx/.x/help/csr.output.path (100%) rename src/{ => clis}/spx/.x/help/csr.output.url (100%) rename src/{ => clis}/spx/.x/help/csr.project (100%) rename src/{ => clis}/spx/.x/help/csr.project.create (100%) rename src/{ => clis}/spx/.x/help/csr.project.create.language (100%) rename src/{ => clis}/spx/.x/help/csr.project.delete (100%) rename src/{ => clis}/spx/.x/help/csr.project.delete.project (100%) rename src/{ => clis}/spx/.x/help/csr.project.description (100%) rename src/{ => clis}/spx/.x/help/csr.project.examples (100%) rename src/{ => clis}/spx/.x/help/csr.project.list (100%) rename src/{ => clis}/spx/.x/help/csr.project.list.project.languages (100%) rename src/{ => clis}/spx/.x/help/csr.project.list.projects (100%) rename src/{ => clis}/spx/.x/help/csr.project.name (100%) rename src/{ => clis}/spx/.x/help/csr.project.status (100%) rename src/{ => clis}/spx/.x/help/csr.project.status.project (100%) rename src/{ => clis}/spx/.x/help/csr.project.update (100%) rename src/{ => clis}/spx/.x/help/csr.project.update.project (100%) rename src/{ => clis}/spx/.x/help/csr.region (100%) rename src/{ => clis}/spx/.x/help/csr.save (100%) rename src/{ => clis}/spx/.x/help/csr.url (100%) rename src/{ => clis}/spx/.x/help/csr.wait (100%) rename src/{ => clis}/spx/.x/help/csr.zip (100%) rename src/{ => clis}/spx/.x/help/customization (100%) rename src/{ => clis}/spx/.x/help/customize.categoryid (100%) rename src/{ => clis}/spx/.x/help/customize.endpointid (100%) rename src/{ => clis}/spx/.x/help/defaults (100%) rename src/{ => clis}/spx/.x/help/dialog (100%) rename src/{ => clis}/spx/.x/help/dialog.advanced (100%) rename src/{ => clis}/spx/.x/help/dialog.bot (100%) rename src/{ => clis}/spx/.x/help/dialog.bot.continuous (100%) rename src/{ => clis}/spx/.x/help/dialog.bot.id (100%) rename src/{ => clis}/spx/.x/help/dialog.bot.input (100%) rename src/{ => clis}/spx/.x/help/dialog.bot.keyword (100%) rename src/{ => clis}/spx/.x/help/dialog.bot.once (100%) rename src/{ => clis}/spx/.x/help/dialog.bot.output (100%) rename src/{ => clis}/spx/.x/help/dialog.cc (100%) rename src/{ => clis}/spx/.x/help/dialog.customcommands (100%) rename src/{ => clis}/spx/.x/help/dialog.customcommands.appid (100%) rename src/{ => clis}/spx/.x/help/dialog.customcommands.continuous (100%) rename src/{ => clis}/spx/.x/help/dialog.customcommands.input (100%) rename src/{ => clis}/spx/.x/help/dialog.customcommands.keyword (100%) rename src/{ => clis}/spx/.x/help/dialog.customcommands.once (100%) rename src/{ => clis}/spx/.x/help/dialog.customcommands.output (100%) rename src/{ => clis}/spx/.x/help/dialog.examples (100%) rename src/{ => clis}/spx/.x/help/display.post.processing (100%) rename src/{ => clis}/spx/.x/help/documentation (100%) rename src/{ => clis}/spx/.x/help/endpoint (100%) rename src/{ => clis}/spx/.x/help/endpoint.examples (100%) rename src/{ => clis}/spx/.x/help/examples (100%) rename src/{ => clis}/spx/.x/help/foreach (100%) rename src/{ => clis}/spx/.x/help/help (100%) rename src/{ => clis}/spx/.x/help/hive (100%) rename src/{ => clis}/spx/.x/help/include.create.resource (100%) rename src/{ => clis}/spx/.x/help/include.create.resource.extra (100%) rename src/{ => clis}/spx/.x/help/include.spx.ascii.logo (100%) rename src/{ => clis}/spx/.x/help/include.spx.init.ascii.logo (100%) rename src/{ => clis}/spx/.x/help/include.the.azure.speech.service (100%) rename src/{ => clis}/spx/.x/help/include.the.azure.speech.service.long (100%) rename src/{ => clis}/spx/.x/help/include.the.config.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.create.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.delete.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.download.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.list.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.status.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.update.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.dataset.upload.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.endpoint.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.endpoint.create.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.endpoint.delete.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.endpoint.download.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.endpoint.list.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.endpoint.status.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.endpoint.update.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.evaluation.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.evaluation.create.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.evaluation.delete.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.evaluation.list.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.evaluation.status.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.evaluation.update.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.model.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.model.copy.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.model.create.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.model.delete.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.model.status.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.model.update.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.project.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.project.create.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.project.delete.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.project.list.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.project.status.command (100%) rename src/{ => clis}/spx/.x/help/include.the.csr.project.update.command (100%) rename src/{ => clis}/spx/.x/help/include.the.dialog.command (100%) rename src/{ => clis}/spx/.x/help/include.the.dialog.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.init.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.intent.command (100%) rename src/{ => clis}/spx/.x/help/include.the.intent.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.intent.method (100%) rename src/{ => clis}/spx/.x/help/include.the.key.option (100%) rename src/{ => clis}/spx/.x/help/include.the.key.option.where (100%) rename src/{ => clis}/spx/.x/help/include.the.log.option (100%) rename src/{ => clis}/spx/.x/help/include.the.luis.option (100%) rename src/{ => clis}/spx/.x/help/include.the.model.list.command (100%) rename src/{ => clis}/spx/.x/help/include.the.profile.command (100%) rename src/{ => clis}/spx/.x/help/include.the.profile.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.recognize.command (100%) rename src/{ => clis}/spx/.x/help/include.the.recognize.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.recognize.method (100%) rename src/{ => clis}/spx/.x/help/include.the.region.option (100%) rename src/{ => clis}/spx/.x/help/include.the.region.option.where (100%) rename src/{ => clis}/spx/.x/help/include.the.run.command (100%) rename src/{ => clis}/spx/.x/help/include.the.save.option (100%) rename src/{ => clis}/spx/.x/help/include.the.speaker.command (100%) rename src/{ => clis}/spx/.x/help/include.the.speaker.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.synthesize.command (100%) rename src/{ => clis}/spx/.x/help/include.the.synthesize.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.token.option (100%) rename src/{ => clis}/spx/.x/help/include.the.token.option.where (100%) rename src/{ => clis}/spx/.x/help/include.the.translate.command (100%) rename src/{ => clis}/spx/.x/help/include.the.translate.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.webjob.command (100%) rename src/{ => clis}/spx/.x/help/include.the.webjob.command.long (100%) rename src/{ => clis}/spx/.x/help/include.the.zip.option (100%) rename src/{ => clis}/spx/.x/help/init (100%) rename src/{ => clis}/spx/.x/help/init.advanced (100%) rename src/{ => clis}/spx/.x/help/init.examples (100%) rename src/{ => clis}/spx/.x/help/input (100%) rename src/{ => clis}/spx/.x/help/input.id (100%) rename src/{ => clis}/spx/.x/help/intent (100%) rename src/{ => clis}/spx/.x/help/intent.advanced (100%) rename src/{ => clis}/spx/.x/help/intent.connection (100%) rename src/{ => clis}/spx/.x/help/intent.continuous (100%) rename src/{ => clis}/spx/.x/help/intent.endpoint (100%) rename src/{ => clis}/spx/.x/help/intent.examples (100%) rename src/{ => clis}/spx/.x/help/intent.file (100%) rename src/{ => clis}/spx/.x/help/intent.files (100%) rename src/{ => clis}/spx/.x/help/intent.foreach (100%) rename src/{ => clis}/spx/.x/help/intent.format (100%) rename src/{ => clis}/spx/.x/help/intent.input (100%) rename src/{ => clis}/spx/.x/help/intent.key (100%) rename src/{ => clis}/spx/.x/help/intent.keyword (100%) rename src/{ => clis}/spx/.x/help/intent.language (100%) rename src/{ => clis}/spx/.x/help/intent.languages (100%) rename src/{ => clis}/spx/.x/help/intent.log (100%) rename src/{ => clis}/spx/.x/help/intent.luis (100%) rename src/{ => clis}/spx/.x/help/intent.luis.allintents (100%) rename src/{ => clis}/spx/.x/help/intent.luis.intent (100%) rename src/{ => clis}/spx/.x/help/intent.luis.key (100%) rename src/{ => clis}/spx/.x/help/intent.luis.region (100%) rename src/{ => clis}/spx/.x/help/intent.microphone (100%) rename src/{ => clis}/spx/.x/help/intent.once (100%) rename src/{ => clis}/spx/.x/help/intent.output (100%) rename src/{ => clis}/spx/.x/help/intent.output.accuracy (100%) rename src/{ => clis}/spx/.x/help/intent.output.all (100%) rename src/{ => clis}/spx/.x/help/intent.output.all.example (100%) rename src/{ => clis}/spx/.x/help/intent.output.all.file (100%) rename src/{ => clis}/spx/.x/help/intent.output.all.files (100%) rename src/{ => clis}/spx/.x/help/intent.output.all.json (100%) rename src/{ => clis}/spx/.x/help/intent.output.all.timing (100%) rename src/{ => clis}/spx/.x/help/intent.output.batch (100%) rename src/{ => clis}/spx/.x/help/intent.output.each (100%) rename src/{ => clis}/spx/.x/help/intent.output.examples (100%) rename src/{ => clis}/spx/.x/help/intent.output.file (100%) rename src/{ => clis}/spx/.x/help/intent.output.text (100%) rename src/{ => clis}/spx/.x/help/intent.output.vtt (100%) rename src/{ => clis}/spx/.x/help/intent.output.wer (100%) rename src/{ => clis}/spx/.x/help/intent.pattern (100%) rename src/{ => clis}/spx/.x/help/intent.patterns (100%) rename src/{ => clis}/spx/.x/help/intent.phrases (100%) rename src/{ => clis}/spx/.x/help/intent.processes (100%) rename src/{ => clis}/spx/.x/help/intent.profanity (100%) rename src/{ => clis}/spx/.x/help/intent.proxy (100%) rename src/{ => clis}/spx/.x/help/intent.region (100%) rename src/{ => clis}/spx/.x/help/intent.save (100%) rename src/{ => clis}/spx/.x/help/intent.testing (100%) rename src/{ => clis}/spx/.x/help/intent.threads (100%) rename src/{ => clis}/spx/.x/help/intent.token (100%) rename src/{ => clis}/spx/.x/help/intent.transcript (100%) rename src/{ => clis}/spx/.x/help/intent.url (100%) rename src/{ => clis}/spx/.x/help/intent.urls (100%) rename src/{ => clis}/spx/.x/help/intent.wer (100%) rename src/{ => clis}/spx/.x/help/intent.zip (100%) rename src/{ => clis}/spx/.x/help/internal (100%) rename src/{ => clis}/spx/.x/help/key (100%) rename src/{ => clis}/spx/.x/help/key.overview (100%) rename src/{ => clis}/spx/.x/help/keyword (100%) rename src/{ => clis}/spx/.x/help/language (100%) rename src/{ => clis}/spx/.x/help/log (100%) rename src/{ => clis}/spx/.x/help/luis.documentation (100%) rename src/{ => clis}/spx/.x/help/microphone (100%) rename src/{ => clis}/spx/.x/help/once (100%) rename src/{ => clis}/spx/.x/help/output (100%) rename src/{ => clis}/spx/.x/help/output.all (100%) rename src/{ => clis}/spx/.x/help/output.each (100%) rename src/{ => clis}/spx/.x/help/phrases (100%) rename src/{ => clis}/spx/.x/help/profanity (100%) rename src/{ => clis}/spx/.x/help/profile (100%) rename src/{ => clis}/spx/.x/help/profile.connection (100%) rename src/{ => clis}/spx/.x/help/profile.create (100%) rename src/{ => clis}/spx/.x/help/profile.delete (100%) rename src/{ => clis}/spx/.x/help/profile.documentation (100%) rename src/{ => clis}/spx/.x/help/profile.enroll (100%) rename src/{ => clis}/spx/.x/help/profile.examples (100%) rename src/{ => clis}/spx/.x/help/profile.file (100%) rename src/{ => clis}/spx/.x/help/profile.id (100%) rename src/{ => clis}/spx/.x/help/profile.key (100%) rename src/{ => clis}/spx/.x/help/profile.kind (100%) rename src/{ => clis}/spx/.x/help/profile.list (100%) rename src/{ => clis}/spx/.x/help/profile.output (100%) rename src/{ => clis}/spx/.x/help/profile.output.file (100%) rename src/{ => clis}/spx/.x/help/profile.output.id (100%) rename src/{ => clis}/spx/.x/help/profile.output.json (100%) rename src/{ => clis}/spx/.x/help/profile.region (100%) rename src/{ => clis}/spx/.x/help/profile.status (100%) rename src/{ => clis}/spx/.x/help/proxy (100%) rename src/{ => clis}/spx/.x/help/query.string (100%) rename src/{ => clis}/spx/.x/help/recognize (100%) rename src/{ => clis}/spx/.x/help/recognize.advanced (100%) rename src/{ => clis}/spx/.x/help/recognize.check.text (100%) rename src/{ => clis}/spx/.x/help/recognize.check.wer (100%) rename src/{ => clis}/spx/.x/help/recognize.connect (100%) rename src/{ => clis}/spx/.x/help/recognize.connection (100%) rename src/{ => clis}/spx/.x/help/recognize.continuous (100%) rename src/{ => clis}/spx/.x/help/recognize.custom.speech (100%) rename src/{ => clis}/spx/.x/help/recognize.default.connection.example (100%) rename src/{ => clis}/spx/.x/help/recognize.disconnect (100%) rename src/{ => clis}/spx/.x/help/recognize.endpoint (100%) rename src/{ => clis}/spx/.x/help/recognize.examples (100%) rename src/{ => clis}/spx/.x/help/recognize.file (100%) rename src/{ => clis}/spx/.x/help/recognize.files (100%) rename src/{ => clis}/spx/.x/help/recognize.foreach (100%) rename src/{ => clis}/spx/.x/help/recognize.format (100%) rename src/{ => clis}/spx/.x/help/recognize.improve.accuracy (100%) rename src/{ => clis}/spx/.x/help/recognize.input (100%) rename src/{ => clis}/spx/.x/help/recognize.key (100%) rename src/{ => clis}/spx/.x/help/recognize.keyword (100%) rename src/{ => clis}/spx/.x/help/recognize.language (100%) rename src/{ => clis}/spx/.x/help/recognize.languages (100%) rename src/{ => clis}/spx/.x/help/recognize.log (100%) rename src/{ => clis}/spx/.x/help/recognize.microphone (100%) rename src/{ => clis}/spx/.x/help/recognize.once (100%) rename src/{ => clis}/spx/.x/help/recognize.output (100%) rename src/{ => clis}/spx/.x/help/recognize.output.all (100%) rename src/{ => clis}/spx/.x/help/recognize.output.all.file (100%) rename src/{ => clis}/spx/.x/help/recognize.output.batch (100%) rename src/{ => clis}/spx/.x/help/recognize.output.batch.file (100%) rename src/{ => clis}/spx/.x/help/recognize.output.batch.json (100%) rename src/{ => clis}/spx/.x/help/recognize.output.each (100%) rename src/{ => clis}/spx/.x/help/recognize.output.each.file (100%) rename src/{ => clis}/spx/.x/help/recognize.output.examples (100%) rename src/{ => clis}/spx/.x/help/recognize.output.vtt (100%) rename src/{ => clis}/spx/.x/help/recognize.phrases (100%) rename src/{ => clis}/spx/.x/help/recognize.processes (100%) rename src/{ => clis}/spx/.x/help/recognize.profanity (100%) rename src/{ => clis}/spx/.x/help/recognize.proxy (100%) rename src/{ => clis}/spx/.x/help/recognize.region (100%) rename src/{ => clis}/spx/.x/help/recognize.save (100%) rename src/{ => clis}/spx/.x/help/recognize.testing (100%) rename src/{ => clis}/spx/.x/help/recognize.threads (100%) rename src/{ => clis}/spx/.x/help/recognize.token (100%) rename src/{ => clis}/spx/.x/help/recognize.transcript (100%) rename src/{ => clis}/spx/.x/help/recognize.url (100%) rename src/{ => clis}/spx/.x/help/recognize.urls (100%) rename src/{ => clis}/spx/.x/help/recognize.wer (100%) rename src/{ => clis}/spx/.x/help/recognize.word.level.timing (100%) rename src/{ => clis}/spx/.x/help/recognize.zip (100%) rename src/{ => clis}/spx/.x/help/region (100%) rename src/{ => clis}/spx/.x/help/region.overview (100%) rename src/{ => clis}/spx/.x/help/run (100%) rename src/{ => clis}/spx/.x/help/run.advanced (100%) rename src/{ => clis}/spx/.x/help/run.csx (100%) rename src/{ => clis}/spx/.x/help/run.examples (100%) rename src/{ => clis}/spx/.x/help/setup (100%) rename src/{ => clis}/spx/.x/help/source (100%) rename src/{ => clis}/spx/.x/help/speaker (100%) rename src/{ => clis}/spx/.x/help/speaker.connection (100%) rename src/{ => clis}/spx/.x/help/speaker.documentation (100%) rename src/{ => clis}/spx/.x/help/speaker.examples (100%) rename src/{ => clis}/spx/.x/help/speaker.file (100%) rename src/{ => clis}/spx/.x/help/speaker.id (100%) rename src/{ => clis}/spx/.x/help/speaker.identify (100%) rename src/{ => clis}/spx/.x/help/speaker.key (100%) rename src/{ => clis}/spx/.x/help/speaker.kind (100%) rename src/{ => clis}/spx/.x/help/speaker.language (100%) rename src/{ => clis}/spx/.x/help/speaker.region (100%) rename src/{ => clis}/spx/.x/help/speaker.verify (100%) rename src/{ => clis}/spx/.x/help/synthesize (100%) rename src/{ => clis}/spx/.x/help/synthesize.advanced (100%) rename src/{ => clis}/spx/.x/help/synthesize.audio (100%) rename src/{ => clis}/spx/.x/help/synthesize.audio.output (100%) rename src/{ => clis}/spx/.x/help/synthesize.audio.speakers (100%) rename src/{ => clis}/spx/.x/help/synthesize.connection (100%) rename src/{ => clis}/spx/.x/help/synthesize.endpoint (100%) rename src/{ => clis}/spx/.x/help/synthesize.examples (100%) rename src/{ => clis}/spx/.x/help/synthesize.file (100%) rename src/{ => clis}/spx/.x/help/synthesize.files (100%) rename src/{ => clis}/spx/.x/help/synthesize.foreach (100%) rename src/{ => clis}/spx/.x/help/synthesize.format (100%) rename src/{ => clis}/spx/.x/help/synthesize.format.mp3 (100%) rename src/{ => clis}/spx/.x/help/synthesize.format.ogg (100%) rename src/{ => clis}/spx/.x/help/synthesize.format.opus (100%) rename src/{ => clis}/spx/.x/help/synthesize.format.raw (100%) rename src/{ => clis}/spx/.x/help/synthesize.format.siren (100%) rename src/{ => clis}/spx/.x/help/synthesize.format.wav (100%) rename src/{ => clis}/spx/.x/help/synthesize.format.webm (100%) rename src/{ => clis}/spx/.x/help/synthesize.input (100%) rename src/{ => clis}/spx/.x/help/synthesize.interactive (100%) rename src/{ => clis}/spx/.x/help/synthesize.key (100%) rename src/{ => clis}/spx/.x/help/synthesize.list.voices (100%) rename src/{ => clis}/spx/.x/help/synthesize.log (100%) rename src/{ => clis}/spx/.x/help/synthesize.mp3 (100%) rename src/{ => clis}/spx/.x/help/synthesize.ogg (100%) rename src/{ => clis}/spx/.x/help/synthesize.opus (100%) rename src/{ => clis}/spx/.x/help/synthesize.output (100%) rename src/{ => clis}/spx/.x/help/synthesize.output.all (100%) rename src/{ => clis}/spx/.x/help/synthesize.output.all.file (100%) rename src/{ => clis}/spx/.x/help/synthesize.output.each (100%) rename src/{ => clis}/spx/.x/help/synthesize.output.each.file (100%) rename src/{ => clis}/spx/.x/help/synthesize.output.examples (100%) rename src/{ => clis}/spx/.x/help/synthesize.processes (100%) rename src/{ => clis}/spx/.x/help/synthesize.proxy (100%) rename src/{ => clis}/spx/.x/help/synthesize.raw (100%) rename src/{ => clis}/spx/.x/help/synthesize.region (100%) rename src/{ => clis}/spx/.x/help/synthesize.save (100%) rename src/{ => clis}/spx/.x/help/synthesize.siren (100%) rename src/{ => clis}/spx/.x/help/synthesize.ssml (100%) rename src/{ => clis}/spx/.x/help/synthesize.text (100%) rename src/{ => clis}/spx/.x/help/synthesize.threads (100%) rename src/{ => clis}/spx/.x/help/synthesize.token (100%) rename src/{ => clis}/spx/.x/help/synthesize.url (100%) rename src/{ => clis}/spx/.x/help/synthesize.urls (100%) rename src/{ => clis}/spx/.x/help/synthesize.voice (100%) rename src/{ => clis}/spx/.x/help/synthesize.wav (100%) rename src/{ => clis}/spx/.x/help/synthesize.webm (100%) rename src/{ => clis}/spx/.x/help/synthesize.zip (100%) rename src/{ => clis}/spx/.x/help/target (100%) rename src/{ => clis}/spx/.x/help/token (100%) rename src/{ => clis}/spx/.x/help/traffic.type (100%) rename src/{ => clis}/spx/.x/help/transcribe (100%) rename src/{ => clis}/spx/.x/help/transcribe.advanced (100%) rename src/{ => clis}/spx/.x/help/transcribe.connect (100%) rename src/{ => clis}/spx/.x/help/transcribe.connection (100%) rename src/{ => clis}/spx/.x/help/transcribe.conversation.id (100%) rename src/{ => clis}/spx/.x/help/transcribe.endpoint (100%) rename src/{ => clis}/spx/.x/help/transcribe.examples (100%) rename src/{ => clis}/spx/.x/help/transcribe.file (100%) rename src/{ => clis}/spx/.x/help/transcribe.files (100%) rename src/{ => clis}/spx/.x/help/transcribe.foreach (100%) rename src/{ => clis}/spx/.x/help/transcribe.input (100%) rename src/{ => clis}/spx/.x/help/transcribe.key (100%) rename src/{ => clis}/spx/.x/help/transcribe.language (100%) rename src/{ => clis}/spx/.x/help/transcribe.log (100%) rename src/{ => clis}/spx/.x/help/transcribe.output (100%) rename src/{ => clis}/spx/.x/help/transcribe.output.all (100%) rename src/{ => clis}/spx/.x/help/transcribe.output.each (100%) rename src/{ => clis}/spx/.x/help/transcribe.phrases (100%) rename src/{ => clis}/spx/.x/help/transcribe.proxy (100%) rename src/{ => clis}/spx/.x/help/transcribe.region (100%) rename src/{ => clis}/spx/.x/help/transcribe.save (100%) rename src/{ => clis}/spx/.x/help/transcribe.source (100%) rename src/{ => clis}/spx/.x/help/transcribe.token (100%) rename src/{ => clis}/spx/.x/help/transcribe.zip (100%) rename src/{ => clis}/spx/.x/help/translate (100%) rename src/{ => clis}/spx/.x/help/translate.advanced (100%) rename src/{ => clis}/spx/.x/help/translate.check.text (100%) rename src/{ => clis}/spx/.x/help/translate.check.wer (100%) rename src/{ => clis}/spx/.x/help/translate.connect (100%) rename src/{ => clis}/spx/.x/help/translate.connection (100%) rename src/{ => clis}/spx/.x/help/translate.continuous (100%) rename src/{ => clis}/spx/.x/help/translate.custom.speech (100%) rename src/{ => clis}/spx/.x/help/translate.custom.translation (100%) rename src/{ => clis}/spx/.x/help/translate.disconnect (100%) rename src/{ => clis}/spx/.x/help/translate.endpoint (100%) rename src/{ => clis}/spx/.x/help/translate.examples (100%) rename src/{ => clis}/spx/.x/help/translate.file (100%) rename src/{ => clis}/spx/.x/help/translate.files (100%) rename src/{ => clis}/spx/.x/help/translate.foreach (100%) rename src/{ => clis}/spx/.x/help/translate.format (100%) rename src/{ => clis}/spx/.x/help/translate.input (100%) rename src/{ => clis}/spx/.x/help/translate.key (100%) rename src/{ => clis}/spx/.x/help/translate.keyword (100%) rename src/{ => clis}/spx/.x/help/translate.language (100%) rename src/{ => clis}/spx/.x/help/translate.log (100%) rename src/{ => clis}/spx/.x/help/translate.microphone (100%) rename src/{ => clis}/spx/.x/help/translate.once (100%) rename src/{ => clis}/spx/.x/help/translate.output (100%) rename src/{ => clis}/spx/.x/help/translate.output.all (100%) rename src/{ => clis}/spx/.x/help/translate.output.all.file (100%) rename src/{ => clis}/spx/.x/help/translate.output.batch (100%) rename src/{ => clis}/spx/.x/help/translate.output.batch.file (100%) rename src/{ => clis}/spx/.x/help/translate.output.batch.json (100%) rename src/{ => clis}/spx/.x/help/translate.output.each (100%) rename src/{ => clis}/spx/.x/help/translate.output.each.file (100%) rename src/{ => clis}/spx/.x/help/translate.output.examples (100%) rename src/{ => clis}/spx/.x/help/translate.phrases (100%) rename src/{ => clis}/spx/.x/help/translate.processes (100%) rename src/{ => clis}/spx/.x/help/translate.profanity (100%) rename src/{ => clis}/spx/.x/help/translate.proxy (100%) rename src/{ => clis}/spx/.x/help/translate.region (100%) rename src/{ => clis}/spx/.x/help/translate.save (100%) rename src/{ => clis}/spx/.x/help/translate.threads (100%) rename src/{ => clis}/spx/.x/help/translate.token (100%) rename src/{ => clis}/spx/.x/help/translate.transcript (100%) rename src/{ => clis}/spx/.x/help/translate.url (100%) rename src/{ => clis}/spx/.x/help/translate.urls (100%) rename src/{ => clis}/spx/.x/help/translate.word.level.timing (100%) rename src/{ => clis}/spx/.x/help/translate.zip (100%) rename src/{ => clis}/spx/.x/help/tutorials (100%) rename src/{ => clis}/spx/.x/help/usage (100%) rename src/{ => clis}/spx/.x/help/webjob (100%) rename src/{ => clis}/spx/.x/help/webjob.advanced (100%) rename src/{ => clis}/spx/.x/help/webjob.connection (100%) rename src/{ => clis}/spx/.x/help/webjob.delete (100%) rename src/{ => clis}/spx/.x/help/webjob.download (100%) rename src/{ => clis}/spx/.x/help/webjob.endpoint (100%) rename src/{ => clis}/spx/.x/help/webjob.examples (100%) rename src/{ => clis}/spx/.x/help/webjob.execution (100%) rename src/{ => clis}/spx/.x/help/webjob.foreach (100%) rename src/{ => clis}/spx/.x/help/webjob.list (100%) rename src/{ => clis}/spx/.x/help/webjob.list.jobs (100%) rename src/{ => clis}/spx/.x/help/webjob.password (100%) rename src/{ => clis}/spx/.x/help/webjob.resources (100%) rename src/{ => clis}/spx/.x/help/webjob.results (100%) rename src/{ => clis}/spx/.x/help/webjob.run (100%) rename src/{ => clis}/spx/.x/help/webjob.setup (100%) rename src/{ => clis}/spx/.x/help/webjob.status (100%) rename src/{ => clis}/spx/.x/help/webjob.upload (100%) rename src/{ => clis}/spx/.x/help/websocket.messages (100%) rename src/{ => clis}/spx/.x/help/zip (100%) rename src/{ => clis}/spx/BuildCommon.targets (100%) rename src/{ => clis}/spx/HowToCompileWithInternalSpeechSDK.md (100%) rename src/{ => clis}/spx/HowToCompileWithPrivateSpeechSDK.md (100%) rename src/{ => clis}/spx/HowToRunEmbeddedSpeech.md (100%) rename src/{ => clis}/spx/LICENSE.txt (100%) rename src/{ => clis}/spx/Microsoft.CognitiveServices.Speech.CLI-Dependency.targets (100%) rename src/{ => clis}/spx/NuGet.Config (100%) rename src/{ => clis}/spx/Program_SPX.cs (100%) rename src/{ => clis}/spx/Properties/PublishProfiles/folder publish spx-cli debug (linux-x64).pubxml (100%) rename src/{ => clis}/spx/Properties/PublishProfiles/folder publish spx-cli debug (osx-64).pubxml (100%) rename src/{ => clis}/spx/Properties/PublishProfiles/folder publish spx-cli debug (win-x64).pubxml (100%) rename src/{ => clis}/spx/Properties/PublishProfiles/folder publish spx-cli release (linux-x64).pubxml (100%) rename src/{ => clis}/spx/Properties/PublishProfiles/folder publish spx-cli release (osx-64).pubxml (100%) rename src/{ => clis}/spx/Properties/PublishProfiles/folder publish spx-cli release (win-x64).pubxml (100%) rename src/{ => clis}/spx/THIRD_PARTY_NOTICE.txt (100%) rename src/{ => clis}/spx/app.manifest (100%) rename src/{ => clis}/spx/ci/Dockerfile (100%) rename src/{ => clis}/spx/ci/build-all.sh (100%) rename src/{ => clis}/spx/ci/build-local-from-cmake-output.cmd (100%) rename src/{ => clis}/spx/ci/build-local-from-nuget-download.cmd (100%) rename src/{ => clis}/spx/ci/help-topic-crosscheck.sh (100%) rename src/{ => clis}/spx/ci/spx-build-pipeline.yml (100%) rename src/{ => clis}/spx/ci/spx-test-pipeline.yml (100%) rename src/{ => clis}/spx/commands/base/recognize_commands_base.cs (100%) rename src/{ => clis}/spx/commands/batch_command.cs (100%) rename src/{ => clis}/spx/commands/custom_speech_recognition_command.cs (100%) rename src/{ => clis}/spx/commands/dialog_command.cs (100%) rename src/{ => clis}/spx/commands/intent_command.cs (100%) rename src/{ => clis}/spx/commands/parsers/batch_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/bot_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/common_output_token_parsers.cs (100%) rename src/{ => clis}/spx/commands/parsers/common_speech_token_parsers.cs (100%) rename src/{ => clis}/spx/commands/parsers/custom_speech_recognition_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/dialog_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/intent_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/profile_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/recognize_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/synthesize_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/transcribe_conversation_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/translate_command_parser.cs (100%) rename src/{ => clis}/spx/commands/parsers/webjob_command_parser.cs (100%) rename src/{ => clis}/spx/commands/profile_command.cs (100%) rename src/{ => clis}/spx/commands/recognize_command.cs (100%) rename src/{ => clis}/spx/commands/synthesize_command.cs (100%) rename src/{ => clis}/spx/commands/transcribe_conversation_command.cs (100%) rename src/{ => clis}/spx/commands/translate_command.cs (100%) rename src/{ => clis}/spx/commands/webjob_command.cs (100%) rename src/{ => clis}/spx/helpers/audio_helpers.cs (100%) rename src/{ => clis}/spx/helpers/caption_helper.cs (100%) rename src/{ => clis}/spx/helpers/config_helpers.cs (100%) rename src/{ => clis}/spx/helpers/connection_helpers.cs (100%) rename src/{ => clis}/spx/helpers/display_helpers.cs (100%) rename src/{ => clis}/spx/helpers/event_logger_helpers.cs (100%) rename src/{ => clis}/spx/helpers/output_helper.cs (100%) rename src/{ => clis}/spx/helpers/wer_helpers.cs (100%) rename src/{ => clis}/spx/images/SPX_Build_Variables.jpg (100%) rename src/{ => clis}/spx/packages.lock.json (100%) rename src/{ => clis}/spx/spx-cli.csproj (100%) rename src/{ => clis}/spx/spx-cli.sln (100%) rename src/{ => clis}/spx/spx.dev.new.todo.md (100%) rename src/{ => clis}/spx/tests/audio_and_trans.zip (100%) rename src/{ => clis}/spx/tests/check-all.cmd (100%) rename src/{ => clis}/spx/tests/check-batch.cmd (100%) rename src/{ => clis}/spx/tests/check-cli.cmd (100%) rename src/{ => clis}/spx/tests/check-csr.cmd (100%) rename src/{ => clis}/spx/tests/check-help.cmd (100%) rename src/{ => clis}/spx/tests/check-stress-test.cmd (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.1.set.test (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.2.get.test (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.3.find.test (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.4.add.test (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.5.clear.test (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.usage.test (100%) rename src/{ => clis}/spx/tests/cli/commands/config/config.usage.test.run.output.expected (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.download.name.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.download.name.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.download.null.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.download.null.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.run.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.run.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.status.request.test (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.status.request.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.skip (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.run.output.expect (100%) rename src/{ => clis}/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.skip (100%) rename src/{ => clis}/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test (100%) rename src/{ => clis}/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test.x.command.diagnostics.log.expected (100%) rename src/{ => clis}/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test (100%) rename src/{ => clis}/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test.x.command.diagnostics.log.expect (100%) rename src/{ => clis}/spx/tests/pronunciation.txt (100%) rename src/{ => clis}/spx/tests/related_text.txt (100%) rename src/{ => clis}/spx/tests/sentences.txt (100%) rename src/{ => clis}/spx/tests/stress-text.txt (100%) rename src/{ => clis}/spx/tests/test (100%) rename src/{ => clis}/spx/tests/test.batch (100%) rename src/{ => clis}/spx/tests/test.batch.transcription.1.job (100%) rename src/{ => clis}/spx/tests/test.batch.transcription.2.job (100%) rename src/{ => clis}/spx/tests/test.batch.transcription.2.job.foreach.0.tsv.file (100%) rename src/{ => clis}/spx/tests/test.config.clear.test.1.job (100%) rename src/{ => clis}/spx/tests/test.config.clear.test.2.job (100%) rename src/{ => clis}/spx/tests/test.config.clear.test.3.job (100%) rename src/{ => clis}/spx/tests/test.config.clear.test.4.job (100%) rename src/{ => clis}/spx/tests/test.config.find.1.job (100%) rename src/{ => clis}/spx/tests/test.config.find.2.job (100%) rename src/{ => clis}/spx/tests/test.config.find.3.job (100%) rename src/{ => clis}/spx/tests/test.config.find.4.job (100%) rename src/{ => clis}/spx/tests/test.config.find.5.job (100%) rename src/{ => clis}/spx/tests/test.config.find.6.job (100%) rename src/{ => clis}/spx/tests/test.config.find.7.job (100%) rename src/{ => clis}/spx/tests/test.foreach.stress.tsv.file (100%) rename src/{ => clis}/spx/tests/test.intent.1.job (100%) rename src/{ => clis}/spx/tests/test.intent.2.job (100%) rename src/{ => clis}/spx/tests/test.intent.3.job (100%) rename src/{ => clis}/spx/tests/test.intent.4.job (100%) rename src/{ => clis}/spx/tests/test.intent.setup.ChangeReco (100%) rename src/{ => clis}/spx/tests/test.stress (100%) rename src/{ => clis}/spx/tests/test.stress.recognize.1.job (100%) rename src/{ => clis}/spx/tests/test.stress.synthesize.1.job (100%) rename src/{ => clis}/spx/tests/test.stress.synthesize.1.job.foreach.0.tsv.file (100%) rename src/{ => clis}/spx/tests/test.stress.translate.1.job (100%) rename src/{ => clis}/spx/tests/test.tsv (100%) rename src/{ => clis}/spx/tests/this.is.a.test.of.the.emergency.broadcast.system.txt (100%) rename src/{ => clis}/spx/tests/this.is.a.test.txt (100%) rename src/{ => clis}/spx/todo.md (100%) rename src/{ => clis}/vz/.x/config/connection (100%) rename src/{ => clis}/vz/.x/config/connection.from.endpoint (100%) rename src/{ => clis}/vz/.x/config/connection.from.host (100%) rename src/{ => clis}/vz/.x/config/connection.from.region (100%) rename src/{ => clis}/vz/.x/config/default.log (100%) rename src/{ => clis}/vz/.x/config/default.path (100%) rename src/{ => clis}/vz/.x/config/defaults (100%) rename src/{ => clis}/vz/.x/config/endpoint (100%) rename src/{ => clis}/vz/.x/config/fiddler (100%) rename src/{ => clis}/vz/.x/config/host (100%) rename src/{ => clis}/vz/.x/config/image.default.config (100%) rename src/{ => clis}/vz/.x/config/image.default.connection (100%) rename src/{ => clis}/vz/.x/config/image.default.output (100%) rename src/{ => clis}/vz/.x/config/image.output.all.standard (100%) rename src/{ => clis}/vz/.x/config/image.region (100%) rename src/{ => clis}/vz/.x/config/init.default.config (100%) rename src/{ => clis}/vz/.x/config/init.default.output (100%) rename src/{ => clis}/vz/.x/config/input.path (100%) rename src/{ => clis}/vz/.x/config/key (100%) rename src/{ => clis}/vz/.x/config/log.pid (100%) rename src/{ => clis}/vz/.x/config/log.time (100%) rename src/{ => clis}/vz/.x/config/log.time.pid (100%) rename src/{ => clis}/vz/.x/config/my.defaults (100%) rename src/{ => clis}/vz/.x/config/none (100%) rename src/{ => clis}/vz/.x/config/output (100%) rename src/{ => clis}/vz/.x/config/output.all.standard (100%) rename src/{ => clis}/vz/.x/config/person.default.config (100%) rename src/{ => clis}/vz/.x/config/person.default.connection (100%) rename src/{ => clis}/vz/.x/config/person.default.output (100%) rename src/{ => clis}/vz/.x/config/person.output.all.standard (100%) rename src/{ => clis}/vz/.x/config/region (100%) rename src/{ => clis}/vz/.x/config/run.default.config (100%) rename src/{ => clis}/vz/.x/config/vz.defaults (100%) rename src/{ => clis}/vz/.x/help/config (100%) rename src/{ => clis}/vz/.x/help/config.add (100%) rename src/{ => clis}/vz/.x/help/config.advanced (100%) rename src/{ => clis}/vz/.x/help/config.clear (100%) rename src/{ => clis}/vz/.x/help/config.command (100%) rename src/{ => clis}/vz/.x/help/config.examples (100%) rename src/{ => clis}/vz/.x/help/config.find (100%) rename src/{ => clis}/vz/.x/help/config.hive (100%) rename src/{ => clis}/vz/.x/help/config.region (100%) rename src/{ => clis}/vz/.x/help/config.scope (100%) rename src/{ => clis}/vz/.x/help/config.set (100%) rename src/{ => clis}/vz/.x/help/documentation (100%) rename src/{ => clis}/vz/.x/help/endpoint (100%) rename src/{ => clis}/vz/.x/help/examples (100%) rename src/{ => clis}/vz/.x/help/face (100%) rename src/{ => clis}/vz/.x/help/face.identify (100%) rename src/{ => clis}/vz/.x/help/face.identify.examples (100%) rename src/{ => clis}/vz/.x/help/face.verify (100%) rename src/{ => clis}/vz/.x/help/face.verify.examples (100%) rename src/{ => clis}/vz/.x/help/help (100%) rename src/{ => clis}/vz/.x/help/hive (100%) rename src/{ => clis}/vz/.x/help/image (100%) rename src/{ => clis}/vz/.x/help/image.analyze (100%) rename src/{ => clis}/vz/.x/help/image.analyze.examples (100%) rename src/{ => clis}/vz/.x/help/image.read (100%) rename src/{ => clis}/vz/.x/help/image.read.examples (100%) rename src/{ => clis}/vz/.x/help/include.create.resource (100%) rename src/{ => clis}/vz/.x/help/include.create.resource.extra (100%) rename src/{ => clis}/vz/.x/help/include.the.azure.vision.service (100%) rename src/{ => clis}/vz/.x/help/include.the.azure.vision.service.long (100%) rename src/{ => clis}/vz/.x/help/include.the.config.command (100%) rename src/{ => clis}/vz/.x/help/include.the.face.command.long (100%) rename src/{ => clis}/vz/.x/help/include.the.face.identify.command (100%) rename src/{ => clis}/vz/.x/help/include.the.face.identify.command.long (100%) rename src/{ => clis}/vz/.x/help/include.the.face.verify.command (100%) rename src/{ => clis}/vz/.x/help/include.the.face.verify.command.long (100%) rename src/{ => clis}/vz/.x/help/include.the.image.analyze.command (100%) rename src/{ => clis}/vz/.x/help/include.the.image.analyze.command.long (100%) rename src/{ => clis}/vz/.x/help/include.the.image.command.long (100%) rename src/{ => clis}/vz/.x/help/include.the.image.read.command (100%) rename src/{ => clis}/vz/.x/help/include.the.image.read.command.long (100%) rename src/{ => clis}/vz/.x/help/include.the.init.command.long (100%) rename src/{ => clis}/vz/.x/help/include.the.key.option (100%) rename src/{ => clis}/vz/.x/help/include.the.key.option.where (100%) rename src/{ => clis}/vz/.x/help/include.the.log.option (100%) rename src/{ => clis}/vz/.x/help/include.the.person.create.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.delete.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.face.add.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.face.delete.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.face.list.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.face.update.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.group.create.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.group.delete.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.group.list.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.group.status.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.group.train.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.group.update.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.list.command (100%) rename src/{ => clis}/vz/.x/help/include.the.person.update.command (100%) rename src/{ => clis}/vz/.x/help/include.the.region.option (100%) rename src/{ => clis}/vz/.x/help/include.the.region.option.where (100%) rename src/{ => clis}/vz/.x/help/include.the.run.command (100%) rename src/{ => clis}/vz/.x/help/include.the.save.option (100%) rename src/{ => clis}/vz/.x/help/include.the.token.option (100%) rename src/{ => clis}/vz/.x/help/include.the.token.option.where (100%) rename src/{ => clis}/vz/.x/help/include.the.zip.option (100%) rename src/{ => clis}/vz/.x/help/include.vz.ascii.logo (100%) rename src/{ => clis}/vz/.x/help/include.vz.init.ascii.logo (100%) rename src/{ => clis}/vz/.x/help/init (100%) rename src/{ => clis}/vz/.x/help/init.advanced (100%) rename src/{ => clis}/vz/.x/help/init.examples (100%) rename src/{ => clis}/vz/.x/help/key (100%) rename src/{ => clis}/vz/.x/help/key.overview (100%) rename src/{ => clis}/vz/.x/help/person (100%) rename src/{ => clis}/vz/.x/help/person.create (100%) rename src/{ => clis}/vz/.x/help/person.create.advanced (100%) rename src/{ => clis}/vz/.x/help/person.delete (100%) rename src/{ => clis}/vz/.x/help/person.delete.advanced (100%) rename src/{ => clis}/vz/.x/help/person.examples (100%) rename src/{ => clis}/vz/.x/help/person.face (100%) rename src/{ => clis}/vz/.x/help/person.face.add (100%) rename src/{ => clis}/vz/.x/help/person.face.add.advanced (100%) rename src/{ => clis}/vz/.x/help/person.face.delete (100%) rename src/{ => clis}/vz/.x/help/person.face.delete.advanced (100%) rename src/{ => clis}/vz/.x/help/person.face.list (100%) rename src/{ => clis}/vz/.x/help/person.face.list.advanced (100%) rename src/{ => clis}/vz/.x/help/person.face.update (100%) rename src/{ => clis}/vz/.x/help/person.face.update.advanced (100%) rename src/{ => clis}/vz/.x/help/person.group (100%) rename src/{ => clis}/vz/.x/help/person.group.create (100%) rename src/{ => clis}/vz/.x/help/person.group.create.advanced (100%) rename src/{ => clis}/vz/.x/help/person.group.delete (100%) rename src/{ => clis}/vz/.x/help/person.group.delete.advanced (100%) rename src/{ => clis}/vz/.x/help/person.group.list (100%) rename src/{ => clis}/vz/.x/help/person.group.list.advanced (100%) rename src/{ => clis}/vz/.x/help/person.group.status (100%) rename src/{ => clis}/vz/.x/help/person.group.status.advanced (100%) rename src/{ => clis}/vz/.x/help/person.group.train (100%) rename src/{ => clis}/vz/.x/help/person.group.train.advanced (100%) rename src/{ => clis}/vz/.x/help/person.group.update (100%) rename src/{ => clis}/vz/.x/help/person.group.update.advanced (100%) rename src/{ => clis}/vz/.x/help/person.list (100%) rename src/{ => clis}/vz/.x/help/person.list.advanced (100%) rename src/{ => clis}/vz/.x/help/person.update (100%) rename src/{ => clis}/vz/.x/help/person.update.advanced (100%) rename src/{ => clis}/vz/.x/help/region (100%) rename src/{ => clis}/vz/.x/help/region.overview (100%) rename src/{ => clis}/vz/.x/help/run (100%) rename src/{ => clis}/vz/.x/help/run.advanced (100%) rename src/{ => clis}/vz/.x/help/run.examples (100%) rename src/{ => clis}/vz/.x/help/setup (100%) rename src/{ => clis}/vz/.x/help/usage (100%) rename src/{ => clis}/vz/BuildCommon.targets (100%) rename src/{ => clis}/vz/LICENSE.txt (100%) rename src/{ => clis}/vz/NuGet.Config (100%) rename src/{ => clis}/vz/Program_VZ.cs (100%) rename src/{ => clis}/vz/Properties/PublishProfiles/folder publish vz-cli debug (linux-x64).pubxml (100%) rename src/{ => clis}/vz/Properties/PublishProfiles/folder publish vz-cli debug (osx-64).pubxml (100%) rename src/{ => clis}/vz/Properties/PublishProfiles/folder publish vz-cli debug (win-x64).pubxml (100%) rename src/{ => clis}/vz/Properties/PublishProfiles/folder publish vz-cli release (linux-x64).pubxml (100%) rename src/{ => clis}/vz/Properties/PublishProfiles/folder publish vz-cli release (osx-64).pubxml (100%) rename src/{ => clis}/vz/Properties/PublishProfiles/folder publish vz-cli release (win-x64).pubxml (100%) rename src/{ => clis}/vz/Properties/launchSettings.json (100%) rename src/{ => clis}/vz/THIRD_PARTY_NOTICE.txt (100%) rename src/{ => clis}/vz/app.manifest (100%) rename src/{ => clis}/vz/ci/build-all.cmd (100%) rename src/{ => clis}/vz/ci/build-all.sh (100%) rename src/{ => clis}/vz/ci/build-linux-x64.cmd (100%) rename src/{ => clis}/vz/ci/build-win-x64.cmd (100%) rename src/{ => clis}/vz/ci/publish-linux-x64.cmd (100%) rename src/{ => clis}/vz/ci/publish-win-x64.cmd (100%) rename src/{ => clis}/vz/ci/vz-build-pipeline.yml (100%) rename src/{ => clis}/vz/ci/vz-test-pipeline.yml (100%) rename src/{ => clis}/vz/commands/face_command.cs (100%) rename src/{ => clis}/vz/commands/image_command.cs (100%) rename src/{ => clis}/vz/commands/parsers/common_vision_token_parsers.cs (100%) rename src/{ => clis}/vz/commands/parsers/face_command_parser.cs (100%) rename src/{ => clis}/vz/commands/parsers/image_command_parser.cs (100%) rename src/{ => clis}/vz/commands/parsers/person_command_parser.cs (100%) rename src/{ => clis}/vz/commands/person_command.cs (100%) rename src/{ => clis}/vz/face.cli.person.ideas.md (100%) rename src/{ => clis}/vz/helpers/display_helpers.cs (100%) rename src/{ => clis}/vz/helpers/event_logger_helpers.cs (100%) rename src/{ => clis}/vz/packages.lock.json (100%) rename src/{ => clis}/vz/tests/check-all.cmd (100%) rename src/{ => clis}/vz/tests/check-cli.cmd (100%) rename src/{ => clis}/vz/tests/cli/base/help.documentation.test (100%) rename src/{ => clis}/vz/tests/cli/base/help.documentation.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/base/help.examples.test (100%) rename src/{ => clis}/vz/tests/cli/base/help.examples.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/base/help.setup.test (100%) rename src/{ => clis}/vz/tests/cli/base/help.setup.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/base/help.test (100%) rename src/{ => clis}/vz/tests/cli/base/help.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/base/usage.test (100%) rename src/{ => clis}/vz/tests/cli/base/usage.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.1.set.test (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.2.get.test (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.3.find.test (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.4.add.test (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.5.clear.test (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.usage.test (100%) rename src/{ => clis}/vz/tests/cli/commands/config/config.usage.test.run.output.expected (100%) rename src/{ => clis}/vz/vz-cli.csproj (100%) rename {tests => src/extensions}/testframework/IYamlTestFrameworkHost.cs (100%) rename {tests => src/extensions}/testframework/Logger.cs (100%) rename {tests => src/extensions}/testframework/Properties/AssemblyInfo.cs (100%) rename {tests => src/extensions}/testframework/TestResultHelpers.cs (100%) rename {tests => src/extensions}/testframework/YamlHelpers.cs (100%) rename {tests => src/extensions}/testframework/YamlNodeExtensions.cs (100%) rename {tests => src/extensions}/testframework/YamlTagHelpers.cs (100%) rename {tests => src/extensions}/testframework/YamlTestCaseFilter.cs (100%) rename {tests => src/extensions}/testframework/YamlTestCaseParseContext.cs (100%) rename {tests => src/extensions}/testframework/YamlTestCaseParser.cs (100%) rename {tests => src/extensions}/testframework/YamlTestCaseRunner.cs (100%) rename {tests => src/extensions}/testframework/YamlTestFramework.cs (100%) rename {tests => src/extensions}/testframework/YamlTestFramework.csproj (76%) rename {tests => src/extensions}/testframework/YamlTestFrameworkCommon.targets (100%) rename {tests => src/extensions}/testframework/YamlTestProperties.cs (100%) rename {tests => src/testing/adapters}/recordingadapter/README.md (92%) rename {tests => src/testing/adapters}/recordingadapter/RecordedTestAdapterTest.runsettings (100%) rename {tests => src/testing/adapters}/recordingadapter/RecordedTestDiscoverer.cs (100%) rename {tests => src/testing/adapters}/recordingadapter/RecordedTestExecutor.cs (100%) rename {tests => src/testing/adapters}/recordingadapter/RecordedTestMode.cs (100%) rename {tests => src/testing/adapters}/recordingadapter/RecordedTestObserver.cs (100%) rename {tests => src/testing/adapters}/recordingadapter/RecordedYamlTestAdapter.cs (100%) rename {tests => src/testing/adapters}/recordingadapter/RecordedYamlTestAdapter.csproj (82%) rename {tests => src/testing/adapters}/recordingadapter/RecordedYamlTestAdapterCommon.targets (100%) rename {tests => src/testing/adapters}/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs (100%) rename {tests => src/testing/adapters}/recordingadapter/TestProxyClient.cs (100%) rename {tests => src/testing/adapters}/recordproxy/Dockerfile (100%) rename {tests => src/testing/adapters}/recordproxy/Dockerfile.base (100%) rename {tests => src/testing/adapters}/recordproxy/dev_insall.cmd (100%) rename {tests => src/testing/adapters}/recordproxy/headers.lua (100%) rename {tests => src/testing/adapters}/recordproxy/issue_cert.sh (100%) rename {tests => src/testing/adapters}/recordproxy/nginx.conf (100%) rename {tests => src/testing/adapters}/recordproxy/openssl-ca.conf (100%) rename {tests => src/testing/adapters}/recordproxy/storage.lua (100%) rename {tests => src/testing/adapters}/testadapter/Properties/AssemblyInfo.cs (100%) rename {tests => src/testing/adapters}/testadapter/README.md (87%) rename {tests => src/testing/adapters}/testadapter/TestAdapterTest.runsettings (100%) rename {tests => src/testing/adapters}/testadapter/TestDiscoverer.cs (100%) rename {tests => src/testing/adapters}/testadapter/TestExecutor.cs (100%) rename {tests => src/testing/adapters}/testadapter/YamlTestAdapter.cs (100%) rename {tests => src/testing/adapters}/testadapter/YamlTestAdapter.csproj (69%) rename {tests => src/testing/adapters}/testadapter/YamlTestAdapterCommon.targets (100%) rename {tests => src/testing/adapters}/testadapter/YamlTestFrameworkHandleHost.cs (100%) rename {tests => src/testing/adapters}/testadapter/YamlTestRunnerTriggerAttribute.cs (100%) rename {tests/testrunner => src/testing/runner}/Program.cs (100%) rename {tests/testrunner => src/testing/runner}/Properties/AssemblyInfo.cs (100%) rename {tests/testrunner => src/testing/runner}/Properties/launchSettings.json (100%) rename {tests/testrunner => src/testing/runner}/YamlTestFrameworkConsoleHost.cs (100%) rename {tests/testrunner => src/testing/runner}/YamlTestRunner.csproj (73%) rename {tests/testrunner => src/testing/runner}/YamlTestRunnerCommon.targets (100%) rename src/{extensions/test_helper_functions_extension => testing/samples/helper_functions_sample_project}/BuildCommon.targets (100%) rename src/{extensions/test_helper_functions_extension => testing/samples/helper_functions_sample_project}/PersonAgeFunctionHelperTest.cs (100%) rename src/{extensions/test_helper_functions_extension => testing/samples/helper_functions_sample_project}/test_helper_functions_extension.csproj (72%) diff --git a/.azure/pipelines/docker_proxy_setup.yaml b/.azure/pipelines/docker_proxy_setup.yaml index 28656817..13a7df80 100644 --- a/.azure/pipelines/docker_proxy_setup.yaml +++ b/.azure/pipelines/docker_proxy_setup.yaml @@ -9,7 +9,7 @@ steps: inputs: command: build repository: nginx-recording-test-proxy-dev - dockerfile: 'tests/recordproxy/Dockerfile' + dockerfile: 'src/testing/adapters/recordproxy/Dockerfile' containerRegistry: 'acrbn-acr' - bash: | docker images diff --git a/.azure/pipelines/nginx-docker-build-and-push.yaml b/.azure/pipelines/nginx-docker-build-and-push.yaml index ca28cfc0..7c1a0750 100644 --- a/.azure/pipelines/nginx-docker-build-and-push.yaml +++ b/.azure/pipelines/nginx-docker-build-and-push.yaml @@ -10,7 +10,7 @@ variables: baseVer: '20.04' # The path of the image (should normally not change) repositorydocker: nginx-recording-test-proxy - dockerfile: 'tests/recordproxy/Dockerfile.base' + dockerfile: 'src/testing/adapters/recordproxy/Dockerfile.base' version: $(Build.BuildId) trigger: diff --git a/.gitignore b/.gitignore index 4b125cb9..f9a4e5cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ **/.ai/data/* +**/.pyenv/** **/.vs/** **/.vscode/** **/bin/*/net6.0/* diff --git a/ai-cli.sln b/ai-cli.sln index 1c9c096c..33e21935 100644 --- a/ai-cli.sln +++ b/ai-cli.sln @@ -11,19 +11,19 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "helper_functions_extension" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{644B75F1-C768-4DB3-BAF2-C69A1F36DD28}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "test_helper_functions_extension", "src\extensions\test_helper_functions_extension\test_helper_functions_extension.csproj", "{7BD6EF67-BA75-478D-9721-C1B2AB6DE3FF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "test_helper_functions_extension", "src\testing\samples\helper_functions_sample_project\test_helper_functions_extension.csproj", "{7BD6EF67-BA75-478D-9721-C1B2AB6DE3FF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "template_extension", "src\extensions\template_extension\template_extension.csproj", "{023B4F9C-E2B3-4CCD-A993-87E337C16EDE}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YamlTestAdapter", "tests\testadapter\YamlTestAdapter.csproj", "{7C3F1355-B679-487D-904D-7E5FEBA9E75C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YamlTestAdapter", "src\testing\adapters\testadapter\YamlTestAdapter.csproj", "{7C3F1355-B679-487D-904D-7E5FEBA9E75C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YamlTestFramework", "tests\testframework\YamlTestFramework.csproj", "{B0B3437F-1828-4A13-866F-1CF7C924015E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YamlTestFramework", "src\extensions\testframework\YamlTestFramework.csproj", "{B0B3437F-1828-4A13-866F-1CF7C924015E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YamlTestRunner", "tests\testrunner\YamlTestRunner.csproj", "{39876475-2D98-40CF-8B08-CD423A5EB4E8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YamlTestRunner", "src\testing\runner\YamlTestRunner.csproj", "{39876475-2D98-40CF-8B08-CD423A5EB4E8}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C8AFF891-D6AA-4B8F-BC21-10404DF4B355}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RecordedYamlTestAdapter", "tests\recordingadapter\RecordedYamlTestAdapter.csproj", "{9499C018-FA08-4133-93B3-FC0F3863A6CC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RecordedYamlTestAdapter", "src\testing\adapters\recordingadapter\RecordedYamlTestAdapter.csproj", "{9499C018-FA08-4133-93B3-FC0F3863A6CC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/spx/.x/config/batch.default.config b/src/clis/spx/.x/config/batch.default.config similarity index 100% rename from src/spx/.x/config/batch.default.config rename to src/clis/spx/.x/config/batch.default.config diff --git a/src/spx/.x/config/batch.default.connection b/src/clis/spx/.x/config/batch.default.connection similarity index 100% rename from src/spx/.x/config/batch.default.connection rename to src/clis/spx/.x/config/batch.default.connection diff --git a/src/spx/.x/config/batch.default.output b/src/clis/spx/.x/config/batch.default.output similarity index 100% rename from src/spx/.x/config/batch.default.output rename to src/clis/spx/.x/config/batch.default.output diff --git a/src/spx/.x/config/connection b/src/clis/spx/.x/config/connection similarity index 100% rename from src/spx/.x/config/connection rename to src/clis/spx/.x/config/connection diff --git a/src/spx/.x/config/connection.from.endpoint b/src/clis/spx/.x/config/connection.from.endpoint similarity index 100% rename from src/spx/.x/config/connection.from.endpoint rename to src/clis/spx/.x/config/connection.from.endpoint diff --git a/src/spx/.x/config/connection.from.host b/src/clis/spx/.x/config/connection.from.host similarity index 100% rename from src/spx/.x/config/connection.from.host rename to src/clis/spx/.x/config/connection.from.host diff --git a/src/spx/.x/config/connection.from.region b/src/clis/spx/.x/config/connection.from.region similarity index 100% rename from src/spx/.x/config/connection.from.region rename to src/clis/spx/.x/config/connection.from.region diff --git a/src/spx/.x/config/csr.default.config b/src/clis/spx/.x/config/csr.default.config similarity index 100% rename from src/spx/.x/config/csr.default.config rename to src/clis/spx/.x/config/csr.default.config diff --git a/src/spx/.x/config/csr.default.connection b/src/clis/spx/.x/config/csr.default.connection similarity index 100% rename from src/spx/.x/config/csr.default.connection rename to src/clis/spx/.x/config/csr.default.connection diff --git a/src/spx/.x/config/csr.default.output b/src/clis/spx/.x/config/csr.default.output similarity index 100% rename from src/spx/.x/config/csr.default.output rename to src/clis/spx/.x/config/csr.default.output diff --git a/src/spx/.x/config/default.log b/src/clis/spx/.x/config/default.log similarity index 100% rename from src/spx/.x/config/default.log rename to src/clis/spx/.x/config/default.log diff --git a/src/spx/.x/config/default.path b/src/clis/spx/.x/config/default.path similarity index 100% rename from src/spx/.x/config/default.path rename to src/clis/spx/.x/config/default.path diff --git a/src/spx/.x/config/defaults b/src/clis/spx/.x/config/defaults similarity index 100% rename from src/spx/.x/config/defaults rename to src/clis/spx/.x/config/defaults diff --git a/src/spx/.x/config/dialog.default.config b/src/clis/spx/.x/config/dialog.default.config similarity index 100% rename from src/spx/.x/config/dialog.default.config rename to src/clis/spx/.x/config/dialog.default.config diff --git a/src/spx/.x/config/dialog.default.connection b/src/clis/spx/.x/config/dialog.default.connection similarity index 100% rename from src/spx/.x/config/dialog.default.connection rename to src/clis/spx/.x/config/dialog.default.connection diff --git a/src/spx/.x/config/dialog.default.output b/src/clis/spx/.x/config/dialog.default.output similarity index 100% rename from src/spx/.x/config/dialog.default.output rename to src/clis/spx/.x/config/dialog.default.output diff --git a/src/spx/.x/config/endpoint b/src/clis/spx/.x/config/endpoint similarity index 100% rename from src/spx/.x/config/endpoint rename to src/clis/spx/.x/config/endpoint diff --git a/src/spx/.x/config/fiddler b/src/clis/spx/.x/config/fiddler similarity index 100% rename from src/spx/.x/config/fiddler rename to src/clis/spx/.x/config/fiddler diff --git a/src/spx/.x/config/host b/src/clis/spx/.x/config/host similarity index 100% rename from src/spx/.x/config/host rename to src/clis/spx/.x/config/host diff --git a/src/spx/.x/config/identify.default.config b/src/clis/spx/.x/config/identify.default.config similarity index 100% rename from src/spx/.x/config/identify.default.config rename to src/clis/spx/.x/config/identify.default.config diff --git a/src/spx/.x/config/identify.default.connection b/src/clis/spx/.x/config/identify.default.connection similarity index 100% rename from src/spx/.x/config/identify.default.connection rename to src/clis/spx/.x/config/identify.default.connection diff --git a/src/spx/.x/config/identify.default.output b/src/clis/spx/.x/config/identify.default.output similarity index 100% rename from src/spx/.x/config/identify.default.output rename to src/clis/spx/.x/config/identify.default.output diff --git a/src/spx/.x/config/init.default.config b/src/clis/spx/.x/config/init.default.config similarity index 100% rename from src/spx/.x/config/init.default.config rename to src/clis/spx/.x/config/init.default.config diff --git a/src/spx/.x/config/init.default.output b/src/clis/spx/.x/config/init.default.output similarity index 100% rename from src/spx/.x/config/init.default.output rename to src/clis/spx/.x/config/init.default.output diff --git a/src/spx/.x/config/input.path b/src/clis/spx/.x/config/input.path similarity index 100% rename from src/spx/.x/config/input.path rename to src/clis/spx/.x/config/input.path diff --git a/src/spx/.x/config/intent.default.config b/src/clis/spx/.x/config/intent.default.config similarity index 100% rename from src/spx/.x/config/intent.default.config rename to src/clis/spx/.x/config/intent.default.config diff --git a/src/spx/.x/config/intent.default.connection b/src/clis/spx/.x/config/intent.default.connection similarity index 100% rename from src/spx/.x/config/intent.default.connection rename to src/clis/spx/.x/config/intent.default.connection diff --git a/src/spx/.x/config/intent.default.output b/src/clis/spx/.x/config/intent.default.output similarity index 100% rename from src/spx/.x/config/intent.default.output rename to src/clis/spx/.x/config/intent.default.output diff --git a/src/spx/.x/config/key b/src/clis/spx/.x/config/key similarity index 100% rename from src/spx/.x/config/key rename to src/clis/spx/.x/config/key diff --git a/src/spx/.x/config/language b/src/clis/spx/.x/config/language similarity index 100% rename from src/spx/.x/config/language rename to src/clis/spx/.x/config/language diff --git a/src/spx/.x/config/log.pid b/src/clis/spx/.x/config/log.pid similarity index 100% rename from src/spx/.x/config/log.pid rename to src/clis/spx/.x/config/log.pid diff --git a/src/spx/.x/config/log.time b/src/clis/spx/.x/config/log.time similarity index 100% rename from src/spx/.x/config/log.time rename to src/clis/spx/.x/config/log.time diff --git a/src/spx/.x/config/log.time.pid b/src/clis/spx/.x/config/log.time.pid similarity index 100% rename from src/spx/.x/config/log.time.pid rename to src/clis/spx/.x/config/log.time.pid diff --git a/src/spx/.x/config/my.defaults b/src/clis/spx/.x/config/my.defaults similarity index 100% rename from src/spx/.x/config/my.defaults rename to src/clis/spx/.x/config/my.defaults diff --git a/src/spx/.x/config/none b/src/clis/spx/.x/config/none similarity index 100% rename from src/spx/.x/config/none rename to src/clis/spx/.x/config/none diff --git a/src/spx/.x/config/output b/src/clis/spx/.x/config/output similarity index 100% rename from src/spx/.x/config/output rename to src/clis/spx/.x/config/output diff --git a/src/spx/.x/config/output.all.detailed b/src/clis/spx/.x/config/output.all.detailed similarity index 100% rename from src/spx/.x/config/output.all.detailed rename to src/clis/spx/.x/config/output.all.detailed diff --git a/src/spx/.x/config/output.all.latency b/src/clis/spx/.x/config/output.all.latency similarity index 100% rename from src/spx/.x/config/output.all.latency rename to src/clis/spx/.x/config/output.all.latency diff --git a/src/spx/.x/config/output.all.standard b/src/clis/spx/.x/config/output.all.standard similarity index 100% rename from src/spx/.x/config/output.all.standard rename to src/clis/spx/.x/config/output.all.standard diff --git a/src/spx/.x/config/output.all.transcript.display b/src/clis/spx/.x/config/output.all.transcript.display similarity index 100% rename from src/spx/.x/config/output.all.transcript.display rename to src/clis/spx/.x/config/output.all.transcript.display diff --git a/src/spx/.x/config/output.all.transcript.lexical b/src/clis/spx/.x/config/output.all.transcript.lexical similarity index 100% rename from src/spx/.x/config/output.all.transcript.lexical rename to src/clis/spx/.x/config/output.all.transcript.lexical diff --git a/src/spx/.x/config/output.each.detailed b/src/clis/spx/.x/config/output.each.detailed similarity index 100% rename from src/spx/.x/config/output.each.detailed rename to src/clis/spx/.x/config/output.each.detailed diff --git a/src/spx/.x/config/output.each.event b/src/clis/spx/.x/config/output.each.event similarity index 100% rename from src/spx/.x/config/output.each.event rename to src/clis/spx/.x/config/output.each.event diff --git a/src/spx/.x/config/output.each.latency b/src/clis/spx/.x/config/output.each.latency similarity index 100% rename from src/spx/.x/config/output.each.latency rename to src/clis/spx/.x/config/output.each.latency diff --git a/src/spx/.x/config/profile.default.config b/src/clis/spx/.x/config/profile.default.config similarity index 100% rename from src/spx/.x/config/profile.default.config rename to src/clis/spx/.x/config/profile.default.config diff --git a/src/spx/.x/config/profile.default.connection b/src/clis/spx/.x/config/profile.default.connection similarity index 100% rename from src/spx/.x/config/profile.default.connection rename to src/clis/spx/.x/config/profile.default.connection diff --git a/src/spx/.x/config/profile.default.output b/src/clis/spx/.x/config/profile.default.output similarity index 100% rename from src/spx/.x/config/profile.default.output rename to src/clis/spx/.x/config/profile.default.output diff --git a/src/spx/.x/config/recognize.default.config b/src/clis/spx/.x/config/recognize.default.config similarity index 100% rename from src/spx/.x/config/recognize.default.config rename to src/clis/spx/.x/config/recognize.default.config diff --git a/src/spx/.x/config/recognize.default.connection b/src/clis/spx/.x/config/recognize.default.connection similarity index 100% rename from src/spx/.x/config/recognize.default.connection rename to src/clis/spx/.x/config/recognize.default.connection diff --git a/src/spx/.x/config/recognize.default.output b/src/clis/spx/.x/config/recognize.default.output similarity index 100% rename from src/spx/.x/config/recognize.default.output rename to src/clis/spx/.x/config/recognize.default.output diff --git a/src/spx/.x/config/region b/src/clis/spx/.x/config/region similarity index 100% rename from src/spx/.x/config/region rename to src/clis/spx/.x/config/region diff --git a/src/spx/.x/config/run.default.config b/src/clis/spx/.x/config/run.default.config similarity index 100% rename from src/spx/.x/config/run.default.config rename to src/clis/spx/.x/config/run.default.config diff --git a/src/spx/.x/config/speaker.default.config b/src/clis/spx/.x/config/speaker.default.config similarity index 100% rename from src/spx/.x/config/speaker.default.config rename to src/clis/spx/.x/config/speaker.default.config diff --git a/src/spx/.x/config/speaker.default.connection b/src/clis/spx/.x/config/speaker.default.connection similarity index 100% rename from src/spx/.x/config/speaker.default.connection rename to src/clis/spx/.x/config/speaker.default.connection diff --git a/src/spx/.x/config/speaker.default.output b/src/clis/spx/.x/config/speaker.default.output similarity index 100% rename from src/spx/.x/config/speaker.default.output rename to src/clis/spx/.x/config/speaker.default.output diff --git a/src/spx/.x/config/spx.defaults b/src/clis/spx/.x/config/spx.defaults similarity index 100% rename from src/spx/.x/config/spx.defaults rename to src/clis/spx/.x/config/spx.defaults diff --git a/src/spx/.x/config/synthesize.default.config b/src/clis/spx/.x/config/synthesize.default.config similarity index 100% rename from src/spx/.x/config/synthesize.default.config rename to src/clis/spx/.x/config/synthesize.default.config diff --git a/src/spx/.x/config/synthesize.default.connection b/src/clis/spx/.x/config/synthesize.default.connection similarity index 100% rename from src/spx/.x/config/synthesize.default.connection rename to src/clis/spx/.x/config/synthesize.default.connection diff --git a/src/spx/.x/config/synthesize.default.output b/src/clis/spx/.x/config/synthesize.default.output similarity index 100% rename from src/spx/.x/config/synthesize.default.output rename to src/clis/spx/.x/config/synthesize.default.output diff --git a/src/spx/.x/config/synthesize.output.all.standard b/src/clis/spx/.x/config/synthesize.output.all.standard similarity index 100% rename from src/spx/.x/config/synthesize.output.all.standard rename to src/clis/spx/.x/config/synthesize.output.all.standard diff --git a/src/spx/.x/config/transcribe.default.config b/src/clis/spx/.x/config/transcribe.default.config similarity index 100% rename from src/spx/.x/config/transcribe.default.config rename to src/clis/spx/.x/config/transcribe.default.config diff --git a/src/spx/.x/config/transcribe.default.connection b/src/clis/spx/.x/config/transcribe.default.connection similarity index 100% rename from src/spx/.x/config/transcribe.default.connection rename to src/clis/spx/.x/config/transcribe.default.connection diff --git a/src/spx/.x/config/transcribe.default.output b/src/clis/spx/.x/config/transcribe.default.output similarity index 100% rename from src/spx/.x/config/transcribe.default.output rename to src/clis/spx/.x/config/transcribe.default.output diff --git a/src/spx/.x/config/translate.default.config b/src/clis/spx/.x/config/translate.default.config similarity index 100% rename from src/spx/.x/config/translate.default.config rename to src/clis/spx/.x/config/translate.default.config diff --git a/src/spx/.x/config/translate.default.connection b/src/clis/spx/.x/config/translate.default.connection similarity index 100% rename from src/spx/.x/config/translate.default.connection rename to src/clis/spx/.x/config/translate.default.connection diff --git a/src/spx/.x/config/translate.default.output b/src/clis/spx/.x/config/translate.default.output similarity index 100% rename from src/spx/.x/config/translate.default.output rename to src/clis/spx/.x/config/translate.default.output diff --git a/src/spx/.x/config/translate.output.all.translated.text b/src/clis/spx/.x/config/translate.output.all.translated.text similarity index 100% rename from src/spx/.x/config/translate.output.all.translated.text rename to src/clis/spx/.x/config/translate.output.all.translated.text diff --git a/src/spx/.x/config/translate.output.each.translated.text b/src/clis/spx/.x/config/translate.output.each.translated.text similarity index 100% rename from src/spx/.x/config/translate.output.each.translated.text rename to src/clis/spx/.x/config/translate.output.each.translated.text diff --git a/src/spx/.x/config/webjob.default.config b/src/clis/spx/.x/config/webjob.default.config similarity index 100% rename from src/spx/.x/config/webjob.default.config rename to src/clis/spx/.x/config/webjob.default.config diff --git a/src/spx/.x/config/webjob.default.connection b/src/clis/spx/.x/config/webjob.default.connection similarity index 100% rename from src/spx/.x/config/webjob.default.connection rename to src/clis/spx/.x/config/webjob.default.connection diff --git a/src/spx/.x/config/webjob.endpoint b/src/clis/spx/.x/config/webjob.endpoint similarity index 100% rename from src/spx/.x/config/webjob.endpoint rename to src/clis/spx/.x/config/webjob.endpoint diff --git a/src/spx/.x/config/webjob.password b/src/clis/spx/.x/config/webjob.password similarity index 100% rename from src/spx/.x/config/webjob.password rename to src/clis/spx/.x/config/webjob.password diff --git a/src/spx/.x/help/advanced.setup b/src/clis/spx/.x/help/advanced.setup similarity index 100% rename from src/spx/.x/help/advanced.setup rename to src/clis/spx/.x/help/advanced.setup diff --git a/src/spx/.x/help/batch b/src/clis/spx/.x/help/batch similarity index 100% rename from src/spx/.x/help/batch rename to src/clis/spx/.x/help/batch diff --git a/src/spx/.x/help/batch.connection b/src/clis/spx/.x/help/batch.connection similarity index 100% rename from src/spx/.x/help/batch.connection rename to src/clis/spx/.x/help/batch.connection diff --git a/src/spx/.x/help/batch.download b/src/clis/spx/.x/help/batch.download similarity index 100% rename from src/spx/.x/help/batch.download rename to src/clis/spx/.x/help/batch.download diff --git a/src/spx/.x/help/batch.download.advanced b/src/clis/spx/.x/help/batch.download.advanced similarity index 100% rename from src/spx/.x/help/batch.download.advanced rename to src/clis/spx/.x/help/batch.download.advanced diff --git a/src/spx/.x/help/batch.download.file b/src/clis/spx/.x/help/batch.download.file similarity index 100% rename from src/spx/.x/help/batch.download.file rename to src/clis/spx/.x/help/batch.download.file diff --git a/src/spx/.x/help/batch.download.output.file b/src/clis/spx/.x/help/batch.download.output.file similarity index 100% rename from src/spx/.x/help/batch.download.output.file rename to src/clis/spx/.x/help/batch.download.output.file diff --git a/src/spx/.x/help/batch.download.url b/src/clis/spx/.x/help/batch.download.url similarity index 100% rename from src/spx/.x/help/batch.download.url rename to src/clis/spx/.x/help/batch.download.url diff --git a/src/spx/.x/help/batch.examples b/src/clis/spx/.x/help/batch.examples similarity index 100% rename from src/spx/.x/help/batch.examples rename to src/clis/spx/.x/help/batch.examples diff --git a/src/spx/.x/help/batch.foreach b/src/clis/spx/.x/help/batch.foreach similarity index 100% rename from src/spx/.x/help/batch.foreach rename to src/clis/spx/.x/help/batch.foreach diff --git a/src/spx/.x/help/batch.input.path b/src/clis/spx/.x/help/batch.input.path similarity index 100% rename from src/spx/.x/help/batch.input.path rename to src/clis/spx/.x/help/batch.input.path diff --git a/src/spx/.x/help/batch.key b/src/clis/spx/.x/help/batch.key similarity index 100% rename from src/spx/.x/help/batch.key rename to src/clis/spx/.x/help/batch.key diff --git a/src/spx/.x/help/batch.list b/src/clis/spx/.x/help/batch.list similarity index 100% rename from src/spx/.x/help/batch.list rename to src/clis/spx/.x/help/batch.list diff --git a/src/spx/.x/help/batch.list.advanced b/src/clis/spx/.x/help/batch.list.advanced similarity index 100% rename from src/spx/.x/help/batch.list.advanced rename to src/clis/spx/.x/help/batch.list.advanced diff --git a/src/spx/.x/help/batch.output b/src/clis/spx/.x/help/batch.output similarity index 100% rename from src/spx/.x/help/batch.output rename to src/clis/spx/.x/help/batch.output diff --git a/src/spx/.x/help/batch.output.id b/src/clis/spx/.x/help/batch.output.id similarity index 100% rename from src/spx/.x/help/batch.output.id rename to src/clis/spx/.x/help/batch.output.id diff --git a/src/spx/.x/help/batch.output.ids b/src/clis/spx/.x/help/batch.output.ids similarity index 100% rename from src/spx/.x/help/batch.output.ids rename to src/clis/spx/.x/help/batch.output.ids diff --git a/src/spx/.x/help/batch.output.json b/src/clis/spx/.x/help/batch.output.json similarity index 100% rename from src/spx/.x/help/batch.output.json rename to src/clis/spx/.x/help/batch.output.json diff --git a/src/spx/.x/help/batch.output.path b/src/clis/spx/.x/help/batch.output.path similarity index 100% rename from src/spx/.x/help/batch.output.path rename to src/clis/spx/.x/help/batch.output.path diff --git a/src/spx/.x/help/batch.output.request b/src/clis/spx/.x/help/batch.output.request similarity index 100% rename from src/spx/.x/help/batch.output.request rename to src/clis/spx/.x/help/batch.output.request diff --git a/src/spx/.x/help/batch.output.url b/src/clis/spx/.x/help/batch.output.url similarity index 100% rename from src/spx/.x/help/batch.output.url rename to src/clis/spx/.x/help/batch.output.url diff --git a/src/spx/.x/help/batch.output.urls b/src/clis/spx/.x/help/batch.output.urls similarity index 100% rename from src/spx/.x/help/batch.output.urls rename to src/clis/spx/.x/help/batch.output.urls diff --git a/src/spx/.x/help/batch.processes b/src/clis/spx/.x/help/batch.processes similarity index 100% rename from src/spx/.x/help/batch.processes rename to src/clis/spx/.x/help/batch.processes diff --git a/src/spx/.x/help/batch.region b/src/clis/spx/.x/help/batch.region similarity index 100% rename from src/spx/.x/help/batch.region rename to src/clis/spx/.x/help/batch.region diff --git a/src/spx/.x/help/batch.save b/src/clis/spx/.x/help/batch.save similarity index 100% rename from src/spx/.x/help/batch.save rename to src/clis/spx/.x/help/batch.save diff --git a/src/spx/.x/help/batch.threads b/src/clis/spx/.x/help/batch.threads similarity index 100% rename from src/spx/.x/help/batch.threads rename to src/clis/spx/.x/help/batch.threads diff --git a/src/spx/.x/help/batch.transcription b/src/clis/spx/.x/help/batch.transcription similarity index 100% rename from src/spx/.x/help/batch.transcription rename to src/clis/spx/.x/help/batch.transcription diff --git a/src/spx/.x/help/batch.transcription.create b/src/clis/spx/.x/help/batch.transcription.create similarity index 100% rename from src/spx/.x/help/batch.transcription.create rename to src/clis/spx/.x/help/batch.transcription.create diff --git a/src/spx/.x/help/batch.transcription.create.advanced b/src/clis/spx/.x/help/batch.transcription.create.advanced similarity index 100% rename from src/spx/.x/help/batch.transcription.create.advanced rename to src/clis/spx/.x/help/batch.transcription.create.advanced diff --git a/src/spx/.x/help/batch.transcription.create.content b/src/clis/spx/.x/help/batch.transcription.create.content similarity index 100% rename from src/spx/.x/help/batch.transcription.create.content rename to src/clis/spx/.x/help/batch.transcription.create.content diff --git a/src/spx/.x/help/batch.transcription.create.dataset b/src/clis/spx/.x/help/batch.transcription.create.dataset similarity index 100% rename from src/spx/.x/help/batch.transcription.create.dataset rename to src/clis/spx/.x/help/batch.transcription.create.dataset diff --git a/src/spx/.x/help/batch.transcription.create.diarization b/src/clis/spx/.x/help/batch.transcription.create.diarization similarity index 100% rename from src/spx/.x/help/batch.transcription.create.diarization rename to src/clis/spx/.x/help/batch.transcription.create.diarization diff --git a/src/spx/.x/help/batch.transcription.create.language b/src/clis/spx/.x/help/batch.transcription.create.language similarity index 100% rename from src/spx/.x/help/batch.transcription.create.language rename to src/clis/spx/.x/help/batch.transcription.create.language diff --git a/src/spx/.x/help/batch.transcription.create.model b/src/clis/spx/.x/help/batch.transcription.create.model similarity index 100% rename from src/spx/.x/help/batch.transcription.create.model rename to src/clis/spx/.x/help/batch.transcription.create.model diff --git a/src/spx/.x/help/batch.transcription.create.profanity.filter b/src/clis/spx/.x/help/batch.transcription.create.profanity.filter similarity index 100% rename from src/spx/.x/help/batch.transcription.create.profanity.filter rename to src/clis/spx/.x/help/batch.transcription.create.profanity.filter diff --git a/src/spx/.x/help/batch.transcription.create.properties b/src/clis/spx/.x/help/batch.transcription.create.properties similarity index 100% rename from src/spx/.x/help/batch.transcription.create.properties rename to src/clis/spx/.x/help/batch.transcription.create.properties diff --git a/src/spx/.x/help/batch.transcription.create.punctuation.mode b/src/clis/spx/.x/help/batch.transcription.create.punctuation.mode similarity index 100% rename from src/spx/.x/help/batch.transcription.create.punctuation.mode rename to src/clis/spx/.x/help/batch.transcription.create.punctuation.mode diff --git a/src/spx/.x/help/batch.transcription.create.word.level.timing b/src/clis/spx/.x/help/batch.transcription.create.word.level.timing similarity index 100% rename from src/spx/.x/help/batch.transcription.create.word.level.timing rename to src/clis/spx/.x/help/batch.transcription.create.word.level.timing diff --git a/src/spx/.x/help/batch.transcription.delete b/src/clis/spx/.x/help/batch.transcription.delete similarity index 100% rename from src/spx/.x/help/batch.transcription.delete rename to src/clis/spx/.x/help/batch.transcription.delete diff --git a/src/spx/.x/help/batch.transcription.delete.advanced b/src/clis/spx/.x/help/batch.transcription.delete.advanced similarity index 100% rename from src/spx/.x/help/batch.transcription.delete.advanced rename to src/clis/spx/.x/help/batch.transcription.delete.advanced diff --git a/src/spx/.x/help/batch.transcription.description b/src/clis/spx/.x/help/batch.transcription.description similarity index 100% rename from src/spx/.x/help/batch.transcription.description rename to src/clis/spx/.x/help/batch.transcription.description diff --git a/src/spx/.x/help/batch.transcription.download b/src/clis/spx/.x/help/batch.transcription.download similarity index 100% rename from src/spx/.x/help/batch.transcription.download rename to src/clis/spx/.x/help/batch.transcription.download diff --git a/src/spx/.x/help/batch.transcription.download.advanced b/src/clis/spx/.x/help/batch.transcription.download.advanced similarity index 100% rename from src/spx/.x/help/batch.transcription.download.advanced rename to src/clis/spx/.x/help/batch.transcription.download.advanced diff --git a/src/spx/.x/help/batch.transcription.examples b/src/clis/spx/.x/help/batch.transcription.examples similarity index 100% rename from src/spx/.x/help/batch.transcription.examples rename to src/clis/spx/.x/help/batch.transcription.examples diff --git a/src/spx/.x/help/batch.transcription.list b/src/clis/spx/.x/help/batch.transcription.list similarity index 100% rename from src/spx/.x/help/batch.transcription.list rename to src/clis/spx/.x/help/batch.transcription.list diff --git a/src/spx/.x/help/batch.transcription.list.advanced b/src/clis/spx/.x/help/batch.transcription.list.advanced similarity index 100% rename from src/spx/.x/help/batch.transcription.list.advanced rename to src/clis/spx/.x/help/batch.transcription.list.advanced diff --git a/src/spx/.x/help/batch.transcription.list.files b/src/clis/spx/.x/help/batch.transcription.list.files similarity index 100% rename from src/spx/.x/help/batch.transcription.list.files rename to src/clis/spx/.x/help/batch.transcription.list.files diff --git a/src/spx/.x/help/batch.transcription.list.languages b/src/clis/spx/.x/help/batch.transcription.list.languages similarity index 100% rename from src/spx/.x/help/batch.transcription.list.languages rename to src/clis/spx/.x/help/batch.transcription.list.languages diff --git a/src/spx/.x/help/batch.transcription.list.transcriptions b/src/clis/spx/.x/help/batch.transcription.list.transcriptions similarity index 100% rename from src/spx/.x/help/batch.transcription.list.transcriptions rename to src/clis/spx/.x/help/batch.transcription.list.transcriptions diff --git a/src/spx/.x/help/batch.transcription.more.examples b/src/clis/spx/.x/help/batch.transcription.more.examples similarity index 100% rename from src/spx/.x/help/batch.transcription.more.examples rename to src/clis/spx/.x/help/batch.transcription.more.examples diff --git a/src/spx/.x/help/batch.transcription.name b/src/clis/spx/.x/help/batch.transcription.name similarity index 100% rename from src/spx/.x/help/batch.transcription.name rename to src/clis/spx/.x/help/batch.transcription.name diff --git a/src/spx/.x/help/batch.transcription.onprem b/src/clis/spx/.x/help/batch.transcription.onprem similarity index 100% rename from src/spx/.x/help/batch.transcription.onprem rename to src/clis/spx/.x/help/batch.transcription.onprem diff --git a/src/spx/.x/help/batch.transcription.onprem.create b/src/clis/spx/.x/help/batch.transcription.onprem.create similarity index 100% rename from src/spx/.x/help/batch.transcription.onprem.create rename to src/clis/spx/.x/help/batch.transcription.onprem.create diff --git a/src/spx/.x/help/batch.transcription.onprem.delete b/src/clis/spx/.x/help/batch.transcription.onprem.delete similarity index 100% rename from src/spx/.x/help/batch.transcription.onprem.delete rename to src/clis/spx/.x/help/batch.transcription.onprem.delete diff --git a/src/spx/.x/help/batch.transcription.onprem.endpoints b/src/clis/spx/.x/help/batch.transcription.onprem.endpoints similarity index 100% rename from src/spx/.x/help/batch.transcription.onprem.endpoints rename to src/clis/spx/.x/help/batch.transcription.onprem.endpoints diff --git a/src/spx/.x/help/batch.transcription.onprem.list b/src/clis/spx/.x/help/batch.transcription.onprem.list similarity index 100% rename from src/spx/.x/help/batch.transcription.onprem.list rename to src/clis/spx/.x/help/batch.transcription.onprem.list diff --git a/src/spx/.x/help/batch.transcription.onprem.status b/src/clis/spx/.x/help/batch.transcription.onprem.status similarity index 100% rename from src/spx/.x/help/batch.transcription.onprem.status rename to src/clis/spx/.x/help/batch.transcription.onprem.status diff --git a/src/spx/.x/help/batch.transcription.project b/src/clis/spx/.x/help/batch.transcription.project similarity index 100% rename from src/spx/.x/help/batch.transcription.project rename to src/clis/spx/.x/help/batch.transcription.project diff --git a/src/spx/.x/help/batch.transcription.reference b/src/clis/spx/.x/help/batch.transcription.reference similarity index 100% rename from src/spx/.x/help/batch.transcription.reference rename to src/clis/spx/.x/help/batch.transcription.reference diff --git a/src/spx/.x/help/batch.transcription.status b/src/clis/spx/.x/help/batch.transcription.status similarity index 100% rename from src/spx/.x/help/batch.transcription.status rename to src/clis/spx/.x/help/batch.transcription.status diff --git a/src/spx/.x/help/batch.transcription.status.advanced b/src/clis/spx/.x/help/batch.transcription.status.advanced similarity index 100% rename from src/spx/.x/help/batch.transcription.status.advanced rename to src/clis/spx/.x/help/batch.transcription.status.advanced diff --git a/src/spx/.x/help/batch.transcription.update b/src/clis/spx/.x/help/batch.transcription.update similarity index 100% rename from src/spx/.x/help/batch.transcription.update rename to src/clis/spx/.x/help/batch.transcription.update diff --git a/src/spx/.x/help/batch.transcription.update.advanced b/src/clis/spx/.x/help/batch.transcription.update.advanced similarity index 100% rename from src/spx/.x/help/batch.transcription.update.advanced rename to src/clis/spx/.x/help/batch.transcription.update.advanced diff --git a/src/spx/.x/help/batch.transcription.wait b/src/clis/spx/.x/help/batch.transcription.wait similarity index 100% rename from src/spx/.x/help/batch.transcription.wait rename to src/clis/spx/.x/help/batch.transcription.wait diff --git a/src/spx/.x/help/batch.zip b/src/clis/spx/.x/help/batch.zip similarity index 100% rename from src/spx/.x/help/batch.zip rename to src/clis/spx/.x/help/batch.zip diff --git a/src/spx/.x/help/check b/src/clis/spx/.x/help/check similarity index 100% rename from src/spx/.x/help/check rename to src/clis/spx/.x/help/check diff --git a/src/spx/.x/help/check.advanced b/src/clis/spx/.x/help/check.advanced similarity index 100% rename from src/spx/.x/help/check.advanced rename to src/clis/spx/.x/help/check.advanced diff --git a/src/spx/.x/help/check.examples b/src/clis/spx/.x/help/check.examples similarity index 100% rename from src/spx/.x/help/check.examples rename to src/clis/spx/.x/help/check.examples diff --git a/src/spx/.x/help/check.result b/src/clis/spx/.x/help/check.result similarity index 100% rename from src/spx/.x/help/check.result rename to src/clis/spx/.x/help/check.result diff --git a/src/spx/.x/help/config b/src/clis/spx/.x/help/config similarity index 100% rename from src/spx/.x/help/config rename to src/clis/spx/.x/help/config diff --git a/src/spx/.x/help/config.add b/src/clis/spx/.x/help/config.add similarity index 100% rename from src/spx/.x/help/config.add rename to src/clis/spx/.x/help/config.add diff --git a/src/spx/.x/help/config.advanced b/src/clis/spx/.x/help/config.advanced similarity index 100% rename from src/spx/.x/help/config.advanced rename to src/clis/spx/.x/help/config.advanced diff --git a/src/spx/.x/help/config.clear b/src/clis/spx/.x/help/config.clear similarity index 100% rename from src/spx/.x/help/config.clear rename to src/clis/spx/.x/help/config.clear diff --git a/src/spx/.x/help/config.command b/src/clis/spx/.x/help/config.command similarity index 100% rename from src/spx/.x/help/config.command rename to src/clis/spx/.x/help/config.command diff --git a/src/spx/.x/help/config.examples b/src/clis/spx/.x/help/config.examples similarity index 100% rename from src/spx/.x/help/config.examples rename to src/clis/spx/.x/help/config.examples diff --git a/src/spx/.x/help/config.find b/src/clis/spx/.x/help/config.find similarity index 100% rename from src/spx/.x/help/config.find rename to src/clis/spx/.x/help/config.find diff --git a/src/spx/.x/help/config.hive b/src/clis/spx/.x/help/config.hive similarity index 100% rename from src/spx/.x/help/config.hive rename to src/clis/spx/.x/help/config.hive diff --git a/src/spx/.x/help/config.region b/src/clis/spx/.x/help/config.region similarity index 100% rename from src/spx/.x/help/config.region rename to src/clis/spx/.x/help/config.region diff --git a/src/spx/.x/help/config.scope b/src/clis/spx/.x/help/config.scope similarity index 100% rename from src/spx/.x/help/config.scope rename to src/clis/spx/.x/help/config.scope diff --git a/src/spx/.x/help/config.set b/src/clis/spx/.x/help/config.set similarity index 100% rename from src/spx/.x/help/config.set rename to src/clis/spx/.x/help/config.set diff --git a/src/spx/.x/help/connect b/src/clis/spx/.x/help/connect similarity index 100% rename from src/spx/.x/help/connect rename to src/clis/spx/.x/help/connect diff --git a/src/spx/.x/help/continuous b/src/clis/spx/.x/help/continuous similarity index 100% rename from src/spx/.x/help/continuous rename to src/clis/spx/.x/help/continuous diff --git a/src/spx/.x/help/conversation b/src/clis/spx/.x/help/conversation similarity index 100% rename from src/spx/.x/help/conversation rename to src/clis/spx/.x/help/conversation diff --git a/src/spx/.x/help/conversation.id b/src/clis/spx/.x/help/conversation.id similarity index 100% rename from src/spx/.x/help/conversation.id rename to src/clis/spx/.x/help/conversation.id diff --git a/src/spx/.x/help/csr b/src/clis/spx/.x/help/csr similarity index 100% rename from src/spx/.x/help/csr rename to src/clis/spx/.x/help/csr diff --git a/src/spx/.x/help/csr.dataset b/src/clis/spx/.x/help/csr.dataset similarity index 100% rename from src/spx/.x/help/csr.dataset rename to src/clis/spx/.x/help/csr.dataset diff --git a/src/spx/.x/help/csr.dataset.create b/src/clis/spx/.x/help/csr.dataset.create similarity index 100% rename from src/spx/.x/help/csr.dataset.create rename to src/clis/spx/.x/help/csr.dataset.create diff --git a/src/spx/.x/help/csr.dataset.create.content b/src/clis/spx/.x/help/csr.dataset.create.content similarity index 100% rename from src/spx/.x/help/csr.dataset.create.content rename to src/clis/spx/.x/help/csr.dataset.create.content diff --git a/src/spx/.x/help/csr.dataset.create.kind b/src/clis/spx/.x/help/csr.dataset.create.kind similarity index 100% rename from src/spx/.x/help/csr.dataset.create.kind rename to src/clis/spx/.x/help/csr.dataset.create.kind diff --git a/src/spx/.x/help/csr.dataset.create.language b/src/clis/spx/.x/help/csr.dataset.create.language similarity index 100% rename from src/spx/.x/help/csr.dataset.create.language rename to src/clis/spx/.x/help/csr.dataset.create.language diff --git a/src/spx/.x/help/csr.dataset.delete b/src/clis/spx/.x/help/csr.dataset.delete similarity index 100% rename from src/spx/.x/help/csr.dataset.delete rename to src/clis/spx/.x/help/csr.dataset.delete diff --git a/src/spx/.x/help/csr.dataset.delete.dataset b/src/clis/spx/.x/help/csr.dataset.delete.dataset similarity index 100% rename from src/spx/.x/help/csr.dataset.delete.dataset rename to src/clis/spx/.x/help/csr.dataset.delete.dataset diff --git a/src/spx/.x/help/csr.dataset.description b/src/clis/spx/.x/help/csr.dataset.description similarity index 100% rename from src/spx/.x/help/csr.dataset.description rename to src/clis/spx/.x/help/csr.dataset.description diff --git a/src/spx/.x/help/csr.dataset.download b/src/clis/spx/.x/help/csr.dataset.download similarity index 100% rename from src/spx/.x/help/csr.dataset.download rename to src/clis/spx/.x/help/csr.dataset.download diff --git a/src/spx/.x/help/csr.dataset.download.file b/src/clis/spx/.x/help/csr.dataset.download.file similarity index 100% rename from src/spx/.x/help/csr.dataset.download.file rename to src/clis/spx/.x/help/csr.dataset.download.file diff --git a/src/spx/.x/help/csr.dataset.list b/src/clis/spx/.x/help/csr.dataset.list similarity index 100% rename from src/spx/.x/help/csr.dataset.list rename to src/clis/spx/.x/help/csr.dataset.list diff --git a/src/spx/.x/help/csr.dataset.list.datasets b/src/clis/spx/.x/help/csr.dataset.list.datasets similarity index 100% rename from src/spx/.x/help/csr.dataset.list.datasets rename to src/clis/spx/.x/help/csr.dataset.list.datasets diff --git a/src/spx/.x/help/csr.dataset.list.files b/src/clis/spx/.x/help/csr.dataset.list.files similarity index 100% rename from src/spx/.x/help/csr.dataset.list.files rename to src/clis/spx/.x/help/csr.dataset.list.files diff --git a/src/spx/.x/help/csr.dataset.list.languages b/src/clis/spx/.x/help/csr.dataset.list.languages similarity index 100% rename from src/spx/.x/help/csr.dataset.list.languages rename to src/clis/spx/.x/help/csr.dataset.list.languages diff --git a/src/spx/.x/help/csr.dataset.list.project b/src/clis/spx/.x/help/csr.dataset.list.project similarity index 100% rename from src/spx/.x/help/csr.dataset.list.project rename to src/clis/spx/.x/help/csr.dataset.list.project diff --git a/src/spx/.x/help/csr.dataset.name b/src/clis/spx/.x/help/csr.dataset.name similarity index 100% rename from src/spx/.x/help/csr.dataset.name rename to src/clis/spx/.x/help/csr.dataset.name diff --git a/src/spx/.x/help/csr.dataset.project b/src/clis/spx/.x/help/csr.dataset.project similarity index 100% rename from src/spx/.x/help/csr.dataset.project rename to src/clis/spx/.x/help/csr.dataset.project diff --git a/src/spx/.x/help/csr.dataset.status b/src/clis/spx/.x/help/csr.dataset.status similarity index 100% rename from src/spx/.x/help/csr.dataset.status rename to src/clis/spx/.x/help/csr.dataset.status diff --git a/src/spx/.x/help/csr.dataset.status.dataset b/src/clis/spx/.x/help/csr.dataset.status.dataset similarity index 100% rename from src/spx/.x/help/csr.dataset.status.dataset rename to src/clis/spx/.x/help/csr.dataset.status.dataset diff --git a/src/spx/.x/help/csr.dataset.update b/src/clis/spx/.x/help/csr.dataset.update similarity index 100% rename from src/spx/.x/help/csr.dataset.update rename to src/clis/spx/.x/help/csr.dataset.update diff --git a/src/spx/.x/help/csr.dataset.update.dataset b/src/clis/spx/.x/help/csr.dataset.update.dataset similarity index 100% rename from src/spx/.x/help/csr.dataset.update.dataset rename to src/clis/spx/.x/help/csr.dataset.update.dataset diff --git a/src/spx/.x/help/csr.dataset.upload b/src/clis/spx/.x/help/csr.dataset.upload similarity index 100% rename from src/spx/.x/help/csr.dataset.upload rename to src/clis/spx/.x/help/csr.dataset.upload diff --git a/src/spx/.x/help/csr.dataset.upload.data b/src/clis/spx/.x/help/csr.dataset.upload.data similarity index 100% rename from src/spx/.x/help/csr.dataset.upload.data rename to src/clis/spx/.x/help/csr.dataset.upload.data diff --git a/src/spx/.x/help/csr.dataset.upload.kind b/src/clis/spx/.x/help/csr.dataset.upload.kind similarity index 100% rename from src/spx/.x/help/csr.dataset.upload.kind rename to src/clis/spx/.x/help/csr.dataset.upload.kind diff --git a/src/spx/.x/help/csr.dataset.upload.language b/src/clis/spx/.x/help/csr.dataset.upload.language similarity index 100% rename from src/spx/.x/help/csr.dataset.upload.language rename to src/clis/spx/.x/help/csr.dataset.upload.language diff --git a/src/spx/.x/help/csr.download b/src/clis/spx/.x/help/csr.download similarity index 100% rename from src/spx/.x/help/csr.download rename to src/clis/spx/.x/help/csr.download diff --git a/src/spx/.x/help/csr.download.dataset.file b/src/clis/spx/.x/help/csr.download.dataset.file similarity index 100% rename from src/spx/.x/help/csr.download.dataset.file rename to src/clis/spx/.x/help/csr.download.dataset.file diff --git a/src/spx/.x/help/csr.download.endpoint.log b/src/clis/spx/.x/help/csr.download.endpoint.log similarity index 100% rename from src/spx/.x/help/csr.download.endpoint.log rename to src/clis/spx/.x/help/csr.download.endpoint.log diff --git a/src/spx/.x/help/csr.download.file b/src/clis/spx/.x/help/csr.download.file similarity index 100% rename from src/spx/.x/help/csr.download.file rename to src/clis/spx/.x/help/csr.download.file diff --git a/src/spx/.x/help/csr.download.url b/src/clis/spx/.x/help/csr.download.url similarity index 100% rename from src/spx/.x/help/csr.download.url rename to src/clis/spx/.x/help/csr.download.url diff --git a/src/spx/.x/help/csr.endpoint b/src/clis/spx/.x/help/csr.endpoint similarity index 100% rename from src/spx/.x/help/csr.endpoint rename to src/clis/spx/.x/help/csr.endpoint diff --git a/src/spx/.x/help/csr.endpoint.create b/src/clis/spx/.x/help/csr.endpoint.create similarity index 100% rename from src/spx/.x/help/csr.endpoint.create rename to src/clis/spx/.x/help/csr.endpoint.create diff --git a/src/spx/.x/help/csr.endpoint.create.language b/src/clis/spx/.x/help/csr.endpoint.create.language similarity index 100% rename from src/spx/.x/help/csr.endpoint.create.language rename to src/clis/spx/.x/help/csr.endpoint.create.language diff --git a/src/spx/.x/help/csr.endpoint.create.model b/src/clis/spx/.x/help/csr.endpoint.create.model similarity index 100% rename from src/spx/.x/help/csr.endpoint.create.model rename to src/clis/spx/.x/help/csr.endpoint.create.model diff --git a/src/spx/.x/help/csr.endpoint.create.text b/src/clis/spx/.x/help/csr.endpoint.create.text similarity index 100% rename from src/spx/.x/help/csr.endpoint.create.text rename to src/clis/spx/.x/help/csr.endpoint.create.text diff --git a/src/spx/.x/help/csr.endpoint.delete b/src/clis/spx/.x/help/csr.endpoint.delete similarity index 100% rename from src/spx/.x/help/csr.endpoint.delete rename to src/clis/spx/.x/help/csr.endpoint.delete diff --git a/src/spx/.x/help/csr.endpoint.delete.endpoint b/src/clis/spx/.x/help/csr.endpoint.delete.endpoint similarity index 100% rename from src/spx/.x/help/csr.endpoint.delete.endpoint rename to src/clis/spx/.x/help/csr.endpoint.delete.endpoint diff --git a/src/spx/.x/help/csr.endpoint.delete.endpoint.log b/src/clis/spx/.x/help/csr.endpoint.delete.endpoint.log similarity index 100% rename from src/spx/.x/help/csr.endpoint.delete.endpoint.log rename to src/clis/spx/.x/help/csr.endpoint.delete.endpoint.log diff --git a/src/spx/.x/help/csr.endpoint.description b/src/clis/spx/.x/help/csr.endpoint.description similarity index 100% rename from src/spx/.x/help/csr.endpoint.description rename to src/clis/spx/.x/help/csr.endpoint.description diff --git a/src/spx/.x/help/csr.endpoint.download b/src/clis/spx/.x/help/csr.endpoint.download similarity index 100% rename from src/spx/.x/help/csr.endpoint.download rename to src/clis/spx/.x/help/csr.endpoint.download diff --git a/src/spx/.x/help/csr.endpoint.download.endpoint.log b/src/clis/spx/.x/help/csr.endpoint.download.endpoint.log similarity index 100% rename from src/spx/.x/help/csr.endpoint.download.endpoint.log rename to src/clis/spx/.x/help/csr.endpoint.download.endpoint.log diff --git a/src/spx/.x/help/csr.endpoint.examples b/src/clis/spx/.x/help/csr.endpoint.examples similarity index 100% rename from src/spx/.x/help/csr.endpoint.examples rename to src/clis/spx/.x/help/csr.endpoint.examples diff --git a/src/spx/.x/help/csr.endpoint.list b/src/clis/spx/.x/help/csr.endpoint.list similarity index 100% rename from src/spx/.x/help/csr.endpoint.list rename to src/clis/spx/.x/help/csr.endpoint.list diff --git a/src/spx/.x/help/csr.endpoint.list.endpoint.languages b/src/clis/spx/.x/help/csr.endpoint.list.endpoint.languages similarity index 100% rename from src/spx/.x/help/csr.endpoint.list.endpoint.languages rename to src/clis/spx/.x/help/csr.endpoint.list.endpoint.languages diff --git a/src/spx/.x/help/csr.endpoint.list.endpoint.logs b/src/clis/spx/.x/help/csr.endpoint.list.endpoint.logs similarity index 100% rename from src/spx/.x/help/csr.endpoint.list.endpoint.logs rename to src/clis/spx/.x/help/csr.endpoint.list.endpoint.logs diff --git a/src/spx/.x/help/csr.endpoint.list.endpoints b/src/clis/spx/.x/help/csr.endpoint.list.endpoints similarity index 100% rename from src/spx/.x/help/csr.endpoint.list.endpoints rename to src/clis/spx/.x/help/csr.endpoint.list.endpoints diff --git a/src/spx/.x/help/csr.endpoint.list.project b/src/clis/spx/.x/help/csr.endpoint.list.project similarity index 100% rename from src/spx/.x/help/csr.endpoint.list.project rename to src/clis/spx/.x/help/csr.endpoint.list.project diff --git a/src/spx/.x/help/csr.endpoint.name b/src/clis/spx/.x/help/csr.endpoint.name similarity index 100% rename from src/spx/.x/help/csr.endpoint.name rename to src/clis/spx/.x/help/csr.endpoint.name diff --git a/src/spx/.x/help/csr.endpoint.project b/src/clis/spx/.x/help/csr.endpoint.project similarity index 100% rename from src/spx/.x/help/csr.endpoint.project rename to src/clis/spx/.x/help/csr.endpoint.project diff --git a/src/spx/.x/help/csr.endpoint.status b/src/clis/spx/.x/help/csr.endpoint.status similarity index 100% rename from src/spx/.x/help/csr.endpoint.status rename to src/clis/spx/.x/help/csr.endpoint.status diff --git a/src/spx/.x/help/csr.endpoint.status.endpoint b/src/clis/spx/.x/help/csr.endpoint.status.endpoint similarity index 100% rename from src/spx/.x/help/csr.endpoint.status.endpoint rename to src/clis/spx/.x/help/csr.endpoint.status.endpoint diff --git a/src/spx/.x/help/csr.endpoint.update b/src/clis/spx/.x/help/csr.endpoint.update similarity index 100% rename from src/spx/.x/help/csr.endpoint.update rename to src/clis/spx/.x/help/csr.endpoint.update diff --git a/src/spx/.x/help/csr.endpoint.update.endpoint b/src/clis/spx/.x/help/csr.endpoint.update.endpoint similarity index 100% rename from src/spx/.x/help/csr.endpoint.update.endpoint rename to src/clis/spx/.x/help/csr.endpoint.update.endpoint diff --git a/src/spx/.x/help/csr.evaluation b/src/clis/spx/.x/help/csr.evaluation similarity index 100% rename from src/spx/.x/help/csr.evaluation rename to src/clis/spx/.x/help/csr.evaluation diff --git a/src/spx/.x/help/csr.evaluation.create b/src/clis/spx/.x/help/csr.evaluation.create similarity index 100% rename from src/spx/.x/help/csr.evaluation.create rename to src/clis/spx/.x/help/csr.evaluation.create diff --git a/src/spx/.x/help/csr.evaluation.delete b/src/clis/spx/.x/help/csr.evaluation.delete similarity index 100% rename from src/spx/.x/help/csr.evaluation.delete rename to src/clis/spx/.x/help/csr.evaluation.delete diff --git a/src/spx/.x/help/csr.evaluation.examples b/src/clis/spx/.x/help/csr.evaluation.examples similarity index 100% rename from src/spx/.x/help/csr.evaluation.examples rename to src/clis/spx/.x/help/csr.evaluation.examples diff --git a/src/spx/.x/help/csr.evaluation.list b/src/clis/spx/.x/help/csr.evaluation.list similarity index 100% rename from src/spx/.x/help/csr.evaluation.list rename to src/clis/spx/.x/help/csr.evaluation.list diff --git a/src/spx/.x/help/csr.evaluation.status b/src/clis/spx/.x/help/csr.evaluation.status similarity index 100% rename from src/spx/.x/help/csr.evaluation.status rename to src/clis/spx/.x/help/csr.evaluation.status diff --git a/src/spx/.x/help/csr.evaluation.update b/src/clis/spx/.x/help/csr.evaluation.update similarity index 100% rename from src/spx/.x/help/csr.evaluation.update rename to src/clis/spx/.x/help/csr.evaluation.update diff --git a/src/spx/.x/help/csr.examples b/src/clis/spx/.x/help/csr.examples similarity index 100% rename from src/spx/.x/help/csr.examples rename to src/clis/spx/.x/help/csr.examples diff --git a/src/spx/.x/help/csr.foreach b/src/clis/spx/.x/help/csr.foreach similarity index 100% rename from src/spx/.x/help/csr.foreach rename to src/clis/spx/.x/help/csr.foreach diff --git a/src/spx/.x/help/csr.input.path b/src/clis/spx/.x/help/csr.input.path similarity index 100% rename from src/spx/.x/help/csr.input.path rename to src/clis/spx/.x/help/csr.input.path diff --git a/src/spx/.x/help/csr.key b/src/clis/spx/.x/help/csr.key similarity index 100% rename from src/spx/.x/help/csr.key rename to src/clis/spx/.x/help/csr.key diff --git a/src/spx/.x/help/csr.list b/src/clis/spx/.x/help/csr.list similarity index 100% rename from src/spx/.x/help/csr.list rename to src/clis/spx/.x/help/csr.list diff --git a/src/spx/.x/help/csr.list.base.models b/src/clis/spx/.x/help/csr.list.base.models similarity index 100% rename from src/spx/.x/help/csr.list.base.models rename to src/clis/spx/.x/help/csr.list.base.models diff --git a/src/spx/.x/help/csr.list.dataset.languages b/src/clis/spx/.x/help/csr.list.dataset.languages similarity index 100% rename from src/spx/.x/help/csr.list.dataset.languages rename to src/clis/spx/.x/help/csr.list.dataset.languages diff --git a/src/spx/.x/help/csr.list.datasets b/src/clis/spx/.x/help/csr.list.datasets similarity index 100% rename from src/spx/.x/help/csr.list.datasets rename to src/clis/spx/.x/help/csr.list.datasets diff --git a/src/spx/.x/help/csr.list.endpoint.languages b/src/clis/spx/.x/help/csr.list.endpoint.languages similarity index 100% rename from src/spx/.x/help/csr.list.endpoint.languages rename to src/clis/spx/.x/help/csr.list.endpoint.languages diff --git a/src/spx/.x/help/csr.list.endpoints b/src/clis/spx/.x/help/csr.list.endpoints similarity index 100% rename from src/spx/.x/help/csr.list.endpoints rename to src/clis/spx/.x/help/csr.list.endpoints diff --git a/src/spx/.x/help/csr.list.model.languages b/src/clis/spx/.x/help/csr.list.model.languages similarity index 100% rename from src/spx/.x/help/csr.list.model.languages rename to src/clis/spx/.x/help/csr.list.model.languages diff --git a/src/spx/.x/help/csr.list.models b/src/clis/spx/.x/help/csr.list.models similarity index 100% rename from src/spx/.x/help/csr.list.models rename to src/clis/spx/.x/help/csr.list.models diff --git a/src/spx/.x/help/csr.list.project.languages b/src/clis/spx/.x/help/csr.list.project.languages similarity index 100% rename from src/spx/.x/help/csr.list.project.languages rename to src/clis/spx/.x/help/csr.list.project.languages diff --git a/src/spx/.x/help/csr.list.projects b/src/clis/spx/.x/help/csr.list.projects similarity index 100% rename from src/spx/.x/help/csr.list.projects rename to src/clis/spx/.x/help/csr.list.projects diff --git a/src/spx/.x/help/csr.model b/src/clis/spx/.x/help/csr.model similarity index 100% rename from src/spx/.x/help/csr.model rename to src/clis/spx/.x/help/csr.model diff --git a/src/spx/.x/help/csr.model.copy b/src/clis/spx/.x/help/csr.model.copy similarity index 100% rename from src/spx/.x/help/csr.model.copy rename to src/clis/spx/.x/help/csr.model.copy diff --git a/src/spx/.x/help/csr.model.copy.target b/src/clis/spx/.x/help/csr.model.copy.target similarity index 100% rename from src/spx/.x/help/csr.model.copy.target rename to src/clis/spx/.x/help/csr.model.copy.target diff --git a/src/spx/.x/help/csr.model.create b/src/clis/spx/.x/help/csr.model.create similarity index 100% rename from src/spx/.x/help/csr.model.create rename to src/clis/spx/.x/help/csr.model.create diff --git a/src/spx/.x/help/csr.model.create.base b/src/clis/spx/.x/help/csr.model.create.base similarity index 100% rename from src/spx/.x/help/csr.model.create.base rename to src/clis/spx/.x/help/csr.model.create.base diff --git a/src/spx/.x/help/csr.model.create.dataset b/src/clis/spx/.x/help/csr.model.create.dataset similarity index 100% rename from src/spx/.x/help/csr.model.create.dataset rename to src/clis/spx/.x/help/csr.model.create.dataset diff --git a/src/spx/.x/help/csr.model.create.datasets b/src/clis/spx/.x/help/csr.model.create.datasets similarity index 100% rename from src/spx/.x/help/csr.model.create.datasets rename to src/clis/spx/.x/help/csr.model.create.datasets diff --git a/src/spx/.x/help/csr.model.create.language b/src/clis/spx/.x/help/csr.model.create.language similarity index 100% rename from src/spx/.x/help/csr.model.create.language rename to src/clis/spx/.x/help/csr.model.create.language diff --git a/src/spx/.x/help/csr.model.create.text b/src/clis/spx/.x/help/csr.model.create.text similarity index 100% rename from src/spx/.x/help/csr.model.create.text rename to src/clis/spx/.x/help/csr.model.create.text diff --git a/src/spx/.x/help/csr.model.delete b/src/clis/spx/.x/help/csr.model.delete similarity index 100% rename from src/spx/.x/help/csr.model.delete rename to src/clis/spx/.x/help/csr.model.delete diff --git a/src/spx/.x/help/csr.model.delete.model b/src/clis/spx/.x/help/csr.model.delete.model similarity index 100% rename from src/spx/.x/help/csr.model.delete.model rename to src/clis/spx/.x/help/csr.model.delete.model diff --git a/src/spx/.x/help/csr.model.description b/src/clis/spx/.x/help/csr.model.description similarity index 100% rename from src/spx/.x/help/csr.model.description rename to src/clis/spx/.x/help/csr.model.description diff --git a/src/spx/.x/help/csr.model.examples b/src/clis/spx/.x/help/csr.model.examples similarity index 100% rename from src/spx/.x/help/csr.model.examples rename to src/clis/spx/.x/help/csr.model.examples diff --git a/src/spx/.x/help/csr.model.list b/src/clis/spx/.x/help/csr.model.list similarity index 100% rename from src/spx/.x/help/csr.model.list rename to src/clis/spx/.x/help/csr.model.list diff --git a/src/spx/.x/help/csr.model.list.base.models b/src/clis/spx/.x/help/csr.model.list.base.models similarity index 100% rename from src/spx/.x/help/csr.model.list.base.models rename to src/clis/spx/.x/help/csr.model.list.base.models diff --git a/src/spx/.x/help/csr.model.list.model.languages b/src/clis/spx/.x/help/csr.model.list.model.languages similarity index 100% rename from src/spx/.x/help/csr.model.list.model.languages rename to src/clis/spx/.x/help/csr.model.list.model.languages diff --git a/src/spx/.x/help/csr.model.list.model.project b/src/clis/spx/.x/help/csr.model.list.model.project similarity index 100% rename from src/spx/.x/help/csr.model.list.model.project rename to src/clis/spx/.x/help/csr.model.list.model.project diff --git a/src/spx/.x/help/csr.model.list.models b/src/clis/spx/.x/help/csr.model.list.models similarity index 100% rename from src/spx/.x/help/csr.model.list.models rename to src/clis/spx/.x/help/csr.model.list.models diff --git a/src/spx/.x/help/csr.model.name b/src/clis/spx/.x/help/csr.model.name similarity index 100% rename from src/spx/.x/help/csr.model.name rename to src/clis/spx/.x/help/csr.model.name diff --git a/src/spx/.x/help/csr.model.project b/src/clis/spx/.x/help/csr.model.project similarity index 100% rename from src/spx/.x/help/csr.model.project rename to src/clis/spx/.x/help/csr.model.project diff --git a/src/spx/.x/help/csr.model.status b/src/clis/spx/.x/help/csr.model.status similarity index 100% rename from src/spx/.x/help/csr.model.status rename to src/clis/spx/.x/help/csr.model.status diff --git a/src/spx/.x/help/csr.model.status.model b/src/clis/spx/.x/help/csr.model.status.model similarity index 100% rename from src/spx/.x/help/csr.model.status.model rename to src/clis/spx/.x/help/csr.model.status.model diff --git a/src/spx/.x/help/csr.model.update b/src/clis/spx/.x/help/csr.model.update similarity index 100% rename from src/spx/.x/help/csr.model.update rename to src/clis/spx/.x/help/csr.model.update diff --git a/src/spx/.x/help/csr.model.update.model b/src/clis/spx/.x/help/csr.model.update.model similarity index 100% rename from src/spx/.x/help/csr.model.update.model rename to src/clis/spx/.x/help/csr.model.update.model diff --git a/src/spx/.x/help/csr.more.examples b/src/clis/spx/.x/help/csr.more.examples similarity index 100% rename from src/spx/.x/help/csr.more.examples rename to src/clis/spx/.x/help/csr.more.examples diff --git a/src/spx/.x/help/csr.output.file b/src/clis/spx/.x/help/csr.output.file similarity index 100% rename from src/spx/.x/help/csr.output.file rename to src/clis/spx/.x/help/csr.output.file diff --git a/src/spx/.x/help/csr.output.id b/src/clis/spx/.x/help/csr.output.id similarity index 100% rename from src/spx/.x/help/csr.output.id rename to src/clis/spx/.x/help/csr.output.id diff --git a/src/spx/.x/help/csr.output.json b/src/clis/spx/.x/help/csr.output.json similarity index 100% rename from src/spx/.x/help/csr.output.json rename to src/clis/spx/.x/help/csr.output.json diff --git a/src/spx/.x/help/csr.output.path b/src/clis/spx/.x/help/csr.output.path similarity index 100% rename from src/spx/.x/help/csr.output.path rename to src/clis/spx/.x/help/csr.output.path diff --git a/src/spx/.x/help/csr.output.url b/src/clis/spx/.x/help/csr.output.url similarity index 100% rename from src/spx/.x/help/csr.output.url rename to src/clis/spx/.x/help/csr.output.url diff --git a/src/spx/.x/help/csr.project b/src/clis/spx/.x/help/csr.project similarity index 100% rename from src/spx/.x/help/csr.project rename to src/clis/spx/.x/help/csr.project diff --git a/src/spx/.x/help/csr.project.create b/src/clis/spx/.x/help/csr.project.create similarity index 100% rename from src/spx/.x/help/csr.project.create rename to src/clis/spx/.x/help/csr.project.create diff --git a/src/spx/.x/help/csr.project.create.language b/src/clis/spx/.x/help/csr.project.create.language similarity index 100% rename from src/spx/.x/help/csr.project.create.language rename to src/clis/spx/.x/help/csr.project.create.language diff --git a/src/spx/.x/help/csr.project.delete b/src/clis/spx/.x/help/csr.project.delete similarity index 100% rename from src/spx/.x/help/csr.project.delete rename to src/clis/spx/.x/help/csr.project.delete diff --git a/src/spx/.x/help/csr.project.delete.project b/src/clis/spx/.x/help/csr.project.delete.project similarity index 100% rename from src/spx/.x/help/csr.project.delete.project rename to src/clis/spx/.x/help/csr.project.delete.project diff --git a/src/spx/.x/help/csr.project.description b/src/clis/spx/.x/help/csr.project.description similarity index 100% rename from src/spx/.x/help/csr.project.description rename to src/clis/spx/.x/help/csr.project.description diff --git a/src/spx/.x/help/csr.project.examples b/src/clis/spx/.x/help/csr.project.examples similarity index 100% rename from src/spx/.x/help/csr.project.examples rename to src/clis/spx/.x/help/csr.project.examples diff --git a/src/spx/.x/help/csr.project.list b/src/clis/spx/.x/help/csr.project.list similarity index 100% rename from src/spx/.x/help/csr.project.list rename to src/clis/spx/.x/help/csr.project.list diff --git a/src/spx/.x/help/csr.project.list.project.languages b/src/clis/spx/.x/help/csr.project.list.project.languages similarity index 100% rename from src/spx/.x/help/csr.project.list.project.languages rename to src/clis/spx/.x/help/csr.project.list.project.languages diff --git a/src/spx/.x/help/csr.project.list.projects b/src/clis/spx/.x/help/csr.project.list.projects similarity index 100% rename from src/spx/.x/help/csr.project.list.projects rename to src/clis/spx/.x/help/csr.project.list.projects diff --git a/src/spx/.x/help/csr.project.name b/src/clis/spx/.x/help/csr.project.name similarity index 100% rename from src/spx/.x/help/csr.project.name rename to src/clis/spx/.x/help/csr.project.name diff --git a/src/spx/.x/help/csr.project.status b/src/clis/spx/.x/help/csr.project.status similarity index 100% rename from src/spx/.x/help/csr.project.status rename to src/clis/spx/.x/help/csr.project.status diff --git a/src/spx/.x/help/csr.project.status.project b/src/clis/spx/.x/help/csr.project.status.project similarity index 100% rename from src/spx/.x/help/csr.project.status.project rename to src/clis/spx/.x/help/csr.project.status.project diff --git a/src/spx/.x/help/csr.project.update b/src/clis/spx/.x/help/csr.project.update similarity index 100% rename from src/spx/.x/help/csr.project.update rename to src/clis/spx/.x/help/csr.project.update diff --git a/src/spx/.x/help/csr.project.update.project b/src/clis/spx/.x/help/csr.project.update.project similarity index 100% rename from src/spx/.x/help/csr.project.update.project rename to src/clis/spx/.x/help/csr.project.update.project diff --git a/src/spx/.x/help/csr.region b/src/clis/spx/.x/help/csr.region similarity index 100% rename from src/spx/.x/help/csr.region rename to src/clis/spx/.x/help/csr.region diff --git a/src/spx/.x/help/csr.save b/src/clis/spx/.x/help/csr.save similarity index 100% rename from src/spx/.x/help/csr.save rename to src/clis/spx/.x/help/csr.save diff --git a/src/spx/.x/help/csr.url b/src/clis/spx/.x/help/csr.url similarity index 100% rename from src/spx/.x/help/csr.url rename to src/clis/spx/.x/help/csr.url diff --git a/src/spx/.x/help/csr.wait b/src/clis/spx/.x/help/csr.wait similarity index 100% rename from src/spx/.x/help/csr.wait rename to src/clis/spx/.x/help/csr.wait diff --git a/src/spx/.x/help/csr.zip b/src/clis/spx/.x/help/csr.zip similarity index 100% rename from src/spx/.x/help/csr.zip rename to src/clis/spx/.x/help/csr.zip diff --git a/src/spx/.x/help/customization b/src/clis/spx/.x/help/customization similarity index 100% rename from src/spx/.x/help/customization rename to src/clis/spx/.x/help/customization diff --git a/src/spx/.x/help/customize.categoryid b/src/clis/spx/.x/help/customize.categoryid similarity index 100% rename from src/spx/.x/help/customize.categoryid rename to src/clis/spx/.x/help/customize.categoryid diff --git a/src/spx/.x/help/customize.endpointid b/src/clis/spx/.x/help/customize.endpointid similarity index 100% rename from src/spx/.x/help/customize.endpointid rename to src/clis/spx/.x/help/customize.endpointid diff --git a/src/spx/.x/help/defaults b/src/clis/spx/.x/help/defaults similarity index 100% rename from src/spx/.x/help/defaults rename to src/clis/spx/.x/help/defaults diff --git a/src/spx/.x/help/dialog b/src/clis/spx/.x/help/dialog similarity index 100% rename from src/spx/.x/help/dialog rename to src/clis/spx/.x/help/dialog diff --git a/src/spx/.x/help/dialog.advanced b/src/clis/spx/.x/help/dialog.advanced similarity index 100% rename from src/spx/.x/help/dialog.advanced rename to src/clis/spx/.x/help/dialog.advanced diff --git a/src/spx/.x/help/dialog.bot b/src/clis/spx/.x/help/dialog.bot similarity index 100% rename from src/spx/.x/help/dialog.bot rename to src/clis/spx/.x/help/dialog.bot diff --git a/src/spx/.x/help/dialog.bot.continuous b/src/clis/spx/.x/help/dialog.bot.continuous similarity index 100% rename from src/spx/.x/help/dialog.bot.continuous rename to src/clis/spx/.x/help/dialog.bot.continuous diff --git a/src/spx/.x/help/dialog.bot.id b/src/clis/spx/.x/help/dialog.bot.id similarity index 100% rename from src/spx/.x/help/dialog.bot.id rename to src/clis/spx/.x/help/dialog.bot.id diff --git a/src/spx/.x/help/dialog.bot.input b/src/clis/spx/.x/help/dialog.bot.input similarity index 100% rename from src/spx/.x/help/dialog.bot.input rename to src/clis/spx/.x/help/dialog.bot.input diff --git a/src/spx/.x/help/dialog.bot.keyword b/src/clis/spx/.x/help/dialog.bot.keyword similarity index 100% rename from src/spx/.x/help/dialog.bot.keyword rename to src/clis/spx/.x/help/dialog.bot.keyword diff --git a/src/spx/.x/help/dialog.bot.once b/src/clis/spx/.x/help/dialog.bot.once similarity index 100% rename from src/spx/.x/help/dialog.bot.once rename to src/clis/spx/.x/help/dialog.bot.once diff --git a/src/spx/.x/help/dialog.bot.output b/src/clis/spx/.x/help/dialog.bot.output similarity index 100% rename from src/spx/.x/help/dialog.bot.output rename to src/clis/spx/.x/help/dialog.bot.output diff --git a/src/spx/.x/help/dialog.cc b/src/clis/spx/.x/help/dialog.cc similarity index 100% rename from src/spx/.x/help/dialog.cc rename to src/clis/spx/.x/help/dialog.cc diff --git a/src/spx/.x/help/dialog.customcommands b/src/clis/spx/.x/help/dialog.customcommands similarity index 100% rename from src/spx/.x/help/dialog.customcommands rename to src/clis/spx/.x/help/dialog.customcommands diff --git a/src/spx/.x/help/dialog.customcommands.appid b/src/clis/spx/.x/help/dialog.customcommands.appid similarity index 100% rename from src/spx/.x/help/dialog.customcommands.appid rename to src/clis/spx/.x/help/dialog.customcommands.appid diff --git a/src/spx/.x/help/dialog.customcommands.continuous b/src/clis/spx/.x/help/dialog.customcommands.continuous similarity index 100% rename from src/spx/.x/help/dialog.customcommands.continuous rename to src/clis/spx/.x/help/dialog.customcommands.continuous diff --git a/src/spx/.x/help/dialog.customcommands.input b/src/clis/spx/.x/help/dialog.customcommands.input similarity index 100% rename from src/spx/.x/help/dialog.customcommands.input rename to src/clis/spx/.x/help/dialog.customcommands.input diff --git a/src/spx/.x/help/dialog.customcommands.keyword b/src/clis/spx/.x/help/dialog.customcommands.keyword similarity index 100% rename from src/spx/.x/help/dialog.customcommands.keyword rename to src/clis/spx/.x/help/dialog.customcommands.keyword diff --git a/src/spx/.x/help/dialog.customcommands.once b/src/clis/spx/.x/help/dialog.customcommands.once similarity index 100% rename from src/spx/.x/help/dialog.customcommands.once rename to src/clis/spx/.x/help/dialog.customcommands.once diff --git a/src/spx/.x/help/dialog.customcommands.output b/src/clis/spx/.x/help/dialog.customcommands.output similarity index 100% rename from src/spx/.x/help/dialog.customcommands.output rename to src/clis/spx/.x/help/dialog.customcommands.output diff --git a/src/spx/.x/help/dialog.examples b/src/clis/spx/.x/help/dialog.examples similarity index 100% rename from src/spx/.x/help/dialog.examples rename to src/clis/spx/.x/help/dialog.examples diff --git a/src/spx/.x/help/display.post.processing b/src/clis/spx/.x/help/display.post.processing similarity index 100% rename from src/spx/.x/help/display.post.processing rename to src/clis/spx/.x/help/display.post.processing diff --git a/src/spx/.x/help/documentation b/src/clis/spx/.x/help/documentation similarity index 100% rename from src/spx/.x/help/documentation rename to src/clis/spx/.x/help/documentation diff --git a/src/spx/.x/help/endpoint b/src/clis/spx/.x/help/endpoint similarity index 100% rename from src/spx/.x/help/endpoint rename to src/clis/spx/.x/help/endpoint diff --git a/src/spx/.x/help/endpoint.examples b/src/clis/spx/.x/help/endpoint.examples similarity index 100% rename from src/spx/.x/help/endpoint.examples rename to src/clis/spx/.x/help/endpoint.examples diff --git a/src/spx/.x/help/examples b/src/clis/spx/.x/help/examples similarity index 100% rename from src/spx/.x/help/examples rename to src/clis/spx/.x/help/examples diff --git a/src/spx/.x/help/foreach b/src/clis/spx/.x/help/foreach similarity index 100% rename from src/spx/.x/help/foreach rename to src/clis/spx/.x/help/foreach diff --git a/src/spx/.x/help/help b/src/clis/spx/.x/help/help similarity index 100% rename from src/spx/.x/help/help rename to src/clis/spx/.x/help/help diff --git a/src/spx/.x/help/hive b/src/clis/spx/.x/help/hive similarity index 100% rename from src/spx/.x/help/hive rename to src/clis/spx/.x/help/hive diff --git a/src/spx/.x/help/include.create.resource b/src/clis/spx/.x/help/include.create.resource similarity index 100% rename from src/spx/.x/help/include.create.resource rename to src/clis/spx/.x/help/include.create.resource diff --git a/src/spx/.x/help/include.create.resource.extra b/src/clis/spx/.x/help/include.create.resource.extra similarity index 100% rename from src/spx/.x/help/include.create.resource.extra rename to src/clis/spx/.x/help/include.create.resource.extra diff --git a/src/spx/.x/help/include.spx.ascii.logo b/src/clis/spx/.x/help/include.spx.ascii.logo similarity index 100% rename from src/spx/.x/help/include.spx.ascii.logo rename to src/clis/spx/.x/help/include.spx.ascii.logo diff --git a/src/spx/.x/help/include.spx.init.ascii.logo b/src/clis/spx/.x/help/include.spx.init.ascii.logo similarity index 100% rename from src/spx/.x/help/include.spx.init.ascii.logo rename to src/clis/spx/.x/help/include.spx.init.ascii.logo diff --git a/src/spx/.x/help/include.the.azure.speech.service b/src/clis/spx/.x/help/include.the.azure.speech.service similarity index 100% rename from src/spx/.x/help/include.the.azure.speech.service rename to src/clis/spx/.x/help/include.the.azure.speech.service diff --git a/src/spx/.x/help/include.the.azure.speech.service.long b/src/clis/spx/.x/help/include.the.azure.speech.service.long similarity index 100% rename from src/spx/.x/help/include.the.azure.speech.service.long rename to src/clis/spx/.x/help/include.the.azure.speech.service.long diff --git a/src/spx/.x/help/include.the.config.command b/src/clis/spx/.x/help/include.the.config.command similarity index 100% rename from src/spx/.x/help/include.the.config.command rename to src/clis/spx/.x/help/include.the.config.command diff --git a/src/spx/.x/help/include.the.csr.dataset.command b/src/clis/spx/.x/help/include.the.csr.dataset.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.command rename to src/clis/spx/.x/help/include.the.csr.dataset.command diff --git a/src/spx/.x/help/include.the.csr.dataset.create.command b/src/clis/spx/.x/help/include.the.csr.dataset.create.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.create.command rename to src/clis/spx/.x/help/include.the.csr.dataset.create.command diff --git a/src/spx/.x/help/include.the.csr.dataset.delete.command b/src/clis/spx/.x/help/include.the.csr.dataset.delete.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.delete.command rename to src/clis/spx/.x/help/include.the.csr.dataset.delete.command diff --git a/src/spx/.x/help/include.the.csr.dataset.download.command b/src/clis/spx/.x/help/include.the.csr.dataset.download.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.download.command rename to src/clis/spx/.x/help/include.the.csr.dataset.download.command diff --git a/src/spx/.x/help/include.the.csr.dataset.list.command b/src/clis/spx/.x/help/include.the.csr.dataset.list.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.list.command rename to src/clis/spx/.x/help/include.the.csr.dataset.list.command diff --git a/src/spx/.x/help/include.the.csr.dataset.status.command b/src/clis/spx/.x/help/include.the.csr.dataset.status.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.status.command rename to src/clis/spx/.x/help/include.the.csr.dataset.status.command diff --git a/src/spx/.x/help/include.the.csr.dataset.update.command b/src/clis/spx/.x/help/include.the.csr.dataset.update.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.update.command rename to src/clis/spx/.x/help/include.the.csr.dataset.update.command diff --git a/src/spx/.x/help/include.the.csr.dataset.upload.command b/src/clis/spx/.x/help/include.the.csr.dataset.upload.command similarity index 100% rename from src/spx/.x/help/include.the.csr.dataset.upload.command rename to src/clis/spx/.x/help/include.the.csr.dataset.upload.command diff --git a/src/spx/.x/help/include.the.csr.endpoint.command b/src/clis/spx/.x/help/include.the.csr.endpoint.command similarity index 100% rename from src/spx/.x/help/include.the.csr.endpoint.command rename to src/clis/spx/.x/help/include.the.csr.endpoint.command diff --git a/src/spx/.x/help/include.the.csr.endpoint.create.command b/src/clis/spx/.x/help/include.the.csr.endpoint.create.command similarity index 100% rename from src/spx/.x/help/include.the.csr.endpoint.create.command rename to src/clis/spx/.x/help/include.the.csr.endpoint.create.command diff --git a/src/spx/.x/help/include.the.csr.endpoint.delete.command b/src/clis/spx/.x/help/include.the.csr.endpoint.delete.command similarity index 100% rename from src/spx/.x/help/include.the.csr.endpoint.delete.command rename to src/clis/spx/.x/help/include.the.csr.endpoint.delete.command diff --git a/src/spx/.x/help/include.the.csr.endpoint.download.command b/src/clis/spx/.x/help/include.the.csr.endpoint.download.command similarity index 100% rename from src/spx/.x/help/include.the.csr.endpoint.download.command rename to src/clis/spx/.x/help/include.the.csr.endpoint.download.command diff --git a/src/spx/.x/help/include.the.csr.endpoint.list.command b/src/clis/spx/.x/help/include.the.csr.endpoint.list.command similarity index 100% rename from src/spx/.x/help/include.the.csr.endpoint.list.command rename to src/clis/spx/.x/help/include.the.csr.endpoint.list.command diff --git a/src/spx/.x/help/include.the.csr.endpoint.status.command b/src/clis/spx/.x/help/include.the.csr.endpoint.status.command similarity index 100% rename from src/spx/.x/help/include.the.csr.endpoint.status.command rename to src/clis/spx/.x/help/include.the.csr.endpoint.status.command diff --git a/src/spx/.x/help/include.the.csr.endpoint.update.command b/src/clis/spx/.x/help/include.the.csr.endpoint.update.command similarity index 100% rename from src/spx/.x/help/include.the.csr.endpoint.update.command rename to src/clis/spx/.x/help/include.the.csr.endpoint.update.command diff --git a/src/spx/.x/help/include.the.csr.evaluation.command b/src/clis/spx/.x/help/include.the.csr.evaluation.command similarity index 100% rename from src/spx/.x/help/include.the.csr.evaluation.command rename to src/clis/spx/.x/help/include.the.csr.evaluation.command diff --git a/src/spx/.x/help/include.the.csr.evaluation.create.command b/src/clis/spx/.x/help/include.the.csr.evaluation.create.command similarity index 100% rename from src/spx/.x/help/include.the.csr.evaluation.create.command rename to src/clis/spx/.x/help/include.the.csr.evaluation.create.command diff --git a/src/spx/.x/help/include.the.csr.evaluation.delete.command b/src/clis/spx/.x/help/include.the.csr.evaluation.delete.command similarity index 100% rename from src/spx/.x/help/include.the.csr.evaluation.delete.command rename to src/clis/spx/.x/help/include.the.csr.evaluation.delete.command diff --git a/src/spx/.x/help/include.the.csr.evaluation.list.command b/src/clis/spx/.x/help/include.the.csr.evaluation.list.command similarity index 100% rename from src/spx/.x/help/include.the.csr.evaluation.list.command rename to src/clis/spx/.x/help/include.the.csr.evaluation.list.command diff --git a/src/spx/.x/help/include.the.csr.evaluation.status.command b/src/clis/spx/.x/help/include.the.csr.evaluation.status.command similarity index 100% rename from src/spx/.x/help/include.the.csr.evaluation.status.command rename to src/clis/spx/.x/help/include.the.csr.evaluation.status.command diff --git a/src/spx/.x/help/include.the.csr.evaluation.update.command b/src/clis/spx/.x/help/include.the.csr.evaluation.update.command similarity index 100% rename from src/spx/.x/help/include.the.csr.evaluation.update.command rename to src/clis/spx/.x/help/include.the.csr.evaluation.update.command diff --git a/src/spx/.x/help/include.the.csr.model.command b/src/clis/spx/.x/help/include.the.csr.model.command similarity index 100% rename from src/spx/.x/help/include.the.csr.model.command rename to src/clis/spx/.x/help/include.the.csr.model.command diff --git a/src/spx/.x/help/include.the.csr.model.copy.command b/src/clis/spx/.x/help/include.the.csr.model.copy.command similarity index 100% rename from src/spx/.x/help/include.the.csr.model.copy.command rename to src/clis/spx/.x/help/include.the.csr.model.copy.command diff --git a/src/spx/.x/help/include.the.csr.model.create.command b/src/clis/spx/.x/help/include.the.csr.model.create.command similarity index 100% rename from src/spx/.x/help/include.the.csr.model.create.command rename to src/clis/spx/.x/help/include.the.csr.model.create.command diff --git a/src/spx/.x/help/include.the.csr.model.delete.command b/src/clis/spx/.x/help/include.the.csr.model.delete.command similarity index 100% rename from src/spx/.x/help/include.the.csr.model.delete.command rename to src/clis/spx/.x/help/include.the.csr.model.delete.command diff --git a/src/spx/.x/help/include.the.csr.model.status.command b/src/clis/spx/.x/help/include.the.csr.model.status.command similarity index 100% rename from src/spx/.x/help/include.the.csr.model.status.command rename to src/clis/spx/.x/help/include.the.csr.model.status.command diff --git a/src/spx/.x/help/include.the.csr.model.update.command b/src/clis/spx/.x/help/include.the.csr.model.update.command similarity index 100% rename from src/spx/.x/help/include.the.csr.model.update.command rename to src/clis/spx/.x/help/include.the.csr.model.update.command diff --git a/src/spx/.x/help/include.the.csr.project.command b/src/clis/spx/.x/help/include.the.csr.project.command similarity index 100% rename from src/spx/.x/help/include.the.csr.project.command rename to src/clis/spx/.x/help/include.the.csr.project.command diff --git a/src/spx/.x/help/include.the.csr.project.create.command b/src/clis/spx/.x/help/include.the.csr.project.create.command similarity index 100% rename from src/spx/.x/help/include.the.csr.project.create.command rename to src/clis/spx/.x/help/include.the.csr.project.create.command diff --git a/src/spx/.x/help/include.the.csr.project.delete.command b/src/clis/spx/.x/help/include.the.csr.project.delete.command similarity index 100% rename from src/spx/.x/help/include.the.csr.project.delete.command rename to src/clis/spx/.x/help/include.the.csr.project.delete.command diff --git a/src/spx/.x/help/include.the.csr.project.list.command b/src/clis/spx/.x/help/include.the.csr.project.list.command similarity index 100% rename from src/spx/.x/help/include.the.csr.project.list.command rename to src/clis/spx/.x/help/include.the.csr.project.list.command diff --git a/src/spx/.x/help/include.the.csr.project.status.command b/src/clis/spx/.x/help/include.the.csr.project.status.command similarity index 100% rename from src/spx/.x/help/include.the.csr.project.status.command rename to src/clis/spx/.x/help/include.the.csr.project.status.command diff --git a/src/spx/.x/help/include.the.csr.project.update.command b/src/clis/spx/.x/help/include.the.csr.project.update.command similarity index 100% rename from src/spx/.x/help/include.the.csr.project.update.command rename to src/clis/spx/.x/help/include.the.csr.project.update.command diff --git a/src/spx/.x/help/include.the.dialog.command b/src/clis/spx/.x/help/include.the.dialog.command similarity index 100% rename from src/spx/.x/help/include.the.dialog.command rename to src/clis/spx/.x/help/include.the.dialog.command diff --git a/src/spx/.x/help/include.the.dialog.command.long b/src/clis/spx/.x/help/include.the.dialog.command.long similarity index 100% rename from src/spx/.x/help/include.the.dialog.command.long rename to src/clis/spx/.x/help/include.the.dialog.command.long diff --git a/src/spx/.x/help/include.the.init.command.long b/src/clis/spx/.x/help/include.the.init.command.long similarity index 100% rename from src/spx/.x/help/include.the.init.command.long rename to src/clis/spx/.x/help/include.the.init.command.long diff --git a/src/spx/.x/help/include.the.intent.command b/src/clis/spx/.x/help/include.the.intent.command similarity index 100% rename from src/spx/.x/help/include.the.intent.command rename to src/clis/spx/.x/help/include.the.intent.command diff --git a/src/spx/.x/help/include.the.intent.command.long b/src/clis/spx/.x/help/include.the.intent.command.long similarity index 100% rename from src/spx/.x/help/include.the.intent.command.long rename to src/clis/spx/.x/help/include.the.intent.command.long diff --git a/src/spx/.x/help/include.the.intent.method b/src/clis/spx/.x/help/include.the.intent.method similarity index 100% rename from src/spx/.x/help/include.the.intent.method rename to src/clis/spx/.x/help/include.the.intent.method diff --git a/src/spx/.x/help/include.the.key.option b/src/clis/spx/.x/help/include.the.key.option similarity index 100% rename from src/spx/.x/help/include.the.key.option rename to src/clis/spx/.x/help/include.the.key.option diff --git a/src/spx/.x/help/include.the.key.option.where b/src/clis/spx/.x/help/include.the.key.option.where similarity index 100% rename from src/spx/.x/help/include.the.key.option.where rename to src/clis/spx/.x/help/include.the.key.option.where diff --git a/src/spx/.x/help/include.the.log.option b/src/clis/spx/.x/help/include.the.log.option similarity index 100% rename from src/spx/.x/help/include.the.log.option rename to src/clis/spx/.x/help/include.the.log.option diff --git a/src/spx/.x/help/include.the.luis.option b/src/clis/spx/.x/help/include.the.luis.option similarity index 100% rename from src/spx/.x/help/include.the.luis.option rename to src/clis/spx/.x/help/include.the.luis.option diff --git a/src/spx/.x/help/include.the.model.list.command b/src/clis/spx/.x/help/include.the.model.list.command similarity index 100% rename from src/spx/.x/help/include.the.model.list.command rename to src/clis/spx/.x/help/include.the.model.list.command diff --git a/src/spx/.x/help/include.the.profile.command b/src/clis/spx/.x/help/include.the.profile.command similarity index 100% rename from src/spx/.x/help/include.the.profile.command rename to src/clis/spx/.x/help/include.the.profile.command diff --git a/src/spx/.x/help/include.the.profile.command.long b/src/clis/spx/.x/help/include.the.profile.command.long similarity index 100% rename from src/spx/.x/help/include.the.profile.command.long rename to src/clis/spx/.x/help/include.the.profile.command.long diff --git a/src/spx/.x/help/include.the.recognize.command b/src/clis/spx/.x/help/include.the.recognize.command similarity index 100% rename from src/spx/.x/help/include.the.recognize.command rename to src/clis/spx/.x/help/include.the.recognize.command diff --git a/src/spx/.x/help/include.the.recognize.command.long b/src/clis/spx/.x/help/include.the.recognize.command.long similarity index 100% rename from src/spx/.x/help/include.the.recognize.command.long rename to src/clis/spx/.x/help/include.the.recognize.command.long diff --git a/src/spx/.x/help/include.the.recognize.method b/src/clis/spx/.x/help/include.the.recognize.method similarity index 100% rename from src/spx/.x/help/include.the.recognize.method rename to src/clis/spx/.x/help/include.the.recognize.method diff --git a/src/spx/.x/help/include.the.region.option b/src/clis/spx/.x/help/include.the.region.option similarity index 100% rename from src/spx/.x/help/include.the.region.option rename to src/clis/spx/.x/help/include.the.region.option diff --git a/src/spx/.x/help/include.the.region.option.where b/src/clis/spx/.x/help/include.the.region.option.where similarity index 100% rename from src/spx/.x/help/include.the.region.option.where rename to src/clis/spx/.x/help/include.the.region.option.where diff --git a/src/spx/.x/help/include.the.run.command b/src/clis/spx/.x/help/include.the.run.command similarity index 100% rename from src/spx/.x/help/include.the.run.command rename to src/clis/spx/.x/help/include.the.run.command diff --git a/src/spx/.x/help/include.the.save.option b/src/clis/spx/.x/help/include.the.save.option similarity index 100% rename from src/spx/.x/help/include.the.save.option rename to src/clis/spx/.x/help/include.the.save.option diff --git a/src/spx/.x/help/include.the.speaker.command b/src/clis/spx/.x/help/include.the.speaker.command similarity index 100% rename from src/spx/.x/help/include.the.speaker.command rename to src/clis/spx/.x/help/include.the.speaker.command diff --git a/src/spx/.x/help/include.the.speaker.command.long b/src/clis/spx/.x/help/include.the.speaker.command.long similarity index 100% rename from src/spx/.x/help/include.the.speaker.command.long rename to src/clis/spx/.x/help/include.the.speaker.command.long diff --git a/src/spx/.x/help/include.the.synthesize.command b/src/clis/spx/.x/help/include.the.synthesize.command similarity index 100% rename from src/spx/.x/help/include.the.synthesize.command rename to src/clis/spx/.x/help/include.the.synthesize.command diff --git a/src/spx/.x/help/include.the.synthesize.command.long b/src/clis/spx/.x/help/include.the.synthesize.command.long similarity index 100% rename from src/spx/.x/help/include.the.synthesize.command.long rename to src/clis/spx/.x/help/include.the.synthesize.command.long diff --git a/src/spx/.x/help/include.the.token.option b/src/clis/spx/.x/help/include.the.token.option similarity index 100% rename from src/spx/.x/help/include.the.token.option rename to src/clis/spx/.x/help/include.the.token.option diff --git a/src/spx/.x/help/include.the.token.option.where b/src/clis/spx/.x/help/include.the.token.option.where similarity index 100% rename from src/spx/.x/help/include.the.token.option.where rename to src/clis/spx/.x/help/include.the.token.option.where diff --git a/src/spx/.x/help/include.the.translate.command b/src/clis/spx/.x/help/include.the.translate.command similarity index 100% rename from src/spx/.x/help/include.the.translate.command rename to src/clis/spx/.x/help/include.the.translate.command diff --git a/src/spx/.x/help/include.the.translate.command.long b/src/clis/spx/.x/help/include.the.translate.command.long similarity index 100% rename from src/spx/.x/help/include.the.translate.command.long rename to src/clis/spx/.x/help/include.the.translate.command.long diff --git a/src/spx/.x/help/include.the.webjob.command b/src/clis/spx/.x/help/include.the.webjob.command similarity index 100% rename from src/spx/.x/help/include.the.webjob.command rename to src/clis/spx/.x/help/include.the.webjob.command diff --git a/src/spx/.x/help/include.the.webjob.command.long b/src/clis/spx/.x/help/include.the.webjob.command.long similarity index 100% rename from src/spx/.x/help/include.the.webjob.command.long rename to src/clis/spx/.x/help/include.the.webjob.command.long diff --git a/src/spx/.x/help/include.the.zip.option b/src/clis/spx/.x/help/include.the.zip.option similarity index 100% rename from src/spx/.x/help/include.the.zip.option rename to src/clis/spx/.x/help/include.the.zip.option diff --git a/src/spx/.x/help/init b/src/clis/spx/.x/help/init similarity index 100% rename from src/spx/.x/help/init rename to src/clis/spx/.x/help/init diff --git a/src/spx/.x/help/init.advanced b/src/clis/spx/.x/help/init.advanced similarity index 100% rename from src/spx/.x/help/init.advanced rename to src/clis/spx/.x/help/init.advanced diff --git a/src/spx/.x/help/init.examples b/src/clis/spx/.x/help/init.examples similarity index 100% rename from src/spx/.x/help/init.examples rename to src/clis/spx/.x/help/init.examples diff --git a/src/spx/.x/help/input b/src/clis/spx/.x/help/input similarity index 100% rename from src/spx/.x/help/input rename to src/clis/spx/.x/help/input diff --git a/src/spx/.x/help/input.id b/src/clis/spx/.x/help/input.id similarity index 100% rename from src/spx/.x/help/input.id rename to src/clis/spx/.x/help/input.id diff --git a/src/spx/.x/help/intent b/src/clis/spx/.x/help/intent similarity index 100% rename from src/spx/.x/help/intent rename to src/clis/spx/.x/help/intent diff --git a/src/spx/.x/help/intent.advanced b/src/clis/spx/.x/help/intent.advanced similarity index 100% rename from src/spx/.x/help/intent.advanced rename to src/clis/spx/.x/help/intent.advanced diff --git a/src/spx/.x/help/intent.connection b/src/clis/spx/.x/help/intent.connection similarity index 100% rename from src/spx/.x/help/intent.connection rename to src/clis/spx/.x/help/intent.connection diff --git a/src/spx/.x/help/intent.continuous b/src/clis/spx/.x/help/intent.continuous similarity index 100% rename from src/spx/.x/help/intent.continuous rename to src/clis/spx/.x/help/intent.continuous diff --git a/src/spx/.x/help/intent.endpoint b/src/clis/spx/.x/help/intent.endpoint similarity index 100% rename from src/spx/.x/help/intent.endpoint rename to src/clis/spx/.x/help/intent.endpoint diff --git a/src/spx/.x/help/intent.examples b/src/clis/spx/.x/help/intent.examples similarity index 100% rename from src/spx/.x/help/intent.examples rename to src/clis/spx/.x/help/intent.examples diff --git a/src/spx/.x/help/intent.file b/src/clis/spx/.x/help/intent.file similarity index 100% rename from src/spx/.x/help/intent.file rename to src/clis/spx/.x/help/intent.file diff --git a/src/spx/.x/help/intent.files b/src/clis/spx/.x/help/intent.files similarity index 100% rename from src/spx/.x/help/intent.files rename to src/clis/spx/.x/help/intent.files diff --git a/src/spx/.x/help/intent.foreach b/src/clis/spx/.x/help/intent.foreach similarity index 100% rename from src/spx/.x/help/intent.foreach rename to src/clis/spx/.x/help/intent.foreach diff --git a/src/spx/.x/help/intent.format b/src/clis/spx/.x/help/intent.format similarity index 100% rename from src/spx/.x/help/intent.format rename to src/clis/spx/.x/help/intent.format diff --git a/src/spx/.x/help/intent.input b/src/clis/spx/.x/help/intent.input similarity index 100% rename from src/spx/.x/help/intent.input rename to src/clis/spx/.x/help/intent.input diff --git a/src/spx/.x/help/intent.key b/src/clis/spx/.x/help/intent.key similarity index 100% rename from src/spx/.x/help/intent.key rename to src/clis/spx/.x/help/intent.key diff --git a/src/spx/.x/help/intent.keyword b/src/clis/spx/.x/help/intent.keyword similarity index 100% rename from src/spx/.x/help/intent.keyword rename to src/clis/spx/.x/help/intent.keyword diff --git a/src/spx/.x/help/intent.language b/src/clis/spx/.x/help/intent.language similarity index 100% rename from src/spx/.x/help/intent.language rename to src/clis/spx/.x/help/intent.language diff --git a/src/spx/.x/help/intent.languages b/src/clis/spx/.x/help/intent.languages similarity index 100% rename from src/spx/.x/help/intent.languages rename to src/clis/spx/.x/help/intent.languages diff --git a/src/spx/.x/help/intent.log b/src/clis/spx/.x/help/intent.log similarity index 100% rename from src/spx/.x/help/intent.log rename to src/clis/spx/.x/help/intent.log diff --git a/src/spx/.x/help/intent.luis b/src/clis/spx/.x/help/intent.luis similarity index 100% rename from src/spx/.x/help/intent.luis rename to src/clis/spx/.x/help/intent.luis diff --git a/src/spx/.x/help/intent.luis.allintents b/src/clis/spx/.x/help/intent.luis.allintents similarity index 100% rename from src/spx/.x/help/intent.luis.allintents rename to src/clis/spx/.x/help/intent.luis.allintents diff --git a/src/spx/.x/help/intent.luis.intent b/src/clis/spx/.x/help/intent.luis.intent similarity index 100% rename from src/spx/.x/help/intent.luis.intent rename to src/clis/spx/.x/help/intent.luis.intent diff --git a/src/spx/.x/help/intent.luis.key b/src/clis/spx/.x/help/intent.luis.key similarity index 100% rename from src/spx/.x/help/intent.luis.key rename to src/clis/spx/.x/help/intent.luis.key diff --git a/src/spx/.x/help/intent.luis.region b/src/clis/spx/.x/help/intent.luis.region similarity index 100% rename from src/spx/.x/help/intent.luis.region rename to src/clis/spx/.x/help/intent.luis.region diff --git a/src/spx/.x/help/intent.microphone b/src/clis/spx/.x/help/intent.microphone similarity index 100% rename from src/spx/.x/help/intent.microphone rename to src/clis/spx/.x/help/intent.microphone diff --git a/src/spx/.x/help/intent.once b/src/clis/spx/.x/help/intent.once similarity index 100% rename from src/spx/.x/help/intent.once rename to src/clis/spx/.x/help/intent.once diff --git a/src/spx/.x/help/intent.output b/src/clis/spx/.x/help/intent.output similarity index 100% rename from src/spx/.x/help/intent.output rename to src/clis/spx/.x/help/intent.output diff --git a/src/spx/.x/help/intent.output.accuracy b/src/clis/spx/.x/help/intent.output.accuracy similarity index 100% rename from src/spx/.x/help/intent.output.accuracy rename to src/clis/spx/.x/help/intent.output.accuracy diff --git a/src/spx/.x/help/intent.output.all b/src/clis/spx/.x/help/intent.output.all similarity index 100% rename from src/spx/.x/help/intent.output.all rename to src/clis/spx/.x/help/intent.output.all diff --git a/src/spx/.x/help/intent.output.all.example b/src/clis/spx/.x/help/intent.output.all.example similarity index 100% rename from src/spx/.x/help/intent.output.all.example rename to src/clis/spx/.x/help/intent.output.all.example diff --git a/src/spx/.x/help/intent.output.all.file b/src/clis/spx/.x/help/intent.output.all.file similarity index 100% rename from src/spx/.x/help/intent.output.all.file rename to src/clis/spx/.x/help/intent.output.all.file diff --git a/src/spx/.x/help/intent.output.all.files b/src/clis/spx/.x/help/intent.output.all.files similarity index 100% rename from src/spx/.x/help/intent.output.all.files rename to src/clis/spx/.x/help/intent.output.all.files diff --git a/src/spx/.x/help/intent.output.all.json b/src/clis/spx/.x/help/intent.output.all.json similarity index 100% rename from src/spx/.x/help/intent.output.all.json rename to src/clis/spx/.x/help/intent.output.all.json diff --git a/src/spx/.x/help/intent.output.all.timing b/src/clis/spx/.x/help/intent.output.all.timing similarity index 100% rename from src/spx/.x/help/intent.output.all.timing rename to src/clis/spx/.x/help/intent.output.all.timing diff --git a/src/spx/.x/help/intent.output.batch b/src/clis/spx/.x/help/intent.output.batch similarity index 100% rename from src/spx/.x/help/intent.output.batch rename to src/clis/spx/.x/help/intent.output.batch diff --git a/src/spx/.x/help/intent.output.each b/src/clis/spx/.x/help/intent.output.each similarity index 100% rename from src/spx/.x/help/intent.output.each rename to src/clis/spx/.x/help/intent.output.each diff --git a/src/spx/.x/help/intent.output.examples b/src/clis/spx/.x/help/intent.output.examples similarity index 100% rename from src/spx/.x/help/intent.output.examples rename to src/clis/spx/.x/help/intent.output.examples diff --git a/src/spx/.x/help/intent.output.file b/src/clis/spx/.x/help/intent.output.file similarity index 100% rename from src/spx/.x/help/intent.output.file rename to src/clis/spx/.x/help/intent.output.file diff --git a/src/spx/.x/help/intent.output.text b/src/clis/spx/.x/help/intent.output.text similarity index 100% rename from src/spx/.x/help/intent.output.text rename to src/clis/spx/.x/help/intent.output.text diff --git a/src/spx/.x/help/intent.output.vtt b/src/clis/spx/.x/help/intent.output.vtt similarity index 100% rename from src/spx/.x/help/intent.output.vtt rename to src/clis/spx/.x/help/intent.output.vtt diff --git a/src/spx/.x/help/intent.output.wer b/src/clis/spx/.x/help/intent.output.wer similarity index 100% rename from src/spx/.x/help/intent.output.wer rename to src/clis/spx/.x/help/intent.output.wer diff --git a/src/spx/.x/help/intent.pattern b/src/clis/spx/.x/help/intent.pattern similarity index 100% rename from src/spx/.x/help/intent.pattern rename to src/clis/spx/.x/help/intent.pattern diff --git a/src/spx/.x/help/intent.patterns b/src/clis/spx/.x/help/intent.patterns similarity index 100% rename from src/spx/.x/help/intent.patterns rename to src/clis/spx/.x/help/intent.patterns diff --git a/src/spx/.x/help/intent.phrases b/src/clis/spx/.x/help/intent.phrases similarity index 100% rename from src/spx/.x/help/intent.phrases rename to src/clis/spx/.x/help/intent.phrases diff --git a/src/spx/.x/help/intent.processes b/src/clis/spx/.x/help/intent.processes similarity index 100% rename from src/spx/.x/help/intent.processes rename to src/clis/spx/.x/help/intent.processes diff --git a/src/spx/.x/help/intent.profanity b/src/clis/spx/.x/help/intent.profanity similarity index 100% rename from src/spx/.x/help/intent.profanity rename to src/clis/spx/.x/help/intent.profanity diff --git a/src/spx/.x/help/intent.proxy b/src/clis/spx/.x/help/intent.proxy similarity index 100% rename from src/spx/.x/help/intent.proxy rename to src/clis/spx/.x/help/intent.proxy diff --git a/src/spx/.x/help/intent.region b/src/clis/spx/.x/help/intent.region similarity index 100% rename from src/spx/.x/help/intent.region rename to src/clis/spx/.x/help/intent.region diff --git a/src/spx/.x/help/intent.save b/src/clis/spx/.x/help/intent.save similarity index 100% rename from src/spx/.x/help/intent.save rename to src/clis/spx/.x/help/intent.save diff --git a/src/spx/.x/help/intent.testing b/src/clis/spx/.x/help/intent.testing similarity index 100% rename from src/spx/.x/help/intent.testing rename to src/clis/spx/.x/help/intent.testing diff --git a/src/spx/.x/help/intent.threads b/src/clis/spx/.x/help/intent.threads similarity index 100% rename from src/spx/.x/help/intent.threads rename to src/clis/spx/.x/help/intent.threads diff --git a/src/spx/.x/help/intent.token b/src/clis/spx/.x/help/intent.token similarity index 100% rename from src/spx/.x/help/intent.token rename to src/clis/spx/.x/help/intent.token diff --git a/src/spx/.x/help/intent.transcript b/src/clis/spx/.x/help/intent.transcript similarity index 100% rename from src/spx/.x/help/intent.transcript rename to src/clis/spx/.x/help/intent.transcript diff --git a/src/spx/.x/help/intent.url b/src/clis/spx/.x/help/intent.url similarity index 100% rename from src/spx/.x/help/intent.url rename to src/clis/spx/.x/help/intent.url diff --git a/src/spx/.x/help/intent.urls b/src/clis/spx/.x/help/intent.urls similarity index 100% rename from src/spx/.x/help/intent.urls rename to src/clis/spx/.x/help/intent.urls diff --git a/src/spx/.x/help/intent.wer b/src/clis/spx/.x/help/intent.wer similarity index 100% rename from src/spx/.x/help/intent.wer rename to src/clis/spx/.x/help/intent.wer diff --git a/src/spx/.x/help/intent.zip b/src/clis/spx/.x/help/intent.zip similarity index 100% rename from src/spx/.x/help/intent.zip rename to src/clis/spx/.x/help/intent.zip diff --git a/src/spx/.x/help/internal b/src/clis/spx/.x/help/internal similarity index 100% rename from src/spx/.x/help/internal rename to src/clis/spx/.x/help/internal diff --git a/src/spx/.x/help/key b/src/clis/spx/.x/help/key similarity index 100% rename from src/spx/.x/help/key rename to src/clis/spx/.x/help/key diff --git a/src/spx/.x/help/key.overview b/src/clis/spx/.x/help/key.overview similarity index 100% rename from src/spx/.x/help/key.overview rename to src/clis/spx/.x/help/key.overview diff --git a/src/spx/.x/help/keyword b/src/clis/spx/.x/help/keyword similarity index 100% rename from src/spx/.x/help/keyword rename to src/clis/spx/.x/help/keyword diff --git a/src/spx/.x/help/language b/src/clis/spx/.x/help/language similarity index 100% rename from src/spx/.x/help/language rename to src/clis/spx/.x/help/language diff --git a/src/spx/.x/help/log b/src/clis/spx/.x/help/log similarity index 100% rename from src/spx/.x/help/log rename to src/clis/spx/.x/help/log diff --git a/src/spx/.x/help/luis.documentation b/src/clis/spx/.x/help/luis.documentation similarity index 100% rename from src/spx/.x/help/luis.documentation rename to src/clis/spx/.x/help/luis.documentation diff --git a/src/spx/.x/help/microphone b/src/clis/spx/.x/help/microphone similarity index 100% rename from src/spx/.x/help/microphone rename to src/clis/spx/.x/help/microphone diff --git a/src/spx/.x/help/once b/src/clis/spx/.x/help/once similarity index 100% rename from src/spx/.x/help/once rename to src/clis/spx/.x/help/once diff --git a/src/spx/.x/help/output b/src/clis/spx/.x/help/output similarity index 100% rename from src/spx/.x/help/output rename to src/clis/spx/.x/help/output diff --git a/src/spx/.x/help/output.all b/src/clis/spx/.x/help/output.all similarity index 100% rename from src/spx/.x/help/output.all rename to src/clis/spx/.x/help/output.all diff --git a/src/spx/.x/help/output.each b/src/clis/spx/.x/help/output.each similarity index 100% rename from src/spx/.x/help/output.each rename to src/clis/spx/.x/help/output.each diff --git a/src/spx/.x/help/phrases b/src/clis/spx/.x/help/phrases similarity index 100% rename from src/spx/.x/help/phrases rename to src/clis/spx/.x/help/phrases diff --git a/src/spx/.x/help/profanity b/src/clis/spx/.x/help/profanity similarity index 100% rename from src/spx/.x/help/profanity rename to src/clis/spx/.x/help/profanity diff --git a/src/spx/.x/help/profile b/src/clis/spx/.x/help/profile similarity index 100% rename from src/spx/.x/help/profile rename to src/clis/spx/.x/help/profile diff --git a/src/spx/.x/help/profile.connection b/src/clis/spx/.x/help/profile.connection similarity index 100% rename from src/spx/.x/help/profile.connection rename to src/clis/spx/.x/help/profile.connection diff --git a/src/spx/.x/help/profile.create b/src/clis/spx/.x/help/profile.create similarity index 100% rename from src/spx/.x/help/profile.create rename to src/clis/spx/.x/help/profile.create diff --git a/src/spx/.x/help/profile.delete b/src/clis/spx/.x/help/profile.delete similarity index 100% rename from src/spx/.x/help/profile.delete rename to src/clis/spx/.x/help/profile.delete diff --git a/src/spx/.x/help/profile.documentation b/src/clis/spx/.x/help/profile.documentation similarity index 100% rename from src/spx/.x/help/profile.documentation rename to src/clis/spx/.x/help/profile.documentation diff --git a/src/spx/.x/help/profile.enroll b/src/clis/spx/.x/help/profile.enroll similarity index 100% rename from src/spx/.x/help/profile.enroll rename to src/clis/spx/.x/help/profile.enroll diff --git a/src/spx/.x/help/profile.examples b/src/clis/spx/.x/help/profile.examples similarity index 100% rename from src/spx/.x/help/profile.examples rename to src/clis/spx/.x/help/profile.examples diff --git a/src/spx/.x/help/profile.file b/src/clis/spx/.x/help/profile.file similarity index 100% rename from src/spx/.x/help/profile.file rename to src/clis/spx/.x/help/profile.file diff --git a/src/spx/.x/help/profile.id b/src/clis/spx/.x/help/profile.id similarity index 100% rename from src/spx/.x/help/profile.id rename to src/clis/spx/.x/help/profile.id diff --git a/src/spx/.x/help/profile.key b/src/clis/spx/.x/help/profile.key similarity index 100% rename from src/spx/.x/help/profile.key rename to src/clis/spx/.x/help/profile.key diff --git a/src/spx/.x/help/profile.kind b/src/clis/spx/.x/help/profile.kind similarity index 100% rename from src/spx/.x/help/profile.kind rename to src/clis/spx/.x/help/profile.kind diff --git a/src/spx/.x/help/profile.list b/src/clis/spx/.x/help/profile.list similarity index 100% rename from src/spx/.x/help/profile.list rename to src/clis/spx/.x/help/profile.list diff --git a/src/spx/.x/help/profile.output b/src/clis/spx/.x/help/profile.output similarity index 100% rename from src/spx/.x/help/profile.output rename to src/clis/spx/.x/help/profile.output diff --git a/src/spx/.x/help/profile.output.file b/src/clis/spx/.x/help/profile.output.file similarity index 100% rename from src/spx/.x/help/profile.output.file rename to src/clis/spx/.x/help/profile.output.file diff --git a/src/spx/.x/help/profile.output.id b/src/clis/spx/.x/help/profile.output.id similarity index 100% rename from src/spx/.x/help/profile.output.id rename to src/clis/spx/.x/help/profile.output.id diff --git a/src/spx/.x/help/profile.output.json b/src/clis/spx/.x/help/profile.output.json similarity index 100% rename from src/spx/.x/help/profile.output.json rename to src/clis/spx/.x/help/profile.output.json diff --git a/src/spx/.x/help/profile.region b/src/clis/spx/.x/help/profile.region similarity index 100% rename from src/spx/.x/help/profile.region rename to src/clis/spx/.x/help/profile.region diff --git a/src/spx/.x/help/profile.status b/src/clis/spx/.x/help/profile.status similarity index 100% rename from src/spx/.x/help/profile.status rename to src/clis/spx/.x/help/profile.status diff --git a/src/spx/.x/help/proxy b/src/clis/spx/.x/help/proxy similarity index 100% rename from src/spx/.x/help/proxy rename to src/clis/spx/.x/help/proxy diff --git a/src/spx/.x/help/query.string b/src/clis/spx/.x/help/query.string similarity index 100% rename from src/spx/.x/help/query.string rename to src/clis/spx/.x/help/query.string diff --git a/src/spx/.x/help/recognize b/src/clis/spx/.x/help/recognize similarity index 100% rename from src/spx/.x/help/recognize rename to src/clis/spx/.x/help/recognize diff --git a/src/spx/.x/help/recognize.advanced b/src/clis/spx/.x/help/recognize.advanced similarity index 100% rename from src/spx/.x/help/recognize.advanced rename to src/clis/spx/.x/help/recognize.advanced diff --git a/src/spx/.x/help/recognize.check.text b/src/clis/spx/.x/help/recognize.check.text similarity index 100% rename from src/spx/.x/help/recognize.check.text rename to src/clis/spx/.x/help/recognize.check.text diff --git a/src/spx/.x/help/recognize.check.wer b/src/clis/spx/.x/help/recognize.check.wer similarity index 100% rename from src/spx/.x/help/recognize.check.wer rename to src/clis/spx/.x/help/recognize.check.wer diff --git a/src/spx/.x/help/recognize.connect b/src/clis/spx/.x/help/recognize.connect similarity index 100% rename from src/spx/.x/help/recognize.connect rename to src/clis/spx/.x/help/recognize.connect diff --git a/src/spx/.x/help/recognize.connection b/src/clis/spx/.x/help/recognize.connection similarity index 100% rename from src/spx/.x/help/recognize.connection rename to src/clis/spx/.x/help/recognize.connection diff --git a/src/spx/.x/help/recognize.continuous b/src/clis/spx/.x/help/recognize.continuous similarity index 100% rename from src/spx/.x/help/recognize.continuous rename to src/clis/spx/.x/help/recognize.continuous diff --git a/src/spx/.x/help/recognize.custom.speech b/src/clis/spx/.x/help/recognize.custom.speech similarity index 100% rename from src/spx/.x/help/recognize.custom.speech rename to src/clis/spx/.x/help/recognize.custom.speech diff --git a/src/spx/.x/help/recognize.default.connection.example b/src/clis/spx/.x/help/recognize.default.connection.example similarity index 100% rename from src/spx/.x/help/recognize.default.connection.example rename to src/clis/spx/.x/help/recognize.default.connection.example diff --git a/src/spx/.x/help/recognize.disconnect b/src/clis/spx/.x/help/recognize.disconnect similarity index 100% rename from src/spx/.x/help/recognize.disconnect rename to src/clis/spx/.x/help/recognize.disconnect diff --git a/src/spx/.x/help/recognize.endpoint b/src/clis/spx/.x/help/recognize.endpoint similarity index 100% rename from src/spx/.x/help/recognize.endpoint rename to src/clis/spx/.x/help/recognize.endpoint diff --git a/src/spx/.x/help/recognize.examples b/src/clis/spx/.x/help/recognize.examples similarity index 100% rename from src/spx/.x/help/recognize.examples rename to src/clis/spx/.x/help/recognize.examples diff --git a/src/spx/.x/help/recognize.file b/src/clis/spx/.x/help/recognize.file similarity index 100% rename from src/spx/.x/help/recognize.file rename to src/clis/spx/.x/help/recognize.file diff --git a/src/spx/.x/help/recognize.files b/src/clis/spx/.x/help/recognize.files similarity index 100% rename from src/spx/.x/help/recognize.files rename to src/clis/spx/.x/help/recognize.files diff --git a/src/spx/.x/help/recognize.foreach b/src/clis/spx/.x/help/recognize.foreach similarity index 100% rename from src/spx/.x/help/recognize.foreach rename to src/clis/spx/.x/help/recognize.foreach diff --git a/src/spx/.x/help/recognize.format b/src/clis/spx/.x/help/recognize.format similarity index 100% rename from src/spx/.x/help/recognize.format rename to src/clis/spx/.x/help/recognize.format diff --git a/src/spx/.x/help/recognize.improve.accuracy b/src/clis/spx/.x/help/recognize.improve.accuracy similarity index 100% rename from src/spx/.x/help/recognize.improve.accuracy rename to src/clis/spx/.x/help/recognize.improve.accuracy diff --git a/src/spx/.x/help/recognize.input b/src/clis/spx/.x/help/recognize.input similarity index 100% rename from src/spx/.x/help/recognize.input rename to src/clis/spx/.x/help/recognize.input diff --git a/src/spx/.x/help/recognize.key b/src/clis/spx/.x/help/recognize.key similarity index 100% rename from src/spx/.x/help/recognize.key rename to src/clis/spx/.x/help/recognize.key diff --git a/src/spx/.x/help/recognize.keyword b/src/clis/spx/.x/help/recognize.keyword similarity index 100% rename from src/spx/.x/help/recognize.keyword rename to src/clis/spx/.x/help/recognize.keyword diff --git a/src/spx/.x/help/recognize.language b/src/clis/spx/.x/help/recognize.language similarity index 100% rename from src/spx/.x/help/recognize.language rename to src/clis/spx/.x/help/recognize.language diff --git a/src/spx/.x/help/recognize.languages b/src/clis/spx/.x/help/recognize.languages similarity index 100% rename from src/spx/.x/help/recognize.languages rename to src/clis/spx/.x/help/recognize.languages diff --git a/src/spx/.x/help/recognize.log b/src/clis/spx/.x/help/recognize.log similarity index 100% rename from src/spx/.x/help/recognize.log rename to src/clis/spx/.x/help/recognize.log diff --git a/src/spx/.x/help/recognize.microphone b/src/clis/spx/.x/help/recognize.microphone similarity index 100% rename from src/spx/.x/help/recognize.microphone rename to src/clis/spx/.x/help/recognize.microphone diff --git a/src/spx/.x/help/recognize.once b/src/clis/spx/.x/help/recognize.once similarity index 100% rename from src/spx/.x/help/recognize.once rename to src/clis/spx/.x/help/recognize.once diff --git a/src/spx/.x/help/recognize.output b/src/clis/spx/.x/help/recognize.output similarity index 100% rename from src/spx/.x/help/recognize.output rename to src/clis/spx/.x/help/recognize.output diff --git a/src/spx/.x/help/recognize.output.all b/src/clis/spx/.x/help/recognize.output.all similarity index 100% rename from src/spx/.x/help/recognize.output.all rename to src/clis/spx/.x/help/recognize.output.all diff --git a/src/spx/.x/help/recognize.output.all.file b/src/clis/spx/.x/help/recognize.output.all.file similarity index 100% rename from src/spx/.x/help/recognize.output.all.file rename to src/clis/spx/.x/help/recognize.output.all.file diff --git a/src/spx/.x/help/recognize.output.batch b/src/clis/spx/.x/help/recognize.output.batch similarity index 100% rename from src/spx/.x/help/recognize.output.batch rename to src/clis/spx/.x/help/recognize.output.batch diff --git a/src/spx/.x/help/recognize.output.batch.file b/src/clis/spx/.x/help/recognize.output.batch.file similarity index 100% rename from src/spx/.x/help/recognize.output.batch.file rename to src/clis/spx/.x/help/recognize.output.batch.file diff --git a/src/spx/.x/help/recognize.output.batch.json b/src/clis/spx/.x/help/recognize.output.batch.json similarity index 100% rename from src/spx/.x/help/recognize.output.batch.json rename to src/clis/spx/.x/help/recognize.output.batch.json diff --git a/src/spx/.x/help/recognize.output.each b/src/clis/spx/.x/help/recognize.output.each similarity index 100% rename from src/spx/.x/help/recognize.output.each rename to src/clis/spx/.x/help/recognize.output.each diff --git a/src/spx/.x/help/recognize.output.each.file b/src/clis/spx/.x/help/recognize.output.each.file similarity index 100% rename from src/spx/.x/help/recognize.output.each.file rename to src/clis/spx/.x/help/recognize.output.each.file diff --git a/src/spx/.x/help/recognize.output.examples b/src/clis/spx/.x/help/recognize.output.examples similarity index 100% rename from src/spx/.x/help/recognize.output.examples rename to src/clis/spx/.x/help/recognize.output.examples diff --git a/src/spx/.x/help/recognize.output.vtt b/src/clis/spx/.x/help/recognize.output.vtt similarity index 100% rename from src/spx/.x/help/recognize.output.vtt rename to src/clis/spx/.x/help/recognize.output.vtt diff --git a/src/spx/.x/help/recognize.phrases b/src/clis/spx/.x/help/recognize.phrases similarity index 100% rename from src/spx/.x/help/recognize.phrases rename to src/clis/spx/.x/help/recognize.phrases diff --git a/src/spx/.x/help/recognize.processes b/src/clis/spx/.x/help/recognize.processes similarity index 100% rename from src/spx/.x/help/recognize.processes rename to src/clis/spx/.x/help/recognize.processes diff --git a/src/spx/.x/help/recognize.profanity b/src/clis/spx/.x/help/recognize.profanity similarity index 100% rename from src/spx/.x/help/recognize.profanity rename to src/clis/spx/.x/help/recognize.profanity diff --git a/src/spx/.x/help/recognize.proxy b/src/clis/spx/.x/help/recognize.proxy similarity index 100% rename from src/spx/.x/help/recognize.proxy rename to src/clis/spx/.x/help/recognize.proxy diff --git a/src/spx/.x/help/recognize.region b/src/clis/spx/.x/help/recognize.region similarity index 100% rename from src/spx/.x/help/recognize.region rename to src/clis/spx/.x/help/recognize.region diff --git a/src/spx/.x/help/recognize.save b/src/clis/spx/.x/help/recognize.save similarity index 100% rename from src/spx/.x/help/recognize.save rename to src/clis/spx/.x/help/recognize.save diff --git a/src/spx/.x/help/recognize.testing b/src/clis/spx/.x/help/recognize.testing similarity index 100% rename from src/spx/.x/help/recognize.testing rename to src/clis/spx/.x/help/recognize.testing diff --git a/src/spx/.x/help/recognize.threads b/src/clis/spx/.x/help/recognize.threads similarity index 100% rename from src/spx/.x/help/recognize.threads rename to src/clis/spx/.x/help/recognize.threads diff --git a/src/spx/.x/help/recognize.token b/src/clis/spx/.x/help/recognize.token similarity index 100% rename from src/spx/.x/help/recognize.token rename to src/clis/spx/.x/help/recognize.token diff --git a/src/spx/.x/help/recognize.transcript b/src/clis/spx/.x/help/recognize.transcript similarity index 100% rename from src/spx/.x/help/recognize.transcript rename to src/clis/spx/.x/help/recognize.transcript diff --git a/src/spx/.x/help/recognize.url b/src/clis/spx/.x/help/recognize.url similarity index 100% rename from src/spx/.x/help/recognize.url rename to src/clis/spx/.x/help/recognize.url diff --git a/src/spx/.x/help/recognize.urls b/src/clis/spx/.x/help/recognize.urls similarity index 100% rename from src/spx/.x/help/recognize.urls rename to src/clis/spx/.x/help/recognize.urls diff --git a/src/spx/.x/help/recognize.wer b/src/clis/spx/.x/help/recognize.wer similarity index 100% rename from src/spx/.x/help/recognize.wer rename to src/clis/spx/.x/help/recognize.wer diff --git a/src/spx/.x/help/recognize.word.level.timing b/src/clis/spx/.x/help/recognize.word.level.timing similarity index 100% rename from src/spx/.x/help/recognize.word.level.timing rename to src/clis/spx/.x/help/recognize.word.level.timing diff --git a/src/spx/.x/help/recognize.zip b/src/clis/spx/.x/help/recognize.zip similarity index 100% rename from src/spx/.x/help/recognize.zip rename to src/clis/spx/.x/help/recognize.zip diff --git a/src/spx/.x/help/region b/src/clis/spx/.x/help/region similarity index 100% rename from src/spx/.x/help/region rename to src/clis/spx/.x/help/region diff --git a/src/spx/.x/help/region.overview b/src/clis/spx/.x/help/region.overview similarity index 100% rename from src/spx/.x/help/region.overview rename to src/clis/spx/.x/help/region.overview diff --git a/src/spx/.x/help/run b/src/clis/spx/.x/help/run similarity index 100% rename from src/spx/.x/help/run rename to src/clis/spx/.x/help/run diff --git a/src/spx/.x/help/run.advanced b/src/clis/spx/.x/help/run.advanced similarity index 100% rename from src/spx/.x/help/run.advanced rename to src/clis/spx/.x/help/run.advanced diff --git a/src/spx/.x/help/run.csx b/src/clis/spx/.x/help/run.csx similarity index 100% rename from src/spx/.x/help/run.csx rename to src/clis/spx/.x/help/run.csx diff --git a/src/spx/.x/help/run.examples b/src/clis/spx/.x/help/run.examples similarity index 100% rename from src/spx/.x/help/run.examples rename to src/clis/spx/.x/help/run.examples diff --git a/src/spx/.x/help/setup b/src/clis/spx/.x/help/setup similarity index 100% rename from src/spx/.x/help/setup rename to src/clis/spx/.x/help/setup diff --git a/src/spx/.x/help/source b/src/clis/spx/.x/help/source similarity index 100% rename from src/spx/.x/help/source rename to src/clis/spx/.x/help/source diff --git a/src/spx/.x/help/speaker b/src/clis/spx/.x/help/speaker similarity index 100% rename from src/spx/.x/help/speaker rename to src/clis/spx/.x/help/speaker diff --git a/src/spx/.x/help/speaker.connection b/src/clis/spx/.x/help/speaker.connection similarity index 100% rename from src/spx/.x/help/speaker.connection rename to src/clis/spx/.x/help/speaker.connection diff --git a/src/spx/.x/help/speaker.documentation b/src/clis/spx/.x/help/speaker.documentation similarity index 100% rename from src/spx/.x/help/speaker.documentation rename to src/clis/spx/.x/help/speaker.documentation diff --git a/src/spx/.x/help/speaker.examples b/src/clis/spx/.x/help/speaker.examples similarity index 100% rename from src/spx/.x/help/speaker.examples rename to src/clis/spx/.x/help/speaker.examples diff --git a/src/spx/.x/help/speaker.file b/src/clis/spx/.x/help/speaker.file similarity index 100% rename from src/spx/.x/help/speaker.file rename to src/clis/spx/.x/help/speaker.file diff --git a/src/spx/.x/help/speaker.id b/src/clis/spx/.x/help/speaker.id similarity index 100% rename from src/spx/.x/help/speaker.id rename to src/clis/spx/.x/help/speaker.id diff --git a/src/spx/.x/help/speaker.identify b/src/clis/spx/.x/help/speaker.identify similarity index 100% rename from src/spx/.x/help/speaker.identify rename to src/clis/spx/.x/help/speaker.identify diff --git a/src/spx/.x/help/speaker.key b/src/clis/spx/.x/help/speaker.key similarity index 100% rename from src/spx/.x/help/speaker.key rename to src/clis/spx/.x/help/speaker.key diff --git a/src/spx/.x/help/speaker.kind b/src/clis/spx/.x/help/speaker.kind similarity index 100% rename from src/spx/.x/help/speaker.kind rename to src/clis/spx/.x/help/speaker.kind diff --git a/src/spx/.x/help/speaker.language b/src/clis/spx/.x/help/speaker.language similarity index 100% rename from src/spx/.x/help/speaker.language rename to src/clis/spx/.x/help/speaker.language diff --git a/src/spx/.x/help/speaker.region b/src/clis/spx/.x/help/speaker.region similarity index 100% rename from src/spx/.x/help/speaker.region rename to src/clis/spx/.x/help/speaker.region diff --git a/src/spx/.x/help/speaker.verify b/src/clis/spx/.x/help/speaker.verify similarity index 100% rename from src/spx/.x/help/speaker.verify rename to src/clis/spx/.x/help/speaker.verify diff --git a/src/spx/.x/help/synthesize b/src/clis/spx/.x/help/synthesize similarity index 100% rename from src/spx/.x/help/synthesize rename to src/clis/spx/.x/help/synthesize diff --git a/src/spx/.x/help/synthesize.advanced b/src/clis/spx/.x/help/synthesize.advanced similarity index 100% rename from src/spx/.x/help/synthesize.advanced rename to src/clis/spx/.x/help/synthesize.advanced diff --git a/src/spx/.x/help/synthesize.audio b/src/clis/spx/.x/help/synthesize.audio similarity index 100% rename from src/spx/.x/help/synthesize.audio rename to src/clis/spx/.x/help/synthesize.audio diff --git a/src/spx/.x/help/synthesize.audio.output b/src/clis/spx/.x/help/synthesize.audio.output similarity index 100% rename from src/spx/.x/help/synthesize.audio.output rename to src/clis/spx/.x/help/synthesize.audio.output diff --git a/src/spx/.x/help/synthesize.audio.speakers b/src/clis/spx/.x/help/synthesize.audio.speakers similarity index 100% rename from src/spx/.x/help/synthesize.audio.speakers rename to src/clis/spx/.x/help/synthesize.audio.speakers diff --git a/src/spx/.x/help/synthesize.connection b/src/clis/spx/.x/help/synthesize.connection similarity index 100% rename from src/spx/.x/help/synthesize.connection rename to src/clis/spx/.x/help/synthesize.connection diff --git a/src/spx/.x/help/synthesize.endpoint b/src/clis/spx/.x/help/synthesize.endpoint similarity index 100% rename from src/spx/.x/help/synthesize.endpoint rename to src/clis/spx/.x/help/synthesize.endpoint diff --git a/src/spx/.x/help/synthesize.examples b/src/clis/spx/.x/help/synthesize.examples similarity index 100% rename from src/spx/.x/help/synthesize.examples rename to src/clis/spx/.x/help/synthesize.examples diff --git a/src/spx/.x/help/synthesize.file b/src/clis/spx/.x/help/synthesize.file similarity index 100% rename from src/spx/.x/help/synthesize.file rename to src/clis/spx/.x/help/synthesize.file diff --git a/src/spx/.x/help/synthesize.files b/src/clis/spx/.x/help/synthesize.files similarity index 100% rename from src/spx/.x/help/synthesize.files rename to src/clis/spx/.x/help/synthesize.files diff --git a/src/spx/.x/help/synthesize.foreach b/src/clis/spx/.x/help/synthesize.foreach similarity index 100% rename from src/spx/.x/help/synthesize.foreach rename to src/clis/spx/.x/help/synthesize.foreach diff --git a/src/spx/.x/help/synthesize.format b/src/clis/spx/.x/help/synthesize.format similarity index 100% rename from src/spx/.x/help/synthesize.format rename to src/clis/spx/.x/help/synthesize.format diff --git a/src/spx/.x/help/synthesize.format.mp3 b/src/clis/spx/.x/help/synthesize.format.mp3 similarity index 100% rename from src/spx/.x/help/synthesize.format.mp3 rename to src/clis/spx/.x/help/synthesize.format.mp3 diff --git a/src/spx/.x/help/synthesize.format.ogg b/src/clis/spx/.x/help/synthesize.format.ogg similarity index 100% rename from src/spx/.x/help/synthesize.format.ogg rename to src/clis/spx/.x/help/synthesize.format.ogg diff --git a/src/spx/.x/help/synthesize.format.opus b/src/clis/spx/.x/help/synthesize.format.opus similarity index 100% rename from src/spx/.x/help/synthesize.format.opus rename to src/clis/spx/.x/help/synthesize.format.opus diff --git a/src/spx/.x/help/synthesize.format.raw b/src/clis/spx/.x/help/synthesize.format.raw similarity index 100% rename from src/spx/.x/help/synthesize.format.raw rename to src/clis/spx/.x/help/synthesize.format.raw diff --git a/src/spx/.x/help/synthesize.format.siren b/src/clis/spx/.x/help/synthesize.format.siren similarity index 100% rename from src/spx/.x/help/synthesize.format.siren rename to src/clis/spx/.x/help/synthesize.format.siren diff --git a/src/spx/.x/help/synthesize.format.wav b/src/clis/spx/.x/help/synthesize.format.wav similarity index 100% rename from src/spx/.x/help/synthesize.format.wav rename to src/clis/spx/.x/help/synthesize.format.wav diff --git a/src/spx/.x/help/synthesize.format.webm b/src/clis/spx/.x/help/synthesize.format.webm similarity index 100% rename from src/spx/.x/help/synthesize.format.webm rename to src/clis/spx/.x/help/synthesize.format.webm diff --git a/src/spx/.x/help/synthesize.input b/src/clis/spx/.x/help/synthesize.input similarity index 100% rename from src/spx/.x/help/synthesize.input rename to src/clis/spx/.x/help/synthesize.input diff --git a/src/spx/.x/help/synthesize.interactive b/src/clis/spx/.x/help/synthesize.interactive similarity index 100% rename from src/spx/.x/help/synthesize.interactive rename to src/clis/spx/.x/help/synthesize.interactive diff --git a/src/spx/.x/help/synthesize.key b/src/clis/spx/.x/help/synthesize.key similarity index 100% rename from src/spx/.x/help/synthesize.key rename to src/clis/spx/.x/help/synthesize.key diff --git a/src/spx/.x/help/synthesize.list.voices b/src/clis/spx/.x/help/synthesize.list.voices similarity index 100% rename from src/spx/.x/help/synthesize.list.voices rename to src/clis/spx/.x/help/synthesize.list.voices diff --git a/src/spx/.x/help/synthesize.log b/src/clis/spx/.x/help/synthesize.log similarity index 100% rename from src/spx/.x/help/synthesize.log rename to src/clis/spx/.x/help/synthesize.log diff --git a/src/spx/.x/help/synthesize.mp3 b/src/clis/spx/.x/help/synthesize.mp3 similarity index 100% rename from src/spx/.x/help/synthesize.mp3 rename to src/clis/spx/.x/help/synthesize.mp3 diff --git a/src/spx/.x/help/synthesize.ogg b/src/clis/spx/.x/help/synthesize.ogg similarity index 100% rename from src/spx/.x/help/synthesize.ogg rename to src/clis/spx/.x/help/synthesize.ogg diff --git a/src/spx/.x/help/synthesize.opus b/src/clis/spx/.x/help/synthesize.opus similarity index 100% rename from src/spx/.x/help/synthesize.opus rename to src/clis/spx/.x/help/synthesize.opus diff --git a/src/spx/.x/help/synthesize.output b/src/clis/spx/.x/help/synthesize.output similarity index 100% rename from src/spx/.x/help/synthesize.output rename to src/clis/spx/.x/help/synthesize.output diff --git a/src/spx/.x/help/synthesize.output.all b/src/clis/spx/.x/help/synthesize.output.all similarity index 100% rename from src/spx/.x/help/synthesize.output.all rename to src/clis/spx/.x/help/synthesize.output.all diff --git a/src/spx/.x/help/synthesize.output.all.file b/src/clis/spx/.x/help/synthesize.output.all.file similarity index 100% rename from src/spx/.x/help/synthesize.output.all.file rename to src/clis/spx/.x/help/synthesize.output.all.file diff --git a/src/spx/.x/help/synthesize.output.each b/src/clis/spx/.x/help/synthesize.output.each similarity index 100% rename from src/spx/.x/help/synthesize.output.each rename to src/clis/spx/.x/help/synthesize.output.each diff --git a/src/spx/.x/help/synthesize.output.each.file b/src/clis/spx/.x/help/synthesize.output.each.file similarity index 100% rename from src/spx/.x/help/synthesize.output.each.file rename to src/clis/spx/.x/help/synthesize.output.each.file diff --git a/src/spx/.x/help/synthesize.output.examples b/src/clis/spx/.x/help/synthesize.output.examples similarity index 100% rename from src/spx/.x/help/synthesize.output.examples rename to src/clis/spx/.x/help/synthesize.output.examples diff --git a/src/spx/.x/help/synthesize.processes b/src/clis/spx/.x/help/synthesize.processes similarity index 100% rename from src/spx/.x/help/synthesize.processes rename to src/clis/spx/.x/help/synthesize.processes diff --git a/src/spx/.x/help/synthesize.proxy b/src/clis/spx/.x/help/synthesize.proxy similarity index 100% rename from src/spx/.x/help/synthesize.proxy rename to src/clis/spx/.x/help/synthesize.proxy diff --git a/src/spx/.x/help/synthesize.raw b/src/clis/spx/.x/help/synthesize.raw similarity index 100% rename from src/spx/.x/help/synthesize.raw rename to src/clis/spx/.x/help/synthesize.raw diff --git a/src/spx/.x/help/synthesize.region b/src/clis/spx/.x/help/synthesize.region similarity index 100% rename from src/spx/.x/help/synthesize.region rename to src/clis/spx/.x/help/synthesize.region diff --git a/src/spx/.x/help/synthesize.save b/src/clis/spx/.x/help/synthesize.save similarity index 100% rename from src/spx/.x/help/synthesize.save rename to src/clis/spx/.x/help/synthesize.save diff --git a/src/spx/.x/help/synthesize.siren b/src/clis/spx/.x/help/synthesize.siren similarity index 100% rename from src/spx/.x/help/synthesize.siren rename to src/clis/spx/.x/help/synthesize.siren diff --git a/src/spx/.x/help/synthesize.ssml b/src/clis/spx/.x/help/synthesize.ssml similarity index 100% rename from src/spx/.x/help/synthesize.ssml rename to src/clis/spx/.x/help/synthesize.ssml diff --git a/src/spx/.x/help/synthesize.text b/src/clis/spx/.x/help/synthesize.text similarity index 100% rename from src/spx/.x/help/synthesize.text rename to src/clis/spx/.x/help/synthesize.text diff --git a/src/spx/.x/help/synthesize.threads b/src/clis/spx/.x/help/synthesize.threads similarity index 100% rename from src/spx/.x/help/synthesize.threads rename to src/clis/spx/.x/help/synthesize.threads diff --git a/src/spx/.x/help/synthesize.token b/src/clis/spx/.x/help/synthesize.token similarity index 100% rename from src/spx/.x/help/synthesize.token rename to src/clis/spx/.x/help/synthesize.token diff --git a/src/spx/.x/help/synthesize.url b/src/clis/spx/.x/help/synthesize.url similarity index 100% rename from src/spx/.x/help/synthesize.url rename to src/clis/spx/.x/help/synthesize.url diff --git a/src/spx/.x/help/synthesize.urls b/src/clis/spx/.x/help/synthesize.urls similarity index 100% rename from src/spx/.x/help/synthesize.urls rename to src/clis/spx/.x/help/synthesize.urls diff --git a/src/spx/.x/help/synthesize.voice b/src/clis/spx/.x/help/synthesize.voice similarity index 100% rename from src/spx/.x/help/synthesize.voice rename to src/clis/spx/.x/help/synthesize.voice diff --git a/src/spx/.x/help/synthesize.wav b/src/clis/spx/.x/help/synthesize.wav similarity index 100% rename from src/spx/.x/help/synthesize.wav rename to src/clis/spx/.x/help/synthesize.wav diff --git a/src/spx/.x/help/synthesize.webm b/src/clis/spx/.x/help/synthesize.webm similarity index 100% rename from src/spx/.x/help/synthesize.webm rename to src/clis/spx/.x/help/synthesize.webm diff --git a/src/spx/.x/help/synthesize.zip b/src/clis/spx/.x/help/synthesize.zip similarity index 100% rename from src/spx/.x/help/synthesize.zip rename to src/clis/spx/.x/help/synthesize.zip diff --git a/src/spx/.x/help/target b/src/clis/spx/.x/help/target similarity index 100% rename from src/spx/.x/help/target rename to src/clis/spx/.x/help/target diff --git a/src/spx/.x/help/token b/src/clis/spx/.x/help/token similarity index 100% rename from src/spx/.x/help/token rename to src/clis/spx/.x/help/token diff --git a/src/spx/.x/help/traffic.type b/src/clis/spx/.x/help/traffic.type similarity index 100% rename from src/spx/.x/help/traffic.type rename to src/clis/spx/.x/help/traffic.type diff --git a/src/spx/.x/help/transcribe b/src/clis/spx/.x/help/transcribe similarity index 100% rename from src/spx/.x/help/transcribe rename to src/clis/spx/.x/help/transcribe diff --git a/src/spx/.x/help/transcribe.advanced b/src/clis/spx/.x/help/transcribe.advanced similarity index 100% rename from src/spx/.x/help/transcribe.advanced rename to src/clis/spx/.x/help/transcribe.advanced diff --git a/src/spx/.x/help/transcribe.connect b/src/clis/spx/.x/help/transcribe.connect similarity index 100% rename from src/spx/.x/help/transcribe.connect rename to src/clis/spx/.x/help/transcribe.connect diff --git a/src/spx/.x/help/transcribe.connection b/src/clis/spx/.x/help/transcribe.connection similarity index 100% rename from src/spx/.x/help/transcribe.connection rename to src/clis/spx/.x/help/transcribe.connection diff --git a/src/spx/.x/help/transcribe.conversation.id b/src/clis/spx/.x/help/transcribe.conversation.id similarity index 100% rename from src/spx/.x/help/transcribe.conversation.id rename to src/clis/spx/.x/help/transcribe.conversation.id diff --git a/src/spx/.x/help/transcribe.endpoint b/src/clis/spx/.x/help/transcribe.endpoint similarity index 100% rename from src/spx/.x/help/transcribe.endpoint rename to src/clis/spx/.x/help/transcribe.endpoint diff --git a/src/spx/.x/help/transcribe.examples b/src/clis/spx/.x/help/transcribe.examples similarity index 100% rename from src/spx/.x/help/transcribe.examples rename to src/clis/spx/.x/help/transcribe.examples diff --git a/src/spx/.x/help/transcribe.file b/src/clis/spx/.x/help/transcribe.file similarity index 100% rename from src/spx/.x/help/transcribe.file rename to src/clis/spx/.x/help/transcribe.file diff --git a/src/spx/.x/help/transcribe.files b/src/clis/spx/.x/help/transcribe.files similarity index 100% rename from src/spx/.x/help/transcribe.files rename to src/clis/spx/.x/help/transcribe.files diff --git a/src/spx/.x/help/transcribe.foreach b/src/clis/spx/.x/help/transcribe.foreach similarity index 100% rename from src/spx/.x/help/transcribe.foreach rename to src/clis/spx/.x/help/transcribe.foreach diff --git a/src/spx/.x/help/transcribe.input b/src/clis/spx/.x/help/transcribe.input similarity index 100% rename from src/spx/.x/help/transcribe.input rename to src/clis/spx/.x/help/transcribe.input diff --git a/src/spx/.x/help/transcribe.key b/src/clis/spx/.x/help/transcribe.key similarity index 100% rename from src/spx/.x/help/transcribe.key rename to src/clis/spx/.x/help/transcribe.key diff --git a/src/spx/.x/help/transcribe.language b/src/clis/spx/.x/help/transcribe.language similarity index 100% rename from src/spx/.x/help/transcribe.language rename to src/clis/spx/.x/help/transcribe.language diff --git a/src/spx/.x/help/transcribe.log b/src/clis/spx/.x/help/transcribe.log similarity index 100% rename from src/spx/.x/help/transcribe.log rename to src/clis/spx/.x/help/transcribe.log diff --git a/src/spx/.x/help/transcribe.output b/src/clis/spx/.x/help/transcribe.output similarity index 100% rename from src/spx/.x/help/transcribe.output rename to src/clis/spx/.x/help/transcribe.output diff --git a/src/spx/.x/help/transcribe.output.all b/src/clis/spx/.x/help/transcribe.output.all similarity index 100% rename from src/spx/.x/help/transcribe.output.all rename to src/clis/spx/.x/help/transcribe.output.all diff --git a/src/spx/.x/help/transcribe.output.each b/src/clis/spx/.x/help/transcribe.output.each similarity index 100% rename from src/spx/.x/help/transcribe.output.each rename to src/clis/spx/.x/help/transcribe.output.each diff --git a/src/spx/.x/help/transcribe.phrases b/src/clis/spx/.x/help/transcribe.phrases similarity index 100% rename from src/spx/.x/help/transcribe.phrases rename to src/clis/spx/.x/help/transcribe.phrases diff --git a/src/spx/.x/help/transcribe.proxy b/src/clis/spx/.x/help/transcribe.proxy similarity index 100% rename from src/spx/.x/help/transcribe.proxy rename to src/clis/spx/.x/help/transcribe.proxy diff --git a/src/spx/.x/help/transcribe.region b/src/clis/spx/.x/help/transcribe.region similarity index 100% rename from src/spx/.x/help/transcribe.region rename to src/clis/spx/.x/help/transcribe.region diff --git a/src/spx/.x/help/transcribe.save b/src/clis/spx/.x/help/transcribe.save similarity index 100% rename from src/spx/.x/help/transcribe.save rename to src/clis/spx/.x/help/transcribe.save diff --git a/src/spx/.x/help/transcribe.source b/src/clis/spx/.x/help/transcribe.source similarity index 100% rename from src/spx/.x/help/transcribe.source rename to src/clis/spx/.x/help/transcribe.source diff --git a/src/spx/.x/help/transcribe.token b/src/clis/spx/.x/help/transcribe.token similarity index 100% rename from src/spx/.x/help/transcribe.token rename to src/clis/spx/.x/help/transcribe.token diff --git a/src/spx/.x/help/transcribe.zip b/src/clis/spx/.x/help/transcribe.zip similarity index 100% rename from src/spx/.x/help/transcribe.zip rename to src/clis/spx/.x/help/transcribe.zip diff --git a/src/spx/.x/help/translate b/src/clis/spx/.x/help/translate similarity index 100% rename from src/spx/.x/help/translate rename to src/clis/spx/.x/help/translate diff --git a/src/spx/.x/help/translate.advanced b/src/clis/spx/.x/help/translate.advanced similarity index 100% rename from src/spx/.x/help/translate.advanced rename to src/clis/spx/.x/help/translate.advanced diff --git a/src/spx/.x/help/translate.check.text b/src/clis/spx/.x/help/translate.check.text similarity index 100% rename from src/spx/.x/help/translate.check.text rename to src/clis/spx/.x/help/translate.check.text diff --git a/src/spx/.x/help/translate.check.wer b/src/clis/spx/.x/help/translate.check.wer similarity index 100% rename from src/spx/.x/help/translate.check.wer rename to src/clis/spx/.x/help/translate.check.wer diff --git a/src/spx/.x/help/translate.connect b/src/clis/spx/.x/help/translate.connect similarity index 100% rename from src/spx/.x/help/translate.connect rename to src/clis/spx/.x/help/translate.connect diff --git a/src/spx/.x/help/translate.connection b/src/clis/spx/.x/help/translate.connection similarity index 100% rename from src/spx/.x/help/translate.connection rename to src/clis/spx/.x/help/translate.connection diff --git a/src/spx/.x/help/translate.continuous b/src/clis/spx/.x/help/translate.continuous similarity index 100% rename from src/spx/.x/help/translate.continuous rename to src/clis/spx/.x/help/translate.continuous diff --git a/src/spx/.x/help/translate.custom.speech b/src/clis/spx/.x/help/translate.custom.speech similarity index 100% rename from src/spx/.x/help/translate.custom.speech rename to src/clis/spx/.x/help/translate.custom.speech diff --git a/src/spx/.x/help/translate.custom.translation b/src/clis/spx/.x/help/translate.custom.translation similarity index 100% rename from src/spx/.x/help/translate.custom.translation rename to src/clis/spx/.x/help/translate.custom.translation diff --git a/src/spx/.x/help/translate.disconnect b/src/clis/spx/.x/help/translate.disconnect similarity index 100% rename from src/spx/.x/help/translate.disconnect rename to src/clis/spx/.x/help/translate.disconnect diff --git a/src/spx/.x/help/translate.endpoint b/src/clis/spx/.x/help/translate.endpoint similarity index 100% rename from src/spx/.x/help/translate.endpoint rename to src/clis/spx/.x/help/translate.endpoint diff --git a/src/spx/.x/help/translate.examples b/src/clis/spx/.x/help/translate.examples similarity index 100% rename from src/spx/.x/help/translate.examples rename to src/clis/spx/.x/help/translate.examples diff --git a/src/spx/.x/help/translate.file b/src/clis/spx/.x/help/translate.file similarity index 100% rename from src/spx/.x/help/translate.file rename to src/clis/spx/.x/help/translate.file diff --git a/src/spx/.x/help/translate.files b/src/clis/spx/.x/help/translate.files similarity index 100% rename from src/spx/.x/help/translate.files rename to src/clis/spx/.x/help/translate.files diff --git a/src/spx/.x/help/translate.foreach b/src/clis/spx/.x/help/translate.foreach similarity index 100% rename from src/spx/.x/help/translate.foreach rename to src/clis/spx/.x/help/translate.foreach diff --git a/src/spx/.x/help/translate.format b/src/clis/spx/.x/help/translate.format similarity index 100% rename from src/spx/.x/help/translate.format rename to src/clis/spx/.x/help/translate.format diff --git a/src/spx/.x/help/translate.input b/src/clis/spx/.x/help/translate.input similarity index 100% rename from src/spx/.x/help/translate.input rename to src/clis/spx/.x/help/translate.input diff --git a/src/spx/.x/help/translate.key b/src/clis/spx/.x/help/translate.key similarity index 100% rename from src/spx/.x/help/translate.key rename to src/clis/spx/.x/help/translate.key diff --git a/src/spx/.x/help/translate.keyword b/src/clis/spx/.x/help/translate.keyword similarity index 100% rename from src/spx/.x/help/translate.keyword rename to src/clis/spx/.x/help/translate.keyword diff --git a/src/spx/.x/help/translate.language b/src/clis/spx/.x/help/translate.language similarity index 100% rename from src/spx/.x/help/translate.language rename to src/clis/spx/.x/help/translate.language diff --git a/src/spx/.x/help/translate.log b/src/clis/spx/.x/help/translate.log similarity index 100% rename from src/spx/.x/help/translate.log rename to src/clis/spx/.x/help/translate.log diff --git a/src/spx/.x/help/translate.microphone b/src/clis/spx/.x/help/translate.microphone similarity index 100% rename from src/spx/.x/help/translate.microphone rename to src/clis/spx/.x/help/translate.microphone diff --git a/src/spx/.x/help/translate.once b/src/clis/spx/.x/help/translate.once similarity index 100% rename from src/spx/.x/help/translate.once rename to src/clis/spx/.x/help/translate.once diff --git a/src/spx/.x/help/translate.output b/src/clis/spx/.x/help/translate.output similarity index 100% rename from src/spx/.x/help/translate.output rename to src/clis/spx/.x/help/translate.output diff --git a/src/spx/.x/help/translate.output.all b/src/clis/spx/.x/help/translate.output.all similarity index 100% rename from src/spx/.x/help/translate.output.all rename to src/clis/spx/.x/help/translate.output.all diff --git a/src/spx/.x/help/translate.output.all.file b/src/clis/spx/.x/help/translate.output.all.file similarity index 100% rename from src/spx/.x/help/translate.output.all.file rename to src/clis/spx/.x/help/translate.output.all.file diff --git a/src/spx/.x/help/translate.output.batch b/src/clis/spx/.x/help/translate.output.batch similarity index 100% rename from src/spx/.x/help/translate.output.batch rename to src/clis/spx/.x/help/translate.output.batch diff --git a/src/spx/.x/help/translate.output.batch.file b/src/clis/spx/.x/help/translate.output.batch.file similarity index 100% rename from src/spx/.x/help/translate.output.batch.file rename to src/clis/spx/.x/help/translate.output.batch.file diff --git a/src/spx/.x/help/translate.output.batch.json b/src/clis/spx/.x/help/translate.output.batch.json similarity index 100% rename from src/spx/.x/help/translate.output.batch.json rename to src/clis/spx/.x/help/translate.output.batch.json diff --git a/src/spx/.x/help/translate.output.each b/src/clis/spx/.x/help/translate.output.each similarity index 100% rename from src/spx/.x/help/translate.output.each rename to src/clis/spx/.x/help/translate.output.each diff --git a/src/spx/.x/help/translate.output.each.file b/src/clis/spx/.x/help/translate.output.each.file similarity index 100% rename from src/spx/.x/help/translate.output.each.file rename to src/clis/spx/.x/help/translate.output.each.file diff --git a/src/spx/.x/help/translate.output.examples b/src/clis/spx/.x/help/translate.output.examples similarity index 100% rename from src/spx/.x/help/translate.output.examples rename to src/clis/spx/.x/help/translate.output.examples diff --git a/src/spx/.x/help/translate.phrases b/src/clis/spx/.x/help/translate.phrases similarity index 100% rename from src/spx/.x/help/translate.phrases rename to src/clis/spx/.x/help/translate.phrases diff --git a/src/spx/.x/help/translate.processes b/src/clis/spx/.x/help/translate.processes similarity index 100% rename from src/spx/.x/help/translate.processes rename to src/clis/spx/.x/help/translate.processes diff --git a/src/spx/.x/help/translate.profanity b/src/clis/spx/.x/help/translate.profanity similarity index 100% rename from src/spx/.x/help/translate.profanity rename to src/clis/spx/.x/help/translate.profanity diff --git a/src/spx/.x/help/translate.proxy b/src/clis/spx/.x/help/translate.proxy similarity index 100% rename from src/spx/.x/help/translate.proxy rename to src/clis/spx/.x/help/translate.proxy diff --git a/src/spx/.x/help/translate.region b/src/clis/spx/.x/help/translate.region similarity index 100% rename from src/spx/.x/help/translate.region rename to src/clis/spx/.x/help/translate.region diff --git a/src/spx/.x/help/translate.save b/src/clis/spx/.x/help/translate.save similarity index 100% rename from src/spx/.x/help/translate.save rename to src/clis/spx/.x/help/translate.save diff --git a/src/spx/.x/help/translate.threads b/src/clis/spx/.x/help/translate.threads similarity index 100% rename from src/spx/.x/help/translate.threads rename to src/clis/spx/.x/help/translate.threads diff --git a/src/spx/.x/help/translate.token b/src/clis/spx/.x/help/translate.token similarity index 100% rename from src/spx/.x/help/translate.token rename to src/clis/spx/.x/help/translate.token diff --git a/src/spx/.x/help/translate.transcript b/src/clis/spx/.x/help/translate.transcript similarity index 100% rename from src/spx/.x/help/translate.transcript rename to src/clis/spx/.x/help/translate.transcript diff --git a/src/spx/.x/help/translate.url b/src/clis/spx/.x/help/translate.url similarity index 100% rename from src/spx/.x/help/translate.url rename to src/clis/spx/.x/help/translate.url diff --git a/src/spx/.x/help/translate.urls b/src/clis/spx/.x/help/translate.urls similarity index 100% rename from src/spx/.x/help/translate.urls rename to src/clis/spx/.x/help/translate.urls diff --git a/src/spx/.x/help/translate.word.level.timing b/src/clis/spx/.x/help/translate.word.level.timing similarity index 100% rename from src/spx/.x/help/translate.word.level.timing rename to src/clis/spx/.x/help/translate.word.level.timing diff --git a/src/spx/.x/help/translate.zip b/src/clis/spx/.x/help/translate.zip similarity index 100% rename from src/spx/.x/help/translate.zip rename to src/clis/spx/.x/help/translate.zip diff --git a/src/spx/.x/help/tutorials b/src/clis/spx/.x/help/tutorials similarity index 100% rename from src/spx/.x/help/tutorials rename to src/clis/spx/.x/help/tutorials diff --git a/src/spx/.x/help/usage b/src/clis/spx/.x/help/usage similarity index 100% rename from src/spx/.x/help/usage rename to src/clis/spx/.x/help/usage diff --git a/src/spx/.x/help/webjob b/src/clis/spx/.x/help/webjob similarity index 100% rename from src/spx/.x/help/webjob rename to src/clis/spx/.x/help/webjob diff --git a/src/spx/.x/help/webjob.advanced b/src/clis/spx/.x/help/webjob.advanced similarity index 100% rename from src/spx/.x/help/webjob.advanced rename to src/clis/spx/.x/help/webjob.advanced diff --git a/src/spx/.x/help/webjob.connection b/src/clis/spx/.x/help/webjob.connection similarity index 100% rename from src/spx/.x/help/webjob.connection rename to src/clis/spx/.x/help/webjob.connection diff --git a/src/spx/.x/help/webjob.delete b/src/clis/spx/.x/help/webjob.delete similarity index 100% rename from src/spx/.x/help/webjob.delete rename to src/clis/spx/.x/help/webjob.delete diff --git a/src/spx/.x/help/webjob.download b/src/clis/spx/.x/help/webjob.download similarity index 100% rename from src/spx/.x/help/webjob.download rename to src/clis/spx/.x/help/webjob.download diff --git a/src/spx/.x/help/webjob.endpoint b/src/clis/spx/.x/help/webjob.endpoint similarity index 100% rename from src/spx/.x/help/webjob.endpoint rename to src/clis/spx/.x/help/webjob.endpoint diff --git a/src/spx/.x/help/webjob.examples b/src/clis/spx/.x/help/webjob.examples similarity index 100% rename from src/spx/.x/help/webjob.examples rename to src/clis/spx/.x/help/webjob.examples diff --git a/src/spx/.x/help/webjob.execution b/src/clis/spx/.x/help/webjob.execution similarity index 100% rename from src/spx/.x/help/webjob.execution rename to src/clis/spx/.x/help/webjob.execution diff --git a/src/spx/.x/help/webjob.foreach b/src/clis/spx/.x/help/webjob.foreach similarity index 100% rename from src/spx/.x/help/webjob.foreach rename to src/clis/spx/.x/help/webjob.foreach diff --git a/src/spx/.x/help/webjob.list b/src/clis/spx/.x/help/webjob.list similarity index 100% rename from src/spx/.x/help/webjob.list rename to src/clis/spx/.x/help/webjob.list diff --git a/src/spx/.x/help/webjob.list.jobs b/src/clis/spx/.x/help/webjob.list.jobs similarity index 100% rename from src/spx/.x/help/webjob.list.jobs rename to src/clis/spx/.x/help/webjob.list.jobs diff --git a/src/spx/.x/help/webjob.password b/src/clis/spx/.x/help/webjob.password similarity index 100% rename from src/spx/.x/help/webjob.password rename to src/clis/spx/.x/help/webjob.password diff --git a/src/spx/.x/help/webjob.resources b/src/clis/spx/.x/help/webjob.resources similarity index 100% rename from src/spx/.x/help/webjob.resources rename to src/clis/spx/.x/help/webjob.resources diff --git a/src/spx/.x/help/webjob.results b/src/clis/spx/.x/help/webjob.results similarity index 100% rename from src/spx/.x/help/webjob.results rename to src/clis/spx/.x/help/webjob.results diff --git a/src/spx/.x/help/webjob.run b/src/clis/spx/.x/help/webjob.run similarity index 100% rename from src/spx/.x/help/webjob.run rename to src/clis/spx/.x/help/webjob.run diff --git a/src/spx/.x/help/webjob.setup b/src/clis/spx/.x/help/webjob.setup similarity index 100% rename from src/spx/.x/help/webjob.setup rename to src/clis/spx/.x/help/webjob.setup diff --git a/src/spx/.x/help/webjob.status b/src/clis/spx/.x/help/webjob.status similarity index 100% rename from src/spx/.x/help/webjob.status rename to src/clis/spx/.x/help/webjob.status diff --git a/src/spx/.x/help/webjob.upload b/src/clis/spx/.x/help/webjob.upload similarity index 100% rename from src/spx/.x/help/webjob.upload rename to src/clis/spx/.x/help/webjob.upload diff --git a/src/spx/.x/help/websocket.messages b/src/clis/spx/.x/help/websocket.messages similarity index 100% rename from src/spx/.x/help/websocket.messages rename to src/clis/spx/.x/help/websocket.messages diff --git a/src/spx/.x/help/zip b/src/clis/spx/.x/help/zip similarity index 100% rename from src/spx/.x/help/zip rename to src/clis/spx/.x/help/zip diff --git a/src/spx/BuildCommon.targets b/src/clis/spx/BuildCommon.targets similarity index 100% rename from src/spx/BuildCommon.targets rename to src/clis/spx/BuildCommon.targets diff --git a/src/spx/HowToCompileWithInternalSpeechSDK.md b/src/clis/spx/HowToCompileWithInternalSpeechSDK.md similarity index 100% rename from src/spx/HowToCompileWithInternalSpeechSDK.md rename to src/clis/spx/HowToCompileWithInternalSpeechSDK.md diff --git a/src/spx/HowToCompileWithPrivateSpeechSDK.md b/src/clis/spx/HowToCompileWithPrivateSpeechSDK.md similarity index 100% rename from src/spx/HowToCompileWithPrivateSpeechSDK.md rename to src/clis/spx/HowToCompileWithPrivateSpeechSDK.md diff --git a/src/spx/HowToRunEmbeddedSpeech.md b/src/clis/spx/HowToRunEmbeddedSpeech.md similarity index 100% rename from src/spx/HowToRunEmbeddedSpeech.md rename to src/clis/spx/HowToRunEmbeddedSpeech.md diff --git a/src/spx/LICENSE.txt b/src/clis/spx/LICENSE.txt similarity index 100% rename from src/spx/LICENSE.txt rename to src/clis/spx/LICENSE.txt diff --git a/src/spx/Microsoft.CognitiveServices.Speech.CLI-Dependency.targets b/src/clis/spx/Microsoft.CognitiveServices.Speech.CLI-Dependency.targets similarity index 100% rename from src/spx/Microsoft.CognitiveServices.Speech.CLI-Dependency.targets rename to src/clis/spx/Microsoft.CognitiveServices.Speech.CLI-Dependency.targets diff --git a/src/spx/NuGet.Config b/src/clis/spx/NuGet.Config similarity index 100% rename from src/spx/NuGet.Config rename to src/clis/spx/NuGet.Config diff --git a/src/spx/Program_SPX.cs b/src/clis/spx/Program_SPX.cs similarity index 100% rename from src/spx/Program_SPX.cs rename to src/clis/spx/Program_SPX.cs diff --git a/src/spx/Properties/PublishProfiles/folder publish spx-cli debug (linux-x64).pubxml b/src/clis/spx/Properties/PublishProfiles/folder publish spx-cli debug (linux-x64).pubxml similarity index 100% rename from src/spx/Properties/PublishProfiles/folder publish spx-cli debug (linux-x64).pubxml rename to src/clis/spx/Properties/PublishProfiles/folder publish spx-cli debug (linux-x64).pubxml diff --git a/src/spx/Properties/PublishProfiles/folder publish spx-cli debug (osx-64).pubxml b/src/clis/spx/Properties/PublishProfiles/folder publish spx-cli debug (osx-64).pubxml similarity index 100% rename from src/spx/Properties/PublishProfiles/folder publish spx-cli debug (osx-64).pubxml rename to src/clis/spx/Properties/PublishProfiles/folder publish spx-cli debug (osx-64).pubxml diff --git a/src/spx/Properties/PublishProfiles/folder publish spx-cli debug (win-x64).pubxml b/src/clis/spx/Properties/PublishProfiles/folder publish spx-cli debug (win-x64).pubxml similarity index 100% rename from src/spx/Properties/PublishProfiles/folder publish spx-cli debug (win-x64).pubxml rename to src/clis/spx/Properties/PublishProfiles/folder publish spx-cli debug (win-x64).pubxml diff --git a/src/spx/Properties/PublishProfiles/folder publish spx-cli release (linux-x64).pubxml b/src/clis/spx/Properties/PublishProfiles/folder publish spx-cli release (linux-x64).pubxml similarity index 100% rename from src/spx/Properties/PublishProfiles/folder publish spx-cli release (linux-x64).pubxml rename to src/clis/spx/Properties/PublishProfiles/folder publish spx-cli release (linux-x64).pubxml diff --git a/src/spx/Properties/PublishProfiles/folder publish spx-cli release (osx-64).pubxml b/src/clis/spx/Properties/PublishProfiles/folder publish spx-cli release (osx-64).pubxml similarity index 100% rename from src/spx/Properties/PublishProfiles/folder publish spx-cli release (osx-64).pubxml rename to src/clis/spx/Properties/PublishProfiles/folder publish spx-cli release (osx-64).pubxml diff --git a/src/spx/Properties/PublishProfiles/folder publish spx-cli release (win-x64).pubxml b/src/clis/spx/Properties/PublishProfiles/folder publish spx-cli release (win-x64).pubxml similarity index 100% rename from src/spx/Properties/PublishProfiles/folder publish spx-cli release (win-x64).pubxml rename to src/clis/spx/Properties/PublishProfiles/folder publish spx-cli release (win-x64).pubxml diff --git a/src/spx/THIRD_PARTY_NOTICE.txt b/src/clis/spx/THIRD_PARTY_NOTICE.txt similarity index 100% rename from src/spx/THIRD_PARTY_NOTICE.txt rename to src/clis/spx/THIRD_PARTY_NOTICE.txt diff --git a/src/spx/app.manifest b/src/clis/spx/app.manifest similarity index 100% rename from src/spx/app.manifest rename to src/clis/spx/app.manifest diff --git a/src/spx/ci/Dockerfile b/src/clis/spx/ci/Dockerfile similarity index 100% rename from src/spx/ci/Dockerfile rename to src/clis/spx/ci/Dockerfile diff --git a/src/spx/ci/build-all.sh b/src/clis/spx/ci/build-all.sh similarity index 100% rename from src/spx/ci/build-all.sh rename to src/clis/spx/ci/build-all.sh diff --git a/src/spx/ci/build-local-from-cmake-output.cmd b/src/clis/spx/ci/build-local-from-cmake-output.cmd similarity index 100% rename from src/spx/ci/build-local-from-cmake-output.cmd rename to src/clis/spx/ci/build-local-from-cmake-output.cmd diff --git a/src/spx/ci/build-local-from-nuget-download.cmd b/src/clis/spx/ci/build-local-from-nuget-download.cmd similarity index 100% rename from src/spx/ci/build-local-from-nuget-download.cmd rename to src/clis/spx/ci/build-local-from-nuget-download.cmd diff --git a/src/spx/ci/help-topic-crosscheck.sh b/src/clis/spx/ci/help-topic-crosscheck.sh similarity index 100% rename from src/spx/ci/help-topic-crosscheck.sh rename to src/clis/spx/ci/help-topic-crosscheck.sh diff --git a/src/spx/ci/spx-build-pipeline.yml b/src/clis/spx/ci/spx-build-pipeline.yml similarity index 100% rename from src/spx/ci/spx-build-pipeline.yml rename to src/clis/spx/ci/spx-build-pipeline.yml diff --git a/src/spx/ci/spx-test-pipeline.yml b/src/clis/spx/ci/spx-test-pipeline.yml similarity index 100% rename from src/spx/ci/spx-test-pipeline.yml rename to src/clis/spx/ci/spx-test-pipeline.yml diff --git a/src/spx/commands/base/recognize_commands_base.cs b/src/clis/spx/commands/base/recognize_commands_base.cs similarity index 100% rename from src/spx/commands/base/recognize_commands_base.cs rename to src/clis/spx/commands/base/recognize_commands_base.cs diff --git a/src/spx/commands/batch_command.cs b/src/clis/spx/commands/batch_command.cs similarity index 100% rename from src/spx/commands/batch_command.cs rename to src/clis/spx/commands/batch_command.cs diff --git a/src/spx/commands/custom_speech_recognition_command.cs b/src/clis/spx/commands/custom_speech_recognition_command.cs similarity index 100% rename from src/spx/commands/custom_speech_recognition_command.cs rename to src/clis/spx/commands/custom_speech_recognition_command.cs diff --git a/src/spx/commands/dialog_command.cs b/src/clis/spx/commands/dialog_command.cs similarity index 100% rename from src/spx/commands/dialog_command.cs rename to src/clis/spx/commands/dialog_command.cs diff --git a/src/spx/commands/intent_command.cs b/src/clis/spx/commands/intent_command.cs similarity index 100% rename from src/spx/commands/intent_command.cs rename to src/clis/spx/commands/intent_command.cs diff --git a/src/spx/commands/parsers/batch_command_parser.cs b/src/clis/spx/commands/parsers/batch_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/batch_command_parser.cs rename to src/clis/spx/commands/parsers/batch_command_parser.cs diff --git a/src/spx/commands/parsers/bot_command_parser.cs b/src/clis/spx/commands/parsers/bot_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/bot_command_parser.cs rename to src/clis/spx/commands/parsers/bot_command_parser.cs diff --git a/src/spx/commands/parsers/common_output_token_parsers.cs b/src/clis/spx/commands/parsers/common_output_token_parsers.cs similarity index 100% rename from src/spx/commands/parsers/common_output_token_parsers.cs rename to src/clis/spx/commands/parsers/common_output_token_parsers.cs diff --git a/src/spx/commands/parsers/common_speech_token_parsers.cs b/src/clis/spx/commands/parsers/common_speech_token_parsers.cs similarity index 100% rename from src/spx/commands/parsers/common_speech_token_parsers.cs rename to src/clis/spx/commands/parsers/common_speech_token_parsers.cs diff --git a/src/spx/commands/parsers/custom_speech_recognition_command_parser.cs b/src/clis/spx/commands/parsers/custom_speech_recognition_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/custom_speech_recognition_command_parser.cs rename to src/clis/spx/commands/parsers/custom_speech_recognition_command_parser.cs diff --git a/src/spx/commands/parsers/dialog_command_parser.cs b/src/clis/spx/commands/parsers/dialog_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/dialog_command_parser.cs rename to src/clis/spx/commands/parsers/dialog_command_parser.cs diff --git a/src/spx/commands/parsers/intent_command_parser.cs b/src/clis/spx/commands/parsers/intent_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/intent_command_parser.cs rename to src/clis/spx/commands/parsers/intent_command_parser.cs diff --git a/src/spx/commands/parsers/profile_command_parser.cs b/src/clis/spx/commands/parsers/profile_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/profile_command_parser.cs rename to src/clis/spx/commands/parsers/profile_command_parser.cs diff --git a/src/spx/commands/parsers/recognize_command_parser.cs b/src/clis/spx/commands/parsers/recognize_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/recognize_command_parser.cs rename to src/clis/spx/commands/parsers/recognize_command_parser.cs diff --git a/src/spx/commands/parsers/synthesize_command_parser.cs b/src/clis/spx/commands/parsers/synthesize_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/synthesize_command_parser.cs rename to src/clis/spx/commands/parsers/synthesize_command_parser.cs diff --git a/src/spx/commands/parsers/transcribe_conversation_command_parser.cs b/src/clis/spx/commands/parsers/transcribe_conversation_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/transcribe_conversation_command_parser.cs rename to src/clis/spx/commands/parsers/transcribe_conversation_command_parser.cs diff --git a/src/spx/commands/parsers/translate_command_parser.cs b/src/clis/spx/commands/parsers/translate_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/translate_command_parser.cs rename to src/clis/spx/commands/parsers/translate_command_parser.cs diff --git a/src/spx/commands/parsers/webjob_command_parser.cs b/src/clis/spx/commands/parsers/webjob_command_parser.cs similarity index 100% rename from src/spx/commands/parsers/webjob_command_parser.cs rename to src/clis/spx/commands/parsers/webjob_command_parser.cs diff --git a/src/spx/commands/profile_command.cs b/src/clis/spx/commands/profile_command.cs similarity index 100% rename from src/spx/commands/profile_command.cs rename to src/clis/spx/commands/profile_command.cs diff --git a/src/spx/commands/recognize_command.cs b/src/clis/spx/commands/recognize_command.cs similarity index 100% rename from src/spx/commands/recognize_command.cs rename to src/clis/spx/commands/recognize_command.cs diff --git a/src/spx/commands/synthesize_command.cs b/src/clis/spx/commands/synthesize_command.cs similarity index 100% rename from src/spx/commands/synthesize_command.cs rename to src/clis/spx/commands/synthesize_command.cs diff --git a/src/spx/commands/transcribe_conversation_command.cs b/src/clis/spx/commands/transcribe_conversation_command.cs similarity index 100% rename from src/spx/commands/transcribe_conversation_command.cs rename to src/clis/spx/commands/transcribe_conversation_command.cs diff --git a/src/spx/commands/translate_command.cs b/src/clis/spx/commands/translate_command.cs similarity index 100% rename from src/spx/commands/translate_command.cs rename to src/clis/spx/commands/translate_command.cs diff --git a/src/spx/commands/webjob_command.cs b/src/clis/spx/commands/webjob_command.cs similarity index 100% rename from src/spx/commands/webjob_command.cs rename to src/clis/spx/commands/webjob_command.cs diff --git a/src/spx/helpers/audio_helpers.cs b/src/clis/spx/helpers/audio_helpers.cs similarity index 100% rename from src/spx/helpers/audio_helpers.cs rename to src/clis/spx/helpers/audio_helpers.cs diff --git a/src/spx/helpers/caption_helper.cs b/src/clis/spx/helpers/caption_helper.cs similarity index 100% rename from src/spx/helpers/caption_helper.cs rename to src/clis/spx/helpers/caption_helper.cs diff --git a/src/spx/helpers/config_helpers.cs b/src/clis/spx/helpers/config_helpers.cs similarity index 100% rename from src/spx/helpers/config_helpers.cs rename to src/clis/spx/helpers/config_helpers.cs diff --git a/src/spx/helpers/connection_helpers.cs b/src/clis/spx/helpers/connection_helpers.cs similarity index 100% rename from src/spx/helpers/connection_helpers.cs rename to src/clis/spx/helpers/connection_helpers.cs diff --git a/src/spx/helpers/display_helpers.cs b/src/clis/spx/helpers/display_helpers.cs similarity index 100% rename from src/spx/helpers/display_helpers.cs rename to src/clis/spx/helpers/display_helpers.cs diff --git a/src/spx/helpers/event_logger_helpers.cs b/src/clis/spx/helpers/event_logger_helpers.cs similarity index 100% rename from src/spx/helpers/event_logger_helpers.cs rename to src/clis/spx/helpers/event_logger_helpers.cs diff --git a/src/spx/helpers/output_helper.cs b/src/clis/spx/helpers/output_helper.cs similarity index 100% rename from src/spx/helpers/output_helper.cs rename to src/clis/spx/helpers/output_helper.cs diff --git a/src/spx/helpers/wer_helpers.cs b/src/clis/spx/helpers/wer_helpers.cs similarity index 100% rename from src/spx/helpers/wer_helpers.cs rename to src/clis/spx/helpers/wer_helpers.cs diff --git a/src/spx/images/SPX_Build_Variables.jpg b/src/clis/spx/images/SPX_Build_Variables.jpg similarity index 100% rename from src/spx/images/SPX_Build_Variables.jpg rename to src/clis/spx/images/SPX_Build_Variables.jpg diff --git a/src/spx/packages.lock.json b/src/clis/spx/packages.lock.json similarity index 100% rename from src/spx/packages.lock.json rename to src/clis/spx/packages.lock.json diff --git a/src/spx/spx-cli.csproj b/src/clis/spx/spx-cli.csproj similarity index 100% rename from src/spx/spx-cli.csproj rename to src/clis/spx/spx-cli.csproj diff --git a/src/spx/spx-cli.sln b/src/clis/spx/spx-cli.sln similarity index 100% rename from src/spx/spx-cli.sln rename to src/clis/spx/spx-cli.sln diff --git a/src/spx/spx.dev.new.todo.md b/src/clis/spx/spx.dev.new.todo.md similarity index 100% rename from src/spx/spx.dev.new.todo.md rename to src/clis/spx/spx.dev.new.todo.md diff --git a/src/spx/tests/audio_and_trans.zip b/src/clis/spx/tests/audio_and_trans.zip similarity index 100% rename from src/spx/tests/audio_and_trans.zip rename to src/clis/spx/tests/audio_and_trans.zip diff --git a/src/spx/tests/check-all.cmd b/src/clis/spx/tests/check-all.cmd similarity index 100% rename from src/spx/tests/check-all.cmd rename to src/clis/spx/tests/check-all.cmd diff --git a/src/spx/tests/check-batch.cmd b/src/clis/spx/tests/check-batch.cmd similarity index 100% rename from src/spx/tests/check-batch.cmd rename to src/clis/spx/tests/check-batch.cmd diff --git a/src/spx/tests/check-cli.cmd b/src/clis/spx/tests/check-cli.cmd similarity index 100% rename from src/spx/tests/check-cli.cmd rename to src/clis/spx/tests/check-cli.cmd diff --git a/src/spx/tests/check-csr.cmd b/src/clis/spx/tests/check-csr.cmd similarity index 100% rename from src/spx/tests/check-csr.cmd rename to src/clis/spx/tests/check-csr.cmd diff --git a/src/spx/tests/check-help.cmd b/src/clis/spx/tests/check-help.cmd similarity index 100% rename from src/spx/tests/check-help.cmd rename to src/clis/spx/tests/check-help.cmd diff --git a/src/spx/tests/check-stress-test.cmd b/src/clis/spx/tests/check-stress-test.cmd similarity index 100% rename from src/spx/tests/check-stress-test.cmd rename to src/clis/spx/tests/check-stress-test.cmd diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.1.set.test b/src/clis/spx/tests/cli/commands/config/config.local.name227266.1.set.test similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.1.set.test rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.1.set.test diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected b/src/clis/spx/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.2.get.test b/src/clis/spx/tests/cli/commands/config/config.local.name227266.2.get.test similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.2.get.test rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.2.get.test diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected b/src/clis/spx/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.3.find.test b/src/clis/spx/tests/cli/commands/config/config.local.name227266.3.find.test similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.3.find.test rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.3.find.test diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected b/src/clis/spx/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.4.add.test b/src/clis/spx/tests/cli/commands/config/config.local.name227266.4.add.test similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.4.add.test rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.4.add.test diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected b/src/clis/spx/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.5.clear.test b/src/clis/spx/tests/cli/commands/config/config.local.name227266.5.clear.test similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.5.clear.test rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.5.clear.test diff --git a/src/spx/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected b/src/clis/spx/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected similarity index 100% rename from src/spx/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected rename to src/clis/spx/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected diff --git a/src/spx/tests/cli/commands/config/config.usage.test b/src/clis/spx/tests/cli/commands/config/config.usage.test similarity index 100% rename from src/spx/tests/cli/commands/config/config.usage.test rename to src/clis/spx/tests/cli/commands/config/config.usage.test diff --git a/src/spx/tests/cli/commands/config/config.usage.test.run.output.expected b/src/clis/spx/tests/cli/commands/config/config.usage.test.run.output.expected similarity index 100% rename from src/spx/tests/cli/commands/config/config.usage.test.run.output.expected rename to src/clis/spx/tests/cli/commands/config/config.usage.test.run.output.expected diff --git a/src/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.download.name.id.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.download.name.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.download.name.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.download.name.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.download.name.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.download.name.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.download.name.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.download.name.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.download.name.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.download.null.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.download.null.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.download.null.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.download.null.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.download.null.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.download.null.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.download.null.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.download.null.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.list.job.run.files.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.list.job.runs.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.list.jobs.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.run.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.run.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.run.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.run.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.run.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.run.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.run.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.run.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.status.request.test b/src/clis/spx/tests/cli/commands/webjob/webjob.status.request.test similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.status.request.test rename to src/clis/spx/tests/cli/commands/webjob/webjob.status.request.test diff --git a/src/spx/tests/cli/commands/webjob/webjob.status.request.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.status.request.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.status.request.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.status.request.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.skip b/src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.skip similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.skip rename to src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step1.test.skip diff --git a/src/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.run.output.expect b/src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.run.output.expect similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.run.output.expect rename to src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.run.output.expect diff --git a/src/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.skip b/src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.skip similarity index 100% rename from src/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.skip rename to src/clis/spx/tests/cli/commands/webjob/webjob.upload.request.step2.test.skip diff --git a/src/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test b/src/clis/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test similarity index 100% rename from src/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test rename to src/clis/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test diff --git a/src/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test.x.command.diagnostics.log.expected b/src/clis/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test.x.command.diagnostics.log.expected similarity index 100% rename from src/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test.x.command.diagnostics.log.expected rename to src/clis/spx/tests/cli/diagnostics/recognize.hello.path.term.dtor.test.x.command.diagnostics.log.expected diff --git a/src/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test b/src/clis/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test similarity index 100% rename from src/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test rename to src/clis/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test diff --git a/src/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test.x.command.diagnostics.log.expect b/src/clis/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test.x.command.diagnostics.log.expect similarity index 100% rename from src/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test.x.command.diagnostics.log.expect rename to src/clis/spx/tests/cli/diagnostics/translate.hello.path.term.dtor.test.x.command.diagnostics.log.expect diff --git a/src/spx/tests/pronunciation.txt b/src/clis/spx/tests/pronunciation.txt similarity index 100% rename from src/spx/tests/pronunciation.txt rename to src/clis/spx/tests/pronunciation.txt diff --git a/src/spx/tests/related_text.txt b/src/clis/spx/tests/related_text.txt similarity index 100% rename from src/spx/tests/related_text.txt rename to src/clis/spx/tests/related_text.txt diff --git a/src/spx/tests/sentences.txt b/src/clis/spx/tests/sentences.txt similarity index 100% rename from src/spx/tests/sentences.txt rename to src/clis/spx/tests/sentences.txt diff --git a/src/spx/tests/stress-text.txt b/src/clis/spx/tests/stress-text.txt similarity index 100% rename from src/spx/tests/stress-text.txt rename to src/clis/spx/tests/stress-text.txt diff --git a/src/spx/tests/test b/src/clis/spx/tests/test similarity index 100% rename from src/spx/tests/test rename to src/clis/spx/tests/test diff --git a/src/spx/tests/test.batch b/src/clis/spx/tests/test.batch similarity index 100% rename from src/spx/tests/test.batch rename to src/clis/spx/tests/test.batch diff --git a/src/spx/tests/test.batch.transcription.1.job b/src/clis/spx/tests/test.batch.transcription.1.job similarity index 100% rename from src/spx/tests/test.batch.transcription.1.job rename to src/clis/spx/tests/test.batch.transcription.1.job diff --git a/src/spx/tests/test.batch.transcription.2.job b/src/clis/spx/tests/test.batch.transcription.2.job similarity index 100% rename from src/spx/tests/test.batch.transcription.2.job rename to src/clis/spx/tests/test.batch.transcription.2.job diff --git a/src/spx/tests/test.batch.transcription.2.job.foreach.0.tsv.file b/src/clis/spx/tests/test.batch.transcription.2.job.foreach.0.tsv.file similarity index 100% rename from src/spx/tests/test.batch.transcription.2.job.foreach.0.tsv.file rename to src/clis/spx/tests/test.batch.transcription.2.job.foreach.0.tsv.file diff --git a/src/spx/tests/test.config.clear.test.1.job b/src/clis/spx/tests/test.config.clear.test.1.job similarity index 100% rename from src/spx/tests/test.config.clear.test.1.job rename to src/clis/spx/tests/test.config.clear.test.1.job diff --git a/src/spx/tests/test.config.clear.test.2.job b/src/clis/spx/tests/test.config.clear.test.2.job similarity index 100% rename from src/spx/tests/test.config.clear.test.2.job rename to src/clis/spx/tests/test.config.clear.test.2.job diff --git a/src/spx/tests/test.config.clear.test.3.job b/src/clis/spx/tests/test.config.clear.test.3.job similarity index 100% rename from src/spx/tests/test.config.clear.test.3.job rename to src/clis/spx/tests/test.config.clear.test.3.job diff --git a/src/spx/tests/test.config.clear.test.4.job b/src/clis/spx/tests/test.config.clear.test.4.job similarity index 100% rename from src/spx/tests/test.config.clear.test.4.job rename to src/clis/spx/tests/test.config.clear.test.4.job diff --git a/src/spx/tests/test.config.find.1.job b/src/clis/spx/tests/test.config.find.1.job similarity index 100% rename from src/spx/tests/test.config.find.1.job rename to src/clis/spx/tests/test.config.find.1.job diff --git a/src/spx/tests/test.config.find.2.job b/src/clis/spx/tests/test.config.find.2.job similarity index 100% rename from src/spx/tests/test.config.find.2.job rename to src/clis/spx/tests/test.config.find.2.job diff --git a/src/spx/tests/test.config.find.3.job b/src/clis/spx/tests/test.config.find.3.job similarity index 100% rename from src/spx/tests/test.config.find.3.job rename to src/clis/spx/tests/test.config.find.3.job diff --git a/src/spx/tests/test.config.find.4.job b/src/clis/spx/tests/test.config.find.4.job similarity index 100% rename from src/spx/tests/test.config.find.4.job rename to src/clis/spx/tests/test.config.find.4.job diff --git a/src/spx/tests/test.config.find.5.job b/src/clis/spx/tests/test.config.find.5.job similarity index 100% rename from src/spx/tests/test.config.find.5.job rename to src/clis/spx/tests/test.config.find.5.job diff --git a/src/spx/tests/test.config.find.6.job b/src/clis/spx/tests/test.config.find.6.job similarity index 100% rename from src/spx/tests/test.config.find.6.job rename to src/clis/spx/tests/test.config.find.6.job diff --git a/src/spx/tests/test.config.find.7.job b/src/clis/spx/tests/test.config.find.7.job similarity index 100% rename from src/spx/tests/test.config.find.7.job rename to src/clis/spx/tests/test.config.find.7.job diff --git a/src/spx/tests/test.foreach.stress.tsv.file b/src/clis/spx/tests/test.foreach.stress.tsv.file similarity index 100% rename from src/spx/tests/test.foreach.stress.tsv.file rename to src/clis/spx/tests/test.foreach.stress.tsv.file diff --git a/src/spx/tests/test.intent.1.job b/src/clis/spx/tests/test.intent.1.job similarity index 100% rename from src/spx/tests/test.intent.1.job rename to src/clis/spx/tests/test.intent.1.job diff --git a/src/spx/tests/test.intent.2.job b/src/clis/spx/tests/test.intent.2.job similarity index 100% rename from src/spx/tests/test.intent.2.job rename to src/clis/spx/tests/test.intent.2.job diff --git a/src/spx/tests/test.intent.3.job b/src/clis/spx/tests/test.intent.3.job similarity index 100% rename from src/spx/tests/test.intent.3.job rename to src/clis/spx/tests/test.intent.3.job diff --git a/src/spx/tests/test.intent.4.job b/src/clis/spx/tests/test.intent.4.job similarity index 100% rename from src/spx/tests/test.intent.4.job rename to src/clis/spx/tests/test.intent.4.job diff --git a/src/spx/tests/test.intent.setup.ChangeReco b/src/clis/spx/tests/test.intent.setup.ChangeReco similarity index 100% rename from src/spx/tests/test.intent.setup.ChangeReco rename to src/clis/spx/tests/test.intent.setup.ChangeReco diff --git a/src/spx/tests/test.stress b/src/clis/spx/tests/test.stress similarity index 100% rename from src/spx/tests/test.stress rename to src/clis/spx/tests/test.stress diff --git a/src/spx/tests/test.stress.recognize.1.job b/src/clis/spx/tests/test.stress.recognize.1.job similarity index 100% rename from src/spx/tests/test.stress.recognize.1.job rename to src/clis/spx/tests/test.stress.recognize.1.job diff --git a/src/spx/tests/test.stress.synthesize.1.job b/src/clis/spx/tests/test.stress.synthesize.1.job similarity index 100% rename from src/spx/tests/test.stress.synthesize.1.job rename to src/clis/spx/tests/test.stress.synthesize.1.job diff --git a/src/spx/tests/test.stress.synthesize.1.job.foreach.0.tsv.file b/src/clis/spx/tests/test.stress.synthesize.1.job.foreach.0.tsv.file similarity index 100% rename from src/spx/tests/test.stress.synthesize.1.job.foreach.0.tsv.file rename to src/clis/spx/tests/test.stress.synthesize.1.job.foreach.0.tsv.file diff --git a/src/spx/tests/test.stress.translate.1.job b/src/clis/spx/tests/test.stress.translate.1.job similarity index 100% rename from src/spx/tests/test.stress.translate.1.job rename to src/clis/spx/tests/test.stress.translate.1.job diff --git a/src/spx/tests/test.tsv b/src/clis/spx/tests/test.tsv similarity index 100% rename from src/spx/tests/test.tsv rename to src/clis/spx/tests/test.tsv diff --git a/src/spx/tests/this.is.a.test.of.the.emergency.broadcast.system.txt b/src/clis/spx/tests/this.is.a.test.of.the.emergency.broadcast.system.txt similarity index 100% rename from src/spx/tests/this.is.a.test.of.the.emergency.broadcast.system.txt rename to src/clis/spx/tests/this.is.a.test.of.the.emergency.broadcast.system.txt diff --git a/src/spx/tests/this.is.a.test.txt b/src/clis/spx/tests/this.is.a.test.txt similarity index 100% rename from src/spx/tests/this.is.a.test.txt rename to src/clis/spx/tests/this.is.a.test.txt diff --git a/src/spx/todo.md b/src/clis/spx/todo.md similarity index 100% rename from src/spx/todo.md rename to src/clis/spx/todo.md diff --git a/src/vz/.x/config/connection b/src/clis/vz/.x/config/connection similarity index 100% rename from src/vz/.x/config/connection rename to src/clis/vz/.x/config/connection diff --git a/src/vz/.x/config/connection.from.endpoint b/src/clis/vz/.x/config/connection.from.endpoint similarity index 100% rename from src/vz/.x/config/connection.from.endpoint rename to src/clis/vz/.x/config/connection.from.endpoint diff --git a/src/vz/.x/config/connection.from.host b/src/clis/vz/.x/config/connection.from.host similarity index 100% rename from src/vz/.x/config/connection.from.host rename to src/clis/vz/.x/config/connection.from.host diff --git a/src/vz/.x/config/connection.from.region b/src/clis/vz/.x/config/connection.from.region similarity index 100% rename from src/vz/.x/config/connection.from.region rename to src/clis/vz/.x/config/connection.from.region diff --git a/src/vz/.x/config/default.log b/src/clis/vz/.x/config/default.log similarity index 100% rename from src/vz/.x/config/default.log rename to src/clis/vz/.x/config/default.log diff --git a/src/vz/.x/config/default.path b/src/clis/vz/.x/config/default.path similarity index 100% rename from src/vz/.x/config/default.path rename to src/clis/vz/.x/config/default.path diff --git a/src/vz/.x/config/defaults b/src/clis/vz/.x/config/defaults similarity index 100% rename from src/vz/.x/config/defaults rename to src/clis/vz/.x/config/defaults diff --git a/src/vz/.x/config/endpoint b/src/clis/vz/.x/config/endpoint similarity index 100% rename from src/vz/.x/config/endpoint rename to src/clis/vz/.x/config/endpoint diff --git a/src/vz/.x/config/fiddler b/src/clis/vz/.x/config/fiddler similarity index 100% rename from src/vz/.x/config/fiddler rename to src/clis/vz/.x/config/fiddler diff --git a/src/vz/.x/config/host b/src/clis/vz/.x/config/host similarity index 100% rename from src/vz/.x/config/host rename to src/clis/vz/.x/config/host diff --git a/src/vz/.x/config/image.default.config b/src/clis/vz/.x/config/image.default.config similarity index 100% rename from src/vz/.x/config/image.default.config rename to src/clis/vz/.x/config/image.default.config diff --git a/src/vz/.x/config/image.default.connection b/src/clis/vz/.x/config/image.default.connection similarity index 100% rename from src/vz/.x/config/image.default.connection rename to src/clis/vz/.x/config/image.default.connection diff --git a/src/vz/.x/config/image.default.output b/src/clis/vz/.x/config/image.default.output similarity index 100% rename from src/vz/.x/config/image.default.output rename to src/clis/vz/.x/config/image.default.output diff --git a/src/vz/.x/config/image.output.all.standard b/src/clis/vz/.x/config/image.output.all.standard similarity index 100% rename from src/vz/.x/config/image.output.all.standard rename to src/clis/vz/.x/config/image.output.all.standard diff --git a/src/vz/.x/config/image.region b/src/clis/vz/.x/config/image.region similarity index 100% rename from src/vz/.x/config/image.region rename to src/clis/vz/.x/config/image.region diff --git a/src/vz/.x/config/init.default.config b/src/clis/vz/.x/config/init.default.config similarity index 100% rename from src/vz/.x/config/init.default.config rename to src/clis/vz/.x/config/init.default.config diff --git a/src/vz/.x/config/init.default.output b/src/clis/vz/.x/config/init.default.output similarity index 100% rename from src/vz/.x/config/init.default.output rename to src/clis/vz/.x/config/init.default.output diff --git a/src/vz/.x/config/input.path b/src/clis/vz/.x/config/input.path similarity index 100% rename from src/vz/.x/config/input.path rename to src/clis/vz/.x/config/input.path diff --git a/src/vz/.x/config/key b/src/clis/vz/.x/config/key similarity index 100% rename from src/vz/.x/config/key rename to src/clis/vz/.x/config/key diff --git a/src/vz/.x/config/log.pid b/src/clis/vz/.x/config/log.pid similarity index 100% rename from src/vz/.x/config/log.pid rename to src/clis/vz/.x/config/log.pid diff --git a/src/vz/.x/config/log.time b/src/clis/vz/.x/config/log.time similarity index 100% rename from src/vz/.x/config/log.time rename to src/clis/vz/.x/config/log.time diff --git a/src/vz/.x/config/log.time.pid b/src/clis/vz/.x/config/log.time.pid similarity index 100% rename from src/vz/.x/config/log.time.pid rename to src/clis/vz/.x/config/log.time.pid diff --git a/src/vz/.x/config/my.defaults b/src/clis/vz/.x/config/my.defaults similarity index 100% rename from src/vz/.x/config/my.defaults rename to src/clis/vz/.x/config/my.defaults diff --git a/src/vz/.x/config/none b/src/clis/vz/.x/config/none similarity index 100% rename from src/vz/.x/config/none rename to src/clis/vz/.x/config/none diff --git a/src/vz/.x/config/output b/src/clis/vz/.x/config/output similarity index 100% rename from src/vz/.x/config/output rename to src/clis/vz/.x/config/output diff --git a/src/vz/.x/config/output.all.standard b/src/clis/vz/.x/config/output.all.standard similarity index 100% rename from src/vz/.x/config/output.all.standard rename to src/clis/vz/.x/config/output.all.standard diff --git a/src/vz/.x/config/person.default.config b/src/clis/vz/.x/config/person.default.config similarity index 100% rename from src/vz/.x/config/person.default.config rename to src/clis/vz/.x/config/person.default.config diff --git a/src/vz/.x/config/person.default.connection b/src/clis/vz/.x/config/person.default.connection similarity index 100% rename from src/vz/.x/config/person.default.connection rename to src/clis/vz/.x/config/person.default.connection diff --git a/src/vz/.x/config/person.default.output b/src/clis/vz/.x/config/person.default.output similarity index 100% rename from src/vz/.x/config/person.default.output rename to src/clis/vz/.x/config/person.default.output diff --git a/src/vz/.x/config/person.output.all.standard b/src/clis/vz/.x/config/person.output.all.standard similarity index 100% rename from src/vz/.x/config/person.output.all.standard rename to src/clis/vz/.x/config/person.output.all.standard diff --git a/src/vz/.x/config/region b/src/clis/vz/.x/config/region similarity index 100% rename from src/vz/.x/config/region rename to src/clis/vz/.x/config/region diff --git a/src/vz/.x/config/run.default.config b/src/clis/vz/.x/config/run.default.config similarity index 100% rename from src/vz/.x/config/run.default.config rename to src/clis/vz/.x/config/run.default.config diff --git a/src/vz/.x/config/vz.defaults b/src/clis/vz/.x/config/vz.defaults similarity index 100% rename from src/vz/.x/config/vz.defaults rename to src/clis/vz/.x/config/vz.defaults diff --git a/src/vz/.x/help/config b/src/clis/vz/.x/help/config similarity index 100% rename from src/vz/.x/help/config rename to src/clis/vz/.x/help/config diff --git a/src/vz/.x/help/config.add b/src/clis/vz/.x/help/config.add similarity index 100% rename from src/vz/.x/help/config.add rename to src/clis/vz/.x/help/config.add diff --git a/src/vz/.x/help/config.advanced b/src/clis/vz/.x/help/config.advanced similarity index 100% rename from src/vz/.x/help/config.advanced rename to src/clis/vz/.x/help/config.advanced diff --git a/src/vz/.x/help/config.clear b/src/clis/vz/.x/help/config.clear similarity index 100% rename from src/vz/.x/help/config.clear rename to src/clis/vz/.x/help/config.clear diff --git a/src/vz/.x/help/config.command b/src/clis/vz/.x/help/config.command similarity index 100% rename from src/vz/.x/help/config.command rename to src/clis/vz/.x/help/config.command diff --git a/src/vz/.x/help/config.examples b/src/clis/vz/.x/help/config.examples similarity index 100% rename from src/vz/.x/help/config.examples rename to src/clis/vz/.x/help/config.examples diff --git a/src/vz/.x/help/config.find b/src/clis/vz/.x/help/config.find similarity index 100% rename from src/vz/.x/help/config.find rename to src/clis/vz/.x/help/config.find diff --git a/src/vz/.x/help/config.hive b/src/clis/vz/.x/help/config.hive similarity index 100% rename from src/vz/.x/help/config.hive rename to src/clis/vz/.x/help/config.hive diff --git a/src/vz/.x/help/config.region b/src/clis/vz/.x/help/config.region similarity index 100% rename from src/vz/.x/help/config.region rename to src/clis/vz/.x/help/config.region diff --git a/src/vz/.x/help/config.scope b/src/clis/vz/.x/help/config.scope similarity index 100% rename from src/vz/.x/help/config.scope rename to src/clis/vz/.x/help/config.scope diff --git a/src/vz/.x/help/config.set b/src/clis/vz/.x/help/config.set similarity index 100% rename from src/vz/.x/help/config.set rename to src/clis/vz/.x/help/config.set diff --git a/src/vz/.x/help/documentation b/src/clis/vz/.x/help/documentation similarity index 100% rename from src/vz/.x/help/documentation rename to src/clis/vz/.x/help/documentation diff --git a/src/vz/.x/help/endpoint b/src/clis/vz/.x/help/endpoint similarity index 100% rename from src/vz/.x/help/endpoint rename to src/clis/vz/.x/help/endpoint diff --git a/src/vz/.x/help/examples b/src/clis/vz/.x/help/examples similarity index 100% rename from src/vz/.x/help/examples rename to src/clis/vz/.x/help/examples diff --git a/src/vz/.x/help/face b/src/clis/vz/.x/help/face similarity index 100% rename from src/vz/.x/help/face rename to src/clis/vz/.x/help/face diff --git a/src/vz/.x/help/face.identify b/src/clis/vz/.x/help/face.identify similarity index 100% rename from src/vz/.x/help/face.identify rename to src/clis/vz/.x/help/face.identify diff --git a/src/vz/.x/help/face.identify.examples b/src/clis/vz/.x/help/face.identify.examples similarity index 100% rename from src/vz/.x/help/face.identify.examples rename to src/clis/vz/.x/help/face.identify.examples diff --git a/src/vz/.x/help/face.verify b/src/clis/vz/.x/help/face.verify similarity index 100% rename from src/vz/.x/help/face.verify rename to src/clis/vz/.x/help/face.verify diff --git a/src/vz/.x/help/face.verify.examples b/src/clis/vz/.x/help/face.verify.examples similarity index 100% rename from src/vz/.x/help/face.verify.examples rename to src/clis/vz/.x/help/face.verify.examples diff --git a/src/vz/.x/help/help b/src/clis/vz/.x/help/help similarity index 100% rename from src/vz/.x/help/help rename to src/clis/vz/.x/help/help diff --git a/src/vz/.x/help/hive b/src/clis/vz/.x/help/hive similarity index 100% rename from src/vz/.x/help/hive rename to src/clis/vz/.x/help/hive diff --git a/src/vz/.x/help/image b/src/clis/vz/.x/help/image similarity index 100% rename from src/vz/.x/help/image rename to src/clis/vz/.x/help/image diff --git a/src/vz/.x/help/image.analyze b/src/clis/vz/.x/help/image.analyze similarity index 100% rename from src/vz/.x/help/image.analyze rename to src/clis/vz/.x/help/image.analyze diff --git a/src/vz/.x/help/image.analyze.examples b/src/clis/vz/.x/help/image.analyze.examples similarity index 100% rename from src/vz/.x/help/image.analyze.examples rename to src/clis/vz/.x/help/image.analyze.examples diff --git a/src/vz/.x/help/image.read b/src/clis/vz/.x/help/image.read similarity index 100% rename from src/vz/.x/help/image.read rename to src/clis/vz/.x/help/image.read diff --git a/src/vz/.x/help/image.read.examples b/src/clis/vz/.x/help/image.read.examples similarity index 100% rename from src/vz/.x/help/image.read.examples rename to src/clis/vz/.x/help/image.read.examples diff --git a/src/vz/.x/help/include.create.resource b/src/clis/vz/.x/help/include.create.resource similarity index 100% rename from src/vz/.x/help/include.create.resource rename to src/clis/vz/.x/help/include.create.resource diff --git a/src/vz/.x/help/include.create.resource.extra b/src/clis/vz/.x/help/include.create.resource.extra similarity index 100% rename from src/vz/.x/help/include.create.resource.extra rename to src/clis/vz/.x/help/include.create.resource.extra diff --git a/src/vz/.x/help/include.the.azure.vision.service b/src/clis/vz/.x/help/include.the.azure.vision.service similarity index 100% rename from src/vz/.x/help/include.the.azure.vision.service rename to src/clis/vz/.x/help/include.the.azure.vision.service diff --git a/src/vz/.x/help/include.the.azure.vision.service.long b/src/clis/vz/.x/help/include.the.azure.vision.service.long similarity index 100% rename from src/vz/.x/help/include.the.azure.vision.service.long rename to src/clis/vz/.x/help/include.the.azure.vision.service.long diff --git a/src/vz/.x/help/include.the.config.command b/src/clis/vz/.x/help/include.the.config.command similarity index 100% rename from src/vz/.x/help/include.the.config.command rename to src/clis/vz/.x/help/include.the.config.command diff --git a/src/vz/.x/help/include.the.face.command.long b/src/clis/vz/.x/help/include.the.face.command.long similarity index 100% rename from src/vz/.x/help/include.the.face.command.long rename to src/clis/vz/.x/help/include.the.face.command.long diff --git a/src/vz/.x/help/include.the.face.identify.command b/src/clis/vz/.x/help/include.the.face.identify.command similarity index 100% rename from src/vz/.x/help/include.the.face.identify.command rename to src/clis/vz/.x/help/include.the.face.identify.command diff --git a/src/vz/.x/help/include.the.face.identify.command.long b/src/clis/vz/.x/help/include.the.face.identify.command.long similarity index 100% rename from src/vz/.x/help/include.the.face.identify.command.long rename to src/clis/vz/.x/help/include.the.face.identify.command.long diff --git a/src/vz/.x/help/include.the.face.verify.command b/src/clis/vz/.x/help/include.the.face.verify.command similarity index 100% rename from src/vz/.x/help/include.the.face.verify.command rename to src/clis/vz/.x/help/include.the.face.verify.command diff --git a/src/vz/.x/help/include.the.face.verify.command.long b/src/clis/vz/.x/help/include.the.face.verify.command.long similarity index 100% rename from src/vz/.x/help/include.the.face.verify.command.long rename to src/clis/vz/.x/help/include.the.face.verify.command.long diff --git a/src/vz/.x/help/include.the.image.analyze.command b/src/clis/vz/.x/help/include.the.image.analyze.command similarity index 100% rename from src/vz/.x/help/include.the.image.analyze.command rename to src/clis/vz/.x/help/include.the.image.analyze.command diff --git a/src/vz/.x/help/include.the.image.analyze.command.long b/src/clis/vz/.x/help/include.the.image.analyze.command.long similarity index 100% rename from src/vz/.x/help/include.the.image.analyze.command.long rename to src/clis/vz/.x/help/include.the.image.analyze.command.long diff --git a/src/vz/.x/help/include.the.image.command.long b/src/clis/vz/.x/help/include.the.image.command.long similarity index 100% rename from src/vz/.x/help/include.the.image.command.long rename to src/clis/vz/.x/help/include.the.image.command.long diff --git a/src/vz/.x/help/include.the.image.read.command b/src/clis/vz/.x/help/include.the.image.read.command similarity index 100% rename from src/vz/.x/help/include.the.image.read.command rename to src/clis/vz/.x/help/include.the.image.read.command diff --git a/src/vz/.x/help/include.the.image.read.command.long b/src/clis/vz/.x/help/include.the.image.read.command.long similarity index 100% rename from src/vz/.x/help/include.the.image.read.command.long rename to src/clis/vz/.x/help/include.the.image.read.command.long diff --git a/src/vz/.x/help/include.the.init.command.long b/src/clis/vz/.x/help/include.the.init.command.long similarity index 100% rename from src/vz/.x/help/include.the.init.command.long rename to src/clis/vz/.x/help/include.the.init.command.long diff --git a/src/vz/.x/help/include.the.key.option b/src/clis/vz/.x/help/include.the.key.option similarity index 100% rename from src/vz/.x/help/include.the.key.option rename to src/clis/vz/.x/help/include.the.key.option diff --git a/src/vz/.x/help/include.the.key.option.where b/src/clis/vz/.x/help/include.the.key.option.where similarity index 100% rename from src/vz/.x/help/include.the.key.option.where rename to src/clis/vz/.x/help/include.the.key.option.where diff --git a/src/vz/.x/help/include.the.log.option b/src/clis/vz/.x/help/include.the.log.option similarity index 100% rename from src/vz/.x/help/include.the.log.option rename to src/clis/vz/.x/help/include.the.log.option diff --git a/src/vz/.x/help/include.the.person.create.command b/src/clis/vz/.x/help/include.the.person.create.command similarity index 100% rename from src/vz/.x/help/include.the.person.create.command rename to src/clis/vz/.x/help/include.the.person.create.command diff --git a/src/vz/.x/help/include.the.person.delete.command b/src/clis/vz/.x/help/include.the.person.delete.command similarity index 100% rename from src/vz/.x/help/include.the.person.delete.command rename to src/clis/vz/.x/help/include.the.person.delete.command diff --git a/src/vz/.x/help/include.the.person.face.add.command b/src/clis/vz/.x/help/include.the.person.face.add.command similarity index 100% rename from src/vz/.x/help/include.the.person.face.add.command rename to src/clis/vz/.x/help/include.the.person.face.add.command diff --git a/src/vz/.x/help/include.the.person.face.delete.command b/src/clis/vz/.x/help/include.the.person.face.delete.command similarity index 100% rename from src/vz/.x/help/include.the.person.face.delete.command rename to src/clis/vz/.x/help/include.the.person.face.delete.command diff --git a/src/vz/.x/help/include.the.person.face.list.command b/src/clis/vz/.x/help/include.the.person.face.list.command similarity index 100% rename from src/vz/.x/help/include.the.person.face.list.command rename to src/clis/vz/.x/help/include.the.person.face.list.command diff --git a/src/vz/.x/help/include.the.person.face.update.command b/src/clis/vz/.x/help/include.the.person.face.update.command similarity index 100% rename from src/vz/.x/help/include.the.person.face.update.command rename to src/clis/vz/.x/help/include.the.person.face.update.command diff --git a/src/vz/.x/help/include.the.person.group.create.command b/src/clis/vz/.x/help/include.the.person.group.create.command similarity index 100% rename from src/vz/.x/help/include.the.person.group.create.command rename to src/clis/vz/.x/help/include.the.person.group.create.command diff --git a/src/vz/.x/help/include.the.person.group.delete.command b/src/clis/vz/.x/help/include.the.person.group.delete.command similarity index 100% rename from src/vz/.x/help/include.the.person.group.delete.command rename to src/clis/vz/.x/help/include.the.person.group.delete.command diff --git a/src/vz/.x/help/include.the.person.group.list.command b/src/clis/vz/.x/help/include.the.person.group.list.command similarity index 100% rename from src/vz/.x/help/include.the.person.group.list.command rename to src/clis/vz/.x/help/include.the.person.group.list.command diff --git a/src/vz/.x/help/include.the.person.group.status.command b/src/clis/vz/.x/help/include.the.person.group.status.command similarity index 100% rename from src/vz/.x/help/include.the.person.group.status.command rename to src/clis/vz/.x/help/include.the.person.group.status.command diff --git a/src/vz/.x/help/include.the.person.group.train.command b/src/clis/vz/.x/help/include.the.person.group.train.command similarity index 100% rename from src/vz/.x/help/include.the.person.group.train.command rename to src/clis/vz/.x/help/include.the.person.group.train.command diff --git a/src/vz/.x/help/include.the.person.group.update.command b/src/clis/vz/.x/help/include.the.person.group.update.command similarity index 100% rename from src/vz/.x/help/include.the.person.group.update.command rename to src/clis/vz/.x/help/include.the.person.group.update.command diff --git a/src/vz/.x/help/include.the.person.list.command b/src/clis/vz/.x/help/include.the.person.list.command similarity index 100% rename from src/vz/.x/help/include.the.person.list.command rename to src/clis/vz/.x/help/include.the.person.list.command diff --git a/src/vz/.x/help/include.the.person.update.command b/src/clis/vz/.x/help/include.the.person.update.command similarity index 100% rename from src/vz/.x/help/include.the.person.update.command rename to src/clis/vz/.x/help/include.the.person.update.command diff --git a/src/vz/.x/help/include.the.region.option b/src/clis/vz/.x/help/include.the.region.option similarity index 100% rename from src/vz/.x/help/include.the.region.option rename to src/clis/vz/.x/help/include.the.region.option diff --git a/src/vz/.x/help/include.the.region.option.where b/src/clis/vz/.x/help/include.the.region.option.where similarity index 100% rename from src/vz/.x/help/include.the.region.option.where rename to src/clis/vz/.x/help/include.the.region.option.where diff --git a/src/vz/.x/help/include.the.run.command b/src/clis/vz/.x/help/include.the.run.command similarity index 100% rename from src/vz/.x/help/include.the.run.command rename to src/clis/vz/.x/help/include.the.run.command diff --git a/src/vz/.x/help/include.the.save.option b/src/clis/vz/.x/help/include.the.save.option similarity index 100% rename from src/vz/.x/help/include.the.save.option rename to src/clis/vz/.x/help/include.the.save.option diff --git a/src/vz/.x/help/include.the.token.option b/src/clis/vz/.x/help/include.the.token.option similarity index 100% rename from src/vz/.x/help/include.the.token.option rename to src/clis/vz/.x/help/include.the.token.option diff --git a/src/vz/.x/help/include.the.token.option.where b/src/clis/vz/.x/help/include.the.token.option.where similarity index 100% rename from src/vz/.x/help/include.the.token.option.where rename to src/clis/vz/.x/help/include.the.token.option.where diff --git a/src/vz/.x/help/include.the.zip.option b/src/clis/vz/.x/help/include.the.zip.option similarity index 100% rename from src/vz/.x/help/include.the.zip.option rename to src/clis/vz/.x/help/include.the.zip.option diff --git a/src/vz/.x/help/include.vz.ascii.logo b/src/clis/vz/.x/help/include.vz.ascii.logo similarity index 100% rename from src/vz/.x/help/include.vz.ascii.logo rename to src/clis/vz/.x/help/include.vz.ascii.logo diff --git a/src/vz/.x/help/include.vz.init.ascii.logo b/src/clis/vz/.x/help/include.vz.init.ascii.logo similarity index 100% rename from src/vz/.x/help/include.vz.init.ascii.logo rename to src/clis/vz/.x/help/include.vz.init.ascii.logo diff --git a/src/vz/.x/help/init b/src/clis/vz/.x/help/init similarity index 100% rename from src/vz/.x/help/init rename to src/clis/vz/.x/help/init diff --git a/src/vz/.x/help/init.advanced b/src/clis/vz/.x/help/init.advanced similarity index 100% rename from src/vz/.x/help/init.advanced rename to src/clis/vz/.x/help/init.advanced diff --git a/src/vz/.x/help/init.examples b/src/clis/vz/.x/help/init.examples similarity index 100% rename from src/vz/.x/help/init.examples rename to src/clis/vz/.x/help/init.examples diff --git a/src/vz/.x/help/key b/src/clis/vz/.x/help/key similarity index 100% rename from src/vz/.x/help/key rename to src/clis/vz/.x/help/key diff --git a/src/vz/.x/help/key.overview b/src/clis/vz/.x/help/key.overview similarity index 100% rename from src/vz/.x/help/key.overview rename to src/clis/vz/.x/help/key.overview diff --git a/src/vz/.x/help/person b/src/clis/vz/.x/help/person similarity index 100% rename from src/vz/.x/help/person rename to src/clis/vz/.x/help/person diff --git a/src/vz/.x/help/person.create b/src/clis/vz/.x/help/person.create similarity index 100% rename from src/vz/.x/help/person.create rename to src/clis/vz/.x/help/person.create diff --git a/src/vz/.x/help/person.create.advanced b/src/clis/vz/.x/help/person.create.advanced similarity index 100% rename from src/vz/.x/help/person.create.advanced rename to src/clis/vz/.x/help/person.create.advanced diff --git a/src/vz/.x/help/person.delete b/src/clis/vz/.x/help/person.delete similarity index 100% rename from src/vz/.x/help/person.delete rename to src/clis/vz/.x/help/person.delete diff --git a/src/vz/.x/help/person.delete.advanced b/src/clis/vz/.x/help/person.delete.advanced similarity index 100% rename from src/vz/.x/help/person.delete.advanced rename to src/clis/vz/.x/help/person.delete.advanced diff --git a/src/vz/.x/help/person.examples b/src/clis/vz/.x/help/person.examples similarity index 100% rename from src/vz/.x/help/person.examples rename to src/clis/vz/.x/help/person.examples diff --git a/src/vz/.x/help/person.face b/src/clis/vz/.x/help/person.face similarity index 100% rename from src/vz/.x/help/person.face rename to src/clis/vz/.x/help/person.face diff --git a/src/vz/.x/help/person.face.add b/src/clis/vz/.x/help/person.face.add similarity index 100% rename from src/vz/.x/help/person.face.add rename to src/clis/vz/.x/help/person.face.add diff --git a/src/vz/.x/help/person.face.add.advanced b/src/clis/vz/.x/help/person.face.add.advanced similarity index 100% rename from src/vz/.x/help/person.face.add.advanced rename to src/clis/vz/.x/help/person.face.add.advanced diff --git a/src/vz/.x/help/person.face.delete b/src/clis/vz/.x/help/person.face.delete similarity index 100% rename from src/vz/.x/help/person.face.delete rename to src/clis/vz/.x/help/person.face.delete diff --git a/src/vz/.x/help/person.face.delete.advanced b/src/clis/vz/.x/help/person.face.delete.advanced similarity index 100% rename from src/vz/.x/help/person.face.delete.advanced rename to src/clis/vz/.x/help/person.face.delete.advanced diff --git a/src/vz/.x/help/person.face.list b/src/clis/vz/.x/help/person.face.list similarity index 100% rename from src/vz/.x/help/person.face.list rename to src/clis/vz/.x/help/person.face.list diff --git a/src/vz/.x/help/person.face.list.advanced b/src/clis/vz/.x/help/person.face.list.advanced similarity index 100% rename from src/vz/.x/help/person.face.list.advanced rename to src/clis/vz/.x/help/person.face.list.advanced diff --git a/src/vz/.x/help/person.face.update b/src/clis/vz/.x/help/person.face.update similarity index 100% rename from src/vz/.x/help/person.face.update rename to src/clis/vz/.x/help/person.face.update diff --git a/src/vz/.x/help/person.face.update.advanced b/src/clis/vz/.x/help/person.face.update.advanced similarity index 100% rename from src/vz/.x/help/person.face.update.advanced rename to src/clis/vz/.x/help/person.face.update.advanced diff --git a/src/vz/.x/help/person.group b/src/clis/vz/.x/help/person.group similarity index 100% rename from src/vz/.x/help/person.group rename to src/clis/vz/.x/help/person.group diff --git a/src/vz/.x/help/person.group.create b/src/clis/vz/.x/help/person.group.create similarity index 100% rename from src/vz/.x/help/person.group.create rename to src/clis/vz/.x/help/person.group.create diff --git a/src/vz/.x/help/person.group.create.advanced b/src/clis/vz/.x/help/person.group.create.advanced similarity index 100% rename from src/vz/.x/help/person.group.create.advanced rename to src/clis/vz/.x/help/person.group.create.advanced diff --git a/src/vz/.x/help/person.group.delete b/src/clis/vz/.x/help/person.group.delete similarity index 100% rename from src/vz/.x/help/person.group.delete rename to src/clis/vz/.x/help/person.group.delete diff --git a/src/vz/.x/help/person.group.delete.advanced b/src/clis/vz/.x/help/person.group.delete.advanced similarity index 100% rename from src/vz/.x/help/person.group.delete.advanced rename to src/clis/vz/.x/help/person.group.delete.advanced diff --git a/src/vz/.x/help/person.group.list b/src/clis/vz/.x/help/person.group.list similarity index 100% rename from src/vz/.x/help/person.group.list rename to src/clis/vz/.x/help/person.group.list diff --git a/src/vz/.x/help/person.group.list.advanced b/src/clis/vz/.x/help/person.group.list.advanced similarity index 100% rename from src/vz/.x/help/person.group.list.advanced rename to src/clis/vz/.x/help/person.group.list.advanced diff --git a/src/vz/.x/help/person.group.status b/src/clis/vz/.x/help/person.group.status similarity index 100% rename from src/vz/.x/help/person.group.status rename to src/clis/vz/.x/help/person.group.status diff --git a/src/vz/.x/help/person.group.status.advanced b/src/clis/vz/.x/help/person.group.status.advanced similarity index 100% rename from src/vz/.x/help/person.group.status.advanced rename to src/clis/vz/.x/help/person.group.status.advanced diff --git a/src/vz/.x/help/person.group.train b/src/clis/vz/.x/help/person.group.train similarity index 100% rename from src/vz/.x/help/person.group.train rename to src/clis/vz/.x/help/person.group.train diff --git a/src/vz/.x/help/person.group.train.advanced b/src/clis/vz/.x/help/person.group.train.advanced similarity index 100% rename from src/vz/.x/help/person.group.train.advanced rename to src/clis/vz/.x/help/person.group.train.advanced diff --git a/src/vz/.x/help/person.group.update b/src/clis/vz/.x/help/person.group.update similarity index 100% rename from src/vz/.x/help/person.group.update rename to src/clis/vz/.x/help/person.group.update diff --git a/src/vz/.x/help/person.group.update.advanced b/src/clis/vz/.x/help/person.group.update.advanced similarity index 100% rename from src/vz/.x/help/person.group.update.advanced rename to src/clis/vz/.x/help/person.group.update.advanced diff --git a/src/vz/.x/help/person.list b/src/clis/vz/.x/help/person.list similarity index 100% rename from src/vz/.x/help/person.list rename to src/clis/vz/.x/help/person.list diff --git a/src/vz/.x/help/person.list.advanced b/src/clis/vz/.x/help/person.list.advanced similarity index 100% rename from src/vz/.x/help/person.list.advanced rename to src/clis/vz/.x/help/person.list.advanced diff --git a/src/vz/.x/help/person.update b/src/clis/vz/.x/help/person.update similarity index 100% rename from src/vz/.x/help/person.update rename to src/clis/vz/.x/help/person.update diff --git a/src/vz/.x/help/person.update.advanced b/src/clis/vz/.x/help/person.update.advanced similarity index 100% rename from src/vz/.x/help/person.update.advanced rename to src/clis/vz/.x/help/person.update.advanced diff --git a/src/vz/.x/help/region b/src/clis/vz/.x/help/region similarity index 100% rename from src/vz/.x/help/region rename to src/clis/vz/.x/help/region diff --git a/src/vz/.x/help/region.overview b/src/clis/vz/.x/help/region.overview similarity index 100% rename from src/vz/.x/help/region.overview rename to src/clis/vz/.x/help/region.overview diff --git a/src/vz/.x/help/run b/src/clis/vz/.x/help/run similarity index 100% rename from src/vz/.x/help/run rename to src/clis/vz/.x/help/run diff --git a/src/vz/.x/help/run.advanced b/src/clis/vz/.x/help/run.advanced similarity index 100% rename from src/vz/.x/help/run.advanced rename to src/clis/vz/.x/help/run.advanced diff --git a/src/vz/.x/help/run.examples b/src/clis/vz/.x/help/run.examples similarity index 100% rename from src/vz/.x/help/run.examples rename to src/clis/vz/.x/help/run.examples diff --git a/src/vz/.x/help/setup b/src/clis/vz/.x/help/setup similarity index 100% rename from src/vz/.x/help/setup rename to src/clis/vz/.x/help/setup diff --git a/src/vz/.x/help/usage b/src/clis/vz/.x/help/usage similarity index 100% rename from src/vz/.x/help/usage rename to src/clis/vz/.x/help/usage diff --git a/src/vz/BuildCommon.targets b/src/clis/vz/BuildCommon.targets similarity index 100% rename from src/vz/BuildCommon.targets rename to src/clis/vz/BuildCommon.targets diff --git a/src/vz/LICENSE.txt b/src/clis/vz/LICENSE.txt similarity index 100% rename from src/vz/LICENSE.txt rename to src/clis/vz/LICENSE.txt diff --git a/src/vz/NuGet.Config b/src/clis/vz/NuGet.Config similarity index 100% rename from src/vz/NuGet.Config rename to src/clis/vz/NuGet.Config diff --git a/src/vz/Program_VZ.cs b/src/clis/vz/Program_VZ.cs similarity index 100% rename from src/vz/Program_VZ.cs rename to src/clis/vz/Program_VZ.cs diff --git a/src/vz/Properties/PublishProfiles/folder publish vz-cli debug (linux-x64).pubxml b/src/clis/vz/Properties/PublishProfiles/folder publish vz-cli debug (linux-x64).pubxml similarity index 100% rename from src/vz/Properties/PublishProfiles/folder publish vz-cli debug (linux-x64).pubxml rename to src/clis/vz/Properties/PublishProfiles/folder publish vz-cli debug (linux-x64).pubxml diff --git a/src/vz/Properties/PublishProfiles/folder publish vz-cli debug (osx-64).pubxml b/src/clis/vz/Properties/PublishProfiles/folder publish vz-cli debug (osx-64).pubxml similarity index 100% rename from src/vz/Properties/PublishProfiles/folder publish vz-cli debug (osx-64).pubxml rename to src/clis/vz/Properties/PublishProfiles/folder publish vz-cli debug (osx-64).pubxml diff --git a/src/vz/Properties/PublishProfiles/folder publish vz-cli debug (win-x64).pubxml b/src/clis/vz/Properties/PublishProfiles/folder publish vz-cli debug (win-x64).pubxml similarity index 100% rename from src/vz/Properties/PublishProfiles/folder publish vz-cli debug (win-x64).pubxml rename to src/clis/vz/Properties/PublishProfiles/folder publish vz-cli debug (win-x64).pubxml diff --git a/src/vz/Properties/PublishProfiles/folder publish vz-cli release (linux-x64).pubxml b/src/clis/vz/Properties/PublishProfiles/folder publish vz-cli release (linux-x64).pubxml similarity index 100% rename from src/vz/Properties/PublishProfiles/folder publish vz-cli release (linux-x64).pubxml rename to src/clis/vz/Properties/PublishProfiles/folder publish vz-cli release (linux-x64).pubxml diff --git a/src/vz/Properties/PublishProfiles/folder publish vz-cli release (osx-64).pubxml b/src/clis/vz/Properties/PublishProfiles/folder publish vz-cli release (osx-64).pubxml similarity index 100% rename from src/vz/Properties/PublishProfiles/folder publish vz-cli release (osx-64).pubxml rename to src/clis/vz/Properties/PublishProfiles/folder publish vz-cli release (osx-64).pubxml diff --git a/src/vz/Properties/PublishProfiles/folder publish vz-cli release (win-x64).pubxml b/src/clis/vz/Properties/PublishProfiles/folder publish vz-cli release (win-x64).pubxml similarity index 100% rename from src/vz/Properties/PublishProfiles/folder publish vz-cli release (win-x64).pubxml rename to src/clis/vz/Properties/PublishProfiles/folder publish vz-cli release (win-x64).pubxml diff --git a/src/vz/Properties/launchSettings.json b/src/clis/vz/Properties/launchSettings.json similarity index 100% rename from src/vz/Properties/launchSettings.json rename to src/clis/vz/Properties/launchSettings.json diff --git a/src/vz/THIRD_PARTY_NOTICE.txt b/src/clis/vz/THIRD_PARTY_NOTICE.txt similarity index 100% rename from src/vz/THIRD_PARTY_NOTICE.txt rename to src/clis/vz/THIRD_PARTY_NOTICE.txt diff --git a/src/vz/app.manifest b/src/clis/vz/app.manifest similarity index 100% rename from src/vz/app.manifest rename to src/clis/vz/app.manifest diff --git a/src/vz/ci/build-all.cmd b/src/clis/vz/ci/build-all.cmd similarity index 100% rename from src/vz/ci/build-all.cmd rename to src/clis/vz/ci/build-all.cmd diff --git a/src/vz/ci/build-all.sh b/src/clis/vz/ci/build-all.sh similarity index 100% rename from src/vz/ci/build-all.sh rename to src/clis/vz/ci/build-all.sh diff --git a/src/vz/ci/build-linux-x64.cmd b/src/clis/vz/ci/build-linux-x64.cmd similarity index 100% rename from src/vz/ci/build-linux-x64.cmd rename to src/clis/vz/ci/build-linux-x64.cmd diff --git a/src/vz/ci/build-win-x64.cmd b/src/clis/vz/ci/build-win-x64.cmd similarity index 100% rename from src/vz/ci/build-win-x64.cmd rename to src/clis/vz/ci/build-win-x64.cmd diff --git a/src/vz/ci/publish-linux-x64.cmd b/src/clis/vz/ci/publish-linux-x64.cmd similarity index 100% rename from src/vz/ci/publish-linux-x64.cmd rename to src/clis/vz/ci/publish-linux-x64.cmd diff --git a/src/vz/ci/publish-win-x64.cmd b/src/clis/vz/ci/publish-win-x64.cmd similarity index 100% rename from src/vz/ci/publish-win-x64.cmd rename to src/clis/vz/ci/publish-win-x64.cmd diff --git a/src/vz/ci/vz-build-pipeline.yml b/src/clis/vz/ci/vz-build-pipeline.yml similarity index 100% rename from src/vz/ci/vz-build-pipeline.yml rename to src/clis/vz/ci/vz-build-pipeline.yml diff --git a/src/vz/ci/vz-test-pipeline.yml b/src/clis/vz/ci/vz-test-pipeline.yml similarity index 100% rename from src/vz/ci/vz-test-pipeline.yml rename to src/clis/vz/ci/vz-test-pipeline.yml diff --git a/src/vz/commands/face_command.cs b/src/clis/vz/commands/face_command.cs similarity index 100% rename from src/vz/commands/face_command.cs rename to src/clis/vz/commands/face_command.cs diff --git a/src/vz/commands/image_command.cs b/src/clis/vz/commands/image_command.cs similarity index 100% rename from src/vz/commands/image_command.cs rename to src/clis/vz/commands/image_command.cs diff --git a/src/vz/commands/parsers/common_vision_token_parsers.cs b/src/clis/vz/commands/parsers/common_vision_token_parsers.cs similarity index 100% rename from src/vz/commands/parsers/common_vision_token_parsers.cs rename to src/clis/vz/commands/parsers/common_vision_token_parsers.cs diff --git a/src/vz/commands/parsers/face_command_parser.cs b/src/clis/vz/commands/parsers/face_command_parser.cs similarity index 100% rename from src/vz/commands/parsers/face_command_parser.cs rename to src/clis/vz/commands/parsers/face_command_parser.cs diff --git a/src/vz/commands/parsers/image_command_parser.cs b/src/clis/vz/commands/parsers/image_command_parser.cs similarity index 100% rename from src/vz/commands/parsers/image_command_parser.cs rename to src/clis/vz/commands/parsers/image_command_parser.cs diff --git a/src/vz/commands/parsers/person_command_parser.cs b/src/clis/vz/commands/parsers/person_command_parser.cs similarity index 100% rename from src/vz/commands/parsers/person_command_parser.cs rename to src/clis/vz/commands/parsers/person_command_parser.cs diff --git a/src/vz/commands/person_command.cs b/src/clis/vz/commands/person_command.cs similarity index 100% rename from src/vz/commands/person_command.cs rename to src/clis/vz/commands/person_command.cs diff --git a/src/vz/face.cli.person.ideas.md b/src/clis/vz/face.cli.person.ideas.md similarity index 100% rename from src/vz/face.cli.person.ideas.md rename to src/clis/vz/face.cli.person.ideas.md diff --git a/src/vz/helpers/display_helpers.cs b/src/clis/vz/helpers/display_helpers.cs similarity index 100% rename from src/vz/helpers/display_helpers.cs rename to src/clis/vz/helpers/display_helpers.cs diff --git a/src/vz/helpers/event_logger_helpers.cs b/src/clis/vz/helpers/event_logger_helpers.cs similarity index 100% rename from src/vz/helpers/event_logger_helpers.cs rename to src/clis/vz/helpers/event_logger_helpers.cs diff --git a/src/vz/packages.lock.json b/src/clis/vz/packages.lock.json similarity index 100% rename from src/vz/packages.lock.json rename to src/clis/vz/packages.lock.json diff --git a/src/vz/tests/check-all.cmd b/src/clis/vz/tests/check-all.cmd similarity index 100% rename from src/vz/tests/check-all.cmd rename to src/clis/vz/tests/check-all.cmd diff --git a/src/vz/tests/check-cli.cmd b/src/clis/vz/tests/check-cli.cmd similarity index 100% rename from src/vz/tests/check-cli.cmd rename to src/clis/vz/tests/check-cli.cmd diff --git a/src/vz/tests/cli/base/help.documentation.test b/src/clis/vz/tests/cli/base/help.documentation.test similarity index 100% rename from src/vz/tests/cli/base/help.documentation.test rename to src/clis/vz/tests/cli/base/help.documentation.test diff --git a/src/vz/tests/cli/base/help.documentation.test.run.output.expected b/src/clis/vz/tests/cli/base/help.documentation.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/base/help.documentation.test.run.output.expected rename to src/clis/vz/tests/cli/base/help.documentation.test.run.output.expected diff --git a/src/vz/tests/cli/base/help.examples.test b/src/clis/vz/tests/cli/base/help.examples.test similarity index 100% rename from src/vz/tests/cli/base/help.examples.test rename to src/clis/vz/tests/cli/base/help.examples.test diff --git a/src/vz/tests/cli/base/help.examples.test.run.output.expected b/src/clis/vz/tests/cli/base/help.examples.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/base/help.examples.test.run.output.expected rename to src/clis/vz/tests/cli/base/help.examples.test.run.output.expected diff --git a/src/vz/tests/cli/base/help.setup.test b/src/clis/vz/tests/cli/base/help.setup.test similarity index 100% rename from src/vz/tests/cli/base/help.setup.test rename to src/clis/vz/tests/cli/base/help.setup.test diff --git a/src/vz/tests/cli/base/help.setup.test.run.output.expected b/src/clis/vz/tests/cli/base/help.setup.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/base/help.setup.test.run.output.expected rename to src/clis/vz/tests/cli/base/help.setup.test.run.output.expected diff --git a/src/vz/tests/cli/base/help.test b/src/clis/vz/tests/cli/base/help.test similarity index 100% rename from src/vz/tests/cli/base/help.test rename to src/clis/vz/tests/cli/base/help.test diff --git a/src/vz/tests/cli/base/help.test.run.output.expected b/src/clis/vz/tests/cli/base/help.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/base/help.test.run.output.expected rename to src/clis/vz/tests/cli/base/help.test.run.output.expected diff --git a/src/vz/tests/cli/base/usage.test b/src/clis/vz/tests/cli/base/usage.test similarity index 100% rename from src/vz/tests/cli/base/usage.test rename to src/clis/vz/tests/cli/base/usage.test diff --git a/src/vz/tests/cli/base/usage.test.run.output.expected b/src/clis/vz/tests/cli/base/usage.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/base/usage.test.run.output.expected rename to src/clis/vz/tests/cli/base/usage.test.run.output.expected diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.1.set.test b/src/clis/vz/tests/cli/commands/config/config.local.name227266.1.set.test similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.1.set.test rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.1.set.test diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected b/src/clis/vz/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.1.set.test.run.output.expected diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.2.get.test b/src/clis/vz/tests/cli/commands/config/config.local.name227266.2.get.test similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.2.get.test rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.2.get.test diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected b/src/clis/vz/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.2.get.test.run.output.expected diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.3.find.test b/src/clis/vz/tests/cli/commands/config/config.local.name227266.3.find.test similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.3.find.test rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.3.find.test diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected b/src/clis/vz/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.3.find.test.run.output.expected diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.4.add.test b/src/clis/vz/tests/cli/commands/config/config.local.name227266.4.add.test similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.4.add.test rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.4.add.test diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected b/src/clis/vz/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.4.add.test.run.output.expected diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.5.clear.test b/src/clis/vz/tests/cli/commands/config/config.local.name227266.5.clear.test similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.5.clear.test rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.5.clear.test diff --git a/src/vz/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected b/src/clis/vz/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected rename to src/clis/vz/tests/cli/commands/config/config.local.name227266.5.clear.test.run.output.expected diff --git a/src/vz/tests/cli/commands/config/config.usage.test b/src/clis/vz/tests/cli/commands/config/config.usage.test similarity index 100% rename from src/vz/tests/cli/commands/config/config.usage.test rename to src/clis/vz/tests/cli/commands/config/config.usage.test diff --git a/src/vz/tests/cli/commands/config/config.usage.test.run.output.expected b/src/clis/vz/tests/cli/commands/config/config.usage.test.run.output.expected similarity index 100% rename from src/vz/tests/cli/commands/config/config.usage.test.run.output.expected rename to src/clis/vz/tests/cli/commands/config/config.usage.test.run.output.expected diff --git a/src/vz/vz-cli.csproj b/src/clis/vz/vz-cli.csproj similarity index 100% rename from src/vz/vz-cli.csproj rename to src/clis/vz/vz-cli.csproj diff --git a/tests/testframework/IYamlTestFrameworkHost.cs b/src/extensions/testframework/IYamlTestFrameworkHost.cs similarity index 100% rename from tests/testframework/IYamlTestFrameworkHost.cs rename to src/extensions/testframework/IYamlTestFrameworkHost.cs diff --git a/tests/testframework/Logger.cs b/src/extensions/testframework/Logger.cs similarity index 100% rename from tests/testframework/Logger.cs rename to src/extensions/testframework/Logger.cs diff --git a/tests/testframework/Properties/AssemblyInfo.cs b/src/extensions/testframework/Properties/AssemblyInfo.cs similarity index 100% rename from tests/testframework/Properties/AssemblyInfo.cs rename to src/extensions/testframework/Properties/AssemblyInfo.cs diff --git a/tests/testframework/TestResultHelpers.cs b/src/extensions/testframework/TestResultHelpers.cs similarity index 100% rename from tests/testframework/TestResultHelpers.cs rename to src/extensions/testframework/TestResultHelpers.cs diff --git a/tests/testframework/YamlHelpers.cs b/src/extensions/testframework/YamlHelpers.cs similarity index 100% rename from tests/testframework/YamlHelpers.cs rename to src/extensions/testframework/YamlHelpers.cs diff --git a/tests/testframework/YamlNodeExtensions.cs b/src/extensions/testframework/YamlNodeExtensions.cs similarity index 100% rename from tests/testframework/YamlNodeExtensions.cs rename to src/extensions/testframework/YamlNodeExtensions.cs diff --git a/tests/testframework/YamlTagHelpers.cs b/src/extensions/testframework/YamlTagHelpers.cs similarity index 100% rename from tests/testframework/YamlTagHelpers.cs rename to src/extensions/testframework/YamlTagHelpers.cs diff --git a/tests/testframework/YamlTestCaseFilter.cs b/src/extensions/testframework/YamlTestCaseFilter.cs similarity index 100% rename from tests/testframework/YamlTestCaseFilter.cs rename to src/extensions/testframework/YamlTestCaseFilter.cs diff --git a/tests/testframework/YamlTestCaseParseContext.cs b/src/extensions/testframework/YamlTestCaseParseContext.cs similarity index 100% rename from tests/testframework/YamlTestCaseParseContext.cs rename to src/extensions/testframework/YamlTestCaseParseContext.cs diff --git a/tests/testframework/YamlTestCaseParser.cs b/src/extensions/testframework/YamlTestCaseParser.cs similarity index 100% rename from tests/testframework/YamlTestCaseParser.cs rename to src/extensions/testframework/YamlTestCaseParser.cs diff --git a/tests/testframework/YamlTestCaseRunner.cs b/src/extensions/testframework/YamlTestCaseRunner.cs similarity index 100% rename from tests/testframework/YamlTestCaseRunner.cs rename to src/extensions/testframework/YamlTestCaseRunner.cs diff --git a/tests/testframework/YamlTestFramework.cs b/src/extensions/testframework/YamlTestFramework.cs similarity index 100% rename from tests/testframework/YamlTestFramework.cs rename to src/extensions/testframework/YamlTestFramework.cs diff --git a/tests/testframework/YamlTestFramework.csproj b/src/extensions/testframework/YamlTestFramework.csproj similarity index 76% rename from tests/testframework/YamlTestFramework.csproj rename to src/extensions/testframework/YamlTestFramework.csproj index 3c4af653..67f2822b 100644 --- a/tests/testframework/YamlTestFramework.csproj +++ b/src/extensions/testframework/YamlTestFramework.csproj @@ -7,7 +7,7 @@ - + \ No newline at end of file diff --git a/tests/testframework/YamlTestFrameworkCommon.targets b/src/extensions/testframework/YamlTestFrameworkCommon.targets similarity index 100% rename from tests/testframework/YamlTestFrameworkCommon.targets rename to src/extensions/testframework/YamlTestFrameworkCommon.targets diff --git a/tests/testframework/YamlTestProperties.cs b/src/extensions/testframework/YamlTestProperties.cs similarity index 100% rename from tests/testframework/YamlTestProperties.cs rename to src/extensions/testframework/YamlTestProperties.cs diff --git a/tests/recordingadapter/README.md b/src/testing/adapters/recordingadapter/README.md similarity index 92% rename from tests/recordingadapter/README.md rename to src/testing/adapters/recordingadapter/README.md index 85f1932e..99f83c4a 100644 --- a/tests/recordingadapter/README.md +++ b/src/testing/adapters/recordingadapter/README.md @@ -1,6 +1,6 @@ # `ai` CLI Yaml Recording Test Adapter -In addition to the capabilities of the [Yaml Test Adapter](https://github.com/Azure/azure-ai-cli/tree/main/tests/testadapter), this adapter adds in the capability to record ai.exe <-> service traffic and replay it enabling CI/CD testing without service interaction. +In addition to the capabilities of the [Yaml Test Adapter](https://github.com/Azure/azure-ai-cli/tree/main/src/testing/adapters/testadapter), this adapter adds in the capability to record ai.exe <-> service traffic and replay it enabling CI/CD testing without service interaction. The test yaml format and "how tos" are well covered in the Yaml Test Adapter pages, so you should become familiar with that as a first step. @@ -58,7 +58,7 @@ set REQUESTS_CA_BUNDLE=%TEMP%\ca.crt ### Run the tests you want to record ``` -dotnet test D:\git\azure-ai-cli\tests\recordingadapter\bin\Debug\net8.0\Azure.AI.CLI.RecordedTestAdapter.dll +dotnet test D:\git\azure-ai-cli\src\testing\adapters\recordingadapter\bin\Debug\net8.0\Azure.AI.CLI.RecordedTestAdapter.dll ``` ### Inspect the results for secrets and other PII diff --git a/tests/recordingadapter/RecordedTestAdapterTest.runsettings b/src/testing/adapters/recordingadapter/RecordedTestAdapterTest.runsettings similarity index 100% rename from tests/recordingadapter/RecordedTestAdapterTest.runsettings rename to src/testing/adapters/recordingadapter/RecordedTestAdapterTest.runsettings diff --git a/tests/recordingadapter/RecordedTestDiscoverer.cs b/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs similarity index 100% rename from tests/recordingadapter/RecordedTestDiscoverer.cs rename to src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs diff --git a/tests/recordingadapter/RecordedTestExecutor.cs b/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs similarity index 100% rename from tests/recordingadapter/RecordedTestExecutor.cs rename to src/testing/adapters/recordingadapter/RecordedTestExecutor.cs diff --git a/tests/recordingadapter/RecordedTestMode.cs b/src/testing/adapters/recordingadapter/RecordedTestMode.cs similarity index 100% rename from tests/recordingadapter/RecordedTestMode.cs rename to src/testing/adapters/recordingadapter/RecordedTestMode.cs diff --git a/tests/recordingadapter/RecordedTestObserver.cs b/src/testing/adapters/recordingadapter/RecordedTestObserver.cs similarity index 100% rename from tests/recordingadapter/RecordedTestObserver.cs rename to src/testing/adapters/recordingadapter/RecordedTestObserver.cs diff --git a/tests/recordingadapter/RecordedYamlTestAdapter.cs b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.cs similarity index 100% rename from tests/recordingadapter/RecordedYamlTestAdapter.cs rename to src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.cs diff --git a/tests/recordingadapter/RecordedYamlTestAdapter.csproj b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj similarity index 82% rename from tests/recordingadapter/RecordedYamlTestAdapter.csproj rename to src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj index 81b2d22e..f0690ba9 100644 --- a/tests/recordingadapter/RecordedYamlTestAdapter.csproj +++ b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj @@ -7,7 +7,7 @@ - + diff --git a/tests/recordingadapter/RecordedYamlTestAdapterCommon.targets b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapterCommon.targets similarity index 100% rename from tests/recordingadapter/RecordedYamlTestAdapterCommon.targets rename to src/testing/adapters/recordingadapter/RecordedYamlTestAdapterCommon.targets diff --git a/tests/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs b/src/testing/adapters/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs similarity index 100% rename from tests/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs rename to src/testing/adapters/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs diff --git a/tests/recordingadapter/TestProxyClient.cs b/src/testing/adapters/recordingadapter/TestProxyClient.cs similarity index 100% rename from tests/recordingadapter/TestProxyClient.cs rename to src/testing/adapters/recordingadapter/TestProxyClient.cs diff --git a/tests/recordproxy/Dockerfile b/src/testing/adapters/recordproxy/Dockerfile similarity index 100% rename from tests/recordproxy/Dockerfile rename to src/testing/adapters/recordproxy/Dockerfile diff --git a/tests/recordproxy/Dockerfile.base b/src/testing/adapters/recordproxy/Dockerfile.base similarity index 100% rename from tests/recordproxy/Dockerfile.base rename to src/testing/adapters/recordproxy/Dockerfile.base diff --git a/tests/recordproxy/dev_insall.cmd b/src/testing/adapters/recordproxy/dev_insall.cmd similarity index 100% rename from tests/recordproxy/dev_insall.cmd rename to src/testing/adapters/recordproxy/dev_insall.cmd diff --git a/tests/recordproxy/headers.lua b/src/testing/adapters/recordproxy/headers.lua similarity index 100% rename from tests/recordproxy/headers.lua rename to src/testing/adapters/recordproxy/headers.lua diff --git a/tests/recordproxy/issue_cert.sh b/src/testing/adapters/recordproxy/issue_cert.sh similarity index 100% rename from tests/recordproxy/issue_cert.sh rename to src/testing/adapters/recordproxy/issue_cert.sh diff --git a/tests/recordproxy/nginx.conf b/src/testing/adapters/recordproxy/nginx.conf similarity index 100% rename from tests/recordproxy/nginx.conf rename to src/testing/adapters/recordproxy/nginx.conf diff --git a/tests/recordproxy/openssl-ca.conf b/src/testing/adapters/recordproxy/openssl-ca.conf similarity index 100% rename from tests/recordproxy/openssl-ca.conf rename to src/testing/adapters/recordproxy/openssl-ca.conf diff --git a/tests/recordproxy/storage.lua b/src/testing/adapters/recordproxy/storage.lua similarity index 100% rename from tests/recordproxy/storage.lua rename to src/testing/adapters/recordproxy/storage.lua diff --git a/tests/testadapter/Properties/AssemblyInfo.cs b/src/testing/adapters/testadapter/Properties/AssemblyInfo.cs similarity index 100% rename from tests/testadapter/Properties/AssemblyInfo.cs rename to src/testing/adapters/testadapter/Properties/AssemblyInfo.cs diff --git a/tests/testadapter/README.md b/src/testing/adapters/testadapter/README.md similarity index 87% rename from tests/testadapter/README.md rename to src/testing/adapters/testadapter/README.md index 48d22e4e..43adecc9 100644 --- a/tests/testadapter/README.md +++ b/src/testing/adapters/testadapter/README.md @@ -26,12 +26,12 @@ From fresh clone (one step, CLI): OR ... [Build](#BUILD) first, then w/CLI: * DEBUG: ```dotnetcli - cd tests\testadapter\bin\Debug\net8.0 + cd src\testing\adapters\testadapter\bin\Debug\net8.0 dotnet test Azure.AI.CLI.TestAdapter.dll --logger:trx ``` * RELEASE: ```dotnetcli - cd tests\testadapter\bin\Release\net8.0 + cd src\testing\adapters\testadapter\bin\Release\net8.0 dotnet test Azure.AI.CLI.TestAdapter.dll --logger:trx --logger:console;verbosity=normal ``` @@ -39,12 +39,12 @@ OR ... [Build](#BUILD) first, then w/CLI: OR ... [Build](#BUILD) first, then w/CLI: * DEBUG: ```dotnetcli - cd tests\testadapter\bin\Debug\net8.0 + cd src\testing\adapters\testadapter\bin\Debug\net8.0 dotnet vstest Azure.AI.CLI.TestAdapter.dll --logger:trx ``` * RELEASE: ```dotnetcli - cd tests\testadapter\bin\Release\net8.0 + cd src\testing\adapters\testadapter\bin\Release\net8.0 dotnet vstest Azure.AI.CLI.TestAdapter.dll --logger:trx --logger:console;verbosity=normal ``` @@ -70,12 +70,12 @@ From fresh clone (one step, CLI): OR ... [Build](#BUILD) first, then w/CLI: * DEBUG: ```dotnetcli - cd tests\testadapter\bin\Debug\net8.0 + cd src\testing\adapters\testadapter\bin\Debug\net8.0 dotnet test Azure.AI.CLI.TestAdapter.dll -t ``` * RELEASE: ```dotnetcli - cd tests\testadapter\bin\Release\net8.0 + cd src\testing\adapters\testadapter\bin\Release\net8.0 dotnet test Azure.AI.CLI.TestAdapter.dll -t ``` @@ -83,12 +83,12 @@ OR ... [Build](#BUILD) first, then w/CLI: OR ... [Build](#BUILD) first, then w/CLI: * DEBUG: ```dotnetcli - cd tests\testadapter\bin\Debug\net8.0 + cd src\testing\adapters\testadapter\bin\Debug\net8.0 dotnet vstest Azure.AI.CLI.TestAdapter.dll -lt ``` * RELEASE: ```dotnetcli - cd tests\testadapter\bin\Release\net8.0 + cd src\testing\adapters\testadapter\bin\Release\net8.0 dotnet vstest Azure.AI.CLI.TestAdapter.dll -lt ``` @@ -110,12 +110,12 @@ OR ... [Build](#BUILD) first, then w/CLI: * DEBUG: ```dotnetcli - cd tests\testadapter\bin\Debug\net8.0 + cd src\testing\adapters\testadapter\bin\Debug\net8.0 dotnet test --filter:name~PARTIAL_NAME Azure.AI.CLI.TestAdapter.dll ``` * RELEASE: ```dotnetcli - cd tests\testadapter\bin\Release\net8.0 + cd src\testing\adapters\testadapter\bin\Release\net8.0 dotnet test --filter:name~PARTIAL_NAME Azure.AI.CLI.TestAdapter.dll ``` @@ -123,12 +123,12 @@ OR ... [Build](#BUILD) first, then w/CLI: OR ... [Build](#BUILD) first, then w/CLI: * DEBUG: ```dotnetcli - cd tests\testadapter\bin\Debug\net8.0 + cd src\testing\adapters\testadapter\bin\Debug\net8.0 dotnet vstest Azure.AI.CLI.TestAdapter.dll --logger:trx --testcasefilter:name~PARTIAL_NAME ``` * RELEASE: ```dotnetcli - cd tests\testadapter\bin\Release\net8.0 + cd src\testing\adapters\testadapter\bin\Release\net8.0 dotnet vstest Azure.AI.CLI.TestAdapter.dll --logger:trx --testcasefilter:name~PARTIAL_NAME ``` diff --git a/tests/testadapter/TestAdapterTest.runsettings b/src/testing/adapters/testadapter/TestAdapterTest.runsettings similarity index 100% rename from tests/testadapter/TestAdapterTest.runsettings rename to src/testing/adapters/testadapter/TestAdapterTest.runsettings diff --git a/tests/testadapter/TestDiscoverer.cs b/src/testing/adapters/testadapter/TestDiscoverer.cs similarity index 100% rename from tests/testadapter/TestDiscoverer.cs rename to src/testing/adapters/testadapter/TestDiscoverer.cs diff --git a/tests/testadapter/TestExecutor.cs b/src/testing/adapters/testadapter/TestExecutor.cs similarity index 100% rename from tests/testadapter/TestExecutor.cs rename to src/testing/adapters/testadapter/TestExecutor.cs diff --git a/tests/testadapter/YamlTestAdapter.cs b/src/testing/adapters/testadapter/YamlTestAdapter.cs similarity index 100% rename from tests/testadapter/YamlTestAdapter.cs rename to src/testing/adapters/testadapter/YamlTestAdapter.cs diff --git a/tests/testadapter/YamlTestAdapter.csproj b/src/testing/adapters/testadapter/YamlTestAdapter.csproj similarity index 69% rename from tests/testadapter/YamlTestAdapter.csproj rename to src/testing/adapters/testadapter/YamlTestAdapter.csproj index c359a4ce..54abb9c1 100644 --- a/tests/testadapter/YamlTestAdapter.csproj +++ b/src/testing/adapters/testadapter/YamlTestAdapter.csproj @@ -7,7 +7,7 @@ - + \ No newline at end of file diff --git a/tests/testadapter/YamlTestAdapterCommon.targets b/src/testing/adapters/testadapter/YamlTestAdapterCommon.targets similarity index 100% rename from tests/testadapter/YamlTestAdapterCommon.targets rename to src/testing/adapters/testadapter/YamlTestAdapterCommon.targets diff --git a/tests/testadapter/YamlTestFrameworkHandleHost.cs b/src/testing/adapters/testadapter/YamlTestFrameworkHandleHost.cs similarity index 100% rename from tests/testadapter/YamlTestFrameworkHandleHost.cs rename to src/testing/adapters/testadapter/YamlTestFrameworkHandleHost.cs diff --git a/tests/testadapter/YamlTestRunnerTriggerAttribute.cs b/src/testing/adapters/testadapter/YamlTestRunnerTriggerAttribute.cs similarity index 100% rename from tests/testadapter/YamlTestRunnerTriggerAttribute.cs rename to src/testing/adapters/testadapter/YamlTestRunnerTriggerAttribute.cs diff --git a/tests/testrunner/Program.cs b/src/testing/runner/Program.cs similarity index 100% rename from tests/testrunner/Program.cs rename to src/testing/runner/Program.cs diff --git a/tests/testrunner/Properties/AssemblyInfo.cs b/src/testing/runner/Properties/AssemblyInfo.cs similarity index 100% rename from tests/testrunner/Properties/AssemblyInfo.cs rename to src/testing/runner/Properties/AssemblyInfo.cs diff --git a/tests/testrunner/Properties/launchSettings.json b/src/testing/runner/Properties/launchSettings.json similarity index 100% rename from tests/testrunner/Properties/launchSettings.json rename to src/testing/runner/Properties/launchSettings.json diff --git a/tests/testrunner/YamlTestFrameworkConsoleHost.cs b/src/testing/runner/YamlTestFrameworkConsoleHost.cs similarity index 100% rename from tests/testrunner/YamlTestFrameworkConsoleHost.cs rename to src/testing/runner/YamlTestFrameworkConsoleHost.cs diff --git a/tests/testrunner/YamlTestRunner.csproj b/src/testing/runner/YamlTestRunner.csproj similarity index 73% rename from tests/testrunner/YamlTestRunner.csproj rename to src/testing/runner/YamlTestRunner.csproj index e04b5a5f..41c1426f 100644 --- a/tests/testrunner/YamlTestRunner.csproj +++ b/src/testing/runner/YamlTestRunner.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/tests/testrunner/YamlTestRunnerCommon.targets b/src/testing/runner/YamlTestRunnerCommon.targets similarity index 100% rename from tests/testrunner/YamlTestRunnerCommon.targets rename to src/testing/runner/YamlTestRunnerCommon.targets diff --git a/src/extensions/test_helper_functions_extension/BuildCommon.targets b/src/testing/samples/helper_functions_sample_project/BuildCommon.targets similarity index 100% rename from src/extensions/test_helper_functions_extension/BuildCommon.targets rename to src/testing/samples/helper_functions_sample_project/BuildCommon.targets diff --git a/src/extensions/test_helper_functions_extension/PersonAgeFunctionHelperTest.cs b/src/testing/samples/helper_functions_sample_project/PersonAgeFunctionHelperTest.cs similarity index 100% rename from src/extensions/test_helper_functions_extension/PersonAgeFunctionHelperTest.cs rename to src/testing/samples/helper_functions_sample_project/PersonAgeFunctionHelperTest.cs diff --git a/src/extensions/test_helper_functions_extension/test_helper_functions_extension.csproj b/src/testing/samples/helper_functions_sample_project/test_helper_functions_extension.csproj similarity index 72% rename from src/extensions/test_helper_functions_extension/test_helper_functions_extension.csproj rename to src/testing/samples/helper_functions_sample_project/test_helper_functions_extension.csproj index e2bf0920..c20bbfdb 100644 --- a/src/extensions/test_helper_functions_extension/test_helper_functions_extension.csproj +++ b/src/testing/samples/helper_functions_sample_project/test_helper_functions_extension.csproj @@ -9,11 +9,11 @@ - + - + From 3153cb230c976a85cd47a92d6fb73bd5b52a1f0b Mon Sep 17 00:00:00 2001 From: Ryan Hurey Date: Fri, 16 Feb 2024 14:29:58 -0800 Subject: [PATCH 07/19] Add JSONL chat history save / restore support. (#217) * Stashing * Added some comments * Stashing * Somethig works * First history tests * PR Feedback * More tests * Update recordings * Change functions * Clean up recordings * Remove azure.core references where they are transitivly included * And VSCode CTRL+H not saving strikes again --- .../HelperFunctionsProject.csproj | 3 +- .../HelperFunctionsProject.csproj._ | 3 +- .../OpenAIChatCompletions.csproj._ | 3 +- .../OpenAIChatCompletionsStreaming.csproj._ | 3 +- ...IChatCompletionsWithDataStreaming.csproj._ | 3 +- ...ChatCompletionsFunctionsStreaming.csproj._ | 3 +- src/ai/Properties/launchSettings.json | 8 + src/ai/ai-cli.csproj | 3 +- src/ai/commands/chat_command.cs | 190 ++-- .../commands/parsers/chat_command_parser.cs | 2 + src/common/Properties/launchSettings.json | 8 + .../commands/parsers/common_token_parsers.cs | 34 +- src/common/details/helpers/process_helpers.cs | 2 +- .../parsers/named_value_token_parser.cs | 11 + .../tokens/input_chat_history_file_token.cs | 27 + .../tokens/output_chat_history_file_token.cs | 27 + .../HelperFunctionFactoryExtensions.cs | 73 +- .../helper_functions_extension.csproj | 2 +- .../testframework/YamlTestCaseRunner.cs | 2 +- .../RecordedYamlTestAdapter.csproj | 4 + tests/ai_chat_tests.yaml | 110 +++ tests/chat-history-basic.jsonl | 3 + tests/chat-history-function.jsonl | 5 + ...estCases.01.test ai chat history save.json | 199 ++++ ...chat history save with function calls.json | 927 ++++++++++++++++++ ...at with restored history file (basic).json | 582 +++++++++++ ...estored history file (function calls).json | 101 ++ ...Cases.test ai chat built in functions.json | 352 +++---- ....ai_chat_tests.TestCases.test ai chat.json | 268 ++--- ...ests.ai init.TestCases.ai init openai.json | 226 +++-- ...ests.ai init.TestCases.ai init speech.json | 176 ++-- 31 files changed, 2828 insertions(+), 532 deletions(-) create mode 100644 src/ai/Properties/launchSettings.json create mode 100644 src/common/Properties/launchSettings.json create mode 100644 src/common/details/named_values/tokens/input_chat_history_file_token.cs create mode 100644 src/common/details/named_values/tokens/output_chat_history_file_token.cs create mode 100644 tests/chat-history-basic.jsonl create mode 100644 tests/chat-history-function.jsonl create mode 100644 tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.01.test ai chat history save.json create mode 100644 tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.02.test ai chat history save with function calls.json create mode 100644 tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.03.Test AI Chat with restored history file (basic).json create mode 100644 tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.04.Test AI Chat with restored history file (function calls).json diff --git a/ideas/cool-helper-function-scenarios/HelperFunctionsProject.csproj b/ideas/cool-helper-function-scenarios/HelperFunctionsProject.csproj index faf7eac5..6bdd27a7 100644 --- a/ideas/cool-helper-function-scenarios/HelperFunctionsProject.csproj +++ b/ideas/cool-helper-function-scenarios/HelperFunctionsProject.csproj @@ -9,10 +9,9 @@ - - + diff --git a/src/ai/.x/templates/helper_functions/HelperFunctionsProject.csproj._ b/src/ai/.x/templates/helper_functions/HelperFunctionsProject.csproj._ index 3663e601..1609a440 100644 --- a/src/ai/.x/templates/helper_functions/HelperFunctionsProject.csproj._ +++ b/src/ai/.x/templates/helper_functions/HelperFunctionsProject.csproj._ @@ -12,10 +12,9 @@ - - + diff --git a/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletions.csproj._ b/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletions.csproj._ index 6ee2c11d..30addbec 100644 --- a/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletions.csproj._ +++ b/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletions.csproj._ @@ -12,9 +12,8 @@ - - + \ No newline at end of file diff --git a/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreaming.csproj._ b/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreaming.csproj._ index 6ee2c11d..30addbec 100644 --- a/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreaming.csproj._ +++ b/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreaming.csproj._ @@ -12,9 +12,8 @@ - - + \ No newline at end of file diff --git a/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreaming.csproj._ b/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreaming.csproj._ index 6ee2c11d..30addbec 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreaming.csproj._ +++ b/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreaming.csproj._ @@ -12,9 +12,8 @@ - - + \ No newline at end of file diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreaming.csproj._ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreaming.csproj._ index 565629b9..e92bb51d 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreaming.csproj._ +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreaming.csproj._ @@ -12,9 +12,8 @@ - - + diff --git a/src/ai/Properties/launchSettings.json b/src/ai/Properties/launchSettings.json new file mode 100644 index 00000000..c6eb63c9 --- /dev/null +++ b/src/ai/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "ai-cli": { + "commandName": "Project", + "commandLineArgs": "chat --interactive --question hello --output-chat-history-file history.jsonl --built-in-functions true --input-chat-history-file history_ref.jsonl" + } + } +} \ No newline at end of file diff --git a/src/ai/ai-cli.csproj b/src/ai/ai-cli.csproj index fd4bdd5a..af917fb6 100644 --- a/src/ai/ai-cli.csproj +++ b/src/ai/ai-cli.csproj @@ -118,7 +118,6 @@ - @@ -128,7 +127,7 @@ - + diff --git a/src/ai/commands/chat_command.cs b/src/ai/commands/chat_command.cs index a6f3ecdf..ae773a12 100644 --- a/src/ai/commands/chat_command.cs +++ b/src/ai/commands/chat_command.cs @@ -3,27 +3,26 @@ // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // -using System; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using System.Collections.Generic; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System.Net; -using Azure.AI.OpenAI; using Azure.AI.Details.Common.CLI.ConsoleGui; - +using Azure.AI.Details.Common.CLI.Extensions.HelperFunctions; +using Azure.AI.OpenAI; +using Azure.Core.Diagnostics; +using Microsoft.CognitiveServices.Speech; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.Memory.AzureCognitiveSearch; using Microsoft.SemanticKernel.Memory; -using Azure.Core.Diagnostics; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.ClientModel.Primitives; +using System.Collections.Generic; using System.Diagnostics.Tracing; -using Microsoft.CognitiveServices.Speech; -using Azure.AI.Details.Common.CLI.Extensions.HelperFunctions; +using System.IO; +using System.Linq; using System.Reflection; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; namespace Azure.AI.Details.Common.CLI { @@ -375,8 +374,10 @@ private async Task>> GetChatFunctionTextHandler(string var systemPrompt = _values.GetOrDefault("chat.message.system.prompt", DefaultSystemPrompt); messages.Add(new ChatRequestSystemMessage(systemPrompt)); - return await Task.Run(() => { - Func> handler = (string text) => { + return await Task.Run(() => + { + Func> handler = (string text) => + { messages.Add(new ChatRequestUserMessage(text)); @@ -391,12 +392,13 @@ private async Task>> GetChatFunctionTextHandler(string "--parameters", ConvertMessagesToJson(messages)), addToEnvironment: env); }); - var questionFunc = new Func(() => { - return PythonRunner.RunEmbeddedPythonScript(_values, "function_call", - CliHelpers.BuildCliArgs( - "--function", function, - "--parameters", $"{{\"question\": \"{text}\"}}"), - addToEnvironment: env); + var questionFunc = new Func(() => + { + return PythonRunner.RunEmbeddedPythonScript(_values, "function_call", + CliHelpers.BuildCliArgs( + "--function", function, + "--parameters", $"{{\"question\": \"{text}\"}}"), + addToEnvironment: env); }); var output = TryCatchHelpers.TryCatchNoThrow(chatProtocolFunc, null, out var ex1); @@ -600,9 +602,12 @@ private void DisplayAssistantFunctionCall(HelperFunctionCallContext context, str private async Task> GetChatCompletionsAsync(OpenAIClient client, ChatCompletionsOptions options, HelperFunctionCallContext funcContext, string text) { - options.Messages.Add(new ChatRequestUserMessage(text)); - + var requestMessage = new ChatRequestUserMessage(text); + options.Messages.Add(requestMessage); + + CheckWriteChatHistoryOutputFile(options); DisplayAssistantPromptLabel(); + Console.ForegroundColor = ConsoleColor.Gray; string contentComplete = string.Empty; @@ -627,13 +632,17 @@ private async Task> GetChatCom { DisplayAssistantFunctionCall(funcContext, result); funcContext.Reset(); + CheckWriteChatHistoryOutputFile(options); continue; } DisplayAssistantPromptTextStreamingDone(); CheckWriteChatAnswerOutputFile(contentComplete); - options.Messages.Add(new ChatRequestAssistantMessage(contentComplete)); + var currentContent = new ChatRequestAssistantMessage(contentComplete); + options.Messages.Add(currentContent); + + CheckWriteChatHistoryOutputFile(options); return response; } @@ -649,6 +658,26 @@ private void CheckWriteChatAnswerOutputFile(string completeResponse) } } + private void ClearMessageHistory() + { + var outputHistoryFile = OutputChatHistoryFileToken.Data().GetOrDefault(_values); + if (!string.IsNullOrEmpty(outputHistoryFile)) + { + var fileName = FileHelpers.GetOutputDataFileName(outputHistoryFile, _values); + FileHelpers.WriteAllText(fileName, "", Encoding.UTF8); + } + } + + private void CheckWriteChatHistoryOutputFile(ChatCompletionsOptions options) + { + var outputHistoryFile = OutputChatHistoryFileToken.Data().GetOrDefault(_values); + if (!string.IsNullOrEmpty(outputHistoryFile)) + { + var fileName = FileHelpers.GetOutputDataFileName(outputHistoryFile, _values); + options.SaveChatHistoryToFile(fileName); + } + } + private ChatCompletionsOptions CreateChatCompletionOptions(string deployment) { var options = new ChatCompletionsOptions(); @@ -658,6 +687,14 @@ private ChatCompletionsOptions CreateChatCompletionOptions(string deployment) options.Messages.Add(new ChatRequestSystemMessage(systemPrompt)); var textFile = _values["chat.message.history.text.file"]; + var jsonFile = InputChatHistoryJsonFileToken.Data().GetOrDefault(_values); + + if(!string.IsNullOrEmpty(jsonFile) && !string.IsNullOrEmpty(textFile)) + { + _values.AddThrowError("chat.message.history.text.file", "chat.message.history.json.file", "Only one of these options can be specified"); + } + + if (!string.IsNullOrEmpty(jsonFile)) options.ReadChatHistoryFromFile(jsonFile); if (!string.IsNullOrEmpty(textFile)) AddChatMessagesFromTextFile(options.Messages, textFile); var maxTokens = _values["chat.options.max.tokens"]; @@ -1103,75 +1140,74 @@ private float TryParse(string? s, float defaultValue) private async Task StoreMemoryAsync(IKernel kernel, string index) { - if (!_quiet) Console.Write("Storing files in semantic memory..."); - var githubFiles = SampleData(); - foreach (var entry in githubFiles) - { - await kernel.Memory.SaveReferenceAsync( - collection: index, - externalSourceName: "GitHub", - externalId: entry.Key, - description: entry.Value, - text: entry.Value); - - if (!_quiet) Console.Write("."); - } - - if (!_quiet) Console.WriteLine(". Done!\n"); + if (!_quiet) Console.Write("Storing files in semantic memory..."); + var githubFiles = SampleData(); + foreach (var entry in githubFiles) + { + await kernel.Memory.SaveReferenceAsync( + collection: index, + externalSourceName: "GitHub", + externalId: entry.Key, + description: entry.Value, + text: entry.Value); + + if (!_quiet) Console.Write("."); + } + + if (!_quiet) Console.WriteLine(". Done!\n"); } private static async Task SearchMemoryAsync(IKernel? kernel, string collection, string text) { - if (kernel == null) return null; - - var sb = new StringBuilder(); - var memories = kernel.Memory.SearchAsync(collection, text, limit: 2, minRelevanceScore: 0.5); - int i = 0; - await foreach (var memory in memories) - { - i++; - sb.AppendLine($"[{memory.Metadata.Id}]: {memory.Metadata.Description}"); - } + if (kernel == null) return null; - var result = i > 0 ? sb.ToString().Trim() : null; + var sb = new StringBuilder(); + var memories = kernel.Memory.SearchAsync(collection, text, limit: 2, minRelevanceScore: 0.5); + int i = 0; + await foreach (var memory in memories) + { + i++; + sb.AppendLine($"[{memory.Metadata.Id}]: {memory.Metadata.Description}"); + } + var result = i > 0 ? sb.ToString().Trim() : null; // Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); // Console.WriteLine("Relevant?\n" + result + "\n"); // Console.ResetColor(); - return result; + return result; } private string UpdateUserInputWithSearchResultInfo(string input, string searchResults) { - var sb = new StringBuilder(); - sb.Append("The below might be relevant information.\n[START INFO]\n"); - sb.Append(searchResults); - sb.Append("\n[END INFO]"); - sb.Append("\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf]."); - sb.Append($"\n{input}"); - return sb.ToString(); + var sb = new StringBuilder(); + sb.Append("The below might be relevant information.\n[START INFO]\n"); + sb.Append(searchResults); + sb.Append("\n[END INFO]"); + sb.Append("\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf]."); + sb.Append($"\n{input}"); + return sb.ToString(); } private static Dictionary SampleData() { - return new Dictionary - { - ["https://github.com/microsoft/semantic-kernel/blob/main/README.md"] - = "README: Installation, getting started, and how to contribute", - ["https://github.com/microsoft/semantic-kernel/blob/main/samples/notebooks/dotnet/02-running-prompts-from-file.ipynb"] - = "Jupyter notebook describing how to pass prompts from a file to a semantic skill or function", - ["https://github.com/microsoft/semantic-kernel/blob/main/samples/notebooks/dotnet/00-getting-started.ipynb"] - = "Jupyter notebook describing how to get started with the Semantic Kernel", - ["https://github.com/microsoft/semantic-kernel/tree/main/samples/skills/ChatSkill/ChatGPT"] - = "Sample demonstrating how to create a chat skill interfacing with ChatGPT", - ["https://github.com/microsoft/semantic-kernel/blob/main/dotnet/src/SemanticKernel/Memory/VolatileMemoryStore.cs"] - = "C# class that defines a volatile embedding store", - ["https://github.com/microsoft/semantic-kernel/blob/main/samples/dotnet/KernelHttpServer/README.md"] - = "README: How to set up a Semantic Kernel Service API using Azure Function Runtime v4", - ["https://github.com/microsoft/semantic-kernel/blob/main/samples/apps/chat-summary-webapp-react/README.md"] - = "README: README associated with a sample chat summary react-based webapp", - }; + return new Dictionary + { + ["https://github.com/microsoft/semantic-kernel/blob/main/README.md"] + = "README: Installation, getting started, and how to contribute", + ["https://github.com/microsoft/semantic-kernel/blob/main/samples/notebooks/dotnet/02-running-prompts-from-file.ipynb"] + = "Jupyter notebook describing how to pass prompts from a file to a semantic skill or function", + ["https://github.com/microsoft/semantic-kernel/blob/main/samples/notebooks/dotnet/00-getting-started.ipynb"] + = "Jupyter notebook describing how to get started with the Semantic Kernel", + ["https://github.com/microsoft/semantic-kernel/tree/main/samples/skills/ChatSkill/ChatGPT"] + = "Sample demonstrating how to create a chat skill interfacing with ChatGPT", + ["https://github.com/microsoft/semantic-kernel/blob/main/dotnet/src/SemanticKernel/Memory/VolatileMemoryStore.cs"] + = "C# class that defines a volatile embedding store", + ["https://github.com/microsoft/semantic-kernel/blob/main/samples/dotnet/KernelHttpServer/README.md"] + = "README: How to set up a Semantic Kernel Service API using Azure Function Runtime v4", + ["https://github.com/microsoft/semantic-kernel/blob/main/samples/apps/chat-summary-webapp-react/README.md"] + = "README: README associated with a sample chat summary react-based webapp", + }; } public const string DefaultSystemPrompt = "You are an AI assistant that helps people find information regarding Azure AI."; diff --git a/src/ai/commands/parsers/chat_command_parser.cs b/src/ai/commands/parsers/chat_command_parser.cs index f29ee82f..6a135744 100644 --- a/src/ai/commands/parsers/chat_command_parser.cs +++ b/src/ai/commands/parsers/chat_command_parser.cs @@ -120,6 +120,8 @@ public CommonChatNamedValueTokenParsers() : base( new TrueFalseNamedValueTokenParser("chat.speech.input", "010"), OutputChatAnswerFileToken.Parser(), + OutputChatHistoryFileToken.Parser(), + InputChatHistoryJsonFileToken.Parser(), // new TrueFalseRequiredPrefixNamedValueTokenParser("output", "all.answer", "01"), // new TrueFalseRequiredPrefixNamedValueTokenParser("output", "each.answer", "11") diff --git a/src/common/Properties/launchSettings.json b/src/common/Properties/launchSettings.json new file mode 100644 index 00000000..2966e39e --- /dev/null +++ b/src/common/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "common": { + "commandName": "Project", + "commandLineArgs": "chat --interactive --question hello --output-chat-history-file history.json" + } + } +} \ No newline at end of file diff --git a/src/common/details/commands/parsers/common_token_parsers.cs b/src/common/details/commands/parsers/common_token_parsers.cs index 98ad8345..aa9c7052 100644 --- a/src/common/details/commands/parsers/common_token_parsers.cs +++ b/src/common/details/commands/parsers/common_token_parsers.cs @@ -10,10 +10,40 @@ namespace Azure.AI.Details.Common.CLI { - public class OutputFileNamedValueTokenParser : NamedValueTokenParser + public enum FileDirection + { + input, + output + } + + public class FileNamedValueTokenParser : NamedValueTokenParser + { + public FileNamedValueTokenParser(string fullName, FileDirection direction, string requiredParts, string defaultValue = "-") : + base(null, $"{direction}.{fullName}.file", $"1{requiredParts}0", "1;0", "@@", null, defaultValue) + { + } + } + + public class InputFileNamedValueTokenParser : FileNamedValueTokenParser + { + public InputFileNamedValueTokenParser(string fullName, string requiredParts, string defaultValue = "-") : + base(fullName, FileDirection.input, requiredParts, defaultValue) + { + } + } + + public class InputFileOptionalPrefixNamedValueTokenParser : InputFileNamedValueTokenParser + { + public InputFileOptionalPrefixNamedValueTokenParser(string optionalPrefix, string fullName, string fullNameRequiredParts, string defaultValue = "-") : + base($"{optionalPrefix}.{fullName}", $"{NotRequired(optionalPrefix)}{fullNameRequiredParts}", defaultValue) + { + } + } + + public class OutputFileNamedValueTokenParser : FileNamedValueTokenParser { public OutputFileNamedValueTokenParser(string fullName, string requiredParts, string defaultValue = "-") : - base(null, $"output.{fullName}.file", $"1{requiredParts}0", "1;0", "@@", null, defaultValue) + base(fullName, FileDirection.output, requiredParts, defaultValue) { } } diff --git a/src/common/details/helpers/process_helpers.cs b/src/common/details/helpers/process_helpers.cs index 66bf5b9e..a4751173 100644 --- a/src/common/details/helpers/process_helpers.cs +++ b/src/common/details/helpers/process_helpers.cs @@ -234,7 +234,7 @@ private static string EnsureFindCacheGetBashExe() var gitBash = FindCacheGitBashExe(); if (gitBash == null || gitBash == "bash.exe") { - throw new Exception("Could not Git for Windows bash.exe in PATH!"); + throw new Exception("Could not find Git for Windows bash.exe in PATH!"); } return gitBash; } diff --git a/src/common/details/named_values/parsers/named_value_token_parser.cs b/src/common/details/named_values/parsers/named_value_token_parser.cs index a0d1971a..78f65c25 100644 --- a/src/common/details/named_values/parsers/named_value_token_parser.cs +++ b/src/common/details/named_values/parsers/named_value_token_parser.cs @@ -15,6 +15,17 @@ public abstract class INamedValueTokenParser public class NamedValueTokenParser : INamedValueTokenParser { + /// + /// Constructor + /// + /// The short name if you want --shortname + /// The full name of this property. + /// A string based bitmap for the fullName. i.e. 101 turns my.property.name into --myname + /// The number of values accepted from 1 instance of the argument on the command line. + /// a semi-colon deliminated list of possible values + /// The long name my.property.name of the internal property to set from this argument. If unset fullName is used. + /// The default value, unless pinnedValueKey is non-null, then the value passed to a property with the name whose value is pinnedValueKey + /// The name of the property value pinnedValue will be set to. public NamedValueTokenParser( string name, string fullName, string requiredParts, string valueCount, string validValues = null, string valueKey = null, diff --git a/src/common/details/named_values/tokens/input_chat_history_file_token.cs b/src/common/details/named_values/tokens/input_chat_history_file_token.cs new file mode 100644 index 00000000..190bc4c9 --- /dev/null +++ b/src/common/details/named_values/tokens/input_chat_history_file_token.cs @@ -0,0 +1,27 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class InputChatHistoryJsonFileToken + { + public static NamedValueTokenData Data() => new NamedValueTokenData(_optionName, _parser.FullName, _optionExample, _requiredDisplayName); + public static INamedValueTokenParser Parser() => _parser; + + private static _Parser _parser = new(); + private class _Parser : InputFileOptionalPrefixNamedValueTokenParser + { + public _Parser() : base("chat", "history", "1") + { + } + + public new string FullName => base.FullName; + } + + private const string _requiredDisplayName = "chat history input file"; + private const string _optionName = "--input-chat-history-file"; + private const string _optionExample = "FILE"; + } +} \ No newline at end of file diff --git a/src/common/details/named_values/tokens/output_chat_history_file_token.cs b/src/common/details/named_values/tokens/output_chat_history_file_token.cs new file mode 100644 index 00000000..794e51ea --- /dev/null +++ b/src/common/details/named_values/tokens/output_chat_history_file_token.cs @@ -0,0 +1,27 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class OutputChatHistoryFileToken + { + public static NamedValueTokenData Data() => new NamedValueTokenData(_optionName, _parser.FullName, _optionExample, _requiredDisplayName); + public static INamedValueTokenParser Parser() => _parser; + + private static _Parser _parser = new(); + private class _Parser : OutputFileOptionalPrefixNamedValueTokenParser + { + public _Parser() : base("chat", "history", "1") + { + } + + public new string FullName => base.FullName; + } + + private const string _requiredDisplayName = "chat history output file"; + private const string _optionName = "--output-chat-history-file"; + private const string _optionExample = "FILE"; + } +} \ No newline at end of file diff --git a/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs b/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs index 9dffea19..4a039c9a 100644 --- a/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs +++ b/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs @@ -1,9 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Runtime.Serialization; using Azure.AI.OpenAI; -using DevLab.JmesPath.Utils; -using System.Linq; +using System.Text; +using System.Text.Json; +using System.ClientModel.Primitives; +using System.Runtime.CompilerServices; namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions { @@ -25,5 +24,69 @@ public static bool TryCallFunction(this ChatCompletionsOptions options, HelperFu { return context.TryCallFunction(options, out result); } + + public static void SaveChatHistoryToFile(this ChatCompletionsOptions options, string fileName) + { + var historyFile = new StringBuilder(); + + foreach (var message in options.Messages) + { + var messageText = message switch + { + ChatRequestUserMessage userMessage => ModelReaderWriter.Write(userMessage, ModelReaderWriterOptions.Json).ToString(), + ChatRequestAssistantMessage assistantMessage => ModelReaderWriter.Write(assistantMessage, ModelReaderWriterOptions.Json).ToString(), + ChatRequestFunctionMessage functionMessage => ModelReaderWriter.Write(functionMessage, ModelReaderWriterOptions.Json).ToString(), + ChatRequestSystemMessage systemMessage => ModelReaderWriter.Write(systemMessage, ModelReaderWriterOptions.Json).ToString(), + ChatRequestToolMessage toolMessage => ModelReaderWriter.Write(toolMessage, ModelReaderWriterOptions.Json).ToString(), + _ => null + }; + + if (!string.IsNullOrEmpty(messageText)) + { + historyFile.AppendLine(messageText); + } + } + + FileHelpers.WriteAllText(fileName, historyFile.ToString(), Encoding.UTF8); + } + + public static void ReadChatHistoryFromFile(this ChatCompletionsOptions options, string fileName) + { + var historyFile = FileHelpers.ReadAllText(fileName, Encoding.UTF8); + + var historyFileLines = historyFile.Split(Environment.NewLine); + var clearIfSystem = () => + { + options.Messages.Clear(); + return typeof(ChatRequestSystemMessage); + }; + + foreach (var line in historyFileLines) + { + var jsonObject = JsonDocument.Parse(line); + JsonElement roleObj; + + if (!jsonObject.RootElement.TryGetProperty("role", out roleObj)) + { + continue; + } + + var role = roleObj.GetString(); + + var type = role?.ToLowerInvariant() switch + { + "user" => typeof(ChatRequestUserMessage), + "assistant" => typeof(ChatRequestAssistantMessage), + "function" => typeof(ChatRequestFunctionMessage), + "system" => clearIfSystem(), + "tool" => typeof(ChatRequestToolMessage), + _ => throw new Exception($"Unknown chat role {role}") + }; + + var message = ModelReaderWriter.Read(BinaryData.FromString(line), type, ModelReaderWriterOptions.Json); + + options.Messages.Add(message as ChatRequestMessage); + } + } } } diff --git a/src/extensions/helper_functions_extension/helper_functions_extension.csproj b/src/extensions/helper_functions_extension/helper_functions_extension.csproj index f7bb9259..0fbb2382 100644 --- a/src/extensions/helper_functions_extension/helper_functions_extension.csproj +++ b/src/extensions/helper_functions_extension/helper_functions_extension.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/extensions/testframework/YamlTestCaseRunner.cs b/src/extensions/testframework/YamlTestCaseRunner.cs index 765d0891..9e6a0947 100644 --- a/src/extensions/testframework/YamlTestCaseRunner.cs +++ b/src/extensions/testframework/YamlTestCaseRunner.cs @@ -722,7 +722,7 @@ private static string EnsureFindCacheGetBashExe() var gitBash = FindCacheGitBashExe(); if (gitBash == null || gitBash == "bash.exe") { - throw new Exception("Could not Git for Windows bash.exe in PATH!"); + throw new Exception("Could not find Git for Windows bash.exe in PATH!"); } return gitBash; } diff --git a/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj index f0690ba9..7e185653 100644 --- a/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj +++ b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj @@ -15,6 +15,10 @@ Recordings\%(RecursiveDir)%(Filename)%(Extension) Never + + Tests\%(RecursiveDir)%(Filename)%(Extension) + Never + \ No newline at end of file diff --git a/tests/ai_chat_tests.yaml b/tests/ai_chat_tests.yaml index a51c9930..8934f30e 100644 --- a/tests/ai_chat_tests.yaml +++ b/tests/ai_chat_tests.yaml @@ -80,3 +80,113 @@ assistant-function: FindAllFilesInCurrentDirectory test.txt Hello, World! + +- area: Test AI Chat history + tags: + recordable: true + _sanitize: + - headers: + - name: api-key + value: 00000000-0000-0000-0000-000000000000 + - uri: + - regex: https://(?[^/]+)/ + value: https://fakeendpoint/ + steps: + - name: test ai chat history save + expect: The file is valid. + bash: | + #!/bin/bash + rm * + + ai chat --question "Why is the sky blue, what's it called" --output-chat-history-file chat-history.jsonl + + # Read the jsonl file + FILE="chat-history.jsonl" + NUM_LINES=$(wc -l < "$FILE") + ROLE_SYSTEM_COUNT=$(grep -c "\"role\":\"system\"" "$FILE") + ROLE_USER_COUNT=$(grep -c "\"role\":\"user\"" "$FILE") + ROLE_ASSISTANT_COUNT=$(grep -c "\"role\":\"assistant\"" "$FILE") + + # Validate if the file is correct jsonl + jq -e ".[]" < "$FILE" > /dev/null 2>&1 + JSONL_VALID=$? + + # Check the conditions + if [ $NUM_LINES -eq 3 ] && [ $ROLE_SYSTEM_COUNT -eq 1 ] && [ $ROLE_USER_COUNT -eq 1 ] && [ $ROLE_ASSISTANT_COUNT -eq 1 ] && [ $JSONL_VALID -eq 0 ]; then + echo "The file is valid." + else + echo "The file is not valid." + if [ $JSONL_VALID -ne 0 ]; then + echo " - The file is not a valid JSONL." + fi + if [ $NUM_LINES -ne 3 ]; then + echo " - There are not exactly 3 rows." + fi + if [ $ROLE_SYSTEM_COUNT -ne 1 ]; then + echo " - There is no row with \"role\":\"system\" in it." + fi + if [ $ROLE_USER_COUNT -ne 1 ]; then + echo " - The row with \"role\":\"user\" is not exactly as above." + fi + if [ $ROLE_ASSISTANT_COUNT -ne 1 ]; then + echo " - There is no row with \"role\":\"assistant\" in it." + fi + fi + rm * + - name: test ai chat history save with function calls + expect: The file is valid. + workingDirectory: + bash: | + #!/bin/bash + FILE="chat-history-function.jsonl" + + ai chat --question "What is 12345 x 12345?" --built-in-functions true --output-chat-history-file ${FILE} + + # Read the JSONL file + NUM_LINES=$(wc -l < "$FILE") + ROLE_SYSTEM_COUNT=$(grep -c "\"role\":\"system\"" "$FILE") + ROLE_USER_COUNT=$(grep -c "\"role\":\"user\"" "$FILE") + ROLE_ASSISTANT_COUNT=$(grep -c "\"role\":\"assistant\"" "$FILE") + ROLE_FUNCTION_COUNT=$(grep -c "\"role\":\"function\"" "$FILE") + FUNCTION_CALL_COUNT=$(grep -c "\"name\":\"MultiplyIntegers\"" "$FILE") + + # Validate if the file is correct JSONL + jq -e ".[]" < "$FILE" > /dev/null 2>&1 + JSONL_VALID=$? + + # Check the conditions + if [ $NUM_LINES -eq 5 ] && [ $ROLE_SYSTEM_COUNT -eq 1 ] && [ $ROLE_USER_COUNT -eq 1 ] && [ $ROLE_ASSISTANT_COUNT -eq 2 ] && [ $ROLE_FUNCTION_COUNT -eq 1 ] && [ $FUNCTION_CALL_COUNT -eq 2 ] && [ $JSONL_VALID -eq 0 ]; then + echo "The file is valid." + else + echo "The file is not valid." + if [ $JSONL_VALID -ne 0 ]; then + echo " - The file is not a valid JSONL." + fi + if [ $NUM_LINES -ne 5 ]; then + echo " - There are not exactly 5 rows. The file has $NUM_LINES rows." + fi + if [ $ROLE_SYSTEM_COUNT -ne 1 ]; then + echo " - There is no row with \"role\":\"system\" in it. The file has $ROLE_SYSTEM_COUNT rows." + fi + if [ $ROLE_USER_COUNT -ne 1 ]; then + echo " - The row with \"role\":\"user\" is not exactly as above. The file has $ROLE_USER_COUNT rows." + fi + if [ $ROLE_ASSISTANT_COUNT -ne 2 ]; then + echo " - There are not exactly 2 rows with \"role\":\"assistant\" in them. The file has $ROLE_ASSISTANT_COUNT rows." + fi + if [ $ROLE_FUNCTION_COUNT -ne 1 ]; then + echo " - There is no row with \"role\":\"function\" in it. The file has $ROLE_FUNCTION_COUNT rows." + fi + if [ $FUNCTION_CALL_COUNT -ne 2 ]; then + echo " - The function \"MultiplyIntegers\" is not called. The file has $FUNCTION_CALL_COUNT rows." + fi + fi + rm * + - name: Test AI Chat with restored history file (basic) + expect: sky + bash: | + ai chat --question "What would make it red?" --built-in-functions true --input-chat-history-file ../tests/chat-history-basic.jsonl + - name: Test AI Chat with restored history file (function calls) + expect: FindAllFilesInCurrentDirectory + bash: | + ai chat --question "What was the last function call you made using your allowed functions?" --input-chat-history-file ../tests/chat-history-function.jsonl diff --git a/tests/chat-history-basic.jsonl b/tests/chat-history-basic.jsonl new file mode 100644 index 00000000..b26b3d25 --- /dev/null +++ b/tests/chat-history-basic.jsonl @@ -0,0 +1,3 @@ +{"content":"You are an AI assistant that helps people find information regarding Azure AI.","role":"system"} +{"content":"Why is the sky blue, what\u0027s it called","role":"user"} +{"content":"The sky appears blue because of a process called Rayleigh scattering. As sunlight reaches Earth\u0027s atmosphere, it is scattered in all directions by the gasses and particles in the air. Blue light is scattered more than other colors because it travels in smaller, shorter waves. This scattered blue light is what we see when we look up at the sky.","role":"assistant"} diff --git a/tests/chat-history-function.jsonl b/tests/chat-history-function.jsonl new file mode 100644 index 00000000..77451090 --- /dev/null +++ b/tests/chat-history-function.jsonl @@ -0,0 +1,5 @@ +{"content":"You are an AI assistant that helps people find information regarding Azure AI.","role":"system"} +{"content":"What files are in the current directory?","role":"user"} +{"content":"","function_call":{"name":"FindAllFilesInCurrentDirectory","arguments":"{}"},"role":"assistant"} +{"name":"FindAllFilesInCurrentDirectory","content":".\\chat-history-function.jsonl\n.\\chat-history.jsonl\n.\\exception.133516591780966512.20388.133516591784943510.ai.error.log\n.\\exception.133516592989137207.45176.133516592992749019.ai.error.log\n.\\exception.133516594890000019.36368.133516594893848590.ai.error.log\n.\\exception.133516596471282648.33616.133516596475084522.ai.error.log\n.\\exception.133516597401574874.30992.133516597404242938.ai.error.log\n.\\exception.133516598954708613.26104.133516598957969227.ai.error.log\n.\\exception.133516599952767898.26380.133516599969886798.ai.error.log\n.\\exception.133516600256803769.58280.133516600259938125.ai.error.log\n.\\exception.133516606573346845.32600.133516606578048570.ai.error.log\n.\\exception.133516609752179757.25292.133516609766847064.ai.error.log\n.\\exception.133519986915118847.17340.133519987028054731.ai.error.log\n.\\exception.133519987359675916.5484.133519987465962887.ai.error.log\n.\\exception.133519990287344903.26680.133519990404205030.ai.error.log\n.\\exception.133519991404204635.408.133519991516711194.ai.error.log\n.\\exception.133519991767297375.5116.133519991874691286.ai.error.log\n.\\exception.133519993115080044.7832.133519993225557838.ai.error.log\n.\\exception.133519993562401667.26300.133519994794044140.ai.error.log\n.\\exception.133519994886679472.26924.133519994999257063.ai.error.log\n.\\exception.133519995334547233.28436.133519995459211913.ai.error.log\n.\\exception.133525074972964166.17368.133525074990659322.ai.error.log\n.\\exception.133525074998834708.19680.133525075005116564.ai.error.log\n.\\exception.133525076213513390.29948.133525076227735720.ai.error.log\n.\\exception.133525076232433834.24260.133525076237701235.ai.error.log\n.\\exception.133525076248876502.23776.133525076254196251.ai.error.log\n.\\exception.133525076268973271.29640.133525076274712905.ai.error.log\n.\\exception.133525078327141098.25336.133525078333111643.ai.error.log\n.\\exception.133525078337834586.28344.133525078344150631.ai.error.log\n.\\exception.133525078355136563.27300.133525078360545542.ai.error.log\n.\\exception.133525078375082208.32464.133525078381564328.ai.error.log\n.\\test.txt","role":"function"} +{"content":"Here are the files in the current directory:\n\n- .\\chat-history-function.jsonl\n- .\\chat-history.jsonl\n- .\\exception.133516591780966512.20388.133516591784943510.ai.error.log\n- .\\exception.133516592989137207.45176.133516592992749019.ai.error.log\n- .\\exception.133516594890000019.36368.133516594893848590.ai.error.log\n- .\\exception.133516596471282648.33616.133516596475084522.ai.error.log\n- .\\exception.133516597401574874.30992.133516597404242938.ai.error.log\n- .\\exception.133516598954708613.26104.133516598957969227.ai.error.log\n- .\\exception.133516599952767898.26380.133516599969886798.ai.error.log\n- .\\exception.133516600256803769.58280.133516600259938125.ai.error.log\n- .\\exception.133516606573346845.32600.133516606578048570.ai.error.log\n- .\\exception.133516609752179757.25292.133516609766847064.ai.error.log\n- .\\exception.133519986915118847.17340.133519987028054731.ai.error.log\n- .\\exception.133519987359675916.5484.133519987465962887.ai.error.log\n- .\\exception.133519990287344903.26680.133519990404205030.ai.error.log\n- .\\exception.133519991404204635.408.133519991516711194.ai.error.log\n- .\\exception.133519991767297375.5116.133519991874691286.ai.error.log\n- .\\exception.133519993115080044.7832.133519993225557838.ai.error.log\n- .\\exception.133519993562401667.26300.133519994794044140.ai.error.log\n- .\\exception.133519994886679472.26924.133519994999257063.ai.error.log\n- .\\exception.133519995334547233.28436.133519995459211913.ai.error.log\n- .\\exception.133525074972964166.17368.133525074990659322.ai.error.log\n- .\\exception.133525074998834708.19680.133525075005116564.ai.error.log\n- .\\exception.133525076213513390.29948.133525076227735720.ai.error.log\n- .\\exception.133525076232433834.24260.133525076237701235.ai.error.log\n- .\\exception.133525076248876502.23776.133525076254196251.ai.error.log\n- .\\exception.133525076268973271.29640.133525076274712905.ai.error.log\n- .\\exception.133525078327141098.25336.133525078333111643.ai.error.log\n- .\\exception.133525078337834586.28344.133525078344150631.ai.error.log\n- .\\exception.133525078355136563.27300.133525078360545542.ai.error.log\n- .\\exception.133525078375082208.32464.133525078381564328.ai.error.log\n- .\\test.txt","role":"assistant"} diff --git a/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.01.test ai chat history save.json b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.01.test ai chat history save.json new file mode 100644 index 00000000..2abc8656 --- /dev/null +++ b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.01.test ai chat history save.json @@ -0,0 +1,199 @@ +{ + "Entries": [ + { + "RequestUri": "https://fakeendpoint/openai/deployments/gpt-4-32k-0613/chat/completions?api-version=2023-12-01-preview", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "api-key": "00000000-0000-0000-0000-000000000000", + "Connection": "close", + "Content-Length": "294", + "Content-Type": "application/json", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "x-ms-client-request-id": "8181d6af-4b9a-4ed7-ad35-178692f4ddbc", + "x-ms-return-client-request-id": "true", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": { + "messages": [ + { + "content": "You are an AI assistant that helps people find information regarding Azure AI.", + "role": "system" + }, + { + "content": "Why is the sky blue, what\u0027s it called", + "role": "user" + } + ], + "temperature": 0.7, + "presence_penalty": 0, + "frequency_penalty": 0, + "stream": true, + "model": "gpt-4-32k-0613" + }, + "StatusCode": 200, + "ResponseHeaders": { + "Access-Control-Allow-Origin": "*", + "apim-request-id": "526510bf-4807-4bf7-89fe-9fff8e1f5317", + "azureml-model-session": "d029-20240123045238", + "Cache-Control": "must-revalidate, no-cache", + "Connection": "close", + "Content-Type": "text/event-stream", + "Date": "Fri, 16 Feb 2024 07:25:09 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-accel-buffering": "no", + "X-Content-Type-Options": "nosniff", + "x-ms-client-request-id": "8181d6af-4b9a-4ed7-ad35-178692f4ddbc", + "x-ms-region": "East US 2", + "x-ratelimit-remaining-requests": "45", + "x-ratelimit-remaining-tokens": "49856", + "X-Request-ID": "30cff024-8e9d-44da-a401-1e7b4f814474" + }, + "ResponseBody": [ + "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 appears\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 due\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 to\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 process\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 called\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Ray\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022leigh\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattering\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 As\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sunlight\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 reaches\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Earth\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\u0027s\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 atmosphere\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 it\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattered\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 all\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 directions\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 by\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 gases\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 particles\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 air\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattered\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 more\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 than\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 other\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 colors\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 because\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 it\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 travels\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 smaller\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 shorter\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 waves\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 This\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattering\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 rays\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 what\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 gives\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 its\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 appearance\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\\n\\n\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022However\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 your\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 question\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 seems\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 to\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 be\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 more\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 related\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 to\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Azure\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 AI\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 set\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 cloud\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022-based\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 services\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 technologies\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 provided\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 by\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Microsoft\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 to\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 assist\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 building\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 intelligent\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 applications\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Azure\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 AI\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 includes\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 services\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 like\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Azure\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Machine\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Learning\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Azure\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Cognitive\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Services\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Azure\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Bot\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Service\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 which\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 can\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 be\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 used\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 for\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 various\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 AI\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 tasks\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 including\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 machine\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 learning\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 knowledge\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 mining\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 natural\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 language\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 processing\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsoSZwZMpJitCXynO6ycszTadAM\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068310,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: [DONE]\n\n" + ] + } + ], + "Variables": {} +} diff --git a/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.02.test ai chat history save with function calls.json b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.02.test ai chat history save with function calls.json new file mode 100644 index 00000000..cbbacde2 --- /dev/null +++ b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.02.test ai chat history save with function calls.json @@ -0,0 +1,927 @@ +{ + "Entries": [ + { + "RequestUri": "https://fakeendpoint/openai/deployments/gpt-4-32k-0613/chat/completions?api-version=2023-12-01-preview", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "api-key": "00000000-0000-0000-0000-000000000000", + "Connection": "close", + "Content-Length": "5533", + "Content-Type": "application/json", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "x-ms-client-request-id": "bd02e261-494c-4a26-aeba-7805d4673d72", + "x-ms-return-client-request-id": "true", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": { + "messages": [ + { + "content": "You are an AI assistant that helps people find information regarding Azure AI.", + "role": "system" + }, + { + "content": "What is 12345 x 12345?", + "role": "user" + } + ], + "functions": [ + { + "name": "AddFloats", + "description": "Adds two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "SubtractFloats", + "description": "Subtracts two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "MultiplyFloats", + "description": "Multiplies two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "DivideFloats", + "description": "Divides two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "AddIntegers", + "description": "Adds two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "SubtractIntegers", + "description": "Subtracts two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "MultiplyIntegers", + "description": "Multiplies two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "DivideIntegers", + "description": "Divides two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "Average", + "description": "Calculates the average of a list of numbers", + "parameters": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "number" + }, + "description": "The numbers parameter" + } + }, + "required": [ + "numbers" + ] + } + }, + { + "name": "StandardDeviation", + "description": "Calculates the standard deviation of a list of numbers", + "parameters": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "number" + }, + "description": "The numbers parameter" + } + }, + "required": [ + "numbers" + ] + } + }, + { + "name": "GetCurrentDateTime", + "description": "Gets the current date and time", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FileExists", + "description": "Checks if file exists", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + } + }, + "required": [ + "fileName" + ] + } + }, + { + "name": "ReadTextFromFile", + "description": "Reads text from a file; returns empty string if file does not exist", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + } + }, + "required": [ + "fileName" + ] + } + }, + { + "name": "CreateFileAndSaveText", + "description": "Writes text into a file; if the file exists, it is overwritten", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + }, + "text": { + "type": "string", + "description": "The text parameter" + } + }, + "required": [ + "fileName", + "text" + ] + } + }, + { + "name": "AppendTextToFile", + "description": "Appends text to a file; if the file does not exist, it is created", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + }, + "text": { + "type": "string", + "description": "The text parameter" + } + }, + "required": [ + "fileName", + "text" + ] + } + }, + { + "name": "DirectoryCreate", + "description": "Creates a directory if it doesn\u0027t already exist", + "parameters": { + "type": "object", + "properties": { + "directoryName": { + "type": "string", + "description": "The directoryName parameter" + } + }, + "required": [ + "directoryName" + ] + } + }, + { + "name": "FindAllFilesInCurrentDirectory", + "description": "List files; lists all files regardless of name; only in current directory", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FindAllFilesRecursively", + "description": "List files; lists all files regardless of name; searches current directory and all sub-directories", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FindAllFilesMatchingPattern", + "description": "List files; lists all files matching pattern; searches current directory, and if pattern includes \u0027**\u0027, all sub-directories", + "parameters": { + "type": "object", + "properties": { + "pattern": { + "type": "string", + "description": "The pattern to search for; use \u0027**/*.ext\u0027 to search sub-directories" + } + }, + "required": [ + "pattern" + ] + } + }, + { + "name": "FindTextInAllFiles", + "description": "Find files containing text; searches all files", + "parameters": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to find" + } + }, + "required": [ + "text" + ] + } + }, + { + "name": "FindTextInFilesMatchingPattern", + "description": "Find files containing text; searches files matching a pattern", + "parameters": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to find" + }, + "pattern": { + "type": "string", + "description": "The pattern to search for; use \u0027**/*.ext\u0027 to search sub-directories" + } + }, + "required": [ + "text", + "pattern" + ] + } + } + ], + "temperature": 0.7, + "presence_penalty": 0, + "frequency_penalty": 0, + "stream": true, + "model": "gpt-4-32k-0613" + }, + "StatusCode": 200, + "ResponseHeaders": { + "Access-Control-Allow-Origin": "*", + "apim-request-id": "3f25d4c7-a0ad-485f-b18a-cbe60ed35421", + "azureml-model-session": "d032-20240123075009", + "Cache-Control": "must-revalidate, no-cache", + "Connection": "close", + "Content-Type": "text/event-stream", + "Date": "Fri, 16 Feb 2024 07:25:24 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-accel-buffering": "no", + "X-Content-Type-Options": "nosniff", + "x-ms-client-request-id": "bd02e261-494c-4a26-aeba-7805d4673d72", + "x-ms-region": "East US 2", + "x-ratelimit-remaining-requests": "49", + "x-ratelimit-remaining-tokens": "49840", + "X-Request-ID": "9081c047-8124-4368-823e-6a799c95e983" + }, + "ResponseBody": [ + "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022MultiplyIntegers\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022a\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022123\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u002245\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022,\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022b\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022123\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u002245\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt1Mhkt094t75D4QxI6BccETrxw\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068323,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: [DONE]\n\n" + ] + }, + { + "RequestUri": "https://fakeendpoint/openai/deployments/gpt-4-32k-0613/chat/completions?api-version=2023-12-01-preview", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "api-key": "00000000-0000-0000-0000-000000000000", + "Connection": "close", + "Content-Length": "5747", + "Content-Type": "application/json", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "x-ms-client-request-id": "13c50b7f-a4d1-40e9-b56a-10537e3953bb", + "x-ms-return-client-request-id": "true", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": { + "messages": [ + { + "content": "You are an AI assistant that helps people find information regarding Azure AI.", + "role": "system" + }, + { + "content": "What is 12345 x 12345?", + "role": "user" + }, + { + "content": "", + "function_call": { + "name": "MultiplyIntegers", + "arguments": "{\n \u0022a\u0022: 12345,\n \u0022b\u0022: 12345\n}" + }, + "role": "assistant" + }, + { + "name": "MultiplyIntegers", + "content": "152399025", + "role": "function" + } + ], + "functions": [ + { + "name": "AddFloats", + "description": "Adds two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "SubtractFloats", + "description": "Subtracts two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "MultiplyFloats", + "description": "Multiplies two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "DivideFloats", + "description": "Divides two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "AddIntegers", + "description": "Adds two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "SubtractIntegers", + "description": "Subtracts two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "MultiplyIntegers", + "description": "Multiplies two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "DivideIntegers", + "description": "Divides two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "Average", + "description": "Calculates the average of a list of numbers", + "parameters": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "number" + }, + "description": "The numbers parameter" + } + }, + "required": [ + "numbers" + ] + } + }, + { + "name": "StandardDeviation", + "description": "Calculates the standard deviation of a list of numbers", + "parameters": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "number" + }, + "description": "The numbers parameter" + } + }, + "required": [ + "numbers" + ] + } + }, + { + "name": "GetCurrentDateTime", + "description": "Gets the current date and time", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FileExists", + "description": "Checks if file exists", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + } + }, + "required": [ + "fileName" + ] + } + }, + { + "name": "ReadTextFromFile", + "description": "Reads text from a file; returns empty string if file does not exist", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + } + }, + "required": [ + "fileName" + ] + } + }, + { + "name": "CreateFileAndSaveText", + "description": "Writes text into a file; if the file exists, it is overwritten", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + }, + "text": { + "type": "string", + "description": "The text parameter" + } + }, + "required": [ + "fileName", + "text" + ] + } + }, + { + "name": "AppendTextToFile", + "description": "Appends text to a file; if the file does not exist, it is created", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + }, + "text": { + "type": "string", + "description": "The text parameter" + } + }, + "required": [ + "fileName", + "text" + ] + } + }, + { + "name": "DirectoryCreate", + "description": "Creates a directory if it doesn\u0027t already exist", + "parameters": { + "type": "object", + "properties": { + "directoryName": { + "type": "string", + "description": "The directoryName parameter" + } + }, + "required": [ + "directoryName" + ] + } + }, + { + "name": "FindAllFilesInCurrentDirectory", + "description": "List files; lists all files regardless of name; only in current directory", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FindAllFilesRecursively", + "description": "List files; lists all files regardless of name; searches current directory and all sub-directories", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FindAllFilesMatchingPattern", + "description": "List files; lists all files matching pattern; searches current directory, and if pattern includes \u0027**\u0027, all sub-directories", + "parameters": { + "type": "object", + "properties": { + "pattern": { + "type": "string", + "description": "The pattern to search for; use \u0027**/*.ext\u0027 to search sub-directories" + } + }, + "required": [ + "pattern" + ] + } + }, + { + "name": "FindTextInAllFiles", + "description": "Find files containing text; searches all files", + "parameters": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to find" + } + }, + "required": [ + "text" + ] + } + }, + { + "name": "FindTextInFilesMatchingPattern", + "description": "Find files containing text; searches files matching a pattern", + "parameters": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to find" + }, + "pattern": { + "type": "string", + "description": "The pattern to search for; use \u0027**/*.ext\u0027 to search sub-directories" + } + }, + "required": [ + "text", + "pattern" + ] + } + } + ], + "temperature": 0.7, + "presence_penalty": 0, + "frequency_penalty": 0, + "stream": true, + "model": "gpt-4-32k-0613" + }, + "StatusCode": 200, + "ResponseHeaders": { + "Access-Control-Allow-Origin": "*", + "apim-request-id": "af811d33-7d5b-4a2e-bc5f-9e008b19478d", + "azureml-model-session": "d032-20240123075009", + "Cache-Control": "must-revalidate, no-cache", + "Connection": "close", + "Content-Type": "text/event-stream", + "Date": "Fri, 16 Feb 2024 07:25:25 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-accel-buffering": "no", + "X-Content-Type-Options": "nosniff", + "x-ms-client-request-id": "13c50b7f-a4d1-40e9-b56a-10537e3953bb", + "x-ms-region": "East US 2", + "x-ratelimit-remaining-requests": "48", + "x-ratelimit-remaining-tokens": "49824", + "X-Request-ID": "dbd48248-3439-4f6c-92c0-baf7104b6c19" + }, + "ResponseBody": [ + "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 result\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 multiplication\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022123\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u002245\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 x\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022123\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u002245\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022152\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022399\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022025\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt4p75OyvCv7g14gf0tPDgyi3nT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068326,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: [DONE]\n\n" + ] + } + ], + "Variables": {} +} diff --git a/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.03.Test AI Chat with restored history file (basic).json b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.03.Test AI Chat with restored history file (basic).json new file mode 100644 index 00000000..79a65667 --- /dev/null +++ b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.03.Test AI Chat with restored history file (basic).json @@ -0,0 +1,582 @@ +{ + "Entries": [ + { + "RequestUri": "https://fakeendpoint/openai/deployments/gpt-4-32k-0613/chat/completions?api-version=2023-12-01-preview", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "api-key": "00000000-0000-0000-0000-000000000000", + "Connection": "close", + "Content-Length": "5989", + "Content-Type": "application/json", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "x-ms-client-request-id": "f57310c4-3ca3-473e-93f8-33016b899006", + "x-ms-return-client-request-id": "true", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": { + "messages": [ + { + "content": "You are an AI assistant that helps people find information regarding Azure AI.", + "role": "system" + }, + { + "content": "Why is the sky blue, what\u0027s it called", + "role": "user" + }, + { + "content": "The sky appears blue because of a process called Rayleigh scattering. As sunlight reaches Earth\u0027s atmosphere, it is scattered in all directions by the gasses and particles in the air. Blue light is scattered more than other colors because it travels in smaller, shorter waves. This scattered blue light is what we see when we look up at the sky.", + "role": "assistant" + }, + { + "content": "What would make it red?", + "role": "user" + } + ], + "functions": [ + { + "name": "AddFloats", + "description": "Adds two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "SubtractFloats", + "description": "Subtracts two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "MultiplyFloats", + "description": "Multiplies two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "DivideFloats", + "description": "Divides two floats", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "The a parameter" + }, + "b": { + "type": "number", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "AddIntegers", + "description": "Adds two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "SubtractIntegers", + "description": "Subtracts two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "MultiplyIntegers", + "description": "Multiplies two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "DivideIntegers", + "description": "Divides two integers", + "parameters": { + "type": "object", + "properties": { + "a": { + "type": "integer", + "description": "The a parameter" + }, + "b": { + "type": "integer", + "description": "The b parameter" + } + }, + "required": [ + "a", + "b" + ] + } + }, + { + "name": "Average", + "description": "Calculates the average of a list of numbers", + "parameters": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "number" + }, + "description": "The numbers parameter" + } + }, + "required": [ + "numbers" + ] + } + }, + { + "name": "StandardDeviation", + "description": "Calculates the standard deviation of a list of numbers", + "parameters": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "number" + }, + "description": "The numbers parameter" + } + }, + "required": [ + "numbers" + ] + } + }, + { + "name": "GetCurrentDateTime", + "description": "Gets the current date and time", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FileExists", + "description": "Checks if file exists", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + } + }, + "required": [ + "fileName" + ] + } + }, + { + "name": "ReadTextFromFile", + "description": "Reads text from a file; returns empty string if file does not exist", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + } + }, + "required": [ + "fileName" + ] + } + }, + { + "name": "CreateFileAndSaveText", + "description": "Writes text into a file; if the file exists, it is overwritten", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + }, + "text": { + "type": "string", + "description": "The text parameter" + } + }, + "required": [ + "fileName", + "text" + ] + } + }, + { + "name": "AppendTextToFile", + "description": "Appends text to a file; if the file does not exist, it is created", + "parameters": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "The fileName parameter" + }, + "text": { + "type": "string", + "description": "The text parameter" + } + }, + "required": [ + "fileName", + "text" + ] + } + }, + { + "name": "DirectoryCreate", + "description": "Creates a directory if it doesn\u0027t already exist", + "parameters": { + "type": "object", + "properties": { + "directoryName": { + "type": "string", + "description": "The directoryName parameter" + } + }, + "required": [ + "directoryName" + ] + } + }, + { + "name": "FindAllFilesInCurrentDirectory", + "description": "List files; lists all files regardless of name; only in current directory", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FindAllFilesRecursively", + "description": "List files; lists all files regardless of name; searches current directory and all sub-directories", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "FindAllFilesMatchingPattern", + "description": "List files; lists all files matching pattern; searches current directory, and if pattern includes \u0027**\u0027, all sub-directories", + "parameters": { + "type": "object", + "properties": { + "pattern": { + "type": "string", + "description": "The pattern to search for; use \u0027**/*.ext\u0027 to search sub-directories" + } + }, + "required": [ + "pattern" + ] + } + }, + { + "name": "FindTextInAllFiles", + "description": "Find files containing text; searches all files", + "parameters": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to find" + } + }, + "required": [ + "text" + ] + } + }, + { + "name": "FindTextInFilesMatchingPattern", + "description": "Find files containing text; searches files matching a pattern", + "parameters": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to find" + }, + "pattern": { + "type": "string", + "description": "The pattern to search for; use \u0027**/*.ext\u0027 to search sub-directories" + } + }, + "required": [ + "text", + "pattern" + ] + } + } + ], + "temperature": 0.7, + "presence_penalty": 0, + "frequency_penalty": 0, + "stream": true, + "model": "gpt-4-32k-0613" + }, + "StatusCode": 200, + "ResponseHeaders": { + "Access-Control-Allow-Origin": "*", + "apim-request-id": "2a591d8d-ced6-4c22-9f05-5b84b89fb568", + "azureml-model-session": "d031-20240123065239", + "Cache-Control": "must-revalidate, no-cache", + "Connection": "close", + "Content-Type": "text/event-stream", + "Date": "Fri, 16 Feb 2024 07:25:31 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-accel-buffering": "no", + "X-Content-Type-Options": "nosniff", + "x-ms-client-request-id": "f57310c4-3ca3-473e-93f8-33016b899006", + "x-ms-region": "East US 2", + "x-ratelimit-remaining-requests": "47", + "x-ratelimit-remaining-tokens": "49808", + "X-Request-ID": "10da573a-8fe0-425d-ba36-561e79dd4090" + }, + "ResponseBody": [ + "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 can\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 appear\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 red\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 due\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 to\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 phenomenon\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 known\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 as\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022sc\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022attering\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 In\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 morning\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 evening\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 when\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Sun\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 near\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 horizon\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sunlight\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 travels\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 through\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 more\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Earth\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\u0027s\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 atmosphere\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 As\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 result\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 larger\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 proportion\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 short\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelength\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 green\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattered\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 out\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sun\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022beam\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 longer\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelength\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 red\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 orange\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 becomes\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 dominant\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 direct\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sun\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022beam\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\\n\\n\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Moreover\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 other\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 factors\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 like\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 airborne\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 dust\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 particles\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 pollution\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 or\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 presence\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 smoke\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 from\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 fire\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 or\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 volcanic\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 eruption\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 can\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 also\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scatter\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 shorter\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelength\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 colors\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 (\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022bl\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022ues\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 greens\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022)\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 enhance\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 longer\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelength\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 colors\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 like\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 red\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 orange\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 making\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 appear\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 red\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smt9zHbeUUScXTMBkSeWDsJ8gQAl\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068331,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: [DONE]\n\n" + ] + } + ], + "Variables": {} +} diff --git a/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.04.Test AI Chat with restored history file (function calls).json b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.04.Test AI Chat with restored history file (function calls).json new file mode 100644 index 00000000..a7d905b4 --- /dev/null +++ b/tests/recordings/yaml.ai_chat_tests.Test AI Chat history.TestCases.04.Test AI Chat with restored history file (function calls).json @@ -0,0 +1,101 @@ +{ + "Entries": [ + { + "RequestUri": "https://fakeendpoint/openai/deployments/gpt-4-32k-0613/chat/completions?api-version=2023-12-01-preview", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "api-key": "00000000-0000-0000-0000-000000000000", + "Connection": "close", + "Content-Length": "4959", + "Content-Type": "application/json", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "x-ms-client-request-id": "91c29020-a26b-4ffd-b059-0e9f6f22a07f", + "x-ms-return-client-request-id": "true", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": { + "messages": [ + { + "content": "You are an AI assistant that helps people find information regarding Azure AI.", + "role": "system" + }, + { + "content": "What files are in the current directory?", + "role": "user" + }, + { + "content": "", + "function_call": { + "name": "FindAllFilesInCurrentDirectory", + "arguments": "{}" + }, + "role": "assistant" + }, + { + "name": "FindAllFilesInCurrentDirectory", + "content": ".\\chat-history-function.jsonl\n.\\chat-history.jsonl\n.\\exception.133516591780966512.20388.133516591784943510.ai.error.log\n.\\exception.133516592989137207.45176.133516592992749019.ai.error.log\n.\\exception.133516594890000019.36368.133516594893848590.ai.error.log\n.\\exception.133516596471282648.33616.133516596475084522.ai.error.log\n.\\exception.133516597401574874.30992.133516597404242938.ai.error.log\n.\\exception.133516598954708613.26104.133516598957969227.ai.error.log\n.\\exception.133516599952767898.26380.133516599969886798.ai.error.log\n.\\exception.133516600256803769.58280.133516600259938125.ai.error.log\n.\\exception.133516606573346845.32600.133516606578048570.ai.error.log\n.\\exception.133516609752179757.25292.133516609766847064.ai.error.log\n.\\exception.133519986915118847.17340.133519987028054731.ai.error.log\n.\\exception.133519987359675916.5484.133519987465962887.ai.error.log\n.\\exception.133519990287344903.26680.133519990404205030.ai.error.log\n.\\exception.133519991404204635.408.133519991516711194.ai.error.log\n.\\exception.133519991767297375.5116.133519991874691286.ai.error.log\n.\\exception.133519993115080044.7832.133519993225557838.ai.error.log\n.\\exception.133519993562401667.26300.133519994794044140.ai.error.log\n.\\exception.133519994886679472.26924.133519994999257063.ai.error.log\n.\\exception.133519995334547233.28436.133519995459211913.ai.error.log\n.\\exception.133525074972964166.17368.133525074990659322.ai.error.log\n.\\exception.133525074998834708.19680.133525075005116564.ai.error.log\n.\\exception.133525076213513390.29948.133525076227735720.ai.error.log\n.\\exception.133525076232433834.24260.133525076237701235.ai.error.log\n.\\exception.133525076248876502.23776.133525076254196251.ai.error.log\n.\\exception.133525076268973271.29640.133525076274712905.ai.error.log\n.\\exception.133525078327141098.25336.133525078333111643.ai.error.log\n.\\exception.133525078337834586.28344.133525078344150631.ai.error.log\n.\\exception.133525078355136563.27300.133525078360545542.ai.error.log\n.\\exception.133525078375082208.32464.133525078381564328.ai.error.log\n.\\test.txt", + "role": "function" + }, + { + "content": "Here are the files in the current directory:\n\n- .\\chat-history-function.jsonl\n- .\\chat-history.jsonl\n- .\\exception.133516591780966512.20388.133516591784943510.ai.error.log\n- .\\exception.133516592989137207.45176.133516592992749019.ai.error.log\n- .\\exception.133516594890000019.36368.133516594893848590.ai.error.log\n- .\\exception.133516596471282648.33616.133516596475084522.ai.error.log\n- .\\exception.133516597401574874.30992.133516597404242938.ai.error.log\n- .\\exception.133516598954708613.26104.133516598957969227.ai.error.log\n- .\\exception.133516599952767898.26380.133516599969886798.ai.error.log\n- .\\exception.133516600256803769.58280.133516600259938125.ai.error.log\n- .\\exception.133516606573346845.32600.133516606578048570.ai.error.log\n- .\\exception.133516609752179757.25292.133516609766847064.ai.error.log\n- .\\exception.133519986915118847.17340.133519987028054731.ai.error.log\n- .\\exception.133519987359675916.5484.133519987465962887.ai.error.log\n- .\\exception.133519990287344903.26680.133519990404205030.ai.error.log\n- .\\exception.133519991404204635.408.133519991516711194.ai.error.log\n- .\\exception.133519991767297375.5116.133519991874691286.ai.error.log\n- .\\exception.133519993115080044.7832.133519993225557838.ai.error.log\n- .\\exception.133519993562401667.26300.133519994794044140.ai.error.log\n- .\\exception.133519994886679472.26924.133519994999257063.ai.error.log\n- .\\exception.133519995334547233.28436.133519995459211913.ai.error.log\n- .\\exception.133525074972964166.17368.133525074990659322.ai.error.log\n- .\\exception.133525074998834708.19680.133525075005116564.ai.error.log\n- .\\exception.133525076213513390.29948.133525076227735720.ai.error.log\n- .\\exception.133525076232433834.24260.133525076237701235.ai.error.log\n- .\\exception.133525076248876502.23776.133525076254196251.ai.error.log\n- .\\exception.133525076268973271.29640.133525076274712905.ai.error.log\n- .\\exception.133525078327141098.25336.133525078333111643.ai.error.log\n- .\\exception.133525078337834586.28344.133525078344150631.ai.error.log\n- .\\exception.133525078355136563.27300.133525078360545542.ai.error.log\n- .\\exception.133525078375082208.32464.133525078381564328.ai.error.log\n- .\\test.txt", + "role": "assistant" + }, + { + "content": "What was the last function call you made using your allowed functions?", + "role": "user" + } + ], + "temperature": 0.7, + "presence_penalty": 0, + "frequency_penalty": 0, + "stream": true, + "model": "gpt-4-32k-0613" + }, + "StatusCode": 200, + "ResponseHeaders": { + "Access-Control-Allow-Origin": "*", + "apim-request-id": "d0ab5d7d-408c-45b3-a384-330a387e482b", + "azureml-model-session": "d030-20240123055055", + "Cache-Control": "must-revalidate, no-cache", + "Connection": "close", + "Content-Type": "text/event-stream", + "Date": "Fri, 16 Feb 2024 07:25:45 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-accel-buffering": "no", + "X-Content-Type-Options": "nosniff", + "x-ms-client-request-id": "91c29020-a26b-4ffd-b059-0e9f6f22a07f", + "x-ms-region": "East US 2", + "x-ratelimit-remaining-requests": "49", + "x-ratelimit-remaining-tokens": "49792", + "X-Request-ID": "1912f422-cc9d-4cbb-bb23-f75446ccaa5a" + }, + "ResponseBody": [ + "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 last\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 function\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 call\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 I\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 made\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 was\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 to\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Find\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022All\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Files\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022In\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Current\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Directory\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smtOhnE9RlFjJlZkvxRwx6tjRpPC\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068346,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: [DONE]\n\n" + ] + } + ], + "Variables": {} +} diff --git a/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json b/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json index 42a8f478..26d785ab 100644 --- a/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json +++ b/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json @@ -9,10 +9,10 @@ "Connection": "close", "Content-Length": "5611", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "1c8f6538-882e-491c-ab05-9f5f5769d7c2", + "x-ms-client-request-id": "6a37607f-3fa1-46d7-b460-f7dbc28d3b25", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -414,42 +414,45 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "b8db685e-328c-4bf3-805c-8c7718cfcad2", - "azureml-model-session": "d029-20240123045238", + "apim-request-id": "d76ae776-7ed2-4401-8d20-bf6ab3df7cd2", + "azureml-model-session": "d027-20240123024829", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Mon, 12 Feb 2024 01:10:04 GMT", + "Date": "Fri, 16 Feb 2024 07:24:56 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "1c8f6538-882e-491c-ab05-9f5f5769d7c2", + "x-ms-client-request-id": "6a37607f-3fa1-46d7-b460-f7dbc28d3b25", "x-ms-region": "East US 2", - "x-ratelimit-remaining-requests": "49", - "x-ratelimit-remaining-tokens": "49984", - "X-Request-ID": "42d832a0-6574-409f-acac-907b7770113b" + "x-ratelimit-remaining-requests": "48", + "x-ratelimit-remaining-tokens": "49968", + "X-Request-ID": "5bfeb8aa-4e5e-48ca-a789-ad5b5cb3dd26" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022CreateFileAndSaveText\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022,\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022text\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022Hello\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022,\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 World\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022!\\\u0022\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7cvLb9U8kM1AtMCnacQzQoboHc\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700204,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022CreateFileAndSaveText\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022,\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022text\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022Hello\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022,\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 World\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022!\\\u0022\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] }, @@ -460,12 +463,12 @@ "Accept": "application/json", "api-key": "00000000-0000-0000-0000-000000000000", "Connection": "close", - "Content-Length": "5871", + "Content-Length": "5875", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "4ab00b95-33a2-4106-807d-7818f0f8a8cf", + "x-ms-client-request-id": "8f6d6e3c-3bf7-4988-8391-bc59eb52d513", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -483,7 +486,7 @@ "content": "", "function_call": { "name": "CreateFileAndSaveText", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022,\n\u0022text\u0022: \u0022Hello, World!\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022,\n \u0022text\u0022: \u0022Hello, World!\u0022\n}" }, "role": "assistant" }, @@ -880,46 +883,44 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "643b814a-48df-4577-9809-514f79158795", - "azureml-model-session": "d029-20240123045238", + "apim-request-id": "d9e04ab9-bba5-4657-9d41-cb7a0dca7b00", + "azureml-model-session": "d031-20240123065239", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Mon, 12 Feb 2024 01:10:06 GMT", + "Date": "Fri, 16 Feb 2024 07:24:58 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "4ab00b95-33a2-4106-807d-7818f0f8a8cf", + "x-ms-client-request-id": "8f6d6e3c-3bf7-4988-8391-bc59eb52d513", "x-ms-region": "East US 2", "x-ratelimit-remaining-requests": "48", - "x-ratelimit-remaining-tokens": "49968", - "X-Request-ID": "ce7af39b-32e4-4c28-9abb-28dda3463237" + "x-ratelimit-remaining-tokens": "49952", + "X-Request-ID": "9b6623e5-9bea-47dd-85a8-10957af2a75b" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022I\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 have\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 successfully\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 created\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 named\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 with\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022:\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7ezW0CN1loi2QHeEHgMmvKkhx1\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700206,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022I\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 have\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 created\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 named\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 with\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] }, @@ -930,12 +931,12 @@ "Accept": "application/json", "api-key": "00000000-0000-0000-0000-000000000000", "Connection": "close", - "Content-Length": "6080", + "Content-Length": "6070", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "4f24f85d-63c3-466f-8a93-e2c8d2f21ca1", + "x-ms-client-request-id": "1337ba00-c464-4bb4-8270-fabd726bf88c", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -953,7 +954,7 @@ "content": "", "function_call": { "name": "CreateFileAndSaveText", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022,\n\u0022text\u0022: \u0022Hello, World!\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022,\n \u0022text\u0022: \u0022Hello, World!\u0022\n}" }, "role": "assistant" }, @@ -963,7 +964,7 @@ "role": "function" }, { - "content": "I have successfully created a file named \u0022test.txt\u0022 with the content: \u0022Hello, World!\u0022.", + "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.", "role": "assistant" }, { @@ -1358,27 +1359,27 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "857c90d0-0ff9-4912-8d96-c912d0b6e545", - "azureml-model-session": "d030-20240123055055", + "apim-request-id": "298d0078-3018-4c63-b05f-8dba7eda968b", + "azureml-model-session": "d032-20240123075009", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Mon, 12 Feb 2024 01:10:07 GMT", + "Date": "Fri, 16 Feb 2024 07:24:59 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "4f24f85d-63c3-466f-8a93-e2c8d2f21ca1", + "x-ms-client-request-id": "1337ba00-c464-4bb4-8270-fabd726bf88c", "x-ms-region": "East US 2", "x-ratelimit-remaining-requests": "47", - "x-ratelimit-remaining-tokens": "49952", - "X-Request-ID": "cf7f314a-60c3-4e77-920d-4188d2671610" + "x-ratelimit-remaining-tokens": "49936", + "X-Request-ID": "822a0ed0-e4f7-4525-b303-72137dfc91ad" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7feDnoDe2GVIUMVFv0KEUxSO2U\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700207,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022FindAllFilesInCurrentDirectory\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7feDnoDe2GVIUMVFv0KEUxSO2U\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700207,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7feDnoDe2GVIUMVFv0KEUxSO2U\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700207,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsd3prB1yAKAF1GdANEEitkZAyY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068299,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022FindAllFilesInCurrentDirectory\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsd3prB1yAKAF1GdANEEitkZAyY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068299,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsd3prB1yAKAF1GdANEEitkZAyY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068299,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] }, @@ -1389,12 +1390,12 @@ "Accept": "application/json", "api-key": "00000000-0000-0000-0000-000000000000", "Connection": "close", - "Content-Length": "6272", + "Content-Length": "6262", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "4c127a58-999b-4025-b339-2a42ba28d5d5", + "x-ms-client-request-id": "e0fca20c-940b-460b-b8e8-b408d197fe4c", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -1412,7 +1413,7 @@ "content": "", "function_call": { "name": "CreateFileAndSaveText", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022,\n\u0022text\u0022: \u0022Hello, World!\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022,\n \u0022text\u0022: \u0022Hello, World!\u0022\n}" }, "role": "assistant" }, @@ -1422,7 +1423,7 @@ "role": "function" }, { - "content": "I have successfully created a file named \u0022test.txt\u0022 with the content: \u0022Hello, World!\u0022.", + "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.", "role": "assistant" }, { @@ -1830,37 +1831,38 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "0afb79f5-cc14-4040-bc35-4bd88714c0ba", - "azureml-model-session": "d026-20240123015022", + "apim-request-id": "24ba9fef-4493-4587-908d-10b79a391a73", + "azureml-model-session": "d027-20240123024829", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Mon, 12 Feb 2024 01:10:08 GMT", + "Date": "Fri, 16 Feb 2024 07:25:00 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "4c127a58-999b-4025-b339-2a42ba28d5d5", + "x-ms-client-request-id": "e0fca20c-940b-460b-b8e8-b408d197fe4c", "x-ms-region": "East US 2", "x-ratelimit-remaining-requests": "46", - "x-ratelimit-remaining-tokens": "49936", - "X-Request-ID": "1c14ef2a-eed9-4f11-b103-45c9cac6551d" + "x-ratelimit-remaining-tokens": "49920", + "X-Request-ID": "751270d6-a6ef-40f1-bd9b-76f07a9473fa" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 current\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 directory\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 contains\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 following\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022:\\n\\n\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022-\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7gr3Uj6kK8Ku04UpWuooGWuvgq\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700208,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 only\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 current\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 directory\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] }, @@ -1871,12 +1873,12 @@ "Accept": "application/json", "api-key": "00000000-0000-0000-0000-000000000000", "Connection": "close", - "Content-Length": "6451", + "Content-Length": "6440", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "0976aee5-4a3c-4bd0-b18e-ba7a0654f599", + "x-ms-client-request-id": "6087aa84-7e9e-477a-beca-83fcebbfca00", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -1894,7 +1896,7 @@ "content": "", "function_call": { "name": "CreateFileAndSaveText", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022,\n\u0022text\u0022: \u0022Hello, World!\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022,\n \u0022text\u0022: \u0022Hello, World!\u0022\n}" }, "role": "assistant" }, @@ -1904,7 +1906,7 @@ "role": "function" }, { - "content": "I have successfully created a file named \u0022test.txt\u0022 with the content: \u0022Hello, World!\u0022.", + "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.", "role": "assistant" }, { @@ -1925,7 +1927,7 @@ "role": "function" }, { - "content": "The current directory contains the following file:\n\n- test.txt", + "content": "The only file in the current directory is \u0022test.txt\u0022.", "role": "assistant" }, { @@ -2320,35 +2322,36 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "12bc472d-3d78-4027-8c99-ddd1b99407e9", - "azureml-model-session": "d030-20240123055055", + "apim-request-id": "0b27c083-5de7-41cf-ab69-2326f6ffaa6a", + "azureml-model-session": "d033-20240123084552", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Mon, 12 Feb 2024 01:10:10 GMT", + "Date": "Fri, 16 Feb 2024 07:25:01 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "0976aee5-4a3c-4bd0-b18e-ba7a0654f599", + "x-ms-client-request-id": "6087aa84-7e9e-477a-beca-83fcebbfca00", "x-ms-region": "East US 2", "x-ratelimit-remaining-requests": "45", - "x-ratelimit-remaining-tokens": "49920", - "X-Request-ID": "da56421e-e3bb-4ee7-8b07-59f5fea91cfe" + "x-ratelimit-remaining-tokens": "49904", + "X-Request-ID": "8bd62cea-0767-4184-afd0-eb060c70b140" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022ReadTextFromFile\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7heVtrhjleky8wB2ToQqDA0CQ6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700209,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022ReadTextFromFile\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] }, @@ -2359,12 +2362,12 @@ "Accept": "application/json", "api-key": "00000000-0000-0000-0000-000000000000", "Connection": "close", - "Content-Length": "6664", + "Content-Length": "6655", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "ae086017-8c1a-4c2c-a282-9842542f75f0", + "x-ms-client-request-id": "175259e2-c460-42de-b360-2d0b49bb31d8", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -2382,7 +2385,7 @@ "content": "", "function_call": { "name": "CreateFileAndSaveText", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022,\n\u0022text\u0022: \u0022Hello, World!\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022,\n \u0022text\u0022: \u0022Hello, World!\u0022\n}" }, "role": "assistant" }, @@ -2392,7 +2395,7 @@ "role": "function" }, { - "content": "I have successfully created a file named \u0022test.txt\u0022 with the content: \u0022Hello, World!\u0022.", + "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.", "role": "assistant" }, { @@ -2413,7 +2416,7 @@ "role": "function" }, { - "content": "The current directory contains the following file:\n\n- test.txt", + "content": "The only file in the current directory is \u0022test.txt\u0022.", "role": "assistant" }, { @@ -2424,7 +2427,7 @@ "content": "", "function_call": { "name": "ReadTextFromFile", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022\n}" }, "role": "assistant" }, @@ -2821,42 +2824,41 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "5aae612f-a2d7-44ba-8a11-56711cea21dd", - "azureml-model-session": "d026-20240123015022", + "apim-request-id": "f464ea1a-136e-4fef-9d91-d4aaf4c2e6de", + "azureml-model-session": "d029-20240123045238", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Mon, 12 Feb 2024 01:10:10 GMT", + "Date": "Fri, 16 Feb 2024 07:25:04 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "ae086017-8c1a-4c2c-a282-9842542f75f0", + "x-ms-client-request-id": "175259e2-c460-42de-b360-2d0b49bb31d8", "x-ms-region": "East US 2", "x-ratelimit-remaining-requests": "44", - "x-ratelimit-remaining-tokens": "49904", - "X-Request-ID": "dceef7f6-2edb-426e-9000-42069f524faf" + "x-ratelimit-remaining-tokens": "49888", + "X-Request-ID": "e2bb4666-f74c-451d-ab21-6a11f45343f1" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022:\\n\\n\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7irTTyHsTrK6ysgGp6qcar2pt2\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700210,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] }, @@ -2867,12 +2869,12 @@ "Accept": "application/json", "api-key": "00000000-0000-0000-0000-000000000000", "Connection": "close", - "Content-Length": "6810", + "Content-Length": "6798", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "f3a84544-ec93-44f4-86f6-efbca77b825a", + "x-ms-client-request-id": "b4a06586-5d86-4f9c-83b9-b1dbe5eb89df", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -2890,7 +2892,7 @@ "content": "", "function_call": { "name": "CreateFileAndSaveText", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022,\n\u0022text\u0022: \u0022Hello, World!\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022,\n \u0022text\u0022: \u0022Hello, World!\u0022\n}" }, "role": "assistant" }, @@ -2900,7 +2902,7 @@ "role": "function" }, { - "content": "I have successfully created a file named \u0022test.txt\u0022 with the content: \u0022Hello, World!\u0022.", + "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.", "role": "assistant" }, { @@ -2921,7 +2923,7 @@ "role": "function" }, { - "content": "The current directory contains the following file:\n\n- test.txt", + "content": "The only file in the current directory is \u0022test.txt\u0022.", "role": "assistant" }, { @@ -2932,7 +2934,7 @@ "content": "", "function_call": { "name": "ReadTextFromFile", - "arguments": "{\n\u0022fileName\u0022: \u0022test.txt\u0022\n}" + "arguments": "{\n \u0022fileName\u0022: \u0022test.txt\u0022\n}" }, "role": "assistant" }, @@ -2942,7 +2944,7 @@ "role": "function" }, { - "content": "The content of the file \u0022test.txt\u0022 is:\n\n\u0022Hello, World!\u0022", + "content": "The content of the file \u0022test.txt\u0022 is \u0022Hello, World!\u0022.", "role": "assistant" }, { @@ -3337,33 +3339,35 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "0cac8ba8-1acf-4cfe-a1ec-c31fb783d572", - "azureml-model-session": "d030-20240123055055", + "apim-request-id": "8130c8fc-122b-4371-9eaf-60b1e1b87405", + "azureml-model-session": "d034-20240123094448", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Mon, 12 Feb 2024 01:10:11 GMT", + "Date": "Fri, 16 Feb 2024 07:25:05 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "f3a84544-ec93-44f4-86f6-efbca77b825a", + "x-ms-client-request-id": "b4a06586-5d86-4f9c-83b9-b1dbe5eb89df", "x-ms-region": "East US 2", "x-ratelimit-remaining-requests": "43", - "x-ratelimit-remaining-tokens": "49888", - "X-Request-ID": "1aa76dea-fbe6-4cf4-bd32-509a2739e34a" + "x-ratelimit-remaining-tokens": "49872", + "X-Request-ID": "f292b865-8dd4-4e5b-bf5b-1e08e3b0e4c6" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022How\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 can\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 I\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 assist\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 further\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022?\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rF7jXvoPTlkKDmAL0q7Icj9zTxcY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707700211,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Sure\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 how\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 can\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 I\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 assist\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 further\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022?\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] } diff --git a/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat.json b/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat.json index 761716b4..89e22d8b 100644 --- a/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat.json +++ b/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat.json @@ -1,5 +1,36 @@ { "Entries": [ + { + "RequestUri": "https://fakeendpoint/v2/track", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "Accept-Encoding": "identity", + "Connection": "close", + "Content-Length": "3760", + "Content-Type": "application/json; charset=utf-8", + "User-Agent": "Python-urllib/3.11", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u00222024-02-16T07:24:46.393700Z\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022c4395b75-49cc-422c-bc95-c7d51aef5d46\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u0022746b492f-cc9c-11ee-a5cb-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-16 07:24:45.115307\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.522324\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00221.587796\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,-g,-n\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account keys list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-16 07:24:43.521668\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u0022abdaaf7a-af4a-4d8d-84cf-b2f7f2cbdcb3\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-keys-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u00225087c173-0210-478d-a6ad-40ae2188d53b\u0022, \u0022Reserved.SessionId\u0022: \u00225da58b0aa1f88b6410247c69135590e89bf4f4adca0efc4a7c63d20b7cd34b84\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", + "StatusCode": 200, + "ResponseHeaders": { + "Connection": "close", + "Content-Length": "49", + "Content-Type": "application/json; charset=utf-8", + "Date": "Fri, 16 Feb 2024 07:24:46 GMT", + "Server": "Microsoft-HTTPAPI/2.0", + "Strict-Transport-Security": "max-age=31536000", + "X-Content-Type-Options": "nosniff" + }, + "ResponseBody": { + "itemsReceived": 1, + "itemsAccepted": 1, + "errors": [] + } + }, { "RequestUri": "https://fakeendpoint/openai/deployments/gpt-4-32k-0613/chat/completions?api-version=2023-12-01-preview", "RequestMethod": "POST", @@ -9,10 +40,10 @@ "Connection": "close", "Content-Length": "294", "Content-Type": "application/json", - "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.12 (.NET 8.0.1; Microsoft Windows 10.0.22631)", + "User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "3b21c0c4-786a-4d7b-be1d-5c7645ed1e29", + "x-ms-client-request-id": "d7d723e9-b369-443a-ae0a-82b618096627", "x-ms-return-client-request-id": "true", "X-Real-IP": "127.0.0.1" }, @@ -36,135 +67,136 @@ "StatusCode": 200, "ResponseHeaders": { "Access-Control-Allow-Origin": "*", - "apim-request-id": "b5889518-27a9-42f6-adc4-3a388b7426e5", - "azureml-model-session": "d027-20240123024829", + "apim-request-id": "79b5bd0d-2e7e-4545-91ef-650439817d2e", + "azureml-model-session": "d030-20240123055055", "Cache-Control": "must-revalidate, no-cache", "Connection": "close", "Content-Type": "text/event-stream", - "Date": "Sun, 11 Feb 2024 22:47:00 GMT", + "Date": "Fri, 16 Feb 2024 07:24:47 GMT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "chunked", "x-accel-buffering": "no", "X-Content-Type-Options": "nosniff", - "x-ms-client-request-id": "3b21c0c4-786a-4d7b-be1d-5c7645ed1e29", + "x-ms-client-request-id": "d7d723e9-b369-443a-ae0a-82b618096627", "x-ms-region": "East US 2", "x-ratelimit-remaining-requests": "49", "x-ratelimit-remaining-tokens": "49984", - "X-Request-ID": "77d980f5-dd73-48eb-b627-6b6e59e3bf11" + "X-Request-ID": "abcfb32e-ba4c-47a2-86e6-772803cdd237" }, "ResponseBody": [ "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 appears\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 because\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 process\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 called\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Ray\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022leigh\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattering\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 As\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 moves\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 through\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 atmosphere\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 most\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 longer\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelengths\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 pass\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 straight\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 through\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Little\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 red\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 orange\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 yellow\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 affected\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 by\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 air\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 However\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 much\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 shorter\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelength\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 absorbed\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 by\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 gas\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 molecules\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 absorbed\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 then\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 radi\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022ated\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 different\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 directions\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 It\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 gets\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattered\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 all\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 around\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Wh\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022ichever\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 direction\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 look\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 some\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 this\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattered\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 reaches\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Since\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 see\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 from\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 everywhere\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 overhead\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 looks\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", - "data: {\u0022id\u0022:\u0022chatcmpl-8rCtBcsyrGLbBiFO4bdA1W8Azo742\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1707691621,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 appears\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 because\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 process\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 called\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Ray\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022leigh\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattering\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 As\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 moves\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 through\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 atmosphere\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 most\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 longer\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelengths\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 pass\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 straight\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 through\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Little\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 red\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 orange\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 and\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 yellow\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 affected\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 by\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 air\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\n\\n\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022However\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 much\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 shorter\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 wavelength\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 absorbed\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 by\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 gas\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 molecules\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 absorbed\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 then\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 radi\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022ated\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 different\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 directions\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 It\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 gets\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattered\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 all\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 around\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Wh\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022ichever\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 direction\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 look\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 some\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 this\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 scattered\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 reaches\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 Since\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 see\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 light\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 from\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 everywhere\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 overhead\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 sky\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 looks\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 blue\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n", + "data: {\u0022id\u0022:\u0022chatcmpl-8smsR0L8qEwOKJhVoywzb5hKmWvhT\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068287,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n", "data: [DONE]\n\n" ] } diff --git a/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init openai.json b/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init openai.json index 8b44f2c6..9d3bb8ff 100644 --- a/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init openai.json +++ b/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init openai.json @@ -13,7 +13,7 @@ "User-Agent": "AZURECLI/2.57.0 (MSI) azsdk-python-mgmt-cognitiveservices/13.5.0 Python/3.11.7 (Windows-10-10.0.22631-SP0) ai-cli 0.0.1", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "692db08a-c943-11ee-a5c9-c8d9d2049b34", + "x-ms-client-request-id": "63a7a201-cc9c-11ee-b6aa-c8d9d2049b34", "X-Real-IP": "127.0.0.1" }, "RequestBody": null, @@ -23,32 +23,32 @@ "Connection": "close", "Content-Length": "769472", "Content-Type": "application/json; charset=utf-8", - "Date": "Mon, 12 Feb 2024 01:09:47 GMT", + "Date": "Fri, 16 Feb 2024 07:24:17 GMT", "Expires": "-1", "Pragma": "no-cache", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Cache": "CONFIG_NOCACHE", "X-Content-Type-Options": "nosniff", - "x-ms-correlation-request-id": "8563c67b-5d5c-43b1-9b74-0adc433f773a", + "x-ms-correlation-request-id": "6fa2f7a4-d265-4290-b027-b787954a57c5", "x-ms-original-request-ids": [ - "232f35c1-6681-47b8-bcb5-7bf1340ca68a", - "f25b0776-c12d-4965-95c1-44b22d5e3e50", - "dbbcb839-e75a-4f58-abed-3e7786c294e8", - "e2c66f16-b3ef-4a71-b69d-22f91fd626a7", - "a9a05073-ea0b-416a-a5d0-154e485825b0", - "80bc58fe-d62f-47ec-b31e-b3c902ddb117", - "b6bc4f81-5238-4a5c-9dcc-efc04346bb34", - "725313ff-93fd-4369-9935-3d9d0844da8f", - "dc0b14d9-8959-46b8-8183-d325bb22ccd5", - "95919038-27e8-4772-a7e4-d0f55dfbb8f6", - "273ea288-16d9-4057-a39d-c312d9d878cb", - "60423092-3dbb-4dce-b6e3-18f5c50c7965", - "257201df-92f6-4b4b-9bf2-f7e3c4226c02" + "feff1fea-92a8-4d19-99ba-1563de1460dc", + "5c54b1e0-2138-4a98-9abc-c831053db552", + "451d7833-bb63-45f7-834b-3f8defa94dd7", + "4f4615a9-334a-478b-8a39-b556a489aa44", + "1ea88f67-cf73-4a52-a0b5-22b00ea14308", + "3e2eb609-95ea-473c-b841-94329673312a", + "82bb7642-f038-4329-affb-dc2e891d819b", + "9b0c0fa1-d595-42e2-aaf9-40e9079618ad", + "6d59babe-7b29-4afe-adba-ce6d676f073b", + "8b1ffadc-68a9-4814-96a4-174ced1fcc43", + "69e3b7b6-9a29-41d3-bdec-7d55898d3b95", + "59eeaeed-2871-4655-b52f-f2bf2b4dd61e", + "bbae3061-167a-4a38-b041-d86016438115" ], "x-ms-ratelimit-remaining-subscription-reads": "11999", - "x-ms-request-id": "8563c67b-5d5c-43b1-9b74-0adc433f773a", - "x-ms-routing-request-id": "WESTUS2:20240212T010948Z:8563c67b-5d5c-43b1-9b74-0adc433f773a", - "X-MSEdge-Ref": "Ref A: 47BD9041BC5D4E569E294D017DFC5DDF Ref B: CO6AA3150218017 Ref C: 2024-02-12T01:09:47Z" + "x-ms-request-id": "6fa2f7a4-d265-4290-b027-b787954a57c5", + "x-ms-routing-request-id": "WESTUS2:20240216T072418Z:6fa2f7a4-d265-4290-b027-b787954a57c5", + "X-MSEdge-Ref": "Ref A: BB4CED1E7B484ACAB28EB7640B77CF5A Ref B: CO6AA3150219025 Ref C: 2024-02-16T07:24:16Z" }, "ResponseBody": { "value": [ @@ -4136,7 +4136,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -4697,7 +4697,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -4829,7 +4829,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -17785,7 +17785,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -17913,7 +17913,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -22665,7 +22665,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -22793,7 +22793,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -23229,7 +23229,7 @@ "id": "/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/ralphe-sthcntrls-oai-rg/providers/Microsoft.CognitiveServices/accounts/ralphe-sthcntrls-oai-ai-aiservices", "name": "ralphe-sthcntrls-oai-ai-aiservices", "type": "Microsoft.CognitiveServices/accounts", - "etag": "\u002240012ab0-0000-0500-0000-65a9ce690000\u0022", + "etag": "\u002220007f26-0000-0500-0000-65ce61480000\u0022", "location": "southcentralus", "sku": { "name": "S0" @@ -25587,7 +25587,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -25713,7 +25713,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -25840,7 +25840,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -25967,7 +25967,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -26095,7 +26095,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -26867,7 +26867,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -31809,7 +31809,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -33644,7 +33644,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -33771,7 +33771,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -33900,7 +33900,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -34035,7 +34035,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35272,7 +35272,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35826,7 +35826,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35953,7 +35953,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35989,7 +35989,7 @@ "id": "/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/ralphe-test-20230810/providers/Microsoft.CognitiveServices/accounts/ralphe-test-azure-ai-eastus2-aiservices", "name": "ralphe-test-azure-ai-eastus2-aiservices", "type": "Microsoft.CognitiveServices/accounts", - "etag": "\u00229d011ec5-0000-0200-0000-659e40670000\u0022", + "etag": "\u0022040028ac-0000-0200-0000-65ceb22a0000\u0022", "location": "eastus2", "sku": { "name": "S0" @@ -36933,7 +36933,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -39621,7 +39621,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -39754,7 +39754,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -40043,7 +40043,7 @@ "id": "/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/openai-test-rg/providers/Microsoft.CognitiveServices/accounts/openai-sdk-test-automation-account-sweden-central", "name": "openai-sdk-test-automation-account-sweden-central", "type": "Microsoft.CognitiveServices/accounts", - "etag": "\u00220300d879-0000-4700-0000-65c3f8a80000\u0022", + "etag": "\u00221c0000e2-0000-4700-0000-65cadb790000\u0022", "location": "swedencentral", "sku": { "name": "S0" @@ -40140,7 +40140,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -40268,7 +40268,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -40395,7 +40395,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -41377,7 +41377,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -42068,6 +42068,37 @@ ] } }, + { + "RequestUri": "https://fakeendpoint/v2/track", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "Accept-Encoding": "identity", + "Connection": "close", + "Content-Length": "3729", + "Content-Type": "application/json; charset=utf-8", + "User-Agent": "Python-urllib/3.11", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u002263a7a201-cc9c-11ee-b6aa-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-16 07:24:18.927661\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00222.006823\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00223.535696\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,--resource-group,--query\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-16 07:24:15.391885\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u0022a82cf558-4048-41c0-ab2f-75b798be10a0\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u00220346f699-4b71-4580-9fe2-ca72683b10a6\u0022, \u0022Reserved.SessionId\u0022: \u00228cc8aacb01982c9f2a6c84090277e579d2e59ec0abafd7ade56e3d3223ab715f\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", + "StatusCode": 200, + "ResponseHeaders": { + "Connection": "close", + "Content-Length": "49", + "Content-Type": "application/json; charset=utf-8", + "Date": "Fri, 16 Feb 2024 07:24:20 GMT", + "Server": "Microsoft-HTTPAPI/2.0", + "Strict-Transport-Security": "max-age=31536000", + "X-Content-Type-Options": "nosniff" + }, + "ResponseBody": { + "itemsReceived": 1, + "itemsAccepted": 1, + "errors": [] + } + }, { "RequestUri": "https://fakeendpoint/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/robch-eastus2-rg/providers/Microsoft.CognitiveServices/accounts/robch-oai-eastus2/deployments?api-version=2023-05-01", "RequestMethod": "GET", @@ -42081,7 +42112,7 @@ "User-Agent": "AZURECLI/2.57.0 (MSI) azsdk-python-mgmt-cognitiveservices/13.5.0 Python/3.11.7 (Windows-10-10.0.22631-SP0) ai-cli 0.0.1", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "6c6d883d-c943-11ee-be9d-c8d9d2049b34", + "x-ms-client-request-id": "673ddc1a-cc9c-11ee-8ad7-c8d9d2049b34", "X-Real-IP": "127.0.0.1" }, "RequestBody": null, @@ -42091,18 +42122,18 @@ "Connection": "close", "Content-Length": "2827", "Content-Type": "application/json; charset=utf-8", - "Date": "Mon, 12 Feb 2024 01:09:51 GMT", + "Date": "Fri, 16 Feb 2024 07:24:22 GMT", "Expires": "-1", "Pragma": "no-cache", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Cache": "CONFIG_NOCACHE", "X-Content-Type-Options": "nosniff", - "x-envoy-upstream-service-time": "7", - "x-ms-correlation-request-id": "44c6203d-b2ed-42c5-b3dd-fc8d21a027ef", + "x-envoy-upstream-service-time": "8", + "x-ms-correlation-request-id": "9c3db1db-4b58-455c-874c-777dfdc65dbb", "x-ms-ratelimit-remaining-subscription-reads": "11999", - "x-ms-request-id": "f5eded89-c68b-4f46-9579-b8413214308e", - "x-ms-routing-request-id": "WESTUS2:20240212T010952Z:44c6203d-b2ed-42c5-b3dd-fc8d21a027ef", - "X-MSEdge-Ref": "Ref A: 69B7373DCF9148F9B6641FA85462ECC2 Ref B: CO6AA3150220045 Ref C: 2024-02-12T01:09:52Z" + "x-ms-request-id": "dc128ec7-e267-4215-a09e-77f5620a87a1", + "x-ms-routing-request-id": "WESTUS2:20240216T072423Z:9c3db1db-4b58-455c-874c-777dfdc65dbb", + "X-MSEdge-Ref": "Ref A: A8F6F6F329AF4CAEB75327E4E971A418 Ref B: CO6AA3150220053 Ref C: 2024-02-16T07:24:22Z" }, "ResponseBody": { "value": [ @@ -42251,13 +42282,13 @@ "X-Forwarded-Proto": "https", "X-Real-IP": "127.0.0.1" }, - "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u00226c6d883d-c943-11ee-be9d-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-12 01:09:52.905245\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.088778\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00221.490777\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,-g,-n,--query\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account deployment list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-12 01:09:51.414350\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022a18897a6-7e44-457d-9260-f2854c0aca42\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u00227d3e28e3-9ff5-40a8-9715-695ad2909260\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-deployment-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u002266b08450-4c22-42d9-a08a-24810f20d06c\u0022, \u0022Reserved.SessionId\u0022: \u0022e6a240fa59b64d77c5d8ab8c583d455a616ae6cc3104c7b2bfd5194d180c265e\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", + "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u0022673ddc1a-cc9c-11ee-8ad7-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-16 07:24:23.377724\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.729693\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00221.967136\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,-g,-n,--query\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account deployment list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-16 07:24:21.410688\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u00220436f0da-24a6-434e-8c5e-703461863b84\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-deployment-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u0022b65cda40-9822-4239-9d0b-7771be0dbcec\u0022, \u0022Reserved.SessionId\u0022: \u002250d70b9512beb320a39cc0a907be49c66ea2c63da5103c33af06dbf1decf64ff\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", "StatusCode": 200, "ResponseHeaders": { "Connection": "close", "Content-Length": "49", "Content-Type": "application/json; charset=utf-8", - "Date": "Mon, 12 Feb 2024 01:09:53 GMT", + "Date": "Fri, 16 Feb 2024 07:24:24 GMT", "Server": "Microsoft-HTTPAPI/2.0", "Strict-Transport-Security": "max-age=31536000", "X-Content-Type-Options": "nosniff" @@ -42281,7 +42312,7 @@ "User-Agent": "AZURECLI/2.57.0 (MSI) azsdk-python-mgmt-cognitiveservices/13.5.0 Python/3.11.7 (Windows-10-10.0.22631-SP0) ai-cli 0.0.1", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "6e4b35e5-c943-11ee-8c70-c8d9d2049b34", + "x-ms-client-request-id": "699a0068-cc9c-11ee-b23e-c8d9d2049b34", "X-Real-IP": "127.0.0.1" }, "RequestBody": null, @@ -42291,18 +42322,18 @@ "Connection": "close", "Content-Length": "2827", "Content-Type": "application/json; charset=utf-8", - "Date": "Mon, 12 Feb 2024 01:09:55 GMT", + "Date": "Fri, 16 Feb 2024 07:24:26 GMT", "Expires": "-1", "Pragma": "no-cache", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Cache": "CONFIG_NOCACHE", "X-Content-Type-Options": "nosniff", - "x-envoy-upstream-service-time": "7", - "x-ms-correlation-request-id": "ef7ec0af-b059-4bd8-b8e6-d0d0a2434424", + "x-envoy-upstream-service-time": "8", + "x-ms-correlation-request-id": "3b11ce68-022c-41f2-9501-222871b51b4f", "x-ms-ratelimit-remaining-subscription-reads": "11999", - "x-ms-request-id": "a666fbcb-b069-438f-ba0f-1e1ed88baa3a", - "x-ms-routing-request-id": "WESTUS2:20240212T010955Z:ef7ec0af-b059-4bd8-b8e6-d0d0a2434424", - "X-MSEdge-Ref": "Ref A: 00627393BB51460D80BE52E1BB18CFC6 Ref B: CO6AA3150218049 Ref C: 2024-02-12T01:09:55Z" + "x-ms-request-id": "08cef527-5024-4a02-8e70-727f820f4eb9", + "x-ms-routing-request-id": "WESTUS2:20240216T072426Z:3b11ce68-022c-41f2-9501-222871b51b4f", + "X-MSEdge-Ref": "Ref A: CAA366A47EB743B59BF1D495E7B21C1A Ref B: CO6AA3150220025 Ref C: 2024-02-16T07:24:26Z" }, "ResponseBody": { "value": [ @@ -42437,6 +42468,37 @@ ] } }, + { + "RequestUri": "https://fakeendpoint/v2/track", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "Accept-Encoding": "identity", + "Connection": "close", + "Content-Length": "3740", + "Content-Type": "application/json; charset=utf-8", + "User-Agent": "Python-urllib/3.11", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u0022699a0068-cc9c-11ee-b23e-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-16 07:24:27.077708\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.459913\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00221.713255\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,-g,-n,--query\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account deployment list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-16 07:24:25.372369\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u002282386e2f-e84b-4fae-9118-a0d951dc936e\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-deployment-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u00224aad723e-2fd3-4626-bb9d-95bc65a80475\u0022, \u0022Reserved.SessionId\u0022: \u002250d70b9512beb320a39cc0a907be49c66ea2c63da5103c33af06dbf1decf64ff\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", + "StatusCode": 200, + "ResponseHeaders": { + "Connection": "close", + "Content-Length": "49", + "Content-Type": "application/json; charset=utf-8", + "Date": "Fri, 16 Feb 2024 07:24:28 GMT", + "Server": "Microsoft-HTTPAPI/2.0", + "Strict-Transport-Security": "max-age=31536000", + "X-Content-Type-Options": "nosniff" + }, + "ResponseBody": { + "itemsReceived": 1, + "itemsAccepted": 1, + "errors": [] + } + }, { "RequestUri": "https://fakeendpoint/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/robch-eastus2-rg/providers/Microsoft.CognitiveServices/accounts/robch-oai-eastus2/deployments?api-version=2023-05-01", "RequestMethod": "GET", @@ -42450,7 +42512,7 @@ "User-Agent": "AZURECLI/2.57.0 (MSI) azsdk-python-mgmt-cognitiveservices/13.5.0 Python/3.11.7 (Windows-10-10.0.22631-SP0) ai-cli 0.0.1", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "7041ed6d-c943-11ee-a8e0-c8d9d2049b34", + "x-ms-client-request-id": "6be4d482-cc9c-11ee-aad7-c8d9d2049b34", "X-Real-IP": "127.0.0.1" }, "RequestBody": null, @@ -42460,18 +42522,18 @@ "Connection": "close", "Content-Length": "2827", "Content-Type": "application/json; charset=utf-8", - "Date": "Mon, 12 Feb 2024 01:09:58 GMT", + "Date": "Fri, 16 Feb 2024 07:24:30 GMT", "Expires": "-1", "Pragma": "no-cache", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Cache": "CONFIG_NOCACHE", "X-Content-Type-Options": "nosniff", - "x-envoy-upstream-service-time": "7", - "x-ms-correlation-request-id": "03dc462e-872e-4a1f-b283-ff0fd6fdbdf1", + "x-envoy-upstream-service-time": "8", + "x-ms-correlation-request-id": "94845e47-fb49-445a-a5f6-4a9302fca92a", "x-ms-ratelimit-remaining-subscription-reads": "11999", - "x-ms-request-id": "7f4d3fb2-0520-4a1d-a7e8-4ded3749b8e0", - "x-ms-routing-request-id": "WESTUS2:20240212T010959Z:03dc462e-872e-4a1f-b283-ff0fd6fdbdf1", - "X-MSEdge-Ref": "Ref A: DF397B9564854938AED18AD5A7BE7A62 Ref B: CO6AA3150217009 Ref C: 2024-02-12T01:09:58Z" + "x-ms-request-id": "a51e8d4a-4584-45c0-8653-e0304daa5b4b", + "x-ms-routing-request-id": "WESTUS2:20240216T072430Z:94845e47-fb49-445a-a5f6-4a9302fca92a", + "X-MSEdge-Ref": "Ref A: B651F776B6DC460787AE4DC44ADACC55 Ref B: CO6AA3150219017 Ref C: 2024-02-16T07:24:30Z" }, "ResponseBody": { "value": [ @@ -42620,13 +42682,13 @@ "X-Forwarded-Proto": "https", "X-Real-IP": "127.0.0.1" }, - "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u00227041ed6d-c943-11ee-a8e0-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-12 01:09:59.525001\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.029195\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00221.687036\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,-g,-n,--query\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account deployment list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-12 01:09:57.837472\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022a18897a6-7e44-457d-9260-f2854c0aca42\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u0022d1dd9f14-4d09-4efe-b05c-89d167fddd5d\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-deployment-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u0022058d9031-0a54-4c92-bfe6-f7bdd28b22a3\u0022, \u0022Reserved.SessionId\u0022: \u0022e6a240fa59b64d77c5d8ab8c583d455a616ae6cc3104c7b2bfd5194d180c265e\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", + "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u00226be4d482-cc9c-11ee-aad7-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-16 07:24:31.036446\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.504034\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00221.821527\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,-g,-n,--query\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account deployment list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-16 07:24:29.218726\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u0022e0019505-3507-4ddd-ab9f-ecb7cbf9afb7\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-deployment-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u002229857ed9-603a-446e-950e-a2b00d3f1718\u0022, \u0022Reserved.SessionId\u0022: \u002250d70b9512beb320a39cc0a907be49c66ea2c63da5103c33af06dbf1decf64ff\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", "StatusCode": 200, "ResponseHeaders": { "Connection": "close", "Content-Length": "49", "Content-Type": "application/json; charset=utf-8", - "Date": "Mon, 12 Feb 2024 01:10:00 GMT", + "Date": "Fri, 16 Feb 2024 07:24:31 GMT", "Server": "Microsoft-HTTPAPI/2.0", "Strict-Transport-Security": "max-age=31536000", "X-Content-Type-Options": "nosniff" @@ -42651,7 +42713,7 @@ "User-Agent": "AZURECLI/2.57.0 (MSI) azsdk-python-mgmt-cognitiveservices/13.5.0 Python/3.11.7 (Windows-10-10.0.22631-SP0) ai-cli 0.0.1", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "724254bb-c943-11ee-97b6-c8d9d2049b34", + "x-ms-client-request-id": "6e553cb7-cc9c-11ee-8ec5-c8d9d2049b34", "X-Real-IP": "127.0.0.1" }, "RequestBody": null, @@ -42661,18 +42723,18 @@ "Connection": "close", "Content-Length": "45", "Content-Type": "application/json; charset=utf-8", - "Date": "Mon, 12 Feb 2024 01:10:01 GMT", + "Date": "Fri, 16 Feb 2024 07:24:34 GMT", "Expires": "-1", "Pragma": "no-cache", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Cache": "CONFIG_NOCACHE", "X-Content-Type-Options": "nosniff", - "x-envoy-upstream-service-time": "20", - "x-ms-correlation-request-id": "9e8dd591-cff5-4852-b5d7-aeb76af71aac", + "x-envoy-upstream-service-time": "19", + "x-ms-correlation-request-id": "9dbca84a-d3a2-47ae-b6c2-4240dc4dcd40", "x-ms-ratelimit-remaining-subscription-writes": "1199", - "x-ms-request-id": "38b1e6bf-3ef5-4e9a-a279-44a935771db2", - "x-ms-routing-request-id": "WESTUS2:20240212T011002Z:9e8dd591-cff5-4852-b5d7-aeb76af71aac", - "X-MSEdge-Ref": "Ref A: 6E1836A6E7B64A6E85123452B4468882 Ref B: CO6AA3150217009 Ref C: 2024-02-12T01:10:01Z" + "x-ms-request-id": "7e58504a-0714-412a-b67a-561c690d1416", + "x-ms-routing-request-id": "WESTUS2:20240216T072434Z:9dbca84a-d3a2-47ae-b6c2-4240dc4dcd40", + "X-MSEdge-Ref": "Ref A: 1E2DD5D96AAE46969E9DF96EB376C5B4 Ref B: CO6AA3150220037 Ref C: 2024-02-16T07:24:34Z" }, "ResponseBody": { "key1": "COGSVCSKey1", diff --git a/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init speech.json b/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init speech.json index 6974af16..6fab0a45 100644 --- a/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init speech.json +++ b/tests/recordings/yaml.ai_chat_tests.ai init.TestCases.ai init speech.json @@ -1,5 +1,36 @@ { "Entries": [ + { + "RequestUri": "https://fakeendpoint/v2/track", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "Accept-Encoding": "identity", + "Connection": "close", + "Content-Length": "3720", + "Content-Type": "application/json; charset=utf-8", + "User-Agent": "Python-urllib/3.11", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u00226e553cb7-cc9c-11ee-8ec5-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-16 07:24:34.721386\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.713728\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00221.411393\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,-g,-n\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account keys list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-16 07:24:33.304791\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u00223dc8e32b-6bfa-4e56-b04e-a115aa1e759f\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-keys-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u0022c2d4ea9a-143c-41df-bcff-95ae6c03c879\u0022, \u0022Reserved.SessionId\u0022: \u002250d70b9512beb320a39cc0a907be49c66ea2c63da5103c33af06dbf1decf64ff\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", + "StatusCode": 200, + "ResponseHeaders": { + "Connection": "close", + "Content-Length": "49", + "Content-Type": "application/json; charset=utf-8", + "Date": "Fri, 16 Feb 2024 07:24:35 GMT", + "Server": "Microsoft-HTTPAPI/2.0", + "Strict-Transport-Security": "max-age=31536000", + "X-Content-Type-Options": "nosniff" + }, + "ResponseBody": { + "itemsReceived": 1, + "itemsAccepted": 1, + "errors": [] + } + }, { "RequestUri": "https://fakeendpoint/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/providers/Microsoft.CognitiveServices/accounts?api-version=2023-05-01", "RequestMethod": "GET", @@ -13,7 +44,7 @@ "User-Agent": "AZURECLI/2.57.0 (MSI) azsdk-python-mgmt-cognitiveservices/13.5.0 Python/3.11.7 (Windows-10-10.0.22631-SP0) ai-cli 0.0.1", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "732b7035-c92f-11ee-8469-c8d9d2049b34", + "x-ms-client-request-id": "711cbf25-cc9c-11ee-8800-c8d9d2049b34", "X-Real-IP": "127.0.0.1" }, "RequestBody": null, @@ -23,32 +54,32 @@ "Connection": "close", "Content-Length": "769472", "Content-Type": "application/json; charset=utf-8", - "Date": "Sun, 11 Feb 2024 22:46:54 GMT", + "Date": "Fri, 16 Feb 2024 07:24:39 GMT", "Expires": "-1", "Pragma": "no-cache", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Cache": "CONFIG_NOCACHE", "X-Content-Type-Options": "nosniff", - "x-ms-correlation-request-id": "e5633092-136f-4a3c-8b24-e1064c20423d", + "x-ms-correlation-request-id": "7ac657ae-7743-4e8f-a8fe-6ac2c20a150b", "x-ms-original-request-ids": [ - "948b00c7-d581-4e61-9ed3-e24d77dca6ad", - "9bb4dead-86e1-4d41-b043-1f42ff39bd31", - "63594dfd-5d4c-48d1-ae30-55d1975e33b4", - "bf35264a-f5b7-4152-ad2c-6b0042ff640b", - "47cff1dd-7da4-4f9f-8dc1-5d68cb346c40", - "17f70b7e-93ab-4159-b4f1-a8c84ae5d893", - "82e831bb-7d98-4692-a629-7741398a127e", - "156e3e97-b5a5-41b0-8653-93647bfed9ee", - "17f01be5-8a3c-4a2e-90e6-9d99b2c381a2", - "962a03a0-4a36-4866-9d97-b08fbc68cba5", - "95f72fc6-9250-45c5-8cad-7c938bffb689", - "60132a18-697e-4c67-8d12-3c072e9993b0", - "afcd278f-234b-488c-8f26-c256386454a3" + "81640393-3919-443c-92e5-8493864767d3", + "8a0cb3a0-f9ba-465c-8b11-d94eb5aa4c24", + "2f0d7f41-c7b9-4e5a-b43b-a1a745735d0f", + "5e941e5a-aa48-4aab-a67a-2b1511c374e8", + "dc24f613-0c2f-4036-8583-706dfdfa768d", + "fac14899-3935-4175-9c96-f9dac0f991e8", + "8fb2b6a6-e60d-4e2d-bb70-b1bae297bf72", + "56b3d4e6-116f-40cd-876b-f6be126e18c9", + "fb770104-4d05-42ac-a31c-b06827e14f00", + "57aeb97a-9fe3-45b3-a678-5c86735a03c2", + "098a1421-06f2-4874-87f0-498891f86190", + "2049b1ee-8178-464e-a30a-c21dcc35271b", + "6cdec814-a8dc-4c8e-b703-18bea1adbe68" ], "x-ms-ratelimit-remaining-subscription-reads": "11999", - "x-ms-request-id": "e5633092-136f-4a3c-8b24-e1064c20423d", - "x-ms-routing-request-id": "WESTUS2:20240211T224655Z:e5633092-136f-4a3c-8b24-e1064c20423d", - "X-MSEdge-Ref": "Ref A: B87D42A5B5274265B39B5C3D886D8D92 Ref B: CO6AA3150219053 Ref C: 2024-02-11T22:46:54Z" + "x-ms-request-id": "7ac657ae-7743-4e8f-a8fe-6ac2c20a150b", + "x-ms-routing-request-id": "WESTUS2:20240216T072440Z:7ac657ae-7743-4e8f-a8fe-6ac2c20a150b", + "X-MSEdge-Ref": "Ref A: 3212D732F8404DD3BFA30048E67FCD09 Ref B: CO6AA3150217029 Ref C: 2024-02-16T07:24:39Z" }, "ResponseBody": { "value": [ @@ -4136,7 +4167,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -4697,7 +4728,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -4829,7 +4860,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -17785,7 +17816,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -17913,7 +17944,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -22665,7 +22696,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -22793,7 +22824,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -23229,7 +23260,7 @@ "id": "/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/ralphe-sthcntrls-oai-rg/providers/Microsoft.CognitiveServices/accounts/ralphe-sthcntrls-oai-ai-aiservices", "name": "ralphe-sthcntrls-oai-ai-aiservices", "type": "Microsoft.CognitiveServices/accounts", - "etag": "\u002240012ab0-0000-0500-0000-65a9ce690000\u0022", + "etag": "\u002220007f26-0000-0500-0000-65ce61480000\u0022", "location": "southcentralus", "sku": { "name": "S0" @@ -25587,7 +25618,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -25713,7 +25744,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -25840,7 +25871,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -25967,7 +25998,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -26095,7 +26126,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -26867,7 +26898,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -31809,7 +31840,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -33644,7 +33675,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -33771,7 +33802,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -33900,7 +33931,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -34035,7 +34066,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35272,7 +35303,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35826,7 +35857,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35953,7 +35984,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -35989,7 +36020,7 @@ "id": "/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/ralphe-test-20230810/providers/Microsoft.CognitiveServices/accounts/ralphe-test-azure-ai-eastus2-aiservices", "name": "ralphe-test-azure-ai-eastus2-aiservices", "type": "Microsoft.CognitiveServices/accounts", - "etag": "\u00229d011ec5-0000-0200-0000-659e40670000\u0022", + "etag": "\u0022040028ac-0000-0200-0000-65ceb22a0000\u0022", "location": "eastus2", "sku": { "name": "S0" @@ -36933,7 +36964,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -39621,7 +39652,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -39754,7 +39785,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -40043,7 +40074,7 @@ "id": "/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/openai-test-rg/providers/Microsoft.CognitiveServices/accounts/openai-sdk-test-automation-account-sweden-central", "name": "openai-sdk-test-automation-account-sweden-central", "type": "Microsoft.CognitiveServices/accounts", - "etag": "\u00220300d879-0000-4700-0000-65c3f8a80000\u0022", + "etag": "\u00221c0000e2-0000-4700-0000-65cadb790000\u0022", "location": "swedencentral", "sku": { "name": "S0" @@ -40140,7 +40171,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -40268,7 +40299,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -40395,7 +40426,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -41377,7 +41408,7 @@ }, { "name": "MaxTrainingFileSize", - "value": "100000000" + "value": "512000000" }, { "name": "MaxUserFileImportDurationInHours", @@ -42068,6 +42099,37 @@ ] } }, + { + "RequestUri": "https://fakeendpoint/v2/track", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json", + "Accept-Encoding": "identity", + "Connection": "close", + "Content-Length": "3729", + "Content-Type": "application/json; charset=utf-8", + "User-Agent": "Python-urllib/3.11", + "X-Forwarded-For": "127.0.0.1", + "X-Forwarded-Proto": "https", + "X-Real-IP": "127.0.0.1" + }, + "RequestBody": "[{\u0022ver\u0022: 1, \u0022name\u0022: \u0022Microsoft.ApplicationInsights.Event\u0022, \u0022time\u0022: \u0022TIME\u0022, \u0022sampleRate\u0022: 100.0, \u0022iKey\u0022: \u0022INSTRUMENTATION_KEY\u0022, \u0022tags\u0022: {\u0022ai.device.id\u0022: \u0022rhurey-wfh\u0022, \u0022ai.device.locale\u0022: \u0022en_US\u0022, \u0022ai.device.osVersion\u0022: \u002210.0.22631\u0022, \u0022ai.device.type\u0022: \u0022Other\u0022, \u0022ai.internal.sdkVersion\u0022: \u0022py3:0.11.9\u0022}, \u0022data\u0022: {\u0022baseType\u0022: \u0022EventData\u0022, \u0022baseData\u0022: {\u0022ver\u0022: 2, \u0022name\u0022: \u0022azurecli/command\u0022, \u0022properties\u0022: {\u0022Context.Default.AzureCLI.AllowBroker\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.ClientRequestId\u0022: \u0022711cbf25-cc9c-11ee-8800-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.CloudName\u0022: \u0022AzureCloud\u0022, \u0022Context.Default.AzureCLI.CoreVersion\u0022: \u00222.57.0\u0022, \u0022Context.Default.AzureCLI.DefaultOutputType\u0022: \u0022unknown\u0022, \u0022Context.Default.AzureCLI.EndTime\u0022: \u00222024-02-16 07:24:41.333204\u0022, \u0022Context.Default.AzureCLI.EnvironmentVariables\u0022: \u0022[]\u0022, \u0022Context.Default.AzureCLI.InitTimeElapsed\u0022: \u00221.769836\u0022, \u0022Context.Default.AzureCLI.InstallationId\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.AzureCLI.Installer\u0022: \u0022MSI\u0022, \u0022Context.Default.AzureCLI.InvokeTimeElapsed\u0022: \u00223.356985\u0022, \u0022Context.Default.AzureCLI.Locale\u0022: \u0022English_United States,1252\u0022, \u0022Context.Default.AzureCLI.Mode\u0022: \u0022default\u0022, \u0022Context.Default.AzureCLI.OutputType\u0022: \u0022json\u0022, \u0022Context.Default.AzureCLI.Params\u0022: \u0022--output,--subscription,--resource-group,--query\u0022, \u0022Context.Default.AzureCLI.PollEndTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PollStartTime\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.PythonVersion\u0022: \u00223.11.7\u0022, \u0022Context.Default.AzureCLI.RawCommand\u0022: \u0022cognitiveservices account list\u0022, \u0022Context.Default.AzureCLI.ShellType\u0022: \u0022cmd\u0022, \u0022Context.Default.AzureCLI.ShowSurveyMessage\u0022: \u0022False\u0022, \u0022Context.Default.AzureCLI.Source\u0022: \u0022az\u0022, \u0022Context.Default.AzureCLI.StartTime\u0022: \u00222024-02-16 07:24:37.973789\u0022, \u0022Context.Default.AzureCLI.TelemetryVersion\u0022: \u00222.0\u0022, \u0022Context.Default.AzureCLI.UserAzureId\u0022: \u00225f410ad1fc24a4547edd18a29584bf5c7572c48978dd5c8cd5fa93e771db858f\u0022, \u0022Context.Default.AzureCLI.UserAzureSubscriptionId\u0022: \u0022f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1\u0022, \u0022Context.Default.AzureCLI.debug_info\u0022: \u0022\u0022, \u0022Context.Default.AzureCLI.error_type\u0022: \u0022None\u0022, \u0022Context.Default.AzureCLI.exception_name\u0022: \u0022None\u0022, \u0022Context.Default.VS.Core.Distro.Id\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Name\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.Distro.Version\u0022: \u0022\u0022, \u0022Context.Default.VS.Core.ExeName\u0022: \u0022azurecli\u0022, \u0022Context.Default.VS.Core.ExeVersion\u0022: \u00222.57.0@none\u0022, \u0022Context.Default.VS.Core.MacAddressHash\u0022: \u0022a1a9745e6932c20d63d29c7e0eeb778b2420c595247a087002a4dd921b854b1e\u0022, \u0022Context.Default.VS.Core.Machine.Id\u0022: \u0022a1a9745e-6932-c20d-63d2-9c7e0eeb778b\u0022, \u0022Context.Default.VS.Core.OS.Platform\u0022: \u0022windows-10-10.0.22631-sp0\u0022, \u0022Context.Default.VS.Core.OS.Type\u0022: \u0022windows\u0022, \u0022Context.Default.VS.Core.OS.Version\u0022: \u002210.0.22631\u0022, \u0022Context.Default.VS.Core.TelemetryApi.ProductVersion\u0022: \u0022azurecli@2.57.0\u0022, \u0022Context.Default.VS.Core.User.Id\u0022: \u002255059476-d0fd-11ed-8796-c8d9d2049b34\u0022, \u0022Context.Default.VS.Core.User.IsMicrosoftInternal\u0022: \u0022False\u0022, \u0022Context.Default.VS.Core.User.IsOptedIn\u0022: \u0022True\u0022, \u0022Reserved.ChannelUsed\u0022: \u0022AI\u0022, \u0022Reserved.DataModel.Action.Result\u0022: \u0022Success\u0022, \u0022Reserved.DataModel.Action.Type\u0022: \u0022Atomic\u0022, \u0022Reserved.DataModel.CorrelationId\u0022: \u0022fa307e03-bbd4-4736-98e2-2b8c20b25a56\u0022, \u0022Reserved.DataModel.EntityName\u0022: \u0022cognitiveservices-account-list\u0022, \u0022Reserved.DataModel.EntityType\u0022: \u0022UserTask\u0022, \u0022Reserved.DataModel.FeatureName\u0022: \u0022command\u0022, \u0022Reserved.DataModel.ProductName\u0022: \u0022azurecli\u0022, \u0022Reserved.DataModel.Source\u0022: \u0022DataModelAPI\u0022, \u0022Reserved.EventId\u0022: \u00221f70029d-1f02-4666-88bd-ed59e5281dd3\u0022, \u0022Reserved.SessionId\u0022: \u00228cc8aacb01982c9f2a6c84090277e579d2e59ec0abafd7ade56e3d3223ab715f\u0022}, \u0022measurements\u0022: {\u0022Reserved.DataModel.EntitySchemaVersion\u0022: 4, \u0022Reserved.DataModel.Severity\u0022: 0, \u0022Reserved.SequenceNumber\u0022: 1, \u0022Reserved.TimeSinceSessionStart\u0022: 0}}}}]", + "StatusCode": 200, + "ResponseHeaders": { + "Connection": "close", + "Content-Length": "49", + "Content-Type": "application/json; charset=utf-8", + "Date": "Fri, 16 Feb 2024 07:24:42 GMT", + "Server": "Microsoft-HTTPAPI/2.0", + "Strict-Transport-Security": "max-age=31536000", + "X-Content-Type-Options": "nosniff" + }, + "ResponseBody": { + "itemsReceived": 1, + "itemsAccepted": 1, + "errors": [] + } + }, { "RequestUri": "https://fakeendpoint/subscriptions/e72e5254-f265-4e95-9bd2-9ee8e7329051/resourceGroups/robch-cranky-red-koala-rg/providers/Microsoft.CognitiveServices/accounts/robch-cranky-red-koala-ais/listKeys?api-version=2023-05-01", "RequestMethod": "POST", @@ -42082,7 +42144,7 @@ "User-Agent": "AZURECLI/2.57.0 (MSI) azsdk-python-mgmt-cognitiveservices/13.5.0 Python/3.11.7 (Windows-10-10.0.22631-SP0) ai-cli 0.0.1", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Proto": "https", - "x-ms-client-request-id": "7601528b-c92f-11ee-9d0a-c8d9d2049b34", + "x-ms-client-request-id": "746b492f-cc9c-11ee-a5cb-c8d9d2049b34", "X-Real-IP": "127.0.0.1" }, "RequestBody": null, @@ -42092,18 +42154,18 @@ "Connection": "close", "Content-Length": "45", "Content-Type": "application/json; charset=utf-8", - "Date": "Sun, 11 Feb 2024 22:46:59 GMT", + "Date": "Fri, 16 Feb 2024 07:24:44 GMT", "Expires": "-1", "Pragma": "no-cache", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Cache": "CONFIG_NOCACHE", "X-Content-Type-Options": "nosniff", - "x-envoy-upstream-service-time": "23", - "x-ms-correlation-request-id": "d641eca2-9a76-4fbb-927a-45304e9965aa", + "x-envoy-upstream-service-time": "21", + "x-ms-correlation-request-id": "14bfcaf0-a067-453d-852f-cac83552239b", "x-ms-ratelimit-remaining-subscription-writes": "1199", - "x-ms-request-id": "430d4e42-c7a1-4b2f-8e5b-ac1cc02f6129", - "x-ms-routing-request-id": "WESTUS2:20240211T224659Z:d641eca2-9a76-4fbb-927a-45304e9965aa", - "X-MSEdge-Ref": "Ref A: 2F01AE03B8B44503A71467F93A2AB6F6 Ref B: CO6AA3150217025 Ref C: 2024-02-11T22:46:58Z" + "x-ms-request-id": "56773811-34ca-4b40-9b01-2ea7c014bbd2", + "x-ms-routing-request-id": "WESTUS2:20240216T072444Z:14bfcaf0-a067-453d-852f-cac83552239b", + "X-MSEdge-Ref": "Ref A: 6B1194F9A58D4FAFA849905A273A923E Ref B: CO6AA3150218053 Ref C: 2024-02-16T07:24:44Z" }, "ResponseBody": { "key1": "COGSVCSKey1", From a1747a16e038e8af17b944bba43eb42e1599a0bf Mon Sep 17 00:00:00 2001 From: pankopon <55108151+pankopon@users.noreply.github.com> Date: Fri, 16 Feb 2024 16:11:50 -0800 Subject: [PATCH 08/19] Windows installer bug bash updates (#225) Add Visual C++ runtime dependency due to Speech SDK libraries. Update the link in license text to the official privacy statement. On uninstallation, notify the user of installed dependent packages still remaining. Some UI text formatting improvements. --- scripts/Azure-AI-CLI-Setup.wxl | 16 ++++++++++---- scripts/Azure-AI-CLI-Setup.wxs | 22 ++++++++++++++++++- scripts/Azure-AI-CLI-Setup.xml | 10 ++++----- scripts/CLI_License.rtf | 2 +- scripts/WixBuildInstaller.cmd | 39 ++++++++++++++++++++++------------ 5 files changed, 64 insertions(+), 25 deletions(-) diff --git a/scripts/Azure-AI-CLI-Setup.wxl b/scripts/Azure-AI-CLI-Setup.wxl index 5816ed15..ce41631c 100644 --- a/scripts/Azure-AI-CLI-Setup.wxl +++ b/scripts/Azure-AI-CLI-Setup.wxl @@ -33,9 +33,17 @@ &Uninstall &Close Repair Successfully Completed - Uninstall Successfully Completed - Installation successfully completed. Please close and reopen any active terminal window to use Azure AI CLI. You can invoke the tool using the following command: ai - Setup Successful + Uninstall successfully completed. Please uninstall the following dependent packages separately if they are not used anymore: + +- Microsoft .NET SDK 8 +- Microsoft Azure CLI +- Microsoft Visual C++ 2015-2022 Redistributable + Installation successfully completed. + +Please open a new terminal window to use Azure AI CLI. + +You can invoke the tool using the following command: ai + Setup Successful &Launch You must restart your computer before you can use the software. &Restart @@ -43,7 +51,7 @@ Setup Failed Setup Failed Uninstall Failed - Repair Failed + Repair Failed One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. You must restart your computer to complete the rollback of the software. &Restart diff --git a/scripts/Azure-AI-CLI-Setup.wxs b/scripts/Azure-AI-CLI-Setup.wxs index eea49385..4da7cc4e 100644 --- a/scripts/Azure-AI-CLI-Setup.wxs +++ b/scripts/Azure-AI-CLI-Setup.wxs @@ -26,12 +26,13 @@ Id="AlreadyInstalledVersionSearch" Result="version"/> - + NOT WixBundleAction = 5 OR NOT AlreadyInstalledVersion >= v$(var.productVersion) + @@ -74,5 +75,24 @@ Visible="yes" Vital="yes"/> + + + + + + + diff --git a/scripts/Azure-AI-CLI-Setup.xml b/scripts/Azure-AI-CLI-Setup.xml index 47a7aa7a..33c36c1c 100644 --- a/scripts/Azure-AI-CLI-Setup.xml +++ b/scripts/Azure-AI-CLI-Setup.xml @@ -6,7 +6,7 @@ Segoe UI Segoe UI Segoe UI - Segoe UI + Segoe UI #(loc.Title) @@ -57,9 +57,9 @@ #(loc.SuccessHeader) - #(loc.SuccessInstallHeader) - #(loc.SuccessRepairHeader) - #(loc.SuccessUninstallHeader) + #(loc.SuccessInstallHeader) + #(loc.SuccessRepairHeader) + #(loc.SuccessUninstallHeader) #(loc.SuccessRestartText) @@ -69,7 +69,7 @@ #(loc.FailureHeader) #(loc.FailureInstallHeader) #(loc.FailureUninstallHeader) - #(loc.FailureRepairHeader) + #(loc.FailureRepairHeader) #(loc.FailureHyperlinkLogText) #(loc.FailureRestartText) diff --git a/scripts/CLI_License.rtf b/scripts/CLI_License.rtf index a462e2ce..92b02809 100644 --- a/scripts/CLI_License.rtf +++ b/scripts/CLI_License.rtf @@ -47,7 +47,7 @@ Microsoft Azure AI CLI \pard\tx450\pardeftab720\li450\fi-357\ri0\sb120\sa120\partightenfactor0 \ls4\ilvl0 \f0\b \cf0 3. DATA. -\b0 The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but not all, as described in the product documentation. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications and you should provide a copy of Microsoft\'92s privacy statement to your users. The Microsoft privacy statement is located here {\field{\*\fldinst{HYPERLINK "https://go.microsoft.com/fwlink/?LinkID=824704"}}{\fldrslt \cf2 \ul \ulc2 https://go.microsoft.com/fwlink/?LinkID=824704}}. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\ +\b0 The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but not all, as described in the product documentation. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications and you should provide a copy of Microsoft\'92s privacy statement to your users. The Microsoft privacy statement is located here {\field{\*\fldinst{HYPERLINK "https://privacy.microsoft.com/privacystatement"}}{\fldrslt \cf2 \ul \ulc2 https://privacy.microsoft.com/privacystatement}}. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\ \pard\tx360\pardeftab720\li357\fi-357\ri0\sb120\sa120\partightenfactor0 \ls4\ilvl0 \b \cf0 4. SCOPE OF LICENSE. diff --git a/scripts/WixBuildInstaller.cmd b/scripts/WixBuildInstaller.cmd index e253066f..f5cf1f6c 100644 --- a/scripts/WixBuildInstaller.cmd +++ b/scripts/WixBuildInstaller.cmd @@ -4,7 +4,7 @@ setlocal REM Azure AI CLI package version (e.g. 1.0.0 or 1.0.0-preview-20231214.1) if "%~1"=="" ( echo Error: Azure AI CLI package version is not set. 1>&2 - exit /b 1 + exit /b 11 ) REM Azure AI CLI product version x.y.z (e.g. 1.0.0), ref. https://learn.microsoft.com/windows/win32/msi/productversion @@ -13,7 +13,7 @@ REM If the package version changes but product version remains the same, REM an existing installation cannot be upgraded without uninstalling it first! if "%~2"=="" ( echo Error: Azure AI CLI product version is not set. 1>&2 - exit /b 2 + exit /b 12 ) set PACKAGE_VERSION=%~1 @@ -26,9 +26,12 @@ REM Dependencies set AZURE_CLI_VERSION=2.57.0 set AZURE_CLI_INSTALLER=azure-cli-%AZURE_CLI_VERSION%-%TARGET_PLATFORM%.msi set AZURE_CLI_URL=https://azcliprod.blob.core.windows.net/msi/%AZURE_CLI_INSTALLER% -set DOTNET_VERSION=8.0.200 +set DOTNET_VERSION=8.0.201 set DOTNET_INSTALLER=dotnet-sdk-%DOTNET_VERSION%-win-%TARGET_PLATFORM%.exe set DOTNET_URL=https://dotnetcli.azureedge.net/dotnet/Sdk/%DOTNET_VERSION%/%DOTNET_INSTALLER% +set VCRT_VERSION=14.38.33135 +set VCRT_INSTALLER=VC_redist.%TARGET_PLATFORM%.exe +set VCRT_URL=https://aka.ms/vs/17/release/%VCRT_VERSION%/%VCRT_INSTALLER% REM Check for WiX toolset where candle.exe >nul 2>&1 @@ -36,57 +39,65 @@ if %ERRORLEVEL% neq 0 set PATH=%PATH%;C:\Program Files (x86)\WiX Toolset v3.11\b where candle.exe >nul 2>&1 if %ERRORLEVEL% neq 0 ( echo Error: Install WiX v3.14 Toolset from https://wixtoolset.org/docs/v3/releases/v3-14-0-6526/ 1>&2 - exit /b 3 + exit /b 21 ) REM Check for curl.exe (https://techcommunity.microsoft.com/t5/containers/tar-and-curl-come-to-windows/ba-p/382409) where curl.exe >nul 2>&1 if %ERRORLEVEL% neq 0 ( echo Error: curl.exe not found 1>&2 - exit /b 4 + exit /b 22 ) REM Download Azure CLI installer -curl.exe --output %AZURE_CLI_INSTALLER% --silent --url %AZURE_CLI_URL% +curl.exe --output %AZURE_CLI_INSTALLER% --silent --location --url %AZURE_CLI_URL% if %ERRORLEVEL% neq 0 ( echo Error while downloading Azure CLI installer 1>&2 - exit /b 5 + exit /b 31 ) REM Download .NET SDK installer -curl.exe --output %DOTNET_INSTALLER% --silent --url %DOTNET_URL% +curl.exe --output %DOTNET_INSTALLER% --silent --location --url %DOTNET_URL% if %ERRORLEVEL% neq 0 ( echo Error while downloading .NET SDK installer 1>&2 - exit /b 6 + exit /b 32 +) + +REM Download Visual C++ runtime installer +curl.exe --output %VCRT_INSTALLER% --silent --location --url %VCRT_URL% +if %ERRORLEVEL% neq 0 ( + echo Error while downloading Visual C++ runtime installer 1>&2 + exit /b 33 ) REM Build AI CLI installer .msi candle.exe Azure-AI-CLI.wxs -dproductVersion=%PRODUCT_VERSION% -dpackageVersion=%PACKAGE_VERSION% -dpackageUrl=%PACKAGE_URL% -dtargetPlatform=%TARGET_PLATFORM% if %ERRORLEVEL% neq 0 ( echo Error from candle.exe 1>&2 - exit /b 7 + exit /b 41 ) light.exe Azure-AI-CLI.wixobj -ext WixUIExtension -ext WixUtilExtension if %ERRORLEVEL% neq 0 ( echo Error from light.exe 1>&2 - exit /b 8 + exit /b 42 ) REM Build installation bundle .exe candle.exe Azure-AI-CLI-Setup.wxs -ext WixBalExtension -ext WixUtilExtension ^ -dproductVersion=%PRODUCT_VERSION% -dtargetPlatform=%TARGET_PLATFORM% ^ -dazureCliVersion=%AZURE_CLI_VERSION% -dazureCliUrl=%AZURE_CLI_URL% ^ - -ddotNetVersion=%DOTNET_VERSION% -ddotNetUrl=%DOTNET_URL% + -ddotNetVersion=%DOTNET_VERSION% -ddotNetUrl=%DOTNET_URL% ^ + -dvcrtVersion=%VCRT_VERSION% -dvcrtUrl=%VCRT_URL% if %ERRORLEVEL% neq 0 ( echo Error from candle.exe 1>&2 - exit /b 9 + exit /b 51 ) light.exe Azure-AI-CLI-Setup.wixobj -ext WixBalExtension -ext WixUtilExtension -out %INSTALLER_FILE% if %ERRORLEVEL% neq 0 ( echo Error from light.exe 1>&2 - exit /b 10 + exit /b 52 ) :end From 54685f4231ebdbbefd38258d43701115d2b543d2 Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Fri, 16 Feb 2024 16:32:26 -0800 Subject: [PATCH 09/19] update data_mapping per ankit (#224) --- .../help/include.python.script.function_call_evaluate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ai/.x/help/include.python.script.function_call_evaluate.py b/src/ai/.x/help/include.python.script.function_call_evaluate.py index fe6b1174..c42af85e 100755 --- a/src/ai/.x/help/include.python.script.function_call_evaluate.py +++ b/src/ai/.x/help/include.python.script.function_call_evaluate.py @@ -224,10 +224,10 @@ def run_evaluate_part(subscription_id, resource_group_name, project_name, run_re prediction_data="answer", task_type="qa", data_mapping={ - "questions": "question", - "contexts": "context", - "y_pred": "answer", - "y_test": "truth" + "question": "question", + "context": "context", + "answer": "answer", + "ground_truth": "truth" }, model_config={ "api_version": os.getenv("OPENAI_API_VERSION"), From b9ddb8c7c2cca3ce62146160191a135d7b49454c Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Fri, 16 Feb 2024 20:07:51 -0800 Subject: [PATCH 10/19] fix inner loop discovery and warning at cloud (#226) * fix inner loop discovery and warning at cloud * PR feedback --- .aitests/config | 1 + .../testframework/YamlTagHelpers.cs | 30 +++++---- .../testframework/YamlTestCaseParser.cs | 2 +- .../testframework/YamlTestConfigHelpers.cs | 63 +++++++++++++++++++ .../testframework/YamlTestFramework.cs | 9 ++- 5 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 .aitests/config create mode 100644 src/extensions/testframework/YamlTestConfigHelpers.cs diff --git a/.aitests/config b/.aitests/config new file mode 100644 index 00000000..eb742a25 --- /dev/null +++ b/.aitests/config @@ -0,0 +1 @@ +testDirectory: ../tests diff --git a/src/extensions/testframework/YamlTagHelpers.cs b/src/extensions/testframework/YamlTagHelpers.cs index dd8fe868..2d84c986 100644 --- a/src/extensions/testframework/YamlTagHelpers.cs +++ b/src/extensions/testframework/YamlTagHelpers.cs @@ -8,32 +8,36 @@ namespace Azure.AI.Details.Common.CLI.TestFramework { public class YamlTagHelpers { - public static FileInfo GetYamlDefaultTagsFullFileName(DirectoryInfo directory) + public static FileInfo FindDefaultTagsFile(DirectoryInfo directory) { var found = directory.GetFiles(YamlTestFramework.YamlDefaultTagsFileName); return found.Length == 1 ? found[0] : directory.Parent != null - ? GetYamlDefaultTagsFullFileName(directory.Parent) + ? FindDefaultTagsFile(directory.Parent) : null; } - public static Dictionary> GetDefaultTags(DirectoryInfo directory) + public static Dictionary> FindAndGetDefaultTags(DirectoryInfo directory) + { + var defaultsFile = FindDefaultTagsFile(directory)?.FullName; + return defaultsFile != null + ? GetTagsFromFile(defaultsFile) + : new Dictionary>(); + } + + public static Dictionary> GetTagsFromFile(string defaultsFile) { var defaultTags = new Dictionary>(); - var defaultsFile = GetYamlDefaultTagsFullFileName(directory)?.FullName; - if (defaultsFile != null) + Logger.Log($"Loading default tags from {defaultsFile}"); + var parsed = YamlHelpers.ParseYamlStream(defaultsFile); + if (parsed.Documents.Count() > 0) { - Logger.Log($"Loading default tags from {defaultsFile}"); - var parsed = YamlHelpers.ParseYamlStream(defaultsFile); - if (parsed.Documents.Count() > 0) + var tagsNode = parsed.Documents[0].RootNode; + if (tagsNode != null) { - var tagsNode = parsed.Documents[0].RootNode; - if (tagsNode != null) - { - defaultTags = UpdateCopyTags(defaultTags, null, tagsNode); - } + defaultTags = UpdateCopyTags(defaultTags, null, tagsNode); } } diff --git a/src/extensions/testframework/YamlTestCaseParser.cs b/src/extensions/testframework/YamlTestCaseParser.cs index 770315cb..5bf46af6 100644 --- a/src/extensions/testframework/YamlTestCaseParser.cs +++ b/src/extensions/testframework/YamlTestCaseParser.cs @@ -14,7 +14,7 @@ public partial class YamlTestCaseParser { public static IEnumerable TestCasesFromYaml(string source, FileInfo file) { - var defaultTags = YamlTagHelpers.GetDefaultTags(file.Directory); + var defaultTags = YamlTagHelpers.FindAndGetDefaultTags(file.Directory); var workingDirectory = GetScalarString(null, defaultTags, "workingDirectory"); workingDirectory = UpdateWorkingDirectory(file.Directory.FullName, workingDirectory); diff --git a/src/extensions/testframework/YamlTestConfigHelpers.cs b/src/extensions/testframework/YamlTestConfigHelpers.cs new file mode 100644 index 00000000..a119017c --- /dev/null +++ b/src/extensions/testframework/YamlTestConfigHelpers.cs @@ -0,0 +1,63 @@ +using System.IO; +using System.Linq; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public class YamlTestConfigHelpers + { + public static FileInfo FindTestConfigFile(DirectoryInfo checkHereAndParents) + { + Logger.Log($"YamlTestConfigHelpers.GetTestConfigFile: Looking for test config file in {checkHereAndParents.FullName}"); + + var configDirectory = checkHereAndParents.GetDirectories(YamlTestFramework.YamlTestsConfigDirectoryName).FirstOrDefault(); + var configFile = configDirectory?.GetFiles(YamlTestFramework.YamlTestsConfigFileName).FirstOrDefault(); + if (configFile?.Exists ?? false) + { + Logger.Log($"YamlTestConfigHelpers.GetTestConfigFile: Found test config file at {configFile.FullName}"); + return configFile; + } + + return checkHereAndParents.Parent != null + ? FindTestConfigFile(checkHereAndParents.Parent) + : null; + } + + public static DirectoryInfo GetTestDirectory(DirectoryInfo checkHereAndParents) + { + var file = FindTestConfigFile(checkHereAndParents); + if (file != null) + { + var tags = YamlTagHelpers.GetTagsFromFile(file.FullName); + if (tags != null && tags.ContainsKey("testDirectory")) + { + var testDirectory = tags["testDirectory"].FirstOrDefault(); + if (testDirectory != null) + { + testDirectory = PathHelpers.Combine(file.Directory.FullName, testDirectory); + Logger.Log($"YamlTestConfigHelpers.GetTestDirectory: Found test directory in config file at {testDirectory}"); + return new DirectoryInfo(testDirectory); + } + } + } + + file = YamlTagHelpers.FindDefaultTagsFile(checkHereAndParents); + if (file != null) + { + var tags = YamlTagHelpers.GetTagsFromFile(file.FullName); + if (tags != null && tags.ContainsKey("testDirectory")) + { + var testDirectory = tags["testDirectory"].FirstOrDefault(); + if (testDirectory != null) + { + testDirectory = PathHelpers.Combine(file.Directory.FullName, testDirectory); + Logger.Log($"YamlTestConfigHelpers.GetTestDirectory: Found test directory in default tags file at {testDirectory}"); + return new DirectoryInfo(testDirectory); + } + } + } + + Logger.Log($"YamlTestConfigHelpers.GetTestDirectory: No test directory found; using {checkHereAndParents.FullName}"); + return checkHereAndParents; + } + } +} diff --git a/src/extensions/testframework/YamlTestFramework.cs b/src/extensions/testframework/YamlTestFramework.cs index ecc0ad89..20198317 100644 --- a/src/extensions/testframework/YamlTestFramework.cs +++ b/src/extensions/testframework/YamlTestFramework.cs @@ -19,7 +19,8 @@ public static IEnumerable GetTestsFromDirectory(string source, Directo { Logger.Log($"YamlTestFramework.GetTestsFromDirectory('{source}', '{directory.FullName}'): ENTER"); - directory = YamlTagHelpers.GetYamlDefaultTagsFullFileName(directory)?.Directory ?? directory; + directory = YamlTestConfigHelpers.GetTestDirectory(directory); + var files = FindFiles(directory); var tests = files.SelectMany(file => GetTestsFromYaml(source, file)); @@ -144,14 +145,14 @@ private static void RunAndRecordTestCaseSteps(IYamlTestFrameworkHost host, Dicti var stepTest = testFromIdMap.ContainsKey(nextStepId) ? testFromIdMap[nextStepId] : null; if (stepTest == null) { - Logger.LogError($"YamlTestFramework.RunAndRecordTestCaseSteps() ==> ERROR: nextStepId '{nextStepId}' not found for test '{checkTest.DisplayName}'"); + // Logger.LogInfo($"YamlTestFramework.RunAndRecordTestCaseSteps() ==> nextStepId '{nextStepId}' not found for test '{checkTest.DisplayName}'"); break; } var stepCompletion = completionFromIdMap.ContainsKey(nextStepId) ? completionFromIdMap[nextStepId] : null; if (stepCompletion == null) { - Logger.LogError($"YamlTestFramework.RunAndRecordTestCaseSteps() ==> ERROR: nextStepId '{nextStepId}' completion not found for test '{checkTest.DisplayName}'"); + // Logger.LogInfo($"YamlTestFramework.RunAndRecordTestCaseSteps() ==> nextStepId '{nextStepId}' completion not found for test '{checkTest.DisplayName}'"); break; } @@ -220,6 +221,8 @@ private static IList RunAndRecordTestCase(TestCase test, IYamlTestFr public const string YamlFileExtension = ".yaml"; public const string FakeExecutor = "executor://ai/cli/TestFramework/v1"; public const string YamlDefaultTagsFileName = "Azure-AI-CLI-TestFramework-Default-Tags.yaml"; + public const string YamlTestsConfigDirectoryName = ".aitests"; + public const string YamlTestsConfigFileName = "config"; public const string DefaultTimeout = "600000"; #endregion } From c6767836cff688a8f8c0f78128ca3e98ea931006 Mon Sep 17 00:00:00 2001 From: Glenn Harper <64209257+glharper@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:18:59 -0500 Subject: [PATCH 11/19] add version command, displays assembly version without banner (#228) * shell classes, not hooked in yet * hooked in, looking at boilerplate * don't display banner for version output * add --version, display.version key * Add code checking for latest version from NuGet * Check if latest nuget version is greater than current assembly version * Move version get to http_helpers --- src/ai/Program_AI.cs | 3 + src/ai/commands/chat_command.cs | 4 + .../parsers/version_command_parser.cs | 71 ++++++++++++++ src/ai/commands/scenario_wizard_command.cs | 2 + src/ai/commands/search_command.cs | 2 + src/ai/commands/version_command.cs | 94 +++++++++++++++++++ src/common/Program.cs | 40 +++++++- .../commands/parsers/command_parser.cs | 14 ++- .../commands/parsers/common_token_parsers.cs | 1 + src/common/details/helpers/http_helpers.cs | 21 +++++ .../details/named_values/named_values.cs | 10 ++ .../details/native_logging/NativeUtils.cs | 2 + 12 files changed, 260 insertions(+), 4 deletions(-) create mode 100644 src/ai/commands/parsers/version_command_parser.cs create mode 100644 src/ai/commands/version_command.cs diff --git a/src/ai/Program_AI.cs b/src/ai/Program_AI.cs index dcbc2038..7a8adef6 100644 --- a/src/ai/Program_AI.cs +++ b/src/ai/Program_AI.cs @@ -154,6 +154,7 @@ public bool DispatchRunCommand(ICommandValues values) "wizard" => (new ScenarioWizardCommand(values)).RunCommand(), "dev" => (new DevCommand(values)).RunCommand(), "run" => (new RunJobCommand(values)).RunCommand(), + "version" => (new VersionCommand(values)).RunCommand(), _ => false }; } @@ -178,6 +179,7 @@ public bool DispatchParseCommand(INamedValueTokens tokens, ICommandValues values "service" => ServiceCommandParser.ParseCommand(tokens, values), "tool" => ToolCommandParser.ParseCommand(tokens, values), "wizard" => ScenarioWizardCommandParser.ParseCommand(tokens, values), + "version" => VersionCommandParser.ParseCommand(tokens, values), "dev" => DevCommandParser.ParseCommand(tokens, values), "run" => RunJobCommandParser.ParseCommand(tokens, values), _ => false @@ -203,6 +205,7 @@ public bool DispatchParseCommandValues(INamedValueTokens tokens, ICommandValues "wizard" => ScenarioWizardCommandParser.ParseCommandValues(tokens, values), "dev" => DevCommandParser.ParseCommandValues(tokens, values), "run" => RunJobCommandParser.ParseCommandValues(tokens, values), + "version" => VersionCommandParser.ParseCommandValues(tokens, values), _ => false }; } diff --git a/src/ai/commands/chat_command.cs b/src/ai/commands/chat_command.cs index ae773a12..b048c471 100644 --- a/src/ai/commands/chat_command.cs +++ b/src/ai/commands/chat_command.cs @@ -1098,6 +1098,7 @@ private void StopCommand() // OutputHelper _output = null; // DisplayHelper _display = null; +#nullable enable private int? TryParse(string? s, int? defaultValue) { return !string.IsNullOrEmpty(s) && int.TryParse(s, out var parsed) ? parsed : defaultValue; @@ -1137,6 +1138,7 @@ private float TryParse(string? s, float defaultValue) return kernelWithACS; } +#nullable disable private async Task StoreMemoryAsync(IKernel kernel, string index) { @@ -1157,6 +1159,7 @@ await kernel.Memory.SaveReferenceAsync( if (!_quiet) Console.WriteLine(". Done!\n"); } +#nullable enable private static async Task SearchMemoryAsync(IKernel? kernel, string collection, string text) { if (kernel == null) return null; @@ -1177,6 +1180,7 @@ await kernel.Memory.SaveReferenceAsync( return result; } +#nullable disable private string UpdateUserInputWithSearchResultInfo(string input, string searchResults) { diff --git a/src/ai/commands/parsers/version_command_parser.cs b/src/ai/commands/parsers/version_command_parser.cs new file mode 100644 index 00000000..78ccb2cd --- /dev/null +++ b/src/ai/commands/parsers/version_command_parser.cs @@ -0,0 +1,71 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System; +using System.Collections.Generic; + +namespace Azure.AI.Details.Common.CLI +{ + class VersionCommandParser : CommandParser + { + public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) + { + values.Add("display.version", "true"); + return ParseCommands(_commands, _partialCommands, tokens, values, x => GetCommandParsers(x)); + } + + public static bool ParseCommandValues(INamedValueTokens tokens, ICommandValues values) + { + return ParseCommandValues("version", GetCommandParsers(values), tokens, values); + } + + private static readonly (string name, bool valuesRequired)[] _commands = { + ("version", false), + }; + + private static readonly string[] _partialCommands = { + }; + + private static IEnumerable GetCommandParsers(ICommandValues values) + { + var commandName = values.GetCommand(); + + switch (commandName) + { + case "version": return _versionCommandParsers; + } + + return null; + } + + + #region private data + + public class CommonVersionNamedValueTokenParsers : NamedValueTokenParserList + { + public CommonVersionNamedValueTokenParsers() : base( + + new NamedValueTokenParser(null, "x.command", "11", "1", "version"), + + new ExpectOutputTokenParser(), + new DiagnosticLogTokenParser(), + new CommonNamedValueTokenParsers(), + + new NamedValueTokenParser("--ini", "ini.file", "10", "1", "@"), + new NamedValueTokenParser(null, "x.command.expand.file.name", "11111", "1") + ) + { + } + } + + private static INamedValueTokenParser[] _versionCommandParsers = { + + new CommonVersionNamedValueTokenParsers(), + + }; + + #endregion + } +} diff --git a/src/ai/commands/scenario_wizard_command.cs b/src/ai/commands/scenario_wizard_command.cs index 4dc89db4..01735cb9 100644 --- a/src/ai/commands/scenario_wizard_command.cs +++ b/src/ai/commands/scenario_wizard_command.cs @@ -385,6 +385,7 @@ private static bool ListBoxPickYesNo() return (picked == 0); } +#nullable enable private IKernel? CreateSemanticKernel(string searchEndpoint, string searchApiKey, string embeddingsEndpoint, string embeddingsDeployment, string embeddingsApiKey) { var store = new AzureCognitiveSearchMemoryStore(searchEndpoint, searchApiKey); @@ -395,6 +396,7 @@ private static bool ListBoxPickYesNo() return kernelWithACS; } +#nullable disable private static async Task StoreMemoryAsync(IKernel kernel, string index, IEnumerable> kvps) { diff --git a/src/ai/commands/search_command.cs b/src/ai/commands/search_command.cs index 572e3b74..d3901401 100644 --- a/src/ai/commands/search_command.cs +++ b/src/ai/commands/search_command.cs @@ -494,6 +494,7 @@ private void DoIndexUpdateWithSK(string searchEndpoint, string searchApiKey, str StoreMemoryAsync(kernel, searchIndexName, kvps).Wait(); } +#nullable enable private IKernel? CreateSemanticKernel(string searchEndpoint, string searchApiKey, string embeddingsEndpoint, string embeddingsDeployment, string embeddingsApiKey) { var store = new AzureCognitiveSearchMemoryStore(searchEndpoint, searchApiKey); @@ -504,6 +505,7 @@ private void DoIndexUpdateWithSK(string searchEndpoint, string searchApiKey, str return kernelWithACS; } +#nullable disable private static async Task StoreMemoryAsync(IKernel kernel, string index, IEnumerable> kvps) { diff --git a/src/ai/commands/version_command.cs b/src/ai/commands/version_command.cs new file mode 100644 index 00000000..836cafe8 --- /dev/null +++ b/src/ai/commands/version_command.cs @@ -0,0 +1,94 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Azure.AI.Details.Common.CLI.ConsoleGui; +using Azure.AI.Details.Common.CLI.Extensions.HelperFunctions; +using Azure.Core.Diagnostics; +using System; +using System.Diagnostics.Tracing; +using System.IO; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Azure.AI.Details.Common.CLI +{ + public class VersionCommand : Command + { + internal VersionCommand(ICommandValues values) + { + _values = values.ReplaceValues(); + _quiet = _values.GetOrDefault("x.quiet", false); + _verbose = _values.GetOrDefault("x.verbose", true); + } + + internal bool RunCommand() + { + DoCommand(_values.GetCommand()); + return _values.GetOrDefault("passed", true); + } + + private void DoCommand(string command) + { + StartCommand(); + + switch (command) + { + case "version": DoVersion(); break; + + default: + _values.AddThrowError("WARNING:", $"'{command.Replace('.', ' ')}' NOT YET IMPLEMENTED!!"); + break; + } + + StopCommand(); + DisposeAfterStop(); + DeleteTemporaryFiles(); + } + private void StartCommand() + { + CheckPath(); + // CheckChatInput(); + LogHelpers.EnsureStartLogFile(_values); + + // _display = new DisplayHelper(_values); + + // _output = new OutputHelper(_values); + // _output.StartOutput(); + + // var id = _values["chat.input.id"]; + // _output.EnsureOutputAll("chat.input.id", id); + // _output.EnsureOutputEach("chat.input.id", id); + + _lock = new SpinLock(); + _lock.StartLock(); + } + + private void StopCommand() + { + _lock.StopLock(5000); + + LogHelpers.EnsureStopLogFile(_values); + // _output.CheckOutput(); + // _output.StopOutput(); + + _stopEvent.Set(); + } + + private SpinLock _lock = null; + private readonly bool _quiet = false; + private readonly bool _verbose = false; + + // private AzureEventSourceListener _azureEventSourceListener; + + // OutputHelper _output = null; + // DisplayHelper _display = null; + + private void DoVersion() + { + // Handled by adding "display.help" to values in parser + } + } +} diff --git a/src/common/Program.cs b/src/common/Program.cs index e142736d..e414a713 100644 --- a/src/common/Program.cs +++ b/src/common/Program.cs @@ -11,6 +11,7 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Text; +using System.Text.Json; using System.Threading.Tasks; namespace Azure.AI.Details.Common.CLI @@ -40,8 +41,11 @@ public static int Main(IProgramData data, string[] mainArgs) var exitCode = ParseCommand(tokens, values); if (exitCode == 0 && !values.DisplayHelpRequested()) { - DisplayBanner(values); - DisplayParsedValues(values); + if (!values.DisplayVersionRequested()) + { + DisplayBanner(values); + DisplayParsedValues(values); + } exitCode = RunCommand(values) ? 0 : 1; } @@ -138,7 +142,7 @@ private static void DisplayBanner(ICommandValues values) } } - private static string GetVersionFromAssembly() + public static string GetVersionFromAssembly() { var sdkAssembly = Program.BindingAssemblySdkType?.Assembly; var sdkVersionAttribute = sdkAssembly?.GetCustomAttribute(); @@ -164,6 +168,30 @@ private static void DisplayCommandHelp(INamedValueTokens tokens, INamedValues va HelpCommandParser.DisplayHelp(tokens, values); } + public static void DisplayVersion(INamedValues values) + { + var currentVersion = GetVersionFromAssembly().Split("-")[0]; + Console.WriteLine(currentVersion); + + var latestVersion = HttpHelpers.GetLatestVersionInfo(values, "version"); + if (latestVersion != null) + { + var currentVersionNumbers = currentVersion.Split("."); + var latestVersionNumbers = latestVersion.Split("-")[0].Split("."); + if (updateNeeded(currentVersionNumbers, latestVersionNumbers)) + { + Console.WriteLine($"\nUpdate available, Latest Version: {latestVersion}"); + } + } + } + + private static bool updateNeeded(string[] current, string[] latest) + { + return Int32.Parse(current[0]) < Int32.Parse(latest[0]) + || Int32.Parse(current[1]) < Int32.Parse(latest[1]) + || Int32.Parse(current[2]) < Int32.Parse(latest[2]); + } + private static void DisplayParsedValues(INamedValues values) { if (values.GetOrDefault("x.quiet", true)) return; @@ -181,6 +209,7 @@ private static void DisplayParsedValues(INamedValues values) { if (key == "error") continue; if (key == "display.help") continue; + if (key == "display.version") continue; var value = values[key]; var obfuscateValue = key.EndsWith(passwordPostfix) || @@ -258,6 +287,11 @@ private static int DisplayParseErrorHelpOrException(INamedValueTokens tokens, IC DisplayCommandHelp(tokens, values); return values.GetOrDefault("display.help.exit.code", 0); } + else if (values.DisplayVersionRequested()) + { + DisplayVersion(values); + return 0; + } else if (ex != null) { if (displayBanner) DisplayBanner(values); diff --git a/src/common/details/commands/parsers/command_parser.cs b/src/common/details/commands/parsers/command_parser.cs index 4ad80d6b..66c023b7 100644 --- a/src/common/details/commands/parsers/command_parser.cs +++ b/src/common/details/commands/parsers/command_parser.cs @@ -45,6 +45,13 @@ public static bool DispatchParseCommand(INamedValueTokens tokens, ICommandValues values.AddDisplayHelpRequest(); break; + case "-v": + case "--v": + case "--version": + values.AddDisplayVersionRequest(); + break; + + default: values.AddError("ERROR:", $"Unknown command: {command}"); values.AddDisplayHelpRequest(); @@ -177,7 +184,7 @@ protected static bool ParseCommandDotName(string commandName, INamedValueTokens protected static bool ParseCommandDefaults(string commandName, IEnumerable parsers, INamedValueTokens tokens, ICommandValues values) { var noDefaults = values.GetOrDefault("x.command.nodefaults", false); - if (commandName != "config" && commandName != "help" && !noDefaults) + if (ExpectsDefaults(commandName) && !noDefaults) { var token = tokens.PeekNextToken(); if (token == "--nodefaults") @@ -252,6 +259,11 @@ private static bool ParseNextCommandValue(IEnumerable pa return parsed; } + private static bool ExpectsDefaults(string commandName) + { + return commandName != "config" && commandName != "help" && commandName != "version"; + } + private static bool ParseAtFileToken(IEnumerable parsers, INamedValueTokens tokens, ICommandValues values) { if (tokens.PeekNextToken().StartsWith("@")) diff --git a/src/common/details/commands/parsers/common_token_parsers.cs b/src/common/details/commands/parsers/common_token_parsers.cs index aa9c7052..d510ca45 100644 --- a/src/common/details/commands/parsers/common_token_parsers.cs +++ b/src/common/details/commands/parsers/common_token_parsers.cs @@ -94,6 +94,7 @@ public class CommonNamedValueTokenParsers : NamedValueTokenParserList public CommonNamedValueTokenParsers(bool includeKeyAndRegion = true) : base( new NamedValueTokenParser("--help", "--?", "1", "0", null, null, "true", "display.help"), + new NamedValueTokenParser("--version", "--v", "1", "0", null, null, "true", "display.version"), new NamedValueTokenParser("--cls", "x.cls", "01", "1;0", "true;false", null, "true"), new NamedValueTokenParser("--pause", "x.pause", "01", "1;0", "true;false", null, "true"), new NamedValueTokenParser("--quiet", "x.quiet", "01", "1;0", "true;false", null, "true"), diff --git a/src/common/details/helpers/http_helpers.cs b/src/common/details/helpers/http_helpers.cs index 5dd6bbbf..b22fb7e8 100644 --- a/src/common/details/helpers/http_helpers.cs +++ b/src/common/details/helpers/http_helpers.cs @@ -272,5 +272,26 @@ public static string ReadWriteResponse(WebResponse response, string fileName, st return FileHelpers.ReadWriteAllStream(stream, fileName, message, returnAsText); } + public static string GetLatestVersionInfo(INamedValues values, string domain) + { + try + { + var uri = "https://api.nuget.org/v3-flatcontainer/azure.ai.cli/index.json"; + var request = (HttpWebRequest)WebRequest.Create(uri); + request.Method = WebRequestMethods.Http.Get; + var response = HttpHelpers.GetWebResponse(request); + var json = HttpHelpers.ReadWriteJson(response, values, domain); + var info = JObject.Parse(json); + var versionList = (JArray)info["versions"]; + + return versionList.Last().ToString(); + } + catch (Exception) + { + // Report no exception, this is a non-critical operation + } + return null; + } + } } diff --git a/src/common/details/named_values/named_values.cs b/src/common/details/named_values/named_values.cs index 0b4423b2..1bf27d23 100644 --- a/src/common/details/named_values/named_values.cs +++ b/src/common/details/named_values/named_values.cs @@ -147,6 +147,11 @@ public static void AddDisplayHelpRequest(this INamedValues values) values.Add("display.help", "true"); } + public static void AddDisplayVersionRequest(this INamedValues values) + { + values.Add("display.version", "true"); + } + public static void AddExpandHelpRequest(this INamedValues values, bool value = true) { values.Add("display.help.expand", value ? "true" : "false"); @@ -157,6 +162,11 @@ public static void AddDumpHelpRequest(this INamedValues values, bool value = tru values.Add("display.help.dump", value ? "true" : "false"); } + public static bool DisplayVersionRequested(this INamedValues values) + { + return values.GetOrDefault("display.version", false); + } + public static bool DisplayHelpRequested(this INamedValues values) { return values.GetOrDefault("display.help", false); diff --git a/src/common/details/native_logging/NativeUtils.cs b/src/common/details/native_logging/NativeUtils.cs index 0047ab50..dd37b5ec 100644 --- a/src/common/details/native_logging/NativeUtils.cs +++ b/src/common/details/native_logging/NativeUtils.cs @@ -6,6 +6,7 @@ namespace Azure.AI.Details.Common.CLI { internal static class NativeUtils { + #nullable enable public static NativeMemory ToNativeNullTerminatedUtf8String(string? str) { if (str == null) @@ -33,5 +34,6 @@ public static NativeMemory ToNativeNullTerminatedUtf8String(string? str) throw; } } + #nullable disable } } \ No newline at end of file From e4fa81dc1cacf4609ff8b35f16d44ff47e5049ad Mon Sep 17 00:00:00 2001 From: pankopon <55108151+pankopon@users.noreply.github.com> Date: Fri, 23 Feb 2024 18:55:42 -0800 Subject: [PATCH 12/19] Update Windows installer (#229) Update checking of .NET SDK 8.x dependency to avoid downloading the latest release if there is at least some (older) 8.x version already installed, and change the VCRT download URL to direct (not aka.ms that may or may not work). --- scripts/Azure-AI-CLI-Setup.wxs | 18 +++++++++++++----- scripts/WixBuildInstaller.cmd | 5 +++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/scripts/Azure-AI-CLI-Setup.wxs b/scripts/Azure-AI-CLI-Setup.wxs index 4da7cc4e..cbc2cead 100644 --- a/scripts/Azure-AI-CLI-Setup.wxs +++ b/scripts/Azure-AI-CLI-Setup.wxs @@ -42,14 +42,22 @@ - + + + + + + nul 2>&1 From 5f00fc46c9e0af1b3c13b23dffc99d89f473df50 Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Mon, 26 Feb 2024 14:57:47 -0800 Subject: [PATCH 13/19] add `ai test` commands (`ai test list` and `ai test run`) (#227) * added initial readme * refactor trx xml reporter * add beginnings of junit test results reporter * `ai test` works * multi paramter options now work for `ai test` list and run * print found test count if not quiet * better logger integration with ai cli trace/logger * allow specification of file and format; now can output junit results format as well * doc output format and file options for test run * fix a couple bugs * fix simple help test failure when adding new test command * added `env:` yaml element for `ai test` * enable saving of option_x_tokens ... e.g. ai test list --contains foo --save f ... ai @f * update README.md text --- ideas/junit-conversation.md | 174 +++++++ src/ai/.x/config/test.default.config | 3 + src/ai/.x/help/help | 1 + src/ai/.x/help/test | 18 + src/ai/.x/help/test.list | 37 ++ src/ai/.x/help/test.run | 41 ++ src/ai/.x/help/usage | 1 + src/ai/Program_AI.cs | 7 +- src/ai/ai-cli.csproj | 1 + src/ai/commands/AiCliTestFrameworkLogger.cs | 32 ++ .../commands/parsers/test_command_parser.cs | 95 ++++ src/ai/commands/test_command.cs | 246 +++++++++ .../parsers/named_value_token_parser.cs | 109 +--- .../named_value_token_parser_helpers.cs | 126 +++++ .../parsers/option_x_token_parser.cs | 96 ++++ .../tokens/OutputResultsFileToken.cs | 18 + .../tokens/OutputResultsFormatToken.cs | 18 + .../tokens/conatins_option_x_token.cs | 29 ++ .../tokens/file_option_x_token.cs | 29 ++ .../tokens/files_option_x_token.cs | 29 ++ .../tokens/remove_option_x_token.cs | 29 ++ .../tokens/search_option_x_token.cs | 29 ++ .../tokens/test_option_x_token.cs | 29 ++ .../tokens/tests_option_x_token.cs | 29 ++ .../testframework/IYamlTestFrameworkLogger.cs | 10 + .../testframework/JunitXmlTestReporter.cs | 83 +++ src/extensions/testframework/Logger.cs | 43 +- src/extensions/testframework/README.md | 244 +++++++++ src/extensions/testframework/TestRun.cs | 76 +++ .../testframework/TimeSpanFormatter.cs | 18 + .../testframework/TrxXmlTestReporter.cs | 277 ++++++++++ .../testframework/YamlEnvHelpers.cs | 157 ++++++ .../testframework/YamlTestCaseParseContext.cs | 1 + .../testframework/YamlTestCaseParser.cs | 33 +- .../testframework/YamlTestCaseRunner.cs | 22 +- .../YamlTestFrameworkConsoleHost.cs | 190 +++++++ ...mlTestFrameworkTestAdapterMessageLogger.cs | 56 +++ .../testframework/YamlTestProperties.cs | 1 + .../RecordedTestDiscoverer.cs | 2 +- .../recordingadapter/RecordedTestExecutor.cs | 4 +- .../adapters/testadapter/TestDiscoverer.cs | 2 +- .../adapters/testadapter/TestExecutor.cs | 4 +- .../runner/YamlTestFrameworkConsoleHost.cs | 476 ------------------ tests/test-yaml-element-env.yaml | 43 ++ tests/test.yaml | 1 + 45 files changed, 2337 insertions(+), 632 deletions(-) create mode 100644 ideas/junit-conversation.md create mode 100644 src/ai/.x/config/test.default.config create mode 100644 src/ai/.x/help/test create mode 100644 src/ai/.x/help/test.list create mode 100644 src/ai/.x/help/test.run create mode 100644 src/ai/commands/AiCliTestFrameworkLogger.cs create mode 100644 src/ai/commands/parsers/test_command_parser.cs create mode 100644 src/ai/commands/test_command.cs create mode 100644 src/common/details/named_values/parsers/named_value_token_parser_helpers.cs create mode 100644 src/common/details/named_values/parsers/option_x_token_parser.cs create mode 100644 src/common/details/named_values/tokens/OutputResultsFileToken.cs create mode 100644 src/common/details/named_values/tokens/OutputResultsFormatToken.cs create mode 100644 src/common/details/named_values/tokens/conatins_option_x_token.cs create mode 100644 src/common/details/named_values/tokens/file_option_x_token.cs create mode 100644 src/common/details/named_values/tokens/files_option_x_token.cs create mode 100644 src/common/details/named_values/tokens/remove_option_x_token.cs create mode 100644 src/common/details/named_values/tokens/search_option_x_token.cs create mode 100644 src/common/details/named_values/tokens/test_option_x_token.cs create mode 100644 src/common/details/named_values/tokens/tests_option_x_token.cs create mode 100644 src/extensions/testframework/IYamlTestFrameworkLogger.cs create mode 100644 src/extensions/testframework/JunitXmlTestReporter.cs create mode 100644 src/extensions/testframework/README.md create mode 100644 src/extensions/testframework/TestRun.cs create mode 100644 src/extensions/testframework/TimeSpanFormatter.cs create mode 100644 src/extensions/testframework/TrxXmlTestReporter.cs create mode 100644 src/extensions/testframework/YamlEnvHelpers.cs create mode 100644 src/extensions/testframework/YamlTestFrameworkConsoleHost.cs create mode 100644 src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs delete mode 100644 src/testing/runner/YamlTestFrameworkConsoleHost.cs create mode 100644 tests/test-yaml-element-env.yaml diff --git a/ideas/junit-conversation.md b/ideas/junit-conversation.md new file mode 100644 index 00000000..109f5af4 --- /dev/null +++ b/ideas/junit-conversation.md @@ -0,0 +1,174 @@ +You +show me a sample pytest reporting xml file output + +Assistant +Sure, here's a simplified example of a potential XML file output from Pytest using JUnit-style reporting: + + + + + + Traceback (most recent call last): Test `test_fail` failed with AssertionError + + + Traceback (most recent call last): Test `test_error` error out with TypeError + + + Traceback (most recent call last): Test `test_skip` skipped with unittest.SkipTest + + + + + +This file provides a summary of the test results, including the number of tests run, number of errors, failures, and skipped tests, as well as detailed information about each individual test. +Please note that the actual contents can greatly vary depending on the complexity of your tests and configuration of your Pytest. + +You +is testsuite always the root? + +Assistant +Yes, in JUnit-style XML reports, the element is generally the root. It represents a series of test cases (represented by elements) that together form a test suite. +However, if you generate the report with pytest's --junit-prefix option or you're running the test within a suite of test suites, the report might include a wrapping element: + + + + + + + + +In this case is the root node, containing one or more elements. + +You +ok. under testsuite, is testcase the only valid child? + +Assistant +Primarily, yes, the tag in a JUnit XML report contains a series of elements. Each element represents one test. +However, can also have a few other types of children in addition to . These additional child elements provide metadata about the suite as a whole or report on issues that affected the suite rather than individual tests. +These additional tags include: +: A collection of properties, or environment data, which applies to the entire test suite. This is usually used to store information relevant to the environment where the tests were run. +: Indicates an error that prevented the test suite from running to completion. This tag is not associated with an individual test case. + and : These capture text that was sent to standard output or standard error during test execution. This can include logs or debugging information. +Here's a simplified example: + + + + + + + + + + System output text (e.g., logs) goes here... + + + + System error text (e.g., exception messages) goes here... + + + +Remember that the actual content and structure can vary based on your test configuration and the specifics of your test environment. + +You +what are all the valid children of testcase? + +Assistant +In a JUnit-style XML report, the element can have several types of child elements. Each one provides additional information about the result or execution of the specific test case. +Here are the key types: +: This indicates an error that occurred while the test was running. This is typically used for unexpected problems, such as uncaught exceptions. The message attribute provides a short description of the error. +: This indicates that the test case failed, i.e., a test assertion was not met. The message attribute provides a short description of the failure. +: This indicates that the test case was skipped and not run for some reason. This could be because the test was manually disabled, or a setup method failed. This element usually has no content. + and : These capture text that was sent to standard output or standard error during the execution of this specific test case. This could be logs or debugging information. +Here's an example of a testcase element with failure and system-out children: + + Traceback (most recent call last):... + Some standard output text here... + + +Remember that the actual content and structure of these elements can vary based on the specifics of your test configuration and environment. + +You +tell me all the xml elements, valid parents, valid children, and what are required and optional attributes. + +Assistant +JUnit XML is a standard to report test results that can be processed by tools that understand the format. Below, you'll find a summary of all XML elements, their valid parents and children, and required and optional attributes. + +: The root element for an XML document representing collection of test suites. +Parent: None +Children: +Attributes: None + +: Represents a test suite which is a collection of test cases. +Parent: (optional), +Children: , , , , and +Attributes: name (required), tests (required), failures, errors, skipped, time,timestamp, hostname, id, package + +: Represents a set of properties relevant to the entire suite. +Parent: +Children: +Attributes: None + +: Represents a single property in the set. +Parent: +Children: None +Attributes: name (required), value (required) + +: Represents a single test case. +Parent: +Children: , , , , +Attributes: name (required), classname (required), time + +: Represents an error that occurred while the test was running. +Parent: , +Children: None +Attributes: message, type + +: Represents a failure of a test case. +Parent: +Children: None +Attributes: message, type + +: Represents a test case that was skipped. +Parent: +Children: None +Attributes: None + +: Captures text that was sent to standard output during the execution. +Parent: , +Children: None +Attributes: None + +: Captures text that was sent to standard error during the execution. +Parent: , +Children: None +Attributes: None + +You +is that everything? + +Assistant +Yes, that covers the standard JUnit XML schema in terms of elements, parents, children, and attributes. Please note that since it's a standard, it's generally followed, but some testing frameworks may have slight variations. +Standard Elements include: + + + + + + + + + + +With their accompanying attributes and nested relationships. +However, it's a standard and its tooling dependent, some tools may add additional elements or attributes to provide more information about the tests. It's always good to check with documentation of the specific tool you are using. + +You +in java, how do namespaces show up here, as part of which attribute? + +Assistant +In a JUnit XML report, the Java package name is typically included in the classname attribute of the element. The classname usually contains the fully qualified name of the class, which includes the package name. +Here's an example: + + +In this case, com.example.myapp is the package name, and MyTestClass is the name of the Java class that contains the test method. This naming convention allows each test case to be uniquely identified, even if the test method names are the same in different test classes. +Please note that the way the package or namespace information is included can depend on the testing tool and configuration being used. This is typical behavior but may vary. \ No newline at end of file diff --git a/src/ai/.x/config/test.default.config b/src/ai/.x/config/test.default.config new file mode 100644 index 00000000..6671d381 --- /dev/null +++ b/src/ai/.x/config/test.default.config @@ -0,0 +1,3 @@ +@default.log +@default.path +@my.defaults \ No newline at end of file diff --git a/src/ai/.x/help/help b/src/ai/.x/help/help index 2f6a1daa..6fdb79d8 100644 --- a/src/ai/.x/help/help +++ b/src/ai/.x/help/help @@ -30,6 +30,7 @@ USAGE: ai [...] ai config [...] (see: ai help config) ai dev [...] (see: ai help dev) + ai test [...] (see: ai help test) ai chat [...] (see: ai help chat) ai flow [...] (see: ai help flow) diff --git a/src/ai/.x/help/test b/src/ai/.x/help/test new file mode 100644 index 00000000..fb6738a6 --- /dev/null +++ b/src/ai/.x/help/test @@ -0,0 +1,18 @@ + ___ ____ ___ _____ ____________________ + / _ /_ / / _ |/_ _/ /_ __/ __/ __/_ __/ + / __ |/ /_/ __ |_/ /_ / / / _/_\ \ / / +/_/ |_/___/_/ |_/____/ /_/ /___/___/ /_/ + +USAGE: ai test [...] + + The `ai test` command manages CLI YAML tests. + +COMMANDS + + ai test list [...] (see: ai help test list) + ai test run [...] (see: ai help test run) + +ADDITIONAL TOPICS + + ai help test examples + ai help find topics test diff --git a/src/ai/.x/help/test.list b/src/ai/.x/help/test.list new file mode 100644 index 00000000..274fa49b --- /dev/null +++ b/src/ai/.x/help/test.list @@ -0,0 +1,37 @@ +TEST LIST + + The `ai test list` command lists CLI YAML tests. + +USAGE: ai test list [...] + + FILES + --file FILE + --files FILE1 [FILE2 [...]] + --files PATTERN1 [PATTERN2 [...]] + + TESTS + --test TEXT + --tests TEXT1 [TEXT2 [...]] + + FILTERING + --contains TEXT1 [TEXT2 [...]] + --remove TEXT1 [TEXT2 [...]] + +EXAMPLES + + EXAMPLE 1: Lists all available tests + + ai test list + + EXAMPLE 2: Lists tests from files under current directory, that contain 'setup' or 'nightly', and 'java', but not 'skip' + + ai test list --tests setup nightly --contains java --remove skip + + EXAMPLE 3: Lists tests from files under 'tests' directory, that contain 'test3', but not 'skip' + + ai test list --files ../tests/**/*.yaml --contains test3 --remove skip + +SEE ALSO + + ai help test examples + ai help find topics test \ No newline at end of file diff --git a/src/ai/.x/help/test.run b/src/ai/.x/help/test.run new file mode 100644 index 00000000..d1b76c7d --- /dev/null +++ b/src/ai/.x/help/test.run @@ -0,0 +1,41 @@ +TEST RUN + + The `ai test list` command runs CLI YAML tests. + +USAGE: ai test run [...] + + FILES + --file FILE + --files FILE1 [FILE2 [...]] + --files PATTERN1 [PATTERN2 [...]] + + TESTS + --test TEXT + --tests TEXT1 [TEXT2 [...]] + + FILTERING + --contains TEXT1 [TEXT2 [...]] + --remove TEXT1 [TEXT2 [...]] + + OUTPUT + --output-file FILE + --output-format trx|junit + +EXAMPLES + + EXAMPLE 1: Runs all available tests + + ai test run + + EXAMPLE 2: Run tests from files under current directory, that contain 'setup' or 'nightly', and 'java', but not 'skip' + + ai test run --tests setup nightly --contains java --remove skip + + EXAMPLE 3: Run tests from files under 'tests' directory, that contain 'test3', but not 'skip' + + ai test run --files ../tests/**/*.yaml --contains test3 --remove skip + +SEE ALSO + + ai help test examples + ai help find topics test \ No newline at end of file diff --git a/src/ai/.x/help/usage b/src/ai/.x/help/usage index 34c06fdb..41f21cef 100644 --- a/src/ai/.x/help/usage +++ b/src/ai/.x/help/usage @@ -16,6 +16,7 @@ USAGE: ai [...] ai config [...] (see: ai help config) ai dev [...] (see: ai help dev) + ai test [...] (see: ai help test) ai chat [...] (see: ai help chat) ai flow [...] (see: ai help flow) diff --git a/src/ai/Program_AI.cs b/src/ai/Program_AI.cs index 7a8adef6..b9a4fc03 100644 --- a/src/ai/Program_AI.cs +++ b/src/ai/Program_AI.cs @@ -85,11 +85,11 @@ public class AiProgramData : IProgramData #endregion #region help command data - public string HelpCommandTokens => "wizard;dev;init;config;chat;flow;speech;vision;language;search;service;tool;samples;eval;run"; + public string HelpCommandTokens => "wizard;dev;test;init;config;chat;flow;speech;vision;language;search;service;tool;samples;eval;run"; #endregion #region config command data - public string ConfigScopeTokens => $"wizard;dev;init;chat;flow;speech;vision;language;search;service;tool;samples;eval;run;*"; + public string ConfigScopeTokens => $"wizard;dev;test;init;chat;flow;speech;vision;language;search;service;tool;samples;eval;run;*"; #endregion #region zip option data @@ -153,6 +153,7 @@ public bool DispatchRunCommand(ICommandValues values) "eval" => (new EvalCommand(values)).RunCommand(), "wizard" => (new ScenarioWizardCommand(values)).RunCommand(), "dev" => (new DevCommand(values)).RunCommand(), + "test" => (new TestCommand(values)).RunCommand(), "run" => (new RunJobCommand(values)).RunCommand(), "version" => (new VersionCommand(values)).RunCommand(), _ => false @@ -181,6 +182,7 @@ public bool DispatchParseCommand(INamedValueTokens tokens, ICommandValues values "wizard" => ScenarioWizardCommandParser.ParseCommand(tokens, values), "version" => VersionCommandParser.ParseCommand(tokens, values), "dev" => DevCommandParser.ParseCommand(tokens, values), + "test" => TestCommandParser.ParseCommand(tokens, values), "run" => RunJobCommandParser.ParseCommand(tokens, values), _ => false }; @@ -204,6 +206,7 @@ public bool DispatchParseCommandValues(INamedValueTokens tokens, ICommandValues "tool" => ToolCommandParser.ParseCommandValues(tokens, values), "wizard" => ScenarioWizardCommandParser.ParseCommandValues(tokens, values), "dev" => DevCommandParser.ParseCommandValues(tokens, values), + "test" => TestCommandParser.ParseCommandValues(tokens, values), "run" => RunJobCommandParser.ParseCommandValues(tokens, values), "version" => VersionCommandParser.ParseCommandValues(tokens, values), _ => false diff --git a/src/ai/ai-cli.csproj b/src/ai/ai-cli.csproj index af917fb6..ddbe30bd 100644 --- a/src/ai/ai-cli.csproj +++ b/src/ai/ai-cli.csproj @@ -134,6 +134,7 @@ + diff --git a/src/ai/commands/AiCliTestFrameworkLogger.cs b/src/ai/commands/AiCliTestFrameworkLogger.cs new file mode 100644 index 00000000..58af85cf --- /dev/null +++ b/src/ai/commands/AiCliTestFrameworkLogger.cs @@ -0,0 +1,32 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Azure.AI.Details.Common.CLI.TestFramework; + +namespace Azure.AI.Details.Common.CLI +{ + public class AiCliTestFrameworkLogger : IYamlTestFrameworkLogger + { + public void LogVerbose(string text) + { + AI.TRACE_VERBOSE(text); + } + + public void LogInfo(string text) + { + AI.TRACE_INFO(text); + } + + public void LogWarning(string text) + { + AI.TRACE_WARNING(text); + } + + public void LogError(string text) + { + AI.TRACE_ERROR(text); + } + } +} diff --git a/src/ai/commands/parsers/test_command_parser.cs b/src/ai/commands/parsers/test_command_parser.cs new file mode 100644 index 00000000..925073ca --- /dev/null +++ b/src/ai/commands/parsers/test_command_parser.cs @@ -0,0 +1,95 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Collections.Generic; + +namespace Azure.AI.Details.Common.CLI +{ + class TestCommandParser : CommandParser + { + public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) + { + return ParseCommands(_commands, _partialCommands, tokens, values, x => GetCommandParsers(x)); + } + + public static bool ParseCommandValues(INamedValueTokens tokens, ICommandValues values) + { + return ParseCommandValues("test", GetCommandParsers(values), tokens, values); + } + + private static readonly (string name, bool valuesRequired)[] _commands = { + ("test.list", false), + ("test.run", false), + }; + + private static readonly string[] _partialCommands = { + "test" + }; + + private static IEnumerable GetCommandParsers(ICommandValues values) + { + var commandName = values.GetCommand(); + + switch (commandName) + { + case "test.list": return _testListParsers; + case "test.run": return _testRunParsers; + } + + foreach (var command in _commands) + { + if (commandName == command.name) + { + return _testPlaceHolderParsers; + } + } + + return null; + } + + public class CommonTestNamedValueTokenParsers : NamedValueTokenParserList + { + public CommonTestNamedValueTokenParsers() : base( + + new NamedValueTokenParser(null, "x.command", "11", "1"), + + new ExpectOutputTokenParser(), + new DiagnosticLogTokenParser(), + new CommonNamedValueTokenParsers(), + + new NamedValueTokenParser("--ini", "ini.file", "10", "1", "@"), + + new NamedValueTokenParser(null, "x.command.expand.file.name", "11111", "1"), + + FileOptionXToken.Parser(), + FilesOptionXToken.Parser(), + + TestOptionXToken.Parser(), + TestsOptionXToken.Parser(), + + ContainsOptionXToken.Parser(), + RemoveOptionXToken.Parser(), + + SearchOptionXToken.Parser() + ) + { + } + } + + private static INamedValueTokenParser[] _testPlaceHolderParsers = { + new CommonTestNamedValueTokenParsers() + }; + + private static INamedValueTokenParser[] _testListParsers = { + new CommonTestNamedValueTokenParsers() + }; + + private static INamedValueTokenParser[] _testRunParsers = { + new CommonTestNamedValueTokenParsers(), + OutputResultsFormatToken.Parser(), + OutputResultsFileToken.Parser() + }; + } +} diff --git a/src/ai/commands/test_command.cs b/src/ai/commands/test_command.cs new file mode 100644 index 00000000..1158849a --- /dev/null +++ b/src/ai/commands/test_command.cs @@ -0,0 +1,246 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using Azure.AI.Details.Common.CLI.Extensions.Templates; +using Azure.AI.Details.Common.CLI.TestFramework; +using Microsoft.VisualStudio.TestPlatform.ObjectModel; + +namespace Azure.AI.Details.Common.CLI +{ + public class TestCommand : Command + { + internal TestCommand(ICommandValues values) + { + _values = values.ReplaceValues(); + _quiet = _values.GetOrDefault("x.quiet", false); + _verbose = _values.GetOrDefault("x.verbose", false); + } + + internal bool RunCommand() + { + try + { + RunTestCommand(); + } + catch (WebException ex) + { + ConsoleHelpers.WriteLineError($"\n ERROR: {ex.Message}"); + JsonHelpers.PrintJson(HttpHelpers.ReadWriteJson(ex.Response, _values, "test")); + } + + return _values.GetOrDefault("passed", true); + } + + private bool RunTestCommand() + { + DoCommand(_values.GetCommand()); + return _values.GetOrDefault("passed", true); + } + + private void DoCommand(string command) + { + StartCommand(); + + switch (command) + { + case "test.list": DoTestList(); break; + case "test.run": DoTestRun(); break; + + default: + _values.AddThrowError("WARNING:", $"'{command.Replace('.', ' ')}' NOT YET IMPLEMENTED!!"); + break; + } + + StopCommand(); + DisposeAfterStop(); + DeleteTemporaryFiles(); + } + + private void DoTestList() + { + var tests = FindAndFilterTests(); + + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + foreach (var test in tests) + { + Console.WriteLine(test.FullyQualifiedName); + } + Console.ResetColor(); + + if (!_quiet) + { + Console.WriteLine(tests.Count() == 1 + ? $"\nFound {tests.Count()} test..." + : $"\nFound {tests.Count()} tests..."); + } + } + + private void DoTestRun() + { + var tests = FindAndFilterTests(); + + if (!_quiet) + { + Console.WriteLine(tests.Count() == 1 + ? $"Found {tests.Count()} test...\n" + : $"Found {tests.Count()} tests...\n"); + } + + var consoleHost = new YamlTestFrameworkConsoleHost(); + var resultsByTestCaseId = YamlTestFramework.RunTests(tests, consoleHost); + + GetOutputFileAndFormat(out var file, out var format); + consoleHost.Finish(resultsByTestCaseId, format, file); + } + + private IList FindAndFilterTests() + { + var files = FindTestFiles(); + var filters = GetTestFilters(); + + var atLeastOneFileSpecified = files.Any(); + var tests = atLeastOneFileSpecified + ? files.SelectMany(file => YamlTestFramework.GetTestsFromYaml(file.FullName, file)) + : YamlTestFramework.GetTestsFromDirectory("ai test", new DirectoryInfo(".")); + + var filtered = YamlTestCaseFilter.FilterTestCases(tests, filters).ToList(); + + if (tests.Count() == 0) + { + _values.AddThrowError("WARNING:", !atLeastOneFileSpecified + ? "No tests found" + : files.Count() == 1 + ? $"No tests found in {files.Count()} file" + : $"No tests found in {files.Count()} files"); + } + + if (filtered.Count() == 0) + { + Console.WriteLine(atLeastOneFileSpecified + ? $"Found {tests.Count()} tests in {files.Count()} files\n" + : $"Found {tests.Count()} tests\n"); + + _values.AddThrowError("WARNING:", "No tests matching criteria."); + } + + return filtered; + } + + private List GetTestFilters() + { + var filters = new List(); + + var options = SearchOptionXToken.GetOptions(_values).ToList(); + options.AddRange(TestOptionXToken.GetOptions(_values).ToList()); + options.AddRange(TestsOptionXToken.GetOptions(_values)); + foreach (var item in options) + { + filters.Add(item); + } + + options = ContainsOptionXToken.GetOptions(_values).ToList(); + foreach (var item in options) + { + filters.Add($"+{item}"); + } + + options = RemoveOptionXToken.GetOptions(_values).ToList(); + foreach (var item in options) + { + filters.Add($"-{item}"); + } + + return filters; + } + + private List FindTestFiles() + { + var files = new List(); + + var options = FileOptionXToken.GetOptions(_values).ToList(); + options.AddRange(FilesOptionXToken.GetOptions(_values).ToList()); + foreach (var item in options) + { + var patterns = item.Split(';', StringSplitOptions.RemoveEmptyEntries); + foreach (var pattern in patterns) + { + AddFindFiles(files, pattern); + } + } + + return files; + } + + private void AddFindFiles(List filesAsList, string pattern) + { + var found = FindFiles(pattern); + if (found.Count() == 0) + { + _values.AddThrowError("WARNING:", $"No files found: {pattern}"); + } + filesAsList.AddRange(found); + } + + private static IList FindFiles(string pattern) + { + var files = FileHelpers.FindFiles(Directory.GetCurrentDirectory(), pattern, null, false, false); + return files.Select(x => new FileInfo(x)).ToList(); + } + + private void GetOutputFileAndFormat(out string file, out string format) + { + format = OutputResultsFormatToken.Data().GetOrDefault(_values, "trx"); + var ext = format switch + { + "trx" => "trx", + "junit" => "xml", + _ => throw new Exception($"Unknown format: {format}") + }; + + file = OutputResultsFileToken.Data().GetOrDefault(_values, null); + file ??= $"test-results.{ext}"; + if (!file.EndsWith($".{ext}")) + { + file += $".{ext}"; + } + } + + private void StartCommand() + { + CheckPath(); + LogHelpers.EnsureStartLogFile(_values); + Logger.Log(new AiCliTestFrameworkLogger()); + + // _display = new DisplayHelper(_values); + + // _output = new OutputHelper(_values); + // _output.StartOutput(); + + _lock = new SpinLock(); + _lock.StartLock(); + } + + private void StopCommand() + { + _lock.StopLock(5000); + + // LogHelpers.EnsureStopLogFile(_values); + // _output.CheckOutput(); + // _output.StopOutput(); + + _stopEvent.Set(); + } + + private SpinLock _lock = null; + private readonly bool _quiet; + private readonly bool _verbose; + } +} diff --git a/src/common/details/named_values/parsers/named_value_token_parser.cs b/src/common/details/named_values/parsers/named_value_token_parser.cs index 78f65c25..87fa32b0 100644 --- a/src/common/details/named_values/parsers/named_value_token_parser.cs +++ b/src/common/details/named_values/parsers/named_value_token_parser.cs @@ -90,83 +90,15 @@ private bool ParseNameAndValues(INamedValueTokens tokens, INamedValues values, s private bool MatchShortName(INamedValueTokens tokens, INamedValues values, out int nameTokenCount) { - nameTokenCount = 0; - - var nameToken = tokens.PeekNextToken(0); - if (nameToken != null && !nameToken.StartsWith(tokens.NamePrefixRequired())) return false; - - var tokenOk = nameToken != null && nameToken.Equals(ShortName, StringComparison.InvariantCultureIgnoreCase); - if (tokenOk) - { - nameTokenCount = 1; - } - - return nameTokenCount > 0; + return NamedValueTokenParserHelpers.MatchShortName(ShortName, tokens, values, out nameTokenCount); } private bool MatchFullName(INamedValueTokens tokens, INamedValues values, string partsRequired, out int nameTokenCount) { - nameTokenCount = 0; - - // Break the "FullName" into parts, some of which will be required, some of which are optional - var prefix = tokens.NamePrefixRequired(); - var fullNameParts = FullName.Split('.'); - var fullNamePartsOk = fullNameParts.Length == partsRequired.Length; - - // Break the first token into parts, so we can start checking it - var iPeekToken = 0; - var token = tokens.PeekNextToken(iPeekToken); - var tokenParts = token != null ? new List(token.Split('.')) : new List(); - var iTokenPart = 0; - - // For each FullName "part", check to see if it matches the next token "part" and check if that FullName part was required or not - for (int iNamePart = 0; fullNamePartsOk && iNamePart < fullNameParts.Length; iNamePart++) - { - // Do they match? - var tokenPart = tokenParts.Count > iTokenPart ? tokenParts[iTokenPart] : null; - var fullNamePart = prefix + fullNameParts[iNamePart]; - var fullNamePartWild = fullNamePart == "*"; - var partsMatch = tokenPart != null && (fullNamePartWild || tokenPart.Equals(fullNamePart, StringComparison.InvariantCultureIgnoreCase)); - - // If so, we'll increment the number of parts we've matched (which is also tracking the next token to use) - if (partsMatch) - { - iTokenPart += 1; - prefix = ""; - } - - // If we matched as a wildcard, keep track of the wildcard value - if (partsMatch && fullNamePartWild) - { - SetWild(values, fullNamePart, tokenPart); - } - - // Check to see if they either matched, or if the name part was optional - var namePartOptional = iNamePart < partsRequired.Length && partsRequired[iNamePart] == '0'; - var thisNamePartOk = partsMatch || namePartOptional; - fullNamePartsOk = thisNamePartOk; - - if (!fullNamePartsOk) break; // didn't match... we're outta here... - - if (partsMatch && iTokenPart == tokenParts.Count) // fully matched all the token parts, skip to the next token - { - iPeekToken += 1; - token = tokens.PeekNextToken(iPeekToken); - tokenParts = token != null ? new List(token.Split('.')) : new List(); - iTokenPart = 0; - } - } - - if (fullNamePartsOk) - { - nameTokenCount = iPeekToken; - return true; - } - - return false; + return NamedValueTokenParserHelpers.MatchFullName(FullName, tokens, values, partsRequired, out nameTokenCount); } - private bool ParseValues(INamedValueTokens tokens, INamedValues values, int skipNameTokens) + private bool ParseValues(INamedValueTokens tokens, INamedValues values, int skipNameTokens) { foreach (var valueCount in ValueCount.Split(';')) { @@ -269,40 +201,7 @@ private bool ParseValues(INamedValueTokens tokens, INamedValues values, int coun private bool ValueMatchesValidValue(string peekToken, string peekTokenValue, bool skipAtAt = false) { - if (peekToken == null) return false; - if (peekTokenValue == null) return false; - if (ValidValues == null) return true; - - bool checkAtAt = ValidValues == "@@"; - if (checkAtAt && skipAtAt) return false; - - bool atAtOk = !string.IsNullOrEmpty(peekToken); - if (checkAtAt) return atAtOk; - - bool checkAt = ValidValues.Length <= 3 && ValidValues.Contains("@"); - bool atOk = peekToken.StartsWith("@") || (peekToken.StartsWith("=@") && !peekTokenValue.StartsWith("=@")); - if (checkAt && atOk) return true; - - bool checkSemi = ValidValues.Length <= 3 && ValidValues.Contains(";"); - bool semiOk = peekToken.Contains(";"); - if (checkSemi && semiOk) return true; - - bool checkTab = ValidValues.Length <= 3 && ValidValues.Contains("\t"); - bool semiTab = peekToken.Contains("\t"); - if (checkTab && semiTab) return true; - - foreach (var validValue in ValidValues.Split(';')) - { - if (peekTokenValue == validValue) return true; - } - - return false; - } - - private void SetWild(INamedValues values, string fullNamePart, string tokenPart) - { - values.Reset(fullNamePart); - values.Add(fullNamePart, tokenPart); + return NamedValueTokenParserHelpers.ValueMatchesValidValue(ValidValues, peekToken, peekTokenValue, skipAtAt); } private void ResetWild(INamedValues values) diff --git a/src/common/details/named_values/parsers/named_value_token_parser_helpers.cs b/src/common/details/named_values/parsers/named_value_token_parser_helpers.cs new file mode 100644 index 00000000..56f4dab3 --- /dev/null +++ b/src/common/details/named_values/parsers/named_value_token_parser_helpers.cs @@ -0,0 +1,126 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class NamedValueTokenParserHelpers + { + public static bool MatchShortName(string shortName, INamedValueTokens tokens, INamedValues values, out int nameTokenCount) + { + nameTokenCount = 0; + + var nameToken = tokens.PeekNextToken(0); + if (nameToken != null && !nameToken.StartsWith(tokens.NamePrefixRequired())) return false; + + var tokenOk = nameToken != null && nameToken.Equals(shortName, StringComparison.InvariantCultureIgnoreCase); + if (tokenOk) + { + nameTokenCount = 1; + } + + return nameTokenCount > 0; + } + + public static bool MatchFullName(string fullName, INamedValueTokens tokens, INamedValues values, string partsRequired, out int nameTokenCount) + { + nameTokenCount = 0; + + // Break the "FullName" into parts, some of which will be required, some of which are optional + var prefix = tokens.NamePrefixRequired(); + var fullNameParts = fullName.Split('.'); + var fullNamePartsOk = fullNameParts.Length == partsRequired.Length; + + // Break the first token into parts, so we can start checking it + var iPeekToken = 0; + var token = tokens.PeekNextToken(iPeekToken); + var tokenParts = token != null ? new List(token.Split('.')) : new List(); + var iTokenPart = 0; + + // For each FullName "part", check to see if it matches the next token "part" and check if that FullName part was required or not + for (int iNamePart = 0; fullNamePartsOk && iNamePart < fullNameParts.Length; iNamePart++) + { + // Do they match? + var tokenPart = tokenParts.Count > iTokenPart ? tokenParts[iTokenPart] : null; + var fullNamePart = prefix + fullNameParts[iNamePart]; + var fullNamePartWild = fullNamePart == "*"; + var partsMatch = tokenPart != null && (fullNamePartWild || tokenPart.Equals(fullNamePart, StringComparison.InvariantCultureIgnoreCase)); + + // If so, we'll increment the number of parts we've matched (which is also tracking the next token to use) + if (partsMatch) + { + iTokenPart += 1; + prefix = ""; + } + + // If we matched as a wildcard, keep track of the wildcard value + if (partsMatch && fullNamePartWild) + { + SetWild(values, fullNamePart, tokenPart); + } + + // Check to see if they either matched, or if the name part was optional + var namePartOptional = iNamePart < partsRequired.Length && partsRequired[iNamePart] == '0'; + var thisNamePartOk = partsMatch || namePartOptional; + fullNamePartsOk = thisNamePartOk; + + if (!fullNamePartsOk) break; // didn't match... we're outta here... + + if (partsMatch && iTokenPart == tokenParts.Count) // fully matched all the token parts, skip to the next token + { + iPeekToken += 1; + token = tokens.PeekNextToken(iPeekToken); + tokenParts = token != null ? new List(token.Split('.')) : new List(); + iTokenPart = 0; + } + } + + if (fullNamePartsOk) + { + nameTokenCount = iPeekToken; + return true; + } + + return false; + } + + public static bool ValueMatchesValidValue(string validValues, string peekToken, string peekTokenValue, bool skipAtAt = false) + { + if (peekToken == null) return false; + if (peekTokenValue == null) return false; + if (validValues == null) return true; + + bool checkAtAt = validValues == "@@"; + if (checkAtAt && skipAtAt) return false; + + bool atAtOk = !string.IsNullOrEmpty(peekToken); + if (checkAtAt) return atAtOk; + + bool checkAt = validValues.Length <= 3 && validValues.Contains("@"); + bool atOk = peekToken.StartsWith("@") || (peekToken.StartsWith("=@") && !peekTokenValue.StartsWith("=@")); + if (checkAt && atOk) return true; + + bool checkSemi = validValues.Length <= 3 && validValues.Contains(";"); + bool semiOk = peekToken.Contains(";"); + if (checkSemi && semiOk) return true; + + bool checkTab = validValues.Length <= 3 && validValues.Contains("\t"); + bool semiTab = peekToken.Contains("\t"); + if (checkTab && semiTab) return true; + + foreach (var validValue in validValues.Split(';')) + { + if (peekTokenValue == validValue) return true; + } + + return false; + } + + private static void SetWild(INamedValues values, string fullNamePart, string tokenPart) + { + values.Reset(fullNamePart); + values.Add(fullNamePart, tokenPart); + } + } +} diff --git a/src/common/details/named_values/parsers/option_x_token_parser.cs b/src/common/details/named_values/parsers/option_x_token_parser.cs new file mode 100644 index 00000000..0023332b --- /dev/null +++ b/src/common/details/named_values/parsers/option_x_token_parser.cs @@ -0,0 +1,96 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Security.Cryptography; + +namespace Azure.AI.Details.Common.CLI +{ + public class OptionXTokenParser : INamedValueTokenParser + { + private string _shortName; + private string _fullName; + private string _partsRequired; + + public OptionXTokenParser(string name, string fullName, string partsRequired) + { + _shortName = name; + _fullName = fullName; + _partsRequired = partsRequired; + } + + public override bool Parse(INamedValueTokens tokens, INamedValues values) + { + var nameTokensMatched = 0; + if (NamedValueTokenParserHelpers.MatchShortName(_shortName, tokens, values, out nameTokensMatched) || + NamedValueTokenParserHelpers.MatchFullName(_fullName, tokens, values, _partsRequired, out nameTokensMatched)) + { + var prefix = tokens.NamePrefixRequired(); + return prefix.Length > 0 + ? ParseValuesUntilNextTokenPrefixed(tokens, values, nameTokensMatched, prefix) + : ParseOneIndexedValue(tokens, values, nameTokensMatched); // e.g. {_fullName}.{index}=value + } + + return false; + } + + private bool ParseValuesUntilNextTokenPrefixed(INamedValueTokens tokens, INamedValues values, int nameTokensMatched, string prefix) + { + var queue = new Queue(); + + var iPeekToken = nameTokensMatched; + while (true) + { + var peekToken = tokens.PeekNextToken(iPeekToken); + if (peekToken == null) break; + if (peekToken.StartsWith(prefix)) break; + + var peekTokenValue = tokens.ValueFromToken(peekToken, values); + queue.Enqueue(peekTokenValue); + + iPeekToken++; + } + + var parsedValueCount = queue.Count(); + if (parsedValueCount > 0) + { + for (int i = 0; queue.Count() > 0; i++) + { + var argName = $"{_fullName}.{i}"; + if (values.Contains(argName)) continue; + + values.Add(argName, queue.Dequeue()); + } + } + + if (parsedValueCount > 0) + { + tokens.SkipTokens(nameTokensMatched + parsedValueCount); + return true; + } + + return false; + } + + private bool ParseOneIndexedValue(INamedValueTokens tokens, INamedValues values, int nameTokensMatched) + { + var peekToken = tokens.PeekNextToken(nameTokensMatched); + if (peekToken == null) return false; + + var ok = int.TryParse(peekToken, out var index); + if (!ok) return false; + + var argName = $"{_fullName}.{index}"; + if (values.Contains(argName)) return false; + + var value = tokens.PeekNextTokenValue(nameTokensMatched + 1, values); + if (value == null) return false; + + values.Add(argName, value); + tokens.SkipTokens(nameTokensMatched + 2); + + return true; + } + } +} diff --git a/src/common/details/named_values/tokens/OutputResultsFileToken.cs b/src/common/details/named_values/tokens/OutputResultsFileToken.cs new file mode 100644 index 00000000..446ddd25 --- /dev/null +++ b/src/common/details/named_values/tokens/OutputResultsFileToken.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class OutputResultsFileToken + { + public static NamedValueTokenData Data() => new NamedValueTokenData(_optionName, _fullName, _optionExample, _requiredDisplayName); + public static INamedValueTokenParser Parser() => new NamedValueTokenParser(_optionName, _fullName, "011;101", "1"); + + private const string _requiredDisplayName = "output results file"; + private const string _optionName = "--results-file"; + private const string _optionExample = "FILE"; + private const string _fullName = "output.results.file"; + } +} diff --git a/src/common/details/named_values/tokens/OutputResultsFormatToken.cs b/src/common/details/named_values/tokens/OutputResultsFormatToken.cs new file mode 100644 index 00000000..d1d3d3fa --- /dev/null +++ b/src/common/details/named_values/tokens/OutputResultsFormatToken.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class OutputResultsFormatToken + { + public static NamedValueTokenData Data() => new NamedValueTokenData(_optionName, _fullName, _optionExample, _requiredDisplayName); + public static INamedValueTokenParser Parser() => new NamedValueTokenParser(_optionName, _fullName, "011;101", "1", "trx;junit"); + + private const string _requiredDisplayName = "output results format"; + private const string _optionName = "--results-format"; + private const string _optionExample = "trx|junit"; + private const string _fullName = "output.results.format"; + } +} diff --git a/src/common/details/named_values/tokens/conatins_option_x_token.cs b/src/common/details/named_values/tokens/conatins_option_x_token.cs new file mode 100644 index 00000000..34629d05 --- /dev/null +++ b/src/common/details/named_values/tokens/conatins_option_x_token.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class ContainsOptionXToken + { + public static INamedValueTokenParser Parser() => new OptionXTokenParser(_optionName, _fullName, "1"); + + public static string GetOption(ICommandValues values, int x) => values.GetOrDefault($"{_fullName}.{x}", null); + + public static IEnumerable GetOptions(ICommandValues values) + { + for (int i = 0; true; i++) + { + var arg = GetOption(values, i); + if (arg == null) yield break; + yield return arg; + } + } + + private const string _requiredDisplayName = "contains text"; + private const string _optionName = null; + private const string _optionExample = "TEXT1 [...]"; + private const string _fullName = "contains"; + } +} diff --git a/src/common/details/named_values/tokens/file_option_x_token.cs b/src/common/details/named_values/tokens/file_option_x_token.cs new file mode 100644 index 00000000..35ea998f --- /dev/null +++ b/src/common/details/named_values/tokens/file_option_x_token.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class FileOptionXToken + { + public static INamedValueTokenParser Parser() => new OptionXTokenParser(_optionName, _fullName, "1"); + + public static string GetOption(ICommandValues values, int x) => values.GetOrDefault($"{_fullName}.{x}", null); + + public static IEnumerable GetOptions(ICommandValues values) + { + for (int i = 0; true; i++) + { + var arg = GetOption(values, i); + if (arg == null) yield break; + yield return arg; + } + } + + private const string _requiredDisplayName = "file name"; + private const string _optionName = null; + private const string _optionExample = "FILE"; + private const string _fullName = "file"; + } +} diff --git a/src/common/details/named_values/tokens/files_option_x_token.cs b/src/common/details/named_values/tokens/files_option_x_token.cs new file mode 100644 index 00000000..1dafbb62 --- /dev/null +++ b/src/common/details/named_values/tokens/files_option_x_token.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class FilesOptionXToken + { + public static INamedValueTokenParser Parser() => new OptionXTokenParser(_optionName, _fullName, "1"); + + public static string GetOption(ICommandValues values, int x) => values.GetOrDefault($"{_fullName}.{x}", null); + + public static IEnumerable GetOptions(ICommandValues values) + { + for (int i = 0; true; i++) + { + var arg = GetOption(values, i); + if (arg == null) yield break; + yield return arg; + } + } + + private const string _requiredDisplayName = "file names"; + private const string _optionName = null; + private const string _optionExample = "FILE1 [...]"; + private const string _fullName = "files"; + } +} diff --git a/src/common/details/named_values/tokens/remove_option_x_token.cs b/src/common/details/named_values/tokens/remove_option_x_token.cs new file mode 100644 index 00000000..dfc63449 --- /dev/null +++ b/src/common/details/named_values/tokens/remove_option_x_token.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class RemoveOptionXToken + { + public static INamedValueTokenParser Parser() => new OptionXTokenParser(_optionName, _fullName, "1"); + + public static string GetOption(ICommandValues values, int x) => values.GetOrDefault($"{_fullName}.{x}", null); + + public static IEnumerable GetOptions(ICommandValues values) + { + for (int i = 0; true; i++) + { + var arg = GetOption(values, i); + if (arg == null) yield break; + yield return arg; + } + } + + private const string _requiredDisplayName = "remove text"; + private const string _optionName = null; + private const string _optionExample = "TEXT1 [...]"; + private const string _fullName = "remove"; + } +} diff --git a/src/common/details/named_values/tokens/search_option_x_token.cs b/src/common/details/named_values/tokens/search_option_x_token.cs new file mode 100644 index 00000000..1c13917e --- /dev/null +++ b/src/common/details/named_values/tokens/search_option_x_token.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class SearchOptionXToken + { + public static INamedValueTokenParser Parser() => new OptionXTokenParser(_optionName, _fullName, "1"); + + public static string GetOption(ICommandValues values, int x) => values.GetOrDefault($"{_fullName}.{x}", null); + + public static IEnumerable GetOptions(ICommandValues values) + { + for (int i = 0; true; i++) + { + var arg = GetOption(values, i); + if (arg == null) yield break; + yield return arg; + } + } + + private const string _requiredDisplayName = "search term"; + private const string _optionName = null; + private const string _optionExample = "TERM"; + private const string _fullName = "search"; + } +} diff --git a/src/common/details/named_values/tokens/test_option_x_token.cs b/src/common/details/named_values/tokens/test_option_x_token.cs new file mode 100644 index 00000000..3cbb359c --- /dev/null +++ b/src/common/details/named_values/tokens/test_option_x_token.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class TestOptionXToken + { + public static INamedValueTokenParser Parser() => new OptionXTokenParser(_optionName, _fullName, "1"); + + public static string GetOption(ICommandValues values, int x) => values.GetOrDefault($"{_fullName}.{x}", null); + + public static IEnumerable GetOptions(ICommandValues values) + { + for (int i = 0; true; i++) + { + var arg = GetOption(values, i); + if (arg == null) yield break; + yield return arg; + } + } + + private const string _requiredDisplayName = "test"; + private const string _optionName = null; + private const string _optionExample = "TEST"; + private const string _fullName = "test"; + } +} diff --git a/src/common/details/named_values/tokens/tests_option_x_token.cs b/src/common/details/named_values/tokens/tests_option_x_token.cs new file mode 100644 index 00000000..12f52e46 --- /dev/null +++ b/src/common/details/named_values/tokens/tests_option_x_token.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI +{ + public class TestsOptionXToken + { + public static INamedValueTokenParser Parser() => new OptionXTokenParser(_optionName, _fullName, "1"); + + public static string GetOption(ICommandValues values, int x) => values.GetOrDefault($"{_fullName}.{x}", null); + + public static IEnumerable GetOptions(ICommandValues values) + { + for (int i = 0; true; i++) + { + var arg = GetOption(values, i); + if (arg == null) yield break; + yield return arg; + } + } + + private const string _requiredDisplayName = "tests"; + private const string _optionName = null; + private const string _optionExample = "TEST1 [...]"; + private const string _fullName = "tests"; + } +} diff --git a/src/extensions/testframework/IYamlTestFrameworkLogger.cs b/src/extensions/testframework/IYamlTestFrameworkLogger.cs new file mode 100644 index 00000000..eccc5196 --- /dev/null +++ b/src/extensions/testframework/IYamlTestFrameworkLogger.cs @@ -0,0 +1,10 @@ +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public interface IYamlTestFrameworkLogger + { + void LogVerbose(string text); + void LogInfo(string text); + void LogWarning(string text); + void LogError(string text); + } +} diff --git a/src/extensions/testframework/JunitXmlTestReporter.cs b/src/extensions/testframework/JunitXmlTestReporter.cs new file mode 100644 index 00000000..8758b052 --- /dev/null +++ b/src/extensions/testframework/JunitXmlTestReporter.cs @@ -0,0 +1,83 @@ +using System; +using System.Linq; +using System.Xml; +using Microsoft.VisualStudio.TestPlatform.ObjectModel; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public static class JunitXmlTestReporter + { + public static string WriteResultsFile(TestRun testRun, string resultsFile = "test-results.xml") + { + var testCases = testRun.TestCases; + var testResults = testRun.TestResults; + var startTime = testRun.StartTime; + var endTime = testRun.EndTime; + + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = " "; + settings.NewLineChars = "\n"; + settings.NewLineHandling = NewLineHandling.Replace; + settings.OmitXmlDeclaration = false; + + var writer = XmlWriter.Create(resultsFile, settings); + writer.WriteStartDocument(); + writer.WriteStartElement("testsuites"); + + writer.WriteStartElement("testsuite"); + writer.WriteAttributeString("name", "TestSuite"); + writer.WriteAttributeString("tests", testResults.Count.ToString()); + writer.WriteAttributeString("failures", testResults.Count(r => r.Outcome == TestOutcome.Failed).ToString()); + writer.WriteAttributeString("errors", "0"); + writer.WriteAttributeString("time", testResults.Sum(r => r.Duration.TotalSeconds).ToString()); + writer.WriteAttributeString("timestamp", endTime.ToString("yyyy-MM-ddTHH:mm:ss")); + + foreach (var testResult in testResults) + { + writer.WriteStartElement("testcase"); + writer.WriteAttributeString("name", testResult.TestCase.DisplayName); + writer.WriteAttributeString("classname", testResult.TestCase.FullyQualifiedName); + writer.WriteAttributeString("time", testResult.Duration.TotalSeconds.ToString()); + + var stdout = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardOutCategory)?.Text; + var stderr = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardErrorCategory)?.Text; + var debugTrace = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.DebugTraceCategory)?.Text; + var message = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.AdditionalInfoCategory)?.Text; + + writer.WriteStartElement("system-out"); + writer.WriteRaw(System.Security.SecurityElement + .Escape(stdout.Replace("\u001b", string.Empty)) + .Replace("\r\n", " \n")); + writer.WriteEndElement(); + + writer.WriteStartElement("system-err"); + writer.WriteRaw(System.Security.SecurityElement + .Escape(stderr.Replace("\u001b", string.Empty)) + .Replace("\r\n", " \n")); + writer.WriteEndElement(); + + if (testResult.Outcome == TestOutcome.Failed) + { + writer.WriteStartElement("failure"); + writer.WriteAttributeString("message", testResult.ErrorMessage); + writer.WriteAttributeString("type", "Failure"); + writer.WriteCData(testResult.ErrorStackTrace); + writer.WriteEndElement(); + } + + writer.WriteEndElement(); + } + + writer.WriteEndElement(); + writer.WriteEndElement(); + writer.WriteEndDocument(); + + writer.Close(); + writer.Dispose(); + + return resultsFile; + } + } +} + diff --git a/src/extensions/testframework/Logger.cs b/src/extensions/testframework/Logger.cs index c19acf90..f1cebe0a 100644 --- a/src/extensions/testframework/Logger.cs +++ b/src/extensions/testframework/Logger.cs @@ -1,10 +1,6 @@ using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; -using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; -using System; using System.Collections.Generic; -using System.Diagnostics; -using System.IO; using System.Linq; using System.Text; using System.Threading; @@ -14,23 +10,19 @@ namespace Azure.AI.Details.Common.CLI.TestFramework { public class Logger { - public static void Log(IMessageLogger logger) + public static void Log(IYamlTestFrameworkLogger logger) { Logger.logger = logger; } public static void Log(string text) { - var dt = $"{DateTime.Now}"; using (var mutex = new Mutex(false, "Logger Mutex")) { mutex.WaitOne(); - #if DEBUG - logger?.SendMessage(TestMessageLevel.Informational, $"{dt}: {text}"); + logger?.LogInfo(text); #endif - File.AppendAllText(_logPath, $"{dt}: INFO: {text}\n"); - mutex.ReleaseMutex(); } } @@ -44,42 +36,30 @@ public static void LogIf(bool log, string text) public static void LogInfo(string text) { - var dt = $"{DateTime.Now}"; using (var mutex = new Mutex(false, "Logger Mutex")) { mutex.WaitOne(); - - logger?.SendMessage(TestMessageLevel.Informational, $"{dt}: {text}"); - File.AppendAllText(_logPath, $"{dt}: INFO: {text}\n"); - + logger?.LogInfo(text); mutex.ReleaseMutex(); } } public static void LogWarning(string text) { - var dt = $"{DateTime.Now}"; using (var mutex = new Mutex(false, "Logger Mutex")) { - mutex.WaitOne(); - - logger?.SendMessage(TestMessageLevel.Warning, $"{dt}: {text}"); - File.AppendAllText(_logPath, $"{dt}: WARNING: {text}\n"); - + mutex.WaitOne(); + logger?.LogWarning(text); mutex.ReleaseMutex(); } } public static void LogError(string text) { - var dt = $"{DateTime.Now}"; using (var mutex = new Mutex(false, "Logger Mutex")) { mutex.WaitOne(); - - logger?.SendMessage(TestMessageLevel.Error, $"{dt}: {text}"); - File.AppendAllText(_logPath, $"{dt}: ERROR: {text}\n"); - + logger?.LogError(text); mutex.ReleaseMutex(); } } @@ -87,17 +67,8 @@ public static void LogError(string text) #endregion #region private methods and data - - private static string GetLogPath() - { - var pid = Process.GetCurrentProcess().Id.ToString(); - var time = DateTime.Now.ToFileTime().ToString(); - return $"log-ai-cli-test-framework-{time}-{pid}.log"; - } - private static IMessageLogger logger = null; - - private static string _logPath = GetLogPath(); + private static IYamlTestFrameworkLogger logger = null; #endregion } diff --git a/src/extensions/testframework/README.md b/src/extensions/testframework/README.md new file mode 100644 index 00000000..67dae499 --- /dev/null +++ b/src/extensions/testframework/README.md @@ -0,0 +1,244 @@ +# `ai test` + +`ai test` is a YAML-based test framework/runner that can be used to run tests on any command-line tool or script. It is designed to be simple to use and understand, and to be able to run tests in parallel. + +Examples: + +```yaml +- name: Build search index + command: ai search index update --files "data/*.md" --index-name myindex + expect: | + Updating search index 'myindex' ... + Updating search index 'myindex' ... Done! + +- name: Evaluate chat model + command: ai chat evaluate --data-input questions.jsonl + expect-gpt: | + The GPT coherence score must be at least 4.2 +``` + +The test case YAML file contains a list of test cases. Each test case is a dictionary with the following keys: + +* `name` (required): The name of the test case. +* `command`, `script`, `bash` (required): The command or script to run. +- `env` (optional): A dictionary of environment variables to set before running the command or script. +- `input` (optional): The input to pass to the command or script. +- `expect` (optional): A list of regular expressions that must be matched in the stdout/stderr output. +- `expect-gpt` (optional): A string that instructs the LLM (e.g. GPT-4) to decide pass/fail based on stdout/stderr. +- `not-expect` (optional): A list of regular expressions that must not be matched in the stdout/stderr output. +- `parallelize` (optional): Whether the test case should run in parallel with other test cases. +- `skipOnFailure` (optional): Whether the test case should be skipped when it fails. +- `tag`/`tags` (optional): A list of tags to associate with the test case. +- `timeout` (optional): The maximum time allowed to execute the test case, in milliseconds. +- `workingDirectory` (optional): The working directory where the test will be run. + +Test cases can be organized into areas, sub-areas, and so on. + +```yaml +- area: Area 1 + tests: + + - name: Test 1 + command: echo "Hello, world!" + + - name: Test 2 + command: echo "Goodbye, world!" +``` + +Test cases can also be grouped into classes. + +```yaml +- class: Class 1 + tests: + + - name: Test 1 + command: echo "Hello, world!" + + - name: Test 2 + command: echo "Goodbye, world!" +``` + +If no class is specified, the default class is "TestCases". + +## `command`, `script`, `bash` + +Required. + +Represents how the test case will be run. + +If the specified command or script returns an error level of non-zero, the test will fail. If it returns zero, it will pass (given that all 'expect' conditions are also met). + +Example command: + +```yaml +command: ai chat --interactive +``` + +Example for a bash script: + +```yaml +bash: | + if [ -f /etc/os-release ]; then + python3 script.py + else + py script.py + fi +``` + +## `env` + +Optional. Inherits from parent. + +When present, a dictionary of environment variables to set before running the command or script. + +Example: + +```yaml +env: + JAVA_HOME: /path/to/java +``` + +## `input` + +Optional. + +When present, will be passed to the command or script as stdin. + +Example: + +```yaml +input: | + Tell me a joke + Tell me another + exit +``` + +## `expect` + +Optional. + +Each string (or line in multiline string) is a regular expression that must be matched in the stdout/stderr output. + +If any regular expression is not matched, the test will fail. If all expressions are matched, in order, the test will pass. + +Example: + +```yaml +expect: | + Regex 1 + Regex 2 +``` + +## `expect-gpt` + +Optional. + +Represents instructions given to LLM (e.g. GPT-4) along with stdout/stderr to decide whether the test passes or fails. + +Example: + +```yaml +expect-gpt: the output must have exactly two jokes +``` + +## `not-expect` + +Optional. + +When present, each string (or line in multiline string) is a regular expression that must not be matched in the stdout/stderr output. + +If any regular expression is matched, the test fails. If none match, the test passes. + +Example: + +```yaml +not-expect: | + ERROR + curseword1 + curseword2 +``` + +## `parallelize` + +Optional. + +When present, specifies if the test cases should run in parallel or not. + +By default, it is set to `false` for all tests, except for the first step in a `steps` test sequence. + +Example: + +```yaml +parallelize: true +``` + +## `skipOnFailure` + +Optional. + +When present, specifies if the test case should be skipped when it fails. + +By default, it is set to `false`. + +Example: + +```yaml +skipOnFailure: true +``` + +## `tag`/`tags` + +Optional. Inherits from parent. + +When present, specifies a list of tags to associate with the test case. + +Tags accumulate from parent to child, so if a tag is specified in a parent, it will be inherited by all children. + +Examples: + +```yaml +tag: skip +``` + +```yaml +tags: +- slow +- performance +- long-running +``` + +```yaml +area: Area 1 +tags: [echo] +tests: + +- name: Test 1 + command: echo "Hello, world!" + tags: [hello] + +- name: Test 2 + command: echo "Goodbye, world!" + tags: [bye] +``` + +## `timeout` + +Optional. + +When present, specifies the maximum time allowed to execute the test case, in milliseconds. Defaults to infinite. + +Example: + +```yaml +timeout: 3000 # 3 seconds +``` + + +## `workingDirectory` + +Optional. Inherits from parent. + +When present, specifies an absolute path or relative path where the test will be run. + +When specified as a relative path, it will be relative to the working directory of the parent, or if no parent exists, where the test case file is located. + diff --git a/src/extensions/testframework/TestRun.cs b/src/extensions/testframework/TestRun.cs new file mode 100644 index 00000000..40cfb265 --- /dev/null +++ b/src/extensions/testframework/TestRun.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestPlatform.ObjectModel; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public class TestRun + { + public void StartTest(TestCase testCase, Guid? guid = null) + { + _startTime ??= DateTime.Now; + _testCases.Add(testCase); + SetExecutionId(testCase, guid ?? Guid.NewGuid()); + } + + public void RecordTest(TestResult testResult) + { + _testResults.Add(testResult); + } + + public void EndTest(TestCase testCase, TestOutcome outcome) + { + _endTime = DateTime.Now; + } + + public void EndRun() + { + var now = DateTime.Now; + _startTime ??= now; + _endTime = now; + } + + public IList TestCases => _testCases.ToList(); + + public IList TestResults => _testResults.ToList(); + + public TimeSpan Duration + { + get + { + return _startTime != null && _endTime != null + ? (_endTime.Value - _startTime.Value) + : TimeSpan.Zero; + } + } + + public DateTime StartTime => _startTime ?? throw new InvalidOperationException("RunStartTime is not set"); + + public DateTime EndTime => _endTime ?? throw new InvalidOperationException("RunEndTime is not set"); + + public Guid GetExecutionId(TestCase testCase) + { + lock (_testToExecutionMap) + { + return _testToExecutionMap[testCase.Id]; + } + } + + private void SetExecutionId(TestCase testCase, Guid guid) + { + lock (_testToExecutionMap) + { + _testToExecutionMap[testCase.Id] = guid; + } + } + + private DateTime? _startTime; + private DateTime? _endTime; + + private List _testCases = new List(); + private Dictionary _testToExecutionMap = new Dictionary(); + private List _testResults = new List(); + } +} + diff --git a/src/extensions/testframework/TimeSpanFormatter.cs b/src/extensions/testframework/TimeSpanFormatter.cs new file mode 100644 index 00000000..02f5d25b --- /dev/null +++ b/src/extensions/testframework/TimeSpanFormatter.cs @@ -0,0 +1,18 @@ +using System; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public class TimeSpanFormatter + { + public static string FormatMsOrSeconds(TimeSpan timeSpan) + { + var ms = timeSpan.TotalMilliseconds; + var secs = ms / 1000; + var duration = ms >= 1000 + ? secs.ToString("0.00") + " seconds" + : ms.ToString("0") + " ms"; + return duration; + } + } +} + diff --git a/src/extensions/testframework/TrxXmlTestReporter.cs b/src/extensions/testframework/TrxXmlTestReporter.cs new file mode 100644 index 00000000..281bb121 --- /dev/null +++ b/src/extensions/testframework/TrxXmlTestReporter.cs @@ -0,0 +1,277 @@ +using System; +using System.Linq; +using System.Xml; +using Microsoft.VisualStudio.TestPlatform.ObjectModel; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public static class TrxXmlTestReporter + { + public static string WriteResultsFile(TestRun testRun, string resultsFile = "test-results.trx") + { + var testCases = testRun.TestCases; + var testResults = testRun.TestResults; + var startTime = testRun.StartTime; + var endTime = testRun.EndTime; + + var assembly = typeof(YamlTestFrameworkConsoleHost).Assembly; + var assemblyPath = assembly.Location; + + var testRunId = Guid.NewGuid().ToString(); + var testListId = "8c84fa94-04c1-424b-9868-57a2d4851a1d"; + var testType = "13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b"; + var userName = Environment.UserName; + var machineName = Environment.MachineName; + var userAtMachine = userName.Split('\\', '/').Last() + "@" + machineName; + var testRunName = userAtMachine + " " + endTime.ToString("yyyy-MM-dd HH:mm:ss"); + + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = " "; + settings.NewLineChars = "\n"; + settings.NewLineHandling = NewLineHandling.Replace; + settings.OmitXmlDeclaration = false; + + var writer = XmlWriter.Create(resultsFile, settings); + writer.WriteStartDocument(); + writer.WriteStartElement("", "TestRun", "http://microsoft.com/schemas/VisualStudio/TeamTest/2010"); + writer.WriteAttributeString("id", testRunId); + writer.WriteAttributeString("name", testRunName); + writer.WriteAttributeString("runUser", userName); + + writer.WriteStartElement("Times"); + writer.WriteAttributeString("creation", endTime.ToString("o")); + writer.WriteAttributeString("queuing", endTime.ToString("o")); + writer.WriteAttributeString("start", startTime.ToString("o")); + writer.WriteAttributeString("finish", endTime.ToString("o")); + writer.WriteEndElement(); + + writer.WriteStartElement("Results"); + foreach (var testResult in testResults) + { + var executionId = testRun.GetExecutionId(testResult.TestCase).ToString(); + var stdout = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardOutCategory)?.Text; + var stderr = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardErrorCategory)?.Text; + var debugTrace = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.DebugTraceCategory)?.Text; + var message = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.AdditionalInfoCategory)?.Text; + + writer.WriteStartElement("UnitTestResult"); + writer.WriteAttributeString("executionId", executionId); + writer.WriteAttributeString("testId", testResult.TestCase.Id.ToString()); + writer.WriteAttributeString("testName", testResult.TestCase.FullyQualifiedName); + writer.WriteAttributeString("computerName", machineName); + writer.WriteAttributeString("duration", testResult.Duration.ToString()); + writer.WriteAttributeString("startTime", testResult.StartTime.DateTime.ToString("o")); + writer.WriteAttributeString("endTime", testResult.EndTime.DateTime.ToString("o")); + writer.WriteAttributeString("testType", testType); + writer.WriteAttributeString("outcome", OutcomeToString(testResult.Outcome)); + writer.WriteAttributeString("testListId", testListId); + writer.WriteAttributeString("relativeResultsDirectory", Guid.NewGuid().ToString()); + writer.WriteStartElement("Output"); + + if (!string.IsNullOrEmpty(stdout)) + { + writer.WriteStartElement("StdOut"); + writer.WriteRaw(System.Security.SecurityElement + .Escape(stdout.Replace("\u001b", string.Empty)) + .Replace("\r\n", " \n")); + writer.WriteEndElement(); + } + + if (!string.IsNullOrEmpty(stderr)) + { + writer.WriteStartElement("StdErr"); + writer.WriteRaw(System.Security.SecurityElement + .Escape(stderr.Replace("\u001b", string.Empty)) + .Replace("\r\n", " \n")); + writer.WriteEndElement(); + } + + if (!string.IsNullOrEmpty(debugTrace)) + { + writer.WriteElementString("DebugTrace", debugTrace); + } + + writer.WriteStartElement("ErrorInfo"); + writer.WriteElementString("Message", testResult.ErrorMessage); + writer.WriteElementString("StackTrace", testResult.ErrorStackTrace); + writer.WriteEndElement(); + writer.WriteStartElement("TextMessages"); + + if (!string.IsNullOrEmpty(message)) + { + writer.WriteElementString("Message", message); + } + writer.WriteEndElement(); + writer.WriteEndElement(); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + + writer.WriteStartElement("TestDefinitions"); + foreach (var testCase in testCases) + { + var executionId = testRun.GetExecutionId(testCase).ToString(); + var qualifiedParts = testCase.FullyQualifiedName.Split('.'); + var className = string.Join(".", qualifiedParts.Take(qualifiedParts.Length - 1)); + var name = qualifiedParts.Last(); + writer.WriteStartElement("UnitTest"); + writer.WriteAttributeString("name", testCase.DisplayName); + writer.WriteAttributeString("storage", assemblyPath); + writer.WriteAttributeString("id", testCase.Id.ToString()); + writer.WriteStartElement("Execution"); + writer.WriteAttributeString("id", executionId); + writer.WriteEndElement(); + writer.WriteStartElement("TestMethod"); + writer.WriteAttributeString("codeBase", assemblyPath); + writer.WriteAttributeString("adapterTypeName", testCase.ExecutorUri.ToString()); + writer.WriteAttributeString("className", className); + writer.WriteAttributeString("name", name); + writer.WriteEndElement(); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + + writer.WriteStartElement("TestEntries"); + foreach (var testCase in testCases) + { + var executionId = testRun.GetExecutionId(testCase).ToString(); + writer.WriteStartElement("TestEntry"); + writer.WriteAttributeString("testId", testCase.Id.ToString()); + writer.WriteAttributeString("executionId", executionId); + writer.WriteAttributeString("testListId", testListId); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + + writer.WriteStartElement("TestLists"); + writer.WriteStartElement("TestList"); + writer.WriteAttributeString("name", "Results Not in a List"); + writer.WriteAttributeString("id", testListId); + writer.WriteEndElement(); + writer.WriteStartElement("TestList"); + writer.WriteAttributeString("name", "All Loaded Results"); + writer.WriteAttributeString("id", "19431567-8539-422a-85d7-44ee4e166bda"); + writer.WriteEndElement(); + writer.WriteEndElement(); + + writer.WriteStartElement("ResultSummary"); + writer.WriteAttributeString("outcome", "Completed"); + + writer.WriteStartElement("Counters"); + writer.WriteAttributeString("total", testResults.Count.ToString()); + writer.WriteAttributeString("executed", testResults.Count(r => IsExecuted(r)).ToString()); + writer.WriteAttributeString("passed", testResults.Count(r => IsPassed(r)).ToString()); + writer.WriteAttributeString("failed", testResults.Count(r => IsFailed(r)).ToString()); + writer.WriteAttributeString("error", testResults.Count(r => IsError(r)).ToString()); + writer.WriteAttributeString("timeout", testResults.Count(r => IsTimeout(r)).ToString()); + writer.WriteAttributeString("aborted", testResults.Count(r => IsAborted(r)).ToString()); + writer.WriteAttributeString("inconclusive", testResults.Count(r => IsInConclusive(r)).ToString()); + writer.WriteAttributeString("passedButRunAborted", testResults.Count(r => IsPassedButRunaborted(r)).ToString()); + writer.WriteAttributeString("notRunnable", testResults.Count(r => IsNotRunnable(r)).ToString()); + writer.WriteAttributeString("notExecuted", testResults.Count(r => IsNotExecuted(r)).ToString()); + writer.WriteAttributeString("disconnected", testResults.Count(r => IsDisconnected(r)).ToString()); + writer.WriteAttributeString("warning", testResults.Count(r => IsWarning(r)).ToString()); + writer.WriteAttributeString("completed", "0"); + writer.WriteAttributeString("inProgress", "0"); + writer.WriteAttributeString("pending", "0"); + writer.WriteEndElement(); + + writer.WriteStartElement("Output"); + writer.WriteElementString("StdOut", ""); + writer.WriteEndElement(); + + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.WriteEndDocument(); + + writer.Close(); + writer.Dispose(); + + return resultsFile; + } + + private static string OutcomeToString(TestOutcome outcome) + { + return outcome switch { + TestOutcome.None => "None", + TestOutcome.Passed => "Passed", + TestOutcome.Failed => "Failed", + TestOutcome.Skipped => "NotExecuted", + TestOutcome.NotFound => "NotFound", + _ => "None", + }; + } + + private static bool IsExecuted(TestResult r) + { + return IsPassed(r) || IsFailed(r); + } + + private static bool IsPassed(TestResult r) + { + return r.Outcome == TestOutcome.Passed; + } + + private static bool IsFailed(TestResult r) + { + return r.Outcome == TestOutcome.Failed; + } + + private static bool IsError(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.Error; + } + + private static bool IsTimeout(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.Timeout; + } + + private static bool IsAborted(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.Aborted; + } + + private static bool IsInConclusive(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.Inconclusive; + } + + private static bool IsPassedButRunaborted(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.PassedButRunAborted; + } + + private static bool IsNotRunnable(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.NotRunnable; + } + + private static bool IsNotExecuted(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.NotExecuted; + } + + private static bool IsDisconnected(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.Disconnected; + } + + private static bool IsWarning(TestResult r) + { + return false; + // return r.Outcome == TestOutcome.Warning; + } + } +} + diff --git a/src/extensions/testframework/YamlEnvHelpers.cs b/src/extensions/testframework/YamlEnvHelpers.cs new file mode 100644 index 00000000..d40c7326 --- /dev/null +++ b/src/extensions/testframework/YamlEnvHelpers.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using YamlDotNet.Helpers; +using YamlDotNet.RepresentationModel; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public class YamlEnvHelpers + { + public static Dictionary GetDefaultEnvironment(bool fromCurrentProcess, string workingDirectory) + { + var env = new Dictionary(); + + if (fromCurrentProcess) + { + var environmentFromCurrentProcess = GetCurrentProcessEnvironment(); + foreach (var key in environmentFromCurrentProcess.Keys) + { + env[key] = environmentFromCurrentProcess[key]; + } + } + + if (!string.IsNullOrEmpty(workingDirectory)) + { + var environmentFromFile = GetEnvironmentFromDirectory(workingDirectory); + foreach (var key in environmentFromFile.Keys) + { + env[key] = environmentFromFile[key]; + } + } + + return env; + } + + public static Dictionary GetEnvironmentFromDirectory(string workingDirectory) + { + var envFile = Path.Combine(workingDirectory, ".env"); + return GetEnvironmentFromFile(envFile); + } + + public static Dictionary GetEnvironmentFromFile(string envFile) + { + var fileOk = File.Exists(envFile); + if (!fileOk) return new Dictionary(); + + var content = File.ReadAllText(envFile); + return GetEnvironmentFromMultiLineString(content); + } + + public static Dictionary GetEnvironmentFromMultiLineString(string content) + { + var lines = content.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); + return lines + .Select(line => line.Split(new[] { '=' }, 2)) + .ToDictionary(parts => parts[0], parts => parts[1]); + } + + public static Dictionary GetCurrentProcessEnvironment() + { + var env = Environment.GetEnvironmentVariables(); + return env.Keys.Cast().ToDictionary(key => key, key => env[key].ToString()); + } + + public static Dictionary UpdateCopyEnvironment(Dictionary environment, YamlMappingNode mapping) + { + var envNode = mapping.Children.ContainsKey("env") ? mapping.Children["env"] : null; + if (envNode == null) return environment; + + var asMapping = envNode as YamlMappingNode; + var asSequence = envNode as YamlSequenceNode; + if (asMapping == null && asSequence == null) return environment; + + var env = new Dictionary(environment); + if (asMapping != null) + { + UpdateEnvironment(env, asMapping.Children); + } + else if (asSequence != null) + { + foreach (var item in asSequence.Children) + { + var itemAsMapping = item as YamlMappingNode; + if (itemAsMapping != null) + { + UpdateEnvironment(env, itemAsMapping.Children); + } + } + } + + return env; + } + + public static Dictionary GetNewAndUpdatedEnvironmentVariables(Dictionary original, Dictionary check) + { + var newAndUpdated = new Dictionary(); + foreach (var item in check) + { + var isNew = !original.ContainsKey(item.Key); + var isUpdated = !isNew && original[item.Key] != item.Value; + if (isNew || isUpdated) + { + newAndUpdated.Add(item.Key, item.Value); + } + } + return newAndUpdated; + } + + private static void UpdateEnvironment(Dictionary env, IOrderedDictionary children) + { + foreach (var item in children) + { + var key = (item.Key as YamlScalarNode)?.Value; + var value = (item.Value as YamlScalarNode)?.Value; + if (key != null && value != null) + { + env[key] = value.Contains("$(") && value.Contains(')') + ? ExpandInlineEnvironmentVariables(env, value!) + : value!; + } + } + } + + private static string ExpandInlineEnvironmentVariables(Dictionary env, string s) + { + var sb = new StringBuilder(); + + var i = 0; + while (i < s.Length) + { + if (s[i] == '$' && i + 1 < s.Length && s[i+1] == '(') + { + var closeAt = s.IndexOf(')', i + 1); + if (closeAt > 0 && closeAt < s.Length) + { + var nameLen = closeAt - i - 2; + var name = s.Substring(i + 2, nameLen); + if (env.ContainsKey(name)) + { + sb.Append(env[name]); + i += nameLen + 3; + continue; + } + } + } + + sb.Append(s[i]); + i++; + } + + return sb.ToString(); + + } + } +} diff --git a/src/extensions/testframework/YamlTestCaseParseContext.cs b/src/extensions/testframework/YamlTestCaseParseContext.cs index 2ac6ddf8..1d270ac0 100644 --- a/src/extensions/testframework/YamlTestCaseParseContext.cs +++ b/src/extensions/testframework/YamlTestCaseParseContext.cs @@ -12,6 +12,7 @@ public struct YamlTestCaseParseContext public string Class; public Dictionary> Tags; + public Dictionary Environment; public string WorkingDirectory; } } diff --git a/src/extensions/testframework/YamlTestCaseParser.cs b/src/extensions/testframework/YamlTestCaseParser.cs index 5bf46af6..daed4232 100644 --- a/src/extensions/testframework/YamlTestCaseParser.cs +++ b/src/extensions/testframework/YamlTestCaseParser.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Text; using Microsoft.VisualStudio.TestPlatform.ObjectModel; -using YamlDotNet.Helpers; using YamlDotNet.RepresentationModel; namespace Azure.AI.Details.Common.CLI.TestFramework @@ -25,6 +24,7 @@ public static IEnumerable TestCasesFromYaml(string source, FileInfo fi Area = GetRootArea(file), Class = GetScalarString(null, defaultTags, "class", defaultClassName), Tags = defaultTags, + Environment = YamlEnvHelpers.GetDefaultEnvironment(true, workingDirectory), WorkingDirectory = workingDirectory }; @@ -77,8 +77,16 @@ private static IEnumerable TestCasesFromYamlSequence(YamlTestCaseParse var tests = new List(); if (sequence == null) return tests; - foreach (YamlMappingNode mapping in sequence.Children) + foreach (var node in sequence.Children) { + var mapping = node as YamlMappingNode; + if (mapping == null) + { + var message = $"Error parsing YAML: expected mapping at {context.File.FullName}({node.Start.Line})"; + Logger.LogError(message); + return null; + } + var fromMapping = TestCasesFromYamlMapping(context, mapping); if (fromMapping != null) { @@ -135,6 +143,11 @@ private static TestCase GetTestFromNode(YamlTestCaseParseContext context, YamlMa SetTestCaseProperty(test, "working-directory", workingDirectory); + var processEnv = YamlEnvHelpers.GetCurrentProcessEnvironment(); + var testEnv = YamlEnvHelpers.UpdateCopyEnvironment(context.Environment, mapping); + testEnv = YamlEnvHelpers.GetNewAndUpdatedEnvironmentVariables(processEnv, testEnv); + SetTestCasePropertyMap(test, "env", testEnv); + SetTestCasePropertyMap(test, "foreach", mapping, "foreach", workingDirectory); SetTestCasePropertyMap(test, "arguments", mapping, "arguments", workingDirectory); SetTestCasePropertyMap(test, "input", mapping, "input", workingDirectory); @@ -156,6 +169,7 @@ private static IEnumerable CheckForChildren(YamlTestCaseParseContext c context.Class = GetScalarString(mapping, "class", context.Class); context.Area = UpdateArea(mapping, context.Area); context.Tags = YamlTagHelpers.UpdateCopyTags(context.Tags, mapping); + context.Environment = YamlEnvHelpers.UpdateCopyEnvironment(context.Environment, mapping); context.WorkingDirectory = UpdateWorkingDirectory(mapping, context.WorkingDirectory); return TestCasesFromYamlSequenceOfSteps(context, stepsSequence); @@ -166,6 +180,7 @@ private static IEnumerable CheckForChildren(YamlTestCaseParseContext c context.Class = GetScalarString(mapping, "class", context.Class); context.Area = UpdateArea(mapping, context.Area); context.Tags = YamlTagHelpers.UpdateCopyTags(context.Tags, mapping); + context.Environment = YamlEnvHelpers.UpdateCopyEnvironment(context.Environment, mapping); context.WorkingDirectory = UpdateWorkingDirectory(mapping, context.WorkingDirectory); return TestCasesFromYamlSequence(context, testsSequence).ToList(); @@ -216,7 +231,7 @@ private static void CheckInvalidTestCaseNodes(YamlTestCaseParseContext context, private static bool IsValidTestCaseNode(string value) { - return ";area;class;name;cli;command;script;bash;timeout;foreach;arguments;input;expect;expect-gpt;not-expect;parallelize;simulate;skipOnFailure;tag;tags;workingDirectory;sanitize;".IndexOf($";{value};") >= 0; + return ";area;class;name;cli;command;script;bash;timeout;foreach;arguments;input;expect;expect-gpt;not-expect;parallelize;simulate;skipOnFailure;tag;tags;workingDirectory;env;sanitize;".IndexOf($";{value};") >= 0; } private static void SetTestCaseProperty(TestCase test, string propertyName, YamlMappingNode mapping, string mappingName) @@ -233,6 +248,17 @@ private static void SetTestCaseProperty(TestCase test, string propertyName, stri } } + private static void SetTestCasePropertyMap(TestCase test, string propertyName, IDictionary map) + { + var sb = new StringBuilder(); + foreach (var key in map.Keys) + { + sb.Append($"{key}={map[key]}\n"); + } + + SetTestCaseProperty(test, propertyName, sb.ToString()); + } + private static void SetTestCasePropertyMap(TestCase test, string propertyName, YamlMappingNode testNode, string mappingName, string workingDirectory) { var ok = testNode.Children.ContainsKey(mappingName); @@ -462,6 +488,7 @@ private static void SetTestCaseTagsAsTraits(TestCase test, Dictionary TestCaseGetResults(TestCase test) var expect = YamlTestProperties.Get(test, "expect"); var expectGpt = YamlTestProperties.Get(test, "expect-gpt"); var notExpect = YamlTestProperties.Get(test, "not-expect"); + var env = YamlTestProperties.Get(test, "env"); var workingDirectory = YamlTestProperties.Get(test, "working-directory"); var timeout = int.Parse(YamlTestProperties.Get(test, "timeout")); var simulate = YamlTestProperties.Get(test, "simulate"); @@ -92,8 +93,8 @@ private static IEnumerable TestCaseGetResults(TestCase test) var start = DateTime.Now; var outcome = string.IsNullOrEmpty(simulate) - ? RunTestCase(test, skipOnFailure, cli, command, script, scriptIsBash, foreachItem, arguments, input, expect, expectGpt, notExpect, workingDirectory, timeout, out string stdOut, out string stdErr, out string errorMessage, out string stackTrace, out string additional, out string debugTrace) - : SimulateTestCase(test, simulate, cli, command, script, scriptIsBash, foreachItem, arguments, input, expect, expectGpt, notExpect, workingDirectory, out stdOut, out stdErr, out errorMessage, out stackTrace, out additional, out debugTrace); + ? RunTestCase(test, skipOnFailure, cli, command, script, scriptIsBash, foreachItem, arguments, input, expect, expectGpt, notExpect, env, workingDirectory, timeout, out string stdOut, out string stdErr, out string errorMessage, out string stackTrace, out string additional, out string debugTrace) + : SimulateTestCase(test, simulate, cli, command, script, scriptIsBash, foreachItem, arguments, input, expect, expectGpt, notExpect, env, workingDirectory, out stdOut, out stdErr, out errorMessage, out stackTrace, out additional, out debugTrace); // #if DEBUG // additional += outcome == TestOutcome.Failed ? $"\nEXTRA: {ExtraDebugInfo()}" : ""; @@ -212,7 +213,7 @@ private static Dictionary DupAndAdd(Dictionary d return dup; } - private static TestOutcome RunTestCase(TestCase test, bool skipOnFailure, string cli, string command, string script, bool scriptIsBash, string @foreach, string arguments, string input, string expect, string expectGpt, string notExpect, string workingDirectory, int timeout, out string stdOut, out string stdErr, out string errorMessage, out string stackTrace, out string additional, out string debugTrace) + private static TestOutcome RunTestCase(TestCase test, bool skipOnFailure, string cli, string command, string script, bool scriptIsBash, string @foreach, string arguments, string input, string expect, string expectGpt, string notExpect, string env, string workingDirectory, int timeout, out string stdOut, out string stdErr, out string errorMessage, out string stackTrace, out string additional, out string debugTrace) { var outcome = TestOutcome.None; @@ -251,6 +252,7 @@ private static TestOutcome RunTestCase(TestCase test, bool skipOnFailure, string RedirectStandardOutput = true, WorkingDirectory = workingDirectory }; + UpdateEnvironment(startInfo, env); UpdatePathEnvironment(startInfo); var process = Process.Start(startInfo); @@ -594,6 +596,18 @@ private static IEnumerable GetPossibleRunTimeLocations() return new string[]{ "" }; } + private static void UpdateEnvironment(ProcessStartInfo startInfo, string envAsMultiLineString) + { + var ok = !string.IsNullOrEmpty(envAsMultiLineString); + if (!ok) return; + + var env = YamlEnvHelpers.GetEnvironmentFromMultiLineString(envAsMultiLineString); + foreach (var item in env) + { + startInfo.Environment[item.Key] = item.Value; + } + } + static void UpdatePathEnvironment(ProcessStartInfo startInfo) { var cli = new FileInfo(startInfo.FileName); @@ -785,7 +799,7 @@ private static string GetKeyValueArgs(List> kvs) return args.ToString().TrimEnd(); } - private static TestOutcome SimulateTestCase(TestCase test, string simulate, string cli, string command, string script, bool scriptIsBash, string @foreach, string arguments, string input, string expect, string expectGpt, string notExpect, string workingDirectory, out string stdOut, out string stdErr, out string errorMessage, out string stackTrace, out string additional, out string debugTrace) + private static TestOutcome SimulateTestCase(TestCase test, string simulate, string cli, string command, string script, bool scriptIsBash, string @foreach, string arguments, string input, string expect, string expectGpt, string notExpect, string env, string workingDirectory, out string stdOut, out string stdErr, out string errorMessage, out string stackTrace, out string additional, out string debugTrace) { var sb = new StringBuilder(); sb.AppendLine($"cli='{cli?.Replace("\n", "\\n")}'"); diff --git a/src/extensions/testframework/YamlTestFrameworkConsoleHost.cs b/src/extensions/testframework/YamlTestFrameworkConsoleHost.cs new file mode 100644 index 00000000..e7cd1e0d --- /dev/null +++ b/src/extensions/testframework/YamlTestFrameworkConsoleHost.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using Microsoft.VisualStudio.TestPlatform.ObjectModel; +using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public class YamlTestFrameworkConsoleHost : IYamlTestFrameworkHost + { + public YamlTestFrameworkConsoleHost() + { + } + + public void RecordStart(TestCase testCase) + { + _testRun.StartTest(testCase); + + lock (this) + { + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine("Starting test: " + testCase.FullyQualifiedName); + Console.ResetColor(); + } + } + + public void RecordResult(TestResult testResult) + { + _testRun.RecordTest(testResult); + PrintResult(testResult); + } + + public void RecordEnd(TestCase testCase, TestOutcome outcome) + { + _testRun.EndTest(testCase, outcome); + } + + public bool Finish(IDictionary> resultsByTestCaseId, string outputResultsFormat = "trx", string outputResultsFile = null) + { + _testRun.EndRun(); + + var allResults = resultsByTestCaseId.Values.SelectMany(x => x); + var failedResults = allResults.Where(x => x.Outcome == TestOutcome.Failed).ToList(); + var passedResults = allResults.Where(x => x.Outcome == TestOutcome.Passed).ToList(); + var skippedResults = allResults.Where(x => x.Outcome == TestOutcome.Skipped).ToList(); + var passed = failedResults.Count == 0; + + if (failedResults.Count > 0) + { + Console.ResetColor(); + Console.WriteLine(); + Console.BackgroundColor = ConsoleColor.Red; + Console.ForegroundColor = ConsoleColor.White; + Console.Write("FAILURE SUMMARY:"); + Console.ResetColor(); + Console.WriteLine(); + failedResults.ForEach(r => PrintResult(r)); + } + else + { + Console.WriteLine(); + } + + var count = allResults.Count(); + var duration = TimeSpanFormatter.FormatMsOrSeconds(_testRun.Duration); + Console.BackgroundColor = ConsoleColor.Blue; + Console.ForegroundColor = ConsoleColor.White; + Console.Write("TEST RESULT SUMMARY:"); + + Console.ResetColor(); + Console.WriteLine(); + + Console.ForegroundColor = ConsoleColor.Green; + Console.Write($"\nPassed: {passedResults.Count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({100f * passedResults.Count / count:0.0}%)"); + + if (failedResults.Count > 0) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write($"Failed: {failedResults.Count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({100f * failedResults.Count / count:0.0}%)"); + } + + if (skippedResults.Count > 0) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.Write($"Skipped: {skippedResults.Count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({100f * skippedResults.Count / count:0.0}%)"); + } + + Console.ResetColor(); + Console.Write("\nTests: "); + Console.ForegroundColor = ConsoleColor.Blue; + Console.Write($"{count}"); + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine($" ({duration})"); + + if (outputResultsFormat == "trx") + { + PrintResultsFile(TrxXmlTestReporter.WriteResultsFile(_testRun, outputResultsFile)); + } + else if (outputResultsFormat == "junit") + { + PrintResultsFile(JunitXmlTestReporter.WriteResultsFile(_testRun, outputResultsFile)); + } + + return passed; + } + + private static void PrintResultsFile(string resultsFile) + { + var fi = new FileInfo(resultsFile); + Console.ResetColor(); + Console.Write("Results: "); + Console.ForegroundColor = ConsoleColor.Blue; + Console.Write(fi.FullName); + Console.ResetColor(); + Console.WriteLine(); + } + + private void PrintResult(TestResult testResult) + { + lock (this) + { + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + if (testResult.Outcome == TestOutcome.Passed) Console.ForegroundColor = ConsoleColor.Green; + if (testResult.Outcome == TestOutcome.Skipped) Console.ForegroundColor = ConsoleColor.Yellow; + if (testResult.Outcome == TestOutcome.Failed) Console.ForegroundColor = ConsoleColor.Red; + + var duration = TimeSpanFormatter.FormatMsOrSeconds(testResult.Duration); + Console.WriteLine($"{testResult.Outcome} ({duration}): {testResult.TestCase.FullyQualifiedName}"); + Console.ResetColor(); + + if (testResult.Outcome == TestOutcome.Failed) + { + var codeFilePath = testResult.TestCase.CodeFilePath; + var hasCodeFilePath = !string.IsNullOrEmpty(codeFilePath); + if (hasCodeFilePath) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine($"at {codeFilePath}({testResult.TestCase.LineNumber})"); + } + + var stack = testResult.ErrorStackTrace; + var hasStack = !string.IsNullOrEmpty(stack); + if (hasStack) + { + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine(stack.TrimEnd('\r', '\n', ' ')); + } + + var stdErr = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardErrorCategory)?.Text; + var hasStdErr = !string.IsNullOrEmpty(stdErr); + if (hasStdErr) + { + var lines = stdErr.Split('\n'); + if (lines.Length > 10) + { + var first5 = lines.Take(5); + var last5 = lines.Skip(lines.Length - 5); + lines = first5.Concat(new[] { $"[ ******* ------- TRIMMED +{lines.Length - 10} LINE(s) ------- ******* ]" }).Concat(last5).ToArray(); + stdErr = string.Join("\n", lines) + "\n..."; + } + Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); + Console.WriteLine(stdErr.TrimEnd('\r', '\n', ' ')); + } + + var err = testResult.ErrorMessage; + var hasErr = !string.IsNullOrEmpty(err); + if (hasErr) + { + Console.ResetColor(); + Console.WriteLine(err.TrimEnd('\r', '\n', ' ')); + } + + Console.ResetColor(); + if (hasStack || hasStdErr || hasErr || hasCodeFilePath) Console.WriteLine(); + } + } + } + + private TestRun _testRun = new(); + } +} + diff --git a/src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs b/src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs new file mode 100644 index 00000000..8a57d4a9 --- /dev/null +++ b/src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs @@ -0,0 +1,56 @@ +using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; +using System; +using System.Diagnostics; +using System.IO; + +namespace Azure.AI.Details.Common.CLI.TestFramework +{ + public class YamlTestFrameworkTestAdapterMessageLogger : IYamlTestFrameworkLogger + { + public YamlTestFrameworkTestAdapterMessageLogger(IMessageLogger logger) + { + this.logger = logger; + } + + public void LogVerbose(string text) + { + logger.SendMessage(TestMessageLevel.Informational, text); + } + + public void LogInfo(string text) + { + var dt = $"{DateTime.Now}"; + logger?.SendMessage(TestMessageLevel.Informational, $"{dt}: {text}"); + File.AppendAllText(_logPath, $"{dt}: INFO: {text}\n"); + } + + public void LogWarning(string text) + { + var dt = $"{DateTime.Now}"; + logger?.SendMessage(TestMessageLevel.Warning, $"{dt}: {text}"); + File.AppendAllText(_logPath, $"{dt}: WARNING: {text}\n"); + } + + public void LogError(string text) + { + var dt = $"{DateTime.Now}"; + logger?.SendMessage(TestMessageLevel.Error, $"{dt}: {text}"); + File.AppendAllText(_logPath, $"{dt}: ERROR: {text}\n"); + } + + #region private methods and data + + private static string GetLogPath() + { + var pid = Process.GetCurrentProcess().Id.ToString(); + var time = DateTime.Now.ToFileTime().ToString(); + return $"log-ai-cli-test-framework-{time}-{pid}.log"; + } + + private IMessageLogger logger; + + private static string _logPath = GetLogPath(); + + #endregion + } +} diff --git a/src/extensions/testframework/YamlTestProperties.cs b/src/extensions/testframework/YamlTestProperties.cs index 133bb02b..fd96ce05 100644 --- a/src/extensions/testframework/YamlTestProperties.cs +++ b/src/extensions/testframework/YamlTestProperties.cs @@ -50,6 +50,7 @@ private static TestProperty RegisterTestCaseProperty(string name) { "simulate", RegisterTestCaseProperty("Simulate") }, { "skipOnFailure", RegisterTestCaseProperty("SkipOnFailure") }, { "timeout", RegisterTestCaseProperty("Timeout") }, + { "env", RegisterTestCaseProperty("Env") }, { "working-directory", RegisterTestCaseProperty("WorkingDirectory") } }; diff --git a/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs b/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs index 24e0e4cd..9bceba2f 100644 --- a/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs +++ b/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs @@ -22,7 +22,7 @@ public void DiscoverTests(IEnumerable sources, IDiscoveryContext discove { try { - Logger.Log(logger); + Logger.Log(new YamlTestFrameworkTestAdapterMessageLogger(logger)); Logger.Log($"RecordingDiscoverer.DiscoverTests(): ENTER"); Logger.Log($"RecordingDiscoverer.DiscoverTests(): count={sources.Count()}"); foreach (var test in RecordedTestAdapter.GetTestsFromFiles(sources)) diff --git a/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs b/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs index a3b10c01..d57cd813 100644 --- a/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs +++ b/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs @@ -18,7 +18,7 @@ public class RecordingExecutor : ITestExecutor { public void RunTests(IEnumerable tests, IRunContext runContext, IFrameworkHandle frameworkHandle) { - Logger.Log(frameworkHandle); + Logger.Log(new YamlTestFrameworkTestAdapterMessageLogger(frameworkHandle)); Logger.Log($"RecordingExecutor.RunTests(IEnumerable(): ENTER"); Logger.Log($"RecordingExecutor.RunTests(IEnumerable(): count={tests.Count()}"); RecordedTestAdapter.RunTests(tests, runContext, frameworkHandle); @@ -27,7 +27,7 @@ public void RunTests(IEnumerable tests, IRunContext runContext, IFrame public void RunTests(IEnumerable sources, IRunContext runContext, IFrameworkHandle frameworkHandle) { - Logger.Log(frameworkHandle); + Logger.Log(new YamlTestFrameworkTestAdapterMessageLogger(frameworkHandle)); Logger.Log($"RecordingExecutor.RunTests(IEnumerable(): ENTER"); Logger.Log($"RecordingExecutor.RunTests(IEnumerable(): count={sources.Count()}"); RunTests(RecordedTestAdapter.GetTestsFromFiles(sources), runContext, frameworkHandle); diff --git a/src/testing/adapters/testadapter/TestDiscoverer.cs b/src/testing/adapters/testadapter/TestDiscoverer.cs index 1f1a5d27..4dcbe20f 100644 --- a/src/testing/adapters/testadapter/TestDiscoverer.cs +++ b/src/testing/adapters/testadapter/TestDiscoverer.cs @@ -22,7 +22,7 @@ public void DiscoverTests(IEnumerable sources, IDiscoveryContext discove { try { - Logger.Log(logger); + Logger.Log(new YamlTestFrameworkTestAdapterMessageLogger(logger)); Logger.Log($"TestDiscoverer.DiscoverTests(): ENTER"); Logger.Log($"TestDiscoverer.DiscoverTests(): count={sources.Count()}"); foreach (var test in YamlTestAdapter.GetTestsFromFiles(sources)) diff --git a/src/testing/adapters/testadapter/TestExecutor.cs b/src/testing/adapters/testadapter/TestExecutor.cs index 0bcf0a65..e99cf99e 100644 --- a/src/testing/adapters/testadapter/TestExecutor.cs +++ b/src/testing/adapters/testadapter/TestExecutor.cs @@ -20,7 +20,7 @@ public void RunTests(IEnumerable tests, IRunContext runContext, IFrame { tests = tests.ToList(); // force enumeration - Logger.Log(frameworkHandle); + Logger.Log(new YamlTestFrameworkTestAdapterMessageLogger(frameworkHandle)); Logger.Log($"TextExecutor.RunTests(IEnumerable(): ENTER"); Logger.Log($"TextExecutor.RunTests(IEnumerable(): count={tests.Count()}"); YamlTestAdapter.RunTests(tests, runContext, frameworkHandle); @@ -31,7 +31,7 @@ public void RunTests(IEnumerable sources, IRunContext runContext, IFrame { sources = sources.ToList(); // force enumeration - Logger.Log(frameworkHandle); + Logger.Log(new YamlTestFrameworkTestAdapterMessageLogger(frameworkHandle)); Logger.Log($"TextExecutor.RunTests(IEnumerable(): ENTER"); Logger.Log($"TextExecutor.RunTests(IEnumerable(): count={sources.Count()}"); RunTests(YamlTestAdapter.GetTestsFromFiles(sources), runContext, frameworkHandle); diff --git a/src/testing/runner/YamlTestFrameworkConsoleHost.cs b/src/testing/runner/YamlTestFrameworkConsoleHost.cs deleted file mode 100644 index 211553ae..00000000 --- a/src/testing/runner/YamlTestFrameworkConsoleHost.cs +++ /dev/null @@ -1,476 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Xml; -using Microsoft.VisualStudio.TestPlatform.ObjectModel; -using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; - -namespace Azure.AI.Details.Common.CLI.TestFramework -{ - public class YamlTestFrameworkConsoleHost : IYamlTestFrameworkHost - { - public YamlTestFrameworkConsoleHost() - { - } - - public void RecordStart(TestCase testCase) - { - _startTime ??= DateTime.Now; - _testCases.Add(testCase); - SetExecutionId(testCase, Guid.NewGuid()); - - lock (this) - { - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - Console.WriteLine("Starting test: " + testCase.FullyQualifiedName); - Console.ResetColor(); - } - } - - public void RecordResult(TestResult testResult) - { - _testResults.Add(testResult); - PrintResult(testResult); - } - - public void RecordEnd(TestCase testCase, TestOutcome outcome) - { - _endTime = DateTime.Now; - } - - public bool Finish(IDictionary> resultsByTestCaseId) - { - var allResults = resultsByTestCaseId.Values.SelectMany(x => x); - var failedResults = allResults.Where(x => x.Outcome == TestOutcome.Failed).ToList(); - var passedResults = allResults.Where(x => x.Outcome == TestOutcome.Passed).ToList(); - var skippedResults = allResults.Where(x => x.Outcome == TestOutcome.Skipped).ToList(); - var passed = failedResults.Count == 0; - - if (failedResults.Count > 0) - { - Console.ResetColor(); - Console.WriteLine(); - Console.BackgroundColor = ConsoleColor.Red; - Console.ForegroundColor = ConsoleColor.White; - Console.Write("FAILURE SUMMARY:"); - Console.ResetColor(); - Console.WriteLine(); - failedResults.ForEach(r => PrintResult(r)); - } - else - { - Console.WriteLine(); - } - - var count = allResults.Count(); - var duration = _endTime != null && _startTime != null ? FormattedDuration((_endTime.Value - _startTime.Value).TotalMilliseconds) : "0 ms"; - Console.BackgroundColor = ConsoleColor.Blue; - Console.ForegroundColor = ConsoleColor.White; - Console.Write("TEST RESULT SUMMARY:"); - - Console.ResetColor(); - Console.WriteLine(); - - Console.ForegroundColor = ConsoleColor.Green; - Console.Write($"\nPassed: {passedResults.Count}"); - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - Console.WriteLine($" ({100f * passedResults.Count / count:0.0}%)"); - - if (failedResults.Count > 0) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.Write($"Failed: {failedResults.Count}"); - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - Console.WriteLine($" ({100f * failedResults.Count / count:0.0}%)"); - } - - if (skippedResults.Count > 0) - { - Console.ForegroundColor = ConsoleColor.Yellow; - Console.Write($"Skipped: {skippedResults.Count}"); - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - Console.WriteLine($" ({100f * skippedResults.Count / count:0.0}%)"); - } - - Console.ResetColor(); - Console.Write("\nTests: "); - Console.ForegroundColor = ConsoleColor.Blue; - Console.Write($"{count}"); - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - Console.WriteLine($" ({duration})"); - - var resultsFile = WriteResultFile(); - - var fi = new FileInfo(resultsFile); - Console.ResetColor(); - Console.Write("Results: "); - Console.ForegroundColor = ConsoleColor.Blue; - Console.Write(fi.FullName); - Console.ResetColor(); - Console.WriteLine(); - - return passed; - } - - public string WriteResultFile() - { - var assembly = typeof(YamlTestFrameworkConsoleHost).Assembly; - var assemblyPath = assembly.Location; - - _startTime ??= DateTime.Now; - _endTime ??= DateTime.Now; - - var resultFile = "test-results.trx"; - var testRunId = Guid.NewGuid().ToString(); - var testListId = "8c84fa94-04c1-424b-9868-57a2d4851a1d"; - var testType = "13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b"; - var userName = Environment.UserName; - var machineName = Environment.MachineName; - var userAtMachine = userName.Split('\\', '/').Last() + "@" + machineName; - var testRunName = userAtMachine + " " + _endTime.Value.ToString("yyyy-MM-dd HH:mm:ss"); - - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Indent = true; - settings.IndentChars = " "; - settings.NewLineChars = "\n"; - settings.NewLineHandling = NewLineHandling.Replace; - settings.OmitXmlDeclaration = false; - - var writer = XmlWriter.Create(resultFile, settings); - writer.WriteStartDocument(); - writer.WriteStartElement("", "TestRun", "http://microsoft.com/schemas/VisualStudio/TeamTest/2010"); - writer.WriteAttributeString("id", testRunId); - writer.WriteAttributeString("name", testRunName); - writer.WriteAttributeString("runUser", userName); - - writer.WriteStartElement("Times"); - writer.WriteAttributeString("creation", _endTime.Value.ToString("o")); - writer.WriteAttributeString("queuing", _endTime.Value.ToString("o")); - writer.WriteAttributeString("start", _startTime.Value.ToString("o")); - writer.WriteAttributeString("finish", _endTime.Value.ToString("o")); - writer.WriteEndElement(); - - writer.WriteStartElement("Results"); - foreach (var testResult in _testResults) - { - var executionId = GetExecutionId(testResult.TestCase).ToString(); - var stdout = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardOutCategory)?.Text; - var stderr = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardErrorCategory)?.Text; - var debugTrace = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.DebugTraceCategory)?.Text; - var message = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.AdditionalInfoCategory)?.Text; - - writer.WriteStartElement("UnitTestResult"); - writer.WriteAttributeString("executionId", executionId); - writer.WriteAttributeString("testId", testResult.TestCase.Id.ToString()); - writer.WriteAttributeString("testName", testResult.TestCase.FullyQualifiedName); - writer.WriteAttributeString("computerName", machineName); - writer.WriteAttributeString("duration", testResult.Duration.ToString()); - writer.WriteAttributeString("startTime", testResult.StartTime.DateTime.ToString("o")); - writer.WriteAttributeString("endTime", testResult.EndTime.DateTime.ToString("o")); - writer.WriteAttributeString("testType", testType); - writer.WriteAttributeString("outcome", OutcomeToString(testResult.Outcome)); - writer.WriteAttributeString("testListId", testListId); - writer.WriteAttributeString("relativeResultsDirectory", Guid.NewGuid().ToString()); - writer.WriteStartElement("Output"); - - if (!string.IsNullOrEmpty(stdout)) - { - writer.WriteStartElement("StdOut"); - writer.WriteRaw(System.Security.SecurityElement - .Escape(stdout.Replace("\u001b", string.Empty)) - .Replace("\r\n", " \n")); - writer.WriteEndElement(); - } - - if (!string.IsNullOrEmpty(stderr)) - { - writer.WriteStartElement("StdErr"); - writer.WriteRaw(System.Security.SecurityElement - .Escape(stderr.Replace("\u001b", string.Empty)) - .Replace("\r\n", " \n")); - writer.WriteEndElement(); - } - - if (!string.IsNullOrEmpty(debugTrace)) - { - writer.WriteElementString("DebugTrace", debugTrace); - } - - writer.WriteStartElement("ErrorInfo"); - writer.WriteElementString("Message", testResult.ErrorMessage); - writer.WriteElementString("StackTrace", testResult.ErrorStackTrace); - writer.WriteEndElement(); - writer.WriteStartElement("TextMessages"); - - if (!string.IsNullOrEmpty(message)) - { - writer.WriteElementString("Message", message); - } - writer.WriteEndElement(); - writer.WriteEndElement(); - writer.WriteEndElement(); - } - writer.WriteEndElement(); - - writer.WriteStartElement("TestDefinitions"); - foreach (var testCase in _testCases) - { - var executionId = GetExecutionId(testCase).ToString(); - var qualifiedParts = testCase.FullyQualifiedName.Split('.'); - var className = string.Join(".", qualifiedParts.Take(qualifiedParts.Length - 1)); - var name = qualifiedParts.Last(); - writer.WriteStartElement("UnitTest"); - writer.WriteAttributeString("name", testCase.DisplayName); - writer.WriteAttributeString("storage", assemblyPath); - writer.WriteAttributeString("id", testCase.Id.ToString()); - writer.WriteStartElement("Execution"); - writer.WriteAttributeString("id", executionId); - writer.WriteEndElement(); - writer.WriteStartElement("TestMethod"); - writer.WriteAttributeString("codeBase", assemblyPath); - writer.WriteAttributeString("adapterTypeName", testCase.ExecutorUri.ToString()); - writer.WriteAttributeString("className", className); - writer.WriteAttributeString("name", name); - writer.WriteEndElement(); - writer.WriteEndElement(); - } - writer.WriteEndElement(); - - writer.WriteStartElement("TestEntries"); - foreach (var testCase in _testCases) - { - var executionId = GetExecutionId(testCase).ToString(); - writer.WriteStartElement("TestEntry"); - writer.WriteAttributeString("testId", testCase.Id.ToString()); - writer.WriteAttributeString("executionId", executionId); - writer.WriteAttributeString("testListId", testListId); - writer.WriteEndElement(); - } - writer.WriteEndElement(); - - writer.WriteStartElement("TestLists"); - writer.WriteStartElement("TestList"); - writer.WriteAttributeString("name", "Results Not in a List"); - writer.WriteAttributeString("id", testListId); - writer.WriteEndElement(); - writer.WriteStartElement("TestList"); - writer.WriteAttributeString("name", "All Loaded Results"); - writer.WriteAttributeString("id", "19431567-8539-422a-85d7-44ee4e166bda"); - writer.WriteEndElement(); - writer.WriteEndElement(); - - writer.WriteStartElement("ResultSummary"); - writer.WriteAttributeString("outcome", "Completed"); - - writer.WriteStartElement("Counters"); - writer.WriteAttributeString("total", _testResults.Count.ToString()); - writer.WriteAttributeString("executed", _testResults.Count(r => IsExecuted(r)).ToString()); - writer.WriteAttributeString("passed", _testResults.Count(r => IsPassed(r)).ToString()); - writer.WriteAttributeString("failed", _testResults.Count(r => IsFailed(r)).ToString()); - writer.WriteAttributeString("error", _testResults.Count(r => IsError(r)).ToString()); - writer.WriteAttributeString("timeout", _testResults.Count(r => IsTimeout(r)).ToString()); - writer.WriteAttributeString("aborted", _testResults.Count(r => IsAborted(r)).ToString()); - writer.WriteAttributeString("inconclusive", _testResults.Count(r => IsInConclusive(r)).ToString()); - writer.WriteAttributeString("passedButRunAborted", _testResults.Count(r => IsPassedButRunaborted(r)).ToString()); - writer.WriteAttributeString("notRunnable", _testResults.Count(r => IsNotRunnable(r)).ToString()); - writer.WriteAttributeString("notExecuted", _testResults.Count(r => IsNotExecuted(r)).ToString()); - writer.WriteAttributeString("disconnected", _testResults.Count(r => IsDisconnected(r)).ToString()); - writer.WriteAttributeString("warning", _testResults.Count(r => IsWarning(r)).ToString()); - writer.WriteAttributeString("completed", "0"); - writer.WriteAttributeString("inProgress", "0"); - writer.WriteAttributeString("pending", "0"); - writer.WriteEndElement(); - - writer.WriteStartElement("Output"); - writer.WriteElementString("StdOut", ""); - writer.WriteEndElement(); - - writer.WriteEndElement(); - - writer.WriteEndElement(); - writer.WriteEndDocument(); - - writer.Close(); - writer.Dispose(); - - return resultFile; - } - - private void PrintResult(TestResult testResult) - { - lock (this) - { - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - if (testResult.Outcome == TestOutcome.Passed) Console.ForegroundColor = ConsoleColor.Green; - if (testResult.Outcome == TestOutcome.Skipped) Console.ForegroundColor = ConsoleColor.Yellow; - if (testResult.Outcome == TestOutcome.Failed) Console.ForegroundColor = ConsoleColor.Red; - - var duration = FormattedDuration(testResult.Duration.TotalMilliseconds); - Console.WriteLine($"{testResult.Outcome} ({duration}): {testResult.TestCase.FullyQualifiedName}"); - Console.ResetColor(); - - if (testResult.Outcome == TestOutcome.Failed) - { - var codeFilePath = testResult.TestCase.CodeFilePath; - var hasCodeFilePath = !string.IsNullOrEmpty(codeFilePath); - if (hasCodeFilePath) - { - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine($"at {codeFilePath}({testResult.TestCase.LineNumber})"); - } - - var stack = testResult.ErrorStackTrace; - var hasStack = !string.IsNullOrEmpty(stack); - if (hasStack) - { - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - Console.WriteLine(stack.TrimEnd('\r', '\n', ' ')); - } - - var stdErr = testResult.Messages.FirstOrDefault(x => x.Category == TestResultMessage.StandardErrorCategory)?.Text; - var hasStdErr = !string.IsNullOrEmpty(stdErr); - if (hasStdErr) - { - var lines = stdErr.Split('\n'); - if (lines.Length > 10) - { - var first5 = lines.Take(5); - var last5 = lines.Skip(lines.Length - 5); - lines = first5.Concat(new[] { $"[ ******* ------- TRIMMED +{lines.Length - 10} LINE(s) ------- ******* ]" }).Concat(last5).ToArray(); - stdErr = string.Join("\n", lines) + "\n..."; - } - Console.ForegroundColor = ColorHelpers.MapColor(ConsoleColor.DarkGray); - Console.WriteLine(stdErr.TrimEnd('\r', '\n', ' ')); - } - - var err = testResult.ErrorMessage; - var hasErr = !string.IsNullOrEmpty(err); - if (hasErr) - { - Console.ResetColor(); - Console.WriteLine(err.TrimEnd('\r', '\n', ' ')); - } - - Console.ResetColor(); - if (hasStack || hasStdErr || hasErr || hasCodeFilePath) Console.WriteLine(); - } - } - } - - private static string FormattedDuration(double ms) - { - var secs = ms / 1000; - var duration = ms >= 1000 - ? secs.ToString("0.00") + " seconds" - : ms.ToString("0") + " ms"; - return duration; - } - - private static string OutcomeToString(TestOutcome outcome) - { - return outcome switch { - TestOutcome.None => "None", - TestOutcome.Passed => "Passed", - TestOutcome.Failed => "Failed", - TestOutcome.Skipped => "NotExecuted", - TestOutcome.NotFound => "NotFound", - _ => "None", - }; - } - - private bool IsExecuted(TestResult r) - { - return IsPassed(r) || IsFailed(r); - } - - private static bool IsPassed(TestResult r) - { - return r.Outcome == TestOutcome.Passed; - } - - private static bool IsFailed(TestResult r) - { - return r.Outcome == TestOutcome.Failed; - } - - private static bool IsError(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.Error; - } - - private static bool IsTimeout(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.Timeout; - } - - private static bool IsAborted(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.Aborted; - } - - private static bool IsInConclusive(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.Inconclusive; - } - - private static bool IsPassedButRunaborted(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.PassedButRunAborted; - } - - private static bool IsNotRunnable(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.NotRunnable; - } - - private static bool IsNotExecuted(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.NotExecuted; - } - - private static bool IsDisconnected(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.Disconnected; - } - - private static bool IsWarning(TestResult r) - { - return false; - // return r.Outcome == TestOutcome.Warning; - } - - private void SetExecutionId(TestCase testCase, Guid guid) - { - lock (_testToExecutionMap) - { - _testToExecutionMap[testCase.Id] = guid; - } - } - - private Guid GetExecutionId(TestCase testCase) - { - lock (_testToExecutionMap) - { - return _testToExecutionMap[testCase.Id]; - } - } - - private DateTime? _startTime; - private DateTime? _endTime; - - private List _testCases = new List(); - private Dictionary _testToExecutionMap = new Dictionary(); - private List _testResults = new List(); - } -} - diff --git a/tests/test-yaml-element-env.yaml b/tests/test-yaml-element-env.yaml new file mode 100644 index 00000000..4fc50822 --- /dev/null +++ b/tests/test-yaml-element-env.yaml @@ -0,0 +1,43 @@ +env: + ENV1: VAL1 + ENV2: VAL2 + +tests: +- name: test `env:` yaml element 1 + bash: | + echo $ENV1 + echo $ENV2 + expect: | + VAL1 + VAL2 + +- name: test `env:` yaml element 2 + env: + ENV1: VAL3 + bash: | + echo $ENV1 + echo $ENV2 + expect: | + VAL3 + VAL2 + +- name: test `env:` yaml element 3 + env: + ENV2: VAL4 + bash: | + echo $ENV1 + echo $ENV2 + expect: | + VAL1 + VAL4 + +- name: test `env:` yaml element 4 + env: + ENV2: '$(ENV1);$(ENV2);hello' + bash: | + echo $ENV1 + echo $ENV2 + expect: | + VAL1 + VAL1;VAL2;hello + \ No newline at end of file diff --git a/tests/test.yaml b/tests/test.yaml index 667b8929..1be57e05 100644 --- a/tests/test.yaml +++ b/tests/test.yaml @@ -51,6 +51,7 @@ ^ ai config \[\.\.\.\] \(see: ai help config\)\r?$\n ^\r?$\n ^ ai dev \[\.\.\.\] \(see: ai help dev\)\r?$\n + ^ ai test \[\.\.\.\] \(see: ai help test\)\r?$\n ^\r?$\n ^ ai chat \[\.\.\.\] \(see: ai help chat\)\r?$\n ^ ai flow \[\.\.\.\] \(see: ai help flow\)\r?$\n From c1f53e30e24d255be01f786c26018318832725c3 Mon Sep 17 00:00:00 2001 From: Glenn Harper <64209257+glharper@users.noreply.github.com> Date: Tue, 27 Feb 2024 10:17:28 -0500 Subject: [PATCH 14/19] Add update command, and run update check as task while other commands are running (#230) * initial commit (not working) * update command now checks for update, displays "No Update Available" if none available * update message formatting * prep to set shared updateMessage var asynchronously * run DisplayVersion as unawaited task to possibly find an update while non-related command runs --- src/ai/Program_AI.cs | 3 + .../commands/parsers/update_command_parser.cs | 71 +++++++++++++++++ src/ai/commands/version_command.cs | 7 +- src/common/Program.cs | 76 +++++++++++++++---- .../commands/parsers/command_parser.cs | 2 +- src/common/details/helpers/string_helpers.cs | 7 ++ .../details/named_values/named_values.cs | 5 ++ 7 files changed, 155 insertions(+), 16 deletions(-) create mode 100644 src/ai/commands/parsers/update_command_parser.cs diff --git a/src/ai/Program_AI.cs b/src/ai/Program_AI.cs index b9a4fc03..e93e73c7 100644 --- a/src/ai/Program_AI.cs +++ b/src/ai/Program_AI.cs @@ -156,6 +156,7 @@ public bool DispatchRunCommand(ICommandValues values) "test" => (new TestCommand(values)).RunCommand(), "run" => (new RunJobCommand(values)).RunCommand(), "version" => (new VersionCommand(values)).RunCommand(), + "update" => (new VersionCommand(values)).RunCommand(), _ => false }; } @@ -181,6 +182,7 @@ public bool DispatchParseCommand(INamedValueTokens tokens, ICommandValues values "tool" => ToolCommandParser.ParseCommand(tokens, values), "wizard" => ScenarioWizardCommandParser.ParseCommand(tokens, values), "version" => VersionCommandParser.ParseCommand(tokens, values), + "update" => UpdateCommandParser.ParseCommand(tokens, values), "dev" => DevCommandParser.ParseCommand(tokens, values), "test" => TestCommandParser.ParseCommand(tokens, values), "run" => RunJobCommandParser.ParseCommand(tokens, values), @@ -209,6 +211,7 @@ public bool DispatchParseCommandValues(INamedValueTokens tokens, ICommandValues "test" => TestCommandParser.ParseCommandValues(tokens, values), "run" => RunJobCommandParser.ParseCommandValues(tokens, values), "version" => VersionCommandParser.ParseCommandValues(tokens, values), + "update" => UpdateCommandParser.ParseCommandValues(tokens, values), _ => false }; } diff --git a/src/ai/commands/parsers/update_command_parser.cs b/src/ai/commands/parsers/update_command_parser.cs new file mode 100644 index 00000000..1802bdd1 --- /dev/null +++ b/src/ai/commands/parsers/update_command_parser.cs @@ -0,0 +1,71 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System; +using System.Collections.Generic; + +namespace Azure.AI.Details.Common.CLI +{ + class UpdateCommandParser : CommandParser + { + public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) + { + values.Add("display.update", "true"); + return ParseCommands(_commands, _partialCommands, tokens, values, x => GetCommandParsers(x)); + } + + public static bool ParseCommandValues(INamedValueTokens tokens, ICommandValues values) + { + return ParseCommandValues("update", GetCommandParsers(values), tokens, values); + } + + private static readonly (string name, bool valuesRequired)[] _commands = { + ("update", false), + }; + + private static readonly string[] _partialCommands = { + }; + + private static IEnumerable GetCommandParsers(ICommandValues values) + { + var commandName = values.GetCommand(); + + switch (commandName) + { + case "update": return _updateCommandParsers; + } + + return null; + } + + + #region private data + + public class CommonUpdateNamedValueTokenParsers : NamedValueTokenParserList + { + public CommonUpdateNamedValueTokenParsers() : base( + + new NamedValueTokenParser(null, "x.command", "11", "1", "update"), + + new ExpectOutputTokenParser(), + new DiagnosticLogTokenParser(), + new CommonNamedValueTokenParsers(), + + new NamedValueTokenParser("--ini", "ini.file", "10", "1", "@"), + new NamedValueTokenParser(null, "x.command.expand.file.name", "11111", "1") + ) + { + } + } + + private static INamedValueTokenParser[] _updateCommandParsers = { + + new CommonUpdateNamedValueTokenParsers(), + + }; + + #endregion + } +} diff --git a/src/ai/commands/version_command.cs b/src/ai/commands/version_command.cs index 836cafe8..1deedeb7 100644 --- a/src/ai/commands/version_command.cs +++ b/src/ai/commands/version_command.cs @@ -36,7 +36,10 @@ private void DoCommand(string command) switch (command) { - case "version": DoVersion(); break; + case "version": + case "update": + DoVersionUpdate(); + break; default: _values.AddThrowError("WARNING:", $"'{command.Replace('.', ' ')}' NOT YET IMPLEMENTED!!"); @@ -86,7 +89,7 @@ private void StopCommand() // OutputHelper _output = null; // DisplayHelper _display = null; - private void DoVersion() + private void DoVersionUpdate() { // Handled by adding "display.help" to values in parser } diff --git a/src/common/Program.cs b/src/common/Program.cs index e414a713..0eb74797 100644 --- a/src/common/Program.cs +++ b/src/common/Program.cs @@ -20,6 +20,9 @@ public class Program { public static bool Debug { get; internal set; } + private static int usingResource = 0; + private static string updateMessage = ""; + public static int Main(IProgramData data, string[] mainArgs) { _data = data; @@ -41,12 +44,18 @@ public static int Main(IProgramData data, string[] mainArgs) var exitCode = ParseCommand(tokens, values); if (exitCode == 0 && !values.DisplayHelpRequested()) { - if (!values.DisplayVersionRequested()) + if (!values.DisplayVersionRequested() && !values.DisplayUpdateRequested()) { + _ = Task.Run(() => DisplayVersion(values, true)); DisplayBanner(values); DisplayParsedValues(values); } exitCode = RunCommand(values) ? 0 : 1; + var updateMessage = GetUpdateMessage(); + if (!String.IsNullOrEmpty(updateMessage)) + { + ConsoleHelpers.WriteLineWithHighlight(updateMessage); + } } if (values.GetOrDefault("x.pause", false)) @@ -125,6 +134,31 @@ internal static string GetDisplayBannerText() return $"{Program.Name.ToUpper()} - {Program.DisplayName}" + version; } + private static string GetUpdateMessage() + { + string message = ""; + //0 indicates that the method is not in use. + if(0 == Interlocked.Exchange(ref usingResource, 1)) + { + message = updateMessage; + + //Release the lock + Interlocked.Exchange(ref usingResource, 0); + } + return message; + } + + private static void SetUpdateMessage(string message) + { + if(0 == Interlocked.Exchange(ref usingResource, 1)) + { + updateMessage = message; + + //Release the lock + Interlocked.Exchange(ref usingResource, 0); + } + } + private static void DisplayBanner(ICommandValues values) { if (values.GetOrDefault("x.quiet", false)) return; @@ -168,29 +202,45 @@ private static void DisplayCommandHelp(INamedValueTokens tokens, INamedValues va HelpCommandParser.DisplayHelp(tokens, values); } - public static void DisplayVersion(INamedValues values) + public static void DisplayVersion(INamedValues values, bool setUpdateMessage = false) { var currentVersion = GetVersionFromAssembly().Split("-")[0]; - Console.WriteLine(currentVersion); - var latestVersion = HttpHelpers.GetLatestVersionInfo(values, "version"); + if (!setUpdateMessage) + { + Console.WriteLine(values.DisplayUpdateRequested() ? + $"Current Version: {currentVersion}" + : currentVersion); + } + + var domain = values.DisplayUpdateRequested() ? "update" : "version"; + var latestVersion = HttpHelpers.GetLatestVersionInfo(values, domain); if (latestVersion != null) { var currentVersionNumbers = currentVersion.Split("."); var latestVersionNumbers = latestVersion.Split("-")[0].Split("."); - if (updateNeeded(currentVersionNumbers, latestVersionNumbers)) + if (StringHelpers.UpdateNeeded(currentVersionNumbers, latestVersionNumbers)) { - Console.WriteLine($"\nUpdate available, Latest Version: {latestVersion}"); + var line1 = $"\n`#e_;Update available, Latest Version: {latestVersion}`\n"; + var line2 = @"Go to `#e0;https://aka.ms/azure-ai-cli-update` for more information."; + if (setUpdateMessage) + { + SetUpdateMessage(line1 + line2); + } + else + { + ConsoleHelpers.WriteLineWithHighlight(line1); + ConsoleHelpers.WriteLineWithHighlight(line2); + } + return; } } + if (values.DisplayUpdateRequested()) + { + Console.WriteLine("No update available"); + } } - private static bool updateNeeded(string[] current, string[] latest) - { - return Int32.Parse(current[0]) < Int32.Parse(latest[0]) - || Int32.Parse(current[1]) < Int32.Parse(latest[1]) - || Int32.Parse(current[2]) < Int32.Parse(latest[2]); - } private static void DisplayParsedValues(INamedValues values) { @@ -287,7 +337,7 @@ private static int DisplayParseErrorHelpOrException(INamedValueTokens tokens, IC DisplayCommandHelp(tokens, values); return values.GetOrDefault("display.help.exit.code", 0); } - else if (values.DisplayVersionRequested()) + else if (values.DisplayVersionRequested() || values.DisplayUpdateRequested()) { DisplayVersion(values); return 0; diff --git a/src/common/details/commands/parsers/command_parser.cs b/src/common/details/commands/parsers/command_parser.cs index 66c023b7..90f9d09b 100644 --- a/src/common/details/commands/parsers/command_parser.cs +++ b/src/common/details/commands/parsers/command_parser.cs @@ -261,7 +261,7 @@ private static bool ParseNextCommandValue(IEnumerable pa private static bool ExpectsDefaults(string commandName) { - return commandName != "config" && commandName != "help" && commandName != "version"; + return commandName != "config" && commandName != "help" && commandName != "update" && commandName != "version"; } private static bool ParseAtFileToken(IEnumerable parsers, INamedValueTokens tokens, ICommandValues values) diff --git a/src/common/details/helpers/string_helpers.cs b/src/common/details/helpers/string_helpers.cs index d000ecad..8f414fe4 100644 --- a/src/common/details/helpers/string_helpers.cs +++ b/src/common/details/helpers/string_helpers.cs @@ -92,6 +92,13 @@ private static bool ContainsAllCharsInOrder(string s, string chars, out int last lastCharAt--; return lastCharAt >= 0; } + + public static bool UpdateNeeded(string[] current, string[] latest) + { + return Int32.Parse(current[0]) < Int32.Parse(latest[0]) + || Int32.Parse(current[1]) < Int32.Parse(latest[1]) + || Int32.Parse(current[2]) < Int32.Parse(latest[2]); + } } public static class StringExtensions diff --git a/src/common/details/named_values/named_values.cs b/src/common/details/named_values/named_values.cs index 1bf27d23..52c5547b 100644 --- a/src/common/details/named_values/named_values.cs +++ b/src/common/details/named_values/named_values.cs @@ -167,6 +167,11 @@ public static bool DisplayVersionRequested(this INamedValues values) return values.GetOrDefault("display.version", false); } + public static bool DisplayUpdateRequested(this INamedValues values) + { + return values.GetOrDefault("display.update", false); + } + public static bool DisplayHelpRequested(this INamedValues values) { return values.GetOrDefault("display.help", false); From 5f969944612314c7e6a7e7768caf4d6e568a2b33 Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Wed, 28 Feb 2024 14:51:40 -0800 Subject: [PATCH 15/19] Robch/2402 feb28 speech (#232) * create speech extension * `ai speech` for `recognize`, `synthesize`, `translate`, and `intent` now all work * finish porting speech commands to ai cli --- ai-cli.sln | 15 + src/ai/.x/help/speech/_ | 18 +- src/ai/.x/help/speech/csr.examples | 2 +- src/ai/ai-cli.csproj | 3 +- .../commands/parsers/speech_command_parser.cs | 27 +- src/ai/commands/speech_command.cs | 36 +- src/common/common.csproj | 2 +- .../speech_extension/BuildCommon.targets | 24 + .../commands/base/recognize_commands_base.cs | 0 .../commands/batch_command.cs | 6 +- .../conversation_transcription_command.cs} | 19 +- .../custom_speech_recognition_command.cs | 6 +- .../commands/dialog_command.cs | 0 .../commands/intent_command.cs | 4 +- .../commands/meeting_transcription_command.cs | 520 ++++++++++++++++++ .../commands/parsers/batch_command_parser.cs | 6 +- .../commands/parsers/bot_command_parser.cs | 0 .../parsers/common_output_token_parsers.cs | 0 .../parsers/common_speech_token_parsers.cs | 0 ...ustom_speech_recognition_command_parser.cs | 10 +- .../commands/parsers/dialog_command_parser.cs | 0 .../commands/parsers/intent_command_parser.cs | 7 +- .../parsers/profile_command_parser.cs | 6 +- .../parsers/recognize_command_parser.cs | 7 +- .../parsers/synthesize_command_parser.cs | 7 +- .../transcribe_conversation_command_parser.cs | 0 .../parsers/translate_command_parser.cs | 7 +- .../commands/parsers/webjob_command_parser.cs | 0 .../commands/profile_command.cs | 8 +- .../commands/recognize_command.cs | 4 +- .../commands/synthesize_command.cs | 25 +- .../commands/translate_command.cs | 4 +- .../commands/webjob_command.cs | 0 .../helpers/audio_helpers.cs | 0 .../helpers/caption_helper.cs | 0 .../helpers/config_helpers.cs | 0 .../helpers/connection_helpers.cs | 0 .../helpers/display_helpers.cs | 53 +- .../helpers/event_logger_helpers.cs | 0 .../helpers/output_helper.cs | 354 +++++++++++- .../speech_extension}/helpers/wer_helpers.cs | 0 .../speech_extension/speech-extension.csproj | 28 + 42 files changed, 1115 insertions(+), 93 deletions(-) create mode 100644 src/extensions/speech_extension/BuildCommon.targets rename src/{clis/spx => extensions/speech_extension}/commands/base/recognize_commands_base.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/batch_command.cs (99%) rename src/{clis/spx/commands/transcribe_conversation_command.cs => extensions/speech_extension/commands/conversation_transcription_command.cs} (95%) rename src/{clis/spx => extensions/speech_extension}/commands/custom_speech_recognition_command.cs (99%) rename src/{clis/spx => extensions/speech_extension}/commands/dialog_command.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/intent_command.cs (99%) create mode 100644 src/extensions/speech_extension/commands/meeting_transcription_command.cs rename src/{clis/spx => extensions/speech_extension}/commands/parsers/batch_command_parser.cs (98%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/bot_command_parser.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/common_output_token_parsers.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/common_speech_token_parsers.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/custom_speech_recognition_command_parser.cs (98%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/dialog_command_parser.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/intent_command_parser.cs (98%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/profile_command_parser.cs (94%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/recognize_command_parser.cs (98%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/synthesize_command_parser.cs (98%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/transcribe_conversation_command_parser.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/translate_command_parser.cs (98%) rename src/{clis/spx => extensions/speech_extension}/commands/parsers/webjob_command_parser.cs (100%) rename src/{clis/spx => extensions/speech_extension}/commands/profile_command.cs (99%) rename src/{clis/spx => extensions/speech_extension}/commands/recognize_command.cs (99%) rename src/{clis/spx => extensions/speech_extension}/commands/synthesize_command.cs (95%) rename src/{clis/spx => extensions/speech_extension}/commands/translate_command.cs (99%) rename src/{clis/spx => extensions/speech_extension}/commands/webjob_command.cs (100%) rename src/{clis/spx => extensions/speech_extension}/helpers/audio_helpers.cs (100%) rename src/{clis/spx => extensions/speech_extension}/helpers/caption_helper.cs (100%) rename src/{clis/spx => extensions/speech_extension}/helpers/config_helpers.cs (100%) rename src/{clis/spx => extensions/speech_extension}/helpers/connection_helpers.cs (100%) rename src/{clis/spx => extensions/speech_extension}/helpers/display_helpers.cs (85%) rename src/{clis/spx => extensions/speech_extension}/helpers/event_logger_helpers.cs (100%) rename src/{clis/spx => extensions/speech_extension}/helpers/output_helper.cs (87%) rename src/{clis/spx => extensions/speech_extension}/helpers/wer_helpers.cs (100%) create mode 100644 src/extensions/speech_extension/speech-extension.csproj diff --git a/ai-cli.sln b/ai-cli.sln index 33e21935..665ad14e 100644 --- a/ai-cli.sln +++ b/ai-cli.sln @@ -25,6 +25,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C8AFF891 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RecordedYamlTestAdapter", "src\testing\adapters\recordingadapter\RecordedYamlTestAdapter.csproj", "{9499C018-FA08-4133-93B3-FC0F3863A6CC}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "speech-extension", "src\extensions\speech_extension\speech-extension.csproj", "{CED7C805-0435-4BF7-A42F-9F3BBF14A18F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -143,6 +145,18 @@ Global {9499C018-FA08-4133-93B3-FC0F3863A6CC}.Release|x64.Build.0 = Release|Any CPU {9499C018-FA08-4133-93B3-FC0F3863A6CC}.Release|x86.ActiveCfg = Release|Any CPU {9499C018-FA08-4133-93B3-FC0F3863A6CC}.Release|x86.Build.0 = Release|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Debug|x64.ActiveCfg = Debug|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Debug|x64.Build.0 = Debug|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Debug|x86.ActiveCfg = Debug|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Debug|x86.Build.0 = Debug|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|Any CPU.Build.0 = Release|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|x64.ActiveCfg = Release|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|x64.Build.0 = Release|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|x86.ActiveCfg = Release|Any CPU + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -155,6 +169,7 @@ Global {B0B3437F-1828-4A13-866F-1CF7C924015E} = {C8AFF891-D6AA-4B8F-BC21-10404DF4B355} {39876475-2D98-40CF-8B08-CD423A5EB4E8} = {C8AFF891-D6AA-4B8F-BC21-10404DF4B355} {9499C018-FA08-4133-93B3-FC0F3863A6CC} = {C8AFF891-D6AA-4B8F-BC21-10404DF4B355} + {CED7C805-0435-4BF7-A42F-9F3BBF14A18F} = {644B75F1-C768-4DB3-BAF2-C69A1F36DD28} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {002655B1-E1E1-4F2A-8D53-C9CD55136AE2} diff --git a/src/ai/.x/help/speech/_ b/src/ai/.x/help/speech/_ index eb640e92..bf188704 100644 --- a/src/ai/.x/help/speech/_ +++ b/src/ai/.x/help/speech/_ @@ -7,19 +7,17 @@ USAGE: ai speech [...] COMMANDS -`#e_;*` ai speech recognize [...] (see: ai help speech recognize) -`#e_;*` ai speech synthesize [...] (see: ai help speech synthesize) + ai speech recognize [...] (see: ai help speech recognize) + ai speech synthesize [...] (see: ai help speech synthesize) -`#e_;*` ai speech intent [...] (see: ai help speech intent) -`#e_;*` ai speech translate [...] (see: ai help speech translate) + ai speech intent [...] (see: ai help speech intent) + ai speech translate [...] (see: ai help speech translate) -`#e_;*` ai speech batch [...] (see: ai help speech batch) -`#e_;*` ai speech csr [...] (see: ai help speech csr) + ai speech batch [...] (see: ai help speech batch) + ai speech csr [...] (see: ai help speech csr) -`#e_;*` ai speech profile [...] (see: ai help speech profile) -`#e_;*` ai speech speaker [...] (see: ai help speech speaker) - -`#e_;* - COMING SOON` + ai speech profile [...] (see: ai help speech profile) + ai speech speaker [...] (see: ai help speech speaker) ADDITIONAL TOPICS diff --git a/src/ai/.x/help/speech/csr.examples b/src/ai/.x/help/speech/csr.examples index 2615cc60..3e7b51ef 100644 --- a/src/ai/.x/help/speech/csr.examples +++ b/src/ai/.x/help/speech/csr.examples @@ -13,7 +13,7 @@ CUSTOM SPEECH RECOGNITION EXAMPLES ai speech csr endpoint create --name "LM example" --text @sentences.txt --output id @my.cid.txt ai speech csr endpoint status --endpoint @my.cid.txt --wait - ai speech recognize --files test.wav --endpoint id @my.cid + ai speech recognize --files test.wav --endpoint id @my.cid.txt `EXAMPLE 2`: List custom speech recognition projects or endpoints diff --git a/src/ai/ai-cli.csproj b/src/ai/ai-cli.csproj index ddbe30bd..67430ea9 100644 --- a/src/ai/ai-cli.csproj +++ b/src/ai/ai-cli.csproj @@ -122,7 +122,7 @@ - + @@ -133,6 +133,7 @@ + diff --git a/src/ai/commands/parsers/speech_command_parser.cs b/src/ai/commands/parsers/speech_command_parser.cs index 3e662eb2..9f1e0186 100644 --- a/src/ai/commands/parsers/speech_command_parser.cs +++ b/src/ai/commands/parsers/speech_command_parser.cs @@ -106,22 +106,23 @@ private static readonly (string name, bool valuesRequired)[] _commands = { private static IEnumerable GetCommandParsers(ICommandValues values) { - var commandName = values.GetCommand(); - switch (commandName) + var check = string.Join(".", values.GetCommand() + .Split('.') + .Take(2) + .ToArray()); + + switch (check) { - case "speech.recognize": return speechRecognizeParsers; - case "speech.synthesize": return speechSynthesizeParsers; - case "speech.intent": return speechIntentParsers; - case "speech.translate": return speechTranslateParsers; - case "speech.batch": return speechBatchParsers; - case "speech.csr": return speechCsrParsers; - case "speech.profile": return speechProfileParsers; - case "speech.speaker": return speechSpeakerParsers; + case "speech.recognize": return RecognizeCommandParser.GetCommandParsers(); + case "speech.synthesize": return SynthesizeCommandParser.GetCommandParsers(); + case "speech.intent": return IntentCommandParser.GetCommandParsers(); + case "speech.translate": return TranslateCommandParser.GetCommandParsers(); + case "speech.batch": return BatchCommandParser.GetCommandParsers(values); + case "speech.csr": return CustomSpeechRecognitionCommandParser.GetCommandParsers(values); + case "speech.profile": return ProfileCommandParser.GetCommandParsers(values); + case "speech.speaker": return ProfileCommandParser.GetCommandParsers(values); } - if (commandName.StartsWith("speech.batch")) return speechBatchParsers; - if (commandName.StartsWith("speech.csr")) return speechCsrParsers; - return null; } diff --git a/src/ai/commands/speech_command.cs b/src/ai/commands/speech_command.cs index 3ae412d9..62f06f15 100644 --- a/src/ai/commands/speech_command.cs +++ b/src/ai/commands/speech_command.cs @@ -53,8 +53,42 @@ private void DoCommand(string command) { CheckPath(); - switch (command) + var check = string.Join(".", command + .Split('.') + .Take(2) + .ToArray()); + + switch (check) { + case "speech.synthesize": + new SynthesizeCommand(_values).RunCommand(); + break; + + case "speech.recognize": + new RecognizeCommand(_values).RunCommand(); + break; + + case "speech.intent": + new IntentCommand(_values).RunCommand(); + break; + + case "speech.translate": + new TranslateCommand(_values).RunCommand(); + break; + + case "speech.batch": + new BatchCommand(_values).RunCommand(); + break; + + case "speech.csr": + new CustomSpeechRecognitionCommand(_values).RunCommand(); + break; + + case "speech.profile": + case "speech.speaker": + new ProfileCommand(_values).RunCommand(); + break; + default: _values.AddThrowError("WARNING:", $"'{command.Replace('.', ' ')}' NOT YET IMPLEMENTED!!"); break; diff --git a/src/common/common.csproj b/src/common/common.csproj index 0e03114e..c6467632 100644 --- a/src/common/common.csproj +++ b/src/common/common.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/extensions/speech_extension/BuildCommon.targets b/src/extensions/speech_extension/BuildCommon.targets new file mode 100644 index 00000000..9813b863 --- /dev/null +++ b/src/extensions/speech_extension/BuildCommon.targets @@ -0,0 +1,24 @@ + + + + + 1.0.0 + false + + + + $([System.DateTime]::Now.ToString('yyyyMMdd')) + $([System.Environment]::UserName) + + + + $(CLIAssemblyVersion)-DEV-$(UserName)-$(CurrentDate) + + + + $(CLIAssemblyVersion) + $(CLIAssemblyVersion) + $(CLIAssemblyInformationalVersion) + + + diff --git a/src/clis/spx/commands/base/recognize_commands_base.cs b/src/extensions/speech_extension/commands/base/recognize_commands_base.cs similarity index 100% rename from src/clis/spx/commands/base/recognize_commands_base.cs rename to src/extensions/speech_extension/commands/base/recognize_commands_base.cs diff --git a/src/clis/spx/commands/batch_command.cs b/src/extensions/speech_extension/commands/batch_command.cs similarity index 99% rename from src/clis/spx/commands/batch_command.cs rename to src/extensions/speech_extension/commands/batch_command.cs index dcc7f478..36afb30f 100644 --- a/src/clis/spx/commands/batch_command.cs +++ b/src/extensions/speech_extension/commands/batch_command.cs @@ -23,14 +23,14 @@ namespace Azure.AI.Details.Common.CLI { public class BatchCommand : Command { - internal BatchCommand(ICommandValues values) + public BatchCommand(ICommandValues values) { _values = values.ReplaceValues(); _quiet = _values.GetOrDefault("x.quiet", false); _verbose = _values.GetOrDefault("x.verbose", true); } - internal bool RunCommand() + public bool RunCommand() { try { @@ -55,7 +55,7 @@ private void DoCommand(string command) { CheckPath(); - switch (command) + switch (command.Replace("speech.", "")) { case "batch.list": DoList(); break; case "batch.download": DoDownload(); break; diff --git a/src/clis/spx/commands/transcribe_conversation_command.cs b/src/extensions/speech_extension/commands/conversation_transcription_command.cs similarity index 95% rename from src/clis/spx/commands/transcribe_conversation_command.cs rename to src/extensions/speech_extension/commands/conversation_transcription_command.cs index 055a380c..4fc311bf 100644 --- a/src/clis/spx/commands/transcribe_conversation_command.cs +++ b/src/extensions/speech_extension/commands/conversation_transcription_command.cs @@ -18,9 +18,9 @@ namespace Azure.AI.Details.Common.CLI { - public class TranscribeConversationCommand : Command + public class ConversationTranscriptionCommand : Command { - internal TranscribeConversationCommand(ICommandValues values) + internal ConversationTranscriptionCommand(ICommandValues values) { _values = values.ReplaceValues(); } @@ -73,12 +73,9 @@ private void RecognizeContinuous() private ConversationTranscriber CreateConversationTranscriber() { SpeechConfig config = CreateSpeechConfig(); - Conversation conversation = CreateConversation(config); AudioConfig audioConfig = ConfigHelpers.CreateAudioConfig(_values); - var transcriber = new ConversationTranscriber(audioConfig); - - transcriber.JoinConversationAsync(conversation).Wait(); + var transcriber = new ConversationTranscriber(config, audioConfig); _disposeAfterStop.Add(audioConfig); _disposeAfterStop.Add(transcriber); @@ -186,7 +183,6 @@ private void SetSpeechConfigProperties(SpeechConfig config) // var inRoom = _values.GetOrDefault("conversation.in.room", false); // if (inRoom) config.SetProperty("ConversationTranscriptionInRoomAndOnline", "true"); - config.SetProperty("ConversationTranscriptionInRoomAndOnline", "true"); CheckNotYetImplementedConfigProperties(); } @@ -213,15 +209,6 @@ private void CheckNotYetImplementedConfigProperties() } } - private Conversation CreateConversation(SpeechConfig config) - { - var conversationId = _values.GetOrDefault("conversation.id", Guid.NewGuid().ToString()); - var task = Conversation.CreateConversationAsync(config, conversationId); - - const int maxTimeToWait = 30000; - return task.Wait(maxTimeToWait) ? task.Result : null; - } - private void CheckAudioInput() { var id = _values["audio.input.id"]; diff --git a/src/clis/spx/commands/custom_speech_recognition_command.cs b/src/extensions/speech_extension/commands/custom_speech_recognition_command.cs similarity index 99% rename from src/clis/spx/commands/custom_speech_recognition_command.cs rename to src/extensions/speech_extension/commands/custom_speech_recognition_command.cs index f44e1747..710f4f31 100644 --- a/src/clis/spx/commands/custom_speech_recognition_command.cs +++ b/src/extensions/speech_extension/commands/custom_speech_recognition_command.cs @@ -20,14 +20,14 @@ namespace Azure.AI.Details.Common.CLI { public class CustomSpeechRecognitionCommand : Command { - internal CustomSpeechRecognitionCommand(ICommandValues values) + public CustomSpeechRecognitionCommand(ICommandValues values) { _values = values.ReplaceValues(); _quiet = _values.GetOrDefault("x.quiet", false); _verbose = _values.GetOrDefault("x.verbose", true); } - internal bool RunCommand() + public bool RunCommand() { try { @@ -52,7 +52,7 @@ private void DoCommand(string command) { CheckPath(); - switch (command) + switch (command.Replace("speech.", "")) { case "csr.list": DoList(); break; case "csr.download": DoDownload(); break; diff --git a/src/clis/spx/commands/dialog_command.cs b/src/extensions/speech_extension/commands/dialog_command.cs similarity index 100% rename from src/clis/spx/commands/dialog_command.cs rename to src/extensions/speech_extension/commands/dialog_command.cs diff --git a/src/clis/spx/commands/intent_command.cs b/src/extensions/speech_extension/commands/intent_command.cs similarity index 99% rename from src/clis/spx/commands/intent_command.cs rename to src/extensions/speech_extension/commands/intent_command.cs index c886b4d7..322b1371 100644 --- a/src/clis/spx/commands/intent_command.cs +++ b/src/extensions/speech_extension/commands/intent_command.cs @@ -25,12 +25,12 @@ namespace Azure.AI.Details.Common.CLI public class IntentCommand : Command { - internal IntentCommand(ICommandValues values) + public IntentCommand(ICommandValues values) { _values = values.ReplaceValues(); } - internal bool RunCommand() + public bool RunCommand() { Recognize(_values["recognize.method"]); return _values.GetOrDefault("passed", true); diff --git a/src/extensions/speech_extension/commands/meeting_transcription_command.cs b/src/extensions/speech_extension/commands/meeting_transcription_command.cs new file mode 100644 index 00000000..78776dc5 --- /dev/null +++ b/src/extensions/speech_extension/commands/meeting_transcription_command.cs @@ -0,0 +1,520 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; +using Microsoft.CognitiveServices.Speech.Transcription; + +using System.Collections.Generic; + +namespace Azure.AI.Details.Common.CLI +{ + public class MeetingTranscriptionCommand : Command + { + internal MeetingTranscriptionCommand(ICommandValues values) + { + _values = values.ReplaceValues(); + } + + internal bool RunCommand() + { + Recognize(_values["recognize.method"]); + return _values.GetOrDefault("passed", true); + } + + private void Recognize(string recognize) + { + switch (recognize) + { + case "": + case null: + case "continuous": RecognizeContinuous(); break; + } + } + + private void RecognizeContinuous() + { + StartCommand(); + + MeetingTranscriber transcriber = CreateMeetingTranscriber(); + PrepRecognizerConnection(transcriber, true); + PrepRecognizerGrammars(transcriber); + + transcriber.SessionStarted += SessionStarted; + transcriber.SessionStopped += SessionStopped; + transcriber.Transcribing += Transcribing; + transcriber.Transcribed += Transcribed; + transcriber.Canceled += Canceled; + + transcriber.StartTranscribingAsync().Wait(); + if (_microphone) { Console.WriteLine("Transcribing; press ENTER to stop ...\n"); } + + var timeout = _values.GetOrDefault("recognize.timeout", int.MaxValue); + WaitForContinuousStopCancelKeyOrTimeout(transcriber, timeout); + + transcriber.StopTranscribingAsync().Wait(); + + if (_disconnect) RecognizerConnectionDisconnect(transcriber); + + StopCommand(); + DisposeAfterStop(); + DeleteTemporaryFiles(); + } + + private MeetingTranscriber CreateMeetingTranscriber() + { + SpeechConfig config = CreateSpeechConfig(); + Meeting meeting = CreateMeeting(config); + + AudioConfig audioConfig = ConfigHelpers.CreateAudioConfig(_values); + var transcriber = new MeetingTranscriber(audioConfig); + + transcriber.JoinMeetingAsync(meeting).Wait(); + + _disposeAfterStop.Add(audioConfig); + _disposeAfterStop.Add(transcriber); + + _output.EnsureCachePropertyCollection("recognizer", transcriber.Properties); + + return transcriber; + } + + private SpeechConfig CreateSpeechConfig() + { + var key = _values["service.config.key"]; + var host = _values["service.config.host"]; + var region = _values["service.config.region"]; + var endpoint = _values["service.config.endpoint.uri"]; + var tokenValue = _values["service.config.token.value"]; + + if (string.IsNullOrEmpty(endpoint) && string.IsNullOrEmpty(region) && string.IsNullOrEmpty(host)) + { + _values.AddThrowError("ERROR:", $"Creating SpeechConfig; requires one of: region, endpoint, or host."); + } + else if (!string.IsNullOrEmpty(region) && string.IsNullOrEmpty(tokenValue) && string.IsNullOrEmpty(key)) + { + _values.AddThrowError("ERROR:", $"Creating SpeechConfig; use of region requires one of: key or token."); + } + + SpeechConfig config = null; + if (!string.IsNullOrEmpty(endpoint)) + { + config = string.IsNullOrEmpty(key) + ? SpeechConfig.FromEndpoint(new Uri(endpoint)) + : SpeechConfig.FromEndpoint(new Uri(endpoint), key); + } + else if (!string.IsNullOrEmpty(host)) + { + config = string.IsNullOrEmpty(key) + ? SpeechConfig.FromHost(new Uri(host)) + : SpeechConfig.FromHost(new Uri(host), key); + } + else // if (!string.IsNullOrEmpty(region)) + { + config = string.IsNullOrEmpty(tokenValue) + ? SpeechConfig.FromSubscription(key, region) + : SpeechConfig.FromAuthorizationToken(tokenValue, region); + } + + if (!string.IsNullOrEmpty(tokenValue)) + { + config.AuthorizationToken = tokenValue; + } + + SetSpeechConfigProperties(config); + return config; + } + + private void SetSpeechConfigProperties(SpeechConfig config) + { + ConfigHelpers.SetupLogFile(config, _values); + + var language = _values["source.language.config"]; + if (!string.IsNullOrEmpty(language)) config.SpeechRecognitionLanguage = language; + + var proxyHost = _values["service.config.proxy.host"]; + if (!string.IsNullOrEmpty(proxyHost)) config.SetProxy(proxyHost, _values.GetOrDefault("service.config.proxy.port", 80)); + + var endpointId = _values["service.config.endpoint.id"]; + if (!string.IsNullOrEmpty(endpointId)) config.EndpointId = endpointId; + + var needDetailedText = _output.NeedsLexicalText() || _output.NeedsItnText(); + if (needDetailedText) config.OutputFormat = OutputFormat.Detailed; + + var profanity = _values["service.output.config.profanity.option"]; + if (profanity == "removed") config.SetProfanity(ProfanityOption.Removed); + if (profanity == "masked") config.SetProfanity(ProfanityOption.Masked); + if (profanity == "raw") config.SetProfanity(ProfanityOption.Raw); + + var wordTimings = _values.GetOrDefault("service.output.config.word.level.timing", false); + if (wordTimings) config.RequestWordLevelTimestamps(); + + var contentLogging = _values.GetOrDefault("service.config.content.logging.enabled", false); + if (contentLogging) config.EnableAudioLogging(); + + var trafficType = _values.GetOrDefault("service.config.endpoint.traffic.type", "spx"); + config.SetServiceProperty("traffictype", trafficType, ServicePropertyChannel.UriQueryParameter); + + var endpointParam = _values.GetOrDefault("service.config.endpoint.query.string", ""); + if (!string.IsNullOrEmpty(endpointParam)) ConfigHelpers.SetEndpointParams(config, endpointParam); + + var httpHeader = _values.GetOrDefault("service.config.endpoint.http.header", ""); + if (!string.IsNullOrEmpty(httpHeader)) SetHttpHeaderProperty(config, httpHeader); + + var rtf = _values.GetOrDefault("audio.input.real.time.factor", -1); + if (rtf >= 0) config.SetProperty("SPEECH-AudioThrottleAsPercentageOfRealTime", rtf.ToString()); + + var fastLane = _values.GetOrDefault("audio.input.fast.lane", rtf >= 0 ? 0 : -1); + if (fastLane >= 0) config.SetProperty("SPEECH-TransmitLengthBeforThrottleMs", fastLane.ToString()); + + var stringProperty = _values.GetOrDefault("config.string.property", ""); + if (!string.IsNullOrEmpty(stringProperty)) ConfigHelpers.SetStringProperty(config, stringProperty); + + var stringProperties = _values.GetOrDefault("config.string.properties", ""); + if (!string.IsNullOrEmpty(stringProperties)) ConfigHelpers.SetStringProperties(config, stringProperties); + + // config.SetProperty("AudioConfig_NumberOfChannelsForCapture", "8"); + + // var inRoom = _values.GetOrDefault("conversation.in.room", false); + // if (inRoom) config.SetProperty("ConversationTranscriptionInRoomAndOnline", "true"); + config.SetProperty("ConversationTranscriptionInRoomAndOnline", "true"); + + CheckNotYetImplementedConfigProperties(); + } + + private static void SetHttpHeaderProperty(SpeechConfig config, string httpHeader) + { + string name = "", value = ""; + if (StringHelpers.SplitNameValue(httpHeader, out name, out value)) config.SetServiceProperty(name, value, ServicePropertyChannel.HttpHeader); + } + + private void CheckNotYetImplementedConfigProperties() + { + var notYetImplemented = + ";config.token.type;config.token.password;config.token.username" + + ";config.language.target;transcriber.property"; + + foreach (var key in notYetImplemented.Split(';')) + { + var value = _values[key]; + if (!string.IsNullOrEmpty(value)) + { + _values.AddThrowError("WARNING:", $"'{key}={value}' NOT YET IMPLEMENTED!!"); + } + } + } + + private Meeting CreateMeeting(SpeechConfig config) + { + var meetingId = _values.GetOrDefault("meeting.id", Guid.NewGuid().ToString()); + var task = Meeting.CreateMeetingAsync(config, meetingId); + + const int maxTimeToWait = 30000; + return task.Wait(maxTimeToWait) ? task.Result : null; + } + + private void CheckAudioInput() + { + var id = _values["audio.input.id"]; + var device = _values["audio.input.microphone.device"]; + var input = _values["audio.input.type"]; + var file = _values["audio.input.file"]; + var url = ""; + + if (!string.IsNullOrEmpty(file) && file.StartsWith("http")) + { + file = DownloadInputFile(url = file, "audio.input.file", "audio input"); + } + + if (string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(url)) + { + id = GetIdFromInputUrl(url, "audio.input.id"); + } + + if (string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(file)) + { + id = GetIdFromAudioInputFile(input, file); + } + + if (string.IsNullOrEmpty(input) && !string.IsNullOrEmpty(id)) + { + input = GetAudioInputFromId(id); + } + + if (input == "file" && string.IsNullOrEmpty(file) && !string.IsNullOrEmpty(id)) + { + file = GetAudioInputFileFromId(id); + } + + _microphone = (input == "microphone" || string.IsNullOrEmpty(input)); + } + + private string GetIdFromAudioInputFile(string input, string file) + { + string id; + if (input == "microphone" || string.IsNullOrEmpty(input)) + { + id = "microphone"; + } + else if (input == "file" && !string.IsNullOrEmpty(file)) + { + var existing = FileHelpers.DemandFindFileInDataPath(file, _values, "audio input"); + id = Path.GetFileNameWithoutExtension(existing); + } + else + { + id = "error"; + } + + _values.Add("audio.input.id", id); + return id; + } + + private string GetAudioInputFromId(string id) + { + string input; + if (id == "microphone") + { + input = "microphone"; + } + else if (FileHelpers.FileExistsInDataPath(id, _values) || FileHelpers.FileExistsInDataPath(id + ".wav", _values)) + { + input = "file"; + } + else if (_values.Contains("audio.input.id.url")) + { + input = "file"; + } + else + { + _values.AddThrowError("ERROR:", $"Cannot find audio input file: \"{id}.wav\""); + return null; + } + + _values.Add("audio.input.type", input); + return input; + } + + private string GetAudioInputFileFromId(string id) + { + string file; + var existing = FileHelpers.FindFileInDataPath(id, _values); + if (existing == null) existing = FileHelpers.FindFileInDataPath(id + ".wav", _values); + + if (existing == null) + { + var url = _values["audio.input.id.url"]; + if (!string.IsNullOrEmpty(url)) + { + url = url.Replace("{id}", id); + existing = HttpHelpers.DownloadFileWithRetry(url); + } + } + + file = existing; + _values.Add("audio.input.file", file); + return file; + } + + private KeywordRecognitionModel LoadKeywordModel() + { + var fileName = _values["recognize.keyword.file"]; + var existing = FileHelpers.DemandFindFileInDataPath(fileName, _values, "keyword model"); + + var keywordModel = KeywordRecognitionModel.FromFile(existing); + return keywordModel; + } + + private void PrepRecognizerGrammars(MeetingTranscriber transcriber) + { + var phrases = _values["grammar.phrase.list"]; + if (!string.IsNullOrEmpty(phrases)) PrepRecognizerPhraseListGrammar(transcriber, phrases.Split('\r', '\n', ';')); + + var partialPhraseRecognitionFactor = _values["grammar.recognition.factor.phrase"]; + if (!string.IsNullOrEmpty(partialPhraseRecognitionFactor)) PrepGrammarList(transcriber, double.Parse(partialPhraseRecognitionFactor)); + } + + private void PrepGrammarList(MeetingTranscriber recognizer, double partialPhraseRecognitionFactor) + { + var grammarList = GrammarList.FromRecognizer(recognizer); + grammarList.SetRecognitionFactor(partialPhraseRecognitionFactor, RecognitionFactorScope.PartialPhrase); + } + + private void PrepRecognizerPhraseListGrammar(MeetingTranscriber transcriber, IEnumerable phrases) + { + var grammar = PhraseListGrammar.FromRecognizer(transcriber); + foreach (var phrase in phrases) + { + if (!string.IsNullOrEmpty(phrase)) + { + grammar.AddPhrase(phrase); + } + } + } + + private void PrepRecognizerConnection(MeetingTranscriber transcriber, bool continuous) + { + var connection = Connection.FromRecognizer(transcriber); + _disposeAfterStop.Add(connection); + + connection.Connected += Connected; + connection.Disconnected += Disconnected; + connection.MessageReceived += ConnectionMessageReceived; + + var connect = _values["connection.connect"]; + var disconnect = _values["connection.disconnect"]; + + _connect = !string.IsNullOrEmpty(connect) && connect == "true"; + _disconnect = !string.IsNullOrEmpty(disconnect) && disconnect == "true"; + + if (_connect) RecognizerConnectionConnect(connection, continuous); + ConnectionHelpers.SetConnectionMessageProperties(connection, _values); + } + + private void RecognizerConnectionConnect(Connection connection, bool continuous) + { + connection.Open(continuous); + } + + private void RecognizerConnectionDisconnect(MeetingTranscriber transcriber) + { + _lock.EnterReaderLockOnce(ref _expectDisconnected); + + var connection = Connection.FromRecognizer(transcriber); + connection.Close(); + } + + private void Connected(object sender, ConnectionEventArgs e) + { + _display.DisplayConnected(e); + _output.Connected(e); + } + + private void Disconnected(object sender, ConnectionEventArgs e) + { + _display.DisplayDisconnected(e); + _output.Disconnected(e); + + _lock.ExitReaderLockOnce(ref _expectDisconnected); + } + + private void ConnectionMessageReceived(object sender, ConnectionMessageEventArgs e) + { + _display.DisplayMessageReceived(e); + _output.ConnectionMessageReceived(e); + } + + private void SessionStarted(object sender, SessionEventArgs e) + { + _lock.EnterReaderLockOnce(ref _expectSessionStopped); + _stopEvent.Reset(); + + _display.DisplaySessionStarted(e); + _output.SessionStarted(e); + } + + private void SessionStopped(object sender, SessionEventArgs e) + { + _display.DisplaySessionStopped(e); + _output.SessionStopped(e); + + _stopEvent.Set(); + _lock.ExitReaderLockOnce(ref _expectSessionStopped); + } + + private void Transcribing(object sender, MeetingTranscriptionEventArgs e) + { + _lock.EnterReaderLockOnce(ref _expectRecognized); + + _display.DisplayTranscribing(e); + _output.Transcribing(e); + } + + private void Transcribed(object sender, MeetingTranscriptionEventArgs e) + { + _display.DisplayTranscribed(e); + _output.Transcribed(e); + + _lock.ExitReaderLockOnce(ref _expectRecognized); + } + + private void Canceled(object sender, MeetingTranscriptionCanceledEventArgs e) + { + _display.DisplayCanceled(e); + _output.Canceled(e); + _canceledEvent.Set(); + } + + private void WaitForContinuousStopCancelKeyOrTimeout(MeetingTranscriber transcriber, int timeout) + { + var interval = 100; + + while (timeout > 0) + { + timeout -= interval; + if (_stopEvent.WaitOne(interval)) break; + if (_canceledEvent.WaitOne(0)) break; + if (_microphone && Console.KeyAvailable) + { + transcriber.StopTranscribingAsync().Wait(); + break; + } + } + } + + private void StartCommand() + { + CheckPath(); + CheckAudioInput(); + + _display = new DisplayHelper(_values); + + _output = new OutputHelper(_values); + _output.StartOutput(); + + var id = _values["audio.input.id"]; + _output.EnsureOutputAll("audio.input.id", id); + _output.EnsureOutputEach("audio.input.id", id); + _output.EnsureCacheProperty("audio.input.id", id); + + var file = _values["audio.input.file"]; + _output.EnsureCacheProperty("audio.input.file", file); + + _lock = new SpinLock(); + _lock.StartLock(); + + _expectRecognized = 0; + _expectSessionStopped = 0; + _expectDisconnected = 0; + } + + private void StopCommand() + { + _lock.StopLock(5000); + + _output.CheckOutput(); + _output.StopOutput(); + } + + private bool _microphone = false; + private bool _connect = false; + private bool _disconnect = false; + + private SpinLock _lock = null; + private int _expectRecognized = 0; + private int _expectSessionStopped = 0; + private int _expectDisconnected = 0; + + OutputHelper _output = null; + DisplayHelper _display = null; + } +} diff --git a/src/clis/spx/commands/parsers/batch_command_parser.cs b/src/extensions/speech_extension/commands/parsers/batch_command_parser.cs similarity index 98% rename from src/clis/spx/commands/parsers/batch_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/batch_command_parser.cs index b2f807bb..b378c110 100644 --- a/src/clis/spx/commands/parsers/batch_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/batch_command_parser.cs @@ -9,7 +9,7 @@ namespace Azure.AI.Details.Common.CLI { - class BatchCommandParser : CommandParser + public class BatchCommandParser : CommandParser { public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) { @@ -42,10 +42,10 @@ private static readonly (string name, bool valuesRequired)[] _commands = { "batch" }; - private static IEnumerable GetCommandParsers(ICommandValues values) + public static IEnumerable GetCommandParsers(ICommandValues values) { var commandName = values.GetCommand(); - switch (commandName) + switch (commandName.Replace("speech.", "")) { case "batch.list": case "batch.transcription.list": diff --git a/src/clis/spx/commands/parsers/bot_command_parser.cs b/src/extensions/speech_extension/commands/parsers/bot_command_parser.cs similarity index 100% rename from src/clis/spx/commands/parsers/bot_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/bot_command_parser.cs diff --git a/src/clis/spx/commands/parsers/common_output_token_parsers.cs b/src/extensions/speech_extension/commands/parsers/common_output_token_parsers.cs similarity index 100% rename from src/clis/spx/commands/parsers/common_output_token_parsers.cs rename to src/extensions/speech_extension/commands/parsers/common_output_token_parsers.cs diff --git a/src/clis/spx/commands/parsers/common_speech_token_parsers.cs b/src/extensions/speech_extension/commands/parsers/common_speech_token_parsers.cs similarity index 100% rename from src/clis/spx/commands/parsers/common_speech_token_parsers.cs rename to src/extensions/speech_extension/commands/parsers/common_speech_token_parsers.cs diff --git a/src/clis/spx/commands/parsers/custom_speech_recognition_command_parser.cs b/src/extensions/speech_extension/commands/parsers/custom_speech_recognition_command_parser.cs similarity index 98% rename from src/clis/spx/commands/parsers/custom_speech_recognition_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/custom_speech_recognition_command_parser.cs index 595e0287..0b01f831 100644 --- a/src/clis/spx/commands/parsers/custom_speech_recognition_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/custom_speech_recognition_command_parser.cs @@ -8,7 +8,7 @@ namespace Azure.AI.Details.Common.CLI { - class CustomSpeechRecognitionCommandParser : CommandParser + public class CustomSpeechRecognitionCommandParser : CommandParser { public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) { @@ -64,9 +64,13 @@ private static readonly (string name, bool valuesRequired)[] _commands = { "csr" }; - private static INamedValueTokenParser[] GetCommandParsers(ICommandValues values) + public static INamedValueTokenParser[] GetCommandParsers(ICommandValues values) { - var commandName = values.GetCommand(); + var commandName = string.Join('.', values.GetCommand() + .Split('.') + .SkipWhile(x => x == "speech") + .ToArray()); + switch (commandName) { case "csr.list": return listCommandParsers; diff --git a/src/clis/spx/commands/parsers/dialog_command_parser.cs b/src/extensions/speech_extension/commands/parsers/dialog_command_parser.cs similarity index 100% rename from src/clis/spx/commands/parsers/dialog_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/dialog_command_parser.cs diff --git a/src/clis/spx/commands/parsers/intent_command_parser.cs b/src/extensions/speech_extension/commands/parsers/intent_command_parser.cs similarity index 98% rename from src/clis/spx/commands/parsers/intent_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/intent_command_parser.cs index 4e17e564..605133d8 100644 --- a/src/clis/spx/commands/parsers/intent_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/intent_command_parser.cs @@ -2,7 +2,7 @@ namespace Azure.AI.Details.Common.CLI { - class IntentCommandParser : CommandParser + public class IntentCommandParser : CommandParser { public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) { @@ -14,6 +14,11 @@ public static bool ParseCommandValues(INamedValueTokens tokens, ICommandValues v return ParseCommandValues("intent", intentCommandParsers, tokens, values); } + public static IEnumerable GetCommandParsers() + { + return intentCommandParsers; + } + #region private data private static INamedValueTokenParser[] intentCommandParsers = { diff --git a/src/clis/spx/commands/parsers/profile_command_parser.cs b/src/extensions/speech_extension/commands/parsers/profile_command_parser.cs similarity index 94% rename from src/clis/spx/commands/parsers/profile_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/profile_command_parser.cs index c71122b7..607d7e35 100644 --- a/src/clis/spx/commands/parsers/profile_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/profile_command_parser.cs @@ -3,7 +3,7 @@ namespace Azure.AI.Details.Common.CLI { - class ProfileCommandParser : CommandParser + public class ProfileCommandParser : CommandParser { public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) { @@ -31,10 +31,10 @@ private static readonly (string name, bool valuesRequired)[] _commands = { "speaker" }; - private static IEnumerable GetCommandParsers(ICommandValues values) + public static IEnumerable GetCommandParsers(ICommandValues values) { var commandName = values.GetCommand(); - switch (commandName) + switch (commandName.Replace("speech.", "")) { case "profile.list": case "profile.create": diff --git a/src/clis/spx/commands/parsers/recognize_command_parser.cs b/src/extensions/speech_extension/commands/parsers/recognize_command_parser.cs similarity index 98% rename from src/clis/spx/commands/parsers/recognize_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/recognize_command_parser.cs index 1fdce8dc..74a094a3 100644 --- a/src/clis/spx/commands/parsers/recognize_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/recognize_command_parser.cs @@ -2,7 +2,7 @@ namespace Azure.AI.Details.Common.CLI { - class RecognizeCommandParser : CommandParser + public class RecognizeCommandParser : CommandParser { public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) { @@ -14,6 +14,11 @@ public static bool ParseCommandValues(INamedValueTokens tokens, ICommandValues v return ParseCommandValues("recognize", recognizeCommandParsers, tokens, values); } + public static IEnumerable GetCommandParsers() + { + return recognizeCommandParsers; + } + #region private data private static INamedValueTokenParser[] recognizeCommandParsers = { diff --git a/src/clis/spx/commands/parsers/synthesize_command_parser.cs b/src/extensions/speech_extension/commands/parsers/synthesize_command_parser.cs similarity index 98% rename from src/clis/spx/commands/parsers/synthesize_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/synthesize_command_parser.cs index 3beb69f8..c16bbb2e 100644 --- a/src/clis/spx/commands/parsers/synthesize_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/synthesize_command_parser.cs @@ -2,7 +2,7 @@ namespace Azure.AI.Details.Common.CLI { - class SynthesizeCommandParser : CommandParser + public class SynthesizeCommandParser : CommandParser { public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) { @@ -14,6 +14,11 @@ public static bool ParseCommandValues(INamedValueTokens tokens, ICommandValues v return ParseCommandValues("synthesize", synthesizeCommandParsers, tokens, values); } + public static IEnumerable GetCommandParsers() + { + return synthesizeCommandParsers; + } + #region private data private static INamedValueTokenParser[] synthesizeCommandParsers = { diff --git a/src/clis/spx/commands/parsers/transcribe_conversation_command_parser.cs b/src/extensions/speech_extension/commands/parsers/transcribe_conversation_command_parser.cs similarity index 100% rename from src/clis/spx/commands/parsers/transcribe_conversation_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/transcribe_conversation_command_parser.cs diff --git a/src/clis/spx/commands/parsers/translate_command_parser.cs b/src/extensions/speech_extension/commands/parsers/translate_command_parser.cs similarity index 98% rename from src/clis/spx/commands/parsers/translate_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/translate_command_parser.cs index f8966f33..daac5c08 100644 --- a/src/clis/spx/commands/parsers/translate_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/translate_command_parser.cs @@ -2,7 +2,7 @@ namespace Azure.AI.Details.Common.CLI { - class TranslateCommandParser : CommandParser + public class TranslateCommandParser : CommandParser { public static bool ParseCommand(INamedValueTokens tokens, ICommandValues values) { @@ -14,6 +14,11 @@ public static bool ParseCommandValues(INamedValueTokens tokens, ICommandValues v return ParseCommandValues("translate", translateCommandParsers, tokens, values); } + public static IEnumerable GetCommandParsers() + { + return translateCommandParsers; + } + #region private data private static INamedValueTokenParser[] translateCommandParsers = { diff --git a/src/clis/spx/commands/parsers/webjob_command_parser.cs b/src/extensions/speech_extension/commands/parsers/webjob_command_parser.cs similarity index 100% rename from src/clis/spx/commands/parsers/webjob_command_parser.cs rename to src/extensions/speech_extension/commands/parsers/webjob_command_parser.cs diff --git a/src/clis/spx/commands/profile_command.cs b/src/extensions/speech_extension/commands/profile_command.cs similarity index 99% rename from src/clis/spx/commands/profile_command.cs rename to src/extensions/speech_extension/commands/profile_command.cs index 07df6c1b..2da2a204 100644 --- a/src/clis/spx/commands/profile_command.cs +++ b/src/extensions/speech_extension/commands/profile_command.cs @@ -21,14 +21,14 @@ namespace Azure.AI.Details.Common.CLI { public class ProfileCommand : Command { - internal ProfileCommand(ICommandValues values) + public ProfileCommand(ICommandValues values) { _values = values.ReplaceValues(); _quiet = _values.GetOrDefault("x.quiet", false); _verbose = _values.GetOrDefault("x.verbose", true); } - internal bool RunCommand() + public bool RunCommand() { try { @@ -53,7 +53,7 @@ private void DoCommand(string command) { CheckPath(); - switch (command) + switch (command.Replace("speech.", "")) { case "profile.list": DoList(); break; case "profile.create": DoCreateProfile(); break; @@ -95,7 +95,7 @@ private void WriteJsonToFile(string json) saveAs = FileHelpers.GetOutputDataFileName(saveAs, _values); var saveMessage = $"Saving as {saveAs} ..."; if (!_quiet) Console.WriteLine(saveMessage); - FileHelpers.WriteAllText(saveAs, json, new UTF8Encoding(false)) + FileHelpers.WriteAllText(saveAs, json, new UTF8Encoding(false)); if (!_quiet) Console.WriteLine($"{saveMessage} Done!\n"); } } diff --git a/src/clis/spx/commands/recognize_command.cs b/src/extensions/speech_extension/commands/recognize_command.cs similarity index 99% rename from src/clis/spx/commands/recognize_command.cs rename to src/extensions/speech_extension/commands/recognize_command.cs index c79eea7e..73897357 100644 --- a/src/clis/spx/commands/recognize_command.cs +++ b/src/extensions/speech_extension/commands/recognize_command.cs @@ -21,12 +21,12 @@ namespace Azure.AI.Details.Common.CLI { public class RecognizeCommand : Command { - internal RecognizeCommand(ICommandValues values) + public RecognizeCommand(ICommandValues values) { _values = values.ReplaceValues(); } - internal bool RunCommand() + public bool RunCommand() { Recognize(_values["recognize.method"]); return _values.GetOrDefault("passed", true); diff --git a/src/clis/spx/commands/synthesize_command.cs b/src/extensions/speech_extension/commands/synthesize_command.cs similarity index 95% rename from src/clis/spx/commands/synthesize_command.cs rename to src/extensions/speech_extension/commands/synthesize_command.cs index 75fe1db2..7df913ee 100644 --- a/src/clis/spx/commands/synthesize_command.cs +++ b/src/extensions/speech_extension/commands/synthesize_command.cs @@ -21,12 +21,12 @@ namespace Azure.AI.Details.Common.CLI { public class SynthesizeCommand : Command { - internal SynthesizeCommand(ICommandValues values) + public SynthesizeCommand(ICommandValues values) { _values = values.ReplaceValues(); } - internal bool RunCommand() + public bool RunCommand() { var listVoices = _values.GetOrDefault("synthesizer.list.voices", false); if (listVoices) return DoListVoices(); @@ -110,6 +110,11 @@ private void SynthesizeInteractive(bool repeatedly = false) synthesizer.Synthesizing += Synthesizing; synthesizer.SynthesisCompleted += SynthesisCompleted; synthesizer.SynthesisCanceled += SynthesisCanceled; + var wordboundary = _values["config.metadata.wordBoundaryEnabled"]; + if (!string.IsNullOrWhiteSpace(wordboundary) && wordboundary == "true") + { + synthesizer.WordBoundary += SynthesisWordBoundary; + } while (true) { @@ -151,6 +156,11 @@ private void SynthesizeText(string text) synthesizer.Synthesizing += Synthesizing; synthesizer.SynthesisCompleted += SynthesisCompleted; synthesizer.SynthesisCanceled += SynthesisCanceled; + var wordboundary = _values["config.metadata.wordBoundaryEnabled"]; + if (!string.IsNullOrWhiteSpace(wordboundary) && wordboundary == "true") + { + synthesizer.WordBoundary += SynthesisWordBoundary; + } var task = synthesizer.SpeakTextAsync(text); WaitForStopOrCancel(synthesizer, task); @@ -187,6 +197,11 @@ private void SynthesizeSsml(string ssml) synthesizer.Synthesizing += Synthesizing; synthesizer.SynthesisCompleted += SynthesisCompleted; synthesizer.SynthesisCanceled += SynthesisCanceled; + var wordboundary = _values["config.metadata.wordBoundaryEnabled"]; + if (!string.IsNullOrWhiteSpace(wordboundary) && wordboundary == "true") + { + synthesizer.WordBoundary += SynthesisWordBoundary; + } var task = synthesizer.SpeakSsmlAsync(ssml); WaitForStopOrCancel(synthesizer, task); @@ -521,6 +536,12 @@ private void SynthesisCanceled(object sender, SpeechSynthesisEventArgs e) _canceledEvent.Set(); } + private void SynthesisWordBoundary(object sender, SpeechSynthesisWordBoundaryEventArgs e) + { + _display.DisplaySynthesisWordBoundary(e); + _output.SynthesisWordBoundary(e); + } + private void WaitForStopOrCancel(SpeechSynthesizer synthesizer, Task task) { var interval = 100; diff --git a/src/clis/spx/commands/translate_command.cs b/src/extensions/speech_extension/commands/translate_command.cs similarity index 99% rename from src/clis/spx/commands/translate_command.cs rename to src/extensions/speech_extension/commands/translate_command.cs index c06b893f..badcee67 100644 --- a/src/clis/spx/commands/translate_command.cs +++ b/src/extensions/speech_extension/commands/translate_command.cs @@ -19,12 +19,12 @@ namespace Azure.AI.Details.Common.CLI { public class TranslateCommand : Command { - internal TranslateCommand(ICommandValues values) + public TranslateCommand(ICommandValues values) { _values = values.ReplaceValues(); } - internal bool RunCommand() + public bool RunCommand() { Recognize(_values["recognize.method"]); return _values.GetOrDefault("passed", true); diff --git a/src/clis/spx/commands/webjob_command.cs b/src/extensions/speech_extension/commands/webjob_command.cs similarity index 100% rename from src/clis/spx/commands/webjob_command.cs rename to src/extensions/speech_extension/commands/webjob_command.cs diff --git a/src/clis/spx/helpers/audio_helpers.cs b/src/extensions/speech_extension/helpers/audio_helpers.cs similarity index 100% rename from src/clis/spx/helpers/audio_helpers.cs rename to src/extensions/speech_extension/helpers/audio_helpers.cs diff --git a/src/clis/spx/helpers/caption_helper.cs b/src/extensions/speech_extension/helpers/caption_helper.cs similarity index 100% rename from src/clis/spx/helpers/caption_helper.cs rename to src/extensions/speech_extension/helpers/caption_helper.cs diff --git a/src/clis/spx/helpers/config_helpers.cs b/src/extensions/speech_extension/helpers/config_helpers.cs similarity index 100% rename from src/clis/spx/helpers/config_helpers.cs rename to src/extensions/speech_extension/helpers/config_helpers.cs diff --git a/src/clis/spx/helpers/connection_helpers.cs b/src/extensions/speech_extension/helpers/connection_helpers.cs similarity index 100% rename from src/clis/spx/helpers/connection_helpers.cs rename to src/extensions/speech_extension/helpers/connection_helpers.cs diff --git a/src/clis/spx/helpers/display_helpers.cs b/src/extensions/speech_extension/helpers/display_helpers.cs similarity index 85% rename from src/clis/spx/helpers/display_helpers.cs rename to src/extensions/speech_extension/helpers/display_helpers.cs index 9ea2d9eb..9be5dc97 100644 --- a/src/clis/spx/helpers/display_helpers.cs +++ b/src/extensions/speech_extension/helpers/display_helpers.cs @@ -155,13 +155,19 @@ public void DisplayCanceled(IntentRecognitionCanceledEventArgs e) Console.WriteLine(); } + public void DisplayTranscribing(MeetingTranscriptionEventArgs e) + { + if (_quiet) return; + Console.WriteLine($"TRANSCRIBING: {e.Result.Text}"); + } + public void DisplayTranscribing(ConversationTranscriptionEventArgs e) { if (_quiet) return; Console.WriteLine($"TRANSCRIBING: {e.Result.Text}"); } - public void DisplayTranscribed(ConversationTranscriptionEventArgs e) + public void DisplayTranscribed(MeetingTranscriptionEventArgs e) { if (_quiet) return; @@ -178,6 +184,44 @@ public void DisplayTranscribed(ConversationTranscriptionEventArgs e) } } + public void DisplayTranscribed(ConversationTranscriptionEventArgs e) + { + if (_quiet) return; + + var result = e.Result; + if (result.Reason == ResultReason.RecognizedSpeech && result.Text.Length != 0) + { + Console.WriteLine($"TRANSCRIBED: {result.Text} (SpeakerId={result.SpeakerId})"); + Console.WriteLine(); + } + else if (result.Reason == ResultReason.NoMatch && _verbose) + { + Console.WriteLine($"NOMATCH: Speech could not be recognized."); + Console.WriteLine(); + } + } + + public void DisplayCanceled(MeetingTranscriptionCanceledEventArgs e) + { + if (_quiet) return; + + var cancellation = CancellationDetails.FromResult(e.Result); + + var normal = cancellation.Reason == CancellationReason.EndOfStream; + if (normal && !_verbose) return; + + Console.WriteLine($"CANCELED: Reason={cancellation.Reason}"); + + if (cancellation.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + + Console.WriteLine(); + } + public void DisplayCanceled(ConversationTranscriptionCanceledEventArgs e) { if (_quiet) return; @@ -312,6 +356,13 @@ internal void DisplaySynthesisCanceled(SpeechSynthesisEventArgs e) Console.WriteLine(); } + internal void DisplaySynthesisWordBoundary(SpeechSynthesisWordBoundaryEventArgs e) + { + if (_quiet) return; + + Console.WriteLine($"METADATA: wordboundary=[ type: {e.BoundaryType}, length: {e.WordLength}, text: {e.Text}, offset: {e.AudioOffset}, duration: {e.Duration} ]"); + } + private ICommandValues _values; private bool _quiet; private bool _verbose; diff --git a/src/clis/spx/helpers/event_logger_helpers.cs b/src/extensions/speech_extension/helpers/event_logger_helpers.cs similarity index 100% rename from src/clis/spx/helpers/event_logger_helpers.cs rename to src/extensions/speech_extension/helpers/event_logger_helpers.cs diff --git a/src/clis/spx/helpers/output_helper.cs b/src/extensions/speech_extension/helpers/output_helper.cs similarity index 87% rename from src/clis/spx/helpers/output_helper.cs rename to src/extensions/speech_extension/helpers/output_helper.cs index 0066cf62..a221db6e 100644 --- a/src/clis/spx/helpers/output_helper.cs +++ b/src/extensions/speech_extension/helpers/output_helper.cs @@ -157,6 +157,27 @@ public void Canceled(IntentRecognitionCanceledEventArgs e) _lock.ExitReaderLock(); } + public void Transcribing(MeetingTranscriptionEventArgs e) + { + _lock.EnterReaderLock(); + OutputTranscribing(e); + _lock.ExitReaderLock(); + } + + public void Transcribed(MeetingTranscriptionEventArgs e) + { + _lock.EnterReaderLock(); + OutputTranscribed(e); + _lock.ExitReaderLock(); + } + + public void Canceled(MeetingTranscriptionCanceledEventArgs e) + { + _lock.EnterReaderLock(); + OutputCanceled(e); + _lock.ExitReaderLock(); + } + public void Transcribing(ConversationTranscriptionEventArgs e) { _lock.EnterReaderLock(); @@ -227,6 +248,13 @@ public void SynthesisCanceled(SpeechSynthesisEventArgs e) _lock.ExitReaderLock(); } + public void SynthesisWordBoundary(SpeechSynthesisWordBoundaryEventArgs e) + { + _lock.EnterReaderLock(); + OutputWordBoundary(e); + _lock.ExitReaderLock(); + } + public void EnsureCachePropertyCollection(string name, PropertyCollection properties) { EnsureInitPropertyCollectionCache(); @@ -274,6 +302,11 @@ private void EnsureCacheOutputResult(IntentRecognitionResult result) if (ShouldCacheOutputResult()) CacheOutputResult(result); } + private void EnsureCacheOutputResult(MeetingTranscriptionResult result) + { + if (ShouldCacheOutputResult()) CacheOutputResult(result); + } + private void EnsureCacheOutputResult(ConversationTranscriptionResult result) { if (ShouldCacheOutputResult()) CacheOutputResult(result); @@ -284,6 +317,11 @@ private void EnsureCacheOutputResult(TranslationRecognitionResult result) if (ShouldCacheOutputResult()) CacheOutputResult(result); } + private void EnsureCacheOutputResult(SpeechSynthesisResult result) + { + if (ShouldCacheOutputResult()) CacheOutputResult(result); + } + private void CacheProperty(string name, string value) { EnsureInitOutputResultCache(); @@ -302,6 +340,12 @@ private void CacheOutputResult(IntentRecognitionResult result) _outputResultCache.Add(result); } + private void CacheOutputResult(MeetingTranscriptionResult result) + { + EnsureInitOutputResultCache(); + _outputResultCache.Add(result); + } + private void CacheOutputResult(ConversationTranscriptionResult result) { EnsureInitOutputResultCache(); @@ -314,6 +358,12 @@ private void CacheOutputResult(TranslationRecognitionResult result) _outputResultCache.Add(result); } + private void CacheOutputResult(SpeechSynthesisResult result) + { + EnsureInitOutputResultCache(); + _outputResultCache.Add(result); + } + private void EnsureInitOutputResultCache() { if (_outputResultCache == null) @@ -513,15 +563,18 @@ private string GetResultText(object result, string kind) { var resultSpeech = result as SpeechRecognitionResult; var resultTranslation = result as TranslationRecognitionResult; - var resultTranscription = result as ConversationTranscriptionResult; + var resultConversationTranscription = result as ConversationTranscriptionResult; + var resultMeetingTranscription = result as MeetingTranscriptionResult; var text = resultSpeech != null ? resultSpeech.Properties.GetProperty(kind) : resultTranslation != null ? resultTranslation.Properties.GetProperty(kind) - : resultTranscription != null - ? resultTranscription.Properties.GetProperty(kind) - : ""; + : resultConversationTranscription != null + ? resultConversationTranscription.Properties.GetProperty(kind) + : resultMeetingTranscription != null + ? resultMeetingTranscription.Properties.GetProperty(kind) + : ""; return !string.IsNullOrEmpty(text) ? text @@ -529,9 +582,11 @@ private string GetResultText(object result, string kind) ? resultSpeech.Text : resultTranslation != null ? resultTranslation.Text - : resultTranscription != null - ? resultTranscription.Text - : ""; + : resultConversationTranscription != null + ? resultConversationTranscription.Text + : resultMeetingTranscription != null + ? resultMeetingTranscription.Text + : ""; } private JArray GetBatchAudioFileSegments() @@ -552,15 +607,18 @@ private JObject GetBatchAudioFileSegment(object result) var resultSpeech = result as SpeechRecognitionResult; var resultTranslation = result as TranslationRecognitionResult; - var resultTranscription = result as ConversationTranscriptionResult; + var resultConversationTranscription = result as ConversationTranscriptionResult; + var resultMeetingTranscription = result as MeetingTranscriptionResult; return resultSpeech != null ? GetBatchAudioFileSegment(resultSpeech) : resultTranslation != null ? GetBatchAudioFileSegment(resultTranslation) - : resultTranscription != null - ? GetBatchAudioFileSegment(resultTranscription) - : null; + : resultConversationTranscription != null + ? GetBatchAudioFileSegment(resultConversationTranscription) + : resultMeetingTranscription != null + ? GetBatchAudioFileSegment(resultMeetingTranscription) + : null; } private JObject GetBatchAudioFileSegment(SpeechRecognitionResult result) @@ -656,6 +714,37 @@ private JObject GetBatchAudioFileSegment(ConversationTranscriptionResult result) return segment; } + private JObject GetBatchAudioFileSegment(MeetingTranscriptionResult result) + { + var segment = new JObject(); + + if (result.Reason == ResultReason.Canceled) + { + var cancelDetails = CancellationDetails.FromResult(result); + if (cancelDetails.Reason == CancellationReason.EndOfStream) return null; + + segment.Add("ErrorDetails", cancelDetails.ErrorDetails); + segment.Add("ErrorCode", cancelDetails.ErrorCode.ToString()); + return segment; + } + + var json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult); + var parsed = !string.IsNullOrEmpty(json) ? JToken.Parse(json) : null; + + segment.Add("RecognitionStatus", parsed["RecognitionStatus"] ?? result.Reason.ToString()); + + segment.Add("ChannelNumber", "0"); + segment.Add("SpeakerId", null); + segment.Add("Offset", result.OffsetInTicks); + segment.Add("Duration", (long)(result.Duration.TotalMilliseconds * 10000)); + segment.Add("OffsetInSeconds", Math.Round(1.0 * result.OffsetInTicks / 10000 / 1000, 2)); + segment.Add("DurationInSeconds", Math.Round(result.Duration.TotalSeconds, 2)); + + segment.Add("NBest", parsed["NBest"] ?? new JArray()); + + return segment; + } + private double GetBatchAudioLengthInSeconds() { double length = 0; @@ -673,22 +762,27 @@ private void GetResultOffsetAndDuration(object result, out double offset, out do { var resultSpeech = result as SpeechRecognitionResult; var resultTranslation = result as TranslationRecognitionResult; - var resultTranscription = result as ConversationTranscriptionResult; + var resultConversationTranscription = result as ConversationTranscriptionResult; + var resultMeetingTranscription = result as MeetingTranscriptionResult; offset = (resultSpeech != null ? resultSpeech.OffsetInTicks : resultTranslation != null ? resultTranslation.OffsetInTicks - : resultTranscription != null - ? resultTranscription.OffsetInTicks - : 0) / 10000 / 1000; + : resultConversationTranscription != null + ? resultConversationTranscription.OffsetInTicks + : resultMeetingTranscription != null + ? resultMeetingTranscription.OffsetInTicks + : 0) / 10000 / 1000; duration = (resultSpeech != null ? resultSpeech.Duration.TotalSeconds : resultTranslation != null ? resultTranslation.Duration.TotalSeconds - : resultTranscription != null - ? resultTranscription.Duration.TotalSeconds - : 0); + : resultConversationTranscription != null + ? resultConversationTranscription.Duration.TotalSeconds + : resultMeetingTranscription != null + ? resultMeetingTranscription.Duration.TotalSeconds + : 0); } private bool ShouldOutputAll(string name) @@ -1935,6 +2029,181 @@ private void OutputResult(string namePrefix, ConversationTranscriptionResult res EnsureOutputEachProperty(namePrefix, result.Properties); } + private void OutputTranscribing(MeetingTranscriptionEventArgs e) + { + if (!_outputAll && !_outputEach) return; + + var sessionid = e.SessionId; + var timestamp = this.CreateTimestamp(); + EnsureCacheAll("recognizer.recognizing.sessionid", sessionid); + EnsureOutputEach("recognizer.recognizing.sessionid", sessionid); + EnsureCacheAll("recognizer.event.sessionid", sessionid); + EnsureOutputEach("recognizer.event.sessionid", sessionid); + EnsureCacheAll("event.sessionid", sessionid); + EnsureOutputEach("event.sessionid", sessionid); + + EnsureCacheAll("recognizer.recognizing.timestamp", timestamp); + EnsureOutputEach("recognizer.recognizing.timestamp", timestamp); + EnsureCacheAll("recognizer.event.timestamp", timestamp); + EnsureOutputEach("recognizer.event.timestamp", timestamp); + EnsureCacheAll("event.timestamp", timestamp); + EnsureOutputEach("event.timestamp", timestamp); + + EnsureOutputRecognizerProperties("recognizer.recognizing.recognizer"); + + var result = e.Result; + OutputResult("recognizer.recognizing.result", result, '\n'); + OutputResult("result", result, '\n'); // Don't include this in global requests for results + + var output = $"TRANSCRIBING"; + EnsureCacheAll("recognizer.recognizing.events", output); + EnsureOutputEach("recognizer.recognizing.event", output); + EnsureCacheAll("recognizer.events", output); + EnsureOutputEach("recognizer.event", output); + EnsureCacheAll("events", output); + EnsureOutputEach("event", output); + + FlushOutputEachCacheStage1(); + } + + private void OutputTranscribed(MeetingTranscriptionEventArgs e) + { + EnsureCacheOutputResult(e.Result); + + if (!_outputAll && !_outputEach) return; + + var sessionid = e.SessionId; + var timestamp = this.CreateTimestamp(); + EnsureCacheAll("recognizer.recognized.sessionid", sessionid); + EnsureOutputEach("recognizer.recognized.sessionid", sessionid); + EnsureCacheAll("recognizer.event.sessionid", sessionid); + EnsureOutputEach("recognizer.event.sessionid", sessionid); + EnsureCacheAll("event.sessionid", sessionid); + EnsureOutputEach("event.sessionid", sessionid); + + EnsureCacheAll("recognizer.recognized.timestamp", timestamp); + EnsureOutputEach("recognizer.recognized.timestamp", timestamp); + EnsureCacheAll("recognizer.event.timestamp", timestamp); + EnsureOutputEach("recognizer.event.timestamp", timestamp); + EnsureCacheAll("event.timestamp", timestamp); + EnsureOutputEach("event.timestamp", timestamp); + + EnsureOutputRecognizerProperties("recognizer.recognized.recognizer"); + + var result = e.Result; + OutputResult("recognizer.recognized.result", result, ' '); + OutputResult("result", result, ' '); + + var output = $"TRANSCRIBED"; + EnsureCacheAll("recognizer.recognized.events", output); + EnsureOutputEach("recognizer.recognized.event", output); + EnsureCacheAll("recognizer.events", output); + EnsureOutputEach("recognizer.event", output); + EnsureCacheAll("events", output); + EnsureOutputEach("event", output); + + FlushOutputEachCacheStage1(); + } + + private void OutputCanceled(MeetingTranscriptionCanceledEventArgs e) + { + EnsureCacheOutputResult(e.Result); + + if (!_outputAll && !_outputEach) return; + + var sessionid = e.SessionId; + var timestamp = this.CreateTimestamp(); + EnsureCacheAll("recognizer.canceled.sessionid", sessionid); + EnsureOutputEach("recognizer.canceled.sessionid", sessionid); + EnsureCacheAll("recognizer.event.sessionid", sessionid); + EnsureOutputEach("recognizer.event.sessionid", sessionid); + EnsureCacheAll("event.sessionid", sessionid); + EnsureOutputEach("event.sessionid", sessionid); + + EnsureCacheAll("recognizer.canceled.timestamp", timestamp); + EnsureOutputEach("recognizer.canceled.timestamp", timestamp); + EnsureCacheAll("recognizer.event.timestamp", timestamp); + EnsureOutputEach("recognizer.event.timestamp", timestamp); + EnsureCacheAll("event.timestamp", timestamp); + EnsureOutputEach("event.timestamp", timestamp); + + var reason = e.Reason.ToString(); + EnsureCacheAll("recognizer.canceled.reason", reason); + EnsureOutputEach("recognizer.canceled.reason", reason); + + var code = (e.Reason == CancellationReason.Error) ? e.ErrorCode.ToString() : "0"; + EnsureCacheAll("recognizer.canceled.error.code", code); + EnsureOutputEach("recognizer.canceled.error.code", code); + EnsureCacheAll("recognizer.canceled.error", code); + EnsureOutputEach("recognizer.canceled.error", code); + + var details = (e.Reason == CancellationReason.Error) ? e.ErrorDetails : ""; + EnsureCacheAll("recognizer.canceled.error.details", details); + EnsureOutputEach("recognizer.canceled.error.details", details); + EnsureCacheAll("recognizer.canceled.error", details); + EnsureOutputEach("recognizer.canceled.error", details); + + EnsureOutputRecognizerProperties("recognizer.canceled.recognizer"); + + var result = e.Result; + OutputResult("recognizer.canceled.result", result, ' '); + OutputResult("result", result, ' '); + + var output = $"CANCELED"; + EnsureCacheAll("recognizer.session.events", output); + EnsureOutputEach("recognizer.session.event", output); + EnsureCacheAll("recognizer.canceled.events", output); + EnsureOutputEach("recognizer.canceled.event", output); + EnsureCacheAll("recognizer.events", output); + EnsureOutputEach("recognizer.event", output); + EnsureCacheAll("events", output); + EnsureOutputEach("event", output); + + FlushOutputEachCacheStage1(); + } + + private void OutputResult(string namePrefix, MeetingTranscriptionResult result, char textSeparator) + { + var id = result.ResultId; + EnsureCacheAll(namePrefix + ".resultid", id); + EnsureOutputEach(namePrefix + ".resultid", id); + + var reason = result.Reason.ToString(); + EnsureCacheAll(namePrefix + ".reason", reason); + EnsureOutputEach(namePrefix + ".reason", reason); + + var offset = result.OffsetInTicks.ToString(); + EnsureCacheAll(namePrefix + ".offset", offset); + EnsureOutputEach(namePrefix + ".offset", offset); + + var duration = (result.Duration.TotalMilliseconds * 10000).ToString(); + EnsureCacheAll(namePrefix + ".duration", duration); + EnsureOutputEach(namePrefix + ".duration", duration); + + var text = result.Text; + EnsureCacheAll(textSeparator, namePrefix + ".text", text); + EnsureOutputEach(namePrefix + ".text", text); + + var itn = result.Properties.GetProperty("ITN"); + EnsureCacheAll(textSeparator, namePrefix + ".itn.text", itn); + EnsureOutputEach(namePrefix + ".itn.text", itn); + + var lexical = result.Properties.GetProperty("Lexical"); + EnsureCacheAll(textSeparator, namePrefix + ".lexical.text", lexical); + EnsureOutputEach(namePrefix + ".lexical.text", lexical); + + var latency = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_RecognitionLatencyMs); + EnsureCacheAll(namePrefix + ".latency", latency); + EnsureOutputEach(namePrefix + ".latency", latency); + + var json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult); + EnsureCacheAll(namePrefix + ".json", json); + EnsureOutputEach(namePrefix + ".json", json); + + EnsureOutputAllProperties(namePrefix, result.Properties); + EnsureOutputEachProperty(namePrefix, result.Properties); + } + private void OutputRecognizing(TranslationRecognitionEventArgs e) { EnsureCacheOutputResult(e.Result); @@ -2128,6 +2397,8 @@ private void OutputResult(string namePrefix, TranslationRecognitionResult result private void OutputSynthesisStarted(SpeechSynthesisEventArgs e) { + EnsureCacheOutputResult(e.Result); + if (!_outputAll && !_outputEach) return; var output = $"SYNTHESIS STARTED"; @@ -2147,6 +2418,8 @@ private void OutputSynthesisStarted(SpeechSynthesisEventArgs e) private void OutputSynthesizing(SpeechSynthesisEventArgs e) { + EnsureCacheOutputResult(e.Result); + if (!_outputAll && !_outputEach) return; var output = $"SYNTHESIZING"; @@ -2166,6 +2439,8 @@ private void OutputSynthesizing(SpeechSynthesisEventArgs e) private void OutputSynthesisCompleted(SpeechSynthesisEventArgs e) { + EnsureCacheOutputResult(e.Result); + if (!_outputAll && !_outputEach) return; var output = $"SYNTHESIS COMPLETED"; @@ -2185,6 +2460,8 @@ private void OutputSynthesisCompleted(SpeechSynthesisEventArgs e) private void OutputSynthesisCanceled(SpeechSynthesisEventArgs e) { + EnsureCacheOutputResult(e.Result); + if (!_outputAll && !_outputEach) return; var cancelDetails = SpeechSynthesisCancellationDetails.FromResult(e.Result); @@ -2220,6 +2497,47 @@ private void OutputSynthesisCanceled(SpeechSynthesisEventArgs e) FlushOutputEachCacheStage1(); } + private void OutputWordBoundary(SpeechSynthesisWordBoundaryEventArgs e) + { + if (!_outputAll && !_outputEach) return; + + var output = $"WORD BOUNDARY"; + const string synthesizer = "synthesizer"; + const string wordBoundaryNamePrefix = synthesizer + ".wordboundary"; + EnsureCacheAll(wordBoundaryNamePrefix + ".events", output); + EnsureOutputEach(wordBoundaryNamePrefix + ".event", output); + EnsureCacheAll(synthesizer + ".events", output); + EnsureOutputEach(synthesizer + ".event", output); + + const string wordBoundaryResultNamePrefix = wordBoundaryNamePrefix + ".result"; + + //// These are almost always the same value and don't really lend much value. If you find that you + //// need them for some test scenario, uncomment this + ////EnsureCacheAll(wordBoundaryResultNamePrefix + ".resultid", e.ResultId); + ////EnsureOutputEach(wordBoundaryResultNamePrefix + ".resultid", e.ResultId); + + var wordLength = e.WordLength.ToString(); + EnsureCacheAll(wordBoundaryResultNamePrefix + ".wordlength", wordLength); + EnsureOutputEach(wordBoundaryResultNamePrefix + ".wordlength", wordLength); + + EnsureCacheAll(wordBoundaryResultNamePrefix + ".text", e.Text); + EnsureOutputEach(wordBoundaryResultNamePrefix + ".text", e.Text); + + var boundaryType = e.BoundaryType.ToString(); + EnsureCacheAll(wordBoundaryResultNamePrefix + ".type", boundaryType); + EnsureOutputEach(wordBoundaryResultNamePrefix + ".type", boundaryType); + + var boundaryOffset = e.AudioOffset.ToString(); + EnsureCacheAll(wordBoundaryResultNamePrefix + ".offset", boundaryOffset); + EnsureOutputEach(wordBoundaryResultNamePrefix + ".offset", boundaryOffset); + + var boundaryDuration = e.Duration.ToString(); + EnsureCacheAll(wordBoundaryResultNamePrefix + ".duration", boundaryDuration); + EnsureOutputEach(wordBoundaryResultNamePrefix + ".duration", boundaryDuration); + + FlushOutputEachCacheStage1(); + } + private void OutputResult(string namePrefix, SpeechSynthesisResult result, char textSeparator) { var id = result.ResultId; diff --git a/src/clis/spx/helpers/wer_helpers.cs b/src/extensions/speech_extension/helpers/wer_helpers.cs similarity index 100% rename from src/clis/spx/helpers/wer_helpers.cs rename to src/extensions/speech_extension/helpers/wer_helpers.cs diff --git a/src/extensions/speech_extension/speech-extension.csproj b/src/extensions/speech_extension/speech-extension.csproj new file mode 100644 index 00000000..219dbcf7 --- /dev/null +++ b/src/extensions/speech_extension/speech-extension.csproj @@ -0,0 +1,28 @@ + + + + Azure.AI.CLI.Extensions.Speech + net8.0 + Azure.AI.Details.Common.CLI.Extensions.Speech + enable + enable + true + + + + + + + + + + + + + + + + + + + From 28af5763919c569cb238e8fbc1082c1c402397be Mon Sep 17 00:00:00 2001 From: Glenn Harper <64209257+glharper@users.noreply.github.com> Date: Fri, 1 Mar 2024 06:54:01 -0800 Subject: [PATCH 16/19] Fix #231 (resource login sync) (#234) * Fix #231 (resource login sync) * add similar login attempt logic to Resource Deployment and Group Picker * code cleanup * More common code refactoring --- ...gnitiveServicesResourceDeploymentPicker.cs | 10 +-- ...soleGui_CognitiveServicesResourcePicker.cs | 10 +-- .../AzCliConsoleGui_ResourceGroupPicker.cs | 10 +-- .../AzCliConsoleGui_SubscriptionPicker.cs | 38 +-------- src/common/details/helpers/login_helpers.cs | 80 +++++++++++++++++++ 5 files changed, 88 insertions(+), 60 deletions(-) create mode 100644 src/common/details/helpers/login_helpers.cs diff --git a/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs b/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs index 077a33f2..2c0f67a2 100644 --- a/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs +++ b/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs @@ -41,14 +41,8 @@ public partial class AzCliConsoleGui { var allowCreateDeployment = !string.IsNullOrEmpty(allowCreateDeploymentOption); - Console.Write($"Name: *** Loading choices ***"); - var response = await AzCli.ListCognitiveServicesDeployments(subscriptionId, groupName, resourceName, "OpenAI"); - - Console.Write($"\rName: "); - if (string.IsNullOrEmpty(response.Output.StdOutput) && !string.IsNullOrEmpty(response.Output.StdError)) - { - throw new ApplicationException($"ERROR: Loading deployments:\n{response.Output.StdError}"); - } + var listDeploymentsFunc = async () => await AzCli.ListCognitiveServicesDeployments(subscriptionId, groupName, resourceName, "OpenAI"); + var response = await LoginHelpers.GetResponseOnLogin(interactive, "deployment", listDeploymentsFunc); var lookForChatCompletionCapable = deploymentExtra.ToLower() == "chat" || deploymentExtra.ToLower() == "evaluation"; var lookForEmbeddingCapable = deploymentExtra.ToLower() == "embeddings"; diff --git a/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourcePicker.cs b/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourcePicker.cs index 73c10e83..b7b3179e 100644 --- a/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourcePicker.cs +++ b/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourcePicker.cs @@ -58,14 +58,8 @@ public partial class AzCliConsoleGui { var allowCreateResource = !string.IsNullOrEmpty(allowCreateResourceOption); - Console.Write("\rName: *** Loading choices ***"); - var response = await AzCli.ListCognitiveServicesResources(subscriptionId, kinds); - - Console.Write("\rName: "); - if (string.IsNullOrEmpty(response.Output.StdOutput) && !string.IsNullOrEmpty(response.Output.StdError)) - { - throw new ApplicationException($"ERROR: Loading Cognitive Services resources: {response.Output.StdError}"); - } + var listResourcesFunc = async () => await AzCli.ListCognitiveServicesResources(subscriptionId, kinds); + var response = await LoginHelpers.GetResponseOnLogin(interactive, "resource", listResourcesFunc); var resources = response.Payload .Where(x => MatchResourceFilter(x, regionLocationFilter, groupFilter, resourceFilter)) diff --git a/src/common/details/azcli/AzCliConsoleGui_ResourceGroupPicker.cs b/src/common/details/azcli/AzCliConsoleGui_ResourceGroupPicker.cs index bb11aa33..ab40fe17 100644 --- a/src/common/details/azcli/AzCliConsoleGui_ResourceGroupPicker.cs +++ b/src/common/details/azcli/AzCliConsoleGui_ResourceGroupPicker.cs @@ -45,14 +45,8 @@ public partial class AzCliConsoleGui { var allowCreateGroup = !string.IsNullOrEmpty(allowCreateGroupOption); - Console.Write("\rGroup: *** Loading choices ***"); - var response = await AzCli.ListResourceGroups(subscription, regionLocation); - - Console.Write("\rGroup: "); - if (string.IsNullOrEmpty(response.Output.StdOutput) && !string.IsNullOrEmpty(response.Output.StdError)) - { - throw new ApplicationException($"ERROR: Loading resource groups: {response.Output.StdError}"); - } + var listResourcesFunc = async () => await AzCli.ListResourceGroups(subscription, regionLocation); + var response = await LoginHelpers.GetResponseOnLogin(interactive, "group", listResourcesFunc, "Group"); var groups = response.Payload .Where(x => MatchGroupFilter(x, groupFilter)) diff --git a/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs b/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs index 5c5c4cb9..62929d72 100644 --- a/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs +++ b/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs @@ -77,44 +77,10 @@ public static async Task PickSubscriptionIdAsync(bool allowInteractiveLo throw new ApplicationException($"*** ERROR: Loading subscriptions ***\n{response.Output.StdError}"); } - var needLogin = response.Output.StdError != null && (response.Output.StdError.Split('\'', '"').Contains("az login") || response.Output.StdError.Contains("refresh token")); + var needLogin = response.Output.StdError != null && LoginHelpers.HasLoginError(response.Output.StdError); if (needLogin) { - bool cancelLogin = !allowInteractiveLogin; - bool useDeviceCode = false; - if (allowInteractiveLogin) - { - ConsoleHelpers.WriteError("*** WARNING: `az login` required ***"); - Console.Write(" "); - - var selection = 0; - var choices = new List() { - "LAUNCH: `az login` (interactive device code)", - "CANCEL: `az login ...` (non-interactive)", - }; - - if (!OS.IsCodeSpaces()) - { - choices.Insert(0, "LAUNCH: `az login` (interactive browser)"); - selection = OS.IsWindows() ? 0 : 1; - } - - var picked = ListBoxPicker.PickIndexOf(choices.ToArray(), selection); - - cancelLogin = picked < 0 || picked == choices.Count() - 1; - useDeviceCode = picked == choices.Count() - 2; - } - - if (cancelLogin) - { - Console.Write($"\r{subscriptionLabel}: "); - ConsoleHelpers.WriteLineError("*** Please run `az login` and try again ***"); - return null; - } - - Console.Write($"\r{subscriptionLabel}: *** Launching `az login` (interactive) ***"); - response = await AzCli.Login(useDeviceCode); - Console.Write($"\r{subscriptionLabel}: "); + response = await LoginHelpers.AttemptLogin(allowInteractiveLogin, subscriptionLabel); } var subscriptions = response.Payload diff --git a/src/common/details/helpers/login_helpers.cs b/src/common/details/helpers/login_helpers.cs new file mode 100644 index 00000000..68c6e34f --- /dev/null +++ b/src/common/details/helpers/login_helpers.cs @@ -0,0 +1,80 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Runtime.CompilerServices; +using System.Text; +using Azure.AI.Details.Common.CLI.ConsoleGui; + +namespace Azure.AI.Details.Common.CLI +{ + public class LoginHelpers + { + public static async Task> GetResponseOnLogin(bool allowInteractiveLogin, string label, Func>> getResponse, string titleLabel = "Name") + { + Console.Write($"\r{titleLabel}: *** Loading choices ***"); + var response = await getResponse(); + + Console.Write($"\r{titleLabel}: "); + if (string.IsNullOrEmpty(response.Output.StdOutput) && !string.IsNullOrEmpty(response.Output.StdError)) + { + if (LoginHelpers.HasLoginError(response.Output.StdError)) + { + var loginResponse = await LoginHelpers.AttemptLogin(allowInteractiveLogin, $"{label}s"); + if (!loginResponse.Equals(default(ParsedJsonProcessOutput))) + { + response = await getResponse(); + } + } + if (string.IsNullOrEmpty(response.Output.StdOutput) && !string.IsNullOrEmpty(response.Output.StdError)) + { + throw new ApplicationException($"ERROR: Loading resource {label}s: {response.Output.StdError}"); + } + } + return response; + } + + public static async Task> AttemptLogin(bool allowInteractiveLogin, string label) + { + bool cancelLogin = !allowInteractiveLogin; + bool useDeviceCode = false; + if (allowInteractiveLogin) + { + ConsoleHelpers.WriteError("*** WARNING: `az login` required ***"); + Console.Write(" "); + + var selection = 0; + var choices = new List() { + "LAUNCH: `az login` (interactive device code)", + "CANCEL: `az login ...` (non-interactive)", + }; + + if (!OS.IsCodeSpaces()) + { + choices.Insert(0, "LAUNCH: `az login` (interactive browser)"); + selection = OS.IsWindows() ? 0 : 1; + } + + var picked = ListBoxPicker.PickIndexOf(choices.ToArray(), selection); + + cancelLogin = picked < 0 || picked == choices.Count() - 1; + useDeviceCode = picked == choices.Count() - 2; + } + + if (cancelLogin) + { + Console.Write($"\r{label}: "); + ConsoleHelpers.WriteLineError("*** Please run `az login` and try again ***"); + return default; + } + + Console.Write($"\r{label}: *** Launching `az login` (interactive) ***"); + var response = await AzCli.Login(useDeviceCode); + Console.Write($"\r{label}: "); + return response; + } + + public static bool HasLoginError(string errorMessage) => errorMessage.Split('\'', '"').Contains("az login") || errorMessage.Contains("refresh token"); + } +} From c6dff42ea9521050953ea10c53db9d9961961cbe Mon Sep 17 00:00:00 2001 From: Gerardo Lecaros Date: Tue, 5 Mar 2024 11:44:00 -0800 Subject: [PATCH 17/19] Adding license headers and contributing document. (#235) --- CONTRIBUTING.md | 14 ++++++++++++++ .../HelperFunctionClass.cs | 5 +++++ .../NutritionHelperFunctions.cs | 5 +++++ .../PokemonHelperFunctions.cs | 5 +++++ .../cool-helper-function-scenarios/QRCodeHelper.cs | 5 +++++ .../WolframAlphaHelper.cs | 5 +++++ .../helper_functions/HelperFunctionClass.cs | 5 +++++ .../openai-chat-cs/OpenAIChatCompletionsClass.cs | 5 +++++ src/ai/.x/templates/openai-chat-cs/Program.cs | 5 +++++ .../OpenAIChatCompletionsStreamingClass.cs | 5 +++++ .../templates/openai-chat-streaming-cs/Program.cs | 5 +++++ .../OpenAIChatCompletionsWithDataStreamingClass.cs | 5 +++++ .../openai-chat-streaming-with-data-cs/Program.cs | 5 +++++ .../FunctionCallContext.cs | 5 +++++ .../FunctionFactory.cs | 5 +++++ .../HelperFunctionDescriptionAttribute.cs | 7 ++++++- .../HelperFunctionParameterDescriptionAttribute.cs | 7 ++++++- .../OpenAIChatCompletionsCustomFunctions.cs | 5 +++++ ...OpenAIChatCompletionsFunctionsStreamingClass.cs | 5 +++++ .../Program.cs | 5 +++++ .../commands/CaptionAudioSpeechToTextQuickStart.cs | 2 +- src/ai/commands/dev_command.cs | 2 +- src/ai/commands/eval_command.cs | 2 +- src/ai/commands/flow_command.cs | 2 +- src/ai/commands/language_command.cs | 2 +- src/ai/commands/search_command.cs | 2 +- src/ai/commands/service_command.cs | 2 +- src/ai/commands/speech_command.cs | 2 +- src/common/details/helpers/os.cs | 5 +++++ .../details/named_values/named_value_tokens.cs | 7 ++++++- src/common/details/native_logging/AIDEBUG.cs | 5 +++++ .../details/native_logging/DiagnosticsInterop.cs | 7 ++++++- .../details/native_logging/DisposableBase.cs | 5 +++++ src/common/details/native_logging/NativeMemory.cs | 5 +++++ src/common/details/native_logging/NativeUtils.cs | 5 +++++ .../details/native_logging/SpeechNativeMethods.cs | 5 +++++ .../CalculatorHelperFunctions.cs | 7 ++++++- .../DateTimeHelperFunctions.cs | 7 ++++++- .../FileHelperFunctions.cs | 7 ++++++- .../HelperFunctionCallContext.cs | 7 ++++++- .../HelperFunctionDescriptionAttribute.cs | 7 ++++++- .../HelperFunctionFactory.cs | 7 ++++++- .../HelperFunctionFactoryExtensions.cs | 5 +++++ .../HelperFunctionParameterDescriptionAttribute.cs | 7 ++++++- .../RunPythonHelperFunction.cs | 7 ++++++- .../commands/parsers/intent_command_parser.cs | 7 ++++++- .../commands/parsers/profile_command_parser.cs | 5 +++++ .../commands/parsers/recognize_command_parser.cs | 5 +++++ .../commands/parsers/synthesize_command_parser.cs | 7 ++++++- .../transcribe_conversation_command_parser.cs | 7 ++++++- .../commands/parsers/translate_command_parser.cs | 5 +++++ .../speech_extension/helpers/connection_helpers.cs | 7 ++++++- .../template_extension/TemplateFactory.cs | 5 +++++ .../testframework/IYamlTestFrameworkHost.cs | 5 +++++ .../testframework/IYamlTestFrameworkLogger.cs | 5 +++++ .../testframework/JunitXmlTestReporter.cs | 5 +++++ src/extensions/testframework/Logger.cs | 5 +++++ .../testframework/Properties/AssemblyInfo.cs | 7 ++++++- src/extensions/testframework/TestResultHelpers.cs | 5 +++++ src/extensions/testframework/TestRun.cs | 5 +++++ src/extensions/testframework/TimeSpanFormatter.cs | 5 +++++ src/extensions/testframework/TrxXmlTestReporter.cs | 5 +++++ src/extensions/testframework/YamlEnvHelpers.cs | 5 +++++ src/extensions/testframework/YamlHelpers.cs | 5 +++++ src/extensions/testframework/YamlNodeExtensions.cs | 5 +++++ src/extensions/testframework/YamlTagHelpers.cs | 5 +++++ src/extensions/testframework/YamlTestCaseFilter.cs | 7 ++++++- .../testframework/YamlTestCaseParseContext.cs | 5 +++++ src/extensions/testframework/YamlTestCaseParser.cs | 5 +++++ src/extensions/testframework/YamlTestCaseRunner.cs | 5 +++++ .../testframework/YamlTestConfigHelpers.cs | 5 +++++ src/extensions/testframework/YamlTestFramework.cs | 5 +++++ .../testframework/YamlTestFrameworkConsoleHost.cs | 5 +++++ .../YamlTestFrameworkTestAdapterMessageLogger.cs | 5 +++++ src/extensions/testframework/YamlTestProperties.cs | 5 +++++ .../recordingadapter/RecordedTestDiscoverer.cs | 5 +++++ .../recordingadapter/RecordedTestExecutor.cs | 5 +++++ .../adapters/recordingadapter/RecordedTestMode.cs | 7 ++++++- .../recordingadapter/RecordedTestObserver.cs | 7 ++++++- .../recordingadapter/RecordedYamlTestAdapter.cs | 5 +++++ .../RecordedYamlTestRunnerTriggerAttribute.cs | 5 +++++ .../adapters/recordingadapter/TestProxyClient.cs | 7 ++++++- .../testadapter/Properties/AssemblyInfo.cs | 7 ++++++- src/testing/adapters/testadapter/TestDiscoverer.cs | 7 ++++++- src/testing/adapters/testadapter/TestExecutor.cs | 7 ++++++- .../adapters/testadapter/YamlTestAdapter.cs | 5 +++++ .../testadapter/YamlTestFrameworkHandleHost.cs | 5 +++++ .../testadapter/YamlTestRunnerTriggerAttribute.cs | 7 ++++++- src/testing/runner/Properties/AssemblyInfo.cs | 7 ++++++- .../PersonAgeFunctionHelperTest.cs | 7 ++++++- 90 files changed, 454 insertions(+), 35 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1229b674 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# Contributing + +This project welcomes contributions and suggestions. Most contributions require you to +agree to a Contributor License Agreement (CLA) declaring that you have the right to, +and actually do, grant us the rights to use your contribution. For details, visit +https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need +to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the +instructions provided by the bot. You will only need to do this once across all repositories using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. diff --git a/ideas/cool-helper-function-scenarios/HelperFunctionClass.cs b/ideas/cool-helper-function-scenarios/HelperFunctionClass.cs index 6213129f..440a0b49 100644 --- a/ideas/cool-helper-function-scenarios/HelperFunctionClass.cs +++ b/ideas/cool-helper-function-scenarios/HelperFunctionClass.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Azure.AI.Details.Common.CLI.Extensions.HelperFunctions; public static class HelperFunctionClass diff --git a/ideas/cool-helper-function-scenarios/NutritionHelperFunctions.cs b/ideas/cool-helper-function-scenarios/NutritionHelperFunctions.cs index 3529b43e..791b2e0f 100644 --- a/ideas/cool-helper-function-scenarios/NutritionHelperFunctions.cs +++ b/ideas/cool-helper-function-scenarios/NutritionHelperFunctions.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Net.Http; using System.Threading.Tasks; diff --git a/ideas/cool-helper-function-scenarios/PokemonHelperFunctions.cs b/ideas/cool-helper-function-scenarios/PokemonHelperFunctions.cs index 5d0c80a6..0811f57b 100644 --- a/ideas/cool-helper-function-scenarios/PokemonHelperFunctions.cs +++ b/ideas/cool-helper-function-scenarios/PokemonHelperFunctions.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.Net.Http; diff --git a/ideas/cool-helper-function-scenarios/QRCodeHelper.cs b/ideas/cool-helper-function-scenarios/QRCodeHelper.cs index fe9b3a9c..76cec6ed 100644 --- a/ideas/cool-helper-function-scenarios/QRCodeHelper.cs +++ b/ideas/cool-helper-function-scenarios/QRCodeHelper.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Azure.AI.Details.Common.CLI.Extensions.HelperFunctions; public static class QRCodeHelper diff --git a/ideas/cool-helper-function-scenarios/WolframAlphaHelper.cs b/ideas/cool-helper-function-scenarios/WolframAlphaHelper.cs index 06359376..4ba0276f 100644 --- a/ideas/cool-helper-function-scenarios/WolframAlphaHelper.cs +++ b/ideas/cool-helper-function-scenarios/WolframAlphaHelper.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Azure.AI.Details.Common.CLI.Extensions.HelperFunctions; using System; using System.Net.Http; diff --git a/src/ai/.x/templates/helper_functions/HelperFunctionClass.cs b/src/ai/.x/templates/helper_functions/HelperFunctionClass.cs index 94c3c46a..57a662c9 100644 --- a/src/ai/.x/templates/helper_functions/HelperFunctionClass.cs +++ b/src/ai/.x/templates/helper_functions/HelperFunctionClass.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletionsClass.cs b/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletionsClass.cs index e352c9d0..f4fb03c3 100644 --- a/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletionsClass.cs +++ b/src/ai/.x/templates/openai-chat-cs/OpenAIChatCompletionsClass.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-cs/Program.cs b/src/ai/.x/templates/openai-chat-cs/Program.cs index 021f22ef..690aef90 100644 --- a/src/ai/.x/templates/openai-chat-cs/Program.cs +++ b/src/ai/.x/templates/openai-chat-cs/Program.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreamingClass.cs b/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreamingClass.cs index fe7120a2..1714c4ba 100644 --- a/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreamingClass.cs +++ b/src/ai/.x/templates/openai-chat-streaming-cs/OpenAIChatCompletionsStreamingClass.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-streaming-cs/Program.cs b/src/ai/.x/templates/openai-chat-streaming-cs/Program.cs index 46c8dffe..c1335d1b 100644 --- a/src/ai/.x/templates/openai-chat-streaming-cs/Program.cs +++ b/src/ai/.x/templates/openai-chat-streaming-cs/Program.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreamingClass.cs b/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreamingClass.cs index 0ae92a34..233a680a 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreamingClass.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-data-cs/OpenAIChatCompletionsWithDataStreamingClass.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-streaming-with-data-cs/Program.cs b/src/ai/.x/templates/openai-chat-streaming-with-data-cs/Program.cs index 34c93500..d89724c7 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-data-cs/Program.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-data-cs/Program.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionCallContext.cs b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionCallContext.cs index 0b5031ce..ec81143e 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionCallContext.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionCallContext.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Azure.AI.OpenAI; using System; using System.Collections.Generic; diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionFactory.cs b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionFactory.cs index 79b572e2..18add66b 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionFactory.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/FunctionFactory.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.Reflection; using Azure.AI.OpenAI; using System.Collections; diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionDescriptionAttribute.cs b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionDescriptionAttribute.cs index c6678de8..34da25d8 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionDescriptionAttribute.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionDescriptionAttribute.cs @@ -1,4 +1,9 @@ -public class HelperFunctionDescriptionAttribute : Attribute +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +public class HelperFunctionDescriptionAttribute : Attribute { public HelperFunctionDescriptionAttribute() { diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionParameterDescriptionAttribute.cs b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionParameterDescriptionAttribute.cs index 36e672a4..f690d4dd 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionParameterDescriptionAttribute.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/HelperFunctionParameterDescriptionAttribute.cs @@ -1,4 +1,9 @@ -public class HelperFunctionParameterDescriptionAttribute : Attribute +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +public class HelperFunctionParameterDescriptionAttribute : Attribute { public HelperFunctionParameterDescriptionAttribute() { diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsCustomFunctions.cs b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsCustomFunctions.cs index 55b7daad..7d9a9351 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsCustomFunctions.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsCustomFunctions.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; public class OpenAIChatCompletionsCustomFunctions diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreamingClass.cs b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreamingClass.cs index a804e0c5..ee64e974 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreamingClass.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/OpenAIChatCompletionsFunctionsStreamingClass.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/Program.cs b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/Program.cs index 769c8e1b..03c3a2e4 100644 --- a/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/Program.cs +++ b/src/ai/.x/templates/openai-chat-streaming-with-functions-cs/Program.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + <#@ template hostspecific="true" #> <#@ output extension=".cs" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> diff --git a/src/ai/commands/CaptionAudioSpeechToTextQuickStart.cs b/src/ai/commands/CaptionAudioSpeechToTextQuickStart.cs index df1dff75..de7f4079 100644 --- a/src/ai/commands/CaptionAudioSpeechToTextQuickStart.cs +++ b/src/ai/commands/CaptionAudioSpeechToTextQuickStart.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/ai/commands/dev_command.cs b/src/ai/commands/dev_command.cs index 7435641f..83dff8da 100644 --- a/src/ai/commands/dev_command.cs +++ b/src/ai/commands/dev_command.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/ai/commands/eval_command.cs b/src/ai/commands/eval_command.cs index ed6d653b..813baf42 100644 --- a/src/ai/commands/eval_command.cs +++ b/src/ai/commands/eval_command.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/ai/commands/flow_command.cs b/src/ai/commands/flow_command.cs index 58564a4f..7218ea90 100644 --- a/src/ai/commands/flow_command.cs +++ b/src/ai/commands/flow_command.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/ai/commands/language_command.cs b/src/ai/commands/language_command.cs index d81b7f4d..5abf565a 100644 --- a/src/ai/commands/language_command.cs +++ b/src/ai/commands/language_command.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/ai/commands/search_command.cs b/src/ai/commands/search_command.cs index d3901401..b35bfa67 100644 --- a/src/ai/commands/search_command.cs +++ b/src/ai/commands/search_command.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/ai/commands/service_command.cs b/src/ai/commands/service_command.cs index b5409ad5..eac86f47 100644 --- a/src/ai/commands/service_command.cs +++ b/src/ai/commands/service_command.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/ai/commands/speech_command.cs b/src/ai/commands/speech_command.cs index 62f06f15..2be25fc4 100644 --- a/src/ai/commands/speech_command.cs +++ b/src/ai/commands/speech_command.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.md file in the project root for full license information. // diff --git a/src/common/details/helpers/os.cs b/src/common/details/helpers/os.cs index 17ef223b..ddc40228 100644 --- a/src/common/details/helpers/os.cs +++ b/src/common/details/helpers/os.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Runtime.InteropServices; diff --git a/src/common/details/named_values/named_value_tokens.cs b/src/common/details/named_values/named_value_tokens.cs index 7b90d739..64d755d9 100644 --- a/src/common/details/named_values/named_value_tokens.cs +++ b/src/common/details/named_values/named_value_tokens.cs @@ -1,4 +1,9 @@ -namespace Azure.AI.Details.Common.CLI +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI { public abstract class INamedValueTokens { diff --git a/src/common/details/native_logging/AIDEBUG.cs b/src/common/details/native_logging/AIDEBUG.cs index ce457c99..90a45f2c 100644 --- a/src/common/details/native_logging/AIDEBUG.cs +++ b/src/common/details/native_logging/AIDEBUG.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.Globalization; using System.Runtime.CompilerServices; diff --git a/src/common/details/native_logging/DiagnosticsInterop.cs b/src/common/details/native_logging/DiagnosticsInterop.cs index d5ed197e..3ef525c0 100644 --- a/src/common/details/native_logging/DiagnosticsInterop.cs +++ b/src/common/details/native_logging/DiagnosticsInterop.cs @@ -1,4 +1,9 @@ -using System.IO; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.IO; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; diff --git a/src/common/details/native_logging/DisposableBase.cs b/src/common/details/native_logging/DisposableBase.cs index 55060b0a..192806d6 100644 --- a/src/common/details/native_logging/DisposableBase.cs +++ b/src/common/details/native_logging/DisposableBase.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Threading; diff --git a/src/common/details/native_logging/NativeMemory.cs b/src/common/details/native_logging/NativeMemory.cs index 6f7a8dd7..e6531e5f 100644 --- a/src/common/details/native_logging/NativeMemory.cs +++ b/src/common/details/native_logging/NativeMemory.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Runtime.InteropServices; diff --git a/src/common/details/native_logging/NativeUtils.cs b/src/common/details/native_logging/NativeUtils.cs index dd37b5ec..055e9266 100644 --- a/src/common/details/native_logging/NativeUtils.cs +++ b/src/common/details/native_logging/NativeUtils.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Runtime.InteropServices; using System.Text; diff --git a/src/common/details/native_logging/SpeechNativeMethods.cs b/src/common/details/native_logging/SpeechNativeMethods.cs index 5afc984c..96345c9b 100644 --- a/src/common/details/native_logging/SpeechNativeMethods.cs +++ b/src/common/details/native_logging/SpeechNativeMethods.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Runtime.InteropServices; diff --git a/src/extensions/helper_functions_extension/CalculatorHelperFunctions.cs b/src/extensions/helper_functions_extension/CalculatorHelperFunctions.cs index d0150f3d..82f559ec 100644 --- a/src/extensions/helper_functions_extension/CalculatorHelperFunctions.cs +++ b/src/extensions/helper_functions_extension/CalculatorHelperFunctions.cs @@ -1,4 +1,9 @@ -using Azure.AI.OpenAI; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Azure.AI.OpenAI; namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions { diff --git a/src/extensions/helper_functions_extension/DateTimeHelperFunctions.cs b/src/extensions/helper_functions_extension/DateTimeHelperFunctions.cs index a92b5693..b29becfc 100644 --- a/src/extensions/helper_functions_extension/DateTimeHelperFunctions.cs +++ b/src/extensions/helper_functions_extension/DateTimeHelperFunctions.cs @@ -1,4 +1,9 @@ -using System.Text; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Text; using Azure.AI.OpenAI; namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions diff --git a/src/extensions/helper_functions_extension/FileHelperFunctions.cs b/src/extensions/helper_functions_extension/FileHelperFunctions.cs index da22af35..6940df14 100644 --- a/src/extensions/helper_functions_extension/FileHelperFunctions.cs +++ b/src/extensions/helper_functions_extension/FileHelperFunctions.cs @@ -1,4 +1,9 @@ -using System.Text; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Text; using Azure.AI.OpenAI; namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions diff --git a/src/extensions/helper_functions_extension/HelperFunctionCallContext.cs b/src/extensions/helper_functions_extension/HelperFunctionCallContext.cs index 424fa9e1..7341274c 100644 --- a/src/extensions/helper_functions_extension/HelperFunctionCallContext.cs +++ b/src/extensions/helper_functions_extension/HelperFunctionCallContext.cs @@ -1,4 +1,9 @@ -using Azure.AI.OpenAI; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Azure.AI.OpenAI; namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions { diff --git a/src/extensions/helper_functions_extension/HelperFunctionDescriptionAttribute.cs b/src/extensions/helper_functions_extension/HelperFunctionDescriptionAttribute.cs index 00c3b1a7..9f6ad5f4 100644 --- a/src/extensions/helper_functions_extension/HelperFunctionDescriptionAttribute.cs +++ b/src/extensions/helper_functions_extension/HelperFunctionDescriptionAttribute.cs @@ -1,4 +1,9 @@ -namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions { public class HelperFunctionDescriptionAttribute : Attribute { diff --git a/src/extensions/helper_functions_extension/HelperFunctionFactory.cs b/src/extensions/helper_functions_extension/HelperFunctionFactory.cs index ee2aeb09..f53ec4bb 100644 --- a/src/extensions/helper_functions_extension/HelperFunctionFactory.cs +++ b/src/extensions/helper_functions_extension/HelperFunctionFactory.cs @@ -1,4 +1,9 @@ -using System.Reflection; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Reflection; using Newtonsoft.Json; using Azure.AI.OpenAI; using Newtonsoft.Json.Linq; diff --git a/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs b/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs index 4a039c9a..1bc6cb74 100644 --- a/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs +++ b/src/extensions/helper_functions_extension/HelperFunctionFactoryExtensions.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Azure.AI.OpenAI; using System.Text; using System.Text.Json; diff --git a/src/extensions/helper_functions_extension/HelperFunctionParameterDescriptionAttribute.cs b/src/extensions/helper_functions_extension/HelperFunctionParameterDescriptionAttribute.cs index a0678f63..a38e67d6 100644 --- a/src/extensions/helper_functions_extension/HelperFunctionParameterDescriptionAttribute.cs +++ b/src/extensions/helper_functions_extension/HelperFunctionParameterDescriptionAttribute.cs @@ -1,4 +1,9 @@ -namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions { public class HelperFunctionParameterDescriptionAttribute : Attribute { diff --git a/src/extensions/helper_functions_extension/RunPythonHelperFunction.cs b/src/extensions/helper_functions_extension/RunPythonHelperFunction.cs index e41b6791..af55c650 100644 --- a/src/extensions/helper_functions_extension/RunPythonHelperFunction.cs +++ b/src/extensions/helper_functions_extension/RunPythonHelperFunction.cs @@ -1,4 +1,9 @@ -// using System.Diagnostics; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +// using System.Diagnostics; // namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions // { diff --git a/src/extensions/speech_extension/commands/parsers/intent_command_parser.cs b/src/extensions/speech_extension/commands/parsers/intent_command_parser.cs index 605133d8..92cfd618 100644 --- a/src/extensions/speech_extension/commands/parsers/intent_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/intent_command_parser.cs @@ -1,4 +1,9 @@ -using System.Linq; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Linq; namespace Azure.AI.Details.Common.CLI { diff --git a/src/extensions/speech_extension/commands/parsers/profile_command_parser.cs b/src/extensions/speech_extension/commands/parsers/profile_command_parser.cs index 607d7e35..5d53c5b5 100644 --- a/src/extensions/speech_extension/commands/parsers/profile_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/profile_command_parser.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.Collections.Generic; using System.Linq; diff --git a/src/extensions/speech_extension/commands/parsers/recognize_command_parser.cs b/src/extensions/speech_extension/commands/parsers/recognize_command_parser.cs index 74a094a3..31f4e727 100644 --- a/src/extensions/speech_extension/commands/parsers/recognize_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/recognize_command_parser.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.Linq; namespace Azure.AI.Details.Common.CLI diff --git a/src/extensions/speech_extension/commands/parsers/synthesize_command_parser.cs b/src/extensions/speech_extension/commands/parsers/synthesize_command_parser.cs index c16bbb2e..83571ba5 100644 --- a/src/extensions/speech_extension/commands/parsers/synthesize_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/synthesize_command_parser.cs @@ -1,4 +1,9 @@ -using System.Linq; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Linq; namespace Azure.AI.Details.Common.CLI { diff --git a/src/extensions/speech_extension/commands/parsers/transcribe_conversation_command_parser.cs b/src/extensions/speech_extension/commands/parsers/transcribe_conversation_command_parser.cs index 61d27f43..6d35d648 100644 --- a/src/extensions/speech_extension/commands/parsers/transcribe_conversation_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/transcribe_conversation_command_parser.cs @@ -1,4 +1,9 @@ -using System.Linq; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Linq; namespace Azure.AI.Details.Common.CLI { diff --git a/src/extensions/speech_extension/commands/parsers/translate_command_parser.cs b/src/extensions/speech_extension/commands/parsers/translate_command_parser.cs index daac5c08..2a3fa932 100644 --- a/src/extensions/speech_extension/commands/parsers/translate_command_parser.cs +++ b/src/extensions/speech_extension/commands/parsers/translate_command_parser.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.Linq; namespace Azure.AI.Details.Common.CLI diff --git a/src/extensions/speech_extension/helpers/connection_helpers.cs b/src/extensions/speech_extension/helpers/connection_helpers.cs index c556b09c..a2f9d467 100644 --- a/src/extensions/speech_extension/helpers/connection_helpers.cs +++ b/src/extensions/speech_extension/helpers/connection_helpers.cs @@ -1,4 +1,9 @@ -using System.Linq; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Linq; using Microsoft.CognitiveServices.Speech; using Newtonsoft.Json.Linq; diff --git a/src/extensions/template_extension/TemplateFactory.cs b/src/extensions/template_extension/TemplateFactory.cs index 60cbee84..0465d6ef 100644 --- a/src/extensions/template_extension/TemplateFactory.cs +++ b/src/extensions/template_extension/TemplateFactory.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Newtonsoft.Json.Linq; using Mono.TextTemplating; using System.Collections.Generic; diff --git a/src/extensions/testframework/IYamlTestFrameworkHost.cs b/src/extensions/testframework/IYamlTestFrameworkHost.cs index 383b278d..02bef78a 100644 --- a/src/extensions/testframework/IYamlTestFrameworkHost.cs +++ b/src/extensions/testframework/IYamlTestFrameworkHost.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; namespace Azure.AI.Details.Common.CLI.TestFramework diff --git a/src/extensions/testframework/IYamlTestFrameworkLogger.cs b/src/extensions/testframework/IYamlTestFrameworkLogger.cs index eccc5196..b64c6fb0 100644 --- a/src/extensions/testframework/IYamlTestFrameworkLogger.cs +++ b/src/extensions/testframework/IYamlTestFrameworkLogger.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + namespace Azure.AI.Details.Common.CLI.TestFramework { public interface IYamlTestFrameworkLogger diff --git a/src/extensions/testframework/JunitXmlTestReporter.cs b/src/extensions/testframework/JunitXmlTestReporter.cs index 8758b052..a92ce91e 100644 --- a/src/extensions/testframework/JunitXmlTestReporter.cs +++ b/src/extensions/testframework/JunitXmlTestReporter.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Linq; using System.Xml; diff --git a/src/extensions/testframework/Logger.cs b/src/extensions/testframework/Logger.cs index f1cebe0a..a6cf0c63 100644 --- a/src/extensions/testframework/Logger.cs +++ b/src/extensions/testframework/Logger.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using System.Collections.Generic; diff --git a/src/extensions/testframework/Properties/AssemblyInfo.cs b/src/extensions/testframework/Properties/AssemblyInfo.cs index c553fe3d..8a91a74b 100644 --- a/src/extensions/testframework/Properties/AssemblyInfo.cs +++ b/src/extensions/testframework/Properties/AssemblyInfo.cs @@ -1,4 +1,9 @@ -using System.Reflection; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/src/extensions/testframework/TestResultHelpers.cs b/src/extensions/testframework/TestResultHelpers.cs index 2416d953..44f786f3 100644 --- a/src/extensions/testframework/TestResultHelpers.cs +++ b/src/extensions/testframework/TestResultHelpers.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.TestPlatform.ObjectModel; diff --git a/src/extensions/testframework/TestRun.cs b/src/extensions/testframework/TestRun.cs index 40cfb265..feda95fc 100644 --- a/src/extensions/testframework/TestRun.cs +++ b/src/extensions/testframework/TestRun.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.Linq; diff --git a/src/extensions/testframework/TimeSpanFormatter.cs b/src/extensions/testframework/TimeSpanFormatter.cs index 02f5d25b..b378a896 100644 --- a/src/extensions/testframework/TimeSpanFormatter.cs +++ b/src/extensions/testframework/TimeSpanFormatter.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; namespace Azure.AI.Details.Common.CLI.TestFramework diff --git a/src/extensions/testframework/TrxXmlTestReporter.cs b/src/extensions/testframework/TrxXmlTestReporter.cs index 281bb121..117a0edc 100644 --- a/src/extensions/testframework/TrxXmlTestReporter.cs +++ b/src/extensions/testframework/TrxXmlTestReporter.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Linq; using System.Xml; diff --git a/src/extensions/testframework/YamlEnvHelpers.cs b/src/extensions/testframework/YamlEnvHelpers.cs index d40c7326..da23dad3 100644 --- a/src/extensions/testframework/YamlEnvHelpers.cs +++ b/src/extensions/testframework/YamlEnvHelpers.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.IO; diff --git a/src/extensions/testframework/YamlHelpers.cs b/src/extensions/testframework/YamlHelpers.cs index 58bfa6f0..3db79e3b 100644 --- a/src/extensions/testframework/YamlHelpers.cs +++ b/src/extensions/testframework/YamlHelpers.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.IO; using YamlDotNet.RepresentationModel; diff --git a/src/extensions/testframework/YamlNodeExtensions.cs b/src/extensions/testframework/YamlNodeExtensions.cs index e8e8be3f..c8320cc1 100644 --- a/src/extensions/testframework/YamlNodeExtensions.cs +++ b/src/extensions/testframework/YamlNodeExtensions.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using System; using System.Collections.Generic; diff --git a/src/extensions/testframework/YamlTagHelpers.cs b/src/extensions/testframework/YamlTagHelpers.cs index 2d84c986..305788d2 100644 --- a/src/extensions/testframework/YamlTagHelpers.cs +++ b/src/extensions/testframework/YamlTagHelpers.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.IO; diff --git a/src/extensions/testframework/YamlTestCaseFilter.cs b/src/extensions/testframework/YamlTestCaseFilter.cs index 32b2837b..cf2299d2 100644 --- a/src/extensions/testframework/YamlTestCaseFilter.cs +++ b/src/extensions/testframework/YamlTestCaseFilter.cs @@ -1,4 +1,9 @@ -using Microsoft.VisualStudio.TestPlatform.ObjectModel; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; using System; diff --git a/src/extensions/testframework/YamlTestCaseParseContext.cs b/src/extensions/testframework/YamlTestCaseParseContext.cs index 1d270ac0..f78e1282 100644 --- a/src/extensions/testframework/YamlTestCaseParseContext.cs +++ b/src/extensions/testframework/YamlTestCaseParseContext.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.Collections.Generic; using System.IO; diff --git a/src/extensions/testframework/YamlTestCaseParser.cs b/src/extensions/testframework/YamlTestCaseParser.cs index daed4232..a4a15f3c 100644 --- a/src/extensions/testframework/YamlTestCaseParser.cs +++ b/src/extensions/testframework/YamlTestCaseParser.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/extensions/testframework/YamlTestCaseRunner.cs b/src/extensions/testframework/YamlTestCaseRunner.cs index 70777ba1..d2c8274c 100644 --- a/src/extensions/testframework/YamlTestCaseRunner.cs +++ b/src/extensions/testframework/YamlTestCaseRunner.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/extensions/testframework/YamlTestConfigHelpers.cs b/src/extensions/testframework/YamlTestConfigHelpers.cs index a119017c..49e5045a 100644 --- a/src/extensions/testframework/YamlTestConfigHelpers.cs +++ b/src/extensions/testframework/YamlTestConfigHelpers.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System.IO; using System.Linq; diff --git a/src/extensions/testframework/YamlTestFramework.cs b/src/extensions/testframework/YamlTestFramework.cs index 20198317..2bb5cf5b 100644 --- a/src/extensions/testframework/YamlTestFramework.cs +++ b/src/extensions/testframework/YamlTestFramework.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; using System; diff --git a/src/extensions/testframework/YamlTestFrameworkConsoleHost.cs b/src/extensions/testframework/YamlTestFrameworkConsoleHost.cs index e7cd1e0d..ab7c6940 100644 --- a/src/extensions/testframework/YamlTestFrameworkConsoleHost.cs +++ b/src/extensions/testframework/YamlTestFrameworkConsoleHost.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.IO; diff --git a/src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs b/src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs index 8a57d4a9..67728704 100644 --- a/src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs +++ b/src/extensions/testframework/YamlTestFrameworkTestAdapterMessageLogger.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; using System; using System.Diagnostics; diff --git a/src/extensions/testframework/YamlTestProperties.cs b/src/extensions/testframework/YamlTestProperties.cs index fd96ce05..ee496e75 100644 --- a/src/extensions/testframework/YamlTestProperties.cs +++ b/src/extensions/testframework/YamlTestProperties.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs b/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs index 9bceba2f..3772389d 100644 --- a/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs +++ b/src/testing/adapters/recordingadapter/RecordedTestDiscoverer.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; diff --git a/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs b/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs index d57cd813..c1f813ae 100644 --- a/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs +++ b/src/testing/adapters/recordingadapter/RecordedTestExecutor.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; diff --git a/src/testing/adapters/recordingadapter/RecordedTestMode.cs b/src/testing/adapters/recordingadapter/RecordedTestMode.cs index e71f015e..c89fd083 100644 --- a/src/testing/adapters/recordingadapter/RecordedTestMode.cs +++ b/src/testing/adapters/recordingadapter/RecordedTestMode.cs @@ -1,4 +1,9 @@ -using System; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/src/testing/adapters/recordingadapter/RecordedTestObserver.cs b/src/testing/adapters/recordingadapter/RecordedTestObserver.cs index 421a9300..632c11c1 100644 --- a/src/testing/adapters/recordingadapter/RecordedTestObserver.cs +++ b/src/testing/adapters/recordingadapter/RecordedTestObserver.cs @@ -1,4 +1,9 @@ -using Microsoft.VisualStudio.TestPlatform.ObjectModel; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using System; using System.Diagnostics; diff --git a/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.cs b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.cs index bd35e0ce..5f8028c0 100644 --- a/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.cs +++ b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Azure.AI.Details.Common.CLI.TestFramework; using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; diff --git a/src/testing/adapters/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs b/src/testing/adapters/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs index 130d7005..822c452e 100644 --- a/src/testing/adapters/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs +++ b/src/testing/adapters/recordingadapter/RecordedYamlTestRunnerTriggerAttribute.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; diff --git a/src/testing/adapters/recordingadapter/TestProxyClient.cs b/src/testing/adapters/recordingadapter/TestProxyClient.cs index 0229ad63..f9dbfbb6 100644 --- a/src/testing/adapters/recordingadapter/TestProxyClient.cs +++ b/src/testing/adapters/recordingadapter/TestProxyClient.cs @@ -1,4 +1,9 @@ -using System; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/src/testing/adapters/testadapter/Properties/AssemblyInfo.cs b/src/testing/adapters/testadapter/Properties/AssemblyInfo.cs index 95e7b07d..c5e2bddb 100644 --- a/src/testing/adapters/testadapter/Properties/AssemblyInfo.cs +++ b/src/testing/adapters/testadapter/Properties/AssemblyInfo.cs @@ -1,4 +1,9 @@ -using System; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/src/testing/adapters/testadapter/TestDiscoverer.cs b/src/testing/adapters/testadapter/TestDiscoverer.cs index 4dcbe20f..6be31e60 100644 --- a/src/testing/adapters/testadapter/TestDiscoverer.cs +++ b/src/testing/adapters/testadapter/TestDiscoverer.cs @@ -1,4 +1,9 @@ -using Microsoft.VisualStudio.TestPlatform.ObjectModel; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; using System; diff --git a/src/testing/adapters/testadapter/TestExecutor.cs b/src/testing/adapters/testadapter/TestExecutor.cs index e99cf99e..e58cace1 100644 --- a/src/testing/adapters/testadapter/TestExecutor.cs +++ b/src/testing/adapters/testadapter/TestExecutor.cs @@ -1,4 +1,9 @@ -using Microsoft.VisualStudio.TestPlatform.ObjectModel; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; using System; diff --git a/src/testing/adapters/testadapter/YamlTestAdapter.cs b/src/testing/adapters/testadapter/YamlTestAdapter.cs index 956c5f43..a9758076 100644 --- a/src/testing/adapters/testadapter/YamlTestAdapter.cs +++ b/src/testing/adapters/testadapter/YamlTestAdapter.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; diff --git a/src/testing/adapters/testadapter/YamlTestFrameworkHandleHost.cs b/src/testing/adapters/testadapter/YamlTestFrameworkHandleHost.cs index 6b9f08e1..67781422 100644 --- a/src/testing/adapters/testadapter/YamlTestFrameworkHandleHost.cs +++ b/src/testing/adapters/testadapter/YamlTestFrameworkHandleHost.cs @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; diff --git a/src/testing/adapters/testadapter/YamlTestRunnerTriggerAttribute.cs b/src/testing/adapters/testadapter/YamlTestRunnerTriggerAttribute.cs index b2d3157c..ff1f0c3a 100644 --- a/src/testing/adapters/testadapter/YamlTestRunnerTriggerAttribute.cs +++ b/src/testing/adapters/testadapter/YamlTestRunnerTriggerAttribute.cs @@ -1,4 +1,9 @@ -using Microsoft.VisualStudio.TestPlatform.ObjectModel; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; using System; diff --git a/src/testing/runner/Properties/AssemblyInfo.cs b/src/testing/runner/Properties/AssemblyInfo.cs index d280765b..054a9689 100644 --- a/src/testing/runner/Properties/AssemblyInfo.cs +++ b/src/testing/runner/Properties/AssemblyInfo.cs @@ -1,4 +1,9 @@ -using System.Reflection; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/src/testing/samples/helper_functions_sample_project/PersonAgeFunctionHelperTest.cs b/src/testing/samples/helper_functions_sample_project/PersonAgeFunctionHelperTest.cs index d1bc243a..66622e28 100644 --- a/src/testing/samples/helper_functions_sample_project/PersonAgeFunctionHelperTest.cs +++ b/src/testing/samples/helper_functions_sample_project/PersonAgeFunctionHelperTest.cs @@ -1,4 +1,9 @@ -using Azure.AI.OpenAI; +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.md file in the project root for full license information. +// + +using Azure.AI.OpenAI; using Azure.AI.Details.Common.CLI.Extensions.HelperFunctions; namespace Azure.AI.Details.Common.CLI.Extensions.HelperFunctions.Test From 0d2e431b1f3800700e6a4dfcb0d2d63b14afccd2 Mon Sep 17 00:00:00 2001 From: Ryan Hurey Date: Tue, 5 Mar 2024 18:28:39 -0800 Subject: [PATCH 18/19] Add Azure.AI.ImageAnalysis support to CLI. (#236) * Add Azure.AI.ImageAnalysis support to CLI. Add ai init vision support for computer vision resources * Help files * PR Feedback * Iff the parameters have any '-' in them, then they must match the masked full names. --- .gitignore | 1 + src/ai/.x/config/vision.default.connection | 2 +- src/ai/.x/help/vision | 2 +- src/ai/.x/help/vision.image.analyze | 32 + src/ai/.x/help/vision.image.analyze.examples | 25 + src/ai/.x/help/vision.image.analyze.file | 9 + ...vision.image.analyze.genderneutralcaptions | 9 + src/ai/.x/help/vision.image.analyze.language | 9 + .../.x/help/vision.image.analyze.modelversion | 9 + .../vision.image.analyze.smartaspectratios | 9 + src/ai/.x/help/vision.image.analyze.url | 9 + .../help/vision.image.analyze.visualfeatures | 19 + src/ai/Properties/launchSettings.json | 8 - src/ai/ai-cli.csproj | 1 + .../commands/parsers/vision_command_parser.cs | 23 +- src/ai/commands/vision_command.cs | 144 +- src/common/details/azcli/AzCli.cs | 11 + ...ig_CognitiveServicesResource_SpeechKind.cs | 23 + src/common/details/commands/init_command.cs | 23 +- .../commands/parsers/init_command_parser.cs | 6 +- .../details/helpers/config_set_helpers.cs | 15 + .../RecordedYamlTestAdapter.csproj | 4 +- .../runner/Properties/launchSettings.json | 8 - tests/image-analysis-sample.jpg | Bin 0 -> 957842 bytes ...lysis.TestCases.01.test ai IA caption.json | 141 + ...mage Analysis.TestCases.01.test ai IA.json | 143 + ...Visual Features are case insensitive).json | 142 + ...3.test ai IA Multiple Visual Features.json | 611 + ...4.test ai IA caption (gender neutral).json | 143 + ...stCases.05.test ai IA Model selection.json | 140 + ...sis.TestCases.06.test ai IA from file.json | 140 + ...ses.07.test ai IA smart crop (single).json | 151 + ...s.08.test ai IA smart crop (multiple).json | 161 + ...estCases.09.test ai IA caption (JSON).json | 142 + ...sion.ai init.TestCases.ai init vision.json | 46609 ++++++++++++++++ tests/test_ai_vision.yaml | 132 + 36 files changed, 49019 insertions(+), 37 deletions(-) create mode 100644 src/ai/.x/help/vision.image.analyze create mode 100644 src/ai/.x/help/vision.image.analyze.examples create mode 100644 src/ai/.x/help/vision.image.analyze.file create mode 100644 src/ai/.x/help/vision.image.analyze.genderneutralcaptions create mode 100644 src/ai/.x/help/vision.image.analyze.language create mode 100644 src/ai/.x/help/vision.image.analyze.modelversion create mode 100644 src/ai/.x/help/vision.image.analyze.smartaspectratios create mode 100644 src/ai/.x/help/vision.image.analyze.url create mode 100644 src/ai/.x/help/vision.image.analyze.visualfeatures delete mode 100644 src/ai/Properties/launchSettings.json delete mode 100644 src/testing/runner/Properties/launchSettings.json create mode 100644 tests/image-analysis-sample.jpg create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.01.test ai IA caption.json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.01.test ai IA.json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.02.test ai IA caption (Visual Features are case insensitive).json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.03.test ai IA Multiple Visual Features.json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.04.test ai IA caption (gender neutral).json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.05.test ai IA Model selection.json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.06.test ai IA from file.json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.07.test ai IA smart crop (single).json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.08.test ai IA smart crop (multiple).json create mode 100644 tests/recordings/yaml.test_ai_vision.Test AI Vision Image Analysis.TestCases.09.test ai IA caption (JSON).json create mode 100644 tests/recordings/yaml.test_ai_vision.ai init.TestCases.ai init vision.json create mode 100644 tests/test_ai_vision.yaml diff --git a/.gitignore b/.gitignore index f9a4e5cd..53aba146 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ **/obj/* ideas/website/node_modules/** testresults/** +**/launchSettings.json \ No newline at end of file diff --git a/src/ai/.x/config/vision.default.connection b/src/ai/.x/config/vision.default.connection index 27b451bd..d77ccbc2 100644 --- a/src/ai/.x/config/vision.default.connection +++ b/src/ai/.x/config/vision.default.connection @@ -1 +1 @@ -@connection.from.region \ No newline at end of file +@connection.from.endpoint \ No newline at end of file diff --git a/src/ai/.x/help/vision b/src/ai/.x/help/vision index f58397dc..fc030c04 100644 --- a/src/ai/.x/help/vision +++ b/src/ai/.x/help/vision @@ -10,7 +10,7 @@ COMMANDS `#e_;*` ai vision form [...] (see: ai help vision form) `#e_;*` ai vision document [...] (see: ai help vision document) -`#e_;*` ai vision image [...] (see: ai help vision image) +` ai vision image [...] (see: ai help vision image) `#e_;*` ai vision person [...] (see: ai help vision person) `#e_;*` ai vision face [...] (see: ai help vision face) diff --git a/src/ai/.x/help/vision.image.analyze b/src/ai/.x/help/vision.image.analyze new file mode 100644 index 00000000..f6764a42 --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze @@ -0,0 +1,32 @@ +VISION IMAGE ANALYZE + +@include.the.azure.ai.service + +USAGE: ai vision image analyze [...] + + INPUT + --file FILEPATH (see: ai help vision image analyze file) + --url IMAGEURL (see: ai help vision image analyze url) + + FEATURES + --visual-features FEATURES (see: ai help vision image analyze visualfeatures) + + LANGUAGE + --language LANGUAGE (see: ai help vision image analyze language) + + CAPTIONS + --gender-neutral-captions TRUE|FALSE (see: ai help vision image analyze genderneutralcaptions) + + ASPECT RATIOS + --smart-aspect-ratios RATIOS (see: ai help vision image analyze smartaspectratios) + + MODEL + --model-version VERSION (see: ai help vision image analyze modelversion) + +EXAMPLES + + ai vision image analyze --file image.jpg --visual-features Caption + +SEE ALSO + + ai help vision image analyze examples \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.examples b/src/ai/.x/help/vision.image.analyze.examples new file mode 100644 index 00000000..dea38214 --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.examples @@ -0,0 +1,25 @@ +VISION IMAGE ANALYZE EXAMPLES + + `EXAMPLE 1`: Analyze an image file using the Caption feature + + ai vision image analyze --file image.jpg --visual-features Caption + + `EXAMPLE 2`: Analyze an image file using the Read feature for OCR + + ai vision image analyze --file text_image.jpg --visual-features Read + + `EXAMPLE 3`: Analyze an image from a URL using the Caption feature + + ai vision image analyze --url https://example.com/image.jpg --visual-features Caption + + `EXAMPLE 4`: Analyze an image file using multiple features + + ai vision image analyze --file image.jpg --visual-features Caption,Objects + + `EXAMPLE 5`: Analyze an image file using the Caption feature with gender-neutral terms + + ai vision image analyze --file image.jpg --visual-features Caption --gender-neutral-captions true + +SEE ALSO + + ai help vision image analyze \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.file b/src/ai/.x/help/vision.image.analyze.file new file mode 100644 index 00000000..4e1adf4e --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.file @@ -0,0 +1,9 @@ +VISION IMAGE ANALYZE FILE + +The `--file` argument is used to specify the path to the image file to analyze. The file must be in one of the following formats: JPEG, PNG, GIF, BMP, WEBP, ICO, TIFF, or MPO. The file size must be less than 20 megabytes (MB), and the dimensions of the image must be greater than 50 x 50 pixels and less than 16,000 x 16,000 pixels. + +USAGE: ai vision image analyze --file [...other options] + +EXAMPLE + + ai vision image analyze --file image.jpg --visual-features Caption \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.genderneutralcaptions b/src/ai/.x/help/vision.image.analyze.genderneutralcaptions new file mode 100644 index 00000000..8d526ddc --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.genderneutralcaptions @@ -0,0 +1,9 @@ +VISION IMAGE ANALYZE GENDER NEUTRAL CAPTIONS + +The `--gender-neutral-captions` argument is used to specify whether to use gender-neutral terms in the captions. If set to true, terms like 'person' and 'child' are used instead of 'man', 'woman', 'boy', 'girl', etc. + +USAGE: ai vision image analyze --gender-neutral-captions [...other options] + +EXAMPLE + + ai vision image analyze --file image.jpg --visual-features Caption --gender-neutral-captions true \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.language b/src/ai/.x/help/vision.image.analyze.language new file mode 100644 index 00000000..6902abb6 --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.language @@ -0,0 +1,9 @@ +VISION IMAGE ANALYZE LANGUAGE + +The `--language` argument is used to specify the language to use for analysis. This affects the language of the generated captions and extracted text. + +USAGE: ai vision image analyze --language [...other options] + +EXAMPLE + + ai vision image analyze --file image.jpg --visual-features Caption --language en \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.modelversion b/src/ai/.x/help/vision.image.analyze.modelversion new file mode 100644 index 00000000..8409a569 --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.modelversion @@ -0,0 +1,9 @@ +VISION IMAGE ANALYZE MODEL VERSION + +The `--model-version` argument is used to specify the version of the model to use for analysis. This allows you to use a specific version of the model, rather than the latest version. + +USAGE: ai vision image analyze --model-version "version" [...other options] + +EXAMPLE + + ai vision image analyze --file image.jpg --visual-features Caption --model-version "latest" \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.smartaspectratios b/src/ai/.x/help/vision.image.analyze.smartaspectratios new file mode 100644 index 00000000..4261498c --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.smartaspectratios @@ -0,0 +1,9 @@ +VISION IMAGE ANALYZE SMART ASPECT RATIOS + +The `--smart-crop-aspect-ratios` argument is used to specify the aspect ratios to use for smart cropping. Smart cropping is used to find a representative sub-region of the image for thumbnail generation, with priority given to include faces. + +USAGE: ai vision image analyze --smart-crop-aspect-ratios [...other options] + +EXAMPLE + + ai vision image analyze --file image.jpg --visual-features SmartCrops --smart-crop-aspect-ratios 1:1,16:9 \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.url b/src/ai/.x/help/vision.image.analyze.url new file mode 100644 index 00000000..0b61a51a --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.url @@ -0,0 +1,9 @@ +VISION IMAGE ANALYZE URL + +The `--url` argument is used to specify the URL of the image to analyze. The image must be publicly accessible. + +USAGE: ai vision image analyze --url [...other options] + +EXAMPLE + + ai vision image analyze --url https://example.com/image.jpg --visual-features Caption \ No newline at end of file diff --git a/src/ai/.x/help/vision.image.analyze.visualfeatures b/src/ai/.x/help/vision.image.analyze.visualfeatures new file mode 100644 index 00000000..22755253 --- /dev/null +++ b/src/ai/.x/help/vision.image.analyze.visualfeatures @@ -0,0 +1,19 @@ +VISION IMAGE ANALYZE VISUAL FEATURES + +The `--visual-features` argument is used to specify one or more visual features to extract from the image. The options are specified by a comma separated list. + +Here are the supported features: + +1. `Caption`: Generate a human-readable sentence that describes the content of an image. +2. `Read`: Also known as Optical Character Recognition (OCR). Extract printed or handwritten text from images. +3. `DenseCaptions`: Dense Captions provides more details by generating one-sentence captions for up to 10 different regions in the image, including one for the whole image. +4. `Tags`: Extract content tags for thousands of recognizable objects, living beings, scenery, and actions that appear in images. +5. `Objects`: Object detection. This is similar to tagging, but focuses on detecting physical objects in the image and returning their location. +6. `SmartCrops`: Used to find a representative sub-region of the image for thumbnail generation, with priority given to include faces. +7. `People`: Locate people in the image and return their location. + +USAGE: ai vision image analyze --visual-features [...other options] + +EXAMPLE + + ai vision image analyze --file image.jpg --visual-features Caption,People \ No newline at end of file diff --git a/src/ai/Properties/launchSettings.json b/src/ai/Properties/launchSettings.json deleted file mode 100644 index c6eb63c9..00000000 --- a/src/ai/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "ai-cli": { - "commandName": "Project", - "commandLineArgs": "chat --interactive --question hello --output-chat-history-file history.jsonl --built-in-functions true --input-chat-history-file history_ref.jsonl" - } - } -} \ No newline at end of file diff --git a/src/ai/ai-cli.csproj b/src/ai/ai-cli.csproj index 67430ea9..cdced666 100644 --- a/src/ai/ai-cli.csproj +++ b/src/ai/ai-cli.csproj @@ -118,6 +118,7 @@ + diff --git a/src/ai/commands/parsers/vision_command_parser.cs b/src/ai/commands/parsers/vision_command_parser.cs index 549bc14a..d1b07aa6 100644 --- a/src/ai/commands/parsers/vision_command_parser.cs +++ b/src/ai/commands/parsers/vision_command_parser.cs @@ -62,12 +62,11 @@ private static readonly (string name, bool valuesRequired)[] _commands = { private static IEnumerable GetCommandParsers(ICommandValues values) { var commandName = values.GetCommand(); - foreach (var command in _commands) + switch (commandName) { - if (commandName == command.name) - { - return _visionPlaceHolderParsers; - } + case "vision.image": + case "vision.image.analyze": + return imageAnalyzeParsers; } return null; @@ -84,7 +83,10 @@ public CommonVisionNamedValueTokenParsers() : base( new CommonNamedValueTokenParsers(), new NamedValueTokenParser("--ini", "ini.file", "10", "1", "@"), new NamedValueTokenParser(null, "x.command.expand.file.name", "11111", "1"), - + new NamedValueTokenParser(null, "service.config.endpoint.uri", "0011", "1"), + new NamedValueTokenParser("--url", "vision.input.url", "001", "1", null, null, "url", "vision.input.type"), + new NamedValueTokenParser("--file", "vision.input.file", "001", "1", null, null, "file", "vision.input.type"), + new NamedValueTokenParser("--outputtype", "vision.output.type", "011", "1"), new ExpectConsoleOutputTokenParser(), new DiagnosticLogTokenParser() @@ -99,6 +101,15 @@ public CommonVisionNamedValueTokenParsers() : base( }; + private static INamedValueTokenParser[] imageAnalyzeParsers = [ + new CommonVisionNamedValueTokenParsers(), + new NamedValueTokenParser("--language", "vision.image.language", "001", "1"), + new NamedValueTokenParser("--gender-neutral-captions", "vision.image.gender.neutral.captions", "00111", "1"), + new NamedValueTokenParser("--smart-crop-aspect-ratios", "vision.image.smart.crop.aspect.ratios", "001111", "1"), + new NamedValueTokenParser("--model-version", "vision.image.model.version", "0011", "1"), + new NamedValueTokenParser("--visual-features", "vision.image.visual.features", "0011", "1") + ]; + #endregion } } diff --git a/src/ai/commands/vision_command.cs b/src/ai/commands/vision_command.cs index f03d6f93..cb3871c9 100644 --- a/src/ai/commands/vision_command.cs +++ b/src/ai/commands/vision_command.cs @@ -5,17 +5,10 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; using System.Net; -using System.Text; -using System.Text.RegularExpressions; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Threading; -using System.Threading.Tasks; -using Newtonsoft.Json.Linq; +using Azure.AI.Vision.ImageAnalysis; namespace Azure.AI.Details.Common.CLI { @@ -55,12 +48,147 @@ private void DoCommand(string command) switch (command) { + case "vision.image.analyze": + RunImageAnalyzeCommand(_values); + break; default: _values.AddThrowError("WARNING:", $"'{command.Replace('.', ' ')}' NOT YET IMPLEMENTED!!"); break; } } + private void RunImageAnalyzeCommand(ICommandValues values) + { + var featuresString = _values["vision.image.visual.features"]; + var featuresSplit = featuresString.Split(','); + VisualFeatures features = VisualFeatures.None; + foreach (var feature in featuresSplit) + { + features |= (VisualFeatures)Enum.Parse(typeof(VisualFeatures), feature, true); + } + + var client = new ImageAnalysisClient(new Uri(_values["service.config.endpoint.uri"]), new AzureKeyCredential(_values["service.config.key"])); + + var options = BuildIAOptions(values); + + ImageAnalysisResult result = null; + switch (_values["vision.input.type"]) + { + case "url": + var url = _values["vision.input.url"]; + result = client.Analyze(new Uri(url), features, options); + break; + case "file": + var path = _values["vision.input.file"]; + result = client.Analyze(BinaryData.FromBytes(System.IO.File.ReadAllBytes(path)), features, options); + break; + } + + var outputType = _values.GetOrDefault("vision.output.type", "text"); + switch(outputType) + { + case "text": + PrintIAResult(result, Console.Out); + break; + case "json": + Console.Write(System.ClientModel.Primitives.ModelReaderWriter.Write(result).ToString()); + break; + default: + _values.AddThrowError("WARNING:", $"'{outputType}' NOT YET IMPLEMENTED!!"); + break; + } + } + + private ImageAnalysisOptions BuildIAOptions(ICommandValues values) + { + var options = new ImageAnalysisOptions(); + if (values.Contains("vision.image.language")) + { + options.Language = values.Get("vision.image.language"); + } + if(values.Contains("vision.image.gender.neutral.captions")) + { + options.GenderNeutralCaption = bool.Parse(values.Get("vision.image.gender.neutral.captions")); + } + if(values.Contains("vision.image.model.version")) + { + options.ModelVersion = values.Get("vision.image.model.version"); + } + if(values.Contains("vision.image.smart.crop.aspect.ratios")) + { + List aspectRatios = new List(); + var ratios = values.Get("vision.image.smart.crop.aspect.ratios").Split(','); + foreach(var ratio in ratios) + { + aspectRatios.Add(float.Parse(ratio)); + } + options.SmartCropsAspectRatios = aspectRatios; + } + return options; + } + + private void PrintIAResult(ImageAnalysisResult result, TextWriter writer) + { + writer.WriteLine($"Image analysis results:"); + writer.WriteLine($" Metadata: Model: {result.ModelVersion} Image dimensions: {result.Metadata.Width} x {result.Metadata.Height}"); + + if (result.Caption != null) + { + writer.WriteLine($" Caption: {result.Caption.Text}, Confidence: {result.Caption.Confidence:F4}"); + } + if (result.DenseCaptions != null) + { + writer.WriteLine($" Dense Captions:"); + foreach (DenseCaption denseCaption in result.DenseCaptions.Values) + { + writer.WriteLine($" Region: '{denseCaption.Text}', Confidence: {denseCaption.Confidence:F4}, Bounding box: {denseCaption.BoundingBox}"); + } + } + if (result.Tags != null) + { + writer.WriteLine($" Tags:"); + foreach (DetectedTag tag in result.Tags.Values) + { + writer.WriteLine($" '{tag.Name}', Confidence: {tag.Confidence:F4}"); + } + } + if (result.Objects != null) + { + writer.WriteLine($" Objects:"); + foreach (DetectedObject detectedObject in result.Objects?.Values) + { + writer.WriteLine($" Object: '{detectedObject.Tags.First().Name}', Bounding box: {detectedObject.BoundingBox.ToString()}"); + } + } + if (result.SmartCrops != null) + { + writer.WriteLine($" SmartCrops:"); + foreach (CropRegion cropRegion in result.SmartCrops?.Values) + { + writer.WriteLine($" Aspect ratio: {cropRegion.AspectRatio}, Bounding box: {cropRegion.BoundingBox}"); + } + } + if (result.People != null) + { + writer.WriteLine($" People:"); + foreach (DetectedPerson person in result.People?.Values) + { + writer.WriteLine($" Person: Bounding box {person.BoundingBox.ToString()}, Confidence: {person.Confidence:F4}"); + } + } + if (result.Read != null) + { + writer.WriteLine($" Read:"); + foreach (var line in result.Read?.Blocks.SelectMany(block => block.Lines)) + { + writer.WriteLine($" Line: '{line.Text}', Bounding Polygon: [{string.Join(" ", line.BoundingPolygon)}]"); + foreach (DetectedTextWord word in line.Words) + { + writer.WriteLine($" Word: '{word.Text}', Confidence {word.Confidence.ToString("#.####")}, Bounding Polygon: [{string.Join(" ", word.BoundingPolygon)}]"); + } + } + } + } private bool _quiet = false; private bool _verbose = false; } diff --git a/src/common/details/azcli/AzCli.cs b/src/common/details/azcli/AzCli.cs index 4126481d..7f162993 100644 --- a/src/common/details/azcli/AzCli.cs +++ b/src/common/details/azcli/AzCli.cs @@ -74,6 +74,17 @@ public struct CognitiveServicesSpeechResourceInfo public string Key; } + public struct CognitiveServicesVisionResourceInfo + { + public string Id; + public string Group; + public string Name; + public string Kind; + public string RegionLocation; + public string Endpoint; + + public string Key; + } public struct CognitiveServicesKeyInfo { diff --git a/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_SpeechKind.cs b/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_SpeechKind.cs index 1c728e96..efd35926 100644 --- a/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_SpeechKind.cs +++ b/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_SpeechKind.cs @@ -42,5 +42,28 @@ public partial class AzCliConsoleGui Key = keys.Key1, }; } + public static async Task PickOrCreateAndConfigCognitiveServicesComputerVisionKindResource(bool interactive, string subscriptionId, string regionFilter = null, string groupFilter = null, string resourceFilter = null, string kinds = null, string sku = null, bool yes = false) + { + kinds ??= "ComputerVision"; + var sectionHeader = "VISION RESOURCE"; + + var regionLocation = !string.IsNullOrEmpty(regionFilter) ? await AzCliConsoleGui.PickRegionLocationAsync(interactive, regionFilter) : new AzCli.AccountRegionLocationInfo(); + var resource = await AzCliConsoleGui.PickOrCreateCognitiveResource(sectionHeader, interactive, subscriptionId, regionLocation.Name, groupFilter, resourceFilter, kinds, sku, yes); + + var keys = await AzCliConsoleGui.LoadCognitiveServicesResourceKeys(sectionHeader, subscriptionId, resource); + + ConfigSetHelpers.ConfigVisionResource(subscriptionId, resource.RegionLocation, resource.Endpoint, keys.Key1); + + return new AzCli.CognitiveServicesVisionResourceInfo + { + Id = resource.Id, + Group = resource.Group, + Name = resource.Name, + Kind = resource.Kind, + RegionLocation = resource.RegionLocation, + Endpoint = resource.Endpoint, + Key = keys.Key1, + }; + } } } diff --git a/src/common/details/commands/init_command.cs b/src/common/details/commands/init_command.cs index 30f9c5d3..7cf3a756 100644 --- a/src/common/details/commands/init_command.cs +++ b/src/common/details/commands/init_command.cs @@ -74,6 +74,7 @@ private async Task DoCommand(string command) case "init.openai": await DoInitRootOpenAi(interactive); break; case "init.search": await DoInitRootSearch(interactive); break; case "init.speech": await DoInitRootSpeech(interactive); break; + case "init.vision": await DoInitRootVision(interactive); break; // POST-IGNITE: TODO: add ability to init deployments // TODO: ensure that deployments in "openai" flow can be skipped @@ -293,7 +294,7 @@ private async Task DoInitStandaloneResources(bool interactive) Console.WriteLine("\rInitialize: CANCELED (no selection)"); return; } - + var part = choiceToPart[choices[picked]]; var display = partToLabelDisplay[part]; Console.WriteLine($"\rInitialize: {display}"); @@ -506,6 +507,11 @@ private async Task DoInitRootSpeech(bool interactive) await DoInitSubscriptionId(interactive); await DoInitSpeech(interactive); } + private async Task DoInitRootVision(bool interactive) + { + await DoInitSubscriptionId(interactive); + await DoInitVision(interactive); + } private async Task DoInitSpeech(bool interactive) { @@ -522,6 +528,21 @@ private async Task DoInitSpeech(bool interactive) SubscriptionToken.Data().Set(_values, subscriptionId); } + private async Task DoInitVision(bool interactive) + { + var subscriptionId = SubscriptionToken.Data().GetOrDefault(_values, ""); + var regionFilter = _values.GetOrDefault("init.service.resource.region.name", ""); + var groupFilter = _values.GetOrDefault("init.service.resource.group.name", ""); + var resourceFilter = _values.GetOrDefault("init.service.cognitiveservices.resource.name", ""); + var kind = _values.GetOrDefault("init.service.cognitiveservices.resource.kind", "ComputerVision"); + var sku = _values.GetOrDefault("init.service.cognitiveservices.resource.sku", "S0"); + var yes = _values.GetOrDefault("init.service.cognitiveservices.terms.agree", false); + + var resource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesComputerVisionKindResource(interactive, subscriptionId, regionFilter, groupFilter, resourceFilter, kind, sku, yes); + + SubscriptionToken.Data().Set(_values, subscriptionId); + } + private void DisplayInitServiceBanner() { if (_quiet) return; diff --git a/src/common/details/commands/parsers/init_command_parser.cs b/src/common/details/commands/parsers/init_command_parser.cs index 5c5ba615..189fe1ba 100644 --- a/src/common/details/commands/parsers/init_command_parser.cs +++ b/src/common/details/commands/parsers/init_command_parser.cs @@ -26,6 +26,7 @@ private static readonly (string name, bool valuesRequired)[] _commands = { ("init.openai", false), ("init.search", false), ("init.speech", false), + ("init.vision", false), ("init.project.new", false), ("init.project.select", false), ("init.project", false), @@ -47,6 +48,7 @@ private static INamedValueTokenParser[] GetCommandParsers(ICommandValues values) case "init.openai": case "init.search": case "init.speech": + case "init.vision": case "init.project": case "init.project.new": case "init.project.select": @@ -87,8 +89,8 @@ public CommonInitNamedValueTokenParsers() : base( new NamedValueTokenParser("--interactive", "init.service.interactive", "001", "1;0", "true;false", null, "true") - // new NamedValueTokenParser(null, "init.output.azcli.command.file", "01100", "1", "@@"), - // new NamedValueTokenParser(null, "init.output.azcli.json.file", "01110", "1", "@@") + // new NamedValueTokenParser(null, "init.output.azcli.command.file", "01100", "1", "@@"), + // new NamedValueTokenParser(null, "init.output.azcli.json.file", "01110", "1", "@@") ) { } diff --git a/src/common/details/helpers/config_set_helpers.cs b/src/common/details/helpers/config_set_helpers.cs index fc89149e..be530468 100644 --- a/src/common/details/helpers/config_set_helpers.cs +++ b/src/common/details/helpers/config_set_helpers.cs @@ -119,6 +119,21 @@ public static void ConfigSpeechResource(string subscriptionId, string region, st actions.ForEach(x => x?.Invoke(maxLabelWidth)); } + public static void ConfigVisionResource(string subscriptionId, string region, string endpoint, string key) + { + ConsoleHelpers.WriteLineWithHighlight($"\n`CONFIG VISION RESOURCE`"); + Console.WriteLine(); + + int maxLabelWidth = 0; + var actions = new List>(new Action[] { + ConfigSetLambda("@subscription", subscriptionId, "Subscription", subscriptionId, ref maxLabelWidth), + ConfigSetLambda("@vision.endpoint", endpoint, "Endpoint (vision)", endpoint, ref maxLabelWidth), + ConfigSetLambda("@vision.key", key, "Key (vision)", key.Substring(0, 4) + "****************************", ref maxLabelWidth), + ConfigSetLambda("@vision.region", region, "Region (vision)", region, ref maxLabelWidth), + }); + actions.ForEach(x => x?.Invoke(maxLabelWidth)); + } + public static void ConfigSearchResource(string endpoint, string key) { ConsoleHelpers.WriteLineWithHighlight($"\n`CONFIG AI SEARCH RESOURCE`"); diff --git a/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj index 7e185653..38d2de2d 100644 --- a/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj +++ b/src/testing/adapters/recordingadapter/RecordedYamlTestAdapter.csproj @@ -11,11 +11,11 @@ - + Recordings\%(RecursiveDir)%(Filename)%(Extension) Never - + Tests\%(RecursiveDir)%(Filename)%(Extension) Never diff --git a/src/testing/runner/Properties/launchSettings.json b/src/testing/runner/Properties/launchSettings.json deleted file mode 100644 index 292a4e91..00000000 --- a/src/testing/runner/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "YamlTestRunner": { - "commandName": "Project", - "commandLineArgs": "list --file D:\\git\\azure-ai-cli\\tests\\test3.yaml" - } - } -} \ No newline at end of file diff --git a/tests/image-analysis-sample.jpg b/tests/image-analysis-sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97a34ab8b65747bf9455911380f329eb875ab37c GIT binary patch literal 957842 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%0DtcjTc&`}+(Tn#*{TJ1rCm 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 X^&j;cdWVqy9C+*T2^+h>zreccEIn&PJJ51tc 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

RW?mOzOU3+R5EZ z?Q zScziN7t9EfzH!Efn{DTC+@^b@Hkjz>9qH&Bo%&#U#uoNd$+LDO z`qHhqg&{w=;sgVh$Dgr{LskZq6c_%7_>2*qHErqVRygrpvS|+yiHR~7kIP5uEA4Ne z4o`ZG~ov0oVB*rjO9Zu%wgv7K_HP5*qX zRQo?NvSIqOq67OUP*y+wC@3C;uMGi1*TiCQAs~a2{t8@*fU6!Hn>KLlW@4gJzmQwt zQwMCy3>GW!fX)t{{vrOJf_%3y_=Qz8)QJ=92-%ECx<>2UjM>dL%-cV`4?^(D*1qy1 zH%i<7!ex=p;ALM`V?S2)eAg9@@*(yy__eKcmM>+Zy;^UtX2W(eV~h^R2@+mD{h~en z{Ihm)dP-7tmKSS0d-jy%>!>Yfo_smaRh&7=*74bK{O0NDNn6b4?0c2XIiv#S!FU>( zYz&#(CR5~fN#8~0lPllg8hW*#^0OXqFb^jA%Dzd9W3g=a2Vehsn;kuGJHt(quVI^v z7*k&T+8Rb@yIVestS=#8fp3$RU~sG{lgQEM90-)0sB$C`{i&p|N7%EA`dLG-Fx_rT$R%1w+{{+Zm@CLMne)D7wzL;{(U=r^{9RKpZ!(4`~ElM=e@${6)OFq!pykDSIdhrPUary z^uNKMvQrl7SpM}@4x!9P@Q|xxUZKI39VN8@3qOs>VsG)Av{xQU{HRb`&J#&c?Q1*M zTu~DY%%3mL+S%!4yLJDdO}7bTk;OI1*Yya&49W%>SxHpSnMW|KwmJewt{@N`BMXtsn`NwB{l~)DqfdR5_@##0cUDKDRVT z+p-aL8yeCt1)D#yy!!`31HA zybFV$^RY%tv*ko@V)SluY=Lc4xV#oXs4E%_(Mb|&EhdGHGQC0?AgE@(t1Azt> zTc@B59GpNyyChMbV`)K2OuubsW4}$-M{R@y$dw_0m895Qg)7@a&CY5m5CFSxHzJ%kXNdiV&lY?9(!ijrN zxq&0h;5fZUewcyi1JVMO_gongms@#}Bn%AhI$Y68!IVDvq){a#wxN+YfRVu2LkBfK z%caw{2?k@h!nd3@8aps^i8l4Z=9seVvlXvxF4(&0Xe$U-{>T8iiO<`^gkfNj0TQUE;Zvt{*X{Mg5RXcv%WB?kTl3^>#ky|l}eC~L~& z7bCx3&OKhKccHH|&`-K(fFCS4)<<4KqFi~I2#P7_UBs92n#{$UI}G#-^zjOeHi=aV zy6E8Ot3*_KfDept>e#SF_$YnCL1=@;vHxV3!a+60WmA^sn`ppUR3TVT8B>$S!BeEQXi zA?Sgp1l#O84s0V|QY^F4oA~&JtZqIqh&^6zv{%c`Hk;|om&lXAmINxau3hF;?q{=E zJDr^YOC4^s1$YfKPR~yB7C+Apzj*mFGR_qe`pUXj@x0=_#(Xx&2Z3vTpjrG{UdVy3 z)E4ANKViR(O%gV#z4lD9fsVm;-QxJxYY*Fl-L1Add(n0#jG^%+LGXYCY|Q=$|8z+L zyVkZDTMDrJ3-H}n4*Cp`Xb0|_4X8WEN^V_b+=@F120u?ajVC+s%`q@M3;q0T*8Z2j z`<%q#WgBkowuAd`<(2D$(YTGarzEV4k^}wKk$rL^$$RqA(~B>^Xva@JX>We#KWe+T z?&X1c{n5*lSMB$|{zW@|{Wa89u$@ zG5LgNXjZq*na*eOT>31=^|k#N?&*@x@ESW+cKRx0DGvmn`VhyaKBo6`#uO!QX<;7} z8@EXK?~L2NcDFxnTYjEpMDkBtZ$VtZzb|9xuO>)`y|t+5&tr(H6DpGHnAK-k*Xbj) z*iSzu1nH7Z$2de#l0-;aGs6f+o{TTF?Xr>R4m=tJU_)bW38tvO+Al0|#n;QTKY6Bu za*Ll6g!Itggu;$?l~#Ae<&wuk_{GkEryP5~XG0U2*s`5EdNSugQ(!}w{v#syvbGIE&1rh5o()QQwoRThigI4ld*VoaCWR-n`h|mYNrv*&ABKZ!+Ww zpCm%s1+XEo_~tnCPV}x1f)C`G+(sHAw@QljFUDGa!YBFzx3WhH;Ys;R2jGI+IiOB# zF}D3tUT;BMYjb$_?T3r&&2~m2W=^*8y}x|_M=D*SRIpHU<%?bV@UH|dBF#3A7GWp= zQ7CZv%A`bllZO~IWp)3g%+rpfONXZML>SqxKJF`e54?;?>5YIiBE>I!VFV9^W$;o} zfvJL~Ec=zgI??QrfQ{FD2FyuI`J?n0Yza@45}$-g-lLt@pLdYplrpx!~J z;+?RSg3T)VPHv2WR@yAju6o$}Y)}a9K@Ml5BY#TEQLqz^DA} zL-~?*)wQXF2-G^7k!5IAX6)-c zJVqAE-P;G9_^M6OT<}dOJ0~I!;y2-<-5Gr{p%9>XiG4ozHaS&@Fp#5f>T>*KtgwyU z$0Buhj3E_>y~l|t19e9m1CAs?>^p89QGL);!L{uimzLNMp#0OBWu;C$>P=caVN$^k zw9r<3>MqZn^{_dv@hnX>u46ZB4Zzf~j;)-VtMxS*yI6JuJA+wTrGhf{y(LCoXqK^$ z2#Oc+P>&Vl3fR`(s7-eWy2d33VW^kbGVPKGLyO)@w)?AW!Kv)!C_~@fS%c_t0w*vSL-1@oS+8{OCl;;+MB%%r#+XCEr+hoG?ghT8BJIEX8SV{)sRW8yc2#8Qtv{Bx9_Ku2r0Y%Yc zy*$(hKlLw+6DHo5XY1|JvEv3mGdlvOV`4=Dv);CRrt0ucyLbNq-F?0R-(g>U2!6vW zVzc=?^TFxaBA-t&=@6YKbx;yx4jU&BkVF%)(PR=D@i-)V2C2Tfp32A#-C0ZfBEHBq;)w$YLn9Y#;?FD`kR z$Ap`HCN|z4R(>42fn>`Q2&z27FgmaeTIzv`+>9;k(~k|59r`?>>8+`!CyRFPwL5JG zUw6IEcp5>6Z+ipZC3u{(&KH+$zF=;9<-WRbd`Vx}sT0@OqdaQE@)aFI2oP#4*v2se z%sdN9YKOGC)kyjeUKF(!>i*a@&Wef&RW~KH);F( z6L`ay=L%R|HCtUUU#`y31MvhTB>{tw_#0^r43~I^R1kpP#Rm=&FYM9CRlzO~2~net&f<0UpOuY;bh& zfx{u~J6P#YQebe;v0pvUTM#`f=ks9mI@6;=aLKE4nLsx-M-_Y{3X=()kxDhNk1>Nk z0~pq%MP-Lhm5)z32cLwjtfReW?4-qHMOu;wvMz<^F?5R~Mh(y<_TbyNgy#ngg_nek zKH*(FNoG3QfNehqlFq~{TJ_pd%H@x(gUgR+nkagoudqTJ?Y-waSDus`WhOEg=SAC< z2@?F}N|yA1H$1bi-jZxthuqy?N~?A3hhMh#Q{Cc>9D>9}gVu#@tP6ULE_C}RWI6>wOs6LCaz?bu6VVSn%$ zU|A<#>G14L5*tf9oE4Oa&Pl0odkchb9a3*SzR)Z$G`CN^l}P@I&d_cD@WU!SnOq8X z{D%_{{P)R8`3-hQ>ur2zlYouj(B}q*@~0o^ba;iV(NithTIga`mf=R90if_*GIg}u zrY2kU$|S8EIgT@D>ja%Hwr9rx6f4huk~86kUNFd?lm@jex4n6shS|>2ui@4UvK~qx}qOx7aqv;#Rgb6 z-|te#{Guo1RcD|(zC2S3ZN7M8us+VM^1eXI=fHx4J_(-0%W*$JD}&JIAf{fK0?a>| zD>~Tb>?`%!nIB!YfiKW_^kPLaKwv}j)%>JgmU8|Hr+dnZuQF_|K{iI|`8 z^vN@7z;l#1|2p!@Ctz>d6fi6kuE%BH#8%+WP^6u{SDE&=FGL7y9qay~{=dk1d@6XD)3(cRaCG-pVuIsT8*3iQ{^lqj>fO+(ur{3fC}fT z_#$Q2!DkcQh#~x_6$E0Pm6-!*Up~;=wL4p)KK`E7*h$#IPB-JUoQMfOg->wuq79p5 z5dp={tY2qq%XQ)%zXg^zOludN9ndj+OP&5yye4GEe8wI6FxgiHj`z@jl8ooX7b++o z4oSGN3++Lg96!1XwowzNoMQG0ON2V#-8%o5&B81a*zImp-rS5{PqM~-hyZh3Qy;k zB$b3CCSS+88uXTzaP$+th9|-((jUOQWa$~v1QRx*ESaa0<5=VrMX70zfE08TPnpim zav7F41$A>vp=E-k#(B;90nRyJzqgMH(U_zQI6A_ZF+$LYl{e-bnpLP16`Rm!m+>{u z{@SyIzQJU@u9QSz2E#Zh28n`EU>bDZYy{p)vNT{PevQ}w-UPycz1mh1BR|3tZo%$v zl}lgXTDPLT&v#jFA`>HnFW>HSky|22!sbh8Id4leBn;1b;%|Jg(j+?;EweVkQ3Eav^`}D6*p- zTIOu!OFo6^6~0^n1BN`!2NblHjDEGb&%;v18t=E*yq#ZdTj; zj(v4vS?^;k_c$$q`(Rj#(TPCue-hIa={+M_nw_ADCw=y2`hFXNHPySwr&A(p!+ z#|plYmq)^6ufA1i(~^OKjlN5nrk?-KK?Wf?L#VFkBCYW|)I()>K}hML{9Tfi0GU8$ zzojvy;SZX?A0BB`v}o%k_vkR4)seRcDa#5Jl4Q{__-WGXqk<~+0}|*{c24~C2z+5X zdDz)~ZCZKS*R_aYW#8M`GFhe2DtM!7;OVe|A$`)7;4v`u`^v%Us=wLC-|9bIBrg+J zfcROe;^6%}6j{j|vh<0sY?@2G@558P2V%2vW48$*ZYr4+}V;5%x z=Zo1f{S4$J*(8AgXu5}QT2Q8qqT~1k>34p*X#d$?{AHUxdDM2+mTiXwYJ|d z_lyY|UE#aap4DgeB>F;Lt)rPXE)5kARb15Dr805rQde6#Ths>F&uihKQ{8#2s-#Rm zutdKm-p414_SSp%+i-$?n(J=D$0qawBe4PVf994Wj!)5mgh@!pgZM*>gGA(3(Z*l- z`;JlmDw(DM`qmzE*8}BsCD`%c$$D*@efg9Vbq9iOn9$CBZHIXao6#5R6Uv9f_XbhU zosD*QXWI65CvAIc+(u(`oVM_R-FTwf6Qa4o!7siJc#^MdTq+0$H~Zq3S=&X9wuhkj z8R#rgAaBMIwR9-iB#Da*YMjfXV=X?+1i(7V!nA=7+{ID1u7ZER)F&20PN003mp)jfMrP&S-0Z z6n>leCd57ZP20w$53V98gLDIJ3^=!nA>$k;2rh%qSGCU-oPvdOwz(}0=ZStJP_Jqf zJSGPA^SlZBeRAg2mYhAKzlm0^$V3?g><0Y8VomVQae{Y(@x1Mcv&a zcJAwDbEXvisDmZ_4uxr7FiV(9@_lBM~Ae#q0rjqPeldj^$uVSV(dywzbQ3}g%M;Y&Sx)eGFqh2`=_ zLI%#9*=LPCW3whGp8aOjWn$4WWUHfL0C?5cB!?&lxOE2FGV2^o{WrcGO&PPm%|zw6 z1cCcbqPbNq_-LCkRuh^IBhO{2H0;YUY*L{E6R!K^c+1ITBE>ELRk0 zX5osG_VVa)Y^k%2Ua#e&)rVN@TKcmtKaK^I37lg=_Va=5GY_!UCK7zn!mUhNCOeuq^M%%%z^m-yS z{!7@<;)%D|B{t>BL6eWzEIQD>6;j=P$Pr_qKM~;7azFyJ;ucSU=S~xR{(L@fyN9Fp z;I+NRtb&n(i^lTqym&slY%}M*Gh}8?PJgc^3K7bpPa21&j8*uFzss0Yww{FR0%m+! zXk(3ELMZxW;W&;Il700_LHdk^ii&Ca`%St6?B^whi7rx7FhB1?yx#;K&xQzIo$~_+Ue(nr7Q}j_<&o|q6zq`G1YvMhGTfi@kz(>Jy#Z2=4gi<|Ep~mMx}%30+?N(ebK^?VE3zA-F#A51Rh6eEJ7 zb8wmjsQlb+X5ejdrC{6=tN}~snl>gHY;&c9Nz5-<>)@OaRM3J6!34{)Tt(5ZB^jym zByhAdsnU@osiG`Sggz!B7Yksq^;VN4BY7Ukd$^b3+cS38nJ^g08XNQ=gecT+!boS5 z6=>0!=x9xtG+57qX=_OW#4C*yB&mWP&s>GaBs|bb!j-F9&>`$fOe#4|(&>N*?2rI1 zlMfTP+9pwgmt1|at-J-FbkPPpwn_2^eSM;-ENru!D`Rl7ugrZ|TR!D4@{PQ$@Ab#3 z?v~mt{E^(`DiwoP{5}Vkt6?Nd_6?mFf39jt7u!YZq}_>0`s`bVOFbN^Yku$Wa11DQysIL{eO@aolB=Nw@iGc7@!G--2G-e#J4)kL228xC4WZ0q>;nEE_RV>^zMAUgiz(4E+w zehPo!u<8#mj@))QzB6oFJHC_v`h5Wh{iV#SrO}5cEf~MKLdY6ABpzDhgP=qD;WS9Z zAx$pX=U4m|{Vvu!CJk8hGupFQbF~b<-P%@PrA(yP6HsV8$CUsnz4CW9))qpCJcgE% zTYMy2f6|-w@?u|o9XuwvfHGb`%FCB&6dBf)> z2q-#wd^@eTl>F++MSFQ_l7pRH6KGI&a&n4qS+vt*k}t-*w;8^A^`gBzI>K+*R(hS3 zee2vt+djD8#(VeL{^3J>+OoZP`USzqSsVF5ffmoMA1FF$SH{^37v3*>VAJ zPdmzsD`=M{y^XLn8Sk&?`DleYlh^nYZHuiu_BQ6?IL#Fo?8JFdoyKnmH{({puw)!) z>-K?$1e2`JGd}0%H;c~Bm+kA{dI)cH8^8xNToKS~qs~)jBw?!);2vu?`W)cO4>;-> z-l8WymLvD|8R}Y{+J4g$YtAR33tIgT^ZGh@l!si!3y%iav}H-+By7r+vHm>1gR=5{ zjvxFJ@=*nA}d$*#~&e;gnV^K}B>X9=D}) zPe%22rF?SYHOR{+gE{S$hp}MFh?)KVEu*__DsN&fD)V@N$(s7p_T^h%3P!~<$sZUa zQmY>8t(Rh^&BYqyme>`#`n_9_PEdTo)P z_L?~;F-Y-Q^Nd?)Q!td*I7Noi1^)CG93uUWrlOl_)|BaC3zSJSH2CLmy@uC!E<(0LPm2^2sI=OWF zx#DF%_>CMQrz&%x2_JL>xh(0V61 zZ!7Uwo6wlNMb>@Gq_NKM*I@Nn+s;Jgk8K=dY`Sb-Th;D$0@|Vun1dQ8I>{iWZ|E)f zjyI6TejVtc3mNE?#N{B!m=S*0R(C31uar?x_QIZHGH^P&G6Ho9;_?U@1er-hSRCkJ zOdP@wcywwyWcxb?b7oI6XkX~Xn~@zJWJx5})wq>b%Th!C>L-PD`-D6qGweDCR7QTl z&DD0d@+`ehViN3PyAJl|_C_1uCeYqun(zu3fuX@sU6EF&+6ML{U$G%%CL9EBStV=m z2My()+zw9q=dC=6PKPNDe5Li=bZk)d_s7Y21;r=;VaIC8Gz@i-`vC8nqk-j>#D;T<9Q`tff+UbG-k2`vV$RD6N7O!vY z(w7Lk@Dwe|#Q;sc&;@^>>?(*6U~5y7uMPaaub?NjNPiPb#p6kd1cWpdZ?0|yhjp}p zZ*Mu0F7bHv$I8fxt;Z*e&Gwr|7wy@xe!Ki828~@+uwl?Itkd~fo6U}5!^&uQl1Tvyn-KLAzbP67NdH*9`a`!zcCuN z>GrTaeX(l)<{w_PfjhRtza+z@I7S#yAV+J>fI1=Fn3=A9(UGFQ{-SH8uzKnXMYJa`Px z<(nLz8LAv_OxN1@&Zr$6dJE#9O?Uj}Tm{4OzeHxf1v0Pr&%9k@Jug&qEM)!wq`K3$ z@pDXj96ua6OB!2w3h$KDH-0~Tl|lKH_-btqJed>Zfp+oD?8g5}Ka;e0^v&^Iwr8u$ zw5>_LuZZ`!Y=J(=Rxor)TgkF7oipD{VQA;L{HL@ETUiy4c9I9_2!8z|^!GFb9>>N< z#Xs~4Smm+ACnLH_WaZ0B;L|nZ~ih>X)@A{Y=TfG~pO8dDqystaP2LYVozoADt>^#|3aI zZY&zC&z)u~FPOjw_|B2x;%d-NFX?OQ=Y*}IV-%vzU}0b7vyI_(6HnSvFH^m8ZJZ2{ zt$}O5WB{;LNg8sF5n69lwcw)Yn2EG2(J-tHY!;1}F5oR?Sgz0<&^jBpQGh@C3eNz} z+5Mb6bGAB3!gMm5x3k5n9nBVOFIas5df8?sBMTp5ruEr*JDstft*ASv&qX`JvCl{t zj?b3uXwE(`X0$!!_=LI>ww`gCV^p*Gs?9OZv$=h3d*044rqj9i{)1;u8xorn+MQV^ zEb1$XaEkT5VGT`#Bmh7zUV@$be3*1XhaX$4t4AbH!0{G5m7ByVTkiok>sF_gpgHM^ z!)Kpz`=q)+rY18W&48df$0j}wX!VQFi|o~n^Oi9CpxyquYJb*6N0x;b6QzFg(kS6d zooFN&lEJENwS$d^oaZD81$3aIS@I_!}H?^ZZhA#GFd)l~ms7+It$y8Xv zmn>lC)=UKGt%*tSMAR*gI~Q?odL@ind8kQ8Sn}y$W}mhJD{^4OIY6(nx*%wiUg^sO z5V-c02Wc*6BF{PxuXZZ=e#!mt$jYEKf@De1;QPy#f1r!z+h$@hlo0dtahH>{oiR0km~K zBUg2RtH|n17Cdxp#{~R=Lq{FnS)@=5TC`SG(A_H^ndB=F`~Lt!<`J*`q=(f-zO+~S zrWfUxYtX5DY!expc*9TEPhJC60)s&gkRy|PCIEg?I5f~j26Up{1p?F|{q5;evMfGx z44coN9kNg5NW!MY>V2xu7oY-iE zvTY+Dxw<9Z(67C_1s7ZUM;07M^4d_u3=ZhGT$yTH27~2KuuWj+S%iTPQQKL5Xk)Sf zJtKT=#sOtHks&|!MM!mG15HCuEC5!9_=;!q&GxIO>+RL?dAq{@TX&r+TR!73qtBpi zZ|$~ok}>UTHe;OQ4>w0UZEbq1ZQp*g-FfR5MAFEq#Xk*A0{T)NDzx`M+8&qJtuggf938Kx4LCadl9Gq zq}SD;-!Ykb^)d7rpGk22?u(OlhEC6yXLKU?-r6rcXpbm2_O6~;#$%FB=rFxGBB{Om z@D18;g9E?8ym$QUd3*5YTkYie^Y;Al7x=$b+dH`1_Vx~QCy6$R2s9>14=pA`@uTXS zRkMrjgR?j(-(cbuOQ3-~=W3pIg{*WMmN`yhb)*(8(B1tl-E#HHm zww(lNJpAdZ90t*$cF)#tgi4$=8f5#qmtTDN1nAhg@~J=MCY6_E{~Opi^M`zR^)x5- zv}5=KOY|pfdAWA+0PiErzSYM*}nv8pEF0b*e4Eq;> zi9nrN(Z_i?=C9&6u&}z{$8m`}1Vkgt<;5eH_=mu8?kZXLF?Br-Q3<&ILLcXNTX!;4 zMm>S~Xr&DJpE3!m*Y+0E{UTxwFSi&*_OuZe1ZKhjK?a9snMB}$yoO=^fGOA;#%U5} zfhSE7HiE4W>vBx}0HtWqCA@&k|6GoAcBB|A9hD9~5{}DdE@PVr9i5tdkr0u))gdH zf?D@0LGpGzlLHL`1+(U*AkxcLdHR+tCo==$8|5dErXT-u%b;?xAF^>WE+Oy_8Rm*h zjJR_q!cZFSGvIQzQlq1s5g0+K<9e{$Nl531?vN!_k#iZZlc7mb8JFk)2h4IN!bo7P zV(F;P#UxU>&%!2lGU z3?6{bAgkvV!E8Uv0*5X9DZ>g9O4cS4krVs%d;_bK9mnFbZElzCXv-yb`ieX9;in#P z1=eQGnD8tM?WCQ*lqvt%eu5VGmVanXa=@VjwHDz-gDDrEa4JwP85n?;v%sdrFE7AT z2H}m4kt3_NVPGYNk);6^Tb-Qa&Nj+6@)aO^wasoPLui8E$VvEYb6FnTH+<5(>lJ-v zrB4EcZeOnYvsv1WlX>XuY_KMZa+tQ))`i_KI>NPqG$;@0(O-yHT4<*n=;O;5yb2~8 zJ_qAClE9)5UZ_9E$E3e?Q5`gBcPurz>cgs&XI!DOWXQJQ=xj^AcGu<%P^!M{Ikz`u z(Z?09#UVVyk_S7~70@#vvjJU9nZ1XG9=*+P+Y<7iC4eyfBF}+Zd$9hS|>>w2}x2 z8a&pyPiyH`UnXnnCh!rCa*!TvT$?yu4%#n2XTHGa`yIa!LGq zR{LF_ui9#HM*LxbegO|8H=}WMqfoVfKPi*9^?^#hzWz`Dr2X)FKWyjVlJ=eLgEpER zw&8G}By1wT9H=NOwkev5 ze%i8Hni|SXn)_qrq9@-#Nctn=sq))(QZI8X4dX-Ak9}D5L%Hh4pL&U}L|IkX>dyY9 zAC7Mzvmj>^#9X}4AlOQux)M(0HLUn1{edezCOS2yl(nU-@@D^zE60y_FXUE0iu7Gs zXfLXYZzNd1#-80G*pjP0H?SeveJab}bo07#dHI5Z8ylfq`je<Lm;=zp8Y^nI1UH}q`^gKw&`Ss`GpzRGV7|ZOO%o+p%P5F z!H`}M&=FT|wlwjFeR%2*_>$4#ky)TCSnA z+yW;%Qq?;*ZxwTrF%Xx(zzKX?vCu97eR@@y%68wuCY}Bg2q;6zv6d!IGNFmGxCNA@ z(Igkg+%rhz0>!_U+ zlvnUUQ}0AFA+b8aCm^sKUX+zQ2+KasGFnLgixW+K$+Z@6QWn01;pEZLG4F zb*CKSR6?`m>babU(ET}143+{5-MUqcu?>F0OArCP*eP2#HKAe49Ee{>(es@4027b5 zBNZpzLS1a1AUV1Np0=YVrO#s*ow_nB89KgejMo|PYNLaWAE7VRtn%VRxEzR*wYT-y zr$)r;xXD5@(b?A*CR9Km-O8xD3g(2WOlUkHxYKVa9K&l-$b_o_EVwtqImedMZE&b5KKn+W@NkTk$16lO^py_@e9YYS8AQ z5&pcDH@D1CSN>CcR)He~vs6*wmkvv2vC|wC%$#KNOe?UoOWT_0Xg3DF;j_?Y(N;6& z)FoS=7jc{`>&#K$u&=>!ULB0AO`fDp|C$6tTLfU)q%iB&tc(M7XE_zxr2g0M&WtyQ zZFaTMe)@TxXj`7n@`4TZm$S(FL_ea;`etM=*RV{|`H0A!Li+}RB* z1H7C7^9MZjWCEmq7PCdWfBRwNH~Y8y*zF&o>T%WJX;7l0V{MG z=fr&gzx)CF@w>=#z}T5?w($;n+Ck^u`sa&S?o8X({YkbvuT9$IwL#l{gGBo7pzXds zY16wKZR@phn?4*+&wAgF;IFs6hnwuLx19%!lh;OV_+Zo~53nKH4DPiydU)9;uWz== z+f(3y_W}EFjoaXjaoc`ecdDQ!_6 zov)G@$tP>1nDN4@&r~>+dhF8sIQ3-v^l==6Gj1e%)u-YE+q3GUy0MkT*o6aE=Q&Z8 zzPf5x$F??YrS{1Gn>$^qC_I^aN>i`@oOptF6Kao5t}}-y59}xSGMC&?6Tb4Y7XbIR zk#Qh>)LZ5%p7OP|@1kuk^~GYNv9RPMJa_f6-_R&d=&`jpSo3lmVab1*VfV^g`T^Om z(kssBfVkYgg3U9Rj7{Ojr$uf>TNZsD$N5YSeUyn*z>QFsbfLsiMbm7of= zYqC*bDU+~%Q6bg=1M;EH$y)~`84@gmFwL=p%3FWHT)4o4T!0Bp-M;-3=<3w8?zGh* zRUg|qSW-iKd5HnlVU@E)nDAe>m??+CCqKD;5}1F;r}VOcgN`@a3p)l0WCxgk8X&@p zQ^-Tov{#gh{SSlMz-Eo&Qd0Fbpeqnb0Oi>n_XPkRw3uJ$S9Y|~(3E|Dl|>$;+a>z& z2VL?gT;WCb7^=n-S<8oxEx24ehe3Z=aoWzaDK$WghxHDo^qI6OqzYJj8fa)^4o+Rm}2Gqj=dbrG-jC9~R| zi*>ODSIU%~HOfod(lK4+3=QoF^y0v}_EMiSh|1l1%F4;oR~;hvn#?@gtRsYGx=VZT z%NNJ?@ld=5Z3;h@25pvwVnxyQ&twT7agOlnZ90KLrE=CbGr4k{XMO|{bm%v*%C3a$ zelKU`KLlnbNIEIYx-9`-Np|JQr6yJ>WDyR!OCJ~Tx+nagpkmT4RCRXwGvWbA*hewDow1m=WG;qs%nwlMewRJwqbK!u;SBnA0I z1@$iRL-G&|qEe!%sI&L*X^dtPZre2J2<0H3Q)lgSpc8pclE{O-5g_kQpVlF5zs z{Lv?EXKRox#HXC5+dFN{YT}}8QWXELEtJ3P#uM~7 z@0%p##3C_5-h_yrAqZLsyob~F(~r+c_DRsZas+pi$sxX>c=XmjJ#?HqO4+Y-k5}B( zk0(G9Yd9Xko|isZ&o%*YrvqutS#@};my`HyG+itzDKkz{7Tt*=`z|lq2Om6Rw`@L3#*=rdcs8FtoA}(# z@;}4L8i^EjcQ4w`TWf9qT@t4EuiN1_HdzPl9_#(DjoRJ!SlPe(K1tC#o9)hf<96^q z3D~19()P}v-TL}Q+TWtzz4v$6ZnwMd?6&)F zZ?#(_aR+bjw%e5NlYH%w+)Z8w&tYrR9i+g#kh^iZaj%^8hu$gF&k^b<^CmL)*mCa* zS}+!JVxRr^L&c%2Iv91V6!kz1|ekL*GFj6wC``f zv|jq$Ph3D>VKe(euRapHVe6RH0@@z?Nn^aIN88^fW6%%#7$iCg2qfPq!Y_0&ZTCY#Y zTff1jPpB))_E!}JTktvgCAXouyqI<#PJu0Qx`D^}%b2rtA+F4E^3TsXT0V2~jxk=k zv>$DtQyv0Kd4kh=kqHZO;(vu@8{cgZp)l^$pRrf`8V!vhyb@`5o7mrrIy8fKZ>_H} ztiOh7K)WDv| zafTQH_5R9Xl!D6GJtJ07Rj@%$JG&&O_^^w8Fuip<;`boR1 zFiduHr{rQyk``=2 zW6q?VpRkI512K)X@7E7Fb>!J1dGc5~6i^a4>2Ofnqk~I>s=HYVmV`NY0|UAXpY83f zeXzmaBLCP5RFi}BIF-K=iT>zzrO4>2a|`F{23aW6*n@Tai{?2j8*!~gJ4|At903^z z3P9mYmi($)ajR1&3WI_;S>XXxy-I^J)e*&6MjG9+S-ju0=jUboB;OJh-n=C4tt`~} z&>wVpo2*Gh>B3&{2wyrx;RsWjT&fT4;GyKhe{m`%gD1~U!F%1-NnqevC2+*ydp0Qx zW_ZHj*o*U z1A|Z~o#@m0@(bcnZ?pq;z41#sc3eukTaU|5{qqX5_G7}4i6-Q*4PJ%f7^`5%#rm?> z{HIo%G=VBw(}2~UNh-nXiz7lW@a03+^ySi3nkqqQ&s14A9C`NN z@$a#%0#9C)wIXCL5M_LIfB}Jxwjs|>=(%#vPx$dKtf5^!Ds$y%BFujOQi=E{_!VZ# z8T-F~e$k$Mc}DU=8EDRz%LMC=C2!S>Z#VcNnD>QBe!60LHqY}-(wJZkAFoa11OfQ% zo7>``TbcQp4ByTs6Y)*Zx#?|);4=Xj4oE8G2f2Iep|7v+Kjyo;cfTzO^8NU;_TfjD zC)3@?`~ttRu`_Ld_E-OD+ub6GLU@lq`?MV%j7e_b58Tezqrs%D4@|mDzG_|*pE8@x z=XtHZWsX6l7&*q~kb~n}-DO-OuOze#gxoP;TgL!$_VYHzIsg05K1#d!>@>RF81I6c z#E*84YY-{4Hl9w=filAy&sPNM({_CFDt$6mNOZsa;Fl!CXL-}%oj2bO?o(*>ZNADb zya3k|0oOj#fIK{_UALqa|LP-iEP4lR=YLTacwjLv6Btd$xie*q9!$I(mz8L#&-L6| zv_$VFbkd8Os-Au4`Xv3}%Th`WZHWVrac=(tAHzO2?sxcN*OaOQKRb}#l)-v?OcJ{| zCt*P+@}N9&ratiwa7e(ecdpv>{#x52IlA-Cv^{)xpTuat-F} zb_cY-{|1TKLz1lrPZ)6 zXHt{I##=qnMR^BxgT}Cp@{0&TS+G?G@k7Yfx|}>y{`$;rtBy0z@~cFE% zHS59?KV|W&F4{%fm3@dScE+*e&~givLtTY0*~F$aMi)t@uM~j%h6itt&AeUW`UMNeQR(~80h#Y$AZC;$w^)i$FWzQDt-bsvc9=C5s0iO0C>9OJ%kc_LMZ5UQ^Waf<*WUhT^24C9 z3Ai-AD3P@WlM_4mln{{Yr!Y#m=VcsJMTp=txcBS&{nxY&JYrz-0jxgAO0Ysv-dZAd zc@Ci(qLwE`ZYqEfL(R>!eZO<;9QTOIh? z0{haJBuF{Hw=%3(m+M4oj0QHX`)A{F8xH%K(BQNBd9}guf_#Ao(1HaH$E~u=GcppW zW2D~WTz!N}9k%7^!wMLd3cd_j{ML_4IHGT#&_?f+C$WJxItQOL3ny2w+;^-6hZdnu z*rk0=81Pe$2?`>>lBy(k!e>ur-Y0 z6OO`{Py*T-WtzqE@_8wkPxJ_R*)a zw#LNj)sV}@vYiv)vkM%?-Kt)fJUc#VzP&4QhTp)J4<&~UU-Ur%^VIUv7eJka$M^;6 zazYb$L;#W-Ta|_y1CoplFuqpjr|rrYSHO$>?`$0c2l*g#=RjX{;foD?t|~g^_qA_) zyZzDEzl{V4I`toCi#8#d(Vpcob57ny<`@A#GRX@$z(--OgiW`%+Rp8LZL~FEMXn?XSae&hNU#?q*wCk4uSmS~HIBO)i_%wq zOC3>AZ97}EPsSPBysyAOBRpSFX0qjvaU(r!N>8GEqZ zZojtQ4(@V%8@=4-`2JSAb7!aBy}QGfHg`NGVLO1X9TK!D_LbX-9lz)YKDB9s){IkE zemQxnjVcHD)o04DGANs=zU70vv91qLCM?R-Uq%IErJrN9iNFa2m(p8AimjDS%Mazm z1LYaxpm2VO`oJg68FSL_YF}a7LBNzrzw@N^wsWa|&0pvAGtM~Iz=SkdMYm%*&IR9oJ!5a5EWF^28qQCYmEOq1fzlz<+H#U#}lGc9gw}MkU^3MsJ z1_JKyR|Psi5Qs|TFqg(P7?E&X@8(xHC_+JrfVQ4#a$z@$Ql1LfoeTyQs5C8N8+kkN zQsf!JoDJ|mI-o7gxmYCq*{^}Bv6`5uP+?|3Yh}=xjGLwjDpf8DRcX0JiMC&@HIVF^ z!Oj|y05};wOWo2~gSVy%7v*GfNn?449F%F*13E2p80Cn!yKO2mhF1D&4B}Om$_;JBA@V#(q)`oy75n@!JPrmUJ~IbU0w^fK;q13mxm40LjY_!mWEtm2+(e^4?S$1 z%$;L@B3DnD(16_sWXer>MTXf@Nma%d9c-oJ(J-~Gw5PAS@#D=dHMoRd^0vK9c`thf z*}nM1vt#xzdPNgltiH;=zcQ#3k;kI0;5q=c5Amo2@knoU&vBAX=*!C-SYiv|TMgCX z;Ip5MrN8|gD}mLOv32mp0Vq-wsUvjacQC4Bd5Kf+;E78tP#4X>5&ytUUv;NUUCQbV z`gPRG%##@9fa5rDA`%=&E)ea@t+eS!S1f2*U%$r>jXExR@&e3na1~46J~}EbTP8zlUE57PYkXbTMqIA7 zNN?%d+E^WRbw;;j)hGYf!FLwk$a>kF`;J5VCWn=m= z0Cl#Kt72?zXOVtHyO6I6HojVN<{#dab@?0g1H7`uUM?l$z9-GIuY}SU7#7+px0zd~ z&eEp%ExA>JAYG)X?6&G6C&y%tIEDt#2>T&SX;2T!Ox=k$Ct!f4Y^BL1XFv(e$_BJM z`a(+#Kg0wf3Ax(HmV?PnYIKKNqUp1nK?t-c~z9>r}xaXB_tiv@M_=-S{X zG=e5N@~T$mN~vCJBN83oVCXYrx&4j)fMiwc$`M)6SBc1jbE1Aj{08L9*$MsX7Chy? ze{e5}%<7yVheRVMdnhk#CPL%(r~mTL+RolM@@>$0xjb#t$+Y=^xq6X*$E>#tN{d$` zq~AsQk_5;b{F|WpO)r<|D~X|fCv7-&B~fsEt8--TRW(6*2ZZhZ_1}HU95;y{_SN`< z>9}oe??eRs+@}p>yr2X9g_dQ4czSY{q-B6^LBjFy)b39Y!^PqC(Y>3+Y+S{p+;^=p24Mm4nOSII1q2mU(Q7)!TR#VTgWqQ zwM%V~RT=vIHVwmD@bVd(#bx{Qi&=2VsW?nJotxH4X14a%+uotynH#j%4#(}*-Ho>U z+Mw;3ERhu5IwW~IFbSHr+qZVx;VqKQ{b}2$ZfBoln?5_Yha7LUZER;}kAC~K-<=?z zDf=W-dt2?^K8YCZ@9mMC?E!ap+zxiYNBsfoE^YRAx7$9j4-Un<%lE4d z)yulIzcy%F<4|>h3S$4gA9ajY>J%b-}dc`?jRw)%pqt$ zPkiL1Q0g{lge9#N$EkGNWlp3%G{_#flDnj1#fgsPoFs>zJ}wt#3x;$iN*ekMELg6ANUsC>uY_y zHbTKtP6GGaex3V@Y>KQgefa`9N>?gF>cMqu^w6tr?TQI&TM zslNbYK%Bod#U;;X#1L`3ltl;BYnb*CqO?Av5tqjY-%5qBqtDQSKsgnZ;Am(g;P1$hq?@O+C`QIDG(|z-tN}xHnM}4I0p3w z4wpDl1yn~}yABq3s-3b2C^!tzosg7zEI`~1!2gq@Jzz;CLG!( zu~4dPLkD%#B*&E`=~S2MRKA=fV}r2=bU}Oh&ZTqY;nsVHh2rg+)mHL_j}yX%GxmVf zpM?pHIt-@8UT4XqMsQ)Uc@3QK-6b*A7w4S^ z?!{lhjtVG9SKA zkVc!by`o<`ihjgLxi(d|ew1ygdOyJ0>)CStB7eW_7af!_vKCy3kKW3D%VD~N7Prbq z`0U%<(&#fX?Zz`(VJQ(|XF_K6ZL89my2!Z3RBXMIl|C$!IBPtJ!2A;?IDMH%gyTL$ zIIhGK+HA{yxS)-WJ2G)n2yZUn<0swfS^l)yUSAgUW5?}RzM+mKwcfZzksVn=0mpgm zGag)A`lt9DVTiAT<(Xb_+B5LjkyhVSm!N<}4&=obTPT~1OUD@7oOl7QW2JOo94U9( zD1q`-AyBG=D>`P82J59!ae0f8)M#G`WGRcCvDMakzgBOBbbLW4^NnM|u{2^VygIvV zA3i>6v$JEyQsM`p?68(AuoBBOPX2h73GdGKaxCe*WHzm zd>fMeiBAR0-pRN+S&}&72S?*U`}nhG?W0d$frEf%K11iLHr?GL>6ykv)uCt6 z9S8OkPTq`&UcB9Tb@Z}bGrrH4v-a8VerkuddvMt9y#5Y03VscOGRL>$z_~?Py01Uh zS7>X&qaRm=@VUM{X`2VTZAii}fUntN)}B3m(w;o}JnPd(pR}i6eAJGfJ;|+@&Ntqr z;MgBcCSY)kFh_e55xqx0*sQcDL-p>Wt~EsUslSQ!Ku_)tf&a2?sHMI0i?=9xJE_6B z<`yBxuI#_o9)I*@bW!s@0j*n_s58{nb`B=()~z8jV!N}~Zf%d-bZ5{eY_~{&_DGIQ zgtkeT_RzrriP7HnwC%FLw?mRdLb|&}qC`@A4~Myh*EvXiJ04vwukhiXywE6E@*n=a z{ns|}H;xC!c*e6bpjDDDn=uEz6KPO7QHmomw2K{-x%MCZF>IK zHf-4O1Zy|XVd(KatlG6kFTc6%n^kw1KK6Eg&|eb=_x!r_F$JyDHy_@Hyv&c(OM|kD z{R%fY@DY@YFK^n!pZQ{&5q>0B)A;2M9>%F3Queb+jv1dejd(hk{aGrNi28j63#}L+G@qDmor({K-ejNE-klZEEZwug)Kvys8gK$$S;t zGI+2#{iHW{uuvA=@N>Kx%jq*S&!en9u9nv%ddgU#A)A1U{{bKQh#{9e(A6I#(oP~Z zKpR=9sc9TpBX6nLDr#v!3^#M<3Us9MQ^u6R1zgs-BRS%LSNqkBVu)-@2O-$Wn#P- zrg}&~*DcbmQP?N9S8A!i>oJI5J}gtB4*Vn-u1=gBYbZ7-nN{GE?`vd`E0p3p1D>T% zFvJzT(#Bs60`*+-bh&YM9Ou$B$HG*`vJu$sP`+q;$%F5P$qE&G8DF|aC5mz-H)D{ay&Z~jzgTF^cN%wy`~%qYu5 zYa#7*qz=;P0AgbEtUxW;%FloY#N`ZyY{JBZ>zR4VbM{oK)R($2G*w>8ypvh4Cy(RE zfn|H?>2;O_2xpVqlL%z8#F=?%i7BzZGvC^x+-<-KEUo1YyVt7-WnJO%nWHvXbu_ zQ(ocA?V9MS{F&pb{D=CmpSBnvAeMJ0aL+L3inL7A56$J_d)cs0oxCVHnA~Y2xwFAC zyRp>=xM)Y=RUJ_7zWp;!wJ8hW^YO`~{p9y&?eyrFcEAE(e~aO@S8lXR0b&E^K5v95 zeU3pJRN%IkQf0baERwigc*YkwB>|IXf)#akalYcXp66mjm7V%iKl&DEGf7*VokUi- zvIghV?cH`dKLwY1)t(tq^qG=GT!L$TYp4Ci|NXxtS(-Ao&>b`{o}h)h6eFJ{Bj6_x%X2&hR|KmGt=oAj->#rzn4H`>5`uJwOj!HaK<9-&40pi>$3KCBPmTCPL_Hg6^j1Yis1U;7E*y)3$@{?2Ku{b~GO5 z^8&WtW;@~7#9kfP-ZxN=V@Cwy?0Xe)2+T42em71TjVSXO-%9pr$99C=Joff6Kh|v= zXHZ}EUwU%f_lc5{&|mZ)K+YW~PLIgVaYT1~Dsl&g{vh8FqwdDH08cpjC~?>-csSON zu|p^I5%*I5FXOl1QH)K|hq|=)m|u;VnnUWunB>MelfD{ZMxolCTV#1!zAD`6ch z%k#1j+T>G3KsIExzw=4OFwjSxbB<#?3BL4L?y8j7h6(l^!_w#&_k}u{Cx9EO;Z;7B z$2xvCaUgv&pMaSpJcSnU*~Wbnnmku2Z}bS-^sYsj^{cwATcB+NrxIji)^+-4OeL0P z16=F#@<4?_|6DLp&-Rl#`9qg}A*JHd4wgi4P!}rLXYuyvXp43^QP;(P>S3hsrHwip z4jH?&@r5VrF*1o!>8=PdPJxaN=G^)L*#0Vo1jGT@L_s1TNwuH-ZO{uiM6#6FT<luFFbwWE__u1G83OG7)LZ8B?qYRC8=SXq7V%Jlibr zI!m;c$xNDT6o<|j5vGAp>;gF{J%cAH*uWV{qO|+7kL~5#;Hnb7f+bx0B@loQ&(te* z1B>D2D75rRoVcv_N>@1LpZnUcbs5XRlMiXE{sewkAzO*gj`s;x>dveOdjn%8%~){wm&yuym3{0~ zbr79nKJoyDSyEtFo=?G$CF7$*{fIf%YOB1 zwCHG*J|U}N<*L1F7t)qyuvvWSEs}gu&q%X(2fOGiPagEamDM%@WVtx}g>yTnZB5Mr z$^RNZ%7O$<_?0LjU&gug%3_T_p{C*yU4RhnTw#!wv!}4@J{~+-+H6H``&v@ z_ypm|*F@^sljm(Z*aAv7w)punj@S|Vj-%#PbH>nMG|gD5XHvloj`#*Yj12K!FB}~l`h3+Ea4K;zxr+a;+H>ZPe1rMiQeOOzBmgn`VxSVgp5h{c0;?g`7JYjjrNd0 z7~!Z(6O8x_j8>~M5cl>_Wh-^HD0yuS-FCKDK1l&P7diin(<_Wa0y*Xxk~aBpF~HP! zFOk#y1qtgb5|xDPEEur~>tKXVhih$n>Ki6ENtl2+#In_?`cbONhW4G>@qFbowb{Yi z5Z+0oTsyy7J{#P|PL#PO!5U2R)=B3Gud+^QGXhU+f#bYXf;q)o!A-pUo~!NTT>1Jz zbRB#>t12g<~ZvN*1}T3qVeBwv=| z&nfgc^JaeKKQfO{*WWo6SgfVijk=8zoL}izxm7#mn$N7T%_n*ox1a~Vb1=G7SqinE zu=1RNf&`f#k~2WjIfzJ-R7Tz&BXr6XoWdDqz?P9D&;q84sYywyJd0NuxsK2YMFzyF zFl4ZT`kIt9C(mNgD#tM(n1Z4(CoM4!Y2=q+NG#G1%vvbnZ+#sDOr_2V$Ou9S<_eQd zlx7E~FdKeQC@-CCZs-RmO#!9R$eT5&N~Lm;Aj1CCYe;URix{(8X%ro8Ijl>=RTiUH z4$viGUiMAGLr1SR+TJBJQ?64>GRUzs3R4c8>^;kzt@5RBFMGG%Z%&WML}}YMWg-B8 zJmks>ZRIijK$1(SI!hMiVsl03Hv8ar5uR;z_8IY1dd57mkeA4!oLdrBB~H0GbealG z3QOO`QwRf4@IsS8m#|VQJ_BdA3Ryi^uKXiUCpST`ghufw7wAxrIcrUE=%IbTNP~+n zn8_J`2DD|;p26o4mcMaTX_F8=+TkTlAWrAUA zUvYZ-kI9dED<{BU-mGUjlFUf~IK8YM_>|{r7sleY-ZBWq;1s^F#ixEPvv1mKzuFBj za}q*6Y?GCCN!XRE>`~TDeBNs1>eVWPtxVX$v@HE}^j=YuZ~7}5Z5MfaEWTm)kyfAU z@*#NnlJDHY2HfQ*KV@B~&9A=E8 zGg_2gusD{rZ2b(`ifqy-2c%jylTI;uq;=A=o5MZLtNN!a9L5%3O<|y!%<{y zct&R0h)v^rpi>HJbz>WFNSLsx&SWNaz}9X<2YsFJTxc15;&RgWc1LN6PodI)O`*i* zSUl^WvsAziAK;9hfSvh6x*0c;V8W86AHSXKwHe2>)Jv;$I$_^Df5U#{%hm_uXXH2k z{=<2Dz9RU?4_}-uT3gKm$CoIWfUFGUf#XB`$}v~Pe9jBra~n1!%t^Gg2cJ>FBU6@H zH_r@R(Y}A~w}KaW(hg*`{95J~lNIXd%-lHcPT zZ|&qtl(O(!U(&5jShir_IZnYWj-R)eFFtA0om~>7r)@raNn)|x?!5M9UYqZ0`Rn#4 zgDWf#d25T;%gbDKl&=ZN-p=j&ZM?mU+)mr)AN;0$^3%U8y_-vZFoB! zc15{wyYrRp&S}1It8R;TC56L=m3;-?`b`6G{jYO{z8oEskoo9`v7YOQF_05;&TIH- z{k29B{bLvL)!5aLI``E{@vEOGzV$>&ov;fR<>=2P<6f$eOZNHGxAjXBJ7l9A{a#q+ zz}O?O!w2&NbUI&~AS8}qYqF>5$M0S1`3jey?GNi5>qDHo^(lo@Iuak{Cv7FKs@E9k zXaDFH-`BN|uBkK*5Vmg3=qr8;8Y}r!blz=JybC^Y11mk#PXCj6lYQ$dwoyLSPG2TX z_Vr4chmmG%wR|#2=wJ3_LwmTZ|F&<>SM)<7vyN?tCi)3Yn3W6_UWcf7J>er=OKAb0 zkI~GRtE}Qu2Fh0Y9s35}k&PHr9+3W(+<=vf1046`C37lUV}y!Ht*s@d;zCj8pm0(? z-o^Q)bS1%Q7F^cnS^4lmk5W!5BLi?~^Ukw3$*lF##CWQ^FSHeN7RPVbKNnQ!Z)|7$ z1IC;%=Qwj5{S!%PRHbw~NNf=wMQ|ABLE}6i4g(skZSoa$el|Kcg9JvgSEU7ymBPG1 z4MsD$Aan((C8i~4GU%-nHaP30ATn6OL+w$J!U(;r;-W(twG$XkV}MrJEk?(>p)s*x zpvs58Twy>674)05fLA&?E~GcKQ}3c8Gzzn8Y4Q@a24d@6S)#M}>*J>)=a~Q2In;A@ zTLe_cS!W*@;1zah0DhGbO43=!Xkog~$Yb=<6H8@bn=2-c02iww7mc^@r?6YaapOQJ z%Izn>P^Oj@Tq@wJUSX|%)R(*g7l6u6zH@eoUwC3Ej@fqbJh~8``&1-hQN}@`AsR>{ ze+*MtWe>J3IU6WCk@o}ECAxPXyHi%40j;YA;h=>%H*Cb0vCNqf#pk}L@^16kOx0|(%h9|sz%#WoTe2iAr9l(}UGco|PjR-PF$ zSxI|u)lufG{yLH~fyjf&4B$euZ~YXciAW|$V5pm1m7>3AqlJ?oTG+~_b0P*wPMFf? z_kM29Zqr7`mNTz9743wC&c1XA-nzBOq{n0pT5vLc=s1(05(Q2#i(KJio9D{-`3h$j zZwK_sdfrq-opxBydMYWkz)xJ#O1sb+8m%{|fX2P`wzD&AJL9dkMXs_?7Omu!H*F?Y`#7+BC~(}1&FR*&aZC#6$SW!ZL0o|@l;~IAP~(LO zP0)@hR?Fh2Shcm#sO_;ep%q%jTo!THxY5=^yDj9`X@jjkOCM%`Wgw`Wt<^T@=SC>f zDeltUCcT|_i#r$P;fOH#lKxBQ6v}hU5PQOtD*G#ov{%L{LtEHWCSnNiR+l#F_P z4tUA{+X~N=X*-rV|7e>o=kep%fp|LlPv&dwuYY^iP8RC#x*a`z)>Z`SKC2b`ln)x4 zJf;JSe)IgIZkv;P+ZsqGh>M@%2O0VteaUh;OClHD0n2&Iw?^vsD>%@p_+kNdU;YG6 zt4;RR<#jvQf300Dk#$biIZsg2jT4i;C5hfY`>X%7{n2-RklS}055oTWi&gvN_g}5C%?Z{BL>wi0jT#`wPX@J_~*Cv#8)$7C45NRRS$m5-ELW@rRwG zv*YD?`*$C_#J7MGov*xVM=-Oy`=E{RVfhFv`s$xUo%`lPfX8+b;OWtecD0(f-NW1M z`LoX>zr$M(+xFo>aMzrp{b{)RaR+;cZMtzM|lHCxb8Ya2&{^`mPfp*KKxo6gc|B*m8XCMtk~%WLv*% zYhdV~y`o7-%>Ffr61dhbNxZOA?T=V(ez9!x%O%Ilw#2qPso1LhuMfV}ho znrpl&6~_$Yf&Gj%+RK~eCC8|M{aWp({pT(lT+}NukM)J{4h5B<;d7CxxRgP?BS9R% zjhy58Id*=cg898@gU+r`WMUab+MD``qhMLi(X zhJS3pj_jl*@Tlv@jIy@9W6nCS0=i_phdlL2rR5xp8@Cdk)rI}_Ez%}TSL3Q&>BnYs zf?WlngYe_r2_BO!zv&p-fTIjt?62SUQ4{Bridmrn9&>`tvTm-_dJ}K6@9pMSjIHQR zKr&bHMg_$=4zm!M1}ImqInI?4pv1}Ou+vr{R=?2bPvDf>-$}0m0$V5_g`pxTQ;RIZ zNMrkpil0{tsNv^Xj`cjxwaUaKTqmwdQ0Sbl8KMe>AEuIHm+OXeY0C&B&I!1-$sfx0 zszEOd!4=4&r>^1^-F;9WUZGn7r-rujR{@26gbNG}p<9%T12~F@K|$thv^eYwcF%mr zz!(%JU@FR&gm}A2KbSSHI0T8;xoF6pLByCMS6~3!U_tRZxS)VlYD<3}sR!F@b8eHl zgWq~xgtDpZT_;+wm7Bq9pPa-fT^ux&X~4o2zYhZEN(#bA!oqUpOvP>n4`m5rIqu=* z>{i!yjX`0Vlby29a|rUH?R9N)>q`a|cr3F!6v|%=9;Ywe)~8L!k9|FMi6emSd<&<$ zea8VA2PYkoku+eH)WufV`t!`BL63u48Rcq_XZt+HamF55wPo?Cx6%ntfPpHWj2~bp zm{K0J&uu2OcVdlgU|8Xu#j#O3(TOeZ4`QO-XiL4$i-{_D z^))#m(D9;=3VqVn*^A>Swm=)lTP7Nb&{o+vHv37S>`%!6(PMdIU;nAyRljtz1%JZ3 zO5kF-GNyz&nH07(IXQ{jJHUiii<57iv?^Z|a^#7I|0i4j8Eo5@-S=VR6`P_Wp zy)SkS=teg{0wM&kC=x-W0wJ1|Orb=}rX|^|lFB8O_(7`vXjj?Al2!iTvRxEKn<7oh z6fN11DH0+9B6K4+8XaE0*Dr^g@5%dQ|9=0m_kGQ<_E~48ImaAnjycAhbIoO1>Cl3x zQ`!=F<&?9jC>IXt6`P(88p z)(O(MSw=>_OsB4MlqHUyiho`>w*+_?8%qf~KLXNjCdlG$HW0`&%i$QEBd;%kOMB|2 zcEvKdk?D`Z<|mZYgQNpDPuP`F+9V4Ehr{tg{n~eSYWLtQ??(A?WfBlr?KKKA1$u0Z z?a4PNcG+?lMv^$oQ5(_=9GLt^I4K*RO;gzRXgeGM3hmA&F%9su0yMw--1u?LETa#m z!wII6wLO4;zQbe3ko@r-qZu9eB|BxX1*FmGANURw`J`)UWdt1;Z8w4Ev>#VpOh+y0 zm6gu+ci(ziPj*fMlVZU8nBtdeWpxAF*7kEpcbCe6o3hczN7 zy7Jufbq+k=6FVWujICi;M|}6h`aarNtF`U*+I{k{zWZChSnvJbFVus#eurT0koIY* zmN&1}=5sIA+UCs~u5HwCv<7Vp1YHDA(CQ{wr$TBEQolsfa~&*j_XF0Bo~om%$2er# z21lwQG*)BX4&br(^{Gx=os$6V zi~#NAf^$d4C@&f;jS7Z8?Pl6$j@pR?Q}E1SY=F!YlsO`cJ=dYvt{ZGS8kzu&-BqYt z(5)}w7u%F4`XK6n?6N#{S)Qjuh@ZEDiw>+i7qOkB15>Vi*fz(1u{&I!+1B!GYIDS2 zdtpsPnn`b7?Yex;HF%mnjX&S88r?dMdFtY@KP zB4@X}a}9h%7@DJRx!<&V9orq)leWe!aKUS$Tb3bOZHL0m=$)v=-=JJ=i|J!GNtY2E z?oUT?rn7!X4t3H49DpT0;Mxx4w3W(@8@A`#Wy@Mb7v!CG*Q2s>De)QiVHbH6BzZ72;^q4h;u3*}NQ5dEL=R!hr0E8K zQ-*VXML$YtI`ND!K}+S4dB9M~LAZtKwE)5l@~Sj)UI6ChoVa*AP}Jy)9wm2aWoa#iG zp&5Nhj}qzI0CH{Nkx|F27_(bW_HdPlHc-bw@|vG-{}6 zoO+{PC%Eys6+BKqm63GO&oH;sCmnmshB8u)_kjqlT(X<5)2nJZN*;Np`9&a3F=flp zlt3bBl6P@HNFT@5=Tvgx$bR`Z4aDSs&aHFo&bx0T(~Y3%^Ne!?kmv()vsYF5WlA9U zSZ?0`GAo(VIl{dd4&?6wQ zDU8zI%%&XRs(%VAG8P4K;o9;iQsKW&K9AUyhx|>WMp|u@dTf9@?djGAI+eIPR3fZ~UzYT0bS~ zJ+V~BQl7xWl!&CBJo;wM8&CZJBk)_s5P74+$^~jKB?i+V1pwKFZV0dwz2&^)@%!rU+;K z%B{dZINT4+v?Jh>cQ8rp;tHFi0Zw!~c+$SOFk8DPm-XSnI5aE{eJ{&8;^>4O72Ww{ zeKD5pdajL!M(Zzl*_mZKEg}gxfV+C_1_97P9qu0lHys-#Vck#{7Z;X;+dur~y>#fP zFWTUvgTorGuGjJ!fsRrllXgu4l({2x!jmtj$l>hdpq5ALwfE>jc(J^GvzD)1g?9K3 zuiECrXQ$QS6pn_&+TPl%qy4@5&Tsxked{-VxgNg%8qW@DZS@Lx->s{6KVBO*pC|Cz ztc8_T=+}mH`)B8vaOIVwdfGI#Pg|v3>Gxfe1e(}6f7Zrvly)WAwy-~-+|Fm~>vRgN zn?bybl6W=kAhc7@N?@Hdub(W?Nwr-0>*%tZzRKQ{qZ*$o4etYm@)wYucqmWP%d zq<1Q-JT(Y&%IEmZ0G4ac50Rz1sh%F69TJ#veNJ5<81s_>jQ41@9KM;pm3-w-+KX80&UPB}m<56Yep5k>+%?0?Rr*_50M56v{L8 z-zsSuE2cbYD6&x7pe;j|q)*2$LNgdl#~%0F?vWUrZ5L0VQ(kFz)JwC(F0pCPwJOe% z=ng$CL;DS;$m}N4WK=CcElz9BISqlnjJ7H|5}U?zuaSEPCAR+TJoh}}G;JXDHq{%S zpHAr`Mb=~hVIOO|ZF{HhIJv320!k2x(t53Z5eeI_e$U<{CIVg3WT7Dd#_ok)o?Aa; zin>Y}ruCh<1b3t{nY2uKl0goxLnE*fL;+j4ku2~+lXyAhkxX7nciJ-Hl0Ip&%St z?2G0xK`-f>b}-3KdcbFv1*L#)cwt(oBdwrq#nfRyIVU7lQVL;Tq zJPERvu=3n#M(y-I0_)J=KTzqEg?oH`k zgVY@XI^8O9>r*O#{1Sd_7LY6xKFddYip6XC0oCZ7dt}rN`!vYZM%fXdq1DuNa6q1% zi?4=)LZZ_X9TW)H{L7yKqx7Z#w&;$=(sU;CfUKr@g{?khL;z8yapHalFtCf~(E*Jo z4uGKB5p$QFUD?AY@W^NtFxn6{4(UnbJiY1Mw~V}~%XR9EJypP);$*2#FR@O_EA=)` z25E(8-M1&WYcVuO4qz0N?47dyH{SVnh~zpU7CgA`^YrQ`Z}TN~BK22%2~wd^+Xc44SKKpqTs>+)JRz55 z^YhAb5LIvzRtn@f4}&9D$*cW5(a@`x%2OLhc5#>`fQU_#2IQ8;4q9!bbWr7U8Vd5I z=NQ=TiYs!V5X@Mj*GN&Pu&gvY~I(d=6zi7vJ4o)6ONP3 z{K9v$o=HbOb0J?+udLr30d7|Bn8r=s>pc10zs8M3l#y z2~%d)QS;{>vQQV5Z}?1l0}S(I^gB*a)8P>GFtnCZ(&O8r}!uXpe5)$1P~A}eodcZ;BHp8#w# z^hmpD6JUgYXBmkTA3JLN$g%u00CO=7I~cdNuY@S4|46@`X?Zsa8I4v)`5^P_-~BFu z*H`Oo0t)*00~HrS;VsEYs$}U*&WL9_~7u!ph2P;1m0xl5s9h z>bbh)sE~OhKkFmPGC0Ws<<>$GazWcIY&>);$AJVc53D+F6cg<^@Od_c=koBVCSoIU;s;P~(%` zIvnqEG!S!o;!z!q_p<e>B{yyW8%c%6&g(2S`K~=rz=I4MXWCB+vAqtq z9vgH^-*og&9)$;#+s}c``3#Oj@FGpx+b+7{lO(VwxLTJ}$1}B;8`g7imj-d|kp)>V zAQFmPvxrO>IF7B%+%vL=!M4dVz*M=0h-Y~ek__`6yJgBGogHqIf`f+KjptU}>HA(X zTBfP6-4L^JNTu`?Vsz}pQ=DR~z)Sjd>}8sbTowd@Xr~{}_zoBddmY0xWq2TRrbABI zDIdn2VT4m@P!zYYQN^)g0e;imN)x33w>CIF<{AWJKm(JqD8|zAfncwJmEINbH!zTY z+_I23roL3{RFe6%t(slkuGtX{)o_E@YNamcmudV~X(`uet5@q{enfeTG_Jj0vY*?K zW9(_}>wIBEnqi&I4*F=?`IS1I8IabUfQ)?xcr$Y&bA)#6C6w=Nf!Yj&_+ zbAvU4gi*~eu@6>h=tkuVQLsMWAdy}K6B){q@PiZI`B@y=uut!yl%|vH@G}pfg=6H} z6-PyF9>N>Wv&xj$@GXuM*Y+xff$lu>IZu*4m7ns%YjujBMqQ)hZz@YQ!Mx^4#Q~Jq znMMa|f@t(!=Qlk|sT0;mjUl=c(n-M41|#}UTI-Ygt6q83G44j(A}K$W9Nn;@YqWsN z?L14p2wBZD8@TT2p^kAsbImz*{(fj+lZI?@oZI-@`((WdT#X$-J(?oZUW6w=_#%8c zB8_S2c}6MRBdK59Dh%)X}fx^a&gJgm2!A8krwjyYV0w z&%2b))xiT#s1L4QmYE3Bs!UTx!?&!Q$VYzOl_Oq9pKZ{{<9U}wnbw087*23!!W;ez zOxhX`^6+1qrk<+L-VSa##pY566I_@>*^xKX0?BCOV>;Ul`7T7n5%?M1W{;|RpFO-M zZJaA~Kz){?=s1AL!8510%$J`7i9H}+>bW)pnjHN#$dPZM58TtCMnVI_NBdP@eRZ$C z`Sxjj_qF#@7go16Q@+Z0VTT2c?d2)dQI@o+p9W^FIsAu~j3}d{U6a)P)-@NXa8wjU z&AHRc(@yftQ3Ug6WKaC4z|kY8zt}0_b=Xe%?6DQ_`V5D6>)M^@fckSXcA8$ddFHnR zWp#N}Pxkie2~P9r`B6O~csYeAdu}16E_ZipAb#L&{gPh!C4H?5&}G@cH7Jr+XP&6r zd1uFtIQVFp=F@pPyj+&Wz*FXvx;T-ci{bp@H{VKI)FaT+Meuw!CLr2~-YUI|lYVa^ zeBfG{cktr<6Y4r`6*3}2mY!d`aa}_kd=1zRpi})_b-Llxr}d3r`^9?W+g~SW9uv5Y z>c;ag)wP#CUe|8lsm<-HwYs_<8l2AP`)1>VUNq(8_%wkR7yMZVCQc_?R%)dDsjZJQ ziN2}O@hiw<+UfLqm0TX#UbHV_ZR($!Y2BTUs$EwWazi~4Zr2px0`DBXv!~vVUH2@Q z=B4tOIYuuZk(08*W2@mDI*Tt6ABKR;GIa_qCvBhYig(p90z?-RuyahF`!3b^_=F(& zq|V1&bMBPHL#HYtH>X36PtmWF!;DOxaxR~Jk8I3-ihSertLxBbIhLlXNB*HyJgn<# zSZ}dmrjvK6A>Q;9zI#wNAWj)r|GVAb9^jHTJf}4MujJ=H>2qdQ^5-2la59frc+YH^ zX*9t%I0HY=_)X<1j7Hk_7Jh=8x*L@hht#2u@Xk9_o&>)92RDu>7$Dt=CcUi-lIneR zCL@H%J3ejhbs^4_Xf(QgX$)Ia666K8+$Jq{M)_JF!!ye;Phd5>vdljxW{aJX2kbrF zRUclykOp1C;7#&2EwP8_PI#36!fRP8A7yL#J}{qpm%729vTHO*i%w2`2bh?1k#j1d z+N1usC!;w4sh)~|w?WdTJSMbRCP(dpLQ?}$pKNDRcGGO$sjjr{S$`;>{0Sbx#rk78 z&)P7+Pvx9Hwa{Xtc9;QNU z6WmT}RxDwY$W$2e2_SGKj(gs*lTtWm7Z{Ms;|MklHuu70gy{L{2?{47WHOCP=cbU| zVsL@01U$FF7mn8|r7+}#3M0(G1@AbpoLiYybjy5JE_s7{jBQT`nIEjw-127C>eZUt zxLxyG&(*^E%^I#=sYQYv1E1N2A%WNsKA{ATbom0bfzqt=jJZ!RHA`@GLBQq6mQL_F zjUSN;e1pl{JEK88pILw>IzEoDH9Rl@j?aKi!|A!t&ne^5(Xa$~_Jq1fgJse%6P(Qv zq4}l5qhsXH3TES)(Ur(ezS>wvSkZxYI@BAKSH8QEH5CRq>43H@ zx`J!4U<0b@)o}OVfvKCo(6Vsc&Z9KKj)qbFHqb-{vHZ^+vj_ms1|5j#;M9DbqTfvdqAqIuS#yK~YYeQ+B?K z2mKl@aj{b+hS)Nb-lO>0(6du!>LO*z3}159m@E61g$P(rF7ixg)5gaU9XoHF@+j|h zG9rt~7Flqd^K0{RKDa9*WH7TB-dk7oGNU`_W3Jsqg)Ma)oc#rcyyT}gxH)w*y|--5 zKj;Hi>`%xi9k|7A$V>iPhI*iWrJ>9=(Fu_TjscD@#A{KtyXkZwZI|50HNV(`a^s^p z4u&%mJmj4TIJAban?@e!cymX3qANL~w}E5HZT}K11+Ok3^qXGA5Lfjcpm7#CT1xCY z`6WlPQ-zdj2`(xF#ALldm@OZHvkLT)?w2KP^($l6) zXwhle!-@Z`*Y>F|O`~|KBl-h_)e$82dHAeO!B^|MJmG>i^(0f`=4ty}P(%K$Y;Qr| z3g_KEoF1QHL+A6}*7v^sdVTxXf3+Upf42tEeeLRvy7}_Q>efrI)Rn7OGkWQ?#HSBF ztoY~E4z!JzV45AYX1pNn7Hi}o+9BN;`N7WEi(m1pcDcCFv-g^_HL zIr^+F#FwGH^OXU48E4y>E9B)diMkByh&I5{Sas29gIPGmV4kvsY4DpeN%Le+{hZ{X zu(?Icpxo%B<;#0;79V~W*otTLkY2sh|BF6ihcgO%c7*;Bz(db5L70KC3#}ZT9MvKC z96E)Odxu>69@&u#eB}MIBm5qxOrpEl?fEw_1tz<^^ZdkfZG6b?_BES~kUsLocE>5~ zfW>C}HOtPfomK5C~dSsXHjIW}t2kpqnAh-oMzZ8GP&4pTcDIN)bG z{o|=G6hDc-?;j!ad5P^7(&iQS(lNs$N7kh+^&z~m97$=p0FVodvA%IkUTEcLKGV3oeS9fy z2)FSLZxzUzx)ZqGCq3R$6g# z2s+Li>4K!3VN)3duHr%pImwfB%{(&;FT_x$y$PvY3Rxy`ZN-a2MzO-Oba#c|OP#1K zSFNmW!nda`f_s+QLrN;De(;G9fP02faf>rZ!)UKN7)O!fe8G>cRmvSIYL&UZIpFZr9aBW=DEU~bvnynxh@@LTH2`d;gvdDzE+nj*K2X* zW-X33YJPd6W(cZg3DTUJ;WQ*Go(kU(hZB;@@v8f^F3g=HGRRce(zq4umI z24LE&s!_92DTh>8pTSf4qt3{0(R;QjKhl^-o+sEAck$yF;~_66d8d`#UWw?I1xyaD zf9)hqr>e+*(NR{G&jC8Sf(VPdxi20DQ#xGJ%{1vbG%rY7N309xk*3h2VeZt?pEyYz zt=yRkNgDakw0E9P-#Qd02ZIs5McV{LT5+UY>!$EhHZU_{1fCjaw`e=YCZjZ@aj9W@ zCWUu$>Z)KmbiieIQ}3hu=&*QsH&X)Cd+LUHbR;#R@=aVln%^E%M+wX;E#_5|GlqC+X`GH=Ei}b3Y2|>^319y7m+Dhr`q8@a{1<9@c#GUl zqg^DOsEK_H@q04j;m5hSb-2^pc>mv;tM=6tc*4K%E)r6c2%U^Vd zlp%&qHLo?Q#lT1z#?3yJ_}0< zb&7P5(%Hr)-E!SFD|!NKrcM}GPNzw_Pq>%r5r8VrURtv1*?JlwB^;V_GJI5m0(I^xX8ljyz+ ze*o*)>2U;L1R%q~Dy4$~?a*+z7F^}2@6$Prka(ls_^n^B2d{sFfb5`F);8} z^$~1;)2RS1Cns2E%1W68u2b0(aSoTJ1h%WuX!s z-v@!*k52N}&-AmzkF?@Q+UP&^z}@n*fwO){I-c1j*SeITD7431~>GEJ%K(5T$ILG|Ca5UV<2=Pn^LB5ZGrJf%Lin zD-NK_A>B5(DvS(*ai;S-2Cj^hGOUO?!=&-$J$aJKNnT%s)}a*}`RUNUf^!Mrxr}Ia z;5ECvSr@a*b-uV>7fb5|Wh*s9<1pt=Ly&i{5VT6#Jc2OjS2-2B^jK^hb)MVSTecM_ z_)VUNZZ4$dh#N=n;K-p~Xf@zc(G1X(^$E`PIe}Q--=eGw%Jc=pV@1mI1ZFs(3pD5p zOKUg>H1zqFlOON&JwJ7)adR`M_Ch+sc<|EMiLNPM#mPU|okpgotgw?#7^wi0ie&cO z&lMZ=$f?ls%f4S5!kv8uca>H7Y z|0d-+hLFZRP8z#u%|lhFo)KI<5D<->a))I0Bd zx1K(}Uv|5U7OvLt^mffWzFQ{`UZ|({H*4p?M(ypa)%a+II_)%9oyny*mFiGfg{7lJ za0k~JgMaOU)2rYy2~3rS2_5a=4Libvp_pV{K8yXvcY#xtLH9pD~~d+Ztf$VNIhdunx9v@fYA6Fth-MFrQc%W9_f!J2A1 z%V~WxsUb!Jpp-Ao?Z9vmIBIFz`lcQUanJfe{)t|RgFFj7VX=wov`w&-wym5ule5W3 z>CVXb=iMq#K|@sREC}xe7cdPsHU!wI-)7*y3qy2WHJ=@XI-v{oXm_?=zmEg{ z^te{mSL@2PYm~E4`}j33SBYUPD$Ck9t`~H-~os%~~25?=_KptjfkZX0VNA{3MY#+8B+zjv%5MuY% zuHVU2Ip1f(IFa8@owkS9H&*L(e~&=uygt9RT`TDMU};plXD);>TL%O)FD@_C(t*9* z+*|B?+CX8)p_s_XPg6Kzul=#?%wFKR*UBmB*bKOyd+}CnUfHT;0vPYk5jbhUBTkOL z`pt)M22G?s9fMoG@3ntOz_S4_9A%@OIff6Ish(~QY2c%i6h~b?;mi+4w2kmbzHh8u zuaof@{+ts)4eN~aSAYH2>cM+&rkt&-x9i2v{&2ngi7(dD!k`{Mepv6k_jc{>?qcr> zSfkn^0C(XY9meU$?QP?Alze~7x@V8I*VbS4ZD|s0S$|_=wSW9g9kYx!aLlL#_tI02 zjI2@WfwUP+N1r**>a*H-&i#0HM$N2K!XS?Uvh{86Uay6I-v8TiY4sChW8`-0$jXDQ={h*uAt>+=*^RKW)Riv&>)K^@4_sw8Q`CxNQRM z#o5VG?6#{`8f=ZdM>}I+=Cb!$%mY~-o*tl&do@1auknTVY@4VzlmSxw+Fub@+k*s2 z(3`q0KH%_d!3boL(Ia>-?$g;(vE33Po7l94Ub?CO*14RMC;WmJp~>>#KLB}#+l*7Ct_@>9QTAC-|h6xl{T?Zb+zGEx`x zXw@g$(wOhOia+(-uG74tqpXmPexgBEfTkSrX&BLeAJ`_7#@yC3_qO-6A?e65UDKMD zBKhz=q{(~WpuYJiyd{rYcX*k+>u#?u-uBFNqT)2#tXM1Vq!H(IXh5I!#WqY`vfQrU zUB0{ve>iu&f%e4>wmQ&T91PJ%N3@kWdGbfwq)pQmgWlK&pYdewb3gU+S4`AK1_p`% zkD{Ogw_F&}8C6`KbJJ-#NuwPngSpZeD@=dnbDBmR0rE+t$dW@Dr4qSCStk`=BS13I z0glfhQezIBu7onf1l$uz61$>~3S>YM<)7dhXG+Ea%@LuQGlGMY0gmLv_^|t28XVOK zEtW_=ox(T?&i_=cDXVR5D~!YQ-i*T>I6S8kBw=7Qz5e3VPmH4Zt$g{whLYOK zE6yr!^H`jZb+W;+SBgZbC$OZyU#`ReN(J`|kq`vz(mZ3IXF56w$j%kVx&@$@`(X0pSQ=vI0+#m_wC)d>nW zOv9gsS7YIYvT>x=Ve&SjZGh5K9$i!~aMpqkvLdYoMW*~tjx`!nJ}D!ENNLf)AXm

ySXA**G@zFlv9>l^jvH`ssw_v?+{eYM{H)@ya|)rWQO zwFmX+o&9?HE{*%6r8?fhaXwtFne&ZWnz>nnnX5IJ+rlP|z{^$1mMD*3bQ1db>1fC| z?`hw3UcxuH6x~u*{J7h)4x6~v8IT=P!F}t$yl%VXxtc8$|I0S@qwAaLrZ&^fQ3CV1 zsT=k>cG>Dd>$^Pfqm`ZVl#M8mE)5FzM9%u=bD>)kavQj_lk&vD`|<%`{meveUW2<% zSmzTK*PPopPvsfANdh5>Cl_3j$ULUS0(WmGJCB7QyhCo+8{xPm0Oy!%^9XkWLtT^y zpu@REQliO{W}S7=eURnTLCP`@4|ePH*l&RC)iKWJ(hys&t((;A zW4{e1AE3$iXhhD=wBhn{ogL$>PMmRJ*`eWr2zauzJBzixxlMBFuJ6_y9o2ASs|H(F z>y-Ln@aD*!?_>r4#l?Ez>Q=4K&(x29{BFH6TBzT-_q6`NAODl}AvA5{=r7|exPa6@ z`XBy&-8gtqcb~gn8`n1B#}dJq@9;vC@&-rWbxLr-25RuUb)ef=oQ+&S=kll?T#V}O z5BzxT-+PT9%tf2vC0QLwdie05{>DG}4s_4ehycxClAN{k^igeWU#pGH4R}P5(K!kaICJhsl&1;@KP^~Tq~T6@4$KI^yc z*2g~g!?khcT0MI3VLiI{ZasPY0Qif**r-i{)1E1#9w~cmt0O!enD(m8){55c)Kz$x z@32wNW0N5QE<|=Jq^ZrHXVyiPH2gF@!MW`lN}ye_o$KjolR7~e^2EBK&7TJC2EfYT z1h_{B1lHiTFc{VRXjmr%+NR0KB)_c8JesZBpIJlyd^d6t#~-}{J?)88P`eFQo?TDX zdCN~-WlNisdPqKSwC+k*0!uGU0}hcrn|0BOn8UMQ+Z<`~-6p{qG#e!9HJn{I&D?+t z-Oo41NCSOjd{zeN^GtahC(t`3V%AUbL+8rJ4ve(1z!X1ip#aXwF7FIR<-2n8QS2=A zN{0-He&?R}nn!#&nwaO-0r?p=x~3N^?N{4-Z}HDN;=_-mZ2oK7+vZ8rB(H5zxJ~L1=s$4bUf`md zGR6^_fZ}m*nUrhpG#jRemqa1KZQ&H1ab^|i#aDa`&OEnpOR@9bPXBbgJ3WwkBir>) z7nfXZ6?jPr@2o3qb_97pfu4Hjj2h&xPkMaPoyyh_`61sOwNsx{|Ktg~zIWGC^qe3_ zU&+~JGQfAm-JIE=ye#$1ASycI4xVA2^tV0GHcyu~f`{#>wsvJJ^Q!jl*<Y;KNSxre}?ERK^ahEUSaGR2X2Sitv}f zje8Q*s||vir2xZCxIhatGu@Ab>0#yP2;QYHzn#)Jp5t_#az9QafXxfMI1%CmK2xXE z$1+zYM+{+#e?SEn@$o3mDG!E=g-)B1Gf9&^_@gjg!MnW7FDFu-!9mb5ke3;dpk7zv1<@a*N(CHd!LlkfJoV(r@BRURw(%!d0Y8F zzy?str+7tW+ETd3C{{ zUW8*r**Hz!BVkHm2j$q-}ZGxl!iNN>O;K=NnRDt0ikT!$WU(jn+zr+E$z{F=AQr}eArB)mkq z?8%(gU(;svM%dg-Ppkw>8+GaoxoZdFu<^t+@-q#M*TSZ(B&Wsnp5^o||64xOM$64n zW{sW(&z>!fuPYzATG|ZG*~K9a>fV#u$Ju)F-rIHW%{S_US6{97zV+>T_dBoFyRW`i z_rCY2PCq!T@l%}5)2p>!cWZ6_#oAi@c&#tISnG?g)at@*9QMsxm|2I@PDcZ~3yi8| zu*(-}CFcf}(#do1?gRL9oOS|*nWVSTK$2W^ooOB8Uh28DN_We*?W1xtuaDq4@HkBw zJ@u8m%9eYaPzTVKNq(P2H^>pa=R7(}0(Hka5F2X>U@J?5yHp?#!bbaYOZHP}pmD7@ zgzrTf6ktn__({05TWjZNY1Bz2E8QQ_OaksnvoMvfI;Z}Kr?`ojN7IO1P~ew36nH#G z$EMRs!#;3K+Q1Khr1ZBqw_L-;QN8!-PVGEAtkv!7H8)sDyK(M2EPH#kx3?QRaD2F1 zN1S6A;hj@+XdDms(dWxLI65EzI?PMxS;)e7!Q=ytvdea#W)XsMU7orkqwmLBgB#b> zDsXZ{(|33b^p^(9HCkS&BjCqL#eSy!L8s1fOto9ecC<;bh3=cq4+?L*@N&&ygpa|~ z5x4ZVD;#LQyS-U|>N7X%kAC74b!%(A{_fX)qYhU$>nHxzf7zjx@M_yBeU$aff9Jod z8<*p{e*J1)xp}Py!$IV#&1n7A9*Z;Awp;LoM=2*GJe>P}u%ixR0+~17`mpxj_+||k z&hlQC`OWKV0zdz&Z`E(V^)&T0J;2bR#C9ItuN$|YPiN!F5rGZPns`W;!G=s(zj}qB z>M1-quY;ZYwYss5%yw&;AnFQ1mO6P%+VB4EFVz77$!KMxZoK%3dWqmmoqFfhZ`70f zA4Vu4K^<+fXGWJ}^7*B~TpIB5{unLZ`Z$g+-JnaL#PkCVa4+pZ10;|EaBR zK9Uw%Q-8^ydTU(|+_vR8=YAH>5F-k=q&Sh_pe=6Lr?tPoADwg+VjVrFSatx>^+(yL z$2Y&Qg5E11pZn>TzmkT4 z!UdoKu*?`@%jSsyqlhplqXsa+0!7+_++%oDhJ?>yO$!~M8V7-Uv@&#sH<^qOQOnjy zY5d!HGmZJPBRT#DpBMZ{5nfk_3BP%uywVF!dV3zm&d=8I1%WuQfyHyq<)N@t zWM86n6F1Xo2o30*igREu9toXOt`cVIDL-W)pO0_|e2*dTLj?=gE?rZhvd*7-Dum661h=caWE zuA^gbNzyyx6_ZW=8(Lvh0+_!hzG-{KD2OfXg zkkk=ri#?Vfz@6%nut0p;!#kzRpi!FKw8gF*=9Br^#af&h*2>m$z5b0iDRT)YeXU$x z`010!H10<flDr3)%4) z(sSD3((*DosXf=u>vWNpV9&rT-%L6_u4RIh;qtH!5B4M5=mq@9cjPGJ^3rdIfj0q^ z(}2ap?`3UYf3A*p9s@(Cv`5pNaw8u9(;xa&{m66I;mTtD>hFB5e&x;g>g?JJ^+P}N z({)CD@ZFuOLxMnX`2YRwzg{=72e)rsugz;)&@_O9I_hm_x(!EWk)3tSYj{iB9KD*@ zDK2X6;-t==yje%@zfoIPsT(V!&|@dbw_dwnfAtq$uQT#$YvQyJa5?HXhNc_O-GQ&r z4Ly#q>(ID>gATGC9%~z$_2h{G*l8W_Kg#H$ZOZ12+Xvj93 zPuI(z`fRS>`qpn}k&=a_L9JcCQES^<<$Jv41mWn);xfENFD{YC89}*is|#{uxPr1Q@AengYktwu21mxI!wn|9Rc6`|aqZoX zx%QQ`JEGgOQ#jWa``uBmp{xBOVQF`?LEl$TDJON2``Qz)Gm?=X_0{~7GI&fngDX3- z+9vqiI!vm-^C++NClY{hZd=zQ@oiJmu_eu@zywsD`^4Oq<2`|-J(WJ>oLODsMOkSZNN4$+J}a;7aF^qm z55&y0;b9k+d^{yx^R`zL?()RReCm&Zddh8*!>88ekK`oZL+i9`^*l()FH6z)gl6@Q zXX>Qs@*W}W!~**af!Caaxxg~5BU<4DzwQihdabx{oCIN-YUSj2UH!gZWD&fnO9&qg zPd(5sIVJ9B``$W&PVQfI(_>SJdqdwfq_oUHoE=BIjOlfhR$MJ2r; zr5^U6j6nJ0+7pv#hm?zO#m;Y%O?5+=np8UCU(jwO??e`f1!#N3$5CECVDI8-<^?i$ zt=n_8cMOj%=WFkDzE0uy+^2u)rLV}8GzO`VVnXrUn^Sn^pJ1!|f<&PXZ$Zw6b0F))NNu`T$B45+BK5{F1 zDoX09RiT()=>O6S1vB8ldodH4k5?sh6KSW?scXMq5Zu-)9oWdAEY1QC`NnBgLMo3$re9S9v z#N81taigwb2b6(Faqy#uelS#A#6kN2cQ}_%;-WO<759Q$fK1X-$IVBb^8??0p4Mydsw^gzg|z?ezhKa@0<1Hjc?ZDH(ssXci*Xld-v=7$w@67 zEY#ZRwOXm?YklG6xKAsZUCpl0uROJlNFe&;z3`osP|e=*=_~1O-I0Ek2lj?Xk&zc1m9;@%r)38h zb;&eoB+bj#Wp&4mPm%aUUsSu6ABjT)zysHV|(H_~6 z2o0q5NhiQ>9_@|yu!pYTW~Y=kO#KxbZO^1`P-dKX^vJ-=cORSH%Nk(QKXM}NK+}mn zsln1PHu&spOq%61-d?-4qp$pNGzma1FHdS|utK^u>Sr(TarNdMXj&iudqVo2q9;%6 zh4|Qw&HA_h;Ad3%di8s6*3bXmH){Fr-J09FQlI^?KU}|ec!r)X){u7S@^ruc&R_rQ z_1xO1ZeH80_3e#}TFKMt)Go=DM>z>Ym63Iyb7bvkUi1dOYj=jvy+m*|Q!5)AdB4m0 zwzog7|NH;&`}OuyJNpO=ajr5lNdBY4qwr?)<}G+fTXaGja&VM1zF!yTo1k{Iwn;l< zaC=Z^>`PfN<-BgZ@NyQ<`0nq1t@ihKYIWmk-G1@Yb@$_+s{0>)SZ{py_i7$qt`ZP# zz4&t89aDBa#k1{f+6QS_^c~Tr!`d0T(mp!kjjW-o7d7y{^~}0sz3IBxfdP68^VRWb z+Q<_crQK0KgJhjC10bu-l(q3);7b;C0D^iUZ`9?y|H*SZ25kGXAPD}5x^3_YsyVlv zv2a%uyzzNghtxR~rZt251lz^c83du-ItUKR)H)YjqzM?(Fs*N0Z-Gq${Upmv#tH9| zE&rzJn=cnW;z7!Wj##B+woHzIv|P7oInts3miKYxnR-DTJ2`3p#h^cShxF=K+G@6` zucvN#r*%|)?emOIXk(NQ>5_=ePLl2>2C(1+0;oPpn|GYu$f0sQ5Y zV3!RP_35EC5ahp!_)~wx-#zb1%EO>Vnc#MD1}%l{pI@z`W4b#jgZg{v7U1 z#qZ0BBFpS1BD;l(i78MBUr4t;fk!I&bl6it#j!KJg_AdoA*~A2LwGQld`8|a7W0|T zqYBqV=Gq?@)1Ky3EN-N7$sL}VrWJyHl3rZul177wbK!DS^XEg+P9-#lLW=Oo6DYsP)3A&0 z7g~*@*FsAkWy&*T5#yiq;_W@*o7Ox{t1>-vc}+K;iEHrXI&jIy4a+q+wc(H!(@cB9 zl%V#zn5B2>cS%{BzC2|rz zyVpK%8_veL)xxUZ?=PC)dO%tHQf~p!Q*gLF!Oeduhs@$6JaLx_?+3~7LK|bg?(si9 zJgMDxfPaqjzxOn{t8mVKlF+E#Fedj7d`yt-~U!^y!3K?{!5>% z?>#)N=l}U1ufO+bTtB!qGI`C759+`DYyZ!B`NmppZ*JBq0od|z7`qb(34EsxrZ%lz zB96XPZhqRnv~xVx)qCqHvL4>3<;#OwUG_aYf&6b)Ap+ztLcDi8ooGki=N zVg*ey{G{Ncza*LA7JNLRs&(hE@<|)OFH;&RTTo7YR4&s|M+?zG?>a?lj@BzTaZ*0E z&q-r@!Y?+2bN~UC$A%wh@>Wt-?UFA z1Lma2%!J^kv&+O$9Z>%Bj(kxs7BHi;w*MrvgEX&B$S=~!BV15q*B#SGj$Ua)^l1QY zU0h!B(?i`(Ioc!~>!dpE`Cx9bv5|QcFK+(rk?;=k(@@Bbt{CA)Md!Dru)XqXHMpP;1Aq2A1+hN6uF(A!E@lr8h+SIw0LoS`Eqdem<>IFg11&z%G z^r&Ez6=8}S%(o1uP6Q9`yQv&vkm*m*5u8-siEu1W1HcK-Kq-tiT2|Pd2DF~RFmUmE zUkk2&NYw9>M9Ua#dqNGM48HP`IF0Yo0YMP~k9j!8Ga{j!H)&AaI(j6S` z(lC&oykmFZ91(cAdYA7q9PI7aJ^|DWLD&He+W`&RxlU?B)T_V-)eo01(=U_hVcg;b^lr=~+ge@>zbR z=O%KKiBtgj$xksljZa=8aUW%m;g#W&n>KD%z{o>A;DNdl0G1eC1ETVqz{nD!oRB4s zhV}PZDIBIfCmI8f$|;T%2|ZVy8r3*jPwm#J6pJCkC=1mafNE;^sp`uAJ^H=gF5)|t=jwGwc36A zyS4k)w`%XrS8MnEx9Z@%`*rr{pym(eYxQ`w*5_{3>dcF^J$R+o2cN7Bg0xI|TzDx9 zhRn}zfd2qy4Uw_-(rH=n|3YSJ;2{z;LkpXHH>k;ok@q-CPU?^f2tDE7B)wZ~9zX4> z>7Omw0Y75D_{9!WuAjJQo~tMF6r9WtSX++dLB`gB*y+HdT=Ixd?vq`8P_KiRa&Aoc zGd-}ZS3c)Dc$3D?B}M8;f^zg(6pmw@KXk=B>X8kp_1^SY7M`hdTeY?I1GT!bQ4imH zyAGZ{PUn|PpvR5~PkrIP?FC5GB{oz@wqN7@C+Oigymh&9JHY%ll?z{}!`fMUjP1NM z0Gqx?lLm-9XTBfAb5}ytUOG)t{y8#cM~9o_T(~GfY{W^8)~=I&m~WH~)|@7|Qu{kk z62RG3kSJ}<_4VcYcYplLb#bs$Z@l$hefP<@e(F#EbnQHSQsdgFu=P@Z(pg~*RI#*mG$t!X}daF))D!tWP~pr)Ar0wdmTqz-f+JA;LSR^ z_j;}1Bdoz+d)xo=fAib*?f1{%$1LsEIQ4xr8l)pp+3Y-eP#ZUHX0%KvEY1$kmWJ(| zxzL9EUSHqNtc$ZT^~+$DyvvTV4HxU3Z+|m7ed~o+>iJLnKzbXL@*S*#C>a7v-a?;bSf&RNL4RX=z`a-5v~Fn|I#1gd&V!@qYn#AHxIFI#<{GBu z*$!EM1(f_G%aulyyN`KZ*(E_v3V{)i*@Vz z*S0tKiL;u6Zz4GLEoGYqzL`4H@|+5nax5DxlTL`{gJ#(&eh{PVq`}A9rL>h?%o$Cg z`&hLEV$;v^h<`f2qa%f1N?m}j$0rUT;QNusvTc)nUu>{2|7;eENIO$TGOcUc(rDeJ zlS4jdc9!pe>2pw?`Yd+p$|7xYFOLGF1@=J+GR;JNkK_gXWHCSq!TBf&q{@;B3AwF|)Mffr%Xt_;_)r&sD^;btAK zexi<6UZ^oPzDBh3|H|MW>jK~xAjs=dQ~0+_SOyw?uG4!J*eiDQg>NCBoVVf%4OfOjAUuVN(Nv2>`8 z{=_HK8bH7~_vaWfd!uGkVKq$9OFkFeu-7w7E5qwSrbM>WE&lRWN9bbC(H`UiEoN1Y zj{NDQF6yMvP%aXz3sWA=Ef4FA0CO;ytJ|xC8qsJjv*#It>CqUq#_Kk0UeBQ1=|$v8 zrfA7G?^|f(tgNVToTtYy_cU0->>e>UOagGtavuKsjVUXY?}ucGc;!UWX}LOi{gSAG zk^y5kOg>M=mXGX752W7OxGH$H#jOpea_Bp~Sc81z!nEu*$0Rd$;-I^CllLo*BRiUyOEG#W@m!$1k zj6Lyuo*)b7YhgHmo>2|43m3~PHNQMakM|jM*inv}vmTz-@x?xRcv$0$Cv|-0veQS< zJBIgT^xzoyVhDcWSW4p>j-&UX8~T)+d`J*w8st8mI;Gv#xyXzJGRU)Z9GDv+OJO*| zL*?gYV-rVOzEiyH=z3>e11`KU`=QQl%2l_WTGWAr9RM&9ofIAbQs;FTS{KCIqtj#J z%%lL3BOglV6l|T|bdbnbTTH3p*?g_kwe^3Y4o_DI7T&K%Z@yFC`@OH$`u6p@a_e~- z{y{p8Kq>XzQ4MDW9PU1>rKJ(H%+=n`qfCPv60|L^u4NQw>~inEXM^LmUJ<+uB~a+M%Ch7z{^sM4+@q**-fy+-n&?lQRq)0Xsh-*g&4!H$NGD*xh+p zH(vg9ogR&A|M7in{^5j9mvq0VKl7Pa>fihEAE)o;D_^L8?x+4({exfp zd-Y4-_@JKu3;$^?-P)|rtS;2`(L#OgH@;f`kN@D`tAFjsK3|{v#K-IQi?;}L)}Ym; zlhG0FER-Z5K?YtKZYjW6CFn`JhFrC|X9SCn-hIDr-F=ZHbM?Rbt6#0}-aoAk?EV35 z+Tqxh?#^muZIob0xxDx0YxVNyejowZ*%8livUVOmByd>GLMJ2%INW*s zu=XE4L{_u)!sk9y_uso$yC1w?SDw3DpZMWF0F3i`>zm&q2wAGzAA6-%3BLNXD$+qK zO}pi{`V8O=ZfvWpA8m7y8Z>$IxvK34c3pAL=jvNJ5cmlzw$Q-9z)QC9-1p3ti#*B# z59pG9kh0B4sZ?W&GV%s&Z6C;C>o836R38VM<7@_X$TY45H$EFD7~S97kM4{{s|2ab z;pfx)@5dR`R$b8cYd@9NC;rvv>+UC)2vYk)-mzHFr`^dn||j`Aooeb5OI0wnjfr`)$A9?L}@%h#5`ANA(k@0w|E zwAoH816Od#`y|4JJDyQR?*_6L0(Ek`2KnU8%RpV#4@?~D4~IARKL za>UEdQ2i2Xj~$_kHd9vhZ7DDQ8VD`ufAV||CuxB1DNU|zAe`}u{Nb89Zr#juQSxP` z77z4*9LbkQ@ng7S=gu;L;&8YC4)P6bj8z>l=(P}l#dG7Cg~3`~3_n#* z2X||4;c7iud9DuTmhh|5ga7)gzj`^CTMkoXfd9MKRMxu1EJTsI!Dy$)O6g`Ew^oHl zDDUG;Qpix5qVlBYo@Ykq8Zp1`adNR+yC*bKTpyo4t&8!ax_|Ii?H)a>vAu@?Rm=v4 zIvG~1z5{d#1ZFVhpN3ZD6cde(qXD^JOEojzsKvvr8W4cZ%`DalIGI-CWtuQd;`nRB zo70@z1C`M@8-E_;Wj&ty0ZC~!*s=1tbx(S8Wy(T(Dq=8Vn80RbJMVxw!m)<~@aV~7 z8fQnks9=Z3b+&(k0ou><#=4(}XUFN~S_IcQ%E|izD5WDzDv{3MEQ;3OBE$KycNT4+ zYVrdY(#46_(tw|GaP%PWRq@#1OLxT{VBe$DL5o4aM%xp0p`kxHCa;E=^x(lA_^82l z{<`Bg#b^w0Wu{G z26(CS_HYWa-)U3NCdSrXgNppq^JgOpgLFK_9D>4Yzd2;DlJ$V1;1Pxb{9Red@-+-P z{BGjMt>~sK5S|7mQ)1LT`X)UmPKSqp4b6oM>INE>W%>6=v3Hfs$G#0nJizbB~iNwM0U$CEp%F@`~`k` zw1FQxMq1^SMF5mjh;Dq;+m^W{ahtkyiJkJr`#Bus;b5iamPa+aypDr4;vNl_jx$Om zZ;uJWuo`tlkam3LDrq?D=*r>wL+s{GWHxCo1HT;+=|Qharv*p{0&=%`)5h5NNL{L; znVN{`ciMv3mBu@KKmlU=0i(UqR_G+=+lZvmd9$Iu)J{>pGLg?ND4?7j@wE3|{$**fZF6!E?PeYIV zzpO2AeERS)&in!Sea{!iAbhy2|LkA+L-q3Ve0}SCZ`5zRbH9G#&;9$gPy6v-{MG-W zwqE!`-TL$YZhiTct95HQSG%zB|MT;IxBljT`0v-B`N=;}pZ(Yib?2qqwYuv2X4q!w zk@wh*?v)3Bc>rHMrlSmeG6E##2D|IGYy8G<)^K&Z{`Y_7SL*BU&(`+VsK&eZp%ML~ zE@R-SPp-u1`^qQvs#CC)oC1}=oR{?o+?+< zXlIp-?@!C;bNCpYIm(MkOko^g_QxQ-4xa1(E3Z98G$Y#oYd5-0EqxOI=Wgyl?_+jhRi+^FcZAW;Ze8oqeiBIaU z*XBi^c|4(84r+rzm~-_|lNCEEE$Y126FrenX$wehdn13tTkAYPZL6jufO##1bSLQg z!NDQ4o@VCFVR#8H>~?^q?Fvk|sLvu^$Wr#VXVRS%!57?>O)MFI+C7>I@-`o=e_;%p z_D>lLU&)~jNiWU%tO>@scBYqYPJ9jNCvA@eQ6|^6jXnz>l{xn;MqUOF8KkY`+<;rZ zC;UwtY^iEMw`J+TKF_(#1}i1DhG0w-+{YH91NylcB_-n`4Y!@KgGG*M z&m9~fU^3_dV0;SF=`Rlla|CVRPr32a;HB>sI!fn=u_JYv#)xq2XcC$o-Q%&V(UL|R z%rmD}2i}k%%m6I7Oyq-5;);@P3}1cqN2w_HbKuY8moKect>dLn*1eTa);$J{8CD=-tVbL8Xlc9U|RDehU-)UPJR7vi8RvOAC0y5)*upr zl6E}CSepx_<#T&{XHc?KDh?{7jgQWv4S=IP_CDIX?F?3F^J9>i zE(5O|d9;UQalwy|a*g4S*aFMCXs~AuW#?uB4M?S}Ou*)g?j+59aag2cXx!$Ps35BZ zUaNyzUq*2Ui!}(Z)g5(#N={n&DgWX?AuoYtTAuLOG`iw%0HK|6v0$oNbU|9x-GT3C zK%c883apKc9XL8G$cu|OzTyj5_c~QRI*F7|d090F`gItW(m0`?%2RohE=EupbFE%v z3IhzXVLgU78lhSBnfp4MA{Zx9E^@6s1T?4ePZ`PsuHmoK+G5~Idw~Od=CnNMmKQcB zG3s2p0+HtihKj=%UmXSWJhX{d_yCU$z@P__kPvyucc68Tu;*csMWAES!VaApFjv~@ zk!$2Fzku5#67Vxhrr{y2I8h6f%Y}4Pn6yXR=ofwp;@%4H>kGr@`p-JOM12WMmMy6EfI4jYXLM8LZ%HA~z^N zx5QN^ATl70Iw-%V0iRQutQMZ@0AE_a=XIV}sgDF_E1NYM4QqC|T-#S)tj~Y>2kOm7 z->YB!&R?nh^YMSEgoSfG{JMR1up}8Qqz!eCwM|5 z@~|Dy2HK?Qq*y<+Q#wg*_GXKN;AZywK89Sir1UCE=0iTdx{L=gD zGw5)l-I=Qh&ac$w{6AlZkC*D<{rfoI*h_Y&ZE0sdeCxG(`rzH#zVlM8u5AaFg(!b{ zap+WTr(`3a@%~e=pbYS_?&W1}@U^#oX?Z0hWKI{8KX%kP+UPVDIo84WS>BU%6+UTM zS=-2z?~C(eV78sp!8ko5C>uZJdaX-iWzf}Lmzxaph2R`w9-MVuF`#i!4@*}_l>bS~fy=-1s62xYgzaHg5 z+GA|(?(Tk_AMDm&{)G?gx8Iq8m)v{!K6VN`kN1E{IpG&wa68 z{q}e2m>}-X$39kT*RR(x?WVX{Ppsp1m_@ewHWNLJPXhYtlN~#f;*E=AKd`MXP4o^P zIC9yYI@&qgrS2@VZbmI-7f)nG<<=;eIKWE7iVxpI%xx6(w-h))C)g-tDgU%jaqk9VG%v0 zjNnE(>CoT7Vr2A94fQ=LO%N>~xH{9R?NfZf@TIo|kE9bva)Bp)l{Bg+0ElhnC@*60 zlOI^oC38_1thi}U9t9>K21>OI@1@q2z_?)8bDAd z2KY)#uzcZ&^kZnDEb&{!@5+05z!_sNxm)`LPJ2hEm9+`LYb62LVuFnkBGNyQQ~J6R zK2JMt0Oo3ib_D6CDSO}DJ=j01r~Ai=6VeW_53ys*i?bO~(_YCpJ6vpQD2|x`%0%BGIkcMg1ZV0rK34NoInDWg9_*V#$K*)XPLLmz=?I!5Tr10qX)o=dO=p2A zZT{eeo4Vv8B-Ry!yL40oZ$Q9xI{IAQU;R|=tUOou25Yq2OZ`cJ*FSiCnO+MJj|%Y* zp0aht0tQG*lN6AKqZLxsZdHh$hd~AdQ>P($xgSs-&BLyGTPeI&Nxjx!noh+tg4{nI z*Mq%>_4cD*uh;JVMjbjb23!Si9+$0Dp@z;Kon5NI+z_D=A(i=jnYLc zbm&ir+|N#XiQ?09qWZ(*EOUG^1|~S#d#8bR(Ts-=AJl^n?$I#s*B*_t%NrZebq||- zrs1bCGdjZ5r;Sm5ECUaEqt}NPn9vhqYDwNiP=mieO?-fm_Ab_ zxG|kF>N|lt)R`_}9{A8sWWu`SvEoKX@KMEGS{c=7uuvOo$YL-gKRkmjdjS*7lTHmt z&k_04>jJdsN_dTeYDB=Toh>V(xY9^b_N*0*`<81@T;}(a-xa5<3DB(>rwqCCe@b?ND3^FDZL(0dffBdCNkG|K4v^LMV- zoogE{0~>$vp9W2ifLS+fTxQ{q$LZ9|p*k%Tz^Z2+MIlbRMX^a26mYF=0v~B+i|)xp zHtn8uR$jz#dyi}R36<<}f{lAN(4mp@{f1(F&(|gj^PK@QH_{q7Y(_jhGx*=@-?3g(|J5F9l`JCzu$>Eu4vNEf30E+fL z4Heg|O`IFBsqf*fPII#$bsyTSN9u?j5tqX$=OVf>lee>|*%gFVV6zjZ;F z=#U*#%HqSfzFT{b?$^~9KUHgMo1t61a^+jUH|4ZHJBXe>eMp(;yS?7v=nLP*yuh9OG$H2mOXN9Nz(W!UDsP*azkcLT|64W27X6?9 z^8c}B2qr%Hv;XV*($D?tbsY!90RCf}gZhvEi=99|Y4cS&9UbXH2FLrm^-JG)Q2)1IJt@LVc=4zPGcG1_ zKr#af+985e0}nez-uvLKTEB9op1butvckc^!9K$g+kO0yAaGbqBLdn-4+yxP;*_l< z=x{XbkaDiwxm&v*zMr=D3xD{JBA?TG@9nqh+RfWMdm%X4QRe~_+I@A_^7{pSbS8>I z{XrL;5fO(Cd8_L>r5Sx7UFf7OSNF}U&e*O9-&qFMKkKiZG`L=OuVvo6hLc0bf?9k2q0DuPDGW%wsu zX*+_D^+$f_gOV3oY!~cQUJQk{mFk(n$~<KV=VjlkN^$+TpDtpAkFV=xf){I z*b97M0=b=W?PLlf1fX-)IXfvyS}U2cU|Zcm)v0`uF7T0!e#~CqbI}nnbss({r!(*z z!?)8@cuyYNU*9Q{;B>@$fkn&n?$Y zL#OqKGRO!?R}fZyU8z>FPOgLH1M8EBN{oWE@pcu!drv;7-}~^Z^~QsL1kCeV9j?b9 z-B`I>Yr|``;@Zoa+oIe4VT~A0Vc2QCTxZ3N$o0 zy{X)uYe2+T17Zd6zG?Z%XsVR)E>JpdAs6OM%CCfcyk1rm+3*{8iF#Xo(pl;@$6toW2Df@1P)H; zna%~y%kMB+<0$@;mPgdgOe^7;hRdq2;mka4ei{{N5xy!Wlf*~(={cZLXvSzrFe)gW z(|Rmtc{r#=ly!MDs6k#*1`Y-5Tx8UPH1-htvb#|m)k5%juguCMZyn*eK$$5D9J-gm zKm_k7hTC2}8;UHBK!YvI;=o}{B+tOuqXBD-s`SSQVtX`DRsx@MZ$J<~pllr|9Y9B3 z)Wu_tr{gp91|x&xu(_o6D#zQb4$AH6UmH94jDTq6%Y9Sy0w7!k8Y{@_X8 z?pUy~YI@w1&&8~HbcZd4)UYk314A7V4FgYcN^!{2x*~X=%aXsKLMW)!?^v zmIgC{Yd4Ax<$u&kfZU*cX2$m%9ko5LrS+xyLtp+>EkNf2_bh91ak2H2!ZQ_BbP4cn z1T)j`C~JjxeMiRVU)I!CL7`Yo{?FmXfR{!JW{Y+O5{?=#bfi}ELj z=88Nvzxc|FY{HU0j;86NNQ>Uh;KXPfZS3WmdT-s9-_c?67_is~2rshZK3Ou_Ge;1i zv*!nH_fBW)=l{WX>V+>a)@ObeM-^Su8A;#=-s+mNh`uUE&V@}0lx4jHH}Hz11yvpz zr?w9|j42=8(1wPu>M=k0Ef=(X!OeQ$F^(Z+a4Ajc#U_uAiE@non3Y`V?MB``|u`yXnd(#8brd+aHw}HD;sr4y2FFrbhP=Mu)%1R zGOUjwB)l7s$2b&EYh(L*%~P%m7G2`(^)w;rhmY8q^OGF{58Ac08w4bSTG`s7t$0L0 z_ypda#3sv6I9&gSfB8pi{q(Z_`)|KhPYCdS_TTwm)PMI2zf`~cOMkysm)7c&fBrwI zANvzOf!zXk>f4Xr9MymHzx;RVm;dgs)=&P#57!_4kr(U6)|D(pzlfufg&wd2`Hl{F z$KG29IoA&9pejRTxxcl+g+ssmk9k9*-n}9~UFzsAMkvM8IP#X0#btN!9qSsd9$R6rUIjqiVF#ELQ&7H4aO?B=k8HsAShExZ}x0LNm+H)&=Qwpnppr`Ixs&AKN)<+=7VHWr=MZ?KLofy|Lpf{&s7$d9ET zXNH9LgkWnM|Aw=4E-OprpwUn{K~M|aEswmGj7rQ5JJeOv##m?6uw4;`pb^%1R zukn#NE@5Nl@qLE0_lqY$8l(T#Gi0XSRledVzRp}aJnHwij%lwYae!@6zm|O`i+0&> zl1hgI6ymakU$``Ky?{wj18y!xcXD`607e|(YTMF5E}x@WwK{ZgWtKolpAvb)o2>qA zos&1zIepai_?_T@O*3e>zN<20aC1};wA-!&Kb=nS%7KM=p1^Vjl)63rko-U!HJtA$ z)yhE;0?*Mg?TQNzIr8TMB-(cAv>ja_W;t2;Z0&A+w%%E~QBOu&_?Ght{O0~Q|IuIk zN~#u8m5IQ7b`*gB)I0I>7=6rxF5G(xd|Dsfy3$S4D}FZq>A+c8QhC``cu!T<1Q0yy zW#JuOgo!BX;l(k+S*n+>f2lrw=f~=Ew|}Hwx%LBfck7k9v-y18T)$aYSGQ|xb+fis zRSajpjQ08vE*Kxi&^CwZ?H1oYq!XYjt(4R#(<)jr3F(l$GG@ zaVS@p_>=Mbl5Z-1{2Futye<)S2q)1EOZ+ZZKx zYJvfhLHpUUjg7(LdD7@aWhE&po>P6KM-=1SW3196HsPD+X^cth^5{LMm>_|lt3{3v z4(n|1FizH?a>B?s#O(a!!|?%fKYQn#o}%;TJ1gch2tNj{J+-ciX?fo3z4&L7r(e zZDi7Op9WuDbvKZro*-*ATfNt=*r?cUciqvZQA?~tJn!itll&Sx?xn#>&1hZe26@t; zq1(P+K-D2>I|S);vesx2$*a?5!>H=Tp-s8kI`Sut_dBo(u9U%F_z=raYnq^ray#Eg z=ca8Zzmc}C+O&0`$pz>3nvVwd7+=)ye)avj_2n%B3@rl=lq3qrbW=E@r0viqxbq8c z(#W$+uQaVU*y4zK&0jklIx677d4gC9k=N$Qh?n<)Hyx?8K%E%rRTgQ;<+;20N#nb- zCKYR^+=O@BbA?{t_sO(Qt`{#pUP~um01xalL5|L?Q;-cZPpPjxZLE8RwJSP)OQZGL zd-9~7?mUDqzK1Y~BfPRaiq7i1SO?TU1HVjJpYTK+^L;01umeQdis({S4MwKuYMcWd zHUk9glq=auv-Ta}{23I;^md3`tZI3*O*u=ozPXMQg8kA?kXI&)zbnIC2iHIKnUB}6 zzV?27u(Mw`KK^1|zp`Cl{q^6fM~@%YYL|7pGWxi8hz-Q75~x9`4Kqvh2&Kdm#^3hg#95FN5;JE3g4U8ESUW9PA1 zb{?d&5xN`=%5+?0V;}~J;D+7+N1ag@8%FD=JW}87Am|P^VCs;ok3QjC`xM(1p0#}v zhA`Dn>uK6-(rV{?Hnp2$f)H1fUYM*xZF#;|=QLCSsfz+~iT&syur3xZYW*`SwT$ev z6|fh3O;C3{LmNigLpumL0{`sHAP|@^$`J+^xAJ{T9oaDoO50&YZYd(3b{~}(Ur}0-ud>$s6PZ?`}Kwfwnd7ebS1Q+@_ zZ~O0+oA!zW`*Z}%ThIHYbs`m;11W1o4ZpJwNB>}`1Eed>qLgf)4l;83U3eZ%rOXIJpd*+n92dn*4U zXK99q8Ihx4m!j833Og$Zv->*C{CwXN5j){BZJ+E;*`CLLjxQ_S!h!Zp}|h#>C6}JJKZ}Y z#|BEkaSemzC1-M37lhY5kXCQ00H7Y5Z#mv~J%*Ya*4e_f+FRJJou&2KckwOq3V-fD z_z(Z$S45@}AU8ndgYtT|Nj%pR+`MdNdChLNNNSQvLOqXa=9!H3ULH>mIm&{M3R9I- zGR5ym$vMH!N3aFfC+p7k^L5QYYqVCI%LY~iKZ^uH&i6Esas&gzmL)F{`XZIh z_jwj+Y#q9^XUImupLt*7pA$aDpp=~j&lr~5zsrkvv zvtHnXbNDf>G$LSQ(nhMCJ}arCT`u4;KG>zw9pS_ug0l`e4KNP7tL7On_;JaLG`*vtYd(H$5M=;o(1Me9N;x_l;%TFk5n#?wPhH^-V`>nB3~Xq#@Cy0l@tNs> zl_`m&)1aj%muHUlO@m5W|mj%jtB~q$Q6s zQ~nyT*1hIkGWuj<@WsK6tK5%Kw%gP6N#`>(8=dn!ataI^Aj{P7`P}bw(F~xobK8Tu zwK58=i`=)4h)YJWllPzZ$9B9 zIh#G({j8miOg|#Oqo?AK#vAx4hfE)p3$DPk5#bgWZC}!mS(Uiw^Uy^C*qwAHwdnAQ zP5FmT>7Ez>;kOO%@}$>>?8?@1z4rQ}*oxbq+eBHEoidy5lFN~Nc6@z5-rADjiA>$v z*+p->#e+B)Jj-=(;EbcZ7cc$?@026EeJpO=v(Yw%O{uyloW>ja)f0Kab)*uQbKx`0 zNxIlHg4EIMC+h0lk8-=G^{Df9lsNh&{n|_6#4dt>b;?c&M|=E$@WGS&b-ee4V09y_ z8^##}>8_X5H*ptnVE6zwg-6jD2Z!aVeSrh-l(!v7fAG%r`q;*Lee>P>_157|{m_s9k(z_f z-+ArTdi3B))y>b=&-@#IvPMg7hn;4;#rfa-FaHJs+LOArxl&*F_?=o_T_!;Cvoh#1 zq}gW1{zIp2r1jReLMOvsf8`UMf&m6>A3WHp|NOuFAM1bivwxue=l{wVYySA4zWTdw zqMPuHUp~wXOu6CbP?Wn<2IZo%*QTYX`S2+GS{{v%i+0iA>@=f^=h#?`0IvFM4Y|Jl z+{fy{hws+S+t1hL_KnEWAYEOvlMzM-M`_Tut4p?%>X4gy=4t9=?({h4`r*q7B}s zJ{+9Z@jm#R&JiF>FFb)=ejN7lL>?&t>NjnQv}UIYs=wCp1YY1E{#=Dm9ki$q*4@^d z*dE}-!3R6*osh$J@B~5v1o6(I3wE@VCQ}f(o4}mq7fp}Zd~Vs175bxHnL{P!g?$F^@C(zy9@;0JH91!t zU4}MCS$I2v%c8T=pkLl#v$fm4gQeX3R+pb}uszi$Rj1QIGPV=*nm6T(e!M}E zcxF@(>7R9TF`j zZxAC6E|QW#BJ@=_79(8KA(Ga$)TQQA+EMD_+2V~F53khY`PF(dLl8;&_znt?Di2~R z51Banv$2kIuV5{O`x^he_?Nwns07=L_O;3)ksqb^nTt|P@4IId!XwD~3>3lu2})xl zFv|3!sMnUa>(2Ui-Q3)+YonFgT5)8{(X4*&DtCaubwY};Z_J1;;_olGzUGYU$r!n+512~Ew&i;twDna9w)s?!nxn4K7 zwrcz8YAp*_qXx+;XY>ZiONS#E8S#R5aVFr40n=3B$-sRT%3UWxzN*;J4nM3=DzsCQ zGEAC=jesNp2TF!x5>+8x3>y4$vkW8?S?IJ(4S`8iOn|1s#E2s^jkk?aoD^_KqYq4F z?6*}6Qgk{Fb`LSE?bKvdDvYfG%F)>6_D?zPWjcy0Ao-&D{?2Y4?mVr1?z!(geO&tl zL!KWv?dO0%ZGW%!_n+1wdB?|3Yj6Jn!Q0b1@;L#|0gcx9XphS5q9!!fH0b%<0c7Ze zr8k=M(4`R02ntX3c?L}2o{;y5#_%BTZ5XU!5NPy|kc}&2`EhDTmX43l11~!?K~RDm zdF&BIPg&tDGO_$L%J4OfKx9mVLq2(vDPHn3vY9yiFja#lUp1?d8xK=sNhY<`j;QC^_`pH@_>Ti-6luql6T!} zC3x#LIEEiCzCj&=Mo{3MA{JlkNE=WY=5vjC0w|jFe|9M|r#uS#C`+foyG@Vv ztsMh-)IHvEKJ-YNb^-*oZ5<4n2{>f#x-ATL^@Yl>0Z;i9mPVQ68tU{Ea}i#WKBFw6 z7#zhVOv|-X`Gg_9I=zG8e0~0tSL%bWeo*75{XT_6#1Y`!Y)Yb?g#a}{rvpenZp>*M z0d7Xd!sjOp@7s{6caeGU3?|`4Mj<59O$UjC4sJVS(lc$a$uTKk9Te{L+;_aDBaNn) zPcGfQe);LTG5d#T(5a6HN7xTLZyZh6&Yadc^)byCKY3!{u(`Pr-9Fws2oBFZ|0(R# zNqz9{>ov}l!|t@n=p^~v;)q(0rC)hqw;f3qZ$~Kn&X;u}3uR~{z(-yf$jDQ9oT+jI zb-50&tSeKy;FM$Pnlmfb)@yu-J%k2zS^CqyfRCfNAHTX*Z#>$mBj7xwo?YGC#LoG> z$HO|n$-eRVPuHz0%XJKoAK=8kdvaOdesWY#_WRw99fF}V^_X+zmhW8xmrI+JuIFCF z(dagFq6)#q4fU&k__c2X=c2y!x#u&RV{3rZgsoI=+9|4ozFz8?9b;Q-Te@tqZvt$a zrtb0&uxU3yK>q58XPOUfyZY~YudZDA=*g2>*}hWOZ#;(@U~{c|6yhQm)-&5{1RWg3 zRA0mQeltq~_*0xL+xI%0`q+A_ev{AVp|+2)uhI=%7blV~aZHjtQ}3Q1$xr>%IdnC_*tWy7 z+JD2~k2K=NeF>g90mi{Xo$M^t(c}3VKUu8(Cxd$YXs#YVEZW(sy~ne)`}m^v_Rj0^ z-f`_59&>K{jDM((T8G)w&Px-xW>m{^t=pl+dMq8tFKvUhj{Cv2^T;o4hJ3aT>qGh3 zBRCM*iF5dsU3)+oq>CR)Udy%~#9o@pV9EPDx3kyG`W2v@^3;XYHDD`Vd7j{!tX^X( zzi%^rcPgbL4VdB;JjkOA4M40UV4E^bt8eRO+X-1*w@fK2b;;ere1|SK*|bHbOZ|5? z1^VL_o{E@-ag?7j%WR@*QK4V`@;R`5=hk}>H;IH{``aA^;!Zl@k=H!7lXh69T^CQ` z0=UbfH1YLZzPZb3;43S)%uwSx3)hjq?XrOu^_etD#%__;-Lwx7&@^iAw5rNX{AfS$ zk%ST7C0Kyhq&}o`5;*cXxjjPUw9eT|6ry~wC98k&W26$$zw)s^|QEEKJpb5a(xM&YEyhB z9;m$sq@Q(x0jF+xw8z8`pgH{Ske-T~b?v>+?!3-p97v}tc|1;9zhC80p?lvKk-#Ip z-?r-KKI^%m-tTkEvs__{N9P|;uB})GVXFgzu7Oia9MvMgA~;d7JyJDQa-A=Q|Iw~8 z%7E$a7N+n|;duOKZAm-j-m^4v`ulF0{~vqaPXae5@_m8}_$g48$*+NLj0SaOW4$&v zHfw1MJZW51s8)O(HQ#}vQbsu_AUlpG0cM=G@7r`F;1~t* zjeCzAX@qQ0bP!OONo7?zQyz(Rb~261dlwoacF)-yHEM^Aw7|6@0-$-$-p(dzeFus1 z?Rm1oNMSct@I!fmfA|9)vd!``iiq~!npycyo{l;oD^puZdp40@C?0| z*^NW%i9E?jNchotO%S6m6!27rsi%*c>uDHkR=3K;7{{`6{+*Pcn8lmuAP z1za0WY4bWg{33+@SYA8Zmemc3=gKR_FW_yCxkp}kWuu`kEDZ;dy9*yUJ!iN&tOck1 zuK05PAkSBk*Q(QP*5Sp-DGQVcjvDSL7J6)O1$T3wztnM_=AE$^Y-J#(7R(d%Qm59= zl4PDxWF&*TArz73fjse-&Jn=F(a0_D zWPyutqZd51PDgK$m-HgY(3*7QQ@R=5vn=5YPtv$Q4SJm3`N9iV(Cf2$=j-<%%EmUR z(Xgc{OgcBqh@SAz`t9O9nbJa8DHo=uu2XWHAZRfA)NTkV&t>|A4%0f~>^oHx^8t?2 zI`Rx*vRik=3Ht>kOA&^YMz2h50(RV)T3+~At=Es#&dy;yeL?`@s(RQpSG2PyzrTlL zC&(Gs&>*gCj@&wJ3j*qdz{S$9-hP>O>agy8@Mi5kd6bcG>xb{BimUIZh-d0owwAY} z_gUte`%a%q}U-9J9B1Ni+2)BnwoB4C&RWc8D5Z9X|E=SAOf;^{J2Dto4;;5?$1< zedC?@31kjF=}m|CPBZu0KCb+mi~!242S>o z?hfnZ$z1I`I-?Gq){}<>a8C%vp3K(c2Q#(z2wZkg>u~qDcK1$ef1mn7Fn_p@Jkd+r z#Y`vW7uxw#&)sFBQ!;Ina;{vw7OyZ+8FL_S>Lux$e|7?&jk0RG1!lN1g3cs zC?n5P?0|Ci9rgs-q?v9`O-q|&df=q9QhEUC$XL?I2lB_q2_YgQ-qLF4g7vN`5*PWA zbq&;gaM3;_U`Tt@xN^J80hibwPFqib%0u-tqe`SnJ4(4}H>5TAlMeW4XN4`m_;sQx zUrY*3z_xsOYyB~S>7~`qP>P@oWo;4SYQ4Y2PPkYT<){x9Ymwo(|Ap;nJ9UwBN4$hT zJBKgK{d5M%FWUxmM|v#B*uc6xo#tpAHO2ud*RrK$(70F#ein8oJ`!bEZ`DiLAYKM_ z>41@D@a~QWsNi0|BH_rkdZoX#2o3Vi>y|4R);WHt-FH|DS(muV`?E*K_O$sf%Q5>2 zfznAGx{?X!2kb`}PM`UboBJWxx%Yj?0~!KfzB5nnz8~YupPgslB}Lf}+^4WO-}f1L zeV%j^cuv`Jgux(AXT-=_$6ST`{vb;_qtyS5P2RztzF?c4NqqQ20&F?ynh_DCd+xyG zNty{Sc}6-e+Bl$W+*Cl%V0r$}+EZ$83SD74V(0r}+iPpJNdsyHFrlywNW{ZyE1cA& zg4>u`Zy==K@lojDno1Gyq-}$Qy}O^w|JGBN^U&kKgo7pHYb3~(YdGT7mvO>_%B z8YbwT8mI(j$_fNE!U+;IW~o!{JfxQ!e%d?fif=ARVx3!tFPWoFx&%hPux}o(Nv{k7 zkLxoGk()3r&*0yHCXI(>2|sn19l5o>02|sgn0X-=-B@2=ssRD<+B$fwlV=s)Z!Oed zlc0=%tk&Vf_0@j24_Ui+C9p1Q^pQ0*Sw9qvqv7_TnL@|L`xFiDVrJ6-M;7GiQK3Fh z!^@M<3mj<)UEZ`Lb$*gZK69Wr%bo;9!Vt3QdG5IlV}dmdhdL3Am62rupdBpnGmS9S z2~v?bBl_fzEsFHn0IIIp5Ev{^>2A3S%bwSZjJ|*D<(u{HKX_6zIN;(UTsQxF?QZB} znN!@|#3jU~tj-gDScZ7A=RE~}Ql)buU!{wu!CM`*qG;1H(!l2bH1=%fv4_|k$pxKo z_nF*u#?)tnK^HPuo&R`Uo%thmOnc*dlXgz&yq`IBn0r}4%%BT9>4#FCx@BGVQzr@L z;Mda7ZzUCu_Vox~nxdivNYdy^m{oT@qj?(MBn zZC@GH+O_NXmgOg&f3Y@JRtbt0>gm&+y7K%hb?t>u)SEiZhv)U^=)B%LzNil#?`L)f zm9q8;-uzgq9ekN7fi6bpDMLGCy^qYbNnl0oghYZ6?HwR|{&@emUc2|Ge*BBCK#VWU zAJ%u?ev~>MM;c&G8IHVouD#OUw&U9R9p-za1Tw~9vh&w-9T^v~a$1rcT3B8q=|Zin z_3DUD-Of9C;w?<{wnwLD^PZ`sw&~}&vLTJ_#8iJ%N3=_pZyIFmQF{?P#eF~K8eNuX zaE(52UwOpF@{6|ed>Tl*Wwro#TZZ(>5AA-QQG^_&nBbCWhju!npQew_s9VU%pwd?x zE>4fqx#)fCi%V>4N3zfkM9Kp@R;BsT2m7_ZcM_aj?aN>JBDAqSgJ+On;Di2M5XHdE5H}MZ9ShKZL@Ie@Q^qU+|t7ttS)r?DfG=jx+& z#yTl8<)fy_d$M1?q|QuiPxudBo|`5ECXs{Jtv4tf$CgJ<#6rMq!i!Z4oW@%XN^k{E zLi65?fO%kz5w7i>=}qSSXFi^nTpPG*Q~W%TD|=1@s|(999rrWy4B{+X-bNS2#{}@q zW3!Ya=hCG8kG^v3!o^Tq?tgTY|7u{6;IVbapv{gDZ^)xO5T1MlhWaHed2ZXKT+~Ga ztJLk}*DlCM119q+4`tjsEAAGV_8&OOMiA45(VYl?b&_z$q9VO`Q)Q#;`P$xVmEV0HKCsNQ}5Q9XXV(~&&9Nw1*7(y-w?SjDAF z#rLOEV2^{9AO^xpKpHTLa$9C9nUxs)(ui3h;GeyH8g|onUa_Gp%eGw8Ytgd7Jj!u3 zH5EO*4^(c&VA)x4gR~EM zimS`FOPiI_GUt~3<`TLkzC6veyE4;Y+Qm0>7*T@){OdDPeiSJs4^3bn=QU0xi z;TaDydgi_S+Ud6O0o~vmoaGIMYP7Nx+-;1(DCw1fu+pIM%aI#Xo`-ppa=LttoJNhZ zAVPTZRvVojFSQGpIyE}fen>V`XR{EEPM0`=PdY(bZU&BbvZ2DOd@ zdiBOi9lY%abLAVvu*uZ~J_Iou%RZmzrF7EphePrlyu5E+(dmqHn9U3t)>7~OFqzyx!gDo0UFIoxoO0+T2&ZnnHg zqfVMe{HOBw1$O0ZR>fe-APL^eR9xb$aBqGvSHJVSZ`bzo!&<%Rs0HcRS{}kRpZA1E z8Q?Un@8aAz$`ovo&q=9XnO}z`J(wichLAHsko;52yfeAownp6#Rr1qDEQPc#CkIdE zs|~C0W2nUOjQIOAwLSOa1YgibTIHBFaZ-i>kMCqTs%%*XO_}DWtSp;Ek*oQzVf*8K zGM{4yM$z-V-3OUA?P3_}tPX}#;*er=z>>sL=im(3$|?@Fv;sf6j&3*$!QkFB;_qw) zW!CS?s-p&#=GXQf=KGKvH($b`rTqneKisU%$Y>0FumS%=U;IRU;l(@k?R!t_{?pz1 zgJ1kY-MVqJ-hBP{>eqkoTXkdWc0D<`tTzd=-+$*`{r>;^@6hIOR{U?8{ zRZS7Y+_VPw(r$fDdyKqwNYz1QZ~H5MGYSAMji*>i zOLy`)Dsbkg7}xWDfE^qy|9tWupo#1(6|T67|FpgD6^L=v3AV4luvr_oRxQV*ry)OjrddWEU~XL@aErmoAd zD2ukpdPxq;<7fwv3^JeB(x)-#w!5FjCX3_bXsJ`*#m*n=n0UmtMrP{CG>~eWDD2>` z9OR+4ihF@aKq-3aoF@tRIf=x@(=2p(nva z>uGF+`AOroM{cEL>2Z^6F@Q1TZ`#^!s>7zREOF;Kzt{rdiaL6XPk@ z{+A2MgO=}O;5!d#lB;ew{JwOfdl5r)dlo_wiOt)$ayE4I%)#xUo;#%9O&l_!D39ee=jx-zKfP}rHI5{gH}Yzcdq}PME8i4YqKQZ>a5L2? za63(OhMzremX`)%lD2uSv(+6R27+$pi=o%4_1tvq)BEOr*16<9Nu!evM_Pu!Gp({T zo%RH(xn~~fRYTOnkK|3t1j&Bz^1X+T>%oUR_57D_s7CNec@Y>+oK$&3=G1fHx%Ctu z(+N|X0es*YI0SF$pv=^NOOt)3iJl6MW9mfHYQ2)$IK<%DIKwZAusrQ+c+#U~K1+}A z>{)Fse6Cic)gGzLl;xVA-pC^x!78fkJt zBtN8Uhr-h0u#Wbhl;8K7UmT=vxMgZ#@B$z5XiK1`>9+{@l_`(>E0Zm-XoF*J|$lcWeBc|FB*;BgmwVJb3&xHtW`{ z>-FW&-i?lWZKsFuL|o@WmOaxa>ElM6MDE!!^N)W0)q3sS$Mt9br5}pk|E*v6W_|0O zC)5+=hcl}k!A8Ip=s3F&#TLx{m7YXK}H!J3jkFZHgTwm7m z@>&hIwz5!%vhBbF@bE;NVn?u@zZsbahBC5~SjXD@vN=;=#SMAdrdo#`eVRJ+sZ(sW z^U{mbMi0d&)3~5rDdhb{j!7T=#Z4Z5w_6it`KPe~$1@@f`@%{7lZ-$!t2yojWyiY+Z6SO9HPWf@snlpE!QFPk_9OZ?u`Tjpe1`vte0{%Cp4iEo+M*oT zW8IVuo8s3#Xwzk5>LoYh6i@h(x+83Br99+$&jjK*<-5hkfWy?jn^rxy9$PnC@29p` zdAI$I9JntY+z1}Z$-q_=W8c&*f8ygaX&{4bhUHNLM{oGYFZn$~HnuUr-vUGhyvUpx zO}W>2n%5Dvk2(vG34GSJ<{A79&x5xkR}=qG2*5I+kbjMvcfko6YNHp_o!+@Isz zz8LYa4o%xq@vuJGP6)@r6ayX0b74BCd-wFgE>xe+*Nx2M45@rKQGJMwmgWwUvd9>E zq)jzz`;+(+*j<}@X^@9)XSD~?(tOp|vm?B2%f5fAWdz zv9^iissHTe7xu`24!EZ6wiBCzo$?N%=j*gsZY&DAJ6<(IYMiBONnAgfSrjlBbT?x*-E*HOs!yG3`>lX!Rrnpao zD2bg0NYgz-ejZVb1WMDL`_uQ^f)7V`um7=U99_md1|f85VBCF9qs^{RW9Yrdp3ytX z^E~?mW_m(%PCoc0jeE}H-+5YZKlq?NeD6WcjxqT10lHoC+*Okla90Wx1?B8YlG zpxkLhu!3A$k?bwB;h?}y$CjQ~70X7J3>ql!IkMsMyE+l)INb(BPU%Y!U^*OPmC?!* zBNXLCfvFJrfG?YMTxEF`uu$xRWDVSq0geS&WW#x^$c zTR1Mx;`s>O?$JOTo18b_t?aQf@M6w@RUW_;X-dO_ZrJ#yeEG)F#AQONCOJ)1 z9t{lEmJN1+J(+$wXTWMeMUdsx(~OW2*o7zfYPN@d%QL)+T-z}e|MX76m!(@yQC!YD zd!v=L+I#D9WUtu^U!d1>VXJ2`%F0DO$3DbK;a(a)6^#IiKz6^>2^>u$pZp_@`j+|i zl*wuHQaQ>;u2V08r~Yy`jg{%_Q50_APwL;aEcq@@G2WEn7F~~wT0Z^H`#_!Gnx60p zeZi5f}nSzxUg3)$Px1*KlJHd_xQA9qpPn_}$qu zp*Jv_XW}HZz&D`^$_53LCzjHyJaE>qmC;R~z^mB7l&AjcoEX^HXgBTRA1;wadCOUC zx_rH?(;Ch^U-jfOb?@Crb??E4wexg`0Bko?2+t_X{s`NWq_hZUp>2eS@IjDi*eRnwRNFeB{jiLW z0&42la5l?rI_4?w+U#M?=@OJ(Dum5I!^Vfc{E+0Rxt>>Pv2XB45Zr-^Q z2lW1jAJkyDMxB|jfBs7^QlAIZHR`5%PF+hqlQ$6NF)AKe%P)unPwV90`g>om&6V}~ z(J#JKf9b#et@;PQ{bp!KQ;_i~_H6*p)N5?@!IP)8?B`cDHo6UkCY>)Al~O-!J3Z=H z>16pi5A{SpM4RS&;KS9mTHm^o{OQmjJ*bxNhv-MBtJ+uPklu6BHNss##Vd6QGQ64w z>8Zn9Cpcp3MRb7eZFmyRlrZFFJ+e*LHY;OCsx|)I6F-qv;L9|jxdBaG@tX3}*{R-v zZ}M=@vg7p8=ErfS;k0AU?c``DI$~Yv4lbQPVDM{MflKIu89>yzKE|fr`TSP-;b<4+ zIUxWWqcgJvSNaF3&(`x>~V6Q)rjFQK$N5O*|BUL%c{<#2UB#8_S7~}rineg)HhNtetJb2Wz|AC z3XS0@2=+)Dx(OfUjrDPAtCEPc=~$jTR|6tvg9_-J*1O0nuv0vEXs3ij4)ek%XA4lL5;^GBY*BfoN(+RNZ+$>DR`!xS@-mHw(UNqcYyujmNZNE>9xE6F_5E=JaY zIpJ0KDz0|$pqt(&y={x~ln?5PewkpMHk>8o!N+UsXo>?@;iwmm-02&J-=r1mMebc9 z%SCyoZ;4)rd)j4ijExIkqTZbzS-*j#-qfBMgqdauAHtN%SK7U2+hs>=e3!^Zx(U8q z)C~KrO|{*~EF9o<(9^g{u=(|~lyCD;xoD$0;7g~yJm#Kxj2A#LJOx^=^SK#zaZsK< zv){qNr>-j&We2~XuDU2cOGPo!0qKdHD9h2WB(^={TKb|BOQSlhO@gqib+Eirr)z^+ zU74@V5q0_}|Fu8+6&oje3LSaU0OXrOj!aovy2!X9M%T}U~jyC52xZ@&7@~m1BSCe9u+CmXH*sh zn@Z+gbl*lZ{)?TKM&&eg%d5j0ZmzL!*6`|Pjjn9g^7eW@hB>-%wbr(;)b@?*>^Exr z`c|!7Td$2<+qM4Owc38}dR@JBtv0V;sV$zbl4temHTLaV+1>!wHu>2%)@p@)!FRQ` z*6UJd-Gve?A16E0zo^_9U9ob`p69!2exTVA4jVull6Gu05~Sg%PINCL#F2K|XgLa$ zDQxUI<_22^Up9g|5t%-id|bmX-<`5Cx1KfU4H&%1sY9fN$*X7L$ySz`|F=1*XVp++PVhoc+UbOw-Y@#<1-tfA+N>>De! z|G`0>9vn>!vor#a{A9|#@C7(FSQ*8VC!(&7kgOXv*$Ceh8-%5?XYU5G@0mh)8v2wK zeok=nhoQG|GM%uKm$HQ8(dL&FKK2io{9*!gMBtBg{ZGLrwzCwuEbMa1GE79J&mw z6VI9l9;Gqwb&xs^jAz0YXH#=eNJ)@u0~TQcL-~a632e{FC#k;NzB>DvT0Z(hoJop` zF6yvnnjiZq9;V-?^L;OErW&O~C+eY$Kb;c^PBG#{I*Ou!#;N4|jNNZBUY?H8!9k5y zH)5lY$4AsXr|RkKyTA{5v2k`1h+jGZbpk@2I8z3C75+;R`l2E^El9W(7#JNNuSn_{Ll~9Kl;tztdpH5_5c0a zZ`Ln;|Z3?Nc>Z9_<=UYcJW@x7>YMsR5w-$6N-cb6T2`QDb_{gO}9ck)Cj z8s-t4)bC7JwhW(8h5^Ib#Yw&R1Af4H0bFP6=wJpNrY$;v4s=JFBvk_Bhwy?(=%F2; zysk6S#q%?+TuG6-SI0{=b3`D=xl&!xoAjxO>V z3ryKq?eSm0q9=rur>-n^39`gq<^a0%}Dt|a4e&^%rsm!TBk5i8{~udFqGRi z%SXV>qrRtTx~|J>@9|WSk!Qp41L#wFv@Nk6!I5l=fi_lMPsSXBLc@Ro!tBl;Y$ zh+^yMwA`fYOu;YpB7p+1pmR!tN!(23ltUa^{Hn`Z0?}E(1q*y+)9VwcJGSA%*8-}? zA(#BxRFCPvCZhq))Q+@n=@;2v;~%K=q!V5T?dnd)3hIiZq5Ucf{?~+03EKE|All3d z{n!T6_{xicqPAh4=fZVBL=vsvsnha?bA1g#WTqH=aRpO-`5r-scAl>-+Zm0%QjUwS zP0NmSuv_99y8)c&Atl)vdA^9f9bB*R#;rQr+Nj0NQEjg+)>ZtWxu5yjKl_!eXh&vO z%*l#CRBS&I>xb3kh>BvxFqo1Ejj9FP)8tX-Rq~-d|E7ehvr_|Sge_7kTpU8~8+@gA z1h^Vy6~;3#MDsq8iY5hRXAM)fGq zcjLxR$2>Z!-J^qg@Z?Fo``(B3?@7}CiFT7OO?z~c0?>t9C`+Qx0?he7!ty(AOy87I6wZ-}MTes^b$E()~ zzOG#*(7ImNZ{DfxE6>&S?b~%@>w4YXzFF6{uho^!D|L+q^V+rTx_134J9(}Wym7vI z{aURNoUPx!QR~-k0QWgyUZK1jwY6oCwo%I)>ovQiQKQnRROOfZQE+6QfJUW92Q(_a zyo$KlxfS34#tPPX%Or=r`(lQM{{vDT=Zjgx#q0U;BC+_gF_iwxE6+a9Bnh0!QKR410xQU z-!!M!nnE%{NATk_|H<9_LBB`woS?^nAJ;mtt};lQP1!hzz@7&$7ura$1r2$3&Z&vZ zPS?P=iKk4rObwfXBlyC?1fni^J{S%N#(UcE2&c(FQ#zKob~?ZuLAl08{w7e5^9N4y zT--UgXHAoC5Q_9tf7GeP?S5A^T>%WF0Zc5q4vKuXBuL19L!puF9@kqXyXVZ{R985Hojdh@> z3ifD80I;V=I%zeh>VMV|wf_B9BFb!gyCU4{F zCsS-wY)E4*uu1A%aPnTt1c%T@o8)(=z|BBHykm&Fdw-+lQVS5yMF&m#`ve+sROjb@c6I&cVDmf z50>iSbf#Xqxl;F^JcI}E4>`ye1F&=)BClPZU8S9n8g(Y4KwP9V7JlTLg!~+NbkP!L z(8$*_+fahA!Rm;18rkCI9l;^@s=L5892W=k^cFLoGq;U$K z^+)~4w+2JEdMeQ^PqIWeJo+*E*bJVBKK6{jaFqVk4e^17*c-q&LKgj|jOYV0Za>HL z?Jv2&%jx)l^zeQje~0o;#!qA4Wn$|OG6*i>q%9B+bwge3bRy~EL{~p^r3P#0>KS;R za2%8O6y9)cnoP%oj?^*oI@%Mx5q}D?!&~CD0n)0?1hb5K(ee>U@r=N0#&^cfToh#% z-^$f5sdLoR^V8YdBc43s`hY-foO|*fdo|;CP@#w5adE~4LgY2i;e)=K^0)K9r=Mvj zLZm`r=4;E4q&fD}$cPka7unRG@Q@_R(6pH{%sq9~#2KZE zoS~OnDPLa0ryd~zhPQ&Iw$>R(-KmoAlJP*fyIG!klc|dGnWOh&FM%Oiku|%#7jRS6 zxVw4Oc8OE2;ag|~7h%}hV44Ki=1qCP3w_|Aour`Vk-7z*6J3lBn0}IP-h0}0p4Tb3 za5TL(Nt)Cl)5T^7fBDygF~Z7g2-xZYHYV?Yi6^ife2HG+Lk%Y#(s@Mw$Q~HydH2vx zHS1yHrXHqj%avF9H7S=E0=<9MxyVv*hUYEcH(x2@SyDlekBaJ){%e+Y$cJ6Bn71_+vN*%9a+pk`)+0Ct5TN%_gKGjHC z48UYWXeXn@dL3a~Nn~1{DwsB)DxZwkxIGhO3RbyDrxGG0^N44nLN*20-zD-cGs3Y~X}J=i0zZXF$cs zk@6BGv3t+TFYUpV^Gp}aeT_4_v`y2n=bT;25=43r_A5}+n@@f@T`yB2NaM@E;$bhU zBZxcW!@BqQX}$IO8}<0j527?#RAPIphV1LNZ`REhp0AsCUZ|UQU##sr1XeG;P`7Tr zP&aPhtvfev)y*q+>c*989JdLi2%I)H>&n_%T}ROF&#e`@+FV(ytD9?+ z6&Tk@>$_0H+E`twHO`$s?gAC-lYL{Ao#UqI$-A|>P8nNuWqqTrZ*1qdzPVXzTbs2^ z!@jj~wbnMbYjkz1(6m~-bTsS;LuGG>8~lJz8N!A^?WC%2F7>nqD&_nlj($%m=?ZUSKc=DD$@6x8NH30@ z+Ys8*lg0^v20&I;1CUOK&g1+WcWIdHrOjqp2BV~P>YdXM2P?=Jp2z4=xqaVi#*wd~ zWjMlSdMZ2DZBW=j$|;xTksf=BeIG5;B6UVNx6za*-TUrnTL)_*(YRr_fIV+OMcU<& zt4(&WrQR9zd2WwXru9LS`JGni(7tHd*imz#kp~7*{8E-_pj#&L??3P=s?ftiyMnWE4HC4OxdM zN4%|z2B&FIz%hX;yE@kQq!Ah{PcD;2`jmMLD}SU2U(@J9TWp`U z9TqR_Vc@8Hb{MrP` zv)bR=LGKn*2OR;6tU0&yO*y%Ug!TsF+QH(U^)j;79w?u*8%`OQ?zV9k=O?v&<1TtT zOvju$FFT?y(M(aFspnpPx$ZvyVs!V-SHE6Y*9LWI=gir-e)soZ#n~gkqg?SA-u`3_ zKl{gO^V)iS{FU4F{MuISK73kl-}?Z1wnEeF>{$s#%<@xxCpoI4S$_p>iPOXA-jBtV|J8<39Fx!1+H%tTm)CqaP zG4_M9<)pl`Q$aXK4fV9oV5a^?0&bf9>5rKRE<9XNkBVlq0Q&JQcUa=#Y9SijpiGpQYAQzf$k1 zLqg>;IBvbXRx8)w2e4`03bo>&I6@b45{K`vubvwS#r6Qt;3M}ZonrDx`qKdj{W34y zaYT*4i#Vtk@HoO&j&+`A@XK82WR5n~V0*3(4(Dsn5o~P7!t9`i(B+8c>^$`YP__yB zWyfdKJ>;q16j}02WLhH134MgdbP!DCr!ciop{aE@ww(M44ty-ffb-Gb*PW+rto)VL z@=!h2Zt*DP2sAc}bjja9BXc*)GF{k1+O!jv5nV7?looI|zxro-f%;tV3ARYjJuFXj zvu7QUO8kO|HcL2`+2wi9x|D0~d(Yc;h)Gar^Q&>}$}z=@>sfyCFc9n?{$bmXiT-jjKDG`D|1 z8Q>y+<%jsmNTMs7K0H23z||v74s9DmwbO17s0LUDs*nkaICod7 zQBj4&J~h-T`Li9Gy(eNSZv>k2-faY>0VrHc$Akvqv#AL3t<|OZ6?Nyi0bBw)a2D2> z^TYk4djHYGdi|ZZ;o(BveespL^3qH79F6R)JGblR&0BT#*7XEfSFRBB5cpgp=()PF zUR&#<1WoI!%LGU3wTe?UBC_^Hd(ZRDq~%ejyN#BYvIOwJ9>iswZjQsjuvdw3#A7&2 zOs@Oe7ysgS8y@U?Z# z%5$2ukq!A;5A1b8E-^YdMkqwA|PiIv5DgX1uncBR*T5B6a zI0injVjTp?)^K$e+ExnR{L%9O^N;(KqaK*+qq@RT_@?uYxTLJk?{&kq@gvQ|neov8 z`Rt8P>+SD6sF!~D8v1HMmLAIn?!pHz5_h8yZ9Frxmko#AY@x92AF0`=4zSKkZ>dic zV`)81+d-ND6IJQsesibG)x%o5{7fyKeWp$i@dB{<^4Srsv$Nya62Fz@j0O@5CM_!fVW#s79K>Je*tS7f(%|NGaMG)@UQ=(yBz7D9vu-Y7OE0h~2TvcO+beMv3>2EG z=1J4gWv3nCLK(&G$SII>>X`voI*_>MXoy_Ae)|Q|GCQ}p0vUU}fC9>{v%%hiTX z^Yl{Yr`WGiUAy~2tssN=6r^`HiMFZhMgJmK@#nd6m^z#BNhb9|Ijf4w$k9yOp!fnw zV_x#NQ;B{$wRXdUfRyY4slwf z{{&oq0D9(}-FMH9sV_&gP2-*&lGg{)1_?`C97WK7v%`FhkLRK~@>X;$LpfNE^@dHm zX21fn-c>JRcf$h-@P6B<*sna-_tJKur|im5nS^exrNeWN0`eHyPVaGUTh;!6dgbml z^%h>`eI)S|U+zUWCr2$qUF!NEyL4*#u|Hi1=WLJnC|qf7yfqzvGLWho3>0JaX!;(-F~3?pcmON#_d*o|>P$ z8LU7D?EJP2eUJW@DRL1fj$#;p%o#rDkqdh*EeuGb-f*Atgp=v3;2`(plAXrlB^}*f zY99&sg++PYHiA3204jc_cuKRl*j6~ZNT0*Io@|WVgB`!jdVZA9p zku!nfG_L~WnhGB<{L2&J3R4&WuspX=;eF21*l;~nZed1IZOo6x_2J{kwRbX0uywcY z-nm=1u3aV28r9aOBUA)7tD{<9!Rd5lYL#G!0BCvSdqYbELr(8niX&~{n97A^d<~0tp0X#n9&qDvTyWrp?+oa_+l_sT9hDhA<;(NvI5H>>>jzwmqmcv^Y`6V;cO^L-fkt z=hNtvhE0@|n>W-iv#Rszg2qHXDS!EAGApS)B$=)OSsKqcTJoEK#AkjJEk+5R$^*Z9 zH46+YgL%5~05&*yZJ-l)To@RIf68*nKuP(~h$5#M?}ddgVb4`4L66ie05k`>&xi+GWg8b7z2GY0}mhX z(pYpp5AsPn<+(IiA9JM81n{JDmwtl-kEWm6GHb8b(*|2aq*1yx(B@TaxxxK@e=Es2 zwzFhDscE>{QAg6GiD#snHq_>^*Qq;)xR6EMOardW+=PX`O|H6QN8RUs+qY?%K5bb| zaZkg~eVx-xmE(GCbx_~>?e}W!Cidm7qZO1Dn4Lepzw(6w+sQz;Jm;UzvKks(fN8ss z-d1Uxar%u8k@v;Y{J>SN$w#{O8G!FS(@?U&a1OELT+P<{%$I86^m8>n;0}(iON=`M zB2)Nu%&og|*s#0QWgU9)*MYP5RC#M7rlX9OoZyS{@l zjX3nZ_<%a%^9c-KiQAXI^rN+Tb-Uhr`(C~Njo+-x`K9{VpZp_LPd=y*KiH{K}eskM6%!FMs}%^|>#8tbX$se+4`1w0-&Q zNc~dM3uC;0fSp>ZwM`e$aB87^CBPu9GgvZx8-Cdi*cs^giBrLacY!kw@7K3B>(2A9 zq#o&aXrohaAwZoMU!5!Y1f<9>!2`HV0~1Lyf6i0aY?bvJkX`s33KJ})=bEGx5k2X; z&I7K+Prb1Y^^`(xbDn_NBQn-G3oZb5u__%+G>+`(pt{M=4#G^C1&>UbJ>Ko9pwu6y z9;!og^Fzc=x$w($)^Q3=T`@4{A~I}QDI=3&)1hzWg|)i-;zsJn**VVV5oHsA&74`+ znh)X`#t0Bx1tnX2A1_nrxE+U8TOGMIZzn}U!+CT>zo%_#`;elk7}AMN0Cs8ccSiej z1|28X1Wc-)a@iUEa|6a1bw>#LD6uEN^E!5zpT3lX zC$7by&ij*=w2bnCwB06H52P^`7&zS?^@1F7m7JU}oZ}b3qgmmRRsfdgXM&ua7Fxw8 z_81=wy=XmZ9{Fm6({Rlr59Nci6J&)QvqO9!)5g~#k@h_+AX1(-KXn;=v=RChwhv(c zO!w@xlBKT9E^_kEdZ2I8d~Lp)-VVIH2NpWo_K0jcN|06BYJTEryCU0#U?;VU$N?gL zaWJqr^~bi4e9}MFA@K;G!TDnAxw_nZsV+CJ)Eqv0I=X>*YWY9&r+)4$q>JJTT*Wlw zRB5tOU9NdZVLEAXC{@5D1P@MRbOhl&{uz0up_V|lP9rG_pCfQhJDrN+P`CGGn4=l0 zlE)?R5rV^qagH?x;4yU$((44EoI`gQI>l+i1Oa4J&N6wXFr&2WVV1%*88ii5@e<%9 zKdcF^R(bzh!NfDn_kRBMvlwgfA#Ex!_ok4f(+kg?K5=kxl=sc%7l(Cw^LpJR_*z|A zt`QBritWdSmj^BwF`ywN=y8;TV8=!=OQ2JhI2-f?-GJ{(Ygx)JhKggz6ixn#qqN7M zvZc~XLtv;H%DDNXg8;+)n>@!cpU~ehbl~M5`A~R+fCL6qI;Wg1gRdX7ibh3J zm!iVZ4@8Xo5fukxf8l2ma7NDk?he6#Cd@1t5gQ&&vr|~Z2hNpsdjG_igjt=CRQXyv zm3D#q;qR1Zw37*F*&Qu%_*&WdKH9X=lBcHC2&89cVl1>!l42dvPzeK;#+WI4r@+`i z_7p_Q*U&k=5IwmdzhAJ=^qx7V{&gU2<#z?a=n!-aN2Ec1kPzAF0L#1ZR$77I&Zv69 zBc3HN;yhCZ;emX$-X*yA7@E{Q@wYyxUm8{#1!&CF;Nxy&)xEAi0EG7j91$OA#HZ(( zFg=b|multudX3f$_D7W4FPUGS;i&A73vayxKZ*yX*s1?NSAQ04S(2saVe3xkp5e~- z#vGZEb7p1MT-7x-x_U&RsvCs$05l|kXn+)9G(AWriJ&B!WU?}oOfPy7sTV%cB$y~r z6ipN*P%tzaAb>`X)m2?XS61g-IcG#h#2wFYXMNxA=VY~M-#D@N_U*oW`I>w!ci+Ba zU#x>a<<<7Y{s^1&rpNr$0nUwg)M*~&Tz*WS%OtZ4y~zXm!C#X@0SZ@qxmPx%9e)jf z3yOo7StaKweo^Cgm|N`V&c#=%JAS6dLqCave&U4t-jRb@(L%~*wSl{^8F0}_TR(-7 z2M6d3)J`G<>Tm$_Px+K%sjHD_iZ`hsg>*K2bZ~5&`cIpD7xVO3dvQ_S!2liX)p)c= z9TRl8lQPyFJ7$}J>p&I?0Gwv)+o}+0Cj92On$dbUx2|IoTrOsZ-`*S0b~W9j0Ea6P zzWmj%WtQOGmtU{9U;nc#>-&{o`C4`vd*jVF>j44S(o(lN*EZ|fFMXknRAti#?j|2i&Z1eBY)rrV}frb3mel@(UOPO_W=E!$%K z!d9OaTmsc>N$?`wb}iATh@m!i=Y`F>c6%j`IB3C3*jr8+vz)fuHb*9@ zOZwQaShsdA4z2iGt9A0gzOQYJK`Lps#U+8Z-Pup&KlTq8^jbXUnOVWL*XM2xIq74^ z5tT)kAVMT*Xz+D>G7fIOcdsm3^GEgZCyi%I=o&{FEo=u#!6#0;NQ>JvUHJ$(0Bbel=rpmn$C#XzuO7}=`>Xk(3_(04|``nPolEkQ6Gha}gCTsYc_)Sh0w8}ZzU-Op%MiN}cD-nFG51>yl^MxId zw<(QglnHd|2d3@!8)?$gS-kYK))zkt`JzfEBK!o8G}iYNN@gKBVq2)sKkIZqhozMj zg0IJ_HXp58S*uIzxNSTIw!xr04icUfihNp#L+3~1Gh1#I0RcgqI@?7?!o>iZPJt+N z%KIN_^m%jaAR1@4vCpVjX1`Dxi37KFF`O)s49l`#`;#>+}^0Q)gA%Zpv`d6IrFhBJ5)8CrY@ma)QCtGU%`94go0%@s+b)H^f2FLrmKyrG8zFVN&As1D8}M6Q?bHfC zcacm0*2AIz(^*nK4`8tCfj9@B$OGmIX{LR2BcZ8hX~^^FHfbs!v`Z&No3i7W&C?#( zNQ6sXn755^;vhjUN5mZobK{)QmGY)*MC=^BHkkKCd8h3)f;yYAQ{dzGtK2=wnUj;n zYt-Lq^}>VMdk*r6B(62?%1q;%JP?j;LhN!h`^I6@%$B?jr7R7d!XqWH_}5@4ms5F= zW}YISTngHsyfvTjg^|GlZ>*F2@-u;tkr4GL^A^f?d#vaqNZ_GP`b@+)(k>avk=aDj ztwS6i68Y-x3qcch1<3N#!>CPK1^Gjxoopgt-Rf=cx&4eWQr4q7ET&?-%ub0 zcs4{`%kG941A~9tq;9rS-rGd6jbzX^VQIIV!CI)z%P-gY{;e7w9%c61?W~m}JAK~) zFt=RIIPKJh_gSb$r0DX!|1^ zrfZwB8(n7^`E&Qa)~?af5&GS!wRHj&aB{g^dshtlxNM$YTACQxXoKx5!yW3$>_^(3 zYM_hGw6ov?a6E2(o4nzn`lg+dj+v2Jq~l(>M&L)=4o9Km4*kYLzh9lTtM&Y|kJXip zr8?T*tDVPg*MkSUwEd{wzSyb#i(U^ z`~UQx*4@L?8mz9?fA)|6u>R|R^-jI?*08?!#@)I*UaS4Hr5Yc8SXZ`}>c;K$`r&tf z0M5;xO0zaIquo%3rP*oq)>dpWIFs&@yIK3Nxih;70h4Z?CQCZzIAz$i`K^td^##ON z$H-F6L4ump9mf(_(l9GEkUQrXO{RoB%B_sG1azlHB6OGi|CSGkA$NJZXMHJ7)d8_-X$r4Lo^l&~D#B z0_CJ(!@+aA)((hL0t4C-KZShWE1ThIYjoPpk)Z`Uz_Fv9UGp8d`Y})Xg_- zw{1|6REV|#3VA(KM!vSC3p#J@tnpI#{66VwT zS*r~0PM1p+XSOtOkw^Z-)%r6VV|!e4EDgABhDz9tXNm`)lkUBF)Rnx0$T>8%W2L^% z5)K~iX@=SQTYC&nX6xKf&)g881tkW9G3Nd>lKkRK`$rxtR!(Cus%U$v<0?81aF3wuoGD3Otl8 zf96p~+Y%M@6+o6zClS%epKxujV5CLlQW^={XI8*jI%;3km5g$t|C!bGY#GX{GoFP_ z<-yzhG5pkNuw+HTiQN&Vcp<|drKNB?Wz;#i$T9Dm6B*frUY?aH<^9IaT3ugXsUQFD zk7GL;Pw5c-6Bo+I$ql5|z$~Nm$tCrq9R@|xmHfd6G<=NCI2x+V2pbACxuIS`iLr3g z`k>mYjgz0Pxx+{D0p20M(cw{@aXuN337!aakexGrClhrC*-@7%+$VtP_6F7O`t7Oa zaJmdmJwHD`Az;{}9h5yD*YW76Mti$80-p31k9lVvI6DJwFPVNKbZz>dfNiiwJCqf7 z(Nb^Esn?AxaKO>!ybne@oY~D1N&cjx^5=kzv`xEps^tau^4fPc)xpRJZi3E}GA$D$ zr|??YUEkO!-_1Q8o`U;vtt@VU{&Ic$doR}qhvQnkakD=0*qyrAx>C=6{wwv)tMAtw zblOEHzCT*YyTDtUe$-gmJ*!@S9U67(czD$8)gtsdU#$P`_g}96;eYghuK(n}`lI^Y zAG|}KJFfG|2pm^y?aE`dzSgbt(Fe6P@I%-KwfolF_|pVG@WR73x#Td{&{y$|vp(fL z64=@bjg(b&MEjdy3;IT0xYt%nQ-kDd&{DA_uY^U>bF0@z|}l_5jGisEj~cvK7FRjm3AtN z(|%BZ2(HU84Qxq7A9_?px?Lxz8f(lgI`|+(rap{x1`iM0C|~TSw26@u=+o??{g!mH zh&n+X!UngG{2AIG+sTdCv^MJZID3HocE(D50GR|f{G@r7I@(UtI6_}%H=vW4`Ydvj zb_rPt`U^JGD;vnsd`t3J$CSRafwN|Jo4pJLEMtRcgU`H|zCN|T*AG!H+pHPwvO?0y z6dUP)t+cle?Roltc%-jno(xz{WF|EavYq}Uo9FcwA|Oo2|o8e?x}!I%3$WD|}EB}9|3O-MkF z){CsQSZSCtB|=kT^6L2T2fnF1!q1^>{l&DVl>VuL;y)91-~rP*C0H0{8n+UhED$*m zgNM0favGdU@(`ok8gFA8Bp>;Ib5i02YtW|Y;?opB;*id@N@#__)oaRz*n!rLX8fpI z$sk`wia=KpQ2;F;W%kGOw2^ZlP)E`QO&d>-&u}tuCJ+z>$xShQ?jf!jt)YypFkOMn zGf4(a@r#gh<)e&LL9_5c{7mOT`!zZ{J7~E~@5lL_c82m%=ZkdjHDtM_GV3@)^YT8H z^{DU(tnH)#i$Tfv+e}Y6M_GVJ`Q)D(4uI9=@kJe9*cnk~Ovi7>!y`wsb)r4&a7~M| z%+L1#>~y^jeE{kyU(ttdcDyQ_PPT;55y&XAFq8-An=>R(ZiS(&ND7i$y7#tI8qj`a zE1e8-rc>5Nf4rSb;1WrO#u~nStdaDLv;j*x+TrLd`VuH0sEaxg0%>96GPBIRoy{o@ zn@D)A0r9L;pv(X{tW-XvvpD(Q9?}Ywn2I7zBfB`0k3ZkYULV^_DZk%3w~#40k{h|)i^#w zN7rzaFZaP&{ZoA+%(;Dhcr#;27!Js_&Sx%Ys zi2Venx55;T23vV*!JKfYlYG`|eh02h(m2~egmS=Ef2FHS6of7u^*u{}NRJLo>omWI zfugC(jz>CG^Ud($&#WJn4-O>ASOV@p|C4v?(a&D3#ewbSAWu3h&Ss0O0YH88o(#aU z`l;*(dogHINo{6n_u|fN%5jkqPleiB@H6PBxlXN)KVN5i+jV$!P{YxXpvzgSNsTg# zMZi8D*67IX;CE~2$CvjXWLC@BYXkq_jD8P#-Rdp(k#lFr8V_cC_I<9*{vp3Eb5kxw zOIm6_9H~{#Tz(_1Om|Q&{Dlv8q6wmrDRr^67`=A3i$B|KT`6n3&BHmf1QINAWFBSG zde3TYa|>sAg=_7x_ERSxe2_KaXU2g0D~~@{Pe1pG+I{`)dh4}6t5vkvt-QbY#_RR+ z%RjD{UVFE8)>dk~x?DGZ_GjwF*9pMx?bhai;AL^CKK=M+{rK&7>c?-sAGVA5Qm2nS z>%~@Oi6wPi=6j8u`oZ^Kqg}Kg+4OzOom-#5o^|W~JFnM+4_>M(D~ok@a9npkbo+Vf zqwMIob}|bzqmhC0joY{5d?|Cz+Kjn|Oqt=-?u(8x;oy;Bg}Yt4g!I^827W&FT@Fu<@<5J1?(#f9F@^|s}Gdp z#$)TY2XOXFT7-7MjI2kNfB@a?pKP#*Q$ZU-Z~h##Yy792^b8$LTGjiSUyvufD;u-oe>uE@GNk+&V674Zz}WxiO>UI0K&{O4FzS* z?-8LkAJ@XMUI}f5ncYgBmR}m%WUmu&<)QTBzTvWprEyT`sT7H`cr- z-Ltz(x~r7yGK+-qNbqHSc2qpi2o8UqZH#z`zkm72DY*Kqb<8b*Q;!^2aS1_!Lh5o^ zq0humxh4^OFhbyDXOQKJBr8+OQnnZ70BJy$zel#TuTf5ecot)9u;>z0cLnv`LYH9L zp=$>=w%2NTr|rbKocASgSWa;SCj{a{3_smO_u{Y?^fox0IcR~7JhQd4!(f8CXtd&$ zQBLr0wuZ#u#hEne;xlc8^znL@*CT_mq|@~b4TEE< z)dEw8_-W+1lV*;VJ1Y=a;ugGYm$p!W77sgd<&r#NPk!5C-3|YiPndCLIO%w9toLx> zKd4h={MPfE*kt7d#G#kZn{AxZCAuQL(lnc!V-_^fVjokUANZI(vj%30Ot-YOn@o-* zpMuN!;aBSH!)x{7aJNoJ$8}D?m5(Y@Rv9s`dZsN?zO^5dF*am!R7VF7YIpB`jV1(W zIQwJjNM|j7v8ld~q-_u>;Yl~I{cE#*-eco@M#D0LPaT`IJvv*Kf8q^7AJjrP{C8n%^XnMAy1mk)|NJXQO>fOnz|f_0AgsY4OAFC z+b;&ySPAK|^N}4-4W@@B zg>AY^(3K@uK-f>n|JZ4QGHtAbYmr4@#{R0~lxvQkPIH4h(^2t}9;gHqX$#-$; zK;k9AFt%laU9YxGQdl9R_LVkBub;F*d2jNq6B`?8{rqCHps{@%3Df?;=U`@0ex6LT zegJ(0+gZ5&#!_`xaH0nUV;$f7CJQ!NJL0lb?au7=65AEt*-arE@g2cU{cU`ezvi3L zguiC18!fbZmPskvBmNRh{SsgGU05EmujF*al}Bj8v-HKnP(Cc5?5$1q>DDb=;fQnk zaQ>R_sob=>lAk(kkGJNPt}s%7Ne@o^!UxLvOnNlmn|_rfYnsu>qXib)VPs)ikG3VR zn@EExJcDB0py1At`uNMBtM!2|we!Hbo7^ra^T1iezASOA-it(F#wTd7ouPAJRoHGp zAO2Cdo4xs7eEg6w5vcqNuC@h5&E{h9s$5StWvvmxdIs2}H;LXF6d~l#@)T(T8{r2&1hQTYWE|Yo z#ShQVL z{Kz{IC+_`V^f7`m853-gW}rA6jcZJY?=!#0Hnxn<5T?(&^$w7ttZYicsT2^-0R@fDa$D7Y{V5_sn3q^ zcyC_uk#CyCCU>^a>Qs1VZRG3JK?5=6p#^9d7;s2{Nt%aC0F?2zsemKEEf~`{MB*d` zaIL_5<=OVQ=|<8hEB%a|q@e~*{3!+@lvwGZfy4-N9Xv^Fd;w4EFs}#CGCQDN(guS~ z>2D$NoOR4PQ9qOto`keZp6a+MFXAii@;HvQut*P7%IH%y*;cNm_Qh-M6lF6z+Kh-LI5^7) z?_ zQr~zU=*nkkX7!{&H}Rgezs=S+{FJ@Ofo08S3DWa@NMOa`fyQw_FPCcb^rx$H zrZe{a65qR8pp(mXzX_t7Ol43(zJQy*)J{ETXV|49mn`n)n^P0)Uf!*QAM(&()^A;r zz>oixL2+`#{iJQKL1OEVd~Q4V*;;v{Y$TmLGg~E%)J5rGnoAwsm_qzpEsc#?juM(H zTTRd7I75T(@_^vyD!BULeev;kmeE&fAE(wqKM1$6x>Y+j9<96Yyiq564{QC}t=hSD zv+nLb02ZPqY<@3%`O9_fW6#%r{r~)LYw>VgKmV&=$KD>*gLm%L;_$tC?d`kJbU9Aj z(jvhU&b7Po%`bIpZR<)cc6+t5wONCWwfgYhz1a9=@c7Zc{=e6U@BT?$yZPxF?cW0i zg5qWn$}zY$dxfsjCYZzJMI8_KxnHjJ?VZptvpn$3!9xd}&I~#@yA0o-JXU_Bt4sS% zpy`e4x9ZA`N9acgz7-&j$S!r*U&Xd6W!gylOYNn47lDHAz!#=Y(@BCIFmS*u!Wdxm zsiztA@!1(RN_{qh9HD`Vc-Fdh>#^6_ znQlVcPJromy6mth-vT7tq@A&!MBafp!$rI2eUsTnQwQX@i&H8A-G!IO!P)*GkjW$L z;3}_3bj1pwYJPdHme((uYxTF$BywQ=zyfQY3Dax-Y%ehN>nvvxt&3%6{X*l3Hq{ziT43`peHv%$ z4ILv5l$TNDk**$62QY!)GhxWn*ag}pJacA%A@xE>>~@Ot({JDb@`_!hPV3771B_Fo zZ)W*t>DG~Q+FyJE^@2yzInUBAI8AGH!8Qcchd^(b_SDd7k#jPf%2=a<`X*zL0$&{FLmw20k{)&6Fq|-zJ4M8 znaqf4H+o4YJKJp11YQPdkQbdmOZ%iuHorq0>xCMUGR@(ykoN9YeK)wW50+C%!f z+%d9j9^kkyf%v9Rmavr4HmINaelwX+9;9RJ6tXp0TCWES>+nb&M85Hl&ql*K!|pHq zvH_Tg0~mB#g{_5+F-WY)HDNGK##wcHZeA;vFqZv`KOQIV?D$DqW3ULS5M~Ntlgmvv zAUbF3wLlC2WmQtAF*Vcyz>&H_jE2AeO&|G?|Adp9)a{}36HUrt8>!iPrk$ka8irFM z(q_~|2t4!GjA2t8YYssoT+$?}*)!3f4{&VkWn04xo*11z)M(j0~Fwl3e z(itOwb`W-iE)^LW92xu=L=AB|xE|42jp>XIM+8{p@!284(xGVtOb6ui`3T3vAj)TB znD6!O(Ws6r&-G-|X2FKJC!nIvBLbz7vsQEz!|{lqku&uibGAbpi39f|;EYe{G=V$z z9Up@?l)@lxXdU2T5a^P-(eQw@`+*5%Bs27p2Pi8Ywz6j1V-&fz1J%h>)(jI&gN%)5 z4MON9A5^leM~;kPIFOmhHhD8*N4d;G=72l%!z-E;9?4ylFddXX)yf4s9Gv+Mk&LvS(MTbcBr` zR<3kAYpP?>9C14pe;O;Qrr}vG2_I&o(H2+-!|m6Hy*EY->3LY?YhVAN0N`?WHE1YdpsgNkfx>TGn8FKM&L z2KUy{`OJ2DAIF5YS+>cix^BDdPN0?LDJx$s8@*TS1KZABSWW({#&qw)cTkAk^FHWE zZ!@?I0yz{W&!kU7-%bm7fZ-wkya$Fgf+Hzp@_*n_ndQYT?TaiZ%a&1w8m<|+jIFVb zi`raWsaJmVK@D~;YxB-Jc^VELp^xq5r);D_oHJSv&S{Ud^O^N>pFt5wWgEm?e09i` zg~*F#kgdVV=j-I{&3bV6ZaujFVIA%t)j9Ue%`D`5myTJ-yzgd29luk^kIwuO9dmnc z^%w;W4ef9jtp6PQcX)t3+N-n42pOADAN9gJb=jp`+JVeAL7Tt;Svz@c)5+OMXzg;S zFu)c7JHfim=Pxt3cCtLpb7dfMPJ0b9E|F)+K^ZTkyZmXpNdl99I^-MMH*iANp_#hk zz)FMLoL6PZGL(g1k3IIWtTZ^e`+?IYwYGh|uHC*-uf6kr+NTFLq0HBR^RLz=^!m>4 z{Bd2`e7x3gY}Wzy`PCo2o)rtw9wolnthIG{Id)oH@C$;m)qqVxeNq*!9xsb|oMf$d&X*Ltq=p5%q z&OrOnMSYpdd3!GXTYuuAL!|7q(e_rx=7dii6Z%_qXJKmdbI4cfv94^op@~Tv6%i0W!4tyk&{PZVF{ooxOu#@^Oag=R1@EWD5 zL%EfX$hPHIH&^P;r*Tlq54+y?`RlTnLvXpaB(IuH}hFG7c z&7y>bX?x=_K$RKmwGJMNQxigDk#u@WG0VWxPwend+LedN&oBNhXZ|S@%3%IfcIs}l zZ?dBu`-nD_R*oDjF=Jab#-DUb(zHKMHvXU1XWtOpADBr=eYqhmzA1+RT5u+97LeKA znS9Inyf+q&K*obBmz>ol{UM=S&br$`Vrz>Li+sufzAo@dAEEDLc7XXe?=BgnEt0l~ z%q+VaNU*?A*IR$1{Mo;N8-Y!BKm;#?oQrwd$n&m!xyVI6Y?Jz-ZKNmw-3c)|9Q@Q1 zYzM)YyI`8vNd+5b8?zj<6$`C{H#G5^z}gXYUEalpIs@jlI07_%k1_(j<`-Y_nGMRS zN76&Csh_qCWs^A5cItyR*rr7;NY5uQrnGn9TN`6@m1A)`U%>ud^y^>@Er-Ke8XndB z@URx}$FmLnEQs=;J^mkr5>$y0&;*!~PA)hlzY6DHf+F)+E_p?Od>~}G*%4=~W#O28G0_qVjjfIZ0O-wtX zmV}J6!+kc>2o5~wzjSB;LxPyeA;Ato&yY@PpD6m^=%|heoC~Lj2FR^FPNTk?Mz#~ zQ9{I?myqcY$G~>`<-DVz!$MkS(G1$i(*nR|NSy&Ywk)s=2KPpX$$Q3mJldu6Ljd7H zh>bAoysBiFc{$HdMa7|kmND+~C!H;Mq_qiC`ZmJ=7h)VJiKt~s8?xZiSksh0*Y7rd zsawF}S}<|SkUdA-(^14(qmu`Q%W9k^cYAjoID2?1ad)|Zx|W@yT;C6d>ZS6cY*|Y>J$}-{j#fhuxz!MG-QGFjN1BE# z`er%cDu2-p&aSPOhB408Bd#P!@i^RecF3goYO;hA8c(mIALJIU!ft&T1tirx&hAPV zWniX19?>uII{KdX(yS-6*Kufpt>3S+U9%;*2|%e^JJ8?h)aphbhkQVQ?Gi*CCjzh| zU>=)ScsTBLQk{#o-L~|LJqRt8llE)8X=yHPl4lBy`Ryb%E_O@;X#vwz?_rkZT8FNj zHoo`)$pn({R2eqEx|6*8>4-_~v^n+4YaLiSB6Bp_q=WR{y3N}V3cTPx<#WTwEUnCp z=N97;^))<|obZ!Gc_)n`O|f(G#!nn9)r0+$dgHBk>hUjJ2LcB$({9SPV6aJ{aN2tl z)=$vufI_PfTW-hIXd*6PmurtWzLr(arPsSp)a$?ZLA~<*@73$Ce5c-d{rh$A?U(D` zn=iHZjNW^__U`Xu?;NDUNtGYyh09~-9WizHL-=L~nQgCu4cNfOT?`(RqXz_H`+47M zd^U+=&~@epxiwJ8OdI*dvJEikJm}2AHy9wjY=>=_3!A8bJPXK29Cm{=XrqqU*~3w9 zp@;P0hb&rHyXJ-$(odb&bg6sSZrlmq9QDs&n}Hq9Zk%w)rOlCMgWjMXfAq;ZCw+47 zUd>^T)^9vg>szb!@>_4FFL7!2Joe`|f9p5uboW8M_5D|?zkR3PIXJ4%eD-7Y-WzY% z`2-m}x?fA~06FLfCpW%uhtb~ZMy+jbgTuJ)zV+ie*n3!?dS<=;{Ez-wz5n1nD1eSG zZ`5Gx$=ZMLX05KQ0%sX~9RyGolr1;P=|v{B54-p7*Y=I;)uBH7iEMI$%p_<7`DKE z%-X?Ciqe$8%}hD>vl+(u9uE2DTrCggYGuXmD>?Jv4wmr7z{|iJAH*4j%uoP3%P?&> zkky~`XZ)PZzM1Vckg~;s5C{31e%ciC ziIRBnPZ?DH;$x%^aGP`Bu;J#P(9#Ux2bTBb%{A%btSq!y@5WzIpV7Fjlt{}-=a=>Z zL;9qQ+z}llfi&+OXo)YnV^!ms>|zw=F*7AX-SuvcuF0fSkjC33Vfo(b1>dsfI&%ybzGf-+8UasHyb<`)JG zOq$DrsK;ky^aVUem%13>KG9r!$1Y zPQwmf!O9Xxgwat~-|ceBKMHh7@JD_}#&xXXc*8QEpZGo*mOP^|)ZqxisZJGe4HnH8 zq2PMFRfr6=b*u8iknUxWwJK6WKTz=0{~zH0@IxlbyiGx zzJO_5Y-=@PIFObf&kL8VM<1jZ8GJfOF9_R`!af) zt!gRfckiT$IX^P+mRXv^q3qP!#vn5x3-j)z*+JH6=iwZIKDcB2WyL({{n`h9qqpr6 zS9O|)tvy}`zeWq|;gotCk5X-D=GnkXFj?XtUAXxPPXtLh=^WnLcFQTRmTN!TtySle zqtVj8*|YGHx~(%$xDKrFl}f?`418!W_{P8J1oz=(%77;{x6@9L1zlQw?OCf8Sk^;= z_O07ntRMc#yLIb{jp|?Rwf2#}waL2LwMXjw z*o*r&>h<3r*Y11oUxy6jYn94^r>c$Qvq zocK8!Y_9N5ULqWgCfFV9oixxk>5(KKd9+!!)b9&sfQVk-nH+UQeO7To(RX5c5Wg=ZdVr(IZI+o-Lz&APUIvv%*kR}=2nuU-S^`Fj1Ww?L@b*c*3l z*Khp#*Xy;Heozno{EZrQcIt?}B(S z-QBu+`v$c@3-bA{FQnxXO7pW{(msigxU{92HU~%Cpc}b-`neYxEqKtK4xag9{^8MK z9gf<2f6`A!RvV;^o>4HLxo{Q)UNxIXy~uzt@@|Rw;Ij@~0yCadWs_YRl^}p$cnur} z9&M+6kNj@hAils<{DGlOJA=m#zJxBo(kZil_HgD^Co(g$@C|6e)^g@oS8T8UkQ(e$ zvxT-#;;66o-v*J&rto9CsN2m}v?J2NzVyydT?MXk>35fCv#SL7U2?6?tFu;TTVgwa zrTj|(pGlX@$^)zQUD&T6=5w#bOMTInG`lGcW6#Ws4x~Q^=SFw>sTFMhDt+z>cE5Lt z9MK1o7cStGOB3`J+GTZ#cu*(-p=||}G>AVrtw*H8TdoaU8%_9$VeBI&M7kY(aly5U^ z)~I;f4jywhHNhCqvRu;)w4?b6+8Sv=N#R1v$U$p>Dc`kvoguJP_O%v1?W&MKS>#W9{ zFTkU%>X@gGZ-Zy8>FQGpu*GLK`07N2xHu5*cevWen9mc0xjbDt@E5;M`IXPK$@bf% zfTrnbEjPhTXXgJ=Et#yb@lZBp z2{k&MPvZoehTnK@6*$V?C3;A`lcQQb`f)AN*DZYg*Z=KrMgXX|2`lAnfXt$zq=EGG z0Z%wktj1)RWJ}58k}vZpYAQkNcwrud(m?3cx`b;m=+yScYOSrTV)zGKZ`2M!)y~>_ z?QE`-wpLr~>$OGt*2a2WSzoJdp0BO0R)0W1)?2AnoV0$Q-|{lSRxdjUb`8F`_vc59 z2VT=5JCo6+Gl=nqKz>7M7La8|4I%QEb*jn7^N-S-!!3PU8utp6v_S#0MLKC3+!-%1m~IioB%01;AnZTrPVC>jBsS`V*PAeYUY(qUc@%pK!&ot^pu_oM|5G(bKj zzwJo5=DZ;K4IgNu11Fx2FvlQ)l<@W6;vibm!pa=aoMCV#$M12a1CeJK0;%B)sftW< zFaXM@&I8!XOfo31ogS_p?eg6upU;Axba0`1Q%qmfo|}%0q%qKW#&ZY*N!tirTjBr@ z#MOKpwrf_mW%w^`iITfE)w6YyN1QzibN2p$MqJw4QRp<-{LGS2b^a3sawx5QHq&*h zQbt-^AcJ%lXJ{==%)niOQn$*L&caQ*Oy_B4rg@gpMR`O$;gM}dCJaV3lH-ji%&TQyNw7jh@4_m9V;;r z8p(ks9oFKgV55==8Mr}j7tgn9^vW&l?4WMldA#mC@@!qd`2>#oQ?+sJPBxoZ+q_*X zgB|3??{7Jna#E9n`*rk?VC?<3YxlwZ8Xg?f5SwB%rH6LJW!!FouFNeHAQ+IjvcQcd zbe!CB-EV<85aeeO&T;rW42l+!k@>E&YM&@YU8S{jw7+y|m^{`|Ij!Dcy#^~A8QgN@U;UbWhp*Y1PVTkYn;V<8xxQWJIA(9Y z`+i+^yLGy-T&rt?dh@L}307^>X+8U?=j#hU^Tqnk@Bcxq9PHO&ZD1dk>yWl?TwAI4 zzW)ZnBLU0V2s_xV!TL&V?(ArEYyaW>djH2S*6xRQ>zOAWs~SG6KY#h1$e=4s>@#jW z|MLkTCVTg4l|CAQ2u~ddP(C{J%MPX>80k0sX4>|xn-RmdnMrf5BInaQ_8B@~vq2_h zNqW1<%F;@=Za(=G_r4db^LJSfclT<4e-B57eiKGGdftWC@?B?Fo1_gFZ*hukwmRX` z1_!8M1J!eHu$~|pnT_6rtHDz~Nq_rL@v87mp3&L4Q;l=3;NN@sJY+Ksa=pFlJ zy0o$d$pd~6DfvlFnvF5dI&2%&F07yn1YiC2`C9AF;j2M&@g@LsM%h^m12FCW>|?&^ z+rdG**y!X;g*a=QsDskvq(0l_U@kav&bzfFIJ*>`RPMwW+|pkDbDYE-f3uX3dn~JL zOM4THSx){@#+sU+L80VPUhLOf;1@Ze4)xvVwplsL3MXv1Hq(CInW3znX+To0wG(K_ zon>SsSO*vLNPW-Rn(#w8A(r1&~^ufL(hKxHfe@xJXHh>d9;AzWTh8SA`9*fYx zK^E~`aAgsGWP%rDRJpNUH|=sW58vxd8|+JAmiT8GB5B$UZGto9wz27N^P6UY-ICYP zT52?Va}l3deUJtcIAyWHjh5mt3uf6=j-ung&V` zStb&FLfF;Ser<295>OFrt*zAh`k=P9w(2Uu)`s^4RoklsRD&+TRWIKvS@FZMezS-U zqMI`TR?lE+srq!L-EIq(T&~c9D*`S*B&!n#6OFPR=`dQ&i~_{ZR3|@oRBN3zX|&Dj z+>_t4ODScVd0Tor`%~eY18&~7W>sUK-L|9?G*F>rfZDIaE#p)c@1>!K^pm!JTzc2- zl*h;5N;~PieCEr?clY<}J{`@--2x|WS~2D~jFGp4Qs`v5hBEa<)D;SOrWnCM>P=p% zwQlp9Q{y0m5P3L)EG~^MZ8MF$vql=tOPkb54W#-fZKTzV z_n8GlR%5=Wc}2>)XUi7iY{)0l?6fsZ84V&W`S^=*7YB@03^mU>w9|AlLYIbP0ua5?-)}_M;U*%CqX88(mRr(>@IfE$IZoBTXP9w zA2?lb0q0YGN0d909@Z%e;4rsTgN0qvz?W9F9TBJW<3jmp?P{{5&ZP6>&#Gs7E3Fz0 z;hFT7Zv2{&m7U^D8SdkNOzY4#WCkOdT63V5&7nN`lWroVDVNKsYzRaChW^nl?TC0a zxI*&R?6LKMzxXHz!r-yEdeL^{Q?BTQpl5V<`V&v{WmzD37rKk};dheN<+&`_O2lwjzx8A59zx@6B z@oRrp_uu_-9X$9zNVU3iv+g|gT-|=^V|C}5Pu3$(eWITF#24!3)1R%)n|Eq?;F|j5 z%z_;3-Oabc9ISGidil82>xCE2(8QJ_FP){H9FFZf86Ob1?_~+t8NYLbG4Ri>gV_KE z9qe@JSNdQh|E0b3XckIdOB?M+W<_kC&w&AvxY6mCk?OvW?Q0x_aL`MKY@xQVxbes$ z_I-#$<9k331YxVBUuY(kwGW-TbM0EKUAs{a_usGk`{O!>wpVW4z!qKBI|N{-ZpK7) zpZ(b{*R#(*UElv#zgs)dXJK=rUU?U~JlLxta&vrlzvc-xCzB5;f1CcbS3{oNeea#x zedo38D7mw5>ilPJ5vGu@;EeyhdRsWUa_()Q<>Coaj zjx4{y>N$3No<2Z$20#Q~=WVr)JT~B01B5Ma!)N71K2t~f7%4BWpp9wfLxa zcj=saexeuNa}5kB?#dp^wLaH;+R)Y}`C}E{E3-bg&KdoE&tG^xchyif4l*xzr+>6B zCa;J1iSu6!kSLhv)Jhr8jjqZ>_`uQR2HNv1xGOKpR~-E2v!sgPF8QZ0g`wOClKb|) ztMc2*HPz*RpYuy!$JsW={|lb;bv!0uIianm^K~@2tW$kLv9bT9JgS|5$(p6*aB^0M zXV8@}L;K~bkq&q`4-i=ZFL@lDAu)adHrK%teT#`RUj$yho|6GakOD38;4|nC*+~9n zU{O637jd<%-f=LMJ+^N*Dq2 zgA5OWk;()Xhs!5aY8eI6c4$f$352?XPHk?k)Q#<}+TPsG?3EuHUhns7ePvLq1X-*7 zWt5L!Mz0K(Tn^|*WoaDsW~PY%PAAP}772{_Dflu_3yDAhxH*mdDm=;L(bAD%(HF?2OXqgW1euh;ZUfjz9G*Y z`GYBR+`9+Pa2;3A5rXCR@k)0Ue7Jv5`v?0q9Gzqd;bb&MA?yqQ1RUw363GuM$+90{ z+QtNBX$OIpQZYTekFgRNc}N?)7We!EhSR+&?kuQD+oz3CVazW`WkH%rrzrXqml$2? zG!@SF9z|20HUfH%v*5BrM->r7yiMgzspNN7(GJD5ATi~od1tbb(Pq-bQiXJe)R|DXcemI~1`NXFcY<~4&$Ex5 zS?=ttgfHAINr2Ysk$BkAB`<}n!|P`KR8;<-;%lJaI$QCy2I>c{%V2GQ<>Dw{L8Pzp zXx>H${)OM@sJKvBs)>BGIaIiMg79BFJzvmAA5GN3HU?4ZeWa0(x}(|Ai2QKLQ5O+4F7qq_bH4MDaQ+{xx3?wbrlAipwnJmu6 z*^V%a3~f|dc*1S`O()1>@l~=y*E zTn55gCFGy#>GYWK**d9FunD5=V9nKFik0}N!!m+{hsr_2af&<7Lv!jFtaR$Fw?3$2 z9J$+{yfOvUcrE_0HMYSzY`QYoFriHe;*ggq9jz>@AgsqWOnP-oC*_>;A=wN>ZfrEdD(rK9Q#y*~X*uhv%R%m|p~ zyS;ks@h56?ZLNrzYMp)uiK$%zvBRU|;DD&5nd+k-8t!%mz*wfOwE1j;194KPlcRDo zApnd zJ0J)4{`%Ehb&A7wiCq^)f&*>56oVm)3(K)Ny}?>txq788c5c*bFa3FqhLdbc@$6IA z37+1q58l03i}D6ozwk>xTeq%n)Sv(B->=tSdbzGYexu$w?A8K0y^OPTG9K0fPOjfx za**lpy$@=1_ijxNAL1C0-dn0iZ{4g{zWcqpz=p4^`mttb4=-!$)^pWey;j5h59@ri zPd~pxpMV{Q#x7;ofm$Y@Ta*g~K$EenHHLNd)+4bkr}SePSOQm_$5Vo4bxPZsGcKolt(ITbAc@uRFoBi6j-N&ibiC(PJBdQpY!!~Fyg{e*h&qLWx-yPlIKb=qNQ`2p4 z>qofYuv}YmY`;MLq+4F5NF!mi8GH4DKm6;(6?nMmW-X`a1lqPJ&iXCL2)bgB?!c;b zIDp)2bF;tl!a5=|RNKl)8{4BKOzj>0l5`6nrW@jfuEOGH-bSYePugipBR{F5>1hUr z&Cg%6W$o};&f;MzxTIF<^Z+Dzw1x0Cj=p921HPXmdvHYMFAIY4y%QpLb+8*iWk-i}h#Leolx3pD1=ls-} zD0Ilr*PRo1TZX!(gd1T>)laDLmVx%pOkw7G0KJSQq&SR0At@JT}($kxM;^?N$c(&A!_ee}l6y zvjsh66r1>+$fo>`F9>qFPFY$m2_tijhIvmMAlhU_M;^@NAac($;Uw7i3@~LgevCZF z{$eG`d{*b#jg=~}p9_EG*Z=l6sUD%WVLA>v$2yVRW7$O@!pNV1X={{sHZ?6IQM4f& zYrVR@vt8FV)(N&&YHi>WK>{t81sVnO^F1#EEtf2&BeOgJY(T54Ir0jYX^K-S(72G^ z>a<$(tC*g7#+mF9WEm7;mNDj+nAV{XPK|*q1Dc5u_!vDE#q#_oL&M0_qZk?ZwK~Nm zqZnMPWI0nnW$_n93%vXzziP%kM+_KD@ZGJwgQFTFV9RvoE~T`H?^Ep`9M=B+Fgq3c zK9@KsJS_-t)}Ynx&wwk)a>TJ0J+4nta@%QZvjnkK&w-%PE)76}X|E$p(1NrCaKe#R zmZqG7XgQOk{3M3Hq-CT8IhpZ=n!;D<;?gyRylva-sE3^s+I-3V0zc^J(zBGKV@wAG zSPf##kQMeQF*{IGczrl9RuWZ(0f1{TA z>&3%b#GzSU-K+)jEv~HbYz+g^1LgpyVo>vb{Fjc;_4K|_>xfpH%H|#%RT`zEDf3wZ zYnN_ld}(%YR~KZ8X^w&>h>}*6kyR84@3M&iM>;QP+(Z`WTx0}Y*j|%IHizHTpCw<= zPN!lf@99XX$KB!NoFla6i@Z_Rph7INW|7-;GpVeF1Cv$R9mPJl$&lgnPMFYO1W-xg{-vW?PJot2K%shB}e1KNy+ ziWm8!2Oyj_^SsG;piLVbs-?VO)2W9~EiD~AWg4soN7_mk@yM);bhU6OB>AmJI!RZ6 zai7t>RA?unoTy(-e|5V2ixWi|I|JeKFXaQra>|OZQx|O@U&_*k&;mWSqdcL^pMURz zyuiPdHT2eDk!F7^D-PN9i)Wbuw*Aw3BBSaCau9yQ>+=WQ`oVwsYQ6rwx2t-c+J5BO zdgkL_t!F>;<$CnV7iw#JhYlF~2X4+_XL-s;ux!Rz?Y;9_)%ad*cE8NeSzPX>le*lnk0;*oxkPihT zL-TQjkT2}9j`L*XhDAr270U;n9RL82*oWx9_Kcv&_s+0G&RPr8nZ0Ff(!xAJ8B#1i zQ~@0VdFhOro5~#H$*5!Q?l`~(xw(k%X`WNRM0RIH<-nzrOTaSN>tUCkeBrb7+n4p$ z>#tH*r>^c?sb`+pNRV|j1b4U62hpGZ#xGPC_P+Ti->%`|eqF!b2c0YR&Rg$Ahg`yb za(It6ewd};w)ga;?L?~$cVr<2-su#rxWOGDcYq?6sO2HxX4pwRMwa$ehk9pOpnb!IySPJ1&n-2*l*)%pX%YypQeTFZK@P zwRg!!HP$Vi;+IKT@Ylx4D@!$r!1h9;yw{ujQ@GMnnbDw;&pz1xz2&29p0)ZTyIjYn z$`h`YyV!0@#|~Rc8k0A)0j%f1;Wr!Dnzh5TJQNq{Hd~n>+$>qN-In2L8`y5oB1_O) z8n?ki=uiIi^V}zRp-gtj#4gECGV`p}>D{c)boFZh*mmww2lUEsd%1L$^D*bMg*tI* zxN-sfLws0+!6TxuF~Qly{NU$&fveYSzoC}{MYI}uf&TOlHogTx4!|nsVuBq6?-PPA zePc{CcG7nOkr!-Vf>v;w=|Nyq%pDW+stflS6o7{YV7k7cH+l1%%rv_Nme`A|c;mUM zsFW!e>YFgbbLx?A+B9vCdrwHm@I^ZzU(A^@8XrNDC?#0JE z3t#_@-}+{P36SuZ33HZP=@@Eog0#Za8q>}o?0?)yl=ZbiT_O0|SzoOcoFw<)ciEs0 zb{rZSVgS>aVe2d>JsRWNK|br|J zSMF3=+e|ul;-3;c7mRnav>Xso1~erHPSm(PHBgi`3bQ!P0x*TsURdQ1o`T`0@Q9P| zZ#_Ibsu4`^{WN#FqJnZec$X$-$3q-|1V_@!HcCS}WtUpoc{HU3X9U_Bgx`!Rfdgp@ zp(6`+GEsaqU^e^UVfi?LX+s-%u)J`h7@;GA!h>wQ;V2CCW$KtRO0Cngj#w%4E=Nc^ zF&uHyG!noUpdD^o4kZi>)e_3EU?+_62H(6dMB5hpHcgj~c6qfH*S2s138dDp6Hwi# zrHvc4xN)mG>o;qGwD~oz*KSmI>rO3@wzBa^^)_yk?~&@RlTO~H70Rwqu79OEo3{zR zu9N3xEw5awxz%gHy$U>@lW$>#JgZk~aecd%csAGD<{8h|u5i6pbKSMN>?|vMQF3KM zfw2>AgC0z>k;Ba++?-$=8=v^7n4X%(4b2l#6S z+cnyhAZ^y!1}EhuX_Tj&ZO;s$k1dZJL{O|(nWF6)WXr@MMOJ)?T{vyo>IM8G0K3wy zwe=Nz_yII@NeltQn2zQU`NeqKW|i7+tTEljMSetC0Il+q?38L zj!m-t(!=~M3w1z0>Bv2I@Ecu1e#PH5T1Mzeqd>EnQ`%eQR1T!oqP-FDGwM3a=RJIG zqxES*9KO(r=c(Jo9OktdoPlZE8*fEcxLQAONF+cyKT9T0Xh2EJfV=ckCdJKV<1hW_ z0eY}h*PmI#X+&?4HElArkcUFnp7tU0(v4?sCf7QD`3|K?cL3#L(y2fF&wpIU`<;5` zi@#JiAA7#8-+HY2D=R6h%qp+3HNb2m&8;KT0Xe+?eyv~Z)-V61C+pw;+kdV8`@iuk z^_4GtuI@Z~v(}M?yi2^bSu32c?CjJNx3AY1KK-%!*)M#ezVw-A>noprqHaI3QOonE z*(vt$aELuy$mUEgHx$n$Kk6;#q_?wT#|H#qZrrh#VC;B&Sf>OlCzB(ZYVgpU`!n=T ze#v*=(LJRNEA)SBS9a*Ab!dqhC+_HGKan0jG+J5RqW!CM$__4IJ#<$+i%tV`wwbyb*HXuuGh_*i}l(o@6eXT%qD3&|MIW?l{(npt9!5f zsLlvHPcDvY{fQ^*jW_nNS10rZ{hI8)SBC^q?sn@SM}j9Be)IZPt#>c#t+#$$bN$U4 zY+lVykp_Gp|EVWyb$z2ge0#qh-g~{e1V6sZ8QFnnSw%n}w%qL@8S-+W_8)$Llf4R@ zoxIoVERcbi2O5sd5;#J)_PwnZ5JcC(X)+pCXV9%jAAhorxOQWx)xn^a?fYCA(_O|U zoDgIl)sWyi8)#s&tXug`UyW}1zM8f~`LqV@^Xb&dSJ&hZ*_+-{-oD%fb&kWQOtS0J=sS)NKm3 zdXr8bl{M`%fYk9LPX-TSjG#aAqRtCWWH=0N{N_++b*Hu$0;=Po1rK0Oq%&Fk#wWhv{9LASObvesT&{>9AcTEZ<}o*6VJ6l(pXZ&Mp-U4 zN?X}vRGVhr*jAN4?Gb=yu1pUM2cLx3^0ag?$vptDQyys}zt%TG37+e3k)u5au65@9 zHSmqCr>y6|)qa|fv}O*e(?bT&;UkRH;~h>7Bgj4dNo zelj@7XLnb05NI}-qivFRAIYFiw}Pomvqsp>ykZ zt4E#{Iz?YT%sNz_xsJczr*m?-3;~c^126N_!RXOxxxHtv*CF3*CUU9zmO=2dNr|1Q z9Vq;o#~?b&YtU>ydE_&j(q^ba@!;uhcREcfxknrEf@c7YKytr2+T>R-XB0i99Y_jJ zfEq`qzjy&&ILCC@i;Lhw(9<1U0q>n!TDw_Y0;|O}f};dij}i=BCz!fQFl9hwaI{m) z1Du?-9pnv1VX%dRaE-LBTraI`wh`R^1`g$Vb$YAS?c=!j*D?O&A;9Yn)~SCDTCCMl zf0bZp6&kORzES<|HniKS-pUSi+oUWG69M1iV6#rhdr4q;N)WKn_4_vTXzthrU2MC$ zBj1|BlZ-4VWf>H(lZQ_9I2lc`Bh5}t=H+o@o?uRcVCU;E`IQ+n@N*!62mGKv*Cq>F zHfY>6B-T5leMaGV?pmk*(>&#)^HEcmAroa(7{>eNV2 zJ3nb7U3^Y{gEZyb^2&bfiPa>J_rm22Uy_Go=G;gJ^JPg&@Z+KXg<%2Go>PxD#7?n| zB9lK(jkeJ4)4Huz9NS=rM%?;=()dYP4SZ}(=7G9I=)OKrhHd(eD~>S7VO= zfs=I%9C>dLgM6lqw%Dq)A&a$l@6EdW@a_85U-(r0&;I?tSwH>LU#hjW)wH*@8=h!S z4KOWe+jS;Ff8cSyf8U3p`Xn-$PzxcwLd=GZ=d-fDBC}HScB_3^|${1->rZ5-}xK$ z%U}Ouef{S@TYu%JKT$vT)1RzQfBCcZ_@hsN;&DBAIHFIQt83S9fuEzv6Py`mPrv~l zJA3Xsp>4SfcwnDzKJ!F9{n$>u^v0V6SL0g3-aYl?jk>XPSZ}`iehtr@{XND$b?Yzx zwXfAnZ@ykj_wUvw!Rh<&@7A^Fo~(D@x?jV+edK9WNB3VPI6JCE`Tz%5b(Gya$Wul+{%RgItdq?%*>+jS70i1!A?_Zs%ugWk#mmemW zlF^})9yI^+KXmmxFRS!Cve-W?Q2)-@MxIV7*_hd z^hJKd^22-gYxlte0^)II7Q6I~I$sH-fOC56ayD_R407fDE#)QpMt?-mq`n%&DQ|7Y z$#y7HVxYD)IaB`4XP!9K_)4(}l#i~NFD0}=_5(Uu+!Gw>D7!&`HtCq)U43cxfx0Ns z?1xoPapPZ}TYjoTkx7B8FH;-PcHc}=Y(tWT!(aMn^%K|tjXaItJFc~@ty*4Rs*`?-4$%|0GW}NfEHgrq&qPHceYS|P3a+J#Z#!7Ddi;Z4X3(>yEu6p`6Iz|%2O)+ zvGzfn(uP*1*=z$O@gq+Tc?wU&)jIh}0ePa;Y?9IH0un&XFDzi@qVZ4uTXwdDGPI;j z25dRna#iglvSq(B8xGz|9k;J*X792m@*#)UjUUy zV$$RX^6=9Z>#zAl8|3D5k?G_FRtC?wQx4M(aDa&N*7DY2ka~jOCp~5>bz&#}kN@bm zFI^hwlE4!RWO^PVrja6(ieM-RC4%Ex+*AaGTY=f$TCbZ|c4}t>CzrhSw+E|9RssCWm&c=UKl6kss;E8a_hXsStavO5lr$Yzm$ob%_BV^X)|o*)uhhQl*1VPhZbk~Z56v~W&?SZr zywAZcZ7>L_CHULJnoxmxKy=Q<@|5)BoC$KpGkhc!+G=F7?1lTtBQl;ro0HQP2*aP* zntDfWFX3?<3JgJ8qNoGwJ?WWg04-`%#xgCBTu7|EYp7gNM!43Y-o`jh>FTpM@X=-R zia$<~GXQR?v$(uQ8)#<-eqiYQ$oOm&S)+F`#wkU%PMs-m#F(J3vy4%u-Hw9A(LI?| zXLGS`Ki{vb*SBlMrKNK{V0G$n7XyDEnvR-%i2br9;Gym;K!-a^Z`9J|2)Z@B*Ai%Z zq^tK?3Y5Wt8P9ARw6cK_9AP#ou)XR}B!UWCzyZ%4Ar}GiiHVnSo_HRZ!U{O~3!Suo zbpOFqu#l@Uwe1=kTrrsaP-}+)&5fX_D)+OOHIJ=y#}}Z&O2bVz4`5L)w{2~Q}=<5rH}5ctqp2@bG=Tm2m43o_0RszOZDNA%da}k<^ntKeo04g z>n!_u1#H7SfyLTded=?cuTMU)Ucd9L7wf$bTvqsWJ@?Fw+PZkV{>|^dQhOI&==`u& zH&*L^^MCr^)j#slZ@*SA{@Hu9tH}FajgOA1M{u(- z*g{_y>&7RZsI8q|{n7D$p;^k4#WZaZFuk{J2|_4tSMGBMYF6EV1|Q31yA7F1s$FvE$5i_2i zYd@eBg|xrUdeC#zrwU8|0v!Nu`gLfke#D744I0eyfmZPJ$a_^_<>0=DcA~dVzklt# zRky1G(Ap!63>-lh^8_K~ z2>8B}DX!s}bkhdWE(iL;BcN&X&u}#KPPM6xrlP@r)TeJ}8|+UKWY|}5=jRp7bt(?X zrS)px@=m5t0Ae4T_9ENbblLdeI-XradY z1VRUkH5tysCuIY8;)<^#-g(U>tXF63A9<#1Ab(vlFE5-|Z{Y%;&wS_>zDREw--l<~ z*%i{4foET$KKr`L!Qn|AP0k7Ku>G{$NrMjZ)W;F(0IN?RbZkTj&E4fUpGK1I`ih;! zZ01LneAbEvro9ID<6~drkS=hUc4~_k=1wB#=9kXRE~~>dlyv={gq>25fybl}(1jI>OmF9JLowby|A}h|chsjwKEZ3Tz;!A@XbG%D&$;b0pdH zF%B(QrtNZIk@n1%2g+X?s?l)wNEPiYc-wh2dZu1W+GBHMB*ga72C8UA4hK?0V!IJP zf-D?8o+%%fW4E05qs*-nnwSR%+pVAHklv*g0`=Y?n`Ai3tBF}y?&n>LE)G~aC^}x3 zQOcsc6Q(>Mld@O-*?DT<<&RRN(UOz$*Szv5&5uD;nV^BP={;~@Uz0VAqQ*8x(ktaa zm{c735@y)k@<>;AYjX5;jy6x|SbeYJa`XXp9MT?Sn~HT5FX5}RHJ2C%?-zC22)NE6 z>jFF#`K7rIT}R_xvxfYp^6GVDOq@Z&cBM%uzRGReGYY2OdY|Q;bVTq|2XY=GrQT&( z2R!f_OP2(0qvIj`n$$S~@dAeF7~bGV#MwzlOy11q@TVTi>o!tIeex2V#jDvsD@f0ZDt@pK*@`?`W{ke1>{p?q|FG~7p4##s`De(U?u7R6 zaIX%Ic58X-Zk!#*KFw+yT01X*)E`kM!=>=H+|v zE!BpeJdP|YFw$sdH<}Eo>x~As*CRGz1o2mm;ziFR>Je&|AQCnfPU*Q{f|DSF-`m8md3dM83m$InF&d5% zcwXXMj*j-~khc7HfACIy@8x&ufMIxVzW?ksk|VZR33gZc;mhyQK;m;dm;s`dBYsXzPh zVeK9q*XO_bOdZ^PSbzA>zejtqSL1!0;^pe??9|rkX3eel>dQa(<$Cp%mul`{RM(z+ zzHZ*QQO7u4fBbvDSJ$ttSNGAI*zTix|KEJKUU~8RwYj}BrH3{Fq98Y}Hqb#)2K+AL zy?5TK$3OmY?Du9q&{K6N1y0*}Dzw`Cs-FNHY z!`*DWvO-Y0vALN*{S27O&Ixey-XM7RUWN`)e(D%9U>|gT>c%YiIM{5LCaS|1;5l1@ zuNYK%8(O3Djx7`mc6TnCBQ#>ae^vO&vDh>FGGLr4Ba6 zzVK(yrYyEVhrU_)*IrO&!R6Jlk(YU|PFz%9--nZS4w{{VyD}I(;!M`G6NG@}Y_2-i z23hAthS@a}wq!_0HP zZ>PSde~TWfOgg8A5a32IA#K#p1m@u3Y?(F%&8*(WTn(@(pffNI|1%K z@--p|Yn!!5YBY^<*#(hnbx%5J%F_2wZQATQ!J4$8CTCO(;Bco?E({8b`J3WA^C3N2 zz$JmP5oVO8Ad&t^dXh(bk^r83!kqbmS*1b_^Z2vgHh^iNmNq*g_Y~Gs@uBx#DSz>~ zID40apD|&VxUH z=CuqlQu1Ww1u!Mm*#w;#&DHVIT#feVvk!eIOPK>p@q>2uoeo%N8x;WchDyLm`E`)l zz~-C)3S3B2FU;>MD+3-}D1r_UP8BJoCtMsv+Kv$&#MDW zeH#byX4~KA{dfoUu{*24T<;UuWu~m@wEgz@gmUz)4${f1^vn289qL$!&tzT#sI0z` z_YRW#j%z2Y$d-EW3;Ji^1{$=!y>V5VY8SLKa15OA%?RSg7YlVVKS0~Np>^It<5_0F zTz2A&m;2)z>}0n;h-#E*;Gx6sq2pyEtspZ-RyJ6wXKvo8M|ZZ$?`!cWhscP1jGLFy zOaukOw=FAwa#&XkDTHhz4JwhHDTrc-44m8@QAm#XOXPH({1jXRFeNHgD+64&4bl!a?v7>yEWXkG9ScYE$L8@A(BQkjL zqsjM=j%pvHa$-QGplHM?KRP-l52pGXv7bWbLgePPum$29l&W6 z-h#5jS;yUAoEB2AI|})tI*!OO0T(i$Q+#|ftTTce9mCTR&gTT90-f!+bqE|0v)X(~ z9wV5b0Qfq@E~Q$8UmBn}+SFUdQR}Q$e{-!?aO~Ds-Q1*u!CcNej*XuNMGl}~oWRWh z%a7|Gfyen6`GUF5wzdHVjWABZWLWnPKdi<6ab0`tthTq-2+)w7rInf-FV?|>PL1w? z@5y}RBlto)X|Fxeer)zm>(S1;b&+L2@<1Arll+o&7HCD*NzTj|H|eD1AxAn$`DQ>A z_HY+rY<4i;5upsE3CnzMBD-i=*yo(I6;D6$2ypFKj%$DK2svHIz>T}LIpf!ym4=6f z4cL@FJ2qv#Et`M`krSRP=-NyJJ8=)r>b?2x0$LlJkaI^S?*kruoz-q5+bu}6Nv>S@ z;K5=2^MC$g{iT2KiMsmeYG@&54rpt?v;`TY$~`s(+-zlnPY_ltFW!8Fb;D_&Kxgo{w{=>R^ zcfVeI>Gk@TzxUnxlOMfZL;6MexeTp(s~eG{U-4A~ZEV9X z_TsG8*LSK<5Vf+tS=a7t)^pF^sdwJJTeq*SR_F0&t9sY!&%gD<`rvziTu*)KBdJ#@(?{QwVtdt>ch9*gh%6A+qqGL%`5q&jk14|0X_6( z$}7)tTJ0B+v5Bh`sHW+rIzXsH+m)J@4PICteyi`=p2!!xQ?BK+JPQz>t0T5W`q_^w zH<2m_X5&m5&{LPsDPlmFE$}Hjne3CM?9D_O8C2-S2m7e<1P5i)`pD^kYi1KoO`fJ# zDR=1rjY%|wi`We1mUho(SJW)q<7P3!9N?3Tk%y0e=@;s6{(Jv!R6@VNv-Vw|F9WL< z7apL`=u_;wC)y_Zx*_d28Pc~8PwNPsp3tA?bqO~Mv)#V@BW-OX@UlxEb!e4s)%wm{ zZC}CHxdA@?Q+yg%R^ZTI;49FFj_~f!&}9ev^d;4keAr)rLb2VpQ+|TCeN+pSr)ksn zC?DD?a>E1Y&U5<{eO%CM?IYuCwl2Yz^e10SQ`e!ZeI3`@ZQ;kh16NBZU!{8jFzE)t zsNJG7CO4e8On6BTtHT>ku zN*k{A=P$G+6wiB>;Hr*Mu6jHD`FJ#0?cdS=75#jzLOF8CY?Ga2%8)%CIB0w zH|kt|@XEn0UrCVojSmWuYSUr~LAv90ws|Ly{Z|(pUD?%@*C3jm5NY)Mr61Zy2jefE zVH2UVz7Bu-ss?R49Rj-r^bfi%;%_<7?{~;{@v#9*T#CPpKfTpks+I0s^?S?Vm-a?F zkMMVKEvU_9-}+z9^1~|b zfsu6d|BN;-pnqrJF-Pm5x4zkg0CVB%f8)2l2~9#cg)bxTK$d7a`4YJWPXJRY_&1v! zlf&z)gSxf7Jw=S7Af%I~lV?;aVg_A)cv$Cuczl`}pb3q1cf2e!awY+yxC5Zid^y=Q z+y(|Co*PXjx~07N{CKgBmBKWlOg^jzalIamG3w+uDt1K67x+^KxJJId&^vTi3RpTm z<~3~$UdI!R3+EHBsdq?cIX*UuZ8KOdrL&yTtFuwoVVhb|2GM~JO5j3(H9E=nyzcED z)xC$F59|KkFf(Ff;Et%n*&-dmA@$l8VHuPeSg0DX1AZ9nw&2rtNL!g;Im>4g1?p6& zTM)}V1;y2=T!lk(?98O2cnXCIXdZ>DIn}KVDn6j1kUqEFS%Vy9B`yS%I^G&IgRS}H0UiBnM)4etbe1b0de_n z=K?jv2~4KK8%b<3N*;}d#!DJWi?mHSR(AO_J&tB*0W8beZbw15Ng$Ue4Q3nZ5-u_? zJf5d>CsjBNC-ne>PMb9<^GklmZmo7!cKBVXbsUn_!A7n2)@rT4UOmqJfmJ7wgy;fJa?yT1w^_&6AHu@ez=1P$TWv?x2Ss|h`~aRTQSTB4rthrgV37KH1l7KGs3YO5rZepA9XY8u?I@AEyw4#2pmPfX zWF35y=A@^iIh#~(1G!i`uNB(qmf{-EGk05Z2gFh1m2z!a87zlVhl0bgu}TL!-Tqaa z<(Y#s+@vlMYn@_q#yo_f+$vA$gw2c?*cnEisV5yEd95d-vC5c&q%M&b2hY05q@D7U z96b!VOBpV3@;288b^Yolfh9Zu_7MA}r0DDb0eX&#fyAP|o;*6%jjvaTSYwlGxuATiEA0E`Tg@^UO{Ga?ioU{$> zh5-!iQPMb*jXD}1th1G*?ck+@L!-gnSw&?`=Z|af$hXImvC*{g99an*d8xFEcjH%P z+@`d%Ai2{vW!7aS&ZutPexm;6fAfE%aM1wX(U51EJH{wz=2o^|0T{x1j78 zq3!&_a-4&C?A_`b!O!(8^@-=7tgrvvXX_Wf^vQbq)|I-x-LEzD#&4WW=ud8c?lbiv z!OOvYJRkL&0Hh1OUjM;s)Z@}M+Iljn{?>LafBy6J${&8K=5dOpm3V6hPCxe9dgt}~ zb@|{`%J>22&DvPo&Jx!bKJ{q5{oOyUgAYEek3W60R&L*}x857p;mfbq#$%7vDSg%b z{ZTDleWJz>=nvn15qs@&FAtSDgsprG8GJJM0ZzlCgW4u2)t>tq6`ez6D7vZcaP27b z1x~*9CHf0o<#GGUwb1$Pmw$v^?AOgFo~rGuw`vue=Kz&UcXW>JSG3iR*jumiWuM;$ zAJ7TliK2(RZ7T!pJCHzSFFYnaX~0Vmg*?M60}vf!9yD4iiIlgw%9XY(8*uO>&X;-4 z+pd{9U!K(wm(-n~>o}8wemW!NsupEhS&&H%2p}M_8<_#jN(TFAgFOC}(V(h5X?@oe*{oUPqcyLq?3E=PV9oF7(TnGN( z`4RpPt`Bg~Pw=#_*(}bhJ9p}-$DgW?J@r&Q{nTUi#M5``ktc7}BR8*N z&o=Tp%Ib;(tKg10EH2>SF5x)$=`U6<>GND}46d|69Uq>I(66=$%d)mCVx>+uEfjyR zO!F6;${*a1{%dpOQ-T+s{lxykYwTuQApkJi<7}4Yra&WeJ{Nw4#$XX}9pWwh^t*vYm|-(#N1kXtO@hS+@DPKKXhz z-{HLEL;-bCkNJe3etil@yDGOdvmOR!PPlm61~!^(o)b);f$u4;ok+V2(+VFRSs<7? zx>%@V@*Jx}S?ky#Ke9v{BJ0t2Y%Kq|$H3kg-;Dg)TEDcl?7j!ck+^096%JXT|K4x` z-=xwCa5oT3Ht++T$ep)-4BGz5#Q3_)jW+VHQJH=ZJ1=a1(#1OU$7xk)e}1tTT>Wg$ zsj`Ti_*C2%zVX)$z!Vy4<(~xdFU$hCjctyNN-X2;ibT2@f~y-FwM7sn6Vib}MVE9O z4*jSeK@$REaAVLjM8OV^#tFD|%ng=C1RO@XMy12?g!>8k34|~J1}PJRA{;-r>@|pz zfTsB#l|jZCRzkz5!5-34O$?Y|qCrIhHtICMGPpBXF#yUn^%h5t;3D@qESbW;#?rY6us0W$z|cA*(R%aflnXTVhIoGp~^8DZky*~(>v zRs*pxPasDd$HNhM=;%}+o-K7Z>V&hnMRt@m6jLcv_{CjVKJ&1XQ~sPm3C`Y8_M;f1$>^39LOMj46Z3kyIY6d?i(y&l9c*XM)5v_F7j#x zho_ID;HD{^1V_s#Eoa|{GSK9CHdP_bj?JlZXObKNTEKC0blFkmI5HT24Va3bHOM?S zpXYoGn&;Bm9mv|dbY8oKwQHd1Wc^W29DHX*9DI4+kC*2o=F2U(>kv%B0z-A!&7&+d9Z_B)O4OZAhAhvYyq(#_%=D!r=bYyPRx;Fv+$3+alR~zb zvZ21y_S8dQLOVA%SJPJYdV;fKFz(j+y_NO4d-r~zS&1}G{nY89%$ufeE0xxf26Lpt zw;t~OB@Z+(kGQ7O;2bA}XQo?p*6Ev|UU}AT=i5q4bM?}9?$;xq-$IsCB6YMt)2zq> zP_;$=Sz9_@_;>K~)w=ikeywe;WrGH5cXNciqi9|HS+Apub2ze-AAh(0$A9N*^~?)T z$8N`|N|ofJPTQwWG@6L(H25F6ASz zINBL|Fd37N{_f7x_1!=E?HWF~S6}`5ukoCA5dfii1XkE8?MiSZ#czk9mzjwJc4mvv z5fa_ zYi(KP-IrcMhtWChxq-miYSlB(*5S9mL*#Hwdz$kBf^~4?vD*FC@7LVX{p#X)FQe}c zlE|vZKK^7aAM92S5I1ga)zSQN{qW7*div?ds`u#Q_2#Q@)$YMzt!_PDNAJB;XZK$T z%*gM&oAuZ}Y<_PLS#k-Mvs&8Ct*hXQytnVHA+hMb-x->%Dv&1be5fxWU!3vL=5614 zq~3kyrP{vvXg&I|kF|j-=;bC2Zc>%L%)Z1w8eyPiKP}AIacwlPl!5dc1X6Kwt&&6g zt(@9_ii5TyPNg|`Kv4vPC#GY6?SZVX$qwb9zw+igw$XI*S)bR=dXW%WNsxIu;qj>| z2j8`X%17&0Gq?o~&gjOT0=&t${bIY;eo9Mi>#RR-d2lT0PtpeaP4oL4Id_R-1}_9j zP0E_@5BqIZhmk&f>$O_gz8c?X58k@r*Y2SKn5zwrYH$Cb4)#goyhpm90eG-~RQr2F z(#h|#+Q|qXX%fH1kKVh~ezkAlwOu<`Z`O_5kJKZN-l@m#JXTLWcB`JabGxoyxmqg( z{|odr(mIwB-k(5^;W_?+%g|lPF{O?4_Z<0%QtBTxy9N=a?NtWIgY22#)f4(>@>4#W zESmKf8h0s#o`JZKH--yhl1bE1MXG$YL zT>HO(#l=7GgDdbe;KjZEldq7ZUfV1ZJZWcZYy4JDJ!UJw&Xg|@Pg{kj4HO?`SUAwj zGRyD)N5Cj6B%yOM(1Z8B<17dDt zd^B=Y#rK-VH5u~bnOoE9n2*TotkWsM)o9X!FK4(MZ8yj=fOA^fS)vmRu)&Vshd3cX za|wa(kr*gwn4Oh!2FVxkGR;VS11@nge}XCSlwgh)X9kPs?uulm=KYw?!r8Cm6FLp* zRu~P|#I=3T1fr8q1=6_Zg+V$Qot7gy>3fF<_2J$@-Tz=eQ}vKEZOEtxe;(4+v}|0# zb!MudYdX^~0wExu!r{z;Wi!)8x=t+;@eyzA*do{bgrg(tJ9|3!(q3@l=60Bx1!u4n zFzZnmFHpu=(4`{8@PSKa5ouqWhHnb4e6*!xv>mz|ub5BewPn7~;0&Dd)C_`hOkS6< zF1o?U0g6T;aJ$4{D~RqYV<(f@HSWbLj)MfCoiS?sv;}sonH34$G&bVV?p^L9{x0#< z*r^;OHy#@#^DOJw0c*hfQQIs>yZrd9ql(fhv!nc!E%}r|1j>&Biyy&>og$Y_2GZHt ziO*-<@xUO#C8Zbwb;MnEY?sD69g3qZGKQb&>a0$tJ8X%Qyv%MN)(Hj6_+_=UP<);ynKJw3zp~(dLpDJS~b#Odt zvp&#QW2fCQNL^kgNCAcpjawAY_56O!d1j9CA!eSPo-Nk#kPdeY4(Lc|s0;;1h$GecHQ26P!r^W^|hHO%g-DI>+=AM$daRp z@+Bpve9}g4tkZ!liKosxIz@o&uAFBlI5neDX8v2JMH%XaxWP?a3_=p{2u%66Zdr~q z+~lNnCZa7$;*s|r?VQD)GRmQC&Qd7;H0kL~z{i4u6V6(H83+760m5lr|JY_-o`JK= z$AFOzJNUJ0VI*(^?eYFte^e* zPb&eSpdF$v@vss6vk$QC+6l{hNLz`jEq8?2HrrGWK&QOhyk}N`n=B7g&T?Lz{J55;K>(h z4s8}30D+&j$+H6|UQjK~#PI(e3)m zjn&!#*4=&jn0~*OE++Nx)i<%_ZrFj18y(ip6OUH!_KkY*oj;BJ?@R}4#;8R$ZD>q_e<{9#PwL-dKCfw+CHo7dQ% zN)KhkpzU~gRIA%t_4KDcTZ1kE9yGEqw_j3DZ{0KNLS{ zaYkQn8E4GYe@Ku#v*10m$lOP+geR^X_WS7YmBCV_TV#S7wAC`H2=sxf9s)EX%(F7@4L~G>3H0 z*2tj^h)lZqRj=m2?Pxr#jcd1QKRyHWc4@lwIl(_OXdYvi$44V%1b@u)=(vsyyvVyx zKYn1~#_z)fX~X((cb6b;SPyu%?`s!h2h?$_!<%_zZjcor>w{~x-MdxW%XeyR{>kdk zJzCw1n>Fw^cfFP_S83X`{Z8f37#;hxUz=moBv?oQEoh_s<7w!kJ}8$GRa)lf6Vm02 zeAcAS?3Of>K`tpJ+f=^f^ej*FWnx>+r=4^VT>MNYUjh#9!yD^Uu((biL>;kbob?Y< zKs>yh;x6x%iP(1=klI_I8N1BcBWK_zT|NUuI9WOhAAO%md2F~K7oq?9{SL|9k7zUD-fa`qg(Z$HBv8zs=d~O(;j3 z{BvcIw#Y#yCkT9vL7b_CpY*ZK=!tR+uKMA$1{$l=>V`zZ)<6;mC7P^b@30%%?0tf? zW9k@#@A#|*YA5bytDh73zvO&@EfluCo4&3Mvk#>XXyE|$jBhR>PX9`}6F~Zi`~$9X zr(fzyF9+!w-O~&XbzR%mq(Qp1{PMv%ZC+;QV&m<1op?bv@TW2Z)&!N35oG1D32z(> z0ow6}Ipm|T0;*%s#gTK1*iNrghXz16N~0+1xQ3kFQA*>R8IaM0&SjF|%RoUVBY~KN zNdPrz0R(}Vo#gCgS&f(k&zWZ$Y?Z*5^qlcA@N(wKonb5|;|xkPtY=eLM)txmh)Ljs zQ0g%FjTQrj7N{uH*4yefFp8mucrJ-FDASqONV!A+yEw(SITt$cN8?dF+$Dg+!JH{b zzG2|f2sw!Wxl>{breF;8OmJjS2cccMr-LhgDyKq`$Q>MmJ1|t5cF+KY8~BKKWI?=5 zQ#K6LGzs)vjfskYOLCD;Kh)(1|o{z^z(EO<8`}4K2K}YUvA)SJ|FP%W} z2?5xJuaPK(afqgND>PPrnrsle&82ibO~qI<|2@ zDC>x?c+SJeqjz7ePi)QCzx`Xk22BQmpJz7Ho{M`sto9LPJH8g&Nc-3v^xq%ZIc&J? z7D-d4@?;A6;|Ng!V899cL?u?|42ka?Sg#H<1~+ZF#BTVmkb*Gh4CTgl{r*4xFX}U2 z`uR8%XU;UKJ3WFg@}CiiMTUUWmW|1yfDJxz;%%VG>buW<1a1kGNpm@`gJs$mH^&(w z|AX#gedd`P^|LQrsdaqIx8HfM#t#l_f|J`FbZfG=SJyuFWG!94T@SzgC%|hw7yJae z-}#wO)ayTbxz65sH_ML|3+ZUtJD+^A-g)K6Gj-os4Sp>SJ~P$KR_uc#t5|{zT%*1BifAwu1d6aO`z!_x=YN4Ym-i?6Gay-6S;O{@>r+4TRq&k8EQ>r+PqpjeCbSZ!_Sc7Pn|SHif3j;6YWP2;}V-n2fttdQFdmv_a^(C&o=-}4fGgDsyaEA8xHnRePX>(m+OhyI!a z@?=vcU|3IrV)ab;(+Z-Liv_s}18KY;X`q%~RN zTKLp6HOU;{18i5uB#7g%E@=nCz-uzof<1Y1(E=yR_37vP1YrIC4t?)Rt@PJxg+7Xo ztCsqmEcH`1`-8PwUM3Lh_^B9zXkRBGAX5gZg2O(w=~l#=I%5aW#l{o!m`!}9fu#6Q z-uKdNn+L^_KkXWR2hZCFj@vRtW0U9rxX)-L(VS5mQO1FI^Lm}{&4Qowv7K(z;b2Ds zY+&eXx_hB`xm@xB9Nf{fPoLOyADfMyfFAk?kK`kEQ8}@E;P4D?WLD1Y`X~IPbNngz z>B_!^U-=t{$2GSt!T^s3lza;44RPmg>GAL>@TspoO zB<_v;Mi{vfO03}I`zJIm!47$Jpfzk6Sp%MiGIfcp27!AWa$6;Hoc+*|XihpmfGIpu zM29exA{)}YbFYH9+#!kzp<=9Qgu?3xeGCujN~mgdQ-_2sc=S$STIze55IaI`@kGjLBkV5T_&1bH+sG*gl@=AaIp7*lEca>q@k) zY=Lh^9Aa4Ihs>3C8VK7(7Gd$%UPz`xAaL|ZyJ@R0F18PV%FE_N$(z|SKdMRqA|Dhm z|7DpThh&`vwWf&I3C{Y_!9ieL$}0rc4rRUHujg+)SvLv7j#f|deVVfqr zmPuzxT?RB+{t3PbdNMQWGE#m7MZSz`pl5(@FsSi2*d7hty~$_XLv!WMAbX6#_x(QK zy_<}@caUI`AZ$p7k|l6-B6&BD=Og6UrLse4<9mRU5xiHX4HS5G4lH-jGO)Ar&wzq6 z7x3TB{<^f=<)iWfy$!9DEvOP&Pe~~wWRld&^Y(&zL_Bhsg428rhR>Re&hGuM$v>C! z#xxF%s61D;m9_j*u3e{GicbyW(lXT$kbwXurbZaFV*;P?0qq6u!txRh`ARMLo(qn% zg){0Cquz8_c{@EDhvo)ara#3DP;;LJ|ztkf?FEd6bt z#?H?koOjL$H2L{Xiaembb^ug|?r7&)hcPqW8NA7v3|xgjA}QPCCa@_M{s=@JZ}c?y zhNq_TpO3W}*=3SHmsx8c-DKqGh~N}Q`t)oPM@by^agMZup|ALmCf_Y9jY)`%h{YN5 zuj1>7iG>))o>8ftJXqyk{Y*d#b))}Nxv=wXbqNLt)+62G%oLsJLcRLK2eomvQyY)r z2wAy+SJGz1&&9ZdhK^ltJmq(#?~h7bVMCzH~55bS%Kilqn+vSl|QZD`qi)1 zoo62lzkDwy@6*s0J7R5GbORnx1LtG(&jAyiMCwKlh3m{m=tJHFQwBn|MOd+C60Ffv zc?&M!dvSIQOzbl74ZaMj;>e)aei}hIZU(S&<#xUN!#^tD>D=7h!M2Qoqo3Ds25fS) zM?dK-+LGJPK z@muTl3(wxDFMrCVUF-GS<2UQIS6-|A&PLte*{S;T7sEG**H&g=D|p(`l)*68(*&5H@E6v{Nq2a!6T2>AxPbS`K{RJD>ojm z`>%el=0?b-&aAcqJmV+OBHw-U-C$*HeDJXRwwTM!5YWh|&Wdz!duVl}(EwcqKWBcF zBRciyz@2A52E3IT4u{cQ?P~@XDWwcZQ#avg!3+114So_4z0=Y4()tuQpEs&YWBX_H zh5yAXs?H<%*aisT73H$@oU<_Hi|tIXAKb}f&^MJa2NWD=o>i%X<}BtZeTo|&S$59A zfoDy3s8TrxcIx2IeA2~bh1v>rU?wB}C%xm|T-skZq+O|`pFm>ZqJpB&?G$fuCEfN2 zPv1gk+2wAh;CupptG6D_^Vmt+Al&#gv{^i)CG6%|t4H4mLWCv;r7kPJaB$keaq?Vx zjURB~K&E}Pb`II~gW3+f9m3PYqfzbRFFITHFuz^;V|bl@nEYVTnIF^|j{o+`<8`C= zLS5^BqOLAKSG~DM5fj>tjvu>}Q=dkGmr%B!>vn5j3Z0-sn<3TyARf|Dx`g)AzK|m( z3>wA1;%wWcsV1?}(v@NKHI}FSsgJVew_@cbeB{=EFhRSpXL&xV)8MfM7|9bb+B^TK zhrTocoq$A`a!sDqEz9U5l17_+2Ii#6W9kK7B-?uY14eLH{!I(cl)w*2|3smWi^asgb-QfQ*hw(_Q1Ji%|WeHlO|Em)9m_MOtms7n;hD?KQ#%R_gP;EG0} ziv+s-E-t{2HY)QDy~O9HjDgzO+)|b}nx+kDWNv+h1BmvM&Rk^=3(~L*(M3N%kNW{# zrZNOlo)e_Q18JI12mvq~q4E6myuIV*x6d+@hHMy+sZQC@@UQ;n-~FakuyLw2?cokK z1}i(SMxd5QBo#A>*_?jA4(%+D)6*)OFHetgk_~orn03${nbm;mEa!bE8ZO*sbp5B` zi7tjbhDr9fG=|r1$ zf3uypFlbl9g?4kT^12+&jv%G5Mo}zK&&-L}94?u3DV6P235GaTu4`>GTz29{*VM1f z>F~m=RuA~dbgr{4@2m_oi+~Y{J9D6biGvQZvvL|+vDdJvc# z9t<-wdqxE+u(KkA{&GEa{c2skx|!Lq$;GJd-Ss^I=m*a-8%W*GVrsOHkR#v68{()A z33~SU>BzYxVu&Gkmq%w!oqeQ_T_4{ou|2iV?(2=~6@caPlkai7e>!=RsEKa%3rZH0-_i)Y*>0k`Nb`SQU%P|3G zxB9-@r9xgpSM>(^OhqLZu%YqTw)68@o2hKSHVUb7Hzl9(B%LEaJ4^W%qojeJ=2c#@ z{dy{BM#ho5)}g|GbI)XjUqqyF1J|f5%g?s*5>wh?X3GT>y;X8 zV3Y^V$oe7hrS4K37{B4=k^`VqFU~iCh2KpxkaF;1Ja!`*m#Wg)Q>Vd{%VJjf^}Ah+ zyL2NcS7$|u-++47uj~8S62J=n6tubgBq;kY#xl#aVdY|uuq^bj$T{dKafe=tW&%_#9bLMfNbxQ@RGV{O0|-^`&djxXG0`#9org z_5M=aCDiZzS=EPseq1+hT#M6dKcIa}z2<^e={w+|?@T_rG^ua=@|Vhw%%=k*pIIGE zG%&IaSu$=vK;42A{1Pb72VCSX^Iu!D8ado}E|GWRBo_O-V!HVC+15oX3 zuhb`>d$Kl+Em67#yP2XKQjn0RU&}M4;tUJtv$C5As0KCeEAN&#|sK-1vgCZ2ahMzmP`Mwc1 z>8nf+JTbw(I%6S^%q|S;vF{ge+i#Gb+0^vi&YY3Q{6J7%Tr$~4?d374>QgjLy=uB8 z&iX0Bbg;pnG)lf{J<51KjBk)?$4y$Z2iPz2TA#d_?bxUeG~a?-;iO(+s&m*%WCLx- z9xh{(_iOpeHSA6g@soDYR(&FerR0_G#l&}jfAZJ*?Du^sM&H4X-$B{ z1WJ~+-{fx@8?m(D%+_XgmkGf9)C6|O_q*MVa2b2Q>?$V8xe1s{?t9pY0ro}taswd! z_SN1he&0&I`{ldmp4Aj*j$9cL{Qwu+-!Qff>W1{8A)yz2NFMM6-BrBpyJFj=Y4k9S zhi>`~&OFHv?~!`~q2b8_zTRbK&;S8Xx#z-R%Cqzp#4!_S3v9RAch<^}OFJkepL+(J zpt0=h1LTP;&~|xX{Vn(hXU>r&Z4AKlkWY&EMbYEhCOO0AD=`ay^>6&$Z`w)tKq2x7 zgE*{Uw(E`+`oERPSefb0dPcSeB5riy$gZ;jaU^MwBfOSXSn|#d=gbVrZ0hjET5E2> z&2;1_LJVW5yNwXEMrC@CG?hKVJ|()idt}NJ!b?ayFNH&9`KM6&%ZH|UW(kGT_NDYk z^^q4`H zhV9Jl#lgjy3}y>zu)4ll0@{{j>wPaPBLPJ zp>@WIG##}O?RLFC*vCjMU>qOde1GD(C+gPDMy;d3^VD^4^swH2f3L{{_@9FF_-Kex zZtqo`<=u*5jSi0L+(1#ot@F;=K6rW{(g|nQAW8@8 zWPDi1)H4}TH=X1u@J@yYQFwLVwYq^$gK&D(`^wdW>Pj?vXbmnlR zRo3yoBT?OXqYL+kzR@+7a%luXb+;8~OF9sjO zj^fkd;=sY0vqKy+0x|#mr~9B`j*Zd~rt@*hE7!}=Wgf?l^hNlY*$DDwsjo^8!7}12 zP0+pQt?BSkgG#RH=$zJ)BOR4}hXGIP2($}R1JYn}j-AP6%Wn{);oqQ*J=*Hbf%3X} zWgQw2+^%%%!GrzSNo`vCH&`KufJSB{K30*^+|&5oi53wQlHgQJb87#{4(b|zlY|ZFV@!f4z^+p zZrE+)uQ|`n&g%&F*H-HArEk^Ged1Pq{HHz<2is0oxr}3hJjQ{L-pF|BG$6A*$hR%h zagReq9%1Wr$2mW1%fe0xs-mwGbQ@hi!M;Y{u>rpOa)Nz0b1*==c`~L7Y=1_C)K_P@ z4c18O_UpqB->=;tzDU5lTEqQ=l=0)x&c=fhB1xd&$M2EXc|Wy5TY|p$^0(v;Vj?B= zwdJ&thLUDWBsu&L4ry+v<2Rq;T+luqK_46%g1}C9O%T-YtPuFou}kaEJ-%6=+3wVE z*G&_S>R=b!$MX&W{-Zaq*V}gq-a63a?mdDFcnA*Ho_v(1&ew_8(2C6(LTw{AnnZe1gQUmXl$=lGAd5CABz3SA0;leQBl zCN!SPmhz^*;UG@>T=L}Ovniq-MTShX_Nnh+-zA-epOruewRToH^k=^zss_|%bLB;F zQ8&q_z2UCuRVtb*mrf^zaxL(-uI8__nQqR)k7KDWx77y?uD%Ig0{WO`RmiS0X8FF9 zeg`Cp?V>7WDt_8uyiOa)!+)9Cw~Wt87ei-jd}rtKbX-e=wd!E2)wj$JLCetGK^kDp z`X=q4GLyiTdzVJ1A2HcJjS5`0FLLRxpsCNbQ<*6Q{u!|H4nFl?>I;qO%i@=~J9X=` zv*et9{UJfv@Q^-!_ozk&Wk;j>aJW|whWq%Lr_s~Z4gp#3R_zR)shy?gt9yBaJ{Y~Y zIE13$LVM(K$dUFdOVXp+JfDfTwAP?U8(~;`$A_P{(5nrSptB^%w+uW9ia%iqQ%_QH zQpTlI2ET;CpLMwbh<3o9Be2MmcX4@U{my18E7sR$RJbNRcnFm``X37m2i*|I$dfu|1^lzWh+*dEEYLk^D^DozrX8;I$}XU!IomWkov$N5Q{($# zG|?F?7s(kAsehUW2WcV;l$ji(*T~l)XWuQ$U=ww$bg^?w_VMble5WAzHlCOd{J=>n zI(wECgQOq1q1k)~Jn>a{nvKnleWeDS`(>9PlI(P%46?zrq)7q@X@q$)<7tvTT$UgM z40IG2g8(-th%j@sX;R991lT7{$I(lLQh{uai(;t&YLImQnj_#dja>|iY2al;fk0VN zYebOf=GBNNkU`1YI)9vhepyP8`=2;TnM&p?EDeayGs>0Pt<%QpjLljr+P>J_1YCxM zUNA32C%d>E;p}I}M;v?|bOn3i!ZvB7&a*`Bk_g^vh5iJiq%j)d z)PsCRlWg0i4mFH(?fQg(YJ&4G&Y6XpIFm(?L}1_tkB=wA7`zM9xc3EGJA<)~1|7Fc z2b?)Nz>zR`k_Rp;v6IWDC6pVwB#*Mr2Kj#8>E&r)IjgCY3#;%V*TWF8FdTzxO-D9Zy+jyYq5oi))pa+H~< zB!Q|ktQmP0pLFbwtQu&wcKZ?Qydwxcr!HM{#*gQh(CD1A&X^sh%R_X?E(}a)PmB<< zmQh;T@A4zJoQ|VsKtwywaNM|PH064Zd<*gfI-L`I*~WQj<@-hbb-#Z_@ZiWAf0>b_ zY&MqRtkWj#MwHQs@?}+n9yk4Hv#l)%b9OQ31oh4!J4;Ajc;y=UY$n3*OqgC%PN&P= zt+F(eJnFBG(NHL|D z!J`0$*kIe{HehC(W;oa+@URo}nzT6jQ`*EC;@kp9Fa~}CJ2Kf>XiHt^|KYuZy1#o| zk9=-BgDS0V${Y09eu|$QcIwSPKC3N)YvE-8YFbC=2j1TMk$Pu{>)mhHum9@TYWvDo zfCZ$0fft9Gv&-n>FeCHQ)`1@bFB+PG9-wFRUV8xH>KxnWYB0ih5>WgI zv-W!t1$pG^O8w$bf4qL>=RQ@Refl=}kL$r(@76|lvEJB&o;z3T;MJEK9NB+myWV^4 z^_qtU-79PL?i+8{xBk(;tiSfR{yH&quYUJiFV+iBK2jSLz5mMlb^p!pHOJk47@2a$ z)@x_F+%Dc{66FxN9q3@;sLg4wM z$~pfs=pnDf7x@vE_ST(+Gs`J^zTGk^n>@Kqx_=3vpn?93cFnf60Gi+ud$@Mv z(V7=P251xy?Hc#s6`imxBmB?BCK{r+Ucw;&OY>-`$bh(na4BbGEEkz2#mu|8i3xS3o#`<+r|s z9o-8ZY$mvgGkVtgwx+9O$Vqxg-S&wf14#QuH|Ds&hG<`wkTVAbu$SkitHsVp&DSya z$7cj&l-0Kyo}lOW?4wf$7@(yx40+^dkM`nvHJ=VeJIgF!M0nd@9QG-!7|7HuL51NrEgFmjb&cjRuHg^YDsz;d z2QrPUX-lG2EA+=J2(Qyq|Mk!1dY4M9Jw*bCP`mtx13n{$@PL86Vai7sTjgf|3xd4{SCz0?3A9gyCMP&PY(mGoMtnA7Y)qzjc zZT`p#?U6^)07w}LO<>2pvt~rD;B%4hYpry8F&OB0+uf6L?$S8~KWC)ee8$l_XSwpp z1=rK-B%n9>)BsD^TM?-RvU8iPw6O?gw=9fq1%EAd3 zE?Lxv)Ie!GoT`VCDewDtDwDdXqv!I%js6OO)F7Lv^j3QWO$1&29>LL4c6{vWP?J zG59zNE~WAV)Gm9GF2fORAL3A8EL}FC+Gb?Tjsd=Ek34j|09Q)`VL+)q_sGrskj_8K zu4t(D$Q9RZgkA&6|2Puqgp;D}umjNWHyeWym|puFn=`#m2g+GESc)^HyjxK>7$6Vn5od~rmlc#2H3 z+n%LST9N#6U(o5m0u$XbpLC#T>j=}TT7t(v`tEym>ytOCyJ{W6k~TUtV1k2ra(Axo zy);)lTU+QCas-e#ZsHD1sp_|g{4UtL-}=|})u(UNPkr^%bj-dlB@UuS2ZbKBB|PXJ zZF7e&1F7JM4jDXUHta&j9^2;!TwO|to;zrB?tm0_&RMOCW4|v%d4A5wneT$mFF_de zaWEz}172h^2Y=cg+MaUMdyIVUzV%x5bs9FetFy9#<3Uf%VW8}_x=u&KnRXz5O*Yzq zfwcCB)13ZlF-aLj^f7HrKf^CFVn0USz#wC@QH}dEzAvIroxy78KEV-{&X@C@JalgphC+q6YRy}fUqqfoQU;DYw)^GlmFV?Sq?eq1upZZw+ouBz+{l-_G zuSclw`~Twi>h*WW^_Tw#zgd6utv{`o|J5JW$3OFY_0Y9fzyHG;KX?xez)yLi9qOmD z=gx>;cb#pzUkd>ti4PbUobL zuS0CQ1AxA}dm`_^AxjmZ+nN0WW!g6EZKhh?Rqki?iKl@<;v?DQ z4DF;}2BEq4+P<30IJMgR;K13g-;s7Xs|+f-w!;~?$#^$#73k<);HxL+_z~KYhO49R z^47Lw;DlT}A&)_lY4TqBH2kBv&^&{(=9H$?t*!(|uAA;sPMX*r;0Tw5;A%PjA!VO` zHII+7ar2SLq=DjWfJ^*m0iE_H0V)UJ!^_B_xKk$fje6n_f}eBq;mX>;RuHU&w3NkQ4EEO@P~{v_xZPO|~C;H$}8vm2o+bqUD2tjAd$15U4Ph4eom z2nb&&JHt(&K9B5A@$wuvKIh2iWyHZU4ytkMYZKy_FpGLK`?a_pU0z%uNOC4;ic1y{ z8kQ}GeA{7$S1rhs73p^XY)s;FTa|0ld?pP&E5DE_m^$<2`&n=`GAt>bwXNd>0*vB>?RvI~5~G80Y?vLMD%fNS-F$KYq(a>%XpPw|A$=cX%nv|Z#e z*we>b__zM%-}|Qen}W6uP{EI%jZ;8^IuWkMOeKpnQ?Z@3ou`Bi8^Tx}LMla3X76I@ zP&Fr^1x!x23dU=hogMqqX*C!P4hMM*;Ifp>kuDO%(+6UuP`Oq+N>0NvGTe{@ri>8) zKM5xeDQpfIC$t7>Hsdy1-WVgoLlw?43ZiR3ouxC1Z$YK_HX#*n1FHug?q}v|OwbeI zr~T&y7cMqi z&j^UfgJU=)(Lo!pJQ-*aPPx9xKBMuJ7U9uk;PCiCGBj zN&ec=&@!GIfKg5-5v9v)k;-kSLW0Iq_$xR^u8H58uTHT$Vb^8Nu#!=4%B*>h5gwxnIr*mm^i`Nq5o}DupIMiNJ{>MN#!<3PSqHtFZ4id?K&c2<>#SR+(Cn1oHS(kHzDK9S;kzD=oVyfL z9<)IkKOQabludP{@ogp>=2J&#cm}Avw0@7Yjryg=EX}qwR2!Uh+9XJy3_eZeNgL-Z zs%^H72FG{b->>1tX+84sP3#FkKuM?1!uADw?_!(oIeXd1?hGY|Ktq?*XFb?!-;X(b z?T7Vm{lZu3&Xc#JqsaCKudU)XicXJkZf-OH<^1=q%stXSmmCS43>H>B?5y`ku1rlnm6d zcC!v`Q#yEP=BRh4KL~$(4^3V!LHng{KX#y&d$qB>Q%^zTFFyZRedDX2te^V)$Lq<* z@6@g9SL=}**K1>Q1ADbtPh4NGFFtj>?qf+F|H_x@PhWnc-u|=i*Cjamt+rQR`m?%x zcs~Jvy2*cyr(7<$ z*`z^vw5&8FJ72J~#IGH^+ z6ZOuVUsqCS^9=ynBkGf9@WOYMBa^|sopsuCaCSw9`kjBslg~X2*4riv@J1ejNdh09 z$DUX}w%I|<2p0d&E{^eKoMjLe<#O0oHx1E`YBaD4<;-?ihfbU}&DJV|+NH>ia=|?r z$aslwF~+ubYUBEC8%ADWr{AMZ^q(PZ`ebQlUDDrl?x;6*MH)gU-vfs*p@9P$v55o+ z+7js$dk8#XNPqiL&%Ph!v)F6kq^{&^e3Z8KZwV&I<0e#DDT2J6q0fG|a_s9A_%EXa z-}6S_A>MZXW^FA#Q}=d1Ko|CbX}h({(%WmnDF=<#%9Ho{xz-~-vmO^8dv4n{I)~+Fz*iqcXXt9&{SBG0mrJH@G~a&B~oJI`u`!6CN~3Den4FBFMc4Ts7zNK?63w)8%fY%|Ga5HvO!_^PaC94B~sN ztgK?w@D;Q(z<@%n9-BX-DQE9z{bPbku06sl?j5uaPk1iP?Jtj&Ep0cl?vh!u(LbRV zkkCQwbM)75j>#JbZKUIw?~~!zjZcKRh%cR5;14#Qwl-g@$+=tO8%4V1d{#e@X1xY) zzCyC_E7^ntoMN~D4+Cs~n=Ui~vg*d_2quS}zC381i(g4!iV@2@D*(+*7-vg`8RVM@ zn;;dRnUm$A@aPbVup{(F$So+cOjyi8S#b&`jfgfhvlal&dSsFc(`mHraRjA@h0UYl0@`*sN_YSMK^^V7`~XIh$M>No zBLc7qM#7-Q*%cfJM{lx$#E<}p0O^EhzK^66<}yE*){MyGy-R1@y4Cj$c85IExJX+B zWB_o9FB2R91XVq32DCc z>Pyou%{d}Klb^=0E+erm?gnX~<|vGO9s~PwGK`WtoS*}Dc1B=HM>;+_;CxsMgN6Fc zXFgp|-ndFn=eFGK2g`&o(+J@0+t4a?3v+8oP z8OK6A$=K;H$0=DPs8Rk^+q8#rF%0}gcYxZ~QQH+aS=2QrQ9&jT`1_2ye2HJ(^u^H- zQNu~zOXU|Oza$^6isRK_XsB$Ld3lauuDK3%m`=SKYJPONz-;vxtffuD=BKkPPD|5K zEteZ;Ks(g0v6L4rKr*oM=O`9*GmX3kXl}=!Yo0A?Sd%`@gT8s)(xAue-fQ4QA8EHi z;QS&So!7P?hsd(u&pIXmI~#*9h7h*cs_+Yjh3=6D(%b|^zI0dS2>i~g)4ixgWU>zF z_>t+@J<52Nzsj8aa`v-1IdWgBDTQ2x*V7J~XFgZn?8NfYI@v8h%Og$G`AwZ?^XXLi z?C@|@@4b7k9zNWw{ey9KK-?SdqkBW_V6P7Ljv_D0zA~0hgt}&(us>nXI(TiJgJp4m za!&?wQH+ymk-AoX+E#JVLCt`bO(lQ+DBL>jDSa0&>qmd~PCfR8E%@W0TO^5g0es=I z#vcOv;dX36b{8aB$4mOe`Bp5Y7ks^P`LKTeXP&R^o%PfwZss+3alpqJZQto6F~O6& zVrEkgo@b*AuATAnJxzB;BolTIxxk)e0}gO@wo5yfozjqFuTPGLO$ULi9iT9HB4^!R zJ|=7cvuuaoUm^HfLuOX%VEC|34)$;aHlS_m3#5LWMeL7u*x57r?6)c9eco~C_>G*O zd;?4#8f5!Cj#g&+-~qe{%{kkad34E*mI9OdFmBvXA8pQ#iPkTjAe%b6)bGQ?C7e%e zKZ)w5d0fsKJ7G{rJ#h+@b9rD82~93Nca}+8s6YIk%|e?C5~*T4OpI=s7E zS2nNJgLmJq)7^V%i@3+pg9_sA4yua;dpg?6=;8juyceo-=dy9zCavrH&}Ug`}r zi`rgoxM{+Ieo3P|08?LEZpb5TH2NzK6TD38p3y5djk<#e&!xXVx74=0yL&ormqAVw zq>1$k4;am{pS2g~lKxh?IU7xC`;jNof5|`PTU(dDi+lA&I>fmR3~T~r<$;IG_O;iR zbtc3m)S;X5Oq%s7f22VFwsbRc$i0EMbdLQIU-5#b(m>{$9vpy`zBfz0s9U+Coeunp zpLM$I)bEqI`IehxozbAxK03VcXuZGpYAp{)QwhK=dY5)_4{y`v;Mm&R?0(~s^=dDr zdFV>6(8qLeo0Uudk4|Nfmp}70S#30x7L5)*Yp|M(A={)S2#P6aGzMJC%&ub}U~mQu z!P(_;KCq0stWB`)rYDM}@LJvGYx)PKJWSujGnyJYc-ZEY;Z_-<7S6s(F{s|W-`;fc zp#}K@adn7w>GwyTfM*@HWyZfY2ml@QA*4H~*mr1;{rnKX)BorLxF^Ii{z4aDp@&WJ z+@=1`@}Roim0IqvV`m1{8Mt8=whdse9!^r5o_ZB+jp z!-TOF3$n{pnW+#+Z-q(b@DIY{Xh}dGD5x%ll7wx<8sU_(rkHLy%17yWuJXxHN3kGF z(#@^nx225=>J(r86aw!h0(`;Ilj$16CgfSlh)`#wk@D7I$E8Eqre$TM@KQ_QNh6iQ zv&$dfdH?;I;800RXPQP6f)IZMJZ>K0(wOn+00+bE%tv)Na^}Y+FD_;C9foGeonbOi z)1YR=S0h9o-_gm3CBb)|pT@^v$@i~RO536Eh+~u+oLo;W9kWaVq06Xot~FvR4zTz+ zD(t&o62yGs^4+4Dfl}Jr7Vi@R2vG)S?tM3n3PWGtgYrIG3aP_Pa$~zyn3mVU1Y~+Na>wd)80LXNeSSRa(GUufE zQ=$E~#f2}z@-yf&9K&6QM z_nh}MBpUygpb^ak^;yu==;r$vGx}#B1T@tD45si*os16g^F2uU7rF9U(3X`K{Dp^N z7Z}{mXg}m}IxN*c`K2Sq8GEPg5r3Tn$Q1dqov~Hswr%`HUMa6E zMIL$H=%sNsO$X(?4)=yQv3^tVAaroVSLeqL&vuGi`}U0(H+-pr`jt!aaGuG1-c12l z5l?^J8UUQuR_`Lqxz&<7v)gbJ-#8eg*_KXssos8NuR7~7Mjw*x|H?GX)m7>SH|?OaSlUzR>?{MiPGh(~g4c zpldm^Tm~`l7~BsZeo%XN-!DJtnce7sk)?{#iF4l1G8lkI&F(Bzf5Y$PwHdGm$7lTH zo%$sogQIkYIO3%}UhIIccp}V7Z+t12ZV2Sep|jZ9 z_`K&vKjNy1vk^flILmq4=sOzPB5j5Cz`>7e()Ms%zw<}mP5=JfV~^E)FaL;93K0#^IBcssJ#dK zS?cPBUT$=fK4R~%-hbomI(V>~HiQn^My{M4lfKS~O1{SHCOg(m?PPVyp8cA-i!5tD zks0&L3*}pyi9^$YCM$uXjDUNBGG&avCQI;yYs)4O<{Iq|KQp_Et(%|svmW9=Te)bn zq8;jh-&6e4;qfd^J878-;fb5_Xf$FQutDv8vZjv?EW4y$ht?1GlhQzemu(OiXPtxt zdeE7^p0a5><((a~e;1B3u)ziTbUQ1xdhJ@CS(ojPf2Hn*F2ZXzMSEx-?XrxGe3D1{ zyF|{s9?8w~Y_I|?8{8?lsm!Z`(GjjeHL}&};ThMSqdO8)S+bahj0*K(geHG9jkaGJ zs*kQL@H0V+-G$m--Kx<8`iq4h(`IcmeV=}#cw4u86_WA*?D!L5UTdv%Oh2U|Pkk-m zP#!F3-!J`rO5xBTHd^}l%xlgTZ*t#wDSUlLD{zt`Qp9~5@M<)ZPu6dHrEd;tHLcHC z{>TJ*P1i2yi^@L-mW7&Y;igQmq+G*Kx;wF<9@`lEN^PR|*0#K~LY{6dR}b5_44%l1 zPbeqv+wQOQGw=fK3t!#rO(^dXHcg)g*^kjTMRCj-S2%DC$j&bGTO2%6-dbJC z*D(>CuV}eT`ohq)vd{?IuQ!lD6f#t9J{>d0o*7*e~u#k z{|NiC_4U5cVa3=If?AV?4%czE8wpY31!s%qc+`FykL_aH@V z?5(b@d-Grq1P6(YH2xQyy?TswMqp>i=HO&xR`lukl$n#aC8?g9n zku(RJJku1ziQtNy1|pp_oj{b``hn$WgPp0ovCS&1_eIuDH;nKezwM=S(o1}ykqS$p zY?aQhhAWOP=Q zGt@IP--!cuZfUuCJq*NLug=_FdZtGpMVVR7b+i&}A;zPOPHnn_U9yskQccS~!MfsA}v^%utrrqBVC%doF zfJBl>(L3ZHw#TYMBVopV{OA{W=8e80EP-!*$x9l)X7D$i5NVk`0$)+qh$bJ38MlN0 z?6`0qaemz0P6IdG!`XBTdeua66&8qNF0HAFKWXxlo7J617Uz!$0+97t__zRFH_){q z4Wmx=#P3+=<4Ln^4UY7ZpG^mvj>1#!DU+1uuhprY3@lT*mYBkiUI0U!?Nq!a3}H5#0vzE{ zzIDdX!`v2DlY#FNk|TnGH($D54}AE})TNfBV~5Wt`*XGT27pI+`i!LXcZr8fx?H8u zTU@C9EAP~OXWRAk`yNL>del1-t_(2k^TRJryz*t|nB5FxGqF9`7lSR)4Vtz^hZ;vf zI)qQO+2CaY+DQA@0@A#fHk!`4qp6*xmFl9WKEu?ZLytqMaT7Fl>f~Tp``Gd8>$mE7 zYmlY2;*rfkeAcXQu+ujFI3z$+@7)oxx9H26p^k$raw9wgFWPCl)Nygs5eVPFC$mJc zZ{VvF!94>?2RU>KY=g4XWTmww@&eq*5Z5}bE|quFrtMqnwR_`c?cQ9+83n)XU4r}V z8g3EH4BKwE+82f2V9j>hZ%j^{)Kljd>OBi{_4<_^oSfBKf9(azxIEA$yaX52Wu?lm zgGQMJ7Zz!I)Y0kTwDEN#B>NTvnG7b-zBbsUT%g0p&TO9K+3Jn!Z>J5;s2%JMYW><< z8DR9elK#exdgsOO*401YAr4^Ze)E2nPpqO3! z;G}VW$xnKyLmOm1*a!}{z~#o4bdQbx>USqTD| zMi=3D!C(4d^Pnrj)(($MjEF?9L*tZh_iej+V!7CDLCJ6M$~YWl#yAIKgDvYNPX-{x z4LSEY4wPggzR0F4U#8M8Ihd`E=rpy71lj)|P>Fd%an5tz!RJr>)fifaT9Pla z8(c=gRGMZx+K7zhx#VkmWDGTo5OI5U^EV^dl+0VUHT8JmHJ!h^;JtSBO6{!g;t$fX z^!Kt|xi6o#lXYo|&W;93g_2IrIJpdE+#a8S89x**4a6q_lJ}t#nC70st0QC^5=`nJ1cH?r(%{&p*KGf}R+Gs~jevO!hu8qc++>DE#7K8KBJ0;Gk}9Zq+N-uhr&_0Zx6BnKn|< zKFWZKC_St#O3XLyri~u1nb&}&y!hA-_>~P|Xn!6?CfzA+@peQd(8KdqXJ!c~FE66x zfM~jau^8nsuW+SpMtx{Qbgg za^^KW7LM1_O}OqFWSu(t23!N=d`KCm;GH3~9+&D+BwzXTZpYB{DkD*iO|3m9lg~~w z4iNXP)2~3nXUka3AInZ6gA>U8*$}xosNvzDh6GLfee`OGoj3p?%0;Ki-eiO}X}`GD zoL1z-t>_m{%ExLZrs=rd(a3w(2ec7dh#ch_4lUUBPzKUTC0&Z>#7oasuShBd>Z_et zqr0-G9>F^dbvnPazrjhs0|BL%wKVwxmf<7!VvB$!O|`kLgKoSG29#}fO$So^C{KH} zEg6syBMJmB`7ALxSEhZ@CIun`aa1`mFSmi&%0>3&uXR%1cH802(7C<%{PkMCd!d%^ zT)+-l79RLH?A6vwK4aw!L9<2LPG<~kJ2hrhbMVfqb!YFio_zX20x+0BP-SItDm@?N zx1Y(gT{>QL_BKHnSz-um0EY+8_L%N5wtulnq>VWNux1PR=tQ_{-`vurnp<<$OC9Yb zrvZ=UoQ-n@z@b~t_qWikBLdGWwYJ;~FLi8O?s&L+E3eBqc6GzX%>)ngYnRYzw;FGD z#M;9-@sCr|XzR5Br@OYg!of|50L<MK^r+S8Nx`ryYO`aeP7#(ru%>a&*{=>`RXJ z_Gl`OGG9lF4|c#Gy>&_D?)uHVg5#8+a(MF=K^ibdG9OxjlyW{bJ6FEb@zJ~1>Ld5B z)pI|1xn6kT1<(aA9U_{N{)P70cSuX$Vdk`YYSgEAmtEVGOn>)aeNv$LOC< zJom#W;88yPGUu6Tk@nsRd}LgQ^Z?qEn!y!qr;g<$ydl781IW%eK|ko`Z)}OWitcLv zBNFIX`eJcZUa7>oGN?!$_7Mr%C>wvqa%2*x)*MzbJ_vrE;>$IwTb#jvG2+>@{(u#k=e|Km@Hgw#hihcL{9xy z#F2nYdrBD_7~5k3Z<|LS(^@&tJuW@>`8avf?3ro6u_d%`97K6!c8fa1d})5M&abUj zzrR~ocb}`-6$PZhv~A6=(z-cD%_!2*;mgylLIS4Gdw8+UYVnz{Q6)MVQjg=0u;SN*~taWv9tfwPrhIzVhM^V7oKs3Upqbr z8NSKcU@I@wZ?UmFC66%0ogAiX`}BKb1Ce*VHGQS@Kcx8#x;VOAxx;l-cUAh1Ch zT|o_x)y0|2hPhPHct;zohzBsV_fZI0I^L;Te|74Q5P;e62picHf}j=VlNN3^$4D?C zl0x8p4m;4LUM~)H0t$$qV2e+LBZkIb5i}~-sK}CF7Uaea$^qDBteVrJ&{$qY^c#UD z!4f{a-|%Wm$Y~lZJP8`7L!v3uq^IM9iI&%p1U`jihEObLW=9UhEzYAL#EZPbvuxgP z0l)}wa6T(v?)&DA>vd~=6Ctz&j)6ob@G`Ixw!#?)3>c0M`wW)(WVEmp_Tk=c?h9AP zcihRP9F#@#9(Ew)|ZJ%jlBP~y}!w~pI!1>J%Y&xb0gR~3%K-bX%F3LBX zr_I31>=ySET!D6$kl+->@w6Q(8}-K-;46&{`fRUw`%+?`k(lbu)RRvyD2&}9~bFk(s+8mxjRz-r;bh3cF; zUmZu*eGf)=7C0k=BL3hpHm1Q5a*`Cor0voHFd?!g?>NtWaioeY)df%6V}8@aBhm36 z3>BtFwx$&pH^zaD_wWNlt2PRx&a`XSK%1!rv;30YSaF7q8p_KKEDHBOHM-*5hofl0v|y7F;Plhv48V7u+3_)t0r;N4=J6GDDc5ZpwY%cS*V3+oR zgZ$329+)LgUPqRIOQw{G?vURy;_7|dB!-^1bnWOEKkzp{_tbA?K0%;ZMCTeW)w5Y> zygN9kTUYk$z8|}2m4O>rXH#|SB?9BYAhbyvumJ{GE+aHRn4jy`F;4T{(EX8zE>+hZ zE@M;d{KcDJXP6va^;s|AdgMNIwzBA_xJomGFm@RVN-OEtY#ry?!I^GN&AEj#!7M?6 z*E2X}^ULVx!eVvZ(U5z>)n57RnL(Ia)(;5=4hCD*-@a7~^K-R%bF=oh_i*Yu1Udv= z1Up&1;Ip~d|I>Z!+E%|-?s)(?a{x+YLIug1ffn&Ya^RoN3jM>dU&HlV)Z>f}{iHz` ze4W4v$S#6fOxw!Mv<;x{_I9wn$;AQS_FJ$3_Kec>&A}39e?y8 zd2c1)GZ4XNac;IQE_UmV^Yir+@4cgb>O+s$$3O6B{n4L%wC=fdp`L$dFAvo}_VA;1 zH{Xl*-CGw4ye{5-XDwg2RLcu1*;;&YWi3neXL{fU{?2X<_qGVMZt>lQe{;2X{$gFa z`$6=0rgpAgty}NBQU@-NJf%ON|CyVcqYr{)*gZ9h?tA7u=usjt^XG1rUUA$GNOLS8?_+*ocyu0y2FLnv2pH}NgWxa zpxw~Ks~*B{{t`er#%=dnzlByH^X**goaYs!Z+r%D zhC#xPorxgvM}4+KSm}=&s zJ*P>T&slHm7uRB#<)PYHfLl%(3*WrQrv+4vZsK7b zvM0+Ck-4TLvQMIt)wX(`Q~6z)QCI36Y}dy7by6g&>SoaO`0WH=y-v+zFDIwKk@Q)v z-EDUPTko#RGt0f2@>Mpoz64rd%!1@rl)2DNv_y8K7YWj7v$o~- zBS-**KzqN~mjh^iMCM6!`xrg!psNm~i=#feBylixaNw?s`0s$7`s^?M>CX!k45&+{ zStmequ5hTZ+$TLGO}<7v^STS7d-=Q7wX-rV#j=ymY)?KQKs(|Da}|f0GzF|JHEd2` zoM_7C7r2Rl5hkNs8`vUfY0wB0VJF=YVsEH?GBqP!XEK$Z^z$f;H9^+J3-juCLz-<#_4L`NPiqX4V0-tb=jYxtnQ?*oe>kuSo^xwkd8 zfeiEAfv%N@1VuVcTw>^T%oAnZqBz8$X5z9u}pB zeD=@KrxSv&LpPXlmKn#VuY6e6z!<$#MktgHhVmJS0+fbtvIFl3!aBXvJP+o~nj1?L z0bH%)P&%}4eZjHOBskbEzj1EHTxs>B6Xsr)PVgJ!?DZ)9-C(E5q^(kNv>`zamq)lwS z2!X${6FvgV)d!YICklM4?hrJ+{QPF!_4v7(JvWVwYn`t)XYeK%<}-tG$Jt)peSWUy=LtBVfwMXiziqT(J>abHN-(kHH+DaC$5Eh+x6=ODZ*|rY zVQm8X=DTL*mulK)y1G8N-F~}^D>cX0_tH%IY^OAq2Jk>zofp<)myY|$S{~--*JqJ7 zcI&SD&eeCm^zuidTv+S%T%t!r1RGrv}=_uW&6M+Q~GS0^x3 z;OG)O1D#{vQ%LZ0xHqVQ&pT0T*4L_l5f8#~!br|HIGL&;8U>^~ZkdnfjSe zJzJmn=zHsZ?|rnMeC*zO{ILh>htIuJ-+TR5U2q9Ha$-O0^I``FhXi@sHQd;$S^AXa zRf6KVUhQq%O#kCxp0e13hqK7DW%7EL{w_Q@M2{D0VdWfr$2RP2)cTD#%a`igclaEi z1GJ~KNgY&2w108pkt1gk)nRGWR-9!i~GTZ(A z;V#f%gL>~Ld7F*Rj69#_OBn!wgU^PL#|<>NNS~6KZt9K5Ye&>yU|5&>=<-7cZnH}w z_jDY&9e$-R1fDo~?k~m2h7Q?M^Cm$S=md+A{h<9kWw>!je?2ohUrXmMV3WW@dte1Y zDF4zX?L?gP_+}*1Mu7#-m=Ns|7?aOm2Y1b{9kNfN!qCHxFZ9xZ=aYeB?#J$#4_MCJ zw1zZ$6nt!F`d_k)aEvXsthn&&&ZxeR^z!A)HH~b2{VQLs`MZX-aK1U%$)hY97{^wQ zd_7?a-#W#gPxu5)t;;;)Yi+%JvtIcu5t?0U>CJv}kB`?)Ubt%$Ms+C@vB}BTXfw9` zV_ZTb@;i9$5!vFC)l`8?-N~bDkMND`G&#s116kZ*SzMKq$l?gTrdM1oXTBCtln86+;aO1Z9bb|Z99@P!rX{S|!pXc(5JE;q7TYJ)4KIC`M#Qr7c$dtS9 zl9_VogRp>adHYy>b%W~`fK6k^wOROB=+ku9XHne{$Y;d5*f4Y-A9{*(H}dh-I32!I zy`{|d5+Y=^mUSqR9=5@+oR_v4EYJ>fp2-{Ape(?OOlELTC6G0?Pg?kVzR$%wBj+Pl zZcGNJa^EfQvkSI;4Lq3o%rE|_&yQq>D*YA6D1ooRLIA^|EV&|=%aJ6m#CCMwQGVBW z8eoJ8!pWg9C}^Wmdlal~NpC|HVi`SZkODK#pVZbs8R8KJal>U~8R4db(y@*ZkvXHp zloCgSJ=e`A2%!%6NE;fy!ZW&8;q12ztTGESa#SKbl(E*P-25Vv?x+}H#SrU|W>W!R zh-(ZVpLK$XtMA-I8l_KL&)QkTe07n_A5s*gG!a$Ki zI0@|mTsH`au!zAZpY-R{l+eP%|H85T(mA_V0oh*W7*3FxP z)Fu8>H3kZ}Cx^C;7Kw*-S|4aTQxzxHylFG{;Rh$-sm4jZN^a>SC7h~v0KkA!!$DHy zB~H3+Grt9ZtKw*!E$J4e=CO>Oqy=>%GXj{BAq|qMH~bbQC>s_p}Dw9 z6Wb|lchd_B(=sprqJRF{W)#?{e^y0s%dGm*{`*%6jBmTp3gERPzf4qKy?f+^uyY#eoY$LDM1s|~T! zx4aKJi zLBj*HODDH}a~Eg#u+BZbD#{sHaSi_ge*XR~>=5wVGg#hivM1c-OZU|2aIfZv>vjIz zLe2LKm~45YfUR?xvItXU>T7gv^jAOCGpQD*S-iaxKR1+^U#@8aAZNL{3oCTQ3khtr zZO%ZrOs(||>a#Me%|w3&{c;A&*`mYY4uJ}RmrDcpaR!w2!G7)U4eO4(*Xmo}dX7BM z>~y+z23z&^6>QksSNYzm=U%&6Z{6IkAN%+R8}8x;j?Iap9tY(Hds*IiG(e^a;9R<9 zK#{-%n=>PhnKj4GgL9T_X|FgkLx%m*ehzka^P+oKL%3{vj$p*4fZ5T}5n=3IY&U(^ z{OWxD=0E($b>)XYsB3S&RzG;|rTWGnJYPE-`vg-2I6m+`hf~sVIbjzY25(lO-$J)e zfpOu&YMpLxR)27_{*zz)O#Qik{}0#ae)cEoCqDdSJ^sjjb?41PNUoy}CHw>PiW?yc*{U(?O*%4(h90J&62JC^0E>VdMOULksp zt_Wm{)6dQQ1c4~Lj^;Yj23XULBE^aRgvmeZF}q4r)o7zbIK z6FCw;s0>Zoz>UEc<@g*826e|h4`+}_I%prFf66lLvyaF#iJ=Q^fIz-hD0V3Xlujet zMSd>)GZ}n2k50fd>a#7u+jKIuHb@oD!x(fLoI?xYavmSefK#~AHF!!l;fOMAq+ZYG z@JpY3?6G?N`IqXA7rt9-Pj;%etPPO@v;laUZsDt|;^&>T3H;=clmc2l=F4C!XTg^{ z@d5R|ITvnw7R&a_`_$6pjU1MZFO#-dp1V|Hzdo+P#soiT%1`)gp9B+fSGy=4Ijjeo zNurYzX$8*8l6HZeP&*DiFhuS-iyv9mMS7MG5@ zhlIFgu)+^*5x?w2OS_ek=$eR$tMa4XfSa`PwQ78ZKd!;zlDATKO+YjJrl-{r*? z74NxTK1(io6Jc+!|uqZc>PUIr6<^$3hflz3H<-2KouEJ+&q;Gqc z%J$-%kXQP~7(pW)fb1y4M|y~xn$e7vS8bl*$2LYe;7d zz3q@~kIPQeX;9VxY-V8@eL=BFaYifBM^g-xlm(aUY6CNvK^x7Jx3Tk8f_?dNV49zA zw%I*u!Ii<6qeSBl&^5(v835;p$9c%p4rw37lRl0jtNiXvIUXoU8RWwN>d5C456FW9 znq4x91Rb4r`RD-0$PEX4U4gGLaG7ZT5GRuQ-7&~Fx({(uclLdS0y0HiUD&7`rL(zx zh-;`2oIP*m4jNJ>ofPTHqB`ZaugMyEfM0w?|G_BbHa}>ywp~St8~x~Ne%;U^(znn1jefnx_ox5R$E!;RtewoD54PXegdmLQ+K~E`y%A4nmu(TR;qG=e z1<}dY=7;#u#-K9}h_s*scecyG%b;@a#yT($@*uj~=sR;1Cj!`+@qz~n^wY1u{%ZZB zU;keH*7`~P@Ss<3&)r#HdH%Kf-V3kQd2GhrmoA82bqS=#vy#H;zw=IAf8~XG=+S%X z=l|%Z>Y4XFiu1A<=Vkm_40SC11@$NRir^6VU~|9y%~$J%E4vBM47{`@%DV56lqc4+ zy|aOx##vD&f#=MkyD4^|gLcN19aHop=5g1>wv@iny4!`CgA#IK08(V-4Jc6&> z4KKCcDj|9~i36w}H3yU`_;*_mO#+7mUbe%0UeitkqRGh?sLAuZUkG)!eU?`boefi_ zJq%D)8sRoa&lx)W4q#cY`P464r))IGQn=a!>-7$}QJ0TQoS~OX=g!B6$m$W&<&y($ zf`kMim9LYC9~C>J?rHHYWv&F7&x^%$?I1?$-cz4c}QF7 zB0L8Q$LZ1YR3z!45j1${$w%}E>UVzqSLs{#>(VoG__3-W8To2A8!jPI&cg=>dq#Ls zd+=!ef##$6oDDbgixdATYfGEoX0XhCQ@AI!+Ybq$PiT`mOv854r@7m3 zR+5d<<-17O@3%(>tfS#Srk4Zk`Xl;I=8Y^`7xf+j({}qTqP1lCuyP|#)9hlEFML2Z!_>~_L_z2?W#mJne<5vzqL;-Fu zWtM3M2N2PG@`eL`Nq*VV@{GPx-7RWmvLk9b>B7@c%WMNI>kfC!&mlg-F;aDjq*po> z-j5JckK@eEaZxbD1;L7NHoOEU0d??t7{C~GV0e#{y5&23HU^~6WQ6meKfG7?wmv+S)k0s3f&6+qen+)xMHq>-adC)AOEmU{-n zK3wdwIEB@AS-4pGmdA8=4y976#30-m0DX{s`D3+&GXB(d~UJsxZ`}CLvGJqK!z`_ z)%kPF8O1%fx`3P`%a_;c!Z~DIxnEtXRlb)ltpJN(?w`B3RCAo4M;BJlE#P!5XT<*8 z>U^!P(V8XdyIs=>x_qw$0gyqG!L1|YholXm zvF}7V8183hw7vd-pvsqp52}w-IY3VGJ~*9F>TvtsLwA0oj{bl=e07GEvsum7Smvze=4R@xw>FD@xz-+CrcU#@LSeQJUPnF*GDyoHlMVr9 zM%)e$`?Y@adY!}Ooa+*pEYMla6F_0}rU}HfZyCs;fSq1CHtb3q4f4eKb_-$xt%)vr zrn8?Jqi#krwY}P^+krd;ilfb?dZ%v0{$=0+T|xeRrG}em9OJkj_1*3qIosW>jcZry zDgoBDw{F!7Z@f`&ym_r&ef6FC?u%FJ1o+d7&PB zes&W zT1{SFiimw`>Wysm<>BCk_JC8WC)$bfScIEaJ& z2Ispw{rdeMUI$BPPk&?(gs{clyX4b;O__CRvC9UP8&^?m-@HmaE-wWht@Oq4>Gx^3 z{ajm)-(=F?=pV4AXM51>1lx712HRWZJ24CSSXo-iG9@>TaV13pBT6glu|JeCK+J#; zKu6LZXTI4h<%qmu17F11nY(Phq`dNRhTKw72EZ%3))AVRp8xWOEbv}6w}d(uT@w!S zqRixV1(cJ9**J%?j>aEi|AHL=W|4n=8wb0DVdcV5!DFwefBfvZZ3=GE?6z%8R@&gw zOK_!cKkgsY`Md5H&ES?1e}9u-2(3R0jtw9Bwalo+cE802Kn&4vJ@Zq;zRb7J9p3Jy7!R>>KniPrP{jw zR!!q<-~B%Ag??j$9hz9+N7~_~zE#@kA4F4ULnD#pT0F&1-YLiWieuV~r)7gXU+qx% zDlg1nsc}2`gx4mE)9v;z?`OV+~^?NIJTt09i z7MVeYe)@UJYkYM+))AXQIqjCum(5IKU(c|)1Yw;S^-9TefRp>4(LRcYj-eB6$aD6i zHcJQl*tRT{e4!oktPLbBwgY)-Go6|gb;JHBWJ>e137}{4#g8^q`$MX2h?S=vbtJQP z6!y_52hZ~uj&RYXyw6vk5?kfh-P?U8+1*-w@w2beSfCG??=93kcCz; z+))j6frChZOWG!q;2>_+Gpqm8nW#A*KS8Iml8i1nThnvm#DlAb&Sn;C;^lX4K^ujv z5hxLRY6KePgFy!-?MBcFjD_%t%-iWCg$_G&0Q*liAeM zB737n9qVzBqOq~o7`!wv;u@xppG6Q)iJf<^fPqG;O=W7_lRE)Gm&RwL*+#(014s5z z76ZOHXNXW{og4edxh|as#=>>O4Mtm5CJv4!C@5YlsM$`FYdZ?tuhXLOaeev^UVXK` z|J_$%{7h|b->8A_@xf>x;;=dc0E=}bGTyil1=C6WJx>u05ryCb%?OJ{eG>Ka7R-UB)tooh!Asj3+(;JVaB zT1tOfB(u49l$knT@T;?;lVZo0C63^zKs$S)@v}~GZ>mV=&%Jc)Dkn;owemRcGmCTe z3;)5NsE2cHF;DDdb4r#FoN&mhRYj1MCK z>?}D@M4-RHZx1@Vv_ym7cEeGT!3FtJP8`Y6>2hh5ALUJD208vPSki*_JK}W&Jt!KP zkx23#?ZybT83yIk{4Q5HrmS-BbC1XUe&lA0z+|Jp2d@TocmmE#7iwi~IlCZg7@T42 zQb7z1&Cr-nolqC;k@v@(TV z7iqyIvOswqVJ_6|Gk2Inmxk11FrkAsg%OT^OB3lty9e;zC3!RO+Kzr29db0^aNZ$= zV}co3VPj}fjNK{0;8d^b6Hh)|PuzKdz;zBDI!Zp45%n45sL!KmIOTHUKk9%N=`JJ^ zf6;XU+x=5$d$d*C!)vv^vtBz}1ecqg8tg!!ed;HFmIl)vsgmx?dSU>kMgtOO)w^&| zOXrWOw@jcocR)Gc;{p7Wz3M(ko8Ljdl^5zx#{^B9v(n@?oeXq$^bZC#Iif0B0nW{S zd7X65tvfTme1tPHQOKS0r_9MG7)7G?$ac`=@IDxe@rA!<@^2Mp-UK_ZPu9W3o&bbp^!7f-2mMVG0FQc+tQyX;%2l&W?{CWBHTlMnh z&HD6TeYVb~%?Az6X6nYj8PwJlXo{?A19bki7t&+Psynw7p*1j)3DdI+=pn%f=abkk>E?+4B!M0k(jfQ`j+5lECF;3)s;ndS*yVk$ zTSqME6Yvvoo5^--pH8sPukbDTDW25ulDCO>)19&-EcRl(Lwr?4HyEV78Qp24cI(v6tblE0yW(mq=`)rW2 z{7c{YUR`|XvAT5MUCmaQOI)$FC;L0}CAMdxcGuVI^wzEV-GA|K>Y+dM*}9kfn^&*Y z*>pv zYWe)dy72geHM@!fV&7oj1TXh0XOXn`tg*zUo)k~K%!?tyOz4o2mg#WjL7ib)r5Pp=9 zKXlGKaU|0w`9?0)fqw%6_Sj+7>P(-Z$w6D{kKcfuHYf=pkYW49No^L6Q8A;q~B z*wQ#NS4t9iXp@y)=>=xN%VqzNta>a@SpvZ~M^jpF_XR!)xs%3fbBZK5dY_>A9;p9E>w} zW)P8+HW(xwwN+ADJ#7OnUS!smlLXethJKy>yn0DN+99sMkk`O=rI7HHQRPox$JxuJ zm6dwmN1v^izWu#=?VI037ItfyzUaMw5?j)BM`+~EM({6oR{on{J8YMP2|~hG7S!?9 zX6a-b?Z@)yiR}TR_&R__(*sKxa+hwUL3=E|;@SodwBz7PKHF=Zsd3aNMEC$A+f))3)IimpG$&yKUR$q4}At_);!mi_!vR6UcjXyWg;?6JG5)4N_cNO zM7s?X@k^Rr6kvjXE6=&@$aDKZg-$pm$>U^;GUj=f-AX48DH^IqW~2f6Ddx+MZM5xk z(9mN)eGNVxKwOT0x{p2_;`<&9!{0r8yM1lSuuq>htOH`4lfeOBC!7E$O+he&1AM#P zsk*Q@Sr_JJtA`J(<{kj^0KFVgb}NI|l%Gex*0=j-Iu)()5r^QMMvf2LU>zjcC>7ho zAD=~dYkjj`e)9@J$6iLL6fl_!Pf=bf*Eo-a%-JWW|9uHr9A>@>ssxPVBL*}&%NIxZ zShb}Uew8@LwrtJFjPk1}N}J0SgdHQneLoU>9|LFS;EpNc=*!S_C~en#w*@CMMPnw8 z8I1zAL61A8=^!1aEu#*}0<_OH?an?t|N86o!gH@f+|$|{Y~q|d>u_8Hm$gt|XU?6m zG#<_}5g5S)*REQh%Q1Sr`C6dkv@_bF(=_mrj=sd%*(Y~*nj=!*+eHutdof5cU<#KV z54igF@CeeG+u!S`V8FmxbL$Q^V~ur#4?726gn5ke&dhd$BMl_-ci9K@AJN>k`O3q1 z6b6*&K7k7DQ*Q%~Ui; zGGDG?sjLp5CKVhpY&xTMcqS-wImuu{mMd5#gIMUOW44xt`&a|cK`i+oZFjek6cMU`0nyqZ=$|SLxKiQ<@wg zBfjj`dR@}Oum0&4#_MX`+`Lgcn+NDYw+35aI6Q;KIQ0}u zXT@(!nsfrL5VZ}y8)p9U37zpl%@Kgj_S6vrT#W0{ZcS~S)$F(7&8V!wiUF~*AxzV5 z2VmAA&d?#dRPs@-o8x73p}u*^=Q?~ch6G;QrZ#A#C^mIvo_h!pC}OgOS)YWc)Ys@{)ct-t@YZXr62#9U#PntdjNO} zL*u6}MWzwx#lFDP7MH5IjyQH5o2D#Cvtw}cg}GU-LwkINNxHc_a$)sc?3FU1j0h(( zMdyF@rC00Ltzo_IQy&5g@}OVBIocmkCv^eC=X5sTxl;eb|KtBvzwx`@uJg<1>fiel zf2f{%{NY-<=bl=7@PV3JIbXil>+oU2nj9dmkIEu z2rg&m=0hu)ABRc?jtHCJYn&E-%t9jXksTUqXw^G;pr$x@^FRE(U#Y+Q%YRUv#kpEp z=z)u6;gzx|jb^ZOLmV4u=re}W*FnZx8`o;lfK^zOaS+kI(vf8co+jaov=$fT)F39i z?{d!o=Y+m@xVKFog6|DI7SG*NOLyO!<>$j2yS2By2`W0dNDpX%nKwg$`1 zNwxX3hb^GFt+pLlFaVOQbltS2ZG7X#R`Ctg1JKM%%hd(G%?9f` z7~F!V20g-lT<7k5pdR|*Pllc+@WGW#}NQw(Kc>JzS=;qDnc8qj|}=qANueI>(w`2 zu9tuBtN17M#}H)Y-d;WP^GgKdE-g)UBTe@8YujSybi%XxSWZqkiQZFzz@&qwmDFXFTEr$_jR{LT}A%}lKzTZ;r^Zfw(| z46+#7)7CHmo>SD|$ePkDWs|lhAc|k#Xl?z&1ZYU7to=+0}Lq( zqT~Kmn9?;hQ`nYAue=tD_yq=hpq(P6UXBM>?K_(u=wD$gWF&9V2iP=yJ^S^Y z#RqHZZ~g7R^LYg1_r_*`XbrXU2dpx_7bjpu?t4$e8l3t+hVs)0CQg7@UVa;+^d*6QLyom*I_WsK@Fzl(ESf|zcu7YWvu_?_?ds>`{%+4xEX15ls& za=X!40!N?k>UGJO-CA1c)(T};7JIeSo2exf@T@zL(Uxqx8^hQLq_gi%I4)f|8oGS% z0Hr*r{@z{+$r0=pjlpK2ddysUuW7i45fjn&K?#xCe zhyL?ih?@x&TWwmZ^7U?i4?7*Nm54(+T+St@_v}F31@qe58+F$Q&L!YVpmsV_2X7*Rc3c@os#5wFu)=uFo9{1p1vK~J$s-9`MoS!`Xmrh5xn*5)jq%k=D%T$Y^%(Pj~y zn!@>$l)($S+5c$0jt9+2G-%NoRiBXgqyA1E?QEiFyXe~{I?&QKuidI2zWjDgUAnJ6 z`@j5;>+Z)Np}yHv<9C93C$P2BN%+&swzj70vjdCOU0kY}`MCrxU3cI!h{QSedCRPX zu)}r$Ouk4z?5y(O!{6C5p1>}_AvAmKxfklrhaQApwh?(im*xBH+*0^=LTBIK*r;Fs z&9Bza{oEg^&-{sx(?=cG>)-!=U3=}#x_r<5c`i??NF)dToITVQDT=P3m|C2#nMId` zFVLo0XpWwnf<#r>1x48IHRFi+ZA#q_dQF z{BvMoICLo>ZFCSS$hX_#r2U9}<8Uw|vxA{wBsF~XzIq{@b>dC8?a>iw>kJS0W!74H z$^icKN8Id6r##PD+s8mdm!8T2vo~ASf&vR=<_oy#$E^wcVP14K?j4p z*cy2)<+&ewMtiNpS+QextTMRCpd+p1>+^;m{m4($%_~>x`(OQ1_4`{?2OjXJ`@mdX zdRY1Ky7_tv%b4!URb|QJ| z>d8O=*S1YrGFX&w(qM&r{ZUVwzub;C zGo~Gp0#pyumM4i{@UXn{PPzCAVwt?bc4Yg}1>2kZzyqfC$F}F56_0TNTiYfNWMq4- z79Z{_r)Pd`w=l>vo9D({K21H?wtRu<>M*~q&~pdHdHqd%y%p^HA~wI%S;D@o)=X~| zpYa0sR%>p-<%i&h{w&T&7j;!U^x5^5Pcp#Mc0jBecJPP)=Kuchd_GHEBoYl6f7`PL zjTYl;er)F`t&zya?G5$`!1l5<%}&^*1j>r!$}WmzH0W^_DfN)%#s*=GfFP8=Dv=EF z;X|csY+SRhQlm;^O!FbPEQ_O~*4Vn#&WB6g+#>5d5db%+ka-$M1C1CU(mN2_JRL`E za4wwPa_O85GoJyR!kC#lm^2P*#3PPalM60ost&ae6}tueah_+oe)Cq=&N_NG+}SlJ zIJYvM`)ruRQ;6D*NWjn;mJZT~JS~uQ>b^Vgpl)#o4;4dUGzh^F>*0tPWGyM+202~V(dv}VWQpkP>_nFF z%@W{rxR)=1P^atjYb{{vdCyS?I{PjGlR?$|lFK^zE}}dHNNd!wwm3&{N3gUoS1U_= z9hEh0X+E3EtSroPP2iXN^R+ZeUn6~OncpSvE!66=*93`t*H#wm+}c82S|M$1zRs`A z)xB%8b#cxaJm`->8^S*~(a-^r=Yxa8+SuEwjs9*O5`Y~Mcpcek;2fSfa_7vcK@Od= zfmOEi=GRU-%R>o>vV;jIBk!Ek*+3S3C^S6N8HGQ-BEdXyZY z1zw&ZyM3+LV4xKQ%PU)MJI=41&L$-2y}aMoi6QR;_uWx;6KS1_$fN2lVeCf3-6Aq!(Td%#r^>q0@sV*?q(3_?CWjehcUu`&@BDT!7 zy3AY}rPdKHaxFK-6FP-v=!3IUZrgrx)Ncb01c<(~>tJs;+r+zb;MSFEwY$Di+Z&tp z)*Elv%Wu3>8&lnS>XVi&)Lu^zlueB`nV6aF#gX@U*#wQw zba~w&_(2@nEaF66d*k(b{+r*2F4#E&AN6v&LtoW($G|o~p&qrtnql2|>FvDA!r6a0 z7l#p=`mB+Sb_0%M?7)2w+*Kd??5FCEM;@t54?SGx9=wx#=*8xCt=(}E_PJx;Lge*` zb|2C|$=j*9UY%ldXZiJ>vL2^OxdayvTMHBU|yYCXL%5s1g;72pwEGWLEMiMo{aXzP=V2Sovj_QapP<9*?#%R3H3?`Gs!P)H1L6K&>i^@0AKIf|1{d6IvI?h z9$>~+*=KMb8z7Fsx2=9@l;?ogAO849YU{>ked8;?PT#o!J(>?GFIMjC)`k0}K^mT5 z$NKXe)hI1(gog4Yb%+A>${#hk4T_6{w3h+48{Ej4!8q+>aHjo2wEg*2WbJ1gY|}$8 zK=@cp8Da05C!hlpM9qmL-f%m-e|hXYdnibZhYwl8N^ zZq)f~!a!f_=t=XC+VXpt1li~Nty7M^eO2X-(9@TC$E4vDwDoR8Y0IAIkt-%u-M^R7dE@ zwBT&}@*N+hkFWD<3r2bR!^65s=jIM5 z2ga|X2nJL6g$Q9R=Z^F^+9n}P&$2Y?FkMGLLM3{zp91L&-5#s*tPHnDlLMtC&9+X=S zw}5b3U5&y-nZZGsk$x(&_rzPeoe~|}xg6_!!7QDy7&7tTz6MepoYrie5dJWogKe@6 z9@5nIdmUJI9#kSPtj9W?_DztdvRX)bO7>?~J9!4&KWd+62_ z$cMtMUq?%|@!2?O_@2ifst4}408ZwU4$X0PDV)JMW(J|3tp$X9fq-j~V9J>(cjWBN zPuCp3^9$1iQ{7r7s9Kuu5fpV=AVm13 z%gc4?{7T(NCORMj0P-u3mOFLUliwJ7 z(lVk<>DJvh`Apz}(_r|eL8P{n_mj>ASu*~A@ZL)VVCNIaI%{h&!P>jJ^h6xAC+cQo zn_KC?gohk8N3I!N@$p>v4t7kPOhcdJ8tk7`pWl-{G7B9Xp~!Qhe5j5()LU`2U3Oy4 z0L~Dw&&<25_yosU2S#E-AMOd~qyvt(py?qrP3xO3i1TgZt}XyGw4^rWS=y-I!CP8U zA6Zhq(VKR1PrakUmX}}k*Fg~JDjfUJY^m&Bfmq%;$f%uo*Ksl3*)q96Zf|-gw~`Uq zV;Iy$`F97=>~N(=lZV&?#RWPf$TFY36q$57lE?JGZg|QYZHr5Vw|0-~>GKcNpZ^no ztR9}fSa&U*tE+Eq)y?bM$ZC@d>sQYaGxWM!Cxc;a?d{Ytd>RrA+|ldRodgXXbSbYS zp)wr^2_kLd+|W`-Fm00?!(<}`_(lfK>Ev*veHYjv4*n_5gU=)m*S8XQ&E5ZCJ@o0% z)xtfib?y0=YH!f5H?Qy1$^%c=kA3!!)yMwG&(uQ%GJ#E92xMf)nIqpZ6W*Yk&PeMN z^p?)2{dU?0U&@5e-q=a^*G+d$eK{}z+tFdae(?S8*0p!8)a5%bWmZaO#91$8DI0?j zKq?*AUwEx<5vW|c{}TE`kcYiLIq*5P_JZrd=2ji;?~y)H3zsfeZ<*ki{>b!!$K8jzD$R;xR@B?f0rQiK#Z68E>(l7d+xGaaJUHL}7z=!iJ zcco7I9yc3mau;dlpMw|LE&L7gM#o38k^b5KC^BQa;ETKrdNH;hLi3p)nNWY6vC?m8hx*X$ppLNW zYM*WiM48*t0Nbp8G^)>Z^9k3VwsDEiuYrR+pnjdqEEl&wCf$v&>~F_*Ryhh?0!Wyo z^Eo-guJY^qH-mI=a|Oploxl4L*T+6syIWiJ)i3^P9rrgA zG&cWETYXmNAD*eDyJ;iz5vMUMeZx5Xv?ak8h%1-MTJR)q+C^S*ip{59ah4v+t3j#s zHOTT;e8V?Nr5(0yRHoSy>mkj)5ZP?R@}Im^?nVO<;viqR=c=dBaU=-QDZW1U@40=K zEppXUUeSbY$onnDi#BK`J<=|Vrmfmd%3yyJ@Nzw2kWAmFp`M+Hzp=TCV+r%A$mL)n*S3fC0qO$5ZoYY-6od?% z+RPS?sl=qgGFD@mfQa%DcCNDniRHK!C8t6)BqC^MC?W0Ky=VO*Cae&Ud~p)VjGUX05Ws-trccQX`6 z1%G~V5qPudJhPmmRZ#DF?4i2v^7$yLhAEC}TzJ>u`etzQ0%PvNJORsconKq3i|#_` z?9$Razl#J@O9WZ-3942Jrd9~Dmgk*~BA6mLS|%_uxJrP9LpM(#H}CXu*X4$tnnQ8i z6vF4|e3_^ZNOqCGJa0yOvsBS^=;(4$&z-@^FKMRt2yA_$x@DZ67KUH*yYo(_tgQ=J zOI?FL@Sh{-nDm+JuOtf>06ORBI6y!AwTzj6a_~En9EV<4+9czFh ze;Qcu&;d5TX%4Vhsr8xWvu*Aabl1HX>+W-F2~wqpAZ$nU7q}*5Fo3V{1MWxaOORvR zTUJdhB8ii#bD@5p&E^@k<|lzW@;Y%cnZY0P+M!x*1UPgfcm82IYHIGRdOh@qU~y^& zJ>W*R_4m0E%AV1#>6;E5XeY!2T3Ic0@!U>79bq89n?81`tUNs9_IPxWmL=UIu;}P= z*bF+m!1ab5HhJCf!6HdAz!bi?S%lvNaHO@5qB4eUhiu)nfp60Qen5f0aqjVxda*&? zr?h~YowF?PEE^ZgYvE9`!4kG<4Nd|%Qgkk~W!mu<%LV5CE#O>>ZnADrpqT3Mc}*{QkO?r#GRy_o3M+WDDUS!v7h?4V=6Ml^vsaq4yS zoZ(Wc6M#tyC#X0OCenzVChYI|&LG5QetAG4IjpcB6ldR#a+>`Ez3n2ei~xw=IrzhUYlh;wF7a zlfFJnrL*CHox8Y(ZJ4W_z3p0CI}h1gATNtf(0@C2>Ds@wUcdjS=SaU)lm~b7!Gb`~5y`pdCHhg^pZ!{L$*IE+rtd zkLWF})E;o~wpv-*ty3m4>UEwOqA>|F$ghKDov|k3>uj-39Q~Abp~*-{M0M&6xG1+H zIkKJF(v^wh`qJ;cSRDdbXZ7ua+dG_~H8gd$-c>5@OsVse*?Z*05%tX0s7q8L4@k&B zZgy3qX64ZtqV!M5XdJM}^=bSJ4`@Y24;6WPD&ghmj6)v!} zq1uB4`zO{U{1q>(cQ>Zf@9$8 zuN*t*Dy_*Oz0`}dNe2OZCI=ja8(0QD0Mmiv+QI4OP#WZM@GmnD&|VzVrxbm-Y#a?X z=!3be+)YcSx^rp2WtD5~gXNmppv~fF8gx&Ss9Rk8Xd6;6_elwkVO{9wxqShDp}4Ye zTkfoje8NnBg*-WEn1Q9>4DR%)ANh%o*3r(OzV?M*trK|Y3J(23Nl#8}9D(E$^zUoZ zQ}Qbx@O9J%TW0W;evmW=@mcJPMaBFpnKz~6krNuR?{KhR_< z6Bp3JKu5W!P~@P^W~oQ;hI?cFP%_tGpX=sddj{UXv5yLEIRY0&6t3-{Xy~P$!QG^{ zJf!;N+-%~NJ`#MLU9%?nXG~zlf=@Xv3=%z3*7k6nR}oQ8J<8q;+|xekbG!0x&aLaU zBeb0mwaNh+SAbw|)Wtk=hQ1nnxl(YVyHY1hcZ~utS`s9!6a*Clzao}{-zd(H9$f1% z3^9&3w+FSkwFkp#0EC#9Q4l;Y^|iqg7=&B&%P(IWDuL2ijh4itk+dwZbqr;I##5$Q zUK~Pru2ptXGF@gVqzY3LV%uQ;k${7)#Bb@qGL6C+^%jl|Ok3M;l$5L7QxLdNf$T67 z_$6P&z)Oc#3;D<+j65W3ns}j1nv1p^fm9V) z8dFYM#UUq2B@(Y@NKf%sbRZgk%+RI7Z=C@St?T^xwaOVf-p3z%xbC}j9)Z<}h)<~Q z?Kp`&_F#G;DJ3wZN~a`edyl0^W3@2Qnt}3^}~A9P2o4r$M`3W`baW0_yteewF!=fc=1G^n z_|P~yN*U=i)kR)zQICNUZH|*X!qY>2Yu|>kIC8~_7+Slhjds#jJHknHHTR*PBvkhu z=%hh)c0_`F<e9f9-Y9knD~35p7JkQwCNoD+L3?iGfPa9`j#tyKXz4%o&4SThpnw#X%b8O_9I zWU~Z#osJbp)q0)TqT006RTwTkv~M#oZ_DmzhmNZJN$YGTbVTO070Rp(*6G$}^qi5u zc!^xt4PZKR?XHGxbDNP<1+AvB2VeX0m+St=pW>Q;LHu;yvHR|V>X!LFx3IsrQIp;I zT0FlNyWoT2F%!ZD=CD7k?&5Ow=2wtoY!r4#yxe8i8N|thVGXx8^WHBAkp4nPfrf?V z2?{t@0P_44ZMLD(TVYTq9Bj-ezv=cp$_H(+?^BL5LuIfw%5&GHrP{u>QQv!OGtU|M z>Nxu!`>8m((BD-6_9+Rdka^`-KGO*TbF>M>;Xd_1V{W(2p~9x{0w7$d|JoOIQ~d@9 z@bwusX9#^RC;=0=IhyY~>TGN9u+7Su@F^d-v^jJOZ8)d?5Ic2@>J2{HRqzxcA&6jZ zY4=@L*__kR*RsG9$L1W0qM4Ba@KguXdG9ycLLcCp)qz<19-j}ih;r+Z-5{a4!Parw zCLSD;1zF9jLEy9UD17BrT=YkhjdrIUFeX7Zva!61%u-4Envv}g;Mis-@RCmEp}%RC zgZuJ~d-@CVRKD5H@D=_j9|pnEb-s}i+e_)#OmR1l1mO24QzpUfk?f4Q+8(W_#K054oKi#XT1*>S!dc~fEH{>NP<}=lRZ)~UXqfcaG&2Lj$ zTbh}qooR=Knhc1uvo{Hr1P1KP(kgdcx0Me1jFcmv@-8zoa0GxXG3P5UoE4Ur61nLl zf8t3}n{h)=e3pm=s)=ioe`*0g2S29gw(MY z(+1Yt>xOLO$?QrE7VfO6zwuxHthi(e0fY?(}O2;mO#(;G(j-B*3x;Xtvq9oGG-97*6nuVU$i`dK1blv(zczzI2s# z$7o%QCoq7X`_e7b|Kdu6q(%4!(#@Fj6_(csZJK67DQi@3CzGvwDI={-vqJ)81kMc= z;BJhVM-x1h5nQ=TeHshvLd?e620jg>$QQ zX?eNU47}z>!4(15cm}Eq?yk`_uyGx+&b^}&QTp(HEPH&ZI7UI-E7r7vpyZVc9GxHDRcsu=2t!iry+0k zruc3CPA#0)YzJMN1^;OsMIE>{y6VeDPjEiY=&Yu!4Z=mjlpleomuZ1x2b zq@oye=@0GVRC8{740K$AkWD{CHn=wX(Ms|KNc5XL&dN~*?QC*uM;%$_zA!^e(HYsa z1Wmb5nleOv%98plL2O3`d4S#8!C_`#wX1f2O#kRF1wAr0jJLodjv*1b!n|z=U3;U ziLweVcE(Z$JhFW}cGKAhe&U3irn90mGPt!>+dKPp*9SgckN?z9*X4&F14l9f<7E0U z4^3~bU(eu>cxQE3*Y224;z%E5 zL>*BtKsbSj@;*UFtc^ARGSG|jKQ~vMIbXpsM*w*cr}UjyU#mUx-g6HDO}Apl1esJlfc*gV)}ugX>r7@a9$e zshyg;d$)h%9P%2oZk!h1lLVbOU4zwFhY0H)O9FWE5lzhheU^t{UZG*PZ zW*Q7B3(aOmwcx91(o>rnyYE0Mx6(g=R~${rO$O;_9nwg-QQq`T46=lwE^3oKcX^^^ ztOgW;VL|=~^qYTKvLc|fdyCF8a&i*?G^W^$H4T$JrA{Z zi9G+B%*&@%zxYyudj=oKw=iWn8LVGEjeWQb2w8}_A{E{b&1e_D1}h%gw)jA#HJaIO z?N5_|#ihmisZaf6-MD(SzVoGDucQ8Mb`fsj z`ZiY5Xs3+YR_P*Mz_adApQ6(*y_BB}go0aSP@MT6ACnfR75q!POo7+2&zv7hW3m}6 z9>>OG+g2grY0SyBy z<=Md2%`9Yon+28#@R9aKcD;gr(mOmL-ArRYKpjbmk*ruonR0MDJ4fnESs!&PgDInY zi@1d4*H8RjFRe4MXpvb++{i6FhB? zGw7KSga^LF-&cR^Z*O3O`k}9VJnYD81zgdv-(9KQ#k*?im;Sf^yU)k@_ltmxzY1aA zlf~DLf1Jmy+Xn!-xw}_y-dwM%H@0dxbo5HxK+dlSM}Qg}Tb^dv2nnb1@!NQy@HWNd zkF(|ojvWLeV+m(tC0Z!Rp@Mm&<1;V7{0-xPJ!X()#lca75ED2O8M#cmVsr$nv*+&! zMqu)_8p}&)X9WBm3y(i?TB9@A->>c6L2ayW)R3Um=X_KWnX5r`L`s9~$eA5XM&xL# z!fnOlS*x@W+#M}TWN%<34MRHx+~?s?04h&=z{8GQ*|2ktFp=yAB?c|pixW3Z0EWvv zT>_|5`et)SI|4WLLn93|zdEfr}#ae1M-bKN||I6pUEb9|Q;mTHxBmlZB7^zxnc758~>Uv-tCt}zAb&6Zw$NDXcWmTA!`YaxG@ z9>C+s26aa-gf+uCe2Ebgo&zAk*%?XYM;Xxpq&&E4%+sloA;y$)aXvyb3h`$r;;$oX zP4AS8DR^zi1Q_!BT-AMdU#`2?+DqD<;TEO@Ogo`R!=8Es#-AOHGrYDv`~gpaTP)2n z8~-@v7ry6>YvKh)QqBN_ky*j?3bFbllw+&zr`ip~ycqxZg?74PQi{?z4Rxh0{#S&z3UkK7$ zUYe$UWPLdKvXly*x!Fjvk!E>wTTcAb*^tr(L0Ua=1_H4i=4~#TUfg)^2&omj>C1oJ0Z}@Q11@z_CtbaWj&tr0fMRn!;JTeKL zLQi+DbM{4N7}~p>5y*8+|7mdGl1U^52WhXS!2h)$zF3cc;F+3TAmHjP^6lOJI+L3= zZr!To^XJO#c^}_X%=3)mfUWy>IE{iL`@4^vXs7(Z9Gerwsoo9v<+;7F%#IIf zFOHrIGku}~v3+5aWp&OzMZP*49-a!4B<0*&-Umz_91W?EKW#f7VP`i^>S;QrO$d7Y zHW^cHb8R_5r@u7cNY}(sm?n0Zrib~^ea}}+RLx`%rB8Sv~^b6Y>{yJ4GzK!%7MQ`-||yG`H6b@%GLUVFMpwq z2Rm8Lub*IB+Fo$?nXv?Sr1`GF)F({Za-O__IuwYm?u8!TU%1 z243xVsEHzFu)-O=+5Skj!{GknQo zJ$~JCW7dt&ma5xXLYC(6>sGNl=jbQr@Y9y?B?-RpJ>7`Hi4%hr%jVf;zXTr{R98mj zrz}Qx4A2ZvQZM=1<{A*jGSO4Z$zRTeN!d0_W?t>IfbgAwGtMVZ43gT+SMycmOPi<= zuJ!3V>UX6$b`)ud(7K2H&E4&K{l-S!yfr8v+H=DN38mg3KT#mBGa3=ZMa~fkjpJl<7)Wbn zVs4{s=1G1>xeqYQs>l-FQFtBVhJRbiXGFU@*spb*j=}CO(eFXt@zs^Fl-Jp4BXKCdof4SK zn2aD02sH!U3`gjPBj!xT7;oF1Wf{VmY|j}2OKcc*-l!6R4R+kS35UwM4;GcCbpFan?x_-Z9r7 z|HOytNdmCtrTLog%~#K5c?56s)Z=c2U6&R1P;h6vloJqY9jWbXxR1Zq(PpZ+9`TMQ zCA}S9*|KrI216RRJU^N)Ell&KzaH(^d-Nd<_Gq9W!sDMelgD525}tLMHkJ?0#gA+8 z$w(n>QjHHmX76aPu3sHwGYQuoISOURq*0T;%CW{jiq2Q){`c9QjFOTsGm~7WC}qdb zK8DBs0?Jd zeS(Jj4m^S?ljl39bRb7{=h{@=d$CiG+%Z>A-LqJaUtFpu&#l!H%NOg3rMv3sa}U%9 z&OcTky5q@u|K%s@Lk~O+ZK~dR>nhdB`NmK6K^i!SA)e{9qrc)VEyYnA$0_Zx!%YWn zVPq~l#F`V{sHehpmNGA+mF78Gr)`@JObm`G5T4$aH~tIP>)6oTYql~x<%ryPPpt*N zbP^QQ(ve|#Bs?<4!4i`8fHVh+Qj7KSPg`(!x?gX;dbK|I;k#;Y zcfB^&uhx~TuT}SCug))NtN2oOABSS6e;C>vUC0hIIVh>CpFfIs4@+7!C*6UmCUg;QQ;*pZu9xSY9CT*&{E`DVS+*<)5#$n44ch z7FN)Q_8_^)Yo8pooW>UA6&eYw?C7~m+Z;G?=0fM7b?n@*<5vItP(A~eIK}F^lIuIS zjt<*4_-=C_X3+-aB)jPuz!<1tTxPL_z8b4)xlO>eeuP5 zl|KB=kGwa#cQvN-qqC;7&XHgaxpXj%D-$?xa&p_=DK9D8f~Qbm)K^)?cB@`=tm%cuTgH-esRm+;g(iI&$D1TOV} zcttWN_evb9mAksd-j4haHhxWpDwYrqQfRb(4U7vAl zK7;TQh;mar3^om1EZ6Q!JD2piM6s~ZK7ZeAX>3*Sp$-#BUAyak8q*u~5o)`Aq4vdo zw8=o~^n?Eqxd=2#OrL}e<0pJG-!Zx{gHC0+puCjOoR9m**eVh957`+%k8H5AcIjMw z@)IAg*I#|3zW&uO)#>gg_P_ydXaKEjN9)JhS4VtqVWyTIg#WZZ8(JyfG+gy?MMwsy zPq@ zOZ-j_vG)V)9(mmC!d;+`4zN?)-yga|r!&6t}~BMPM8kXX0GNsi`D5aV-qh`cm6`nFI?vQd@b;u zTRc}wiz~H&tz05cx3@^3K1Y6J0J)V<{_1;VmI=92o|~P-H;7!w3s*;RPoD%Ds$Vdq z@rbWBG|z(>BoPEU3zhe~lF;M`+v~tTdCg&ZUiNLhl=FW4AM4W3pk8$#amE-A>b87f z@f(={ngLmpUGo56ILU{sa^G}c?J_Qtaum!g7xHKkGul72!B}Mk{t_ScosH$&-?%{x z<=~;V-xog9m#HTf?zjZ;a!vffi*KNBs&K0ym3zgBiYCD{s@}Kbb-n)eTL8xxD!`x& zgHc}cI~w0ciZuZ3Sr(7BcG{UO1OuWRBHWI^##!XP?@KcHlbBu7M8qJAKOAzM`Q}tO zdlRDzESKkqs|3+d94h@NtDTZT2;>V+X@$zdgeQ!13Yp^KEy81 zRQ2W;!4=~J&b~K7T1QF2OCH%lPA$*ZU;SVI7xi-=d~Yo*&IXok3z_+C*EZFEqjdgB z`gWLNE)QtWe>-)|-0kG?-FA2tC>-!xdfbN9j)?r|$V0c0#2-oIa0E}hq?fqazbgQ( z1AaH)vYdGh>e?=M@a5~#r9h(&M->Oq zdYU3JGLCM7gGN6OxY8@Qw8Q6tlxKOb^DYl&F?b*t*>IWHWCz10I+V||gBls|Z^1r! zfH6b)_FlPmWaI~UHrGI6+#Z7|>vIO&7kOK+JeWeZ^Ev}yb>~j%;~#r(z5k(y>f(iS zIK1%Nrpo|uu#7e$9c%-e{IYc*( zs*Cfk5$<%Rvg8$VL>C+=f&hUUIDG8vo6WLrKv^q>KpEcM+pB-{_y1u!*x+I|_@^|) zu?MF3#sO_5fjb3{IRR;RvDA*Wyw>T!i#oxVEOzwbBMfybc3335r{jTf&(astnr{it zc4)#PubqR3=XN-jb)Y7@yarjmCJUESJ1Ud;qkixe9v3>WcI?8{QS-&$jvj`mpd;+@ zOo4hG5}6L{raIE_EH?bb7q;sE^0$An?tkQt>Tlhu!QOVA?hR_6fN6j&Iq3VG?0&tm zaah+j_G-8@tXtdt+S(q}Hulk>9Y=fJeBr)@*?M60eBFJyQ}+|WT{u6N&3U@;_Uvr7 zF1+_+b@9PxutCc;dFl``{S5XtgH;{uG0Z@f;+2~nz`RroLDWA4;=eXpT!M+qq5@MB^Y&AK$jVkJN=iAyKafka{F$@Y*Znz z$c1IqC1}pI58`X%ot<^oK&zZOpzG9x@0D{kkuz-0u&Qs$lz7=Tb#OM%|LTxt$*O&- z8IZGBA>i7E*l$Erl_)m9%VE7A#T%ohx7l-`=r7I;FcwMemuwD zb+FdmsYw6^QVDJC3-s@m9n+vf+GYJSQ_7a-%C^#=@_TFZ+(R|-Ti^VleP@Kir7#9CR%XK+BfV-wFlER0HVx?DXmtV`Zp)jr zgs;d+2np&;jpg$~&QZhDlnA`gAS^~kgEhnfFjAczFYd!uT+ncwEv zD7+_mAkI7)G2tfY5zug-x{W+z7%l6;iHu7yWMhHh^q|3{EzW2W_|4NXTT_-@NgR}9 zKSnS`Vw4W)a5uKL>+SVhb)Amw`dimNf8(EaQyygGw4L$iuXk`CGNKi6g9hBQtjP`_R{Abp|4Bv|V@_;}geak;xb-NYof5@RG}ZXO+65tosY6Vet1~9aVexbR%SO#WK27t zEI3k)@YQVZxPJWO&(sGVelYI>o1g18`i+S}Va)e=Rlq~JveOQm1V%@8iARf zovtr_;fwWyZ~cIBU?hy_o=sIxDF%%*dJWx_GpN9QXy}p;KKLnQ(|+M#jr2SE2dzSX z?q=`@pu&$6A}_$(U`xHzPRP%ubF`l}r1Kfss&TumFU#G)MLDuw?M_64^77Xz%`Klj zvE0HqJQkWBZ%@8-(SZj2<*z zXChK#Ac8#D{tnJ+TlUrXt`IlptkDM+gf7xqNBsx{ow;&#gEKlVjhxoL9v;-u?yWlZ z#l7%ACtgOlHF;<8?&>V9293#?ZgdUlsGT=ouP^_@e^`e&2_N~~&(|IIJzUcZ^Wjx^ zNn4M1x9ZlLZ$uU^Jod;47jffv)CL0q9qQeUjoNte#k%ss^R-RD`@rLm)Po;*vO2w` z>MWmwKAk)~-^3s-Le6mh4Q7=|>QFYQJhG>B8JH-GQ3wqZr?IuzE&Hd8D3jd!8f6x| z6f_;12#xa8uiyTi@6RKPmXD!wzIm=NV10$U7?gJCt$x+Ckm_^vCM_ zeUC@B#YfAKC;OKqp?_D+319KJPAFlutj>#b*~2%vpx?h=pzS zW2XR(oJGCwk^Ab$e(cBU8^7~=_2&1!TY~`|rj#VFZP8AqPk}%VD2@Fi2Lx6gIA3e; zcjwfmp9a4+Jhds8)DfCfRyV_7$qv)t$pLXiHnJt5D5c|WFeLrkYYWsl+8LTdfBEI$ z7G-E&Y>hsuyS-|{BNxbx{qyu>S81SZlRazLH?SrUl2w*-rN?wRKtk=n(m}v;OiOj9fUhz>+}x}F`i;8w`m43I@fJRsuLK#=*J0E9`GsI3WJ6)>~M*u)JBkxcn&$5WJRN&kO z2cE)hL<=E(XzvIiI6!$VpHXV^E96mTaL_?@sZFmiKF^_7tt;bbl3@=nL{ra`K`r2DH+#S%79MtK4A9@@HW*<8F7Hx%Wf9Nuq<2Wu|M{qGt1~|tFa=?Q; z0~`_^DxCwTGN;|bzT1l-j`P=~{0kVi%XMjuu-fRv|hIj=%#Y#jLz29?#y(qe*B zosuDr*)RR|zgVC9@n`AqH5?vNL=vJJ@|kn-8Xw;M(Q7jx<4KD+abjCYYKJ$t4jk|C zn*ltIak-rHZ5$pSV+fYyAhY>z!{xBPbQ%aqW@b~r28a`lfr4Qfz_z#93rjguhZ-dH z3Tna&zR+=dr(f^fT(9rG_;UTqmwvNed(BQ#NfQ%3>H;Y`7y%(~KrA!9z!yjJ8R$BT zWuRs)%501tyfBDsdO%KOuRYTTOamI|&fVk{yiM^4O#_>AdC6UkRsum%eSRjoN|1!` zBWGs>iY_5l9#3nzJ6S*ek@wbr~OOOEgbq$#W=@B0$4JzATUADI*?hsPN0)~`SY195Ghj=s9#xx#pc{2mQ=>$JZ| z5Vl7fwY3M}iqkkdSBn=Psfn3hbyrtv8vE``*!%CiQ{VlSe^yuDda3UJ(8ubjpZts! zXt)zB0W`CHTkpJGS6+X!?tA|e^bOei=7G>A@byfZ8q7eK{jJT~y?!Nu=gNgkwQz0$ z2XleCp-+$Cj`G2oHY&@_v6kspO|wq(jq4PwYGQp;^QQ znj3tmf6mCqjt+L}w}1D0_4mH?YHbfs!1GoD0%4?jX)b}0)6fk5W&;7`9NcBAwl&Ww z!6T|`{Iwl?aUI|m`X(*-I6#}_Xz)Ort)69|1MF>Ib{)39=v(WP9ppU0c4J6K&Yv{W zzp%}IYB{IaXZ2`V?CL1=tu6T=lgD#LxwpkcVJ-x-LKS zKwW%dz9#X*Ji;IGbee36*o?aeL{H{0LcZb{3eEH5{UFIy5LrMvy41GZ{uwrypnV+$|=v2*695_=tOR zAjPK{?I=9=Vjww-;$!d(7){Vnso-`N;_Wj@GRo1AzRrL~1cN7RnQ(S+T$_V_UEkcQ zjceCy{o0M%-Q29h-F}=+*RoDEk;eFIMbYL@S5-WLS&Z#I@*Vmg|XS&*-85i+PXf>-I$X6 zK8KOUN{thhlujAvS_e-7aKsb4U*Ke@aEUkK`^a8izN{FVGs?WxnD8*RoIeuAIQO#PdG z@~`T}7hc7-wNZF7M~^hbIwaO3I(aUPG;NgMYyhG^z)hVln#?KZ=!BiM0~guRDp{y6 z$VeCUTOQe#)}iUN*s0iwB>)>?-s)EO4G>x$>0w6{hZtNjCCTHV9UFJ-CbeZ2>U_Ir zyV6lnx4h79jsr9CQl3DXR^rm)$Ay_?~YFNdD(v;j+BQtXRG<$Ho7`N(qI{GL&=L-~i9~xeeiD5P^>b$e@q%Dq-z649M*JfT2GiJthdWzwvv|)!+Vm zzf}{?2tq4o#C1@mr$_Tkpga8}jEjYtbXgx3H?wiz6P$0$YO|$Tfg|5Q;Sl+mAzcyn z(SQu9i32b+ik45GCLcAD)=PVa1A>tg+NCa#dvd}ZjS2R#*V?Ak%bjuiwc`@bKEmJw z!jfM-X*#9~XP{WT$e;I$Nils51Ap;=MsfBmPx}(g*mel1J+pmzbpkvTPG0tm{N^2z z)FsW^dlHAKL#vpj?BNT21TthW?~>Wj4&3CFd{lM@dmG42zn1QOvL1TsL&1Tnf`4XH zWGUaq9m;WG-IiBYS|FkUBnLDyAhFI23i1ih(m4DKx7>F?NmnAO1r>UUxijIen+N>RZWKc`Oey ziGa+UpubWev?YUsS7NHnWk3Mft*x}yN^)=_4HT$caZMZKZ@aSJ(H_{lw`+q;%QV|c zn!h9aqFn;(oC`xdV$YTKk(}xGjvN3XTM=hoOKD}(R@m1`N6NxiZL{*M9LVeTYN22o z7}^2t%DA63EinLXNf4BroQFTairng#P=BhnMt^__;^OSG!3+#ie_CK0Ezd{!X?R)% z=h_5u1(q@;K4b_U=C>M?NU*9_mvxTx$7^S?CY+TeKN=ADEwgQr9<(p`3k=w#kr4W% zb-Ipa#PY?E6t30oun$ zbOubnZ(`|E-MHh&Yj^G5n)s)`@wE&lJN24K&K8m&L98{`HUs9k3~#&dONDhFV*Wtx zBb%5h1#2+?v%x^IMyIyNFTU*$#v2t( z)B$B@DeKZi8Ecx+yf6lt4sNqYGo(A6>WrD4T=J=85Nn2XN60c2YP%y8D73K=7{u8i zf2JiNn1bV0rXD^J=~nCJbK3bNFIzjRt9!e(d#hiA?XB9~-KoLOUJbW4v#Z)*K;UB? z7}mT1v2eggj!D*MN9mvi%+-*@?$b^M!hqIUB-fJ8bmv2}8Sp`y$Rn<8DUAV~ostft z&Wp<>9Z7Zs?id4Qr>rnIy5cfON6!UAGij3oL?=jsymXMk&1?Dx`xzk6 z+0GHXDF8h*?3t;B$d;40@=}@9*lca@)=O_)tzZAf*Xz0Oya6qcZ|Lk!f_dI5GN$3c zctPHoId}|TJJUGj6Xa8Vm1*j8)Dmf@+?--TIrN84N?DymmS&V`kh9DzGB*p{xrLcp zK(3ePXKJN8TNhRrYH?w-aLX=(8YAUGrf@G# zKJ89kM^4oz$&*f;Gw$mmj1M~{$t;X!0Y-VqqT!PO!V?3_3B%c&caJnWnGK{gmsQ{XfASChF?Plvwb9nj+xCNEvwg^f4(YM8 zH(Vd1#0M_7BYix2s9gkHHZ*Fj$5sMIoi->}mqNbGk^)#%Y%BFhvNR8#YA43nL_cD6PmUGRrM&sAdrWXd|M#e8s6fpJHC23nhppv$j&1 zQqILeJJH`hsGIBO>(Bi+f1BXJr86U&E>m)Vk%Z)!CYtI@I+}f4U4pMp?biI%el76r zb&+$-Zd(Jo3HM|VsJBv)2>ok1{am}1Ug)gJ3whS@;{A6(EaV&Kd3JU__~wPWVo5(1-BX#Ad+igv zmv_$EPfZb+PPduAe6U?|yE#e9xsEh+AWv+)@*~g5G!gmN3fTooBkYuiWoWoAy5KY&Fw z35>_ivh6w4{!p3yzB8@OHjy8i=>7U!X0rv2&maQ-n?9*~2Zuwh;WzaPCjlxlBo5kI z8?&_-x<8tKg$P?1Y6Ks&9@KLDJK=$>svG$8#pw-W;QrEsA^y(9n*MpQ5&MY znVL2TbQV!uw5$AwUeZPVkWMWSRd0|re3dMFre1kuU)?qkL8=V;u%}}?Jky&=pxWQt ztc6SW)_qTZlzs#nwBpp^;9Q&Ww-uH#5DFbU$1Wr@Uz_jD+wmc}biARL&yPu`*hFPf zo1|g6BRjOte|T4Jg-O`EBYn9J5)&Y%-ANBdHr@)nFKX_aG` zqeGd@wF*K$gR%ISoNJfV@z^oaV(ZMxzt}16kBiDj%Rq2&$pz^t$-UNYIHBEf0RsF)xrL#m1&1E5JHQZ?a)35m%NQH z;=z3r_>l%daSTHp;Vd(5sY9G>i@<54f^VH^1LdSm=x?7%97F)NbMsc+!e6-YCIQ%B z6H*=FA0O0^_-1o&Akww7{7_xH>&NP3>2gi{i{Jd(*_eqs7LApoBik^Db7uftM(DF4wq56bpMWXT-y~=dOn0}h0nTcGawr%EXV%@tQ6qr>g~mb2 zEMtT)ON+hQ8xYv|Kr_XB_mDGEj!49*;JS~2?h>pW0AJFG*Bpjx)^tJx0cK{fW z9a7KXjt_aml+E?vQ7#=(Fd>G!dQB5Fxg^WB*$G>xGYC3BK1l1VpT;TAdO)Kr6Pkf$ zv>ibC^Lc}|2TnyqeI6y0vZ^fZIDOS(deT&5rob*P9*R& zh}!J~pIbm}IzAhr5b|kTpChO^{TcPAy?L1^K;mr6Z7!tep&NuOF4SN8-~5;LCqMpd zbqT=2NWMR+JdyEsn!Dq}`@sNoK#RYw{rx*fyX(&&5t&;GTgEIPGH9!>ydbXKKRbd8$&$jh7S zx9a(~U#J@!o3*yEP=zD7FuzbsZjb^W%{h`O&HzYJb=*;6uj2HG$mnRM2iY(`^=XI3hh@hd zuk~2HBS&fnOmQSSh<{OW-5h5c6OBqkmR!yml?^ z(Rnt%0oajwb)?CAiqmM|y(x*8MQ;#Bp488r?>P&&FR&!#{q6?k>xIs^`XJA9;c&(w!D$Wc53!%prt5pSdI{7H_py0y>H5IZA1GMMIMf-H@gZC(MfcFdVVp_K^<;x z)+=B6^}71{i*@ng_ttwp_6cf3*0sghg46zXonfEfdH(zL%`bkr9{<35YN}@-HIYpf z#Md@Y_<9C-)8xdZOhADbI_GZiV}PxUxoHFf)7rzYywS;z^J81V*JtFEhrHx8BbMrc z{A@JIav$nc)RcXfecESWWg>+F$?6TkrTv!Ud)fjcHQ@KZ{zCn?Uw*yLdMmYa{Tlu1 zj*3FxL?16Lfs(fI@mxI`%aLsocx0WFykda72|Vbxe6GjaSM+)|EQUV-~;-Ar(__OEuIB z+|;cT+KQv{e`0Cle>OPx+2r9%0++ZEZ_XNAeg~b<P#R;`?`i7)*2?_--XsB-Q z>>SjM?cEw|?_@7~CHA=A92A#e44lQHLPzi2Jug{etwh|8=Cp3PDFsTn((7alR}mol6T zc6aLSo!#2s-K%NZ=zEq9w)Ya8`q25__Bu?aE?~*Hm@mpjNceR&MQ6=`rq@}Zbhoh^=qIsZ0a3r6~+SKUXLwZ^+2RBlV zOe*I%ud>p_k$g$8-PY9%rh4FKtoWXbNEFSyTt?;q>=!g@;OhtWwrhR!Rs!%CCiKCX z-7XzXmTrm+|FWwlm}xjO;zzPO3JwXJBmz|?t>Uu~3?^H>?=pL*nB4(UkE^4(d}EN@i@rJd~}OZY2|bY@bFf3Z&7 zZ5jCI{ru&=?QZ4FU?FHKPP8*e>TO_hjA-2)#KxsKr$2I-DkoD?Js$Bl`NhS0Kt-8u z9JKwUldUb$H4m4zLnvtzCN+Z+>acmeM@i&Za2bV`9Oz%GO((TO@byOh$}j(B0w8ZV zYmoPMkxx6OV{weL4tp}^* zbJPQ!q*roNZ&o7EAbH~RLQ~-Du9wdA`V8T!Gq+2VwYD-}i>LcFxbkvszxi5Sd-3Hg zwe=;VK3ltb@11q`{dZ%pmgqMOD5h$vGmn*R&**8Z&Sua&X$eZwx6y$%)2}s03A_v} z#L>=K+;N}{xU}u3)Guigq>^S?byvCa8L;+TqhzHVv^OtWt<;0VA^p~Twt=3YUrIi3 zIM~{%TQ9v>uRs4S0>o~8@aKN9CXS)sLJyiY8-3E>Ay8YdfAin{_caGCF5Gv2&CX-H z=|g)CusCR@_)x7&Xr1ZG(m~sZ^F5tmXk~&*VN9C^vtN?0l$ZDFD0b}j=so##*c($_ zDoS~n8(D-;!fU}4S-{cfC`_|XJP=YFecE$Z_GZ$PWU^!_u9(W820Jv91`7}AkOqN9F$TYGk6HTnPJi1LSg$~`Dx#&Tt@H3jdu9hgDBgK!D!PB zH{XanlFygut0M-04!X3>8*GMyPi-bJGf>ozRDch_M)sBp0IVL7E`7PqKoofr4BBe& ziB5vIN#dL!NN)*T43=Z7ge~5bI-x%C&(3sex^$p?>a@?WjVeF%aP>i!#>N&A9ErPj zCVDRp(!=uF0&ufVWtkE#Z?&!Rbm{yZb=MOg4ld%IfkE^uEQMbV6v+>P=|YRlc#|*t zL46Qs`dyXsyPs*Av8BA!` zDLOjTEs%mIVAa62gEWC))zTJQ(XxU+>CMb>uC1q>bfjX?C%^iqyr#P(4{cJPJk$}J z->Bks{31rS2o&lEM+>$OMJZwwO zlE3A#UDB@QXwb#2VF3(aMh+;GI02-RPDXW6dTVDQBb1UI-V=WOEc4M`m&6Zuc53tb zje7glS8DU>i=+>l4~{PM_m668w_hg?DqVV}ZeDz>CYCPL#BY81>;F~&CNa~-(IK-W z)8WZPy>xS@-n?-uqyFydAzto#ZxEy7uEXIoL-Rd1YG{h(eHEnJnT@f$(cg;^S(@$D z0j+VDK|6*#2n#?X1h_ug)(NZENfG!9_#n+@*EdZM%tt8ymEpbYL7XyIl;E zMu~PvR0A^uBcm#pAQ)))Ow{t+9PPlM0egOqfQ&4|Qvxk;cAIUL%9W1`blSe7W^ZQ$ zlLx^Op2!>qAP;6@+}5wJSATO0#^6AAG-McMf}-qzLYqB&MlH_>;Go%oyQ85U^MTKU zVa%n#9FBqFaqM)y(h}pW@pg1+GB2Z4!QC#_cWAl9L?*kloy$Dv8 zUfMA_1q^Lf6rGKZ0t9SyD+-n=dT6e}k*v+u1)t~*#|5^P9AA5f-&Ua{~%GWxSDEUarXlT-7yp(K{ z_~u$g(wX6t(S2^W94aF1(@;Q{EF0xUgX+;>3+Hx_#@`rjb9|eUwE%$J-sFfPw$m8p z*cB3lue|FFEAO}9#r0e3bx5Zn59Sw_GmAAp-^+W=!WU>cr9z9NkdUWIl>JPa%j-$t zMehzI17D3C?SyBNNO=)=ji4BFkuSOU4Q3#$Ljb+g8>$~_NIPubxGk3RT=?2NJ6*5S znV1tirA-=Z4UU3?L>w3DAM+-(;#8eAfE?59M^4C#7J*l@F=CTOlHPE>9dwNuW;SRv zKH{L!rf~<>>TVe`fWWmpOk1I299@M&`Lcb`AlFzdNp(W2 zI;ztF2J!!&{@?$iHa54#g8bBnAh;Spr_fyw9auWcGqTn#4UuKw>ZD|e3i#zgZQBHH z@-)wRc}v*_rV=MA+KMx_B>)1)Dd{UMDLjQ-YWh7FuiyY2%bULii`ZxGzxe8L{mK9I zuhj$3JX-rh?3ZoENpwd#;b+Mbjxh$DdJSOrn~hf|;JLH=+PdZ$fCKePr{HJ0l#&j} zukRG>tuEI2rA3m+2#oEU*K4qKv-UQ&YNo%9m%S5N+1%Nx`yRZvo_zY5I(O%}*t#=< z?1@=xmqzj@O{1XBSd7*GriIoeAFNML@kE1ES@V5@8Kl46+YL_#^eb<^_}%Icx9X`+{d6r~yem9+*V;+w=u4el+3?-3 ze5qdf!ME!&?OM997TfMKUgDZ(UgQya>Y$^x8mzG`I+xIrHch$m1YL}iB@g5^_APCp zFLSH$tcu}KA6z!C5afBE(4+-vk{~Y%R-WKn(q)zU4O|ByGGk%;{hCTU<5(%X(n~JT z58rrmtN!l)^jr1yH+QN-pT97_6n&CEzQan|E9deh1DN8@uXbBuad6Q7MCvwuM#hwz zk^HzUQ{Uq-I_zMVF1T_YR~$EECM!VNpdz@Y&D3k1+!yZzolsLttPM;bN#J{y=Xbed zy|#^NtdPc;9k7cle}|DjikMI-1}6m-Ft8Pe#?8b zXMM;{olUNr?Q*jT1t^2F)NdPvnWe*=O7{$4@HZa7Jv=z7%XeL>Km4hms8?TptG@Ib zzgCmOLGz7-#aCQXGvz>^zSUq+(!fi;ZnmQ?#32X1a)0^3N9)i2=YOhZ-3?p1iE#e- zjO5uPXX<6r8r9QZjE_OvDNZ9Ga~z-eZ}BahN092}Ji7W^k~h}ViX0pVhF zF6A>2MA`UCw{dCq+GEUzJUi7AQb%Np^PDOLWLGylVt4f|fG?cDC*8V~Q>~wVk}$+A zx|Dn1Y_(DFR=0BJ>s=J(cFTO$)8LQWs)@8&HX;3;nJEtj;6qN%+dvO;0}S)Fqxq@L zhZrSs*Fm}4%MYcgH!U>!@qgR=hq{x{=n=Y&@<#6Y4TeEpy2^i3^npyXtat-QT}061 zuc}!5$U|u`aWYi{Vul_1nVVOy)%Dk3s*Niz0KfHNzC3$-a8QHcQJpMasLgZF)aLmI z>THDo?2BLieb8t%wGP5)R0E?)Nj zsa!61a^&CO$LD0iTnJ{+5Ri_2kaTxn#~6BG;Dhx)YY|=nzQJ8kY#Vp}|}>#BgH->cPOv zpi=;~9fyuE@=Z9qK10C0{>}h;Xqa?}5Dsom(#aXYAMEbe`n9(pa=)etPUd>fRFMHi zJfpKT{)_N)?FJkgow>OM=yjOD)KP*q8iTND$aPMryKU*}vn2yJk+h6xk=^%t zxWq?JX|A0a^m(A{wkKcG`9dR%nKTa#`R1WgMGZr35a#9?E<2ESDrE$VUq_bYZ-fEb zcIM|BtOQx^y48%R%8(I%@yt>=f)0h9d&dM_KlLB}Lj9*d@u8Yua^1R4s$$-Rdn{)H zv)+tESU-uWHfg}7E;|O5AWkkkhyw9R#}1Fi3Mns1ZOTLYm1gM^ApErh7s*I^WRT=% zu!0BXZigv$u5c5+=+JwupxQhbO6RecQCizRzc63jDP$D-W|RcOuPn8ZH?B1t;tmWu zZ*i4&ah&N0-S$@;l^yAnQ6c|8M_O2~hxnetkBq`<)T9xgI5Ii2O`e(84pHMm8+EEk zwKG>18dT|pGl#CVcE{{;4vy%QGaNZjswgxZtXuTdhoni{+ed>CCIZvW(_e9o!6bj2 z0C6WhL4q{0lScNy|4`QdN$4xx>`0A`+P1+MTs z>|`=P#Gx$38RKyIXdc!Ff61kDsm--=>3O09N&qMewGS96k;g{3m9#R8ttZ0DNHOJO z2emWO7#!lb@cYiyVa+Z*QJ?zLf4VkruGil6jXD@?2hJpNz5vuMLog0(JL>Pr+&A8&MEspb|}YSyKE9c(RRhzRT8Dw8x#S<+T&&((iv z6Xye5{ju}*`LpB0y~wQ_iDb)hY;xq>HX%=L1~NO>rDYCY9oPK%N5ONhPU%PU4molj z`i`{MpR23%EqA{EgZ1FEAA~o+frrPtdv(0m2eq@>ym765?>B#?=GRtgW%W|cFL$ud z^uyR6SCB|ID3Hb|7xFN>kb*l%(XToP(`;7oGaoe6X4vM~M}s%>BQJS%O5}~}2!Nbw zu#<#NDbaBbsmmE0HIS1m35vxf-MTEtCGx25aE=T(Ge3!rz5e<;^?&{cU#tG)`ResL zwd;H3C^hc?4EjzEftJxL=}%kYO9-p!U1XcXeqG(RoV#p}W!9y7rpNXexB=S%v$InI z;r$^nDIo5lopwu|gI=^%S~Ky4h%KhB0aTV4W4b54$zou z64K8^noqSIRxM%+ z*9TI5QhVTOFZtzOLx972`3a7k&^5$PHC&P*vMOyY7TwgRqCN+QlY?tBTaP#!0>|!| zU|DNcrpV+VxMv!`79_Pi_JV0`ZZ#*06wtsAdVFMSj`&>tSw5PPnlaI$n~ZJ#FqTf4tbm(SP4Z~pezp#P6lm>c~iH+7Dlu;*9((G_=t|hDY!{GZqwZE zTqVdK#Bm#KoonmV5%495lG+B#6dy|Ud8s&>+;Ni#m0TrO5CzmmatKCnDm3^;oh~(5 z?JmYJZ|?52nFuL!&bf+F^qtF{5!fLQ~mlN zdmLCQ?l_Z0zMEHGt*z~in&>XoLT@2PFviG$4uy1QA)mXlK55gV1K!W}wuFTkPaPiv zQ4O0;in8LUx;k(Q1Kc4?2j5jA2mAfofsqC~OFd|i0b3g}hd28eRe0w}r<`>?`~*R% z4&H3HOGl1V2JdIUUsC$+4+B#>S_NAEC_o4M2B^vcMt4LfPU#T4X^YRzsYZu%gyNvl zpVNT>wlZO${?R}BhwF2n{Aew%fLqggFp3z&Fhse?mkwLz^Vhhmc#&>9tc7!xK%w_! zq)+6r)58#xuB0?=;|6>dW&n~PJkPyqTa5Bc;jE9RoK6W6mA2||&AM=z^t0n(n-z5w z1m3}|z!q;!jLwSrOlg4$(8j@n$c^yyTv^D-DfMeKZqEX7q=Rm)CS5(SelMjNzwl&a z21duYtu3u}^5Vd?>8X2E!r$N}jm>Q82)^LC4p($GO`|S|=ZRN2(lL$e2ez{5kTCMt^5al9_1V6bMLbo2*cVRiRK?HH=gbh< zX4@yM5lvcI|F!FMOZ>IYv(=X)^wJI~qohe|@X&zE3zr;!;a`2RzWJ^1ql*qWAo~X{ zm)^_!J#?^V=$)O-2S7mTM2YCJIz#<(Je?%8Nasqb^l?BT?FGfiE5G7rpwxIEdg4Pq zWG6Djb%Jkxtxvtn=;g>BjvZVN^NxA%J^tHIQVe{oi;w5FHTd}poD<4qoS8y-h5~qb z4w8Bt5RzW4j}YfJVyTXb_YiyV`df$fr~l^vu^xT&;q(O#zzzGmnVmn{+o^-StvVgz z5Mo<>Ue<+G!pzq3pl>IZSrqCQFKuoHUZ6>2-L`7qsJjKLK7%})rRd&wBN^XM*1>t7 za*KEPk9Ysip% z%Bu8s2W6K7wth?^DZ}*p4*oz#+hE^sW#X7Ym=RvlalTT|-)4{G4U|RC$c|hplQtVa zj5Zw+I64>-yBPZcAK^jl12C=6=Tu{hX`FsnR>!1%aKV2n+U9*{IQ{ii4-dZYBf-}J z9}jy%cO%p$Xs6oXxjLYog9g?KeEA@L(((4Y3gM;sA9>H?_3TGJQeXS+FW0NT|GU_k zVI4^u+Lk+SIJ3r8*@yG*;ke6~1=SV*Hvnd<;~zUumIsY=pmdOn50~sUX(s5$QCG>yVLOYgW60OLDgMHGa0t`h(-3vXyDS z!j^A?{y}YQZr0nczgbs*_$|7SYuvXFa09`!+QODVSOT#7YvHlSKls-}s^d zn7{!l5u{}>78Mz*Lpy$&zFu#?b_M6-tlTZnEnb~<8SeYSF_&G~>A8eQ zhyM`A-Jrt}*U|GB8!BrBdP*)psgcQ24K&8;=}dxAOA=#E>bTtrSe39eP703FTf;wes9|Q4f6c(ue3Kgn807E`h!VSYA(i4_eu#N$UlU zv!{;K;%SFB^2G|ZM=HD;Aucfpf`$g^u%vkmO)zOPDx6V1D&osI>2X#mlRQoeZWvb@o?9p2B91a2qLyM3?0vK(2`Y&+8YCW~@`Omo-Pk;=DqS_uq2H=9TJJnF1; zsKjSG*>85Ev#?F8eJjPx6w{&OiVylf8X#9MslukY#|`jvm^%U9oL8_`@RCK8~cTE3U6^ z*2`CK)wTVT+B$^xr_X@ zf9JdP#+QDhu3vw>p84z_r%k;&o>{CrKk^}Ha8}oU_=DPi{f&D58^2L+z4?6X`TXKi zo~N1ax+AU5v;$=a)$KxaaE$&y!we9P1V{-TnHT<`u5y6AcSp=DHFSUwJE|_JulB7) z&=S3!8EucB0a6lxq0CI2AQO~x#>Q%tsRVAoae1aPWB+S`IQ78LL2q&hee@j&eEZv5 z^{c=AcKzC`=+MkWZLVJfmNwE^5Pr14%}WqfQQ z?+--=#4AfDr;&5YD1*NDE4$EXKgV@IH}!F93Yv19oD4blxjOPmI}YoT7XGFmjxM%m zt_^zPUr7h##F@nLjJCR~97}iW@m$@?@ymt21cDNHGl3n*d@pLU-yq6lpM|A^l z%h0CydA0#~WBZVS#waedCrule{))P6*E2u%Y(4elv-O29{AOKw;hXRry#S7~pe(lC zCLLIX2DCA+WWiwA|GRY9=LoqSe1)4;0f5(5DMO$7xu2;|ed?pp`Sdg52O%u)Y>7RB zeARZkk|TvV(gyiR{)h}ZnjnNU>64W#B)41S;o1w~TP}9kyufJ?Ik?s~dEX;Gg+vSm zIrx`4xlZFb%$a&@7oXTy16%N>lE4&YMap0KoO{XUmHOA}vz}JOHVap|pgif^JoJw4VHr@%8_MToeiI+Bhtj{R+lu(pjdKy-Rcg$eAFcG8Qd#37PQswHrQ%z z|5KjZ^4~JTvhK(_vSkg)Wg;2n-8k*vI!qL#Re5l3|I-q{2v%sqgNdNVQ1}s|c>DFA zG_~pW)hF~NySx3`xOtx7wE)SsQi@dfa^q7D*09Pp-wI&P5lOWDvXXE*~OKWxCofjh;Am8c% zz6P@eEaEJd(wZM>N5>78b{Fu)o&E^Q`SxagPt|d)%<`Q-uBEQKr0w(F<9t~2vwOAJ z+popWAm?+_`!zpzM!6&EKOk_VQ<`=;7%&~t?#{%R&vxf(66YqJEA-3~9QhleQv)P- zqm|b*L`IQc8o)2wCI0eGr$QR$p?1#GNs`YkqC4FM(j3`S)-4a+xMyDF%X-~?%-S*n z2pr`U(5c7j4dP4^AN66(M`ho0I~7Mi6{n=DL!=`)kRK<2jy1cp>73BHy6c+nd^sNO z*3tf6zQ>0HoZnr(?d7p2c8d50!^};ic`eVtFdw1|-T`a8y!4pLQKN z9nm5WgHt}TZyVAHp`WG&mWt76Z(X*_`l2(V!*ff?8_{TZ>Ch;TwEfiQikcS2QAfqyT1zmGRuXBm5pew zzH_rW^Q*NxIIJsqaq#PP^R+kX)|+qEZl0ao!cjlXbHcL=OSN$RV$EN=RNXu8uHL14 zt9$Y8n!%=?&M!fJ9DUjuM@ybz2dSRQX_c!5IF+~3%cW&f$C;llLD(z?uHSdy%9R@8 z3Et9}wn*!-0})>eyLQ-FuG85Ib#2{vzn=Wa`|I%!Jy{Pu{aD@o$UU`u-=$i;xQw&9T&w4o>fU=U)_r%Kulw)3P!C_4 zulp}{>ip_VT_70k&>#97(hIL#tyf=oyME@UKZE>W59Ye*XC@3pZfw@|E3efFvVZpz zPa-#yHGk2q>%|>8+8$u%E2}WHH`;ui<8IGBN*hj~r+stw71&7m6eZ6&H|5p8=ep1%w1&d_5O@mOqLE_P~HdW~SZ2hkpKWKlR1#+8jK~&q$8GM^#@QvNFEO`x%j_a__-Ssf} z4F;RuNQ2C*frI>NdZjIE_D4S~@+KtPZzE{Rhd%MKdgy_N>I=X8FL7LdkR3_mUwEIx zel`9NpA1TJp1@$#2HWbM1^SO!f-0`?z43&)DD%jVy}$0e<3jLNMy*|&rsOwXP@A}q zuE%z@^-JQPTi#7u#ot5tffek$CX@JCxA2mIyMb+94&_Jq(t>+}$_z6nLP;8Vypj4x zC4;ZLB;7LB>$pIxnDhV?raYxA`Q?FsR;HWRXTli&wtOvbXoGQWZEs)uN%0Hq#KL+kO+E*B(%+EBIvP%V;X_-N zXnKk&dab?D8LwOZW)D0Uqo!Y;OCP)3(1|kkn<`?{q4t~ne8+t=H%#)60=7l?t>5$+ z=i&BVZQt6c%^UCFo4Z=>vw@zG>O(VM)gub&!kR(coan3t%sDs-$HsX9j z2XUIMSv{PQ%kxO!7)J-?*3h`DF#$_Bppu>B84iue0(fY!XX9Mn=;)hm6pq5A z7^(yoa0fo$3*&|!SHU=jPrlix;nB!1n z21i+-b8LZ+{Es$p9|md!pm*9E9tybennv65l!;>IUQ_lQ;NzLsj^0MVS_1zx3@w<+ zL7MUqh#)`C>e1?qij&7qh-<1-##^dr8k`yIIzT}lN;iWe6q(4`xEyVf?y%sCrfKQ%Bpsb(#`jv+qamWDfrLfw&Y`BJ|G4$|D%mrz>=eO+y zNATcKMm)l!5x&lvjE%5z-I}N|rycTyT$y3=25I>bh?OO?`E)8c2iE9r4pC@$jK2I? z;^;?cC7e*fz(ZJmp+y_T2UqFGZMrMk(dZ?hrfcXg<elP;)DOS+5<%=qEiH8N(rWFRor$wfHAOqM6^G6sOIsapY$N!oKXEdEJA(t3 z=M|(6#p29RK09iPJu(~TMB4(EksooEahy|%AOG8)f9C*>s5F{^4t7p^YWp#IO<(w0 zR+>f@m0jRUD01?(K61zpVc9frjh<1jqu1f3HkKy8^Uk0yKJWnosr&QZyvehJTI@~N zg|*8BXxP#T2fkdshf|8}o9ivq^xQ&q78Yx2VXkI4ce!3oLQCp0Sj%j^OO@QzX|P)d zdxJV2^xJa-E(g=T(0^!4=X=03n89xK=^qXWUYx;c4zTGJWqT; z;5ppgubZ2jwX?(T_Gw+aGOSPkCE0@9@skmrX9E`! zC-HG+r8()yug@!{`8lL7VUo|iJ3~fUY2!vq_H}ML)`e%|cc6)fJBIq4*c9|=?*%hJ zoyOMb|0oOK0B+$g^*!+HCu@Frm2|G5nX8o&I0hf-tPDXRi{&Ickm;XPtfBntc8$xqiOgmi3Bz@yI0ZTa%u5EKL#b?di#$V*29$DoegYx36 zdh==c&Q8|P{U`s6diwqc@If06p#`uT{prhrJ;poNBbe!P#XoqD51BANLk~vq%$vT6 z&)As`4NNnW=i`6eXf0`Q{qagyWHRjq~|Sntir36O!4KaqkP;a=GvA z@!>@ZLbn7`NzL)DZS$TzB$<&33&mAVt_C+W99_3oSYE1FL_~niHAr(elxcaa!Gc^; zOVZ3H@(I{wCVA{%#{J&y_H$qLN#IACskdo=`?v8kP{fCH$u>T$ik$iHg{tT8m{#LM zoW^iH+PRpua^mhiJ(t7%lj?8v>&DyH>&k1d@%;`m-|WxMU_Ucp*=4o2RudQ8faBiU zT)TrltydHO^Kbl)W`;unl)0So&BNHXmP4Z}&V7{jmGyqT_{O!mzJ9B=u5T2o7e@Fz zlB13~13J?RW+R})pCA}Hz%VyOQi%-)tTUTmpvac9jLfrE`QV7??PUqT*~cJIFdb)G zPhHh>D|9=97?j2=8KlGRD3rm1L~bvD9tCVpt7CLDN^Z&SyQ&u-Sh|Cg;l0ru_7?)tEO$KP=0_uhZ*LEWux z=`X2U-7O&rArKN0NG&iy3|yP-)?Rzk;WHpZG`SPS=^oDH0dB^Afi*~h^dq%TW7&%E6quU(g|%EV$wdx z03>%CZEU7}JmJxF`8i}zbYQWg`5uA1bzim0+L?4`55zGuSsBDy8^9+&CoqPFemTEXwdF4!1LJdY!2IJhnQ;^szVu9`1RWi_nS-;#k#Zoj6@Fzi0~Y1n=0R@CY4FP~ zso}Q7m$qZ@N$;t6=~IE^p1R#;<3Jq)*qY=U^xHnJB58cafg(052$ZcCmPJXq6(?6c z>b`&JI!0(0RQTf7p;XUyW`lhN<0EwvrJR%#U;$vqAaZquIA~0L&|fn(L}|DP3*6#h zQciga{J;t3R+?w~hoBOyn@g>bdFNmC-?}H*KA}Y=FFwRqHm(9vy_WKg(gqKelQY=f z+lEOaYbF`EhEA^1mI1aaCxpD)5q@<_&VC4P)@`Ns58oZgAQYM{YI<*M6>L(%2MwV( zkB+7cI`zKQN+vgyKg)?v=m=d7a8gwLLzvFYx}8je=wj~S3f6GZ|5N3311#HzKK2?t_(4dm)q7xy+f0kF=*835(#$_sBbkwq`|h8 z9^aLfJCR$`)lKG$zJq^xrwE?eHf|l#Nej=3x1ecR(GH>T%_fw;B&we@medE<=|f(A zM_&lndNaWy-zcM8o7aIZazq7JrKjfwy1^FxPRW{kFm_}RquNx1Eoh^)?d{0O*{=1)SUpO1LJKKBh_~bNcp3s-}C$CNqH_^rEqsX|EQofTH z$6Mryj}ygD3{`NSO>yFtJv#!=9<1ZRT;juHWJbDjtUY*LUpv95(_*@MPuv+Rr3(Uj zyC%3xvkB@(>Q=7otFa9brsy~F`~6bKZYPT4fZ2Cxj~oCJp)0;yj>ZYAeAT1IKhh~1 zCopz|bttXseB!x^gA*o>F_~y}LPdJ$m-bn;^@Xcwq{wgaw-=<1p!Z!L`fY9Z-aAr< zAx-!3wNK3zREU1eluBQ zJ>=nz2%TQ*wa*sb-rF3~o%XU`8@~%ctMOkxk}(q$c{UXoB1Mpgk@4<1F~X(XzZ?R` zx>7N4`OzNjSZRigcLty3iaI%;dNMb~YP>`lrA*hx|BAY*bj2&1=1~=fUjD;MQxX^I zxdxv+k;8vPMrO$`q^iq&KB)f-SGd|iB{~3WOvwQsq(~A)3r~`5tFn*mznu=2iToCS z!J)$^fD;uA3O^F%uY3`X7OnV};|+|iSk>SS<@B5b+kUAWkOw?WFW%G`X_?BGe*rL` zT(3;<6c1vJ^a1fF@{<2*UBR2|7q!9R54kzvNuRLgv9v`&RgCl@1+BzLP2CS@dCqmTdu4okp-6Kfbr4(KFACM>VL%j)d7!>`*bn zHM%HkJ%)Ut9oQOKzH4P$9=p;6{yIAo_eU>qZcxM?M&Wh?nVk;=BD}5!d7_RVepJz3 zLev`0*QVPF$)|v;e8j;tgL~8;-+xWri$gNTuyET}4PGi+kDQn0#q>0I*?tI zkRl}DX!*=^`ECKU_%56?T{>89BOG?y7gY)al<;^w4i8RG8Hj*k{MP1nXqX}ZR~R{Y z`P~86*-0{Grds_89;3l(8$@7@oYb2yqUYY!y6F|xRca*Tqief}iWY&X}S-r;W<{}rz#!1(HmK1Vs3!)WW5 zO&Rb*UEV`- zTN~w-tG|O_YKF!#`z?sRZ=pqdtd9N%916crP>xuEm6{bg5i`QEZFWT-)-_)M{z=zsU z8+AGjZuee#z74Kt?c)3#9W-bUA3g$?tMDUR=b(9QIEMaiOhJ4jEAU7iZvXR>7lZ9* z+PlB;Wd>?z|1aA5#t7YPf40vSe{9n-CJBtDic_uJC5E&}a_$qzORCN4+Um`sjh1VLY;ZHfAvs?>p4jJ6P^vnOS9o&D|j*idU`(FM~`-6Y#r`pZ#Zd-r;`P6@TcG!O7zyG`K zZ~V>wG&>k}H^*&vd(igw#%=EoI(=`uZH)KO-*B6}MD`~lyCw_HK; zqw`J_6BQiD0N%>2pUFATt_k&sI>$U|Tdp8PesMRBE0K=bZfn$dQ;(WWhtGGyfAzp&>-q1!q@(!4aO4Icd^l|J0W8=zq6nIytRFqaM4_sf88|eVu4}e*3zQejoPG zX8N``Iey8*`cZf~9RQ4a55C&r?!CSCLqG7b_WFbS?O*(Zf6%Tb2W@h3P8sp1q;&XC zmdgu*?TNyPzOq4-pZ@eo+b?#fIFshYw6al-+fv(key9EMKl3Ns7EYf#3SyMYA3<9U z<+T^YJx-g?W)l&f%hJ{pjSlqmVGIQw_X@+c1z$DgYboFn~HiP}HclhiN(rP~IwXWDzj`0!DV3l7x zw~IXU>18{9eA*s7e679l#ZR}>#}7%m#`d1Ivl)Mm^AyYW!)IP@kDhs{wasVU@70$6 z&VTnm-8k#202i?U1)&R1_o0#qIq_DjvvM?FX`gxZ0p8wzn;)LGa}1V&Gb~V(lMZE+ z<$>u^alQw}voeuyf!R5r!`V6GO?P%RGr#<(mK=CZTc(3w!5DvBa&{KQ8B@8FJ=S(M z-%ZgVS#@@J zF=I8t6hq+({I)i?;;3Ab?*b*RVI@w|6X?I0JkTqpiy!t)V0+CPSpmq&ZvKqqm?~m#I|w9+yNjw6;~9LN=e0Y z?sgpDs+2aix1oIiTwg}MXhV#bk9_c5?Hw;}wdZiK_U;VZ_TDCg^j6#1+kn17-WRYv z-2SJ->r244t1s+35X)QPryD4tX=^SZqLLLKLv^nb=u$YeRXT^py}2xefU8W+k)CgU zLiXu*_g&B~Fu$E6Gh+@ybcA||RwYV);d9M>>aGy@-5`<9o`I-fMRD32iKz~#gjhXg z7$@^hJf0~;WXz{@qy$MoNqNwTOo*dp=gh#(mHg>7+-DVn;NE@&mG+r3u)$CHBJ7U7 z>ge37EED7#JOZ}cN#uELx9pXE85;&m*nd@d#smUoD<5fsmd50vu8vQEPn*J|;*lkb zXs&frT**!734GIlsT68xn5Oe#oP6$;Yl`qAFM|iXuxu8i!pu^3#S5N*-S_s+2*=$u=%|OuLm)r!nGD%;+db7VwvgHn|R& z`c5uLKE1qVV;MwEjc6@f! zc6a^8*E;$bJ}j-b&8>}gF*}SC><8@EaWEb{x}V7;*qpN4vX zsxowCEtwbl!D;Pk($+3c+QrG^cJtO(+STz}Z6zx$Q!{w?iY-}GDCGBPrG z^Fe#~>5sSH`08id=P_>2Cf99(QIK!Y#86s7o^IMR@b4KMuoqs~ZbQZg`4^qPVmnkn zbJxZKgW+m{!-Cv;z*Z&&Go~s(wmI^^I1wj_`;229UG{H@bNq0HLj7WhVIz&J@PVuv z?)9D)5B3lH3}cwj{^UI=+erPzv-(Q?S=;oGFrM8;_wiqOt^LiP`FuM?bd@`|^yc#% z+*{U(M-6iONIv<39QcU>x5D8aFy@bH42P%J>T+l(XA}790LV#M+meTVYcCC&30fzM zQi#UwXUWs)AW}T(c#Na#q2cm!BCw=;xCfer@wO&cr9U>2u))nZdAkHH(LaF9O1 z@pWRNj$6GyyzZe+&}Nlx9bC-lJK&Nr2Rhc*hLGz{7~n!fRu;rRJ5hiI>>+(nM=mq- zHVeG-@Qqr9fuG>DzOmW9?jyf5co@?D@J*I^61Kc^n_!G~?!|qIjrjieywrZz5B@;= z_-DV+KL5{uwl(_p1!-8 zKR>Ao0HUj-mV2)Dn}`N~pqJ1;8)EMQCyf7B1Y?mg@I`v$f&Is#>SgIN&8n^6 zg3>@-O7_90u78Oegk_uspfK%A7L=0oC21upyH324+D{TF+tQM6X!S&K&Dbjh;Tk1w z(q|?wX6%6x)DJ=u7kO=6Wv5gy-beLzZ}*6Uld+VldaYGl$(WMddkCEU$yZ)%lRAj4 z+Dg=FyQ6p%K1)}~uYFk@O+&8B9?=y;id0QhV&#rbjO9JrvZ!ZqCnAK>`RabkS` zOTltGpdDnPV+B{NHyzEkP?-Z;XUPvT`oeN%L&>+8K_m{9C-QlO{2C68j+k^oUMn_K3oLP1 zT+Z5){rm0Y!D9xy%?O!F&tvm1fuR#1Pu+s(3{GZtsK}0)ElMamSL76o^}!g$yc!2g zM^1-rZ+9UUO4o~bY#Oa`>g@d*YZI4e~uUU@RtU_?m%+E4v(``7-!Z^H<| z$yCwXwzG41IfVvHIt;Xa=Ds>HR~s#Na)j=p67G~^-i-p+%wD3r-7c68Kp{I_DL6U< z@maCq*&)Xn|Joa@60FYYdt5qr2|TNaN>N%bAdOa7J6N4c0JTaN%_y(82Nkh&1imY; zl}|+?mlL@6Cxff^@KKziiMeK_1-z5iDLL!R?3~I^IWWDWFAM|E+gP78nl@Xsix|QEDuEo`U zAOu2a_sUBNj}uZ%gES)cmKW?I0z zGPc2yf_}Hr_Lp{Xay4YJxXJrXU;o`d+;*OSp$)F)ZSR>o89&Ys4%$H6(03PZsveTbI4iz6ov%?E!6;$glPa zwuP1A1V+b0n@*U#AOSgZ5*X(czQie_KlfXJt;dE`9`X(xW1izrCTawUOvc%DOj2&h zp3y))LvQ*g_J z`7*S~WMECtChc7xdVl-f-~B!9pZ)V+Y+v}5k5lvzTy1wz)QGQDEH#iTaal!#w~>c1 zO}>f?^ixN;rsD+O)|(6IS>@v|;}5XE@!LMw{>cCQ$0&mirz}uHyS%VpD+AguMDeGr ziFd(t9HtPDJWxXneQ~kva&I{>AzyEkpkb>|gP6|=;>}N-As@Tw-xSo%}Xq?TNjKjonKXT1ECZt*Ob`47*p;#`3v z5sHkt!_SoNf^9dHlEDB2RNFNH`*y`@8=bCW^*yzBTaEc0_;w2@>{ zF5PX(cgIViNT2YC==8e9OP;dYO+hEWq`|)CM2#mu%TsZS4Nv^#H8!|c;?xyRg!)O4 z$0rBv`2M4I{Kze}jAOubygi?swPSaCtd839-Z!@CbKle++Gl- zz-WndK=6y?dW||@Wi(c!<{L9S+k#@?iG`w~(4X5-82Eb+%nKU{8dBpM+gJ5m%siD?=<9@t49US=Xxt8#? z!5FL*Wavr5Qx@Ls-nkP6yWmf*4at}N^^|o6PXTw^rSFQ=i?25flH3DxojU*8zxmPj z>@y=^ueNoaP6oKq#+^3W+J+XlJUP(OPT=8;rjDP6R}5)jWTgmMFpmR(D?Tzg0#95{ z2O^(soGbq#{3xy4vfu&brA#7c<|(5mMa>o^$G{OS?tO*otQxLdZ|hP4(J}0D{HB9- za20{f3<*1(N}TO%w5NFzPg^LX!IL=Ctkbp^4DeOv8N7%Ncv&E72FiF}^`=PmFElyTHidl z?M4~`PrSjwej7gVFV$0r#!#B}Ht-BzbOxiGDXs%ieY@n;ZGRdzZV~EdtfV37)}M+E zT)mZc9IG@n5#fF0O#D@fTqsk;sLKI4auNoKQNbZt#`byYJe#1R*4dCg@_P^c8O)SH z+Eo0b%z;_Y%0(&o$O?E{M!fv+x&7hF8EpEn+*Oy{8p)zfwc_Z&GaQ)1_U8TL_VB@Z+dnvN=ND=&oTFhm zWv*tA20&QXnCoPi`gQbjoHWnUCyv$6thea5uWQh#?^BGpqDkHCw#b!s5diAi)$m8! zU48P?6EQ|euC5MDp5vrbkM+x=!^3%7+k9tx{sSK-4Lnj{sqNm|YfI?WA%!<~_tFiT zA7X`O;a@wZI1xzpXP?k>%)Qw)E?2U||r;8~_BClC~!N3#9Q=!l*& zdR_hd@&@Cc>#~y+@YgX;8IqQ(=|!7gx)pxjmQLsGbb5?|%RmhuW;o)mK3vVtY5Pe# zJ366l_u3!*(eG-%>-*jheY7bwYH(i8rfuPe_?4j*+D??xPe4d~krAB|?~y+4kuPLg zxYOBHo19bM>8zdb=VwYLr>8h+vvz=^c6zpmk+FU=Xcy8pqS6oaAAhACt!}o12XD5c!^2E8Ued3WXjhzQHS8FBjQR(B zu_tt#oOF<%>I|ed_{Si1g-9pQypdOMr%n?1yXu@9+ugoko4dV{bZHg_`LY#wtq!)Z ze!s&R`9;<}h%37}XtW&g)$vW}nFvB=fX<(Ks&>q%%T{r0<);i=ULVs29>PIe%S&{X zc9Qw*J8@#kuhFS}=gDiT=IBBoJLF{yCCwd9D>%xIE6QK(4AN#1RynHg{_uCTjh*Mo zZy$s&%D00Dc-ov!P^m}Mt8@N7`jHQ|Z~5T2wx9b4Ki9tU`Crb;cXX=q$TjZ|(oTj< zpiy`F8)Y5;>fK|-*M3M*WtuvN=scs0%=>O2;e=7PxB_F2?*HZ=`rh`(f6vFDfi|>r zf}8vZ;i@Kn`qe4>jbsEqIKiwK@Ns&r8u-%YcpY*H(WStRq2I;T7()fXQ}!*F?TrNW zhj`ka$4&mStygHPv zCH@2T%TI|`KB~_>#lUifIi+m}uEMU?DcVRtr`u0~i9Ys3T)GMR8T(v6Mmqo}OMUKl zJ}rN}P)B%=?jXU*CC7h2!FGLw1^VWo9X{D_^HctS={PvY4)D`gIUSyUdU^Ll?d0A! zw9~zN=z$S1pyA2!1hxPvjgh-Fs?4@sV<<}{xh5#HPk-&T_RoItvu*#)NA2OGBN%CZ z5F^Va=?*TQU}!Jb2vbSrWIfAg(-J&M^qwz5*Qk);bQ@;$ntE!@vWs-yU-y$om|0D!0Ap5M;X%aBWa=$t)bS z`w>rZ_0&bXvW{E$0v^hU+dmv^Y*J6w$x-k$#`)r`z46+sZF+Fj#^bHvsM8qnry=HN zF1cTHgOV*y3XWk`j;OC*Xe}qu?H3wMmi1Tq#VaQ?Av78;qtQkNDtRp}@=>RGZM}>@ zXGff|bif$XmVfb2eM5WZF0?rtM_scsoW?6x+dL)G)3SEj2)x%f$8Eg1)rOmQXcq=A z>hk607@!yB6lXA@4hICulx!Z^b&8&x&1Bhc$N+ys*|b+#YqFxx>Ov6 zV>v}CP@;(|+VW6AoP@=-_NY7S+2LDAB)=rM#Wu!A{!H+ewnt`sl&{Kp5)6?SQUKK} z_X1mrNTrx^R-ZdyIm4XIO}34Og9^xe)~%8e5#hs+$esYbSb}@5zI2^gQF{Ve-Lm3w zzqR@$U*Jg!sg%r5-9e=A6d&6?1CiOpJ#8!w)T5S4it;M11n@MMwB<&b0@uhK8AO|y z4tKMeW-;4dn8*=rbvgG$Q0pd5LqvITP(_Zd!S;@F&P(Rra}~1r!`H$&%39piarQ~- zlSATT9%?5YIBInIpEB!=s}5e|MjW}SuWWz&u+EMZW%d=Gs`E7THOAzXZIu*z`9%4{+f+tfYo(pjrsn*hBt^`Q)USrzO%Q3Gd79?neCy}d3A#x zB)2+R15g~DaEl|STtZL(o{*>9dVq@jai_u*XKji0#dFI0ypz*&oSa2Fr9CbfXjj3x zaleRzHOaPB7jZA(@#RFPT<2T^nRH;g%5bTZz@Pft6%Ge}`QW(vzW08hz5ER?x9|So zowmC%YtO&*Lfd`jg|@N%Y+Lqo7Mb7^_CcFZ4@!=qA^nUtc3g-3X@e_I283UiIDUTT z3^71%!Abp*ogEHkGjL~o&^XED;vBfw?f7`!&TtSPKRj&*IBEN*$k-f*3%(4;D{XVj z?d$7pow0a0sspQhx6xCPeIH`oaY=!Kx5}XtrEVveuj*sRZ;cuxC33igEVvWINnH{d z>pZ+hSjwbEE&3HICGKK=)UKSMc;mSJM?d`=?MqM2!JT%o&p`X7lgV0Hc1G&Y0TbXN zI?AZdmt)*AIx`ci8du2q^$p_yZJ=$CiqWTt1?^8B9kA#>oni7Jr*XbIy&ZieY}(g; zVt+xz)Bk<1lR+Ymr20htQ2mWO;!HzGuQC{Yg{%ZVS9O>=&dDxMpj4HVUh(^LW#>q{ z_Jlf4hii3Z0R0%4$f>;5(JC8ABN7^NEjV!&erFso^ZD0@JlEZAyqY%S zG7NBxuq_;WlFn6r+VZ{J^;_h!i-2o(MkI zNaBQ(y1Rdt3E$yg#-mh9P*#(tLY$TGjsQ#<7sr{Ol#$L#Ej)UBxN4PEP;VAK(v`I2 zsgeOtn;2h6cd&%q)n(5xO}+`kOvw(u@;J5)AuU56Au0F5bo{eS##-(zp4CQv3fBS| zn=!D31x)XV>&MZwEj-gnI-5`1so%zR0*f|ua#UGaRWYLH{XVCdJ07X0g)P6c#o4;z z8{oS*IdOi{&d*OXMyPk4)S2VwOdJc)?aN!cZF=`x+wsOb+u7b-bO5?c2kc}rFRCRv zp&mnm4Z~xuJkKfcOJDwK`?-JqnfAul-e{*MerWO{Gl(iAiSr#TmDnXnY;9}==^VhJ z(qItOaPYk<_bhuVo@Iou1LivvOAdy4OPdNw%llzE9ds&JMJ|D_vbNJsf$Ik`$D5mR zifrtSk*ELZIH2?y5YqY50jfg{P*NH^SpfikoIc>KtSKTI4=642q^s#r$|M@pgC^XT z=rPJNMWajwER%g9@#ypzhxC4%9US5uZDw%MX-X${fRsM)a<`EnsE|6UEV=u2TYp zKw&&wARLaPD&Bk_1$y#9R3h#0YYbqk!^-Ct6JPRH{pj>5ysk^#u zhXXK^KrCE_pU$QQ0h76?_`UNVZLj8+ztSPTw6QWJT%9t@g_<5N?JqvJBawkT83s~^ z_rjzj^H<}zDvcX{%YdyihFW#0PMs*K2sL?-@2CUXOZu{s8XoaTvNdS{q*&k*L%Gnw zpZ!ocZi}(~vpt6T^76O&0#^jRc9jQr@49*tS3%f@Ql_L>H%dk4(sI7zCJ~mc)lvzq zYu~12w3Oo|epPSL9;1byI0;_C-f*0^7dLlM^4=p2?2} zo$Z?bXtz6WJpafIURgR``Nn@wQ*q^0fGz;d=MEALj$UuIQp8~Tj;iX0d?=wI~f z>B)J!|KOy3_4U(s|IG*OjYp?AS&JNh9q?CYJ2eDs6F@o?`|LYfseJz zqm#CIXSY3h@K(DZukq||4h?YIKf4PUh%aX7TE--|lTUF{ZX8(8PT{3_&nb`b zi4OISKG6UiQ9Xl_B@01&Ye5$-S2-_d-2`RVH9Y*UZB&*ZDaRE#?LK0NXCGT zJDI(mpFM2zgIC+x(F59t_P{`oVMDuQa+0fKYqqM{%CvC~!%`+~9E=LvUgt1d5Rp&& zut(NA{yLFKBr?VyG|W9-8Ha3oe$kGx1I|v)kh@tsKEn|@Ja3aJedvPmcHns8gyC8n z(QY1z@AsyLP6{y2`^g$#L)d^nWB&a9p?EtPRg;(-8KeBbb7bGX62nU#u0_6_P`a4n zBqP87_~Tz{|K%s%Xa^VA8aRr1x7z&52gMy1rG2qDOI<*QZu%W%^_0~e)#u0tZ!~OU zI$GE(<3Q;w`-i#($y^)2KI8!0l>M5JbTX9=<8BhiI-uCQ4bipWAVj?l>vqh)J!KD> zQqHpl6dZKI?Cw`M*V3-+sCWEsrFzG4%d+b_9`gxlu2zv3m|LTrtggAzdOkbNs~i&N zyKnuwablvKWq-MHY<40*xj_~!;9x>o6v3Gzch2L6;Aaz7;>#K z!F$>@c9YlA_dYw}=(v}0iND|*8farsme$-0!wB2osN7mR58cHAg^#d{2mNyW6+&Z%PPbP0HYkn??=O(s%MxWlv>e_@fVJpdcg&D2V zFOrqIsRJO6v({%?aE156mJa(&@le~&HnEseTw{D61Se!5CS5|`&VT!}Z5kQnCwYnM z>jblu7H%9zV4H8z=`UYfIzm4j9v-)glauTssD+Vbbo2!_^OWNBBNe*i5Pi@-afx13 zR|?I^$hGT>B zn<%>+B7#zM5E5Sv3hB~Fo6RQejkn%t7ssbKEt`lh0~<7~z=Huia%*OcwctYMrm^zU zF?DJ@F5|3G4Jib0&k?~Y5@nAcg&GqFrJ!+yF@aJYg3~15EJ2}=s=+8uqm6NW=#}#F zWQ}(D%Rl*T?YU=l$eul;Q+&tXre(Gh9D@h^jS@%>6o4AZq#(v$$a1iv96#9`u45gT&_(@qPev|LJ}G2wvydNL z96-Vg?`b!;j>yO*+F$xJ(2+-)<2;5!!N4=|iK7){2xWLnP5rmxJVdeBcM@``v73^gDX+SEn6>M%LDWqJR$kxHVK4{OLV@nMuW%11D=4N-tlh#C=B`BMs99u!P? zK%5*8uX?(Oi8CvYjOJekRB){ckdmYNt$MqRC~Pkp7}OmZCQgSknX8`APyGf5;TRYG zQLhG}hGAq7S&uFyEjVb{lE=Dq{Co#OPS&6&OfKpps!ATqQdb;!8;MdU&rF;WZw3loZ*=5x7Y8VWIN-*;RK`1?GhMZ=w?rO9U?~?V~k_U zMmL~8Wofo3;&25&>Y~QzPut0QjdpvNT|xs%S|gj{OxtC<7K!Sd(~D=?|MD;WHFWA4 zV*~u4|6EatBH*dA>RgT4%Y?-#G2znpX%jPAA3-izqwF^=6H{eA=uo|^a= z-azN<5TqGH-F7Dawh=#yoJKB0LkoC{uQFtx;ja3hBBeBPg|4)!{lq@1%)^VT8+WQK zGJ#-5<++?T+KaZi!JL@-@%G6j{Kqyp+s8S(Y)41a_V~$hJ3XGa)AL31wTN@+L{RNZ zBW!`4;h^1N?0n|gy|%MEYWH@B$RhmN7-g4BZRWl9OgcfQ2l>aN`nT8L)+gI_0+cxFThF<_;ltDoEb8Pvj`)FFHP!{el8 z9$#xv&xwz6znC1f@AJKqme6UkD8S>Kkd3hw2aYWSmxY8_^otrC&?0%BLD%E0|uZgO}KN%6W~YfkR=jW4;d_Bd4J>z%I}i&7wEl>ysTd%`v* z8wuc&8`F(1nhGXll0OcZJO~hDsUJE3AGYYZL_*Bd`Myx|ivp`F}^!l%Q_G9kb6-`YVwgK*f$ zzw0>fRi#PR0d|31<*cXhAhqL@EoNrxA{qeM+D?4N#iuAGJmnLa`K>Wjd8Kd67(0&6 z+Wx^|+uuKG2lrn^MqM!{pQn}T%nQ=C7LOHspCjIKR>Iolw5`*B)Lq)>beG#dU+1~> z!^^Wp7H6Co$V%GwJKFT#x3tsUm)hxg%UR3hLO0`SkQRH;` zsC^X!KUC}t;Z-vgYg6(}29<(TDcD@v&)7c?N$g@EwqdKB6A()^n z)xB|wkI(%dAxYgcu%yg9)}kuAFd3+!&mVCV zf768_-h~@<>9}-dq6ad#_(%OjTPA@^@`mSc4^E<#Q6QX@CyRa0U|VYdX4MOPvN9w_ z7~1)c4x#W?W@<3BOn5?mLd*qig%a0Qo@=zWK+PEm;q?@^B^oZbD`psio0LnPh z>)new{R?*?ebD!JtWSq5v#@}Otfh?D8mD|{G!aL8*hWSder24cGA~pZ9)#!OAsqj_ zm(P_|9w;Z-nx*VoS@HpsK|d>Y>P>Je$5Q+{JhhJn0wncmwi6ivj?q~d%hTCqJ4Ig| z9ACCq-#ln;sRxgDSe)ja zTMwadV$ZD{hYXxfcD0*%ySI(3c)ApQ-`x4 z&2o0L69;$)U&A}M$m38zhbuphWww&N${i4E19-Bw)3$I7wiuG`ZLYM9-L1C!%x1f{ zx6_{6-D#t(jkdWt;LjDDF=K$U_^wF7Bl|5dZQBb5d+UnP4#lfWI8`1#;oyuxw!DVC z%0m#y_aWEEZB2t3N6gilwb30AgHKaWXN-l);Jlrjp10ZAyq!&NhzADoI$UeW+Y0<+#Do8?j1U=hK|5>>Xb1U9n<58? zz=FpepRQ4Te8P zME4n2bjLZ0UQ>SHEi#@-IM|zF^4h+O{&G93ywy7M@DL|O?awzjvP(E#9;8#oV)2)1 z(hl-6wiE4;4>>cgJGp7IIN9a_91INfr&0Au>gXqlT;X-nWtFt?$St_*`G%?=XQm?L zVI?cBy}k$yRt#)$)t)fuXls)>{$9gsB|z?|uR#zwk=kC+}(%5Uor7kVJmmV1-um8F`?vm`KihV9cEexeLZ|gvI&~`N#@k=GCttP_ zl3sQ%GR$+@hxDxA@T|QU-K#7j8(ymI)OE_DlR1(KB+_#FBD^j8L%V_p?tu(!>F3!L z@~5uCAb3`gIbm0&3zw^m@YzJ85|@nKl@MAfXdRwhn|#)b`n~DET4kCZ@-7&}sE#G6-E}kBrwFmnL?bX*Gv?p(VvE49!DD{yq$15kY zk$cQ_Y;*g&fR^zYiibhhHs_{x+qnBg-G|&@;`Z-OdiY;-<=%VR`QH26@y2s)y19#t z0|45W&Sn?FN|1@Yz`+@iSI7W{z$tu(XJ_r7{^}RnCqMhO_SWn7+v(9s4w|qc2S;wA z1ZFrretBQyY?R@ELDrLbKoA~~?Itr7E-mNfdg>OwvubhTY!q6=d$$0Z*V!JIQ!hOt z*Ek$J8`^#IaWXJc-4>Tl4lK7q`N3faQ4J!U7+cX!Q(}2cguz!jCKHX+e)^QQMY@_)48B43W>C> z?XA$K!|9N@y0qT@`k()n_Rg1xC!e!M3uggNPUC=O%TNaC!Z(VXc1lO+6twbiqws;N z^gD3a4%sgc-{J^(hr>J^Z?@s~UK{Ohx6SQsj5LHfvyTYq1!cDF%dDh|8V-{UZ@L={?X;_sSk{p%VaAwv+!} zSu3!I>_%ecvzpgENjL*6c03f(!n&U;G6Ozt~y>(ipZ-2O*yLKV;1S04aRT|#_# z8u_MDemw;(P8-4g<8N*6qmSF(l<(0t1Z(vO=~{7ys{9iR^Lg(U15?CV9tVgy!%wbgWCv++7N1&uaIyvb#K|AyOrxv@SLB{_ zxA*CUd-_sPhc`J=9$E4weQBr(f!Zciv)T?uWw0naWn6$4M&=Uz))(#_AWB{tOi8!@ z`cAFA=N#ke;o+q1KVXo0c--E6{J0&TU9^)K^j)sD&A|=&kn7HjVu zPD%8h(Dl#sKLgRG*te-9#z^I?|1pF~t66FLH)WMR<;<&m;HUCPN2np)K4f1-j%kl< z4~`y%Uh9Nb8!p)?=k69A6}LLh=11-96q&`yKXjp?QSK_$yDvFSY^j z+)^xWqf3wR%UUfHD2JT95LiyEk7bBBX40HHA7d z#&8o_j7Wtg<8seBG9HGn#F_x286SzG_jN^-brQS$Y1a-;+Ko(^Fy`L$^e+o?wU78O zH2h0J-niT3f~ylh=f|h*)rSY|(Hn2I#}B^RmZu&wx($ zL;^5^BC}M8B)FZ;qu&qC&)P41`ZwAqe)UW3;iLU_uzwVRj-d=tBd23RESWYKxxHia(YHlHrfqBotP6p%Mx+pGgx0CtMfrB%{px1FC2SjSr z*>Tq~1TLt1hT>7N*aqV9HCNmqOq?7D(^0@n6?CCd#nlx&-&eDf z4lyuB?iWXK!V%)!@>QJ=yQ7^=PHBL7J3iQN7w7J?##y883s{?#pxHSNqx-e#jNrY7 zBNLHRS->;@q*>*y0@b;^K!N4U{v^9nIAlgX zMg4l=OKpR;_$z<@qwV?UU1_||%gs7qlau2(ka4n+7hJz91Fj{u*weg+ZHrm|8XhT)grU(M`F(BY<_6L2$ za8aIsLB)|NJ7r-4WS@EReIrA4%rb-xwU3u{VAv@m{FHI_-+o`6yA)n^F-kpI%n!|6!!JW%h!Z@dKlEc1AhRhZZK1D%%Ab~&OjVNc%rPN zPjoQI5V$hOt9>d4cA`=_l_1;nW$6wb!k~ZGY8dhdY*!boPe;oBNvY1EP zC^AE2s3XA>#ikg#$0w6^xIb$TAD*>`PbTfb;c+`TM~{#;LXV?n+Hkuji#ErDtf0Aq zk!>5)t9*NEp$B4o^|gcc#aH*+y{%!}+up`dT+J%aTMrJ~qvJ_AZ_u~3xzWDiU7O+2 zAv*TWx8~7B?|2pi68?E$MSWt#@rH5g3Z3q%7`$)=d5{mqx3-NA-M+ii_VzZ~GdNTC z&_$jc`OLlbcJJ<;wzajDEs^UR_4y804bqR&7gpoQg+cICO{=c64@L&k=IRvUG-#D+ za8MWLT@(Mh{#4GB1t~(=l0VvhbxeMorX-=$X`ga(kP-DFKP!wYYv@vSpYpl9wgsI! zlShnwC)}$)!PB~^hY0@EW#XeeP!Dz9>b}UFLBU4Gyj3Ll7rcx}U*VE}R@ax&__17P z0D0##^;jk}iG%H)G_KyrN3QZIvfs&l3?$lEI-TTFuh>^y1=rc}gUxbI!xrk02YZph z`~b8M5TmRErY&q2CmHMm^bKV%&3T2B;uh7@tM=s4Nqg3~7IHAl`5C#rXrDIgV*obm7=&ypg(R zIP#h72A51mDc|5=f7h9jx6b7EG+S>S)^Z9SqKiDQj@srsKhS>s-~PAT_Gp8A*KL)t zY63pzvswG(&;4TCfA!b1(x&a94g)%6p;=DQ#+h)FAI2zDlvmT(*W^!ZN%d=f?^;JRW|wxNMW-llJHU2aNH?Er{n&_S@0PNo)ys^DSVE?^HT&yV~rkvD?H& zJF8>l8S&@01JerFA%06R@_}sled2mGY1XdkJ8kzpZMON2cC`1-HW}{Zvogz!$8o@v zK@nEiWs(s=o_i6PV|?gT9h^_vC%^F3_RBb6zTEu;2aL=SwloNEG`>7JX)W6ebyr&3 zz*xV+nL3+I7%Wgsa6{&8Y;7{ojoY+~4|Tv$b+~$kd4;k8f&-3&nEh=|<1&D|?0o5d ze>!(Q7Aa5ovjOvwP|}^9L>~t~uR1xIF@e~`;Z%C^NoM(AxF1+n(0xBmBRnsu(yAJ) zgJoY1Za9U|hVt^8VDW^(`}Fj*&EU=P;bR<-WC2aPB_oE*oa>$zJsQRM4>7acv)i19yyKe(Q8U zBFXD2T?Pk@RB;1u4ZsQX*Px;FR9OdEk3ZJ2Ec#p}+iP2Q?qT@sw88dPR?YGr6XEK* zwsiVElgt8Rfau8DCc;(eWi%y3MJTVf6VKL~tDTa8#5QtkgB`@I*-}H^4)5(xhOD4yOjwzGfkbH}BY_5(f(~g7=}*tn@SCE6Ww63q!)eO5DIzNVO%AXWOu_1foNXsp^n2 za;#q(`(Qg{g$usq{WiP8vWs$bySgK_jtsTO*%dM9~x zxRE`;>mVzr%6^<>8s15sO!Op=GGMzqbV`arjo(yzc-DP4soMW(`Qx}6h zDW(axzPnR@wF0kRF(3o-HM9}a_kCb3Nni zUg?9-la+by({H^`olo_EdN_Iv9HNu0&pHH_bosC0h72q3;%FN9~I~R<} znhiDaVL#&@e6a{%j3Re3Z6yvK=poyl_IQX9_W0qXef5p~_O-7*Xm7sqq`mU^ z1ex~4G`9dlK)k;bkvS7a0$OhC;E@9?=nIZf>PEBJ|NGTwcZKMPh@<0?J6OaiZHmrU zoRSZ^vs&h=r8Db4;TN#z1IAD4-wnwKIyn5%^_P26Pw^p`m|rRnGE`lJeHIW5xi+l(czQZ|Lga85D7eCMRueo@klSs?F&& z5R?UB0^dFtIOYyBQlK260IYg)t7B&QicY=S9ML;Ht%+1V#iFyJh_fDHD^KAs@u{w> z+cCoDBET3CNCcVGXH{QKA{9Rax978XBj@tRjK*bEGcXFD9-z5$QY-WqUGT>0ghQU1 zyzI(Q@(+}NNc-<&E|$pZRio?XAy?e6Tfv!mHUxN^p4lu6Bpr3luj9fC?o`66$uf9@QMhreatF1&yVX8G{}?@#yDs6!+od{kAys5RR?j zrbp~IJEYke4UMq{%FoWViQ{42uC(cFI_s_DngDDCrIZl=RFu$=6+1d=oH2N$LK+M( zh-`RiU|F)?r{C`Z!SWf=dg zqXdIA@;Q5=K>OmagLVc)`HRw4*-uYSX(LaNQL%dHNjF&WybKc^SYk9&&Vf7~660Jx z499nA<8d49?X=PME_6Z*?e6TJ_&TfTp#nKZI4fos1sXi_&RC29JEa}kXCK`P>TGrm zA~ANHX|`?|&9CY50fKqf00{B?sXXoeJ|lxfB^yClKG|0++^;zF<-|c{oqPEyoPbdc zR9xjnSujxbPLTXCEs%)Abt-VgWmeS(WJw7S*VM$V?=Gr{V)R6CH2Ao7W%(yc;0Ya( zAESvQJzFGb&oYVxFCY7|Txg%(0n{MOmR<)&`4rFs_P6NI4}+wNH++V!THytL^2&J% zkR5RX7xO7wMo1e!mIGQpcnUoZkL83Png|jSJ`)T6;b$0~)}=?=Uw{Q1SyT1eUe#|X zRIobQl}lG;qqJ=^ofM6q#52IsPt%q;`)z*d zQU-KdHC7!klA9mo>D zGSWan<;y0rIB7Aa?NjPTw{FUJ83(VFsdBXFH`KMvfaPvrb_DMNWtpv!LpC@HfUE#z)R&v63^O?mm_O}{GZt>u` z3_tpj1G@AQtMjnD#=ZKSe(k$sM^Db$o7g;G`HeT*uYYa7z5eELdwu_?y}5suce|Vv zy>JCG6$+V_m1ge6FYkhZyF7O+T6ViBOppbpr(*CeIpM*JJdqB5@?AmGd5#Q#xAIrt z1XCg`K>ucp@U?}EDQn}-fk2-8!AMM75}XiIKFnKVG=)eeFXZ{+4#|@T7hA6Q5{Trw`l3loUyhO!`x>1L%;tA+xP$A z55_L)>-CyopXavkqa;?IBywL-6-OPnqSzVqw?Wwy;V$IeFbGp$*iKmqgAn(r0WG_sz?%>o1o}NZC9cvL zzP?SQ*$^yAO8+7{PNg}ycl@h%4JEZ|=$9xFnuBL!LM;enK_3!L~JDw3vOEgxIB46nNk)??|)k1-zUg>*v!& zKF8#EbvB)~6Ljtr8NPP=GwCOOkJ0lQ++BtrlT~l%kuUb0HRTQ5Tq?T39?dulDi`Fp zFKO$mTRa5F#gh5vyV}|CrM5I4weuUs%Jq$Q>wwvaJw+1K|H(iHdiPjAJUnin`O0hU zQ@{S@_UbDS+UfCGJ3l?667tZIwfx<#=RoWVNn;?L(K%eg8*Yrs(58-!!A7>tX!491 zR2(!eAVg*F5w*?`%@-HV4=8(3hT9ER7?^ztIx8d20=tSrhx8pWgEOf)iXMDz57R;>1>XCb}OVt+h9D%O5hdrdN78HGYyTh z>zz!UH&^K{TzymV5K3qf1Q_a%bo*|DCrWBK+NK$>pmS@m-v08R`*6E=2Yyjc9W;WI zddk4fRbi?v6LuPuAHC3SmKh>Rwtn(CF6d;J0$ib8mt&O4aO?Bm+@pWzzy&}5vR#Zp zr}!(TDqA5?hR*9?=b-3O(rGo?TB9Y~Jb;~d$u@T|yq;+ryPItlnOft|0ZBzBf6Bmg zro#3V5B}s^P;#(W4#bfJ6$X;0LW8NvYR9xtDSi>SN(kZ?fK*$f6 zx>pVy&`1St;m$o*;m07eM<8S7m7d#`L*T}UQ%0#vqg17m7q!L7!*HBP!Qk~>tiTR$ ztN#dBL?T1ZY^h+oP|k75lRV1cX96IUi(uKo>m58NMAByD6uSAnf=CK!%tS_s>G^J7 zuFzK?+koPLWWC@JC@BOa2I^Wh0uHnr=>a)zk6Ja(fmEJ*wGeeiR=7F~FFlbN+Q^!7 zrA?FHyeW%prU>`s$%$CHhYZ4Kt&A+FG*!*!kaW2nb+)Ru`B)58sL0e2@^)>qtS z>?8&b7CP$f+jQ%lSvP2{;(#&Wolo15U$D3tHjgOZSs%64F*Rf z@~%lJQ?8Xg+gARTQB-A+Ivpjh=~uuuz8n=n8OO7Iwrf|Ai!AU^ZNX0_CDb!qt3S|x z>7yi(mvI0(^RA@%sUsiIjnTeVZDe~7!p{Ra-p!mYfMf7w&0@`$9spOR&1 zw0|KF;un2nyOtpl*)`1&*vhwbS=N3dO!y&x;B_zm!b}1Cz3`zSU^LW(-`5p6_F{W> zIEZW~p9$(M=;_5;G?Z!C8d&lc_!hCP7C43(PwZO=Yd-_;v-+hgNIY^Ax_RtEl59V+ z)~XHnj8)nr`Gy{C>^Cy67Snb)J!!|sC+!QLd)WTH|KRVow+`K5f&5c^o#=AaPx;>Vmb9u!)U1rJ4;XR_LHr3~2G zR%qJ=Q23Gn{m}#12~P5x7JfshawHvBj6Xm2C;mwL_K$p|&9DtZH)+bI`ZwFsxC$rb zfa17ZD^*X&n_C$qqvNp3 z3UPH}BXuR%$Afu2p*Krr^2DFCAlsJrF)^g@PuVm?R_Gf&NXPOxSR{wND!DH74r$)4 zv%hm6K1u-D!XF}I4+7EX(yv5PCZ~S#vw!TGTxnZwad!Skj$H(Ojuw` zpEGt{(5I&}WcJz<)2D607yS;Zh<^Dwx_H*72SCYzO&mycK28hZcp|6~s8Ktqv&3 zhk=(zIIZLM+}C|w+k4@8l=r9&85C9OVrh8?nVh%X4|N??m24;5MXM=nJ0YcvR1=Fn=|xW^R5Zk3Q}jA z%bRr^N*%93`nj}+V0aP5YkLuA8{ZPfeJ{fqfa(7k41igX<*9jkBiAAtb6zFfz=NGr zL~2qQ z0fxzQ^8{8$vxq`LV5R4gN7*W;k2EJM$Ok0KlArps?ZM>f~;co{WQPS=aY@y z$w$iO>VGp;|0)E1RIa(PjCqqT9PZP%jN?}wkT$RsJdsZ8H!oM8qr+@ZX!I1$Y`roc zc;{V7c$W9SK+cbWX27@4dY`^#MP9_uYN$+^O{K)y&w(l2@FB9t)v~=DnjidnUPx#9 zocsg77&hnxE4bA^sW%nYedGeUGrzji`&?~D;8UON)8(%Ei!tP}Z%K=WlyS(Da!@g4 zpxOQ=$t(U`MNuayf9e`}Cl8`)tAgNHRVc6U6TWLWhCcLbCJlt)SPG7_s|nIHY_qfD z^ci2lm`HhUGE;A#Q7+*FdEC~TpxzFTY@5~gfscM?`<@^AqwV#t zzS`dS^5@#c+|xI^)0z1T<>b|t0BGAV@Nwx9U3KitR%ckc6Q(AkPq$IG3u>DODUo+SqJ}G0x zyCTANwCdOb+*KNo08}hCwL-FpulMwgDp_!I08Hl~*_ZhZtnl7!z{?oPy;yea;0oWQ z4LmXdgV2?uY9B+^ssTHitebp+QGX64+QtYd<#o=kkRKeb8FnK%T^jqG6P$6*Jq3!M<&<`}S$Br{VVGx^D zI=^Opi1+)-*S^^9|MD-kC$GKL#v41~<$UUK^A~M2+-z$bem(xW&1SW?G{?JwpGwDB zMUP9)EUz>XpBM2_upUz4J8vGEVSc~k;R!`?E>ynYWg985u1H0pFHlw(Hf4-lw;^o! z3xD>*?LF__Zu9eL4oHzp-sfdYjVXjA?_fzZAs>>pJvwL2K|$lYX6=v*l=f)ohqRsH zk(LsC`87i*Woq{4-*(h8=H{;WEl-Kq2y(3N}D6b7=u;}GNBsT)fXcM zJ}a2kmjVRK9~M!SvKvxUD!d@zVY~){PBX1NiA@4BotTO8d zqC(4oj`rwfNIb%V?m2C$+>jZ3Z6~9Y-L$2RuYC zD>LM=4dt`^u&}gi^p*}02l@k5O8eEN>GoMc3!f|r@*Aa%4!HgHRs#3ZjXd~g-Rh%| z8lc9j14*M^4=c)hDZovf*~lyoPOL>&0LOmY^T=b;Ll*ht(5hp|E3fihKt{CaP7yx@<)rGsEu+t_-PJ^sw6E-MEN`h{biV#3vaE)MpK$ONXZj;98Qyj5?QZd=<& zT~Sju+!htREiC9yAF|E)O@86qG4m|-05D&WqYuECTHPXpv0QD3%4?jp07pmM!6$79 zk4+PqE>yoGPNS3dELyCW`qOqIuFeCVc`2{l$9RbGh@(ROI38rZ)`&))GMS{@ng(q9 za13N1N?qZj{3wIyh)ch5))}1Q89C&(>p#ke2E5mzzv@h?u(+|!!jr%z|7V z-0+-s3thAcWz@IQ)(7dLrxY)OlNE3;PtrdG3*5+_GHZ2GMh5D)yqPn`CpQ_?NzrBY zSz%)kVVl@ju?&(ghP10G9gkBdWiRLQ)0M>q#+Gf1U2}5MrYDDtRen=$-WC(m;QeCm zq%%gDGu+m}_#<|%jK-J%zg5QN&GE4P+%LV}{?q^dt9}<7GVFiS22NaEohf73{-&&f zOL%U-(D?^1_?Q07RRY3OXtS?qs5xdS6D#Ou+fB^#S%dT=eu=9CbsU>96ak}-tP}OZ z5$bZMi8xSK>?aLMuq;xb-y`~!MR=?8B`&rd{d;+deg^*E`2#=HzU8}qd;9#ae6F25 zeArH>huJw`)p7Kw*kbj0A;(<#C575&%FIm;bkj~z7tH6gl#87KFH1~HmrFxVuD1UY zG>%;bPIm^N{Igz9SG2raqP6p4)ZX20fBw(^srJI&E^WwIVclXOp1B7-^2afuzbaz} zpVPd-l~~)^BtVj+N8n}kNL;8t+y8hjnDQMS&=yu}9Z3)fbPG1Rw8N>Z zDAyXZDn|lY;zZfkx{|s2+!YgIa?@7IlCZm`C3w?g&wugl#wUY(N>;8Je+ApYQQ!3R zs#}Y0@=zeBlUgqM!GJj7h|(3#Yslh{B7qnAB`QbAbEOkSe+$oNeV2uk8{p<7pSJ1A z@mV`KI%r1+ueGDs-puxQZF|3c=O?nXtKAZ-e%EC~;kWEo!St(fo1l&f1RboHKtqA(l-<<<;^q*prfyEI{-3JE8VI%J_r z(2i!q$uxyb*v1P&A&7vJN5NMvHAxLBDYC;4pJ-n0%dqwYmFg%1oFvf00V6M&kLHv1 z8Rm3$FoHL!28{Mq5|NT$A++P01 z=i6*D!I46FllOx5^u=A#j+{BqwoYVYFy4g5jkbC3Zce=1+PXuhT_w)hYH-I17EcGcI4KTlonng4^`9+6 z1W^j5|4j&v8WsJPzbG#5A}@VD0VVL9s7@IQkLPTeAXs;1u`LY#{zSWQUxP+sx&TZI zbFG)!t&m`yR%fz?mBBRNIFQ7Nj6fG8;g-Qk0ouC?SJ1K5z{n&C@lk5TMphGmVS~!6 zr1!m+@OGMQ#K5ioWxjNw{Ht=k0cR*!wy%Z;_qGYa?W+z>sUJFT@g|RC2Nly2Z=F?N z)$M=df#oB4G*Usm3&Ifx`p%^(;s<_kD*5}zu^jcT?J8J*cZu2n)({R4s6`ZL!0hC=uP7U-TbdS;!Qcca`B+$1FF-O# zM+Rv#QHqlS4%zk?pax_Hxb~S$`cRKs-{WXms23=LkEu*uDIIS0?B%!*B&kbnhsYz= zOieJ+7coi#Q(lJo{E0uj$@WT%clC$fYsM*^kyKp#6)z2;eKlG2JoHbH>7RF zXUSDi?T+;}82T+QAd$EF03~fB>dT}fW%90<<2uR0x`ZFfniJwq@LZA)%>tVCLHTJt zzKbr8=^Ho5-u6!Wz90ER?cTfI(LVPpztS!akK6g=$l)+@;N+-qM-{i#3QcDvKFrMFIo4GL+Sh#klWe7MIK%<`9KzeB42Z^b;0u{QDF-zgD7LO<$SLbqi|y+~Wg!V@Z*qQs6c*ni{USv#6So(c*9(lK)N z$>qG@?myu{kqu!-T4xZE_Plf`Tz-Zq23OV;4m+xbm#KbXI*x@nSicBc3NFwF>gP6d zfTHu&EP)QAA4t;yv*BbWu=ulXzx84#L$#z)#bcBXONUP#mF91q+=FvyoVeSgdDelj zadjA1*OuClfeZCkttcD{ogN&uU;L$i+8%xUmoroB{$vLQPb3oNcxyL`#&4DR(NGc5 z_|t)~3!2w-XSr_*gAE2l8Q4uel&7C9)riM9ULE~Q|S;%tM7fqn1CP$FnOnP zQV}oFcK_~=e`EXh55KpLo)_+5lqFI>#w`D{lnx3-~=x6CtD`zCAM2;$dyt4! z9tf%RQ_#-sl@Rt69>)7$3=GOkCKaIDdNO+s?NKwSk3a$2Ee>V^@zzOQ1=ByCqpT{3 zmrZL$aU{Bg^gkm7P1z{9z%dWy1CJyPTjFaFuQC_c^Sn!ByF1_t{5Q|`@(=lwo>G2F zkYtFP**YZ58=h5gkPeQ?WU;Q^aL23dXB&xE8EKYQPQnNC$Q#;D`mzEiF2VrK%yg%O zy2R%yBFzp)g{s?jHEy2bVtik&3@(f*)eR%4#&!1aiz|OIp1Ib0sK%>Ogj2AU6m?7T zDFfmsZ1UwBht8};9;-%WG%Fy=Lzgvu#-DNZ9nw|8pju>*(FU_VI@B1V=QeaZDEJWzEjdf5ow!A9C zSwYLQhMFMx5jOCi26?Zn8%HMELzuULypazKILq@8d#}COFAcvKW^g5b7@VtIgwKQ}P9w zg6ZTF9{J&Sw$G6_n8?3s$)J>f)-Mh2RIomceHyIzZKken`GXLaJaaWRa>%o^nHRp0 zQ`T8MfigC}7X@ATiLEyEpR!xLvOepO4xXXKt)yy7Kg4ag_6T)o7fQCB`eRw(x|-ql zbrv`gj?cbNC{(xp%+GaMO3_E4`h)hQp z@TbnP4YJZn8SMb``i|eFnI&%~VBy&dAAW!Pw|?R$qGvOv$PdbeDT0#3$enGFmJ~cBDYIRsE+~JABV!r# zWF+|C__Senub5h&X~r3hx5wCrM8WLGmH`nmQD?I5yCdfxY z%U$6~qeY(bNq#CXeLd6xP;n>}#kuri^i3caZW%xL3v92-dk`uNlGAwp44UUby`%jW z#|~k0DTARePma+*7YBZN8_u+ttKzJFAdfgWnQ}6jwbRqHc6~Z)6YSpO^W%1Odf1K* z9<`H)kK5^!Cs`>Ig)6G56>_DDI)J(K&p!QS@WV?ZM+mfH5Gr&~Zd5YAxW?#Tw8tp7 zSD&C{XeJv&I%SALkQEB=VOrnt%8hVky)>3_K@BA6lo@&$lLgKnjj1E0Gbiz$@E1pj zXASu&e`Ak-mob#nxY2A_X8_U}(-Bi3TqYETonNohj_@@ZM5lPl13Io9k9?A zr3wIWcO@{hh{S7{dVcWWUH#9iQXLa(#`1j$)jw$;%caEKPf;xUA?lHTWY9h1JB_x zKRVDc26VLHmrALe4l;p@1AiG72HVmG=9b^-8^o1!VBH#5rH2wv z=Fn)Iu;hvDgZ$O(w)qUogfKuGeiUv#NeBHkJOU4{ZX*;&kcGG6CW}grA3ZF6|( zK$k6w(AMk1;0r(Hxu>o5GOYZ|+v1V+c5Q0lB4)O!asK698``~OhdA(9S>HnMje>8H z(DRqDT<^7HdzLWF1w60~yi_8b+^2N#@mYg427c%wki`k}$d|CBq2o&ewA^k1CEfm4 zbs20MWtY272ZZ6Nm!jt2pR1VaN%@`elQz%kd8UJNR#?F+^jCuw-KkH#QSjirgpftt z$p_MoMdr))&9onyoNMTNdtdF17Te4;>k~5Y#3}q$#-ZVMLMW(E4qi)>kKz?{#DToF zO64!S0|)rYR3vsmc+_Xs;tb_Vm&t>Ihf{Sq%{X;6KW!K1=NR%c{uXU9J;r!BiW4je%Cc(`@3|NMfy$iyE=n>S+-(aUS{)qco>;|zH{oG2{dZw<%z@npUIwZHr8Bs1Qr zlSuHrvaBNVQxmw7!xQ+6^NsJFCEh+%6e z{nuY>4`2Tx?Q|CBH!IZSv~NgTm6cgQP|rJV5v0e{l4?V((=ETW#iI# z23++AV&GIP$ek#;@=mIlN((jK2@*5`^b}Ni6TWt@#|xB5S4{x1npaYDz9>? z4tQEdxLm4C743qheBeK2!*gyTzr;GBRL)sdR5n%F)yiPThudHtu|~EmPriQ9!TPF} zE(Cw^u#Kf%IF+M#BWPVq_T-BpJk_>q&U0C zvG$9_bzbXPOippk&f4Lb4%tDQePcBQ*$-p2Z1$0}kd3l?7iPibBG0aOe=u?Ln1A4_X-HB01a4yRxRG1g1C-Cb0topFa zJD2d>7p-&Vwn&e+G`CJz;KjXIr~`_vad+rIKMKSQhF zAdFm*xWRcXhiy0-<%oNgvL}P(NLX^Xl|k8YRYylMfq^*yJZReSL@NER2uiD--&t?1KV6c%DvX#LW^sTh{ z^a*X}%keeH-Z0Rq^yEkM2yszv!5UhiH3&%;KXL98*C|WnJ%&nxtw4~awkd5FQ6Rf~ z56JujUgTQ!W6KzAd@^)_LbjXyP2MV>_5iMJ9R~$|X{=T8dahul$^bNigl%&hmw|=0 z;TlWR zSV!{eFm{dBwP#fiex1z3P&O(8BSh;m27bb;TIC@RI0)Z~r7}Fp<_bpoBYEkkbs!35 z!8LtfYA9nHJ8|YDO#l74U>`?9-Aem|Vz!qB1*pd1led|G$!xR0j3Nq2Aq) z|CXf;?V*fS8=H?*@|5mL1qA+eZCbKda4C?!S;vM8v&&P7{5M~)C_mo8w)YsZBy zYvQCkR|7@mOIG|XBQ$xX5p6zcl}@gvq1`I4XqzUJeALmUZM^SS+%IR7&?nTV%=A*S z8X)SM;0c##*K&kK(e^Xh?WNXX-SV2p;0c}b!KALf7+vYdi6+K&sJ>&LS?FMSBBT0$ zGHKJ}M{RL(-cCO;%9CBGAnlM99@_^PI@adV zDe>SBZX|o_uT@k_UdMTkuZty*Ar#|G_`p-uIqwZolzspK8*HX z-|#PoXi$kbc5F<2j`un%S-ImUw38m$k$C8G%!l&WG9ETY(bz>I<~ak3@Fg}(b`_C7 z6Ku3gZ;NR6*|x@O$Ns<{`B?jb@A=-?4WS=+hSX2_s5WV~e&WJg?!)W1g>;qV0Zo3C zzNZcY`IXNUskFMQ;FGw?_**dCs7kYf0vNaF){cRyS3KlT?Jn_N$JJuW5;x|_fBRv< z^w~DZB#`&?9eYpO)2zyzeE_*gJt<&9g{rzD%ukD^z2te~lVAU!J599+FC(k>60_$?&85!8p3v3RYFzpUM19fzM zp3iVCJSA~@-YzHec7FD_9UUFCljDQd=E(Yg^N)TR8Ve!+M9!6iYU1bT zb2_s}&WB+B)qZ7-Iwzs3E<3w$UFmYEeLVDqa2rg6ozCh2L*X!9I6Nr~>V9+qd8)B= z@?@|$5TpTdUxZP2>pcTe@jbjI$HbQLyq9)?reCv(&%m3s5&}NSwx9#0K+2RLK zz(5&K%jcfLrh_{w`x6UR#i zpd43BjNWyS#R0sU&Dy{7ufM;2+siLexA@nJ5>VQdfzeJ=D>|S`U3QiX5OgvUt5XvX z!D$Z_lLNSQhp!rYGM+MC@)GmpRAAs)in#_CgqFcTI;Bzm8<+ROz+c)l`0VJBNry3D zED+`>Y2tJsrGI_A*|zTP03T$iV-*M289Lut6Lt@8F|AcFKUVD#>KDEjfV^z)?Y7gS zBeJcu@rKSQ4n9VMj>R9(j~#lB-xsMedT;$*D>wMmKmwL6P=!w!0LbI2I3i@-YBy zye{2fcFSVe%Ci{f)D`7pTbluzoES;*;0X-L%s&%uY`_HZW8lr8T=mup4YxiTV}DKkg|`r{V$3>FJ2?Sf0S9iKQxbfH zlX%P6rx~>2ojeGhrht2lAMR~}ysyEN+?Cc;tPThSV&$no<)yN12ro+B4e~2Iu^!u3 z7|HauA&K<42LvGFbKhAxJ5SxK<6+x;<~jNia*M&DA!wl(B$TnwDI9qz07$S*BHRar*vNlT)Ul*`sQ@YGN) za;#UKE-rJNsY$z9Oc*cSN(^2Y?~~bin=fjT%{V_7;;xJtW71-RaS!eqC3!apxV5rW z2BGz5l0h~Y!4=lUCXmzV3&cCV#K^XQsOd0}qyJ{3J2hFANCo?B~Q;(0;JdRF2|X}KDdzfP5j(%@F53uk*ut#q!k|NKoE)|3{4{)0u(C^t`gFLmwUII zyB~Zn-f_`>(SPeyJ5D&-dFrkl_S4B=^*$bHi^#bS*(!Xder*-oB|6Wx2d}O1p#8z0 z_+Pa5zwf=^_|)+YALvBZ7an!}(*Guw(OtM#XQLmO8eUT(I3{c2Op|TVO+rk1JqcZ! z1CyUR%)^u_9@^lS?>dD)0_^aN%)ys9VbUcJZ1CV=VK3UO$gi+TaKWH-K)~f1};iETnUzmEn!4g)^zPKpG^kil(O z%tN35?LoSvMgGXAlmdu6?{T+Vd0YIdxQut)d+md5(XWP8tE`_NyhiKp1|8&UIn-gqKx;ggcJS$++IgZ)%s9m1V z+R}gZvmd7(*;0)irga1dY2;%*yKIMx){d`G2t?{NRz)~Pl(nPTfWq;E%6V6cPU4Wf zhA>>gOz%ZZ0^CMu-U*$^=Fuo{+uR7}!FO;(d_;#8EtjwJO&;o0IOLAliW{iXh~Q0q zelsk4k@=a=JWv8g#%q$1u2>OA2iLg^vpW)XaO?t|ETs--oux}07Y>SChX}apCJ>_# zi++`eidH!L2M6t!fA;^=CSSRq6&jr)XQDv>{Dugf11L@)gOg*nGUIC9UOFa&hes^ywHynTq(uY4P6SED{CsG0ZxcCI>5Mf(+|u2um8mR+K0aW z9l_hdC(Ek{;G6-Is3<09F)gPY$Pj0(G)Q#@YZZh)lH%y{C*4#5JhH2CDdP;3vzi)< z85mK5y&z}H9XyEB2>lw5Hlnk^F#t#lZ21A~2)=^~*Q|m$a01)q+wtAIZDV^gu-zi$ z$E6pOa~!1+@}Pl?Qh|290nXfJ8*c2ijg6f)+SqMtIDU3!yKZK~VS`3;4IV{7^cZj8-^f^te^lRijvH#i82a-VGKOYDkbugkU^Dv%2?urr6Lio z8DKZGS*J=%a|=~)(n|#<42>XSDQWWeC}A)g{K&1n`#Ms{#;G!2QLlGss_l> zCqfl(^H2;BwOZ@SK@jZz_#b+_v8-_&eWqtnq-=NvkI9<}A7o9rPQO8piw-KWxOCb+ z(n?we8sm|R$Q#cZc(zSeA#CT!B6tE{9C~@k>IL_v1w7A5O9TLdoAPD-Mo|YaH3l{G z5$NJs5a>hIXJN6VaA*>*f&(Ay*QoS&&=$7jVKd^@@BC4=F25eyqm0 zi~%9(Rj?$3UM_Ob3T)RA3xm7L+^2+`g*zhsV2>3;}*!NRS@l~f* zU~VxM`OqU={sK$q!WAm@IdQ)Kb9K!#y7YR!Xmj7Anw_`l>1jJ>OjsZ9+<}I8Xw_6wpsPk5btT$4!t$^=;e;#yk?i6fMl74F7$qZ06}KcEOElwOQ}B(I`ewhkBuEbxg> z46>H@jlv7B^u5T2=+JfnDS-5_TU^Xvlk&z=4w$7k4B({jOQ(1Q3OTuWFK(_vicFE4 z7NCr}i*i0z5#q@Il#xY~@$!$-)@ht_8ej><-}G7VuKEjXf?2Q0!8L8c4VTa!_<1fE zDu~>J^V=#2UctMgi9!NP9eLM`dmVS1ire7a%bNeo@st0gnV0z3E8JfPR%!{{l7VWo z{;!AUN$onqr?-BgFTBsG8}}5tOrj{aire0s3(g ze0Ru?FN=#zQg$P7bow-|k*@RrR|e`>aU1+~9LFjg40@G@A4B$ZKHrV=R1;Us6!}9G z%&+~E|EcYN{&R7JR2~bDX@%|~M#cq#yzcfJ@QP5A?rdPa!vsadGa|t&)FA^ZxoAKK zRF(HiJ_zT4u5lG(8=CFN*-OgRcf}0j!5G*M{)h@ZT%wKs-9P>f?L!~92gDM-406yn z#c5HYuA$s?JZiW?@Zd)o$jMBsOd}rT+VPM2V(^phOU2fr(I$nS4*OhnHV2OG;!9^ArL`*<5XCpog4)*23G1Mzj&lN zCuWo>@ppy8du7i=+L27c%S>?>0-t2RV^uJuzhsHnE={_nnTJ%5a`rxaDIC1m8)Ebd zN3fK+Z5wcM72dub7KII#<)Pz=c;zL3>xj0>O;r>A)N}Mw$^wu4W+-s>MsXIV?PtA_ z0_vq^coSLGphiDRmoRH(1^EJGPCY~q`o2bVg*Z_z)uamGfp7Rrf!eMsUWIM=S=bPY z{%Rjf^Ji7^7A9rIL|rLLM=`FAr@SA5ztFfxPcP<|Z8keGf_Tq)?)^r9w-}a|aL7g0yR3@RP$mpe6d+ ze&%W!0POGXK1gdtJ~9f*+VE1HDF4#7JujeLBh~&Nr-Que4{>qwHoTWE@&{poIkCWf z9CufQaxH!Bfkwi0mr3DQe2{j#O4{EXp}=k@D{oB0G+(QX7!Z6x}qJgCvCL(Li_IT`~7Wv?;Y*_t6ynnM{i*q9s*fpv^B~h zvTpx8Ia%4XerNh`X;vnv)AqM^>va;@l@iM-H;%XA0dU>XBVXikK3+?E=;*C`5E)m? z*pK|oO(tk~h8*B`x=8xc?$FQQI%Dr|{{uhJe%rTwd$ue()*9qy91b5HU+N}h#Mh8< z$OlEEqN-fP2fEV7e6G~=cj!_kjmv7S_!6CyKj~M>tpIFJ?`vF^M)3h2vh?<#ewQq_ zT2~*TOm{6hOGecpR~@bZiftH<09%`|oOJ&riGLl;jK74?>Xq_#VO5gdBxM2#u*qSb zYS++9O6Vs;(QmrI&B;S0Mf2G{!UCg2hDVeshbf5jSD{Fu9@<#lEDZS<7?g|S37s}T z_1CUU{>fL81j*HUwAXdU4T-jZ_$JPps!i0J`B=MnCkxn$gG+ScC%)8MuN4?y?U!*! z$hNU{+fI}VedNiaj5rFDoH>sIePtba2i9F_b9@JM^wQt{`@fhv;|1CP0I0!;E0yYC zOwTXc!|5ds*h)J-o41qsMcZ)p90GJ`HaZ3Dij0DBK~0;(wJ<>;Q<2YAY~bztRyr4R z6v2QF>^@<=ME5~^x}a?Ly)MhTYUL5@o?sUOC29qxF`#6d;=oe^mob_rAzFi4VU;jf zVH5y}fdv$lq2fb5rkT&qzXmgPK6TD)$yp4Z8gTTy6#!S(bRHG#+BT`C3**JsO8WNN-%~K!aWJx3N9CYft7AhwdDsj-eie$KbbG(5=Kz?Tk zeZNb=awaf>&wU!3aypyHve25N?yy7-H6B|Yh>!mpV-w?H`v!xh@mL5w>UpSYZ#k%y6;A~lPM zZ0Jl9^2K{-s;v+VIy958Y^8j7o97Z<3;Q2D{bt#M_5hbv20a}x^XD(TC`Tn7SDw0! z6n<#*+174Zna>va*tQPbJRj8@waNJ+^0i9*Fxr+?qQfU5+; z47e{hOr<_=I=PNKP@3C(BZy~{O>8Z;3@3jV1 zvLpynvq3&tUMaY(OW2mPUwB8ml+wSYpwhv$2BpGFxsx7McW?L<4hHp7M-Q;FA|%W_ z3#a1;@N4DUzD{}N+2Y{UzjF}-*Sdm}fi!u?)w=uDO69nM^%S47)sg4)WB7P=WBXZ` zGC&%2hPv>uGcJu6_b$D*j|nrFRp34}*w@I{_m#*sedO(YN_&Tr!ml?TRkpUVsj|*8 zbRhmnqrPgZdL*^GLHCHep@$QCy_g@q5N}WhYn7?P+Y4~ZiGp{;mpoCF=g40I8M&`_ zzlaMwdEOag(#(xzvOO&@#0i;`PXwzfdZ5EP&99*XilM9HP1-#8cjY>KY|7{_We)w= zf16A_6gf6;*C#7*FD$`O*4h2yKXu9@l52JUvRhd|rocBlFB}_FJ?)@l<5+~O_?;=~ zaXWgX(qHh&3AE6w5gJ3flzI$$Pom2N4KlsrgcC_uzE|MO-Djuh62?yO@Vkt&>3KV! zoWcXfr}NWxImL+}ec@I@b+B;NkMPa$Eg!-~e`nSkyklJOtU)KQl%q^0MLxPo5g4xe zki6uBC+5>Y&4dv@J)gu?o~F%}KWLLaCo!cg!S<1zosKA$`(w4r{c;;@t+(0fjIzoG z@%+o~495>}itO>H97wxkjcp+$Wzf3nJyc~`e58Xv#}?!ya)<4r6y%*#(`@s;UkD)r z;xmp14w|;lC1ahtc|QB4{r2zw-#?jgBQ#JhPMo@-^J=4SfUD$Y!qqk>&b%?+!8tob zz(@I(5yBAXGVaX_|HzlsxRv$T4LwbH^?>^e#}oK#n`w7t6}yAs!9I?W!b;oU%-Wro zUvA&?TYtE%PnX;N(WCatD_?B0`FR^;0=Q_jo=l)Zn>LfWCEFf5oWnov<+$Hp%c>@{ z^(!`MV_P(`B8&m}YR{ktO{Z+QFK)IE6*!hzCX->p0YvFs;-K~K2S<~3a6WH4<3Y9;&Qb7pHZWK*jx`xn@=q{y zM;Nq2I*%(@8d`o&EaOS2bep2@X^EmMAq-*&&ydcmv*QbGGQw3WS9M%X@*s@brUP~; z7~k`{(Aa>7bMP9$%*~;W-Bp`7Ai{(Zg9oe#Y-hqy6~LEAP?-*iAq{Nb3G!v#we{6D z<=*XocD&@!;G*n?-_AnuCBX2L*}Sb#haZkMUu{LaYOjCxU$pzb`pL}VNvrhO(5{xq zWA}-=M65G5+}Na~O$}TJDR^}`J4=i!D>`v;z)15nL>)!hH=W{W!M8P(|E-uSBqBlv z+s;8*M{c-2NJn#)@4YW=wXgrW?e@+W@3wc{8?_g^X#l1g|w+}vm4rX1_s}yG|2>kOK z56(*8&@Y_j@cTWZtvhYFz1cRmx7q;bacu~l;2OYmVBZyVwzPO?>%-3|NqD4OK)c^R zv9rs=Fg=4B_sXQ2O2M#*X>SYir4y1Uy1MT(sdQ8}DhzQi*eY}$NH2wNKgrCq)lruq zVg!pm`3k)9Vw?b!1C0V?b}@lA9AUM*c>>ozQRx(&|3eS)rb`RKtu~QFAFbcII)l(b z#r$R1==@r~${~RM%aiX#h-i_)e+Wt$Vl=>G#29El%S%hJBMUW077`;2`(I$29j<9G zbajR!L{%IF_8rNaRrE00?1mFlgEocVl^CP~&34Ubqg>fc_@+f1_6tN=RG0JwZyzlPD zIkTUFkNx5N_%UtdK~1#ne9~s%VtD~j}z z4fT@7f{xW0xdD}1-uOZyTwK;HdvWr!d9+7e1sxkx?o5ger5 zcgYs#Zi_^JQ#SF@kMP-kb*(&*<^elt4|>pW#2CuoXao!Oa+_(! zx$tzDaY%lX3hnZ<943#gml2k!{w4kDVDyAm+Vw?S9c{Ode((3SXW#uzZSwG-ojiQh z9z1-7bjN4l15@1GW(XLbc&2XOk5&kk2j$L5>E6-ODK_}54oDw|_fqB6$yP(1>UXk4 zSucHaSjgB9B9A;KpXCU44`s+UDp(N z+G5eMDe09wz^q*t!Z4!bHTS@|#hv^*b&du0zgwQkbH)p0#9;pJHh92=R9AcwBNLTZ zbq)8)YkZ$lwHegEK=bZtEO3M$Iw@wlU8o10`uR!UBV+89u3U7Cx8VaYz$jlfhdnF>5%3fud*7JvI^evvpx0~23_)qAtjA`jyb zLv%L1Y_H&ief4DCE~Xdl9Ay@ReR17(N9*e1%w`C2hT-stL51Gg_6F-YJ#hg6Zg&{a znKtRb8s-xWb0x68<$w}ruoweN1hX8C5IQ&M3%*w<&M}H$$s^S1#5xMci)ohjZcv&E z(bmx8!+}ehPLaZ(yXA7C@0qQw4B9%dbR;#H#wdqZKL7D{|I@$9pfCoU+Y?85Crg3xfQVW_5oZ*U zt0>gv(eOHHzTkSpV74Id`oI-18~LiO<1Bat{bii7r8b$AV`6^yRI66wG?x|xmkv}4u6wv+ z)I_3|+h8~(y&Q&ez?^Y{uEf<0zTaoDf4d^t8)bgG$ipn69BCgI2VQne+S_f2l+`e{ z7wCK{*UAG;4R4?UzHdLb)6O0~X)Ew}{Ot3|qe0{Q0?q*1p`8(2Os2tG_!(4@vvp+b z{P3i0?ryiqneT%QbG*F+%4laJ%5FNDKnqSYvMOv5j}e2h6-UvTPU=&EW^cS5I0K0t zuIqRV{L`ajdvxN}2-Y#c3A5dY>l@_?o4!+d^IikBoBb>~@63JY@C zdm2KosKXEBNu6q_cIbmR2f2Fc27)sBrG)zq&&U}(RrbWKSMb&oL#xl{Ukp9!aobS_ z&T3Qftii${bnCF3I8}V{9-J}!VRHI(Xpv5E?d!C>{i68eAAzDZ&^qk{OnIh3fiv#A zU!hN)npNYmE0(sR&RQ{X5Y(8H=k$y2x%64(3%Usas3RS7A6oi0<7!;*oc6(@dFt3; zd-$9-Ok0>xd@(Q7R2f0~9W<}RI=Q4iyUKeq;7IKB@JXAz_F5(i7SpA6aC`tCZT%(E z&JgKYK4SaKyIyQZ2m9^Os|W4q=q$R~Hh=i&7>=*D5B!$rfjenKbmCxR6UZ3R@Ntdt zH0ifk)Q@@P`aO%0aP)?le)G?`h9X;hnCo4_^IC^Nu z4dc1viu~|H&5r9DQ|^>-l5us7aTN!_&y*P};?e(M9 z{^Ec32_*u%p>()?E(UpI58gz-`AlK*IZ5YOal7p>?Wg0a6Wz(U?GV-ji;Js~wx8Qk z*9K1B>h!349FHome0Mcee)i+Au&$8R>uhcZrQTpg$<*(kHE3jHTc3(GRrm|JcXcXfO&a z+uBBot|v%Ca3#{1dZ)^K@Jl`uj2A8df>WM}=s+Y0C+(7Z%AnigC{VH-Bd^7?+pC#@ zmrxa0E$O0I@!1)bl(*p#_}-B2xJGVq$ygQHD%ipj+j0VcjeKPFCn?0izuJaRIeu*0 ze&tM_i-UMa2ZB`EP#h^7CKGIU2L_kyea~u+qoVWU35Vx8Z7B8u z3eYVS8rTb-PthPll#wUujBv`9QNGRuy6xc-B`8^|Cc{n zM@Po*mCa_;d^JDHf;`zT4{z2mDwY{gG}PDDhi!LjtG)4+PqjBc{qZ({e%}>xyQL1H zGm+VP0I%Jjzd9U*-#Ky8mY^P;!#J3c3ltpb>G0KF@JFuPv@;zr^7+n@TNd25=k@sH zEbXEbrX44%M*Jc7le&70+}=2%ViBQky3x;ZTF0QkbnU%7n@m zN5#b5jZU4H%S+l8JO=|i4K(?JGXsKrxugx1A7!&vz?}8N z0rZ_DWLsD(I@u1uf>)zNgT?RaCmt>R2>-Mib?Mw@NC zy$vn!6@E}-yLN>PUY9dde;`BM@SXBGAc7bwitK_Gz-@@cR*3$Gdc@=wWo{BJzVMAcoWV<; zAp53UZ{DZt;F#7|8sjJ6G=w#bF@oi#yaf-PtkQ4Xhj+$TntZWy`4in@ylpFNlWhOg zWBnyFUSos?Y4BCH9S}R%%0v1J<*LsREinJ59W;=;80#Qk-IHHA7A|r2!AL5P8nlZA z{ruojJ3oUz80(WazRbH9E3GmqNw1gDF#cXsc#oxROA*czjPF5A|a@e`f3 zzkiG!k8Yz~9K-Ml+Jv#^Jug4gPVVow`8iJ3-k@!4jnE~7tkye*T`*p5-PvQjxQveU zPz|@8Urd~=a@EDQre`tEReym74D}plWIIr&Mw@Nq46Vew_0hg#)2$9{8~8+JI$Gfo z`LdeT>1O#*x?I?f0fCaX4Scr&4;(~Q~Z;^C+ckh0CI z0qT;IgKgjFBKrz?d`3>ZmR>af>%VELTLC`{r!i7%6T{K%SYAtn9#0vL>S zj@1UYrLPT3K37(|?X%FfK5$Y``MO~&T5DfmNe3C;E3Y+q1iYp7nxG|Q@{YO|?lSNv?SVWvF`$Es zY>13o_BOWew)g*z?{3dO`_48yI&9~U_S?e;4=6)=^gn;pQzsb$i*mBe$xL?%m9s?) z6RA#DF0{qmu|&h>nVZr_!XZswxH2}M;=IF886HxpqvXb&O{LqN^wRzl4Yy0#evbR; z@4!=E)WIL}5&LUnqkYeJepmbM-}N2fh|}E3LD@Z&>#nv*bc;X=Lw+KexhuVCR_oCY z?wlB|l_%9FBo85NL#of}+UN!H8!|qpzRI8eW*k>(@j3BACzElG+sSA7u3QH$aQk`# zlYf>q-z|RX!E55uW`!}FM&H?%!l<$-OuEgTok&Kh*MnY_7q(({8%V3Z-q%*w((ycV zmG|PQ^K3E<|>TW>}+&)tRvO`CWeBRbi9&XL{cG<{T5kxBU+2sS!Y(Y%1!olFk zcT)lGj;`n6RKJ(gf`|9B_Mz3F+M{(eYxi##D zK}d(fZGiTyi`iL}$(2jw7`a#Oo1UTUNOuqWI*fLU!io)o@`&ILomIJPv-vEmMb#mr z$_w+An$7d1rYkz=2&3x)bXCgEh@i^QNvko!6=ck>G?24se#c4Ua;B1n12$g0QwC_1 zifG&E*RJQJfP=Gs^57CEYg7UXzQ1-gJ&%%7p{T4^`CDheRQZp`V+O3Pw!L?!9X)rr3P(j1=ZX0K zi}n-vpwpL`L}6;=L;DORtdnPF)VN)9R*x)BBxPA11uD+Il&yTM!iULZhH>SKw5wUY z%=;q7*Px)tW^)21Dr=~POEt*9?> zz;X;eKRE_ohr)r5AC-LQQvs{6Z8ve}=LUn#cssK{&f?85L{`_wIAE5$Xrs+d@O4|H ztA!(I!r6+#xAQSTs*II*(slGMUGc<0UYwodbR&1bbfERMNTd~%d zQ6|N69lG5Xp+Kka%WRRaFfF0NqqK^kl; z>#4r3>N1`FM;VJ5O!K=k*&3PwSDFpB4}(3t%9blN49cXC2ae@KOaGjRl&pH-8I>4g z?Y3)4itvk%){(O2mB*VTf0P(tR7|B43V1C$%!#aZgmj}vEEB2r(prZ|(G zdd2HX12G{L@JmknxBXq-^>xuU;*hPwX(Q!a82p*0LF+y7^2@<3I1y)^YUPgV3RV;F z(%sc#-RAXKS(ifa3~$3zV3;NRw=Z;Z(a|Enr#t}$3{>A&UGw<8OE(vxIV(T&MZ26# z+hTTtj+oNd(67^zjB{?@zy^#?({Y-eGUfrzHd%$otCzF(>Cf)BlZoT!JS#iCv%I;r z*`9gnZo6}Dx4ru7ueLkS?4q~eF=gC^;d?Rj`AvIrdKtYu0@H8$=u2(uu6=*hmWQKE zCN9p-+5mmE&fnZ`Y#khe!+G?)J4fV8-q{7uOyuzFwr8DG#|2m0%h9j)P!`RvKJ$Pj z`IPN^$eirVdw;gOGj(YPF7nuRvpHa*(i3Nz0v?*+iccJSQnShhpX`I~b_vrd?wD@t z10rzTMp)yQ{lfO7|A2c3C2f{%*w%p#%DW|^z%|ZTWUT(uH`T|M&AoAq+q8u?N#RyJ z%KKrYJHckPgW(uw)>R~(51dwHA>X|ef8;M)^pqq1`7z`#zJAvJ!hiDfbYp?RCxB!U zk~(roirCxNrG*Nudl~-cQw+ceeT<#y3&sU!WRpNn@=&%LV{cdLoOmK{=@xNXZyrwO z`dqdd!V{gaOAqA$r?30Kd)xcJ{dct~@r%QU?ck03?eypv7|MrZxGT-HNykTha`~q- z;!Y!x(vH$D$d*cQ)25IQ>NEMPtkmT7CH&GhDqSq#yb~+$yyr(FHMnyxtW45Kuq({8 z@ud@V(CYh|Hr4X7JnQ5TK5lI9w%_rw?`ps0!ylo%PMi}B(gI%86S=kyKt`V_gD84= z+mAd3+rv=0ww|Mv;Hkm?eO^P-(~iInVnimBrL2-Vgq3!&F9_R`NhB-zx@X~b*#bB9 z@DQ#M9|x8)|8j@}K!{`0;X@J1ic^(`;zW5B!8q7}O4X^zJMtJ!Wx@&_9d6pzI@iM2 zK7Puv3b$AZz@o~gbcip8uCko?N=#PeDdmz>{UH$+p+8uMS*z*#{?hep>M?70?^QTm z=y{-Rp7^e;IAyC~RbOR!C`!nwzyej?I7SG+cAF3{4*ZzE9)(97_x6#DW2EKPBktpX z@e}&_vyIdPxmt_(5U)bTh`xAforlTUIrOA*rFQ#S8!E#_Bk|M;~1^IyB)_D{}p z>fr5RsR*{Q>?p%FmVYo7YLN^PF&2-(r)o|X}rPeIL_MUXfq07 z^UmFNwEwmC_}6{~T3jVu$Dtf0zx$qj@h%^O1YW+151*m51ash^c+t4Plfp4uQxFT*0#pe>X5>6?s*A`h|W6MS0=Jtz)XA)ZGTE0A#?V zO8cdJM~ui*3j7l1Z-L-@+L0edoZv*c9pTRUb$gzApB>EG_Hf?z#slJ(+vb?|B;6Oj zqxd4&2&(Ua@fV?GK+Ax^PYsMpptEKJ=q_PSn>*XevqoEHHu=$E&mhj9j_7a*58&tZ z$|f=^KUQOyxZO0JkWMH6<&&Mo6;D6dypE$hKby9}HUq5B#Cz=Wy6@s))B&muMjl0f z)y|Jk;+!prx48M^`vsD1hnF^wAikilIEEr>NwXum8m1F`O`p;k zlin!53|?-}ai!6L-ZBNt_Zd9Y!|j$EJA0Y+UdK7JOg@TnVBSHIF<}sY@Ig58Gw&*Z{4K83seD?Cb!aF7yn^KcUNTj9RH&MzOUFgN z`woyanyZ`GlkE14Qwp-J4uMSPVT<(PaKN7C4qv1$jtfT}=T4CZ21mli-` zB?)0?S}L&6R@7Bw05^CA%jBzZ>nY8dIH13J>YHsYu9sJSfYw7W&{Oo!>&2v9o*lO7 zP8LoVhO3ig7uVp=uOINwWE?znAnn_%*Hvy|9^nir?GCyJ56|0! z`zP(}(J#C5c@nSY7?bt` z+CC>PM53c-nb%1AC-r@m_je&Xt<1<(mjJ)3Tg;wo+K2BF z*ihr84ghk>fSG=rwtzp-W?TFEMGou&wv)XZJ6r7=zWqb(5B%`=w;8gO$yQ~XssSAl z4e&e*PnwFBw};-|P1Y{oZ5-EXVPIIEt8tx3QK0hpkcl@^LOK~D8zk8aZeexu5-IKS z6in}lB2GN)J4wlyWjrOs4LCd|^V^+~gz8+1lW288X!Vf#b4wn0ZQsbm80D%ciR8(4 z%#IJ*E2@IPFfPTdqi9Kg4@8prr*7f5;zN^^(&l|WaSaaS_t~o%i7ZD`ePD)ysvHP7 zD^%h}Y#dIm2FvH3G)tAUW`evb-deMVYZQ6%l~Vi`j9?c!?T^L^zgD(|nL@=A3S^bo z6%>L|?jGp%s{D*S$i3~YJlZb=C9Tl~+^AoyRobjqhAsUM|MXMnArz085&ZAUm+bSy z%Ff)qetO*g{wKfIF76*=Y+mQ9_P&sOK0C|cp@P++$~LRHOW!ySZoymYmY3=1b}9$N z$Ex$W9Al(@+9W|M<4qkpgYc`)mAt@Ao&*Z{yZoxr2 z*D5e#IJ-R&99M?*{g&0i265E6zLEXMqZeLiSChx>tzZ552&Bqm4Fx+`AL9r?o2!9J z^%lnGyLtY`4ALal6<6#@1GQZn(*H+_rEq{JxhbJ!Z=Rj*9$cJWjlwK_SV9 zn&C(2A&?9o`A?jUZywv^Tz!EFnDgcF0p>nlOM{atB zGm7InkZ+3vV4Sqk^}LNSa>nZyIGo4>b@)9nw^n8g9Rr?@qu|sQ&PLYkxidv5+$-qN zV30ic)#IsiWha>*&)e~nqxPw`yS8bt3w&$f_ID(x8v zp)2yiPvL1UyMrZfk>#I?ReDVYTj|n>GY%LkS<}ivGrMtJeMK72Bv9rSZbFAu;8vF3 zoK6lO?U!A!AC)mQIf`%ky%m=+`$hoLU{OYbOQg z*>>m5|7>y+eeO3|@<|iM1b0!KozX9Fx)v9cHeDQ38U4A@=NKDS>DTsQ|FSKgE1d*5 z)I0y#%+R6mJz_uovUhLPo`3OP#)#4+g;tK02wUtVjrPZoibjwlx=mlXGrq1FW<~jx_9P z4{4!{hMRONlX2*zg~IBI$R9tpqjH>nBi!z4J1W2O$ekN`|JHogrM&TzQ#R$H^qLd+ zu|I^#PrmUpIcuN)@=^P%|Mh3W|0-X&$~)U8&Vl@Zr+H5f9J1{aR%GHU!MxO>a#JtR z=HeP%Ks(t#90M~+Lz~tqg#O7-#!uUe{OSvLA^E=Z`#$)g_D$dN9T^+eUxz z6dudpv{gq(-fskkg6qBQa=Qf#0@8oTAXXO z2QpW)DB)QZOP!9D@K0S%+m=jKMs07vrY`GEALWY31m6zj@LuOT&XSR7@8Wrv0f^j- z3-{$vcI`r(@a=c0mrRnD_)MS~XZu#&CWfcnN}s8j{0`oNulA@?Jw85>pFC+*ixVCH zq=%Ut(!{-j(cw;N>dRqq6qLu}E*;qw$4^=d9%ORGF^**IHhH2v3QwO!Xqlk#M|S_W z|KyYSBi+moh&W)(=|mFm0TixyJ)WMmpZWM#+R<0uq61&G)9ESIEt6IsZ&V#!f>boS_m+jacY2 z|J>CoiR*B7^-5R+>Yl2cAvLz^-Z$QD8$%qe?0a8tL+Bjha1E%>Sx+m?Y$kPQWe za43Z4Azq^{x;u(SK~;1rkn?E>xKb$npkOf0kWOvY{McnmpcHOcqt{RVq!H)xt8i=! z-zoDW(v!()yEu8!ZcgsQ!zbF)4AbT~T=p&v7zY-+ zOtzvRAKBuGEJ*ioW2?=Mj*t%V9EHXV@(%6|M~(KRXgHIO3_J~(Y{?^JKqvk(?|+?O zj377iS9;;qGHvUsnsOH-hy2d0Yrs)iaME}nR+}(Jiq2tugqn8kW=q3+oVz%MQGCr_X}{l|ZD_QILA2OoG-Wvaegr5#MVK%G@zh%n}D!Dr$D zAO_j)BAuxVjEGM=h%*jKWZZk|F;^*DKzJ3B^u4_f(|qKbHV%H4HFWvpkN8z&7fdUe z7C#lUoO&9}Y@ez)vA2=J^F$CY{`4*RFZC6wT;Wl4_raplouR@9vT1}CUOjKUidXIm zBlKeiH=o?gmfDKOn(0$!OiS*fg)A{7&BIR&r?hR=1`NJQU=qdG)B^vyvetcFsaWw|S0>l?#%IR#Ig zFVm&xVtU=~zkb}#PA7~jm+1KQHr^WYHwNd6_T&&J?2B);Z+-cNHlh!E3Zm~EpPkaq z==M3Vw|2*EdutuN@Ar)yD_7cp>+-rf!;@9F!4LWvv;0#x$Jq#u8rA4lcpj$!9+W7F z-wHaFu?_=W2ZDwPeL18BsnHR#zr+b8uMTZacV#S=FB;Rz=fwqMcDAykLx@+3Je0(D zT-}MV^};h*t&cCE?As@8W3EnmDJ3Og%9s2sy#Tp^U)zp(FoHkzRX_G9RF=tVk1%#RlV!2T$;Bgzr@O7_ElxM+Stjd7^uo6GU4GJ^V8FI zcKEOjk)QpG?e>@c%g@~QEo+DrcW4p?~1@8;f4``~x{*0!;Gubn;EZ;u|l-cC*rLccbYj*rf5 zwq98y{E2>4R{TMJ)&`6n)SKNg&|_RyzT^v~>@U7w1}TvfwSsCw9*Vn;o%r~i_pKen zq?yvz>vmi5s4U8}cIZ z2OqlfWJ>*(=qCx1J2qR@XNZgwuB?N)42dxlp_fhZ?%|crFM6_46x?fU)lT4s0;!pM zuKYSFTw1y0|4Nw?ptuA5>9#=e7k$f<#-(_InWFFz!p9E30wUjt0|&>1@J}29!m+-1 zo5@J=O#l1Mu)Nx?5wcK92;YJt@?w9sP3$wq$psxh`iW#(CizLZl>zA%4u7{Gc_3M| zLmT=oZB`JH)dXStRQ80nFL{X9XA-E~%A}L>&xQZg%YXeCpMdKpy25MQMehEcfBcCX zx5l}W(tp6L_X;(tXDFOgoRfd}t6yqg`1DsWu4jp>B{{b!PN)fG(>0E0yQM)-e_2La zwcJ4n92AA?tcVD$(s8qjz(D8>Mi8>0G>S1)Wx^GmbaQKiLCHKWvC~L)PI-ZVWXW5_ zLL<(sgF$;)0!fyhbsQVG63lK87FES!ex3$$GIf0&rAb_10Y_o+)J9ul#jSTJ8HVIE zfSuM8Pj2)8RVEp*QAWVn9B;Rc=iY&_`>36~_PMtA&iA$POZVEn=bvfMKKoL8c6+Pc zW6<2$+-lpyaT|^5v_d~7?T4LR)rzkL4H^aVO?i&9#gidU7a=_IS(bYv-@N#ID=~x! zfh{6m6++@jGjED{H4hQthrPN>>C*$(a)jy(rgf=2+YxD+5?Z2s)`6eExAXH89Fc=| z_}W+6!w2`<^E<<~eSMCDiPOF`qn+ILiGm#rvh_qKA%nB^I53JFl_*8mI5l7U#24CV zXQ#dR{+HTlZ?`QCHPk;`vW5a}dV`JUKr+%$8~ma;5K@G1=8< z$4s5f=mi|8TD^{HLFS-`t6d24U<+d<{8R_1KhwrAEW1x^LdPOxgc$P3SKC}@$Po2; zyuJonGSe&`Ofo~C>Ohb7?l2BM*M=U3<(Q76w(#4G$di5Ecbc6jQtTpQv{ANubMH7j zPun94I^ZB1C(0M_z|l5VCY^lpWZQg{pFB%CB+3OCI(g*;=_-t~JtL1?m4fPH=IZ1a zrr1Z5tusq?KE>_ARTkP_r|SY|+xPx7E7ov`$Ge;Dt;41EfBw&10ZXqcT#FgtDXen9 ztXCZld8FFs#0R>?3pvfU?`84PsUjX{Hijeloy;4I81HbL7qpWrt=b7$UE;@&M!SRO z#g{+W-ud$T+U3Elo$lXn2d;WShm#Ajz07U>$^mWQ$-!R5P1>WO;Ird#jCTcvb`dM} zPIM0sQEeDdp%~ufKqT6XWN39PqJ7s_7}IJyCxjMU;Ze~XTD`wf*HX475P(Zu3|#dx z@ty*z&E)p4Zz+}?9ddg6i2ulKPt5=Z?B^1A*E!7+EHbpQD+he`Ys*#$?2rxC)A z(`ZOtRc|?0#K~WY^_F63qk2r)8h5KtJMIYj=FPv;{^Fnh8|_P#E#dut`v2Yj!tZ?{ z{Y04Y1#F9iNOf?Qm-ShTqC|Nr{M9Aat!$G|K}o#%s9#)2Q|5G(daOVBAAfKAtFQc2 z`#=0&|6u!2Dxf@Ya=g98J6>cQ41r$A0G?S);5n1w=9E`tu^ylMZIJTWamz^?WjnbO zC$QE&`!~P8{q~ zWt$=}9J{Q}f59OuU?d7up>kHK1PeuiLh=~;GYr>%{P{1pU;g>eqx8?xIekghk10EI zULWm4p;#%G0fV4u-_Y@0aq=J!w`;iXT(Qy-l6D6aXVpYj1>?T%6^z|W;~ALTlIZGy zC;c=!vjc?2kT{lL*hzHaP)MX-HS{dN{@w`fNk>B@w9DEfES0R?5YfLBbgvYJtUTA9JCbomcDoGT}Vst$K$#%~yh()I2sU-{>C zxWPI1RbFMmc^r>*p)1Zu*qq1wD`(2Y_*o}-Se|S4R9eXcnBv4Q5mYx+;y8_TKEA!@ znJ0W;SDcWY#pej;7hQI9SIrY#owIWY(F}SujO^M-G64Cy zzm}m%NA0E~84=~0o3a?d`#J_`^0_qm>C&9^H=VkHVfe3zT9B7fM%r-$3>#^Ih@-eV zNNBcRj)Wp<&==A+JV-%r}37PuBGnvdTfzpIWdmfE`Zrh*votm*y9)5E*oq%$l za;a@)+cS2pT%1hzaM?jy<8F|x?stPC4wIb5XFmB>ui>w3bmm2&O}gTFMw0uCT>6EpC)y#&khoWw!r z$|3KhErE3Ub0o%f`#i9@pHbwl{xtj_;%%Fa3EN5xm);bB5gAUmCRi9Z}A<5#pFM#)X zrnR+B-UZ|czU(#m?d_f^i&RW$(sS6pwlX-&TkudeiZCzIw0!Q%3+iY<eUCLf=QZ_rO!7QKsHWtuto2agngo=-WhnqzC*n!I_9n4Y$ zCal&mVcK`_oY0}2RYsd6UQ4HE14A8kHGnOu-?5|WKfE$<+FnEuX{G}k0DpZaWi}o`h8XCy9iCFY4ZL9U(UlA;Ti5&0I52GD zF6<_+wv3T8?rRdAUD|VCe_i|N>uYFgy5^3bsQHt8W{yWcE>lVmLW`M zoqBdYeFeECF{5+>R%H%O;_4E?B=Pc&*f?pV*k0NI||HE0OGeZC!%O@@O3eJOfL z0}hD#s7r!!`y|(#v3AyMVsx@b@m(tmbG5j<(E2`j4DB4R7yr=r)+HAlY=fj6v2*+- zE);PNznZRcK%Q*%TKH&}5m$dxryc$RM__&J5&PS{mh#%UgsbLpl+%6Rx4D+v6CVY7c$wvRU;)I0jtdfgBF?!QjJUiugHAD??Z<$(!qNkY^e z4)rF65qRN={l}kNR!`azV16nm@w22fay=w@fphgj-_kp_;n{nC;zjkRU%s|p{N~@Q zXP?(5fdCXcHZm@XW?sfmK(B4P!0eZhpGy~>KT8jr$sSfigJU(_vB0?d*Nmhe?=Dp!e*NVa6&3!58R` zI+M4hqc*??FbR`Esms0c>=^=Z0|uB>qd1oFT?a44j)TGG%-GvXWMK`YTQY4dxM~D@l^G@1h8|mhBp_h|4fIDM3RKl zn!D?6nmto{4qi}G=UzYnccyk6+^4`=2Zf0y4r;G>ZpO&#Y<=Ybx=6CIi9>hh%N-*# z0&XX;1Bx(sE-$W-aE%f~;DB-L!xJw5;FcuuF*s~NF1*6gs#9^MBw%f%#wC+$wYs=~ zBZq(RrFFFJ1P;y=`);%>Kgf)y_cxLNs@Eo;9_iS?jqKzh{7%2%zWU~K942l$P3=QA zNN5#-wH71jOqd>Lki>$o@XmIF3w>s6WSRtal)f}x)4O-oh+E;Kqb_f>WYBcTFU^A8DYzb*w8E-fvpOuNI}`rn;#PdF7$Q8n$omY=?T~ z5nOXL-aT}*wo^)bVEcJ~2-z7ldMA9NAEGZwOl+V2efGW-3SXo>x_YJoO@fNPZIL** zTi!PIK)dDhc^DIGQUMsy(%eTdX>vS^E8mfMdMBrx+jjUzJ@9MElkLNkd{ORf{RT6A zx7P-@w0Q}_g=!`7r(SM)PSNO?x=EY8nbp=V2lu4A1xfJ5x`BgTh~60_FW1(Zvq9_h zuccbY`HbzkuofP?vzF%$X9@U_MNB zGSLc$II++4Y+Q?|xCuRZjul{**FMHhdEEdW!yYyZL-`{^2h>c^)NwhNK`0O~Sxf*9 z&R$DBq63C*1mv@*dEX&_gV=ZNvM=dfSy-wQCp)z;4}Y+K4h9U$_vo_oCX{#0&UE(}gW8=dF^<%Yb?=*hNWnTu|&;hYSMP(ZJJoqrUJn_)%7xLbLuZeOkT3HpnM49e9+(FT~KE5o)@jRAS!+s*Jc6 zSw&v(k|aADbCE!~JW-svT9Z3=)r8NjQO=zd-R)4n>+5LN7ME&eak+M$x4)+L?5s8T zwsLB&`o~DfOnQd8eXgsw=}p>q^f0e-P!n|A+&>%iKu-&nM631vY{{-Xq07e>+H7C5 zpYe6dlQ>5GarZZIREKn$JoLXtEGdU}IuO}CMo zx^0{T9T_wp9ECRx$1vGju?xzEx(+PxJN<#SrCEIo50s<#lm~db3CP2*d2}7T=wT%L z^VK0yIsD*#xEf*@OVftSO&w^A-B4Emqc70Ms26e(hZflV!{Wr@5>>vO!Lt8nUjXLBP!d<@zu;5i96kXHztu~UTTqW)wV)LKaz6AM?X1r zCSPoXX}2`)8t5kpe9gbBKfC?f`kp`doq8ro;MXdJw2Ngpk=3Bt^uRnN;TnR%IsJq=cP3Akbe2~*E*qsfy_3oqfv5$YgI;R!_ zIMd8@;LJwR5q;jtQQnR9P@Tj|C2*uZbaSpT_IWR?YF7afiNPoE-1NW=G0xB#bud8( z1D+Qiv^79taIhZph%4&ybIz-S z=k2bEiD80Tj1c#n^>Ue^ZAL*MMul{iEMuAUVMeDN& zkyjU%xS41;%h<5s9v}Ib1f1)t@lt2GPR_b3SheTg;D_?GtnK$6Y*txaGFIyy0=v1| zTsV$XK3-c7++Aa&*i%zO1Uf#9yR$}jk4Mh-FVF}L*{KVlCbJo#LH52d+(Ci0o}Eqq!XV49aA5c!5rs)VYM}>^s}kCwT45fbiCq=D`7? z>?l|bRni$?`MvH88nBdGMtrI35|L2{EntpI9ObJ4LKqYNHa+j@wSxug9fDczOQQ`W zsiUksOv2=HA?dWfWhBOfiyA6N(epe3fBl07625IR#Z>4jbt>H=gFGqshaJDO04ta96Lbs^>M;j^c zA6k=7zoK0OUfaafrH;JM>>xahK!DqG82*=;1M9(eztcW+pFL96#-ziZqVY9|(PnTf zIBQ(hgT^lvQy#-K%2D5s*F}iakjI}Kkp?e{j!s7V*b+l^1xjhZ@kKh&sV>eR0BmL!Rz&l5XSqt6%}o5*Zh|A>PICS60dWA6^WovoK1bPC#9avs9NE6=qF zcExBybVJQhuef4=F!=BiSKL9>>kbC_qTVDn$Wz%#b5ABnF1+h)AfdmN7Ga#7B|>J7 z0B43Cer|Tq18$7%nan0sD>KXRWg+iDbHFdl2C;S0vpTm_izE-@6XU?`!~RTGzq?9C zD9tas8b+_JT8ojiCjNjInWw_e=)cOsV=oS#a_dIIft{|0v(66Swut(rSNjGaKtTfaidO{ahN7 zfQ8sD>#V5Ocs=yM8Twqam*_0~G2gR)x_CsH7%U27YI3s1@P+ffUSVMt`_rEBSC)C+ zjnCA%=hctB;`?iie(LJ2-s}^NC>5dcTdi&NdWUD}AC!|o&l87!?a{p_1=eWG=)G(_ ztAxX`e|30IC|jTY&HC=2dlzTVuAlkS*Vd!X1D~xU^*)jdld{WR_LucK5-{7`u0!?t zzyF(h+ehxLJHOnWEvswl@@KxdUjAd(*M9rnt$$a)_zT?`s;jT5r_`6~L&AB+kJL@| zk@}1GekpaH{L-JTAH4As^^0FKoAs2J{+Ftc{W;|=!*TVq>w8}Pn);S=p-Q>P4C(6f z;{*xVPbLBT%ld`qoD*3|lYJO2#Lw2zPt|+h`j_>W@9)B-?aQ9_@9Jf*xUu%anCLd# z3CBH;648cIp-;x9bMyx6<^S<_{Aj)E4|??fpT|@G(?{!NH^_GshR)v)4)1>JpVptg zr&s6Ny8Ib0u2;PB#sX`a6Wg2XP0#qr`e3(2UH!`XZ~yf>>&S0^UH#g7y4R@p;y3?( zJ@fpkV}Jkhe-nqN{HK4ZAG%&TI6|ZP94cv1ed+fhr6i&bSjju{5N9^Ebv=EFo*;X> zyvdmK4}9Cd`=Qrmgw1}z4Ga4Wk1yO^LHT`yxogUg%rDpdCkZTRH_SsizAJ2P&2{{J z+3q|E03Au-d8Q0wF3auInIYpZQ`=zR(#Am*!4~P%jy}1YoCbCiSZ=o-B|#D0P4VpL z3PhzNfUsNqN<^Ob!MJKqBrt10ZI8MJ6iLcLutB;@x*D-&U!$ij?XM5VS;|0rip<<%}j{iSK8pK zNt|@(=#t3E5C5P~!)UT+8ULhQTr--&HTjwV%InGqVYmaL*KMPH`wxELoW#q|D*RG+ zq}Qb&uK&)?iSSDP3g3h}!ANAJk)qSkM1p(Dnwj}7u&tr#8rpeYjUKqXhAw$bZC`Lz ztxp}Or5eFNlO%$J$-fD*`e0(-mYX6k?qwE^HXu~RNIMA}q#Ycy#$M-+oU)C*1|3+^ z-{pg5ok9IiFyhcI_{D1_GT4x4GsgjxP7b z$&TIlE!#7aBV2yF6PA6!*@n?cf|;dG^xEZamX+7NBO|A@qkQZuJsGOIwr5e_sWLPo zJ@Ovjsl#Uowh713}J$rE+@*pZq)dZbnsTvBFx%1D^@ErKVLH`|w4Ic!HfT6svf8k#Ok}e$G}C$!~XU=@NL^fLw$rUN4)Ll zB7#g@TB)unFAo!r20+v4DRNb3l!w3D)%-6GChJLLkjub8dp}v5Ir17b4UXVgNbU`u z{If4=kmRpz0Y5Vh!Kr(2j!Jgv%)i*C7l`|hgK4?a*w@4L5-K5%!P zJpN!U&&}2R%zPa`cCzMXXKRs;x7-01{b$|2r)?7_9VCaS7|_d`pw)G}%C!x~&<9QW z`K@Ht{n)7_TmYaA2t%9eW+4;1r{M2ct;{ZG z70m;OXVZ@MU;S~_3Mx)uO?~(vuG0t3t>Nj(Mw57OO`N5zwJlCG$9Hd4fEe3pqeCQA z>8tXE`^rsTs7B(F8Gd;O&z(hd7BjP4;I6-xPA#!J>pFw8glcsNaTZqk>eRw|9i3aR zdrq9GFWl9s+wPdFkAC`i-G1l)Ww%wQKy&IYJT=)ojP$i&&uT;W$;RP;S=q;B-)*x zeJ`ko*X)nth6e>(cXdl=MR^mZ z9Naf)l)u8GXp%VlgSx4#)UlBXlCSZJI(7UQerKMt^3XWZfzQ_GhLOvj3-{J_k9$KQ*+Kl0S`sHe_O*QJk~sxQ3#=DP6tFR1G-*wNtBSL&Uw`n~!zzV@Nx zWS#!%2kQMZSJw+3e?ireFV~0v`R1C*t&?@{$rP%YyKbq^-_`v=oqKP+qsAY1aUJ^S zTUuF;dvE<9<$Gl~PTpCcf9Ido+!Zgb$D9LA`0>yMCaT!V?eDGk-+Hq4T=)EX@|EBS z-7SHVPtbbn8|#;T;`i&rcYh5`+Mc=lL-mh;bGjb>!pGNn<`Lml)0Oa6gUFE?A%3f4 z!fpCLP@Oy8UGKg1YkBamkB2|`2kUXL!Ww-yzrKF{)xTRG`s&w~Csw)Z1NFYYI$c+M z@7LG)$gIEbaNYKo|5$f-OVqxb>RI2iqwajm-_>W&qQAc$^Ze)5RXh4>>GpTkdq4ee z;qa2W{(N*a-PLdVm!`MbCHrVptg9m#sIgCnRz6(!ntjr9%jpZ%wZ1=o_s!edaX6Jg z-Wd*q<~5w!3IU%Rbofq`+YX(qkA3d0TAN!YLvuz5%e0|$H`vrLI9o$^CRiO9AwU6! zqmAO^OC;BPHcF$8(OpTi1kPc80po;Wq+`3r z-((X&P4RH_3LfBDe&Wo60YBXmqA=o)zJXl-dYdWi+kb9-(-Us0$6tQ1_To6DOGza_ zF<=5&=}O`VEcq6JXyDLO@r|-0i}uhS1_x*F%$bhb1R_Z<__UYgHG|<2M~X+`lj!iB z#6t%lgSeNEjqsf=K|}4CAz?_bymkp4xJi4{rQAZmU`U0pt1Bj{B> z3BuOeObu@@)+BY^s()n2(b3Ab&W>=qY;>DI$Tjf>7QP3}86F=DcXY3_u$;il1XyQm zkYJ)?FzJRDb|@X{mZQc5RtZSpo4RGUv?D@Mt#nADmzMIIZikGJvrdMfMJJ^E<&ch2 z18!R_VRAIq**WN5_nm3f1+osAAJEP(`Hw!VuaFRN$qpTP;uYFRow8HSkS#PPsi2Im z(oWwTz6IbTI%5}hmSe=_pkwWMH6MyLacy*&Bs+tl!z3srcp1Y@64poPSXGmu1j}sV-C-AH@d^YwICmzkWZFrwWDno<-To%7hW(KSU!nEzi_lC0NIOj;e1*e9+j;Tv&_+=lmVfCJ>VJ!T#uNs7@gVN+|Bp;VD zY-|!CiVw2$d8~D0@4%6}-8qxBh5hc^=%d_Lt*+8nXvMz2?yEMSsRb}?kjTE)W`@yy zgGq4CXdQK>GXV*0Dkqm($uBibp7v;rc)+vKMp@3dKt1)7o37##{KnYoTv^%Z>0NLwrvY(EAha#4iJfy2J#OpknNI@aK4$vpnVe$yfGOaIY?%$vTPP?dI8K$WWJHD(B7SsBdbcf$oOO!MP_K17rP3>4AhB_#cMU&x1|MbYL;LCf@M&Nq z?K+TUAL@5~Y5JneJ@F+VXc=vc|CF87HPwe62W}K3<)uqnB{eit$UbNJ*b8o)d)cLR z>6OFa?viBB2! zy>{596AwNRdALDYfWgc5iU0>iiP8AJ;)##0?|H%V>0i>Srho0x)yu9OO%l;PEEipe zF7ZBl@VhtgmY;mS=5ESMV<2$TZWX-)Mzhtu(x0j~Kkc>kA+t_qfBXZ#SN~McuGhZrC+m^nztuYYg%-VOcrncx1V`px$V)#thXvVQS-=hm6NLnMH&uit!= zGgr^9pMK9z)}uKSda!|@lka#%z4{N@62xEn)`MK*E{M4^Vt?IIZ+`aAfY&wkJ+FIh zeam&+&vCdu_l{q$*Z(1KpZ+WLXFq&H2$L#xEVA$NCbCeEIMhkYIauBXnvc}GU-QB& zLHzzdb_pVNM2^E4P#9ZVpQt~2=1l4|0t{{SVgX{{BDLfByY1Rz33# z_0}JMeA?gIdayqGJKt6R*%_~^zqNk;r@y<7y#71uk7dEL-cY|sxpOTi2pj7^TFFHlPk7K z?O*%bkKyYGG9hvdgXj`O{ggm`cZyq$`~H;AA3k0G>&y4n%FJA?E#la5{_f!9^H#Q+ z>3xi^%d-sN-5PgXLuimh;O3}c0Q*v9IO0xA1MWDJWJe{Z(lAa~B~?-E$R^D_!!$|4;xib|LV1{27;q)QqkftN zAMfVbI^~VCHo?n?5{Je{2d5G8Ql?j_=y%t*aS#AdC&tP@5D{nF(Wv`2eQ`7ZUU62D zb781o8e}=+h8^OnQX2>vTw2cehWJd037mrjCZQr_vUG;~24{UZmW`Ep$^e^ky9bwQ ze47AfWVMF-&(!p^qo3ksfH{cnu4lQS#g&hv;x0Mzh2P^o*Fk&kxHQVS#-kZ-oPqp9 zXMBOQyl{5H9oS@nw5_^R7J3|W4h<&tgCsZN6d0Cw!~;6hPhegGMS~mQ2|vp&sOx=k zg&Fh>HxL0Y104R`q03RyRLX%2;bqegtF$1@XT}UxH4{40%pNIo>REM|{+0vWvdlz0 zD9~V0Ff&Tu%2yXIVZFj(4{^52A(c`BnFoD|?-mhRYM5P3;>V#Ybr`P0--Q5XsO) z+qyo_DM40fgAw%RB(bf#DO2@EUN`#lniudfnULNVxJx!N)}HXE+}_c14GYC6Z0RZd>vYpplDs84#M3 zi<9@Iv1eD}136v6*UiDl?M-|#ovk3Tu@#$p@90gJW5wN?7mBEPfD zR);{W;k(!DUo^?#Z)uZTwC92&^&$FXa-d$LCq`YOB5sYN{M&@ft-f>_e>k(&n?>cM z(dM9!Jf)oS^ro99Y46p)9lQ6|!ykKH-T`;|_=#GXpRcvKS$Kwg^dD3hz$nL`@~5Aa z8PQ$+2smYMN&L8OUpIzx<~1v6kb^SIvqr!fvK%m|ma^IeIt}EsXBA_!RRmg&{!y^E ziCOv?w^RXrh~!vETj!EbV~kP!r+sOBVj^+b@tI?F>eMmdV1H~E*@~<_WCXwGz=j)T z8R$Oo+22&pdD=HO{||jZ)pkUrag_sZ_paHn9P0iS*H*UG6G3fKS7Jbb7yRk#zV_%= zp-!rF%PUnadTY7w$fxQLUr!SDubuAk|MjhUC8-jmMz@|BWfZ+}I-ruz)o zFMaFz;j`o`tGe|K_3vNzZVUb!$Fu6E-u~nDC;;kbGLXh!<2?s@t@i7G?62t|^l^DN zFmSBi`;)zAz<$4;eI9k}OWckB5#}wguNVHucQ#o6&x1tkA4x8$n%4Rc)n|U|J6jUg zJ4n+0`)i(%K{ZT#ZJbi%@ZaQI~$>3oN2)LlXYGstAx|L!o ziRV<(Iy4y1r~!u+io9T=_i&fk|&FeSOLx>Qq>QzQU`NoaiM z)9B!6O->R}gOoe{^i$7gZ=7vv#=HoIhiU6fmg8+;F!t`5%1Evb*-?@;43zNKmYl8I zs)-$w3EmA>3>-F`8N+b+JXahE*K{gso+F~G2FNIa2FgI+Y4R);%!t=^EzK{6d5%=h zt}WCu*E=L<3k%D&xwuZiy;7_5%e6H!P{Rk#sqcRJ)9UJnK{rWJ>+JAH<%2f{aB?ee zZwKgb90>Pxc8a6PhieMYAf+wYOftkR=@S_fI1?!kX|#R}Ebw)S>$Iz3^49SP+ zLKpa|JL2NZ*s_T{#~z&h_V#M+8rrHo<9#G!i#0LQUz20-l)yH+tK$QnOFmupV?yLZ z@T*Hp=&n1E`EqgOh0bJjIkcWZcO2;iJ?gfg&GXI7ei<0KB&`{LXHQ2HNO)iVDpxzE zIv}56M6S!n1e}2h?`bN5ys*J5fhKjVZ_wR>eac!7Kx&ajFNu=4s`JAH+XnIm_`p*G zeIc}gjsqxpF3#CO+Ay#&B6r{=&m4$f_-Zhxe088cKu)lgAQa@eZX!4|Hd)hq_SEE# zodkPR@Ny*I!(2Bp^_ejlCT&UF`PP8NNOuo8+x~0)L0SzgGWy#srt`E-m+|-=BYF0w z|H)9Gg0s-uGCb{#wCRj&*ZycJ%QhYJ@VYZw1_5%i?V#vA0aK3h>c0lpcI`XzGkj79 zC}wFcbE+)C!D&XC_9fLW0o=lt8L+Rft<jK~$b0rBAAFw%2=JHc5RSd;*rTgcH%zgd{S9Gc>W?QvqotEH%Iu ze_?UWHnJ3{d)@wKF=tG-=&LPZ2tcahLzI*7IMj&*ReZ#^B?sPyE-QS?EjN{_t)r7^d4Ai*%fmY z+`*fB>q{${!SY$J4Uz%nc;BI!qSw^L7w^X2G@TlnqR-$jkKH?4=UlQkGx8@6ovbbN z;lL&5gg@e$z6c5lV8jE=+B?tar`)G&@tY(N-@Ubgy`=x!zIlVs`HW1A*7V-p;OjG2 z&YtNP=}Yh^OFY9Qc}SpbKSvx*e)$;tQnq8QO$16Tr7I^w&^>D;K zN-SWqVv=MaoK15m!{wyFABbp8@ieGhg6*_}H;p!VVfI=}Xi*;XBCa zyDZPnm{50MyuZHrTc2Iubp4I!LU(X6HcYbQZ6nC@_y*5qCZsid#93Oo&hIQc&y}9F z@Zh>QD=Yr=3%M$6?E~krGyG*mhk9c<+xK1|9jfEE9;w3*ex&~XU*1(;HOYGB>+7#x zc|9kTx%G|pqM!SJB^1x8*S_~B>aplSU;n4-O;7u&`q0%sMgsO7b?&Erqh9z6)O+S{ z)L;MjjrFH+B%U||C z>pwm3eCS7SAjW}%6L0^qdbJ7I5B){`;`1(0R8ZIGIsOl?%)Nj6AOZV_*VLndseKEt zVViPqY?G&O44Skv+HU=lHwU(l)caoh@3R5Mi~s0%>)Ge4Js?Kez~b-dJAUNfd`_z! z&m{r->3S^X+sv7A_(c7WSN}wPFiGyU_5FYLrh3*nkznw#O#AgEywS`7WKy0u6mr+qu!A&0wd!~WF&{`*PBI)A9~fBKLSr=0t(M3!33Wj z821B{qe;S+m*(n=M^Du!?zq2B9Xb+s>dcCr$YqDScJ73k?uIy0d-nNmrtKOZ8m}n= zS(V=e$K{Mu6XP{OP`tKEfYC9a-mFQSj3cWi5O#K2$53v>km+E&?t|5C#^Fv{lau2R zAmeOXW9h`3%V`K8#7Bf7)&yff3Nc9j_I(o0?)7GtWR`}*b9aCo#Sr*>mWhpP`F)p( zN#8QgOJR<8M_=;X6tp^B?t1>ChaRZA?tHLjNXQ;``6KGPp7vxM%VZK-18fyp92A z!9eQCKQ~x$CrH~9rkifaUz0O=Hw=$VYE+&irt%6LO|W&0CLq4-v?(S{bF=N7C`Uao z`WxsGFzjfSZ;IHI*+y5^aLjYd**Ptv_{h##mCQO3czVs{2^!#a0v^vzI`#D~FExR6 z25JcYiCbRi2;AU_%v^S5xbG6s%r0?5_&Z2OTpGJ;bdBV!zjl+9`8~Y7USpG#+ay?) zMs(X5G2ihb^1i1>-q;2$Btb(m=z}voU8f9nCMv5lvrVsn<26N;(M4o%#&_TV#1VR{ zsJD?jd~Tf?8XB`A8zhXbaSeVua@~?B_)p@b^Pq7jiK4@B8X8^p(h{A9|mEPi7hao6JUYW`WQ7yVur^^W+unzr|z8vqUr3&@1|rgGgb4g9pwoO0zZ;yXb)F5(&!cyoumujZTl&)ZU#nxoao= zSNXw5`bS%K42>$FfjF?Yw%Y(y?~oVzc4ZnJfZs_1waw_~=;&CTJUmmKxs|&8-lKK? z!9DeruN}vK%HJ$BAHsQW2e?@#n%?B zkZ{4f`L%_bTS8u2gXQ~5^Wtr7l~Pe|=ul=Q(e2Ct>yJ2hFwbO4oDJ+-5+y&?HT!eZ zwE^U>4n_0P-Pl%b3Wc+jQT4K-dLP}UY|kzPz6lJv+t0o3ELj9cyZSB%sDxpS?0SgY z>@WJMJfBS4yY}v_M?CtvtTs4(>O?K9EY{-U401*%eLVsFDn1h09c1R!zLEts(n{|QXc-M5VmilM(88Ec1#oFtkqG;WCKW7+F7=hZs#sTe9up~v@sXE$8+mv|M;itI!$Scsn5#lP`&Hb z&VW6lUP6-gZ0;*Nd5|{vk^Z0d;ERNDG5(69C4A9x`VDuu?Rgu-LqGT}yoR4(DNi3C zxaoP{|2nHF2n#s7AhVWMai$oMU1Ni_f>Av-Kc5F_&)v7T&O5NL9`*2x>Vkdy>Ku&3 z6$dY<{Ul*K#wY5WUAyYMU3>DpmB!T|euQ(e8N=aCkc8z2#E6v%!ssZ*gH9fSVLse& zLIlM_YVwe-MDgeL?~d+ReAR@B#L0ly1Zh1!KBPuCt$Mc zjA1my#rC`|OpTKFM|=hiLt;4{s$1hvK#%V}+ck;voFYg^1DBRp;m5i4n5!=)@I9XXS}jRPE?#vg#u1jH5dT^1TQDmocc2?}n)F2y|Bol5|v~BkeT^5+Y6QKtf$PwgX=2090Rt0Puh< zlyM}GYX$<*-!@v_)4eSFpi<=B?bHTKs4L}~EL}#Gt&wqBnPpQBz>E%|$5|c#jEpEn zHtI^#D{*K+2zYQ$9qI*8ZZ|(ZJrQ}Wcb4-odYmzQ^Svx6K;YVk?2$TUkH7-3x+)^F zAch2fxRYp}wSjMW9)h;l2^f|aXKRI^VgBT?TA4phKz5RZg`j|-P#yIF@!sxM&TJSY z$(5#F@Curmqwjs}zuG8+PmL!9!9g=;vX!>M+re2A>LgW^_ponh0p*Xl4~!C^jSw{Z zjGr>l8OTRxgQ#Pob!KHbFBD&$0r%r4YVO#5HFy90b@Gm{){#4IuLr;MxjOR2FZ2ER zI`ow<)S)}?tfTkcS0|1hs=3+IH8($73!TMUCxBfi(b^gU&tdxZ*hmc_12=sbot~<} z@!=Z9mJIk@9l`t{w$#~Im&y7fUuP)?Nn$grNuO0dCJ^DhL5fKOG^kH7vWA8Uz|@V% z9onJa5#$VPaouY!@iQ<<|D_oA=V zx2%Wlv_OV?UIU@lHgfX3YoDbr`Y%q>h|cjvJKFq#@FaR{8Dh&Egj zxw5cQOABkYYu}E{G`Lv~NMe)LYRCSajju8d-M8OMX9gtsPG8`#pO{3-W1kl_DGI-+ zJ4%u`zH0(q8-r6-OS6kLcWS2bO$PY9K6ttZzD;1SH|i*f*?mXX>h=da^`$$P>R�ygv4Y+4|UR z$Lk}v9;pxAa;QG?x%=wYFCD7S-Fdw3Jvv(to}90vr%%+(GIj-9?;xWyH(TYBZckF6t5@YUylX2v_;79#tseTj z-KP=w;0uxkt4`N8W%y425GTqw<4CVaA6B=W;f}8gT=2!Vs#8~7`{=s#+DFuhQ^)G$ z32X_r)0tJ1$My_Xi*3X=8py-&JAKEtU5e|W z5I^unLBVbegF*jnhnUafRvLztsFPiR|+{J>cH2IiOHJ8-YqXI)bV4- ziOs~*_y%2)4*q<#k-kkm($33!XGtM4v(`5}{wCmzgO{z!d;5URP~Z0XWVRhx?Ov0i zzqKt?QOf*O9^%>VOH->a@znK?`heclTj%VcX#e5*?A!iZ{n;&U@^EE+GhpYIKPg6>QCyUU#+_2 zDKDwVo>z7J=Jxyar{7j{S3JG0JCFFZ??`>_AAYue&gZ1+ntJw+yr?eQ0nNm8!JW^_ z?eD4g-P+xRWi~i)|EG2P?NB48@R`B{iFKL-}?Fb z!w*c<6P|Kqjfbs`k6q=D9)+?&M|>WfSX_F0 zN3T!zz3R>Xg0FLShCrNP#iYXoWYG->ux^jIU?;)(YTbYIc&#s=sY#r|85D3LL7Rq) z4nxOxW@3e)YHVb*CJ7qmsGs&|+)l7eg5pfc7=gzcj?ta`GU5a=E+uqy#Vvp>+reO4 z&ki_7a%LxRgw&;S^91LU69ghqC>)oyC8?qVn;>a)+uNqW4cN~5=*(T(Xd-A}y}0NS zv9|P12Ww|`NtZK#^1)}S3~Cm9n3~{P&iQ^b6F-fEmrVXNK(3XZA;`S#_WNq*=Ka5~U?YuYID;GaMu6jNRa*+G(@>I4e9{t!!TB)PxD&j`pw(o# z<8m?DdMH6~biF++>&u?y%PPir1iVe8+<{BnoGHu93$PcFjn6@}0F7%Z3;a>O^1@Nc zHIgRR>s!Y_J+o?*%Z^;|M;gU#LWcrTD+Jjh?Gl3x%L7Y2F@ZMVSX^DMITEfJM`LMw zdEJ?&bpoX0I97re_~i3ReLnA^ZbCC!8^@C+OTe@pAKo_DF<5eUC}+d0E6)r<c3LU16%X*;ImSL%vK| z9U`eP5leHxag^L8oF<}4+BF1Fot>g|hW2Cl?@m+dk&adMa3oWMAwT4y+glr~`2I7W zb+bPj)U@YYAVU7a+vey^*l~=U+ec%7DB@Q9GTG$bfp0y=SAPDyIBJWaj zWe{_jCLKB&Wt7SHVqnpEq?mr zj1Y^5GPFr9wjiYGVYc75-=yDrSYDij(d+7*2une6;{Tb&6R<%H`kswI`00pzFS!7fxywtd0!-zmDjx`&kUZ@#{uM0r5L&qmx2~JcXxrTpub-qQD?SKvX^5A7*y zco`;8H-Ge3X9g^?wlJH)41LpflCObUTU_Rw1QS2Ex$aDubhs1_ohO--?$d`(aJ|3I zzx-m*Zpi?FKz_f&{E4}md0?jY9NbkCdv;|eKn{CkkbqNXAH!$+qx52P^1L#(MEsPv z`~~&+L(9aDu5Hz_yA+a)YGX|NMkd`7e>D76FVqqHYwP!tk6oj__`6KsjkkP0d2w#N zPLSaG%9y_Xu{wNwtxlbqs}3l5ZLYJ>R+eDreMe>ZT?YIlC4(+C)4#U9;Twek8k?LbTNp^f|Erq33)=sJHg zDyu4xeM^dzVbg=QOcKs%qxd9_qOMdzO9=eld5%OK_F=iZYq{<4mA354I)?>3Qp z@-KY!cWa5yk$U$lzpMV_-&m=4`H%cf{pz_Sk=>>_1wDu-R~&U zt?u#M`neye`j!9wj`s7KSJwAk^gH#Z-DjLGfBE0k3m$l3{p!B~*O{?j`nH4BzxAnl z(=&c5n|u7fk7w0u-~F0;j6AsI4fVR$z58FiwE15jlzr!G>X8br%iH+y$iS|Eb|M`A zJbL~nz6O0c@vc|ZYu@~SXWmnO>96V~WS0ZCy|Mn|FTS(x>|XyrkLT2Xc+XGPd7u8x zdga$XFLw2h)o;Jy33c>$UR1yC^Ksqd@|XT~{qnb+7hLSyN8a|s^~(RpGRLR>^54`; z&A^mhn<2e18^i{UD(~5Enrf!Man1OO%iTkr#{b;#yzhG*_vuW5O)(Ubj@6;F zudS@o5&4aw%kxzj{^`k)EY-8)Op^$W5j5Gr3I@YY8ioVRkuV$g$mj;&yL=fV9oX&H z#nfOhJKq^x#KB>t?9?f(;}a){1|< zf%JMh5%zY7gwCZx8S%n@xu8ev5q`h z+i0U-CZ#$)ldqKJw+fJFi}wM`!t7$ZXfj z(o#nGR##T?JF`!rv&}5|+>AJiyFAmm8g#|KfK)aH0iQM_C2y_1g}xE&AZHUb%Ry3f z0EXuQa6`iA6SSXPTCWG@-D-Hf?mV(u51u|#r}@k;uTVKOCN%tWEgrvyyJ4k@pKl_Y5G^L~x~1`;kJ+Ok7%0 zS6Uyi|Hg?0FO#nptVoAER+r+;==1Gaw(f7>ZIZ0I*~H57Lai@#YH{{tEuB7ION%5z zot3Vvpc#ifJTwjseE4?9#UX4!f-vJ>?FPY>vxEqlCW&}4p7}+nnW}`WF=y2RpFxPN0lFp%>{>a!R2GvR`NdHpHC)6;x&=Z5Q2)-l{2F zOHBh-?S}fqXPrKj*<^yUB*G*IKF8FVo3G`WIrQXoE%WKjFY!H7iv;=0bF*3IX`8-8 zcXWI-ZI4Vlo29-xvo(^LM}yYP8iKzVON%zlm&|ID<&`>?cX3G@AInOwOjj22M7H%w zzp@OxCP!^n1{*jX8ga?}G6CpBk|H;>a-d)kyE8K3pu<>j*zBy;GIT5)pQ))`Q#H0@ zGIq_ES37&QiEZtiTB^Cj^pVr(C!eL0GqCGSp66`uHw0Js*k(xZ3-%pn?a(_1&ODSs zJ84OV3E{~2V3ziez=!okH=1&}ABhsCWQp^o&UPI+wO02YS+1`fo~b+Uo2#3@bgVx4 zg`@Sc+YZ%7KY6S^bo1Ty@mue&Tfcm~KJn#4b<0;CtUDfj0Q)&xvulHOY-Sc%bMZHM zcUU(OZ}!84fy5M@Y0oxm7oh>#N(;j_EGt^UPaRKv zeJ_0v*dERR0*ZRtQSBu9PBQNH>o?x`O?B{+OY8ol57yyBU(KT*+CgodbU6T)KFmLL zHjPu?KAzc1{3=d}%koP+Z4+CoE~G!Ve%DLVTqIoJeU7&qOoK5o~%yskq!Gm)52EXctcnYK<5Cq_Dw$| zKF*|>(5Va4=j^HL9(!HtNd*vEoft#$=Zd%oFR$|LKV+0yF>N{Dv1cOcrPSrRzEZnJ z+4Og5>B91N&t4d#B`y+v%JJFWQA;bIs*m3Cg!=iv{Gl4T;~(pu-j?UrTw723iQlcC zdddaB3e|PaO;4}OXKt^L-r3#${F>+1_rK;_YTt)GRrj>I}!~t7=DizoldDz#}kNwC~+3jVRnb}i*PhI|~x^(u=`uN#x?ysrKp8g&61F!w{ zdgc|=szlZKH`O{_-oYt;c-(Pt=e9=kEfCzFIu;zv_Me{55IXo*U{J zPd`{oH@~$$c31Zr$DYSNzn*mY6kQYZ5n{VEc}-7uHLE<~QoOSMQ82 zM1>%r`QcV7gEr_DRPuu!WjU^&)gkJLzpPMKq5)jY?^nM0BhgD8VWxm7=*^{0r{-{Y zdxzbSV=$Xf4EGO{gbmfnxn+_du1`;<(>Xija}HA&@kN}VLvouKOM_pR1-NUWqqqAg zZxHCaugr#>5mVt;2?Dc`0XSibx@Yo}?nv$~O)A(uqj`kF}<0EFv| zj!UIXuAHsP3=nv_TbNG!0Tg|Cv#*|Z<8`%b+Sv*dL^t)&V98XMTH0m%fQ51AT5tA9 zx)*#lAVyYWjeycgC`~|N+2}UcOhlbAav5I|MgnVR9u&NW*qN`E=)ghobMz_3w>ci~ zne4fA(Al;QfkKuda-QIdIx0|}{j!#d0^AKZ$AIo^Ou;p0%q*W76Mic<6A%Lt8IxcJ z{Dq_3T(9k+yiFQ)m=7L)u)gq_+ezqg9Mtba&IT`ekQjaQSu)w@vIBCk(9<)7wyBys zW8tO-?j&Z%cNayMi5d{+84MFYgl__=oE&XaXMMIzPvL73b% zT^QuRuiaBqwRgu*U9e}M_Usz3eN$&@7jf{IpAmQhe^wWlTIWQL&9OiOxEVxcwn*ay zV+^i*S^2h1f-dDw1D#5dLtt zMqQMEm5ryq1II+rB~^pI43&#+x9>9rDp)qC;hH+vHuGo(B>%w&E;s)3?J^t#q6QfK zCfF5+HtN-NQpmw2i|UH7s0AGGA;572U4xX-W(2H*&x1b_1kB;l@fshWuJPUbYjWSY z1l7ApAjfN)fMxFJ9VAwVYL!H5eXT=3T&h)*ar%X`Rt6mgXFflbT|n11Vtb?mv4Wrc zweQ(hJ9M<5&dpH4{Z?L_4YCtl<1M_K*%_JPeT#6_`z8RMOM4Qlb`!YVr+sx6ElgjO z_f}4D=b1m{r!tLP8=t*lQyJJupeSYrF5*a^R^KR-z!JNb!IPk6aszDSWKf@Bzl{PC^A}^pG8+}qa`9)9)*mg z)nvs7T_wY1wAAIAE^Utk42ixA&zFtMR z8}M^|ktFT(GGx&v@U#`$cYVOX_;~F+u&+jUPRQaM(Ub7aU5LQ}d6JUUI(~8u zWQMxkW@L;lCMNb_UtK!B7{0fo=Wo2=fWjn~2-e}ViIC5M<>4p3p&<5R4IVhNqn^XS z=t&YzjCFe@f&*lh?b#pIO&g=`qsv^+<}Eat*)Q)C==*G@ZA(R);Q@aTRaL|-eZ&KR zqSgLuzilgjT90fAVy}5jT}-gO0pIUCd{1>2 z7of8Z?uL4qhMsBDvKyg%hHvV#z9ut+lxrJ>&^JchCVuo{+Xij6`vyC(=VVw`{&@av}!kE+x>7jP;O9Z;_7pZF7aMCdXji; z5nSc3G`R}I^6*dFq#nyN?&n=>(nYzUA+eyp(uRW>m)v+&z36%07WmE9Dr@E8xnJm& z*Er3yzRD5^Qk$fbvY{OME#vRzmqed(-0aP2gwNFNLeA0PSdWullYF%7TeKZia`a#{ z9f@9azcXoIL0Lu#+ssB&ln)%_lh(Nw%=n#tXPqG6MeAA7vu=5QfA+V(G0%WK^;iC- zUfTBiNW0AwHQpr7X^nDMyg3heS{H4DpM1%;#;07Sc<6>)Dm6l?$% ze&v*VulS=6Z#(N`L(Y_Fm`rBeWa8-2<28bWo)Auj$OMZYi?ns`f11|Od9fR zq_DKgz3DvLV^Y&ucj*otaBQT_c)=i(8xd;lxJ+)SrV0Gq@_m^k%}!>rW0IhTONh7_ z!0Vu03g`8yi7^6if~~|UZ3*5mxJ^$uJJw%^Pt7Fo-Z4F%S*Qg9%rQrGFjyu~j{KM% zm&4tJQVICj`a)yh08|e{W9={rM%?5ox}HQxfWO>Z9r@Q z<&0XJMH3I@1fCEb{&U|YldByAuBMnK9xA7ag|mgqKm+SLYUKYK@{>=9j*n)5_Gs|< zsiXDjPkg=>7jdlM?Py=te7Bv%AUI4_O5vWl@Zhyv%}4QyvoH%YKF!vTC}T&9M%Yv1Hp z?VaqaOZNBG?oo6HnZWAkk7>Mdn{|9aEMQYtT1=un(y_VTMpeYgpZsq*WY?B)wWX5& zISL~z1C+cVnm-dEnX7Sfl)b&1&yhp>nSm$4g>vPd$+tYv5oWhW+8>#i$PA+`yJ>*m z4r~NE^|Jwp{6fbJ0CKLO89;|=Q^RGD>TH7#m?zngRvBlfLO5+S)0sO0PmL&nj){Xt z-qCxNNoOvc9LP%A!hd8mK6QX3dq<7!nyQ7Sv$g8vd`SRe*G*i}DXz?>SHnD91m^uz# zT_%XH^rXHt5hUB^BX|DfJ9isiITcyU`J?f(1q#6BQg#ay^8~U@F4_aPJ0G2%uBExt z$Z-QXVn@XXQ1r6clx_JA4{Sl+xXYbK5-8+ii@6UD3B1%<3#c3RU1Tpk;u=Q=O(xRL zVx=-io4MnMI%auJ<8)z%eMr&_615NZgElZ?#YX2@*y>WKqYP)l@OK<0Fp~_y6O$hY zpiE}l5;V%%N5Ipz)VXZRAw3`?PnKrpYaCt;jp5(0Eo<23mH9OOzY+8JvF9+gz{43^M_g9n~FkZQl|^&^)84iDf@?n_s$b`R;d zqNggqrxY-$6l5<6^P|u4kT2o8_*1*t*;cld=77HVTA}wC=n-J8RFB7?7o5(@n?t^a zH{CKe6);xJNvmN$4ewLDTbKJemp1gz^VA4x`7biFQgn#3R+FRqqw$H8R=m;c3FVV` z3*WL_Oxfrda{JLYe|UQxNA9-iR&Z&SQ{GEU3w8Q|qcud~i_Y7TnUWC<+`iqDc{!o8 zMFJcdbw=h)&CV{?j-69AH9kR7HChXuP6Fu-dYVSnO%!CZ34qM913RnWrVY*%ISVF( zM{ru=V4sRX08#5`2V3Uckavf|N!oD}hvnrZlAfKln?TY;wJWx}R%uR;G1w2xk-!lNZ%jp8(Q09ghHOqXb!nmt*czWH;tJi9_*HVj?zrgZ=vruypaoX@;D zBQ%D5OcK?PyhvD_Iai@g1RMe1aHfMlm)!UeyMbCSG0UhKG-uNm0-r7LRF_dlgSaNQST>(H`%EF_(hpmt9Wl8_D6f$_oGNkX<`qOZn> zbrK|IIANVi0tD*BiSp6*^a76rc>K8xL`$PAZ8IG@4lfoEgXi;QN|$=-59iM2Wu#tE zls9PihY!{(G-tu$9HDV|jB+sCWX*R+Wp?O{PQvFp2oT_{<%eBD#&3fOgPqK1AyfNs zwmJu{$+FLL4UF;b+-(8KaBsci@@3@aHE0_iC$R$lfX|fCuk3FQ9JZyp00N}Jkk>Q2 z;$`Hycxom~Rwwb1CSc;CZus6eS993Dn|qAov&3B<`66v+xbj>pcqgDf1HV`7?_0I7 zLgF&ohc?LxZ&?8XWg+dzXhMJQ6#OPFXd^*vgD zH%UP5YMrZd=w~i-+suonEhle+b~nzTC5?&KwC=QJ8_`Yrhy6rdY<=5u%1l1k_q0>^ zKiZ4kL6!sl2Do;5cx<{Zd+g)t;ANNA^0Cu(+1A+>pz2o!sKGQ5$E~_;Es-t*PfmGYO%9i$B*3)8|c%N)5qB#GH3_Shp^Lm z9gb~rPco(5B+fy46IOk%_!|e{DeBoTdVbw_{iEWSLn0sLEPfucf$I4Vt>7L`bF#LsY^GMvZ)4}WH*6MxFl`w7sMzhncq^@Voy+A%KawJS3z+7J~d;mK2R>n7GI zCJofJ9SWqZ|FvY$K{L*6%X{7tA5R1UK3hlMQa}IV|Mq`AAN5RkOT3}s4otp6dZ1F* zu9$<1X_6y+@bDV#QIkfv7N&}O_h(c4;1YWI*#==^(R-A0gxak5vBA&?)Z7hNbO(Sv z9_QQNv}YePHV%uVT^{olz623(aN0%D!}g7lA8NlHw$o^9?KeDfn)bY$8MPj{`oS)P znk|7BO<4a*?jF*gBcR)PZxX}fA#QYiEVwvO)A#Z}{LuFNGQlB=HLg>^SV-jD>6w~4 za;TN)LjpECzf2N_Goo|YF*fN$&KwPn4b{ZRSOWH?HHS<%qaiRrxQl+<(d zYI&_gz44kJcRf9U{i(Sa*YWYuTEYl8>aT;Im?8ngap_=P8t4@I(lSmCL1@feQh922 zKC>fsjsv@PVI+oXesKwG!5ibS)-^r`-OH;T9L6xo-xLYhQIfsQdg7xWN%GO&edYG{ zD$nfP9Q<~6h{P6$?#NO$&%pl~M2NF;RUwv^)@q7CWC_>{@Ibumd}ve~UD9B|!x56L z1c978>y+ob;FF4=QB;vkjMuqt52O(uV|+_~KSFV&eDNm%#VQG9mdSaj)%+VJ*&o9QpIn@; zTWCYQTy$;+x-mA~W)HJFB6NUx3_zQu;0E)EJRN@+VU(Csg8j>i75TLB@B&^36!Bp$J!h{Jcg!Prw%lv z93Mww4O-fgu{J~DGh;eM1F1Y)qC9L9XX@_+AmG~!KDa`Qa`CqTto^9BA&E1dlAj&q zNWi2!&I_C%hjPkQz7v2Nm=P=`V505@_GW{mmfF#YT%@i6fJvD@eeJ}cK|Olya|bRb z%jhHJX)1xWZ5U`~h6!X$d^0Oy;sgGfHI)|b>54>H++6;nJWx~W7<|G9c#;DgWVgEH zeU}D_kb#~y4GTp7gr{4`pKoo60Z^M=g;#vrp7l-W5}W|G1-hI^9y$~M_nvUk6HC#c zhTn~13{2b7)aKBXX%a*T2o1F3wKzP!B~Kg^fKtw6I9sr*d%(>S#bClU`;Yvlnsvk? zu)RlF-+Si0_8)CwCme7xnK(-WNc3hvV$spH5odj1US^*uXFc1@b7GWhHUawRXW}cL z)zkj*k=pXvu2_Y-%2q&<6N}*wsh{uo_a8iz;-P=BW`YEBf-Tsh6k~K zE*taNF?@l#FRQZbN=J*6Ht)A3aA_VT8H`|LI>6mDx&dt-5L%MYMBgUGvf(uH&Ej zNS*k|C#cs8>YLtZcaRc%?)F{4W*c_0boEicJ2Jkj+1Ry3?4$!^@F{vJD(DgNutfvO zwsDZjOVc}->)DP2DG698Ni*nX+Yyle;HPxCq#3)K{w3s|4U%q<0#*h&Dd)XtL+B8O zRz|t0+w@)gU0}dR@ZCE5TYA+k>q%!QXt4N>u5zvEn=()q&g`l04pNNPzKbret8aV) zl?Utekq2t=#L-AdfM_@R;7p#up@TudwU5vyT#Ak=AL&uQ`43*uGW-$0#>duYER$6V zv~9oAC$*h8wdwdRah4yx0)unQsuFIdCa*H+3XJqj@Xc`QSv9Ws5 z_r0jDy!2u5Ln&wlU}Z2#nj({CqqvZ^JxM8Xm#3V2gcf+$N;F8G$eRX3+M3Sg5(Tn6 zJG|AFG+1YsHnu9@0!+@mFPvP??=C#?;?MY_U2lAD&#rUN%4rn5Ez+}x0tkKWX!_m! zQyqFs{p|Ps-xIL6y!s|$Z_a@kTTl6b*G`KfApH`-+)p`+a}sh zQImqEFw~*bIz!{kkjn&ZWN~pR@A}fnX~ulv?eK)7-P;+tIX$=3mXjd>w+c7ZciUx& zRbX^Wf}5?HoFpk(UTs3-w@mQ5%O@Q*9fIho$%!OvE_w5Lv|)^a>)TzXHado5C*iUq zuaPM2B%#w#FGGu4kNbR^0gefyGhV{mjUn-QB%Oy$Gr)DUQ=!R7mqt2!HH~4o_vq0$ zh8wQE8vNZ1q(es~V8ZasonDMm+L1b|E7){`N41xKqvJlmFwlM97#Fzib6+l-a<{$> zoU(88AHe}-JvU|Yj1!etk%rUT)bG%ns5N-O+nzG0tQ*bZm4y z`ruNxbZYKtyhjOUoXuK<_n-g5Z8cBA>2Hkdv78K%G;(T$3@J?grtfB#EmOD_^5qL-DOvYX2Xm{~>1nG5$ zri>QSR=U1HitWZ3+Y5WVcXo6rL4*mhPQuYzNB&&KF-f3){*Li-XW0GYTeW-2QN*p9 z8pAmaX{^u@lMQzSqg{=Yfq4uyZK!i`X7F@lmG%t=IbwvohwL+B#5HHCmQF2Z25XGq zRNPHWEEm4;t>bh=&o+IwC-Bid15Y<0FbK#@r2M9jy7Vf+0S?@U_mk+^8vnEfLlfg% zbJQOLgDm8UHo?R1-ZCO*-ISp-PWEw^AiBkRb7J;0aH5aIV0X(U=o#3mwdMI3{ygg? zuectku#M~t!0D6HW}P$iA7>eyDYLxr#8V?H&)Tvf4mxxUBHzl-`oSAo#n=DkK@Ps1 zwMvr7pMiR_tlYBy61CcA++E86Jc%Q9TGAc~htKZl7seUf@!Rv3Y;dl;`O0%l;s&hr zv0Q98q%KDi1^&FNJ+o~KWw|4;^PGqUsgr<9@Tm`t^c!b_)hVCrkoSQB9#W?~f|_)J zu6pQDKAX;hFSi zCd@=py|A9VNrJ83s%P*9d1w#Z5XEKkJ`1$Eyo8-!3XK{MlMij+=GrRlorw?FB-!dm z5Ae$Lkt!(tw;tIGTUuUj1B1ADT zsBZ%gI}aSJ7ytNA*5CfYo9gI&U&4O5WUMVAR`$`QhHY?3vgI%S%SKj~p--H_*UKOI z)Eo6x7xaPsyARZ5&-<=Aek%!>GhpyG`pG>CQOB~))*=}AIPXqWovx+RV=}lI^k|)5S0=xes6oVjnG(0)$um`*@Hck*OycIbc5AoF776Z`Z8^z^@Tq$JzYQW!{1v6_U;Kh?WkPQ1~t3GFX#{A9?;N|JUIt0 z5|(lg9pV%i9H|B`nyqjB-Qucwc*41=6nh;w@Pgl&4Y3ZFEo-^xParp1bKPGm8AtQg zg7I!Ul#aV@8;kUkG2=@IzcLdQynw~WYC_hJc?jn$Ey1OgPd~67zquJXQlt%>+Sjen zj`%5Q{_p}iLKg+MIRj4Ao=^8J`$nFx067O9)EFI4Z}v^Q=63>P z`9vRdd2nVEqz!y~fqwL!-_At!l4uY0Pdxms?Ke@*tPyP~zaHA&mxmdYfar{90@Hh~ zKN_Gxd+ZW?0jIpvPFv&Plx@SOO%j>S1(G6df`P07>~KqpdnCN?*WsW2u;`cAK4mJLY@JOVUkS0ayp}s=cFlvs(#kr0rfPX{vrggLX0f&N z{9eG$`))bdqM`yvO<3h);7()wa|s}XfrI=|*3DKa^CYWabMUfj>f2xX^7@P4{hgY* z-|fASu)&)G@5&7h(+8X5S2hx(Eah;M6@3nWidU{J`icAx-P|L+tceRRuLDnhZXN#A zKi0}uKA$92=-NR0N9!93Ono;Q^?5bmx>1ApaPAUB1cA>o0dpX**#U7f2-g6cO56iZ2}wMB0uvr1d9SrX3SID2Dg;5;8N2w5 zm_c!S6-c`;o}2W=3`{_$Nt8O@?2h;Y33^S?EN6RO*Z%rky1FmFT4Lr0y~K9xnBG-O zi!-$}KMzZr4#ZcBCiQLGx-B8>k1k7K1{uN4K5WcDHGUiOX`|2sXfRHInA&r}{`$d} zy*RHrYDtpfr9QaFz}cAm7YMxTT@nqCCRfkY`*z-BB}LtH&HyQplo4JI3k0~ddm4^& zZbIq>8tN7f4WhzNK{T2;EGBGm0;zV-I$THr+P?a;@qw$YsP399x{`L9hDCjaL;cs%*X zet&y~fOFj~eAl;XilnEFyyBE8_;ruDkPfz8ci(@q`st8C$c8ZzzTkHZXXcEIvsu2~ z-&v_m1Ac7X#2CrW!a{;t6=rO5vV8Hf&fo2(HK2ATH>Gg2bj@W2FxTK!K3}|Vf0jDd zq%W)N)a=p%v`U-;^qHU$61bJjb{yEd7w5NHC+8QyceoDj+f{SRi*|sn zM^hH&mulzKWS$pt#4=0lToyO#HuD%0-_nlrG&pr+&frNSrBDpoOg1%6b2Bqpil-yL z_rc>Nj^lORHCN!soCR91WgPx0L7}`oV-f@2x)I^IJkV{{{ftkLi~!f24Hfp%N~b19 z#~XdF-^XZW_6MdY+i`;6W$O|MyL+88S8Fbx0VnY^z)R4EA#{mV3_bib7#)C4m2DdO zO?GBx=iu=Q0slxg^jHATA$mt1zC~6hJ#yTnSgp#6Ilp2(*qsgDel!vji;2 z#SJBtgNbdPJp&i@DN6vscd4@)r{yzRBfwPg?Ie@qB=zX8iIYn+Jw~9%T@-a>^3~;u zPWii>Hoc1@BaGpr#tmpRl6RaX5L0fzCt+zbgy4l<*q*#I88&%c_daqqpoqNTS)fyv zpR~7KyGQzK?=&huzDi=|PK)UI5PZea#Ytl}*XRo{BJhKg$Y4;EzlTmsM}Fe|W3_Al zp1gcj1@L-|HF&hypKW-A##yh6lk|ymZ@0W`tN?FU=*Q#JQ`K2qsxjXgro7M%d8S^t z{4h%-&~W>o39tPn#*FJaYx}IbzsY}R@mf+T#>m~}j0U&%03A4d%`7|p$nx3;lk#;U z+GDrhUvnpqp&Rxm@CJxGO=|78@mT73{|K~b{XuC9J0(#us_@W1XGTpjThbvxm1$wxrK8q_qLthMI_uKjo4kbv)2QacmeE?T~_Kuz-R=<+Ca5KSC z_h`wdhP&CJG?TV%UF^hNJ!lDoW#qkW`;3zCqz#u880vMFT+_EiBndM|(1gzPCvK=` z;we0ZB>%PT2C)emm5(zDR2(9CP9jD9JdXqYV&*KVyWiQS*X+XrZHYP9V`4#@9qkn+W1+R*mtZ^i zM1ZV3Gtx;t5!+N<=mYxqBz`1QkO)t(=k(v%g>@3E^}JYkX<@lKoxWP6o%zl-37AU< zS6U(l4;S1@AFgLcC7Ao&J4ZjE*B9=(gxlTlOfo&x<(5>y4M%}V3bLG&YuS9lojt>| z^}6D5Pp)Ua=sW7q{_E>&=Ft63#b_gmQ4aZnEGQ2+1>EQ&;qvI~Q}-#=wS$3cecN_M z6j_X&dqquL_l!FEsrOg^$=lIi?+r&s<+*($fsw5{`x_XPQCIlWPYe!EViVknkwo|m z`j9q7$R(m<=uM+t-bA0i|iaS@&EZJ&E< z{W<7)uB_1~2WFhbvCp_$v$T?yz#jFJ#v#R|MSs+2u)g><4hNy=xC06D(Q_N2HF-*( zMVo4D_rALR>z-Q!_?*)ZK3HqM7Grf8`++@lKok2WhT$c(g(Z!)Cm*%>4nBr1OM<&` zz-HIZx91sKKgfn8+6`o{&(;1IXeuvpk52K?re_&Fe|f$Ml6>wyt3d2@&|yMl*(6_7 zH|R|N7D4)~D~o(C+wJ8|ntb+ab@p^EFD-^+%E0IMUB;am1m#J;O2SMF?oOO%VBuSq zzEds8N^aowK-6&cil?x$?A~b~)vGWjq>g6p((-+kgS|>D$1`E+@{`Lv_FxzDom0 zhMvG^{{?5tOH;H@r4&QpH+mY9;-CKCel~bPthF8f3pv2mH+`to=&Ot~?Q>n;fOS@x zrEtToRa2)ZWHk;!H@+$lafC+x3vJ+nDy5K#PWa0;+qF*5pL*^Q_E9eb_#C!nY}4y2 z{5&f+<-;ZFc%dDZvyNp`h5~Ki2hE9>TP^I@NdG_x{@UECKSs>M{X6!K#5d zcb9M?=T7acuY2reH9Xc|_uYTI_HxfrjhThT?C@v8FiP?<2!RI2F4I7VqkIN~qhrI> zAxUvILWAJav(;>X;kN5bBxpNGcn0dk$&(}i!?goLC6bE^9g?{1x_JM-nwuwq!p^Rl zh&WOR($3ywNeGQCCu!@e^GU!~);e|k_=(K)?BBPyI<#dn<4nvL#zeeSO%tmrU^pY@ z4r3Y|P2uQ-?>QTfk#iZNoND&VcZ>}spimDrU@rg5izR{O3!a_*TUptv$3EgR@PRkr zs^AofN$6T<8D5z%5*W~yZpuL489PUBojpJ^Yn=ecq{$H?XPUAL7P4>|OM-Uz?<~sf z+&oThu%>pwGmz3K=RtX3`O%Rp19@hU;#&MDtO^Dk6A?G>u+AL#iKk0AUG}I_=>U?@ z5cI|~kj1!z8ViGofi~qqnktd~IVj8=#nII;GA^L@~jU&j>W~SurI(3wfv&qVNjo?B0OiGl84t!zmf$Hn5)rI?a*25pR zug<@4vJOse)$U<}N1VH~CRpagWn9jLWf=>wZA&9`{DEV&llr4m6Z97xGI!$YHByw* zFu4JafvJhEGY2l&Xh}PP6G@CC@ryGHHMx5-ORI#P_ah;zJeUqYq|oHb=VaOlH!|e9 z0YXc%nqx7Mvt5I>%%o7S1>fixPTVc#1?D@#93js0iQp6`O?~BaW^1KpjvcMetV$k8GfsKa&9Nzvh4FYH(LkHCg*St>u; z2rt)^vHprg_o^p7tDgRxXVjnn`mfgFsgw8>XC6$@94yo7OLOyCFi0kvG6Zfk27a2X zyG%Z#?%>vfNP`7&->k{~SJmW2H`eU!|6FG}N3nPCndHb>{0*OL0#*iF&{=0(d>Os+ zPrm?{Z1Ycf2PaK5H`f-y!#<*}wE3LM*?vm%<5^Ma?-3$G}_X{ z*Bn4s4{7ru*wAkR<&jRR{x%#u#NG2?9vZnw_0+TB?%{opBy5}~kpPci#VwaOik}*& zJiLAuw)j}rI-F`dgm0YHlTmmSyjz<+z6mEQ6C^ftt1sdjfan$Xx@BQiXO&B7fCL;p8-wEH=3K=daSm-hkDR(^d9BC#^-Bk^cbW7lVv!fN46m<(LcZStGS&2JlFPECVC=Ym37Yj)nLh|zDvLPRrqfL6oL@)hZ>#6 zu#r?OZw%I@7o1;@xa44sPma_*_uQK`z6QlU*X4ViT>oz1#d&1o=)NDf?9$nWt< zoH&lnEz?JFt~yKu361C6;(Sez1h}lrQAv3+zJkK6$h;U-7!5;8~vL#e{vo;W3>eya>5r_w&grqH90mxQb4c;y>1?&pZ5Xl ztSyHjj!L1GF%GW1b(0V|JnTck8YCEP@a>G6o04>#E#X_$b9ve9@@ifF@QZ8jj`1X& z?(*X?Kfh4RB$7#}_*2Mnz|_=fIBPRN0-7K(%IRzm?OW8Ic0K#lUCtV-pfLvp51dW0c-ja(95V7U}&baafw7e@xqGApR#i&B#G zaLqtMCG*`_frlX#hHbgiTwaz)31N9#nYKO zmy&9@+k56rbej>f=h=ZZ*yAKw8qpPJulV+%c+jL?`*wMwyf@Lzu1w(LOcw~4qYElB z^Inp}4S3Bp-zz4cHInXZxoIMXZo2Ua0?G9(3&Q}pgvo&GN>evsGfI)9Yz_Fpy zYhs~(H5Vupu(f%A^u7g6o4uu5{?=zDSXb`YPYa}N{^V;Oo*yx(A<#vZeeh{$WGww; z8@r>u0SdS^Uf5KeC%_$b*2ZT5fq&AeebJ9-$J>_Q{Id-jwQo_m;R?ScKpk*oRi0&O zn1Aq6{KHduq%DNsI@PvJ(dPK$o&#Av)3Vyxs7>s)?=rFt<>PLIgBi2ZCt!O<@I~5N z0A$z5ZS>FC2-;qzA39^@hCs`}n!zV6&6!v&)CtbrJjoqR=a%p#$b5@HyC1%~{3q{1 z!#3zse65Ol=!QM&Xj^)zOwcuCIyQ>`!iT9g_NC0YqEFjrR_QY)N7@T?driH7CSWVO zwnR+4u~+hjpgM_$dI}@XoLS*F^eLmRKDj0S#ZP{Aee<)vrQZ6hzfub`r(nD|YYUZw zfiwC*0@D%&c~8F+uGjrT$KzABoneErl+%XLpA`;tPVBzC_FVgvI{BIR;-?=37CxZc zzmygKz|X`;1*SeQz?iGpZ1s$D`}gq3bo$K3`ckgt2e_Cx^ym~;f*ISEvEX3ZEvua_SC?ZZ{a!Ml~CuJ@7^XC~%|6 z21orR3HP4x{g#WIw0fbruXbI0bzOGd*VicgICk${#8t)!?*3@ZVRAufbr#$+K!tBf zaBRPUXR%e_Wa4c54o;-M+wtI8p1(z}TxAfyf;{Zc;+vF4Kp?Fz&=r&xHac08J9gH>{9G+9o@{&qKL^c}X?8gV zy7Wj`W;kV;IPl#PHObL_;-B4kC-Rp@{Xb>lg9B)iZ7c#B_0(s7OMT;$9*mjyW5CI4&JdibV3xH&uHJuP~U_Ver^&BD!6WN!)sgnH$LbGB7! z;74HdpSmt1q$T%3Ae2i`D)wq}h+MZ|dP0f4m5jJUbnjdQGNi6UPO5CNMNyP^1dC`Pk+oo8SxM+>c{``Oa0LACeE@H z`kMN!)A3uIs{OO&rX%^Lo!~+_V+$+gil<#(g*W_VnWuO8Z5z2yn}Fh~dPFJ7$~|Q- zezZGz?jv63(!yk?8zc=Pr$b!skVx#r_%)(CE6a2g6Ca2n=v*bha|zbm>|C3jqEmDh z7Ba)rIem~VNOTm{axO#B0sG#hO>j}+R#q01G-)(e zak%Q9MoOo(hC|-ybTVVLvM^uUoBfZ&d{PmRU>H8L8FTvw23XK^_^QO`0G zjzP{Q2zF3(vCTSAmwS0>Hn^z+&d8zJ;N3cxGi9w)*;&CIy8LC^&T4r$(*+99Z(y&( z(V+QaW_R_}DcY8DkjE}xaygkek(2;axgov2uT3@;UNPYUthw5{8o~#G&S*V$X z{yH?TLFO}zZeTRrc0SLmf!gTAXwxm)QpOIN=wO|36c3%Fvmgq^axUc)uNB|*$M5O= zdu#E;e757>ea@cDO1Wu<33YoG109EUN9B9Z5XoDtNHC(J8+<_58%YEBdAJk)Qk7cZ*k_>BebmmjK+HZ1 z;>s`bu|4b2w)nOh(O=PNkYHu z^SQH&)j2s|bNGhExy1~=&7EAT*_jSW(|RqV^XmkuSftt-9IO86{WY@xU=8ftU!!|2 ztcm>(ue*<(tOsWMYGveLomksZM>fu>QzMtv$<6)s;V&Gk4}JK{_0i8As!x6CRNZpt zOnu?r`MUGa$-4j4a<*+>z-RcL%RDqrOBqzsu)voL{*a(#;72}!zZ}rH_v~)`F7{=8 zb+J}D%k+_zTH~`4U&6KJB|gjem$q`mq|WlT=0KvpNQN5l8c>5qt|=pDJlo8tZE7#H z?GbxTTy!c|+;O!23j&XuxWbHFS?6}Bw)!oDI0 zxNqXvPg|`vaJWK&=w_q2(Joxuji2#%d_=^;ZvubqgK)hMKJw1QHGD1Yntd3O_)l7s zRPfJ!tFJWOivEk2_sT&&;eofx4HWN-TRY^N<zDo3G>d-IMp@ z`JAAz&kl_C>RL^ZwlBVsgZ&#{0A2D_-`gbGwSD$6aBcGOoR&G49{DXD))8mz%!cub z`U?pCV>p|-a1q(1&+>7=E(4RcCSNFLodlPh#8%Om{$p%vG|LX>W=_&yPmmm$yeR-_ zYkuAD=r?twAkUbkX>AGk(55q*u`|-hHNRueI5zRc4sOVmw2yCe*XL_)dQ6?ae?PGZ zzCl?~JT?Xp!q4q2xf56IN@ZnnIPnn2Pd_1>IWWg8rrP;XO-@@`9)hR1h zUH(%>y--#BB*Bos@>Q7PAshht?O)0RN;xIb%b!8 zCm(E2{G$8PDPpajhftzxR^wtj7soK7>1XfoUJoYp^k`{>O1^Nh@ZIa}9@hmydHr9S zX_tZB+7YH#+V4hZXtG)`GsH^OhiABU$8a(_R70iFeXkM@$AIi{D&U?w1 zdXS>x88!*Diz64(r~E@nnx7PgZMO5?5!eC@mj0$$mC2Kodx%zXv@uyIE*=9rE`03k zG}b=M5&D)L|z^Vch^bA)=0Vr2DWSQ^yvhbVHo8d9q+?IojJ2g!o@vDkJj2ukV%w* z*EUYf>2a42`aUL=-A---<~s8z3`v(P8TGv?_%~mCc_yRkI*!H=mDuGM8mj6u3G|_9 zoF_?LW^8a4Yb0!$xdX?%4+iGxV3!Dx6HIYztgd8>{?)m;DAC~9WCH0JC(5tcE+-?S zj^u0;t5uv6qzCQ4+)g{G2#P)_A{#M-vq zvYsa3Au@qaF3(BgW^$r-+8zZnib%r-r8*>aVvXe7XVAo5e)VLN4$*){H{?nJUU_Ai zt^)h5a}i#iwE{;SX=no%L1-9b9Ql!15AaHG%(+1#$hD(OSC$6yNz%&A-cq&{p?Gf@ z*^2PNg-gLThP?|TMonD(gBO{7q?V4SZNfphwA*OOtPwD>)RL$T>K)hxU3F%m=NX}67W)&Egbz29(-6^(VncTR z3^W%L6sCOp2t0PiZ_C(5_a0aHgD&{)nOfWQS{Ut~!Csbz$O5j(SNZLEMx}$H=yTqM zP32s)UGG~q&s2(+ID1{WNl(s!Prc?yfdTKdrvS1xM}PqfJy#}tyFI-dN4OD;I|{my zl73+gyS~Y_HSFQq5;k&vxz_n~PA}COiPrqF89t|K=`^}MGgqAjWA~ zIo_7l8u-c!^;7$0K&j&&g8wbxZV3~z;X9ntrfjW;#|}RD3}betLqB|%mjg&XqtkR* zdj(AU2z^q$Xu(XE|9mtIdG;&iwIzPKzM?BXuOGPfx|-N~pzi(HKjXfZVo%gD2MvTP zOgd}&p-1$DKj{cPDsYUDpKf2sdElH$43AVpsY`u&O%x; z`UKvNG|KdW zUf1Vn|E8vPrs;WiIo#|HyvA>N+F}dw5fAUheu+y8h*OhlfLM<6wj{IJpIqkS;F%|0 z7bp9uJDfi8>z-KC(=JnQzT8%Nl>%8Z_)q!d<8Ac2$D_s+@Zz4l5v^teITzn{fimh6 z-@tABQcrsLtGdESvEb6{!y(ffUgl%noLk20{^N%5TB1Z9K3?;F8{BAh{4GwhGJYdh zTirb8B`nGWClIl%hGWB19Hlj~;I{}-8k{ZbnZU%0@BG&e@Atli8N6&$B?LY-8a1rsn~yl8HEHd_@?&{<)TP049%&~wM)=kfsyu1D%YA;SUFk>Evu-Qr(dZUjzO5hz zwB6_fwxxS~xZnvtfKM{8AHb2WQnZ*TyLkt*BI>9w6xxT(ky>SwZsd6jQPN$P)cq0Ux^9ze%TxKsc zmeAQhIGj$tLSmQ^ON{E!XnWSoBZ>ymCO?j>ca}PNzRUODjFK=p^J5@uN7iZi-X0yf z!Rz#%{nbA@42>t#)~ORm^Fru{UG=D%*g1*e7|cc#iv$`26fpSK@f!%)F;tMD7=A=7 zu879b*G=HdZ#Vdu7b^HJ{QEp$1ia#nU`WP>^o9F&gFXRI3k*opmxg2) zI{AWbnmFcJ9b|C&*!^|*?z{5Lq_09S6$CM07^oY7591U~g8DKzk>}plHRw9)p_<-1 zSqFCRtaJBH)x!>q)OounYWH5>_2=scw=sguqJ<9UL@Jkfj<{EpwWuF^O ze|A>;44*#aGBi9@gHzbxsi_(s--XWYsiE=l8g-MV5$>h$6a0a{eX%)zdD8eJ2b4kB zz?c2^EpK^iomg0}M_zed-FN8zy5$p}st3P(3xupiC;T(%jNGgSzx!iD1%jqY3-HxR z2ih#}h`;S`by%Yt$%pquhyBBnbd1~;m3BtA#0=kINOX& zT(&C=K5cfW&3;8Uky~WQZm}*n78}wEcmp-dP#j~Tlrza zJ3KVbZ)zdK1UP(LLE+3!mf52F(&9!hy%$X3f z9niF2QknuunrxVVZ6Hvdw$&-Ih2F3ZrQA@*`)+==(OFF**8*AXfIMolvWopX_o?eM z=*C9slS|*Ul|ED31}EiX)5p;rQ;Dxu@YBoKT@ltgwgEB_0L~f8tMl5)48q~pL}3d) zqan0wBB~v2<&=@LT+R^Y*)(Di`;tg{KLeng3(Hj*JNECYA9&dh)kOD|D%u`3!{k{U zlw&&=WBUvI(iX<9H-7XIir&#;3QN*-yM)fF1Hh0c{MKId>If(LXyLP!WGZ;@r|)e& zRC}szeyFZsJv13o+5T&Q0uw%YX5X<6;t3=V2aWvIX4m8=^!5O9Sk8L3r>)<<`StaJ zpL<6=?N>fpFTGxJx<0_h`4+dtz0?z5Sn#h7d8X~iJ<0`3%JhEApVSwQIERNJ2!6?> zZr#9YI?=6`-;FoYpuMDYS598HQtX_tVM3OSrjF3%zl~7dqO=tl>Ry-EmbKj;cY1bP zpZCzwaJ8N~r)vp*x#|(%4F}ueN^bz=A-*^I1h1?%wY9?FVxvP`EZ5p{FhL{WeanS! zlpEM_(c@kxp$6VIrh#$!pEFNWqmv|GtC{V|lEC99Nwzw53PUrua5{#|U~hGW;2eN! zBu5%SXISPJ-4SOyJHNTvg&oO2L4`J`B$@^B_N-Cc;<&Ak_v4O!erp7MiL4IM071j! z?32P%5mpI;EtlzP7`#j}mS=M|-PFJx4p-B`4XoY1+V=rzvC{EyqS?KVgwiEm8b7zr zUG6M`b^CKEp`F8>5;qA(9I2Alm4$iiw1yf5aK^`FjjOA*wloVZ19i^%7uDqSbY_OK zi33oaVKAsSNH;NamdM#YmmH1|>B=(+(zQq~ivEX|{%n*i8OmMX%NmVg|wS6&f?kR*GAh7)O;zpe;OH!+R?2aSyLy0 zJF@C5&ez=RDcUe_gI@8aytBnRtn>k$8Tysk89-%QV3`1nwUv!JaeATde&9rX@vh_b z>D!OhZTHOAkt3^hV#&Z7evoVqj1AWED!NFrJ-uftJGpg^&)1&w_tp3=`hRAQH)?Ep zGPIlUyE~&w8LpRc7^t^;@R^h~YN#yTHgH?Y3s?zp~B%@4W=E?I7hKD)DE z|JXE%)D8mmJvF@J+?qb;;Wc^DBWm=L$J8!osvhyg+WW{S)}F_FeeHkr6Y5+(=keKh zHTNENZSA`7(%QN2f|}gDp9Ft8y5)>>OS;f!coCVvPx+7~N3bXfllsU#2bCWA$ZP7< ze5Y=^^RBw<*4ygzJzs!lo%D_L9s4c)Q5ew!0&@LNbQp-SQ}Vy72UMhNOWbwx2KsIg zATDkMlVwv}&rA^Y6Q~H6Pi&L+*+5;qx71b7HH>_)RA`qf`jkI6PC?nwAemn89vcHI}X=8T3=Py zTS9K4nZqKx4%X(}@#AP)d%z3L$ZOC9oImf|uTn?& z)`wrhbTf?f0bn&Q_(L7AJx}eE%{R*LHp7I>(xh;)1Kd|;K9|=_LJ&-Q*&bhz!j(ss zmtKmf&v*@RGV#)oavvKjuHqEFs5j7k!6jGLQ=ax6`0?#J_0_v;VeTlg!D4)&{yqGK z&fa&k@5m+u2LY}lMH3bNT!qjQCF#kPT^}s%{Ng*BA6)E<(ivS)XDsMl0rJDL!4=)vd;U3f)8if+IZ63h z{(7O2nDg+6`kB3?{pi1c76Z2=Xg1+F?b?@YT73DJL;V!r^cVTT?^vBwl;4&VPJ@;H zKwF>xombSW{^PrA;z`f0%cdLt8Tjs&>HG9=*3W<6f2g~z_~v@_xzi0_^g)ia{;!Oc zEx$!bT<8Z$hEpbh_-7q35I3&LZ;$3v`s&!H{=D9E%ZVDi;_3CYYjz^*Mo;sFf)KZc zd*Ti5drjEtR+ec7D}gpTq}gVodjM%IrV1s+slSfB{YUEiU-j;qx%^r6xbqZ>1#E;* zz&C!z2l6@k_E*$PUi0pnzxQ}_e)a%$vGGPY+^3%H_4Kn1lBIIm&M9B^6|oNgBNDI^N86Bg zt~GuJV{i~=)BAy454-+#J%Jd^Y7l(OJef`H-MP2sv(w*7tt`7FYQEO!go`E`1fU6g zA$$!-=exOFKD9yevqHdTa?>7q2RV`8#2uo1E^7m)pPiuylzc}Qt%q4zegzXeTuX0Y zHa0qzfYecU@eEALd-x2L0kR{t&TPn}Nq1`O8lQENMMs#Xr*~#{FV9kOI9hAsX7D*UmBA@GP*Y>(T;eR6EN{;gK_987bg;k}RB#yvb%S zHi#an+`{iI!IEBKi--4oW=hyC(1J#J4lZ1bj)fNh>*3dQr9DrVPR^g5W-X)sw%}o{ zMspk{IxjqVC!DYY1Eisg!}F)-d~1L$>$!$BGX<8xu=dKEsLG2Z&^lqRuXdJdaqcvA z4JO1uCk`KIS|_irroY$+Nq|h^)HUJoE1f*&d@E~T<~_f#QuiL3udjS{w!U!tT-|eQ zsqQ^WFup!g<2%P|eignU!@cM2ihdfDyOec;@=WKcGMx&~u1QChESr*hXd;48xmiY5Lbin&|y&2RPcTlrV zjIy+d1MRlcb{_poz)iU>Jn85?b7!C5gsvlBtRrS%geP)0<|(rGUYP8Q!^w@ z^R?lU@A>5>CfSL);gcaUT*Vn5o9 zkMb~?vai{91mLqs!$WR?-t2|^OUqnWXHBR~9>gU$Aae(BHrCzl+?krzr!&hV9h6hb ze$KcO#Cx$P2G72S4_-t2fG=5hSuikt?kOX*CKdUXu29OUI%1!1o61-|A82iDZP$TE z-cY-DOw^q>e-hj84wcq{seX@FyQc#{}4cKt%u^IU3zai1S8c`hIW# zRv@b=h@KtOxJ;YMprS{yaObyc}Rj@&$p>QIPS^!ELYWFXfBD zrMj3^L$uMhf%lON+mTjrX*00W8Jh!4Z)rEfBXM;$QyrDLl<&>fX*Y!;Ph1HT8wj0V z$wp?Bvwnj~S$wAh25m_gG!Kr{?&%#hg>856ec5+=fk$|EmQVKAF7LrTGi$VE%%qH3 z($Lz-nLHNDv`PEaPryr?TuPlhfpNVx{mt*! z=T4reeK)+g9($f;C=cB9>Fq=H?%(*e`lpld_wpCiH(fp1>LHilBMO1t^h3;A8^$!2 z>*A62dU!Pa8}5AD9(BL^zF)6@`D)eP8@{8SeAToiQs1LVp`Eu&?YwtHUR-+UYU7D* zp8d9>y!70E_SJ#I^^yPa-|Mr`f6v&p^};6}j4b+(|9|zf-~O`t{h6!lMNhaWRa(8H z_0d24z4}bbUsK=p_=ACM{Ab(hMv^3X*Tumk%YNMysrh!bi)PZ6|HR9|2J5K>-ah*+ z&K5^kV_zH`08Z>H*W+L48`}BkkoN$Y%bs&j{t%XeBk`;_iVD}{d$6$y$~HSJZ0j~! z)SosxE&4*{-sHi@zD{RtOK#7eAWp+YaJ75SE`D#+D#?k@UAQdKox)rmI6}}UplrKK zvgFK|TgjUk&`P#+cC>!OcktLa*WI8)gE@-xx3X=y`GKP;+J23TObTILL9``hBrzjx zw;zRXxe<~M+ptVVsniJ)1-Ag#@aBC|!gtvi&IU+S1wOD1qFw&gI*0A`=Q$*Ixym)z zDxO}mQ|D!`w4Gp`ve~pF#*<`>K-p&@9FbioKpmZ!tUc!*OrWz$5@Z6>0z-^)HyC$> z0cj_Q)hK5fA=fp+CREbe5(hi6&O~Pk41FnWN_09WFefHlPT8EHhNHFDlt%?{xm?@r z%{Fx*Dv|iORC9=SfJj@;Qf5gJ<=j?%4VsetafD~^CNE~C&2<89sz)vwU5~ub7acN@ zvLhJ4XM1+AGC8)5Hv44|Bz|5a(J&ZZauW^$LmbW!@}m$zD)lh7c8<0)5Xx-Q#i`5h zWP};{R+QV5`GFSs+9WDe1m)T_m(sEo2&EOfQuf+g@??Y<*7^oHSJ9>1k?!SM&zVy|T z^_4qk>z+d^bzNGNnv!mIaJH|Td7Ku322)ImygOL_q*lfYhe1nMvrzh zw(h9t?9u9}*;+Y0TdOmR)tR5E^~FUJ4hJQMv2XO{Rd<`iu$u5IR|6tpLPr=2*aWoT zYoL)OL)b@?LG{6bpgdQHEX1#~+^G%Zmra2>ocny~!cu0gRu<+ncx$IH3gCuO~Jd&~f=hxJpy)`+$t44gKh|8DMc}F<9eK1B$ zxyn9A^EqN;?KAweUpZi)U5%5AqIiu1SkYy!C*bSqh=0)!KFZrR?|tCD`tW-`RI4XW zwgEwspy)pL47XY$()ydWJ+qyl=OCXq3@){`!m>Z( z<73<6n{(-fH_qbF>W(WOUDG>u)m=A#99`^iU0UFaW$l6BY=UIJ>ES1=_y(N`M@lM- zK$Oq6Yj10pJm0tH0`&C+Z8(!>`_1>sKbi`>^iS~eyKR0!8TjM9cE~d@z?SB*0{E?} z#1@FJIE2Qo%z|gL_u>}|sw_N%C(4KdBFLA6THd2CDi@B}QtR!lD$yq#`9)l>p&?UOi2rr~1K9Sm+u_fR^GNN4qXug9#=PozQbGXXMK1MzM3okM- z$n|EI^i_@jvCrUSAM5=NJaOS%o){xI@UUywzM7oenWXCE+$mxhS2dYbH5mv$I>aw| zmPE?Lmfzwet>PJ4k&Qf|SmYC2`Q7tl@mJo5XW8x_`w%{GJ&#ZT!z5I5@|Z_oRhK^O zlF%f-y{L{P>5@L-QLZIjR83px8*NEz^vvtrPtdKdQOB}*cG*H4>5JIz$kaY0em$6! ziGKQRx!~|Px`)k3<;Qe(DQA5{mUdqZ_WKjKkvutvFF>GvQr;g zFz+v#$&qi{>ESMVw%IKZ9PB_|$W1=9XB>R&lW(q%+*x(qx4pWqrycq25!(ztV0Bi% zr71kJeQsNyo4MBNHGOu#Tm5n%!Mb1jvHAY~oi)|@RK4ex1NHQm{7Bt!0e#3iUwL=^ z?uTx#`szeo_5I&a=OLF?XGiT=`Bc4&@=troE9!;|^|!)vf}rt&27_~Op^X+#`Ok8V zC(3|o!PPR&uW%yf@*^<3-gG4Ksw|_te6^lDh+gn#%^pn|$g)ZG2wKFcm2W)Bx%HH< zcf*L*R_v`XxRV(_ehc4!y?e@VVEUr#Unj8UtQ5>(ZR5bsbQVc)2)IbR#7Z}2GUJ1x ze%$%WhxPmDoJn3B9VhrQcrk#rW83NCxFE>JG;nS}5W^#pbleD;dm6zwK#`^+yEUoG zy-aZKmcy2FR!3**Y==RyozW4U_7dK{EpL;KRz7a9nEs&&>anJGs?<+JB7wW zSs*UTwuCCr-=SbWFC}lSpBEN$?z32K^)7!k;wGGKeBw@-ZY$gihWwK@4`G^&fmRH? zOBtmfa1;fP)bY8Y7I4K;a6QfiIBpB=JJj;}0G%5&Xy}JX+D6cC#jSiigzo@?K~SFm z;7{I;lZ5!H0GEeGJs=&Dq0`RV3{AcXI@iAtH>XwE{t1it+YxuqW|8G@bx0t_8+5`B=BpW@sMxifVn zkLhD3>t{&DR%?MI<><-Ty6c{q`plP))tBy=seA5SuA?L^3oGzsXq-d_c~8(!eU=3h zhkTaMt@goZb$Jun7_5MwjnQTs?QZR3vQjQHR($t#BYmFl;3frpdlE;-bq_~pB{}7R z)p2>8eKiiB@_;lr^*K5Tjm{uP6P^`cG=6%fIwwz2sI~13sslUY`}RW5WZieyT;2Jl zIQNU*l)M`Yk6&`<~voV7q{x36YF*Nv9GSf z;v4J67kqC`UGnJKap|LK_eIy%?(;9L=>r$m$c}SrbZRGU_*@n?Sh->|5|r?#WL2>^ z6gY2ymcYbZ2l*vPl;2^a0@QLS$5uz(h_khCcV(Sx3fneX2a3$|;JGbC5okTOs_Bu> zn|<}pJL}^g`6x0ZnMF4gSirz$lL7m&AAN{z*{7^8zBx>$LI=8|PFk6x4SwY`6z@53 zK71Yr58n-m?L~G|lY2>o&aGYhF07sV&Z*t|57y+Kb82jA7rYwD|Xw#k~Chq43Ku@yZs`GnD-sId1D3|w-;xHka{Ak$uY@F5Nf|y_9S+; z9on#MbVO)S7Wx%eTWBBb_bz7>hW6Xy2DTdcQgH`xd~K`d~bRSQ(*56dheOyeet2)E~_gpvLOjwVC;Ys)3@3ylGp#Ld{G z7t|#XrH;G&DsKmaBsl$!m}ii0{fs&U;BGzIg2#D=kIVL-(XpZ0vv(hD4c6T33_f8g z0~zj;E1nq~#z!mqNChJ0tDV>7lWpS~c?Z7mk46K#NrxJo^n!W^TC&=PddkJ5C$kG& zA95C~%S&TI@pgs6b=Tie2M+8@9MN<_hIH*hV-NK`@5&2U_Pb_Fa45{-wG*3D&js4d3^yx?%^{sRSfos{3E6kG$~% zbq`e^{?wP$^&}ju+S~HTW9+(#G?b*_4z;sri;(RIZNxuRlrx z_VA~_tZpI^vXK@KIzVh&txjSrn*pBpE$6+&ss43g8mH!)zS^$wp`3O|d!bzYOkMrl z`tFxJw{E%+JiUi54Gtcz&-~pd>SSGAPyWGgELR#v4`^=s+Hb8Fe(!VY#*4b}xGr72 zHhTIZQI=O`t!+;m&pelA>+`GehwJJ1#5V zUz7=M@K}9~jzud{U-(V4T0gKaJK)okpXIcrmhIgO{u%_gBG)lk(4~53)*ZR+SOW$rH>l#jFlls{ zK!c=1;kzZhl(-zyZ<#VaHCaPrIx>D!W_Xn3j7EB!a7ehpuL*)bgp;6^_T-;03>EJr zRXUrlgLR77^3v`xf^ikcz=1*XMm&0nnE1-LESHO8Zo(Ryp2&3_tOoE50jphG#nsuG z?D^cX*PNX(;Ykvt^DU|@7Bq<{#v*$JDeV$N@Af5gzYjS z6XR8aJUgk&>eg`VZsyU1;<8MFM-veO${z6B0$0)moDfC(mB9Aj+ASe6$-{pw?;+>k`#Hxcb2KkE(x?d zd)R?|&Q09L;io%U3V$*)CtY0$Z(U00OQT&9NJmCa8gM(j8<+H6XbsyMpVa+y@Tv)t z<_vt$W=phnOa>-$MHeCOxehN)$P7?)czN(x$4A@II}IyKOe8#?p&>7 zbpO*GX!&9;C%bl`0SC<$DR_xn*=pnYYvQZ z{8M_Xi=8_4;PIM2dZJF>f3#*FJi_+_b^5-;b?lCN>h!($)~S2$tGNdcRfhy}jU-53 z$G`$_eFDpDJyLZs17Y|*8{Vo_1U}E>(lqI z)h%}})cZd@Q*Zs)@p{V#kJO*M@4TMrAQXjbObp6v8 zmumUU&KjTC0siP4zXMb^%z?P3tNYjxM+^F34vIpG89K21*8v?)>O- zUxQCKnura-4#vh%-lUq^*c9wLG`gZ8baOfS#<}|JtdH>QvzgH$VHum=S3CDySo_Yu zybfOa=sNF`N7b%#4%R3#oSc{nu5AEHy9S=N#fibQ37gMO>#y`*QYeA374WZZg3t!F z2KvX&>R+S2@yCAeF*Y{E|4IRzUE=6veOl-sz~(Q{U~%LY_;@XC=E&91hStIx&?a|Da@T#MuFwMYWyA=8W&93 zv!?A>zwzvA>IBzj2Q3p@XGsz*H~erzkJt=!NO}On8eVS`1`zMbQ_c@Z+s_B>XU6)Klj8{7+tu= zh{gkLpu3B^@=;dC0n+a`pYCn$H60unq8}W;wf^YGf26+SDPLDFc+wN<1+V+5Hp{P=q9 zTaRXNum9*<>ZfV%IdAwx9Xs-=`d!+1)^C2IZhPym*H68I^RK_5p7ruytJ{uB=aG8X zkKS0%`G(imZNM4=*0aCyarMj>zM;MxY~EJ?@#`N~&;EuVtp9fNgYf7`z4J%F`APq! zZj+Zs|E6C1O*hnY-}s3-4*b_X=|=9|SU>%SPl7l1?N@vs2kw9P@h8;tpK?=u+fyE2 z-}b84*Sn7(AO9j(&petgnsBCHs0)ZLmIOW225P&Eu_HHCN^RpuWDYF9)2~!dbgY*Y zw*=L;jE&Jf%b_DpubQp0f7o^Go9eN<@M=#iuinMYQh)@k36k1*mPz1Qi_Eb?Fzj+G zJF(8fo$S^~VoU~ne##vTZN}sYd}55^bop=1k$aHQ2)NUp9oe1W)(GtKa5IL_#H2ka z-yCQH!B}pIB8UO6@d;nnOhAtz8X6o0KOBvXQOubhm*9D5^fhjN>=e>qeHpBB>15p= zxjpPFovnj;eN%(MRr{aUmB{$yBrr5AFq!Kbd4&@PLc5M^TCQhIO{8S5{FwuuJjlp7 zbgoM;bSb{fGNBaySX}57t^zRIBtwpl>hx8J=48do1UAbRfaR9)vZp1J&;##Q9F2!& z<>PLN&YbBmY#?d|P8vfKBX=hh$ML{K-tgU|v29kthkL^Dh*80iNVjdfX^G0TOxvJ9 zeMi?#OiAj1YkQOMB)dsMhtGCJ$u(l$)rir~YIn9&rL+S;YGy*6MU-BRRuW3Cs~@Z2 z(?+LMT!Lq4GhuE9Pd);d1c3ho&)Luz6TY2oSw~*-MVO9?1Yc+tMv`FVqCuq&$YP*| zGV>b;%kPZr@oA%W>P}01`Bb;m4-(k%F@jofiXlL*>R22pu%he6Wn9;o ztE(}L>Fo|0G=6&?2P=H~oH`^e{0yATW^rh2W9<3FX|?^suAQN;uR8Sm<0nqlZC^c9Z~vDs)|>zK*81JQ{A~TzJ8!Rdee`&J;m)l( zbaJC+eD;&NvZE)PO-G=&4CuTl8cmM9{^HD)2X`Y2`?-i^^f*RsDE-e;31lg+sC-RC zHi;lHa%Rb;e%_btI5%`H&p{2-hv{$DchJEZ5b3wQ^|cjjQq|<-Kt1lN3+nufCTr(` zshZg3u4--6cX@8M7LT7Kkvm-*iwpFpEo{>sIR zbb5Y$yN=Fm)ICR5>x*|T)+fK*srTM8Q-Aldll2!LI9Y%4E)uMFK2U$~_jlBvzwf?! z%ljUvzxm+ddhaI>)yKbdx^DjJOx=EHxsJ|alU6p7BYFe#TzWh<+S5<%cC+0|LA8hz zga7TlPB0X?_|=|Q;5zr!M`h{J>Zn@|*kD)v0Xzfh*3a}C`V#F|(}Q*ZwD&)%o?5oe zM}2fvfY!r)ZC7X|47^%7btQo{=dNpT^8^F<*lH!rca|Dax9$GtC?^6354Fst@4_^& zRVNbQ!VqbLc-fKr!HdLe-+7nRfpZ^LyDqq}&cE=Inws8CS(mYy?5)+-n(sDi!Rr}p z^(OkcqQ6tm`Lv`#M=tL`Dt*#m3_7)YT+0r-N%-_V>N>s^MC=Fl#mqpqk&NoluaB9) z5IlMq*jX-15iLtSW#AFJlfY0I_C4V{`z21zhIr5-b>;g|aCGK%6I+-S8jbTQ2j=(( z%gA@zkrwT=NiOxnKCd-dWCIeu-6`3f5XEJ%`z&1Am-n$-z&Dc=raa=*KwTY(IA|BE z7cAscD@T9!89&eEDX@}&iUc@Wrp+*NpNej0KavfDIB28Ui)N!7?C`g?ygfp(QKO?1 zwR3E`j^2KIt#;%Y&l8hSeaDmeJoW49+exgx<4HeJAMkcPqAq%vb^Gh&Ex%dM|M#!1fBfPXawo?Z z|Gxh4r~YSsmbOQZ++VkQ?H#YGm;TP%+BwIU-|;8)_QT*bbhzH}vgg%*eEa9m-m5S6 z&L3G9Uu5iS@e*3NUL&b6=Bk;DCU>qp<3+yCeB`Fiii z4uiu3^+3wsMR^!^=)Tt0yIxg4^t%tydi%TnsQ!TjOSQZ0jXzjF{4;-FcYLXP)8k8T zuRs3YC)V%ZqCW9QAJ0lRXiV2v{>ld)L{@y#-;txfERPteSLl!mrR6gYi5(G!GPbP! zD;nFh)_UQi_qdgT%dXDZPV~lhfvcXzC(({J%|1@eKuUTzI_~UK>smHWlev{$ulx;= zX}1hETImv|@zXf@+=LxeCG-tKrdtPwNFH|W+PXbkKi2K{H!ppKQ!N?_y+7uCWr zacD~%4Uo@NXMTwW!IQwpWm>+}+0N*6v;>)St>El5Xe$I`ZkwzDutSfJj$>pdr7Q%y z#kse{jv8YGGa?C$jJjb=R&mB| zF)QO8`Phk(b7oC`m{7T8I$TWWH(=5F#$gO<#0kip-NNAHCCc#Cwljl*a4qMy|FX|# z+)VhSY#rRsCQlk`9fK6}PrOa64Zf2Q0aN;0u+%lm0_0;k+w-IGjI!`8-48vSn4&p% z>4UtJc5$_=o!zB@!kT~v@lj4DhMOdC&W>bM0R2)wOzgAdQvQP%=tSu~460)^Y0FuZ z1U3!~phNNkAxB3nW3uD3Y9c4C33Sv+oR)#Nd@}fSbaE4VT>9wJO+V3LiQ+K%(aB1S z@-#X2W!#oi?@W5-hs!9Ofz+5md3a!wY{KJ6lk&AwMMuHQzrDTw>fQI% z2R?kfKKqr$y8py_&0`8yHwaP)x)4s(Z57#6K&&1x{wd24(5}UoX^V|b9&H2vr4%E~>uI=BSS*F3si5lNW0(8!<8a-!s zO`wr7+pfC6cb;=kv-dvj?Q)Zwo0|Y3KuAJVNPyT-fFPh0olQYmwmcuD2sWst zs8oSvTLCFc?3GeP5P=Yg5Wt2ckdOe8&_mjLlbhx?r``MX=ly^G@qOpUrrvw&+iS0G z&M`+f#~fqMx#rpvR0Yt1en$h0nblPb3hFt-QA9(8ade{52KYn=q#5*ppAN|=2>wDk$`16H@x-9^|rS^x!(T1^MP})F2z>)Zd7Ve z8w{Nw#}as|6Fv-27v}xH)cMfN#?)!ZwIc^wprXNOqeMn|w)r>zgF8kzY`1xu%}uh( z!IUSm;*9rRV6!0Q8ZO6h27pp>8bWJ++IW9OT_`2vbPu(1hs=7S$t9Dg;S&VS&W zTCG0rY*tc)&EO3_M;HK(8vC%Z`>{*xpXq4oi9Fj55}T>(K4?i)__1qW! zy7tCv^Ddr0-^GJ`5}}`O2@Xa{**Gg!dWS~mBYvV)-Lyh09!(i>g3~Td!yJ^_=6aSu zu)2;1gR{jebRGyi+^X!tuZx$}vnO)*daBIWdwe5j^{c^h>i7h21HXK!;GJ(J$PTEF zvHhOGvd7q&lojr#&5L86pp0xa#`v!N0awe|0I9*D?BQ>=zC+pIaD<4Cw6saj{-@24 z6TGu?x@C{vB{RBj!H0f=Gd358#%bB;CmgIo6TOf1YI+;~R3Bo)bgnArmer55nI+IR zNZ=Mk1!2b$h@doCN-|v_FLu4745>G^>(QGhpL{IWN6TY%2#<9>v)9@nvIK~Y>PS>< zo=*>ea3b~q);_U=7IsdrxHhx1C8`Ix&N<(TJ+{~v+O^Nx_6ZcNb~qge-Z$l^C@Y$q z`~tX?5?Jb3+oiOFl~0J%exUdMXFYSBID2pMUR~#6-!46IuAO_;)6$Wem0kO;Jt^ne z56o2(oKj}ni?*|56)G$I@Go*hj`HZm=IC3K!=LCuZaeSRq*`Z95ISNPBRl1H@FDW_4Owj*d#PiW zZ2NKh=wGL4<~g6C&NV(}@3%8^)b^UClN_5G{Qqmi&FJ0-{`LCXU-R9Yd;i7u;*VMn zCs@`o{@>o-x*mBfJb&Z2u5bCU*zG^x)S<{GM>O$`@T&TTN8!aoAMuh&nrDX}dBgg# zEv&cw@cPO3uJzcvCqR2)g2{&-edlH*>%ZQ9;a%^k{OGrG3E&gI^lR1&U(_4_#rBf* zIlu8!Hs_mdBm4jM_O|t2!RA~3+WNXz|34C&62sNnyV?8gQ9E7DHJd?QC_+c7oX`z& z3qR`HmM<(0R`H)UTlBPbIjIGA>gh~<)n?{?_^Y#$e%TuY=6Gjk-{>_Q;>*CJHVquc z!^L*W*P%GJdXuhS-A`o^$OuAwL{USU3Z8}pa)j%eu@P7VwIHN2@QGu<;&_`9N6`bM z@NZ;i1g%cRDcMb>IuVCu$A^o9sMXbO$0=7)``%9w7l_@8gRXbU^bEK%B%FK>JT7V6 z>OA08a4ACqk285B6^U_Dv5y^#!Hv+RRzZ%Jo`0^JN|{5zzz?R$NlzLQAP?7*)h_4aaQ0J z6)F7!7w-ni!|0+3eWoRzNC12?az($!gKmsIXt-{z^KnK@XC)geJLwVM-30AdjCv(a ziVl4ohMaRsa?dJE8X$D4h|=6K6hRhD<#>n&a7?9aBev1s!j9tiBj4Et@oE#rZ?AVU z#Cu{`LBwe9!v!AAIZj=5PCn^~!(#pVr_1H@~=k;78xR-jv|tXWxBkz3=>ub&k`3 z$I(ML(JdR?=)%a7T~UvN3EFbb4zzA%W5l|$S&-l$hQV=+gGlt~@UaB^Mt0bq-4pBB z>D1BKnxlI;s{4Bh%2H2u&L#j$0JVF1FOKkD>wI6j4Lt7#?wmZmcFvq$d(XIc?c9Aj zK~;jQ*bUQ^^*SHXIg+}e1I8%$l{k$DaW*gAKDM5^d2Bs-<;Z&fg+uF?-*)*P+e(){l*Z2MO!TSERWdH1k-o5_m54~gk!&m+C`quCJ)%6`e^!D|muX|*@@n=7< z-uz3CuU~oRrH(3Iyc+$#nIM6&H=QIj?iw{qfW`Q$YgB+;!Z-Tq-M^|oJqd5rYn&rD zeBVx$!1GQOX1DDhz74Cp-8oHq8yz7Eaj~u6Q>t#!!r&5^)8WGoOE7ifAa&x3J#9=E zvWX6oxx7ZH>8wsVvgX{Ax1Ua$1~A}Lh-}P(f7+TloyRf3=;Y~jGIHxmzR_Ry&sIC1 zP2Dicr6%?rX1bFyw#(Avlsa-OcK@M|_?Y!^pZHtWGd|)4bs8_7JD0%gsde?qC)dIL z#nv14$8z^Ri=c$kqk}Q{!@2xT3EH%FJf=)`s^#ao>B`zyHbi@1bmnk$S3A@W6*xt< z>LEBV*OB9DCwh46@$+JkJ|h=&3Us`Stajq(sY!U$d0t|fTA8kj-o=SrFJpx zuSHQh0!E>+BI%}G!Lh^rKHb$D35M`7`XsG-rbCduRi`@Yn7ryC8xo|NeqM73jyVs~ z(E-yU!;hp9+|esCqr=hU$ab##dP2&_(`jP^GX>}r2k(maTaB(p7y8{q@Z(Kv)GdGX zAqZ(yLi2H>c=tZAPMy84A5A~^q4%$Yix)e}2X23*m;UlM(hlKqe%j3A@pC%!BD_U^ zgU<4P>MtCNL-lX!e{rw=hMrAZBK@{)uMLXr7}*95hw^`}Yg2;D1Eyxj#scU!Q^8yY z#+_sMlMDE1bJ?Eyf8@W>0ltkx-}vhFLvQ*|>xaMTOL~Vq0z9P-owNPU^;f_5=ht8T zqPgj*eE0?VpY7M) zwZ8i&Ui)DIRsy_7etf;*dz`;y{iaWSPVa8F7k+4_tQ|pIb|E=q*KQ;Q0^c_*#Y(??T_J!-~{?%L7 z|N8lx%MkLG*AIbQqk-xjLSs8*-$cZOxAI;L&nC?U9~D*Yb?* zw-sbg4{PWsx={+wT)#)5H!TK*gQ&3lHE?PJAK<2vs2F|!D4Wx)YeX9PG-uN z&IlGA5QOymW68%jZi8sOW$r17zKp?7z?Jg4G<}}Y9n)Ynl#xU$9tP_fZ;+AaonA@? z!M}^JghnG!HVvR{8wlLU{bUa>Zgjeo(Ok0YchI6McuGf&EM7~aQl8{qoxj}oZXy;) zXZ6cEm2oyXUI&}T%7&Ad4lWn}5*zFVhIFLU9sL5Ej`ZCW^6kCh2YKn8E8o=_^(nGA zmVmtPB!oX;cf>Dg+T(|I#pgabq|IACZe95We`)Ykpo4d9e3g}Sbez7_nc5f+bq690 zifNcel8#5;4j)ds)Z2qN8Sj7WgX^c?`tJ3r|L{xeAOGvOu5bP4KePVXcm3RY)ob6q ze(bI9UqAD%C)e9Qw7;IXbfcp}*L1wpX&pyuI|_KKi*2N^jYHFwEmP*9$R#dH<-YA4 z;dl(HtO9VEVOhKI_E~n z8q@^Nz|FJlQSjC*m_YcBy<7a?id*oV@W%t>1`bE(&R zRtIH6=RF@~o;-DSJ@+F&c75E7K50GY;pcaB>&ZB)=b!js_V=&-{qq43ysjO@#$OJ8 z^mSIuy>#h(Z4x)flt&#aH&PETCwQ4@!{JlP?6T9L!RCFhj;sfUj|&^OTNCr{!U9u3x{HW9TDl60!(ya8Zv>8Nvb!PIox%(t;XSt@2^ru_=uN!L#9r0u9!Xw$ywAk>K<$kEQU z?xm!T?vj1lW4;4k>?OFo_x@+ByU(6oS1(;$PkrFM>%zIG<`seDZAWN$;e2G9E#O*@ z^D{by!E6R@)RPSjI>6F|j9${MJYtKrwE+}-(|)=KXS@y#{K4J5J*qJLNLsTSD$|IU z3UySva;FoK!|}V;1HoTsZa{VCi)pi%_xc^`vHQ6J$2`gZ6(d;osrqsrCKY zf8h0R$?>Pxzx|1CUZ3M}Hd;7tzpZGs#Xqn=Saj15x12=6Z9M(^!}}?|=7VL0|TpCs=#iYuA7Hk+}H@#w0S8Oj>59XOd z`+?=nT~iZ{WT}T>jn3MhzaDzd?e)G#er=fnzg)LtpiV9Iocx7O##P7NMx?R&-9 z{OEU|sgpVOeqfn~Nb%eS7resEZ73&M@X!XLb@m4S(I@q!_$g7q;9V+4)f6Zdao1A0 zkWB_ll5>z6JZR8TLG=D=FfE8NjvVL6cdGC>%HT~H%fRcQk6Yz!J_<8X`# zhHV#^&@gd)j-ENyk*oHi1Z_PQ2T7xmo5ecDIXt;@DrMn%zy~hkIB(uf>-_D|;yt1= zCXE^=WaoHr5A*e0c~%3DNx_q#`i@A9o^vaWO(4faVx~YdMjujmA6^`aA-QpR-YvTp z2T3p9jkJpJ6pR`*Fl7*bZg4JQ@U9*Bn6Ac@&?YE2zH7?b7=BX=7$nX=+y!WqL?g}_ zZi7pJ1S*ITScUeP$}rR7+A~gm(j|G+qA1&HL-SA2Q5*m&}pQ>VXOSAS6ZbukTbndV1;@-m`Y{a_EPwUl}{yTRO=L( zCgeQwY(Nz9wjBqIIMUnem%`z|8731wveJ-+z_Pqf`WpKUN_$dIGO(KPiJEIiSGcN8}nIReTZK4A?fAPr=Yw?M-5 zB!_RFgRLxek!}WY4Gld~x_VHaZJdEl<;jyVv#FDTP2S`gE)9;M<9hh{?#C~zpL*MS z*K2Li|hM-fEK z?)~e7myfTXdC%qb#$UU2Rg*VYgI*!$Lh_{m4t&-~&C*U$daht{vX^W1vu1LxM0=i{KmI(Xb=RN1P9 zaTa!icO5?(&p$mY+eP4pu$jBw(2w-8&S4o0}LZE(SC zfF1b?ZrpFjPV%MbwNsvPCN^+#1O+}|m7g~HUVH{84OAZ`5uK5rt`r0HC%@`)bb(`9 zN2toBlS8nTdLsy9GlEO)Z1(HUQ*URAZ{U+v;B}g}HYDfOiDG9@S-F2I?Z&aaqig@d zh4s|?AFJ$ZCpmbC2`=i1^NyTz*rQ9W_aWr$Gag(Y@v$#iAN#^jSZD6OcU?ZXwBGyp zW9x}0A759Dc3r#D&#m+wR5}ThiUdzIa{A@d-A!95PU?}eGtrY^H5WXsB_M|B7x zSsiD`@`Rzttqy4+EjZ8e>}ZM3gqIc+VP|moM&x)`0}q0bZ=78)+Cz)}WEMbayKbjV zCA&5Nx#xLl$S)U3JLz*b@W*Cakn65A-zPY^v^iO)xDEc@MptQpAYg2)M9~Iqd@eh! zE%zhITzW=-1PtooLHT4P3xB-#cJ%m((3|$<=&1xMC!+6XQsl9~W48k#NZ`e2LX(q%)7Q-~S9FUiYl4@tZ#I{`aj*=bq^66QjF)k-%WH)d_VZ zoAb`t3C;8s4mVO4*(g$_UU*19{Q2i+1SyZGKtQHlfK&C09_DuRkskza_vw#kd@b#z z;8zD4Uu3J7-kH39?5=gsgZH++Xv5l38@gM6=rB128avP4kc;-B4!AU)=X%<}P|!c; z>I4?Lfsd1(Jizb{v~z738yzJmEOfDi{U03ZVSRz57!E!^0SMg;{kh-H`?R$>i?$ox zOmVY)&);0X@8zGcerxv6{*&J|qfl>q`+5(1x6Sh6&sr~kFfhZrEtq$``;qnR=S{Hm z^WXSK*Y8jM&wANQ)@Odv-&jA;yV)v`k{4S10uoMl?mu@u{9=$7l&gU?yd>wTx({fee%QOo59=mo<|Dt1 z^c9Ty97&quic4*+``MLUe<=6Hb`5<=M`4pVzq^wD_})&Pm1{A)RrWj+ESR>Z@&kmi z-lgH>vnqOX1U!2C4otnnWQIWrDb!H873T1LBG5GaX-oui7cZS(moHwdQP3lF_58VY zu=jNwtP(Jf5Tm{ax|l$)+`c$lLX zR?u+XcX?u@!0&gg7#K_nZ8L3+G15@zEejDUc=j5u1edpS-*iJpsG1ZScTO?p8a)DR zO)oFI$|9a6<*t{3Im+2IvP~YP^@G!q3BzbqV@24;>wxk6^pt)@n1%#GcH|^KE6zKlIQpNfj*7dF5`BUp#|MkzTfBggRSU>psN7pYsdUKt-wwqw=$l6bUbTzaJ z(s}8?mF{{pTF+^)Zeup_)WiOJ^X23w%&Q+{`KnD{_1+|zYiY&;T`KgyyYG1-@oNu z>#e`^#Cpd&&aL-+=;nIg2M^Yz{p*1py*g}4mX00rziS<1Bcn>D8Fy5g)YYfl49mxP z4u8n2hKb%eWXDg})l00*wGNgpWqy}w$9p;7+vxH%#_9#ffIO3^I!lw4d1ni}I_Y4C zHyj4KV1$OvB2{|Rb|A^X@>vA7n;n3la@dV+BL*g2tkb9r|FQ>sH?0IZ*&+c5dw)E~ zI!8&PjMjmT4c5U^2O~aVN4+p5HZ>e>S#_)lH@BxJ63(R4*?+^(3Wj zn<2dxvGix#HkRzVktAkNU`U^5p6D#1l`hbJ;JXP1?VFdEJg~YuCDn zLw??8-rqk6R?~iX2e9#C8-PHfsx8iNePeY5QmNi zh)GW`v@MufJKXn%!t1nM9YMKmB$K_MOY9Qdrocz5c=_eZW*aE83pG4H0$O3PkZpkw%ATH5#kBTsTW@yV5j(b_%aAYPw7x- zfG_+6gC9O6usW4{_3fC6{6oKX40`k&!FgQX)rX4HFzvdaE9HmR<)Rx~=`Jf5ypHUd}r~LJkN3kmK-$ zJT~+uZ^)CV__i)Qx}Aa-*rAWVh9>r?b$n|WZNcSPzv~a*84>%hw|}#K;wO@?g={x% z^zA!A*Dt*DJ?ojj`wy?r?bUy4``PubN3_k!x1pUb;#H^dMz)6!KX1MKGX|bfw*U8+ zy<**Z*>CwUm@iqs9!Cn$JC(>f`S?qmvgSdO4AV>Xcb1B+shZ@zQhQ4mImrd z8a*#C&nkl)mNWnw)+jK69vIzRK8i{W z5B9HyF1;v5sm4j1kv5ft!i0txlNy{DczAGD{FDh8!_~C8MiXWWB64Gvc;`f46~r=b z8iNta1Y#q!%a_qHjy6YRdWXg_k_cT^lH^>eL|3jSh)H>!3YTjzw4F8HaV8iojxe>D z)sn8Q{R9t2B9&v25(=?(q?FZwFZeUM`0PE5tJx<~kCQ--IfW7$1sR+i6iQ}Vz ziZd1Zt9ZpLaGNg9^jO$~9x0B7#74JLPn_eEg3twugK3<0S2P zK|Iflv_)Kjt?o_Z=Ofj4i7;?&$`DNu(c~g-b%g@ z_|(sKB-mtg1Z>pNflbL+J~e`!5__@mbKyI-=doqWN%aQNBl$s6~qO9v;`xpRlt z#VbeFwY9r$9l2-SKJoCnarPtDtp`4S9e(I#>)1zq`r7^Y&s(Qn{5#e?Fa5lA_iy;Z zbMc@6p(Us7N$DA@F-6#!Ur{k*T6Bs2RY(Qu-=g1&zUP4l)-#{` z+;#s$&j~(9IxXu1?|aYMKe*h^LhtZikBz=|`BKg=r!HAo<62<_O4^f)!8^g%74HU3 zul?38lZ}zqb`-_&byQ#QuyR3D>c>pw4{q7Y)7HCbV`p01)UVphThlqF&ebM`HVgP1 zzPR5q(JalZ9-8y$)Llo@7Ut*N=tAuU$0zL?p>Er|cJ?Uuu9kB~Z(dGYk~W|G)v>_tS=;HHg-_}oEZdQ!46>zT5X@$F#_q|z zqTXrFLDr}X{`cKsbs_ir$(HDJgOgkf)Mzu?T1t~2UTpnnxf{Vj+eY`@jlR>v`Xkx` zGE^tF`qDZOIRwx7mZIC!;cObKyl2kdx6a)AK;MDBbne31KmSyGs{Ou0A3&`;DP~|5 zW^^R=l8=Kg?rSHi7ePHJ7FYU}3@)lma7xV|T?}y?-Yu@=)7Mav$HdCm}qxJooE) ziXr1JoUn1$Ygd(#9lmInw;fO}vO68;ncbN@AvwqB*E1hp&-Fgii=MY0Ov1imlVbz% zq&s}*;q{!puk`%&tl)6__HSH&{5!sRea?%Xevj&fFaF~7N51NdI}Pz&?|yVW@bE|X z{Dq(S@Ol=x1dRtCnh~lOJ}>;b{hQWTzwy=UE52|WMA=@lURanfSZLtG<4H;d9Eab?7<&-2`UOpK+_o$nHD| z_z>Kfh4b#C_9((*6h!sFfHX9RDdbJl%HoXd?5(|1r`A)CzrT&$@trfRl+ZjL$K+;Usl*yB4Nwse z18&~ZNTt9S4nzD1QRx`30}C%C5D`>_9WjD&CK;Y+$2df3go4MB1eTReV7Eb!@$$Zp zhEPM-rPm8TPIjI#+&6-^muwIAFRa7yH&tSexIQm{!*ewa(T=nXeKtHzu~i0v=kcAR z>#{{ll1U(WkO0&C>b}2}#tJRI_e328M-f9uYRq*e6HANx{*?gk)b7r@l>8Sin?AAD z-Dl2(m$%pD1aK!#m|~iSg2DurQJ$;8S%tR3A&2T>f@aRg5y3A22}Ddc6wpODb&7mL zq(MQ-)~jr>6nwsX?#XrTsf&?O8lA|}61y57Mxy!<+KhHIkkw!(4SKqQQPP-hK?fR$ zRq44$DK`A1Kl7~)dJ|~j?=-rRNgQgGPNmTS(Mp+&U|G7HIpz$Qaw6?G3vyDO$SiuR z@^!iSrjsPpy%@4@BI1o z)CZ$e!3I2yR`bHcG^OP0Gfq|5&fuv>cvl{#?r;W-{L*#Cz{pmEOY|l;2s%a3*G47R zoDq!-UdP?YPavQ-GxtJgGM9Eo`WlGqE(VC~Bk$4^{lZ_e0*iw%bO+ZQ<(>wUoRTLn z^zM4U?MnFY!cYH{^*cZ7x2=bs`^@k^GL56cF}r!~a*hWsIukQ+iT% zM4fG9ey5icwk?lj@nU-n%6SI2-Pn}x`X}GEe(?LgCvc8;n&vn{D>fpws6i&)vSqOX zx39M@w$r35w~@i{p{_LE2fD!g?l=-pT{=h|Ik}$qksrO@@ryqjd2`T5M&+r3=r3O9 zTBpLcVIXJ5TOrB|TCGDI!g+3sEI90;voMoR5Hk%%lI6NiY<`^l%jd4F-}{Gt-}=%& z{Q2wBMc@5tvTpdHY$!nim$sb;O;)tF4bTSu1`qae-t9 zvzF%qvu(N=?aKY&tg+lWdtiqv$&*A)Itc1i_$y!g4eM9`)6cDIz7JJL+vDVkZ9j5s zw=|zVb9SA)cRn$)e`($!rRUx^u1$)*a5C9_y2;LvQ7{iU(hSh(sGzE&S+Ui@tnCyw zwa!EbJM}Gkpv&S02a`TVpVS|EFF4Z9QJvbv+bN@VL-|*79{JIQz)en&qgN?EaE*E$ zN!xMwvwr8g@e4ntqY^t%op4=)p(CEYmQ^f`HxMf<`=XmbNF zHe@gCxVbK+ZPo+No++;#3Za=yyl*C01V^W-&NLm|I=mXp=UjltW-3RzzOx(Lv;)14 z-rZQ&+PQY>)S38c>ht-o#Ch|2wY0iJHds%GX8Jh}>HONX9r&JmR6yON2uJyGbUXYq z<)8hOuYrA1z;9dU@c=AsUbhsMDwj4X$6Lu8$lCuasYBkOv&qRO*py%0$W8jghsn*z zIXWA-ANR?hu>R2R{9UzUTAp_Br2OqB4|_0YPjAkPQj%^gQR$PmdXqA^l0_!Z$F_NH z%gs9In|k0nX(dN5J8DrRa_Gnw{r9lBhxbw2f*6R}5m3;Y`+4BJ#plNGc1pGtk6f0r zq=)Y1c&X&5CqX?D~8EGQzk*M&HvirY=xdQ z%GO#bFVqKqau-0-ZJyiI75J1Jxd+AZL4vpEPyZ`yJ^;KwoDcusw@22S{`!Bv{_^+b z^z*-Y{o6nNin%R2@&b=fYEx&&UJOk%rLUJH9UgUX2ak&_{!Ts;W0&AB*h;Fv_Z;42 z;nCpRa|)Luo`6;V13b_DE2!})q{oxyZgiJBm}V*no+H4>3FpBQ@fwM~G#y7ogT%q# zj)WLx(F120U4;11Li%c`50+?1w)*QUjr80+FKejI42$TP&p8nGED2T@}1SoN^mM$jY$&p`!p%D z4NLATUt{GPCsvuNlNfvn#T@a&akx9m0e&9!+gris=+16}w!PpK8uOeZeh}Dt&g(D< zd?F5XnDaeTAvCg-!Biu`UW6Lq35--sBr)8KaYuMilrjY+-pgt*kwjMIf~i)OgB}ocfg!fnZy4J z`}_TnGrUb_f=dIQ1cwZok;bmFn6lB@X-0v^IW!fql{GrmsTJWNe%b_l9F^(086Df+ z$4j)xCwYxg-un2Om0Hd8q~|L!+)iFAN3{3nMj@*sIUk+b;GbjP56O|iWo*$W#aJvws@pl)lqDwz zvhNT{8JTUTZhA@&mG4`JQ?JQb_2RoadK?OO3JplM0KI9HeRM|x|i~5 zlT%l&Uq9&kx3|m~iKCkcGFjCp^*g+3@FjP6p8&!;WT~-9HxB%K3^w&MI!18nMwkC+=Q*C+=OlCmyJO z!FIGxc-L&xZU#W>Yu_m)+wiXTi7dibGU{xK)R8M!_j@0VewHV)Cl9)+gGsxAKRTUs zu<6kAkzICZ+qU4*(1`TWCA`A>zGIX>Z5Um#)s~aDa>Fm}Gdl{B&S|rP?zt~C#wXgp zvcEp~-uJHk3r|(<80*_%>^XlerL`@s-=Zw+5A4#bJjdX~hfppF`s=;aQ*_r>q+L}P z#vV06pS6P*Pf-&b=_#7Mr;8o|wW8bJsKY5zr??{=#y6R~7NF^?3c+J{@96rNkNL>j zEu{&**ss>7&AxSZ0qYNMVHO;^Rd3Naq}v*7xWBo^5N)Z^G@WMyVS?4Ej+2lP4#YP$n}o44)pX3ve{n~Om`dxJ$=@(&$TN17*P zIgU&xy}+U;U^OiZl(O<4C?X`g>a=5?!*|=>(9v#5Csz^K{!e=NZ{jE5w~u>S{NUc} z(UEq}f_*0+9g%{5PIl?;@W8e?x4-v0e*gMyulV&Jwr_&3Y#;mF=cGOcio&y@u(}`wC_*Ea2MVE4tY>v`3n2ccOJsg(j8qzqRKqy;yGa%H&tDAyr%d@ER*_>wawBE)tU^R!UJ1_U zFJD|&H9CP`p(XjT-Q5}}BPx?8MlBj~IL3vd!Z&Krvf3bGRPZGPys-Pe7=y(b7sS-q z7rq`EA8;H4QzeX1>e91OUPJDB%5EF&h~s1P-U_2Lj^tG6j#A{D<8Epo#54m;jeHUi&;&uG5x(*{e|oy4xpH+rblMMI=eHZ$_Yx2?Y*%CScEXRnINnCe zD1hKgIUVT;ns{L(>%{J{wHt%GlXNP~ZX6};1V{c%=suZ19KSf#ferIUP#cJgOYJ&_@d3AM44VX{rGegtiSA$NadJ;X-?RJIOL>`_gWX z(s_ZKEPXdlV;CvVPBt-;Ho*?3(tBKtQ9mXg-5^VgoWQG9BFLf3H&`Gt)BZ|Y@v4za z8VxbJ@!Jyn)2JIo*{vQ(D_HTI!S!6j0@COz+SMoWwak8Gk?Rww5A=gfjQH5LQ_2`G zACYcw8c+>j;1)dSXYmTMgG-+09)4-;)IkQeBZKlqXLXEd{A;Yr%j1Jg0btw7K33fjY4%eKki@6zojE=PN3#=O7oV30=>Bex*b4#dq!Rc1efZ(I_i^cT zW$JP4b8S%)R=wbO)pHnyAtR1 zN~ai_GUz?7)MY#hd;x%hO+Dn;T7{DRrGwY5T!eP$2;RX<(9#d3hpy^0T9Uu-7lnt~ zAq1%J;A)>NIqw;MRj-qx_LZGfAzb54ZAw^)%$=qt`6 zUz=%xM~|IMn|x1jKH2Ab-~j+5z;hj*1PA9`P>4Or`F2_R>N9&9{MA)5x^m_5b#U-h zjtQa<5}4f(1jiS+aw+%XSMVKDfX`0sop{E&@1BR#KAl}BPuR%;oq}i%j6Pe|25FaA{qB>ioKq z_KJfKcI$ZPXnPBcdYt@~vn?{X?fYcGduUbC*c%;rZ8wrJ;Gliyc}LK+6Pq@)bmci; z36F55nt>mA&Q3IaY?e0Bv}dm{=;$bDFxV|=1E4yqe#O7I797t$`+@b+kNNoE1^40S zmIT(Kn5U=)sP5%o+me*aP79bEH!1sn&IZl~ROrkZ*f|E3;Je8~tbLTLA*uX=Fa9{X zPD|Q0B8BIk=L4TERS%M8M#^#z5%MKL^XEu5<$;W4sPfp&kq>-|3v>bpjkC>hg1pEp zSpzNnz?1Cxm+ajfLC;MRxXx(J~Rn#((oM@Nn3~_jR{2v4Zgor=OcW-p1?sb8slWi>D?G7(*!Lbfd_&rA7kb` z8)<1zQShpR5B#lf%Z}R!}Sshn5v(dpZMne}mJ4!(Q;O9wuT#`na0wtBI?|b!L zB+EbsOUBx>0mS5vaTFlxVKmYy5EA&c5{2({nc>o4)ycKzyzi9-zDkK-I~{G9Mk|+< zu?1T2-0FUM899)5<(>sj$W&k?@MQ#jI|xqXos-h69&otE$WP$yD6ht08Sw6g&ouEh#RMfjSu| z#hrmO0uDYn-NP?BKmvDy>A){u?1u6ypZw@`%9$V_kDyFfBtv5G*Rwfv(1@qEY6!*$ zKbt&b0LeIeV7tZ#cHzkJIP>tVPSCC32)1(+B|ROW+jregy1?<6{Y;(OuC}kqQ?JSH&hyeV`ilne+@p6?ZOccx+qBuGnRJm)j>xVY*|E?) zwCEty*>iRE4W#62aPH``x{=)oNHJEYN5;8bnV9Y1n%HM#F8q`~_wyvV=nalK$G54Y z@Uh{!(YXMHKzhIJ2ix%)-sq9nbFgzdTdv!yyV+X5Ho8M{bnW=rC@}k4?S<4 zI(<*toNMdcxeu<3=O15Jjd&&aF$&VogA{P>ijmjUmxF`02Ug^}e$8hh)U}&Qe>D_r z=*f?bXRq)~yQG~VMs)jRfeUp~8Vg9(J|rDGGC>$;X_$cD%1EZx^~x&wI=zvB!Lzg* zD7={fr<{r7OrBKv@cAd!txJ#RX5e-dEH)~MINmsJB-LnI0~`)Y>TPXn^hX_zl?h(S zK#%fVdbHLy9*PaXnegd-kGyZ)K6XOs%@@w!;R)PlG^b3+5xB^r3uc@NzG;8qm2!QX zj82$c(tuEKW5h05Etl^^{i?2Hrvn19jz*S#Iz^AAK<&#i;~^Xt;(^DXnl@e}LpnY-8N)Az5PlV>~q``Y!3k<)(Ko|F;ZQ$JMMl%bIM zC~tTYSvT0tv-&F%A=!CkX?0O{m+vAU$Byi8#1{7Zo{{57E$7Om3+u|oOYwILtJGfz}o8I zOgUvwq-7k8>gXU)mNti7W*?{Rr+ZUZ>)RzSeeUR-x*zzJOU}*a0HeTDHh;12cuV zpd~^6%J1^Xaq>wI&GMx7%d?GrktpXNu!DFojyYY7Ulp9&VY-pG^E-B|e1}{>1Rrf? zJ6e*~B0SpSb`)kWpRyG{$L4Vz7^T{yec7}j_$1x2Z}`%`{bBEa*J2?f{>S?ZK7DviYF3?8)k@*H^ z=L{#g&F33}PxBAVq)xuUWo$NFhwlxhqD+# zjA7C>AWG#im%2TIsf6CuY7bf}>5&91Z3GxljzbMlmXGOD_D1kfCTE(1kI21Kr{fq13S+#IT(5-h z{HRg^)pBj)^rtf9rjZrj`GDgnLW!7$Gvyvl{swpLu~cU0Gx`$e!PG~A9b7f&9sQ!* zao|j`YXB6yj3@z1PIz6#%WsTb%FP2kCEgPRbD-+ zHEiUOv>FWt6m46F?9#qQN;)rcM>$fSQL&Rdd!53-?xVe;=wh50+$v#Uwc$_MMtm$#BG|?Uqn&i4!9?J8ln3$QU-=an z9XUz4t{G(c$R58NI3G+yrzgF*=M6u=2Ddl}#=|!O7MgWd?DkrZ^ypMaj-pSTLwYIzvMhi1oC}TxV4Rw(X-us) z31fAkFgU#{Q@%{Hao$FU(aVvUg?yq1Vc2$rr4moR z-p}3u=q6eNJ^MCrrlZ?H$EIvkP}<;PLjJr<=gD1xv!%a_T_leV2@OFT?#Pqh-G(6P z*wXC=H~Hw9=~OKbZlN7++i541mL@dMHhb>PXpu&4ItnD624zOsIe>60jOdOg$}`vO z2|l!eXJdLE`3v5Z6+TT^=6UL4(qrxfvMDRq@RKe{5Cf^eR#Wh~tcX5=2i>V_I;r$d zdJm?v2_nMk2Kd=q2cm!KAv{UAat&b%k9EX57d% zJ-%kashpc0&n6~&X{HH+FYil%jQ|d}_kXWvx56POT74V)JvgXabQN*hfXWyC`Nwhh zelVJ5L4weaufd~>Oh{wYneF44ML&;O?JxJYwvC>3HVD%nwD6CNZ>P>&i#<_a*V3V> zvnKhD?w0>EY80M@x3?3-_)b;|568$zeGQViHeKC2Wv+E_Do+{&65pvad+Xu*ch>Gn z0T??mHUY_@GJ833=Xm7k>9xD}K-%}a)3%(=H9L1IbQ%HKDZM&9O&Nus^V%zIrLw~_ z>f?Mi7j!K8B}mCb!BlEV^2cu6m7upcv1g8v$;|}Gws9*PfeGQr#Bv`hPuEx%{#khe=r{S3Zx<~} zTYdE)dGcJ~rNi{>>C>$}^>41VN_0Ga$bfk3?&jPXzZSGCy({yOidGE@dI(v4V zJaekLuz&H~x^n*U=&tFjY14xnLD1jrB4zb$0;8{h1dh#fZI5H^ah~z%_*S+V!Q(W> zU)b1+6rY`6XfpVm!&$rL2yyz4CcL0~Ltlcn;MF!IxOi4R#0H?-G=5v13v-kDt2Z#S`qqDhH)eJpFlTNjbaKxkVDmZoI zBKLvHt!}lWxzc@uiVTx5=vJ=EQh(`-^5A5lkrL*APs1CqQ|Z*SzkZtXKZoFI%5vkr1-k@V=P2hBsVWXCa`>9)_;m zYj6eE{F0;i%BRfAt@z<5^yk+gJ?P;s9VZ+0rf_pk$Lm)%*U&jn(KK~v%V#O#3viT8 zdpJD3fN5k@Od}8tN`eGKREH^*_*6dvoa>xhaZp-7DoAwUv>`!$84;2{DozrKFi^c+T4m6^H#W~vDJyBzY zJPq)X7Pv7F_myXyueEPc7kx&K~ z{eniI!34W$VnsA)%GT4|9^~Zlk}}vyT^cyAIs}SS%I+Q+3Ji_3s!08?W_SVCyxWn6 zK>(Xgz*yxEjvBig;N+Uj$}{O0-(2G<-8U+E`SQqFdigmIoOX>8U6$T-(1YL*va)Rq zY=8?mlXT?MXQ3sq(GR8uKWJC>9q~)rG2SJ&qi^)EK}O`OyqR(uI#O;VyD@Gfx3PfH z(VWw{nwjXE#sg2f8eBy(`bZcfqa5=CgMNb#oQ54Dm0e*RZwB+@C2Q z^Gx8_fD1puA2N?d%+an6A~L%o>6ki4J^@;KTzl9CEqWs**zT1-In`Jd={)cI9FdhI z^aOwIOo4=xy2wER6CY5JayV)*g{M;JL$L}RfjpkmTXdFgc{neDQM;cF{jKZhU_<54 zpZekZXUc*zp1P`|ufEzKoRVF-(-FdQmoDcSel(#?+H7U@+?TzLe+pnDYu}s`*rptM z&306uk_Z0m*L*`S^mIg6<1dH}9-&!>SDm`tn9h^c_e*cCo%On(`IYq-zu}eZjo1Y z<$rX;?z!XXlV{e)-E(}s;DNKb4qw!<;BF&xs~R3Ui(z3MDfs#oZ7nR6p$0^%-nT^w|faQ405t%!&7*M)QMSr?yt&pNpH!M4jM&)&Q4e#V3GId-Zq*RNcNu3T;> zD%5Ihf{Ttb_}S@ieT>lJaMX2V+m6!6wH*}FvG?J(PKb_#23+egf?%dj1WzOGK{)MJ ze609QGaDs=T=04F@h8`lPd&a_c{9FGV3~?p+m*JhHZQVi2WE6SV48-0ZQF4joZ8;{ zYbko1MmQtT2A{G0HuaUhkPZIR!v-$F)h9*3kw-mnU+0Ou>QIBd{K!QoHJ_!hvR6M- zCOvL&g?W+Lt=PGf&%S?s-WPuE`h&mke_Rhe^z6tcxCHJ5T(Fz+w_kR5FN*=+c-#Z%GRc)xBrsLxyefm2u>6{n|h0H2N7 z)-y1rZ7`MRcS?kZXYM9FSY%clHrMSiCXb{Y8tl0b$Ob3n^);0o<+p9o0b`3<^`UYn zA8?f$AkD`k3$G}c8gWCcRxl?W5h9L9P%)g-b#BD1aKmK>!Fo5Wicik4%1;Q3op=vTG&-% zcQ}o({KpbxK~{rzEXG~WyGBGxk3lrfd#MsR>rrU9x2D7)N!Aanj?dGSASmhS#$9p`GDq4_O*GJ<55$pWr|q4G$i$+Ff8?)r%;9RQ9-r;ahw0j%dwP=G!Qlk7xBo)aLW zX3Aqn8_OF`jh@mN=*XG!I42L&J59Y5gyu2^FU~+35sna(F3qtWqcs8y0+_sxWHEuw zz!LE2xp1x5fq0JQ$e`(s3k$lb42WR7m?k5rMuPBNqrvAL?teJd3~>S<{gFW|Z!^i0ER^zO1LEu7tyYgEvt5z=dEt0BryIX3!M zosO)=(MwrU2S*6zZs;7o>oKddm~&{-_2yy36c!lht_}t#mb&#Kj0Q(~#Eqd-xAERH zGMc(1ucA8z5|4`J1PcKldE}U#{JQ8yp4C}qNV0Lny1aB?yDu%rtBdD^EKUkuD0AyL z308;zjjihemE1|i5axa|qOs*~8Yvp3>^g~dY2>$W^xjmu@@XhGa!yH*EZ;62U}T`8e>%jhRlZD?@V!W=rn_nnng{B5!IkI)$ zx9apSom!s9@iQCXRkAJr2&=E93$53 zCw(!pVN)!5ct6X#Db;~sZG~T>wD2HDRZ1s=Ss0yhC6Cs_V8a1H3-_GzzpNn{9p zI&6A;od4j{Dc!lPP1DALg^yjVBjoO)(JL{`b)PPU{}-)8Dz(uZa|GPAi)( zunGLB@qtpd`WRk^GwpN@6Kj8T%-WPY^3MIVi>|ek?c8Q75Q?8sfjY-gDD|T6r$uJ% z5J)*XE$gTz`ORw+P}#_Y9NG@iYjVkbWvI_~(;3+)?UFW^Ea-ra7XI3i`*zkRe)cD> zulR~TuzvGz`n0vjXN-@;uBZ$C_tcg0dJ#SC|Jh1MQq~^jSFvm!y2hi?z3eDf23>7{gom}kfe(=L9Ba?uhbP(5Ry!G7 zQ+)@IB)#Q(wc!_8Z~f1~Pd(2udDLBXek->I8F1amWst-3{8xOoJ^?>BtB0Gr&f(gX zYdx#1*zXM()P=66@fey3z&Y?ElYuS$Hi+GhD8Wmbsrv&*0q)CT^Q`5DD90&F+Z??q zTy4|S^l4AnDQ!$`S#TOsQ&z9+lMip3H?Tp#s|L$~L1)=OAX;wo*|xIJGtbqvq$j(f zVV>1KxJT~g)5zCeeeyi{S{IxLR{1V(U}nSVWK5;$XjJY|B=1w1{-j6VsE^*dD;F-c za&lbtqH_*3TsP|Aayn;ObaPzm2n1FetEB5RMovlyW!y~NYHuT^hbulZYUQDW7(?&t zXk@OY0qNAfaEH+_x`gPC%B7+jH8MS}_-b%dBnOkh64+e7%6ZX9#z`08<=Lf!G|*{b zJED+$*W*-car@rQ@d<8x@1+V+!{d8SzIR0?m_|{`q~M^Zk01#>gryPj(LfY~p2v84rhLu}9(tGU^vRRunE=hmpGvC{s}Tz=6p4~~ zhs$V|kt~&oK}NqG7K(#!z-sv1i>ukna?Lv-n_veV##-SVqB_B39+;+GGU({A84c}6 zyOWNAB~NrHt3jCF)xfMnl*$73Zh|_!-7P)1w1+4~F!a(Yr;c^b!B@3>^i<;p*Dfd$ zzBQ;wMn*=%&ACVG)#%#w>;c)dC&Dx3x=u->x7qPmd3A*H(}rM9D@qI|CnDsOzbX;h z1P*xX^95kTPmsY#z}I_&M)cg@?gBJHAlBqjd`dKw+mmdRskDe;a7W8XKXfn+K8o&zYe8AL?=RYFZuAfMpvmh zkC=nQO!FCD<~%Y~24KEnqb!aPx%sA1Y09`1ZS$j)`` zPa)(#7N*FpZsfA*bnt+U3sA}p2v^_b6ZA$?%g3Qqd7zGL>AFu&sMDoA3GXyMXaf{K zgQI6{zzStHy7Khq`RK`=;7=ZKvwPMJ$ef#w=*avCyy$_zad&qwG#y<({2zaL{iUz{ zTkG%tmH&Oc{Y|f3hpt@+zT3}6lUP zqy245wKwt;Cf>C1j%~MTJ7^w0sIO=|cm9cW`QrY%bpG)?71*hj>X>>zbxP*}3Z{O0 z4p{DN=o;sf4AgNQs7VnWuYLP*!6iIO(-9vg=1-hXdAos~c3L2oH0YJNouz?w^ZKQA@!VtU+!OEZ zRP(cUKM;IR21Wvh$cB_{(Z@}9f8$az-Q)bH&4jp}r4cj|wu zLGB+-J9y&sskL|ZOi((KVDQ3v{6kM9@VeMC(N1ss4r%g_&!Ceoe2flFoebRps4bt) zHKVeE_6^?oX~Wg2+R>!dw!gR{Nhs?L2KzF?M}A;)eFp zoV=Y)F~S--7pEMDAw{mve-R%Xx4fb=p1a||ZlH1kjLrQdu}R+>*%eV84o$UB;ZY7f zA3HMl9ZTPTu`7wLwWBF;s70?+W>S=Ay}wD@t>@b#d+PttBcO))_P%Z8ihqM^s4Wli zuWe)rn=)%(louE@XZYm^QeYyOd{Z~12(_he8)&O`Z3kUz6TsghVsjcG>;u|nlYYwb zJKPL;rZ)od1?Ywfm1i92s|ip5FiftIxRD^D#wh9f?o)f&G&DgjXBzk8ad<7uUeyX5 zt00!Rz|gCr5gEsBt!oGS>++=w>+=5j22_j$Jc@J-iB+l?O$Or1<^8@xWOYF0TXAog z#@MBS-52DAsll_;POc=l3T~WEN>E2SmB4qqFx@>B%XAG5MxEhYYlIjx4CKta&v>-w zE{bPvdjJf~&~bdvH_tS}X{19B8g~=O6EdDp!7;G`^u>+1Opn2lh{6KYB3jOkABm!_2>@Y_2X1Q@b# ztJpF)-fu#`fJ7sKKXgPu=g9DK9;-)zXS2wOGR$R`esEK@W;Cax3rTB*B|Yfy<7jQC zUotF4lun%7OGCnN1W%O;-6?7G(#WP!v*?HOaO}%Tqkv3f5knKlS@+lwA9ewW9QVt%f)rsI3=T~~TY&X~@bN_?ydo6Hm zuV!Qp9$MsS?=3olgPa&jE@*KHe&@B*ndm1xiw_(&=l!-#(&jX`CP>h$Ze*D8Wq6d= z1|mPYuZ-54Z1SbRo)=EJ?Y@R54RcWQZd4u5!cgymS9AxJu@c353j?imj>$~PJyw6R zw|A3VJqZ$bdL!vy&WmC4`z2AH<3E_AJNQqQp0jDv;2and($eZo_$SazWk-JV8c7GI zTfnoE>QrGX&UN{XM^i>BTwswkd5vR32isT#Oh*dKTi2n3+_EQi`O(Hbzc$b*y84v- z!zuJ^d#M9W8vFq#m&f9q!c9H8aU(p;y*v&yxrYw_Yk#|e^Ym6O=Gk2uY`o5~lF7Z{ zeN*I^dz_Mj895a?yqadV-lq)tBZE3ENdsR~5l_Z>zj^!E`k{aSw)N-!!rxr~*VljD z`n8|=vDo;Fx^LRic5vnL=y8DbL;Zoz27`ML#~6>{rcPCNp`g6Tv05{X>$B}O9m1RG z)CjG$KiW8$(XFIOTKZaeO_M!&C%85pEHG|OkToM7f(Y?&0)`+k9Wa3(9T$B?S}{2(kMYvS)7iVE#Wyw}X$LWMagO}gsYVCvfnP|`tKcm_m@7Y9jwzqk znSOci-DlS$A9~NaaPb471rL3k_!;ZuJ|5|dJcXYtRGJ?QHQ(PN)`=@iJ6*TTuquo1WipB%7Pp;N0KEjP_m)4a_A6)02dMvaBc5JLsN5O?1?&REm zfw8qG+MYObdY!)Sp0-)nFCVN6k3X>vE}ZX(>Wn_6 zZOpD7qeJkozP8>4UP&OO@De@RAd;>_8$ETc4H#QH&$N5^)Vda2$wB(so#-K0Iu{$f zC_naG&eqTD?ge03VEVfNts@AvrF2!m8a(Or_26CHqL;CK7DQ|3^6|UY*?aF<_uqei zeURt9;05bB4}MhJUhO_`h?@mPa_%w(x?R497s`SwTDJ8qm)#ulB}HE1zv?{mX`i(vb(X|K;DDmxdgr-@YrSO-6A8Uup30!}!s( z?r-w9eGg9Z;Cab+9oaM}+|UTYawYeRvs5V)J?>Zav&nBO{OoQwKk?d`hGs4x@_4sWSI`=fsJm zN%j~CJ>4fyomqRn;ngK)y&L2m7QJLi1o4dli3kJFC<({$NCTq@c4F94rYV9sNm(;W zU@8I_=4A)VHdtM8DnE^qKp@$J6C)e~0~d2^yp&x=L^yF8%}4jO_cnUjC?xg@#2Qd) zL;}0cQ51tQ^1Tu;8GMa$8?YLulxb>P09Z7G(Xhd_tGtDNj+M$rNE{`~aeD8>dg#9U z*4}0T6H2iY+*A;wGd4IFT{0bl;;X>KR6GKQg7^sXlo_RApo2f58W|FpntpiU;BxQ* zF}#YBFuW(y`1^QpgTdfvd3v&+_fwKG*G9jd{??VoQ}A|mUAlZZ@|r17(xR~=T!E`+ zjB$aJX%T1>Kwe9LTr(5gI-0ZHC?`V>Quuj&Ut==?0DbdeT@Gw@G5Ce}J`-3m;;qnl z5uIr;5I)Y-)~9=q8$bqjt}0K??F6B?ITal3)8j0FoFEHMrY~0iTuGnue3-fVFK|p= zAGkh|fLrj4=8kFx7U!oy*zR6Oy%-QYRDX^~Pv!0VYzb(u>BJzU7z*+xd-&l!UZUaV zh8DU|enBe#>fEWboAe$Fia0M!37p+;YCJ?&gr~k8iq4gP!Iz`k)iF~59WT5TgJ+y5 z_bY>xDNi2PVVVYfbl$HIwgm>8$|igB<}ruCl$z_NNU7wK7AGkJ*OA)-`Er)Y}N6SK8qZSo89E_>z0tKcgre z)dnkhygMZwCrUjuy|w%b97eb&f!~FCz{s=dRpubV_34JHjeqgsOa`ZVo3dJ` zI5O}^T0wSoBS|}rEx5O_%29dM*W`r{J(MrE$|LEdA+x@J<371YPRg=3*bAR)=j^?n zXO)RPTQvd$n?Ln&b5xGBZ4gs7p0q zFR#D!=U=)0!C(1?_2^q)w+`KSYQ^_!Lf^zv*DLQ3r7lg!4hNPDtU&5Ry6RYTk8Lo! zLD?HQumOkYN<#i{zPh*}wLHWlsDs&_PWCFhYkVy&fz#CyDPJ@jiZb>)CY52Y8TxTIg_ZyADy+I}X)Vq)*fawR1 z!wYr2qk?pea(9#|x)x|>ug8Ar7xTn>$@j0*XCI0kKGDF7 za|xQdt(V_wtwwsxO7KpxPkC5iK|Q{qzL!3-O4(!-{%AYM?r_TTuA8>{P=c!?M^A)) zqgeckQ$b8R_V;+|I(Z>uH_p9$+N=bh9YIr8g25{nQpUA@n3(P!4ZNMbyAwR#yH1>Z zAbh(!Jktq^f5~=d(|$dbL+BvW^J68zrl&bgF<8ucGBt~;(Xv4ewUw-B|T!-_-pbg zm+WdEdah2fk1#h{yR{3^QTT?xJy(v=nH-In)@CN1po-6CYjsK5wsSh{lXmzcXhCx@ zNE-Ol|LwB-+D(4k-FM%&?tj*U#rdfx&#i;-=K0TgUUi|gW~;4>y^vUG z8=m4_WL0_8_T^9+fg9e1{(cKJnaRLW8>4NTZGuMm)t5WAVjgB=qw2gDuA^s?IWOf3 zox824O@l6pvQ01zPG|}*f?AWS(ddUmvm-p|n#=PcJE!oGZ}h&n6!xYbWG~DQ+pr8@ z>qLhyO&{3xTf&3wx&iEFvCnmj%RgCcZSRZB|HGDN0yIBm$iER)>)cHLLx1*^!yJMM zRbHsn;O!*rba3GqthsoI7onxPhNf~m| z07K=`tIrYh?usdI97_(jsbm^zz;|-r`#&1*0Bhs2yLU2|ux47ZmqjX+0aI9Ylhr;^>yx$kZ<3}9>j zI41Ii?QIw^aGcHDAq^Eaf;fCM&iM`pEze@C8`K0}ICC^^#;Fpd9@B6{5amzsYeNaA zAb>BXY@)e6tl3SqymV#1?`~-TO-r1Ye3OM1jM~<@y`cdOodTM(k;loZ(xTfksscopzV9oeNBk@0ud$J&NmTMAG=CAuf(_ zh6H?dT*yBB6Oh0ay7PVvC}BX3dd;ds@va!91|@CC12b|UBaI$I2xmN1o{DQ!g02Q~ z?`vq_OrC-s21{8gg5FtyY4r&GX>iEZC>x@hu0kDyrP4Wirtzg$rg1ias$+e#Jf(Na zx7rYCWo87`pN<^maiFptp>Z01!G-$kNgIdYs`@kfrpRrb zcV$aBx{%blU;WIn4JG)2(^1SAKDwz6Yy)I6)Z^P8`;-uh^IX7WPoti5bq*c$LMfvk z9Ff%QluKti9VIl@j56}B>6DI;@EHF6@cBlDbXYyD9*09leOX-c>$G4CGlZvuV@g$* z1Eac|YtK?l@R~-G+}beU!{*#Ortq8~?CBkh$~Zqp6R*gt&r?QDdagXBbC%&f4RGpg zj_thafBw;iSX@NIAhi+zh6Q%L__;xt<%X_=isiIr~N_%m^-;}|YY&&;g0oP)ZOZR>9fm{TL@Vcg6Mt(8=fhka~ z3*Nx60cq+5J4}!0OZgOdbf$3VVPvSjdInQv!4H#sr^>rwZO3wdyYPql<_5?4uDg^~ z%@`cn|CBvsgY`_&N zW}2c>Ls#%(6Js&ful&Nh*OO0OT6=qED}V3T-MW5t-MnJTq|ury(V@+|X807e@LM2Q zUA#8S_K#f&bao^%n>5k=JiFC;GP*#9di%+-?H+r;PRAdi(_OwkL6_%rM%`29y#K|< z?72w3k;yuwb1Zw`%Z-de>)!Fbb@!QPt}~~6sQEcTl}mFvJdZXuSm$wqxooIbtoyXP78 z4L|ta$JU2F@WHkdC!Y1dde(yvRo}Po^ME^4Z!m#(ey!21yu)XNrKH{xV9@J4%F*@Y z*yi+Wp6oMyZ|ajxJsn=V$Z4+Kn*d_k5OsR(o(=!U&JGVdt)f6q!?(AW zpeYqrBeIhKO795+CmMj{P>Je(V_8GR0j9v{Zx z#-{P!O__IT$bvUKG*%4^Qrdour6uRfqrKxbzU@&A9q3cRy68YsyJsrKA&qBvqas;t z@cNAiECLpI7=iMB5L^zz19h$M$HC8a9eVr= zZ}G#_J}^4HP(zh_l?Q<<@{r8OMY2cA4w&K`#pK8ifoQ3H;{$x05GMHn=veE>*sG zPY|>*!sOW=XWBW=*HsO2?wf8|IpKp5raa>a8YS(549V}MW6S*0ojNYbhc@jG9q>VL z@9e24^pJ6HqkCPiTV$ePhIq>0tdfsKPL!icOfOvcSj~^_WGD9-MWC}9t2i3L#RmU= zt1R+VDLdkdv^?iPs3TjtRa}m6gG<~AtgTMfFe-}!lsp}6!tdY#75u{A!DmL7b6I`T zu!7OifRx#J-+{qQ)j@|_=&2?YT$WLz}=FJqX)Rf@WzzT8lN$cn6IzM{i*lD%-X?QrIlyqb>x;9Q+ zQY0VQfF)g0B~NHq#s*9O$!$gxKFkKx=~i~&JC@h;?ugt6kuL$<34U_-4xh;uZ8?{o z1HyK&UjkAMSTGs7lMb$&7*H(Z?I;~tNas13xHc`Xw1o!(Q~`a^E1b?CNZsrfUXAt- zcJRQb!6%vU3t!NabN9h1t=ZWX4XVaEsL$4N@fA;phj6l$|E~QjK65XrJMw)hHsO7b zTv~tWZ~pW3^?&Yb*V}*cwQJ{A+L$=gR(R6^5G0y;rq{;Cb7F&s`qNIBz*E0tJi?D8 z$;LV7sEvcAuCTAh{ zV_~5i!^nEtB_9rEUq9iN>N1w{IZmFqXPwwR)usG>CdOzIK3@w? zmg^^9IwpX)mHJ<3)w}(iP8~K%$S$)3io}VLchaYjX-^_~WrAS#0XXVycy)AVRz<91 znLkvwe&tynrcP;BBFEN=CMj)bJ$z&@*X(QXy>=mbb7@_(x?zGxZPeAP2kTgL?c|wz z*O@a9tRp)<;!R#gw@*wQ?}hSs@Is}04G z>KCEeJj=N>I?&6n;9Obcr=6L4k>~Uy0NZ)g_BSleJ@@Ig&W8c3ypR_j^j$ReMBdPh zFP`Z%sSltHs(tYa%Fep`-h0>Cd+v#P9$D}I;A883AAE1>$c@e*@y*M#4?nn0?d`V1 z7%uc0+|t0FgtW@L|DqSck&f9hism{}>T%GM509i#|8lR>2Xhk-YOiyg{P;RM+f*A0 zhk(nimW5|i9!`Qe>1^~(@#>0naK4((Rd zyZ>J=?eow6l$Wm0eZ@=HZ~t3wh$SK~B@NBDZ$G+T{YO7({r2DZiR<%T@$1*;yyDko z|N8Y)ut7`q@@#|uv_WKw1~?VPY+&I58s4+M`wzclefFpRy7gQC`s<6&2EBFYjbFb$ z^W~qgKI>Dm=lEM4gWqSp{2SJr!p{;N*lbXPkw?C5ef7&eVSUESUc5g2lU|g(FJ52y z?T-{D9u7|M8y?&GZd(8qN9o#j^ilDs%$?_7kI9FQs93LUeTUjb9!zJSW8em-+50H) zB$~3J?>lUz6kAv~IQeaRtNix{k?T`eujQ77}L9R|s+-I3ltHo)^dNGaMI zc^fy_m7Qz5?Xb#0Xc{mhU3%=Th}bEANn|94ko#i2j2he^Bv=!?7!`p?8{%xHFPb)U zbw7p~7n=9_I=FnP3bS*3Zz^)``!2}UtJ7PIPDuIKt{!kkV5U)+j-YpoAfhZW06t{P z0f95d@0~o|fQ>=*h4>>0;>`c&KWDGmWOqDr@(!0^+B;ZQ zJUn7Pe?T_)Od%S!j;b{fNrj0F`fgh8adgHAqEy-hNk$h#n!FuR2_E!g0+YxHPaN?+ zJTDDBPk%w4w$;OMtcO(;Y^Y7U4n%d%;8-;H}TXil!<)EFjCrvnAS#p>(l=4>#G!Cp)o=aPY zAW5qeF?`eLY#QObDgiU_;CSYy=)pE1tXbP45U7d)`l#J-gplVro^0fiX zb?r*ZlZgE2q~{vLnQEmjn_9CCP)C+6CopfP!PWVZMCEHow!+U)0%G6@2JOR}IxLRK zUpa!4z0Rw&n`=88GHHO^q={Udr?%AYw0AOe;v*`ybd;9xlpSoql#TtUlbAF$m4mqw75UmfG5k-l{ybXFY2HRRJ>n1l~ueP!5BSVW)dn1Gk<=|ErI zWh2779Km*EOKLAuM&EUe^Lo@$|A+Lr58U=5<3}n1U1GUD{ojJuBPgkXTkGPs8(4!HV!JpqmO zs(P1w-gn9tCe6DiI$$3-JnYBU%rq4?_$bGz!-Zc2oqGT1gF=ooJ*Ngo>M|54vH3k>zgs3>ZyN72V^TOhEU zl?&CYqp|6G<;jsFn^lQ(|Mo2%$foyS>PTcehWGbN=k5ukRQIjDGY_o?p8vA-z(>6( z<;-Y4T{4ry2wSwIcxbN#f$D5KqSeCy;(K^S*ymd`~-toybIow;G*5*)9AeA`<*^@cHMXX1MAE^ z_eWoDtq*mfx|ySt?yoc@l*e|^%E&`i!(au zpYn;tC0W+i=BRu+inot`$JegE`?i;^7rwYzTMk<2z<_(n`ik%Tne{_&u>W*$eCvAc z8^3maqM#xPw)>;s`TN&re(~Q}&wb@v*AKrjG$h@Ryy<7xH~p@MS}q-&(fR-l536(8 z;26|{F1+ZouB1t)jcMAJF}mJPz&xLhh@^8&z*IbvA6x@O(itr@I@K(BIwM=sXgQ>z zd$a4jGfNCly0B1ewf3ZVbag;qgxDbE1KpDTpdkdx3&DTyW1z)Pl6D2Ui+A2@C~%H9Y7D3_U-O+%YTh@b#vv^x3{7zda4JH4>qf5L;@ zlZeyL`A~TUB&MSnk@8Kd_8KJ>wZ;R+ct%pxz9?OOXbp&z0bip?)5}?hlk&CoU+ZZ3H+ak7gWV9FQHB`Q*q&z1^GUlP-g;|>gDJMxhHS#DW`QmoAOj@jo|QS z@alPrp|kDf&hud2vTH~4%ag+3(`=CaueT(T3Sau}U49|Cc=lg*+TuB1TDi5C!KwE) zJD!;>ar4&E_39t~>Gf5A>MyN-{ZIa{b?L%m$z;SicIU7L&mu~3_UV7>yQySdmA8Cr z0d0S($0jySGKX*3SbcvMHC`V#w`JZPeKLAreHFPFowW0e!x zq3hVu6O%rAXp2SI@FZ!nU+?(@L@g(Lbl-?oC0)1)i~>)I-jyq^Nptzih1wUr!Pldf$CYnP%Mfj?6%r;g!uow#k< z(A`hPFDRd zrHkuI_8Z~dIBWEB+Li!V$5Xe5BWR93siWaNd*j@rTgr$ourICed4_g%ole$CjSxAE zgy4ryj*a4F3Fq{Eoyn>%8P6dVVZz z^vP4F6L>wi&Yr!$?dp5q^{(~7_rAA2nqUi!d`mux#m08doLnFA+y|@AL8!R3?kQ?6 zi7PsS*IOGi56ge`J9um3>O#M)|yVeW8`qk^T-;|)LdGZ&$8}tRHdhxP9_p|GV{>*P| zy$;1wx&sE-Z4!VBlx7JM0d zgST+U+u)vZYkLDrp=_IU`By&H*UT^M2v5gOY;}pQFu2tNG~}=M>(r*c0Kh;$zehtW z^!#giH)1F;&Vm7Y+!dtqT5w}0fz>t|ap*@IlC zBNm~fshkOXRFc5QD9({`DuCd{ThM^j@P%QtSta!j3n!O>1o!fV3o)qs;TtAqkF(P` z-*F(lmqd`Nu*QY5ab!9wk!LjkVG0~ED}_hl;{>IQehVzP;+A6_<}|pSb`(DKTV=W5 z?}0^moa@D`)0b@5u4vpwfxOqi_~03M6k>YWDNmFkY2f0VAf-()rI8V41XXmf`*F~m zca$i*`{>zj6k|r{C|CFwW$Xt|llHo)kD;wSy~%SuIM#qApUO%}_b(sB`A(1*UgFJ6 zmm%IUG~hBMf*m6r;acxs3;t*lL@^9T>hz|P=cP;gBe%$0qo=F}Q`n!pUf8}8T+rDH z4PJDh(>?=>K5`()tluUI|KZdgXh3o?4asIy%z2c)6)Cz(4{Wo{?cjSg^qKc=6w*fi zEiXJ!nM-qE(BXg?en%eCnRw{LoH($i z0dL2NUfjr_92&6Yjng*7pw79m-_gW8ANfpRs{@37bfZ^+bv-;qF&@`eh1NQ7@+uQPWSgDMm4yJ8UwQw+5?vDek#>3ksDPK}GMPY24_&c1_} z63IePg5Sy(D0PG=&*2elv%!5U^TE3ge7s+yDae-w9Ri))Eq>ul^S3VNHy?^d8(ogP zyY%@4W6JF;4)p+CxhFrZlGk)d1+^Xqf3{EnXT`pbhTY!UGQnKZr0#0Sb@tGeemgI) z1$NTV7dV1GpFe;3yVVq=d~|em2kzZ7oI5-23bL@SvamZ(D&=H=fx7yn3H9kd`xBMuq z@;$gGZS7R{!)b31AK8gq$RYVG&;d01B7dWW-p9ML|72l3=ObUV?!EtkwSV#aI{%>$ zlqc%64htyJzuF2qkn+qV**$T5-FwfOw$;*JeConF_rVXY{qq+!8f|OZbC2JV6~~ZV z`hIWee_Pl!Vo>+L|CX9XR1n?KRni_RUfITAg6%Ff@O)HR>h%7|@3UldVh+ zj{`n%lis;Df(%)b+7h2mnwvHyy1KE)OqDPKLs zi~Mv{ur;+g=wwUL7MbdV(+03n@OKnAgNphbX(!FYU%I~0DA4bIPHrZXEe~s3lLx2KW~;4GMs9)q%;&zO_uZTNF#ER6 zRfcqmZL-`@gy5lpNOetpngsPh@=PA}4qb2jYkze8z>B_SeeuiZ9@!wNwl(@h#_(&N z$lprhV9skHDceF+$@rev{m}Y_^~LLVf6=p(Pkojq`?bJG8akwI^AFrp4!?YGR95PG zp6R@*zXe9hR&Ilw;Em4u$~n$6_CG$&W=H*2UfKfJ^`HA34S@^)>^YfZ5UJSkeY;bI zJW#s8Hr-ZV@W*>&^&ca<$}B1S-gM!V$?mkg!!0<8 za~%S#uoI_fXLs#b6vHzaqNs>xfV+B23_WG80SQv(`tfJ7%K0ANW*ACfWjH| zx*7wmLU5AX%M!!5v%9zUPRu)Bvs|fVXrr_#T7{<>9LTPC75pmLIG4VmVe?+u{>5_@ zuBGSqFP{%y5e(y;!b?Lci@=b>b2R}5nmIdgVP*BUGLRUnhvZmjVl?1ws-o#oj9UoH z{ms(rrb6bZg4IBC_RtwVT@M_UZYRdMhC)Rmq~HQ?4#+s3WI>QQPr0+Q-(AZGqBX3i zV(8G|y5BxagW2K!Hs~BpbcG)bbIPDRf{Hq+xvl{Z+);+L&YnJV#|(^e3{FNn1YR0K z(^ITs*ab9_j`PP!F-5Q|2IhJ5MnF4yvw~MtYxvEe1n-=nlQx zV4Lv-XJm6L&WCpm$ah9a`^kY+T#c|1CX0LAigVNkEa^E3%7AF6j6}YSYMpKJ$bH7q zy^b)3&v?^DJ#qw_W8CR+@CvWs+m)R{v+0sEy-*Kva8Frvtdq_tB;H%5-*>^vBl?iC z7=n)S20wD@>W;_9K~m4^m;@JmfS*x~ZMiD6>6x8wlpVgU50OPBSFgYoIHvtDo+|z3 zb~YnCD!5#nr6ARE<$(`pqK!}Mah_}7@_cKU$VNIF_VzdyC~!>En??)2%j7&#j%!Vg zOzmVy8DLoddnv35Ma~Tu7L%k z!AW5qRR~StO7j9?bDVc)!e{ulNNK{2@VER49&BEN+32S{YzcjZOgpqve{+(2xlW$q zp7XJ*WB^WhB5h^3)?RGEQ%_xA|L5QN&h_X2)Yq)Hz5dnf=GDu=o$lbf#-AMwJy>kd zzm~h*LMVG80lemu4CF=Df>CM7teoo)LIMr$9G#^fp0>P>Wa)%ZxAJ#;Y{~VT^Um_v zncx>%BIP_QQgtTD-uqw58Yj!fKH^DmNuKTZ$k2cDR@$BNHaK_GN*#wQJ|&H7=~B0q zEx5sEw881nA@$6Pc>}ZGolO2gNgxG(Lw(U?$8^Qj9$2LgA zmcduOOvx!bw!a-->|ppGoo;V(;Lg-zoe|NM&``%N`HM^1CX18YP9SCqXh-+UBb6}q zE5ZJm`yN~$|0$oo?s?#$wl^Pqw`~bl<+q{#u*gIWk&zxB&;;)e5g-e&$ zx${q@?Yy+E#}6rs(movIKIe^faZ`t6ZEj?EwV!%HHXbEzIR88-;0)b@DnMi<7R0>*^KDwI6i#q$6OZ0k8t& ziM`z_sQfkLrq#vx$X{`%yeompC|_eJ%6m)gU#W6htRpJc#s@wE3H-9Dl2D%A=A8Xz}Et$@pf}7+cN_&v19lK7b(j__w&Db!q!evRzPlcL=7)C`ewAV z-#rT*8ng)x=v&f8hR(-<2|l?d_XaEMS$^9QSDjLAlmZhhX%IVgeE5V-&hgtjV`W;( z3+gEs-*b#yjQ$MnV6-VIRct6G)gC3k^16~~VTG5u#s?dRpbl)9S^0v2v75bF1WWL9 zFGnm=hibo+n0x&O7zN9H_mo98=xT=(c@=)Z5`2JIGX2=mz4f}+{nGk#f99{O*L?dw zTGtPr=qj{?z^)y{4(o)fT@DY+mlmlF+VT&tVU@a>Bc5nG`YhY6v>$C#>X`eewzPOB zFoRcQSsvte>Wod>Ku_uj;#JD%=t4Ox0eR(_M{IG*(m9hFSy^fH8^DDpoQIhb$u_`) z9@3dP@2+^Ak(>e`{L5CSFt9^vX}B#AbZi#%Xm{wM1lm;f#0cR8;M3VKHUl3!Vi;WD zSjW)fBc>WAEfDZc0^|nV)VCo3e#Q;}Ae~#;+MYP(9zL`# z@^PXs?R3bq;m_0O0P{h#fqwK;^=O-dWs+py+H$&=v%(yksy^j_E=Yj8`B&L=PkDHs zbM~TTzUN=8fAxK9z3{7k@A|~t$E*5dx8JkA_sd_}1v5V96~BIc-q(Eh`q;1h?)5i+ z=R*NH^nj`JPVoY$U>sjk=Xv~5oy*Euf%Ct=a{bch{ekt{?$_xd=!X|wbsfD8jKTVC z>mUD5pR&H-Gd?-{r>@Wcj4xlWdQSqXwm+lWrRgJXuQ&eDPgjfti{NL$}0Y1K2(-48O*D2(zaC*wOwBNbd` zYX?Wm%H7;fTOMb7Q^_=-OfEyK06i!wzm@nn-x#a6zlNj=r;_Q>Jb}FS80AqBP`D`( zo!hCPz}BEz#S2VR3K4@LS1up)y_{=--2gA3mG7HH9GJojks@l#jtidjRBLn?t-TXo zG7j;9&+zUX+fBI%;!+NSb7y5c&SKzn7(D?SWz{p}BgzF(u0;8xyed>zpbIj}gL`Su z{RWB$SJu^QGq+w)IF&&oJgY1*KJr+g;zpEPMaAcSfH`GNBSFMtXuASoP$(MN&z#;1 zU-u#xj=PG*nM)-JPKI3Pn_e8_&>Wr$8qfzoM_UqbYJ6vOY8=`t{lN3Qs9wVYY6>%Q zl%&)9pJ$xtGbc_YSEwiBT+1T|dD-X!Bcw4Z4|2a>z;_-v9AE+AzEP~er&g^1b$Wdl zDh50FR@o69If0iO#i6};x$Hdil&4gmM^G8$(Xe%)4~N4%2v7b+fJUhiG<)~`-4Oe^NaAcCJJ*RcFHkby%_F88* zJyd%6X&P9$QCV*t6OG6$lrTopC>{6$LG34*X`Dgm=xom0k&!ymhb=Sogz%1t`@(9j&RmF*?<>wH3o7eC)Kx;5?2h+2>qG5BcQ2vMuUjMK;ctd?_aM zhc~&vgF5mlmtK=cM`m+QUq=qJnYz$kS2D?uO|H5I5Bkm?v3WMIDo*$m{^${$wo{^P z)1V9=++)8`f*;BSV>;Txk07qcT7x*f=;66E%1UYulJhz+^_+4I)1(8la>z;fn8=KiEHs?>HOMRTyXbW5X`v}uyBodm(l$jEHrZJC@+a6^DjgG96@v<>a< z2sGf!T)j=Hn z2%mTEeRy3DAAEp$|B_Lx^Ibf{YZmZve)8-+?PT>%_~rAL)`jy4x~>`(owk8&_(E*# z$R7TLFzt2QR!nj)yS9l>lEjsBJA9jmeIj$RP8*-RY&u&bZRL=%)bR#6`ID9$*r<{D zjMQsmXQUx;b#!g`q3-6i9oIIxfye!>8oAM*z}9xKS2}F9M|-DFt<(41v+jH5b5j1% z^+W=$$KLb4_0)%+S~ssmC&?y&%@jb(*5(`K_ZgwK`6(NF_!!T8{`1$FyU!MIB`PZ**O|hW@ct=pqX|3K^{nwRP-i0MxDmPUrKC%;0)6*I+cL zk}*h>@0(-&9B|+f0;Gr31ZDJ7`6(NZH*h7rvw`K{oU+eZH+p${J+fZ)^?z&q!upc+ zKm4BO_Wss(-@5he^#%XnXVz<8|5NJ+UiX&unjib-^}PS{i`MV>v_G_7{a9odxsl)e z)WE^T3f$W=)w!EL{?FGx{rN9gfBsK?%E(8e%_f(>((|%Ex4!2`etdn;kN(8^-XDF# z`tBco!}?2~_jBu?{J!6~zU9puy*Tv9dgSMm@%w*d9sXZ_a=q$D-;}gT|L^m!`Ff$ zM&(S4yOpvvHVwx1FO|tP#DR&OoO=pwYMM$bNV*WC%@CUlD`4_o)5Y_%A`oMySD16v zMK)5|2@AaxqmFrCay)kh5BL{8bp^vTJXYL8i$LJiuI1wK^LAkR0OCd|qC|o?Qw$j; zEA-i_;z7FKM~hqqfao@aeMvyvpp4QaO&TCoTwXZJhjts8^nC^_a*e1W1Ikju7oBHNP|av(iwTs8-*8o3(>AvLA-o@e=B%)L^HdzOi#d7 ze;``NHD@aD$?)jdjukZTiX1q60IYtHgj=VQH_cL>1y8a{qMIqqw2~-6WVjprH1we* z$r+e29C(;b+LUGMy9I%HL!*|*-euyjqMdBiUqH$me5~x@={8<51~avDdbvnExZxxD zG?2)7kfcY-(fDu_)kP)YU8lmTmy!l*gC=m$mUO1waj?MhJ)b-Z4!Fgzj(vbB1L~wk zw{!-6&(RQg+2Q40GFHzVJ*yFP%)M>eUeh_;WKeVNUV}1eV3}j_QJ)XdCCBMdkN|Fd z&meTtKl)7;J~uEyPNW%f9Sct*5jxa!4vqZ%ptD9X`P&#s5*X#}W+NA<&?}-6U_s1hI<~=M zo!{WBvt+yMi7ZUIt-T^vCSPVlPvifOr<@k{Ui63D=)vT@Um-rw{4I% zv#%S3A1Cj-d!4@TOwu1(PdxU%_5Sz1XPtZUT>K=RAHl0SGV++&59E(l*K=Nb61>{3 zCa8Pq3qGRDqBPJ^VCn~Z)njnUS?f@;bZ`5TGVq|wmT&ZgT_3%iU7+PYr(2p@sf{kx zzVIhhl-!(FCNOf`);P6!pl6qr4(7gd_uUmG z*iiYRXm9!J|NZ*=KlhUL|NhReT`x}_^4mJ?cv-uhWAokhiuF}*_~!LF>uu{F{>wMi zpP2X3bIkMU^dvvBjSoeS4!v=G%m4B{>jhu&Kdes({kGPJ;srEYEn zku7&y2Ht-72KtAW&EM>K(pkk4kBWQlVVRD`T(rJ8`hhuXGQd0cbB#BWwv50pzBz~I zbWTbZ02IbWr)V*VR}R+g7!o53ZD2VINylJW?Pum{r;?`vYY;6+U_{|)f+y1ewoI7O zo4eLMci-EfLF12uU41UWLr2|m&s4P2ci+8EoH&ty#qqyd}hbMUUukTPsUE8y|&m5nkf!zxOK zk>O_146Cj&RCvJ15iq*RO^;F?B1($x+*6*omXmOBpdk)W+L%pwXrT~WCom;95bV2d zp;a%Um7#)eugj~Po2Iva;2Uwtk}{Repb6YgpV%qwU|zqf5whyt;k6S7K|pzQv-Em6 z(BD=b4bYMnU*%=gS|K76y-*E&IWF)I^YnIbis8&u_j_vetT>YMyt_dhHCox)Sr8{r z(AD0P@UT5P8-R@J2Wt~ zktx2Zz@Edofo*js`Uggy_oY=v2;xa|SJE&5a9WUP?kZUxl>-gb&Zod73A9Y*;OQNkI^hNtlI|(31 z9H%$n3f`pdLK6AqZtiCf42_6JV0yjKX`gazXr7fF$pf!)-(Sk@hq|+oTXhGGfos~+ zEO;`jn+^TyfApk{U;qSO8|-yn2S2GVS<(N&zoV_PMi^vS(R zM+$?#&WI~l?^=KFAG~V4@*DoQ^`W=FIrpMNNx`1!_<}o_0uvC~-pV36hZow5e*Pm5 z-Imr*K39i3%^hjsUGDdov>al(jHjjwZu7Yw467ANtnC~iV=p}StDO$8SfSuFB;zl; zW{Gop>}itv3+&W|oZwjNl4lUl&RGxANki_Y>nSPllV^HxwO6Lcp;>-(O*;h7It`mN zVM&5k?-2>K0xxx?`W@P~oAQqw+iM%G%-Sh+Z@3>kIRKkBpq&j6!t<-4F?i6=z-aq? z*G$Q)v=d07k#5(9XY(n6Y(lI z)$tB~aKL9B5!>mAHhl5i#;&x@0AJbVSrFaOfoJ>~BH2CeJ72r&Sr6R1EOiEF3yb&0tcY*8YJ!$PFOQU3MA^z}_PM$q8i-F|+RwvNb z85+rhb~3Qx6ME~^hX?96TgGSNPiXsV8rfypV4$$n3+P zpQ!FW-6oK`l(>=KCb46k>7?s)H}|vQ2R72z9`ozSiS(fKoShh$vn5S_(&th617GJ; z2OOo^Zpt0st-0XoZt!{ZU;Tmg7r$?<&;7=KzP{igbx-*zsmXE#Px)ljd>%Y+J^Z2o zc*lFz`&-30{()^4M(l0<vwsZ)Oo@YX?g5m#2P*pF089J0D$-xgRQ^vEKE_`ap0(Y}=zCjR)OA z?^Y($8U^>{g}*F)hDq7l9F>1Vw{(1#zIUH}I^n|W(AoeNOuWp|K6X#pQ~11>N3Yb4 z)YDvdWHZ|~jqV*ztb(6q0sX`A;$d-Tn4)$JI$<~_<1d~?>-*oZ?amwmxj@Yv; zE7=OSbvJpoI#>H%ymQH@aK`=g@4v1mF<;>|5>#UC( z9`{0fobedOHYzb_XU?7-+%PER1=%vMQx|YD#^1M02p?QbBp^LZ6lO2MB^C-i_b-PB zfgAP|Hs_c^XmABLdz&EClC#RRm`EGCq-TbW-t6ukTPG8cayaZp^%%Yz*Q{Q&=`r*_ z2eb%)P6h`C$BHt(m~UC~3FIc&fx}+Plk@6ks-_o&IZOu!_-Rzok z63TDmwy8h)*M^9}Y8?qa8h4F<>uPudHDz{BIm*(}Apo`2ISi>9a$M8+Ej!5A{$^oY%%K-uV zt-jMUda<33Xxnzo*m?*d0ayL7!H2#z_z2t*|6%FLcVr&g=w5E(3K(o7JBb%mk#pnT zI8Nn!QU#X+wJB$EZeL0c!v2zW_ya$q@b7)>V13;;{O$EGzwKMrh0BjuhuHg0nT>8h zfWEYICHdG|&%mg4$$fC?g-xeO?Lq5tWHPAbUig4PfmfbqCydI;NK2kUi?&$E$&{+6JLVwYl#G%B@9KgH;EG?$Ru@}PgChvg&5>VWY;?HbA@6x$z$H%#vjxJraPoX3 zo6&(yz=M|X1HIBrU1-kmU3w!vcsa8meDbAJn2)AyJeokl=ug_ac3=hWwtmsKI(n2f z&|siTzx0CHu?d_aVH=vC)-yaJ4vUj0H%R6Q{TgT6!*)QRKl#*Ib&g(7{S9}63tL|& zhK`394aDm#2~wrm$O_MI#1X7;SK_zmNCsO#q(cqWqmSek_<@NJ!$*1)pCMfHx&%Ev#0Cr(v#GZmn?v^HLE5$O zqjoZOyXCXBa6v=LFfxROZO5u9PKW7Pm&+3HbU-5x! z@X528(Geb)8Dl0*WZ_y~Ht%+9+s=uT>+XB+ScC5a>PW70zr0NT%EB&v^0q^-=(!%5 zZi5n?CDreiKREVzc6duO_B42O8~v*-g-ecnmiK+f|Fr(#H@$Ve@K3yYebpzYEHuNp zu#`FXwy?XyVZCQP@^b-%5#mi2xA z@y+Xd{@okb_x$^Rv;I&=v0k~p`$yim{^yqu52k*GaQ`a@)9#e@ZpEo zCwUx#Bi{iUeM{bIoOW`nd)ekOIn6aS>wA8Y*`0KSJqhr*w{yAe6mL-F7M{2dPidVO z#Mbu6-$!>&{C^sooabU2;JYv1@HQzO^)8xcj6Z}I>esQovx8vH5d!gB*W$$PTi*R@ z8Pj)jl8He#TwSXdBXi@*wFDbSTR|0I(S-dth!!a@B6RBHsjhhF{@%%x31Uol^zEA) z>&d5{tbrATfjv{c;#{VDfn1~77)%YG$X8`3&cUIhV8K^I(owt^ZS%HG8?bYNQ&0__ zF*JW1&0}e_7+l8M68Z8X>c;h}#c2eT9E?9FHa`tPN^dZNMk9xv>l`|8I${hily?k8 zowcMBcnFXvb_1jYN_a)_jm}ufOywa9bQDRFE3Mf>zn&wvRhXj*RIVoQs?kCh109Xo zPSIqaeJ?@p(y85@wc8*p*A$&>^E1+ATI9jOerczCjD-auQiB7>lpiK6IE8M(NR>1^ z^Q|*R-bbDiRVcqD&9yjGUxV2>%%0P~1Ftg7Hv?L72(DPB+&-qM@=x@banhOs>%()pKXf`g8f zrOb|cMNiw4mTR2=D!zBcjQVPPXQ|Whz4DmG8ccA89)aG`q(?hkH*!k)R^mSAV5f{c zr*j%pIq|rpC0&;=4ovr^Q4Wof6+Qt2O0?U@Y||0Qw>2+^0CogB!WJnNovC zf~AgHaXXFHFkEW7;3;qAf!1Tk*Dw9z2iDj9g}=4l`eQ$|_M}Zh_&8cz zNFKqK)lc!a<>ZJDHV%1h9-S|pqhk#oit7ZMGbJqd59tgU`wKP|xZZL`pYWA^HvJ5r zAfi0_T3+-T_1W_n#T}6fk4CqZIXY;G_;yl2H1}sz5spdKvf(s=k2LfBFLIA=92)0W zN2I{vfJ3QxQcrfWX-UkUfQa0sZGb9bU=Kx)4jmG0sogTUx`S1tu zaO#_m2Gix$7t`vJHvBBHp_~0o%_%MoH0gbw%CnVMI{=d(uLH1k$g#l_eaTM0)n7OW z2HW{dr*d!S)YuDK}*iPpG)?KE!Gqsk53~FS!$bv z_)~Y2J2DB*!GSIBNI`yZnsSbE#9TPiX+$jM6;66tIUsk;m0IX^dR~nk9IgJmLsHb z1OCaGzwPM8)?PP#%2mg-QDCeV_Hn73}detpv?f5Q5vpGf)vnd77DRe$7w|+c)%1vebN3_x)>q>{tHY^-1!k{B1y~O|VUU zRVEG6riHi2#TvV0+4-*ZUugpwNSE`i!sz<#>zpKJWCZl`G~)r}D=DG%!k`-g6LW2-xuD%H_-J zVE=L)TPq*lT6?F?bX6VmR8JVWh?9#E%B)k5QGsXi4~B6!&ba62KXk6s0tlr>HRUsc zn1AWqQ+al2-3p$UuL#@{Eaqryh0fMW5ZH|2!PQx5@8abPF?g=8mKzjS5ENodE5qmm zl?@u>M48Sam^?V}e%HC;siB=kASlA2&>1H_jx6}8+rZ>uR?RU1oS23(OX++XoU`{^ySWMz_cw=#l zt>RD+x^gK2Z&mFO^wvMr#JgTa1${55O?8j@TMaj zG0Q#9I~m*vZ+y&=acYk?93uNFY_6xbb7Tv*oir5q)y7Cb3CS4U-V2?sTOBua3jhR- zm0j|?&tNi_0^gv}(J)Kilbtm5a-8kxe)(p^>uBGJ>{MIzAoP$Np&Gg3aN~7*IFh&D zYJp2==;%)_bTpVEP=k$e0kGu*1L3_r3v}qg9t}cTaJbFEj8ihVvZaOwMzT~694Kh} zSYmr_@}NOlp5s{q{gkV5()jgRV5ke@7>(@7qQO$q2{LlC`~m|#9p&2?G4GTpACIdC zB^O@@KfR;vScpzbNM~AC1C#UQ-Vuuf#6fSPm0d%MPvJ)Kqod%%xlRqpy?%P1X(419 zWU@B^Ps3OFfeS{FVh*K5E6VX^?sP<~4I^6d#B(+<@X5(}btZ7*B;phJb$oJ;`0}YZ z(c`2GzBcqWXa_s^;4f#1oKK%V89tlVs?Mb@L{3I(m8l+>dYMD%|H*>a0;!yhN`NckMqjiaGg zQ6jv&!{?k@c;+o{`sMZYf8j5#cm47kQ@7Op&=-AyYgfMu%yz~^2j#mSy`ygd8l1+d z45uqs-?6f|#f<3W8D6U?foWQkGQ9_7>eU1;u^lK&J~KDSH$n;y7Wlv~^lT3!Ba2ly zpPs!*^x@o%k;3RnR zkz}1xKJ0wxP|6Do0a-_t)t$NkcxTk`YV3{?FEX8W3>?8F$IA1zMc3fOt_$Y9FB^SJ zQu^DD3#{%n8%zsw!9fxH<{{pdZQjxJl&&NL5mhI{1*34a*B0b(3_hJX;TK&;e{qZq z9F^N(EHrl!lS;roI&j2iZ^&Y!-w?oS&b)ov5%xFf1B<>iunc~!Z%IGxH6(!!&w`hB z1h~#2%@ihd<#w*Sg|?!d`|z{~fEfsBD04IAwchKq zy16c%J73-jQ1DZb1XwU=9hx>_Mo30BFjM4mQ2gKN3kR%x3eA9Cv!z{NZJw!P$} zRtKve>|tQili;ztyO-ee)H-?pnRWVs`)9gk(!TEl=hu7Q`=JJ14d}}2;GA^@WC;4Lg!=3B40j3DfjSiTz~wPU%X!PCw^V;PnzGczGeNH z^{sFEztX-fM;>vO;K3)T<)xtFj1 z{?k8s{fZ@?ZU_^|7!1s`Yul`DN?3|K?9z zpZ90JdwtH|e9QXA-}#*4KsVZ^sDm;VkFg;TXunhMZQ3Mw(T8lq&(I_<(z3}nZEbe^ zSKo`b1nR&>=R@mOj_rhpLw*~K3TIY(RUV&dYzKD0iyx&83`Ag~|HYD84KBF{Y%U?1 zyyGv~z>{F`AN@#z*8TBo=+o#inr(+Z;?w_FQfPRfwAQ8l3+w8WPpq5g-rx67?tSLN zHGX%e(q0Sjs|i?kVjQldGWyE7-rv5+8b`vsYA_Dsgx~Xw`_|?27ZMP0L}N%})bt{p zx$mAh-@9x7!nt6T>$}f37&!m<6J>1v;*1_&`w802gFbcgWE+=DmoKg>`_~c-1o0T~ zu%sg*rkGKzzDE@TcM>SwFnx}*c>6{i=u_+B`KRg}9^KjNy!ev|0B-6raG9NF7d6Xo4iSf~cJw0Ru5~CEH_1#K9W5jb*1B1uUubePVMITEQP-{V(32is^C zhvDR@y%`0{J+kmE6S!VV(Cb6pg0@b5j0`;kr#;BYtKmDGYr68(2OnMU|KJmGP*slL z6)Z|be*<=G>P-Z01Jr3tM&tQd5foF7eg05T#mWE{~^!Hu1 zq_N^&7xe&Fo;t=BiP`I%_^!qkboMV^PFlU5(HAw42txzi_t8;-PVWbZ$R7#842ylaGIJ{ru0oX9k3&wlV3>)7r*n<*j~H~QJ$$rx~WBaQEq)9N7{!R_dn+ks1uAv!s-{TJzv?H*m< z_D{ckz2>{Vt0S<}Q<}1(5Wd5wVWaPL%A5ao^}IN<4XKNLnLRK$bw+1QTQw^Dz_T7~ z@ABcJyX(v|?p}|+`_Xm7huR~T?G7C<>+q(GPBCiT4Y$;%=nd?Z9qMzu6`5?N$HgxB z=qg<57$n~f^(=bR6&&+7y}#jk07&!x_dK=!;2-;n_51(eZ(Elxa_j>tFz7(Qlzv!s zYE~XLi1VPtPx*aRy7I-|+S8%J~n*)}{Wb`^n>7TsRo@2^Kwa?gTSF zOOjM=z~~C`mT44~BDJUUjBr%&2zj za~{yKpcvRGH@eljK>k~pd8#PqVN+0}#lbl+IwH~}xfdNTt$rMLd?(8)Tj+yB($${j zqUZ-k{%5B@<6y&l?3PXn@;n&+gOTmn5uHPO$xA2IvB)DZ+Y^uOIuC<)+cR9=yp&!? zECCi7UJcyVh(6Lo4nO5=?%_w$mrw48&^o1?t&S;vhHehm(Fn-9;gyR(EkCvqePavA zUuVpgC)wZ}{5)%*lD%~(aO5>27i-@-u01TjWQoqO@$K2p(Q~)y`b_W6Ikbb94g~sf z?*k95GpFxMzCLaTqRvD-P-n~I{Lz`)N5diYC^%@JbcD9EiVZ#*{No38agG$cd*bAD zrjUoWkI!J_sJ1q=ryMILlk8o!%i)_&*3eL!#5Sg0R6AP_;_Ryv(LuNhfY9Crbr1-E3V%-7nB-*bE~?dtI(v2n*+p4l7h$>qzJVtZ2ubIwPi4}6@y zyIKrFOJrcAuYOhNFvU=S&pxmTr4PNiUtI~q#}3kMosFR{`ts{P=N0SAKKrv91_VAC*WOnpbAqN`2QoWdFjGoXCtuUbm%UDQ@Ke|8 zKo`DZ)p04@NX|RgaG11h`*J;ZH)*$7q#a~aWb#IK8;Xi&b%P!Y0`h=A)OwPw*cR}} zUs>|h-vP6LCT-7)V*kx!=LI@t!CQGx;}*JWbI3G$Q=2hmbkx~7T}pmcUE9$uSKci_LB z{Q-YBO9Of#lY7Ivp7vRp8@aI4hZzwg0U~6LMGZx#G$hD~5*&*o+7*EGek3E~b8zh- z&t@u1zt44ix9>Qi9_Ty-hJ{!N%9;- zfyKbWtLcfQTs5lUY%}+y*4>AjLI{WQSVoK&vG9!rz~e1p0qdb+Pr{kgk^Vk zr-HhCyK zUedLjSJ&nJ%atv-WJ}Rb>{)42qmaPln1wj9hi46-I1lAZlqr0pFbpw6D+qHg2yWFgDu>F)mZ+`|T^We4M* zQ+&%&2MGHBZ%XT^jA=N?W!`hjjlh&g;}ag{r_@fv**sHsoQKeMa#-xeyP%v@TN|Fh zW#g3Prw6?DioA$p;{@8ajX_dXFRF_%V)U^=Q}CWTG}~}~8eb#eaBHJSMjAPa8=j7C zY+@{SJMZLO>C3Xebid10}!a z=$W$nO)s`Gyf^wp-hwMMl9HfvWDM6?WsXDcT`uyu>riY@(ps8+XXjMfOAAy*pN#t5 z3hcnWd8dq#9r?@#*TBZt@LwIo6C>k-V7ORKk^LBlA$ZZpr0LXq_5oe+N!yEqqYvu0 zv6DN7*ZTKbV@a0}eddI$|UnR}6i*(WWx@+c5brVix1K}%>t zR}$tv+>gF|1d2<&Y@ zrme?`L*b8i@90?O^jG}8@=*v6jI!XF@k?^f`Ce$fw9Pzt4Q_6KaFv|X^|FvCd^PICq9cf8|`dq<> z?{aweuJzIvd`!heGuUBA{8Ue{sxun`1FtI}sz7#<^*VXNo9aXE&%zy}hm~CZCFz`Z zqj{ksH<@2xbJ+yNFBhEpj$CMKbJXVIciWp>kI$NG`vyPhdft8T7AUx$B1+Mn&Vcy` zvuylU*L|2&Seq^E4&0|pZMlx>oDAOsw{lHh zHexH7u^r&pf=6z*!vqh)4EAoy7(CGp2Ry7^df+ec?(m{8Q$&hC%o#X!`s`!~5vCg| zC2%URTa0T0g8ew8hmIXz#}XjmkIHUzz`GB-I|&$SRP}smu+oI2@lr!YilyAh4Pr&1wQ_jf~zKouXzKYI47l@cr$=Rcfl!TI7Wzsj#1SH23fKV=#w2fqy zLxnI3l}54^HO^e{Br9@N4%jU?Y2{IVRI3e@X;u`xAJ5J+mBo}QvJ}wevO3bmI>3oM zKuQ(xptN)BeK)I$8~pH(EXgEQt&L5Y8~79*KLb8|kIp84=QF2a#A}th235Y`)JC>t z9EqV3K!iTD1$TK>K-Y8*4DSSLBu%B&n~s;Xs(O?&&UhODc;x82Gw1g&RR&kCUrGHC zm|agJe^40Np)@*SbJMo_9n#^tD$wc&dxFVa*wSl1FivvYJ0Xb;0!nGr5_=L;J zJMtmXp-a!ZP6v3=3A%;9-h+YPIPEDrdNsI{^;~NRIqh3JgJaIsHG1Pc)}MddBkLRg z#{aRNeCn}wu-LZWNrVfY;AhJ;Di1MqDFo-xj6`)K^`eU+gur=Mik;FyF>>^uL*CJ} z!0}w5&{1D-Vsq-O1r~fI+GtW><~)Um18u)L%{Nb{As?ISn!{=IW^_EwO49bxM%U^b zNt`r-sV;^SUP-Uq)b6CCOA|n%W$RFM7C@JJ$H`El^3cuPmuB*715*E@pJpyxx4e9Q zU4<}wL+7=2gzA(t^$<_l5HxJKROc~xbIR}{=UuYhXk3zjK@VI{(2a+19=)s+Ri3f| zu7uh3s7Bp z^5Q!8#1rf4<%8h4-#Uht6cXC6703BZLyl~7U@A*Jr<3aA^&CrR@U3H?D&m?Qpqn21 z3=LmEry^Pu0lx=6;<@Xip8a5LeTvM6f)?L1D%&EFQ<>+~J?CId^5B(!@?(O4MELZJ8rjuP5$a$uJEvBs(ZlTYa|FB9#r=?Iv3!csYk5~o3wKd!6^XVGYW!-(~h<7 z1$XJn%cN5`@Tm1OL^)2|i&KEj26T0%_9JyF_i8Khptd1L^%{O{D?HDy@Cw)S+)OcT zx7_nQ$Ldk=F|(+89$)a7cM6kE`_#_T;8Z_lFX^V9#H%Rd{$pe1OL1gJ*d< z^j8LbPB!Wv#z?c3yXVrS#O(MSH5lE*V`YY3FdaP@zRD*9mD--8A5vfq9$OhUVTztY z;FD9%AYzO}v=Rofw!AR{h_hV0Agcw$7#Qsc1?zAeE5>yi@)+WzVF)XL2u9Gcb84@{ z)i+{(E;iW8%e9 z?}JH8J(F!++boUD(KKo({e}I@3HrSEFnIMnu{fGWiv$(@U~|f_9InwVbF2YlU+`Al$N{0rzfRIo_PNgAv-S0Qsf)Bmd=-`dcimSn+ z(^OKKx5L#80JqAfj5>lUe||nYFqQSLbq$?#GiBE?R8Dxu@xGqG4o^B2pt{cy9_Q5k zI+Q7FTZ4)=+VH`7$}l~*JxSU1pr_C}1bI|L!HJ`%~(|Gc*4KAI}efW82Oa;1}BH0ok&J zXg6|N=TM5!sv#Xm&%1}yDOJZd1x~LuNYkhk$NYj_?q*Mc>{~dFu<#~9RDvevZDtju zOesS{8;7LBr8aUwfE?)vdqWm_s@bGAO6qFrd+V}lqkOtvo(#9`?2__8C$moV(1-+C zHvdD9U08qpZ+!E5;sfuf%mf~lEg2+l)GtT&f=qKAU7_b>cZ+jidG+W(M_?cgcAmHK z#e?8v!`m_hR=4Q7yPm1LvCTL43s?S7Pr6SD`bm=G0ETWyft`|*zN0?DFOqAXs7mgS4cJa! z!V~Xifq&%aEC=7wsL(WQp&8^E-jP}BS~fJOG=SzftjcxndryfBX|q`Tc&~+ zar6d1?crGQfB`CW;jTK|?-U01A)Q+d;-X)%Q%zev%1LcF+YHChj`83nKU?Jr{MMn~ zn+^|w6Zx90g7$vbumn3sHqvBoa1gsI5KO7H@#?7xuRf5g1-0AQ;) zzMMbz)VlQe6YJpe&n4?I|{EwuCu6>_A4^Q`?OhtFpGu3C&-3Hu`kgLNRc^Q zr~Qfj3h#)Mj#O8Z4$pP2!BtSmw%-V?pYU-X)76sM1$o?`QHbbL6bqT#t;Nzu{K&<$ zuA66@<7}Sg2Vgc_+HQ5wH<}AJK9=vbPb8l_$_zmHl+acAvXMjEI2TFN(&0l+>}JoO z#%kb`A%O0;h{});=thGv`Es0m^dV`;wtB^euE;ou_XR_pK>PJoj#5t)+TRua|mL$O} z$wuc!E)%;9Zo`A(yuo$&<2+}@g&i0?s&6T?G_loSSN=H`mbNaLT0Z(5r+i0`-jl+3fz*6#IRypb+nhCpB&}&$dT&fCyJ%`#fEi^fAwl}wg{RhCrp2YP z^?sC|GfSOH!w9Nd0y{+10l?%4ucHpm-H*USOAOf2_NsCq1QnFvXc{8{gnSmD(DSvk zcM@FC=R-MRQ*g&L4CdVTdu7=f&fE+?5-5hAS$&bQ zjUyXp7BR}Xc0EQnC&vg19>H7SXzE#muiRJOwa|gi_7r3{_3y-P8nfKjV`lM=+)k0B z6qf~jaSl{w;?&3r`i!hF;6?_~V9^K$bVfM@LNnUJ7&+g+deFf5W^iFJszh|ss;;!vjlVP zeF>f&?F$Zi4v!q4W$Eb)bB42Pc@{Cyg=fcn}#O_*==_;&?-KISQMkbUHByFz^%DT+4(E&;3Qixt4cRM-p8MoOU+hhsI9%*=I2h)NzlT>)46z1RslN%srsto;p+A(9q#g zcwTgau)o~DeJDDXdluOUlPZsXh`6$jR)C}PB54mD(mqW`208_U(v)xIS$5>xa?9u& zd*!h*$kCLzPR&aKJXfagdO5E?CQU2gA+&39gJZ7yURQYEUg*%sE-I|Oz=};-+Ch@X znd(^U2c3$2Il5c4YPaKn%d;A=<`CX!YpR<`Uwup2On~}mRJS+>o*)xWoeIdFW+x*! z;{DbhcEJy_S6-5UO^)SLHf@ZVB<(TS@X`0frW1%xM(5Z?!2msN0Gi~_rz67S=O9}KecsbVrFd-vOu66q4=>}KV z(-zhyX}?=e0)@8cXa*22bKKf;x4oVK2ec@=wmxad0Q;#BKI!=Ftc#rMH0u;vX#!UM z?UW=kFRhW!?Yq)GgkLF;F=&0Q-A*R6Yv?fF>Fhmc*S*hpU_JAh53Xn2ckeoV`gC9( zSr;!{S{E-}Sm!RD&wep9n(l1YP4JBEGP7W-v)Il429<#y*y@SS5wb0fIUaYO`r1V| z0%O`OwBwJu7ac0i;c?P67{&L%Ze7p$>AO#_7k}IfN~<_a|{YkdAF@zw4EooXQ+?M{%vneC!L8bf54jGv#lbx%E(Vh1Q z&do>M`chS#!zHfP#*o$jgUKe&s+IH`KK@ga8@_gM4ZfMsC@-%}HkbZmuR4de(*p5# zWbE>E-+!US_2e)X+R1Tc0J!qa?8xla2Tc!GNa`sH)_w=@Z0LiR%}*s2_*bT1sB?DR7StkdTx-;ZhC&Wc2gHgmE;1eWm4SplvjEJf~126`1ce!EKrW0sg3f zR3QxSTSE&Lb^51aof(bl7BIdtd)4(NMg5u~dj0g5=VP0+5ZWaW5v?(QTM)jM)ID$B zF&bpVU!r6L8B-d_S;|;4Q6dAbYaFyUUm2C==sYjBZ(Bsu1YE}vwgf8i^1655!UFq! ziB}yAv{B^#=^ze$`0)Y5EjjcYSXW=ac^QfC3(oKF`xu@l({aG3{zh;)$tmRoNMzAL!-wfn>A<&=4*0|KAoV1iNm!H+}jNIYVz>H z#W+3N_xRC+)wg!uTN5oY+{{n9<-ljG{V`%oH;|>%-;6>smXLy}6I{Sj0k4Y|SXwSh zPmxkzssX3V(RzYGjcpAkNNZ*3S~9i<6MjLhPC}w`_b{10D4<;se*)**y64TJ#Va^B z{_LBcPH=b-(99Wz!?lgD!kygMkv3!CVscI9>_ehydF23)UR9FY{rgK+wJZALeKrDn zwSxthlmGcvn-|=?O2>0+*_K2`n?ob#$MI=jbh~9J>41LrKySO3g|HR%$($bWMlbA$ zKGr5HL%sr0_RMJ5(wtECvxlm+(NPK3;m6T}h<8s4ks73 zw9cVl9pXBR!9{=kBJLxBWYTrj)w{|~w`Ozx`h`zc9G)kSbio~*I@iQ1*zez_|7S*^ z-_7r^f$6?2GUh+8h^L3)HA0^a@T2arehKlB%i+OGP%Qb~24Q8;YEWTv3y#5x(+?M@JC6AL3MBntt&LcupaFwI~Pokv`8KPxJ?WYqxHhwzoZNYT}6bP0D zCb`-FY*_ihr$2DI?%HH=wWt2r&Y6|4-0$x4X}+bCQ$CsC`z9au^FIHerXc^w%M4#O zhhOH3=i0m#B55f3NmR^gW)IaMhZS7eD2SfV_pMDh$tBF_j3>6o4&Xe=+EsZaTuXv0 zGb!^i`Q9xhRkQYgf;T0UH)BbE?1mkmYa0OS_q5s5FR>|dNzn1EGTEM3WB%V>xeYM1 zjlPO2kLr*_uQumJMpj;Qt%kv8>5IWyi_TuP4=>O7e9u&?I%+Fko9Tiel>JC(=+b~8 zzqYpp*O#w<0zW$SX}%YB64wuxpZ@C4CIk2J^RZ2Jmp*4lwRJOF^pC%L>EZs9CznS* z{_67NCqL=;@dk00*wvRmd;a3`_1C|=eEom^ytwK4MwqN`Pol@_3GcM5}Q+F#K4;h=7-qWW*m|YIzGxiU6GskQQcj|NMu@~%U^FIKe}xWA1A*6~ zl|Ajk|MQIz<=6eipZ&Tw|5rI>A>P1My55rW@EzOjTJ^E%6rSlS0@iLu@s-!M`JDGO*+y^@~b6;zn=KLl8hemZ6iuRy9`J91ZcqrUA&!NFJc@gdRM8g8Ka%qy0M%zglwhY6&Ff zUl+`o9YWil4dQfiG6Ew3IZYTTI!^C&x^vhC>0Y0`r76LG^!V|X6s&*moRD>b8omTl zhrNbT0%_KTbF_R5efXguODQPPb5&uM-nw^tG?^!6VsDJe8&3~R< z@uCPbREV-}ejhImm&EyXJ+?=$aynH`@4et5oaiBq z*@!?b8psS@PG!b+-MDB;vJQOLlRus7&^)sPrWa#ysLJ9+qa=5*sBbe!)gx~+dmIO6 zr(uwlW6M2ni5h<4W2c)v?Y>!AvreyHc@9rNca~au>lFRWDYoyG|Ir}{a~@ga^(3W- z1pzl3;%3Ol%RNp|Om0=cW0Yu5a}tT1l)M zn~XZ$FT(!}JT&9Egl;CE$6GhpcP;){35WZ%f6 z(`0>S-XPK_j-x+_zuzVsZ8SO;>=p0`GSxHN%TD1NKlB?8Ze2aJZnhH5>FIowwtID^ z41-KQSWecxF*q6F@5t(-5YWi}t{V+HGm!PCfAT*r|Md6%Q5_Y&l5011U&k0dYj2Zt zxaUK&Z}t*>_7hayf_O5>xAwblW%Wmg0T}Os5HFwDQrPi#lBZjehIaa8J9zjY8CYV0 zeK_!D#9zRCe=sB}QJvh(VBwd(sux}C`*iu33P&_d$Jr@f*Vf|GN{mn2*D0&tpT@KP zaSS5xvmHE%uGu*T+!coUbp`2+Mf12+?8D`KD1eV5C5GsUv$@yL$6>K0$I}RzvK< zuF-dEs|Ibv7_M!GC!eGI1`7>P!pzQUt823xbYef~0)t-qRX^GJ6_^@m<=@s1uk3jS zj8AvEATXNI4gRlu_0!ACm(Rva-~%I>k!U50+T@<~lH5d-l|f%Td3^cu%O{s7Uw*k4 zS_#1E_tn$qm#5!6yL|J@Kfiq4{`8xtdw~YK(s$xQ3}f&X9{QqV{IOs3iDv|t{50M+ z@R)9_{vhD#5MLeNVj4bg!D31ha0}+WtxkW(&erzQ4PL!qP2mT@y`MaP_qTp4`5#}J zRH*R!KRqY7;GQIg9f3yf-3_MlJI_YupI6JykNW?#_`zm_9UPx{?rEb}ARo8sbG)2Q z`}ugOvJ2+-i$3)M_T>B{b??>#Mu|J;b+xBiQyb zsLCt}*_A8afp#I%Nzdh^s!xDy>?}-Ao;-Vste3$yKasSZ2s%`S{r_D z$v(O1dr2Aqap8PyJh?P|SC&oAUbc7Rx^?PJaz^eyKhGmY!sijR?{@^m%O^Ys=9w=I z``+E7oQ0)gXPMt-f^r^^y?Oa!oh?U_3bss601Y2TIG=}i4;LJB;9l17;KAb&Mg8}} z&rwUT_P}ZXH1-(}0VXjsUS2|B2Ib-1+jyZDo}qNKQD6nuP)D@Kiv$(8fV*HwNIwilazee z@&?*W_~CqX|89;-pr#H5p0~}M?=`*7NqT{X4;uSm@#S9iGI$E6H~}#Ia8_vD+vwuN zEBbv~h%@vp9Xg@; zY-EEY?N=i_0lmPA1BoGk+u2$bkD(_M-;p~rvL$>akZZ!^Rq-jXO_H`o(xwA38mo>( z=QhLE!3GLGY#`wMW(zl3SRGZ-p`-T<9D7!G&w&MpJ>h}i+4SCk$+pnGnTzz&`OCNG zyK#~sHZ^1Em<-f5Bg`$Sw?Tm9qx}igH|m#T)@izrH*4eP{5S#}$F32YGb2kp^uVbI z9?}b$!!%L&@3bjW+9gD!H?-pm)Wa4hSMc7o$v3(=+M%SQilBQC$-et%kmbn6?~bEY zQ$Yj$2(H+M1Xdv8j*gy9&7XA5h~eA#n><6HJ?oJAnNH`}ySLG#Ivw));EkHKgN?q| zMwFTVQ1-TWeJ?+8KfrWmKtlj$Cy^xw9nrIGv?o)1tkWaYE^fp<7_*V|zYa4T5?*!I znY6PbJR3wh^2Tra>)vK;v+d1vrFU)Re6oYIIQRIXi~zd#(Xl)4I^D+M?r+v)1P6LF zOBf^)XVam&KR?tTZQN!b?R#$E2j|->i-a3aj z=Ev{g!>pTjFuuVijLGR_5}t3;_AuoQc6get`=g%{B9!VM5>~RnPv`lJeat;v$IikZ zeKHg@|Hwy_OMFgZAO4a*^qmAlxnyvCLBuK^NHTlTKm@7GMhkqkjVv__^AvKi6}tfzm$XIm4cDO#pWFXG>RkRt}B@ z?5=?mOn7E?^grH?jQJsbm|(ZU8_;_2~HD0QW>9w@qE0uT)qg*D^5}Bk%eG3m?!GuL z$|3sU@wP-O67-wuZ?Lw%EF%;rku%V4R*^bpKOK7mFwaFybn=s* z{>960{`#+P0C^_QF+q)jj_12>8`0(i=$eg!d3$3mlBrzt5gOWmSan8n$Ti8|uov+6)Q$(|AdKd}Cz?PG9nA6eRPrK>Bkun$JR+Ryh?v{l{= z{0LQdWbl=h8_n0U9nbHj=(7y5^N!iK2^zHEd$V5EWkW#D{=u)je$kG%nJM^?MA4Z= z>!MTq@6X1PIv+pmq2G>COcot(x4FhZaOi*A^q}5k*4{B%$JgrOGaNqvqK`c*)Xp{S z*fu!*@>gJ~y9*-}>;uawd&0N6@y4Ni%%zn6H_$N{@o zNBQ`R$0a7`BfW!~&@5wH(9}NQIk9^=^o?NU+&Pc5QW8=EP<=BLo)e(Jy3m3Tqa+We z91Z|nUtiy=aZPO}FiKrQ5jW1!B++^C;+q1WH`RTA@nK*eP}KR{9JS=@!GpUQ<-Hsp z9=8r!=NNxJ@Jk_rYDQ0|&^Z#z!z|JHtORb$55j{kMnP__ z2|A1@IhHhe&Wj;zhA0@GofFt@`Cc2^IB&tY4oP4|HsIlVcsfDvgZnjt1 z`3Z&u)pj}_GA+rEo@s$|7iGLr0W)Eob0qidym9&L>$xQO~ zJtS{e)Oq2X93^0TQA={7K#ktE?}TL!W)e6PBLz#a+Tljw8pm~){NiQ7ga*>_5*Zy^ z*Nz@^f~Uiq6Utt6GJ{Z?-j$RZY&dv0 z1wowzuiyRza>}C{dx03u_hwt$KF)Sv2p&#@zQOIkWO})L z@vwIG2|kW_U{v!Az6 zet0LS3g}*`I3$(ZCsLm|RC0@_W-v*RwL*Gdvf;}B1pCz9a z{1BK0ytQTW5d?1bA{-0u+K;koFTpxXhE7m*Y==(+D?gGwkfX4HKOxVfU%~gmzfNls z5BI1JLUL5xmWccxy5l=e0?-z!EwRR5c!JvR;g?Ub`}W-*{>wkP{HH(uqtP;B=-=8! zJTLf3Uen~{8y(eKP~W{h^OejI!`EzZrOmQlHg{_&v%z@2@jic08SS%b6IW>Z*_7yb|1N(nDeN2_bS-%kWS_(ZjMI*8ZB|Rb%RW>buj^k>Ir{hs zJW90kYw)Y*-V#JGDzIQ9sNpp`L|=Ou2!D^Zj@Az!Gk)~(+4-!;nYpr& zi}n;$D!}V!kMn;ICQr|eZOLJFLT+#zUeQq936Kxg2fPVZus?}^vut3JIk_fxK48z8 z@*ly{Za%vvm1x-i$@%so5CIi_C$;$6XG)Ba_qW-C>KMqi)Ng}DwF$Fh+R|iI&An)2 zva@xL=J9#GM%NPJ$vd=U(=VE{4h1`sG@th4?B0WiTaJegZFz$o)%Q%ZIO2Ui1$40P z-79WLM|{9$A)}KIo3F}G%torurV{x23$wHO?X&VC$tElO>F-`Wds=_^?&4c{23$OA z|LDt~?Dt1|_O&>qK53soDZcpTo2Ppg`$dV@v#-CoJpZLZU%u-M^6As?#D?bk(XIg| ze>S*Xx#&B=VDd~Xg1)Wls4P14PpsW_%-{U7cC9a+&Z>Xfm44UCg))pAL|7+ zTjc~Jn#rY|uE6(uP#+$tc(A&5_=s*Xk!BNJ75TWG1mB))$>ECEc9WOiGjoXEW4jn1 zoeo0a7ysHheA+#rHyDGL+|cfHvDZyrS9;hvAEOLEWIOQ{zSvv1Z=*Ym@b2Du$dYYyHC3JBGXAIIU&K$jo5c)6a;A~RAcep@*4l;wG7)b=Bt8cj&rAj_thf`wYHMskrZ8*&0xF$$Y$M(oa2y;5%D0BDZ z$%I5G_S5lFN(K^Mvucdg8yDZ@3>WOzfq4ktY>Q6PdgujlWLJ4QwuF46zQOGBa)sne&c_H(g6S;+hgIJqkedr3`k*%cv{u1Mx?X2GD<$wfZ98`8lP8|<+oiWEQ zS!V<2LoZz2tx%+(JG}JIe&9z3SUQm{aYGTuGvLX$AN*GPYLiF)lWo^;%MRgYUvxz8 zlE~NDEt`7%7S8M;e#}gf)85RP%=VqRXtc!dBx+qtcy=$mu^gDqupjN3|JY1e1fJww zr_^zH=XlWH!!A*|rgOzC$ zaF9Q_-hMZ@knH3sWcD#hiO-{tWWB(Fi_w1SEP@kBqjkxh`pJ}T2Cr&Mw6w2&>6lHR z&;8rZ_LbWnf+b|Zg-1Jh@#@{>_y5W7SFWTyp7=FBelvH0d~f-8wn&$2PyMo`wB29j ztLYOSGT9GTpJ|Wn;V0K6aP)y8ZL}omyDecvqjulrtNi$9qp7>@n2zJEIBR7T-bcwx z5SCzfbAt?K-zsMYNx(gL;bNx?KHMaW^l0|zK)T`^PPV`hly&b^VJB6XB6Q`qmxAES z=A{giP4~Zj=Y>maA@OqBtr<0K;UwRyGMHxB=mxMo|K>2hw593ylKl@hc-ohe`~hEF z&?Kn{;O*O%S$t)|RW}?FPlg6RX=-|nMs-dw#&1-g9pvYnAJ_&O&wc{XqociqB3Kz= zxB%iCg4>_I19f1{w^hfWioqf}t@QYS_QG4gC9y3fb5Z^An5NE=wZ zQar#f-aRg{?cRJ$o4$yhvVRqBOE4X;e^_i(n-7NgVR)iv3GTIDCL7;G_3PVqY~hp7 z$ljpwXM5DZ;O70i`l^_HWI{o?sLn(CkOg^kL83 zhht<_b~87Xl`PT0aP+?o#$%7iN1x@3bnjdVTjhhVy=<0aI%OAK2{wpic;J8uaR(s* zVlVk{8h$+Tb4y&J>9mdDSN3p%=8nU+L@pe+SuoeZBiG^Tg5+a7UUAzF+2?<<65N}y zIkE&q8$7tr1_wANc6MjK>0W%e<%;T(&2>ZXU|eOo0%%CF)sZ^N;B`c^pAIXKRJ=aY|iHky(LBCE7M zEBOP6kHb%UHh1&O>>h8cx6Y(f&k?=!&}IPl)|(uwStCoF%79;LC^( z;Oq2q055VL5{|P5IcL!C8UT`V1QZ0hVD^hAKb~U@SmX;%Es+RLm zfwx|*E`X?pX?*nW0mqmWINtxtb=NVEwQ<@Qdf#JOe9AKcjFChhgTR8Tz0ZGu6Puoig zY-P+qJue`~kAQr}K_(e7V`dPN&38Fx-$QsmC!AiwG5q*V#-Mtmo1p92H_tCmpFX=h zeerTK`Rb83UFuAaQK?5K&gsPqEX-=c_55`mLD#?d@t0jYOBl>ha@v;P%;2MA-~M3- z(PK8$l1EDvy~tssa5X3&o;KpZ8qmC1JCt(dS9lUaje*=HPsf=lcy(c1r{1w-mrf+S*j8SH(b>|WB;?xi1`oYv0O33QSk9V!$G1kz z_UiaLr^|1Pc&-pSrZ-fOz)J%Z-oPGEI-PbhnCawZdC za3lm~d~O{fy8(Qk3+O<7c+c{qZuC#$$T3MC4wnbcjs=@LQrFTUj;6L?MlsMvTD6N4 zBt=7Xq1y=1aJL;t!-ptCPV87`egeJCNTvgNnXDG{jH%tWUT4t#cgkGpt>$RkOp^0-IeTk6&sAkl9pjN* zEol|FkZ(8G!{Ao;=xQQ9<=dB(RPRmxBGRXVZ_U7UK&N}QGg{PNB1PT-rXwQp9IG~N z;OBHGY&z7zJaRsEB&a6+V{7UB`YekjK}?6w(&i7l8+EygCeqg@4H$NLw4jKk)mDOg07N<&19eTG4cf7H z_-<{|GiSDq%vN90Gk$iJ-PaC+<5lrXcDsk}+m^N_O09Y=q58A7{dEb%c5Em1u!H0x-mwIj0x+HW$A9s{1fqh(1KUX^+GwmxPGu6{|U zW%;+kuGvTD+T@Z`GQ&$SF^tb8^XbHE=Ml&r(1HfCUyy#KUEA6-YgJ|k0=9X#?w@u- z5_CmR$Jgvlfm^9^{3J@}XTm!)SDBGB`?_g@pZp}-z{h0PewH*6A~^(G-@_lpPpl61 znLVcGtVMj&`TW_n9m9oI+S{`K@UyV>`Qb9qdK>UM{evVFjrU6S9&c&k1D~|nXHGu5 zyvpBtCj42kj5uM>R~MIf)AZ{X&(B~^aKUFsWVk*e8vVw~Xs0uJLNEH1JA-WT+BqM> zX14mGHa}mmP5hEAMT@~XK5}g%`5H83CEB}Vev7WPw~%zXHvJ9_!I(Xq7=zrlTBkDJ zVm!N1rGWLX{rngE=r#YP{#gzOiJFI*TYJIZcE5K16-Hnlcal_d`TIytjLozr=^ z4)KEJ1Dj=m=WOx4`h#_R?b?6!Ra_F=z2U5!dI<3|6WcM{vL72k=WS!xX=}XmiSR7> z3)flBcs4jkxBd{#SKf}E6#y$7$wYnSx6|vD5j2BwWOaxby~V)m>-~Y#d8MPJ$Z{ZWU%$G%dhWR`BUA~o zx@NRqJo_eRVr_LnDaHhR5|<3Z@kXvn948n34@4#u7f>prH;7tH{FhxjGtSzxvMQrNWxuB* zmwa+AB@)rRASzib`S@_`R)WL3>*SK@xkuL#`ms#1uO8b}k3K9B zB$CggMQ}CP!8p$Pv}5`t_;m_#Pj@;P2@ZZH(`dESP#b&rklj{t*K1mpr?id0*KwWl zZQ%;R;HIo>*RvjPYRkzeUXG87)^-o`uC-Nn-#?d=HPlAcyj# zZ9mxDCZ6nt{ckz()v%cU%UAC%fAEk0pv3su{O4veQo@p5)WDzKB+K~cw{Ooy!KeMO z--GD%JDar+K0DQ6Z@F~8cuTS?!!J#C;bH|v+<*;?dV*eFLwjBT-#tkfO#CDm@7}%a zEL;NA{=7kPa%XetbMnh(*Oy5Q<`eaQ(sY|(m+c?=yA!Y3Z^@rGJMv3-cAt%8kd;yQ zT3e!quJ+lT1SPuou*aTHqLyuREO|?oC2eTL(=AvyMZynOayszo-hgC&+i@gfqa#rI zP50NJ`LrjmkPmM64YF>@U-V&30Iw~mX(R8AidWv~xTLxGIrKLl=a+9FiRiF&bT70Dre}2dQoKIA`(k~BStI)R z>_KJJtxtIM{N?5S%VG|1C4Bv6&jP=B^D_VcbUxK`PS1eP2BT#%NS5xAJG##57;TYV z#X~&r?a(6aX;izWm!peqWOJ06@B4O%Jv-iu6w;Gl%gN0ovZV!%KA7E~0lnKBOtm2c zL?7aRGb`Fpo8Xi^k`WyI6`Q{Nh3+ z%zniJ@~a~$b^Vr%xrt7w$wwQVPwyI<=l{{FUUbbLW-o$XKuph`Tgd8@W>u5 z5{JbH+2mq}es2TNCSBGJox~%2Ro}U?XF1>`IoeMfjlRys+e>(_GC`NmRdo~-`Z)F4 zx_3K1csd794AHT3@Ri%(>q@rmfbYWGRhAj|`rq)(9{ZiWUh8de^ok1~M=bcto;$y_ zV{!!VW0|XnU2{HIKmPgO`nwGLymGpKRW$wmon>%!{7bmj(AyHqp1Ha@2afz~Djr36 zI8&fuq#m>TZc5H-iA4%gb`C7Kb0n3!J-1}m!kZ2ycpL&{>Et)E5N8sKhb3y(AX^`O z&|>2-CVJaiQxhC8ZzF9i3od32JmQYR@^mse?Mp0^=Y!BdHqi z*;zE|eC=$@J-pAB@VN66oGiEwCcT_dWVUu>wGI>yT^l`>kI>0Yz{MWdtRtaIA8{)z zs8E0W$Dd_xv%B!aDPcN+A9}PU33Qz>`9#kg-1WYCbToLb1?IGifvZ!`aYWDa=g%%* zfBnDr>>7HMSAV>9%pz|~3A@ns(;42%3JAstk?zO6{_o^0opc4hQ%`$2@&W;z17rNl z@oC#&xehm3&auF&+#rBjGFYPR{Fc;d!#2*#`OU^prvN^}kbchb1;^UkXWw0ZMBs4aZ?@U*wyuxF%6O?lqL?qdD^Pp!v;-#KHyjnZ z*#N9-TRd7ctZw)AEQ;Us3NM>qht0Oy1%q&r^_C*R)ins%3qK)f9H-qE5dY|M@A5mp z^V^r7|K_ia))8~1;p5ifIm@;K`tSeUf4uywfBw%d?_NF6A7>+~RbV6c+MbeNt;X?X z=)1`QeITM^ZD7!&y?e1WSZ6fznm=+D}_MSJC9i zb@lLZ>x*o&q1_91fAbdv)3N?ovbHix3^uw3d4n~_Ph7XbWPj*8m(ZuYOML59;~n$w zouf5+sNp70GMI1fzDsMFbm$r#03P7`4<29c9)FQ9e|vfOW>%n*zp0bpR4>U@3J<&epx;Aky&(^nR2#ZdqDc<`u0OR1n}Q{8hdc<43J%UzUuh2 z*<<(Px$37sy~4T5(>@;-4olMh(y#sO^0)ua->AB}xz@Eg8uWoVw9$iq${yU#r`dzny#wsrvRBKwI!Bhla^H3>_y26y zGPWPy-mw#~!g2IOKklN?eRR_8q4)pWSMqG9tzK;+c>G9lO9SD@|-|Ae63iIyU zzK4H)kIcWvVf)C-wVaJFadgA^5nlTSCdS{@?z+lWC1-fF!2^{|)%l(FCBWn6z_X36 ze&=7EpR*l*+y*auzSjSK2S?x3@eaZEcQ%)|yW(Q|m6Z-}+~VW3JA+s|zTR8xpx(;# q1B`QpJ6QdU#x-RRuQv`Zm;Va@CHU*vx_>SJ0000[^/]+)/ + value: https://fakeendpoint/ + - body: + - regex: "refresh_token=([^&]+)" + value: "refresh_token=TOKEN" + - regex: "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b" + value: "email@domain.com" + - regex: "(\"id_token\":\\s*\")(.*?)(\")" + value: "\"id_token\": \"ID_TOKEN\"" + - regex: "(\"iKey\":\\s*\")(.*?)(\")" + value: "\"iKey\": \"INSTRUMENTATION_KEY\"" + - regex: "(\"(?:key1)\":\\s*\")(.*?)(\")" + value: "\"key1\": \"COGSVCSKey1\"" + - regex: "(\"(?:key2)\":\\s*\")(.*?)(\")" + value: "\"key2\": \"COGSVCSKey2\"" + - regex: "(\"time\":\\s*\")(.*?)(\")" + value: "\"time\": \"TIME\"" + tests: + - name: ai init vision + command: ai init vision + arguments: + subscription: e72e5254-f265-4e95-9bd2-9ee8e7329051 + name: rhurey-vision-eastus + interactive: false + +- area: Test AI Vision Image Analysis + tags: + recordable: true + _sanitize: + - headers: + - name: Ocp-Apim-Subscription-Key + value: 00000000-0000-0000-0000-000000000000 + - uri: + - regex: https://(?[^/]+)/ + value: https://fakeendpoint/ + steps: + - name: test ai IA caption + expect: woman wearing a mask sitting at a table + not-expect: ERROR + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: caption + - name: test ai IA caption (Visual Features are case insensitive) + expect: woman wearing a mask sitting at a table + not-expect: ERROR + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: CaPtiOn + - name: test ai IA Multiple Visual Features + expect: | + Metadata: Model: + woman wearing a mask sitting at a table + Dense Captions: + Tags: + Objects: + People: + Read: + Line: + Word: + not-expect: ERROR + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: caption,objects,densecaptions,tags,read,people + - name: test ai IA caption (gender neutral) + expect: person wearing a mask sitting at a table + not-expect: ERROR + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: caption + gender-neutral-captions: true + - name: test ai IA Model selection + expect: Invalid model version. + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: caption + model-version: badmodel + - name: test ai IA from file + expect: woman wearing a mask sitting at a table + not-expect: ERROR + command: ai vision image analyze + arguments: + file: ../tests/image-analysis-sample.jpg + visual-features: caption + - name: test ai IA smart crop (single) + expect: | + Aspect ratio: 0.92, Bounding box: Top: + not-expect: ERROR + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: smartcrops + smart-crop-aspect-ratios: 0.92 + - name: test ai IA smart crop (multiple) + expect: | + Aspect ratio: 0.9, Bounding box: Top: + Aspect ratio: 1.78, Bounding box: Top: + not-expect: ERROR + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: smartcrops + smart-crop-aspect-ratios: 0.9,1.78 + - name: test ai IA caption (JSON) + expect: | + { + "captionResult": + "text": + woman wearing a mask sitting at a table + } + not-expect: ERROR + command: ai vision image analyze + arguments: + url: https://aka.ms/azsdk/image-analysis/sample.jpg + visual-features: caption + outputtype: json \ No newline at end of file From aad961d7a76ab947b99f606cb49573046b38e2de Mon Sep 17 00:00:00 2001 From: Rob Chambers Date: Wed, 6 Mar 2024 07:22:44 -0800 Subject: [PATCH 19/19] added speech-to-text c# template (#233) * added speech-to-text c# template * added synthesis template to `ai dev new` * added synth to file * add speech continuous recognition * added tests for speech templates * update names * update comments * added speech-to-test-with-file w/ test * added speech-to-text-with-translation template with test * functionize speech-to-text templates for easier learning * update function ordering * added speech-to-text-with-keyword and test * added speech-to-text-continuous-reco for python * added basic speech-to-text template for python and test * added new command * added speech-to-text-with-keyword c# template with test * added speech-to-text-with-translation python template with test * added text-to-speech for python w/ ai dev new * added text-to-speech-with-file for python ai dev new --- ideas/porter/1-instructions.md | 39 +-- ideas/speech-templates-todo.md | 11 + .../Program.cs | 113 ++++++++ .../SpeechToTextContinuousReco.csproj._ | 17 ++ .../speech-to-text-continuous-reco-cs/_.json | 8 + .../speech-to-text-continuous-reco-py/_.json | 8 + .../speech-to-text-continuous-reco-py/main.py | 87 ++++++ .../requirements.txt | 1 + .../.x/templates/speech-to-text-cs/Program.cs | 57 ++++ .../speech-to-text-cs/SpeechToText.csproj._ | 17 ++ src/ai/.x/templates/speech-to-text-cs/_.json | 8 + src/ai/.x/templates/speech-to-text-py/_.json | 8 + src/ai/.x/templates/speech-to-text-py/main.py | 39 +++ .../speech-to-text-py/requirements.txt | 1 + .../speech-to-text-with-file-cs/Program.cs | 121 ++++++++ .../SpeechToTextWithFile.csproj._ | 17 ++ .../speech-to-text-with-file-cs/_.json | 8 + .../speech-to-text-with-file-py/_.json | 8 + .../speech-to-text-with-file-py/main.py | 94 ++++++ .../requirements.txt | 1 + .../speech-to-text-with-keyword-cs/Program.cs | 136 +++++++++ .../SpeechToTextWithKeyword.csproj._ | 17 ++ .../speech-to-text-with-keyword-cs/_.json | 8 + .../speech-to-text-with-keyword-py/_.json | 8 + .../speech-to-text-with-keyword-py/main.py | 97 +++++++ .../requirements.txt | 1 + .../Program.cs | 145 ++++++++++ .../SpeechToTextWithTranslation.csproj._ | 17 ++ .../speech-to-text-with-translation-cs/_.json | 8 + .../speech-to-text-with-translation-py/_.json | 8 + .../main.py | 104 +++++++ .../requirements.txt | 1 + .../.x/templates/text-to-speech-cs/Program.cs | 53 ++++ .../text-to-speech-cs/TextToSpeech.csproj._ | 17 ++ src/ai/.x/templates/text-to-speech-cs/_.json | 8 + src/ai/.x/templates/text-to-speech-py/_.json | 8 + src/ai/.x/templates/text-to-speech-py/main.py | 32 +++ .../text-to-speech-py/requirements.txt | 1 + .../text-to-speech-with-file-cs/Program.cs | 56 ++++ .../TextToSpeechWithFile.csproj._ | 17 ++ .../text-to-speech-with-file-cs/_.json | 8 + .../text-to-speech-with-file-py/_.json | 8 + .../text-to-speech-with-file-py/main.py | 35 +++ .../requirements.txt | 1 + tests/test-speech.yaml | 272 ++++++++++++++++++ tests/test3.yaml | 6 - 46 files changed, 1711 insertions(+), 24 deletions(-) create mode 100644 ideas/speech-templates-todo.md create mode 100644 src/ai/.x/templates/speech-to-text-continuous-reco-cs/Program.cs create mode 100644 src/ai/.x/templates/speech-to-text-continuous-reco-cs/SpeechToTextContinuousReco.csproj._ create mode 100644 src/ai/.x/templates/speech-to-text-continuous-reco-cs/_.json create mode 100644 src/ai/.x/templates/speech-to-text-continuous-reco-py/_.json create mode 100644 src/ai/.x/templates/speech-to-text-continuous-reco-py/main.py create mode 100644 src/ai/.x/templates/speech-to-text-continuous-reco-py/requirements.txt create mode 100644 src/ai/.x/templates/speech-to-text-cs/Program.cs create mode 100644 src/ai/.x/templates/speech-to-text-cs/SpeechToText.csproj._ create mode 100644 src/ai/.x/templates/speech-to-text-cs/_.json create mode 100644 src/ai/.x/templates/speech-to-text-py/_.json create mode 100644 src/ai/.x/templates/speech-to-text-py/main.py create mode 100644 src/ai/.x/templates/speech-to-text-py/requirements.txt create mode 100644 src/ai/.x/templates/speech-to-text-with-file-cs/Program.cs create mode 100644 src/ai/.x/templates/speech-to-text-with-file-cs/SpeechToTextWithFile.csproj._ create mode 100644 src/ai/.x/templates/speech-to-text-with-file-cs/_.json create mode 100644 src/ai/.x/templates/speech-to-text-with-file-py/_.json create mode 100644 src/ai/.x/templates/speech-to-text-with-file-py/main.py create mode 100644 src/ai/.x/templates/speech-to-text-with-file-py/requirements.txt create mode 100644 src/ai/.x/templates/speech-to-text-with-keyword-cs/Program.cs create mode 100644 src/ai/.x/templates/speech-to-text-with-keyword-cs/SpeechToTextWithKeyword.csproj._ create mode 100644 src/ai/.x/templates/speech-to-text-with-keyword-cs/_.json create mode 100644 src/ai/.x/templates/speech-to-text-with-keyword-py/_.json create mode 100644 src/ai/.x/templates/speech-to-text-with-keyword-py/main.py create mode 100644 src/ai/.x/templates/speech-to-text-with-keyword-py/requirements.txt create mode 100644 src/ai/.x/templates/speech-to-text-with-translation-cs/Program.cs create mode 100644 src/ai/.x/templates/speech-to-text-with-translation-cs/SpeechToTextWithTranslation.csproj._ create mode 100644 src/ai/.x/templates/speech-to-text-with-translation-cs/_.json create mode 100644 src/ai/.x/templates/speech-to-text-with-translation-py/_.json create mode 100644 src/ai/.x/templates/speech-to-text-with-translation-py/main.py create mode 100644 src/ai/.x/templates/speech-to-text-with-translation-py/requirements.txt create mode 100644 src/ai/.x/templates/text-to-speech-cs/Program.cs create mode 100644 src/ai/.x/templates/text-to-speech-cs/TextToSpeech.csproj._ create mode 100644 src/ai/.x/templates/text-to-speech-cs/_.json create mode 100644 src/ai/.x/templates/text-to-speech-py/_.json create mode 100644 src/ai/.x/templates/text-to-speech-py/main.py create mode 100644 src/ai/.x/templates/text-to-speech-py/requirements.txt create mode 100644 src/ai/.x/templates/text-to-speech-with-file-cs/Program.cs create mode 100644 src/ai/.x/templates/text-to-speech-with-file-cs/TextToSpeechWithFile.csproj._ create mode 100644 src/ai/.x/templates/text-to-speech-with-file-cs/_.json create mode 100644 src/ai/.x/templates/text-to-speech-with-file-py/_.json create mode 100644 src/ai/.x/templates/text-to-speech-with-file-py/main.py create mode 100644 src/ai/.x/templates/text-to-speech-with-file-py/requirements.txt create mode 100644 tests/test-speech.yaml diff --git a/ideas/porter/1-instructions.md b/ideas/porter/1-instructions.md index bcfa020c..47d89e31 100644 --- a/ideas/porter/1-instructions.md +++ b/ideas/porter/1-instructions.md @@ -20,30 +20,33 @@ You are an AI assistant that ports code from C# to Python. ## Scenario description -I have a C# project in this directory (*.cs, and *.csproj) that I want to make an exact copy of in Python (*.py, requirements.txt). - -Your job is to help me, by doing the following: -1. You **must** read all the C# files in the current directory -2. You **must** create a corresponding python module for each corresponding C# file -3. Each module you create **must** have the same functionality as the C# file it was created from -4. Each module you create **must** be named similarly, but using Python naming conventions -5. Each module you create **must** have the same class names and method names, but using Python naming conventions -6. Each function you create **must** have the same functionality as the C# function it was created from +I have a sample implemented in both C# and Python that show the basic set of capabilities of our SDK in both languages. +* Base C# example: In the `{sample1}-cs` directory, you'll find C# source code and project files that demonstrate the basic set of capabilities of our C# SDK. +* Base Python example: In the `{sample1}-py` directory, you'll find Python source code and project files that demonstrate the exact same basic set of capabilities of our corresponding Python SDK. + +I also have a new sample that shows a new set of features we have created that sample to show. +* New C# example: In the `{sample2}-cs` directory, you'll find C# source code and project files that demonstrate a NEW set of features we have created that sample to show. + +I need you to port the new C# example to Python, following these detailed instructions: +1. First, you **must** read all the C# and Python files in the `{sample1}-cs` and `{sample1}-py` directory to understand the basic capabilities, and how we have demonstrated them in the C# and Python SDK samples. +2. Next, you **must** read all the C# files in the `{sample2}-cs` to understand how we have demonstrated the new set of features in the C# SDK sample. +3. Then, you **must** create a new directory for the new Python source code files following the naming convention: `{sample2}-py` +4. Next, you **must** create a corresponding python module for each corresponding C# file +5. Each module you create **must** have the same functionality as the C# file it was created from +6. Each module you create **must** be named similarly, but using Python naming conventions +7. Each module you create **must** have the same class names and method names, but using Python naming conventions +8. Each function you create **must** have the same functionality as the C# function it was created from ## Do it now Task you must perform: -1. Please begin, by reading each C# source file. -2. Please create a corresponding python module for each C# source file. -3. Some of the modules have already been ported; you only hve to do these - * HelperFunctionDescriptionAttribute.cs - * HelperFunctionFactory.cs - * HelperFunctionFactoryExtensions.cs - * HelperFunctionParameterDescriptionAttribute.cs +1. If I forgot to tell you the directory names (would have curly brackets around them if I didn't give them to you), you **must** ask me for them. +2. Please begin, by reading each C# and python source code files from Sample 1, 2, and 3. +3. Analyze the source code and understand the functionality of each file. +4. Create a new directory for the new Python source code files. +5. Create a corresponding python module for each C# source file. ## Bonus If you do it perfectly, I'll give you a $100 tip. ## Time to begin Don't show me the code, just create the files. Do it now. - - diff --git a/ideas/speech-templates-todo.md b/ideas/speech-templates-todo.md new file mode 100644 index 00000000..12a745a8 --- /dev/null +++ b/ideas/speech-templates-todo.md @@ -0,0 +1,11 @@ +| name | short | languages +| ---- | ----- | --------- +| Speech-to-text | speech-to-text | C++, __C#__, Go, Java, JavaScript, __Python__ +| Speech-to-text (w/ Continuous recognition) | speech-to-text-continuous | C++, __C#__, Go, Java, JavaScript, __Python__ +| Speech-to-text (w/ File input) | speech-to-text-with-file | C++, __C#__, Go, Java, JavaScript, Python +| Speech-to-text (w/ Keyword detection) | speech-to-text-with-keyword | C++, __C#__, Go, Java, JavaScript, Python +| Speech-to-text (w/ Language identification) | speech-to-text-with-lid | C++, C#, Go, Java, JavaScript, Python +| Speech-to-text (w/ Translation) | speech-to-text-with-translation | C++, __C#__, Go, Java, JavaScript, Python +| Text-to-speech | text-to-speech | C++, __C#__, Go, Java, JavaScript, Python +| Text-to-speech (w/ File output) | text-to-speech-with-file | C++, __C#__, Go, Java, JavaScript, Python +| Text-to-speech (w/ SSML input) | text-to-speech-with-ssml | C++, C#, Go, Java, JavaScript, Python diff --git a/src/ai/.x/templates/speech-to-text-continuous-reco-cs/Program.cs b/src/ai/.x/templates/speech-to-text-continuous-reco-cs/Program.cs new file mode 100644 index 00000000..9d8625bb --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-continuous-reco-cs/Program.cs @@ -0,0 +1,113 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".cs" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +using System; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; + +public class Program +{ + public static async Task Main(string[] args) + { + // Connection and configuration details required + var speechKey = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_KEY") ?? "<#= AZURE_AI_SPEECH_KEY #>"; + var speechRegion = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_REGION") ?? "<#= AZURE_AI_SPEECH_REGION #>"; + var speechLanguage = "en-US"; // BCP-47 language code + + // Create instances of a speech config, source language config, and audio config + var config = SpeechConfig.FromSubscription(speechKey, speechRegion); + var sourceLanguageConfig = SourceLanguageConfig.FromLanguage(speechLanguage); + var audioConfig = AudioConfig.FromDefaultMicrophoneInput(); + + // Create the speech recognizer from the above configuration information + using (var recognizer = new SpeechRecognizer(config, sourceLanguageConfig, audioConfig)) + { + // Subscribe to the Recognizing and Recognized events. As the user speaks individual + // utterances, intermediate recognition results are sent to the Recognizing event, + // and the final recognition results are sent to the Recognized event. + recognizer.Recognizing += (s, e) => HandleRecognizingEvent(e); + recognizer.Recognized += (s, e) => HandleRecognizedEvent(e); + + // Create a task completion source to wait for the session to stop. This is needed in + // console apps to prevent the main thread from terminating while the recognition is + // running asynchronously on a separate background thread. + var sessionStoppedNoError = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + // Subscribe to SessionStarted and SessionStopped events. These events are useful for + // logging the start and end of a speech recognition session. In console apps, this is + // used to allow the application to block the main thread until recognition is complete. + recognizer.SessionStarted += (s, e) => HandleSessionStartedEvent(e); + recognizer.SessionStopped += (s, e) => HandleSessionStoppedEvent(e, sessionStoppedNoError); + + // Subscribe to the Canceled event, which indicates that the recognition operation + // was stopped/canceled, likely due to an error of some kind. + recognizer.Canceled += (s, e) => HandleCanceledEvent(e, sessionStoppedNoError); + + // Allow the user to press ENTER to stop recognition + Task.Run(() => + { + while (Console.ReadKey().Key != ConsoleKey.Enter) { } + recognizer.StopContinuousRecognitionAsync(); + }); + + // Start speech recognition + await recognizer.StartContinuousRecognitionAsync(); + Console.WriteLine("Listening; press ENTER to stop ...\n"); + + // Wait for the session to stop. The Task will not complete until the recognition + // session stops, and the result will indicate whether the session completed + // or was canceled. + return await sessionStoppedNoError.Task ? 0 : 1; + } + } + + private static void HandleRecognizingEvent(SpeechRecognitionEventArgs e) + { + Console.WriteLine($"RECOGNIZING: {e.Result.Text}"); + } + + private static void HandleRecognizedEvent(SpeechRecognitionEventArgs e) + { + if (e.Result.Reason == ResultReason.RecognizedSpeech && !string.IsNullOrEmpty(e.Result.Text)) + { + Console.WriteLine($"RECOGNIZED: {e.Result.Text}\n"); + } + else if (e.Result.Reason == ResultReason.NoMatch) + { + Console.WriteLine($"NOMATCH: Speech could not be recognized.\n"); + } + } + + private static void HandleSessionStartedEvent(SessionEventArgs e) + { + Console.WriteLine($"SESSION STARTED: {e.SessionId}.\n"); + } + + private static void HandleSessionStoppedEvent(SessionEventArgs e, TaskCompletionSource sessionStoppedNoError) + { + Console.WriteLine($"SESSION STOPPED: {e.SessionId}."); + sessionStoppedNoError.TrySetResult(true); // Set the result so the main thread can exit + } + + private static void HandleCanceledEvent(SpeechRecognitionCanceledEventArgs e, TaskCompletionSource sessionStoppedNoError) + { + Console.WriteLine($"CANCELED: Reason={e.Reason}"); + + // Check the CancellationReason for more detailed information. + if (e.Reason == CancellationReason.EndOfStream) + { + Console.WriteLine($"CANCELED: End of the audio stream was reached."); + } + else if (e.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + + // Set the task completion source result so the main thread can exit + sessionStoppedNoError.TrySetResult(e.Reason != CancellationReason.Error); + } +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-continuous-reco-cs/SpeechToTextContinuousReco.csproj._ b/src/ai/.x/templates/speech-to-text-continuous-reco-cs/SpeechToTextContinuousReco.csproj._ new file mode 100644 index 00000000..b0925d48 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-continuous-reco-cs/SpeechToTextContinuousReco.csproj._ @@ -0,0 +1,17 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".csproj" encoding="utf-8" #> + + + + net8.0 + enable + enable + true + Exe + + + + + + + \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-continuous-reco-cs/_.json b/src/ai/.x/templates/speech-to-text-continuous-reco-cs/_.json new file mode 100644 index 00000000..e90b716d --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-continuous-reco-cs/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ Continuous recognition)", + "_ShortName": "speech-to-text-continuous-reco", + "_Language": "C#", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-continuous-reco-py/_.json b/src/ai/.x/templates/speech-to-text-continuous-reco-py/_.json new file mode 100644 index 00000000..ab272a72 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-continuous-reco-py/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ Continuous recognition)", + "_ShortName": "speech-to-text-continuous-reco", + "_Language": "Python", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-continuous-reco-py/main.py b/src/ai/.x/templates/speech-to-text-continuous-reco-py/main.py new file mode 100644 index 00000000..f9466b0f --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-continuous-reco-py/main.py @@ -0,0 +1,87 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".py" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +from concurrent.futures import Future +from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer, AudioConfig, CancellationReason +import threading +import os + +# Connection and configuration details required +speech_key = os.environ.get('AZURE_AI_SPEECH_KEY') or "<#= AZURE_AI_SPEECH_KEY #>" +service_region = os.environ.get('AZURE_AI_SPEECH_REGION') or "<#= AZURE_AI_SPEECH_REGION #>" +speech_language = "en-US" + +# Create instances of a speech config and audio config +speech_config = SpeechConfig(subscription=speech_key, region=service_region, speech_recognition_language=speech_language) +audio_config = AudioConfig(use_default_microphone=True) + +# Create the speech recognizer from the above configuration information +speech_recognizer = SpeechRecognizer(speech_config=speech_config, audio_config=audio_config) + +# Subscribe to the recognizing and recognized events. As the user speaks individual +# utterances, intermediate recognition results are sent to the Recognizing event, +# and the final recognition results are sent to the Recognized event. +def recognizing(args): + print("RECOGNIZING: {}".format(args.result.text)) + +def recognized(args): + if args.result.reason.name == "RecognizedSpeech" and args.result.text != "": + print("RECOGNIZED: {}\n".format(args.result.text)) + elif args.result.reason.name == "NoMatch": + print("NOMATCH: Speech could not be recognized.\n") + +speech_recognizer.recognizing.connect(recognizing) +speech_recognizer.recognized.connect(recognized) + +# Create a future to wait for the session to stop. This is needed in console apps to +# prevent the main thread from terminating while the recognition is running +# asynchronously on a separate background thread. +session_stopped_no_error = Future() + +# Subscribe to session_started and session_stopped events. These events are useful for +# logging the start and end of a speech recognition session. In console apps, this is +# used to allow the application to block the main thread until recognition is complete. +def session_started(args): + print("SESSION STARTED: {}\n".format(args.session_id)) + +def session_stopped(args): + print("SESSION STOPPED: {}".format(args.session_id)) + session_stopped_no_error.set_result(True) + +speech_recognizer.session_started.connect(session_started) +speech_recognizer.session_stopped.connect(session_stopped) + +# Subscribe to the canceled event, which indicates that the recognition operation +# was stopped/canceled, likely due to an error of some kind. +def canceled(args): + print("CANCELED: Reason={}".format(args.cancellation_details.reason)) + + # Check the CancellationReason for more detailed information. + if args.cancellation_details.reason == CancellationReason.EndOfStream: + print("CANCELED: End of the audio stream was reached.") + elif args.cancellation_details.reason == CancellationReason.Error: + print("CANCELED: ErrorDetails={}".format(args.cancellation_details.error_details)) + print("CANCELED: Did you update the subscription info?") + + # Set the future's result so the main thread can exit + session_stopped_no_error.set_result(args.cancellation_details.reason != CancellationReason.Error) + +speech_recognizer.canceled.connect(canceled) + +# Allow the user to press ENTER to stop recognition +threading.Thread(target=lambda: ( + input(""), + speech_recognizer.stop_continuous_recognition()) +).start() + +# Start speech recognition +speech_recognizer.start_continuous_recognition() +print("Listening, press ENTER to stop...") + +# Wait for the session to stop. result() will not return until the recognition +# session stops, and the result will indicate whether the session completed +# or was canceled. +exit_code = 0 if session_stopped_no_error.result() == True else 1 +os._exit(exit_code) diff --git a/src/ai/.x/templates/speech-to-text-continuous-reco-py/requirements.txt b/src/ai/.x/templates/speech-to-text-continuous-reco-py/requirements.txt new file mode 100644 index 00000000..f33c7861 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-continuous-reco-py/requirements.txt @@ -0,0 +1 @@ +azure-cognitiveservices-speech>=1.35.0 \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-cs/Program.cs b/src/ai/.x/templates/speech-to-text-cs/Program.cs new file mode 100644 index 00000000..0f19acf2 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-cs/Program.cs @@ -0,0 +1,57 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".cs" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +using System; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; + +public class Program +{ + public static async Task Main(string[] args) + { + // Connection and configuration details required + var speechKey = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_KEY") ?? "<#= AZURE_AI_SPEECH_KEY #>"; + var speechRegion = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_REGION") ?? "<#= AZURE_AI_SPEECH_REGION #>"; + var speechLanguage = "en-US"; // BCP-47 language code + + // Create instances of a speech config, source language config, and audio config + var config = SpeechConfig.FromSubscription(speechKey, speechRegion); + var sourceLanguageConfig = SourceLanguageConfig.FromLanguage(speechLanguage); + var audioConfig = AudioConfig.FromDefaultMicrophoneInput(); + + // Create the speech recognizer from the above configuration information + using (var recognizer = new SpeechRecognizer(config, sourceLanguageConfig, audioConfig)) + { + Console.WriteLine("Listening ...\n"); + + // Start speech recognition, and return after a single utterance is recognized. The end of a + // single utterance is determined by listening for silence at the end or until a maximum of 15 + // seconds of audio is processed. + var result = await recognizer.RecognizeOnceAsync(); + + // Check the result + if (result.Reason == ResultReason.RecognizedSpeech) + { + Console.WriteLine($"RECOGNIZED: {result.Text}"); + } + else if (result.Reason == ResultReason.NoMatch) + { + Console.WriteLine($"NOMATCH: Speech could not be recognized."); + } + else if (result.Reason == ResultReason.Canceled) + { + var cancellation = CancellationDetails.FromResult(result); + Console.WriteLine($"CANCELED: Reason={cancellation.Reason}"); + + if (cancellation.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + } + } + } +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-cs/SpeechToText.csproj._ b/src/ai/.x/templates/speech-to-text-cs/SpeechToText.csproj._ new file mode 100644 index 00000000..b0925d48 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-cs/SpeechToText.csproj._ @@ -0,0 +1,17 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".csproj" encoding="utf-8" #> + + + + net8.0 + enable + enable + true + Exe + + + + + + + \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-cs/_.json b/src/ai/.x/templates/speech-to-text-cs/_.json new file mode 100644 index 00000000..c8390ae0 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-cs/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text", + "_ShortName": "speech-to-text", + "_Language": "C#", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-py/_.json b/src/ai/.x/templates/speech-to-text-py/_.json new file mode 100644 index 00000000..ac6d9760 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-py/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text", + "_ShortName": "speech-to-text", + "_Language": "Python", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-py/main.py b/src/ai/.x/templates/speech-to-text-py/main.py new file mode 100644 index 00000000..674a8bed --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-py/main.py @@ -0,0 +1,39 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".py" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +from concurrent.futures import Future +from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer, AudioConfig, CancellationReason +import threading +import os + +# Connection and configuration details required +speech_key = os.environ.get('AZURE_AI_SPEECH_KEY') or "<#= AZURE_AI_SPEECH_KEY #>" +service_region = os.environ.get('AZURE_AI_SPEECH_REGION') or "<#= AZURE_AI_SPEECH_REGION #>" +speech_language = "en-US" + +# Create instances of a speech config and audio config +speech_config = SpeechConfig(subscription=speech_key, region=service_region, speech_recognition_language=speech_language) +audio_config = AudioConfig(use_default_microphone=True) + +# Create the speech recognizer from the above configuration information +speech_recognizer = SpeechRecognizer(speech_config=speech_config, audio_config=audio_config) + +# Start speech recognition, and return after a single utterance is recognized. The end of a +# single utterance is determined by listening for silence at the end or until a maximum of 15 +# seconds of audio is processed. +print("Listening ...\n") +result = speech_recognizer.recognize_once() + +# Check the result +if result.reason.name == "RecognizedSpeech" and result.text != "": + print("RECOGNIZED: {}".format(result.text)) +elif result.reason.name == "NoMatch": + print("NOMATCH: Speech could not be recognized.") +elif result.reason.name == "Canceled": + cancellation_details = result.cancellation_details + print("CANCELED: Reason={}".format(cancellation_details.reason)) + if cancellation_details.reason == CancellationReason.Error: + print("CANCELED: ErrorDetails={}".format(cancellation_details.error_details)) + print("CANCELED: Did you update the subscription info?") diff --git a/src/ai/.x/templates/speech-to-text-py/requirements.txt b/src/ai/.x/templates/speech-to-text-py/requirements.txt new file mode 100644 index 00000000..f33c7861 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-py/requirements.txt @@ -0,0 +1 @@ +azure-cognitiveservices-speech>=1.35.0 \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-file-cs/Program.cs b/src/ai/.x/templates/speech-to-text-with-file-cs/Program.cs new file mode 100644 index 00000000..3f6cd5b7 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-file-cs/Program.cs @@ -0,0 +1,121 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".cs" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +using System; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; + +public class Program +{ + public static async Task Main(string[] args) + { + // Connection and configuration details required + var speechKey = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_KEY") ?? "<#= AZURE_AI_SPEECH_KEY #>"; + var speechRegion = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_REGION") ?? "<#= AZURE_AI_SPEECH_REGION #>"; + var speechLanguage = "en-US"; // BCP-47 language code + var inputFileName = args.Length == 1 ? args[0] : "audio.wav"; + + // Check to see if the input file exists + if (!File.Exists(inputFileName)) + { + Console.WriteLine($"ERROR: Cannot find audio input file: {inputFileName}"); + return 1; + } + + // Create instances of a speech config, source language config, and audio config + var config = SpeechConfig.FromSubscription(speechKey, speechRegion); + var sourceLanguageConfig = SourceLanguageConfig.FromLanguage(speechLanguage); + var audioConfig = AudioConfig.FromWavFileInput(inputFileName); + + // Create the speech recognizer from the above configuration information + using (var recognizer = new SpeechRecognizer(config, sourceLanguageConfig, audioConfig)) + { + // Subscribe to the Recognizing and Recognized events. As the user speaks individual + // utterances, intermediate recognition results are sent to the Recognizing event, + // and the final recognition results are sent to the Recognized event. + recognizer.Recognizing += (s, e) => HandleRecognizingEvent(e); + recognizer.Recognized += (s, e) => HandleRecognizedEvent(e); + + // Create a task completion source to wait for the session to stop. This is needed in + // console apps to prevent the main thread from terminating while the recognition is + // running asynchronously on a separate background thread. + var sessionStoppedNoError = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + // Subscribe to SessionStarted and SessionStopped events. These events are useful for + // logging the start and end of a speech recognition session. In console apps, this is + // used to allow the application to block the main thread until recognition is complete. + recognizer.SessionStarted += (s, e) => HandleSessionStartedEvent(e); + recognizer.SessionStopped += (s, e) => HandleSessionStoppedEvent(e, sessionStoppedNoError); + + // Subscribe to the Canceled event, which indicates that the recognition operation + // was stopped/canceled, likely due to an error of some kind. + recognizer.Canceled += (s, e) => HandleCanceledEvent(e, sessionStoppedNoError); + + // Allow the user to press ENTER to stop recognition + Task.Run(() => + { + while (Console.ReadKey().Key != ConsoleKey.Enter) { } + recognizer.StopContinuousRecognitionAsync(); + }); + + // Start speech recognition + await recognizer.StartContinuousRecognitionAsync(); + Console.WriteLine("Listening; press ENTER to stop ...\n"); + + // Wait for the session to stop. The Task will not complete until the recognition + // session stops, and the result will indicate whether the session completed + // or was canceled. + return await sessionStoppedNoError.Task ? 0 : 1; + } + } + + private static void HandleRecognizingEvent(SpeechRecognitionEventArgs e) + { + Console.WriteLine($"RECOGNIZING: {e.Result.Text}"); + } + + private static void HandleRecognizedEvent(SpeechRecognitionEventArgs e) + { + if (e.Result.Reason == ResultReason.RecognizedSpeech && !string.IsNullOrEmpty(e.Result.Text)) + { + Console.WriteLine($"RECOGNIZED: {e.Result.Text}\n"); + } + else if (e.Result.Reason == ResultReason.NoMatch) + { + Console.WriteLine($"NOMATCH: Speech could not be recognized.\n"); + } + } + + private static void HandleSessionStartedEvent(SessionEventArgs e) + { + Console.WriteLine($"SESSION STARTED: {e.SessionId}.\n"); + } + + private static void HandleSessionStoppedEvent(SessionEventArgs e, TaskCompletionSource sessionStoppedNoError) + { + Console.WriteLine($"SESSION STOPPED: {e.SessionId}."); + sessionStoppedNoError.TrySetResult(true); // Set the result so the main thread can exit + } + + private static void HandleCanceledEvent(SpeechRecognitionCanceledEventArgs e, TaskCompletionSource sessionStoppedNoError) + { + Console.WriteLine($"CANCELED: Reason={e.Reason}"); + + // Check the CancellationReason for more detailed information. + if (e.Reason == CancellationReason.EndOfStream) + { + Console.WriteLine($"CANCELED: End of the audio stream was reached."); + } + else if (e.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + + // Set the task completion source result so the main thread can exit + sessionStoppedNoError.TrySetResult(e.Reason != CancellationReason.Error); + } +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-file-cs/SpeechToTextWithFile.csproj._ b/src/ai/.x/templates/speech-to-text-with-file-cs/SpeechToTextWithFile.csproj._ new file mode 100644 index 00000000..b0925d48 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-file-cs/SpeechToTextWithFile.csproj._ @@ -0,0 +1,17 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".csproj" encoding="utf-8" #> + + + + net8.0 + enable + enable + true + Exe + + + + + + + \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-file-cs/_.json b/src/ai/.x/templates/speech-to-text-with-file-cs/_.json new file mode 100644 index 00000000..88a98f12 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-file-cs/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ File input)", + "_ShortName": "speech-to-text-with-file", + "_Language": "C#", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-file-py/_.json b/src/ai/.x/templates/speech-to-text-with-file-py/_.json new file mode 100644 index 00000000..690f6420 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-file-py/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ File input)", + "_ShortName": "speech-to-text-with-file", + "_Language": "Python", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-file-py/main.py b/src/ai/.x/templates/speech-to-text-with-file-py/main.py new file mode 100644 index 00000000..5ece4954 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-file-py/main.py @@ -0,0 +1,94 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".py" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +from concurrent.futures import Future +from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer, AudioConfig, CancellationReason +import threading +import os +import sys + +# Connection and configuration details required +speech_key = os.environ.get('AZURE_AI_SPEECH_KEY') or "<#= AZURE_AI_SPEECH_KEY #>" +service_region = os.environ.get('AZURE_AI_SPEECH_REGION') or "<#= AZURE_AI_SPEECH_REGION #>" +speech_language = "en-US" +input_file = sys.argv[1] if len(sys.argv) == 2 else "audio.wav" + +# Check to see if the input file exists +if not os.path.exists(input_file): + print("ERROR: Cannot find audio input file: {}".format(input_file)) + sys.exit(1) + +# Create instances of a speech config and audio config +speech_config = SpeechConfig(subscription=speech_key, region=service_region, speech_recognition_language=speech_language) +audio_config = AudioConfig(filename=input_file) + +# Create the speech recognizer from the above configuration information +speech_recognizer = SpeechRecognizer(speech_config=speech_config, audio_config=audio_config) + +# Subscribe to the recognizing and recognized events. As the user speaks individual +# utterances, intermediate recognition results are sent to the Recognizing event, +# and the final recognition results are sent to the Recognized event. +def recognizing(args): + print("RECOGNIZING: {}".format(args.result.text)) + +def recognized(args): + if args.result.reason.name == "RecognizedSpeech" and args.result.text != "": + print("RECOGNIZED: {}\n".format(args.result.text)) + elif args.result.reason.name == "NoMatch": + print("NOMATCH: Speech could not be recognized.\n") + +speech_recognizer.recognizing.connect(recognizing) +speech_recognizer.recognized.connect(recognized) + +# Create a future to wait for the session to stop. This is needed in console apps to +# prevent the main thread from terminating while the recognition is running +# asynchronously on a separate background thread. +session_stopped_no_error = Future() + +# Subscribe to session_started and session_stopped events. These events are useful for +# logging the start and end of a speech recognition session. In console apps, this is +# used to allow the application to block the main thread until recognition is complete. +def session_started(args): + print("SESSION STARTED: {}\n".format(args.session_id)) + +def session_stopped(args): + print("SESSION STOPPED: {}".format(args.session_id)) + session_stopped_no_error.set_result(True) + +speech_recognizer.session_started.connect(session_started) +speech_recognizer.session_stopped.connect(session_stopped) + +# Subscribe to the canceled event, which indicates that the recognition operation +# was stopped/canceled, likely due to an error of some kind. +def canceled(args): + print("CANCELED: Reason={}".format(args.cancellation_details.reason)) + + # Check the CancellationReason for more detailed information. + if args.cancellation_details.reason == CancellationReason.EndOfStream: + print("CANCELED: End of the audio stream was reached.") + elif args.cancellation_details.reason == CancellationReason.Error: + print("CANCELED: ErrorDetails={}".format(args.cancellation_details.error_details)) + print("CANCELED: Did you update the subscription info?") + + # Set the future's result so the main thread can exit + session_stopped_no_error.set_result(args.cancellation_details.reason != CancellationReason.Error) + +speech_recognizer.canceled.connect(canceled) + +# Allow the user to press ENTER to stop recognition +threading.Thread(target=lambda: ( + input(""), + speech_recognizer.stop_continuous_recognition()) +).start() + +# Start speech recognition +speech_recognizer.start_continuous_recognition() +print("Listening, press ENTER to stop...") + +# Wait for the session to stop. result() will not return until the recognition +# session stops, and the result will indicate whether the session completed +# or was canceled. +exit_code = 0 if session_stopped_no_error.result() == True else 1 +os._exit(exit_code) diff --git a/src/ai/.x/templates/speech-to-text-with-file-py/requirements.txt b/src/ai/.x/templates/speech-to-text-with-file-py/requirements.txt new file mode 100644 index 00000000..f33c7861 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-file-py/requirements.txt @@ -0,0 +1 @@ +azure-cognitiveservices-speech>=1.35.0 \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-keyword-cs/Program.cs b/src/ai/.x/templates/speech-to-text-with-keyword-cs/Program.cs new file mode 100644 index 00000000..5ee7130f --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-keyword-cs/Program.cs @@ -0,0 +1,136 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".cs" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +using System; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; + +public class Program +{ + public static async Task Main(string[] args) + { + // Connection and configuration details required + var speechKey = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_KEY") ?? "<#= AZURE_AI_SPEECH_KEY #>"; + var speechRegion = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_REGION") ?? "<#= AZURE_AI_SPEECH_REGION #>"; + var speechLanguage = "en-US"; // BCP-47 language code + var inputFileName = args.Length == 1 ? args[0] : null; + var keywordFileName = "keyword.table"; + + // Check to see if the input file exists + if (inputFileName != null && !File.Exists(inputFileName)) + { + Console.WriteLine($"ERROR: Cannot find audio input file: {inputFileName}"); + return 1; + } + + // Check to see if the keyword file exists + if (!File.Exists(keywordFileName)) + { + Console.WriteLine($"ERROR: Cannot find keyword file: {keywordFileName}"); + return 1; + } + + // Create instances of a speech config, source language config, and audio config + var config = SpeechConfig.FromSubscription(speechKey, speechRegion); + var sourceLanguageConfig = SourceLanguageConfig.FromLanguage(speechLanguage); + var audioConfig = inputFileName != null + ? AudioConfig.FromWavFileInput(inputFileName) + : AudioConfig.FromDefaultMicrophoneInput(); + + // Create the speech recognizer from the above configuration information + using (var recognizer = new SpeechRecognizer(config, sourceLanguageConfig, audioConfig)) + { + // Subscribe to the Recognizing and Recognized events. As the user speaks individual + // utterances, intermediate recognition results are sent to the Recognizing event, + // and the final recognition results are sent to the Recognized event. + recognizer.Recognizing += (s, e) => HandleRecognizingEvent(e); + recognizer.Recognized += (s, e) => HandleRecognizedEvent(e); + + // Create a task completion source to wait for the session to stop. This is needed in + // console apps to prevent the main thread from terminating while the recognition is + // running asynchronously on a separate background thread. + var sessionStoppedNoError = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + // Subscribe to SessionStarted and SessionStopped events. These events are useful for + // logging the start and end of a speech recognition session. In console apps, this is + // used to allow the application to block the main thread until recognition is complete. + recognizer.SessionStarted += (s, e) => HandleSessionStartedEvent(e); + recognizer.SessionStopped += (s, e) => HandleSessionStoppedEvent(e); + + // Subscribe to the Canceled event, which indicates that the recognition operation + // was stopped/canceled, likely due to an error of some kind. + recognizer.Canceled += (s, e) => HandleCanceledEvent(e, sessionStoppedNoError); + + // Allow the user to press ENTER to stop recognition + Task.Run(() => + { + while (Console.ReadKey().Key != ConsoleKey.Enter) { } + recognizer.StopContinuousRecognitionAsync(); + }); + + var keywordModel = KeywordRecognitionModel.FromFile(keywordFileName); + + // Start keyword recognition + await recognizer.StartKeywordRecognitionAsync(keywordModel); + Console.WriteLine("Listening for keyword; press ENTER to stop ...\n"); + + // Wait for the session to stop. The Task will not complete until the recognition + // session stops, and the result will indicate whether the session completed + // or was canceled. + return await sessionStoppedNoError.Task ? 0 : 1; + } + } + + private static void HandleRecognizingEvent(SpeechRecognitionEventArgs e) + { + Console.WriteLine($"RECOGNIZING: {e.Result.Text}"); + } + + private static void HandleRecognizedEvent(SpeechRecognitionEventArgs e) + { + if (e.Result.Reason == ResultReason.RecognizedKeyword && !string.IsNullOrEmpty(e.Result.Text)) + { + Console.WriteLine($"RECOGNIZED: {e.Result.Text}\n"); + } + else if (e.Result.Reason == ResultReason.RecognizedSpeech && !string.IsNullOrEmpty(e.Result.Text)) + { + Console.WriteLine($"RECOGNIZED: {e.Result.Text}\n"); + } + else if (e.Result.Reason == ResultReason.NoMatch) + { + Console.WriteLine($"NOMATCH: Speech could not be recognized.\n"); + } + } + + private static void HandleSessionStartedEvent(SessionEventArgs e) + { + Console.WriteLine($"SESSION STARTED: {e.SessionId}.\n"); + } + + private static void HandleSessionStoppedEvent(SessionEventArgs e) + { + Console.WriteLine($"SESSION STOPPED: {e.SessionId}."); + } + + private static void HandleCanceledEvent(SpeechRecognitionCanceledEventArgs e, TaskCompletionSource sessionStoppedNoError) + { + Console.WriteLine($"CANCELED: Reason={e.Reason}"); + + // Check the CancellationReason for more detailed information. + if (e.Reason == CancellationReason.EndOfStream) + { + Console.WriteLine($"CANCELED: End of the audio stream was reached."); + } + else if (e.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + + // Set the task completion source result so the main thread can exit + sessionStoppedNoError.TrySetResult(e.Reason != CancellationReason.Error); + } +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-keyword-cs/SpeechToTextWithKeyword.csproj._ b/src/ai/.x/templates/speech-to-text-with-keyword-cs/SpeechToTextWithKeyword.csproj._ new file mode 100644 index 00000000..b0925d48 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-keyword-cs/SpeechToTextWithKeyword.csproj._ @@ -0,0 +1,17 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".csproj" encoding="utf-8" #> + + + + net8.0 + enable + enable + true + Exe + + + + + + + \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-keyword-cs/_.json b/src/ai/.x/templates/speech-to-text-with-keyword-cs/_.json new file mode 100644 index 00000000..f6597d5d --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-keyword-cs/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ Keyword detection)", + "_ShortName": "speech-to-text-with-keyword", + "_Language": "C#", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-keyword-py/_.json b/src/ai/.x/templates/speech-to-text-with-keyword-py/_.json new file mode 100644 index 00000000..7400e67e --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-keyword-py/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ Keyword detection)", + "_ShortName": "speech-to-text-with-keyword", + "_Language": "Python", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-keyword-py/main.py b/src/ai/.x/templates/speech-to-text-with-keyword-py/main.py new file mode 100644 index 00000000..c90362d9 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-keyword-py/main.py @@ -0,0 +1,97 @@ +from concurrent.futures import Future +from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer, AudioConfig, KeywordRecognitionModel, CancellationReason +import threading +import os +import sys + +# Connection and configuration details required +speech_key = os.environ.get('AZURE_AI_SPEECH_KEY') or '' +service_region = os.environ.get('AZURE_AI_SPEECH_REGION') or '' +speech_language = 'en-US' +input_file = sys.argv[1] if len(sys.argv) == 2 else None +keyword_file = 'keyword.table' + +# Check to see if the input file exists +if input_file is not None and not os.path.exists(input_file): + print(f'ERROR: Cannot find audio input file: {input_file}') + sys.exit(1) + +# Check to see if the keyword file exists +if not os.path.exists(keyword_file): + print(f'ERROR: Cannot find keyword file: {keyword_file}') + sys.exit(1) + +# Create instances of a speech config and audio config +speech_config = SpeechConfig(subscription=speech_key, region=service_region, speech_recognition_language=speech_language) +audio_config = AudioConfig(filename=input_file) if input_file is not None else AudioConfig(use_default_microphone=True) + +# Create the speech recognizer from the above configuration information +speech_recognizer = SpeechRecognizer(speech_config=speech_config, audio_config=audio_config) + +# Subscribe to the recognizing and recognized events. As the user speaks individual +# utterances, intermediate recognition results are sent to the recognizing event, +# and the final recognition results are sent to the recognized event. +def recognizing(args): + print(f'RECOGNIZING: {args.result.text}') + +def recognized(args): + if args.result.reason.name == 'RecognizedKeyword' and args.result.text != '': + print(f'RECOGNIZED: {args.result.text}\n') + elif args.result.reason.name == 'RecognizedSpeech' and args.result.text != '': + print(f'RECOGNIZED: {args.result.text}\n') + elif args.result.reason.name == 'NoMatch': + print('NOMATCH: Speech could not be recognized.\n') + +speech_recognizer.recognizing.connect(recognizing) +speech_recognizer.recognized.connect(recognized) + +# Create a future to wait for the session to stop. This is needed in console apps to +# prevent the main thread from terminating while the recognition is running +# asynchronously on a separate background thread. +session_stopped_no_error = Future() + +# Subscribe to session_started and session_stopped events. These events are useful for +# logging the start and end of a speech recognition session. In console apps, this is +# used to allow the application to block the main thread until recognition is complete. +def session_started(args): + print(f'SESSION STARTED: {args.session_id}\n') + +def session_stopped(args): + print(f'SESSION STOPPED: {args.session_id}') + +speech_recognizer.session_started.connect(session_started) +speech_recognizer.session_stopped.connect(session_stopped) + +# Subscribe to the canceled event, which indicates that the recognition operation +# was stopped/canceled, likely due to an error of some kind. +def canceled(args): + print(f'CANCELED: Reason={args.cancellation_details.reason}') + + # Check the CancellationReason for more detailed information. + if args.cancellation_details.reason == CancellationReason.EndOfStream: + print('CANCELED: End of the audio stream was reached.') + elif args.cancellation_details.reason == CancellationReason.Error: + print(f'CANCELED: ErrorDetails={args.cancellation_details.error_details}') + print('CANCELED: Did you update the subscription info?') + + # Set the future's result so the main thread can exit + session_stopped_no_error.set_result(args.cancellation_details.reason != CancellationReason.Error) + +speech_recognizer.canceled.connect(canceled) + +# Allow the user to press ENTER to stop recognition +threading.Thread(target=lambda: ( + input(''), + speech_recognizer.stop_continuous_recognition()) +).start() + +# Start keyword recognition +keyword_model = KeywordRecognitionModel(filename=keyword_file) +speech_recognizer.start_keyword_recognition(keyword_model) +print('Listening for keyword; press ENTER to stop ...') + +# Wait for the session to stop. result() will not return until the recognition +# session stops, and the result will indicate whether the session completed +# or was canceled. +exit_code = 0 if session_stopped_no_error.result() == True else 1 +os._exit(exit_code) \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-keyword-py/requirements.txt b/src/ai/.x/templates/speech-to-text-with-keyword-py/requirements.txt new file mode 100644 index 00000000..f33c7861 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-keyword-py/requirements.txt @@ -0,0 +1 @@ +azure-cognitiveservices-speech>=1.35.0 \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-translation-cs/Program.cs b/src/ai/.x/templates/speech-to-text-with-translation-cs/Program.cs new file mode 100644 index 00000000..e88f2bc2 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-translation-cs/Program.cs @@ -0,0 +1,145 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".cs" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +using System; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; +using Microsoft.CognitiveServices.Speech.Translation; + +public class Program +{ + public static async Task Main(string[] args) + { + // Connection and configuration details required + var speechKey = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_KEY") ?? "<#= AZURE_AI_SPEECH_KEY #>"; + var speechRegion = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_REGION") ?? "<#= AZURE_AI_SPEECH_REGION #>"; + var speechLanguage = "en-US"; // BCP-47 language code + var targetLanguages = new string[] { "de", "fr" }; + var inputFileName = args.Length == 1 ? args[0] : null; + + // Check to see if the input file exists + if (inputFileName != null && !File.Exists(inputFileName)) + { + Console.WriteLine($"ERROR: Cannot find audio input file: {inputFileName}"); + return 1; + } + + // Create instances of a speech translation config and audio config + var config = SpeechTranslationConfig.FromSubscription(speechKey, speechRegion); + var audioConfig = inputFileName != null + ? AudioConfig.FromWavFileInput(inputFileName) + : AudioConfig.FromDefaultMicrophoneInput(); + + // Set the source and target language(s) for translation + config.SpeechRecognitionLanguage = speechLanguage; + foreach (var targetLanguage in targetLanguages) + { + config.AddTargetLanguage(targetLanguage); + } + + // Create the speech recognizer from the above configuration information + using (var recognizer = new TranslationRecognizer(config, audioConfig)) + { + // Subscribe to the Recognizing and Recognized events. As the user speaks individual + // utterances, intermediate recognition results are sent to the Recognizing event, + // and the final recognition results are sent to the Recognized event. + recognizer.Recognizing += (s, e) => HandleRecognizingEvent(e); + recognizer.Recognized += (s, e) => HandleRecognizedEvent(e); + + // Create a task completion source to wait for the session to stop. This is needed in + // console apps to prevent the main thread from terminating while the recognition is + // running asynchronously on a separate background thread. + var sessionStoppedNoError = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + // Subscribe to SessionStarted and SessionStopped events. These events are useful for + // logging the start and end of a speech recognition session. In console apps, this is + // used to allow the application to block the main thread until recognition is complete. + recognizer.SessionStarted += (s, e) => HandleSessionStartedEvent(e); + recognizer.SessionStopped += (s, e) => HandleSessionStoppedEvent(e, sessionStoppedNoError); + + // Subscribe to the Canceled event, which indicates that the recognition operation + // was stopped/canceled, likely due to an error of some kind. + recognizer.Canceled += (s, e) => HandleCanceledEvent(e, sessionStoppedNoError); + + // Allow the user to press ENTER to stop recognition + Task.Run(() => + { + while (Console.ReadKey().Key != ConsoleKey.Enter) { } + recognizer.StopContinuousRecognitionAsync(); + }); + + // Start speech recognition + await recognizer.StartContinuousRecognitionAsync(); + Console.WriteLine("Listening; press ENTER to stop ...\n"); + + // Wait for the session to stop. The Task will not complete until the recognition + // session stops, and the result will indicate whether the session completed + // or was canceled. + return await sessionStoppedNoError.Task ? 0 : 1; + } + } + + private static void HandleRecognizingEvent(TranslationRecognitionEventArgs e) + { + Console.WriteLine($"RECOGNIZING: {e.Result.Text}"); + foreach (var lang in e.Result.Translations.Keys) + { + Console.WriteLine($"TRANSLATING into '{lang}': {e.Result.Translations[lang]}"); + } + Console.WriteLine(); + } + + private static void HandleRecognizedEvent(TranslationRecognitionEventArgs e) + { + if (e.Result.Reason == ResultReason.TranslatedSpeech && e.Result.Text.Length != 0) + { + Console.WriteLine($"RECOGNIZED: {e.Result.Text}"); + foreach (var lang in e.Result.Translations.Keys) + { + Console.WriteLine($"TRANSLATED into '{lang}': {e.Result.Translations[lang]}"); + } + Console.WriteLine(); + } + else if (e.Result.Reason == ResultReason.RecognizedSpeech && e.Result.Text.Length != 0) + { + Console.WriteLine($"RECOGNIZED: {e.Result.Text} (text could not be translated)"); + } + else if (e.Result.Reason == ResultReason.NoMatch) + { + Console.WriteLine($"NOMATCH: Speech could not be recognized.\n"); + } + } + + private static void HandleSessionStartedEvent(SessionEventArgs e) + { + Console.WriteLine($"SESSION STARTED: {e.SessionId}.\n"); + } + + private static void HandleSessionStoppedEvent(SessionEventArgs e, TaskCompletionSource sessionStoppedNoError) + { + Console.WriteLine($"SESSION STOPPED: {e.SessionId}."); + sessionStoppedNoError.TrySetResult(true); // Set the result so the main thread can exit + } + + private static void HandleCanceledEvent(TranslationRecognitionCanceledEventArgs e, TaskCompletionSource sessionStoppedNoError) + { + Console.WriteLine($"CANCELED: Reason={e.Reason}"); + + // Check the CancellationReason for more detailed information. + if (e.Reason == CancellationReason.EndOfStream) + { + Console.WriteLine($"CANCELED: End of the audio stream was reached."); + } + else if (e.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + + // Set the task completion source result so the main thread can exit + sessionStoppedNoError.TrySetResult(e.Reason != CancellationReason.Error); + } +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-translation-cs/SpeechToTextWithTranslation.csproj._ b/src/ai/.x/templates/speech-to-text-with-translation-cs/SpeechToTextWithTranslation.csproj._ new file mode 100644 index 00000000..b0925d48 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-translation-cs/SpeechToTextWithTranslation.csproj._ @@ -0,0 +1,17 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".csproj" encoding="utf-8" #> + + + + net8.0 + enable + enable + true + Exe + + + + + + + \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-translation-cs/_.json b/src/ai/.x/templates/speech-to-text-with-translation-cs/_.json new file mode 100644 index 00000000..b788a6fe --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-translation-cs/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ Translation)", + "_ShortName": "speech-to-text-with-translation", + "_Language": "C#", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-translation-py/_.json b/src/ai/.x/templates/speech-to-text-with-translation-py/_.json new file mode 100644 index 00000000..75122daa --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-translation-py/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Speech-to-text (w/ Translation)", + "_ShortName": "speech-to-text-with-translation", + "_Language": "Python", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-translation-py/main.py b/src/ai/.x/templates/speech-to-text-with-translation-py/main.py new file mode 100644 index 00000000..71e09edb --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-translation-py/main.py @@ -0,0 +1,104 @@ +from concurrent.futures import Future +from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer, ResultReason +from azure.cognitiveservices.speech import AudioConfig, CancellationReason +import threading +import os +import sys + +# Connection and configuration details required +speech_key = os.environ.get('AZURE_AI_SPEECH_KEY') or "" +service_region = os.environ.get('AZURE_AI_SPEECH_REGION') or "" +speech_language = "en-US" +target_languages = ['de', 'fr'] +input_file = sys.argv[1] if len(sys.argv) == 2 else None + +# Check to see if the input file exists +if input_file is not None and not os.path.exists(input_file): + print("ERROR: Cannot find audio input file: {}".format(input_file)) + sys.exit(1) + +# Create instances of a speech translation config and audio config +speech_config = SpeechTranslationConfig(subscription=speech_key, region=service_region) +audio_config = AudioConfig(filename=input_file) if input_file is not None else AudioConfig(use_default_microphone=True) + +# Set the source and target language(s) for translation +speech_config.speech_recognition_language = speech_language +for target_language in target_languages: + speech_config.add_target_language(target_language) + +# Create the speech recognizer from the above configuration information +speech_recognizer = TranslationRecognizer(translation_config=speech_config, audio_config=audio_config) + +# Subscribe to the Recognizing and Recognized events. As the user speaks individual +# utterances, intermediate recognition results are sent to the Recognizing event, +# and the final recognition results are sent to the Recognized event. +def recognizing(args): + print("RECOGNIZING: {}".format(args.result.text)) + for lang in args.result.translations.keys(): + print("TRANSLATING into '{}': {}".format(lang, args.result.translations[lang])) + print() + +def recognized(args): + if args.result.reason == ResultReason.TranslatedSpeech and args.result.text: + print("RECOGNIZED: {}".format(args.result.text)) + for lang in args.result.translations.keys(): + print("TRANSLATED into '{}': {}".format(lang, args.result.translations[lang])) + print() + elif args.result.reason == ResultReason.RecognizedSpeech and args.result.text: + print("RECOGNIZED: {} (text could not be translated)".format(args.result.text)) + elif args.result.reason == ResultReason.NoMatch: + print("NOMATCH: Speech could not be recognized.\n") + +speech_recognizer.recognizing.connect(recognizing) +speech_recognizer.recognized.connect(recognized) + +# Create a future to wait for the session to stop. This is needed in console apps to +# prevent the main thread from terminating while the recognition is running +# asynchronously on a separate background thread. +session_stopped_no_error = Future() + +# Subscribe to session_started and session_stopped events. These events are useful for +# logging the start and end of a speech recognition session. In console apps, this is +# used to allow the application to block the main thread until recognition is complete. +def session_started(args): + print("SESSION STARTED: {}\n".format(args.session_id)) + +def session_stopped(args): + print("SESSION STOPPED: {}".format(args.session_id)) + session_stopped_no_error.set_result(True) + +speech_recognizer.session_started.connect(session_started) +speech_recognizer.session_stopped.connect(session_stopped) + +# Subscribe to the canceled event, which indicates that the recognition operation +# was stopped/canceled, likely due to an error of some kind. +def canceled(args): + print("CANCELED: Reason={}".format(args.cancellation_details.reason)) + + # Check the CancellationReason for more detailed information. + if args.cancellation_details.reason == CancellationReason.EndOfStream: + print("CANCELED: End of the audio stream was reached.") + elif args.cancellation_details.reason == CancellationReason.Error: + print("CANCELED: ErrorDetails={}".format(args.cancellation_details.error_details)) + print("CANCELED: Did you update the subscription info?") + + # Set the future's result so the main thread can exit + session_stopped_no_error.set_result(args.cancellation_details.reason != CancellationReason.Error) + +speech_recognizer.canceled.connect(canceled) + +# Allow the user to press ENTER to stop recognition +threading.Thread(target=lambda: ( + input(""), + speech_recognizer.stop_continuous_recognition()) +).start() + +# Start speech recognition +speech_recognizer.start_continuous_recognition() +print("Listening, press ENTER to stop...") + +# Wait for the session to stop. result() will not return until the recognition +# session stops, and the result will indicate whether the session completed +# or was canceled. +exit_code = 0 if session_stopped_no_error.result() == True else 1 +os._exit(exit_code) \ No newline at end of file diff --git a/src/ai/.x/templates/speech-to-text-with-translation-py/requirements.txt b/src/ai/.x/templates/speech-to-text-with-translation-py/requirements.txt new file mode 100644 index 00000000..f33c7861 --- /dev/null +++ b/src/ai/.x/templates/speech-to-text-with-translation-py/requirements.txt @@ -0,0 +1 @@ +azure-cognitiveservices-speech>=1.35.0 \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-cs/Program.cs b/src/ai/.x/templates/text-to-speech-cs/Program.cs new file mode 100644 index 00000000..5c27ba97 --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-cs/Program.cs @@ -0,0 +1,53 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".cs" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +using System; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; + +public class Program +{ + public static async Task Main(string[] args) + { + // Connection and configuration details required + var speechKey = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_KEY") ?? "<#= AZURE_AI_SPEECH_KEY #>"; + var speechRegion = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_REGION") ?? "<#= AZURE_AI_SPEECH_REGION #>"; + var voiceName = "en-US-AndrewNeural"; // You can list voice names with `ai speech synthesize --list-voices` + + // Create instances of a speech config and audio config, and set the voice name to use + var config = SpeechConfig.FromSubscription(speechKey, speechRegion); + var audioConfig = AudioConfig.FromDefaultSpeakerOutput(); + config.SpeechSynthesisVoiceName = voiceName; + + // Create the speech synthesizer from the above configuration information + using (var synthesizer = new SpeechSynthesizer(config, audioConfig)) + { + // Get text from the user to synthesize + Console.Write("Enter text: "); + var text = Console.ReadLine(); + + // Start speech synthesis, and return after it has completed + var result = await synthesizer.SpeakTextAsync(text); + + // Check the result + if (result.Reason == ResultReason.SynthesizingAudioCompleted) + { + Console.WriteLine($"SYNTHESIZED: {result.AudioData.Length} byte(s)"); + } + else if (result.Reason == ResultReason.Canceled) + { + var cancellation = SpeechSynthesisCancellationDetails.FromResult(result); + Console.WriteLine($"CANCELED: Reason={cancellation.Reason}"); + + if (cancellation.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + } + } + } +} \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-cs/TextToSpeech.csproj._ b/src/ai/.x/templates/text-to-speech-cs/TextToSpeech.csproj._ new file mode 100644 index 00000000..b0925d48 --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-cs/TextToSpeech.csproj._ @@ -0,0 +1,17 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".csproj" encoding="utf-8" #> + + + + net8.0 + enable + enable + true + Exe + + + + + + + \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-cs/_.json b/src/ai/.x/templates/text-to-speech-cs/_.json new file mode 100644 index 00000000..0bc74eeb --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-cs/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Text-to-speech", + "_ShortName": "text-to-speech", + "_Language": "C#", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-py/_.json b/src/ai/.x/templates/text-to-speech-py/_.json new file mode 100644 index 00000000..f1cd721c --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-py/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Text-to-speech", + "_ShortName": "text-to-speech", + "_Language": "Python", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-py/main.py b/src/ai/.x/templates/text-to-speech-py/main.py new file mode 100644 index 00000000..de07df82 --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-py/main.py @@ -0,0 +1,32 @@ +from azure.cognitiveservices.speech import SpeechConfig, SpeechSynthesizer, SpeechSynthesisResult, SpeechSynthesisCancellationDetails, CancellationReason, ResultReason +from azure.cognitiveservices.speech.audio import AudioOutputConfig +import os + +# Connection and configuration details required +speech_key = os.environ.get('AZURE_AI_SPEECH_KEY') or "" +service_region = os.environ.get('AZURE_AI_SPEECH_REGION') or "" +voice_name = 'en-US-AndrewNeural' + +# Create instances of a speech config and audio config, and set the voice name to use +speech_config = SpeechConfig(subscription=speech_key, region=service_region) +speech_config.speech_synthesis_voice_name = voice_name +audio_config = AudioOutputConfig(use_default_speaker=True) + +# Create the speech synthesizer from the above configuration information +speech_synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config) + +# Get text from the user to synthesize +text = input('Enter text: ') + +# Start speech synthesis, and return after it has completed +result = speech_synthesizer.speak_text_async(text).get() + +# Check the result +if result.reason == ResultReason.SynthesizingAudioCompleted: + print('SYNTHESIZED: {} byte(s)'.format(len(result.audio_data))) +elif result.reason == ResultReason.Canceled: + cancellation_details = result.cancellation_details + print('CANCELED: Reason={}'.format(cancellation_details.reason)) + if cancellation_details.reason == CancellationReason.Error: + print('CANCELED: ErrorDetails={}'.format(cancellation_details.error_details)) + print('CANCELED: Did you update the subscription info?') diff --git a/src/ai/.x/templates/text-to-speech-py/requirements.txt b/src/ai/.x/templates/text-to-speech-py/requirements.txt new file mode 100644 index 00000000..f33c7861 --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-py/requirements.txt @@ -0,0 +1 @@ +azure-cognitiveservices-speech>=1.35.0 \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-with-file-cs/Program.cs b/src/ai/.x/templates/text-to-speech-with-file-cs/Program.cs new file mode 100644 index 00000000..f4b90f2c --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-with-file-cs/Program.cs @@ -0,0 +1,56 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".cs" encoding="utf-8" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_ENDPOINT" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_KEY" #> +<#@ parameter type="System.String" name="AZURE_AI_SPEECH_REGION" #> +using System; +using Microsoft.CognitiveServices.Speech; +using Microsoft.CognitiveServices.Speech.Audio; + +public class Program +{ + public static async Task Main(string[] args) + { + // Connection and configuration details required + var speechKey = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_KEY") ?? "<#= AZURE_AI_SPEECH_KEY #>"; + var speechRegion = Environment.GetEnvironmentVariable("AZURE_AI_SPEECH_REGION") ?? "<#= AZURE_AI_SPEECH_REGION #>"; + var voiceName = "en-US-AndrewNeural"; // You can list voice names with `ai speech synthesize --list-voices` + var outputFileName = "output.wav"; + var outputFormat = SpeechSynthesisOutputFormat.Riff16Khz16BitMonoPcm; + + // Create instances of an audio config, a speech config, setting the voice name and output format to use + var config = SpeechConfig.FromSubscription(speechKey, speechRegion); + var audioConfig = AudioConfig.FromWavFileOutput(outputFileName); + config.SetSpeechSynthesisOutputFormat(outputFormat); + config.SpeechSynthesisVoiceName = voiceName; + + // Create the speech synthesizer from the above configuration information + using (var synthesizer = new SpeechSynthesizer(config, audioConfig)) + { + // Get text from the user to synthesize + Console.Write("Enter text: "); + var text = Console.ReadLine(); + + // Start speech synthesis, and return after it has completed + var result = await synthesizer.SpeakTextAsync(text); + + // Check the result + if (result.Reason == ResultReason.SynthesizingAudioCompleted) + { + Console.WriteLine($"SYNTHESIZED: {result.AudioData.Length} byte(s) to {outputFileName}"); + } + else if (result.Reason == ResultReason.Canceled) + { + var cancellation = SpeechSynthesisCancellationDetails.FromResult(result); + Console.WriteLine($"CANCELED: Reason={cancellation.Reason}"); + + if (cancellation.Reason == CancellationReason.Error) + { + Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}"); + Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}"); + Console.WriteLine($"CANCELED: Did you update the subscription info?"); + } + } + } + } +} \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-with-file-cs/TextToSpeechWithFile.csproj._ b/src/ai/.x/templates/text-to-speech-with-file-cs/TextToSpeechWithFile.csproj._ new file mode 100644 index 00000000..b0925d48 --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-with-file-cs/TextToSpeechWithFile.csproj._ @@ -0,0 +1,17 @@ +<#@ template hostspecific="true" #> +<#@ output extension=".csproj" encoding="utf-8" #> + + + + net8.0 + enable + enable + true + Exe + + + + + + + \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-with-file-cs/_.json b/src/ai/.x/templates/text-to-speech-with-file-cs/_.json new file mode 100644 index 00000000..94a8971c --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-with-file-cs/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Text-to-speech (w/ File output)", + "_ShortName": "text-to-speech-with-file", + "_Language": "C#", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-with-file-py/_.json b/src/ai/.x/templates/text-to-speech-with-file-py/_.json new file mode 100644 index 00000000..7c03037e --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-with-file-py/_.json @@ -0,0 +1,8 @@ +{ + "_LongName": "Text-to-speech (w/ File output)", + "_ShortName": "text-to-speech-with-file", + "_Language": "Python", + "AZURE_AI_SPEECH_ENDPOINT": "", + "AZURE_AI_SPEECH_KEY": "", + "AZURE_AI_SPEECH_REGION": "" +} \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-with-file-py/main.py b/src/ai/.x/templates/text-to-speech-with-file-py/main.py new file mode 100644 index 00000000..5ecfed72 --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-with-file-py/main.py @@ -0,0 +1,35 @@ +from azure.cognitiveservices.speech import SpeechConfig, SpeechSynthesizer, SpeechSynthesisResult, SpeechSynthesisCancellationDetails, CancellationReason, ResultReason, SpeechSynthesisOutputFormat +from azure.cognitiveservices.speech.audio import AudioOutputConfig +import os + +# Connection and configuration details required +speech_key = os.environ.get('AZURE_AI_SPEECH_KEY') or "" +service_region = os.environ.get('AZURE_AI_SPEECH_REGION') or "" +voice_name = 'en-US-AndrewNeural' +output_file_name = 'output.wav' +output_format = SpeechSynthesisOutputFormat['Riff16Khz16BitMonoPcm'] + +# Create instances of a speech config and audio config, and set the voice name and output format to use +speech_config = SpeechConfig(subscription=speech_key, region=service_region) +speech_config.speech_synthesis_output_format = output_format +speech_config.speech_synthesis_voice_name = voice_name +audio_config = AudioOutputConfig(filename=output_file_name) + +# Create the speech synthesizer from the above configuration information +speech_synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config) + +# Get text from the user to synthesize +text = input('Enter text: ') + +# Start speech synthesis, and return after it has completed +result = speech_synthesizer.speak_text_async(text).get() + +# Check the result +if result.reason == ResultReason.SynthesizingAudioCompleted: + print('SYNTHESIZED: {} byte(s) to {}'.format(len(result.audio_data), output_file_name)) +elif result.reason == ResultReason.Canceled: + cancellation_details = result.cancellation_details + print('CANCELED: Reason={}'.format(cancellation_details.reason)) + if cancellation_details.reason == CancellationReason.Error: + print('CANCELED: ErrorDetails={}'.format(cancellation_details.error_details)) + print('CANCELED: Did you update the subscription info?') \ No newline at end of file diff --git a/src/ai/.x/templates/text-to-speech-with-file-py/requirements.txt b/src/ai/.x/templates/text-to-speech-with-file-py/requirements.txt new file mode 100644 index 00000000..f33c7861 --- /dev/null +++ b/src/ai/.x/templates/text-to-speech-with-file-py/requirements.txt @@ -0,0 +1 @@ +azure-cognitiveservices-speech>=1.35.0 \ No newline at end of file diff --git a/tests/test-speech.yaml b/tests/test-speech.yaml new file mode 100644 index 00000000..21fddefe --- /dev/null +++ b/tests/test-speech.yaml @@ -0,0 +1,272 @@ +tests: +- name: ai init speech + command: ai init speech + tags: [before] + arguments: + subscription: e72e5254-f265-4e95-9bd2-9ee8e7329051 + name: robch-cranky-red-koala-ais + interactive: false + +- area: ai dev new speech tests + tests: + + - area: ai dev new speech-to-text + tests: + + - class: dev new speech-to-text (c#) + steps: + - name: generate template + command: ai dev new speech-to-text --cs + - name: build template + bash: | + cd speech-to-text-cs + dotnet build + # - name: run template + # command: ai dev shell --bash "cd speech-to-text-cs;./bin/Debug/net8.0/SpeechToText" + # tag: skip-run-requires-microphone + + - class: dev new speech-to-text (python) + steps: + - name: generate template + command: ai dev new speech-to-text --py + - name: install requirements + bash: | + cd speech-to-text-py + pip install -r requirements.txt + # - name: run template + # command: ai dev shell + # arguments: + # bash: | + # cd speech-to-text-py + # if [ -f /etc/os-release ]; then + # python3 main.py + # else + # python main.py + # fi + # tag: skip-run-requires-microphone + + - area: ai dev new speech-to-text-continuous-reco + tests: + + - class: dev new speech-to-text-continuous-reco (c#) + steps: + - name: generate template + command: ai dev new speech-to-text-continuous-reco --cs + - name: build template + bash: | + cd speech-to-text-continuous-reco-cs + dotnet build + # - name: run template + # command: ai dev shell --bash "cd speech-to-text-continuous-reco-cs;./bin/Debug/net8.0/SpeechToTextContinuous" + # tag: skip-run-requires-microphone + + - class: dev new speech-to-text-continuous-reco (python) + steps: + - name: generate template + command: ai dev new speech-to-text-continuous-reco --py + - name: install requirements + bash: | + cd speech-to-text-continuous-reco-py + pip install -r requirements.txt + # - name: run template + # command: ai dev shell + # arguments: + # bash: | + # cd speech-to-text-continuous-reco-py + # if [ -f /etc/os-release ]; then + # python3 main.py + # else + # python main.py + # fi + # tag: skip-run-requires-microphone + + - area: ai dev new speech-to-text-with-file + tests: + + - class: dev new speech-to-text-with-file (c#) + steps: + - name: generate template + command: ai dev new speech-to-text-with-file --cs + - name: build template + bash: | + cd speech-to-text-with-file-cs + dotnet build + - name: create audio file for input + command: ai speech synthesize --text "Hello world" --audio-output "speech-to-text-with-file-cs/hello.wav" + - name: run template + command: ai dev shell --bash "cd speech-to-text-with-file-cs;./bin/Debug/net8.0/SpeechToTextWithFile hello.wav" + expect: | + Hello world. + + - class: dev new speech-to-text-with-file (python) + steps: + - name: generate template + command: ai dev new speech-to-text-with-file --py + - name: install requirements + bash: | + cd speech-to-text-with-file-py + pip install -r requirements.txt + - name: create audio file for input + command: ai speech synthesize --text "Hello world" --audio-output "speech-to-text-with-file-py/hello.wav" + - name: run template + command: ai dev shell + arguments: + bash: | + cd speech-to-text-with-file-py + if [ -f /etc/os-release ]; then + python3 main.py hello.wav + else + python main.py hello.wav + fi + + - area: ai dev new speech-to-text-with-keyword + tests: + + - class: dev new speech-to-text-with-keyword (c#) + steps: + - name: generate template + command: ai dev new speech-to-text-with-keyword --cs + - name: build template + bash: | + cd speech-to-text-with-keyword-cs + dotnet build + # - name: create audio file for input + # command: ai speech synthesize --text "Computer tell me a joke. Computer tell me another joke." --audio-output "speech-to-text-with-keyword-cs/jokes.wav" + # - name: run template + # command: ai dev shell --bash "cd speech-to-text-with-keyword-cs;./bin/Debug/net8.0/SpeechToTextWithKeyword jokes.wav" + # tag: skip-run-requires-bugfix + + - class: dev new speech-to-text-with-keyword (python) + steps: + - name: generate template + command: ai dev new speech-to-text-with-keyword --py + - name: install requirements + bash: | + cd speech-to-text-with-keyword-py + pip install -r requirements.txt + # - name: create audio file for input + # command: ai speech synthesize --text "Computer tell me a joke. Computer tell me another joke." --audio-output "speech-to-text-with-keyword-py/jokes.wav" + # - name: run template + # command: ai dev shell + # arguments: + # bash: | + # cd speech-to-text-with-keyword-py + # if [ -f /etc/os-release ]; then + # python3 main.py jokes.wav + # else + # python main.py jokes.wav + # fi + # tag: skip-run-requires-bugfix + + - area: ai dev new speech-to-text-with-translation + tests: + + - class: dev new speech-to-text-with-translation (c#) + steps: + - name: generate template + command: ai dev new speech-to-text-with-translation --cs + - name: build template + bash: | + cd speech-to-text-with-translation-cs + dotnet build + - name: create audio file for input + command: ai speech synthesize --text "Hello world" --audio-output "speech-to-text-with-translation-cs/hello.wav" + - name: run template + command: ai dev shell --bash "cd speech-to-text-with-translation-cs;./bin/Debug/net8.0/SpeechToTextWithTranslation hello.wav" + expect: | + Hello world. + + - class: dev new speech-to-text-with-translation (python) + steps: + - name: generate template + command: ai dev new speech-to-text-with-translation --py + - name: install requirements + bash: | + cd speech-to-text-with-translation-py + pip install -r requirements.txt + - name: create audio file for input + command: ai speech synthesize --text "Hello world" --audio-output "speech-to-text-with-translation-py/hello.wav" + - name: run template + command: ai dev shell + arguments: + bash: | + cd speech-to-text-with-translation-py + if [ -f /etc/os-release ]; then + python3 main.py hello.wav + else + python main.py hello.wav + fi + + - area: ai dev new text-to-speech + tests: + + - class: dev new text-to-speech (c#) + steps: + - name: generate template + command: ai dev new text-to-speech --cs + - name: build template + bash: | + cd text-to-speech-cs + dotnet build + # - name: run template + # command: ai dev shell --bash "cd text-to-speech-cs;./bin/Debug/net8.0/TextToSpeech" + # input: |- + # Hello world. + # tag: skip-run-requires-speakers + + - class: dev new text-to-speech (python) + steps: + - name: generate template + command: ai dev new text-to-speech --py + - name: install requirements + bash: | + cd text-to-speech-py + pip install -r requirements.txt + # - name: run template + # command: ai dev shell + # arguments: + # bash: | + # cd text-to-speech-py + # if [ -f /etc/os-release ]; then + # python3 main.py + # else + # python main.py + # fi + # tag: skip-run-requires-speakers + + - area: ai dev new text-to-speech-with-file + tests: + + - class: dev new text-to-speech-with-file (c#) + steps: + - name: generate template + command: ai dev new text-to-speech-with-file --cs + - name: build template + bash: | + cd text-to-speech-with-file-cs + dotnet build + - name: run template + command: ai dev shell --bash "cd text-to-speech-with-file-cs;./bin/Debug/net8.0/TextToSpeechWithFile" + input: |- + Hello world. + + - class: dev new text-to-speech-with-file (python) + steps: + - name: generate template + command: ai dev new text-to-speech-with-file --py + - name: install requirements + bash: | + cd text-to-speech-with-file-py + pip install -r requirements.txt + - name: run template + command: ai dev shell + arguments: + bash: | + cd text-to-speech-with-file-py + if [ -f /etc/os-release ]; then + python3 main.py + else + python main.py + fi + input: |- + Hello world. \ No newline at end of file diff --git a/tests/test3.yaml b/tests/test3.yaml index a20b00e2..759917d1 100644 --- a/tests/test3.yaml +++ b/tests/test3.yaml @@ -10,12 +10,6 @@ embeddings-deployment-name: text-embedding-ada-002-2 evaluation-deployment-name: gpt-4-32k-0613 interactive: false - - name: ai init speech - command: ai init speech - arguments: - subscription: e72e5254-f265-4e95-9bd2-9ee8e7329051 - name: robch-cranky-red-koala-ais - interactive: false - name: test ai chat command: ai chat --question "Why is the sky blue, what's it called" --index-name @none