From 6b0a5be1afee0160a7f97f911e04b4aec34c7f1e Mon Sep 17 00:00:00 2001
From: Deep Blue
Date: Tue, 19 Dec 2023 07:16:43 -0600
Subject: [PATCH 1/3] Render quick replies in chat-box.
---
.../Agents/Models/Agent.cs | 4 +-
.../Messaging/IRichMessage.cs | 2 +
.../RichContentJsonConverter .cs | 2 +-
.../TemplateMessageJsonConverter.cs | 2 +-
.../Models/RichContent/RichContent.cs | 10 +
.../BotSharp.OpenAPI/BotSharp.OpenAPI.csproj | 2 +
.../BotSharpOpenApiExtensions.cs | 48 ++
.../Conversations/ChatResponseModel.cs | 13 +-
.../Hooks/ChatHubConversationHook.cs | 30 +-
.../Services/MessageHandleService.cs | 2 +-
.../BotSharp.Plugin.RoutingSpeeder.csproj | 2 +-
.../Models/DialoguePredictionModel.cs | 6 +-
src/WebStarter/Program.cs | 40 +-
src/WebStarter/WebStarter.csproj | 2 -
.../templates/welcome.liquid | 15 +-
src/web-live-chat/package-lock.json | 496 ++++++++++++------
src/web-live-chat/src/lib/helpers/typedefs.js | 54 ++
.../src/lib/scss/_variables.scss | 2 +-
.../src/lib/services/signalr-service.js | 3 +-
.../[conversationId]/chat-box.svelte | 12 +-
.../[conversationId]/rc-quick-reply.svelte | 12 +
.../[agentId]/[conversationId]/rc-text.svelte | 6 +
.../static/images/users/chatbot.png | Bin 0 -> 3403 bytes
23 files changed, 521 insertions(+), 244 deletions(-)
rename src/Infrastructure/BotSharp.Abstraction/Messaging/{ => JsonConverters}/RichContentJsonConverter .cs (89%)
rename src/Infrastructure/BotSharp.Abstraction/Messaging/{ => JsonConverters}/TemplateMessageJsonConverter.cs (89%)
create mode 100644 src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs
create mode 100644 src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte
create mode 100644 src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte
create mode 100644 src/web-live-chat/static/images/users/chatbot.png
diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs
index f6e10fd0..251af6b0 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs
@@ -21,7 +21,7 @@ public class Agent
/// Instruction
///
[JsonIgnore]
- public string Instruction { get; set; }
+ public string? Instruction { get; set; }
///
/// Templates
@@ -52,7 +52,7 @@ public class Agent
/// Domain knowledges
///
[JsonIgnore]
- public string Knowledges { get; set; }
+ public string? Knowledges { get; set; }
public bool IsPublic { get; set; }
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs
index c81f7e91..fb87f381 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs
@@ -3,5 +3,7 @@ namespace BotSharp.Abstraction.Messaging;
public interface IRichMessage
{
string Text { get; set; }
+
+ [JsonPropertyName("rich_type")]
string RichType => "text";
}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs
similarity index 89%
rename from src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs
rename to src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs
index 5234f7fd..7f01132e 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs
@@ -1,6 +1,6 @@
using System.Text.Json;
-namespace BotSharp.Abstraction.Messaging;
+namespace BotSharp.Abstraction.Messaging.JsonConverters;
public class RichContentJsonConverter : JsonConverter
{
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs
similarity index 89%
rename from src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs
rename to src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs
index 36e68a71..9b990193 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs
@@ -1,6 +1,6 @@
using System.Text.Json;
-namespace BotSharp.Abstraction.Messaging;
+namespace BotSharp.Abstraction.Messaging.JsonConverters;
public class TemplateMessageJsonConverter : JsonConverter
{
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs
index 61a89af8..95f4e6e9 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs
@@ -9,4 +9,14 @@ public class RichContent where T : IRichMessage
[JsonPropertyName("messaging_type")]
public string MessagingType => "RESPONSE";
public T Message { get; set; }
+
+ public RichContent()
+ {
+
+ }
+
+ public RichContent(T message)
+ {
+ Message = message;
+ }
}
diff --git a/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj b/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj
index cef8a0e6..2df5badd 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj
+++ b/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj
@@ -11,6 +11,8 @@
+
+
diff --git a/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs b/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs
new file mode 100644
index 00000000..89d7b099
--- /dev/null
+++ b/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs
@@ -0,0 +1,48 @@
+using BotSharp.Abstraction.Messaging.JsonConverters;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.Extensions.Configuration;
+using Microsoft.IdentityModel.Tokens;
+
+namespace BotSharp.OpenAPI;
+
+public static class BotSharpOpenApiExtensions
+{
+ public static IServiceCollection AddBotSharpOpenAPI(this IServiceCollection services, IConfiguration config)
+ {
+ // Add services to the container.
+ services.AddControllers()
+ .AddJsonOptions(options =>
+ {
+ options.JsonSerializerOptions.Converters.Add(new RichContentJsonConverter());
+ options.JsonSerializerOptions.Converters.Add(new TemplateMessageJsonConverter());
+ });
+
+ // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+ services.AddEndpointsApiExplorer();
+ services.AddSwaggerGen();
+
+ services.AddHttpContextAccessor();
+
+ // Add bearer authentication
+ services.AddAuthentication(options =>
+ {
+ options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
+ }).AddJwtBearer(o =>
+ {
+ o.TokenValidationParameters = new TokenValidationParameters
+ {
+ ValidIssuer = config["Jwt:Issuer"],
+ ValidAudience = config["Jwt:Audience"],
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["Jwt:Key"])),
+ ValidateIssuer = true,
+ ValidateAudience = true,
+ ValidateLifetime = false,
+ ValidateIssuerSigningKey = true
+ };
+ });
+
+ return services;
+ }
+}
diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs
index 6fda2ade..cf71b8f9 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs
+++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs
@@ -1,6 +1,7 @@
using BotSharp.Abstraction.Functions.Models;
using BotSharp.Abstraction.Instructs.Models;
-using BotSharp.OpenAPI.ViewModels.Users;
+using BotSharp.Abstraction.Messaging;
+using BotSharp.Abstraction.Messaging.Models.RichContent;
using System.Text.Json.Serialization;
namespace BotSharp.OpenAPI.ViewModels.Conversations;
@@ -8,24 +9,24 @@ namespace BotSharp.OpenAPI.ViewModels.Conversations;
public class ChatResponseModel : InstructResult
{
[JsonPropertyName("conversation_id")]
- public string ConversationId { get; set; }
+ public string ConversationId { get; set; } = string.Empty;
- public UserViewModel Sender { get; set; }
+ public UserViewModel Sender { get; set; } = new UserViewModel();
- public string Function { get; set; }
+ public string? Function { get; set; }
///
/// Planner instruction
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public FunctionCallFromLlm Instruction { get; set; }
+ public FunctionCallFromLlm? Instruction { get; set; }
///
/// Rich message for UI rendering
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("rich_content")]
- public object? RichContent { get; set; }
+ public RichContent? RichContent { get; set; }
[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs
index 766ca858..590e65f2 100644
--- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs
+++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs
@@ -1,6 +1,8 @@
using BotSharp.Abstraction.Messaging;
+using BotSharp.Abstraction.Messaging.JsonConverters;
using BotSharp.Abstraction.Messaging.Models.RichContent;
using Microsoft.AspNetCore.SignalR;
+using System.Text.Json.Serialization.Metadata;
namespace BotSharp.Plugin.ChatHub.Hooks;
@@ -9,7 +11,7 @@ public class ChatHubConversationHook : ConversationHookBase
private readonly IServiceProvider _services;
private readonly IHubContext _chatHub;
private readonly IUserIdentity _user;
-
+ private readonly JsonSerializerOptions _serializerOptions;
public ChatHubConversationHook(IServiceProvider services,
IHubContext chatHub,
IUserIdentity user)
@@ -17,15 +19,25 @@ public class ChatHubConversationHook : ConversationHookBase
_services = services;
_chatHub = chatHub;
_user = user;
+
+ _serializerOptions = new JsonSerializerOptions
+ {
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
+ Converters =
+ {
+ new RichContentJsonConverter(),
+ new TemplateMessageJsonConverter(),
+ }
+ };
}
public override async Task OnUserAgentConnectedInitially(Conversation conversation)
{
- var agentService = _services.GetService();
+ var agentService = _services.GetRequiredService();
var agent = await agentService.LoadAgent(conversation.AgentId);
// Check if the Welcome template exists.
- var welcomeTemplate = agent.Templates.FirstOrDefault(x => x.Name == "welcome");
+ var welcomeTemplate = agent.Templates?.FirstOrDefault(x => x.Name == "welcome");
if (welcomeTemplate != null)
{
var richContentService = _services.GetRequiredService();
@@ -33,19 +45,22 @@ public class ChatHubConversationHook : ConversationHookBase
foreach (var message in messages)
{
- await Task.Delay(300);
-
- await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", new ChatResponseModel()
+ var json = JsonSerializer.Serialize(new ChatResponseModel()
{
ConversationId = conversation.Id,
Text = message.Text,
+ RichContent = new RichContent(message),
Sender = new UserViewModel()
{
FirstName = "AI",
LastName = "Assistant",
Role = AgentRole.Assistant
}
- });
+ }, _serializerOptions);
+
+ await Task.Delay(300);
+
+ await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", json);
}
}
@@ -92,6 +107,7 @@ public class ChatHubConversationHook : ConversationHookBase
ConversationId = conv.ConversationId,
MessageId = message.MessageId,
Text = message.Content,
+ RichContent = message.RichContent,
Sender = new UserViewModel()
{
FirstName = "AI",
diff --git a/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs b/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs
index bf83ea70..242b5cea 100644
--- a/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs
+++ b/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs
@@ -1,7 +1,7 @@
using BotSharp.Abstraction.Agents.Enums;
using BotSharp.Abstraction.Conversations.Enums;
+using BotSharp.Abstraction.Messaging.JsonConverters;
using BotSharp.Abstraction.Messaging.Models.RichContent;
-using BotSharp.Abstraction.Utilities;
using System.Text.Json.Serialization.Metadata;
namespace BotSharp.Plugin.MetaMessenger.Services;
diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj
index cc28ea40..63a83977 100644
--- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj
+++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj
@@ -6,7 +6,7 @@
$(LangVersion)
$(BotSharpVersion)
$(GeneratePackageOnBuild)
- True
+ $(GenerateDocumentationFile)
diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs
index 36b7c38c..a061fe61 100644
--- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs
+++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs
@@ -1,13 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
namespace BotSharp.Plugin.RoutingSpeeder.Providers.Models;
public class DialoguePredictionModel
{
public int Id { get; set; }
- public string Text { get; set; }
+ public string Text { get; set; } = string.Empty;
public string? Label { get; set; }
public string? Prediction { get; set; }
}
diff --git a/src/WebStarter/Program.cs b/src/WebStarter/Program.cs
index c8ba1a94..3da77ad9 100644
--- a/src/WebStarter/Program.cs
+++ b/src/WebStarter/Program.cs
@@ -1,53 +1,17 @@
-using BotSharp.Abstraction.Messaging;
using BotSharp.Abstraction.Users;
using BotSharp.Core;
+using BotSharp.OpenAPI;
using BotSharp.Core.Users.Services;
using BotSharp.Logger;
using BotSharp.Plugin.ChatHub;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.IdentityModel.Tokens;
-using System.Text;
var builder = WebApplication.CreateBuilder(args);
-// Add services to the container.
-builder.Services.AddControllers()
- .AddJsonOptions(options =>
- {
- options.JsonSerializerOptions.Converters.Add(new RichContentJsonConverter());
- options.JsonSerializerOptions.Converters.Add(new TemplateMessageJsonConverter());
- });
-
-// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
-builder.Services.AddEndpointsApiExplorer();
-builder.Services.AddSwaggerGen();
-
-builder.Services.AddHttpContextAccessor();
-
-// Add bearer authentication
-builder.Services.AddAuthentication(options =>
-{
- options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
-}).AddJwtBearer(o =>
-{
- o.TokenValidationParameters = new TokenValidationParameters
- {
- ValidIssuer = builder.Configuration["Jwt:Issuer"],
- ValidAudience = builder.Configuration["Jwt:Audience"],
- IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])),
- ValidateIssuer = true,
- ValidateAudience = true,
- ValidateLifetime = false,
- ValidateIssuerSigningKey = true
- };
-});
-
builder.Services.AddScoped();
// Add BotSharp
builder.Services.AddBotSharpCore(builder.Configuration);
+builder.Services.AddBotSharpOpenAPI(builder.Configuration);
builder.Services.AddBotSharpLogger(builder.Configuration);
builder.Services.AddCors(options =>
diff --git a/src/WebStarter/WebStarter.csproj b/src/WebStarter/WebStarter.csproj
index 767af598..1e47e808 100644
--- a/src/WebStarter/WebStarter.csproj
+++ b/src/WebStarter/WebStarter.csproj
@@ -39,9 +39,7 @@
-
-
diff --git a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid
index 6a0b2780..beabbccc 100644
--- a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid
+++ b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid
@@ -3,6 +3,17 @@
"text": "Hello, I'm an AI assistant that help you do variety of tasks."
},
{
- "text": "How can I help you today?"
- }
+ "rich_type": "quick_reply",
+ "text": "How can I help you today?",
+ "quick_replies": [
+ {
+ "title":"Order a pizza",
+ "payload":"order a pizza"
+ },
+ {
+ "title":"Who are you?",
+ "payload":"who are you?"
+ }
+ ]
+ }
]
\ No newline at end of file
diff --git a/src/web-live-chat/package-lock.json b/src/web-live-chat/package-lock.json
index c28973b0..0f233357 100644
--- a/src/web-live-chat/package-lock.json
+++ b/src/web-live-chat/package-lock.json
@@ -9,7 +9,7 @@
"version": "0.1.0",
"dependencies": {
"@microsoft/signalr": "^8.0.0",
- "@sveltejs/adapter-static": "^2.0.3",
+ "@sveltejs/adapter-static": "^3.0.0",
"axios": "^1.6.2",
"bootstrap": "^5.3.2",
"overlayscrollbars": "^2.4.4",
@@ -17,8 +17,9 @@
"sveltestrap": "^5.11.2"
},
"devDependencies": {
- "@sveltejs/adapter-auto": "^2.0.0",
- "@sveltejs/kit": "^1.27.6",
+ "@sveltejs/adapter-auto": "^3.0.0",
+ "@sveltejs/kit": "^2.0.0",
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
"eslint": "^8.28.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-svelte": "^2.30.0",
@@ -28,7 +29,7 @@
"svelte": "^4.2.8",
"svelte-check": "^3.6.0",
"typescript": "^5.0.0",
- "vite": "^4.5.1"
+ "vite": "^5.0.0"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -53,9 +54,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
- "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz",
+ "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==",
"cpu": [
"arm"
],
@@ -68,9 +69,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
- "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz",
+ "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==",
"cpu": [
"arm64"
],
@@ -83,9 +84,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
- "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz",
+ "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==",
"cpu": [
"x64"
],
@@ -98,9 +99,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
- "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz",
+ "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==",
"cpu": [
"arm64"
],
@@ -113,9 +114,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
- "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz",
+ "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==",
"cpu": [
"x64"
],
@@ -128,9 +129,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
- "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz",
+ "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==",
"cpu": [
"arm64"
],
@@ -143,9 +144,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
- "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz",
+ "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==",
"cpu": [
"x64"
],
@@ -158,9 +159,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
- "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz",
+ "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==",
"cpu": [
"arm"
],
@@ -173,9 +174,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
- "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz",
+ "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==",
"cpu": [
"arm64"
],
@@ -188,9 +189,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
- "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz",
+ "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==",
"cpu": [
"ia32"
],
@@ -203,9 +204,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
- "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz",
+ "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==",
"cpu": [
"loong64"
],
@@ -218,9 +219,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
- "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz",
+ "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==",
"cpu": [
"mips64el"
],
@@ -233,9 +234,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
- "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz",
+ "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==",
"cpu": [
"ppc64"
],
@@ -248,9 +249,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
- "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz",
+ "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==",
"cpu": [
"riscv64"
],
@@ -263,9 +264,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
- "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz",
+ "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==",
"cpu": [
"s390x"
],
@@ -278,9 +279,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
- "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz",
+ "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==",
"cpu": [
"x64"
],
@@ -293,9 +294,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
- "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz",
+ "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==",
"cpu": [
"x64"
],
@@ -308,9 +309,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
- "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz",
+ "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==",
"cpu": [
"x64"
],
@@ -323,9 +324,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
- "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz",
+ "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==",
"cpu": [
"x64"
],
@@ -338,9 +339,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
- "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz",
+ "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==",
"cpu": [
"arm64"
],
@@ -353,9 +354,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
- "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz",
+ "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==",
"cpu": [
"ia32"
],
@@ -368,9 +369,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
- "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz",
+ "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==",
"cpu": [
"x64"
],
@@ -438,14 +439,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/@fastify/busboy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
- "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==",
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.13",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
@@ -583,98 +576,253 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz",
+ "integrity": "sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz",
+ "integrity": "sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz",
+ "integrity": "sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz",
+ "integrity": "sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz",
+ "integrity": "sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz",
+ "integrity": "sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz",
+ "integrity": "sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz",
+ "integrity": "sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz",
+ "integrity": "sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz",
+ "integrity": "sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz",
+ "integrity": "sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz",
+ "integrity": "sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz",
+ "integrity": "sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@sveltejs/adapter-auto": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.1.tgz",
- "integrity": "sha512-nzi6x/7/3Axh5VKQ8Eed3pYxastxoa06Y/bFhWb7h3Nu+nGRVxKAy3+hBJgmPCwWScy8n0TsstZjSVKfyrIHkg==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.0.0.tgz",
+ "integrity": "sha512-UNWSs/rOReBRfI/xFwSO2WYF1a7PT74SrWOHJmSNLY3Lq+zbH0uuvnlP+TmrTUBvOTkou3WJDjL6lK3n6aOUgQ==",
"dev": true,
"dependencies": {
"import-meta-resolve": "^4.0.0"
},
"peerDependencies": {
- "@sveltejs/kit": "^1.0.0"
+ "@sveltejs/kit": "^2.0.0"
}
},
"node_modules/@sveltejs/adapter-static": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz",
- "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.0.tgz",
+ "integrity": "sha512-nNsm8XChhJgQdeVegdXU+EnpznSUlsIjlLJa9SNmvSVN3rcPtB2BAnGuS/EWCtgPLkVcy9V2kW5knronqmF+KQ==",
"peerDependencies": {
- "@sveltejs/kit": "^1.5.0"
+ "@sveltejs/kit": "^2.0.0"
}
},
"node_modules/@sveltejs/kit": {
- "version": "1.27.7",
- "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.7.tgz",
- "integrity": "sha512-AzXYDoYt42clCBwLF9GTHsXyg2DFR31Ncyt8yxu8Aw4tgB433V+w+hcr1RTfAN9zKW2J2PY9FMQ8FoX/4Vw8CA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.3.tgz",
+ "integrity": "sha512-TjqRBC7I3qnGeRfmxAkkwbQVnto9x+DsSDTtHC4qC+MgHPImIVzSgUiw//tZ3/uB5/MXhGNLhi5mztWZVM0sjw==",
"hasInstallScript": true,
"dependencies": {
- "@sveltejs/vite-plugin-svelte": "^2.5.0",
- "@types/cookie": "^0.5.1",
- "cookie": "^0.5.0",
- "devalue": "^4.3.1",
+ "@types/cookie": "^0.6.0",
+ "cookie": "^0.6.0",
+ "devalue": "^4.3.2",
"esm-env": "^1.0.0",
"kleur": "^4.1.5",
- "magic-string": "^0.30.0",
+ "magic-string": "^0.30.5",
"mrmime": "^1.0.1",
"sade": "^1.8.1",
"set-cookie-parser": "^2.6.0",
- "sirv": "^2.0.2",
- "tiny-glob": "^0.2.9",
- "undici": "~5.26.2"
+ "sirv": "^2.0.3",
+ "tiny-glob": "^0.2.9"
},
"bin": {
"svelte-kit": "svelte-kit.js"
},
"engines": {
- "node": "^16.14 || >=18"
+ "node": ">=18.13"
},
"peerDependencies": {
- "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0",
- "vite": "^4.0.0"
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.3"
}
},
- "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.3.tgz",
- "integrity": "sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==",
+ "node_modules/@sveltejs/vite-plugin-svelte": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.1.tgz",
+ "integrity": "sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA==",
"dependencies": {
- "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4",
+ "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0-next.0 || ^2.0.0",
"debug": "^4.3.4",
"deepmerge": "^4.3.1",
"kleur": "^4.1.5",
- "magic-string": "^0.30.3",
+ "magic-string": "^0.30.5",
"svelte-hmr": "^0.15.3",
- "vitefu": "^0.2.4"
+ "vitefu": "^0.2.5"
},
"engines": {
- "node": "^14.18.0 || >= 16"
+ "node": "^18.0.0 || >=20"
},
"peerDependencies": {
- "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0",
- "vite": "^4.0.0"
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
}
},
- "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz",
- "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==",
+ "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz",
+ "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==",
"dependencies": {
"debug": "^4.3.4"
},
"engines": {
- "node": "^14.18.0 || >= 16"
+ "node": "^18.0.0 || >=20"
},
"peerDependencies": {
- "@sveltejs/vite-plugin-svelte": "^2.2.0",
- "svelte": "^3.54.0 || ^4.0.0",
- "vite": "^4.0.0"
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
}
},
"node_modules/@types/cookie": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz",
- "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA=="
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
},
"node_modules/@types/estree": {
"version": "1.0.5",
@@ -990,9 +1138,9 @@
"dev": true
},
"node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"engines": {
"node": ">= 0.6"
}
@@ -1114,9 +1262,9 @@
"dev": true
},
"node_modules/esbuild": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
- "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz",
+ "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==",
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
@@ -1125,28 +1273,28 @@
"node": ">=12"
},
"optionalDependencies": {
- "@esbuild/android-arm": "0.18.20",
- "@esbuild/android-arm64": "0.18.20",
- "@esbuild/android-x64": "0.18.20",
- "@esbuild/darwin-arm64": "0.18.20",
- "@esbuild/darwin-x64": "0.18.20",
- "@esbuild/freebsd-arm64": "0.18.20",
- "@esbuild/freebsd-x64": "0.18.20",
- "@esbuild/linux-arm": "0.18.20",
- "@esbuild/linux-arm64": "0.18.20",
- "@esbuild/linux-ia32": "0.18.20",
- "@esbuild/linux-loong64": "0.18.20",
- "@esbuild/linux-mips64el": "0.18.20",
- "@esbuild/linux-ppc64": "0.18.20",
- "@esbuild/linux-riscv64": "0.18.20",
- "@esbuild/linux-s390x": "0.18.20",
- "@esbuild/linux-x64": "0.18.20",
- "@esbuild/netbsd-x64": "0.18.20",
- "@esbuild/openbsd-x64": "0.18.20",
- "@esbuild/sunos-x64": "0.18.20",
- "@esbuild/win32-arm64": "0.18.20",
- "@esbuild/win32-ia32": "0.18.20",
- "@esbuild/win32-x64": "0.18.20"
+ "@esbuild/android-arm": "0.19.9",
+ "@esbuild/android-arm64": "0.19.9",
+ "@esbuild/android-x64": "0.19.9",
+ "@esbuild/darwin-arm64": "0.19.9",
+ "@esbuild/darwin-x64": "0.19.9",
+ "@esbuild/freebsd-arm64": "0.19.9",
+ "@esbuild/freebsd-x64": "0.19.9",
+ "@esbuild/linux-arm": "0.19.9",
+ "@esbuild/linux-arm64": "0.19.9",
+ "@esbuild/linux-ia32": "0.19.9",
+ "@esbuild/linux-loong64": "0.19.9",
+ "@esbuild/linux-mips64el": "0.19.9",
+ "@esbuild/linux-ppc64": "0.19.9",
+ "@esbuild/linux-riscv64": "0.19.9",
+ "@esbuild/linux-s390x": "0.19.9",
+ "@esbuild/linux-x64": "0.19.9",
+ "@esbuild/netbsd-x64": "0.19.9",
+ "@esbuild/openbsd-x64": "0.19.9",
+ "@esbuild/sunos-x64": "0.19.9",
+ "@esbuild/win32-arm64": "0.19.9",
+ "@esbuild/win32-ia32": "0.19.9",
+ "@esbuild/win32-x64": "0.19.9"
}
},
"node_modules/escape-string-regexp": {
@@ -2426,17 +2574,30 @@
}
},
"node_modules/rollup": {
- "version": "3.29.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
- "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.1.tgz",
+ "integrity": "sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==",
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
- "node": ">=14.18.0",
+ "node": ">=18.0.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.9.1",
+ "@rollup/rollup-android-arm64": "4.9.1",
+ "@rollup/rollup-darwin-arm64": "4.9.1",
+ "@rollup/rollup-darwin-x64": "4.9.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.9.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.9.1",
+ "@rollup/rollup-linux-arm64-musl": "4.9.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.9.1",
+ "@rollup/rollup-linux-x64-gnu": "4.9.1",
+ "@rollup/rollup-linux-x64-musl": "4.9.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.9.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.9.1",
+ "@rollup/rollup-win32-x64-msvc": "4.9.1",
"fsevents": "~2.3.2"
}
},
@@ -2904,17 +3065,6 @@
"node": ">=14.17"
}
},
- "node_modules/undici": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz",
- "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==",
- "dependencies": {
- "@fastify/busboy": "^2.0.0"
- },
- "engines": {
- "node": ">=14.0"
- }
- },
"node_modules/universalify": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
@@ -2948,28 +3098,28 @@
"dev": true
},
"node_modules/vite": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
- "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz",
+ "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==",
"dependencies": {
- "esbuild": "^0.18.10",
- "postcss": "^8.4.27",
- "rollup": "^3.27.1"
+ "esbuild": "^0.19.3",
+ "postcss": "^8.4.32",
+ "rollup": "^4.2.0"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
+ "node": "^18.0.0 || >=20.0.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
- "fsevents": "~2.3.2"
+ "fsevents": "~2.3.3"
},
"peerDependencies": {
- "@types/node": ">= 14",
+ "@types/node": "^18.0.0 || >=20.0.0",
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
diff --git a/src/web-live-chat/src/lib/helpers/typedefs.js b/src/web-live-chat/src/lib/helpers/typedefs.js
index f52bdb02..e4246b3e 100644
--- a/src/web-live-chat/src/lib/helpers/typedefs.js
+++ b/src/web-live-chat/src/lib/helpers/typedefs.js
@@ -40,12 +40,66 @@
* @property {Date} created_time - The conversation created time.
*/
+/**
+ * @interface
+ * @class
+ * @classdesc A basic rich content interface.
+ */
+function IRichContent() {}
+
+/**
+ * The type of the rich content.
+ *
+ * @name rich_type
+ * @type {string}
+ * @instance
+ */
+IRichContent.prototype.rich_type;
+
+/**
+ * The text of the rich content.
+ *
+ * @name text
+ * @type {string}
+ * @instance
+ */
+IRichContent.prototype.text;
+
+/**
+ * @typedef {IRichContent} TextMessage
+ * @implements {IRichContent}
+ * @property {string} text
+ * @property {string} rich_type
+ */
+
+/**
+ * @typedef {Object} QuickReplyElement
+ * @property {string} content_type
+ * @property {string} title
+ * @property {string} payload
+ * @property {string} image_url
+ */
+
+/**
+ * @typedef {IRichContent} QuickReplyMessage
+ * @property {string} text
+ * @property {string} rich_type
+ * @property {QuickReplyElement[]} quick_replies
+ */
+
+/**
+ * @typedef {Object} RichContent
+ * @property {string} messaging_type
+ * @property {IRichContent} message
+ */
+
/**
* @typedef {Object} ChatResponseModel
* @property {string} conversation_id - The conversation id.
* @property {UserModel} sender - The message sender.
* @property {string} message_id - The message id.
* @property {string} text - The message content.
+ * @property {RichContent} rich_content - Rich content
* @property {Date} created_at - The message sent time.
*/
diff --git a/src/web-live-chat/src/lib/scss/_variables.scss b/src/web-live-chat/src/lib/scss/_variables.scss
index 67f77ef2..8ce230ed 100644
--- a/src/web-live-chat/src/lib/scss/_variables.scss
+++ b/src/web-live-chat/src/lib/scss/_variables.scss
@@ -138,7 +138,7 @@ $colors: (
// scss-docs-end colors-map
// scss-docs-start theme-color-variables
-$primary: $blue;
+$primary: $purple;
$secondary: $gray-600;
$success: $green;
$info: $cyan;
diff --git a/src/web-live-chat/src/lib/services/signalr-service.js b/src/web-live-chat/src/lib/services/signalr-service.js
index 57300207..780a1ff3 100644
--- a/src/web-live-chat/src/lib/services/signalr-service.js
+++ b/src/web-live-chat/src/lib/services/signalr-service.js
@@ -66,8 +66,9 @@ export const signalr = {
}
});
- connection.on('OnMessageReceivedFromAssistant', (message) => {
+ connection.on('OnMessageReceivedFromAssistant', (json) => {
// do something when receiving a message, such as updating the UI or showing a notification
+ const message = JSON.parse(json);
if (conversationId === message.conversation_id) {
console.log(`[OnMessageReceivedFromAssistant] ${message.sender.role}: ${message.text}`);
this.onMessageReceivedFromAssistant(message);
diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte
index 097c52eb..4ce81b2c 100644
--- a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte
+++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte
@@ -17,6 +17,8 @@
import { signalr } from '$lib/services/signalr-service.js';
import { sendMessageToHub, GetDialogs } from '$lib/services/conversation-service.js';
import { format } from '$lib/helpers/datetime';
+ import RcText from './rc-text.svelte';
+ import RcQuickReply from './rc-quick-reply.svelte';
const options = {
scrollbars: {
@@ -31,7 +33,7 @@
};
const params = $page.params;
- let text = "Hi";
+ let text = "";
/** @type {import('$typedefs').AgentModel} */
export let agent;
@@ -170,8 +172,12 @@
{:else}
-

-
{message.text}
+

+ {#if message.rich_content.message.rich_type == 'text'}
+
+ {:else if message.rich_content.message.rich_type == 'quick_reply'}
+
+ {/if}
{/if}
diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte
new file mode 100644
index 00000000..45697302
--- /dev/null
+++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte
@@ -0,0 +1,12 @@
+
+
+{message.text}
+
+{#each message.quick_replies as reply}
+
+{/each}
+
\ No newline at end of file
diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte
new file mode 100644
index 00000000..36b92f26
--- /dev/null
+++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte
@@ -0,0 +1,6 @@
+
+
+{message.text}
diff --git a/src/web-live-chat/static/images/users/chatbot.png b/src/web-live-chat/static/images/users/chatbot.png
new file mode 100644
index 0000000000000000000000000000000000000000..600988775c76f30b1a9fb350371dbb4d2f791183
GIT binary patch
literal 3403
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
literal 0
HcmV?d00001
From fe197fd3eaeada966692cf52736c46ab3a31e168 Mon Sep 17 00:00:00 2001
From: Deep Blue
Date: Tue, 19 Dec 2023 20:28:56 -0600
Subject: [PATCH 2/3] quick reply submit.
---
docs/static/screenshots/web-live-chat.png | Bin 24295 -> 27843 bytes
.../Hooks/ChatHubConversationHook.cs | 6 ++---
src/WebStarter/appsettings.json | 2 +-
.../agent.json | 6 +----
src/web-live-chat/src/lib/helpers/typedefs.js | 5 ++--
.../[conversationId]/chat-box.svelte | 6 ++++-
.../[conversationId]/rc-quick-reply.svelte | 22 +++++++++++++++++-
7 files changed, 33 insertions(+), 14 deletions(-)
diff --git a/docs/static/screenshots/web-live-chat.png b/docs/static/screenshots/web-live-chat.png
index feffd6e349879f9e076e27f921991fb967291a4a..131895345f808cd3996cde60439b04201c805f3b 100644
GIT binary patch
literal 27843
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
literal 24295
zcmcG$by!?aw=PHw5=cV?35^5|4nZ210Kwg@8-h#Y?j&fC#wEBrG{GH$yG!Hl8r{P1%ZdTef#@hGC;$oZuZk!rPh3z?o+iJ1
zicFCJhw3B0p4cgh38BCT3Ad3C&y59T1W`~*!!T}jUm%}fS&M7fp`c*4J${~aS>+iZ
z6W`g3sM{-98QDAO+8UyW*%}&J+L>6{Ypc9OX3^G`_$sLEti7M?ri{Iv++3b0;5d{r
zU(V&mT8dV^W
z!?8oH340IS?NP%Zdad)wvmYy^WTO;NY^Ar)U1lsK
zVnH&Lrt=JCm@p(A1%>y|2XvG_&vakEK%k&hpl(7Rldga$C|K4_sK_6ZN}iznMS=e>
zE?=wxO^-zZ-Q%#3FV{Tg`1hp+RD=2A&z$pTE(fpMmaWF4h>@doo(nXwPU_R|DT<^r
z8TeC0!NlMb)Nhm0GJJ&f58s@ldkn9K&DmHPT5+|DtQ`ivxVV~Kk+?nmqtx9N5Ox5Q
zp*GK8sUTs1gF5-`bZt6X)=mdzF9Q5KP)mX_webuk*ka_lWU^gMWUF4|%^f5JrW6E?
zDnfy-pQe1pGDQ*_-T4|Y7Yv5x+iKD^tLlOhi+xt3%tv3pu6lJsP&AA7=XHpjv?iLQ
z9R`DJ%Rg9Mc3wyVsos#r{h&V=U
zD}yv_+D6ceC6b8xNo1UDM%N+AIg0JyJx2
zTY-!^9yiA~P0>Rbojdc8ykF6di{0K=BX#FFa|UuO1}Ts{Uy-QA@D#{*%3})rr4fIc
zqEtS`8K}X}9Rl0MDBgB^v
zXq8B^@ffje;USPC7%q8YX0tln!+e4-9f57K_r8HqF+JppGID2JoMWbDV*plal2|t87Gl_8*k3}H>VX;~{WCc3GOh1-r%26B}Q@6VSI$om8K29If3p+zWnPlN{i}qQwj1i`$A#R)ML1
z*6Gwn_QWLvBOIb8`OWN
zvgOO+ph~(0ts$}r(Yu2EA_hbCT-59`s3n(ywesDvga
z`lrH#+cna-iafty7N)ywgDzOZq1-%MBF)E+5Z|Et2OAgd#59^6Wi6`UM`d
zzXcq3?D)9E9xj2f>Zsk>Y)-ygvs}VpUFCV7H_M&w>`Shs1^kaaEG`_5u$zy-d7*1(
zmWqrry*%$LlW@T{e{-@}di2t}OdT#oKgxf0eE1=Rmf)}2rONxBqql&=vqCK$l|cw<
zbBMSlj)Ep>FF0z7OJl}D3S`3=>-9!`jLG-oS+n7usiXGqg-PlBD%e3pN
zGs_YKrm=U{$BFf$hU=f8E8iDK)e9Bs)1?F==X&MAxOjSH%>_m2EF=@Z73Zk-g1>XW
z8UN)UHr`)JiZ$Pb$8SYyN{1S>%avL~(;aG$ta4I_5h#CxZ&tx*@`@(e=4Wskdibx7
z_1s`sXKe4+`qtAGT)PPommd3chY{d(-6jD1?E5=d6E&~LxI66fn{AyC+St0a#?4kH
znnyK5oka7(#nMO~>BDdHlz1Vi!EOo%(uhlnimKEb4TF`YNBKDS^&Qe<$|mYXZ!>-?
zqK$RrB-Z})U+FAVczjXW%g>6!E$%PEF{M7}8qBXszrs?XSmlb~yd{PO{j76g6KSl}
z2o}9=B&a%Yd4@nq`>Oi{VUr7`Mm9aZ(!}>CUxL_i%XrZ{hGN(IKOhup1?q2gHCC@h
zbPJsZ_8|KB+#YaFr%ZliWeF|ILurJWEgyRC31P>|r3v3&zxW>8zcTmxX64?l&CqC_
z3#h=+$)eFC-BPQI!e;OTeBvl(JwSj0&>&e{PjvbV;YX=>;gw0UZhB4NceK15(Xt$&
zTj{07u5%r{RIJtpE?F7yH%YckuUQ7m8+9NGK3p8HVyeq4!
zaMd%llvzFPT|wOg6|4HaQ94N&Ah}oT;XI!kFc!%nI?P+TJ1Nq!rg6(@NX=iv!AY;G
z={VLxMouH4zRJ8EP)p2bhFzyWd8V5B`o7}jYHcpwEh@EEYNB;Bw15`dv$XGm)@UaN
z7DpMx2NZmxFgY@ESCCmsAW%pcas5fZ8cXb}hbEc5+g_J^KPc?=v=-uH;WzXetC3js
z9t9~%EN+&}jFli9avocm@y^U@N;JOD28ZB_ZLSe^ncNH1F6~JvA{R0;vfPo8_S<1C=631#&zQjXGmUl#UY5;6m?ZssF%EJO8*|Q2ry4A7ek_4#hFyep
z#6dW(Xu0UON)NVN>j7{2%lI2ZH)@hfe69`CN{n#yFV3
zWfV-#Ne2IwoJ$&J-bhkqrR3Sqy(xo0E^{z!R^wO4-1I3%xU_+q)gm9hOxynMZaNf%
zN0fB00J{KhCS!gHGx=Z33q1r^fq(r7Aved8i4nC}q7fU57&jM_v$bZbyAk0ayd@ig
zv2>jjv-_f&KdelLf1NJ=m9InY5S+&&T=tVsfeEL!=&L^l;$@%a?%Vtack)^GomL7w
zC!7um+w^19u)i$#z0ab99;~)Z7K7Mn{lE9}?I1)oIe2KSoC-x616=+qKlI}G>~~*FqIo1O(n)r8*BnSe
z`OIJquuc!@2^?7-8DT!}_b&q1F16=CGVvw)(c%n}K2lQtIlv&xu
z?>s)zlv&XRsxUXAoCnj6ioW(BR>lOV30WlL)&rlUa9h;=JecwZ4`
z<0MDQwRmM}<3V|DH*Ham|1&E%7fb<>@f`j{67hP?!powgWmNa*mBiXu8iJn@nAX*~
z2htWiT9@WUI@fVGTUjssfP1(aX9;0j31Zh{g&v6Y*Fo=zVR3sd47_T2==A(cz%=WD
zrCRw#qK-0~!KpJMZGxfr_UR0GSh=EJ26e9*c-Yypc$F*?N(@+Y-)p&LNw_Gr6niBq
z9~{k9Cu(yc?Q1;cw#2^&Q6d_uqfjkaZL~j939}^r*7$)g*?96NWoYord3;r&g`>A!
zGCsAt3%5m%iuCsHgZO;@zIMY>_VEN*kCv2%x<2oIt37+-{}EtdS#c^)A$n3Jbq5R(
z5e;V7x(0o>%;SsCO%wm8AfJG&JnfnZ~Su^PP-_oS4_aJ_iR}Be1+R7+8Z!
z4H35A*mIecyX}O@EhS_HJ?Z;nTtVY@GRu9G$XVwUMQfQ-$;dgA^tN(N4BUR`^K5-$
zj~iS6Gu<4bN$xo=5mF@ve1lJF;JqLDfKL1(Uap`)bS6ineEA+n@SwbPDgPP#i6*N;
zg;qd$D>6#eWSs(Q&YNCsFsoPmw=4Gl)4Zt}17UqELqqxg;#noMn$3cv#%QIbt^Oj%
zU+fcF02P}5o97xP_)V-L7Vdg_+P(2{&`-I~`@S&0Ec+nDkUVoUjt#vpH#~roj?CdF
zE1CnmNicXaoi_6lYwP`A=T5zRE{H3fx6g{v@6T0-ELr$<@*9H@Bg{?9jV++P*&739
zV@yaQ@+ar7wU)?t<@^t=Z3d75^ylwF;T?o5C}Tg&Hl|7xikz#M+
zKV~N(zJ}2miN0BT_1f--SxsFhFXxCp;okUeeO>+8yuYPzSbA=5Zgq8+
z3B~H^8Ad1R=C6LE6B3EdA9^;=1yhnf$&SsA+C)nA^PDV
z|dFZpu|
zzP_*$tAn*KzpR~<{`>5B!tr4Wlb?j+lMAx*NsKL=Rd$_`HjHZt$MAUt{;cP_6?&m1mU>XCQ|&l?hO`;kp_+I+KA>GIvZ$q%9lQmHcQ+R#w&;xfs8c
zl+?}bTvD=3SXOWSJZ{dtPDgTZe$aVduc|el9n(G3?NRnNH=e2lonFo|H6NEhT=(!a
z>)_+yJKSC#6{<-g$I!P>xv_D1S~x$(#|ZpVES!q`QSQAUK=R!~obgY_of-`Xo(D<6
z+l9+T=jQw4W)BEUa6-fJnN>snScHukbhpmU^_>-Y
z3qv_G5Zdp9#bP;mr#8K`eSAIF;J(v$yM^|UFCW-@yVh0G*|`VLFCMTuJjttbn*aRy
zL2BtbvV3Hd$F~cjLUZ(D;#^53mv)A(R9>Uz%~;ZVV08Gzy8IwVm6OGN{N0VV2S0PR
zfx5z_`dGwUud2VLO*D_~ZwEErIlZ@HcdvJ(s9tk5Fc=T>x+M1#RQ4BD(Sejj^TybJ
z&W9J@p~+mxIh`h=9`qqpyjc46qEKA|$*M#WSk;CW@M5obS8hM%LT3go
zj{j=LD3jAAjrGNI4N&q_rPf*6QyVj9H69W`il~!hz?M~zfl#Z8pqiBBsHEZT$g
zu)5zBMk1t$$FX~lsIdP)E;;LIGjGq$cgIn3(|vYSY1MG+oqHj*_>kTZE~I%iGin%}
zy?A$j(tNCaUZUf*-9agp>b2Zqoa%N!H`K7a>2zjxw5yU?>X4%yHUA<%9x^6SbO@a6
zOXy{TGXs6&VMbbk`bB31fR*o|J9u;)qndT*!VU3-k?hihek1+nvYG07#P2^zobkws
z_405xum4zh3f(#{PfM~RO*a2RtM&F8RcQ0;I%5V73a2y#Larg!-bP#t0r@tUPRMXuK;}USk3tO
zf&bG{N9u#3;_EYTY~x=tQ^Ov+A%T+}xd$Ueu9pk<;UU7()v<@AECkzDUb1)Of$qcW
zX0x3g<{ktn8QPyS=UbW5B=|(I@Ydboi5B`!hf`}U6o}rsIO>90gzii?JZ7wN=@R!*
z4?XTxr3i&+3HIc>rIHh{$C|5_Sg${cfGaTV#GQ^Mv!#kY*oBir7nUoRRwMq++EpWH
zeKn3&2S4TmA&EtK$)>-wX<|%1Pkk#@>F;CZ?++2XllVz>oo98Y9f41p6l-hje6Ip9
zR@GdtOEQG47FCutR{APbb~z`an+#*B!%BWHdXtUK8a<58*tVJmxNZB+S5oH6%ovgO
zCdAxa6}Jod7;e<{%hSHyczv96T=X^Uf_0audO)-GZxC7LD&n%SW8q*+ukW&ZII^na
z80cY77qxq;S9>Od$4*X5MQ0XM-6z};-PGbFQeaUd#wR}np%iu9TlrvT`*r%`s8BzV
z=||KuAFgjQV8Is5La6e`x&y$YA+s5nAmDhg?)`f+1my7dFu?(=YY03rO#&3JluJ|VF#iTJg<61%IKs}UMjS6=Ahz0zyp(7U?U{r8nrl&>D~;1vAi
zRHME`F@YOgL-mu$xa?&xyTHFso2tw86p%tjuef_o5TN2YuBqhV95a>q)|I1*
z*_#znqa8stOMb8|9LjotT{6#
zsPCM$F)?K{(WEHoyxQ&1+ruFP8V#BvD^f7_cz<^FYT;DV7XebOp&GW5i%%h9t%#@_
zK4~>hyiGg)iyqQl=Dx(mqZ|^a&u5YPm{?ynlsX&g3y31>Kh@1Si3YPK
z3L_f-H352<>h2eww0&GD5cWp&LQb%F&hJfk`4oHbPO%~RKnZa=odmNW(#aI!PlU!)Cnl3k^jU{kY<;}r+Y#VqstnxkcqxdSJLw2sFI}q~4
zp$^4O5%;CP3;EVE=CKw@dPHHvK9w|Oo_R-#MO^_e#w$zh0EJ2Gu0mu2X)?Ro(4V|*1~rS*RJ_%H
zngiu}s~prFk6GXIgFvi7#1uU&-}9qXdHi}EYQO*7ngyNjNLLQgre;=4>leG}rm)H3
zzb#B`q>YM%8r_8sNoI(Y&C}5&^D1mK1n2Bf=;8bq&!TJtAfg*#Vk1Kkv)f?$jZ(m<
zJtEm*m1yy8?qS3k>vw5vciFAyGIk*Yw>cODM)=GU%yA+=Da*O-=Lt5RPMEADv=$nE
z3~=)ER}S!p=PHbr;b~_rzgzEHXui`c){vLDxzrK+7+(0bmrXx!euSB)%HHB?YIuBa
zxTMqz+3zG8hW2~bs?=nU3I;vCjjc98&lO?buMHhf;`EI;S&STEzja5Cy7Z`D#(7*0
zSx>z>+2U<*Uw_4SNb(|fd(seAnn~|k%eYczt`pxibNv2}BA82+F7@AiRe{^MAJRrn
zoI=;2(PvP1)oF*1A$x4a4y%3xzYoQRXP4LHx4U1R&%};^-z`J0D6Bm~6xQj+%-uGw
zo4y2aB(wLADnttDt3#Vb&(e1n{u8omOAEG9_LfV<-a)J{
zb&?uxvy)#v+-9bBtB|dydR^|sRe2rbbnW~NQJHgd5vQS+XUn*zX^iX?+e-wD(lXK|(V$k-nULss
z2)X62hpGx-sivKnYrCe^Lp(4G#729h5v6EM_mdjEWpe2OirkhD4BdgyZ+jLJU
zUJ|t@{9L_FgMIk7>aKmkR7zX6>&E%0?=?AV5tXY&Y2oy`C+-5zBF-z7(Qa8CTMB2F
zv^mfu&|Kkwx)5rDQr79HnI)zCmr~bew-Y0AITNFbkoHWY)H8?}txtWDaen8b&72$@
z*EMA@du37etdfgryi4sWCzxQP^jJKdZE3$C2m^2&JGon@S^Vhg%7Dkl^~A69NN+a>
z#FWC^?vK?}4dqijY9B^=it^su6MG^
zvMtRW5?ZX_DXo?o3|ZdY-Tt_>{l11fU7DM4Kg_m|8KF|iL@}(i_sJO^A`^xBQmC!U
zol%3u3lZK*D=UgROe#`%0wGY7r)*YdZG`%=z8t+=On`gKm&k0}V-MOwu6z6cR@)Od
zamz8y2knoFaI=@^GR2exhQm#!3LMx~%&jV-_|&5k+oV_x%yr23T&_H$HXYdT1(@z<}B>poE&7
zF3tpEFS{|09hRX@%Y}wBo`-veT27rTo7G;`l30aPd>(TBKTL=
zUQ@b!(iYXj)8KmjXs<${)f%u`^PLo~KAUWHS57Le-=>tlLW9#uaN&L&-H^!xY1U6`
zkmON5NynLE!L%vkrp<1j+WUX30PtkVM~cd_{a#F@Gd-g`)wt+}|P_0Z#n
zr`~aoz9f&n&n)ETegLX*7UW=>5H#M+Hf{1kkkBoGk<7iX^I&|!8{?lv8<2hPh&Wor
zNyY5z8>qKE2a6gQL~k;A)~?lV;?Tx_dh{ka7D_&H+vioBih2m^Yb&q6dVucB+y&u~
zz8uPPfc-U;THkW};fEBCW^Jbd@z4U;`PyldX%muepi}3*H+A&u*A#L(-z{FwUo@S3
zMEcaHwM<^?(@b6>EEs%g^2=VH7jASWQ
zyJVJMv+10YkI@3zS&95Awk35kqyAU$5gi+Ju=l4t?%tV;iX+uNDp4ogj*E$PSMNH$
zTr4b`SX%O)O?Ppj=915CWo6~u^W8(w{T*5;;nm(+&se<1w4YxGM{h5koW
zawkj6MKFG!!wskK%bPWu$8G`Z{B2olDV%2UZDH6woGxnUCm2ClYY>{6=qR@%@xL_@FOw!2K$@rnZ>qd);4r(#${9lU7B^36&Sop!Z`jF4o5fLmyVWcsrISsa|H^+
zd(uD8uR(g4-q@34=D^hu>}QGlo`e|4@R=0({_--A<_tzefmaL7k|%|wGa5j8>r6&u
zJO%G#S~FH6C)w)-#E=5%d4*J)%Ub_Ygx8^?Lll@zkr6WZzK&f3k8(cT!)#acCM7ME
zS?tYMe5A5kJHW8V{(M!tke9L8tsD(%pcCPWJLv}1UiqC?Ljv9|~6%v=ZAbMbd1z3s!{G
zTmq=QvQ3FyZaFBvzQIK1ABfscsEgizg+KNXn!d7mxB*=5(#w?GvwHo-=7^`Vfb1rM
zF!Nl=!+nO%Q|KXU13QEMbXc8J`DQ4%z*qWp!Mb1==PNB
zKG*+w>~?Wg62w?_Z&WbMpBY7d*N~;-5Cc-ny&!Ff0KQ2(3Acp*Ql~1C^=z&th~+u%
z&S;LP8&zu{LSxvfcU%N4b7+)MX&wY~?i1np@uUu{Oh!z?@GQS}9W)uSXIXsXFgiVj
zBr1oN(2&V_{HyXkuV{06X#J`FPx#?HRfU|6)%nTHs8asiy2s1?PWcM%?XE_@+}1+`
zotIl_CdoJzb=~*7jq)avks)I(|If{ZrIC=@ze?siRz#-L&YHdFtCwX23J;imH{eusaiAnyR_9O5*^HHbcLkibsvq4U^mJ3G(TTf_
z4a~S#%^kZn1C#TnbQF_!z!sfYMyzW0WEWcJWn0g22$0|uuJmK`BcPwoHmfB#7|P~3
z=g%5%3~VFxTz0PceS_@UCUt?uvJE4Zm9(UON8BA&?YIX=IETUoouKkY2MUV@>xjqEiZz?3-UV}#GXViT?!?&J-;PLy#Ou98=vv
ztMwlwaw?B)j)%6hwih~e!2edyxws~{UDVpc`flE!!(T}jhXW)Eln~C%A90r|@Cn4-
z1>b6{z=r$vC&p*usBqB-69z%F2kTpVlM%5n1YWQc33hdx)70b+#=C}EL2$
z10!(px&j(olQIDgT-yP!Se0PwxcOA;>!1b1H
zy7+CQaHzT{GaQ_Gt{pmPNn|?fynOom@Y6D;(w^Tguc_?A=Ofx**4oodwH7uPL
zNBGGzm5^5G2l77N;b7s>5{z)NeNXu1-2ER`VA>Ef8Tj-u4=#Qq4~Pr2D+_pnK$c3&
zW}iVkF!xpX59p=0G@fFA_ZGGW5(YI{>mNbxYka0#dSo*FFE4Z32>~Z{*O(|&)@l5>
zb4v+;GuJDHp^e)Zu!OKKHLlnjnKn$zG{7x*Y>Z=kVPtw?dU|AfVmkY9
zbob1F(8qvKkVEfdfc=e;uLyIr~o&XX-kq1R^{X
zbP&T+!&Bo^<8$M4qx8t~$7U>9Wphmkp=e!tgng!~{9_XK+>#dwx}GSL@iFcO!^J7Z0#IFxd(Kn{fjUC_PXYf$
zVD|SHrXNlQ?WqiVirBJv9zD}rCqzN5xuk7=`GNSLAfXB7ug4CQ@IY
zOes+^(af#ZUuOwwA7^#gB%=8jWHh#pCahDkwrfzjDm=(8(+cR!_pWg_w!J=i{m&?`B*bFse>I(Df+x!6=00pVe5~bfI)}yS{5|#D
zz7dGVQxvDu(W(n6JFQ>zx>sB1yFc4yYOFEXK4EIO+_M|NP5j8xEo&66&9M#b1UvsiinV(xQ?zf{g~1VRbd~Z2+fb9yaO!wE}979g~3yqsv
zi|*63(Ip-yF<#*2^^(E02M_6$V1bA1tPeZ2^lr-{qrH)vNT_Zi^?m>@_i${#uvjvG
zx)*6^fKRiQ79E}Wp!WHL=fwDgeq;$$6Y*L{PJ4Iz{Ra~Fch{~>ajx@U{8~$iZ32mM
z5En08FDY;(E!x01`{fM6%;EWcue_u-?$T^=ORZhd9Tbx@WPwJ6^
zW=@lbS3RjJVYgvc;(IFf>dAd8?*f07OHpmgo2}Zyb`yqLoA#UJ@`=+w=G{|ek_F(V
zG+PX!`p+DS&z{;7uQUO~i{48D(M`l$M$gAWk2P>S7wYcXYF|OKoJdJXs80tKDQ;1hoCM5ue~=v3FCwPmzN`PB`ePxmLA
z1UG3K&G59K!PDW#{MR5k{DhiM&0E)QXs^9~7Gl2ArgIt)*qge^Exr(^)EO4IJ&}sB
z?GwK$55{4W2v^u`WU`ngPpxq1i-iSn3q{@}X!5M@zQZ&;@)-f{wEl!MXZuZEGYN%I
zzO|>W4ur98MgPs0#bRFr3*h5gtD8_v1gOyn(B^YV*lChE9Q(ys#t|4Gz2lMr(6Pjz
zW_}qZ1}UOQvMiao5|hmrjR(DGJ?a@K_vvjII8KeMrt=<*3R{ki;-szhB#mqxQn-jg?Vn@CIEo(p
zHeF&+o2CuZuLKC}=%U#PqOx_z?i*4#_{12GZk;xQr5IWz+Foh(^T5Kqs{V3i%97y@
zXeNHX`NG#n3lAcM#jUvTHgvnnF431OzZl)ZU$Y}2n)~WD%3@nrcIHDdS<0DSQNApM
zJSNXHn-NTY;Wq(lEqsIe2{$T8!oeEWs6i;z9f^dUJ8a%JnjQLbr~e)hRE(^eQEo(c
zNnZ_pXZEtk-0qlhco0vD5Mjyqp8s|GJ1Q+Y|Ao1q^v0V$bN^b(+d+P6ef*e*=zx4o
z07Nb`%aEx-90|+CHG182XqKl%BK16!pF}M%+O$)?K2zV(e0%1&G(CShT}OY>k^zo%
ztQ|cLLzBKSIdc2+I|vUs8MssT_=zg&ny$Y{KTqu!BIJi>d%}h*_C&SX@ZXks4oDY|
z+ayBjJJX#ehXzGwY2QBAT@<92J;lD^uX=|Lu)8&_5SN)RP<|))Z4NNaJ5E~Wn2^z1
zw0?auo8tugooON%{}fL3+!dpZIl!q!{*C26f_hRr-fSDeIj>1-p<;+*ZoYp1`(JaI
zrle@Gv1z{z2f*Vb+Eigc6YuRW6>S_xe^bBox0%!BN{Z+G{gs$N1QKl(c=$WPWbv@Z
zBn!E(4-ZSh!HYhw%a*rsWpq4uL~h^P91EYkAp)xgBphqTU{Go?A^(z_RxAynq?^?nM{J?Ls?47>KV=g~xcZu%>qGBIxd(RocK#X^W8C
zoob~*bFyxTEnbeKg76Jf#-Hkg=ikZ3uZ}$h=)Z8&(Z>*Kuj1=z{LZ9L&@QrOH?0TAV6K;P3Qzg@7R^n
zxqI+6xbwL`Rilb7EzcF&(jQa1UBXF?{dja9Q7;v@U=G@nejI?>hF=T_Ov!*h@l&%gYZ9
ze+6JfwKaIOL)Pj)tr!HaQ*>L4?6Bw0ofLP6R6M7GGfz^Eq@=&d9@r|Fq2kLHQSHo8
zDSN*uq(VjhY>IZW6GyoRE*uy)l_jzeBwc8LNT2c!)#4d1v#Kr8u?;S2PyUbfc1)j8
zCak%3o4_G{(~iSx;X2vtAr?$nK7iG9GvEF!5TpW|Z5~UA86UQa1yC#Jc%27R>k->|
zhJL#T6^0c$^b8Gt$emBAE2lHq)L3Wc_RJIuDYT8Vsm#nN?!BTwXca0vI{kw05x>wr
zg1K$T&jn~%FmaOac=hMe(idH)4aJPE-4ACMrz`c1T|^8uRQ2aBthDp&*b$w>Z2UuE0OPE)40CHc=Q^F
z(}lCMId%wuCmFPImpV|Z9krsD3cEmk3E!||q1mX!uF`*%7z35wINBTV%k^@)w_U)I
zJkRdy3MC2)41|2FTX=vidK~gR98DlMtZ$ChQtpn`D9VSQq2t_dIyG05eYT#BEk-)i
zcr4|#Rtp8legFKzA(6&FgSSjM&g$0=Her#
z?OJ&hm7KAWAs#O7A~jt}jZ5LN>O}GEM0JqW`U}IV#XXgxr-E}I{)uFULD7jll(n;i
z;m|Dc&YpV3Upn#>l!uZn*-3N3aki#r+Ma@fx;7&dP_>d6ZMsGU*UW~ZhO&m^Pun@S
zQGFAsF?6(IZ!Y{Fz26E48Lz{}(e~i+dOjH#-{S^No8eF4?0|OZl?sSKPw``2gvxB*W5T7_6f-)@&(0gwH
znL%c6+xP#`$N`A(_U=bIhI+%w5KwFs=UM_G`k2f@%^6rEk7w
zKGyII3n89wwMSCh4I%eKH+}6ux~n)T5^Q;laa@9pixXE-HGRkR)Y}C3D3GO1prp=2
zyk9%us}a>&0zQu?
zBuq&{f&`C&ED|D2Q))w=J<`~FLGS^!>xJ!>HZ4r6n8h@&{O*w{PT>niLNioYaG}~Ejyurej
zu~F~~5$5@^AFA;b$)`s*(?=3HaV)If`a8DH**{Y3(XYkTD(XZCcIHZxSqPAzgb|Xt
zm6g%RaNNHeh=QF;NuO
zOcT?We*3@)WHb6hGU7?G|1)Qhk-z*DT;ZQGsT1&p{++=HgSU7(UGQjn9&`Qt|DH@*
zj9=Jzj@Kh4dG6MbIzl2%J5zi2)wJ0>vivtB6N$xsk5^zT_X{@#vvQ8k^Xbt!z5RD>
zRc}}z&7Hdc^Q&)=d8poquxh=0>zi?c;mYwR0fh+JOMTIieq15sk)5SiUmx#~f=Ky-
zJz!3Xq+tHfNw3rYT{Ww3t0TJ6H8mSk(e;<(E{tiHzqH@@gFrDME4TXMMRv60
zx{R?Z+NU_#F~PJPV*8BFV>YH44l=PV!*N0vHCGbko~8)H{ApTadY<5CwYF`*6EV%H
z@fIjgqh8qy;RtBXosWcO+-Yu%5Vz9(Z+ENgHK5KAM1&;{W^g#_g4AAKTfH>ftgb=DvPE)u>vc3m+40xh8fEd`;@A^0eQ(p~Q&UI7lFyaL!?P)g
zC*s^9Hce&RJaP>m$;?702~xGA3F&XUwZ*qaf-Ji{VaZVY5kyw&-N<2c+$c%n{`{|>
z7t25tVzeNmoR?gBXQsBkr_nRFgC`k8gr8`};s`RWVVBXTrE`ak$yDtMiX$z66lig1
zntZeHGH{!wSgqRDOQb%&P6$B5#->yhNAV6jl`*AEA`I*3wk;kQ89|+vF!!NZ&Pu90
z#`D_ot7YFSi7*;hfCh>GN(R-19I9c
zDA1-W-2*%a>U&m9ztz95i|JW_vd&EN>WR~hUM2Y8Z